Full Code of ggerganov/kbd-audio for AI

master a9182070debe cached
63 files
11.7 MB
3.1M tokens
475 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (12,308K chars total). Download the full file to get everything.
Repository: ggerganov/kbd-audio
Branch: master
Commit: a9182070debe
Files: 63
Total size: 11.7 MB

Directory structure:
gitextract_n3kfgpod/

├── .github/
│   └── workflows/
│       └── build.yml
├── .gitignore
├── .gitmodules
├── CMakeLists.txt
├── LICENSE
├── README.md
├── audio-logger.cpp
├── audio-logger.h
├── build-vars.h.in
├── cmake/
│   ├── BuildTypes.cmake
│   ├── FindFFTW.cmake
│   ├── GitVars.cmake
│   └── sdl2/
│       └── FindSDL2.cmake
├── common-gui.cpp
├── common-gui.h
├── common.cpp
├── common.h
├── compress-n-grams.cpp
├── constants.h
├── data/
│   ├── english_quadgrams.txt
│   ├── english_quintgrams.txt
│   ├── english_trigrams.txt
│   ├── ggwords-3-gram.dat.binary
│   ├── ggwords-4-gram.dat.binary
│   ├── ggwords-5-gram.dat.binary
│   ├── ggwords-6-gram.dat.binary
│   └── sample_quadgrams.txt
├── dr_wav.h
├── generate-clusters.cpp
├── guess-qp.cpp
├── guess-qp2.cpp
├── imconfig-vtx32.h
├── index-keytap2-gui-tmpl.html
├── index-keytap3-app-tmpl.html
├── index-keytap3-gui-tmpl.html
├── key-average-gui.cpp
├── key-detector.cpp
├── keytap-gui.cpp
├── keytap.cpp
├── keytap2-gui-old.cpp
├── keytap2-gui.cpp
├── keytap2.cpp
├── keytap3-app.cpp
├── keytap3-gui.cpp
├── keytap3-multi.cpp
├── keytap3.cpp
├── non-exact-subbreak.cpp
├── non-exact-subbreak2.cpp
├── play-full.cpp
├── play.cpp
├── record-full.cpp
├── record.cpp
├── scale.cpp
├── style.css
├── subbreak.cpp
├── subbreak.h
├── subbreak2.cpp
├── subbreak2.h
├── subbreak3.cpp
├── subbreak3.h
├── test-subbreak3.cpp
├── view-full-gui.cpp
└── view-gui.cpp

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

================================================
FILE: .github/workflows/build.yml
================================================
name: CI
on: [push]

jobs:
    ubuntu-18_04-gcc:
        runs-on: ubuntu-18.04

        strategy:
            matrix:
                build: [Debug, Release]

        steps:
            - name: Clone
              uses: actions/checkout@v1
              with:
                  submodules: true

            - name: Dependencies
              run: |
                  sudo apt-get update
                  sudo apt-get install build-essential xorg-dev libglu1-mesa-dev
                  sudo apt-get install cmake;
                  sudo apt-get install libsdl2-dev;

            - name: Configure
              run: cmake . -DCMAKE_BUILD_TYPE=${{ matrix.build }}

            - name: Build
              run: make

    ubuntu-18_04-clang:
        runs-on: ubuntu-18.04

        strategy:
            matrix:
                build: [Debug, Release]

        steps:
            - name: Clone
              uses: actions/checkout@v1
              with:
                  submodules: true

            - name: Dependencies
              run: |
                  sudo apt-get update
                  sudo apt-get install build-essential xorg-dev libglu1-mesa-dev
                  sudo apt-get install cmake;
                  sudo apt-get install libsdl2-dev;

            - name: Configure
              run: cmake . -DCMAKE_BUILD_TYPE=${{ matrix.build }} -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang

            - name: Build
              run: make

    macOS-latest:
        runs-on: macOS-latest

        strategy:
            matrix:
                build: [Debug, Release]

        steps:
            - name: Clone
              uses: actions/checkout@v1
              with:
                  submodules: true

            - name: Dependencies
              run: |
                  brew update
                  brew install sdl2

            - name: Configure
              run: cmake . -DCMAKE_BUILD_TYPE=${{ matrix.build }}

            - name: Build
              run: make


================================================
FILE: .gitignore
================================================
build*/
build-vars.h
data_original/*
chal*
.cache
.DS_Store
.ycm_extra_conf.py
.clangd
compile_commands.json


================================================
FILE: .gitmodules
================================================
[submodule "imgui"]
	path = imgui
	url = https://github.com/ocornut/imgui


================================================
FILE: CMakeLists.txt
================================================
cmake_minimum_required (VERSION 2.8)
project (KBD-Audio)

set(CMAKE_EXPORT_COMPILE_COMMANDS "on")

# options

option(BUILD_EXPERIMENTAL "Build experimental tools" OFF)
option(USE_FINDSDL2 "Use the FindSDL2.cmake script" OFF)

option(KBD_AUDIO_SANITIZE_THREAD         "kbd-audio: enable thread sanitizer" OFF)
option(KBD_AUDIO_SANITIZE_ADDRESS        "kbd-audio: enable address sanitizer" OFF)
option(KBD_AUDIO_SANITIZE_UNDEFINED      "kbd-audio: enable undefined sanitizer" OFF)

# sanitizers

if (KBD_AUDIO_SANITIZE_THREAD)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread")
endif()

if (KBD_AUDIO_SANITIZE_ADDRESS)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
endif()

if (KBD_AUDIO_SANITIZE_UNDEFINED)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
endif()

# sdl2

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
if (USE_FINDSDL2)
    set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2")
endif()

# build types

include(cmake/GitVars.cmake)
include(cmake/BuildTypes.cmake)

configure_file(${CMAKE_SOURCE_DIR}/build-vars.h.in ${CMAKE_SOURCE_DIR}/build-vars.h @ONLY)

# warnings

if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic")
endif()

set (CMAKE_CXX_STANDARD 17)
set (CMAKE_CXX_STANDARD_REQUIRED ON)

if (EMSCRIPTEN)
    set (CMAKE_CXX_FLAGS " \
    -s USE_SDL=2 \
    -s USE_PTHREADS=1 \
    ")
    #-s DISABLE_EXCEPTION_CATCHING=1 \

    set(CMAKE_EXE_LINKER_FLAGS " \
    --bind \
    --use-preload-cache \
    -s ASSERTIONS=1 \
    -s NO_EXIT_RUNTIME=0 \
    -s PTHREAD_POOL_SIZE=16 \
    -s INITIAL_MEMORY=536870912 \
    ")
elseif(MINGW)
    find_package(PkgConfig REQUIRED)
    pkg_search_module(SDL2 REQUIRED sdl2)

    set(OPENGL_INCLUDE_DIR "")
    set(OPENGL_LIBRARIES "opengl32")
else()
    find_package(OpenGL REQUIRED)
    find_package(SDL2)
    find_package(FFTW)
endif()

find_package(Threads REQUIRED)

if (NOT USE_FINDSDL2 AND NOT SDL2_FOUND AND NOT EMSCRIPTEN)
    message(WARNING "Unable to find SDL2 library. It is either not installed or CMake cannot find it."
        " In the latter case, setting the USE_FINDSDL2 variable might help:\n"
        "   $ cmake -D USE_FINDSDL2 .."
        )

    message(FATAL_ERROR "Aborting")
endif()

if (NOT FFTW_FOUND)
    message(WARNING "FFTW library not available. Some targets will not be built")
endif()

string(STRIP "${SDL2_LIBRARIES}" SDL2_LIBRARIES)

if (APPLE)
    find_library(COREGRAPHICS_LIBRARY CoreGraphics )
    find_library(COREFOUNDATION_LIBRARY CoreFoundation )
else (APPLE)
    unset(COREGRAPHICS_LIBRARY)
    unset(COREFOUNDATION_LIBRARY)
endif (APPLE)

include_directories(imgui)
include_directories(imgui/examples)
include_directories(imgui/examples/libs/gl3w)
include_directories(${SDL2_INCLUDE_DIRS})
include_directories(${OPENGL_INCLUDE_DIR})

add_library(Core STATIC
    common.cpp
    audio-logger.cpp
    )

target_include_directories(Core PRIVATE
    )

target_link_libraries(Core PRIVATE
    ${CMAKE_THREAD_LIBS_INIT}
    ${SDL2_LIBRARIES}
    ${COREFOUNDATION_LIBRARY}
    )

# todo : this is ugly, what's the proper way?
if (MINGW)
    target_link_libraries(Core PRIVATE stdc++)
endif()

if (EMSCRIPTEN)
    add_library(Gui STATIC
        common-gui.cpp
        imgui/imgui.cpp
        imgui/imgui_draw.cpp
        imgui/imgui_demo.cpp
        imgui/imgui_widgets.cpp
        imgui/examples/imgui_impl_sdl.cpp
        imgui/examples/imgui_impl_opengl3.cpp
        )

    target_compile_definitions(Gui PUBLIC
        IMGUI_USER_CONFIG="../imconfig-vtx32.h"
        )
else()
    add_library(Gui STATIC
        common-gui.cpp
        imgui/imgui.cpp
        imgui/imgui_draw.cpp
        imgui/imgui_demo.cpp
        imgui/imgui_widgets.cpp
        imgui/examples/libs/gl3w/GL/gl3w.c
        imgui/examples/imgui_impl_sdl.cpp
        imgui/examples/imgui_impl_opengl3.cpp
        )

    # force GL3W loader
    target_compile_definitions(Gui PUBLIC
        IMGUI_IMPL_OPENGL_LOADER_GL3W=1
        IMGUI_USER_CONFIG="../imconfig-vtx32.h"
        )

    target_link_libraries(Gui PRIVATE
        ${CMAKE_DL_LIBS}
        ${SDL2_LIBRARIES}
        ${OPENGL_LIBRARIES}
        ${COREFOUNDATION_LIBRARY}
        )
endif()

add_executable(keytap-gui keytap-gui.cpp)
target_link_libraries(keytap-gui PRIVATE Core Gui)

add_executable(keytap2-gui keytap2-gui.cpp subbreak2.cpp)
target_link_libraries(keytap2-gui PRIVATE Core Gui)

add_executable(keytap3-gui keytap3-gui.cpp subbreak3.cpp)
target_link_libraries(keytap3-gui PRIVATE Core Gui)

add_executable(keytap3-app keytap3-app.cpp subbreak3.cpp)
target_link_libraries(keytap3-app PRIVATE Core)

add_executable(view-full-gui view-full-gui.cpp)
target_link_libraries(view-full-gui PRIVATE Core Gui)

if (EMSCRIPTEN)
    # view-full-gui
    set(TARGET view-full-gui)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${TARGET})

    set_target_properties(${TARGET} PROPERTIES LINK_FLAGS " \
    -s TOTAL_MEMORY=536870912 \
    -s LZ4=1 \
    --preload-file ${PROJECT_SOURCE_DIR}/chal/record@/chal/record/ \  \
    ")

    ## keytap-gui
    set(TARGET keytap-gui)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${TARGET})

    set_target_properties(${TARGET} PROPERTIES LINK_FLAGS " \
    -s TOTAL_MEMORY=536870912 \
    -s FORCE_FILESYSTEM=1 \
    ")

    # keytap2-gui
    set(TARGET keytap2-gui)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${TARGET})

    set_target_properties(${TARGET} PROPERTIES LINK_FLAGS " \
    -s TOTAL_MEMORY=536870912 \
    -s FORCE_FILESYSTEM=1 \
    -s LZ4=1 \
    --preload-file ${PROJECT_SOURCE_DIR}/data/@/data/ \
    ")

    configure_file(${CMAKE_SOURCE_DIR}/index-${TARGET}-tmpl.html ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/index.html @ONLY)
    configure_file(${CMAKE_SOURCE_DIR}/style.css ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/style.css @ONLY)

    # keytap3-app
    set(TARGET keytap3-app)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${TARGET})

    set_target_properties(${TARGET} PROPERTIES LINK_FLAGS " \
    -s FORCE_FILESYSTEM=1 \
    -s LZ4=1 \
    --preload-file ${PROJECT_SOURCE_DIR}/data/ggwords-6-gram.dat.binary@/data/ \
    ")

    configure_file(${CMAKE_SOURCE_DIR}/index-${TARGET}-tmpl.html ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/index.html @ONLY)
    configure_file(${CMAKE_SOURCE_DIR}/style.css ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/style.css @ONLY)

    # keytap3-gui
    set(TARGET keytap3-gui)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${TARGET})

    set_target_properties(${TARGET} PROPERTIES LINK_FLAGS " \
    -s TOTAL_MEMORY=536870912 \
    -s FORCE_FILESYSTEM=1 \
    -s LZ4=1 \
    --preload-file ${PROJECT_SOURCE_DIR}/data/ggwords-6-gram.dat.binary@/data/ \
    ")

    configure_file(${CMAKE_SOURCE_DIR}/index-${TARGET}-tmpl.html ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/index.html @ONLY)
    configure_file(${CMAKE_SOURCE_DIR}/style.css ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/style.css @ONLY)
endif()

if (NOT EMSCRIPTEN)
    add_executable(key-detector key-detector.cpp)
    target_link_libraries(key-detector PRIVATE Core)

    add_executable(keytap keytap.cpp)
    target_link_libraries(keytap PRIVATE Core)

    add_executable(keytap2 keytap2.cpp)
    target_link_libraries(keytap2 PRIVATE Core)

    add_executable(keytap3 keytap3.cpp subbreak3.cpp)
    target_link_libraries(keytap3 PRIVATE Core)

    add_executable(play play.cpp)
    target_link_libraries(play PRIVATE Core)

    add_executable(play-full play-full.cpp)
    target_link_libraries(play-full PRIVATE Core)

    if (NOT MINGW)
        # todo : need to find termios.h alternative for Windows
        add_executable(record record.cpp)
        target_link_libraries(record PRIVATE Core)
    endif()

    add_executable(record-full record-full.cpp)
    target_link_libraries(record-full PRIVATE Core)

    add_executable(view-gui view-gui.cpp)
    target_link_libraries(view-gui PRIVATE Core Gui)

    add_executable(compress-n-grams compress-n-grams.cpp subbreak3.cpp)
    target_link_libraries(compress-n-grams PRIVATE Core)

    #
    ## Experimental stuff

    if (BUILD_EXPERIMENTAL)
        if (FFTW_FOUND)
            add_executable(key-average-gui key-average-gui.cpp)
            target_include_directories(key-average-gui PRIVATE ${FFTW_INCLUDE_DIRS})
            target_link_libraries(key-average-gui PRIVATE Core Gui ${FFTW_LIBRARIES})
        else()
            message(WARNING "Skipping 'key-average-gui' target because FFTW is not available")
        endif()

        add_executable(keytap3-multi keytap3-multi.cpp subbreak3.cpp)
        target_link_libraries(keytap3-multi PRIVATE Core)

        add_executable(guess-qp guess-qp.cpp)
        target_link_libraries(guess-qp PRIVATE Core)

        add_executable(guess-qp2 guess-qp2.cpp)
        target_link_libraries(guess-qp2 PRIVATE Core)

        add_executable(scale scale.cpp)
        target_link_libraries(scale PRIVATE Core)

        add_executable(subbreak subbreak.cpp)
        target_link_libraries(subbreak PRIVATE Core)

        add_executable(non-exact-subbreak non-exact-subbreak.cpp subbreak2.cpp)
        target_link_libraries(non-exact-subbreak PRIVATE Core)

        add_executable(non-exact-subbreak2 non-exact-subbreak2.cpp subbreak2.cpp)
        target_link_libraries(non-exact-subbreak2 PRIVATE Core)

        add_executable(generate-clusters generate-clusters.cpp subbreak2.cpp)
        target_link_libraries(generate-clusters PRIVATE Core)

        add_executable(test-subbreak3 test-subbreak3.cpp subbreak3.cpp)
        target_link_libraries(test-subbreak3 PRIVATE Core)
    endif()

endif()


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2018 Georgi Gerganov

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
kbd-audio
=====
[![Actions Status](https://github.com/ggerganov/kbd-audio/workflows/CI/badge.svg)](https://github.com/ggerganov/kbd-audio/actions)

This is a collection of command-line and GUI tools for capturing and analyzing audio data.

### Keytap

The most interesting tool is called **keytap** - it can guess pressed keyboard keys only by analyzing the audio captured from the computer's microphone.

Check this blog post for more details:

[Keytap: description and some random thoughts](https://ggerganov.github.io/jekyll/update/2018/11/30/keytap-description-and-thoughts.html)

[Video: short demo of Keytap in action](https://www.youtube.com/watch?v=2OjzI9m7W10)

[Try it online:](https://ggerganov.github.io/keytap)

<a href="https://ggerganov.github.io/keytap" target="_blank"><img src="https://i.imgur.com/FXa60Pr.gif" style="display: inline-block; overflow: hidden; width: 99%;"></img></a>

### Keytap2

The **keytap2** tool is another interesting tool for recovering text from audio. It does not require training data - instead it uses statistical information about the frequencies of the letters and n-grams in the English language.

A more detailed description of the tool is available here: [Keytap2 discussion](https://github.com/ggerganov/kbd-audio/discussions/31)

[Video: short demo of Keytap2 in action](https://www.youtube.com/watch?v=jNtw17S6SR0)

[CTF: can you guess the text being typed?](https://ggerganov.github.io/keytap-challenge/)

[Try it online:](https://keytap2.ggerganov.com)

<a href="https://keytap2.ggerganov.com" target="_blank"><img src="https://i.imgur.com/nPlLEDN.jpg" style="display: inline-block; overflow: hidden; width: 99%;"></img></a>

### Keytap3

This version introduces significant algorithm improvements and better n-gram statistics compared to keytap2. The attack is now fully
automated and does not require any manual intervation during the text recovery process.

[Video: short demo of using Keytap3](https://youtu.be/5aphvxpSt3o)

[Video: another example of using Keytap3](https://youtu.be/kCOrxrR-4ak)

[GUI for Keytap3](https://keytap3-gui.ggerganov.com)

[Check if your keyboard is vulnerable to Keytap:](https://keytap3.ggerganov.com)

<a href="https://keytap3.ggerganov.com" target="_blank"><img src="https://user-images.githubusercontent.com/1991296/166096331-ab26f7f8-08e0-48d6-abd7-57017ebf1866.JPEG" style="display: inline-block; overflow: hidden; width: 99%;"></img></a>

### What people say about Keytap

*"This works incredibly well.\
I hope you realize what you've created (and made available to every person in the world)."* -- ffpip

*"I just tried it and it works incredibly well. It kind of makes me want to stop using a mechanical keyboard."* -- Karawebnetwork

*"This attack and Van Eck phreaking are why Edward Snowden, while typing passwords and other sensitive information, would pull a blanket over himself and his laptop."* -- aarchi

*"This is what mechanical keyboard users deserve"* -- super guy

*"fuck.."* -- Lluis Franco

## Build instructions

Dependencies:

 - **SDL2** - used to capture audio and to open GUI windows [libsdl](https://www.libsdl.org)

       [Ubuntu]
       $ sudo apt install libsdl2-dev

       [Mac OS with brew]
       $ brew install sdl2

       [MSYS2]
       $ pacman -S git cmake make mingw-w64-x86_64-dlfcn mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL2

 - **FFTW3** *(optional)* - some of the helper tools perform Fourier transformations [fftw](http://www.fftw.org)

**Linux, FreeBSD, Mac OS, Windows (MSYS2 + MinGW)**

    git clone https://github.com/ggerganov/kbd-audio
    cd kbd-audio
    git submodule update --init
    mkdir build && cd build
    cmake ..
    make

## Tools

Short summary of the available tools. If the status of the tool is not **stable**, expect problems and non-optimal results.

| Name                | Type    | Status      |
| ---                 | ---     | ---         |
| **record**          | text    | **stable**  |
| **record-full**     | text    | **stable**  |
| **play**            | text    | **stable**  |
| **play-full**       | text    | **stable**  |
| **view-gui**        | gui     | **stable**  |
| **view-full-gui**   | gui     | **stable**  |
| **key-detector**    | text    | **stable**  |
| **keytap**          | text    | **stable**  |
| **keytap-gui**      | gui     | **stable**  |
| **keytap2-gui**     | gui     | **stable**  |
| **keytap3**         | text    | **stable**  |
| **keytap3-gui**     | gui     | **stable**  |
| -                   | *extra* | -           |
| **guess-qp**        | text    | experiment  |
| **guess-qp2**       | text    | experiment  |
| **keytap3-multi**   | text    | experiment  |
| **scale**           | text    | experiment  |
| **subreak**         | text    | experiment  |
| **key-average-gui** | gui     | experiment  |
| **keytap2**         | text    | experiment  |

## Tool details

* **record-full**

  Record audio to a raw binary file on disk

      ./record-full output.kbd [-cN]

  ---

* **play-full**

  Playback a recording captured via the **record-full** tool

      ./play-full input.kbd [-pN]

  ---

* **record**

  Record audio only while typing. Useful for collecting training data for **keytap**

      ./record output.kbd [-cN] [-CN]

  ---

* **play**

  Playback a recording created via the **record** tool

      ./play input.kbd [-pN]

  ---

* **keytap**

  Detect pressed keys via microphone audio capture in real-time. Uses training data captured via the **record** tool.

      ./keytap input0.kbd [input1.kbd] [input2.kbd] ... [-cN] [-CN] [-pF] [-tF]

  ---

* **keytap-gui**

  Detect pressed keys via microphone audio capture in real-time. Uses training data captured via the **record** tool. GUI version.

      ./keytap-gui input0.kbd [input1.kbd] [input2.kbd] ... [-cN] [-CN]

  Online demo: https://keytap.ggerganov.com

  ---

* **keytap2-gui** record.kbd n-gram-dir [-pN] [-cN] [-CN]

  Detect pressed keys via microphone audio capture. Uses statistical information (n-gram frequencies) about the language. **No training data is required**. The *'record.kbd'* input file has to be generated via the **record-full** tool and contains the audio data that will be analyzed. The *'n-gram-dir'* folder file has to contain n-gram probability files for the corresponding language.

      ./keytap2-gui record.kbd ../data

  Online demo: https://keytap2.ggerganov.com

  ---

* **keytap3**

  Fully automated recovery of unknown text from audio recordings.

      ./keytap3 input.kbd ../data [-cN] [-CN] [-pF] [-tF] [-FN] [-fN]

  Online demo: https://keytap3.ggerganov.com

  ---

* **keytap3-gui**

  GUI version of the **keytap3** tool.

      ./keytap3-gui input.kbd ../data [-cN] [-CN] [-pF] [-tF] [-FN] [-fN]

  Online demo: https://keytap3-gui.ggerganov.com

  ---

* **view-full-gui**

  Visualize waveforms recorded with the **record-full** tool. Can also playback the audio data.

      ./view-full-gui input.kbd [-pN]

  <a href="https://i.imgur.com/scjTaXw.png" target="_blank">![view-full-gui](https://i.imgur.com/scjTaXw.png)</a>

  ---

* **view-gui**

  Visualize training data recorded with the **record** tool. Can also playback the audio data.

      ./view-gui input.kbd [-pN]

  <a href="https://i.imgur.com/2binGaZ.png" target="_blank">![view-full-gui](https://i.imgur.com/2binGaZ.png)</a>

  ---

## Feedback

Any feedback about the performance of the tools is highly appreciated. Please drop a comment [here](https://github.com/ggerganov/kbd-audio/issues/3).


================================================
FILE: audio-logger.cpp
================================================
/*! \file audio-logger.cpp
 *  \brief Enter description here.
 *  \author Georgi Gerganov
 */

#include "audio-logger.h"

#include <SDL.h>
#include <SDL_audio.h>

#include <mutex>
#include <atomic>
#include <algorithm>

namespace {
    void cbAudioReady(void * userData, uint8_t * stream, int32_t /*nbytes*/) {
        AudioLogger * logger = (AudioLogger *)(userData);
        logger->addFrame((AudioLogger::Sample *)(stream));
    }
}

struct AudioLogger::Data {
    Data() : isReady(false) {
        for (auto & frame : buffer) {
            frame.fill(0);
        }

        for (auto & record : records) {
            record.clear();
        }

        nFramesToRecord.fill(0);
    }

    SDL_AudioDeviceID deviceIdIn = 0;
    //SDL_AudioDeviceID deviceIdOut = 0;

    int32_t sampleSize_bytes = -1;

    int32_t bufferId = 0;
    std::array<Frame, getBufferSize_frames(kMaxSampleRate, kMaxBufferSize_s)> buffer;

    int32_t nRecords = 0;
    std::array<int32_t, kMaxRecords> nFramesToRecord;
    std::array<Record, kMaxRecords> records;

    Parameters parameters;
    TFilterCoefficients filterCoefficients;

    std::mutex mutex;
    std::atomic_bool isReady;
};

AudioLogger::AudioLogger() : data_(new AudioLogger::Data()) {}

AudioLogger::~AudioLogger() {}

bool AudioLogger::install(Parameters && parameters) {
    auto & data = getData();

    if (parameters.captureId < 0) {
        fprintf(stderr, "error : invalid captureId = %d\n", parameters.captureId);
        return false;
    }

    if (parameters.nChannels < 0) {
        fprintf(stderr, "error : invalid nChannels = %d\n", parameters.nChannels);
        return false;
    }

    if (parameters.sampleRate <= 0) {
        fprintf(stderr, "error : invalid sampleRate = %d\n", (int) parameters.sampleRate);
        return false;
    }

    if (parameters.freqCutoff_Hz <= 0) {
        fprintf(stderr, "error : invalid freqCutoff_Hz = %g\n", parameters.freqCutoff_Hz);
        return false;
    }

    static bool isInitialized = false;
    if (!isInitialized && SDL_Init(SDL_INIT_AUDIO) < 0) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
        return false;
    }
    isInitialized = true;

    int nDevices = SDL_GetNumAudioDevices(SDL_TRUE);
    printf("Found %d capture devices:\n", nDevices);
    for (int i = 0; i < nDevices; i++) {
        printf("    - Capture device #%d: '%s'\n", i, SDL_GetAudioDeviceName(i, SDL_TRUE));
    }

    if (parameters.captureId < 0 || parameters.captureId >= nDevices) {
        fprintf(stderr, "error : invalid capture device id selected - %d\n", parameters.captureId);
        return false;
    }

    SDL_AudioSpec captureSpec;
    SDL_zero(captureSpec);

    captureSpec.freq = parameters.sampleRate;
    captureSpec.format = AUDIO_F32SYS;
    captureSpec.channels = parameters.nChannels;
    captureSpec.samples = kSamplesPerFrame;
    captureSpec.callback = ::cbAudioReady;
    captureSpec.userdata = this;

    SDL_AudioSpec obtainedSpec;
    SDL_zero(obtainedSpec);

    printf("Attempt to open capture device %d : '%s' ...\n", parameters.captureId, SDL_GetAudioDeviceName(parameters.captureId, SDL_TRUE));
    data.deviceIdIn = SDL_OpenAudioDevice(SDL_GetAudioDeviceName(parameters.captureId, SDL_TRUE), SDL_TRUE, &captureSpec, &obtainedSpec, SDL_AUDIO_ALLOW_CHANNELS_CHANGE);
    if (!data.deviceIdIn) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open an audio device for capture: %s!\n", SDL_GetError());
        SDL_Quit();
        return false;
    }

    switch (obtainedSpec.format) {
        case AUDIO_U8:
        case AUDIO_S8:
        case AUDIO_U16SYS:
        case AUDIO_S16SYS:
        case AUDIO_S32SYS:
            {
                fprintf(stderr, "error : unsupported sample format %d\n", obtainedSpec.format);
                return false;
            }
            break;
        case AUDIO_F32SYS:
            {
                data.sampleSize_bytes = 4;
            }
            break;
    }

    printf("Opened capture device succesfully!\n");
    printf("    DeviceId:   %d\n", data.deviceIdIn);
    printf("    Frequency:  %d\n", obtainedSpec.freq);
    printf("    Format:     %d (%d bytes)\n", obtainedSpec.format, data.sampleSize_bytes);
    printf("    Channels:   %d\n", obtainedSpec.channels);
    printf("    Samples:    %d\n", obtainedSpec.samples);

    if (obtainedSpec.channels != parameters.nChannels && parameters.nChannels != 0) {
        printf("Warning: obtained number of channels (%d) does not match requested (%d)\n",
               obtainedSpec.channels, parameters.nChannels);
    }

    SDL_PauseAudioDevice(data.deviceIdIn, 0);

    parameters.nChannels = obtainedSpec.channels;

    switch (parameters.filter) {
        case EAudioFilter::None:
            {
            }
            break;
        case EAudioFilter::FirstOrderHighPass:
            {
                data.filterCoefficients = ::calculateCoefficientsFirstOrderHighPass(parameters.freqCutoff_Hz, parameters.sampleRate);
            }
            break;
        case EAudioFilter::SecondOrderButterworthHighPass:
            {
                data.filterCoefficients = ::calculateCoefficientsSecondOrderButterworthHighPass(parameters.freqCutoff_Hz, parameters.sampleRate);
            }
            break;
    };

    data.parameters = parameters;
    data.isReady = true;

    // print filter paramters
    printf("    Audio Filter: %d\n", parameters.filter);
    printf("    Cutoff frequency: %g Hz\n", parameters.freqCutoff_Hz);
    printf("Capturing audio ..\n");

    return true;
}

bool AudioLogger::terminate() {
    auto & data = getData();

    SDL_PauseAudioDevice(data.deviceIdIn, 1);
    SDL_CloseAudioDevice(data.deviceIdIn);

    return true;
}

bool AudioLogger::addFrame(const Sample * stream) {
    auto & data = getData();

    if (data.isReady == false) return false;

	if (SDL_GetQueuedAudioSize(data.deviceIdIn) > 32*sizeof(float)*kSamplesPerFrame) {
		printf("Queue size: %d\n", SDL_GetQueuedAudioSize(data.deviceIdIn));
		SDL_ClearQueuedAudio(data.deviceIdIn);
	}

    const float norm = 1.0/data.parameters.nChannels;

    auto & curFrame = data.buffer[data.bufferId];

    for (int i = 0; i < kSamplesPerFrame; ++i) {
        Sample x = 0;
        for (int j = 0; j < data.parameters.nChannels; ++j) {
            x += stream[i*data.parameters.nChannels + j];
        }
        curFrame[i] = x*norm;
    }

    switch (data.parameters.filter) {
        case EAudioFilter::None:
            {
            }
            break;
        case EAudioFilter::FirstOrderHighPass:
            {
                for (auto & s : curFrame) {
                    s = ::filterFirstOrderHighPass(data.filterCoefficients, s);
                }
            }
            break;
        case EAudioFilter::SecondOrderButterworthHighPass:
            {
                for (auto & s : curFrame) {
                    s = ::filterSecondOrderButterworthHighPass(data.filterCoefficients, s);
                }
            }
            break;
    }

    std::lock_guard<std::mutex> lock(data.mutex);

    for (int r = 0; r < data.nRecords; ++r) {
        auto & record = data.records[r];
        auto & nFramesToRecord = data.nFramesToRecord[r];

        if (nFramesToRecord > 0) {
            record.push_back(curFrame);
            if (--nFramesToRecord == 0) {
                if (data.parameters.callback) data.parameters.callback(record);
                record.clear();

                for (int k = r + 1; k < data.nRecords; ++k) {
                    data.records[k - 1] = std::move(data.records[k]);
                    data.nFramesToRecord[k - 1] = data.nFramesToRecord[k];
                }
                --data.nRecords;
                --r;
            }
        }
    }

    if (++data.bufferId >= (int) data.buffer.size()) {
        data.bufferId = 0;
    }

    return true;
}

bool AudioLogger::record(float bufferSize_s, int32_t nPrevFrames) {
    auto & data = getData();

    if (isValidBufferSize(bufferSize_s) == false) {
        return false;
    }

    auto bufferSize_frames = getBufferSize_frames(data.parameters.sampleRate, bufferSize_s);

    if (nPrevFrames >= bufferSize_frames) {
        fprintf(stderr, "warning : invalid previous frames in record requested - %d. max allowed is %d s\n", nPrevFrames, bufferSize_frames - 1);
        return false;
    }

    std::lock_guard<std::mutex> lock(data.mutex);

    if (data.nRecords == kMaxRecords) {
        fprintf(stderr, "warning : max number of simultaneous records %d reached\n", kMaxRecords);
        return false;
    }

    auto & record = data.records[data.nRecords];

    if (record.size() == 0) {
        int fStart = data.bufferId - nPrevFrames;
        if (fStart < 0) fStart += data.buffer.size();
        for (int i = 0; i < nPrevFrames; ++i) {
            record.push_back(data.buffer[(fStart + i)%data.buffer.size()]);
        }
    } else {
        fprintf(stderr, "warning : new record requested before last has been processed. should never happen\n");
    }

    data.nFramesToRecord[data.nRecords] = bufferSize_frames - nPrevFrames;

    ++data.nRecords;

    return true;
}

bool AudioLogger::pause() {
    auto & data = getData();
    SDL_PauseAudioDevice(data.deviceIdIn, 1);
    data.nFramesToRecord.fill(0);

    return true;
}

bool AudioLogger::resume() {
    auto & data = getData();
    SDL_PauseAudioDevice(data.deviceIdIn, 0);
    return true;
}

bool AudioLogger::isValidBufferSize(float bufferSize_s) const {
    if (bufferSize_s <= 0) {
        fprintf(stderr, "error : invalid bufferSize_s = %g\n", bufferSize_s);
        return false;
    }

    if (bufferSize_s > kMaxBufferSize_s) {
        fprintf(stderr, "error : invalid record size requested - %g s. max allowed is %g s\n", bufferSize_s, kMaxBufferSize_s);
        return false;
    }

    return true;
}


================================================
FILE: audio-logger.h
================================================
/*! \file audio-logger.h
 *  \brief Audio capture helper class
 *
 *  Used by all kbd-audio tools.
 *  It provides a stream of captured audio via a provided callback.
 *
 *  \author Georgi Gerganov
 */

#pragma once

#include "constants.h"
#include "common.h"

#include <memory>
#include <array>
#include <vector>
#include <functional>

class AudioLogger {
    public:
        using Sample = TSampleF;

        using Frame = std::array<Sample, kSamplesPerFrame>;
        using Record = std::vector<Frame>;
        using Callback = std::function<void(const Record & frames)>;

        struct Parameters {
            Callback callback;

            int32_t captureId = -1;
            int32_t nChannels = -1;

            int64_t sampleRate = -1;

            // Sample Type

            // todo : support for other sample types
            enum ESampleType {
                F32SYS,
            };

            ESampleType sampleType = F32SYS;

            // Audio Filter

            EAudioFilter filter = FirstOrderHighPass;

            float freqCutoff_Hz = 1000.0f;
        };

        AudioLogger();
        ~AudioLogger();

        bool install(Parameters && parameters);
        bool terminate();
        bool addFrame(const Sample * stream);
        bool record(float bufferSize_s, int32_t nPrevFrames);

        bool pause();
        bool resume();

        bool isValidBufferSize(float bufferSize_s) const;

    private:
        struct Data;
        std::unique_ptr<Data> data_;
        Data & getData() { return *data_; }
        const Data & getData() const { return *data_; }
};


================================================
FILE: build-vars.h.in
================================================
#pragma once

const char * kGIT_SHA1 = "@GIT_SHA1@";
const char * kGIT_DATE = "@GIT_DATE@";
const char * kGIT_COMMIT_SUBJECT = "@GIT_COMMIT_SUBJECT@";


================================================
FILE: cmake/BuildTypes.cmake
================================================
# Add new build types

# ReleaseGG - Release with enabled asserts

SET(CMAKE_CXX_FLAGS_RELEASEGG
    "-O3"
    CACHE STRING "Flags used by the c++ compiler during release builds with enabled asserts."
    FORCE )
SET(CMAKE_C_FLAGS_RELEASEGG
    "-O3"
    CACHE STRING "Flags used by the compiler during release builds with enabled asserts."
    FORCE )
SET(CMAKE_EXE_LINKER_FLAGS_RELEASEGG
    ""
    CACHE STRING "Flags used for linking binaries during release builds with enabled asserts."
    FORCE )
SET(CMAKE_SHARED_LINKER_FLAGS_RELEASEGG
    ""
    CACHE STRING "Flags used by the shared libraries linker during release builds with enabled asserts."
    FORCE )
MARK_AS_ADVANCED(
    CMAKE_CXX_FLAGS_RELEASEGG
    CMAKE_C_FLAGS_RELEASEGG
    CMAKE_EXE_LINKER_FLAGS_RELEASEGG
    CMAKE_SHARED_LINKER_FLAGS_RELEASEGG )

# RelWithDebInfoGG - RelWithDebInfo with enabled asserts

SET(CMAKE_CXX_FLAGS_RELWITHDEBINFOGG
    "-O2 -g"
    CACHE STRING "Flags used by the c++ compiler during release builds with debug symbols and enabled asserts."
    FORCE )
SET(CMAKE_C_FLAGS_RELWITHDEBINFOGG
    "-O2 -g"
    CACHE STRING "Flags used by the compiler during release builds with debug symbols and enabled asserts."
    FORCE )
SET(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFOGG
    ""
    CACHE STRING "Flags used for linking binaries during release builds with debug symbols and enabled asserts."
    FORCE )
SET(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFOGG
    ""
    CACHE STRING "Flags used by the shared libraries linker during release builds with debug symbols and enabled asserts."
    FORCE )
MARK_AS_ADVANCED(
    CMAKE_CXX_FLAGS_RELWITHDEBINFOGG
    CMAKE_C_FLAGS_RELWITHDEBINFOGG
    CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFOGG
    CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFOGG )

if (NOT XCODE AND NOT MSVC AND NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE RelWithDebInfoGG CACHE STRING "Build type" FORCE)
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo" "ReleaseGG" "RelWithDebInfoGG")
endif()


================================================
FILE: cmake/FindFFTW.cmake
================================================
# - Find FFTW
# Find the native FFTW includes and library
#
#  FFTW_INCLUDE_DIRS - where to find fftw3.h
#  FFTW_LIBRARIES    - List of libraries when using FFTW.
#  FFTWF_LIBRARIES   - List of libraries when using FFTW single precision.
#  FFTW_FOUND       - True if FFTW found.

if (FFTW_INCLUDE_DIRS)
  # Already in cache, be silent
  set (FFTW_FIND_QUIETLY TRUE)
endif (FFTW_INCLUDE_DIRS)

find_path (FFTW_INCLUDE_DIRS fftw3.h)

#find_library (FFTW_LIBRARIES NAMES fftw3f)

find_library (FFTW_LIBRARIES NAMES fftw3)
find_library (FFTWF_LIBRARIES NAMES fftw3f)
set (FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTWF_LIBRARIES})

# handle the QUIETLY and REQUIRED arguments and set FFTW_FOUND to TRUE if
# all listed variables are TRUE
include (FindPackageHandleStandardArgs)
find_package_handle_standard_args (FFTW DEFAULT_MSG FFTW_LIBRARIES FFTW_INCLUDE_DIRS)

mark_as_advanced (FFTW_LIBRARIES FFTW_INCLUDE_DIRS)


================================================
FILE: cmake/GitVars.cmake
================================================
find_package(Git)

# the commit's SHA1
execute_process(COMMAND
    "${GIT_EXECUTABLE}" describe --match=NeVeRmAtCh --always --abbrev=8
    WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
    OUTPUT_VARIABLE GIT_SHA1
    ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)

# the date of the commit
execute_process(COMMAND
    "${GIT_EXECUTABLE}" log -1 --format=%ad --date=local
    WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
    OUTPUT_VARIABLE GIT_DATE
    ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)

# the subject of the commit
execute_process(COMMAND
    "${GIT_EXECUTABLE}" log -1 --format=%s
    WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
    OUTPUT_VARIABLE GIT_COMMIT_SUBJECT
    ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)


================================================
FILE: cmake/sdl2/FindSDL2.cmake
================================================
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

#.rst:
# FindSDL2
# -------
#
# Locate SDL2 library
#
# This module defines
#
# ::
#
# SDL2_LIBRARY, the name of the library to link against
# SDL2_FOUND, if false, do not try to link to SDL
# SDL2_INCLUDE_DIR, where to find SDL.h
# SDL2_VERSION_STRING, human-readable string containing the version of SDL
#
#
#
# This module responds to the flag:
#
# ::
#
# SDL2_BUILDING_LIBRARY
# If this is defined, then no SDL2_main will be linked in because
# only applications need main().
# Otherwise, it is assumed you are building an application and this
# module will attempt to locate and set the proper link flags
# as part of the returned SDL2_LIBRARY variable.
#
#
#
# Don't forget to include SDLmain.h and SDLmain.m your project for the
# OS X framework based version. (Other versions link to -lSDLmain which
# this module will try to find on your behalf.) Also for OS X, this
# module will automatically add the -framework Cocoa on your behalf.
#
#
#
# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your
# configuration and no SDL2_LIBRARY, it means CMake did not find your SDL
# library (SDL.dll, libsdl.so, SDL.framework, etc). Set
# SDL2_LIBRARY_TEMP to point to your SDL library, and configure again.
# Similarly, if you see an empty SDLMAIN_LIBRARY, you should set this
# value as appropriate. These values are used to generate the final
# SDL2_LIBRARY variable, but when these values are unset, SDL2_LIBRARY
# does not get created.
#
#
#
# $SDLDIR is an environment variable that would correspond to the
# ./configure --prefix=$SDLDIR used in building SDL. l.e.galup 9-20-02
#
# Modified by Eric Wing. Added code to assist with automated building
# by using environmental variables and providing a more
# controlled/consistent search behavior. Added new modifications to
# recognize OS X frameworks and additional Unix paths (FreeBSD, etc).
# Also corrected the header search path to follow "proper" SDL
# guidelines. Added a search for SDLmain which is needed by some
# platforms. Added a search for threads which is needed by some
# platforms. Added needed compile switches for MinGW.
#
# On OSX, this will prefer the Framework version (if found) over others.
# People will have to manually change the cache values of SDL2_LIBRARY to
# override this selection or set the CMake environment
# CMAKE_INCLUDE_PATH to modify the search paths.
#
# Note that the header path has changed from SDL/SDL.h to just SDL.h
# This needed to change because "proper" SDL convention is #include
# "SDL.h", not <SDL/SDL.h>. This is done for portability reasons
# because not all systems place things in SDL/ (see FreeBSD).

if(NOT SDL2_DIR)
  set(SDL2_DIR "" CACHE PATH "SDL2 directory")
endif()

find_path(SDL2_INCLUDE_DIR SDL_scancode.h
  HINTS
    ENV SDLDIR
    ${SDL2_DIR}
  PATH_SUFFIXES SDL2
                # path suffixes to search inside ENV{SDLDIR}
                include/SDL2 include
)

if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  set(VC_LIB_PATH_SUFFIX lib/x64)
else()
  set(VC_LIB_PATH_SUFFIX lib/x86)
endif()

# SDL-1.1 is the name used by FreeBSD ports...
# don't confuse it for the version number.
find_library(SDL2_LIBRARY_TEMP
  NAMES SDL2
  HINTS
    ENV SDLDIR
    ${SDL2_DIR}
  PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
)

# Hide this cache variable from the user, it's an internal implementation
# detail. The documented library variable for the user is SDL2_LIBRARY
# which is derived from SDL2_LIBRARY_TEMP further below.
set_property(CACHE SDL2_LIBRARY_TEMP PROPERTY TYPE INTERNAL)

if(NOT SDL2_BUILDING_LIBRARY)
  if(NOT SDL2_INCLUDE_DIR MATCHES ".framework")
    # Non-OS X framework versions expect you to also dynamically link to
    # SDLmain. This is mainly for Windows and OS X. Other (Unix) platforms
    # seem to provide SDLmain for compatibility even though they don't
    # necessarily need it.
    find_library(SDL2MAIN_LIBRARY
      NAMES SDL2main
      HINTS
        ENV SDLDIR
        ${SDL2_DIR}
      PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
      PATHS
      /sw
      /opt/local
      /opt/csw
      /opt
    )
  endif()
endif()

# SDL may require threads on your system.
# The Apple build may not need an explicit flag because one of the
# frameworks may already provide it.
# But for non-OSX systems, I will use the CMake Threads package.
if(NOT APPLE)
  find_package(Threads)
endif()

# MinGW needs an additional link flag, -mwindows
# It's total link flags should look like -lmingw32 -lSDLmain -lSDL -mwindows
if(MINGW)
  set(MINGW32_LIBRARY mingw32 "-mwindows" CACHE STRING "link flags for MinGW")
endif()

if(SDL2_LIBRARY_TEMP)
  # For SDLmain
  if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY)
    list(FIND SDL2_LIBRARY_TEMP "${SDL2MAIN_LIBRARY}" _SDL2_MAIN_INDEX)
    if(_SDL2_MAIN_INDEX EQUAL -1)
      set(SDL2_LIBRARY_TEMP "${SDL2MAIN_LIBRARY}" ${SDL2_LIBRARY_TEMP})
    endif()
    unset(_SDL2_MAIN_INDEX)
  endif()

  # For OS X, SDL uses Cocoa as a backend so it must link to Cocoa.
  # CMake doesn't display the -framework Cocoa string in the UI even
  # though it actually is there if I modify a pre-used variable.
  # I think it has something to do with the CACHE STRING.
  # So I use a temporary variable until the end so I can set the
  # "real" variable in one-shot.
  if(APPLE)
    set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa")
  endif()

  # For threads, as mentioned Apple doesn't need this.
  # In fact, there seems to be a problem if I used the Threads package
  # and try using this line, so I'm just skipping it entirely for OS X.
  if(NOT APPLE)
    set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT})
  endif()

  # For MinGW library
  if(MINGW)
    set(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP})
  endif()

  # Set the final string here so the GUI reflects the final state.
  set(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL Library can be found")
endif()

if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL2_version.h")
  file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+[0-9]+$")
  file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+[0-9]+$")
  file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+[0-9]+$")
  string(REGEX REPLACE "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MAJOR "${SDL2_VERSION_MAJOR_LINE}")
  string(REGEX REPLACE "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MINOR "${SDL2_VERSION_MINOR_LINE}")
  string(REGEX REPLACE "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_PATCH "${SDL2_VERSION_PATCH_LINE}")
  set(SDL2_VERSION_STRING ${SDL2_VERSION_MAJOR}.${SDL2_VERSION_MINOR}.${SDL2_VERSION_PATCH})
  unset(SDL2_VERSION_MAJOR_LINE)
  unset(SDL2_VERSION_MINOR_LINE)
  unset(SDL2_VERSION_PATCH_LINE)
  unset(SDL2_VERSION_MAJOR)
  unset(SDL2_VERSION_MINOR)
  unset(SDL2_VERSION_PATCH)
endif()

set(SDL2_LIBRARIES ${SDL2_LIBRARY})
set(SDL2_INCLUDE_DIRS ${SDL2_INCLUDE_DIR})

FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL
                                  REQUIRED_VARS SDL2_LIBRARIES SDL2_INCLUDE_DIRS
                                  VERSION_VAR SDL2_VERSION_STRING)

mark_as_advanced(SDL2_LIBRARY SDL2_INCLUDE_DIR)



================================================
FILE: common-gui.cpp
================================================
/*! \file common-gui.cpp
 *  \brief Enter description here.
 */

#include "common-gui.h"

#ifdef __EMSCRIPTEN__
#include "emscripten.h"
#define IMGUI_IMPL_OPENGL_LOADER_GLEW
#endif

#include "imgui.h"
#include "imgui_impl_sdl.h"
#include "imgui_impl_opengl3.h"

#if defined(IMGUI_IMPL_OPENGL_LOADER_GL3W)
#include <GL/gl3w.h>    // Initialize with gl3wInit()
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLEW)
#include <GL/glew.h>    // Initialize with glewInit()
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD)
#include <glad/glad.h>  // Initialize with gladLoadGL()
#else
#include IMGUI_IMPL_OPENGL_LOADER_CUSTOM
#endif

namespace Gui {

bool init(const char * windowTitle, int windowSizeX, int windowSizeY, Objects & objects) {
#if __APPLE__
    // GL 3.2 Core + GLSL 150
    const char* glsl_version = "#version 150";
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
#elif __EMSCRIPTEN__
    const char* glsl_version = "#version 100";
    //const char* glsl_version = "#version 300 es";
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
#else
    // GL 3.0 + GLSL 130
    const char* glsl_version = "#version 130";
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
#endif

    // Create window with graphics context
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
    SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
    SDL_DisplayMode current;
    SDL_GetCurrentDisplayMode(0, &current);

#ifdef __EMSCRIPTEN__
    SDL_Renderer *renderer;
    SDL_CreateWindowAndRenderer(windowSizeX, windowSizeY, SDL_WINDOW_OPENGL, &objects.window, &renderer);
#else
    objects.window = SDL_CreateWindow(windowTitle, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, windowSizeX, windowSizeY, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE|SDL_WINDOW_ALLOW_HIGHDPI);
#endif

    objects.gl_context = SDL_GL_CreateContext(objects.window);
    SDL_GL_MakeCurrent(objects.window, objects.gl_context);
    SDL_GL_SetSwapInterval(1); // Enable vsync

    // Initialize OpenGL loader
#if defined(IMGUI_IMPL_OPENGL_LOADER_GL3W)
    bool err = gl3wInit() != 0;
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLEW)
    bool err = glewInit() != GLEW_OK;
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD)
    bool err = gladLoadGL() == 0;
#else
    bool err = false; // If you use IMGUI_IMPL_OPENGL_LOADER_CUSTOM, your loader is likely to requires some form of initialization.
#endif
    if (err) {
        fprintf(stderr, "Failed to initialize OpenGL loader!\n");
        return false;
    }

    // Setup Dear ImGui binding
    IMGUI_CHECKVERSION();
    ImGui::CreateContext();
    ImGuiIO& io = ImGui::GetIO(); (void)io;
    //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;  // Enable Keyboard Controls

    ImGuiStyle & style = ImGui::GetStyle();

    style.AntiAliasedFill = false;
    style.AntiAliasedLines = false;
    style.WindowRounding = 0.0f;

    style.WindowPadding = ImVec2(8, 8);
    style.WindowRounding = 0.0f;
    style.FramePadding = ImVec2(4, 3);
    style.FrameRounding = 0.0f;
    style.ItemSpacing = ImVec2(8, 4);
    style.ItemInnerSpacing = ImVec2(4, 4);
    style.IndentSpacing = 21.0f;
    style.ScrollbarSize = 16.0f;
    style.ScrollbarRounding = 9.0f;
    style.GrabMinSize = 10.0f;
    style.GrabRounding = 3.0f;

    style.Colors[ImGuiCol_Text]                  = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
    style.Colors[ImGuiCol_TextDisabled]          = ImVec4(0.24f, 0.41f, 0.41f, 1.00f);
    style.Colors[ImGuiCol_WindowBg]              = ImVec4(0.08f, 0.08f, 0.08f, 0.94f);
    //style.Colors[ImGuiCol_ChildWindowBg]         = ImVec4(0.07f, 0.07f, 0.09f, 1.00f);
    style.Colors[ImGuiCol_PopupBg]               = ImVec4(0.07f, 0.07f, 0.09f, 1.00f);
    style.Colors[ImGuiCol_Border]                = ImVec4(0.31f, 0.31f, 0.31f, 0.71f);
    style.Colors[ImGuiCol_BorderShadow]          = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
    style.Colors[ImGuiCol_FrameBg]               = ImVec4(0.00f, 0.39f, 0.39f, 0.39f);
    style.Colors[ImGuiCol_FrameBgHovered]        = ImVec4(0.26f, 1.00f, 1.00f, 0.39f);
    style.Colors[ImGuiCol_FrameBgActive]         = ImVec4(0.00f, 0.78f, 0.00f, 1.00f);
    style.Colors[ImGuiCol_TitleBg]               = ImVec4(0.00f, 0.50f, 0.50f, 0.70f);
    style.Colors[ImGuiCol_TitleBgCollapsed]      = ImVec4(0.00f, 0.50f, 0.50f, 1.00f);
    style.Colors[ImGuiCol_TitleBgActive]         = ImVec4(0.00f, 0.70f, 0.70f, 1.00f);
    style.Colors[ImGuiCol_MenuBarBg]             = ImVec4(0.00f, 0.70f, 0.70f, 1.00f);
    style.Colors[ImGuiCol_ScrollbarBg]           = ImVec4(0.10f, 0.27f, 0.27f, 1.00f);
    style.Colors[ImGuiCol_ScrollbarGrab]         = ImVec4(0.80f, 0.80f, 0.83f, 0.31f);
    style.Colors[ImGuiCol_ScrollbarGrabHovered]  = ImVec4(0.26f, 1.00f, 1.00f, 0.39f);
    style.Colors[ImGuiCol_ScrollbarGrabActive]   = ImVec4(0.00f, 0.78f, 0.00f, 1.00f);
    //style.Colors[ImGuiCol_ComboBg]               = ImVec4(0.00f, 0.39f, 0.39f, 1.00f);
    style.Colors[ImGuiCol_CheckMark]             = ImVec4(0.80f, 0.80f, 0.83f, 0.39f);
    style.Colors[ImGuiCol_SliderGrab]            = ImVec4(0.80f, 0.80f, 0.83f, 0.39f);
    style.Colors[ImGuiCol_SliderGrabActive]      = ImVec4(0.00f, 0.78f, 0.00f, 1.00f);
    style.Colors[ImGuiCol_Button]                = ImVec4(0.13f, 0.55f, 0.55f, 1.00f);
    style.Colors[ImGuiCol_ButtonHovered]         = ImVec4(0.61f, 1.00f, 0.00f, 0.51f);
    style.Colors[ImGuiCol_ButtonActive]          = ImVec4(0.00f, 0.78f, 0.00f, 1.00f);
    style.Colors[ImGuiCol_Header]                = ImVec4(0.79f, 0.51f, 0.00f, 0.51f);
    style.Colors[ImGuiCol_HeaderHovered]         = ImVec4(0.79f, 0.51f, 0.00f, 0.67f);
    style.Colors[ImGuiCol_HeaderActive]          = ImVec4(0.79f, 0.51f, 0.00f, 0.67f);
    //style.Colors[ImGuiCol_Column]                = ImVec4(0.79f, 0.51f, 0.00f, 0.67f);
    //style.Colors[ImGuiCol_ColumnHovered]         = ImVec4(0.25f, 1.00f, 0.00f, 1.00f);
    //style.Colors[ImGuiCol_ColumnActive]          = ImVec4(0.79f, 0.51f, 0.00f, 0.67f);
    style.Colors[ImGuiCol_ResizeGrip]            = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
    style.Colors[ImGuiCol_ResizeGripHovered]     = ImVec4(0.26f, 1.00f, 1.00f, 0.39f);
    style.Colors[ImGuiCol_ResizeGripActive]      = ImVec4(0.00f, 0.78f, 0.00f, 1.00f);
    //style.Colors[ImGuiCol_CloseButton]           = ImVec4(0.40f, 0.39f, 0.38f, 0.16f);
    //style.Colors[ImGuiCol_CloseButtonHovered]    = ImVec4(0.26f, 1.00f, 1.00f, 0.39f);
    //style.Colors[ImGuiCol_CloseButtonActive]     = ImVec4(0.79f, 0.51f, 0.00f, 0.67f);
    style.Colors[ImGuiCol_PlotLines]             = ImVec4(1.00f, 0.65f, 0.38f, 0.67f);
    style.Colors[ImGuiCol_PlotLinesHovered]      = ImVec4(0.25f, 1.00f, 0.00f, 1.00f);
    style.Colors[ImGuiCol_PlotHistogram]         = ImVec4(1.00f, 0.65f, 0.38f, 0.67f);
    style.Colors[ImGuiCol_PlotHistogramHovered]  = ImVec4(0.25f, 1.00f, 0.00f, 1.00f);
    style.Colors[ImGuiCol_TextSelectedBg]        = ImVec4(0.25f, 1.00f, 0.00f, 0.43f);
    style.Colors[ImGuiCol_ModalWindowDarkening]  = ImVec4(1.00f, 0.98f, 0.95f, 0.78f);

    ImGui_ImplSDL2_InitForOpenGL(objects.window, objects.gl_context);
    ImGui_ImplOpenGL3_Init(glsl_version);

    return true;
}

bool render(const Objects & objects) {
    ImGui::Render();
    SDL_GL_MakeCurrent(objects.window, objects.gl_context);
    glViewport(0, 0, (int) ImGui::GetIO().DisplaySize.x, (int) ImGui::GetIO().DisplaySize.y);
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
    SDL_GL_SwapWindow(objects.window);

    return true;
}

bool free(const Objects & objects) {
    ImGui_ImplOpenGL3_Shutdown();
    ImGui_ImplSDL2_Shutdown();
    ImGui::DestroyContext();

    SDL_GL_DeleteContext(objects.gl_context);
    SDL_DestroyWindow(objects.window);
    SDL_Quit();

    return true;
}

}


================================================
FILE: common-gui.h
================================================
/*! \file common-gui.h
 *  \brief Enter description here.
 */

#pragma once

#include "common.h"

#include <SDL.h>

namespace Gui {
struct Objects {
    SDL_Window * window = nullptr;
    SDL_GLContext gl_context = nullptr;
};

bool init(const char * windowTitle, int windowSizeX, int windowSizeY, Objects & objects);
bool render(const Objects & objects);
bool free(const Objects & objects);
}


================================================
FILE: common.cpp
================================================
/*! \file common.cpp
 *  \brief Enter description here.
 */

#include "common.h"
#include "constants.h"

#include <cstring>
#include <cmath>
#include <thread>
#include <mutex>
#include <fstream>
#include <deque>
#include <algorithm>

#ifndef pi
#define  pi 3.1415926535897932384626433832795
#endif

#ifndef sqrt2
#define sqrt2 (2.0 * 0.707106781186547524401)
#endif

#ifndef sqrt2over2
#define  sqrt2over2  0.707106781186547524401
#endif

namespace {
template <typename TSampleInput, typename TSample>
    bool readWaveform(std::ifstream & fin, TWaveformT<TSample> & res, int32_t offset, std::streamsize size) {
        if (std::is_same<TSample, TSampleI16>::value) {
            std::vector<TSampleInput> buf(size/sizeof(TSampleInput));
            res.resize(offset + size/sizeof(TSampleInput));
            fin.read((char *)(buf.data()), size);
            double amax = calcAbsMax(buf);
            double iamax = amax != 0.0 ? 1.0/amax : 1.0;
            for (auto i = 0; i < (int) buf.size(); ++i) res[offset + i] = std::round(std::numeric_limits<TSampleI16>::max()*(buf[i]*iamax));
        } else if (std::is_same<TSample, TSampleF>::value) {
            res.resize(offset + size/sizeof(TSample));
            fin.read((char *)(res.data() + offset), size);
        } else {
            return false;
        }
        return true;
    }
}

constexpr float iRAND_MAX = 1.0f/float(RAND_MAX);
float frand() { return ((float)rand())*iRAND_MAX; }

float frandGaussian(float mu, float sigma) {
	static const float two_pi = 2.0*3.14159265358979323846;

	thread_local float z1;
	thread_local bool generate;
	generate = !generate;

	if (!generate)
	   return z1 * sigma + mu;

	float u1 = frand();
    float u2 = frand();

    float t = sqrt(-2.0f * log(1.0f - u1));

	float z0 = t*cos(two_pi*u2);
	z1 = t*sin(two_pi*u2);

	return z0 * sigma + mu;
}

uint64_t t_ms() {
    return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count(); // duh ..
}

std::map<std::string, std::string> parseCmdArguments(int argc, char ** argv) {
    int last = argc;
    std::map<std::string, std::string> res;
    for (int i = 1; i < last; ++i) {
        if (argv[i][0] == '-') {
            if (strlen(argv[i]) > 1) {
                res[std::string(1, argv[i][1])] = strlen(argv[i]) > 2 ? argv[i] + 2 : "";
            }
        }
    }

    return res;
}

template <typename TSampleSrc, typename TSampleDst>
bool convert(const TWaveformT<TSampleSrc> & src, TWaveformT<TSampleDst> & dst) {
    static_assert(std::is_same<TSampleSrc, TSampleDst>::value == false, "Required different sample types");

    static_assert(std::is_same<TSampleSrc, TSampleF>::value, "Source sample type not supported");
    static_assert(std::is_same<TSampleDst, TSampleI16>::value, "Destination sample type not supported");

    dst.resize(src.size());

    double amax = calcAbsMax(src);
    double iamax = amax != 0.0 ? 1.0/amax : 1.0;
    for (auto i = 0; i < (int) src.size(); ++i) dst[i] = std::round(std::numeric_limits<TSampleDst>::max()*(src[i]*iamax));

    return true;
}

template bool convert<TSampleF, TSampleI16>(const TWaveformT<TSampleF> & src, TWaveformT<TSampleI16> & dst);

template <typename TSample>
void filter(TWaveformT<TSample> & waveform, EAudioFilter filterId, float freqCutoff_Hz, int64_t sampleRate) {
    switch (filterId) {
        case EAudioFilter::None:
            {
                return;
            }
            break;
        case EAudioFilter::FirstOrderHighPass:
            {
                auto filterCoefficients = ::calculateCoefficientsFirstOrderHighPass(freqCutoff_Hz, sampleRate);
                for (auto & s : waveform) {
                    s = ::filterFirstOrderHighPass(filterCoefficients, s);
                }
                return;
            }
            break;
        case EAudioFilter::SecondOrderButterworthHighPass:
            {
                auto filterCoefficients = ::calculateCoefficientsSecondOrderButterworthHighPass(freqCutoff_Hz, sampleRate);
                for (auto & s : waveform) {
                    s = ::filterSecondOrderButterworthHighPass(filterCoefficients, s);
                }
                return;
            }
            break;
    }

    fprintf(stderr, "Unknown filter type: %d\n", filterId);
}

template void filter<TSampleF>(TWaveformT<TSampleF> & waveform, EAudioFilter filterId, float freqCutoff_Hz, int64_t sampleRate);

template <typename TSample>
double calcAbsMax(const TWaveformT<TSample> & waveform) {
    double amax = 0.0f;
    for (auto i = 0; i < (int) waveform.size(); ++i) if (std::abs(waveform[i]) > amax) amax = std::abs(waveform[i]);

    return amax;
}

template double calcAbsMax<TSampleF>(const TWaveformT<TSampleF> & waveform);

template <typename TSample>
bool saveToFile(const std::string & fname, TWaveformT<TSample> & waveform) {
    static_assert(std::is_same<TSample, TSampleF>::value, "Sample type not supported");

    std::ofstream fout(fname, std::ios::binary);
    if (fout.good() == false) {
        return false;
    }

    auto totalSize_bytes = sizeof(TSample)*waveform.size();

    fout.write((char *)(waveform.data()), totalSize_bytes);
    fout.close();

    printf("Total data saved: %g MB\n", ((float)(totalSize_bytes)/1024.0f/1024.0f));

    return true;
}

template bool saveToFile<TSampleF>(const std::string & fname, TWaveformT<TSampleF> & waveform);

template <typename TSampleInput, typename TSample>
bool readFromFile(const std::string & fname, TWaveformT<TSample> & res) {
    std::ifstream fin(fname, std::ios::binary | std::ios::ate);
    if (fin.good() == false) {
        return false;
    }

    {
        std::streamsize size = fin.tellg();
        fin.seekg(0, std::ios::beg);

        static_assert(std::is_same<TSampleInput, TSampleF>::value, "TSampleInput not supported");
        static_assert(std::is_same<TSample, TSampleF>::value ||
                      std::is_same<TSample, TSampleI16>::value, "TSample not supported");

        if (readWaveform<TSampleInput>(fin, res, 0, size) == false) {
            return false;
        }
    }

    fin.close();

    return true;
}

template bool readFromFile<TSampleF, TSampleI16>(const std::string & fname, TWaveformT<TSampleI16> & res);
template bool readFromFile<TSampleF, TSampleF>(const std::string & fname, TWaveformT<TSampleF> & res);

template <typename TSampleInput, typename TSample>
bool readFromFile(const std::string & fname, TWaveformT<TSample> & res, TTrainKeys & trainKeys, int32_t & bufferSize_frames) {
    trainKeys.clear();

    std::ifstream fin(fname, std::ios::binary);
    if (fin.good() == false) {
        return false;
    }

    bufferSize_frames = 1;
    fin.read((char *)(&bufferSize_frames), sizeof(bufferSize_frames));

    {
        static_assert(std::is_same<TSampleInput, TSampleF>::value, "TSampleInput not supported");
        static_assert(std::is_same<TSample, TSampleF>::value ||
                      std::is_same<TSample, TSampleI16>::value, "TSample not supported");

        int32_t offset = 0;
        std::streamsize size = bufferSize_frames*kSamplesPerFrame*sizeof(TSampleInput);
        while (true) {
            TKey keyPressed = 0;
            fin.read((char *)(&keyPressed), sizeof(keyPressed));
            if (fin.eof()) break;
            trainKeys.push_back(keyPressed);

            if (readWaveform<TSampleInput>(fin, res, offset, size) == false) {
                return false;
            }

            offset += size/sizeof(TSampleInput);
            if (fin.eof()) break;
        }
    }

    fin.close();

    return true;
}

template bool readFromFile<TSampleF, TSampleI16>(const std::string & fname, TWaveformT<TSampleI16> & res, TTrainKeys & trainKeys, int32_t & bufferSize_frames);

//
// filters
//

TFilterCoefficients calculateCoefficientsFirstOrderHighPass(int fc, int fs) {
    TFilterCoefficients res;

    float th = 2.0 * pi * fc / fs;
    float g = cos(th) / (1.0 + sin(th));
    res.a0 = (1.0 + g) / 2.0;
    res.a1 = -((1.0 + g) / 2.0);
    res.a2 = 0.0;
    res.b1 = -g;
    res.b2 = 0.0;

    return res;
}

TFilterCoefficients calculateCoefficientsSecondOrderButterworthHighPass(int fc, int fs) {
    TFilterCoefficients res;

    float c = tan(pi*fc / fs);
    res.a0 = 1.0 / (1.0 + sqrt2*c + pow(c, 2.0));
    res.a1 = -2.0 * res.a0;
    res.a2 = res.a0;
    res.b1 = 2.0 * res.a0*(pow(c, 2.0) - 1.0);
    res.b2 = res.a0 * (1.0 - sqrt2*c + pow(c, 2.0));

    return res;
}

TSampleF filterFirstOrderHighPass(TFilterCoefficients & coefficients, TSampleF sample) {
    TSampleF xn = sample;
    TSampleF yn =
        coefficients.a0*xn + coefficients.a1*coefficients.xnz1 + coefficients.a2*coefficients.xnz2 -
                             coefficients.b1*coefficients.ynz1 - coefficients.b2*coefficients.ynz2;

    coefficients.xnz2 = coefficients.xnz1;
    coefficients.xnz1 = xn;
    coefficients.ynz2 = coefficients.ynz1;
    coefficients.ynz1 = yn;

    return yn;
}

TSampleF filterSecondOrderButterworthHighPass(TFilterCoefficients & coefficients, TSampleF sample) {
    TSampleF xn = sample;
    TSampleF yn =
        coefficients.a0*xn + coefficients.a1*coefficients.xnz1 + coefficients.a2*coefficients.xnz2 -
                             coefficients.b1*coefficients.ynz1 - coefficients.b2*coefficients.ynz2;

    coefficients.xnz2 = coefficients.xnz1;
    coefficients.xnz1 = xn;
    coefficients.ynz2 = coefficients.ynz1;
    coefficients.ynz1 = yn;

    return yn;
}

//
// calcCC
//

std::tuple<double, double> calcSum(const TKeyWaveformF & waveform, int is0, int is1) {
    double sum = 0.0f;
    double sum2 = 0.0f;
    for (int is = is0; is < is1; ++is) {
        auto a0 = waveform[is];
        sum += a0;
        sum2 += a0*a0;
    }

    return std::tuple<double, double>(sum, sum2);
}

template<>
std::tuple<int64_t, int64_t> calcSum(const TWaveformViewT<TSampleMI16> & waveform) {
    int64_t sum = 0;
    int64_t sum2 = 0;

    auto samples = waveform.samples;
    auto n       = waveform.n;

    for (int is = 0; is < n; ++is) {
        for (int j = 0; j < TSampleMI16::N; j++) {
            int32_t a0 = samples[is][j];
            sum += a0;
            sum2 += a0*a0;
        }
    }

    return std::tuple<int64_t, int64_t>(sum, sum2);
}

template<typename T>
std::tuple<int64_t, int64_t> calcSum(const TWaveformViewT<T> & waveform) {
    int64_t sum = 0;
    int64_t sum2 = 0;

    auto samples = waveform.samples;
    auto n       = waveform.n;

    for (int is = 0; is < n; ++is) {
        int32_t a0 = samples[is];
        sum += a0;
        sum2 += a0*a0;
    }

    return std::tuple<int64_t, int64_t>(sum, sum2);
}

// calcSum : specializations

template std::tuple<int64_t, int64_t> calcSum<TSampleI16>(const TWaveformViewT<TSampleI16> & waveform);

//
// calcCC
//

TValueCC calcCC(
    const TKeyWaveformF & waveform0,
    const TKeyWaveformF & waveform1,
    double sum0, double sum02,
    int is00, int is0, int is1) {
    TValueCC cc = -1.0f;

    double sum1 = 0.0f;
    double sum12 = 0.0f;
    double sum01 = 0.0f;
    for (int is = 0; is < is1 - is0; ++is) {
        auto a0 = waveform0[is00 + is];
        auto a1 = waveform1[is0 + is];

#ifdef MY_DEBUG
        if (is00 + is < 0 || is00 + is >= waveform0.size()) printf("BUG 0\n");
        if (is0 + is < 0 || is0 + is >= waveform1.size()) {
            printf("BUG 1\n");
            printf("%d %d %d\n", is0, is, (int) waveform1.size());
        }
#endif

        sum1 += a1;
        sum12 += a1*a1;
        sum01 += a0*a1;
    }

    int ncc = (is1 - is0);
    {
        double nom = sum01*ncc - sum0*sum1;
        double den2a = sum02*ncc - sum0*sum0;
        double den2b = sum12*ncc - sum1*sum1;
        cc = (nom)/(sqrt(den2a*den2b));
    }

    return cc;
}

template<>
TValueCC calcCC(
    const TWaveformViewT<TSampleMI16> & waveform0,
    const TWaveformViewT<TSampleMI16> & waveform1,
    int64_t sum0, int64_t sum02) {
    TValueCC cc = -1.0f;

    int64_t sum1 = 0;
    int64_t sum12 = 0;
    int64_t sum01 = 0;

    auto samples0 = waveform0.samples;
    auto n0       = waveform0.n;

    auto samples1 = waveform1.samples;
    auto n1       = waveform1.n;

#ifdef MY_DEBUG
    if (n0 != n1) {
        printf("BUG 234f8273\n");
    }
#endif
    auto n = std::min(n0, n1);

    for (int64_t is = 0; is < n; ++is) {
        for (int j = 0; j < TSampleMI16::N; j++) {
            int32_t a0 = samples0[is][j];
            int32_t a1 = samples1[is][j];

            sum1 += a1;
            sum12 += a1*a1;
            sum01 += a0*a1;
        }
    }

    n *= TSampleMI16::N;

    {
        double nom   = sum01*n - sum0*sum1;
        double den2a = sum02*n - sum0*sum0;
        double den2b = sum12*n - sum1*sum1;
        cc = (nom)/(sqrt(den2a*den2b));
    }

    return cc;
}

template<typename T>
TValueCC calcCC(
    const TWaveformViewT<T> & waveform0,
    const TWaveformViewT<T> & waveform1,
    int64_t sum0, int64_t sum02) {
    TValueCC cc = -1.0f;

    int64_t sum1 = 0;
    int64_t sum12 = 0;
    int64_t sum01 = 0;

    auto samples0 = waveform0.samples;
    auto n0       = waveform0.n;

    auto samples1 = waveform1.samples;
    auto n1       = waveform1.n;

#ifdef MY_DEBUG
    if (n0 != n1) {
        printf("BUG 234f8273\n");
    }
#endif
    auto n = std::min(n0, n1);

    for (int64_t is = 0; is < n; ++is) {
        int32_t a0 = samples0[is];
        int32_t a1 = samples1[is];

        sum1 += a1;
        sum12 += a1*a1;
        sum01 += a0*a1;
    }

    {
        double nom = sum01*n - sum0*sum1;
        double den2a = sum02*n - sum0*sum0;
        double den2b = sum12*n - sum1*sum1;
        cc = (nom)/(sqrt(den2a*den2b));
    }

    return cc;
}

// calcCC : specializations

template TValueCC calcCC<TSampleI16>(
    const TWaveformViewT<TSampleI16> & waveform0,
    const TWaveformViewT<TSampleI16> & waveform1,
    int64_t sum0, int64_t sum02);

//
// findBestCC
//

std::tuple<TValueCC, TOffset> findBestCC(
    const TKeyWaveformF & waveform0,
    const TKeyWaveformF & waveform1,
    int is0, int is1,
    int alignWindow) {
    TOffset besto = -1;
    TValueCC bestcc = -1.0f;

    int is00 = waveform0.size()/2 - (is1 - is0)/2;
    auto ret = calcSum(waveform0, is00, is00 + is1 - is0);
    auto sum0  = std::get<0>(ret);
    auto sum02 = std::get<1>(ret);

#ifdef __EMSCRIPTEN__
    int nWorkers = std::min(4, std::max(1, int(std::thread::hardware_concurrency()) - 2));
#else
    int nWorkers = std::min(4u, std::thread::hardware_concurrency());
    std::mutex mutex;
    std::vector<std::thread> workers(nWorkers);
    for (int i = 0; i < (int) workers.size(); ++i) {
        auto & worker = workers[i];
        worker = std::thread([&, sum0 = sum0, sum02 = sum02, i]() {
            TOffset cbesto = -1;
            TValueCC cbestcc = -1.0f;

            for (int o = -alignWindow + i; o <= alignWindow; o += nWorkers) {
                auto cc = calcCC(waveform0, waveform1, sum0, sum02, is00, is0 + o, is1 + o);
                if (cc > cbestcc) {
                    cbesto = o;
                    cbestcc = cc;
                }
            }

            {
                std::lock_guard<std::mutex> lock(mutex);
                if (cbestcc > bestcc) {
                    bestcc = cbestcc;
                    besto = cbesto;
                }
            }
        });
    }
    for (auto & worker : workers) worker.join();
#endif

    return std::tuple<TValueCC, TOffset>(bestcc, besto);
}

template<typename T>
std::tuple<TValueCC, TOffset> findBestCC(
    const TWaveformViewT<T> & waveform0,
    const TWaveformViewT<T> & waveform1,
    int64_t alignWindow) {
    TValueCC bestcc = -1.0;
    TOffset besto = -1;

    //auto samples0 = waveform0.samples;
    auto n0       = waveform0.n;

    auto samples1 = waveform1.samples;

#ifdef MY_DEBUG
    auto n1 = waveform1.n;
    if (n0 + 2*alignWindow != n1) {
        printf("BUG 924830jm92, n0 = %d, a = %d\n", (int) n0, (int) alignWindow);
    }
#endif

    auto ret = calcSum(waveform0);
    auto sum0  = std::get<0>(ret);
    auto sum02 = std::get<1>(ret);

    for (int o = 0; o <= 2*alignWindow; ++o) {
        auto cc = calcCC(waveform0, { samples1 + o, n0 }, sum0, sum02);
        if (cc > bestcc) {
            besto = o - alignWindow;
            bestcc = cc;
        }
    }

    return std::tuple<TValueCC, TOffset>(bestcc, besto);
}

// findBestCC : specializations

template std::tuple<TValueCC, TOffset> findBestCC<TSampleI16>(
    const TWaveformViewT<TSampleI16> & waveform0,
    const TWaveformViewT<TSampleI16> & waveform1,
    int64_t alignWindow);

//
// calculateSimilarityMap
//

template<>
bool calculateSimilartyMap(
        const int32_t keyPressWidth_samples,
        const int32_t alignWindow_samples,
        const int32_t offsetFromPeak_samples,
        TKeyPressCollectionT<TSampleMI16> & keyPresses,
        TSimilarityMap & res) {
    int nPresses = keyPresses.size();

    int w = keyPressWidth_samples;
    int a = alignWindow_samples;

    res.clear();
    res.resize(nPresses);
    for (auto & x : res) x.resize(nPresses);

#ifdef __EMSCRIPTEN__
    int nWorkers = std::min(kMaxThreads, std::max(1, int(std::thread::hardware_concurrency()) - 2));
#else
    int nWorkers = std::thread::hardware_concurrency();
#endif

    std::vector<std::thread> workers(nWorkers);
    for (int iw = 0; iw < (int) workers.size(); ++iw) {
        auto & worker = workers[iw];
        worker = std::thread([&](int ith) {
            for (int i = ith; i < nPresses; i += nWorkers) {
                res[i][i].cc = 1.0f;
                res[i][i].offset = 0;

                const auto & waveform0 = keyPresses[i].waveform;
                const auto & pos0      = keyPresses[i].pos;

                auto & avgcc = keyPresses[i].ccAvg;

                const auto samples0 = waveform0.samples;

                for (int j = i + 1; j < nPresses; ++j) {
                    if (i == j) continue;

                    const auto waveform1 = keyPresses[j].waveform;
                    const auto pos1      = keyPresses[j].pos;

                    const auto samples1 = waveform1.samples;
                    const auto ret = findBestCC(TWaveformViewT<TSampleMI16> { samples0 + pos0 + offsetFromPeak_samples - w,     2*w },
                                                TWaveformViewT<TSampleMI16> { samples1 + pos1 + offsetFromPeak_samples - w - a, 2*w + 2*a }, a);

                    const auto bestcc     = std::get<0>(ret);
                    const auto bestoffset = std::get<1>(ret);

                    res[i][j].cc = bestcc;
                    res[i][j].offset = bestoffset;

                    res[j][i].cc = bestcc;
                    res[j][i].offset = -bestoffset;

                    avgcc += bestcc;
                }
                avgcc /= (nPresses - 1);
            }
        }, iw);
    }

    for (auto & worker : workers) worker.join();

    return true;
}

template<typename T>
bool calculateSimilartyMap(
        const int32_t keyPressWidth_samples,
        const int32_t alignWindow_samples,
        const int32_t offsetFromPeak_samples,
        TKeyPressCollectionT<T> & keyPresses,
        TSimilarityMap & res) {
    int nPresses = keyPresses.size();

    int w = keyPressWidth_samples;
    int a = alignWindow_samples;

    res.clear();
    res.resize(nPresses);
    for (auto & x : res) x.resize(nPresses);

#ifdef __EMSCRIPTEN__
    int nWorkers = std::min(kMaxThreads, std::max(1, int(std::thread::hardware_concurrency()) - 2));
#else
    int nWorkers = std::thread::hardware_concurrency();
#endif

    std::vector<std::thread> workers(nWorkers);
    for (int iw = 0; iw < (int) workers.size(); ++iw) {
        auto & worker = workers[iw];
        worker = std::thread([&](int ith) {
            for (int i = ith; i < nPresses; i += nWorkers) {
                res[i][i].cc = 1.0f;
                res[i][i].offset = 0;

                const auto & waveform0 = keyPresses[i].waveform;
                const auto & pos0      = keyPresses[i].pos;

                auto & avgcc = keyPresses[i].ccAvg;

                const auto samples0 = waveform0.samples;

                for (int j = i + 1; j < nPresses; ++j) {
                    if (i == j) continue;

                    const auto waveform1 = keyPresses[j].waveform;
                    const auto pos1      = keyPresses[j].pos;

                    const auto samples1 = waveform1.samples;
                    const auto ret = findBestCC(TWaveformViewT<T> { samples0 + pos0 + offsetFromPeak_samples - w,     2*w },
                                                TWaveformViewT<T> { samples1 + pos1 + offsetFromPeak_samples - w - a, 2*w + 2*a }, a);

                    const auto bestcc     = std::get<0>(ret);
                    const auto bestoffset = std::get<1>(ret);

                    res[i][j].cc = bestcc;
                    res[i][j].offset = bestoffset;

                    res[j][i].cc = bestcc;
                    res[j][i].offset = -bestoffset;

                    avgcc += bestcc;
                }
                avgcc /= (nPresses - 1);
            }
        }, iw);
    }

    for (auto & worker : workers) worker.join();

    return true;
}

template bool calculateSimilartyMap<TSampleI16>(
        const int32_t keyPressWidth_samples,
        const int32_t alignWindow_samples,
        const int32_t offsetFromPeak_samples,
        TKeyPressCollectionT<TSampleI16> & keyPresses,
        TSimilarityMap & res);

//
// findKeyPresses
//

template<>
bool findKeyPresses(
        const TWaveformViewT<TSampleMI16> & waveform,
        TKeyPressCollectionT<TSampleMI16> & res,
        TWaveformT<TSampleMI16> & waveformThreshold,
        TWaveformT<TSampleMI16> & waveformMax,
        double thresholdBackground,
        int historySize,
        int historySizeReset,
        bool removeLowPower) {
    res.clear();
    waveformThreshold.resize(waveform.n);
    waveformMax.resize(waveform.n);

    int rbBegin = 0;
    double rbAverage = 0.0;
    std::vector<double> rbSamples(8*historySize, 0.0);

    int k = historySize;
    std::deque<int64_t> que(k);

    auto samples = waveform.samples;
    auto n       = waveform.n;

    TWaveformT<TSampleMI16> waveformAbs(n);
    for (int64_t i = 0; i < n; ++i) {
        waveformAbs[i][0] = std::abs(samples[i][0]);
    }

    for (int64_t i = 0; i < n; ++i) {
        {
            int64_t ii = i - k/2;
            if (ii >= 0) {
                rbAverage *= rbSamples.size();
                rbAverage -= rbSamples[rbBegin];
                double acur = waveformAbs[i][0];
                rbSamples[rbBegin] = acur;
                rbAverage += acur;
                rbAverage /= rbSamples.size();
                if (++rbBegin >= (int) rbSamples.size()) {
                    rbBegin = 0;
                }
            }
        }

        if (i < k) {
            while((!que.empty()) && waveformAbs[i] >= waveformAbs[que.back()]) {
                que.pop_back();
            }
            que.push_back(i);
        } else {
            while((!que.empty()) && que.front() <= i - k) {
                que.pop_front();
            }

            while((!que.empty()) && waveformAbs[i] >= waveformAbs[que.back()]) {
                que.pop_back();
            }

            que.push_back(i);

            int64_t itest = i - k/2;
            if (itest >= 2*k && itest < n - 2*k && que.front() == itest) {
                double acur = waveformAbs[itest][0];
                if (acur > thresholdBackground*rbAverage) {
                    res.emplace_back(TKeyPressDataT<TSampleMI16> { std::move(waveform), itest, 0.0, -1, -1, '?' });
                }
            }
            waveformThreshold[itest][0] = thresholdBackground*rbAverage;
            waveformMax[itest] = waveformAbs[que.front()];
        }
    }

    if (removeLowPower) {
        while (true) {
            auto oldn = res.size();

            double avgPower = 0.0;
            for (const auto & kp : res) {
                avgPower += waveformAbs[kp.pos][0];
            }
            avgPower /= res.size();

            auto tmp = std::move(res);
            for (const auto & kp : tmp) {
                if (waveformAbs[kp.pos][0] > 0.3*avgPower) {
                    res.push_back(kp);
                }
            }

            if (res.size() == oldn) break;
        }
    }

    if (res.size() > 1) {
        TKeyPressCollectionT<TSampleMI16> res2;
        res2.push_back(res.front());

        for (int i = 1; i < (int) res.size(); ++i) {
            if (res[i].pos - res2.back().pos > historySizeReset || waveformMax[res[i].pos] > waveformMax[res2.back().pos]) {
                res2.push_back(res[i]);
            }
        }

        std::swap(res, res2);
    }

    return true;
}

template<typename T>
bool findKeyPresses(
        const TWaveformViewT<T> & waveform,
        TKeyPressCollectionT<T> & res,
        TWaveformT<T> & waveformThreshold,
        TWaveformT<T> & waveformMax,
        double thresholdBackground,
        int historySize,
        int historySizeReset,
        bool removeLowPower) {
    res.clear();
    waveformThreshold.resize(waveform.n);
    waveformMax.resize(waveform.n);

    int rbBegin = 0;
    double rbAverage = 0.0;
    std::vector<double> rbSamples(8*historySize, 0.0);

    int k = historySize;
    std::deque<int64_t> que(k);

    auto samples = waveform.samples;
    auto n       = waveform.n;

    TWaveformT<T> waveformAbs(n);
    for (int64_t i = 0; i < n; ++i) {
        waveformAbs[i] = std::abs(samples[i]);
    }

    for (int64_t i = 0; i < n; ++i) {
        {
            int64_t ii = i - k/2;
            if (ii >= 0) {
                rbAverage *= rbSamples.size();
                rbAverage -= rbSamples[rbBegin];
                double acur = waveformAbs[i];
                rbSamples[rbBegin] = acur;
                rbAverage += acur;
                rbAverage /= rbSamples.size();
                if (++rbBegin >= (int) rbSamples.size()) {
                    rbBegin = 0;
                }
            }
        }

        if (i < k) {
            while((!que.empty()) && waveformAbs[i] >= waveformAbs[que.back()]) {
                que.pop_back();
            }
            que.push_back(i);
        } else {
            while((!que.empty()) && que.front() <= i - k) {
                que.pop_front();
            }

            while((!que.empty()) && waveformAbs[i] >= waveformAbs[que.back()]) {
                que.pop_back();
            }

            que.push_back(i);

            int64_t itest = i - k/2;
            if (itest >= 2*k && itest < n - 2*k && que.front() == itest) {
                double acur = waveformAbs[itest];
                if (acur > thresholdBackground*rbAverage) {
                    res.emplace_back(TKeyPressDataT<T> { std::move(waveform), itest, 0.0, -1, -1, '?' });
                }
            }
            waveformThreshold[itest] = thresholdBackground*rbAverage;
            waveformMax[itest] = waveformAbs[que.front()];
        }
    }

    if (removeLowPower) {
        while (true) {
            auto oldn = res.size();

            double avgPower = 0.0;
            for (const auto & kp : res) {
                avgPower += waveformAbs[kp.pos];
            }
            avgPower /= res.size();

            auto tmp = std::move(res);
            for (const auto & kp : tmp) {
                if (waveformAbs[kp.pos] > 0.3*avgPower) {
                    res.push_back(kp);
                }
            }

            if (res.size() == oldn) break;
        }
    }

    if (res.size() > 1) {
        TKeyPressCollectionT<T> res2;
        res2.push_back(res.front());

        for (int i = 1; i < (int) res.size(); ++i) {
            if (res[i].pos - res2.back().pos > historySizeReset || waveformMax[res[i].pos] > waveformMax[res2.back().pos]) {
                res2.push_back(res[i]);
            }
        }

        std::swap(res, res2);
    }

    return true;
}

template bool findKeyPresses<TSampleI16>(
        const TWaveformViewT<TSampleI16> & waveform,
        TKeyPressCollectionT<TSampleI16> & res,
        TWaveformT<TSampleI16> & waveformThreshold,
        TWaveformT<TSampleI16> & waveformMax,
        double thresholdBackground,
        int historySize,
        int historySizeReset,
        bool removeLowPower);

template<typename T>
bool saveKeyPresses(const std::string & fname, const TKeyPressCollectionT<T> & keyPresses) {
    std::ofstream fout(fname, std::ios::binary);
    int n = keyPresses.size();
    fout.write((char *)(&n), sizeof(n));
    for (int i = 0; i < n; ++i) {
        fout.write((char *)(&keyPresses[i].pos), sizeof(keyPresses[i].pos));
    }
    fout.close();

    return true;
}

template bool saveKeyPresses<TSampleI16>(const std::string & fname, const TKeyPressCollectionT<TSampleI16> & keyPresses);

template<typename T>
bool loadKeyPresses(const std::string & fname, const TWaveformViewT<T> & waveform, TKeyPressCollectionT<T> & keyPresses) {
    keyPresses.clear();

    std::ifstream fin(fname, std::ios::binary);
    int n = 0;
    fin.read((char *)(&n), sizeof(n));
    keyPresses.resize(n);
    for (int i = 0; i < n; ++i) {
        keyPresses[i].waveform = waveform;
        fin.read((char *)(&keyPresses[i].pos), sizeof(keyPresses[i].pos));
    }
    fin.close();

    return true;
}

template bool loadKeyPresses<TSampleI16>(const std::string & fname, const TWaveformViewT<TSampleI16> & waveform, TKeyPressCollectionT<TSampleI16> & keyPresses);

template<typename T>
bool dumpKeyPresses(const std::string & fname, const TKeyPressCollectionT<T> & data) {
    std::ofstream fout(fname);
    for (auto & k : data) {
        fout << k.pos << " 1" << std::endl;
    }
    fout.close();
    return true;
}

template bool dumpKeyPresses<TSampleI16>(const std::string & fname, const TKeyPressCollectionT<TSampleI16> & data);

template<typename TSample>
void cbPlayback(void * userData, uint8_t * stream, int len) {
    TPlaybackDataT<TSample> * data = (TPlaybackDataT<TSample> *)(userData);
    if (data->playing == false) {
        int offset = 0;
        TSample a = 0;
        while (len > 0) {
            memcpy(stream + offset*sizeof(a), &a, sizeof(a));
            len -= sizeof(a);
            ++offset;
        }
        return;
    }
    auto end = std::min(data->idx + TPlaybackDataT<TSample>::kSamples/data->slowDown, data->waveform.n);
    auto idx = data->idx;
    auto sidx = 0;
    for (; idx < end; ++idx) {
        TSample a = data->waveform.samples[idx];
        memcpy(stream + (sidx)*sizeof(a), &a, sizeof(a));
        len -= sizeof(a);
        ++sidx;

        if (data->slowDown == 2) {
            TSample a2 = data->waveform.samples[idx + 1];
            a = 0.5*a + 0.5*a2;
            memcpy(stream + (sidx)*sizeof(a), &a, sizeof(a));
            len -= sizeof(a);
            ++sidx;
        }
    }
    while (len > 0) {
        TSample a = 0;
        memcpy(stream + (idx - data->idx)*sizeof(a), &a, sizeof(a));
        len -= sizeof(a);
        ++idx;
    }
    data->idx = idx;
}

template void cbPlayback<TSampleI16>(void * userData, uint8_t * stream, int len);

template<typename T>
bool generateLowResWaveform(const TWaveformViewT<T> & waveform, TWaveformT<T> & waveformLowRes, int nWindow) {
    waveformLowRes.resize(waveform.n);

    int k = nWindow;
    std::deque<int64_t> que(k);

    //auto [samples, n] = waveform;
    auto samples = waveform.samples;
    auto n       = waveform.n;

    TWaveformT<T> waveformAbs(n);
    for (int64_t i = 0; i < n; ++i) {
        waveformAbs[i] = std::abs(samples[i]);
    }

    for (int64_t i = 0; i < n; ++i) {
        if (i < k) {
            while((!que.empty()) && waveformAbs[i] >= waveformAbs[que.back()]) {
                que.pop_back();
            }
            que.push_back(i);
        } else {
            while((!que.empty()) && que.front() <= i - k) {
                que.pop_front();
            }

            while((!que.empty()) && waveformAbs[i] >= waveformAbs[que.back()]) {
                que.pop_back();
            }

            que.push_back(i);

            int64_t itest = i - k/2;
            waveformLowRes[itest] = waveformAbs[que.front()];
        }
    }

    return true;
}

template bool generateLowResWaveform<TSampleI16>(const TWaveformViewT<TSampleI16> & waveform, TWaveformT<TSampleI16> & waveformLowRes, int nWindow);

template<typename T>
bool adjustKeyPresses(TKeyPressCollectionT<T> & keyPresses, TSimilarityMap & sim) {
    struct Pair {
        int i = -1;
        int j = -1;
        TValueCC cc = -1.0;

        bool operator < (const Pair & a) const { return cc > a.cc; }
    };

    bool res = false;

    int n = keyPresses.size();

    std::vector<Pair> ccpairs;
    for (int i = 0; i < n - 1; ++i) {
        for (int j = i + 1; j < n; ++j) {
            ccpairs.emplace_back(Pair{i, j, sim[i][j].cc});
        }
    }

    int nused = 0;
    std::vector<bool> used(n, false);

    std::sort(ccpairs.begin(), ccpairs.end());

    int npairs = ccpairs.size();
    for (int ip = 0; ip < npairs; ++ip) {
        auto & curpair = ccpairs[ip];
        int k0 = curpair.i;
        int k1 = curpair.j;
        if (used[k0] && used[k1]) continue;

        if (sim[k0][k1].offset != 0) res = true;

        if (used[k1] == false) {
            keyPresses[k1].pos += sim[k0][k1].offset;
        } else {
            keyPresses[k0].pos -= sim[k0][k1].offset;
        }

        sim[k0][k1].offset = 0;
        sim[k1][k0].offset = 0;

        if (used[k0] == false) { used[k0] = true; ++nused; }
        if (used[k1] == false) { used[k1] = true; ++nused; }

        if (nused == n) break;
    }

    return res;
}

template bool adjustKeyPresses<TSampleI16>(TKeyPressCollectionT<TSampleI16> & keyPresses, TSimilarityMap & sim);


template<typename T>
bool removeLowSimilarityKeys(TKeyPressCollectionT<T> & keyPresses, TSimilarityMap & sim, double threshold) {
    const int n = keyPresses.size();
    if (n != (int) sim.size()) {
        fprintf(stderr, "removeLowSimilarityKeys: n != sim.size()\n");
        return false;
    }

    std::vector<bool> used(n, false);

    for (int i = 0; i < n; ++i) {
        if (used[i]) continue;

        for (int j = 0 ; j < n; ++j) {
            if (i == j) continue;

            if (sim[i][j].cc > threshold) {
                used[i] = true;
                used[j] = true;
                break;
            }
        }
    }

    int nRemoved = 0;
    for (int i = 0; i < n; ++i) {
        if (used[i]) continue;

        //keyPresses.erase(keyPresses.begin() + i - nRemoved);
        ++nRemoved;
    }

    if (nRemoved == 0) {
        return true;
    }

    auto keyPresses0 = keyPresses;
    keyPresses.clear();

    for (int i = 0; i < n; ++i) {
        if (used[i]) {
            keyPresses.push_back(keyPresses0[i]);
        }
    }

    for (int i = 0; i < n; ++i) {
        auto cur = sim[i];
        sim[i].clear();
        for (int j = 0; j < n; ++j) {
            if (used[j]) {
                sim[i].push_back(cur[j]);
            }
        }
    }

    auto sim0 = sim;
    sim.clear();
    for (int i = 0; i < n; ++i) {
        if (used[i]) {
            sim.push_back(sim0[i]);
        }
    }

    return true;
}

template bool removeLowSimilarityKeys<TSampleI16>(TKeyPressCollectionT<TSampleI16> & keyPresses, TSimilarityMap & sim, double threshold);


================================================
FILE: common.h
================================================
/*! \file common.h
 *  \brief Common types and functions
 *  \author Georgi Gerganov
 */

#pragma once

#include <map>
#include <string>
#include <tuple>
#include <vector>
#include <chrono>

// types

struct stMatch;
template<typename T, int N> struct stSampleMulti;
template<typename T> struct stWaveformView;
template<typename T> struct stKeyPressData;
template<typename T> struct stKeyPressDataNew;
template<typename T> struct stKeyPressCollection;
template<typename T> struct stKeyPressCollectionNew;
template<typename T> struct stPlaybackData;

template<typename T> using TWaveformT              = std::vector<T>;
template<typename T> using TWaveformViewT          = stWaveformView<T>;
template<typename T> using TKeyPressDataT          = stKeyPressData<T>;
template<typename T> using TKeyPressCollectionT    = stKeyPressCollection<T>;
template<typename T> using TPlaybackDataT          = stPlaybackData<T>;

using TConfidence   = float;
using TValueCC      = double;
using TOffset       = int64_t;
using TClusterId    = int32_t;

using TSampleF      = float;
using TSampleI16    = int16_t;
using TSampleMI16   = stSampleMulti<TSampleI16, 4>;

using TKey              = int32_t;
using TKeyPressPosition = int64_t;
using TKeyConfidenceMap = std::map<TKey, TConfidence>;
using TTrainKeys        = std::vector<TKey>;

using TLetter               = int32_t;
using TMatch                = stMatch;
using TSimilarityMap        = std::vector<std::vector<TMatch>>;
using TClusters             = std::vector<TClusterId>;
using TClusterToLetterMap   = std::map<TClusterId, TLetter>;

// - i16 samples

using TWaveformI16              = TWaveformT<TSampleI16>;
using TWaveformViewI16          = TWaveformViewT<TSampleI16>;
using TKeyPressDataI16          = TKeyPressDataT<TSampleI16>;
using TKeyPressCollectionI16    = TKeyPressCollectionT<TSampleI16>;
using TPlaybackDataI16          = TPlaybackDataT<TSampleI16>;

using TWaveformMI16             = TWaveformT<TSampleMI16>;
using TWaveformViewMI16         = TWaveformViewT<TSampleMI16>;
using TKeyPressDataMI16         = TKeyPressDataT<TSampleMI16>;
using TKeyPressCollectionMI16   = TKeyPressCollectionT<TSampleMI16>;
using TPlaybackDataMI16         = TPlaybackDataT<TSampleMI16>;

// - float samples

using TWaveformF    = TWaveformT<TSampleF>;
using TKeyWaveformF = std::vector<TSampleF>;
using TKeyHistoryF  = std::vector<TKeyWaveformF>;

enum EAudioFilter {
    None = 0,
    FirstOrderHighPass,
    SecondOrderButterworthHighPass,
};

// structs
struct stMatch {
    TValueCC    cc      = 0.0;
    TOffset     offset  = 0;
};

template<typename T, int SIZE>
struct stSampleMulti : public std::array<T, SIZE> {
    static const int N = SIZE;
    using std::array<T, SIZE>::array;
};

template<typename T>
struct stWaveformView {
    const T * samples = nullptr;
    int64_t n         = 0;
};

template<typename T>
struct stKeyPressData {
    TWaveformViewT<T>   waveform;
    TKeyPressPosition   pos         = 0;
    TValueCC            ccAvg       = 0.0;
    TClusterId          cid         = -1;
    TKey                bind        = -1;
    TKey                predicted   = '?';
};

template<typename T>
struct stKeyPressCollection : public std::vector<TKeyPressDataT<T>> {
    int nClusters = 0;
};

template<typename T>
struct stPlaybackData {
    static const int kSamples = 1024;
    bool playing = false;
    int slowDown = 1;
    int64_t idx = 0;
    int64_t offset = 0;
    TWaveformViewT<T> waveform;
};

struct TFilterCoefficients {
    float a0 = 0.0f;
    float a1 = 0.0f;
    float a2 = 0.0f;
    float b1 = 0.0f;
    float b2 = 0.0f;
    float c0 = 0.0f;
    float d0 = 0.0f;

    float xnz1 = 0.0f;
    float xnz2 = 0.0f;
    float ynz1 = 0.0f;
    float ynz2 = 0.0f;
};

// helpers

float frand();
float frandGaussian(float mu, float sigma);

uint64_t t_ms();

template<typename T>
stWaveformView<T> getView(const TWaveformT<T> & waveform, int64_t idx) {
    return { waveform.data() + idx, (int64_t) waveform.size() - idx };
}

template<typename T>
stWaveformView<T> getView(const TWaveformT<T> & waveform, int64_t idx, int64_t len) {
    return { waveform.data() + idx, len };
}

std::map<std::string, std::string> parseCmdArguments(int argc, char ** argv);

template <typename T>
float toSeconds(T t0, T t1) {
    return std::chrono::duration_cast<std::chrono::milliseconds>(t1 - t0).count()/1000.0f;
}

template <typename TSampleSrc, typename TSampleDst>
bool convert(const TWaveformT<TSampleSrc> & src, TWaveformT<TSampleDst> & dst);

template <typename TSample>
double calcAbsMax(const TWaveformT<TSample> & waveform);

template <typename TSample>
void filter(TWaveformT<TSample> & waveform, EAudioFilter filterId, float freqCutoff_Hz, int64_t sampleRate);

template <typename TSample>
bool saveToFile(const std::string & fname, TWaveformT<TSample> & waveform);

template <typename TSampleInput, typename TSample>
bool readFromFile(const std::string & fname, TWaveformT<TSample> & res);

template <typename TSampleInput, typename TSample>
bool readFromFile(const std::string & fname, TWaveformT<TSample> & res, TTrainKeys & trainKeys, int32_t & bufferSize_frames);

//
// filters
//

TFilterCoefficients calculateCoefficientsFirstOrderHighPass(int fc, int fs);

TFilterCoefficients calculateCoefficientsSecondOrderButterworthHighPass(int fc, int fs);

TSampleF filterFirstOrderHighPass(TFilterCoefficients & coefficients, TSampleF sample);

TSampleF filterSecondOrderButterworthHighPass(TFilterCoefficients & coefficients, TSampleF sample);

//
// calcSum
//

std::tuple<double, double> calcSum(const TKeyWaveformF & waveform, int is0, int is1);

template<typename T>
std::tuple<int64_t, int64_t> calcSum(const TWaveformViewT<T> & waveform);

//
// calcCC
//

TValueCC calcCC(
    const TKeyWaveformF & waveform0,
    const TKeyWaveformF & waveform1,
    double sum0, double sum02,
    int is00, int is0, int is1);

template<typename T>
TValueCC calcCC(
    const TWaveformViewT<T> & waveform0,
    const TWaveformViewT<T> & waveform1,
    int64_t sum0, int64_t sum02);

//
// findBestCC
//

std::tuple<TValueCC, TOffset> findBestCC(
    const TKeyWaveformF & waveform0,
    const TKeyWaveformF & waveform1,
    int is0, int is1,
    int alignWindow);

template<typename T>
std::tuple<TValueCC, TOffset> findBestCC(
    const TWaveformViewT<T> & waveform0,
    const TWaveformViewT<T> & waveform1,
    int64_t alignWindow);

//
// calculateSimilarityMap
//

template<typename T>
bool calculateSimilartyMap(
        const int32_t keyPressWidth_samples,
        const int32_t alignWindow_samples,
        const int32_t offsetFromPeak_samples,
        TKeyPressCollectionT<T> & keyPresses,
        TSimilarityMap & res);

//
// findKeyPresses
//

template<typename T>
bool findKeyPresses(
        const TWaveformViewT<T> & waveform,
        TKeyPressCollectionT<T> & res,
        TWaveformT<T> & waveformThreshold,
        TWaveformT<T> & waveformMax,
        double thresholdBackground,
        int historySize,
        int historySizeReset,
        bool removeLowPower);

template<typename T>
bool saveKeyPresses(const std::string & fname, const TKeyPressCollectionT<T> & keyPresses);

template<typename T>
bool loadKeyPresses(const std::string & fname, const TWaveformViewT<T> & waveform, TKeyPressCollectionT<T> & keyPresses);

template<typename T>
bool dumpKeyPresses(const std::string & fname, const TKeyPressCollectionT<T> & data);

template<typename T>
void cbPlayback(void * userData, uint8_t * stream, int len);

template<typename T>
bool generateLowResWaveform(const TWaveformViewT<T> & waveform, TWaveformT<T> & waveformLowRes, int nWindow);

template<typename T>
bool generateLowResWaveform(const TWaveformT<T> & waveform, TWaveformT<T> & waveformLowRes, int nWindow) {
    return generateLowResWaveform(getView(waveform, 0), waveformLowRes, nWindow);
}

template<typename T>
bool adjustKeyPresses(TKeyPressCollectionT<T> & keyPresses, TSimilarityMap & sim);

template<typename T>
bool removeLowSimilarityKeys(TKeyPressCollectionT<T> & keyPresses, TSimilarityMap & sim, double threshold);


================================================
FILE: compress-n-grams.cpp
================================================
#include "subbreak3.h"

int main(int argc, char ** argv) {
    printf("Usage: %s n-gram.dat n-gram-compressed.dat\n", argv[0]);
    if (argc < 3) {
        return -1;
    }

    Cipher::TFreqMap freqMap;

    printf("[+] Reading n-grams from '%s'\n", argv[1]);
    if (Cipher::loadFreqMap(argv[1], freqMap) == false) {
        return -1;
    }

    printf("[+] Writing compressed n-grams to '%s'\n", argv[2]);
    Cipher::saveFreqMapBinary(argv[2], freqMap);

    return 0;
}


================================================
FILE: constants.h
================================================
/*! \file constants.h
 *  \brief Enter description here.
 *  \author Georgi Gerganov
 */

#pragma once

#include <map>
#include <array>
#include <vector>
#include <cstdint>

#ifdef __EMSCRIPTEN__
static constexpr int32_t kMaxThreads = 8;
static constexpr int64_t kSamplesPerFrame = 1024;
#else
static constexpr int64_t kSamplesPerFrame = 512;
#endif
static constexpr int32_t kTopResultsPerProcessor = 1;
static constexpr int32_t kMaxRecords = 16;
static constexpr int64_t kMaxSampleRate = 96000;
static constexpr float   kMaxBufferSize_s = 5.000f;
static constexpr float   kMaxRecordSize_s = 180.0f;

static constexpr int32_t ceil_const(float num) {
    return (static_cast<float>(static_cast<int32_t>(num)) == num)
        ? static_cast<int32_t>(num)
        : static_cast<int32_t>(num) + ((num > 0) ? 1 : 0);
}

// odd number of frames longer than bufferSize_s
static constexpr int32_t getBufferSize_frames(int64_t sampleRate, float bufferSize_s) {
    return 2*(ceil_const(float(bufferSize_s*sampleRate)/kSamplesPerFrame)/2) + 1;
}

static constexpr int64_t kSampleRate = 16000;
static constexpr int32_t kMaxRecordSize_frames = getBufferSize_frames(kSampleRate, kMaxRecordSize_s);

static constexpr float kBufferSizeTrain_s = 0.300;
static constexpr int32_t kBufferSizeTrain_frames = getBufferSize_frames(kSampleRate, kBufferSizeTrain_s);
static constexpr int64_t kSamplesPerWaveformTrain = kSamplesPerFrame*kBufferSizeTrain_frames;

static constexpr uint64_t kBkgrRingBufferSize = 4*1024;
static constexpr int64_t kBkgrStep_samples = 16;
static constexpr int64_t kKeyDuration_samples = 0.005f*kSampleRate;

static constexpr float kFreqCutoff_Hz = 100.0f;
static constexpr float kKeyWidth_samples = 512;
static constexpr float kKeyAlign_samples = 128;
static constexpr float kKeyOffset_samples = 128;

static constexpr float kFindKeysThreshold = 8.0f;
static constexpr int kFindKeysHistorySize = 512;
static constexpr int kFindKeysHistorySizeReset = 2048;
static constexpr bool kFindKeysRemoveLowPower = true;

static std::map<char, std::vector<char>> kNearbyKeys = {
    { 'a', { 'a', 'q', 'w', 's', 'z', 'x',                               } },
    { 'b', { 'b', 'f', 'g', 'h', 'v', 'n',                               } },
    { 'c', { 'c', 's', 'd', 'f', 'x', 'v',                               } },
    { 'd', { 'd', 'w', 'e', 'r', 's', 'f', 'x', 'c', 'v',                } },
    { 'e', { 'e', 'w', 'r', 's', 'd', 'f',                               } },
    //{ 'e', { 'e', '_'                                                    } },
    { 'f', { 'f', 'e', 'r', 't', 'd', 'g', 'c', 'v', 'b',                } },
    { 'g', { 'g', 'r', 't', 'y', 'f', 'h', 'v', 'b', 'n',                } },
    { 'h', { 'h', 't', 'y', 'u', 'g', 'j', 'b', 'n', 'm',                } },
    { 'i', { 'i', 'u', 'o', 'j', 'k', 'l',                               } },
    { 'j', { 'j', 'y', 'u', 'i', 'h', 'k', 'n', 'm',                     } },
    { 'k', { 'k', 'u', 'i', 'o', 'j', 'l', 'm',                          } },
    { 'l', { 'l', 'i', 'o', 'p', 'k', 'm',                               } },
    { 'm', { 'm', 'h', 'j', 'k', 'n',                                    } },
    { 'n', { 'n', 'g', 'h', 'j', 'b', 'm',                               } },
    { 'o', { 'o', 'i', 'p', 'k', 'l',                                    } },
    { 'p', { 'p', 'o', 'l',                                              } },
    { 'q', { 'q', 'w', 'a', 's',                                         } },
    { 'r', { 'r', 'e', 't', 'd', 'f', 'g',                               } },
    { 's', { 's', 'q', 'w', 'e', 'a', 'd', 'z', 'x', 'c',                } },
    { 't', { 't', 'r', 'y', 'f', 'g', 'h',                               } },
    { 'u', { 'u', 'y', 'i', 'h', 'j', 'k',                               } },
    { 'v', { 'v', 'd', 'f', 'g', 'c', 'b',                               } },
    { 'w', { 'w', 'q', 'e', 'a', 's', 'd',                               } },
    { 'x', { 'x', 'a', 's', 'd', 'z', 'c',                               } },
    { 'y', { 'y', 't', 'u', 'g', 'h', 'j',                               } },
    { 'z', { 'z', 'a', 's', 'x',                                         } },
    { '_', { '_', 'e',                                                   } },
};

static const std::array<int32_t, 256> kCharToInt = {
    /* { 0,   */   0 /* } */,
    /* { 1,   */   0 /* } */,
    /* { 2,   */   0 /* } */,
    /* { 3,   */   0 /* } */,
    /* { 4,   */   0 /* } */,
    /* { 5,   */   0 /* } */,
    /* { 6,   */   0 /* } */,
    /* { 7,   */   0 /* } */,
    /* { 8,   */   0 /* } */,
    /* { 9,   */   0 /* } */,
    /* { 10,  */   0 /* } */,
    /* { 11,  */   0 /* } */,
    /* { 12,  */   0 /* } */,
    /* { 13,  */   0 /* } */,
    /* { 14,  */   0 /* } */,
    /* { 15,  */   0 /* } */,
    /* { 16,  */   0 /* } */,
    /* { 17,  */   0 /* } */,
    /* { 18,  */   0 /* } */,
    /* { 19,  */   0 /* } */,
    /* { 20,  */   0 /* } */,
    /* { 21,  */   0 /* } */,
    /* { 22,  */   0 /* } */,
    /* { 23,  */   0 /* } */,
    /* { 24,  */   0 /* } */,
    /* { 25,  */   0 /* } */,
    /* { 26,  */   0 /* } */,
    /* { 27,  */   0 /* } */,
    /* { 28,  */   0 /* } */,
    /* { 29,  */   0 /* } */,
    /* { 30,  */   0 /* } */,
    /* { 31,  */   0 /* } */,
    /* { 32,  */   0 /* } */,
    /* { 33,  */   0 /* } */,
    /* { 34,  */   0 /* } */,
    /* { 35,  */   0 /* } */,
    /* { 36,  */   0 /* } */,
    /* { 37,  */   0 /* } */,
    /* { 38,  */   0 /* } */,
    /* { 39,  */   0 /* } */,
    /* { 40,  */   0 /* } */,
    /* { 41,  */   0 /* } */,
    /* { 42,  */   0 /* } */,
    /* { 43,  */   0 /* } */,
    /* { 44,  */   0 /* } */,
    /* { 45,  */   0 /* } */,
    /* { 46,  */   0 /* } */,
    /* { 47,  */   0 /* } */,
    /* { 48,  */   0 /* } */,
    /* { 49,  */   0 /* } */,
    /* { 50,  */   0 /* } */,
    /* { 51,  */   0 /* } */,
    /* { 52,  */   0 /* } */,
    /* { 53,  */   0 /* } */,
    /* { 54,  */   0 /* } */,
    /* { 55,  */   0 /* } */,
    /* { 56,  */   0 /* } */,
    /* { 57,  */   0 /* } */,
    /* { 58,  */   0 /* } */,
    /* { 59,  */   0 /* } */,
    /* { 60,  */   0 /* } */,
    /* { 61,  */   0 /* } */,
    /* { 62,  */   0 /* } */,
    /* { 63,  */   0 /* } */,
    /* { 64,  */   0 /* } */,
    /* { 65,  */   1 /* } */,
    /* { 66,  */   2 /* } */,
    /* { 67,  */   3 /* } */,
    /* { 68,  */   4 /* } */,
    /* { 69,  */   5 /* } */,
    /* { 70,  */   6 /* } */,
    /* { 71,  */   7 /* } */,
    /* { 72,  */   8 /* } */,
    /* { 73,  */   9 /* } */,
    /* { 74,  */  10 /* } */,
    /* { 75,  */  11 /* } */,
    /* { 76,  */  12 /* } */,
    /* { 77,  */  13 /* } */,
    /* { 78,  */  14 /* } */,
    /* { 79,  */  15 /* } */,
    /* { 80,  */  16 /* } */,
    /* { 81,  */  17 /* } */,
    /* { 82,  */  18 /* } */,
    /* { 83,  */  19 /* } */,
    /* { 84,  */  20 /* } */,
    /* { 85,  */  21 /* } */,
    /* { 86,  */  22 /* } */,
    /* { 87,  */  23 /* } */,
    /* { 88,  */  24 /* } */,
    /* { 89,  */  25 /* } */,
    /* { 90,  */  26 /* } */,
    /* { 91,  */   0 /* } */,
    /* { 92,  */   0 /* } */,
    /* { 93,  */   0 /* } */,
    /* { 94,  */   0 /* } */,
    /* { 95,  */   0 /* } */,
    /* { 96,  */   0 /* } */,
    /* { 97,  */   1 /* } */,
    /* { 98,  */   2 /* } */,
    /* { 99,  */   3 /* } */,
    /* { 100, */   4 /* } */,
    /* { 101, */   5 /* } */,
    /* { 102, */   6 /* } */,
    /* { 103, */   7 /* } */,
    /* { 104, */   8 /* } */,
    /* { 105, */   9 /* } */,
    /* { 106, */  10 /* } */,
    /* { 107, */  11 /* } */,
    /* { 108, */  12 /* } */,
    /* { 109, */  13 /* } */,
    /* { 110, */  14 /* } */,
    /* { 111, */  15 /* } */,
    /* { 112, */  16 /* } */,
    /* { 113, */  17 /* } */,
    /* { 114, */  18 /* } */,
    /* { 115, */  19 /* } */,
    /* { 116, */  20 /* } */,
    /* { 117, */  21 /* } */,
    /* { 118, */  22 /* } */,
    /* { 119, */  23 /* } */,
    /* { 120, */  24 /* } */,
    /* { 121, */  25 /* } */,
    /* { 122, */  26 /* } */,
    /* { 123, */   0 /* } */,
    /* { 124, */   0 /* } */,
    /* { 125, */   0 /* } */,
    /* { 126, */   0 /* } */,
    /* { 127, */   0 /* } */,
    /* { 128, */   0 /* } */,
    /* { 129, */   0 /* } */,
    /* { 130, */   0 /* } */,
    /* { 131, */   0 /* } */,
    /* { 132, */   0 /* } */,
    /* { 133, */   0 /* } */,
    /* { 134, */   0 /* } */,
    /* { 135, */   0 /* } */,
    /* { 136, */   0 /* } */,
    /* { 137, */   0 /* } */,
    /* { 138, */   0 /* } */,
    /* { 139, */   0 /* } */,
    /* { 140, */   0 /* } */,
    /* { 141, */   0 /* } */,
    /* { 142, */   0 /* } */,
    /* { 143, */   0 /* } */,
    /* { 144, */   0 /* } */,
    /* { 145, */   0 /* } */,
    /* { 146, */   0 /* } */,
    /* { 147, */   0 /* } */,
    /* { 148, */   0 /* } */,
    /* { 149, */   0 /* } */,
    /* { 150, */   0 /* } */,
    /* { 151, */   0 /* } */,
    /* { 152, */   0 /* } */,
    /* { 153, */   0 /* } */,
    /* { 154, */   0 /* } */,
    /* { 155, */   0 /* } */,
    /* { 156, */   0 /* } */,
    /* { 157, */   0 /* } */,
    /* { 158, */   0 /* } */,
    /* { 159, */   0 /* } */,
    /* { 160, */   0 /* } */,
    /* { 161, */   0 /* } */,
    /* { 162, */   0 /* } */,
    /* { 163, */   0 /* } */,
    /* { 164, */   0 /* } */,
    /* { 165, */   0 /* } */,
    /* { 166, */   0 /* } */,
    /* { 167, */   0 /* } */,
    /* { 168, */   0 /* } */,
    /* { 169, */   0 /* } */,
    /* { 170, */   0 /* } */,
    /* { 171, */   0 /* } */,
    /* { 172, */   0 /* } */,
    /* { 173, */   0 /* } */,
    /* { 174, */   0 /* } */,
    /* { 175, */   0 /* } */,
    /* { 176, */   0 /* } */,
    /* { 177, */   0 /* } */,
    /* { 178, */   0 /* } */,
    /* { 179, */   0 /* } */,
    /* { 180, */   0 /* } */,
    /* { 181, */   0 /* } */,
    /* { 182, */   0 /* } */,
    /* { 183, */   0 /* } */,
    /* { 184, */   0 /* } */,
    /* { 185, */   0 /* } */,
    /* { 186, */   0 /* } */,
    /* { 187, */   0 /* } */,
    /* { 188, */   0 /* } */,
    /* { 189, */   0 /* } */,
    /* { 190, */   0 /* } */,
    /* { 191, */   0 /* } */,
    /* { 192, */   0 /* } */,
    /* { 193, */   0 /* } */,
    /* { 194, */   0 /* } */,
    /* { 195, */   0 /* } */,
    /* { 196, */   0 /* } */,
    /* { 197, */   0 /* } */,
    /* { 198, */   0 /* } */,
    /* { 199, */   0 /* } */,
    /* { 200, */   0 /* } */,
    /* { 201, */   0 /* } */,
    /* { 202, */   0 /* } */,
    /* { 203, */   0 /* } */,
    /* { 204, */   0 /* } */,
    /* { 205, */   0 /* } */,
    /* { 206, */   0 /* } */,
    /* { 207, */   0 /* } */,
    /* { 208, */   0 /* } */,
    /* { 209, */   0 /* } */,
    /* { 210, */   0 /* } */,
    /* { 211, */   0 /* } */,
    /* { 212, */   0 /* } */,
    /* { 213, */   0 /* } */,
    /* { 214, */   0 /* } */,
    /* { 215, */   0 /* } */,
    /* { 216, */   0 /* } */,
    /* { 217, */   0 /* } */,
    /* { 218, */   0 /* } */,
    /* { 219, */   0 /* } */,
    /* { 220, */   0 /* } */,
    /* { 221, */   0 /* } */,
    /* { 222, */   0 /* } */,
    /* { 223, */   0 /* } */,
    /* { 224, */   0 /* } */,
    /* { 225, */   0 /* } */,
    /* { 226, */   0 /* } */,
    /* { 227, */   0 /* } */,
    /* { 228, */   0 /* } */,
    /* { 229, */   0 /* } */,
    /* { 230, */   0 /* } */,
    /* { 231, */   0 /* } */,
    /* { 232, */   0 /* } */,
    /* { 233, */   0 /* } */,
    /* { 234, */   0 /* } */,
    /* { 235, */   0 /* } */,
    /* { 236, */   0 /* } */,
    /* { 237, */   0 /* } */,
    /* { 238, */   0 /* } */,
    /* { 239, */   0 /* } */,
    /* { 240, */   0 /* } */,
    /* { 241, */   0 /* } */,
    /* { 242, */   0 /* } */,
    /* { 243, */   0 /* } */,
    /* { 244, */   0 /* } */,
    /* { 245, */   0 /* } */,
    /* { 246, */   0 /* } */,
    /* { 247, */   0 /* } */,
    /* { 248, */   0 /* } */,
    /* { 249, */   0 /* } */,
    /* { 250, */   0 /* } */,
    /* { 251, */   0 /* } */,
    /* { 252, */   0 /* } */,
    /* { 253, */   0 /* } */,
    /* { 254, */   0 /* } */,
    /* { 255, */   0 /* } */,
};

static const std::map<int, const char *> kKeyText = {
    { -1,  "?" },
    { 0,   "?" },
    { 1,   "?" },
    { 2,   "?" },
    { 3,   "?" },
    { 4,   "?" },
    { 5,   "?" },
    { 6,   "?" },
    { 7,   "?" },
    { 8,   "?" },
    { 9,   "?" },
    { 10,  "[enter]" },
    { 11,  "?" },
    { 12,  "?" },
    { 13,  "?" },
    { 14,  "?" },
    { 15,  "?" },
    { 16,  "?" },
    { 17,  "?" },
    { 18,  "?" },
    { 19,  "?" },
    { 20,  "?" },
    { 21,  "?" },
    { 22,  "?" },
    { 23,  "?" },
    { 24,  "?" },
    { 25,  "?" },
    { 26,  "?" },
    { 27,  "?" },
    { 28,  "?" },
    { 29,  "?" },
    { 30,  "?" },
    { 31,  "?" },
    { 32,  "[space]" },
    { 33,  "?" },
    { 34,  "?" },
    { 35,  "?" },
    { 36,  "?" },
    { 37,  "?" },
    { 38,  "?" },
    { 39,  "'" },
    { 40,  "?" },
    { 41,  "?" },
    { 42,  "?" },
    { 43,  "?" },
    { 44,  "," },
    { 45,  "-" },
    { 46,  "." },
    { 47,  "/" },
    { 48,  "0" },
    { 49,  "1" },
    { 50,  "2" },
    { 51,  "3" },
    { 52,  "4" },
    { 53,  "5" },
    { 54,  "6" },
    { 55,  "7" },
    { 56,  "8" },
    { 57,  "9" },
    { 58,  "?" },
    { 59,  ";" },
    { 60,  "?" },
    { 61,  "=" },
    { 62,  "?" },
    { 63,  "?" },
    { 64,  "?" },
    { 65,  "?" },
    { 66,  "?" },
    { 67,  "?" },
    { 68,  "?" },
    { 69,  "?" },
    { 70,  "?" },
    { 71,  "?" },
    { 72,  "?" },
    { 73,  "?" },
    { 74,  "?" },
    { 75,  "?" },
    { 76,  "?" },
    { 77,  "?" },
    { 78,  "?" },
    { 79,  "?" },
    { 80,  "?" },
    { 81,  "?" },
    { 82,  "?" },
    { 83,  "?" },
    { 84,  "?" },
    { 85,  "?" },
    { 86,  "?" },
    { 87,  "?" },
    { 88,  "?" },
    { 89,  "?" },
    { 90,  "?" },
    { 91,  "[" },
    { 92,  "\\" },
    { 93,  "]" },
    { 94,  "?" },
    { 95,  "?" },
    { 96,  "`" },
    { 97,  "a" },
    { 98,  "b" },
    { 99,  "c" },
    { 100, "d" },
    { 101, "e" },
    { 102, "f" },
    { 103, "g" },
    { 104, "h" },
    { 105, "i" },
    { 106, "j" },
    { 107, "k" },
    { 108, "l" },
    { 109, "m" },
    { 110, "n" },
    { 111, "o" },
    { 112, "p" },
    { 113, "q" },
    { 114, "r" },
    { 115, "s" },
    { 116, "t" },
    { 117, "u" },
    { 118, "v" },
    { 119, "w" },
    { 120, "x" },
    { 121, "y" },
    { 122, "z" },
    { 123, "?" },
    { 124, "?" },
    { 125, "?" },
    { 126, "?" },
    { 127, "[<-]" },
    { 128, "?" },
    { 129, "?" },
    { 130, "?" },
    { 131, "?" },
    { 132, "?" },
    { 133, "?" },
    { 134, "?" },
    { 135, "?" },
    { 136, "?" },
    { 137, "?" },
    { 138, "?" },
    { 139, "?" },
    { 140, "?" },
    { 141, "?" },
    { 142, "?" },
    { 143, "?" },
    { 144, "?" },
    { 145, "?" },
    { 146, "?" },
    { 147, "?" },
    { 148, "?" },
    { 149, "?" },
    { 150, "?" },
    { 151, "?" },
    { 152, "?" },
    { 153, "?" },
    { 154, "?" },
    { 155, "?" },
    { 156, "?" },
    { 157, "?" },
    { 158, "?" },
    { 159, "?" },
    { 160, "?" },
    { 161, "?" },
    { 162, "?" },
    { 163, "?" },
    { 164, "?" },
    { 165, "?" },
    { 166, "?" },
    { 167, "?" },
    { 168, "?" },
    { 169, "?" },
    { 170, "?" },
    { 171, "?" },
    { 172, "?" },
    { 173, "?" },
    { 174, "?" },
    { 175, "?" },
    { 176, "?" },
    { 177, "?" },
    { 178, "?" },
    { 179, "?" },
    { 180, "?" },
    { 181, "?" },
    { 182, "?" },
    { 183, "?" },
    { 184, "?" },
    { 185, "?" },
    { 186, "?" },
    { 187, "?" },
    { 188, "?" },
    { 189, "?" },
    { 190, "?" },
    { 191, "?" },
    { 192, "?" },
    { 193, "?" },
    { 194, "?" },
    { 195, "?" },
    { 196, "?" },
    { 197, "?" },
    { 198, "?" },
    { 199, "?" },
    { 200, "?" },
    { 201, "?" },
    { 202, "?" },
    { 203, "?" },
    { 204, "?" },
    { 205, "?" },
    { 206, "?" },
    { 207, "?" },
    { 208, "?" },
    { 209, "?" },
    { 210, "?" },
    { 211, "?" },
    { 212, "?" },
    { 213, "?" },
    { 214, "?" },
    { 215, "?" },
    { 216, "?" },
    { 217, "?" },
    { 218, "?" },
    { 219, "?" },
    { 220, "?" },
    { 221, "?" },
    { 222, "?" },
    { 223, "?" },
    { 224, "?" },
    { 225, "?" },
    { 226, "?" },
    { 227, "?" },
    { 228, "?" },
    { 229, "?" },
    { 230, "?" },
    { 231, "?" },
    { 232, "?" },
    { 233, "?" },
    { 234, "?" },
    { 235, "?" },
    { 236, "?" },
    { 237, "?" },
    { 238, "?" },
    { 239, "?" },
    { 240, "?" },
    { 241, "?" },
    { 242, "?" },
    { 243, "?" },
    { 244, "?" },
    { 245, "?" },
    { 246, "?" },
    { 247, "?" },
    { 248, "?" },
    { 249, "?" },
    { 250, "?" },
    { 251, "?" },
    { 252, "?" },
    { 253, "?" },
    { 254, "?" },
    { 255, "?" },
};


================================================
FILE: data/english_quadgrams.txt
================================================
TION 13168375
NTHE 11234972
THER 10218035
THAT 8980536
OFTH 8132597
FTHE 8100836
THES 7717675
WITH 7627991
INTH 7261789
ATIO 7104943
OTHE 6900574
TTHE 6553056
DTHE 6470280
INGT 6461147
ETHE 6135216
SAND 5996705
STHE 5748611
HERE 5630500
THEC 5466071
MENT 4968019
THEM 4911484
RTHE 4862875
THEP 4458634
FROM 4361347
THIS 4344608
TING 4291641
THEI 4217321
NGTH 4162753
IONS 4045101
ANDT 4020364
ONTH 3976144
TOTH 3911094
EDTO 3886447
THEF 3873133
THEY 3809433
HAVE 3735139
EDTH 3699013
INGA 3675933
NDTH 3619148
THET 3597105
OULD 3545483
ORTH 3527649
EVER 3497988
THEN 3493040
IGHT 3484797
EAND 3469701
ATTH 3465933
THEB 3427984
OVER 3423259
DING 3292159
IONA 3238994
GTHE 3206535
FORT 3183884
THEA 3166891
RING 3085444
ALLY 3058124
ANDS 2964994
EFOR 2911043
INGS 2907686
EDIN 2898263
ANDA 2846852
THIN 2846753
OUGH 2836766
WERE 2833510
ERTH 2823153
YEAR 2760359
WILL 2730404
THEL 2685880
SAID 2672546
HEIR 2630839
NTER 2617394
ENTS 2616976
ECON 2602363
NING 2595587
COMP 2558839
TAND 2556578
SION 2544046
TIME 2541680
OUND 2540743
FORM 2531586
NAND 2512199
LAND 2500203
THEW 2495941
KING 2486033
PORT 2481535
YTHE 2479794
HTHE 2474333
HECO 2463161
ATED 2450352
ANDI 2435091
THED 2432283
INTE 2421896
HING 2415926
NGTO 2346029
SOME 2318831
THEE 2296331
ALSO 2272179
ENTI 2266151
ONAL 2251550
CTIO 2238788
MORE 2226699
ANCE 2222056
EWAS 2221574
STAT 2193875
SIDE 2178067
PART 2177409
THAN 2172227
STHA 2147392
EOFT 2146633
HESE 2140673
SARE 2136673
THEO 2122303
RAND 2121925
CENT 2100779
EDBY 2089468
THEG 2079308
PLAY 2076384
ENCE 2070719
HICH 2066009
SING 2058168
WHIC 2056153
CONT 2051639
EVEN 2044936
AFTE 2010597
FTER 2003476
WHEN 1998236
MBER 1995047
ESTO 1978644
INGI 1961244
ICAL 1957590
NDER 1950266
TIVE 1949528
PRES 1942885
COMM 1940274
INGO 1932406
ABOU 1931491
IONO 1920745
STAN 1918197
HEWA 1911604
ASTH 1910727
SFOR 1907495
IRST 1904773
INTO 1902177
ECOM 1898652
BOUT 1883527
ESTA 1871911
DENT 1867605
WORK 1861950
HATT 1855838
ABLE 1853875
OUNT 1851478
TOBE 1850003
REAT 1842708
INST 1834447
HEST 1826166
NDIN 1824758
DAND 1823795
ETHA 1820247
TERS 1819470
FIRS 1819270
WOUL 1816261
BEEN 1805388
THTH 1803360
ITHT 1802652
ESTH 1794688
HESA 1789360
SINT 1784676
ESAN 1784502
TURE 1774845
VERS 1761482
VERY 1752004
ONOF 1741624
TWAS 1737095
RETH 1732151
YAND 1728503
STER 1721754
COUN 1720141
THEH 1713125
LING 1706713
SOFT 1704206
FORE 1703219
ENTA 1699782
STOR 1697886
CONS 1692766
TATE 1684321
ITIO 1682234
ATHE 1679355
ITHA 1678384
ENTH 1674269
EARS 1674228
TEDT 1672432
ATES 1671091
HEFI 1669464
ERAL 1663096
ATER 1658140
ERIN 1647306
NATI 1646197
ERES 1646142
LIKE 1645573
RATI 1639591
EINT 1637991
NGIN 1629144
UTTH 1626574
ANDW 1617469
ROMT 1612822
REST 1611309
ESTI 1602216
UGHT 1598911
ERED 1592912
ANDC 1591317
ANDH 1584076
THOU 1575289
MTHE 1570742
ASON 1557925
ECTI 1554504
EMEN 1547678
ERAN 1542995
CALL 1542368
ERSA 1540494
WHAT 1537708
DINT 1534038
NTIN 1533224
WASA 1521114
LATE 1517775
EREA 1502648
ALLE 1498817
DFOR 1498486
CIAL 1496185
TOFT 1493341
UNDE 1492863
ERSI 1490158
ANDE 1489807
ENTO 1480948
ILLI 1474587
ERAT 1472424
ERSO 1462656
NFOR 1460850
RENT 1450481
ESIN 1448933
SERV 1448589
RATE 1446541
STRA 1442405
BECA 1441510
CHAN 1439212
MOST 1438813
ANDO 1434745
ANGE 1433384
JUST 1428351
ITIS 1428100
GAME 1413581
EARE 1406547
ICAN 1405493
BACK 1405245
RECO 1403742
OMTH 1397332
HEMA 1391989
VING 1386608
IDEN 1383820
IVER 1382092
HEPR 1379329
VENT 1378744
RESS 1376015
REAL 1373867
AREA 1371458
OINT 1369665
DTHA 1365459
STAR 1363805
HAND 1354970
EACH 1350272
ENTE 1343108
RIES 1335429
OPLE 1323708
EROF 1318205
COME 1317743
ANDP 1315447
AINS 1313653
EDAN 1309134
INES 1308946
EPRO 1307814
ISTH 1306902
EDON 1306416
THEU 1306228
FORA 1303370
ONLY 1303135
GAIN 1297562
ARTI 1296805
HERS 1296238
RESE 1296098
SWIT 1294553
INGF 1294255
SPEC 1293633
ANDM 1293038
EOPL 1292222
TTER 1290823
PEOP 1290562
THRE 1290472
DWIT 1289963
KNOW 1288808
ERST 1288580
INAL 1288381
EMBE 1283314
INAN 1282357
SINC 1279484
ACTI 1277906
STIN 1272931
LONG 1264155
AUSE 1263485
CAUS 1253323
VERA 1252583
ESOF 1250232
EREN 1249439
FFIC 1246165
INGH 1245879
LINE 1244889
VERT 1244237
THRO 1239338
ROUG 1236673
YING 1235516
EASO 1234486
ANDR 1231102
IONT 1226708
LLOW 1218687
URIN 1218178
ONAN 1217217
SWER 1216771
HIST 1212167
ROUN 1208483
CESS 1208310
BYTH 1205765
TAIN 1203509
ETHI 1202933
SCHO 1202417
LECT 1202081
ATIN 1200538
LAST 1199613
ONST 1199002
SNOT 1195698
YOUR 1194475
REAS 1192018
RICA 1185515
NGAN 1180633
CHAR 1178631
ESSI 1175244
HIGH 1170524
TORE 1169727
COND 1169174
MANY 1162938
IONI 1162499
TERT 1159942
ONTO 1157438
TFOR 1156596
TEAM 1156191
HEMO 1153252
CTOR 1153219
HATS 1152311
TAKE 1151598
EPAR 1146846
DERS 1145928
LATI 1145577
NAME 1145492
ORMA 1145460
ANDF 1143755
SEAS 1141342
CHOO 1140139
UNIT 1137054
HENE 1136900
OUTH 1136709
LLIN 1133017
TERA 1132451
FFER 1132285
HATI 1130043
EPLA 1129006
NOTH 1128390
WELL 1124457
ALLO 1123307
TIES 1117015
DONT 1114470
TERN 1113295
PROV 1111766
INGW 1111745
RACT 1111263
SEVE 1107565
ONSI 1107532
USIN 1103635
NESS 1101247
WHER 1093648
CHIN 1086159
LLED 1086147
ITWA 1085399
MAKE 1084610
INGC 1083696
ENDE 1082242
SSIO 1081298
AGAI 1080316
RESI 1080184
POIN 1078898
POLI 1077325
SIGN 1077199
EDWI 1073054
OWER 1072176
NTOF 1069820
OUTT 1066713
CTED 1065574
DOWN 1064961
MAND 1061275
EFIR 1060749
SHOW 1059043
EWIT 1057301
TATI 1055867
EPRE 1055185
STRI 1050277
ARGE 1049660
HOOL 1048757
OFFI 1046599
CREA 1046376
RFOR 1045762
ISTO 1043207
MPLE 1042473
HECA 1042403
ECAU 1041538
ANDB 1040570
TEST 1038285
ATTE 1037532
HELA 1037227
FERE 1036911
ATUR 1035140
LAYE 1035020
HERA 1034185
TURN 1030325
NTHA 1029560
SENT 1029164
RTHA 1028595
METH 1023960
LTHE 1023518
APPE 1023319
COUL 1022978
SECO 1022624
WAST 1021947
USED 1020459
EASE 1018866
EWOR 1017076
ILIT 1016662
ORET 1014721
NCLU 1014356
OUSE 1013530
ALTH 1013296
INED 1012296
UBLI 1010170
EAST 1010081
IOUS 1008946
OMPA 1008219
OPER 1006891
ERTO 1005645
ONTR 1005452
ANDD 1003476
HATH 1001520
HOWE 1000854
INCL 999134
OMET 998665
EING 997998
EVEL 994339
HEHA 993952
STRE 992953
PERS 991550
HETH 991522
BEIN 990614
SHIP 988418
TORY 986800
HOUG 986072
INCE 985675
NTOT 985616
HEWO 985283
TEDA 985062
HOSE 984347
AMER 983492
ESTE 983134
MAIN 982912
EDFO 982639
ISTE 978544
HEAR 977695
ECOU 977384
PUBL 977275
TINT 976998
INGP 976226
RMAN 975603
ESTR 975031
INGL 971985
CLUD 971923
LACE 970783
HEDE 965888
EARL 964297
INDI 962230
CATI 958962
NDED 958694
ERIC 958584
TTLE 955989
HOUS 954540
CAME 954135
LEAS 952946
ONIN 952752
ENER 950939
ONEO 948987
RSON 948659
READ 947103
HEIN 946407
GAND 944505
HROU 943587
WARD 941311
ESSE 940493
TERI 938496
LITY 937945
EATE 937864
HREE 937263
WING 935975
PLAC 934972
TART 934952
ESID 933920
EXPE 933792
FORC 932108
GROU 932038
HEAD 931609
CORD 931083
OWIN 930092
STOF 930023
HERI 929568
BEFO 929506
ISTI 926564
PLAN 925437
HILE 924953
HATW 924847
DURI 924442
SOUT 923939
TTHA 923833
ISHE 922312
WHIL 921043
DITI 920330
ESEN 919874
AMES 919873
ANDL 918600
RECE 918150
HOME 916835
EDAS 916610
LESS 915764
HISS 912143
NINT 911927
SFRO 911881
ODUC 910520
RODU 910277
MEAN 908002
CITY 906015
ENTT 905488
ERVI 904845
OING 903926
ARTE 903798
NEOF 902480
FINA 901889
ISTR 900560
ISCO 898284
ARCH 898233
ININ 896839
EALL 894740
ESAI 894501
HEBA 894451
WORL 893791
MING 891799
ASSE 890585
NMEN 890406
NTED 888714
NDRE 888517
WEVE 887299
INGE 887174
FOUR 886653
INGB 886547
ANIN 885369
ONSA 883984
HERO 883718
SHED 883116
ERFO 881627
TERE 878104
RIGH 877847
ILLE 874214
HEPA 871438
NERA 869691
SIST 869376
LEAD 869140
STRU 868622
HEDI 868517
ARDS 868032
ASED 867037
IVES 866924
ITED 866837
MARK 866238
ARLY 865234
ASSI 863503
MERI 863422
AREN 861675
ORLD 861177
BUTT 861155
INIS 857935
OURS 857791
ONCE 857035
MEDI 854628
ATIV 853230
TSAN 851747
ENIN 851357
NEED 851094
ARES 850611
ASIN 850136
ATCH 850058
MADE 847016
VERN 846808
ICAT 845339
STUD 843876
DEVE 843522
LLBE 843417
PECT 843412
REDI 842726
NALL 842196
EDIT 840952
HEAL 839490
BALL 837896
NNIN 837493
ULDB 837288
NGER 836784
HANG 836602
GREE 836348
NCES 835273
LLTH 834676
RDIN 834494
EART 834430
CTIV 834085
GOVE 832621
ERMA 832280
ELEC 832154
AMIL 829534
ESEA 829048
RIVE 827118
SCON 826453
LDBE 825826
INAT 823798
NTTO 823180
TILL 822687
ITHI 821434
ENTL 820661
ENTR 820028
GOOD 818735
AINT 817185
SETH 816841
TORS 816437
TWEE 814938
EMAN 813859
IONW 813535
OMIN 813476
TICA 812574
INGM 812460
ALLT 811759
DHIS 811139
TEDI 810869
VISI 810762
LION 810350
ETIM 810243
ERET 809649
SHOU 809516
ELEA 808794
TENT 808513
SHAV 807822
ORDE 806848
ERSE 806730
NDAN 805285
VETH 804375
NTRA 803278
ASTE 802441
HEIS 801178
RIEN 798453
AVET 798089
TERM 798088
ARRI 797482
ESPE 796481
GENE 794619
THEV 794492
OGRA 794344
TRAN 793747
COLL 792896
RSAN 791930
ELAT 791658
EREI 791414
ILLB 791012
MISS 790619
WANT 789032
VEST 788289
HEPO 787853
VIDE 787070
MONT 785313
HERT 780922
DTOT 780815
OWEV 780683
SITI 780488
HEBE 779293
RITI 779061
PERI 778764
OLLE 778560
SUPP 778517
COUR 775717
VICE 775699
HENA 774827
ECTE 773724
NTLY 773145
ENSE 772933
HEMI 770993
MPAN 770702
STIL 770686
ERIE 769815
SEOF 768175
LEAR 767830
SONT 767667
WEEK 766068
AKIN 765701
ECHA 764682
LISH 764499
BLIC 764417
ECOR 763055
ASBE 762447
TYOF 760948
NIST 760688
ISTA 760180
ONSO 759125
LOCA 758979
ITIE 758752
ETER 758521
NOFT 758122
AYIN 757940
UALL 757870
LIVE 757583
LOOK 757441
ITAL 756095
PROD 756038
ORME 754828
TANT 754818
THOS 754252
DIST 752794
IMES 751601
NDOF 751115
LYTH 750761
REDT 749433
ISIN 749328
SONA 748704
TOCO 748071
TORI 746197
REIN 746032
MEMB 745866
PECI 745611
REMA 745382
ARTO 744074
TSIN 743014
ISSI 742525
SEDT 741284
BOTH 740387
NSTA 740242
ERNA 739769
HINK 739742
SURE 738814
ERSH 738421
LETO 738365
TABL 738206
TOMA 737967
EHAS 737805
DIFF 737505
AYER 735828
TRAC 735394
ULAR 735297
BUIL 735108
STTH 735057
ANTS 733854
HATA 732912
RAIN 732821
NEDT 732566
LITI 732516
MATE 732508
LLIO 731449
YFOR 731341
HECH 731329
TALL 729176
EDAT 728973
ESSA 728671
TRIC 728513
SAME 728014
PERA 727806
GHTH 727642
ORDI 725616
BUTI 725177
TREA 724789
NHIS 724574
MUCH 724183
LIST 723535
ICES 723102
REVE 722117
MANA 721865
RANC 721603
OURT 720508
ONES 720283
EMOR 719542
MOVE 719363
TRAT 718681
SUCH 718280
ERCE 717595
TRAI 716028
BASE 714858
HEFO 714820
ARED 714432
NEVE 714087
TWIT 713369
ATOR 711887
GOIN 711292
TSOF 710558
SELF 710103
HENT 709802
RECT 708410
GREA 708363
NCET 707916
RENC 707316
CARE 706877
THAS 706509
STRO 705635
CHAS 704941
AAND 704810
OMAN 704728
VELO 704001
STED 703407
TSTH 702849
OUTO 702834
ENSI 702704
RSTO 702359
ERVE 701979
RINT 701951
NDCO 701759
EFRO 701096
ASAN 700718
ALLI 699950
TTIN 699899
INCO 699198
ESHO 699063
FAMI 698400
TSTO 698247
ANOT 698205
OFFE 698190
EMAI 697613
LASS 697204
EENT 697048
ETTE 696464
HISC 696400
WEST 696374
ALIT 696027
DBYT 695948
HOUL 695509
ACCO 695208
NGOF 694856
OMPL 694572
RTER 692713
HISP 692441
TOGE 692377
NEAR 691815
SIVE 691197
TEND 690309
INGD 689798
RTED 689287
YSTE 688393
GIVE 688253
HETO 688136
ALON 687872
GEST 687831
ISIO 687715
EATH 687274
OWTH 687169
CETH 687142
RANS 686028
NTRO 685530
TEDB 685496
EDHI 685448
CEOF 685271
DINA 684943
AINE 684513
SCOM 684219
ISNO 683973
EFIN 683749
HELP 683380
ETOT 682693
RDER 682581
AVEA 682487
ORTA 682305
RESP 682065
ILLA 681450
SOCI 680245
INDE 679690
INGR 678824
RTOF 678406
FOUN 678236
ITHO 677669
ENTU 677586
HASB 677399
SSIN 676913
NDIT 676584
SHES 675771
ROMA 675502
DNOT 675469
OGET 675232
HISF 675038
IELD 674589
NDSO 674425
DOES 674349
RIST 673820
EUNI 673148
CHIL 673123
ROVE 672544
IESA 672491
NTTH 671847
RSIN 671269
ONSE 671204
SPRO 670834
EREC 670354
SBEE 669930
MILL 668898
LYIN 668062
PPOR 668025
NTSA 667533
STON 666435
HEME 665834
ERRE 665678
JECT 665674
NWAS 665603
OMES 665537
ROFT 665504
ORES 665184
USTR 664907
SALS 664813
URES 664335
ARIN 664047
OLIC 663033
TMEN 662993
ECAM 662562
ROVI 662359
MINI 662322
ETWE 662278
RELA 662015
HESO 661759
NGFO 661337
EIGH 661249
NSTR 660898
HEUN 660673
SONS 659537
CATE 659234
ESER 657537
DUCT 657034
HEEN 656630
EYOU 656545
ASTO 656479
NORT 656235
LDIN 655806
ALAN 655785
LIFE 655334
SSES 655053
HELE 654479
ERSW 654431
HISW 654125
BLET 654021
ALLA 653208
STIC 652763
RALL 652414
MUNI 652270
NTHI 652141
MATI 651722
ONTI 650736
STOP 650514
ITYO 650393
OPEN 650155
ARKE 648697
PERC 648243
EATT 647683
ISON 647451
ITIC 646549
NSAN 646104
CHES 645447
DEDT 645362
ALIN 644376
MALL 644138
ASTA 644037
ORCE 643310
UEST 642113
LOWE 641632
WEEN 640619
TRUC 640382
ANTH 640196
HASA 639774
IDER 639593
AKES 639553
ITTE 639330
ACHE 638921
IVED 638877
STEM 638623
DEFE 638159
DERA 637452
VEBE 637396
ULAT 637394
REPO 637338
ENAT 636759
ESAR 635982
IFIC 635759
DAYS 635317
POSI 634278
IREC 633394
UMBE 632936
RNIN 632864
UNTI 631961
NDON 631437
CONC 631326
STOT 631222
EPOR 631002
ORAN 630606
BECO 630597
ESSO 630148
ERNM 629840
ARET 629777
TUAL 629662
RNED 629486
OMEO 629033
ENEW 628934
ANTI 628801
NDST 627935
LARG 627836
ESAM 627649
OSIT 627046
OLLO 626894
UCHA 626348
EALS 626307
BERS 626197
PROG 626017
ARTH 625984
OREA 625586
ANDN 625272
PING 625193
RELE 625131
PROB 624899
ALLS 624816
ALRE 624686
TTHI 624455
CONF 624044
RSOF 624021
INIT 623717
ROGR 623505
ERCO 623389
BETW 623197
OFHI 623129
ANDG 622983
ROAD 621871
EHAD 621626
NTAN 620660
RSTA 620558
HISI 620556
TONE 620524
CHED 619847
SONE 619810
FACT 619149
HEFA 618465
GFOR 617512
PASS 616913
NGWI 616865
NATE 616254
WASS 615133
ATEA 614770
MINA 613582
EWHO 612266
HILD 612146
SINE 611815
ELIN 610829
HETE 610582
DFRO 610220
COVE 609431
ROPE 609361
SHIN 609328
AROU 608136
URRE 607758
ELLI 607612
IBLE 607595
TIST 607242
ESEC 606818
RESU 606718
NGON 606646
SEAR 606266
NWIT 606036
DISC 604649
EBEE 604459
ROUP 603458
EALT 603434
PROP 603355
ISSU 602442
ETUR 602388
ECEN 601985
SWHO 601020
LIGH 600834
POWE 600424
ESPO 600419
RNME 600358
UPPO 599898
NTEN 599546
UCTI 599295
LOSE 598757
AVEB 598365
TIAL 596712
HESU 596262
EQUI 596037
REAR 595955
AVER 595740
CANT 595734
LEAN 594971
UTIO 594951
HETR 594740
TOWN 594473
DIDN 593387
SERI 593049
NEXT 592494
PPEA 592321
ORAT 592082
ITIN 591988
ACHI 591971
HELO 591813
ONIS 591787
ISTS 591520
INFO 591389
NDAR 591119
PEAR 590608
FICE 590105
STEA 590051
HEGR 589612
BILI 588945
ANAN 588788
EYEA 588737
PLET 588464
RTIC 588292
ENOT 588007
LEDT 587934
YINT 587681
TETH 587491
GING 587248
IENC 587052
ETRA 586801
LETH 586799
RAGE 586568
ICIA 586179
ALCO 586084
KETH 585491
GRAM 585066
ORTS 584799
EDIS 584693
OCAL 584293
FIEL 584146
RVIC 583992
ATHA 583331
DIRE 583326
OTHI 583095
BEST 582850
NAGE 582488
PARE 581953
UNTR 581171
PEND 580659
MMUN 580335
DONE 579803
OFCO 579718
UNDA 579570
HOUT 579538
OSTA 579513
ELOP 578952
ESST 578803
ORIT 578716
SSED 577989
ORTE 576910
FECT 576759
OLOG 576343
TELY 575294
HESI 574677
ANTA 574381
LICA 574292
NUMB 574257
OACH 573934
ECTO 573930
AINI 573839
NSIN 573485
HALL 573402
SHAR 573401
OSTO 573328
ORED 573032
UTOF 572999
ECAN 572035
CAND 571919
OMMU 571858
IFFE 571656
BAND 571424
ESON 571412
SYST 571183
NGRE 570944
EREW 570711
SHER 570625
ANYO 570528
VETO 570047
PERF 569951
CLOS 569890
NSID 569775
REDA 569674
ALIS 569344
HARD 569303
GHTS 568865
EENA 568706
ORIN 568697
VIEW 568655
ATEL 568240
FICI 567700
REQU 567670
PRIN 567537
NTST 567342
ENAN 567105
FOLL 567082
IEVE 566924
REAC 566680
TTEN 566545
RADI 566500
NALS 566462
REAN 565691
HEBO 565620
WAYS 565425
NCEA 564788
DSTA 564211
HEHO 564144
NSOF 563939
IENT 563922
ITHE 563905
SCOR 563904
ROWN 563784
ETWO 563585
CCES 563519
RITY 563421
EADE 563256
TUDE 563022
NIVE 563016
IFTH 562843
REME 562827
IEST 562487
EMON 561904
NGST 561479
FORS 561212
ESHA 560524
YOFT 560370
NCOM 560027
OMEN 559905
EOFF 559675
ANAG 559387
ENDI 559243
NERS 559193
YTHI 559128
REPR 559125
ESIG 558994
HEYA 558933
EMIN 558676
TEMP 558667
HESH 558175
VERE 557923
WASN 557705
NDHE 557190
HELI 556179
HEDA 555765
CEAN 555629
ONSH 555546
RCEN 555338
SWAS 555050
TOSE 554963
NIGH 554392
DUCE 553705
EWER 553067
TCHE 552869
RSIT 552795
RTIN 552337
TERR 551842
NDIS 551715
EWIL 551437
LDRE 551140
DOFT 550746
ESHE 550355
ELIE 550056
RENO 549584
ETIN 549509
TOTA 549154
ADIN 549064
SPLA 548707
RESO 548605
FHIS 547901
ERHA 547666
ELLA 546545
NCER 546117
NITY 545918
ATIS 545537
TEVE 544490
ASAL 544331
IDTH 544076
NSTO 543965
RSTH 543636
NOWN 543028
FORD 542828
SWHI 542306
ISIS 541764
ECIA 541640
ISLA 541487
DERT 541302
ERIO 541138
HEYW 540174
NGLE 540045
GWIT 540000
IRED 539950
CURR 539137
ERTA 538776
EDST 538088
TAGE 537994
GETH 537681
IONF 537442
ERIS 537240
LOVE 537217
ILLS 536888
NDMA 536761
ENDO 536269
AYTH 536097
NDTO 536014
HISA 535943
CEPT 535713
ASSO 535629
LEVE 535272
LLEG 535019
RREN 534819
AGES 534450
EMAR 533305
YARE 533257
REIS 532761
CLEA 532657
ASHI 532488
IVIN 532298
NGHI 532287
REET 532212
DTOB 532193
STIM 532120
DWAS 531932
EPER 531835
FORH 531791
FREE 531469
NTRY 531110
NCON 530864
BERO 530355
FIND 530305
AMET 529910
AIDT 529826
OFIN 529661
SWIL 529353
RCHA 528811
EONE 528428
TEDS 528390
AVIN 527360
EQUE 527196
EDFR 526567
LUDE 526495
SITY 526321
CANA 525249
NITE 524689
FALL 524680
REEN 524503
GETT 524210
RMIN 524099
RYIN 524040
CLAS 524035
EBUT 523892
HEGA 523693
TRAD 523663
ONTA 523656
LEFT 523517
NDHA 523320
EDUC 523189
QUES 522944
SPAR 522859
NEWS 521403
OURC 521399
ANTT 521104
INGU 520925
ONTE 520524
OUTS 520420
MEOF 520300
ADER 519703
HENO 519640
HETI 519585
AMON 519562
DESI 519524
SAYS 519296
UNIV 519057
EISA 518892
NSTH 518306
LEOF 517776
DEST 517552
NISH 517015
RKIN 516113
ICUL 516044
SPRE 515944
URNE 515797
ESWI 515421
METO 515255
ENDS 515058
UILD 514896
TINU 514258
TWOR 514110
EARN 514075
UTHE 513889
OLIT 513656
RIAL 513480
YERS 513394
SBUT 513296
INVE 513235
MONE 513058
CTUR 512680
YONE 512476
FULL 512471
BOOK 512465
THAV 512376
INTS 512073
KAND 512048
EEND 511759
RONT 511369
EREP 511219
NCED 510412
REOF 510357
EGAM 509288
IATE 509208
OVED 508551
FEAT 508275
OPUL 508217
IALS 507957
RTAN 507655
NOTA 507131
RUCT 507127
ONEY 506971
ERMI 506812
BUSI 506684
HISM 506671
ANBE 506475
HEPL 506031
ARAN 505851
NCRE 505375
ASRE 505246
OFTE 504534
REGI 504428
ITHH 503780
HATC 503721
INNI 503690
MILY 503609
NTIL 502685
PULA 502347
NITI 502290
RMAT 502221
ISAN 502016
ANTE 501811
DIVI 501698
KILL 501202
RETU 499787
NTON 499737
IALL 499643
POSE 499635
PTIO 499235
OUTA 499056
NDWA 498491
EWHE 498473
ERWA 498093
ELAN 497944
ASWE 497160
WTHE 497101
EARC 496535
ATTA 496479
HENI 496316
CAMP 496059
NTAL 495906
TYEA 495630
CULT 495548
GINA 495097
DOUT 494824
ANSA 494782
ROSS 494729
ONOM 494622
ATET 494412
HEAT 494230
CIDE 494226
LEGE 494103
SHOR 494004
ITSA 493655
EGRE 493541
CKIN 493354
WRIT 493131
TELL 493083
ERWH 493001
TOFI 492945
IANS 492642
STHI 492486
OCIA 492335
DECI 492308
BILL 492217
INHI 491946
SULT 491862
LICE 491549
SITE 491224
TERO 490857
URCH 490218
ESTS 490159
NDEN 490086
CROS 490074
INNE 489627
SPER 489501
ONFO 489462
NDSA 488934
NOVE 488807
ICHA 488762
HADA 488428
OHAV 488363
ISSE 488328
PANY 488193
GTHA 488170
SIBL 488087
UDEN 487921
RANT 487555
BELI 486771
SOFA 486734
EMOS 486629
ESFO 486584
EHAV 486275
NSHI 486088
THEK 486061
BERT 485814
ICHI 485709
ACKS 485462
YTHA 485227
ASTR 485054
FRIE 484994
SWEL 484692
NCEO 484348
OUNC 483991
GHTE 483861
RELI 483763
GEOF 483258
GINT 483227
TECH 483109
TCOM 483058
ESCO 483006
ANCI 482378
UDIN 482358
AGRE 482151
POPU 482087
ESOU 481689
ENTW 480885
QUAR 480877
ECRE 480393
ONDE 479782
TOHA 479528
NGCO 479200
EREM 479070
STOC 479067
MODE 478843
DCON 478565
RKET 478032
HEGO 477980
TOUR 477493
SPON 476992
LEST 476691
ISAL 476616
JOHN 476608
SMAL 476460
ISRE 476190
WATE 476168
SINA 476097
REVI 475930
RNAT 475915
LACK 475564
APPR 475155
ORGA 474976
DRIV 474922
TOPR 474920
DATE 474314
APER 473835
USET 473336
RADE 473167
TOFA 473038
REFO 472874
HEDO 472580
OMMI 472488
URSE 472455
CANB 472352
ANTO 472199
ANIS 472112
NWHI 472044
TROL 471945
LITT 471235
TYOU 469955
TREE 469818
EALI 469684
IDEA 469624
ECTS 469585
LEIN 469566
SCAN 469373
OWED 469207
AYED 469093
ROTE 468850
SWOR 468577
GANI 467582
ULDN 467562
SSTH 467440
OMME 467425
NTRE 467412
IMAT 467147
CASE 466666
NDHI 466285
SDAY 465986
GRAN 465927
MUSI 465874
USES 465785
OTHA 465664
LUDI 465363
URTH 465011
EARA 464953
OWNA 464738
CING 464665
PTHE 464561
HESC 464430
OSED 464299
DICA 464274
AVES 464085
RYAN 463765
RANG 463408
THIR 462605
HAPP 462336
IONE 461817
KERS 461635
RIED 461573
LLEN 461122
EHIS 461011
RMER 460965
USEO 460785
YOUN 460777
USTO 460596
INDO 460003
ITHS 459537
ADDI 459494
FACE 459095
RGAN 458939
CEIV 458835
SUCC 458533
MILI 458475
EWHI 458356
HAST 458242
NFRO 457971
OVID 457929
URED 457321
EREL 457155
MPOR 456871
DHAV 456847
AMED 456624
CORE 456507
EDIA 456300
IEND 456256
EINS 456097
SOFF 456072
ORTO 456056
SLAT 455996
EFEN 455967
CONO 455953
EADI 455716
INCR 455678
HEPE 455289
SATT 455214
TARY 455186
ALWA 455073
OWNT 454499
ASNO 453566
PAND 453531
MMER 452757
ECUR 452476
SPEN 452185
NTAI 451695
OCAT 451691
NTIO 451664
SEDA 451645
ETOP 451534
SMAN 451409
TRON 451295
HOLD 450841
NDAL 450390
CEIN 450217
HONE 449816
NEDA 449787
SEST 449771
EHEA 449695
USIC 449515
AMEN 449424
SCRI 449399
UCCE 449326
SWHE 449061
ARSA 448724
ASHE 448599
LOWI 448429
TLEA 448166
HEUS 447883
HARE 447874
WASH 447597
SPIT 447392
WENT 447073
HEWE 446942
HEWI 446662
AWAY 446318
ANAL 446312
BLEM 446282
IMPO 445887
FYOU 445843
OSSI 445393
TICE 445315
LLER 445292
FINI 445278
IZED 445089
HATM 445074
FIVE 444490
LETE 444406
NDSE 444319
GERS 444264
AMEA 443941
SIMP 443391
CHER 443301
OFIT 443146
DERE 443007
ECEI 442689
DEMO 442597
BLIS 442522
NTUR 442264
NTIA 442256
EINC 442055
HESP 442013
ONGT 441999
PROF 441691
STIT 441528
ERWI 441302
KTHE 441240
ACTE 441222
NTRI 441129
TRIE 440902
ALES 440788
LTHO 440513
NTOA 440284
ONCO 439986
AREC 439656
AREE 439395
IONC 439152
EEVE 438898
EYAR 438387
PROC 438348
IDES 438016
EPUB 438005
TCON 437581
THEJ 437533
OESN 437331
EATI 437182
DHER 436824
FENS 436532
DOTH 436299
REMO 436144
SLIK 435959
ANNO 435797
IDED 435794
SCOU 435781
CIEN 435633
POSS 435545
ASSA 435367
NANC 435329
GHTT 435255
OPPO 435235
ITTL 434754
MAJO 434494
CONV 434361
SPOR 434067
EDIC 434015
AUGH 433471
AJOR 433429
TRAL 433392
NSTE 433020
HECI 432615
FRAN 432243
VILL 432223
STOB 432188
EOFA 432092
TOST 431835
WHOW 431825
DITS 431468
PPRO 431451
RONG 431187
YOUT 431078
PARK 431054
BETT 431046
EOTH 430847
DPRO 430725
OREC 430677
ELLE 430199
ITCH 429868
SHEW 429717
OFAN 429290
TITU 429235
EOUT 429191
SABO 429034
ASMA 428552
COMI 428403
ONNE 428324
XPER 428200
SSTA 428077
USTA 428070
PLEA 427991
ECIT 427796
UNDS 427629
ARTS 427208
ORKI 426969
UTIN 426091
ANNE 425889
TICI 425648
KEEP 425390
DREN 425007
TISA 424959
SHAD 424896
POST 424172
ERTI 424070
PARA 423685
RACE 423605
IVEN 423134
EPRI 422946
OURN 422546
BREA 422154
ICKE 422110
ASCO 421766
ONWI 421633
ONET 421487
ERNE 421211
ORSE 421044
ITYA 420752
LANT 420703
EIVE 420569
HERW 420536
NGAS 420451
HEBR 420202
ORRE 419542
OBLE 419425
ARAC 419346
PPED 419006
TERW 418933
RTHI 418931
OREI 418611
WASC 418583
ETIT 417985
TICS 417751
YWIT 417426
RMED 417230
DRES 416803
ISED 416477
TOOK 416444
ONED 416149
OCON 415326
SETO 415112
HEON 415079
SSUE 414888
HEOR 414857
TTOT 414689
YWAS 414439
RYTH 414375
ETTI 413915
HERC 413786
NOTE 413739
ELAS 413720
SHIS 413582
ESCH 413382
ULTI 413330
MSEL 413255
ORKE 413156
OMPE 413135
IONB 412818
CHAM 412603
RWAS 412562
QUIR 412508
ITYT 412387
ESWE 412323
ABIL 412049
ERAG 412006
TFRO 411932
HAVI 411867
LWAY 411207
ROCE 411113
CKED 410929
ETEA 410479
NCEI 410197
AVEN 410178
LOCK 410151
ORNI 410148
LYRE 410109
SOTH 410038
WASR 409708
CERT 409611
REFE 409212
CANS 409134
ONWA 408658
ERHE 408636
UTHO 408559
MEST 408334
OARD 408082
CHRI 407891
ITOR 407812
VERI 407719
TWIL 407658
FIRE 407467
NVES 407378
HRIS 407368
ETTH 406618
DSTO 406559
ONAT 406332
SEDO 406328
CULA 406313
PONS 406231
MEIN 406221
TODE 406219
AMIN 406214
BOAR 406173
RITE 405893
ASES 405640
EREF 405429
IVEA 405403
ERSC 405381
HORT 405368
NALI 405202
SSHO 405165
NETH 405032
NDFO 404972
TACK 404924
RERE 404615
DIAN 404489
RIAN 404320
TRIB 404176
ATIC 404114
TOHI 403993
TIRE 403984
ILDR 403935
ORMO 403807
NSON 403666
TEDF 403477
ISIT 403358
STOM 403340
INHE 403330
NOMI 403283
RCHI 403265
LIEV 403151
EWIN 403032
OUNG 402978
RIOU 402856
UNDT 402688
IKET 402553
EADY 402371
STAL 402188
OTTO 401923
ENED 401915
TPRO 401821
OBER 401811
IESO 401775
COST 401756
ANAD 401714
FFOR 401559
TONT 401512
NDAT 401357
CETO 401323
LLAS 401303
LENT 401038
OAND 400964
INEA 400733
DTOA 400271
HADT 400231
INSI 400129
ESIT 399777
UNTY 399709
LINT 399590
FFEC 399569
SFIR 399554
INUE 399494
AGUE 399414
ORTI 399413
ARDE 399347
EMPL 398885
SEEM 398866
MERS 398777
ESUL 398741
IMPL 398723
MITT 398557
TODO 398534
IDEO 398452
TEDO 398320
NTSO 398212
REHE 398141
LIES 398104
INDU 397863
RESA 397731
ASTI 397729
SEDI 397722
STEN 397612
FICA 397498
RRIE 397410
LLOF 397388
ONWH 397259
OWNS 397138
ACCE 397069
DSAN 396674
FTEN 396563
OPRO 396521
SSUC 396479
RWIT 396460
ATIT 396265
NSTI 396148
NCOU 395931
TANC 395823
SHEA 395798
IVEL 395516
AGEO 395436
TALI 395125
TODA 395002
NPRO 394922
DTOS 394643
ICLE 394588
ECAR 394151
EONT 394123
ETHR 393962
TOAN 393950
ACTU 393744
HANT 393728
ESWH 393689
LESA 393554
DETH 393521
ULDH 393176
OTAL 393165
WASI 392891
HIRD 392783
ERPR 392741
LLAN 392680
RETO 392364
ESNO 392271
NGAT 392154
DSOF 391866
ANST 391802
LEAG 391576
HITE 391574
STAB 391418
LDER 391402
ONEW 391250
LIAN 391250
RICE 391134
RICT 391099
AYBE 391023
EASI 391022
NOTT 390751
ENDA 390691
OWNE 390383
PANI 390345
THOR 390157
APPL 390116
GRAD 389973
YHAV 389753
OMAK 389749
DCOM 389512
DEAL 389332
INMA 389040
DISA 389011
REWA 388993
SECU 388987
EFER 388254
EARO 388232
INSO 388193
HARA 388069
ENTF 388062
IMPR 387321
SINS 387282
BANK 387277
EARI 387165
PROM 386873
ANEW 386816
HISB 386674
EONL 386413
NNER 386328
VICT 386323
IATI 386161
ONSU 385955
TITI 385720
ERBE 385697
EFOU 385207
MOUN 385169
NYOU 384963
HEBU 384914
OMEA 384909
FOOT 384773
RSHI 384687
NDUS 384259
NDPR 384026
DTHI 384020
SPRI 384002
SALL 383967
HERN 383854
CHIS 383646
HAMP 383267
NDLE 382966
BATT 382653
ILDI 382644
CAST 382574
PROT 382433
TSTA 382419
EUSE 382370
ALST 382236
ROBL 382207
ESCA 382047
GHTO 381889
RSAR 381737
TSHE 381687
MEET 381616
OCOM 381511
VOTE 381359
NGIT 381076
RSHA 381064
AWAR 380976
ADMI 380910
IVET 380749
COLO 380698
EAVE 380462
VARI 380285
BETH 380223
ACTO 380058
OSTE 379920
HISO 379759
NDAY 379714
EWOU 379565
EDOU 379383
TOHE 378743
SSIS 378629
NGSO 378143
CHTH 377969
HALF 377968
ATHI 377905
ORIG 377833
URAL 377805
OOKI 377690
EGRO 377688
LFOR 377653
TEIN 377584
MINE 377560
EDAL 377542
INAS 377483
TRES 377372
ARTY 377128
ALMO 376791
HEHE 376760
OLVE 376740
ERON 376740
HENH 376618
SOUR 376538
EGAN 376527
DENC 376311
RAVE 376218
LDHA 376206
FILM 375524
UNTE 375409
NENT 375393
DEAT 375267
PRIS 375185
EPEN 375047
GROW 374945
SSIB 374589
HERM 374209
SAPP 374193
TYAN 373941
NITS 373921
ENCO 373751
COAC 373622
SUND 373573
TTAC 373245
PAST 373192
AMPL 372943
ISHA 372745
ACOM 372613
UTIT 372341
ARDI 372305
NDIA 372182
EANS 372174
FORW 371997
IGNE 371781
WASO 371610
HERP 371601
LEME 371600
PITA 371596
SCAR 371411
ETOW 371386
LYTO 371318
PERT 371308
TWOU 371119
SYOU 371065
CCOR 370873
ENHE 370806
UETO 370665
EINA 370626
YCON 370592
ROOM 370482
NDWH 370206
OVEM 370123
NDWI 370008
TESA 369961
ONAS 369902
TERF 369878
CESA 369597
TEDW 369567
SCEN 369499
SSAI 369354
OURE 369316
ONDI 369263
HISD 369210
RTAI 368447
RHIS 368427
TORA 368380
HEAN 368332
LLYA 368321
SETT 368281
RCON 367930
OMER 367592
RACK 367585
WASP 366930
ORTU 366644
NGLI 366513
BODY 366373
ASAS 366178
EAMS 366161
REDE 366107
RAFT 366052
NTAT 365984
GHTI 365848
REAK 365266
NGSA 365085
ISST 365028
ORAL 364188
DATT 364161
ODAY 364087
IGIN 364082
TOME 363989
EXAM 363558
RIGI 363498
ROTH 363468
TBAL 363434
ERAS 363390
ORDS 363275
GRES 363107
EDHE 362711
ANCH 362653
HERF 362612
TOFF 362503
NEST 362478
ENOU 362215
TERB 361951
IMIN 361870
IMET 361839
UART 361827
ACKT 361765
EATU 361650
AINA 361606
MANC 361172
HATE 361154
HINT 361054
ERSS 360542
GHTA 360424
TERC 360202
FUND 359933
ONEA 359923
OSET 359134
NDAS 359015
UNDI 359007
ETOS 358968
ARLI 358896
MATT 358836
NICA 358662
ILES 358289
ISHI 358254
LEGA 358079
AREP 358038
TERP 358021
ESOM 358001
SHEL 357938
EAGU 357834
RALI 357803
CTIN 357690
HISR 357560
GHER 357404
UMAN 357283
OMMO 357272
EDOF 357269
UIRE 357191
FIGH 357154
ALAR 357006
ITER 356891
RCOM 356779
EIND 356498
INGG 356415
AGEN 356414
VEDT 356317
TARE 356117
NONE 355940
EMOV 355678
TTIM 355578
ETHO 355561
TELE 355405
OROF 355184
YOUC 355161
NDDE 354944
ALOT 354690
ANYT 354581
ICTI 354564
RETA 354333
EENS 354096
EREH 353968
AGED 353597
INAR 353566
ISCA 353476
ACHA 353445
ERNO 353136
PREV 353132
SCRE 353014
OBEA 352921
RINC 352901
HEEX 352554
NDSH 352340
URNA 352264
ECUT 352177
NDMO 352148
ERYO 351874
PLOY 351864
ENTC 351671
SCHA 351662
ASKE 351621
MANS 351518
REPL 351483
EREG 351081
ERGE 351044
TINA 351002
OMIC 350951
TECT 350926
ORKS 350820
MUST 350628
ARRE 350449
EITH 350426
ITLE 350409
FTHI 350369
EEXP 350156
MARI 350042
ORNE 349990
CTIC 349973
ESAL 349953
EADO 349924
SOLD 349794
PLES 349776
HEEA 349739
REPU 349695
MONG 349594
TALS 349586
RESH 349393
ENOR 349338
OOKS 349295
BLES 348932
LAIN 348459
AVEL 348430
GION 348226
TALK 348041
OFRE 347929
ITSE 347926
HEBI 347767
ITAR 347612
CHIE 347401
AMPI 347401
REPA 347286
ATHO 347209
ELLS 346958
SESS 346575
ITST 346506
STIO 346460
DHIM 346455
TERH 346357
HECL 346297
TOWA 346166
OTIN 345936
ISMA 345895
DERI 345873
ESCR 345815
SICA 345801
HASE 345770
GHIS 345635
SUAL 345557
OOLS 345451
HISL 345410
SSEN 345286
WASB 345255
SSTO 345239
LYBE 345075
ECHN 344749
ACON 344630
ILED 344595
PMEN 344436
IONP 344375
THOF 344181
DESP 344160
NDBE 344088
DEDI 343953
ENCY 343877
RRES 343587
HILL 343363
INWH 343331
ONGE 343287
EXPL 343276
WHIT 343063
PENS 342955
OKIN 342824
FITS 342524
DONA 342395
DASA 342059
ESMA 341876
MAYB 341875
WHOS 341807
ONDA 341764
EDCO 341739
NAST 341541
RIBU 341504
TEAC 341353
ANIM 341239
XPEC 341164
ORHI 340945
EDAY 340880
TSAR 340404
EWAY 340389
ERAC 340371
INSA 340170
ARAT 340145
ACED 339938
NDWE 339914
GOAL 339678
ATAL 339575
PRIC 339527
EWAR 339384
RYOF 339369
HEVI 339090
OCKE 339081
NHER 339076
SCAL 338964
UREA 338944
IDNT 338880
HEYE 338860
ORST 338854
GTOT 338731
YARD 338655
EACT 338558
QUAL 338503
WOOD 338238
METI 338226
LYAN 338145
NGHE 337826
DAYA 337675
OUSL 337636
CIAT 337565
EEDS 337493
VEAN 337403
ERIT 337352
SANA 337272
EEDT 337217
REDO 337017
FORI 336888
HECR 336747
STOS 336656
UARY 336200
CTER 336060
ICTO 335964
ESAS 335908
MPET 335666
INGN 335556
MMON 335233
HATP 335213
CEST 335208
CARR 335062
ATAN 334947
ITHM 334691
EDSO 334623
WASF 334542
ATLE 334424
ACKE 334322
ISMO 334248
AROL 334229
REED 334160
WASD 334008
ESHI 333973
USTI 333926
INSU 333890
ITES 333817
CTTH 333715
OLDE 333679
TINC 333522
ELEV 333502
ECOL 333470
RTIS 333409
VEDI 333371
UALI 333338
LCOM 333335
UPER 333282
VATI 333117
ITAN 333103
ABLY 332878
ETRI 332594
ARDT 332276
LCON 332275
SEIN 332156
LOFT 332127
INCI 332035
RISE 331811
REER 331808
EDER 331731
RPRO 331668
INRE 331232
FEEL 331227
AILA 331215
ESPI 331141
MARC 331045
LEDA 330916
EURO 330845
INJU 330797
LLYT 330705
HANA 330610
FATH 330580
LEAV 330527
PION 330490
INCH 330265
EORG 330153
RIVA 329974
ENGL 329946
HOPE 329823
ARIS 329818
OLDI 329567
SEAN 329559
EDUP 329401
NEAN 329334
ARNE 329135
TOLE 329115
MESA 329041
NSIV 328814
MPRO 328697
ANDU 328620
HADB 328619
IWAS 328540
NDCA 328500
ONMA 328366
MIGH 328270
NION 328245
ONFI 328045
INTR 327920
HASS 327876
APRO 327814
EBAC 327781
LAYI 327760
DDIT 327697
AREF 327668
DUST 327407
IBUT 327287
APAR 327257
EBAL 327170
EYHA 327134
DGET 327110
ROLL 326987
NTHO 326978
HEHI 326930
NESE 326889
OSTS 326825
ANIE 326821
ACES 326735
ARTM 326679
ATTL 326476
SAST 326454
VEME 326192
ENGE 326049
NGES 325969
NCHA 325911
AMAN 325818
HIND 325792
AKER 325699
LREA 325606
EHOU 325414
ERIA 325393
HOUR 325109
SELE 325081
HERH 325031
RDAY 325020
STRY 324944
ECAL 324854
YWER 324689
ANDY 324689
DALL 324570
TSHO 324492
BUTA 324437
ERSP 323987
ERCA 323917
LLAR 323689
INOR 323683
CLAI 323468
SONG 323407
AGER 323394
OUTI 323381
WHOH 323265
LITA 323235
ANAT 323124
VEDA 323102
EHER 322712
ELES 322629
APRI 322617
CKET 322611
BLAC 322190
EDES 322172
SESA 322131
SNOW 321948
REES 321850
ANCO 321767
TOIN 321721
ATWA 321627
IFYO 321582
AYTO 321421
REAM 321253
EMIS 321144
CANC 320964
WAYT 320960
TEAN 320953
STOO 320926
ORSA 320849
MAKI 320837
DYOU 320833
ROJE 320821
ADES 320742
AREO 320663
PROJ 320578
EAPP 320569
EGIN 320460
NCHE 320135
VIOU 319969
OSEE 319953
ISPR 319894
OJEC 319799
YCOM 319731
ADBE 319588
SUPE 319572
NARE 319357
NSWE 319204
ENEX 319193
EGRA 319144
LOGY 319120
NEDI 319046
PHON 318931
BEGI 318833
URET 318483
ONDO 318407
EFFE 318386
ENCH 318369
CTUA 318349
SALE 318326
DELI 318223
RCES 318201
TITL 318186
ONVE 318169
FRON 318093
HENS 318070
BRIT 318023
WORD 317975
FORP 317936
CHOF 317778
SMOR 317650
ENTB 317558
ASSU 317546
ORYO 317505
HTER 317296
NKIN 317251
LIMI 317140
ONOR 317114
HISH 317075
OFMA 316963
BUTW 316856
EMPT 316840
ECLA 316801
REWE 316759
SSAN 316743
ALOF 316655
USAN 316628
IESI 316542
ERRI 316489
HERB 316423
JOIN 316326
SSOC 316304
ALTE 316298
LLST 316293
OLLA 316250
SITS 316070
ECHI 315607
HEYH 315530
WIDE 315506
NGAR 315377
ISFA 315289
CKTO 315263
RAIS 315200
EBEC 314982
VEIN 314955
EPEO 314893
EINF 314832
HEOT 314825
BEGA 314814
AKEA 314747
CLIN 314644
ELLO 314513
MPLO 314497
ISHO 314476
ALIF 314237
CHUR 314180
CADE 314149
AREL 313918
GTON 313862
MEON 313641
HISE 313578
GRAP 313558
DEDA 313549
IFIE 313546
NOTB 313368
WEAR 313248
ESSU 313014
ALIA 312946
ERMO 312852
OWAS 312820
EDGE 312686
RANK 311983
ONON 311982
NALA 311905
LENG 311874
CIPA 311796
HOWA 311590
NWHO 311559
ITUT 311551
ROMI 311520
LYCO 311351
DBEE 311302
NTSI 311253
ADTO 311104
THHI 311024
AMOU 310658
TENS 310550
AYST 310550
ERUN 310542
YFRO 310391
ESTU 310267
VEAL 310190
NGAL 310000
ADTH 309726
OPLA 309274
TYTO 309267
LOGI 309254
AKEN 309214
ACKA 309144
NDNO 309028
OVIN 309015
UNIO 308966
ORIE 308959
ATWE 308904
INSE 308759
ERSF 308598
ATRI 308545
EDED 308508
EROU 308461
MOTH 308424
ONSW 308411
ITYI 308202
SSOM 307986
ASHA 307939
REDB 307865
WARE 307850
GULA 307791
NIOR 307713
LERS 307682
ESEE 307636
HATD 307461
EGUL 307079
ASAR 306930
ONFE 306818
EFAC 306616
GATI 306607
ELON 306562
EXTE 306381
SEEN 306380
CLUB 306293
RATH 306117
DBYA 306117
TOUT 306102
DEPA 305920
MERC 305849
RAPH 305731
ISDE 305695
EPOS 305691
HANC 305654
OCTO 305615
DESC 305562
VELY 305538
HETA 305525
DWHE 305515
TEOF 305417
OUSA 305255
LSAN 305253
PPEN 305219
MINU 305127
MANI 304985
DSIN 304746
QUEN 304614
RMOR 304587
CEDT 304543
GERM 304484
RSQU 304283
STHR 304163
ENTP 304158
YORK 304056
UTES 303885
MOVI 303856
DATA 303755
LPRO 303754
AKET 303733
GINE 303708
ISSO 303662
TEAD 303620
ETAL 303510
TIMA 303427
MFOR 303420
OREP 303367
RIDA 303284
SHOT 303221
TURA 303049
RTME 302967
ETOB 302939
EPAS 302924
DOFF 302658
HATO 302571
FORN 302548
EETI 302468
REBE 302422
SEAT 302400
ALFO 302172
ASAC 302160
BAMA 302152
NGAB 302113
THAD 302101
AUST 302019
OSTI 301930
OCES 301866
ANDJ 301689
STCO 301520
OFAL 301473
ONAR 301388
RIME 301123
DUCA 301121
IESW 300943
URAN 300922
SHOP 300844
TCAN 300737
VOLV 300726
UCAT 300706
EETH 300672
BERA 300670
PHIL 300305
HURC 300272
ONGR 300022
TCHA 300015
TONA 299962
TORO 299929
MMIT 299799
OTOF 299631
ANSW 299418
EDAR 299314
ESDA 299185
EIST 299132
TISH 299115
SONW 299072
LAIM 299014
ISAS 298921
ALEN 298829
TCHI 298827
GNED 298789
CALI 298754
HINE 298504
IGNI 298476
TWHE 298442
ALSA 298296
HOLE 298278
NOLO 298211
TPLA 298099
ATEO 298023
ONGS 297884
IZAT 297865
UMEN 297855
ASTY 297714
RICH 297424
WERS 297418
AMPA 297344
RICK 297304
INKI 297193
ZATI 297096
DMAN 297009
RYEA 297004
ANES 296998
REGU 296968
EANI 296658
ARSO 296369
TOLD 296331
HIMS 296261
EEAR 296261
DINS 296259
ARIO 296255
ALBU 296038
ERBA 295924
SCHE 295879
SQUO 295511
HEYC 295475
ORGE 295392
EEDE 295325
RTUN 295208
AFEW 295180
ITSO 295107
NGPR 295055
NSAI 294995
HARG 294974
INTA 294917
YSTA 294817
EBAN 294815
CHAL 294809
OODS 294470
RKED 294383
UTTO 294170
DTHR 294124
ORSO 294082
ILLH 294056
LOST 293885
IVAL 293650
PACE 293555
ASAP 293542
ACKI 293532
YPRO 293478
WIND 293468
ROMO 293377
NGFR 293332
ATRE 293262
DEPE 293191
HEFR 293183
ROCK 293182
EMAT 293101
USLY 292920
DSOM 292910
SSOF 292860
FAIR 292780
ASTS 292644
SLAN 292455
CONN 292434
ANSI 292403
ENAM 292377
NEWY 292253
AYAN 292248
RSTT 292246
INAD 292062
EOFH 292041
BUTH 291922
SBEC 291865
DARE 291677
MMEN 291493
ECAS 291475
NEIN 291368
MPIO 291252
SHAN 290981
TCOU 290969
EQUA 290663
UNCH 290616
TATT 290530
ASST 290519
UDGE 290478
GEAN 290392
RGES 290315
HOWT 290299
OWAR 290270
HERD 290118
EVIS 290118
HUMA 290066
MEMO 290011
STYE 289907
DPLA 289899
ESIS 289783
UILT 289755
EGIO 289715
WONT 289684
SENS 289657
SISA 289561
HELD 289446
ETOA 289254
EDRE 289237
OURA 288882
CRED 288828
USSI 288463
NOTI 288450
WALK 288388
DTOH 288370
ESAT 288368
TSON 288152
OTBE 288120
SOFS 287914
OUBL 287899
NTHS 287818
OLUT 287795
NMAR 287683
VALU 287621
NTIS 287478
VESA 287425
EREB 287421
ARIA 287392
SATI 287306
MAGE 287274
INTI 287232
DTOP 287230
DSTH 287190
EGEN 287126
GEOR 287029
HOHA 287002
STEP 286995
UCED 286943
LLIA 286924
ETRE 286916
SOVE 286911
REDU 286782
RPRI 286744
ATEI 286579
NGED 286352
FIED 286305
ESFR 286244
IGHE 286186
XAMP 286156
EMED 286107
IEDT 286067
SYEA 286059
OTES 285999
HEFE 285992
ISFI 285983
PENE 285977
NGLA 285830
AUTH 285797
ANEX 285754
PORA 285720
EYWE 285559
UBLE 285444
ETAI 285420
TOPA 285339
WINN 285289
PRIM 285234
RIOR 285195
LOPE 285100
HEAS 285099
ESUP 284991
ALIZ 284944
ORCO 284834
ASPR 284811
ORWA 284641
IDIN 284637
SONL 284549
NALT 284524
ETOF 284482
STAK 284420
ICER 284380
NOUG 284319
NOFF 284120
ONEI 283962
EISS 283936
RPOR 283929
GENC 283743
MEAS 283639
THAL 283512
ANKS 283478
NATU 283335
HANI 283252
CARD 283210
ASHO 283090
ROFE 283069
ENGI 282909
ERRO 282831
LTER 282757
ITTH 282727
LABO 282705
MEDA 282520
GENT 282491
NDOT 282322
WEHA 282284
WOME 282269
UATI 282219
BEAT 281957
CALS 281808
EDEV 281514
DTOC 281360
ICEA 281123
ICHW 280991
TIFI 280832
FORG 280801
IVAT 280796
EABO 280793
ANIZ 280620
GGES 280533
EXTR 280453
IONH 280357
PPOS 280311
PPIN 280291
ASTT 280170
LEDI 280100
NGMA 280023
TITS 280011
EOVE 280002
EMEM 279936
STST 279860
ROLE 279852
LVES 279732
PPLI 279701
ASFO 279591
VENI 279516
NTCO 279432
TOMO 279414
LDTH 279406
TSWH 279398
VOLU 279241
OURI 279221
DSHE 279149
ESBE 279054
ASUR 278999
ONHI 278989
SOWN 278980
INVO 278952
KIND 278921
TLES 278912
LIAM 278792
NTAR 278787
NTFO 278779
NWHE 278754
BERE 278711
SHAS 278608
PETI 278506
STOA 278495
CRAT 278392
ASPE 278388
INUT 278353
TSHA 278317
TOFO 278317
URCE 278315
VEHI 278054
PLAI 278024
ITTO 277976
IGHS 277890
NVOL 277773
OCRA 277769
ISAP 277760
EAME 277730
ONEN 277721
ONHA 277720
EELE 277666
GARD 277657
ATEN 277598
HEAC 277473
EBRA 277469
ARST 277357
DISP 277343
RUNN 277223
STTO 277026
ECES 276980
UROP 276927
ERVA 276801
EPOL 276794
EXCE 276745
OLIN 276716
ONGA 276600
AYOF 276544
EWYO 276432
LTUR 276339
PLEW 276305
DREA 276292
ILLT 276280
ADDE 276275
CORP 276204
LLYI 276177
ATCO 276170
ETOR 276099
RSWH 276093
TRYI 276036
LEFO 275892
UPTO 275890
NSHE 275828
TYIN 275654
RGEN 275280
IVID 275217
OFOR 275030
SUMM 275027
HOFT 274951
FORB 274890
SSUR 274876
RECA 274827
AGEA 274650
NGIS 274601
ATSH 274369
ELIG 274344
ITAT 274060
MPER 274045
OFFA 273953
EDEC 273914
RGET 273864
PENT 273795
UNCE 273712
REMI 273606
CITI 273404
INET 273368
NALC 273340
RVED 273250
ERSU 273214
NGOU 273086
NSIS 273048
STSE 272963
LIZE 272889
ROUT 272799
NDCH 272712
NSFO 272668
LYON 272613
NIES 272610
DABO 272597
ACKO 272594
HOST 272351
TYLE 272336
DIED 272275
OTTH 271954
EAGE 271949
SRES 271909
LARS 271757
HEEL 271698
UREO 271671
ONRE 271626
NUTE 271565
NSER 271506
IMIT 271490
NGEL 271434
NPAR 271433
SPAC 271356
PAIN 271215
AILE 271146
ECTR 271098
ARIE 271040
OSIN 270844
DMIN 270790
PEAK 270741
NATT 270737
EHIG 270717
NPLA 270559
ATMA 270465
EYRE 270332
YOFF 270275
ALTO 270234
OUCA 270151
FESS 270049
IANA 269904
STSA 269811
WYOR 269804
DOUB 269776
MASS 269753
NTSW 269748
TACT 269645
ERDE 269605
VAIL 269603
ALPR 269603
ETAN 269490
LLHA 269165
PRAC 269028
AFOR 268967
LTIM 268964
MIND 268851
OBAM 268690
EDID 268647
USUA 268616
NGSI 268565
SUBS 268318
SECT 268306
ONFR 268185
SAGE 268118
TYPE 268030
EBES 267987
NOWT 267836
EITS 267782
OYOU 267780
REDS 267710
ADEA 267632
DEFI 267596
GUES 267572
ANAR 267437
DAVI 267348
ESUR 267341
NVER 267337
HEPU 267281
LETT 267114
EBAS 267097
HETW 267065
RAIL 266955
ETOO 266927
ISPA 266919
ROPO 266911
AREI 266811
REGA 266740
LLEC 266740
ELIV 266702
RETI 266650
RTHO 266627
LTHA 266608
ESSF 266568
MESS 266545
IRON 266506
OLON 266489
YWHE 266450
IDNO 266421
ATWO 266311
ODEL 266107
RDAN 265971
TSCO 265873
DVAN 265871
AREM 265853
ATEM 265787
USEI 265690
TBUT 265595
ERYT 265574
OVIE 265504
ACRO 265372
IGNA 265359
LLYS 265300
INFA 265106
TSFO 265096
OFHE 265062
INNO 265013
HEYR 264935
RPLA 264830
THOM 264749
HHIS 264596
WHOL 264578
TONS 264405
ATAR 264364
IDET 264157
NSUR 263926
RWHO 263834
HINA 263704
SPEA 263599
OFST 263571
TRIA 263448
NEWH 263391
MART 263340
DWAR 263339
SAVE 263316
HWAS 263168
ONSC 263108
EPTI 262983
SMAR 262907
SONI 262861
ORPO 262787
UCAN 262755
EFUL 262752
MICH 262710
TICU 262697
ERTE 262494
EDAB 262415
TAIL 262392
ERCH 262388
BORN 262281
SELL 262242
IALI 262218
WASE 262185
INER 261892
MOTI 261731
EFRE 261727
EBRI 261580
TIVI 261396
TINE 261346
INCA 261343
RYTO 261304
OFWH 261295
AYSA 261183
LOTO 261100
DMOR 260834
ARDA 260754
BRIN 260725
MOND 260654
YOUA 260596
USTH 260441
WATC 260399
ESET 260393
ONGW 260271
RNAL 260254
ATTO 260202
EASS 260073
OICE 259971
PLIC 259959
RGER 259894
EGOV 259536
ETOU 259527
SEDB 259416
HIMT 259397
ECID 259347
EASU 259255
ULTU 259231
TOAS 259215
IMEA 259210
HERU 259133
OFAR 259099
OHIS 258883
NHAS 258792
SWOU 258661
SREA 258552
GETS 258413
STAG 258349
RISO 258319
ROBA 258272
ARRA 258225
WALL 258170
CALC 258122
INFL 258046
NDSI 258013
EDEA 258007
OREM 257983
HTIN 257885
IMSE 257839
ADOF 257818
RRED 257788
HEAV 257705
MARR 257628
NTOR 257599
VATE 257533
ALSE 257508
EDBE 257505
CRIT 257493
ANON 257460
TSOM 257332
FEDE 257304
ATEC 257225
OWOR 257214
SOFC 257022
RSIO 256950
NYTH 256784
TWHI 256740
OPME 256671
RARE 256631
EOFS 256626
EGIS 256482
NGHA 256326
TOAC 256165
DECE 256011
ECIS 255994
MATC 255975
ILAB 255929
ONME 255867
EALE 255795
SREC 255790
SPIR 255789
EBAT 255739
HECE 255728
OFES 255699
SAFE 255693
NSAR 255651
HAIR 255629
ADVA 255615
OTAK 255494
ISBE 255412
SAGO 255292
SJUS 255238
SANE 255063
DDLE 255040
BLEA 254959
HIMA 254918
ETIC 254811
NCIA 254800
ESNT 254744
ILET 254739
HATR 254705
UTHI 254599
TUNI 254434
NCHI 254310
ATST 254221
ITHC 254016
TOGO 253916
AVAI 253697
SOON 253645
EASA 253573
DETE 253529
LOPM 253497
CELL 253462
MEDT 253460
DOIN 253341
LANE 253294
RWAR 253233
LAYS 253044
STBE 252857
TRAV 252745
ASDE 252744
SQUA 252712
OWIT 252624
RIBE 252607
KETS 252334
ONIT 252265
RSTR 252255
ICHH 252135
NEWA 252134
TPER 252113
SDIS 252113
RATO 252059
OSSE 252026
BEHI 251945
OPIN 251940
IDON 251916
RIOD 251818
EEKS 251800
SSHE 251757
ERPA 251705
ESRE 251679
LLCO 251653
ICIP 251647
DTOD 251571
COMB 251319
HTHA 251159
ISPO 251134
NOTS 251133
UTSI 251078
STAF 251063
EIRS 251029
TTRA 250747
PICK 250741
HIPS 250593
TNOT 250512
SSTI 250500
ONER 250496
BRAN 250469
VERH 250320
TSID 250211
EMAD 250144
UNCI 250076
NBUT 250068
DBEC 250054
LUTI 249966
NGSE 249933
YOUW 249764
UARE 249752
ONBE 249750
EEME 249736
NGUP 249656
TTEM 249652
NTAG 249552
LABL 249528
TERD 249520
EKIN 249442
DUET 249343
NCIL 249321
FORF 249251
CIES 249119
NDID 249107
INSP 248971
TTOB 248962
HEYD 248962
RYON 248958
OOKA 248946
IETY 248913
ORMI 248827
HEDU 248812
TTED 248773
SREP 248770
ENRE 248717
ADIT 248703
UNNI 248697
TOPE 248556
ETRO 248502
DTOR 248404
TRIP 248296
NDDI 248169
LESO 248138
UTHA 248098
HEDT 248089
APAN 248089
SCIE 248029
RALS 247974
IDGE 247943
IRES 247866
EGAL 247833
EIMP 247628
OPPE 247597
AISE 247591
EFEA 247582
OMMA 247581
SPEE 247534
EMER 247481
ANSF 247464
IVIS 247386
NTWA 247348
GETA 247326
LMOS 247302
OUTE 247174
TOSA 247083
EOPE 247079
EMOC 247035
ERIG 246918
EDMA 246897
PATI 246845
RULE 246819
FAIL 246796
UENC 246695
ERTY 246572
TBEC 246569
NDRA 246546
OTED 246446
ELVE 246344
BJEC 246339
DIES 246336
RISI 246216
LOSS 246160
HERR 246120
ARRY 246084
IGAT 246030
IVEI 246012
ISWA 245857
ONCA 245800
HISY 245623
ROUS 245484
ITYS 245364
STOL 245110
NDFI 245091
NTOS 245090
GIST 245046
EVIC 245006
NTBE 244966
EGOT 244931
ATEG 244850
DEOF 244719
ITHP 244695
TEDH 244661
FORO 244528
NNEC 244381
EAGA 244294
WINT 244230
RCHE 244182
ONOT 244159
KFOR 244020
PTED 243974
GFRO 243973
GOLD 243783
CUTI 243719
HEOP 243716
DINC 243684
ISCU 243619
ERAR 243589
DAST 243489
SEQU 243480
TMAN 243414
EREV 243386
MIST 243317
ELOW 243250
SASS 243123
IOND 243104
UPTH 243097
EPTE 243093
FAST 242987
TTOM 242881
LEWI 242828
IDAY 242815
AIDH 242815
GETO 242746
IANC 242530
CKER 242484
LSTA 242448
NCEW 242401
STOD 241997
ADEM 241984
RMAL 241839
INDA 241674
REGO 241671
RETR 241669
TSWI 241530
ESPR 241421
MOCR 241390
PITE 241232
DUAL 241122
HEDR 241062
NGMO 240991
SALO 240967
SUSE 240917
EDWH 240889
ENSO 240811
RSWI 240771
OVET 240750
ANSP 240749
CANN 240734
GATE 240723
NGWH 240722
EDNE 240699
EMUS 240690
ASAT 240642
SIAN 240597
ERCI 240578
ISAT 240567
EHIN 240538
SSER 240449
BELO 240422
OTEC 240399
UMME 240384
ITUA 240383
FOOD 240365
UENT 240306
SEXP 240288
NGCA 240202
OUCH 240128
LANG 240083
IAND 240076
CISI 239965
EISN 239897
ONPR 239880
SSON 239781
OLEA 239713
INFR 239698
EMIL 239663
REFU 239602
LOWS 239490
NABL 239446
ANWH 239435
RYOU 239380
CELE 239377
GUAR 239311
HSCH 239233
OSER 239156
HASN 239156
DBUT 239062
SREL 239049
CURI 238919
ERHI 238655
OPTI 238489
ACHO 238456
NTIT 238438
LECO 238325
BUTE 238321
ILAR 238254
REEM 238189
HECU 238083
ANDK 238078
MILA 238066
NDPA 238050
OFFT 238038
YHAS 237959
GIRL 237943
FINE 237743
GOFT 237740
NDEV 237727
YCOU 237626
EGAT 237607
RPAR 237584
ORDA 237581
IKEL 237476
SENA 237272
DPER 237060
HEMU 236663
EBEL 236641
DAMA 236533
ULLY 236460
MAST 236360
IDAT 236359
CALA 236320
MILE 236266
RONE 236227
NONT 236220
UTUR 236189
DAYT 236144
FORY 236135
LSOA 236124
ROLD 236110
HATB 235929
RDED 235880
ROMH 235835
ATSA 235819
IKEA 235812
ITSS 235801
QUIT 235718
ITIA 235627
RETT 235593
INDS 235537
THCA 235524
ANGU 235414
ALDE 235336
RENA 235249
LSOF 235204
EBRO 235140
TAFF 235127
NGWA 235118
URIT 234963
GOUT 234880
DHAS 234688
ELOC 234560
RFRO 234510
OFPR 234491
SSOR 234449
ISPL 234439
ESOR 234411
PRIV 234259
RSHE 234192
YWIL 234093
AGIN 234090
RELY 234083
TOPL 234041
ISES 233970
BLEF 233950
ERLA 233916
LONE 233901
ECTA 233843
ONHE 233772
RTOT 233761
KEDT 233727
RIDE 233694
ENDT 233655
RTRA 233615
HEYS 233553
MARY 233443
TREM 233349
ERDA 233233
OAST 233173
HEGE 233114
NDTR 233113
ADAN 233085
INEN 233042
SHEH 232991
EATS 232987
NTWO 232940
TALO 232720
STMA 232655
ONIC 232573
LARE 232553
REWI 232520
ASIT 232485
ADED 232446
NGBE 232439
LSON 232381
UATE 232368
OBEC 232367
NDSU 232315
CAPT 232304
LSIN 232286
AYEA 232274
OMIS 232133
ISWI 232047
AMEO 231992
IANT 231976
DTOM 231894
TOCA 231796
ALMA 231787
ASAM 231786
FTHA 231745
ERSB 231656
RLIN 231580
CRIM 231552
ESTT 231547
ESPA 231534
SONO 231521
UNTA 231508
ECTT 231478
EANT 231426
ENTM 231391
IMIL 231243
FURT 231177
ELYT 231140
LOYE 231118
EIRC 230987
ABLI 230978
ENSU 230955
SCAP 230941
SEWH 230921
ENSA 230915
ISYE 230914
STAY 230883
IMEN 230869
ASTW 230812
STYL 230772
INLA 230720
SPOS 230627
EAMO 230546
DDED 230544
ORIA 230469
ROFI 230443
SOUN 230373
WASM 230344
DOVE 230335
JACK 230284
ANEN 230249
ENAS 230224
NOFA 230191
ISAB 230189
CORR 230178
PETE 230044
IONM 229994
DWOR 229977
OCCU 229935
NOUN 229917
OREL 229911
SIMI 229854
SSEE 229840
TONI 229813
EDMO 229775
NLYT 229661
NNOT 229643
RENE 229601
NGDO 229486
INAC 229484
OTBA 229457
OSES 229431
NDLA 229425
TTOS 229418
EIRO 229402
NINC 229395
HEAP 229227
CEME 229208
HATY 229206
HELL 229130
AMEI 228989
NSTT 228889
LEGI 228797
ANDV 228771
NCTI 228762
ERLI 228757
EHEL 228741
NISA 228739
SFUL 228625
AREG 228588
SUME 228517
ERME 228485
NIND 228425
DONO 228422
VERB 228410
NSHA 228400
IBER 228390
YCAN 228257
RREC 228199
NOWI 228166
ERWO 228154
TAKI 228083
CKAN 227962
ASAB 227934
NTAC 227879
LLYW 227827
LANC 227823
NGAG 227801
FERR 227746
CHAI 227638
RSWE 227600
NSOM 227500
TEMS 227491
TIAN 227490
DEAN 227309
RIDG 227299
TOPO 227255
CLES 227250
XTEN 227242
EWAN 227068
FUTU 227001
EAUT 226993
TTHR 226877
DCHA 226670
HEAM 226600
ARSH 226597
UTAN 226593
ENEE 226543
ENIT 226540
PWIT 226534
CRET 226466
TINS 226452
FISH 226445
TSEE 226442
NDOW 226442
EVOL 226372
ETOC 226226
RUSS 226221
HOWS 226203
LAKE 226117
ANOF 226114
TABO 226085
NSHO 226076
HISN 226029
NESA 226002
TLAN 225988
NDOU 225973
TSEA 225930
ERRA 225922
REIG 225854
NEDB 225752
GALL 225751
AMAT 225735
PAPE 225584
NINS 225479
RAMA 225440
SORT 225416
EOFC 225403
GEME 225388
RUST 225306
HFOR 225239
SSTR 225156
ESOL 225009
BENE 224994
NMAN 224979
MERG 224912
REON 224900
OONE 224830
NECT 224714
WAND 224676
ASOF 224670
NADD 224587
OFCA 224562
EADS 224537
ESAY 224516
PRET 224465
ANNI 224447
SOFP 224375
HEKI 224326
TAST 224237
STHO 224232
ERFI 224199
PLEO 224188
EVIO 224173
NTOW 224045
AGET 224041
PPER 224038
APIT 223994
NYOF 223918
RWHE 223798
ICIN 223705
YSHO 223699
ARYA 223677
OUTW 223673
FERS 223670
RDSA 223638
EDPR 223609
OLDS 223536
EXIS 223528
RKER 223438
UTER 223359
EGAR 223318
NGBA 223300
YHAD 223298
EALO 223222
REND 223219
EDSE 223213
NTOP 223133
MONS 223094
SEPT 222894
DSON 222872
RSEA 222843
GHTB 222752
OFPE 222672
UPON 222629
ETOD 222617
NSIO 222500
IMAG 222487
LITE 222416
LEDO 222406
EINV 222375
NIFI 222357
ANYS 222186
CKOF 222129
HORI 222004
EHOL 221992
NANT 221980
HEFU 221972
OMAT 221947
DANC 221947
ASEA 221907
GTHI 221775
EVIE 221695
OUST 221638
BROT 221635
IERS 221443
AWAS 221377
AGOO 221333
ONDS 221168
ORIS 221143
CHWA 221125
NCEN 221039
LYST 220845
LYFO 220844
MOUS 220747
ERER 220707
RARY 220700
MPAI 220700
ROSE 220643
ITWI 220603
ESTM 220597
EBET 220567
EWHA 220526
VINC 220505
STOH 220470
RATT 220456
NDIV 220453
LDNO 220440
VENU 220434
SENI 220398
OSPE 220374
ELSE 220354
MPAR 220305
SWEE 220288
ATTR 220273
CUST 220183
ONSF 220141
OMPO 220122
ERFR 220086
HANN 220066
RNAM 220059
TICL 220054
IVIT 219966
JUNE 219957
SKIN 219955
EDIF 219920
BASI 219799
MTHA 219769
DWHI 219727
ITIV 219695
CREE 219692
NINE 219666
NGEN 219662
METE 219522
SURV 219390
OOTB 219354
ATON 219294
MMAN 219288
NSWI 219281
FARM 219228
ROMS 219109
SFOU 219076
ICEO 219071
NORM 219056
VERW 219053
ENON 219049
HEVE 218973
OFCH 218905
FAND 218848
IFOR 218829
NDHO 218799
UDIE 218688
PERM 218667
LEVI 218520
EEPI 218497
GHSC 218319
NSIT 218118
OMTO 218098
SAFT 218018
ENTD 217955
EORI 217926
DPRE 217906
YOUH 217726
CESO 217642
RESC 217633
ENST 217558
EENC 217520
NDWO 217350
LAGE 217348
NDPO 217347
SSIV 217315
ODES 217281
NDLI 217224
DERO 217199
SASA 217180
TENC 217170
BROA 217147
OREX 217103
EROR 216974
TURY 216966
EANA 216966
RGIN 216878
LYHA 216869
NATO 216866
WNTO 216829
TONL 216761
SANI 216727
GUST 216709
CIFI 216698
ISAC 216690
KEDA 216676
UICK 216635
DICT 216574
LEDB 216566
OMBI 216514
RWOR 216388
TUDI 216373
ACOU 216371
CHNO 216343
OFSE 216324
CAPI 216317
TROU 216316
INGY 216016
LDNT 215934
XIST 215847
HERL 215846
DIAT 215784
MESI 215601
ASPA 215561
ARER 215557
APLA 215490
LIER 215446
IDDL 215440
NGAM 215404
IHAV 215350
LINA 215331
URDA 215268
EDRA 215212
DEMA 215189
ATTI 215044
LVED 214968
NTWI 214920
MINT 214793
RPER 214788
STAS 214705
ELIK 214649
WNAS 214571
LWIT 214473
EOFM 214446
AFRI 214321
DATI 214175
ISLI 214144
EEAS 214063
ABOR 214053
QUIC 214051
EBIG 214012
HEMS 214006
ILIN 213926
FTHO 213921
NORD 213899
TTOR 213897
ADET 213894
OFAC 213865
PUTE 213857
EPOI 213742
OSEA 213679
LLSA 213581
DTRA 213410
PENI 213398
ENSH 213393
GONE 213376
OMEW 213364
TERV 213326
THAP 213266
TSWE 213218
SGOI 213206
CTLY 213159
EACC 213124
BURG 213115
EDEF 213029
RAST 213010
ELEG 212945
EEST 212922
STOW 212890
ERFE 212826
CALE 212739
ASNT 212714
ENUM 212702
NSAT 212694
SHEI 212673
SAGA 212646
NTIM 212579
AREB 212516
DEDB 212489
EBUI 212469
REHA 212464
RIMA 212450
HEBL 212410
LEWH 212391
HISG 212324
RINE 212302
FFEN 212174
DROP 212148
BLOC 212145
BUTS 212101
ALLC 212014
REPE 211989
UNIC 211956
PAIG 211850
ADIS 211795
DTOG 211753
STLE 211707
NNEL 211646
NDEX 211624
HEMT 211604
HITS 211587
EMTO 211581
AIGN 211575
ISEA 211515
SIND 211472
ODER 211448
UGGE 211420
DECL 211405
IDHE 211393
FELL 211377
NDLO 211357
ETAR 211342
WNER 211288
SACO 211222
IGUR 211187
TALE 211166
WASL 211118
STME 211112
EDEP 211108
NDEP 211065
OTEN 211058
ECLI 211057
NERG 211016
GAVE 210925
NDRO 210895
RADU 210893
NETO 210888
ITCO 210886
SOFM 210846
MERA 210845
TOEN 210801
EEDI 210797
MPOS 210771
ASCA 210636
FIRM 210634
EADT 210608
ERFA 210562
OREV 210552
RMON 210548
UGHO 210482
TREN 210294
OWAN 210243
HASI 210241
STSO 210194
RLIE 210149
RHER 210122
JULY 210121
ILLC 210112
TOSU 209982
ILTH 209982
SATU 209976
ATYO 209960
TEEN 209915
NIMA 209885
GEDT 209813
EENI 209748
CRIB 209708
HOTO 209685
SLEA 209679
DIDA 209642
ULDS 209583
EMET 209577
KINT 209533
ENNE 209478
UDED 209439
STFO 209345
ARIT 209331
AINL 209306
USTT 209299
OMED 209276
CONG 209169
WOMA 209153
TOCK 209153
ITWO 209039
EENE 209013
HOLI 208946
TPAR 208848
ANAS 208839
MPLI 208800
FIGU 208798
COUP 208756
USEA 208745
IFFI 208633
OFDE 208607
OCUS 208543
OBAB 208523
RALA 208522
TLED 208519
RSEL 208423
BRID 208233
HOTH 208188
ISFO 208157
GINS 208155
TETO 208130
SANO 208099
ETTO 208044
RUNS 208012
HOWI 207860
SVER 207856
TOCH 207840
YBUT 207815
ODIS 207791
ITYC 207749
INEE 207745
BROW 207701
ATSO 207677
PRIL 207606
EIRP 207606
BLED 207573
MIDD 207466
RPRE 207452
ORON 207446
SCOT 207422
NDME 207419
STWO 207405
ARNI 207379
LARI 207368
OMOT 207276
IONR 207135
GEIN 207110
ERDI 207090
DMAR 207006
HEIM 206987
ETED 206969
ANUA 206774
NGSH 206751
NOTO 206723
ROKE 206708
ICHT 206707
ACET 206669
THLE 206649
SMAD 206591
METR 206550
OFMO 206511
ORAR 206502
ERAB 206467
DAFT 206416
NLIN 206414
ATCA 206373
FRES 206363
UGHA 206318
LWAS 206256
ACEA 206225
TEDP 206224
ORTT 206195
INPR 206092
NTEL 206038
ILLN 206013
TISN 205960
NTAS 205920
TKNO 205873
ARDO 205822
ULTS 205783
ENFO 205752
EIRF 205718
HEQU 205691
IVEP 205580
OREO 205563
NTIC 205549
HOSP 205519
ERLE 205511
URNI 205406
MANT 205392
URGE 205352
EATA 205342
ANRE 205319
LLYC 205317
UTED 205277
ITSP 205272
ORYA 205186
TISS 205169
RDIS 205109
EFIL 205094
MBIN 205041
RSCO 205039
AMAS 205032
EVIL 204938
MESO 204905
AMEW 204862
EDAF 204844
USTB 204827
TOFH 204597
TSNO 204588
OHEL 204561
ETOL 204547
SDES 204534
TSEL 204528
PREC 204523
EUND 204447
TUAT 204365
FAVO 204333
ERBU 204035
LLRE 204023
RABL 204011
NETW 203945
NGUA 203914
NTHR 203895
INEI 203837
ENVI 203800
ERHO 203738
ITHD 203690
LYDE 203611
INPA 203610
EMID 203534
NFER 203520
NASA 203506
ONLI 203458
NCEP 203439
RAME 203409
THUR 203360
TARI 203310
HEPI 203296
NALO 203291
IVEO 203276
EWES 203273
AGEM 203252
ENHA 203246
SECR 203226
RILL 203205
IQUE 203172
RSAI 203106
OMOR 203089
LSTO 203079
ITSN 202944
ISAR 202914
SKED 202895
OPOS 202883
LLAG 202816
EDWA 202745
AUDI 202741
AUGU 202679
VENO 202567
TESO 202566
RNER 202563
ANIC 202546
DBEA 202512
NEXP 202507
UMER 202487
ENIO 202484
EFFO 202479
OCKS 202433
FACI 202380
NAPP 202366
TOSH 202323
RLEA 202319
OUSI 202315
AMEM 202299
SAWA 202235
PEAN 202210
NGRA 202191
SEIT 202023
INKT 201947
ESLI 201936
CLAR 201907
ARME 201898
SEND 201888
EDAM 201885
YATT 201858
TOLO 201835
OUPL 201809
MALE 201694
DRAW 201634
HEWH 201572
IRIN 201523
NDIC 201439
DOOR 201436
ASCH 201431
WHET 201312
ANKE 201290
ATEF 201285
TENA 201273
LSTH 201261
ITSC 201255
INHA 201129
CIRC 201100
ATRA 201078
TAPP 201075
NSCO 201058
FFTH 200997
IALA 200989
EVAL 200983
UTWH 200941
LKIN 200902
NIZA 200901
EBOO 200840
NDNE 200766
IVEC 200740
ATEW 200713
MULT 200704
OLUM 200668
BOUN 200651
WHOA 200622
GERA 200562
EJUS 200539
CEFO 200516
IGGE 200515
NOWA 200396
KELY 200381
ITHF 200279
MERE 200226
ETON 200212
ICET 200189
ELOS 200165
YSTH 200139
ALUE 200081
DARD 200058
LANS 200050
RRIV 200026
CERN 199969
ETEL 199941
LLIS 199893
NWIL 199857
OMPU 199822
ASER 199804
ERSM 199757
NADA 199688
DERN 199672
LORI 199670
ROMP 199529
ERNI 199522
DANI 199521
TODI 199510
LESI 199475
NTOB 199377
ONEC 199317
OFFO 199257
EDAC 199172
NGLY 199138
SAYI 199118
JAPA 199110
HATF 199083
HIEF 199054
NGAC 199026
TOPU 198967
ADUA 198889
ARMY 198878
GICA 198863
DEVI 198850
HATL 198805
OARE 198777
SCOV 198766
STWE 198749
EIGN 198730
ORCH 198712
ACTS 198676
ETOG 198582
SACT 198445
NDPE 198400
OLIS 198399
ORSH 198369
TICK 198257
EMAL 198190
GONT 198181
NSPO 198115
RINA 198076
STIG 198069
ANAC 198067
NDOR 198060
ANYA 198021
OWNI 197959
HTTH 197936
NVEN 197726
EFAM 197667
ISSA 197662
PHER 197545
WAIT 197460
VECO 197455
NECO 197423
EREO 197415
TOAL 197395
TOUC 197361
TOWI 197354
NTSE 197205
ANFO 197203
INDT 197157
OLES 197113
EKNO 197075
LINS 196982
SINF 196892
HEFL 196815
YNOT 196782
TSAL 196714
SOFH 196705
RAMS 196587
ETSA 196585
ARSI 196575
NKTH 196388
SESO 196384
GOTT 196370
ILIA 196365
FORR 196363
NGPO 196359
ANUN 196329
MPRE 196277
AUTO 196234
ARYS 196219
DSHO 196205
LEDG 196125
ANSO 195933
YMOR 195910
LBUM 195892
NINA 195817
NJUR 195810
EDRI 195734
NDEC 195712
NNEW 195676
MENS 195604
LIVI 195581
RDTO 195553
ESSH 195520
YTOT 195466
SITU 195457
ORIC 195424
INON 195348
ERBO 195342
ANYW 195298
EMOT 195287
ESEV 195267
NDBA 195262
IEDA 195212
EHIM 195163
TOTR 195125
NIAN 195064
AVID 195033
SLOW 195029
LLYO 195029
GABO 194973
THEQ 194896
TEMB 194861
DASH 194835
THIM 194826
CCUR 194815
SBAN 194807
IMME 194752
THCE 194744
ALEX 194675
ENAL 194627
EABL 194495
ITEA 194463
INAP 194440
DTWO 194368
SMOS 194352
HEOL 194293
NCAN 194247
OTTE 194244
ORMS 194176
SFIN 194128
MANU 194113
SKIL 194096
TERL 194078
OTIO 193968
AILS 193877
ALAS 193857
ETOM 193829
PATR 193737
OURP 193706
ITSH 193570
EADA 193496
BABL 193460
OLOR 193456
RSAT 193400
EMIC 193341
ERGY 193336
ITYW 193286
OFAS 193277
LEMS 193258
THAR 193235
HCEN 193211
ONWE 193175
ISRA 193101
TOFS 193069
TMOR 192923
OFOU 192843
OLDT 192819
UPLE 192814
OUTP 192778
NDAC 192767
GPRO 192759
WNTH 192753
STOG 192729
OSPI 192698
RITT 192693
NDSC 192630
LOSI 192606
WTHA 192549
NDMI 192511
ATWI 192463
AHEA 192438
CCOM 192412
OUHA 192409
RISH 192355
RITA 192260
EEIN 192256
RHEA 192241
PITC 192241
SONC 192234
LICI 192229
EARM 192194
OPEA 192151
OBET 192140
GRAT 192078
CCOU 192055
OFSO 192048
NDSP 192024
OLAT 191991
ROWI 191978
ASEC 191965
GHOU 191956
ANTR 191954
REDF 191915
LEMA 191867
NEFI 191866
HEAU 191838
UITE 191809
RASS 191780
EANY 191780
IMEI 191774
ERRY 191761
GLIS 191728
ICKS 191726
TANY 191705
ANAM 191606
YPLA 191598
FOCU 191591
ALKI 191576
VANC 191573
SODE 191539
VESO 191534
NIZE 191524
SDON 191475
NGET 191377
PARI 191356
SELV 191308
ONVI 191298
ONEE 191291
ORHE 191276
GHAN 191256
ILLO 191221
ENGT 191104
NEWI 191088
NTUA 191022
ELIS 190870
ERYS 190842
HNOL 190834
LEON 190812
ETOH 190777
ARLE 190774
RWHI 190728
UTON 190698
RSHO 190694
TOPP 190685
TONO 190549
YBEC 190474
NTSH 190474
TITW 190437
OSST 190415
SOLU 190375
ORNO 190374
BELL 190367
BLUE 190343
DSTR 190327
MECO 190326
ALLB 190292
ALCA 190292
NGRO 190280
ERPO 190253
ANHA 190146
OWHE 190138
EECO 190113
WIFE 190107
OHAS 190032
TTWO 190025
PREP 190009
MEND 189956
THUS 189955
SUFF 189940
PLAT 189932
NOON 189904
THON 189896
USTE 189887
CERS 189828
ALLP 189791
TEDM 189771
ROME 189727
OTEL 189691
SIZE 189622
OLAN 189593
ERPE 189549
NTIR 189512
THOL 189495
VENA 189486
NTIF 189472
DVER 189420
LYAS 189340
THAM 189329
DANA 189264
CIAN 189246
EAMA 189191
ANNA 189141
TLIK 189125
HOMA 189106
ARKS 189010
NGDE 188996
LARL 188995
GLES 188983
IMTO 188928
FCON 188899
ENUE 188833
RSAL 188759
EDBA 188721
LATT 188709
ACIN 188423
EVED 188409
EXEC 188386
SSET 188337
EGET 188273
ONGO 188224
LSOS 188214
GTOB 188214
OOTH 188150
ARTA 188045
PHYS 188018
SHIM 187966
MPUT 187965
HENC 187949
TEXT 187914
OUTF 187820
RITS 187762
ITSF 187762
NYON 187729
RTST 187605
LLEA 187597
YMEN 187591
NANA 187585
LLEY 187578
SSEC 187532
ILAN 187514
RVAT 187482
NNED 187447
DTOW 187431
NDFR 187422
RECI 187394
OMEI 187368
FRID 187315
TERY 187263
HREA 187261
APPO 187244
EAVI 187118
IPLE 187112
EENO 187036
SONH 187028
AVEH 186968
AVOR 186878
OREF 186724
TYTH 186676
SMAY 186664
AIDI 186620
ELAR 186619
HCAR 186579
STSI 186501
DPAR 186492
EOFP 186444
USEH 186321
MERO 186250
NALP 186217
OPED 186197
MAGI 186192
SSFU 186148
OSEC 186127
AVED 186056
FILL 186013
DAUG 186009
ECLO 186003
IMAL 185980
ALED 185937
OFMI 185923
OTON 185906
IMAR 185860
UGUS 185815
UARD 185733
EDEM 185719
TURD 185622
ESBU 185614
RINS 185591
ABIT 185582
TANA 185569
NPRE 185425
NRES 185422
DWIL 185402
SBUR 185352
OWLE 185327
ACTT 185278
RCOU 185241
DECA 185120
ORTR 185101
RIPT 185037
RTHR 184997
UREI 184961
ITHB 184919
LLYB 184861
EAFT 184832
EENG 184829
OURO 184775
SEPA 184751
CHIC 184747
RREL 184745
XECU 184676
DLES 184638
LSOC 184636
NARY 184575
EDEN 184574
TUTI 184564
IDUA 184560
LIND 184539
LDIS 184492
FRIC 184373
ORAS 184353
YOUD 184319
MEWH 184271
OOKE 184224
LLYD 184167
CHHA 184151
EPUT 184143
TLIN 184137
EDUN 184026
ITTI 183942
ASET 183859
SMIT 183828
TOFC 183822
ZING 183791
TOGR 183751
RTSA 183746
EPIN 183734
RRAN 183714
OUPS 183705
UCTU 183690
TROD 183685
LOOD 183683
YWHI 183675
TOWO 183602
RONM 183591
PPOI 183579
RGED 183558
EAPO 183531
ISNE 183530
TECO 183512
LEBR 183495
ANEA 183494
HEEV 183407
OMAS 183395
ITHR 183370
NOMY 183365
GHTW 183336
INWA 183301
DERW 183280
EELI 183262
HEOF 183231
NDAM 183212
UNTO 183118
ATFO 183100
RDEN 182987
NDFA 182962
TSRE 182932
RBUT 182915
IREA 182870
ERSD 182849
SCUS 182831
ISWE 182811
USER 182807
EARD 182792
MEFO 182670
ALTI 182636
RROR 182542
ERWE 182507
NGBU 182504
BARR 182462
AIRS 182443
TOVE 182417
TTOO 182385
GLAN 182294
NALD 182167
HICA 182127
TSTR 182037
UNCT 182036
APOL 182033
ANOR 182010
ICHE 181972
NEIG 181938
VIDU 181937
CKSO 181888
LETI 181877
OTRE 181873
REDW 181850
ORDO 181792
BEAR 181771
MANN 181765
SBEI 181759
DBET 181682
MANW 181643
CERE 181632
HARL 181621
PROS 181564
LDAN 181508
ANSE 181485
UNDR 181369
NWOR 181360
ARDW 181319
EDBU 181314
RDST 181306
BIGG 181277
RTWO 181247
PREM 181242
EPOP 181228
OFPO 181224
ENES 181194
THST 181179
JANU 181176
RASH 181149
GURE 181139
VANT 181096
ANTL 181003
LLTO 180990
LERA 180990
OSTP 180897
LIGI 180873
ASIS 180868
ONDU 180830
ECOV 180830
OSEW 180815
TEDC 180810
FEST 180674
ESTC 180672
URPR 180671
SNEW 180655
DIND 180552
TOBA 180525
OPRE 180411
NCOL 180407
DLEA 180380
YOUS 180268
MMIS 180229
HART 180179
EWAL 180132
EPIS 180132
HROW 180109
ITET 180108
ICIE 180080
TOBU 180072
IBIL 180031
NREC 180013
ERAP 180012
ENAR 180006
ISOF 179997
OLLI 179988
MMED 179955
TSBE 179897
ORFO 179866
ANIA 179764
ICED 179761
LIBE 179730
OFAM 179728
MACH 179723
ENTY 179715
SUIT 179678
INAM 179670
RTTH 179637
IKES 179629
DJUS 179603
ISMI 179594
NUAR 179576
ORRI 179575
SSEA 179497
PONE 179491
DALS 179476
SHAP 179401
ANIT 179363
TLET 179348
ESTP 179340
NSUM 179334
THCO 179315
HENU 179311
NNOU 179309
SSPE 179304
ONSP 179257
SPOT 179256
ASPO 179250
SBET 179211
HECK 179111
ORER 179107
RROW 179093
ATLA 179093
CROW 179085
SBEF 179021
RONI 179014
TOEX 179009
IVIL 178975
EMEA 178891
GNIF 178889
NGHO 178887
LYDI 178855
FHER 178843
SBRO 178827
RAPP 178790
RMAR 178767
NDTE 178732
AFFI 178667
NOTR 178638
TWIN 178529
DEAD 178376
REXA 178300
SNAM 178296
NGTE 178295
EATO 178275
ECEM 178248
EWAT 178187
OSTT 178146
TIVA 178104
DREC 178094
SACR 178052
HYSI 177952
TIGA 177923
TOKE 177916
NGAP 177809
WORT 177709
TYCO 177683
OYED 177605
ARGU 177589
DLIN 177577
UTIV 177554
PACK 177504
ASAD 177425
OFLA 177354
VERC 177311
EAKI 177308
OMEB 177273
TSPE 177236
EANE 177228
YWOU 177199
EANO 177173
LHAV 177105
KSAN 177088
ALEA 177057
ECAP 177019
CUSS 176997
RFAC 176994
CORN 176950
TOUS 176894
NCEF 176880
META 176858
NLYA 176850
EYCA 176846
NSPE 176731
ICKL 176708
NSET 176622
EWIS 176600
CHEC 176595
TREC 176553
ENEF 176497
NOWW 176452
OFFS 176440
OSHO 176386
ORWH 176301
YPER 176300
SSAY 176236
EDDI 176147
NSEC 176072
ELLT 176041
OODA 176016
HEPH 175972
ERGR 175954
EMSE 175888
RPOS 175879
PANE 175860
ONAB 175858
CESI 175842
EFOL 175725
TOLI 175694
ALPA 175632
ENOW 175549
ESCE 175537
CENE 175509
PUTT 175330
YSAI 175313
RLDW 175297
TEDE 175293
COTT 175217
OWNO 175208
UDES 175204
FICU 175193
INMO 175109
OMEP 175061
DONL 175061
TTOA 175028
NCIN 174998
ATME 174991
OKED 174841
ANGI 174832
ANYP 174831
NCEB 174807
ENBE 174761
PICA 174727
AREW 174698
LANN 174689
NSOR 174676
SORE 174668
HONO 174647
TCAR 174640
NSAS 174627
NSIB 174621
ISPE 174594
OLEN 174572
NABO 174566
IMED 174545
UAGE 174534
TEME 174471
TSAT 174460
HEND 174452
ISCH 174438
RLAN 174434
AYSI 174422
STEV 174396
NVIR 174384
LTIN 174366
SWHA 174354
SSIA 174342
UFFE 174308
IAAN 174222
DHEA 174129
DDIS 174115
TESI 174093
INWI 173963
SSCO 173931
IALC 173915
SUES 173908
ALLW 173893
ARRO 173810
SSAG 173809
CEDA 173804
RNET 173793
ENEV 173771
JOUR 173636
SINV 173566
CIVI 173512
NOUT 173478
EELS 173469
FLOO 173458
EOFI 173458
NGPE 173364
HORE 173329
HTTO 173306
NOWS 173274
SOPE 173255
OFLI 173231
EVID 173170
OSTR 173162
GUAG 173129
ERNS 173048
OFPA 172976
ULDA 172891
NESO 172848
OOPE 172760
RSPE 172716
LSOH 172700
VIOL 172693
KEIT 172683
EBRU 172675
SUGG 172663
CALP 172582
NEDO 172572
PIRE 172565
OFTW 172543
PTEM 172538
NUAL 172485
PLIE 172481
SANT 172475
EDDE 172473
AMAG 172467
OMEC 172350
RTON 172334
TMAK 172333
CTOB 172308
NDDO 172285
WASW 172188
ORRO 172151
ERLO 172143
INAB 171966
EALW 171905
VERM 171902
AIDS 171897
YRES 171867
SERS 171863
RSTS 171793
RCED 171726
INAF 171626
ETIR 171593
UPAN 171588
HADS 171579
ATEV 171577
VEDO 171519
TDOE 171466
BEAC 171360
ESUN 171334
THIT 171181
ALAC 171177
URDE 171128
CHOL 171055
EFIT 171011
ISLO 170960
TENE 170921
SHIR 170827
GESA 170786
SOLI 170784
UGHI 170763
TOAD 170755
TSAI 170671
NCEM 170646
ALLF 170627
CHAE 170579
FREN 170541
OCIE 170511
CEIS 170508
TEXA 170497
VESI 170456
CIET 170412
DEGR 170326
FLOW 170315
SSAR 170298
SSEL 170287
DOMI 170287
NDEA 170276
AREH 170234
CUSE 170221
WHOM 170146
ISWO 170100
HASC 170093
ICIT 170079
DANE 170079
WORS 170043
FORL 170030
OVES 170025
LAYO 170025
RVIE 169912
ISLE 169877
NPER 169869
EMAY 169798
NMOR 169796
ONSS 169784
TMAR 169753
EPAI 169721
RHAS 169647
MSOF 169644
RSFO 169625
CCEP 169546
MSAN 169524
MBLE 169480
EREE 169454
ISUN 169418
ENEA 169383
INVI 169358
YSIC 169355
ARYT 169293
GINN 169285
OGIC 169261
TLYA 169195
THSO 169124
ISWH 169077
HMAN 169060
ENET 168967
WISH 168958
ETAK 168956
ALSI 168893
EDRO 168886
EETS 168856
TEFO 168842
CYCL 168834
LSOT 168828
PHOT 168809
PICT 168782
IPAT 168754
YAFT 168613
YSHE 168555
NDYO 168516
TOFR 168453
OSTL 168443
TWAR 168432
UPIN 168409
RSTE 168406
EIRA 168393
ROBE 168373
RSOM 168361
FEND 168343
EBEA 168319
OWTO 168298
GOTH 168285
MWIT 168189
UHAV 168153
ESSC 168081
FILE 168066
SEET 168063
HEVA 168060
TURI 168003
EBEG 167959
OMEF 167951
TWER 167860
ENJO 167846
DNES 167785
SAMA 167674
SINH 167637
UPPL 167633
RALO 167625
ESUS 167604
MSTO 167569
EDLI 167543
NSEA 167531
YSTO 167483
MENA 167428
DEAS 167392
SHOO 167313
OKEE 167268
ESUB 167183
ERLY 167153
STTI 167140
OCHA 167055
POND 167019
EEMS 166989
IREM 166953
BUTN 166923
DINF 166900
NTMA 166834
EERS 166832
HOOD 166831
TEDL 166800
CKTH 166765
ANYC 166731
STEE 166729
EDPO 166671
OHAD 166615
ICEI 166577
KSON 166569
HENR 166552
WASG 166531
NGPA 166471
HANK 166471
JUDG 166465
NFRA 166459
LART 166455
TRYT 166453
CTOF 166439
ITHL 166412
EBUS 166402
CAPE 166391
TPRE 166361
WHOI 166328
AMAR 166260
CART 166237
ERUS 166227
EADD 166207
IECE 166199
NSEN 166197
PERH 166164
ERTS 166105
IESS 166100
ASAF 166090
XPLO 166036
EFUN 166023
OHNS 165929
CILI 165927
RUPT 165906
GAGE 165896
ERFU 165888
ERAD 165861
ERAI 165839
BURN 165827
DCAR 165824
IGHB 165813
RTNE 165735
LTON 165632
MITH 165630
ANWA 165589
ESUM 165578
DESA 165574
REBU 165546
ADIA 165546
RUSH 165538
SACC 165482
AGEI 165368
CAPA 165349
DOCT 165291
ROWT 165284
ANSH 165260
ONBU 165206
CEMB 165169
VEMB 165133
INSH 165123
NUED 165102
LCHA 165098
RDTH 165085
REAB 165063
EYAN 165027
ASSH 164990
IREL 164950
ORUN 164949
SESI 164868
RNOR 164867
CEED 164832
MISE 164823
XPLA 164816
YCHA 164804
USPE 164784
ROAC 164780
ARMA 164769
NAPR 164760
SSUP 164709
NASS 164643
ATIE 164623
UNDO 164621
ALDI 164549
LYWI 164515
OREH 164512
BROU 164484
NESI 164481
ORLE 164456
DECO 164437
TJUS 164388
NTSF 164345
DCOU 164336
SUSP 164287
DTOL 164270
EAWA 164243
CEDE 164207
DSPE 164196
ESEL 164180
LLYR 164170
TOFP 164091
OROU 164049
FANS 163869
EDME 163843
ASLO 163837
GSAN 163825
NEER 163824
ANCA 163812
CEWI 163805
ORSI 163784
ESSW 163751
EISL 163733
ETEN 163727
ETTY 163723
TOMI 163712
RTSO 163646
BROK 163570
PEED 163547
PLEI 163509
RDOF 163464
NOTC 163436
ADIO 163427
ELYA 163411
LOND 163312
TSPR 163301
NCEC 163290
NDES 163211
ITCA 163211
LOWT 163208
REIT 163177
OLAR 163104
AYFO 163038
IVEM 163030
NSOU 162984
ITSI 162963
EHOM 162936
SPAN 162904
REBO 162882
MEWI 162857
URNS 162834
IVEB 162763
NADI 162759
DTOO 162747
GTOS 162737
OLID 162736
SEDF 162677
EALA 162676
BLOO 162639
LPLA 162527
SMIS 162474
PROA 162455
HEAG 162360
DDIN 162287
RLES 162283
DETA 162205
VENE 162177
MANO 162173
ONEM 162115
QUOS 162111
MPLA 162083
EENP 162070
EFIE 162068
NSWH 162034
IGHL 161966
RISK 161963
LSOB 161936
UTAL 161903
EGOI 161812
NBEC 161798
KSTO 161789
LUEN 161784
REFI 161779
CHEL 161739
TWOS 161708
ADVE 161658
DTOF 161625
GCOM 161578
MONI 161551
YMAN 161500
NDBR 161498
WEIG 161491
EHAR 161465
RISA 161409
HASP 161389
SBAS 161334
ROMM 161313
MINO 161310
CATH 161306
OTOR 161272
BERG 161231
OYAL 161200
NERO 161163
GHBO 161152
CEDI 161127
ERPL 161103
HATN 161100
INIA 161082
OSAN 161011
EDOW 160956
NGCH 160933
IPPE 160933
EDOE 160872
NDUC 160836
NTOC 160824
USSE 160732
ALCH 160708
ILLR 160654
AZIN 160630
EVEA 160611
EARB 160593
ATEP 160586
TOIT 160583
OSEN 160580
KIDS 160570
ERSL 160554
NNOV 160535
AWIN 160525
DUAT 160458
YSIN 160444
AVEM 160368
OFME 160327
ECIF 160287
POKE 160214
OWNF 160208
URVI 160203
SURP 160179
NTOH 160169
ENYO 160168
OTIC 160156
ALKE 160139
AKEI 160083
NTES 159963
YPEO 159962
EIDE 159953
ROMC 159872
OALS 159859
GANT 159855
BULL 159780
ILEA 159733
NFLU 159730
STOU 159727
CECO 159721
ERTR 159720
ITOF 159692
NMAY 159664
HEGU 159656
FLUE 159646
EWEL 159634
HORS 159623
LINK 159622
REFR 159615
EMAS 159600
ORKA 159597
IGIO 159544
ROFF 159513
OWST 159476
PAIR 159439
EAIR 159427
BLIN 159370
SBAC 159346
BOUR 159307
HIRE 159279
ATRO 159188
ANMA 159143
ITHW 159138
TSMA 159059
HATG 159055
RBAC 159032
VELS 159026
HENW 159017
PIEC 159013
LTHI 159012
DRED 159006
AIDA 159003
MWAS 158963
LYSE 158918
DELA 158889
SALA 158852
HTHI 158844
LIED 158840
LESC 158799
RFUL 158768
TWAN 158679
RYCO 158667
ETTL 158636
TRUE 158627
VELI 158542
ILLP 158535
LETS 158510
LLIE 158464
BEAN 158459
ESWA 158444
NALY 158417
STIA 158386
OTER 158348
NACT 158314
REYO 158265
HASH 158261
SAGR 158242
REEA 158151
TWOO 158120
ITEM 158092
TTOP 158034
RECR 158008
GWAS 157993
DLIK 157951
TOBR 157925
LMAN 157894
SWIN 157876
RWAY 157866
TSAS 157749
ULDE 157743
ARAS 157726
GGER 157709
ROMB 157706
THHE 157683
LAME 157667
DAGA 157656
UALS 157534
ESTW 157504
ESES 157503
EOLD 157494
ISNT 157379
NYEA 157359
NOWL 157335
ICSA 157314
LPAR 157299
BEHA 157291
EHIC 157283
TMON 157254
CHNI 157174
INEW 157147
KETO 157110
CRIP 157093
ESTL 157079
HENY 157058
SEMI 157041
RSDA 156971
ISDI 156961
ORTW 156959
ASGO 156935
IRTH 156902
YINC 156808
EAMI 156807
HICL 156782
HARM 156751
LESH 156714
GHIM 156592
ACEI 156531
USHE 156475
GCON 156423
TILT 156367
LLON 156323
CHIT 156308
FCOU 156288
CRAF 156277
HUND 156267
EHOW 156265
EATR 156259
TGET 156249
HOOT 156189
OINE 156182
OUTB 156146
TRUS 156126
TORM 156063
MANE 155973
TUDY 155942
TORT 155942
XTRA 155918
ORAC 155916
PISO 155915
NOUR 155891
ITHN 155871
OGRE 155865
GOTO 155796
ERYE 155742
ATOF 155692
CHEM 155683
NAFT 155563
CHTO 155546
OFLO 155534
HURS 155527
SALI 155519
VIRO 155517
AWHI 155509
SOFI 155446
PAGE 155415
EWON 155349
EPAT 155311
LINC 155262
SLAS 155259
ONNO 155254
EATM 155249
ESUC 155232
JAME 155230
EDCA 155196
ATMO 155120
PEDI 155109
NGSU 155095
NTLE 155089
GSTO 155044
FLOR 155038
NTEE 155016
NFAC 155004
PLEM 154989
ICEN 154972
HANO 154901
STLI 154883
EDAP 154883
WNIN 154881
AFFE 154862
TTEE 154798
TIAT 154696
NDUN 154694
ESEP 154663
TTOD 154661
OSEP 154660
WAYF 154646
OFHO 154637
OKNO 154613
NDPL 154608
BOVE 154606
ESWO 154526
LYMA 154519
PPLE 154487
INME 154462
EROA 154459
MOME 154456
NDRI 154446
ASEN 154440
NANY 154309
MAIL 154309
OUTM 154288
COGN 154265
ETRU 154239
ESMO 154234
ENMA 154228
CHOI 154196
AVEC 154180
OMAR 154174
OFRO 154151
NDBU 154125
SCHI 154105
NCEH 154098
IRCU 154066
IESF 154058
ISBA 154048
TLYT 154018
DFIN 154012
NGME 153970
NALE 153905
YHIS 153895
CEDB 153894
OSEL 153874
ASMO 153846
ELFA 153838
EBOT 153837
AYSO 153812
IRAN 153809
UTNO 153800
PAUL 153676
ACHT 153647
ALPO 153646
ACAD 153526
ANNU 153493
TROY 153426
OREN 153414
ELAW 153392
CHCO 153360
APRE 153308
RIVI 153307
ALBA 153296
ARTN 153289
NHEW 153271
TARG 153200
ARSE 153168
SEMB 153062
ISOD 153040
PREA 153015
NESD 153003
LDWA 152995
NATH 152963
KWIT 152961
HANE 152932
OREG 152886
SCOL 152863
NSPI 152841
TOWE 152798
ETST 152790
LLYH 152788
IONL 152710
AMMA 152708
OURF 152658
TNER 152646
CTRI 152630
FORU 152629
SDEA 152576
ELIM 152567
ONMO 152549
EBOA 152535
SINO 152474
OGNI 152454
ORAD 152444
RELO 152432
TOFM 152419
PATE 152387
VERO 152385
ELEF 152351
DEEP 152347
LEIS 152248
ERIV 152217
ELPE 152209
HITT 152185
ELIT 152168
ILIE 152137
NTOM 152120
INGV 152113
ABOV 152104
AINC 152091
INLO 152087
ETEC 152065
YDIS 152042
ATAS 152018
EDIR 152014
NFIR 151951
SOBE 151907
ONSB 151750
EINH 151707
TSFR 151683
LBEA 151650
INKS 151645
DSER 151640
SHEC 151595
LOFF 151594
ERBR 151582
LSOR 151478
NGLO 151473
ENGA 151433
ELDE 151427
OFTR 151386
ARYO 151363
EXPA 151305
TWOM 151247
REWO 151229
ENWI 151193
EDOR 151189
RBAN 151170
NEWE 151149
RSCH 151143
ONEP 151138
AYSH 151096
GIAN 151076
RALP 150982
ORPR 150966
HEJO 150925
RSTP 150911
MPLY 150879
ENWE 150847
YTHR 150820
TWHA 150811
ACCU 150802
DOLL 150750
PRED 150676
PATH 150651
GOES 150634
NGOV 150627
RSAG 150562
HADN 150533
SBOR 150518
ECHE 150398
NEDF 150396
VESE 150355
DEAR 150320
ESAC 150240
SOFO 150229
SMIL 150225
GHTF 150206
EARR 150206
OINC 150159
RRIS 150141
OFNE 150112
POTE 150082
EYCO 150047
KEAN 150045
ONAP 150041
TONC 150018
SEEI 150006
URIE 149965
LAUN 149939
SITT 149933
OOKT 149897
GHTL 149889
NHAD 149876
DALO 149863
OFBE 149835
EHES 149822
DDEN 149808
PINT 149803
IMAN 149792
SPOK 149777
ENCA 149774
ALME 149749
FUSE 149732
MICR 149706
EMPE 149684
ASEO 149683
WINS 149671
NDAD 149651
TALA 149636
NANE 149455
ELEB 149429
YLEA 149424
EAKE 149408
STWI 149360
TOFE 149350
PEDT 149313
SDEC 149187
SOFE 149180
RFIR 149127
KINS 149092
ORBE 149060
SORS 149047
RCAR 149012
TOSP 149010
EDDO 149004
ITEC 148992
ERGA 148989
RENG 148950
INBE 148923
NGOR 148900
NCIE 148900
INFI 148880
INLY 148806
BINE 148800
MOUT 148789
VEOF 148761
EBEI 148752
TOAP 148750
VELA 148748
ANEL 148738
INVA 148713
RANA 148700
RTIM 148697
FCOM 148649
UGHS 148638
HAEL 148567
ORHO 148541
NIQU 148527
PFOR 148521
EENR 148485
RSEC 148466
HEAI 148449
ALSC 148436
LYOU 148432
ARMO 148399
LLAT 148393
RAIG 148375
ISEX 148371
RNEY 148306
NOWH 148297
CKSA 148272
SERT 148271
UTAT 148250
ENCI 148238
LASH 148214
NACC 148083
MSTH 148064
TEMA 148049
EFOO 148043
EERI 148022
FEAR 147985
SKNO 147967
RACI 147963
LAWS 147915
NTWH 147843
ENNI 147616
IVEW 147608
WASU 147605
SOFD 147581
TBAC 147524
ISGO 147517
IMEO 147471
WHOC 147453
SISS 147333
MORN 147322
LERE 147238
AMOR 147231
IMPA 147181
ETBA 147154
TEAS 147117
TDOW 147099
NCEL 147073
NDGR 146981
DSHA 146955
EPTH 146909
SACH 146869
ETES 146845
OFSU 146787
SAYT 146761
ALAT 146755
ENWH 146728
HUNT 146685
ICHS 146676
SONF 146662
YWOR 146572
ISOW 146565
OBES 146478
NDTA 146461
CARS 146436
ISOR 146432
HEJU 146409
ICHC 146404
LYWO 146376
UNGE 146361
NEIS 146349
NGFI 146284
TOSO 146275
ULDT 146267
OTHO 146247
NSLA 146217
ANYM 146172
ERSR 146168
LTRA 146162
RNIA 146124
OSTC 146114
ANUM 146110
ELOO 146044
WEDT 146012
TOAT 146000
EDAG 145978
SHAL 145925
IBRA 145924
IESH 145898
ITYF 145897
NAGA 145893
DITW 145884
OFWA 145850
THWE 145838
ROFA 145813
SEME 145734
SEBA 145731
CENS 145686
STPR 145677
FAME 145675
ACEO 145650
RSES 145621
GLAS 145570
NORE 145561
INFE 145512
EDPE 145448
EHAN 145417
YPIC 145414
GLOB 145403
RTIE 145382
CTAN 145312
EMBL 145297
TUTE 145293
IGNS 145285
RVIV 145279
STPA 145204
KEST 145175
BOTT 145171
NLEA 145160
YREA 145145
NIMP 145125
STLY 145122
XPAN 145117
STWA 145101
NGDI 145045
AULT 145031
ONEL 144993
EMST 144964
WROT 144910
ARBO 144901
TILI 144879
EATL 144789
ECOG 144771
CHEN 144770
LUSI 144765
REUN 144733
ATOU 144722
DCAS 144701
CHHE 144691
ESEM 144689
EDIE 144688
THOD 144642
DDOW 144639
LEND 144596
ARON 144554
NFIN 144541
ONJU 144534
OLDA 144473
EDNO 144464
EDUR 144459
ESSS 144454
YONT 144451
DAME 144449
ALLH 144406
KEND 144396
ASIM 144343
DHAD 144330
NALM 144295
SINI 144273
TUES 144215
FLAT 144206
ALWI 144196
NCAL 144188
CHAP 144163
SKET 144141
CEON 144097
ASEI 144055
EFLE 144054
OFFR 144044
SURR 144027
TSCA 143913
OMUC 143911
DAYI 143875
NTOU 143866
GISL 143843
SAMO 143834
ORKO 143832
VENS 143829
ASBO 143783
RLYS 143762
LIFO 143726
EDOM 143724
VITY 143720
NGWO 143695
RETE 143685
EDSI 143675
TTOC 143652
ASIO 143627
OOSE 143523
LRES 143493
OUDO 143477
STMO 143429
TBET 143414
TSOU 143371
SFAT 143361
ALYS 143344
OYEA 143327
SOFB 143291
CKLE 143283
LOAD 143281
FUNC 143227
UESD 143198
SARO 143194
RWIL 143124
THSA 143116
EPEA 143115
MITS 143068
ULES 142989
OTEA 142986
WEBS 142985
ICTE 142938
SORI 142921
PTUR 142916
DANG 142893
ITSB 142886
DRUG 142881
GERO 142869
ADVI 142844
UNTS 142827
NEWC 142793
INMI 142793
AMEF 142742
URIS 142738
OURM 142713
UNNE 142699
NECE 142694
TROO 142669
EEFF 142646
CASI 142631
ROPP 142604
RALC 142595
ESSM 142595
TRIK 142591
INBO 142557
OWHA 142525
TISI 142524
STAI 142515
ICCO 142505
LELE 142398
KTHA 142391
ASKI 142375
NEMA 142323
NCAR 142307
OALL 142282
INJA 142276
EDLA 142245
IEDI 142212
ESDE 142205
TOPI 142147
IGRA 142145
TOTE 142117
SDUR 142100
TSCH 142032
ISAM 142011
DNEW 141967
SATA 141952
GTOA 141942
FEBR 141913
ASTF 141913
DWIN 141879
HASM 141845
TBEA 141835
KEDO 141818
EOFW 141812
LLYF 141802
VERL 141788
ICRO 141754
AYAT 141722
OBIL 141710
TYIS 141699
DCAN 141684
WILD 141567
ATHL 141545
AUNC 141544
DITO 141513
SESH 141494
RNOT 141479
SMUC 141457
AKEO 141450
GYOU 141419
IRMA 141359
RSFR 141357
DBAC 141325
RANO 141321
FINT 141309
RVES 141307
YOTH 141299
VALL 141299
ULDC 141298
HESW 141261
TNOW 141255
TISE 141251
HMEN 141226
EACO 141205
EPOW 141158
TDIS 141035
NNES 140992
DDRE 140978
MORA 140953
TOCR 140943
OMPR 140931
HHER 140920
OUTC 140879
ADEC 140879
NDAB 140876
CEAS 140858
DANO 140809
CANP 140794
ANKI 140769
EHEW 140754
UPWI 140734
TANE 140731
LLSE 140687
ULLE 140682
NDGE 140675
ONEB 140668
BEAB 140665
ADEL 140589
DELE 140552
VERP 140551
INHO 140548
ATSE 140539
OTRA 140534
BLEI 140479
OBAL 140462
USTS 140447
EASY 140402
OOLA 140373
LORE 140363
OMEM 140351
RYST 140306
EMAK 140294
AIRC 140288
MSIN 140266
NGYO 140176
GHTN 140156
URSD 140138
NTPR 140135
ESSP 140122
EDSA 140058
URNT 140052
ELEM 140023
OUTL 140011
OHER 140001
JOBS 139983
STUR 139970
ESTF 139955
NJOY 139949
RUAR 139936
LVER 139913
AMIS 139905
GHES 139904
HAME 139860
THTO 139854
LYSI 139839
RCIA 139732
NDAF 139660
IALT 139656
FERI 139655
IDEL 139639
OFAP 139638
NGNE 139638
RALE 139628
ALBE 139622
YPRE 139621
STAD 139592
ISER 139583
BUDG 139567
EFIG 139532
MITE 139512
SMEN 139466
NTSC 139456
PULL 139432
SDEF 139424
BUTO 139420
NANO 139401
RALT 139325
DASS 139316
ANET 139300
ACQU 139295
YPAR 139236
SSIG 139236
ARKI 139183
OWWH 139172
OTAT 139165
GANA 139112
YALL 139095
SIBI 139094
OVEL 139078
NGSW 139061
LICY 139046
OLIV 139029
ATIM 139019
NAWA 139011
NDGO 139007
RKAN 139006
BYAN 139004
BRUA 138983
ISUS 138962
FAMO 138929
ARKA 138925
REDH 138924
ANGL 138913
OODT 138880
EONA 138857
ECRO 138849
HANS 138835
LEWA 138822
LLFO 138799
TIEN 138765
RSCA 138764
HCON 138758
OURB 138749
ORAB 138731
LOTH 138709
ISME 138686
TTOG 138679
FEET 138657
RSAS 138625
REWH 138571
PACT 138566
ERMS 138566
PHAS 138514
LENC 138513
NEDW 138475
TAGA 138443
CTSA 138425
ASDI 138424
IROW 138414
IMEW 138407
LLMA 138381
NALR 138321
GERT 138314
SEHE 138289
ADEI 138286
RINK 138285
ASLI 138224
AYFR 138149
TIZE 138142
URPO 138138
OUAR 138110
VEAS 138097
SAPR 138087
ECTL 138072
SCAM 138056
SSHA 138013
SASW 137997
NGTI 137968
IRRE 137966
COAS 137931
EWEE 137930
HEHU 137907
STPO 137861
SENC 137843
WEAL 137761
KSIN 137755
NACO 137748
EBLA 137740
IPAL 137714
DTOE 137712
EKEN 137705
ESLA 137675
INGJ 137669
IALP 137654
NHEA 137650
DINH 137646
GOFF 137568
LLNO 137501
TSHI 137479
EARW 137468
EGOO 137466
XAND 137461
EVAN 137457
SOPH 137431
INPO 137391
NDSW 137356
SSOU 137331
GARE 137319
SGRE 137307
ABET 137296
RSEN 137288
TREP 137235
AMME 137230
NALB 137219
TTON 137192
LESW 137112
NSEP 137100
NGWE 137081
NTOO 137068
DCHI 137061
NREA 137023
DOFA 137022
EDHO 137002
EEDA 136952
PURC 136945
DINN 136925
ISAG 136895
POOR 136886
DIUM 136874
IVEF 136868
NGTR 136864
YTOS 136798
SERE 136793
RSER 136783
RAMM 136770
OUSS 136766
OITS 136748
LBER 136731
SOHA 136719
LYPR 136718
DFOU 136713
RTTO 136703
HIEV 136700
SOFW 136663
NDEM 136659
TORN 136627
SABL 136572
YYEA 136563
RIZE 136549
DESE 136500
TENI 136498
NEAS 136449
NCHO 136423
LINI 136420
OEST 136358
RUCK 136352
LLIT 136340
ACIL 136321
URFA 136316
ATUS 136293
SLOC 136273
SSUM 136260
SINP 136234
NICE 136227
ECAD 136215
BLEO 136191
EDEL 136171
ONAC 136149
ALLM 136108
ERIM 136100
SMUS 136082
TASA 136028
RALD 135982
ATEH 135982
EMOD 135949
OSUR 135947
STAU 135941
EIRL 135888
ASFI 135831
NALF 135810
DENS 135773
SLON 135761
VIET 135758
DEXP 135749
LLAL 135740
EBOU 135739
ROOK 135714
NUES 135706
EXPO 135703
INSC 135699
VEFO 135696
GSTA 135683
EDSH 135575
ORID 135556
EBAR 135545
HOIS 135492
ENMO 135492
ATEB 135471
VERF 135461
NTSS 135454
UTTI 135449
OFTO 135443
YSAN 135420
DBYS 135419
ASEB 135379
STAC 135310
SCLO 135303
WECA 135276
EIRR 135272
NSCH 135266
ASLA 135258
TEXP 135233
TYPI 135201
PACI 135186
RREA 135180
NNUA 135159
GSIN 135158
EXPR 135155
TMAY 135121
NCOR 135106
OREB 135103
NTOD 135086
LYWA 135070
XCEP 135066
ORPE 134992
KOUT 134986
ITRE 134955
SONB 134944
NNOR 134911
SANG 134910
RANI 134909
TOOL 134890
EWEA 134851
DULE 134844
BRAT 134834
TYFO 134821
PIRI 134807
RSMA 134805
REEX 134709
FPRO 134678
TATU 134637
NDBO 134633
GEND 134629
EEDO 134623
DSAI 134569
ERGO 134562
OFDI 134540
HAPE 134540
NTME 134516
SCUR 134464
TAFT 134458
HARR 134444
EBRE 134441
ESYS 134440
ENAB 134329
ONEF 134312
USBA 134298
STOE 134285
HTOF 134283
HBOR 134282
NDAP 134269
URAG 134256
NEWT 134255
EPHO 134234
GIVI 134219
ECRI 134187
TWHO 134152
SHIG 134088
IGNO 134057
NORA 134042
TESW 133939
ANSC 133919
APPA 133901
TEWI 133898
KESA 133854
THMA 133841
FIFT 133836
SHOM 133811
AREU 133787
ONEH 133782
CANE 133741
RHAP 133665
ARTT 133664
XPRE 133657
ICHO 133622
LORD 133559
LYWH 133532
PENA 133509
LDCO 133490
TTAK 133474
ATAM 133414
NJUN 133409
CKLY 133376
ISET 133305
SWIF 133301
DETO 133281
MAYO 133249
SGRA 133212
ARIL 133171
MEWA 133122
ATSW 133106
ELED 133087
EEXT 133053
LFIN 132964
ACIT 132960
EFLO 132938
NTEX 132911
AYOR 132906
SGIV 132903
ATAB 132893
GNAT 132849
BERI 132839
ORYE 132825
YDON 132808
NGSC 132782
CHEA 132769
ARMS 132680
NDEL 132675
ITSM 132675
SINM 132651
PEAC 132649
LPED 132632
ICIS 132629
ANOP 132612
TRET 132598
INEM 132577
EVES 132536
DUND 132503
EVET 132499
ETYO 132491
RIAT 132483
OEXP 132476
NWER 132467
ILWA 132457
ICKI 132444
OGIV 132412
REVO 132387
RALM 132381
UCHO 132376
TIND 132376
KEDI 132334
EYON 132311
INBU 132290
CARO 132286
SGRO 132276
IMTH 132215
RAEL 132212
REEL 132182
ASAG 132132
SFAM 132128
NPRI 132127
OMEE 132084
WLED 132057
MALA 132048
RCAN 131991
EWEN 131979
WAYA 131977
STCA 131975
ASTM 131970
EDPA 131939
IWOU 131924
OATT 131902
ACAR 131896
LAYA 131890
REEK 131795
TOHO 131729
CEBE 131654
HTAN 131648
SOFR 131623
HARI 131622
YYOU 131603
ONPA 131590
ICST 131572
MEFR 131552
ISHT 131532
HLET 131529
GITS 131529
OMFO 131519
ILLW 131506
FFIN 131496
ALTR 131491
ATPR 131438
MEAT 131407
OTAN 131336
OOLI 131336
NLYO 131330
NBET 131327
YSTR 131302
VERD 131282
HOWM 131247
NGEO 131236
YCLE 131215
WOND 131175
ANAP 131173
TPEO 131159
ELDA 131156
ELDS 131139
KSTH 131107
ABIG 131089
ADAM 131080
UGGL 131062
EITW 131054
LEHA 131029
ONDT 131000
ARAB 130984
ALFA 130977
TDAY 130956
YABO 130955
ASNE 130950
HEYO 130904
ETCH 130882
DTHO 130871
HPRO 130853
OWNW 130841
YWHO 130810
TRIN 130793
LEMO 130789
ITMA 130785
CRIS 130773
RDON 130762
YOFA 130731
DSHI 130669
LSOP 130619
ANSL 130586
KICK 130585
AVIS 130584
IDAN 130507
RSTI 130490
MPAC 130472
TLER 130462
AHAS 130448
SSMA 130443
ATWH 130413
SURG 130398
RVER 130392
CTST 130390
PAID 130382
SSIC 130371
EDLY 130368
ERDO 130344
YOUL 130307
TEAR 130304
YTRA 130276
HEAB 130261
ABAN 130261
SREM 130221
EVIN 130191
LISA 130188
TOFL 130185
EACE 130158
DQUA 130130
SABI 130124
THSE 130112
NGEA 130072
RILY 130044
IAMS 130039
POUN 130035
RSRE 130032
NDDA 130013
NOVA 129962
UGHH 129949
EEKE 129924
ILLF 129856
LSOI 129806
SMON 129714
AIME 129706
SRAE 129685
PEDA 129626
DALE 129585
ISSH 129577
TOON 129571
VOCA 129560
LLYP 129560
PUSH 129559
UTST 129540
RSBE 12945
Download .txt
gitextract_n3kfgpod/

├── .github/
│   └── workflows/
│       └── build.yml
├── .gitignore
├── .gitmodules
├── CMakeLists.txt
├── LICENSE
├── README.md
├── audio-logger.cpp
├── audio-logger.h
├── build-vars.h.in
├── cmake/
│   ├── BuildTypes.cmake
│   ├── FindFFTW.cmake
│   ├── GitVars.cmake
│   └── sdl2/
│       └── FindSDL2.cmake
├── common-gui.cpp
├── common-gui.h
├── common.cpp
├── common.h
├── compress-n-grams.cpp
├── constants.h
├── data/
│   ├── english_quadgrams.txt
│   ├── english_quintgrams.txt
│   ├── english_trigrams.txt
│   ├── ggwords-3-gram.dat.binary
│   ├── ggwords-4-gram.dat.binary
│   ├── ggwords-5-gram.dat.binary
│   ├── ggwords-6-gram.dat.binary
│   └── sample_quadgrams.txt
├── dr_wav.h
├── generate-clusters.cpp
├── guess-qp.cpp
├── guess-qp2.cpp
├── imconfig-vtx32.h
├── index-keytap2-gui-tmpl.html
├── index-keytap3-app-tmpl.html
├── index-keytap3-gui-tmpl.html
├── key-average-gui.cpp
├── key-detector.cpp
├── keytap-gui.cpp
├── keytap.cpp
├── keytap2-gui-old.cpp
├── keytap2-gui.cpp
├── keytap2.cpp
├── keytap3-app.cpp
├── keytap3-gui.cpp
├── keytap3-multi.cpp
├── keytap3.cpp
├── non-exact-subbreak.cpp
├── non-exact-subbreak2.cpp
├── play-full.cpp
├── play.cpp
├── record-full.cpp
├── record.cpp
├── scale.cpp
├── style.css
├── subbreak.cpp
├── subbreak.h
├── subbreak2.cpp
├── subbreak2.h
├── subbreak3.cpp
├── subbreak3.h
├── test-subbreak3.cpp
├── view-full-gui.cpp
└── view-gui.cpp
Download .txt
SYMBOL INDEX (475 symbols across 39 files)

FILE: audio-logger.cpp
  function cbAudioReady (line 16) | void cbAudioReady(void * userData, uint8_t * stream, int32_t /*nbytes*/) {
  type AudioLogger::Data (line 22) | struct AudioLogger::Data {
    method Data (line 23) | Data() : isReady(false) {

FILE: audio-logger.h
  function class (line 20) | class AudioLogger {

FILE: common-gui.cpp
  type Gui (line 26) | namespace Gui {
    function init (line 28) | bool init(const char * windowTitle, int windowSizeX, int windowSizeY, ...
    function render (line 159) | bool render(const Objects & objects) {
    function free (line 171) | bool free(const Objects & objects) {

FILE: common-gui.h
  function namespace (line 11) | namespace Gui {

FILE: common.cpp
  function readWaveform (line 30) | bool readWaveform(std::ifstream & fin, TWaveformT<TSample> & res, int32_...
  function frand (line 49) | float frand() { return ((float)rand())*iRAND_MAX; }
  function frandGaussian (line 51) | float frandGaussian(float mu, float sigma) {
  function t_ms (line 72) | uint64_t t_ms() {
  function parseCmdArguments (line 76) | std::map<std::string, std::string> parseCmdArguments(int argc, char ** a...
  function convert (line 91) | bool convert(const TWaveformT<TSampleSrc> & src, TWaveformT<TSampleDst> ...
  function filter (line 109) | void filter(TWaveformT<TSample> & waveform, EAudioFilter filterId, float...
  function calcAbsMax (line 142) | double calcAbsMax(const TWaveformT<TSample> & waveform) {
  function saveToFile (line 152) | bool saveToFile(const std::string & fname, TWaveformT<TSample> & wavefor...
  function readFromFile (line 173) | bool readFromFile(const std::string & fname, TWaveformT<TSample> & res) {
  function readFromFile (line 201) | bool readFromFile(const std::string & fname, TWaveformT<TSample> & res, ...
  function TFilterCoefficients (line 245) | TFilterCoefficients calculateCoefficientsFirstOrderHighPass(int fc, int ...
  function TFilterCoefficients (line 259) | TFilterCoefficients calculateCoefficientsSecondOrderButterworthHighPass(...
  function TSampleF (line 272) | TSampleF filterFirstOrderHighPass(TFilterCoefficients & coefficients, TS...
  function TSampleF (line 286) | TSampleF filterSecondOrderButterworthHighPass(TFilterCoefficients & coef...
  function calcSum (line 304) | std::tuple<double, double> calcSum(const TKeyWaveformF & waveform, int i...
  function calcSum (line 317) | std::tuple<int64_t, int64_t> calcSum(const TWaveformViewT<TSampleMI16> &...
  function calcSum (line 336) | std::tuple<int64_t, int64_t> calcSum(const TWaveformViewT<T> & waveform) {
  function TValueCC (line 360) | TValueCC calcCC(
  function TValueCC (line 399) | TValueCC calcCC(
  function TValueCC (line 446) | TValueCC calcCC(
  function findBestCC (line 499) | std::tuple<TValueCC, TOffset> findBestCC(
  function findBestCC (line 548) | std::tuple<TValueCC, TOffset> findBestCC(
  function calculateSimilartyMap (line 594) | bool calculateSimilartyMap(
  function calculateSimilartyMap (line 662) | bool calculateSimilartyMap(
  function findKeyPresses (line 741) | bool findKeyPresses(
  function findKeyPresses (line 851) | bool findKeyPresses(
  function saveKeyPresses (line 971) | bool saveKeyPresses(const std::string & fname, const TKeyPressCollection...
  function loadKeyPresses (line 986) | bool loadKeyPresses(const std::string & fname, const TWaveformViewT<T> &...
  function dumpKeyPresses (line 1005) | bool dumpKeyPresses(const std::string & fname, const TKeyPressCollection...
  function cbPlayback (line 1017) | void cbPlayback(void * userData, uint8_t * stream, int len) {
  function generateLowResWaveform (line 1058) | bool generateLowResWaveform(const TWaveformViewT<T> & waveform, TWavefor...
  function adjustKeyPresses (line 1101) | bool adjustKeyPresses(TKeyPressCollectionT<T> & keyPresses, TSimilarityM...
  function removeLowSimilarityKeys (line 1157) | bool removeLowSimilarityKeys(TKeyPressCollectionT<T> & keyPresses, TSimi...

FILE: common.h
  type stMatch (line 16) | struct stMatch
  type EAudioFilter (line 71) | enum EAudioFilter {
  type stMatch (line 78) | struct stMatch {
  type TFilterCoefficients (line 120) | struct TFilterCoefficients {

FILE: compress-n-grams.cpp
  function main (line 3) | int main(int argc, char ** argv) {

FILE: constants.h
  function ceil_const (line 25) | static constexpr int32_t ceil_const(float num) {
  function getBufferSize_frames (line 32) | static constexpr int32_t getBufferSize_frames(int64_t sampleRate, float ...

FILE: dr_wav.h
  type drwav_int8 (line 153) | typedef   signed char           drwav_int8;
  type drwav_uint8 (line 154) | typedef unsigned char           drwav_uint8;
  type drwav_int16 (line 155) | typedef   signed short          drwav_int16;
  type drwav_uint16 (line 156) | typedef unsigned short          drwav_uint16;
  type drwav_int32 (line 157) | typedef   signed int            drwav_int32;
  type drwav_uint32 (line 158) | typedef unsigned int            drwav_uint32;
  type drwav_int64 (line 160) | typedef   signed __int64    drwav_int64;
  type drwav_uint64 (line 161) | typedef unsigned __int64    drwav_uint64;
  type drwav_int64 (line 170) | typedef   signed long long  drwav_int64;
  type drwav_uint64 (line 171) | typedef unsigned long long  drwav_uint64;
  type drwav_uint64 (line 177) | typedef drwav_uint64        drwav_uintptr;
  type drwav_uint32 (line 179) | typedef drwav_uint32        drwav_uintptr;
  type drwav_uint8 (line 181) | typedef drwav_uint8             drwav_bool8;
  type drwav_uint32 (line 182) | typedef drwav_uint32            drwav_bool32;
  type drwav_int32 (line 216) | typedef drwav_int32 drwav_result;
  type drwav_seek_origin (line 292) | typedef enum
  type drwav_container (line 298) | typedef enum
  type drwav_chunk_header (line 305) | typedef struct
  type drwav_fmt (line 323) | typedef struct
  type drwav_bool32 (line 405) | typedef drwav_bool32 (* drwav_seek_proc)(void* pUserData, int offset, dr...
  type drwav_uint64 (line 431) | typedef drwav_uint64 (* drwav_chunk_proc)(void* pChunkUserData, drwav_re...
  type drwav_allocation_callbacks (line 433) | typedef struct
  type drwav__memory_stream (line 442) | typedef struct
  type drwav__memory_stream_write (line 450) | typedef struct
  type drwav_data_format (line 459) | typedef struct
  type drwav_smpl_loop (line 470) | typedef struct
  type drwav_smpl (line 480) | typedef struct
  type drwav (line 494) | typedef struct
  function DRWAV_API (line 1066) | DRWAV_API void drwav_version(drwav_uint32* pMajor, drwav_uint32* pMinor,...
  function DRWAV_API (line 1081) | DRWAV_API const char* drwav_version_string(void)
  function DRWAV_INLINE (line 1108) | static DRWAV_INLINE drwav_bool32 drwav__guid_equal(const drwav_uint8 a[1...
  function DRWAV_INLINE (line 1120) | static DRWAV_INLINE drwav_bool32 drwav__fourcc_equal(const drwav_uint8* ...
  function DRWAV_INLINE (line 1131) | static DRWAV_INLINE int drwav__is_little_endian(void)
  function DRWAV_INLINE (line 1143) | static DRWAV_INLINE drwav_uint16 drwav__bytes_to_u16(const drwav_uint8* ...
  function DRWAV_INLINE (line 1148) | static DRWAV_INLINE drwav_int16 drwav__bytes_to_s16(const drwav_uint8* d...
  function DRWAV_INLINE (line 1153) | static DRWAV_INLINE drwav_uint32 drwav__bytes_to_u32(const drwav_uint8* ...
  function DRWAV_INLINE (line 1158) | static DRWAV_INLINE drwav_int32 drwav__bytes_to_s32(const drwav_uint8* d...
  function DRWAV_INLINE (line 1163) | static DRWAV_INLINE drwav_uint64 drwav__bytes_to_u64(const drwav_uint8* ...
  function DRWAV_INLINE (line 1170) | static DRWAV_INLINE drwav_int64 drwav__bytes_to_s64(const drwav_uint8* d...
  function DRWAV_INLINE (line 1175) | static DRWAV_INLINE void drwav__bytes_to_guid(const drwav_uint8* data, d...
  function DRWAV_INLINE (line 1184) | static DRWAV_INLINE drwav_uint16 drwav__bswap16(drwav_uint16 n)
  function DRWAV_INLINE (line 1231) | static DRWAV_INLINE drwav_uint64 drwav__bswap64(drwav_uint64 n)
  function DRWAV_INLINE (line 1255) | static DRWAV_INLINE drwav_int16 drwav__bswap_s16(drwav_int16 n)
  function DRWAV_INLINE (line 1260) | static DRWAV_INLINE void drwav__bswap_samples_s16(drwav_int16* pSamples,...
  function DRWAV_INLINE (line 1269) | static DRWAV_INLINE void drwav__bswap_s24(drwav_uint8* p)
  function DRWAV_INLINE (line 1277) | static DRWAV_INLINE void drwav__bswap_samples_s24(drwav_uint8* pSamples,...
  function DRWAV_INLINE (line 1287) | static DRWAV_INLINE drwav_int32 drwav__bswap_s32(drwav_int32 n)
  function DRWAV_INLINE (line 1292) | static DRWAV_INLINE void drwav__bswap_samples_s32(drwav_int32* pSamples,...
  function DRWAV_INLINE (line 1301) | static DRWAV_INLINE float drwav__bswap_f32(float n)
  function DRWAV_INLINE (line 1313) | static DRWAV_INLINE void drwav__bswap_samples_f32(float* pSamples, drwav...
  function DRWAV_INLINE (line 1322) | static DRWAV_INLINE double drwav__bswap_f64(double n)
  function DRWAV_INLINE (line 1334) | static DRWAV_INLINE void drwav__bswap_samples_f64(double* pSamples, drwa...
  function DRWAV_INLINE (line 1343) | static DRWAV_INLINE void drwav__bswap_samples_pcm(void* pSamples, drwav_...
  function DRWAV_INLINE (line 1368) | static DRWAV_INLINE void drwav__bswap_samples_ieee(void* pSamples, drwav...
  function DRWAV_INLINE (line 1394) | static DRWAV_INLINE void drwav__bswap_samples(void* pSamples, drwav_uint...
  function drwav__free_default (line 1437) | static void drwav__free_default(void* p, void* pUserData)
  function drwav__free_from_callbacks (line 1492) | static void drwav__free_from_callbacks(void* p, const drwav_allocation_c...
  function drwav_allocation_callbacks (line 1504) | static drwav_allocation_callbacks drwav_copy_allocation_callbacks_or_def...
  function DRWAV_INLINE (line 1521) | static DRWAV_INLINE drwav_bool32 drwav__is_compressed_format_tag(drwav_u...
  function drwav__chunk_padding_size_riff (line 1528) | static unsigned int drwav__chunk_padding_size_riff(drwav_uint64 chunkSize)
  function drwav__chunk_padding_size_w64 (line 1533) | static unsigned int drwav__chunk_padding_size_w64(drwav_uint64 chunkSize)
  function drwav_result (line 1542) | static drwav_result drwav__read_chunk_header(drwav_read_proc onRead, voi...
  function drwav_bool32 (line 1577) | static drwav_bool32 drwav__seek_forward(drwav_seek_proc onSeek, drwav_ui...
  function drwav_bool32 (line 1597) | static drwav_bool32 drwav__seek_from_start(drwav_seek_proc onSeek, drwav...
  function drwav_bool32 (line 1625) | static drwav_bool32 drwav__read_fmt(drwav_read_proc onRead, drwav_seek_p...
  function drwav__on_read (line 1735) | static size_t drwav__on_read(drwav_read_proc onRead, void* pUserData, vo...
  function drwav_bool32 (line 1748) | static drwav_bool32 drwav__on_seek(drwav_seek_proc onSeek, void* pUserDa...
  function drwav_uint32 (line 1769) | static drwav_uint32 drwav_get_bytes_per_pcm_frame(drwav* pWav)
  function DRWAV_API (line 1783) | DRWAV_API drwav_uint16 drwav_fmt_get_format(const drwav_fmt* pFMT)
  function drwav_bool32 (line 1796) | static drwav_bool32 drwav_preinit(drwav* pWav, drwav_read_proc onRead, d...
  function drwav_bool32 (line 1815) | static drwav_bool32 drwav_init__internal(drwav* pWav, drwav_chunk_proc o...
  function DRWAV_API (line 2239) | DRWAV_API drwav_bool32 drwav_init(drwav* pWav, drwav_read_proc onRead, d...
  function DRWAV_API (line 2244) | DRWAV_API drwav_bool32 drwav_init_ex(drwav* pWav, drwav_read_proc onRead...
  function drwav_uint32 (line 2254) | static drwav_uint32 drwav__riff_chunk_size_riff(drwav_uint64 dataChunkSize)
  function drwav_uint32 (line 2264) | static drwav_uint32 drwav__data_chunk_size_riff(drwav_uint64 dataChunkSize)
  function drwav_uint64 (line 2273) | static drwav_uint64 drwav__riff_chunk_size_w64(drwav_uint64 dataChunkSize)
  function drwav_uint64 (line 2280) | static drwav_uint64 drwav__data_chunk_size_w64(drwav_uint64 dataChunkSize)
  function drwav_uint64 (line 2285) | static drwav_uint64 drwav__riff_chunk_size_rf64(drwav_uint64 dataChunkSize)
  function drwav_uint64 (line 2295) | static drwav_uint64 drwav__data_chunk_size_rf64(drwav_uint64 dataChunkSize)
  function drwav__write (line 2301) | static size_t drwav__write(drwav* pWav, const void* pData, size_t dataSize)
  function drwav__write_u16ne_to_le (line 2310) | static size_t drwav__write_u16ne_to_le(drwav* pWav, drwav_uint16 value)
  function drwav__write_u32ne_to_le (line 2322) | static size_t drwav__write_u32ne_to_le(drwav* pWav, drwav_uint32 value)
  function drwav__write_u64ne_to_le (line 2334) | static size_t drwav__write_u64ne_to_le(drwav* pWav, drwav_uint64 value)
  function drwav_bool32 (line 2347) | static drwav_bool32 drwav_preinit_write(drwav* pWav, const drwav_data_fo...
  function drwav_bool32 (line 2387) | static drwav_bool32 drwav_init_write__internal(drwav* pWav, const drwav_...
  function DRWAV_API (line 2501) | DRWAV_API drwav_bool32 drwav_init_write(drwav* pWav, const drwav_data_fo...
  function DRWAV_API (line 2510) | DRWAV_API drwav_bool32 drwav_init_write_sequential(drwav* pWav, const dr...
  function DRWAV_API (line 2519) | DRWAV_API drwav_bool32 drwav_init_write_sequential_pcm_frames(drwav* pWa...
  function DRWAV_API (line 2528) | DRWAV_API drwav_uint64 drwav_target_write_size_bytes(const drwav_data_fo...
  function drwav_result (line 2554) | static drwav_result drwav_result_from_errno(int e)
  function drwav_result (line 2956) | static drwav_result drwav_fopen(FILE** ppFile, const char* pFilePath, co...
  function drwav_result (line 3016) | static drwav_result drwav_wfopen(FILE** ppFile, const wchar_t* pFilePath...
  function drwav__on_read_stdio (line 3099) | static size_t drwav__on_read_stdio(void* pUserData, void* pBufferOut, si...
  function drwav__on_write_stdio (line 3104) | static size_t drwav__on_write_stdio(void* pUserData, const void* pData, ...
  function drwav_bool32 (line 3109) | static drwav_bool32 drwav__on_seek_stdio(void* pUserData, int offset, dr...
  function DRWAV_API (line 3114) | DRWAV_API drwav_bool32 drwav_init_file(drwav* pWav, const char* filename...
  function drwav_bool32 (line 3120) | static drwav_bool32 drwav_init_file__internal_FILE(drwav* pWav, FILE* pF...
  function DRWAV_API (line 3139) | DRWAV_API drwav_bool32 drwav_init_file_ex(drwav* pWav, const char* filen...
  function DRWAV_API (line 3150) | DRWAV_API drwav_bool32 drwav_init_file_w(drwav* pWav, const wchar_t* fil...
  function DRWAV_API (line 3155) | DRWAV_API drwav_bool32 drwav_init_file_ex_w(drwav* pWav, const wchar_t* ...
  function drwav_bool32 (line 3167) | static drwav_bool32 drwav_init_file_write__internal_FILE(drwav* pWav, FI...
  function drwav_bool32 (line 3186) | static drwav_bool32 drwav_init_file_write__internal(drwav* pWav, const c...
  function drwav_bool32 (line 3197) | static drwav_bool32 drwav_init_file_write_w__internal(drwav* pWav, const...
  function DRWAV_API (line 3208) | DRWAV_API drwav_bool32 drwav_init_file_write(drwav* pWav, const char* fi...
  function DRWAV_API (line 3213) | DRWAV_API drwav_bool32 drwav_init_file_write_sequential(drwav* pWav, con...
  function DRWAV_API (line 3218) | DRWAV_API drwav_bool32 drwav_init_file_write_sequential_pcm_frames(drwav...
  function DRWAV_API (line 3227) | DRWAV_API drwav_bool32 drwav_init_file_write_w(drwav* pWav, const wchar_...
  function DRWAV_API (line 3232) | DRWAV_API drwav_bool32 drwav_init_file_write_sequential_w(drwav* pWav, c...
  function DRWAV_API (line 3237) | DRWAV_API drwav_bool32 drwav_init_file_write_sequential_pcm_frames_w(drw...
  function drwav__on_read_memory (line 3248) | static size_t drwav__on_read_memory(void* pUserData, void* pBufferOut, s...
  function drwav_bool32 (line 3269) | static drwav_bool32 drwav__on_seek_memory(void* pUserData, int offset, d...
  function drwav__on_write_memory (line 3298) | static size_t drwav__on_write_memory(void* pUserData, const void* pDataI...
  function drwav_bool32 (line 3338) | static drwav_bool32 drwav__on_seek_memory_write(void* pUserData, int off...
  function DRWAV_API (line 3367) | DRWAV_API drwav_bool32 drwav_init_memory(drwav* pWav, const void* data, ...
  function DRWAV_API (line 3372) | DRWAV_API drwav_bool32 drwav_init_memory_ex(drwav* pWav, const void* dat...
  function drwav_bool32 (line 3390) | static drwav_bool32 drwav_init_memory_write__internal(drwav* pWav, void*...
  function DRWAV_API (line 3412) | DRWAV_API drwav_bool32 drwav_init_memory_write(drwav* pWav, void** ppDat...
  function DRWAV_API (line 3417) | DRWAV_API drwav_bool32 drwav_init_memory_write_sequential(drwav* pWav, v...
  function DRWAV_API (line 3422) | DRWAV_API drwav_bool32 drwav_init_memory_write_sequential_pcm_frames(drw...
  function DRWAV_API (line 3433) | DRWAV_API drwav_result drwav_uninit(drwav* pWav)
  function DRWAV_API (line 3531) | DRWAV_API size_t drwav_read_raw(drwav* pWav, size_t bytesToRead, void* p...
  function DRWAV_API (line 3585) | DRWAV_API drwav_uint64 drwav_read_pcm_frames_le(drwav* pWav, drwav_uint6...
  function DRWAV_API (line 3621) | DRWAV_API drwav_uint64 drwav_read_pcm_frames_be(drwav* pWav, drwav_uint6...
  function DRWAV_API (line 3632) | DRWAV_API drwav_uint64 drwav_read_pcm_frames(drwav* pWav, drwav_uint64 f...
  function DRWAV_API (line 3643) | DRWAV_API drwav_bool32 drwav_seek_to_first_pcm_frame(drwav* pWav)
  function DRWAV_API (line 3670) | DRWAV_API drwav_bool32 drwav_seek_to_pcm_frame(drwav* pWav, drwav_uint64...
  function DRWAV_API (line 3774) | DRWAV_API size_t drwav_write_raw(drwav* pWav, size_t bytesToWrite, const...
  function DRWAV_API (line 3789) | DRWAV_API drwav_uint64 drwav_write_pcm_frames_le(drwav* pWav, drwav_uint...
  function DRWAV_API (line 3827) | DRWAV_API drwav_uint64 drwav_write_pcm_frames_be(drwav* pWav, drwav_uint...
  function DRWAV_API (line 3883) | DRWAV_API drwav_uint64 drwav_write_pcm_frames(drwav* pWav, drwav_uint64 ...
  function drwav_uint64 (line 3893) | static drwav_uint64 drwav_read_pcm_frames_s16__msadpcm(drwav* pWav, drwa...
  function drwav_uint64 (line 4073) | static drwav_uint64 drwav_read_pcm_frames_s16__ima(drwav* pWav, drwav_ui...
  function DRWAV_INLINE (line 4269) | static DRWAV_INLINE drwav_int16 drwav__alaw_to_s16(drwav_uint8 sampleIn)
  function DRWAV_INLINE (line 4274) | static DRWAV_INLINE drwav_int16 drwav__mulaw_to_s16(drwav_uint8 sampleIn)
  function drwav__pcm_to_s16 (line 4281) | static void drwav__pcm_to_s16(drwav_int16* pOut, const drwav_uint8* pIn,...
  function drwav__ieee_to_s16 (line 4333) | static void drwav__ieee_to_s16(drwav_int16* pOut, const drwav_uint8* pIn...
  function drwav_uint64 (line 4348) | static drwav_uint64 drwav_read_pcm_frames_s16__pcm(drwav* pWav, drwav_ui...
  function drwav_uint64 (line 4382) | static drwav_uint64 drwav_read_pcm_frames_s16__ieee(drwav* pWav, drwav_u...
  function drwav_uint64 (line 4415) | static drwav_uint64 drwav_read_pcm_frames_s16__alaw(drwav* pWav, drwav_u...
  function drwav_uint64 (line 4448) | static drwav_uint64 drwav_read_pcm_frames_s16__mulaw(drwav* pWav, drwav_...
  function DRWAV_API (line 4481) | DRWAV_API drwav_uint64 drwav_read_pcm_frames_s16(drwav* pWav, drwav_uint...
  function DRWAV_API (line 4523) | DRWAV_API drwav_uint64 drwav_read_pcm_frames_s16le(drwav* pWav, drwav_ui...
  function DRWAV_API (line 4533) | DRWAV_API drwav_uint64 drwav_read_pcm_frames_s16be(drwav* pWav, drwav_ui...
  function DRWAV_API (line 4544) | DRWAV_API void drwav_u8_to_s16(drwav_int16* pOut, const drwav_uint8* pIn...
  function DRWAV_API (line 4556) | DRWAV_API void drwav_s24_to_s16(drwav_int16* pOut, const drwav_uint8* pI...
  function DRWAV_API (line 4567) | DRWAV_API void drwav_s32_to_s16(drwav_int16* pOut, const drwav_int32* pI...
  function DRWAV_API (line 4578) | DRWAV_API void drwav_f32_to_s16(drwav_int16* pOut, const float* pIn, siz...
  function DRWAV_API (line 4593) | DRWAV_API void drwav_f64_to_s16(drwav_int16* pOut, const double* pIn, si...
  function DRWAV_API (line 4608) | DRWAV_API void drwav_alaw_to_s16(drwav_int16* pOut, const drwav_uint8* p...
  function DRWAV_API (line 4616) | DRWAV_API void drwav_mulaw_to_s16(drwav_int16* pOut, const drwav_uint8* ...
  function drwav__pcm_to_f32 (line 4626) | static void drwav__pcm_to_f32(float* pOut, const drwav_uint8* pIn, size_...
  function drwav__ieee_to_f32 (line 4675) | static void drwav__ieee_to_f32(float* pOut, const drwav_uint8* pIn, size...
  function drwav_uint64 (line 4694) | static drwav_uint64 drwav_read_pcm_frames_f32__pcm(drwav* pWav, drwav_ui...
  function drwav_uint64 (line 4722) | static drwav_uint64 drwav_read_pcm_frames_f32__msadpcm(drwav* pWav, drwa...
  function drwav_uint64 (line 4746) | static drwav_uint64 drwav_read_pcm_frames_f32__ima(drwav* pWav, drwav_ui...
  function drwav_uint64 (line 4770) | static drwav_uint64 drwav_read_pcm_frames_f32__ieee(drwav* pWav, drwav_u...
  function drwav_uint64 (line 4804) | static drwav_uint64 drwav_read_pcm_frames_f32__alaw(drwav* pWav, drwav_u...
  function drwav_uint64 (line 4831) | static drwav_uint64 drwav_read_pcm_frames_f32__mulaw(drwav* pWav, drwav_...
  function DRWAV_API (line 4859) | DRWAV_API drwav_uint64 drwav_read_pcm_frames_f32(drwav* pWav, drwav_uint...
  function DRWAV_API (line 4901) | DRWAV_API drwav_uint64 drwav_read_pcm_frames_f32le(drwav* pWav, drwav_ui...
  function DRWAV_API (line 4911) | DRWAV_API drwav_uint64 drwav_read_pcm_frames_f32be(drwav* pWav, drwav_ui...
  function DRWAV_API (line 4922) | DRWAV_API void drwav_u8_to_f32(float* pOut, const drwav_uint8* pIn, size...
  function DRWAV_API (line 4951) | DRWAV_API void drwav_s16_to_f32(float* pOut, const drwav_int16* pIn, siz...
  function DRWAV_API (line 4964) | DRWAV_API void drwav_s24_to_f32(float* pOut, const drwav_uint8* pIn, siz...
  function DRWAV_API (line 4983) | DRWAV_API void drwav_s32_to_f32(float* pOut, const drwav_int32* pIn, siz...
  function DRWAV_API (line 4995) | DRWAV_API void drwav_f64_to_f32(float* pOut, const double* pIn, size_t s...
  function DRWAV_API (line 5008) | DRWAV_API void drwav_alaw_to_f32(float* pOut, const drwav_uint8* pIn, si...
  function DRWAV_API (line 5021) | DRWAV_API void drwav_mulaw_to_f32(float* pOut, const drwav_uint8* pIn, s...
  function drwav__pcm_to_s32 (line 5036) | static void drwav__pcm_to_s32(drwav_int32* pOut, const drwav_uint8* pIn,...
  function drwav__ieee_to_s32 (line 5087) | static void drwav__ieee_to_s32(drwav_int32* pOut, const drwav_uint8* pIn...
  function drwav_uint64 (line 5103) | static drwav_uint64 drwav_read_pcm_frames_s32__pcm(drwav* pWav, drwav_ui...
  function drwav_uint64 (line 5137) | static drwav_uint64 drwav_read_pcm_frames_s32__msadpcm(drwav* pWav, drwa...
  function drwav_uint64 (line 5161) | static drwav_uint64 drwav_read_pcm_frames_s32__ima(drwav* pWav, drwav_ui...
  function drwav_uint64 (line 5185) | static drwav_uint64 drwav_read_pcm_frames_s32__ieee(drwav* pWav, drwav_u...
  function drwav_uint64 (line 5213) | static drwav_uint64 drwav_read_pcm_frames_s32__alaw(drwav* pWav, drwav_u...
  function drwav_uint64 (line 5241) | static drwav_uint64 drwav_read_pcm_frames_s32__mulaw(drwav* pWav, drwav_...
  function DRWAV_API (line 5269) | DRWAV_API drwav_uint64 drwav_read_pcm_frames_s32(drwav* pWav, drwav_uint...
  function DRWAV_API (line 5311) | DRWAV_API drwav_uint64 drwav_read_pcm_frames_s32le(drwav* pWav, drwav_ui...
  function DRWAV_API (line 5321) | DRWAV_API drwav_uint64 drwav_read_pcm_frames_s32be(drwav* pWav, drwav_ui...
  function DRWAV_API (line 5332) | DRWAV_API void drwav_u8_to_s32(drwav_int32* pOut, const drwav_uint8* pIn...
  function DRWAV_API (line 5345) | DRWAV_API void drwav_s16_to_s32(drwav_int32* pOut, const drwav_int16* pI...
  function DRWAV_API (line 5358) | DRWAV_API void drwav_s24_to_s32(drwav_int32* pOut, const drwav_uint8* pI...
  function DRWAV_API (line 5376) | DRWAV_API void drwav_f32_to_s32(drwav_int32* pOut, const float* pIn, siz...
  function DRWAV_API (line 5389) | DRWAV_API void drwav_f64_to_s32(drwav_int32* pOut, const double* pIn, si...
  function DRWAV_API (line 5402) | DRWAV_API void drwav_alaw_to_s32(drwav_int32* pOut, const drwav_uint8* p...
  function DRWAV_API (line 5415) | DRWAV_API void drwav_mulaw_to_s32(drwav_int32* pOut, const drwav_uint8* ...
  function drwav_int16 (line 5430) | static drwav_int16* drwav__read_pcm_frames_and_close_s16(drwav* pWav, un...
  function drwav_int32 (line 5514) | static drwav_int32* drwav__read_pcm_frames_and_close_s32(drwav* pWav, un...
  function DRWAV_API (line 5558) | DRWAV_API drwav_int16* drwav_open_and_read_pcm_frames_s16(drwav_read_pro...
  function DRWAV_API (line 5579) | DRWAV_API float* drwav_open_and_read_pcm_frames_f32(drwav_read_proc onRe...
  function DRWAV_API (line 5600) | DRWAV_API drwav_int32* drwav_open_and_read_pcm_frames_s32(drwav_read_pro...
  function DRWAV_API (line 5622) | DRWAV_API drwav_int16* drwav_open_file_and_read_pcm_frames_s16(const cha...
  function DRWAV_API (line 5643) | DRWAV_API float* drwav_open_file_and_read_pcm_frames_f32(const char* fil...
  function DRWAV_API (line 5664) | DRWAV_API drwav_int32* drwav_open_file_and_read_pcm_frames_s32(const cha...
  function DRWAV_API (line 5686) | DRWAV_API drwav_int16* drwav_open_file_and_read_pcm_frames_s16_w(const w...
  function DRWAV_API (line 5707) | DRWAV_API float* drwav_open_file_and_read_pcm_frames_f32_w(const wchar_t...
  function DRWAV_API (line 5728) | DRWAV_API drwav_int32* drwav_open_file_and_read_pcm_frames_s32_w(const w...
  function DRWAV_API (line 5750) | DRWAV_API drwav_int16* drwav_open_memory_and_read_pcm_frames_s16(const v...
  function DRWAV_API (line 5771) | DRWAV_API float* drwav_open_memory_and_read_pcm_frames_f32(const void* d...
  function DRWAV_API (line 5792) | DRWAV_API drwav_int32* drwav_open_memory_and_read_pcm_frames_s32(const v...
  function DRWAV_API (line 5815) | DRWAV_API void drwav_free(void* p, const drwav_allocation_callbacks* pAl...
  function DRWAV_API (line 5824) | DRWAV_API drwav_uint16 drwav_bytes_to_u16(const drwav_uint8* data)
  function DRWAV_API (line 5829) | DRWAV_API drwav_int16 drwav_bytes_to_s16(const drwav_uint8* data)
  function DRWAV_API (line 5834) | DRWAV_API drwav_uint32 drwav_bytes_to_u32(const drwav_uint8* data)
  function DRWAV_API (line 5839) | DRWAV_API drwav_int32 drwav_bytes_to_s32(const drwav_uint8* data)
  function DRWAV_API (line 5844) | DRWAV_API drwav_uint64 drwav_bytes_to_u64(const drwav_uint8* data)
  function DRWAV_API (line 5849) | DRWAV_API drwav_int64 drwav_bytes_to_s64(const drwav_uint8* data)
  function DRWAV_API (line 5855) | DRWAV_API drwav_bool32 drwav_guid_equal(const drwav_uint8 a[16], const d...
  function DRWAV_API (line 5860) | DRWAV_API drwav_bool32 drwav_fourcc_equal(const drwav_uint8* a, const ch...

FILE: generate-clusters.cpp
  function main (line 8) | int main(int argc, char ** argv) {

FILE: guess-qp.cpp
  function init (line 32) | int init() {
  function update (line 38) | void update() {
  function doInit (line 46) | int doInit() {
  function keyPressedCallback (line 50) | void keyPressedCallback(int key) {
  function getPredictedKey (line 54) | int getPredictedKey() {
  function main (line 59) | int main(int, char**) {

FILE: guess-qp2.cpp
  function init (line 33) | int init() {
  function update (line 39) | void update() {
  function doInit (line 50) | int doInit() {
  function keyPressedCallback (line 54) | void keyPressedCallback(int key) {
  function getPredictedKey (line 58) | int getPredictedKey() {
  function main (line 63) | int main(int, char**) {

FILE: key-average-gui.cpp
  function main (line 26) | int main(int argc, char ** argv) {

FILE: key-detector.cpp
  function main (line 17) | int main(int argc, char ** argv) {

FILE: keytap-gui.cpp
  type TrainStats (line 49) | struct TrainStats {
  function init (line 64) | int init() {
  function update (line 70) | void update() {
  function mainUpdate (line 76) | void mainUpdate(void *) {
  function EMSCRIPTEN_KEEPALIVE (line 82) | EMSCRIPTEN_KEEPALIVE
  function EMSCRIPTEN_KEEPALIVE (line 87) | EMSCRIPTEN_KEEPALIVE
  function main (line 93) | int main(int argc, char ** argv) {

FILE: keytap.cpp
  function init (line 33) | int init() {
  function update (line 39) | void update() {
  function mainUpdate (line 45) | void mainUpdate() {
  function doInit (line 51) | int doInit() {
  function keyPressedCallback (line 55) | void keyPressedCallback(int key) {
  function getPredictedKey (line 59) | int getPredictedKey() {
  function main (line 64) | int main(int argc, char ** argv) {

FILE: keytap2-gui-old.cpp
  type stParameters (line 31) | struct stParameters
  type Approach (line 43) | enum Approach {
  function getApproachStr (line 51) | std::string getApproachStr(Approach approach) {
  type stParameters (line 69) | struct stParameters {
  function clusterDBSCAN (line 88) | bool clusterDBSCAN(const TSimilarityMap & sim, TValueCC epsCC, int minPt...
  function clusterG (line 172) | bool clusterG(const TSimilarityMap & sim, TKeyPressCollection & keyPress...
  function adjustKeyPresses (line 306) | bool adjustKeyPresses(const TParameters & , TKeyPressCollection & keyPre...
  function plotWaveform (line 351) | float plotWaveform(void * data, int i) {
  function plotWaveformInverse (line 356) | float plotWaveformInverse(void * data, int i) {
  function renderKeyPresses (line 364) | bool renderKeyPresses(TParameters & params, const char * fnameInput, con...
  function renderSimilarity (line 647) | bool renderSimilarity(TParameters & params, TKeyPressCollection & keyPre...
  function renderClusters (line 726) | bool renderClusters(TParameters & params, const Cipher::TFreqMap & freqM...
  function renderSolution (line 878) | bool renderSolution(TParameters & params, const Cipher::TFreqMap & freqM...
  function prepareAudioOut (line 1010) | bool prepareAudioOut(const TParameters & params) {
  function main (line 1053) | int main(int argc, char ** argv) {

FILE: keytap2-gui.cpp
  function mainUpdate (line 42) | void mainUpdate(void *) {
  function EMSCRIPTEN_KEEPALIVE (line 49) | EMSCRIPTEN_KEEPALIVE
  function EMSCRIPTEN_KEEPALIVE (line 54) | EMSCRIPTEN_KEEPALIVE
  function EMSCRIPTEN_KEEPALIVE (line 59) | EMSCRIPTEN_KEEPALIVE
  function EMSCRIPTEN_KEEPALIVE (line 64) | EMSCRIPTEN_KEEPALIVE
  type stParameters (line 78) | struct stParameters
    method nProcessors (line 104) | int32_t nProcessors() const {
    method valueForProcessorClusters (line 108) | int32_t valueForProcessorClusters(int idx) const {
    method valueForProcessorPNonAlphabetic (line 112) | float valueForProcessorPNonAlphabetic(int idx) const {
    method valueForProcessorWEnglishFreq (line 116) | float valueForProcessorWEnglishFreq(int idx) const {
  type stParameters (line 93) | struct stParameters {
    method nProcessors (line 104) | int32_t nProcessors() const {
    method valueForProcessorClusters (line 108) | int32_t valueForProcessorClusters(int idx) const {
    method valueForProcessorPNonAlphabetic (line 112) | float valueForProcessorPNonAlphabetic(int idx) const {
    method valueForProcessorWEnglishFreq (line 116) | float valueForProcessorWEnglishFreq(int idx) const {
  type stStateUI (line 123) | struct stStateUI {
    type Flags (line 126) | struct Flags {
      method clear (line 134) | void clear() { memset(this, 0, sizeof(Flags)); }
    type ProcessorResults (line 192) | struct ProcessorResults : std::vector<Cipher::TResult> {
  type stStateCore (line 199) | struct stStateCore {
    type Flags (line 200) | struct Flags {
      method clear (line 205) | void clear() { memset(this, 0, sizeof(Flags)); }
  type stStateCapture (line 218) | struct stStateCapture {
    type Flags (line 219) | struct Flags {
      method clear (line 222) | void clear() { memset(this, 0, sizeof(Flags)); }
  type TripleBuffer (line 229) | struct TripleBuffer : public T {
    method update (line 230) | bool update(bool force = false) {
    method changed (line 238) | bool changed() {
    method T (line 243) | const T & get() {
  function stStateCapture (line 318) | const stStateCapture & TripleBuffer<stStateCapture>::get() {
    type Flags (line 219) | struct Flags {
      method clear (line 222) | void clear() { memset(this, 0, sizeof(Flags)); }
  function plotWaveform (line 355) | float plotWaveform(void * data, int i) {
  function plotWaveformInverse (line 360) | float plotWaveformInverse(void * data, int i) {
  function renderKeyPresses (line 365) | bool renderKeyPresses(stStateUI & stateUI, const TWaveform & waveform, T...
  function renderResults (line 737) | bool renderResults(stStateUI & stateUI) {
  function renderSimilarity (line 1117) | bool renderSimilarity(const TKeyPressCollection & keyPresses, const TSim...
  function prepareAudioOut (line 1196) | bool prepareAudioOut(const TParameters & params) {
  function main (line 1244) | int main(int argc, char ** argv) {

FILE: keytap2.cpp
  function clusterDBSCAN (line 24) | bool clusterDBSCAN(const TSimilarityMap & sim, TValueCC epsCC, int minPt...
  function clusterSimple (line 74) | bool clusterSimple(const TSimilarityMap & sim, TValueCC tholdCC, TKeyPre...
  function clusterG (line 149) | bool clusterG(const TSimilarityMap & sim, TKeyPressCollection & keyPress...
  function clusterG2 (line 262) | bool clusterG2(TSimilarityMap & sim, TKeyPressCollection & keyPresses) {
  function main (line 330) | int main(int argc, char ** argv) {

FILE: keytap3-app.cpp
  type StateIdle (line 43) | struct StateIdle {
  type StateRecording (line 46) | struct StateRecording {
    method init (line 74) | bool init() {
    method update (line 137) | void update() {
    method updateWorker (line 146) | void updateWorker(std::string & dataOutput, float tElapsed_s) {
  type StateDecoding (line 208) | struct StateDecoding {
  type State (line 215) | struct State {
    type EState (line 216) | enum EState {
    method init (line 234) | void init() {
    method deinit (line 237) | void deinit() {
  type AppInterface (line 247) | struct AppInterface {
  function mainLoop (line 260) | void mainLoop(void *) {
  function EMSCRIPTEN_BINDINGS (line 271) | EMSCRIPTEN_BINDINGS(ggweb) {
  function main (line 622) | int main(int argc, char ** argv) {

FILE: keytap3-gui.cpp
  function mainUpdate (line 37) | void mainUpdate(void *) {
  function EMSCRIPTEN_KEEPALIVE (line 44) | EMSCRIPTEN_KEEPALIVE
  function EMSCRIPTEN_KEEPALIVE (line 49) | EMSCRIPTEN_KEEPALIVE
  function EMSCRIPTEN_KEEPALIVE (line 54) | EMSCRIPTEN_KEEPALIVE
  function EMSCRIPTEN_KEEPALIVE (line 59) | EMSCRIPTEN_KEEPALIVE
  type stParameters (line 73) | struct stParameters
    method nProcessors (line 101) | int32_t nProcessors() const {
    method valueForProcessorClusters (line 105) | int32_t valueForProcessorClusters(int idx) const {
    method valueForProcessorFSpread (line 109) | float valueForProcessorFSpread(int idx) const {
  type stParameters (line 88) | struct stParameters {
    method nProcessors (line 101) | int32_t nProcessors() const {
    method valueForProcessorClusters (line 105) | int32_t valueForProcessorClusters(int idx) const {
    method valueForProcessorFSpread (line 109) | float valueForProcessorFSpread(int idx) const {
  type stStateUI (line 116) | struct stStateUI {
    type Flags (line 119) | struct Flags {
      method clear (line 126) | void clear() { memset(this, 0, sizeof(Flags)); }
    type ProcessorResults (line 185) | struct ProcessorResults : std::vector<Cipher::TResult> {
  type stStateCore (line 192) | struct stStateCore {
    type Flags (line 193) | struct Flags {
      method clear (line 198) | void clear() { memset(this, 0, sizeof(Flags)); }
  type stStateCapture (line 211) | struct stStateCapture {
    type Flags (line 212) | struct Flags {
      method clear (line 215) | void clear() { memset(this, 0, sizeof(Flags)); }
  type TripleBuffer (line 222) | struct TripleBuffer : public T {
    method update (line 223) | bool update(bool force = false) {
    method changed (line 231) | bool changed() {
    method T (line 236) | const T & get() {
  function stStateCapture (line 307) | const stStateCapture & TripleBuffer<stStateCapture>::get() {
    type Flags (line 212) | struct Flags {
      method clear (line 215) | void clear() { memset(this, 0, sizeof(Flags)); }
  function plotWaveform (line 344) | float plotWaveform(void * data, int i) {
  function plotWaveformInverse (line 349) | float plotWaveformInverse(void * data, int i) {
  function renderKeyPresses (line 354) | bool renderKeyPresses(stStateUI & stateUI, const TWaveform & waveform, T...
  function renderResults (line 727) | bool renderResults(stStateUI & stateUI) {
  function renderSimilarity (line 1115) | bool renderSimilarity(const TKeyPressCollection & keyPresses, const TSim...
  function prepareAudioOut (line 1194) | bool prepareAudioOut(const TParameters & params) {
  function main (line 1242) | int main(int argc, char ** argv) {

FILE: keytap3-multi.cpp
  function main (line 22) | int main(int argc, char ** argv) {

FILE: keytap3.cpp
  function main (line 29) | int main(int argc, char ** argv) {

FILE: non-exact-subbreak.cpp
  function main (line 8) | int main(int argc, char ** argv) {

FILE: non-exact-subbreak2.cpp
  function main (line 8) | int main(int argc, char ** argv) {

FILE: play-full.cpp
  function cbPlayback (line 16) | void cbPlayback(void * userdata, uint8_t * stream, int len) {
  function main (line 27) | int main(int argc, char ** argv) {

FILE: play.cpp
  function cbPlayback (line 16) | void cbPlayback(void * userdata, uint8_t * stream, int len) {
  function main (line 30) | int main(int argc, char ** argv) {

FILE: record-full.cpp
  function main (line 16) | int main(int argc, char ** argv) {

FILE: record.cpp
  function main (line 21) | int main(int argc, char ** argv) {

FILE: scale.cpp
  function main (line 12) | int main(int argc, char ** argv) {

FILE: subbreak.cpp
  function main (line 8) | int main(int argc, char ** argv) {

FILE: subbreak.h
  function TCode (line 28) | TCode calcCode(const char * data, int n) {
  function loadFreqMap (line 49) | bool loadFreqMap(const char * fname, TFreqMap & res) {
  function TAlphabet (line 110) | TAlphabet getAlphabetRandom(const std::vector<int> & hint = {}) {
  function encrypt (line 136) | bool encrypt(const std::string & plain, TAlphabet & alphabet, std::strin...

FILE: subbreak2.cpp
  function subset (line 337) | [[maybe_unused]]
  function shuffle (line 353) | void shuffle(T & t, int start = -1, int end = -1, const Cipher::THint & ...
  function calcHelpers (line 367) | void calcHelpers(
  function updateHelpers (line 418) | void updateHelpers(
  type Cipher (line 459) | namespace Cipher {
    function TCode (line 460) | TCode calcCode(const char * data, int n) {
    function loadFreqMap (line 466) | bool loadFreqMap(const char * fname, TFreqMap & res) {
    function encryptExact (line 525) | bool encryptExact(const TParameters & , const std::string & text, TClu...
    function generateSimilarityMap (line 557) | bool generateSimilarityMap(const TParameters & params, const std::stri...
    function generateClusters (line 604) | bool generateClusters(const TParameters & params, int n, TClusters & c...
    function printClusterGoodness (line 629) | bool printClusterGoodness(const std::string & text, const TClusters & ...
    function costF (line 649) | float costF(const TSimilarityMap & ccMap, const TClusters & clusters) {
    function costFUpdate (line 663) | float costFUpdate(const TSimilarityMap & ccMap, const TClusters & clus...
    function TProb (line 678) | TProb calcScore0(const TParameters & params, const TFreqMap & freqMap,...
    function TProb (line 752) | TProb calcScore1(
    function doSimulatedAnnealing3 (line 804) | bool doSimulatedAnnealing3(
    function doSimulatedAnnealing4 (line 978) | bool doSimulatedAnnealing4(
    function doSimulatedAnnealing5 (line 1112) | bool doSimulatedAnnealing5(
    function getRandomCLMap (line 1261) | void getRandomCLMap(
    function subbreak (line 1284) | bool subbreak(
    function subbreak1 (line 1362) | bool subbreak1(
    function generateClustersInitialGuess (line 1462) | bool generateClustersInitialGuess(
    function mutateClusters (line 1542) | bool mutateClusters(const TParameters & params, TClusters & clusters) {
    function calcPClusters (line 1570) | double calcPClusters(
    function normalizeSimilarityMap (line 1618) | bool normalizeSimilarityMap(
    function printText (line 1684) | void printText(const TClusters & t) {
    function printText (line 1691) | void printText(const TClusters & t, const TClusterToLetterMap & clMap) {
    function TResult (line 1789) | const TResult & Processor::getResult() const {
    function TSimilarityMap (line 1793) | const TSimilarityMap & Processor::getSimilarityMap() const {

FILE: subbreak2.h
  function namespace (line 15) | namespace Cipher {

FILE: subbreak3.cpp
  function shuffle (line 309) | void shuffle(T & t, int start = -1, int end = -1, const Cipher::THint & ...
  type Cipher (line 325) | namespace Cipher {
    function TCode (line 326) | TCode calcCode(const char * data, int n) {
    function loadFreqMap (line 332) | bool loadFreqMap(const char * fname, TFreqMap & res, double pmin) {
    function saveFreqMapBinary (line 462) | bool saveFreqMapBinary(const char * fname, const TFreqMap & freqMap) {
    function loadFreqMapBinary (line 517) | bool loadFreqMapBinary(const char * fname, TFreqMap & freqMap) {
    function encryptExact (line 562) | bool encryptExact(const TParameters & , const std::string & text, TClu...
    function TProb (line 593) | TProb calcScore(
    function TClusterToLetterMap (line 662) | TClusterToLetterMap getNullCLMap(const TClusters & clusters) {
    function translate (line 672) | void translate(
    function beamSearch (line 682) | bool beamSearch(
    function refineNearby (line 801) | bool refineNearby(
    function generateClustersInitialGuess (line 858) | bool generateClustersInitialGuess(
    function mutateClusters (line 938) | bool mutateClusters(const TParameters & params, TClusters & clusters) {
    function calcPClusters (line 953) | double calcPClusters(
    function normalizeSimilarityMap (line 977) | bool normalizeSimilarityMap(
    function getEncodedChar (line 1047) | char getEncodedChar(TClusterId cid) {
    function TLetter (line 1057) | TLetter decode(const TClusters & t, int idx, const TClusterToLetterMap...
    function printEncoded (line 1067) | void printEncoded(const TClusters & t) {
    function printDecoded (line 1073) | void printDecoded(const TClusters & t, const TClusterToLetterMap & clM...
    function printPlain (line 1087) | void printPlain(const std::vector<TLetter> & t) {
    function TResult (line 1284) | const TResult & Processor::getResult() const {
    function TSimilarityMap (line 1288) | const TSimilarityMap & Processor::getSimilarityMap() const {
    function findBestCutoffFreq (line 1292) | float findBestCutoffFreq(const TWaveformF & waveform, EAudioFilter fil...

FILE: subbreak3.h
  function namespace (line 16) | namespace Cipher {

FILE: test-subbreak3.cpp
  function main (line 3) | int main(int argc, char ** argv) {

FILE: view-full-gui.cpp
  function mainUpdate (line 32) | void mainUpdate(void *) {
  function EMSCRIPTEN_KEEPALIVE (line 39) | EMSCRIPTEN_KEEPALIVE
  type stParameters (line 54) | struct stParameters
  type stParameters (line 67) | struct stParameters {
  function plotWaveform (line 76) | float plotWaveform(void * data, int i) {
  function plotWaveformInverse (line 81) | float plotWaveformInverse(void * data, int i) {
  function renderWaveform (line 86) | bool renderWaveform(TParameters & , const TWaveform & waveform) {
  function prepareAudioOut (line 225) | bool prepareAudioOut(const TParameters & params) {
  function main (line 273) | int main(int argc, char ** argv) {

FILE: view-gui.cpp
  type stParameters (line 29) | struct stParameters
  type stParameters (line 39) | struct stParameters {
  function plotWaveform (line 48) | float plotWaveform(void * data, int i) {
  function plotWaveformInverse (line 53) | float plotWaveformInverse(void * data, int i) {
  function renderWaveform (line 61) | bool renderWaveform(TParameters & params, const TWaveform & waveform, co...
  function prepareAudioOut (line 228) | bool prepareAudioOut(const TParameters & params) {
  function main (line 276) | int main(int argc, char ** argv) {
Copy disabled (too large) Download .json
Condensed preview — 63 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (13,497K chars).
[
  {
    "path": ".github/workflows/build.yml",
    "chars": 1994,
    "preview": "name: CI\non: [push]\n\njobs:\n    ubuntu-18_04-gcc:\n        runs-on: ubuntu-18.04\n\n        strategy:\n            matrix:\n  "
  },
  {
    "path": ".gitignore",
    "chars": 109,
    "preview": "build*/\nbuild-vars.h\ndata_original/*\nchal*\n.cache\n.DS_Store\n.ycm_extra_conf.py\n.clangd\ncompile_commands.json\n"
  },
  {
    "path": ".gitmodules",
    "chars": 74,
    "preview": "[submodule \"imgui\"]\n\tpath = imgui\n\turl = https://github.com/ocornut/imgui\n"
  },
  {
    "path": "CMakeLists.txt",
    "chars": 9908,
    "preview": "cmake_minimum_required (VERSION 2.8)\nproject (KBD-Audio)\n\nset(CMAKE_EXPORT_COMPILE_COMMANDS \"on\")\n\n# options\n\noption(BUI"
  },
  {
    "path": "LICENSE",
    "chars": 1072,
    "preview": "MIT License\n\nCopyright (c) 2018 Georgi Gerganov\n\nPermission is hereby granted, free of charge, to any person obtaining a"
  },
  {
    "path": "README.md",
    "chars": 7518,
    "preview": "kbd-audio\n=====\n[![Actions Status](https://github.com/ggerganov/kbd-audio/workflows/CI/badge.svg)](https://github.com/gg"
  },
  {
    "path": "audio-logger.cpp",
    "chars": 9890,
    "preview": "/*! \\file audio-logger.cpp\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#include \"audio-logger.h\""
  },
  {
    "path": "audio-logger.h",
    "chars": 1594,
    "preview": "/*! \\file audio-logger.h\n *  \\brief Audio capture helper class\n *\n *  Used by all kbd-audio tools.\n *  It provides a str"
  },
  {
    "path": "build-vars.h.in",
    "chars": 151,
    "preview": "#pragma once\n\nconst char * kGIT_SHA1 = \"@GIT_SHA1@\";\nconst char * kGIT_DATE = \"@GIT_DATE@\";\nconst char * kGIT_COMMIT_SUB"
  },
  {
    "path": "cmake/BuildTypes.cmake",
    "chars": 2046,
    "preview": "# Add new build types\n\n# ReleaseGG - Release with enabled asserts\n\nSET(CMAKE_CXX_FLAGS_RELEASEGG\n    \"-O3\"\n    CACHE STR"
  },
  {
    "path": "cmake/FindFFTW.cmake",
    "chars": 908,
    "preview": "# - Find FFTW\n# Find the native FFTW includes and library\n#\n#  FFTW_INCLUDE_DIRS - where to find fftw3.h\n#  FFTW_LIBRARI"
  },
  {
    "path": "cmake/GitVars.cmake",
    "chars": 717,
    "preview": "find_package(Git)\n\n# the commit's SHA1\nexecute_process(COMMAND\n    \"${GIT_EXECUTABLE}\" describe --match=NeVeRmAtCh --alw"
  },
  {
    "path": "cmake/sdl2/FindSDL2.cmake",
    "chars": 7476,
    "preview": "# Distributed under the OSI-approved BSD 3-Clause License. See accompanying\n# file Copyright.txt or https://cmake.org/li"
  },
  {
    "path": "common-gui.cpp",
    "chars": 8437,
    "preview": "/*! \\file common-gui.cpp\n *  \\brief Enter description here.\n */\n\n#include \"common-gui.h\"\n\n#ifdef __EMSCRIPTEN__\n#include"
  },
  {
    "path": "common-gui.h",
    "chars": 394,
    "preview": "/*! \\file common-gui.h\n *  \\brief Enter description here.\n */\n\n#pragma once\n\n#include \"common.h\"\n\n#include <SDL.h>\n\nname"
  },
  {
    "path": "common.cpp",
    "chars": 35391,
    "preview": "/*! \\file common.cpp\n *  \\brief Enter description here.\n */\n\n#include \"common.h\"\n#include \"constants.h\"\n\n#include <cstri"
  },
  {
    "path": "common.h",
    "chars": 8074,
    "preview": "/*! \\file common.h\n *  \\brief Common types and functions\n *  \\author Georgi Gerganov\n */\n\n#pragma once\n\n#include <map>\n#"
  },
  {
    "path": "compress-n-grams.cpp",
    "chars": 476,
    "preview": "#include \"subbreak3.h\"\n\nint main(int argc, char ** argv) {\n    printf(\"Usage: %s n-gram.dat n-gram-compressed.dat\\n\", ar"
  },
  {
    "path": "constants.h",
    "chars": 16697,
    "preview": "/*! \\file constants.h\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#pragma once\n\n#include <map>\n#"
  },
  {
    "path": "data/english_quadgrams.txt",
    "chars": 3289600,
    "preview": "TION 13168375\nNTHE 11234972\nTHER 10218035\nTHAT 8980536\nOFTH 8132597\nFTHE 8100836\nTHES 7717675\nWITH 7627991\nINTH 7261789\n"
  },
  {
    "path": "data/english_quintgrams.txt",
    "chars": 7912207,
    "preview": "OFTHE 7454931\nATION 7055257\nINTHE 6609879\nTHERE 3720980\nINGTH 3693063\nTOTHE 3542942\nNGTHE 3171818\nOTHER 3115926\nATTHE 31"
  },
  {
    "path": "data/english_trigrams.txt",
    "chars": 161932,
    "preview": "THE 77534223\nAND 30997177\nING 30679488\nENT 17902107\nION 17769261\nHER 15277018\nFOR 14686159\nTHA 14222073\nNTH 14115952\nINT"
  },
  {
    "path": "data/sample_quadgrams.txt",
    "chars": 25,
    "preview": "TION 100\nNTHE 90\nTHER 88\n"
  },
  {
    "path": "dr_wav.h",
    "chars": 241358,
    "preview": "/*\nWAV audio loader and writer. Choice of public domain or MIT-0. See license statements at the end of this file.\ndr_wav"
  },
  {
    "path": "generate-clusters.cpp",
    "chars": 2610,
    "preview": "/*! \\file generate-clusters.cpp\n *  \\brief Generate clusters given a similarity matrix using metropolis-hastings algorit"
  },
  {
    "path": "guess-qp.cpp",
    "chars": 16637,
    "preview": "/*! \\file guess-qp.cpp\n *  \\brief Basic tool to attempt to recognize the 'q' and 'p' keys\n *  \\author Georgi Gerganov\n *"
  },
  {
    "path": "guess-qp2.cpp",
    "chars": 17901,
    "preview": "/*! \\file guess-qp2.cpp\n *  \\brief Basic tool to attempt to recognize the 'q' and 'p' keys\n *  \\author Georgi Gerganov\n "
  },
  {
    "path": "imconfig-vtx32.h",
    "chars": 4905,
    "preview": "//-----------------------------------------------------------------------------\n// COMPILE-TIME OPTIONS FOR DEAR IMGUI\n/"
  },
  {
    "path": "index-keytap2-gui-tmpl.html",
    "chars": 14012,
    "preview": "<!doctype html>\n<html lang=\"en-us\">\n    <head>\n        <meta charset=\"utf-8\">\n        <title>Keytap2</title>\n\n        <m"
  },
  {
    "path": "index-keytap3-app-tmpl.html",
    "chars": 13099,
    "preview": "<!doctype html>\n<html lang=\"en-us\">\n    <head>\n        <meta charset=\"utf-8\">\n        <title>Keytap3</title>\n\n        <m"
  },
  {
    "path": "index-keytap3-gui-tmpl.html",
    "chars": 12595,
    "preview": "<!doctype html>\n<html lang=\"en-us\">\n    <head>\n        <meta charset=\"utf-8\">\n        <title>Keytap3</title>\n\n        <m"
  },
  {
    "path": "key-average-gui.cpp",
    "chars": 14143,
    "preview": "/*! \\file key-average-gui.cpp\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#include \"constants.h\""
  },
  {
    "path": "key-detector.cpp",
    "chars": 3420,
    "preview": "/*! \\file key-detector.cpp\n *  \\brief Capture audio until N keystrokes are detected\n *  \\author Georgi Gerganov\n */\n\n#in"
  },
  {
    "path": "keytap-gui.cpp",
    "chars": 40357,
    "preview": "/*! \\file guess_all_gui.cpp\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#ifdef __EMSCRIPTEN__\n#i"
  },
  {
    "path": "keytap.cpp",
    "chars": 24073,
    "preview": "/*! \\file keytap.cpp\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#include \"constants.h\"\n#include"
  },
  {
    "path": "keytap2-gui-old.cpp",
    "chars": 46047,
    "preview": "/*! \\file keytap2-gui.cpp\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#include \"constants.h\"\n#in"
  },
  {
    "path": "keytap2-gui.cpp",
    "chars": 73037,
    "preview": "/*! \\file keytap2-gui.cpp\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#ifdef __EMSCRIPTEN__\n#inc"
  },
  {
    "path": "keytap2.cpp",
    "chars": 12215,
    "preview": "/*! \\file keytap2.cpp\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#include \"common.h\"\n\n#include "
  },
  {
    "path": "keytap3-app.cpp",
    "chars": 26305,
    "preview": "/*! \\file keytap3-app.cpp\n *  \\brief keytap3.cpp and key-detector.cpp combined in single app\n *\n *  Used to create the k"
  },
  {
    "path": "keytap3-gui.cpp",
    "chars": 75067,
    "preview": "#ifdef __EMSCRIPTEN__\n#include \"emscripten.h\"\n#else\n#define EMSCRIPTEN_KEEPALIVE\n#endif\n\n#include \"build-vars.h\"\n#includ"
  },
  {
    "path": "keytap3-multi.cpp",
    "chars": 6653,
    "preview": "/*! \\file keytap3-multi.cpp\n *  \\brief Same as keytap3.cpp but using multi-samples\n *  \\author Georgi Gerganov\n */\n\n#inc"
  },
  {
    "path": "keytap3.cpp",
    "chars": 8512,
    "preview": "/*! \\file keytap3.cpp\n *  \\brief Fully automated acoustic keyboard eavesdropping\n *  \\author Georgi Gerganov\n */\n\n#inclu"
  },
  {
    "path": "non-exact-subbreak.cpp",
    "chars": 2428,
    "preview": "/*! \\file non-exact-subbreak.cpp\n *  \\brief New attempt at breaking non-exact substitution cipher\n *  \\author Georgi Ger"
  },
  {
    "path": "non-exact-subbreak2.cpp",
    "chars": 1092,
    "preview": "/*! \\file non-exact-subbreak2.cpp\n *  \\brief New attempt at breaking non-exact substitution cipher\n *  \\author Georgi Ge"
  },
  {
    "path": "play-full.cpp",
    "chars": 2786,
    "preview": "/*! \\file play-full.cpp\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#include \"constants.h\"\n#incl"
  },
  {
    "path": "play.cpp",
    "chars": 3196,
    "preview": "/*! \\file play.cpp\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#include \"constants.h\"\n#include \""
  },
  {
    "path": "record-full.cpp",
    "chars": 2040,
    "preview": "/*! \\file record-full.cpp\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#include \"constants.h\"\n#in"
  },
  {
    "path": "record.cpp",
    "chars": 3401,
    "preview": "/*! \\file record.cpp\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#include \"constants.h\"\n#include"
  },
  {
    "path": "scale.cpp",
    "chars": 1660,
    "preview": "/*! \\file scale.cpp\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#include <fstream>\n#include <cst"
  },
  {
    "path": "style.css",
    "chars": 1499,
    "preview": "html {\n    margin: 0px;\n    height: 100%;\n}\nbody {\n    margin: 0px;\n    height: 100%;\n    color: rgba(255, 255, 255, 1.0"
  },
  {
    "path": "subbreak.cpp",
    "chars": 1640,
    "preview": "/*! \\file subbreak.cpp\n *  \\brief Substitution cipher breaker\n *  \\author Georgi Gerganov\n */\n\n#include \"subbreak.h\"\n\nin"
  },
  {
    "path": "subbreak.h",
    "chars": 12852,
    "preview": "/*! \\file subbreak.h\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#pragma once\n\n#include \"constan"
  },
  {
    "path": "subbreak2.cpp",
    "chars": 54030,
    "preview": "/*! \\file subbreak2.cpp\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#include \"subbreak2.h\"\n\n#inc"
  },
  {
    "path": "subbreak2.h",
    "chars": 5065,
    "preview": "/*! \\file subbreak2.h\n *  \\brief Breaking non-exact substitution ciphers\n *  \\author Georgi Gerganov\n */\n\n#pragma once\n\n"
  },
  {
    "path": "subbreak3.cpp",
    "chars": 42381,
    "preview": "/*! \\file subbreak3.cpp\n *  \\brief Enter description here.\n *  \\author Georgi Gerganov\n */\n\n#include \"subbreak3.h\"\n#incl"
  },
  {
    "path": "subbreak3.h",
    "chars": 4179,
    "preview": "/*! \\file subbreak3.h\n *  \\brief Breaking non-exact substitution ciphers\n *  \\author Georgi Gerganov\n */\n\n#pragma once\n\n"
  },
  {
    "path": "test-subbreak3.cpp",
    "chars": 1741,
    "preview": "#include \"subbreak3.h\"\n\nint main(int argc, char ** argv) {\n    printf(\"Usage: %s n-gram.txt\\n\", argv[0]);\n    if (argc <"
  },
  {
    "path": "view-full-gui.cpp",
    "chars": 13534,
    "preview": "/*! \\file view-full-gui.cpp\n *  \\brief Visualize data recorded with record-full\n *  \\author Georgi Gerganov\n */\n\n#ifdef "
  },
  {
    "path": "view-gui.cpp",
    "chars": 16289,
    "preview": "/*! \\file view-gui.cpp\n *  \\brief Visualize training data recorded with 'record'\n *  \\author Georgi Gerganov\n */\n\n#inclu"
  }
]

// ... and 4 more files (download for full content)

About this extraction

This page contains the full source code of the ggerganov/kbd-audio GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 63 files (11.7 MB), approximately 3.1M tokens, and a symbol index with 475 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!