diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,14 @@
+# Changelog for `dear-imgui-raw-implot`
+
+All notable changes to this package will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to the
+[Haskell Package Versioning Policy](https://pvp.haskell.org/).
+
+## 1.0.0 - 2026-10-21
+
+Initial release.
+
+- Generated with dear_bindings `v0.26` against Dear ImGui `v1.93.0-docking`.
+- Bundles implot at commit `851cdbd` (`v1.0-10-g851cdbd`).
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2026 IC Rainbow
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1.  Redistributions of source code must retain the above copyright notice, this
+    list of conditions and the following disclaimer.
+
+2.  Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+
+3.  Neither the name of the copyright holder nor the names of its contributors
+    may be used to endorse or promote products derived from this software
+    without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,22 @@
+# dear-imgui-raw-implot
+
+Raw FFI bindings to [implot], GPU-accelerated plotting for Dear ImGui.
+
+```haskell
+{-# LANGUAGE BlockArguments #-}
+
+import DearImGui.Raw.ImPlot qualified as ImPlot
+import DearImGui.Raw.ImPlot.Spec qualified as Spec
+import Foreign.C.String (withCString)
+import Foreign.Marshal.Array (withArrayLen)
+import Foreign.Storable (peek)
+
+plotSine :: IO ()
+plotSine =
+  withCString "sin" \label ->
+    withArrayLen [sin (x / 10) | x <- [0 .. 99]] \count values ->
+      Spec.withDefault \spec ->
+        ImPlot.plotLine_F32 label values (fromIntegral count) 1 0 =<< peek spec
+```
+
+[implot]: https://github.com/epezent/implot
diff --git a/cbits/DearImGuiCtors.cpp b/cbits/DearImGuiCtors.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/DearImGuiCtors.cpp
@@ -0,0 +1,64 @@
+// Generated by dear-bindings-ffi. Do not edit.
+#include <new>
+#include "implot.h"
+
+extern "C" void ImPlotInputMap_Init_wrap(void* p) {
+    using T = ::ImPlotInputMap;
+    new (p) T();
+}
+
+extern "C" void ImPlotInputMap_Destroy_wrap(void* p) {
+    using T = ::ImPlotInputMap;
+    static_cast<T*>(p)->~T();
+}
+
+extern "C" void ImPlotPoint_Init_wrap(void* p) {
+    using T = ::ImPlotPoint;
+    new (p) T();
+}
+
+extern "C" void ImPlotPoint_Destroy_wrap(void* p) {
+    using T = ::ImPlotPoint;
+    static_cast<T*>(p)->~T();
+}
+
+extern "C" void ImPlotRange_Init_wrap(void* p) {
+    using T = ::ImPlotRange;
+    new (p) T();
+}
+
+extern "C" void ImPlotRange_Destroy_wrap(void* p) {
+    using T = ::ImPlotRange;
+    static_cast<T*>(p)->~T();
+}
+
+extern "C" void ImPlotRect_Init_wrap(void* p) {
+    using T = ::ImPlotRect;
+    new (p) T();
+}
+
+extern "C" void ImPlotRect_Destroy_wrap(void* p) {
+    using T = ::ImPlotRect;
+    static_cast<T*>(p)->~T();
+}
+
+extern "C" void ImPlotSpec_Init_wrap(void* p) {
+    using T = ::ImPlotSpec;
+    new (p) T();
+}
+
+extern "C" void ImPlotSpec_Destroy_wrap(void* p) {
+    using T = ::ImPlotSpec;
+    static_cast<T*>(p)->~T();
+}
+
+extern "C" void ImPlotStyle_Init_wrap(void* p) {
+    using T = ::ImPlotStyle;
+    new (p) T();
+}
+
+extern "C" void ImPlotStyle_Destroy_wrap(void* p) {
+    using T = ::ImPlotStyle;
+    static_cast<T*>(p)->~T();
+}
+
diff --git a/cbits/DearImGuiWrappers.cpp b/cbits/DearImGuiWrappers.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/DearImGuiWrappers.cpp
@@ -0,0 +1,1183 @@
+// Generated by dear-bindings-ffi. Do not edit.
+#include "DearImGuiWrappers.h"
+
+extern "C" void ImPlotAnnotation_wrap(double x, double y, ImVec4 const* col, ImVec2 const* pix_offset, bool clamp, bool round) {
+    ImPlotAnnotation(x, y, *col, *pix_offset, clamp, round);
+}
+
+extern "C" void ImPlotAnnotationStrUnformatted_wrap(double x, double y, ImVec4 const* col, ImVec2 const* pix_offset, bool clamp, const char* text) {
+    ImPlotAnnotationStrUnformatted(x, y, *col, *pix_offset, clamp, text);
+}
+
+extern "C" bool ImPlotBeginPlot_wrap(const char* title_id, ImVec2 const* size, ImPlotFlags flags) {
+    return ImPlotBeginPlot(title_id, *size, flags);
+}
+
+extern "C" bool ImPlotBeginSubplots_wrap(const char* title_id, int rows, int cols, ImVec2 const* size, ImPlotSubplotFlags flags, float* row_ratios, float* col_ratios) {
+    return ImPlotBeginSubplots(title_id, rows, cols, *size, flags, row_ratios, col_ratios);
+}
+
+extern "C" bool ImPlotColormapButton_wrap(const char* label, ImVec2 const* size, ImPlotColormap cmap) {
+    return ImPlotColormapButton(label, *size, cmap);
+}
+
+extern "C" void ImPlotColormapScale_wrap(const char* label, double scale_min, double scale_max, ImVec2 const* size, const char* format, ImPlotColormapScaleFlags flags, ImPlotColormap cmap) {
+    ImPlotColormapScale(label, scale_min, scale_max, *size, format, flags, cmap);
+}
+
+extern "C" bool ImPlotDragLineX_wrap(int id, double* x, ImVec4 const* col, float thickness, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held) {
+    return ImPlotDragLineX(id, x, *col, thickness, flags, out_clicked, out_hovered, out_held);
+}
+
+extern "C" bool ImPlotDragLineY_wrap(int id, double* y, ImVec4 const* col, float thickness, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held) {
+    return ImPlotDragLineY(id, y, *col, thickness, flags, out_clicked, out_hovered, out_held);
+}
+
+extern "C" bool ImPlotDragPoint_wrap(int id, double* x, double* y, ImVec4 const* col, float size, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held) {
+    return ImPlotDragPoint(id, x, y, *col, size, flags, out_clicked, out_hovered, out_held);
+}
+
+extern "C" bool ImPlotDragRect_wrap(int id, double* x1, double* y1, double* x2, double* y2, ImVec4 const* col, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held) {
+    return ImPlotDragRect(id, x1, y1, x2, y2, *col, flags, out_clicked, out_hovered, out_held);
+}
+
+extern "C" void ImPlotGetColormapColor_wrap(int idx, ImPlotColormap cmap, ImVec4* _out) {
+    *_out = ImPlotGetColormapColor(idx, cmap);
+}
+
+extern "C" void ImPlotGetLastItemColor_wrap(ImVec4* _out) {
+    *_out = ImPlotGetLastItemColor();
+}
+
+extern "C" void ImPlotGetPlotPos_wrap(ImVec2* _out) {
+    *_out = ImPlotGetPlotPos();
+}
+
+extern "C" void ImPlotGetPlotSize_wrap(ImVec2* _out) {
+    *_out = ImPlotGetPlotSize();
+}
+
+extern "C" void ImPlotItemIcon_wrap(ImVec4 const* col) {
+    ImPlotItemIcon(*col);
+}
+
+extern "C" void ImPlotNextColormapColor_wrap(ImVec4* _out) {
+    *_out = ImPlotNextColormapColor();
+}
+
+extern "C" void ImPlotPlotBarGroups_F32_wrap(const char*const* label_ids, const float* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBarGroups_F32(label_ids, values, item_count, group_count, group_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBarGroups_F64_wrap(const char*const* label_ids, const double* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBarGroups_F64(label_ids, values, item_count, group_count, group_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBarGroups_S16_wrap(const char*const* label_ids, const ImS16* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBarGroups_S16(label_ids, values, item_count, group_count, group_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBarGroups_S32_wrap(const char*const* label_ids, const ImS32* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBarGroups_S32(label_ids, values, item_count, group_count, group_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBarGroups_S64_wrap(const char*const* label_ids, const ImS64* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBarGroups_S64(label_ids, values, item_count, group_count, group_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBarGroups_S8_wrap(const char*const* label_ids, const ImS8* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBarGroups_S8(label_ids, values, item_count, group_count, group_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBarGroups_U16_wrap(const char*const* label_ids, const ImU16* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBarGroups_U16(label_ids, values, item_count, group_count, group_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBarGroups_U32_wrap(const char*const* label_ids, const ImU32* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBarGroups_U32(label_ids, values, item_count, group_count, group_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBarGroups_U64_wrap(const char*const* label_ids, const ImU64* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBarGroups_U64(label_ids, values, item_count, group_count, group_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBarGroups_U8_wrap(const char*const* label_ids, const ImU8* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBarGroups_U8(label_ids, values, item_count, group_count, group_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBarsG_wrap(const char* label_id, ImPlotGetter getter, void* data, int count, double bar_size, ImPlotSpec const* spec) {
+    ImPlotPlotBarsG(label_id, getter, data, count, bar_size, *spec);
+}
+
+extern "C" void ImPlotPlotBars_F32_wrap(const char* label_id, const float* values, int count, double bar_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBars_F32(label_id, values, count, bar_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBars_F64_wrap(const char* label_id, const double* values, int count, double bar_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBars_F64(label_id, values, count, bar_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBars_S16_wrap(const char* label_id, const ImS16* values, int count, double bar_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBars_S16(label_id, values, count, bar_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBars_S32_wrap(const char* label_id, const ImS32* values, int count, double bar_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBars_S32(label_id, values, count, bar_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBars_S64_wrap(const char* label_id, const ImS64* values, int count, double bar_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBars_S64(label_id, values, count, bar_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBars_S8_wrap(const char* label_id, const ImS8* values, int count, double bar_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBars_S8(label_id, values, count, bar_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBars_U16_wrap(const char* label_id, const ImU16* values, int count, double bar_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBars_U16(label_id, values, count, bar_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBars_U32_wrap(const char* label_id, const ImU32* values, int count, double bar_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBars_U32(label_id, values, count, bar_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBars_U64_wrap(const char* label_id, const ImU64* values, int count, double bar_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBars_U64(label_id, values, count, bar_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBars_U8_wrap(const char* label_id, const ImU8* values, int count, double bar_size, double shift, ImPlotSpec const* spec) {
+    ImPlotPlotBars_U8(label_id, values, count, bar_size, shift, *spec);
+}
+
+extern "C" void ImPlotPlotBars_xy_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, double bar_size, ImPlotSpec const* spec) {
+    ImPlotPlotBars_xy_F32(label_id, xs, ys, count, bar_size, *spec);
+}
+
+extern "C" void ImPlotPlotBars_xy_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, double bar_size, ImPlotSpec const* spec) {
+    ImPlotPlotBars_xy_F64(label_id, xs, ys, count, bar_size, *spec);
+}
+
+extern "C" void ImPlotPlotBars_xy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double bar_size, ImPlotSpec const* spec) {
+    ImPlotPlotBars_xy_S16(label_id, xs, ys, count, bar_size, *spec);
+}
+
+extern "C" void ImPlotPlotBars_xy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double bar_size, ImPlotSpec const* spec) {
+    ImPlotPlotBars_xy_S32(label_id, xs, ys, count, bar_size, *spec);
+}
+
+extern "C" void ImPlotPlotBars_xy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double bar_size, ImPlotSpec const* spec) {
+    ImPlotPlotBars_xy_S64(label_id, xs, ys, count, bar_size, *spec);
+}
+
+extern "C" void ImPlotPlotBars_xy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double bar_size, ImPlotSpec const* spec) {
+    ImPlotPlotBars_xy_S8(label_id, xs, ys, count, bar_size, *spec);
+}
+
+extern "C" void ImPlotPlotBars_xy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double bar_size, ImPlotSpec const* spec) {
+    ImPlotPlotBars_xy_U16(label_id, xs, ys, count, bar_size, *spec);
+}
+
+extern "C" void ImPlotPlotBars_xy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double bar_size, ImPlotSpec const* spec) {
+    ImPlotPlotBars_xy_U32(label_id, xs, ys, count, bar_size, *spec);
+}
+
+extern "C" void ImPlotPlotBars_xy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double bar_size, ImPlotSpec const* spec) {
+    ImPlotPlotBars_xy_U64(label_id, xs, ys, count, bar_size, *spec);
+}
+
+extern "C" void ImPlotPlotBars_xy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double bar_size, ImPlotSpec const* spec) {
+    ImPlotPlotBars_xy_U8(label_id, xs, ys, count, bar_size, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_F32_wrap(const char* label_id, const float* values, const float* szs, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_F32(label_id, values, szs, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_F64_wrap(const char* label_id, const double* values, const double* szs, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_F64(label_id, values, szs, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_S16_wrap(const char* label_id, const ImS16* values, const ImS16* szs, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_S16(label_id, values, szs, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_S32_wrap(const char* label_id, const ImS32* values, const ImS32* szs, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_S32(label_id, values, szs, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_S64_wrap(const char* label_id, const ImS64* values, const ImS64* szs, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_S64(label_id, values, szs, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_S8_wrap(const char* label_id, const ImS8* values, const ImS8* szs, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_S8(label_id, values, szs, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_U16_wrap(const char* label_id, const ImU16* values, const ImU16* szs, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_U16(label_id, values, szs, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_U32_wrap(const char* label_id, const ImU32* values, const ImU32* szs, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_U32(label_id, values, szs, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_U64_wrap(const char* label_id, const ImU64* values, const ImU64* szs, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_U64(label_id, values, szs, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_U8_wrap(const char* label_id, const ImU8* values, const ImU8* szs, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_U8(label_id, values, szs, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_xy_F32_wrap(const char* label_id, const float* xs, const float* ys, const float* szs, int count, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_xy_F32(label_id, xs, ys, szs, count, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_xy_F64_wrap(const char* label_id, const double* xs, const double* ys, const double* szs, int count, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_xy_F64(label_id, xs, ys, szs, count, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_xy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* szs, int count, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_xy_S16(label_id, xs, ys, szs, count, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_xy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* szs, int count, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_xy_S32(label_id, xs, ys, szs, count, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_xy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* szs, int count, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_xy_S64(label_id, xs, ys, szs, count, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_xy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* szs, int count, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_xy_S8(label_id, xs, ys, szs, count, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_xy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* szs, int count, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_xy_U16(label_id, xs, ys, szs, count, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_xy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* szs, int count, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_xy_U32(label_id, xs, ys, szs, count, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_xy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* szs, int count, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_xy_U64(label_id, xs, ys, szs, count, *spec);
+}
+
+extern "C" void ImPlotPlotBubbles_xy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* szs, int count, ImPlotSpec const* spec) {
+    ImPlotPlotBubbles_xy_U8(label_id, xs, ys, szs, count, *spec);
+}
+
+extern "C" void ImPlotPlotDigitalG_wrap(const char* label_id, ImPlotGetter getter, void* data, int count, ImPlotSpec const* spec) {
+    ImPlotPlotDigitalG(label_id, getter, data, count, *spec);
+}
+
+extern "C" void ImPlotPlotDigital_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotDigital_F32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotDigital_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotDigital_F64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotDigital_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotDigital_S16(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotDigital_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotDigital_S32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotDigital_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotDigital_S64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotDigital_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotDigital_S8(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotDigital_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotDigital_U16(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotDigital_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotDigital_U32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotDigital_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotDigital_U64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotDigital_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotDigital_U8(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotDummy_wrap(const char* label_id, ImPlotSpec const* spec) {
+    ImPlotPlotDummy(label_id, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xye_F32_wrap(const char* label_id, const float* xs, const float* ys, const float* err, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xye_F32(label_id, xs, ys, err, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xye_F64_wrap(const char* label_id, const double* xs, const double* ys, const double* err, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xye_F64(label_id, xs, ys, err, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xye_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* err, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xye_S16(label_id, xs, ys, err, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xye_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* err, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xye_S32(label_id, xs, ys, err, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xye_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* err, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xye_S64(label_id, xs, ys, err, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xye_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* err, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xye_S8(label_id, xs, ys, err, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xye_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* err, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xye_U16(label_id, xs, ys, err, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xye_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* err, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xye_U32(label_id, xs, ys, err, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xye_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* err, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xye_U64(label_id, xs, ys, err, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xye_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* err, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xye_U8(label_id, xs, ys, err, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xynp_F32_wrap(const char* label_id, const float* xs, const float* ys, const float* neg, const float* pos, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xynp_F32(label_id, xs, ys, neg, pos, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xynp_F64_wrap(const char* label_id, const double* xs, const double* ys, const double* neg, const double* pos, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xynp_F64(label_id, xs, ys, neg, pos, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xynp_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* neg, const ImS16* pos, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xynp_S16(label_id, xs, ys, neg, pos, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xynp_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* neg, const ImS32* pos, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xynp_S32(label_id, xs, ys, neg, pos, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xynp_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* neg, const ImS64* pos, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xynp_S64(label_id, xs, ys, neg, pos, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xynp_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* neg, const ImS8* pos, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xynp_S8(label_id, xs, ys, neg, pos, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xynp_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* neg, const ImU16* pos, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xynp_U16(label_id, xs, ys, neg, pos, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xynp_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* neg, const ImU32* pos, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xynp_U32(label_id, xs, ys, neg, pos, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xynp_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* neg, const ImU64* pos, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xynp_U64(label_id, xs, ys, neg, pos, count, *spec);
+}
+
+extern "C" void ImPlotPlotErrorBars_xynp_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* neg, const ImU8* pos, int count, ImPlotSpec const* spec) {
+    ImPlotPlotErrorBars_xynp_U8(label_id, xs, ys, neg, pos, count, *spec);
+}
+
+extern "C" void ImPlotPlotHeatmap_F32_wrap(const char* label_id, const float* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec) {
+    ImPlotPlotHeatmap_F32(label_id, values, rows, cols, scale_min, scale_max, label_fmt, *bounds_min, *bounds_max, *spec);
+}
+
+extern "C" void ImPlotPlotHeatmap_F64_wrap(const char* label_id, const double* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec) {
+    ImPlotPlotHeatmap_F64(label_id, values, rows, cols, scale_min, scale_max, label_fmt, *bounds_min, *bounds_max, *spec);
+}
+
+extern "C" void ImPlotPlotHeatmap_S16_wrap(const char* label_id, const ImS16* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec) {
+    ImPlotPlotHeatmap_S16(label_id, values, rows, cols, scale_min, scale_max, label_fmt, *bounds_min, *bounds_max, *spec);
+}
+
+extern "C" void ImPlotPlotHeatmap_S32_wrap(const char* label_id, const ImS32* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec) {
+    ImPlotPlotHeatmap_S32(label_id, values, rows, cols, scale_min, scale_max, label_fmt, *bounds_min, *bounds_max, *spec);
+}
+
+extern "C" void ImPlotPlotHeatmap_S64_wrap(const char* label_id, const ImS64* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec) {
+    ImPlotPlotHeatmap_S64(label_id, values, rows, cols, scale_min, scale_max, label_fmt, *bounds_min, *bounds_max, *spec);
+}
+
+extern "C" void ImPlotPlotHeatmap_S8_wrap(const char* label_id, const ImS8* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec) {
+    ImPlotPlotHeatmap_S8(label_id, values, rows, cols, scale_min, scale_max, label_fmt, *bounds_min, *bounds_max, *spec);
+}
+
+extern "C" void ImPlotPlotHeatmap_U16_wrap(const char* label_id, const ImU16* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec) {
+    ImPlotPlotHeatmap_U16(label_id, values, rows, cols, scale_min, scale_max, label_fmt, *bounds_min, *bounds_max, *spec);
+}
+
+extern "C" void ImPlotPlotHeatmap_U32_wrap(const char* label_id, const ImU32* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec) {
+    ImPlotPlotHeatmap_U32(label_id, values, rows, cols, scale_min, scale_max, label_fmt, *bounds_min, *bounds_max, *spec);
+}
+
+extern "C" void ImPlotPlotHeatmap_U64_wrap(const char* label_id, const ImU64* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec) {
+    ImPlotPlotHeatmap_U64(label_id, values, rows, cols, scale_min, scale_max, label_fmt, *bounds_min, *bounds_max, *spec);
+}
+
+extern "C" void ImPlotPlotHeatmap_U8_wrap(const char* label_id, const ImU8* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec) {
+    ImPlotPlotHeatmap_U8(label_id, values, rows, cols, scale_min, scale_max, label_fmt, *bounds_min, *bounds_max, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram2D_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram2D_F32(label_id, xs, ys, count, x_bins, y_bins, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram2D_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram2D_F64(label_id, xs, ys, count, x_bins, y_bins, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram2D_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram2D_S16(label_id, xs, ys, count, x_bins, y_bins, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram2D_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram2D_S32(label_id, xs, ys, count, x_bins, y_bins, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram2D_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram2D_S64(label_id, xs, ys, count, x_bins, y_bins, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram2D_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram2D_S8(label_id, xs, ys, count, x_bins, y_bins, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram2D_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram2D_U16(label_id, xs, ys, count, x_bins, y_bins, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram2D_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram2D_U32(label_id, xs, ys, count, x_bins, y_bins, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram2D_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram2D_U64(label_id, xs, ys, count, x_bins, y_bins, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram2D_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram2D_U8(label_id, xs, ys, count, x_bins, y_bins, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram_F32_wrap(const char* label_id, const float* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram_F32(label_id, values, count, bins, bar_scale, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram_F64_wrap(const char* label_id, const double* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram_F64(label_id, values, count, bins, bar_scale, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram_S16_wrap(const char* label_id, const ImS16* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram_S16(label_id, values, count, bins, bar_scale, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram_S32_wrap(const char* label_id, const ImS32* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram_S32(label_id, values, count, bins, bar_scale, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram_S64_wrap(const char* label_id, const ImS64* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram_S64(label_id, values, count, bins, bar_scale, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram_S8_wrap(const char* label_id, const ImS8* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram_S8(label_id, values, count, bins, bar_scale, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram_U16_wrap(const char* label_id, const ImU16* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram_U16(label_id, values, count, bins, bar_scale, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram_U32_wrap(const char* label_id, const ImU32* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram_U32(label_id, values, count, bins, bar_scale, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram_U64_wrap(const char* label_id, const ImU64* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram_U64(label_id, values, count, bins, bar_scale, *range, *spec);
+}
+
+extern "C" double ImPlotPlotHistogram_U8_wrap(const char* label_id, const ImU8* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec) {
+    return ImPlotPlotHistogram_U8(label_id, values, count, bins, bar_scale, *range, *spec);
+}
+
+extern "C" void ImPlotPlotImage_wrap(const char* label_id, ImTextureRef const* tex_ref, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImVec2 const* uv0, ImVec2 const* uv1, ImVec4 const* tint_col, ImPlotSpec const* spec) {
+    ImPlotPlotImage(label_id, *tex_ref, *bounds_min, *bounds_max, *uv0, *uv1, *tint_col, *spec);
+}
+
+extern "C" void ImPlotPlotInfLines_F32_wrap(const char* label_id, const float* values, int count, ImPlotSpec const* spec) {
+    ImPlotPlotInfLines_F32(label_id, values, count, *spec);
+}
+
+extern "C" void ImPlotPlotInfLines_F64_wrap(const char* label_id, const double* values, int count, ImPlotSpec const* spec) {
+    ImPlotPlotInfLines_F64(label_id, values, count, *spec);
+}
+
+extern "C" void ImPlotPlotInfLines_S16_wrap(const char* label_id, const ImS16* values, int count, ImPlotSpec const* spec) {
+    ImPlotPlotInfLines_S16(label_id, values, count, *spec);
+}
+
+extern "C" void ImPlotPlotInfLines_S32_wrap(const char* label_id, const ImS32* values, int count, ImPlotSpec const* spec) {
+    ImPlotPlotInfLines_S32(label_id, values, count, *spec);
+}
+
+extern "C" void ImPlotPlotInfLines_S64_wrap(const char* label_id, const ImS64* values, int count, ImPlotSpec const* spec) {
+    ImPlotPlotInfLines_S64(label_id, values, count, *spec);
+}
+
+extern "C" void ImPlotPlotInfLines_S8_wrap(const char* label_id, const ImS8* values, int count, ImPlotSpec const* spec) {
+    ImPlotPlotInfLines_S8(label_id, values, count, *spec);
+}
+
+extern "C" void ImPlotPlotInfLines_U16_wrap(const char* label_id, const ImU16* values, int count, ImPlotSpec const* spec) {
+    ImPlotPlotInfLines_U16(label_id, values, count, *spec);
+}
+
+extern "C" void ImPlotPlotInfLines_U32_wrap(const char* label_id, const ImU32* values, int count, ImPlotSpec const* spec) {
+    ImPlotPlotInfLines_U32(label_id, values, count, *spec);
+}
+
+extern "C" void ImPlotPlotInfLines_U64_wrap(const char* label_id, const ImU64* values, int count, ImPlotSpec const* spec) {
+    ImPlotPlotInfLines_U64(label_id, values, count, *spec);
+}
+
+extern "C" void ImPlotPlotInfLines_U8_wrap(const char* label_id, const ImU8* values, int count, ImPlotSpec const* spec) {
+    ImPlotPlotInfLines_U8(label_id, values, count, *spec);
+}
+
+extern "C" void ImPlotPlotLineG_wrap(const char* label_id, ImPlotGetter getter, void* data, int count, ImPlotSpec const* spec) {
+    ImPlotPlotLineG(label_id, getter, data, count, *spec);
+}
+
+extern "C" void ImPlotPlotLine_F32_wrap(const char* label_id, const float* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotLine_F32(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotLine_F64_wrap(const char* label_id, const double* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotLine_F64(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotLine_S16_wrap(const char* label_id, const ImS16* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotLine_S16(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotLine_S32_wrap(const char* label_id, const ImS32* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotLine_S32(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotLine_S64_wrap(const char* label_id, const ImS64* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotLine_S64(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotLine_S8_wrap(const char* label_id, const ImS8* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotLine_S8(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotLine_U16_wrap(const char* label_id, const ImU16* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotLine_U16(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotLine_U32_wrap(const char* label_id, const ImU32* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotLine_U32(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotLine_U64_wrap(const char* label_id, const ImU64* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotLine_U64(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotLine_U8_wrap(const char* label_id, const ImU8* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotLine_U8(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotLine_xy_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotLine_xy_F32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotLine_xy_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotLine_xy_F64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotLine_xy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotLine_xy_S16(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotLine_xy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotLine_xy_S32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotLine_xy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotLine_xy_S64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotLine_xy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotLine_xy_S8(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotLine_xy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotLine_xy_U16(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotLine_xy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotLine_xy_U32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotLine_xy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotLine_xy_U64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotLine_xy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotLine_xy_U8(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_F32_wrap(const char*const* label_ids, const float* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_F32(label_ids, values, count, x, y, radius, label_fmt, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_F64_wrap(const char*const* label_ids, const double* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_F64(label_ids, values, count, x, y, radius, label_fmt, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_S16_wrap(const char*const* label_ids, const ImS16* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_S16(label_ids, values, count, x, y, radius, label_fmt, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_S32_wrap(const char*const* label_ids, const ImS32* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_S32(label_ids, values, count, x, y, radius, label_fmt, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_S64_wrap(const char*const* label_ids, const ImS64* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_S64(label_ids, values, count, x, y, radius, label_fmt, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_S8_wrap(const char*const* label_ids, const ImS8* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_S8(label_ids, values, count, x, y, radius, label_fmt, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_U16_wrap(const char*const* label_ids, const ImU16* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_U16(label_ids, values, count, x, y, radius, label_fmt, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_U32_wrap(const char*const* label_ids, const ImU32* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_U32(label_ids, values, count, x, y, radius, label_fmt, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_U64_wrap(const char*const* label_ids, const ImU64* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_U64(label_ids, values, count, x, y, radius, label_fmt, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_U8_wrap(const char*const* label_ids, const ImU8* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_U8(label_ids, values, count, x, y, radius, label_fmt, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_fmt_F32_wrap(const char*const* label_ids, const float* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_fmt_F32(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_fmt_F64_wrap(const char*const* label_ids, const double* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_fmt_F64(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_fmt_S16_wrap(const char*const* label_ids, const ImS16* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_fmt_S16(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_fmt_S32_wrap(const char*const* label_ids, const ImS32* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_fmt_S32(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_fmt_S64_wrap(const char*const* label_ids, const ImS64* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_fmt_S64(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_fmt_S8_wrap(const char*const* label_ids, const ImS8* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_fmt_S8(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_fmt_U16_wrap(const char*const* label_ids, const ImU16* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_fmt_U16(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_fmt_U32_wrap(const char*const* label_ids, const ImU32* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_fmt_U32(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_fmt_U64_wrap(const char*const* label_ids, const ImU64* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_fmt_U64(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPieChart_fmt_U8_wrap(const char*const* label_ids, const ImU8* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec) {
+    ImPlotPlotPieChart_fmt_U8(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, *spec);
+}
+
+extern "C" void ImPlotPlotPolygon_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotPolygon_F32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotPolygon_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotPolygon_F64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotPolygon_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotPolygon_S16(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotPolygon_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotPolygon_S32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotPolygon_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotPolygon_S64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotPolygon_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotPolygon_S8(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotPolygon_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotPolygon_U16(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotPolygon_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotPolygon_U32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotPolygon_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotPolygon_U64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotPolygon_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotPolygon_U8(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotScatterG_wrap(const char* label_id, ImPlotGetter getter, void* data, int count, ImPlotSpec const* spec) {
+    ImPlotPlotScatterG(label_id, getter, data, count, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_F32_wrap(const char* label_id, const float* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_F32(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_F64_wrap(const char* label_id, const double* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_F64(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_S16_wrap(const char* label_id, const ImS16* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_S16(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_S32_wrap(const char* label_id, const ImS32* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_S32(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_S64_wrap(const char* label_id, const ImS64* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_S64(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_S8_wrap(const char* label_id, const ImS8* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_S8(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_U16_wrap(const char* label_id, const ImU16* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_U16(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_U32_wrap(const char* label_id, const ImU32* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_U32(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_U64_wrap(const char* label_id, const ImU64* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_U64(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_U8_wrap(const char* label_id, const ImU8* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_U8(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_xy_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_xy_F32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_xy_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_xy_F64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_xy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_xy_S16(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_xy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_xy_S32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_xy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_xy_S64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_xy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_xy_S8(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_xy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_xy_U16(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_xy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_xy_U32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_xy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_xy_U64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotScatter_xy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotScatter_xy_U8(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotShadedG_wrap(const char* label_id, ImPlotGetter getter1, void* data1, ImPlotGetter getter2, void* data2, int count, ImPlotSpec const* spec) {
+    ImPlotPlotShadedG(label_id, getter1, data1, getter2, data2, count, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_F32_wrap(const char* label_id, const float* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_F32(label_id, values, count, yref, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_F64_wrap(const char* label_id, const double* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_F64(label_id, values, count, yref, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_S16_wrap(const char* label_id, const ImS16* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_S16(label_id, values, count, yref, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_S32_wrap(const char* label_id, const ImS32* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_S32(label_id, values, count, yref, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_S64_wrap(const char* label_id, const ImS64* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_S64(label_id, values, count, yref, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_S8_wrap(const char* label_id, const ImS8* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_S8(label_id, values, count, yref, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_U16_wrap(const char* label_id, const ImU16* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_U16(label_id, values, count, yref, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_U32_wrap(const char* label_id, const ImU32* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_U32(label_id, values, count, yref, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_U64_wrap(const char* label_id, const ImU64* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_U64(label_id, values, count, yref, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_U8_wrap(const char* label_id, const ImU8* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_U8(label_id, values, count, yref, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xy_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, double yref, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xy_F32(label_id, xs, ys, count, yref, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xy_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, double yref, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xy_F64(label_id, xs, ys, count, yref, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double yref, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xy_S16(label_id, xs, ys, count, yref, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double yref, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xy_S32(label_id, xs, ys, count, yref, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double yref, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xy_S64(label_id, xs, ys, count, yref, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double yref, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xy_S8(label_id, xs, ys, count, yref, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double yref, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xy_U16(label_id, xs, ys, count, yref, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double yref, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xy_U32(label_id, xs, ys, count, yref, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double yref, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xy_U64(label_id, xs, ys, count, yref, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double yref, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xy_U8(label_id, xs, ys, count, yref, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xyy_F32_wrap(const char* label_id, const float* xs, const float* ys1, const float* ys2, int count, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xyy_F32(label_id, xs, ys1, ys2, count, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xyy_F64_wrap(const char* label_id, const double* xs, const double* ys1, const double* ys2, int count, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xyy_F64(label_id, xs, ys1, ys2, count, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xyy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys1, const ImS16* ys2, int count, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xyy_S16(label_id, xs, ys1, ys2, count, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xyy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys1, const ImS32* ys2, int count, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xyy_S32(label_id, xs, ys1, ys2, count, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xyy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys1, const ImS64* ys2, int count, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xyy_S64(label_id, xs, ys1, ys2, count, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xyy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys1, const ImS8* ys2, int count, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xyy_S8(label_id, xs, ys1, ys2, count, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xyy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys1, const ImU16* ys2, int count, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xyy_U16(label_id, xs, ys1, ys2, count, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xyy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys1, const ImU32* ys2, int count, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xyy_U32(label_id, xs, ys1, ys2, count, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xyy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys1, const ImU64* ys2, int count, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xyy_U64(label_id, xs, ys1, ys2, count, *spec);
+}
+
+extern "C" void ImPlotPlotShaded_xyy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys1, const ImU8* ys2, int count, ImPlotSpec const* spec) {
+    ImPlotPlotShaded_xyy_U8(label_id, xs, ys1, ys2, count, *spec);
+}
+
+extern "C" void ImPlotPlotStairsG_wrap(const char* label_id, ImPlotGetter getter, void* data, int count, ImPlotSpec const* spec) {
+    ImPlotPlotStairsG(label_id, getter, data, count, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_F32_wrap(const char* label_id, const float* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_F32(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_F64_wrap(const char* label_id, const double* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_F64(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_S16_wrap(const char* label_id, const ImS16* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_S16(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_S32_wrap(const char* label_id, const ImS32* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_S32(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_S64_wrap(const char* label_id, const ImS64* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_S64(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_S8_wrap(const char* label_id, const ImS8* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_S8(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_U16_wrap(const char* label_id, const ImU16* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_U16(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_U32_wrap(const char* label_id, const ImU32* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_U32(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_U64_wrap(const char* label_id, const ImU64* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_U64(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_U8_wrap(const char* label_id, const ImU8* values, int count, double xscale, double xstart, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_U8(label_id, values, count, xscale, xstart, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_xy_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_xy_F32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_xy_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_xy_F64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_xy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_xy_S16(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_xy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_xy_S32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_xy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_xy_S64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_xy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_xy_S8(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_xy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_xy_U16(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_xy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_xy_U32(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_xy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_xy_U64(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotStairs_xy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec const* spec) {
+    ImPlotPlotStairs_xy_U8(label_id, xs, ys, count, *spec);
+}
+
+extern "C" void ImPlotPlotStems_F32_wrap(const char* label_id, const float* values, int count, double ref, double scale, double start, ImPlotSpec const* spec) {
+    ImPlotPlotStems_F32(label_id, values, count, ref, scale, start, *spec);
+}
+
+extern "C" void ImPlotPlotStems_F64_wrap(const char* label_id, const double* values, int count, double ref, double scale, double start, ImPlotSpec const* spec) {
+    ImPlotPlotStems_F64(label_id, values, count, ref, scale, start, *spec);
+}
+
+extern "C" void ImPlotPlotStems_S16_wrap(const char* label_id, const ImS16* values, int count, double ref, double scale, double start, ImPlotSpec const* spec) {
+    ImPlotPlotStems_S16(label_id, values, count, ref, scale, start, *spec);
+}
+
+extern "C" void ImPlotPlotStems_S32_wrap(const char* label_id, const ImS32* values, int count, double ref, double scale, double start, ImPlotSpec const* spec) {
+    ImPlotPlotStems_S32(label_id, values, count, ref, scale, start, *spec);
+}
+
+extern "C" void ImPlotPlotStems_S64_wrap(const char* label_id, const ImS64* values, int count, double ref, double scale, double start, ImPlotSpec const* spec) {
+    ImPlotPlotStems_S64(label_id, values, count, ref, scale, start, *spec);
+}
+
+extern "C" void ImPlotPlotStems_S8_wrap(const char* label_id, const ImS8* values, int count, double ref, double scale, double start, ImPlotSpec const* spec) {
+    ImPlotPlotStems_S8(label_id, values, count, ref, scale, start, *spec);
+}
+
+extern "C" void ImPlotPlotStems_U16_wrap(const char* label_id, const ImU16* values, int count, double ref, double scale, double start, ImPlotSpec const* spec) {
+    ImPlotPlotStems_U16(label_id, values, count, ref, scale, start, *spec);
+}
+
+extern "C" void ImPlotPlotStems_U32_wrap(const char* label_id, const ImU32* values, int count, double ref, double scale, double start, ImPlotSpec const* spec) {
+    ImPlotPlotStems_U32(label_id, values, count, ref, scale, start, *spec);
+}
+
+extern "C" void ImPlotPlotStems_U64_wrap(const char* label_id, const ImU64* values, int count, double ref, double scale, double start, ImPlotSpec const* spec) {
+    ImPlotPlotStems_U64(label_id, values, count, ref, scale, start, *spec);
+}
+
+extern "C" void ImPlotPlotStems_U8_wrap(const char* label_id, const ImU8* values, int count, double ref, double scale, double start, ImPlotSpec const* spec) {
+    ImPlotPlotStems_U8(label_id, values, count, ref, scale, start, *spec);
+}
+
+extern "C" void ImPlotPlotStems_xy_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, double ref, ImPlotSpec const* spec) {
+    ImPlotPlotStems_xy_F32(label_id, xs, ys, count, ref, *spec);
+}
+
+extern "C" void ImPlotPlotStems_xy_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, double ref, ImPlotSpec const* spec) {
+    ImPlotPlotStems_xy_F64(label_id, xs, ys, count, ref, *spec);
+}
+
+extern "C" void ImPlotPlotStems_xy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double ref, ImPlotSpec const* spec) {
+    ImPlotPlotStems_xy_S16(label_id, xs, ys, count, ref, *spec);
+}
+
+extern "C" void ImPlotPlotStems_xy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double ref, ImPlotSpec const* spec) {
+    ImPlotPlotStems_xy_S32(label_id, xs, ys, count, ref, *spec);
+}
+
+extern "C" void ImPlotPlotStems_xy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double ref, ImPlotSpec const* spec) {
+    ImPlotPlotStems_xy_S64(label_id, xs, ys, count, ref, *spec);
+}
+
+extern "C" void ImPlotPlotStems_xy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double ref, ImPlotSpec const* spec) {
+    ImPlotPlotStems_xy_S8(label_id, xs, ys, count, ref, *spec);
+}
+
+extern "C" void ImPlotPlotStems_xy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double ref, ImPlotSpec const* spec) {
+    ImPlotPlotStems_xy_U16(label_id, xs, ys, count, ref, *spec);
+}
+
+extern "C" void ImPlotPlotStems_xy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double ref, ImPlotSpec const* spec) {
+    ImPlotPlotStems_xy_U32(label_id, xs, ys, count, ref, *spec);
+}
+
+extern "C" void ImPlotPlotStems_xy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double ref, ImPlotSpec const* spec) {
+    ImPlotPlotStems_xy_U64(label_id, xs, ys, count, ref, *spec);
+}
+
+extern "C" void ImPlotPlotStems_xy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double ref, ImPlotSpec const* spec) {
+    ImPlotPlotStems_xy_U8(label_id, xs, ys, count, ref, *spec);
+}
+
+extern "C" void ImPlotPlotText_wrap(const char* text, double x, double y, ImVec2 const* pix_offset, ImPlotSpec const* spec) {
+    ImPlotPlotText(text, x, y, *pix_offset, *spec);
+}
+
+extern "C" void ImPlotPlotToPixels_wrap(ImPlotPoint const* plt, ImAxis x_axis, ImAxis y_axis, ImVec2* _out) {
+    *_out = ImPlotPlotToPixels(*plt, x_axis, y_axis);
+}
+
+extern "C" void ImPlotPlotToPixelsDouble_wrap(double x, double y, ImAxis x_axis, ImAxis y_axis, ImVec2* _out) {
+    *_out = ImPlotPlotToPixelsDouble(x, y, x_axis, y_axis);
+}
+
+extern "C" void ImPlotPushStyleColorImVec4_wrap(ImPlotCol idx, ImVec4 const* col) {
+    ImPlotPushStyleColorImVec4(idx, *col);
+}
+
+extern "C" void ImPlotPushStyleVarImVec2_wrap(ImPlotStyleVar idx, ImVec2 const* val) {
+    ImPlotPushStyleVarImVec2(idx, *val);
+}
+
+extern "C" void ImPlotSampleColormap_wrap(float t, ImPlotColormap cmap, ImVec4* _out) {
+    *_out = ImPlotSampleColormap(t, cmap);
+}
+
+extern "C" void ImPlotTagX_wrap(double x, ImVec4 const* col, bool round) {
+    ImPlotTagX(x, *col, round);
+}
+
+extern "C" void ImPlotTagXStrUnformatted_wrap(double x, ImVec4 const* col, const char* text) {
+    ImPlotTagXStrUnformatted(x, *col, text);
+}
+
+extern "C" void ImPlotTagY_wrap(double y, ImVec4 const* col, bool round) {
+    ImPlotTagY(y, *col, round);
+}
+
+extern "C" void ImPlotTagYStrUnformatted_wrap(double y, ImVec4 const* col, const char* text) {
+    ImPlotTagYStrUnformatted(y, *col, text);
+}
+
+extern "C" bool ImPlotRect_Contains_wrap(const ImPlotRect* self, ImPlotPoint const* p) {
+    return ImPlotRect_Contains(self, *p);
+}
+
diff --git a/cbits/DearImGuiWrappers.h b/cbits/DearImGuiWrappers.h
new file mode 100644
--- /dev/null
+++ b/cbits/DearImGuiWrappers.h
@@ -0,0 +1,329 @@
+// Generated by dear-bindings-ffi. Do not edit.
+#ifndef DEAR_IMGUI_WRAPPERS_H
+#define DEAR_IMGUI_WRAPPERS_H
+
+#include "dcimgui_implot.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void ImPlotAnnotation_wrap(double x, double y, ImVec4 const* col, ImVec2 const* pix_offset, bool clamp, bool round);
+void ImPlotAnnotationStrUnformatted_wrap(double x, double y, ImVec4 const* col, ImVec2 const* pix_offset, bool clamp, const char* text);
+bool ImPlotBeginPlot_wrap(const char* title_id, ImVec2 const* size, ImPlotFlags flags);
+bool ImPlotBeginSubplots_wrap(const char* title_id, int rows, int cols, ImVec2 const* size, ImPlotSubplotFlags flags, float* row_ratios, float* col_ratios);
+bool ImPlotColormapButton_wrap(const char* label, ImVec2 const* size, ImPlotColormap cmap);
+void ImPlotColormapScale_wrap(const char* label, double scale_min, double scale_max, ImVec2 const* size, const char* format, ImPlotColormapScaleFlags flags, ImPlotColormap cmap);
+bool ImPlotDragLineX_wrap(int id, double* x, ImVec4 const* col, float thickness, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held);
+bool ImPlotDragLineY_wrap(int id, double* y, ImVec4 const* col, float thickness, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held);
+bool ImPlotDragPoint_wrap(int id, double* x, double* y, ImVec4 const* col, float size, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held);
+bool ImPlotDragRect_wrap(int id, double* x1, double* y1, double* x2, double* y2, ImVec4 const* col, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held);
+void ImPlotGetColormapColor_wrap(int idx, ImPlotColormap cmap, ImVec4* _out);
+void ImPlotGetLastItemColor_wrap(ImVec4* _out);
+void ImPlotGetPlotPos_wrap(ImVec2* _out);
+void ImPlotGetPlotSize_wrap(ImVec2* _out);
+void ImPlotItemIcon_wrap(ImVec4 const* col);
+void ImPlotNextColormapColor_wrap(ImVec4* _out);
+void ImPlotPlotBarGroups_F32_wrap(const char*const* label_ids, const float* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBarGroups_F64_wrap(const char*const* label_ids, const double* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBarGroups_S16_wrap(const char*const* label_ids, const ImS16* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBarGroups_S32_wrap(const char*const* label_ids, const ImS32* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBarGroups_S64_wrap(const char*const* label_ids, const ImS64* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBarGroups_S8_wrap(const char*const* label_ids, const ImS8* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBarGroups_U16_wrap(const char*const* label_ids, const ImU16* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBarGroups_U32_wrap(const char*const* label_ids, const ImU32* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBarGroups_U64_wrap(const char*const* label_ids, const ImU64* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBarGroups_U8_wrap(const char*const* label_ids, const ImU8* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBarsG_wrap(const char* label_id, ImPlotGetter getter, void* data, int count, double bar_size, ImPlotSpec const* spec);
+void ImPlotPlotBars_F32_wrap(const char* label_id, const float* values, int count, double bar_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBars_F64_wrap(const char* label_id, const double* values, int count, double bar_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBars_S16_wrap(const char* label_id, const ImS16* values, int count, double bar_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBars_S32_wrap(const char* label_id, const ImS32* values, int count, double bar_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBars_S64_wrap(const char* label_id, const ImS64* values, int count, double bar_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBars_S8_wrap(const char* label_id, const ImS8* values, int count, double bar_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBars_U16_wrap(const char* label_id, const ImU16* values, int count, double bar_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBars_U32_wrap(const char* label_id, const ImU32* values, int count, double bar_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBars_U64_wrap(const char* label_id, const ImU64* values, int count, double bar_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBars_U8_wrap(const char* label_id, const ImU8* values, int count, double bar_size, double shift, ImPlotSpec const* spec);
+void ImPlotPlotBars_xy_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, double bar_size, ImPlotSpec const* spec);
+void ImPlotPlotBars_xy_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, double bar_size, ImPlotSpec const* spec);
+void ImPlotPlotBars_xy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double bar_size, ImPlotSpec const* spec);
+void ImPlotPlotBars_xy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double bar_size, ImPlotSpec const* spec);
+void ImPlotPlotBars_xy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double bar_size, ImPlotSpec const* spec);
+void ImPlotPlotBars_xy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double bar_size, ImPlotSpec const* spec);
+void ImPlotPlotBars_xy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double bar_size, ImPlotSpec const* spec);
+void ImPlotPlotBars_xy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double bar_size, ImPlotSpec const* spec);
+void ImPlotPlotBars_xy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double bar_size, ImPlotSpec const* spec);
+void ImPlotPlotBars_xy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double bar_size, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_F32_wrap(const char* label_id, const float* values, const float* szs, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_F64_wrap(const char* label_id, const double* values, const double* szs, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_S16_wrap(const char* label_id, const ImS16* values, const ImS16* szs, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_S32_wrap(const char* label_id, const ImS32* values, const ImS32* szs, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_S64_wrap(const char* label_id, const ImS64* values, const ImS64* szs, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_S8_wrap(const char* label_id, const ImS8* values, const ImS8* szs, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_U16_wrap(const char* label_id, const ImU16* values, const ImU16* szs, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_U32_wrap(const char* label_id, const ImU32* values, const ImU32* szs, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_U64_wrap(const char* label_id, const ImU64* values, const ImU64* szs, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_U8_wrap(const char* label_id, const ImU8* values, const ImU8* szs, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_xy_F32_wrap(const char* label_id, const float* xs, const float* ys, const float* szs, int count, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_xy_F64_wrap(const char* label_id, const double* xs, const double* ys, const double* szs, int count, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_xy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* szs, int count, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_xy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* szs, int count, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_xy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* szs, int count, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_xy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* szs, int count, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_xy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* szs, int count, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_xy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* szs, int count, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_xy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* szs, int count, ImPlotSpec const* spec);
+void ImPlotPlotBubbles_xy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* szs, int count, ImPlotSpec const* spec);
+void ImPlotPlotDigitalG_wrap(const char* label_id, ImPlotGetter getter, void* data, int count, ImPlotSpec const* spec);
+void ImPlotPlotDigital_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotDigital_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotDigital_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotDigital_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotDigital_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotDigital_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotDigital_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotDigital_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotDigital_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotDigital_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotDummy_wrap(const char* label_id, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xye_F32_wrap(const char* label_id, const float* xs, const float* ys, const float* err, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xye_F64_wrap(const char* label_id, const double* xs, const double* ys, const double* err, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xye_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* err, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xye_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* err, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xye_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* err, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xye_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* err, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xye_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* err, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xye_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* err, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xye_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* err, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xye_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* err, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xynp_F32_wrap(const char* label_id, const float* xs, const float* ys, const float* neg, const float* pos, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xynp_F64_wrap(const char* label_id, const double* xs, const double* ys, const double* neg, const double* pos, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xynp_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* neg, const ImS16* pos, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xynp_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* neg, const ImS32* pos, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xynp_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* neg, const ImS64* pos, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xynp_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* neg, const ImS8* pos, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xynp_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* neg, const ImU16* pos, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xynp_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* neg, const ImU32* pos, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xynp_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* neg, const ImU64* pos, int count, ImPlotSpec const* spec);
+void ImPlotPlotErrorBars_xynp_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* neg, const ImU8* pos, int count, ImPlotSpec const* spec);
+void ImPlotPlotHeatmap_F32_wrap(const char* label_id, const float* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec);
+void ImPlotPlotHeatmap_F64_wrap(const char* label_id, const double* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec);
+void ImPlotPlotHeatmap_S16_wrap(const char* label_id, const ImS16* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec);
+void ImPlotPlotHeatmap_S32_wrap(const char* label_id, const ImS32* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec);
+void ImPlotPlotHeatmap_S64_wrap(const char* label_id, const ImS64* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec);
+void ImPlotPlotHeatmap_S8_wrap(const char* label_id, const ImS8* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec);
+void ImPlotPlotHeatmap_U16_wrap(const char* label_id, const ImU16* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec);
+void ImPlotPlotHeatmap_U32_wrap(const char* label_id, const ImU32* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec);
+void ImPlotPlotHeatmap_U64_wrap(const char* label_id, const ImU64* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec);
+void ImPlotPlotHeatmap_U8_wrap(const char* label_id, const ImU8* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImPlotSpec const* spec);
+double ImPlotPlotHistogram2D_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram2D_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram2D_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram2D_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram2D_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram2D_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram2D_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram2D_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram2D_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram2D_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, int x_bins, int y_bins, ImPlotRect const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram_F32_wrap(const char* label_id, const float* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram_F64_wrap(const char* label_id, const double* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram_S16_wrap(const char* label_id, const ImS16* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram_S32_wrap(const char* label_id, const ImS32* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram_S64_wrap(const char* label_id, const ImS64* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram_S8_wrap(const char* label_id, const ImS8* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram_U16_wrap(const char* label_id, const ImU16* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram_U32_wrap(const char* label_id, const ImU32* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram_U64_wrap(const char* label_id, const ImU64* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec);
+double ImPlotPlotHistogram_U8_wrap(const char* label_id, const ImU8* values, int count, int bins, double bar_scale, ImPlotRange const* range, ImPlotSpec const* spec);
+void ImPlotPlotImage_wrap(const char* label_id, ImTextureRef const* tex_ref, ImPlotPoint const* bounds_min, ImPlotPoint const* bounds_max, ImVec2 const* uv0, ImVec2 const* uv1, ImVec4 const* tint_col, ImPlotSpec const* spec);
+void ImPlotPlotInfLines_F32_wrap(const char* label_id, const float* values, int count, ImPlotSpec const* spec);
+void ImPlotPlotInfLines_F64_wrap(const char* label_id, const double* values, int count, ImPlotSpec const* spec);
+void ImPlotPlotInfLines_S16_wrap(const char* label_id, const ImS16* values, int count, ImPlotSpec const* spec);
+void ImPlotPlotInfLines_S32_wrap(const char* label_id, const ImS32* values, int count, ImPlotSpec const* spec);
+void ImPlotPlotInfLines_S64_wrap(const char* label_id, const ImS64* values, int count, ImPlotSpec const* spec);
+void ImPlotPlotInfLines_S8_wrap(const char* label_id, const ImS8* values, int count, ImPlotSpec const* spec);
+void ImPlotPlotInfLines_U16_wrap(const char* label_id, const ImU16* values, int count, ImPlotSpec const* spec);
+void ImPlotPlotInfLines_U32_wrap(const char* label_id, const ImU32* values, int count, ImPlotSpec const* spec);
+void ImPlotPlotInfLines_U64_wrap(const char* label_id, const ImU64* values, int count, ImPlotSpec const* spec);
+void ImPlotPlotInfLines_U8_wrap(const char* label_id, const ImU8* values, int count, ImPlotSpec const* spec);
+void ImPlotPlotLineG_wrap(const char* label_id, ImPlotGetter getter, void* data, int count, ImPlotSpec const* spec);
+void ImPlotPlotLine_F32_wrap(const char* label_id, const float* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotLine_F64_wrap(const char* label_id, const double* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotLine_S16_wrap(const char* label_id, const ImS16* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotLine_S32_wrap(const char* label_id, const ImS32* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotLine_S64_wrap(const char* label_id, const ImS64* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotLine_S8_wrap(const char* label_id, const ImS8* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotLine_U16_wrap(const char* label_id, const ImU16* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotLine_U32_wrap(const char* label_id, const ImU32* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotLine_U64_wrap(const char* label_id, const ImU64* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotLine_U8_wrap(const char* label_id, const ImU8* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotLine_xy_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotLine_xy_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotLine_xy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotLine_xy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotLine_xy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotLine_xy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotLine_xy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotLine_xy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotLine_xy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotLine_xy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_F32_wrap(const char*const* label_ids, const float* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_F64_wrap(const char*const* label_ids, const double* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_S16_wrap(const char*const* label_ids, const ImS16* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_S32_wrap(const char*const* label_ids, const ImS32* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_S64_wrap(const char*const* label_ids, const ImS64* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_S8_wrap(const char*const* label_ids, const ImS8* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_U16_wrap(const char*const* label_ids, const ImU16* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_U32_wrap(const char*const* label_ids, const ImU32* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_U64_wrap(const char*const* label_ids, const ImU64* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_U8_wrap(const char*const* label_ids, const ImU8* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_fmt_F32_wrap(const char*const* label_ids, const float* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_fmt_F64_wrap(const char*const* label_ids, const double* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_fmt_S16_wrap(const char*const* label_ids, const ImS16* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_fmt_S32_wrap(const char*const* label_ids, const ImS32* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_fmt_S64_wrap(const char*const* label_ids, const ImS64* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_fmt_S8_wrap(const char*const* label_ids, const ImS8* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_fmt_U16_wrap(const char*const* label_ids, const ImU16* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_fmt_U32_wrap(const char*const* label_ids, const ImU32* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_fmt_U64_wrap(const char*const* label_ids, const ImU64* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPieChart_fmt_U8_wrap(const char*const* label_ids, const ImU8* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec const* spec);
+void ImPlotPlotPolygon_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotPolygon_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotPolygon_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotPolygon_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotPolygon_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotPolygon_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotPolygon_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotPolygon_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotPolygon_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotPolygon_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotScatterG_wrap(const char* label_id, ImPlotGetter getter, void* data, int count, ImPlotSpec const* spec);
+void ImPlotPlotScatter_F32_wrap(const char* label_id, const float* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotScatter_F64_wrap(const char* label_id, const double* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotScatter_S16_wrap(const char* label_id, const ImS16* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotScatter_S32_wrap(const char* label_id, const ImS32* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotScatter_S64_wrap(const char* label_id, const ImS64* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotScatter_S8_wrap(const char* label_id, const ImS8* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotScatter_U16_wrap(const char* label_id, const ImU16* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotScatter_U32_wrap(const char* label_id, const ImU32* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotScatter_U64_wrap(const char* label_id, const ImU64* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotScatter_U8_wrap(const char* label_id, const ImU8* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotScatter_xy_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotScatter_xy_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotScatter_xy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotScatter_xy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotScatter_xy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotScatter_xy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotScatter_xy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotScatter_xy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotScatter_xy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotScatter_xy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotShadedG_wrap(const char* label_id, ImPlotGetter getter1, void* data1, ImPlotGetter getter2, void* data2, int count, ImPlotSpec const* spec);
+void ImPlotPlotShaded_F32_wrap(const char* label_id, const float* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotShaded_F64_wrap(const char* label_id, const double* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotShaded_S16_wrap(const char* label_id, const ImS16* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotShaded_S32_wrap(const char* label_id, const ImS32* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotShaded_S64_wrap(const char* label_id, const ImS64* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotShaded_S8_wrap(const char* label_id, const ImS8* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotShaded_U16_wrap(const char* label_id, const ImU16* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotShaded_U32_wrap(const char* label_id, const ImU32* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotShaded_U64_wrap(const char* label_id, const ImU64* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotShaded_U8_wrap(const char* label_id, const ImU8* values, int count, double yref, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xy_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, double yref, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xy_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, double yref, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double yref, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double yref, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double yref, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double yref, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double yref, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double yref, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double yref, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double yref, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xyy_F32_wrap(const char* label_id, const float* xs, const float* ys1, const float* ys2, int count, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xyy_F64_wrap(const char* label_id, const double* xs, const double* ys1, const double* ys2, int count, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xyy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys1, const ImS16* ys2, int count, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xyy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys1, const ImS32* ys2, int count, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xyy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys1, const ImS64* ys2, int count, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xyy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys1, const ImS8* ys2, int count, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xyy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys1, const ImU16* ys2, int count, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xyy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys1, const ImU32* ys2, int count, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xyy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys1, const ImU64* ys2, int count, ImPlotSpec const* spec);
+void ImPlotPlotShaded_xyy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys1, const ImU8* ys2, int count, ImPlotSpec const* spec);
+void ImPlotPlotStairsG_wrap(const char* label_id, ImPlotGetter getter, void* data, int count, ImPlotSpec const* spec);
+void ImPlotPlotStairs_F32_wrap(const char* label_id, const float* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotStairs_F64_wrap(const char* label_id, const double* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotStairs_S16_wrap(const char* label_id, const ImS16* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotStairs_S32_wrap(const char* label_id, const ImS32* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotStairs_S64_wrap(const char* label_id, const ImS64* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotStairs_S8_wrap(const char* label_id, const ImS8* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotStairs_U16_wrap(const char* label_id, const ImU16* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotStairs_U32_wrap(const char* label_id, const ImU32* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotStairs_U64_wrap(const char* label_id, const ImU64* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotStairs_U8_wrap(const char* label_id, const ImU8* values, int count, double xscale, double xstart, ImPlotSpec const* spec);
+void ImPlotPlotStairs_xy_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotStairs_xy_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotStairs_xy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotStairs_xy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotStairs_xy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotStairs_xy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotStairs_xy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotStairs_xy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotStairs_xy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotStairs_xy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec const* spec);
+void ImPlotPlotStems_F32_wrap(const char* label_id, const float* values, int count, double ref, double scale, double start, ImPlotSpec const* spec);
+void ImPlotPlotStems_F64_wrap(const char* label_id, const double* values, int count, double ref, double scale, double start, ImPlotSpec const* spec);
+void ImPlotPlotStems_S16_wrap(const char* label_id, const ImS16* values, int count, double ref, double scale, double start, ImPlotSpec const* spec);
+void ImPlotPlotStems_S32_wrap(const char* label_id, const ImS32* values, int count, double ref, double scale, double start, ImPlotSpec const* spec);
+void ImPlotPlotStems_S64_wrap(const char* label_id, const ImS64* values, int count, double ref, double scale, double start, ImPlotSpec const* spec);
+void ImPlotPlotStems_S8_wrap(const char* label_id, const ImS8* values, int count, double ref, double scale, double start, ImPlotSpec const* spec);
+void ImPlotPlotStems_U16_wrap(const char* label_id, const ImU16* values, int count, double ref, double scale, double start, ImPlotSpec const* spec);
+void ImPlotPlotStems_U32_wrap(const char* label_id, const ImU32* values, int count, double ref, double scale, double start, ImPlotSpec const* spec);
+void ImPlotPlotStems_U64_wrap(const char* label_id, const ImU64* values, int count, double ref, double scale, double start, ImPlotSpec const* spec);
+void ImPlotPlotStems_U8_wrap(const char* label_id, const ImU8* values, int count, double ref, double scale, double start, ImPlotSpec const* spec);
+void ImPlotPlotStems_xy_F32_wrap(const char* label_id, const float* xs, const float* ys, int count, double ref, ImPlotSpec const* spec);
+void ImPlotPlotStems_xy_F64_wrap(const char* label_id, const double* xs, const double* ys, int count, double ref, ImPlotSpec const* spec);
+void ImPlotPlotStems_xy_S16_wrap(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double ref, ImPlotSpec const* spec);
+void ImPlotPlotStems_xy_S32_wrap(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double ref, ImPlotSpec const* spec);
+void ImPlotPlotStems_xy_S64_wrap(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double ref, ImPlotSpec const* spec);
+void ImPlotPlotStems_xy_S8_wrap(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double ref, ImPlotSpec const* spec);
+void ImPlotPlotStems_xy_U16_wrap(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double ref, ImPlotSpec const* spec);
+void ImPlotPlotStems_xy_U32_wrap(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double ref, ImPlotSpec const* spec);
+void ImPlotPlotStems_xy_U64_wrap(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double ref, ImPlotSpec const* spec);
+void ImPlotPlotStems_xy_U8_wrap(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double ref, ImPlotSpec const* spec);
+void ImPlotPlotText_wrap(const char* text, double x, double y, ImVec2 const* pix_offset, ImPlotSpec const* spec);
+void ImPlotPlotToPixels_wrap(ImPlotPoint const* plt, ImAxis x_axis, ImAxis y_axis, ImVec2* _out);
+void ImPlotPlotToPixelsDouble_wrap(double x, double y, ImAxis x_axis, ImAxis y_axis, ImVec2* _out);
+void ImPlotPushStyleColorImVec4_wrap(ImPlotCol idx, ImVec4 const* col);
+void ImPlotPushStyleVarImVec2_wrap(ImPlotStyleVar idx, ImVec2 const* val);
+void ImPlotSampleColormap_wrap(float t, ImPlotColormap cmap, ImVec4* _out);
+void ImPlotTagX_wrap(double x, ImVec4 const* col, bool round);
+void ImPlotTagXStrUnformatted_wrap(double x, ImVec4 const* col, const char* text);
+void ImPlotTagY_wrap(double y, ImVec4 const* col, bool round);
+void ImPlotTagYStrUnformatted_wrap(double y, ImVec4 const* col, const char* text);
+bool ImPlotRect_Contains_wrap(const ImPlotRect* self, ImPlotPoint const* p);
+void ImPlotInputMap_Init_wrap(void* p);
+void ImPlotInputMap_Destroy_wrap(void* p);
+
+void ImPlotPoint_Init_wrap(void* p);
+void ImPlotPoint_Destroy_wrap(void* p);
+
+void ImPlotRange_Init_wrap(void* p);
+void ImPlotRange_Destroy_wrap(void* p);
+
+void ImPlotRect_Init_wrap(void* p);
+void ImPlotRect_Destroy_wrap(void* p);
+
+void ImPlotSpec_Init_wrap(void* p);
+void ImPlotSpec_Destroy_wrap(void* p);
+
+void ImPlotStyle_Init_wrap(void* p);
+void ImPlotStyle_Destroy_wrap(void* p);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/cbits/dcimgui_implot.cpp b/cbits/dcimgui_implot.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/dcimgui_implot.cpp
@@ -0,0 +1,2086 @@
+// THIS FILE HAS BEEN AUTO-GENERATED BY THE 'DEAR BINDINGS' GENERATOR.
+// **DO NOT EDIT DIRECTLY**
+// https://github.com/dearimgui/dear_bindings
+
+#include "imgui.h"
+#include "implot.h"
+// implot_shim.h declares the monomorphized PlotXxx_<Type>(...) entries
+// that dcimgui_implot.cpp's emitted wrappers call into; the upstream
+// implot.h doesn't see them because the shim is a generated overlay.
+#include "implot_shim.h"
+
+// Glue file consumed by dear_bindings at implot-binding generation
+// time. The cimgui namespace wraps the C-shape header so the
+// generator can emit type aliases without colliding with the C++
+// API; pulling dcimgui.h into the same namespace promotes ImVec2
+// and friends from forward-declared (the dcimgui_implot.h default) to
+// fully defined, which dcimgui_implot.cpp needs for its by-value
+// argument/return shims.
+#define DEAR_BINDINGS_INTERNAL_GLUE_CODE
+namespace cimgui
+{
+#include "dcimgui.h"
+#include "dcimgui_implot.h"
+}
+#undef DEAR_BINDINGS_INTERNAL_GLUE_CODE
+// By-value struct conversions
+
+static inline cimgui::ImVec2 ConvertFromCPP_ImVec2(const ::ImVec2& src)
+{
+    cimgui::ImVec2 dest;
+    dest.x = src.x;
+    dest.y = src.y;
+    return dest;
+}
+
+static inline ::ImVec2 ConvertToCPP_ImVec2(const cimgui::ImVec2& src)
+{
+    ::ImVec2 dest;
+    dest.x = src.x;
+    dest.y = src.y;
+    return dest;
+}
+
+static inline cimgui::ImVec4 ConvertFromCPP_ImVec4(const ::ImVec4& src)
+{
+    cimgui::ImVec4 dest;
+    dest.x = src.x;
+    dest.y = src.y;
+    dest.z = src.z;
+    dest.w = src.w;
+    return dest;
+}
+
+static inline ::ImVec4 ConvertToCPP_ImVec4(const cimgui::ImVec4& src)
+{
+    ::ImVec4 dest;
+    dest.x = src.x;
+    dest.y = src.y;
+    dest.z = src.z;
+    dest.w = src.w;
+    return dest;
+}
+
+static inline cimgui::ImTextureRef ConvertFromCPP_ImTextureRef(const ::ImTextureRef& src)
+{
+    cimgui::ImTextureRef dest;
+    dest._TexData = reinterpret_cast<cimgui::ImTextureData*>(src._TexData);
+    dest._TexID = src._TexID;
+    return dest;
+}
+
+static inline ::ImTextureRef ConvertToCPP_ImTextureRef(const cimgui::ImTextureRef& src)
+{
+    ::ImTextureRef dest;
+    dest._TexData = reinterpret_cast<::ImTextureData*>(src._TexData);
+    dest._TexID = src._TexID;
+    return dest;
+}
+
+static inline cimgui::ImColor ConvertFromCPP_ImColor(const ::ImColor& src)
+{
+    cimgui::ImColor dest;
+    dest.Value.x = src.Value.x;
+    dest.Value.y = src.Value.y;
+    dest.Value.z = src.Value.z;
+    dest.Value.w = src.Value.w;
+    return dest;
+}
+
+static inline ::ImColor ConvertToCPP_ImColor(const cimgui::ImColor& src)
+{
+    ::ImColor dest;
+    dest.Value.x = src.Value.x;
+    dest.Value.y = src.Value.y;
+    dest.Value.z = src.Value.z;
+    dest.Value.w = src.Value.w;
+    return dest;
+}
+
+// Function stubs
+
+#ifndef IMGUI_DISABLE
+
+CIMGUI_API bool   cimgui::ImPlotRange_Contains(const cimgui::ImPlotRange* self, double value)
+{
+    return reinterpret_cast<const ::ImPlotRange*>(self)->Contains(value);
+}
+
+CIMGUI_API double cimgui::ImPlotRange_Size(const cimgui::ImPlotRange* self)
+{
+    return reinterpret_cast<const ::ImPlotRange*>(self)->Size();
+}
+
+CIMGUI_API double cimgui::ImPlotRange_Clamp(const cimgui::ImPlotRange* self, double value)
+{
+    return reinterpret_cast<const ::ImPlotRange*>(self)->Clamp(value);
+}
+
+CIMGUI_API bool cimgui::ImPlotRect_Contains(const cimgui::ImPlotRect* self, cimgui::ImPlotPoint p)
+{
+    return reinterpret_cast<const ::ImPlotRect*>(self)->Contains(reinterpret_cast<const ::ImPlotPoint&>(p));
+}
+
+CIMGUI_API bool cimgui::ImPlotRect_ContainsDouble(const cimgui::ImPlotRect* self, double x, double y)
+{
+    return reinterpret_cast<const ::ImPlotRect*>(self)->Contains(x, y);
+}
+
+CIMGUI_API cimgui::ImPlotContext* cimgui::ImPlotCreateContext(void)
+{
+    return reinterpret_cast<::cimgui::ImPlotContext*>(::ImPlot::CreateContext());
+}
+
+CIMGUI_API void           cimgui::ImPlotDestroyContext(cimgui::ImPlotContext* ctx)
+{
+    ::ImPlot::DestroyContext(reinterpret_cast<::ImPlotContext*>(ctx));
+}
+
+CIMGUI_API cimgui::ImPlotContext* cimgui::ImPlotGetCurrentContext(void)
+{
+    return reinterpret_cast<::cimgui::ImPlotContext*>(::ImPlot::GetCurrentContext());
+}
+
+CIMGUI_API void           cimgui::ImPlotSetCurrentContext(cimgui::ImPlotContext* ctx)
+{
+    ::ImPlot::SetCurrentContext(reinterpret_cast<::ImPlotContext*>(ctx));
+}
+
+CIMGUI_API void cimgui::ImPlotSetImGuiContext(cimgui::ImGuiContext* ctx)
+{
+    ::ImPlot::SetImGuiContext(reinterpret_cast<::ImGuiContext*>(ctx));
+}
+
+CIMGUI_API bool cimgui::ImPlotBeginPlot(const char* title_id, cimgui::ImVec2 size, ImPlotFlags flags)
+{
+    return ::ImPlot::BeginPlot(title_id, ConvertToCPP_ImVec2(size), flags);
+}
+
+CIMGUI_API void cimgui::ImPlotEndPlot(void)
+{
+    ::ImPlot::EndPlot();
+}
+
+CIMGUI_API bool cimgui::ImPlotBeginSubplots(const char* title_id, int rows, int cols, cimgui::ImVec2 size, ImPlotSubplotFlags flags, float* row_ratios, float* col_ratios)
+{
+    return ::ImPlot::BeginSubplots(title_id, rows, cols, ConvertToCPP_ImVec2(size), flags, row_ratios, col_ratios);
+}
+
+CIMGUI_API void cimgui::ImPlotEndSubplots(void)
+{
+    ::ImPlot::EndSubplots();
+}
+
+CIMGUI_API void cimgui::ImPlotSetupAxis(ImAxis axis, const char* label, ImPlotAxisFlags flags)
+{
+    ::ImPlot::SetupAxis(axis, label, flags);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupAxisLimits(ImAxis axis, double v_min, double v_max, ImPlotCond cond)
+{
+    ::ImPlot::SetupAxisLimits(axis, v_min, v_max, cond);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupAxisLinks(ImAxis axis, double* link_min, double* link_max)
+{
+    ::ImPlot::SetupAxisLinks(axis, link_min, link_max);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupAxisFormat(ImAxis axis, const char* fmt)
+{
+    ::ImPlot::SetupAxisFormat(axis, fmt);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupAxisFormatImPlotFormatter(ImAxis axis, cimgui::ImPlotFormatter formatter, void* data)
+{
+    ::ImPlot::SetupAxisFormat(axis, reinterpret_cast<::ImPlotFormatter>(formatter), data);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupAxisTicks(ImAxis axis, const double* values, int n_ticks, const char*const labels[], bool keep_default)
+{
+    ::ImPlot::SetupAxisTicks(axis, values, n_ticks, labels, keep_default);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupAxisTicksDouble(ImAxis axis, double v_min, double v_max, int n_ticks, const char*const labels[], bool keep_default)
+{
+    ::ImPlot::SetupAxisTicks(axis, v_min, v_max, n_ticks, labels, keep_default);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupAxisScale(ImAxis axis, ImPlotScale scale)
+{
+    ::ImPlot::SetupAxisScale(axis, scale);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupAxisScaleImPlotTransform(ImAxis axis, cimgui::ImPlotTransform forward, cimgui::ImPlotTransform inverse, void* data)
+{
+    ::ImPlot::SetupAxisScale(axis, reinterpret_cast<::ImPlotTransform>(forward), reinterpret_cast<::ImPlotTransform>(inverse), data);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupAxisLimitsConstraints(ImAxis axis, double v_min, double v_max)
+{
+    ::ImPlot::SetupAxisLimitsConstraints(axis, v_min, v_max);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupAxisZoomConstraints(ImAxis axis, double z_min, double z_max)
+{
+    ::ImPlot::SetupAxisZoomConstraints(axis, z_min, z_max);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupAxes(const char* x_label, const char* y_label, ImPlotAxisFlags x_flags, ImPlotAxisFlags y_flags)
+{
+    ::ImPlot::SetupAxes(x_label, y_label, x_flags, y_flags);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupAxesLimits(double x_min, double x_max, double y_min, double y_max, ImPlotCond cond)
+{
+    ::ImPlot::SetupAxesLimits(x_min, x_max, y_min, y_max, cond);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupLegend(ImPlotLocation location, ImPlotLegendFlags flags)
+{
+    ::ImPlot::SetupLegend(location, flags);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupMouseText(ImPlotLocation location, ImPlotMouseTextFlags flags)
+{
+    ::ImPlot::SetupMouseText(location, flags);
+}
+
+CIMGUI_API void cimgui::ImPlotSetupFinish(void)
+{
+    ::ImPlot::SetupFinish();
+}
+
+CIMGUI_API void cimgui::ImPlotSetNextAxisLimits(ImAxis axis, double v_min, double v_max, ImPlotCond cond)
+{
+    ::ImPlot::SetNextAxisLimits(axis, v_min, v_max, cond);
+}
+
+CIMGUI_API void cimgui::ImPlotSetNextAxisLinks(ImAxis axis, double* link_min, double* link_max)
+{
+    ::ImPlot::SetNextAxisLinks(axis, link_min, link_max);
+}
+
+CIMGUI_API void cimgui::ImPlotSetNextAxisToFit(ImAxis axis)
+{
+    ::ImPlot::SetNextAxisToFit(axis);
+}
+
+CIMGUI_API void cimgui::ImPlotSetNextAxesLimits(double x_min, double x_max, double y_min, double y_max, ImPlotCond cond)
+{
+    ::ImPlot::SetNextAxesLimits(x_min, x_max, y_min, y_max, cond);
+}
+
+CIMGUI_API void cimgui::ImPlotSetNextAxesToFit(void)
+{
+    ::ImPlot::SetNextAxesToFit();
+}
+
+CIMGUI_API void cimgui::ImPlotPlotLineG(const char* label_id, cimgui::ImPlotGetter getter, void* data, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLineG(label_id, reinterpret_cast<::ImPlotGetter>(getter), data, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void cimgui::ImPlotPlotScatterG(const char* label_id, cimgui::ImPlotGetter getter, void* data, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatterG(label_id, reinterpret_cast<::ImPlotGetter>(getter), data, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void cimgui::ImPlotPlotStairsG(const char* label_id, cimgui::ImPlotGetter getter, void* data, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairsG(label_id, reinterpret_cast<::ImPlotGetter>(getter), data, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void cimgui::ImPlotPlotShadedG(const char* label_id, cimgui::ImPlotGetter getter1, void* data1, cimgui::ImPlotGetter getter2, void* data2, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShadedG(label_id, reinterpret_cast<::ImPlotGetter>(getter1), data1, reinterpret_cast<::ImPlotGetter>(getter2), data2, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void cimgui::ImPlotPlotBarsG(const char* label_id, cimgui::ImPlotGetter getter, void* data, int count, double bar_size, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBarsG(label_id, reinterpret_cast<::ImPlotGetter>(getter), data, count, bar_size, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void cimgui::ImPlotPlotDigitalG(const char* label_id, cimgui::ImPlotGetter getter, void* data, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotDigitalG(label_id, reinterpret_cast<::ImPlotGetter>(getter), data, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+#ifdef IMGUI_HAS_TEXTURES
+
+CIMGUI_API void cimgui::ImPlotPlotImage(const char* label_id, cimgui::ImTextureRef tex_ref, cimgui::ImPlotPoint bounds_min, cimgui::ImPlotPoint bounds_max, cimgui::ImVec2 uv0, cimgui::ImVec2 uv1, cimgui::ImVec4 tint_col, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotImage(label_id, ConvertToCPP_ImTextureRef(tex_ref), reinterpret_cast<const ::ImPlotPoint&>(bounds_min), reinterpret_cast<const ::ImPlotPoint&>(bounds_max), ConvertToCPP_ImVec2(uv0), ConvertToCPP_ImVec2(uv1), ConvertToCPP_ImVec4(tint_col), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+#endif // #ifdef IMGUI_HAS_TEXTURES
+
+#ifndef IMGUI_HAS_TEXTURES
+
+CIMGUI_API void cimgui::ImPlotPlotImage(const char* label_id, ImTextureID tex_ref, cimgui::ImPlotPoint bounds_min, cimgui::ImPlotPoint bounds_max, cimgui::ImVec2 uv0, cimgui::ImVec2 uv1, cimgui::ImVec4 tint_col, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotImage(label_id, tex_ref, reinterpret_cast<const ::ImPlotPoint&>(bounds_min), reinterpret_cast<const ::ImPlotPoint&>(bounds_max), ConvertToCPP_ImVec2(uv0), ConvertToCPP_ImVec2(uv1), ConvertToCPP_ImVec4(tint_col), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+#endif // #ifndef IMGUI_HAS_TEXTURES
+
+CIMGUI_API void cimgui::ImPlotPlotText(const char* text, double x, double y, cimgui::ImVec2 pix_offset, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotText(text, x, y, ConvertToCPP_ImVec2(pix_offset), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void cimgui::ImPlotPlotDummy(const char* label_id, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotDummy(label_id, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API bool cimgui::ImPlotDragPoint(int id, double* x, double* y, cimgui::ImVec4 col, float size, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held)
+{
+    return ::ImPlot::DragPoint(id, x, y, ConvertToCPP_ImVec4(col), size, flags, out_clicked, out_hovered, out_held);
+}
+
+CIMGUI_API bool cimgui::ImPlotDragLineX(int id, double* x, cimgui::ImVec4 col, float thickness, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held)
+{
+    return ::ImPlot::DragLineX(id, x, ConvertToCPP_ImVec4(col), thickness, flags, out_clicked, out_hovered, out_held);
+}
+
+CIMGUI_API bool cimgui::ImPlotDragLineY(int id, double* y, cimgui::ImVec4 col, float thickness, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held)
+{
+    return ::ImPlot::DragLineY(id, y, ConvertToCPP_ImVec4(col), thickness, flags, out_clicked, out_hovered, out_held);
+}
+
+CIMGUI_API bool cimgui::ImPlotDragRect(int id, double* x1, double* y1, double* x2, double* y2, cimgui::ImVec4 col, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held)
+{
+    return ::ImPlot::DragRect(id, x1, y1, x2, y2, ConvertToCPP_ImVec4(col), flags, out_clicked, out_hovered, out_held);
+}
+
+CIMGUI_API void cimgui::ImPlotAnnotation(double x, double y, cimgui::ImVec4 col, cimgui::ImVec2 pix_offset, bool clamp, bool round)
+{
+    ::ImPlot::Annotation(x, y, ConvertToCPP_ImVec4(col), ConvertToCPP_ImVec2(pix_offset), clamp, round);
+}
+
+CIMGUI_API void cimgui::ImPlotAnnotationStr(double x, double y, cimgui::ImVec4 col, cimgui::ImVec2 pix_offset, bool clamp, const char* fmt, ...)
+{
+    va_list args;
+    va_start(args, fmt);
+    ::ImPlot::AnnotationV(x, y, ConvertToCPP_ImVec4(col), ConvertToCPP_ImVec2(pix_offset), clamp, fmt, args);
+    va_end(args);
+}
+
+CIMGUI_API void cimgui::ImPlotAnnotationStrUnformatted(double x, double y, cimgui::ImVec4 col, cimgui::ImVec2 pix_offset, bool clamp, const char* text)
+{
+    ::ImPlot::Annotation(x, y, ConvertToCPP_ImVec4(col), ConvertToCPP_ImVec2(pix_offset), clamp, "%s", text);
+}
+
+CIMGUI_API void cimgui::ImPlotAnnotationV(double x, double y, cimgui::ImVec4 col, cimgui::ImVec2 pix_offset, bool clamp, const char* fmt, va_list args)
+{
+    ::ImPlot::AnnotationV(x, y, ConvertToCPP_ImVec4(col), ConvertToCPP_ImVec2(pix_offset), clamp, fmt, args);
+}
+
+CIMGUI_API void cimgui::ImPlotTagX(double x, cimgui::ImVec4 col, bool round)
+{
+    ::ImPlot::TagX(x, ConvertToCPP_ImVec4(col), round);
+}
+
+CIMGUI_API void cimgui::ImPlotTagXStr(double x, cimgui::ImVec4 col, const char* fmt, ...)
+{
+    va_list args;
+    va_start(args, fmt);
+    ::ImPlot::TagXV(x, ConvertToCPP_ImVec4(col), fmt, args);
+    va_end(args);
+}
+
+CIMGUI_API void cimgui::ImPlotTagXStrUnformatted(double x, cimgui::ImVec4 col, const char* text)
+{
+    ::ImPlot::TagX(x, ConvertToCPP_ImVec4(col), "%s", text);
+}
+
+CIMGUI_API void cimgui::ImPlotTagXV(double x, cimgui::ImVec4 col, const char* fmt, va_list args)
+{
+    ::ImPlot::TagXV(x, ConvertToCPP_ImVec4(col), fmt, args);
+}
+
+CIMGUI_API void cimgui::ImPlotTagY(double y, cimgui::ImVec4 col, bool round)
+{
+    ::ImPlot::TagY(y, ConvertToCPP_ImVec4(col), round);
+}
+
+CIMGUI_API void cimgui::ImPlotTagYStr(double y, cimgui::ImVec4 col, const char* fmt, ...)
+{
+    va_list args;
+    va_start(args, fmt);
+    ::ImPlot::TagYV(y, ConvertToCPP_ImVec4(col), fmt, args);
+    va_end(args);
+}
+
+CIMGUI_API void cimgui::ImPlotTagYStrUnformatted(double y, cimgui::ImVec4 col, const char* text)
+{
+    ::ImPlot::TagY(y, ConvertToCPP_ImVec4(col), "%s", text);
+}
+
+CIMGUI_API void cimgui::ImPlotTagYV(double y, cimgui::ImVec4 col, const char* fmt, va_list args)
+{
+    ::ImPlot::TagYV(y, ConvertToCPP_ImVec4(col), fmt, args);
+}
+
+CIMGUI_API void cimgui::ImPlotSetAxis(ImAxis axis)
+{
+    ::ImPlot::SetAxis(axis);
+}
+
+CIMGUI_API void cimgui::ImPlotSetAxes(ImAxis x_axis, ImAxis y_axis)
+{
+    ::ImPlot::SetAxes(x_axis, y_axis);
+}
+
+CIMGUI_API cimgui::ImVec2 cimgui::ImPlotPlotToPixels(cimgui::ImPlotPoint plt, ImAxis x_axis, ImAxis y_axis)
+{
+    return ConvertFromCPP_ImVec2(::ImPlot::PlotToPixels(reinterpret_cast<const ::ImPlotPoint&>(plt), x_axis, y_axis));
+}
+
+CIMGUI_API cimgui::ImVec2 cimgui::ImPlotPlotToPixelsDouble(double x, double y, ImAxis x_axis, ImAxis y_axis)
+{
+    return ConvertFromCPP_ImVec2(::ImPlot::PlotToPixels(x, y, x_axis, y_axis));
+}
+
+CIMGUI_API cimgui::ImVec2 cimgui::ImPlotGetPlotPos(void)
+{
+    return ConvertFromCPP_ImVec2(::ImPlot::GetPlotPos());
+}
+
+CIMGUI_API cimgui::ImVec2 cimgui::ImPlotGetPlotSize(void)
+{
+    return ConvertFromCPP_ImVec2(::ImPlot::GetPlotSize());
+}
+
+CIMGUI_API bool cimgui::ImPlotIsPlotHovered(void)
+{
+    return ::ImPlot::IsPlotHovered();
+}
+
+CIMGUI_API bool cimgui::ImPlotIsAxisHovered(ImAxis axis)
+{
+    return ::ImPlot::IsAxisHovered(axis);
+}
+
+CIMGUI_API bool cimgui::ImPlotIsSubplotsHovered(void)
+{
+    return ::ImPlot::IsSubplotsHovered();
+}
+
+CIMGUI_API bool cimgui::ImPlotIsPlotSelected(void)
+{
+    return ::ImPlot::IsPlotSelected();
+}
+
+CIMGUI_API void cimgui::ImPlotCancelPlotSelection(void)
+{
+    ::ImPlot::CancelPlotSelection();
+}
+
+CIMGUI_API void cimgui::ImPlotHideNextItem(bool hidden, ImPlotCond cond)
+{
+    ::ImPlot::HideNextItem(hidden, cond);
+}
+
+CIMGUI_API bool cimgui::ImPlotBeginAlignedPlots(const char* group_id, bool vertical)
+{
+    return ::ImPlot::BeginAlignedPlots(group_id, vertical);
+}
+
+CIMGUI_API void cimgui::ImPlotEndAlignedPlots(void)
+{
+    ::ImPlot::EndAlignedPlots();
+}
+
+CIMGUI_API bool cimgui::ImPlotBeginLegendPopup(const char* label_id, ImGuiMouseButton mouse_button)
+{
+    return ::ImPlot::BeginLegendPopup(label_id, mouse_button);
+}
+
+CIMGUI_API void cimgui::ImPlotEndLegendPopup(void)
+{
+    ::ImPlot::EndLegendPopup();
+}
+
+CIMGUI_API bool cimgui::ImPlotIsLegendEntryHovered(const char* label_id)
+{
+    return ::ImPlot::IsLegendEntryHovered(label_id);
+}
+
+CIMGUI_API bool cimgui::ImPlotBeginDragDropTargetPlot(void)
+{
+    return ::ImPlot::BeginDragDropTargetPlot();
+}
+
+CIMGUI_API bool cimgui::ImPlotBeginDragDropTargetAxis(ImAxis axis)
+{
+    return ::ImPlot::BeginDragDropTargetAxis(axis);
+}
+
+CIMGUI_API bool cimgui::ImPlotBeginDragDropTargetLegend(void)
+{
+    return ::ImPlot::BeginDragDropTargetLegend();
+}
+
+CIMGUI_API void cimgui::ImPlotEndDragDropTarget(void)
+{
+    ::ImPlot::EndDragDropTarget();
+}
+
+CIMGUI_API bool cimgui::ImPlotBeginDragDropSourcePlot(ImGuiDragDropFlags flags)
+{
+    return ::ImPlot::BeginDragDropSourcePlot(flags);
+}
+
+CIMGUI_API bool cimgui::ImPlotBeginDragDropSourceAxis(ImAxis axis, ImGuiDragDropFlags flags)
+{
+    return ::ImPlot::BeginDragDropSourceAxis(axis, flags);
+}
+
+CIMGUI_API bool cimgui::ImPlotBeginDragDropSourceItem(const char* label_id, ImGuiDragDropFlags flags)
+{
+    return ::ImPlot::BeginDragDropSourceItem(label_id, flags);
+}
+
+CIMGUI_API void cimgui::ImPlotEndDragDropSource(void)
+{
+    ::ImPlot::EndDragDropSource();
+}
+
+CIMGUI_API cimgui::ImPlotStyle* cimgui::ImPlotGetStyle(void)
+{
+    return reinterpret_cast<::cimgui::ImPlotStyle*>(&::ImPlot::GetStyle());
+}
+
+CIMGUI_API void cimgui::ImPlotStyleColorsAuto(cimgui::ImPlotStyle* dst)
+{
+    ::ImPlot::StyleColorsAuto(reinterpret_cast<::ImPlotStyle*>(dst));
+}
+
+CIMGUI_API void cimgui::ImPlotStyleColorsClassic(cimgui::ImPlotStyle* dst)
+{
+    ::ImPlot::StyleColorsClassic(reinterpret_cast<::ImPlotStyle*>(dst));
+}
+
+CIMGUI_API void cimgui::ImPlotStyleColorsDark(cimgui::ImPlotStyle* dst)
+{
+    ::ImPlot::StyleColorsDark(reinterpret_cast<::ImPlotStyle*>(dst));
+}
+
+CIMGUI_API void cimgui::ImPlotStyleColorsLight(cimgui::ImPlotStyle* dst)
+{
+    ::ImPlot::StyleColorsLight(reinterpret_cast<::ImPlotStyle*>(dst));
+}
+
+CIMGUI_API void cimgui::ImPlotPushStyleColor(ImPlotCol idx, ImU32 col)
+{
+    ::ImPlot::PushStyleColor(idx, col);
+}
+
+CIMGUI_API void cimgui::ImPlotPushStyleColorImVec4(ImPlotCol idx, cimgui::ImVec4 col)
+{
+    ::ImPlot::PushStyleColor(idx, ConvertToCPP_ImVec4(col));
+}
+
+CIMGUI_API void cimgui::ImPlotPopStyleColor(int count)
+{
+    ::ImPlot::PopStyleColor(count);
+}
+
+CIMGUI_API void cimgui::ImPlotPushStyleVar(ImPlotStyleVar idx, float val)
+{
+    ::ImPlot::PushStyleVar(idx, val);
+}
+
+CIMGUI_API void cimgui::ImPlotPushStyleVarInt(ImPlotStyleVar idx, int val)
+{
+    ::ImPlot::PushStyleVar(idx, val);
+}
+
+CIMGUI_API void cimgui::ImPlotPushStyleVarImVec2(ImPlotStyleVar idx, cimgui::ImVec2 val)
+{
+    ::ImPlot::PushStyleVar(idx, ConvertToCPP_ImVec2(val));
+}
+
+CIMGUI_API void cimgui::ImPlotPopStyleVar(int count)
+{
+    ::ImPlot::PopStyleVar(count);
+}
+
+CIMGUI_API cimgui::ImVec4 cimgui::ImPlotGetLastItemColor(void)
+{
+    return ConvertFromCPP_ImVec4(::ImPlot::GetLastItemColor());
+}
+
+CIMGUI_API const char* cimgui::ImPlotGetStyleColorName(ImPlotCol idx)
+{
+    return ::ImPlot::GetStyleColorName(idx);
+}
+
+CIMGUI_API const char* cimgui::ImPlotGetMarkerName(ImPlotMarker idx)
+{
+    return ::ImPlot::GetMarkerName(idx);
+}
+
+CIMGUI_API ImPlotMarker cimgui::ImPlotNextMarker(void)
+{
+    return ::ImPlot::NextMarker();
+}
+
+CIMGUI_API ImPlotColormap cimgui::ImPlotAddColormap(const char* name, const cimgui::ImVec4* cols, int size, bool qual)
+{
+    return ::ImPlot::AddColormap(name, reinterpret_cast<const ::ImVec4*>(cols), size, qual);
+}
+
+CIMGUI_API ImPlotColormap cimgui::ImPlotAddColormapImU32Ptr(const char* name, const ImU32* cols, int size, bool qual)
+{
+    return ::ImPlot::AddColormap(name, cols, size, qual);
+}
+
+CIMGUI_API int            cimgui::ImPlotGetColormapCount(void)
+{
+    return ::ImPlot::GetColormapCount();
+}
+
+CIMGUI_API const char*    cimgui::ImPlotGetColormapName(ImPlotColormap cmap)
+{
+    return ::ImPlot::GetColormapName(cmap);
+}
+
+CIMGUI_API ImPlotColormap cimgui::ImPlotGetColormapIndex(const char* name)
+{
+    return ::ImPlot::GetColormapIndex(name);
+}
+
+CIMGUI_API void cimgui::ImPlotPushColormap(ImPlotColormap cmap)
+{
+    ::ImPlot::PushColormap(cmap);
+}
+
+CIMGUI_API void cimgui::ImPlotPushColormapStr(const char* name)
+{
+    ::ImPlot::PushColormap(name);
+}
+
+CIMGUI_API void cimgui::ImPlotPopColormap(int count)
+{
+    ::ImPlot::PopColormap(count);
+}
+
+CIMGUI_API cimgui::ImVec4 cimgui::ImPlotNextColormapColor(void)
+{
+    return ConvertFromCPP_ImVec4(::ImPlot::NextColormapColor());
+}
+
+CIMGUI_API int    cimgui::ImPlotGetColormapSize(ImPlotColormap cmap)
+{
+    return ::ImPlot::GetColormapSize(cmap);
+}
+
+CIMGUI_API cimgui::ImVec4 cimgui::ImPlotGetColormapColor(int idx, ImPlotColormap cmap)
+{
+    return ConvertFromCPP_ImVec4(::ImPlot::GetColormapColor(idx, cmap));
+}
+
+CIMGUI_API cimgui::ImVec4 cimgui::ImPlotSampleColormap(float t, ImPlotColormap cmap)
+{
+    return ConvertFromCPP_ImVec4(::ImPlot::SampleColormap(t, cmap));
+}
+
+CIMGUI_API void cimgui::ImPlotColormapScale(const char* label, double scale_min, double scale_max, cimgui::ImVec2 size, const char* format, ImPlotColormapScaleFlags flags, ImPlotColormap cmap)
+{
+    ::ImPlot::ColormapScale(label, scale_min, scale_max, ConvertToCPP_ImVec2(size), format, flags, cmap);
+}
+
+CIMGUI_API bool cimgui::ImPlotColormapSlider(const char* label, float* t, cimgui::ImVec4* out, const char* format, ImPlotColormap cmap)
+{
+    return ::ImPlot::ColormapSlider(label, t, reinterpret_cast<::ImVec4*>(out), format, cmap);
+}
+
+CIMGUI_API bool cimgui::ImPlotColormapButton(const char* label, cimgui::ImVec2 size, ImPlotColormap cmap)
+{
+    return ::ImPlot::ColormapButton(label, ConvertToCPP_ImVec2(size), cmap);
+}
+
+CIMGUI_API void cimgui::ImPlotBustColorCache(const char* plot_title_id)
+{
+    ::ImPlot::BustColorCache(plot_title_id);
+}
+
+CIMGUI_API cimgui::ImPlotInputMap* cimgui::ImPlotGetInputMap(void)
+{
+    return reinterpret_cast<::cimgui::ImPlotInputMap*>(&::ImPlot::GetInputMap());
+}
+
+CIMGUI_API void cimgui::ImPlotMapInputDefault(cimgui::ImPlotInputMap* dst)
+{
+    ::ImPlot::MapInputDefault(reinterpret_cast<::ImPlotInputMap*>(dst));
+}
+
+CIMGUI_API void cimgui::ImPlotMapInputReverse(cimgui::ImPlotInputMap* dst)
+{
+    ::ImPlot::MapInputReverse(reinterpret_cast<::ImPlotInputMap*>(dst));
+}
+
+CIMGUI_API void cimgui::ImPlotItemIcon(cimgui::ImVec4 col)
+{
+    ::ImPlot::ItemIcon(ConvertToCPP_ImVec4(col));
+}
+
+CIMGUI_API void cimgui::ImPlotItemIconImU32(ImU32 col)
+{
+    ::ImPlot::ItemIcon(col);
+}
+
+CIMGUI_API void cimgui::ImPlotColormapIcon(ImPlotColormap cmap)
+{
+    ::ImPlot::ColormapIcon(cmap);
+}
+
+CIMGUI_API cimgui::ImDrawList* cimgui::ImPlotGetPlotDrawList(void)
+{
+    return reinterpret_cast<::cimgui::ImDrawList*>(::ImPlot::GetPlotDrawList());
+}
+
+CIMGUI_API void        cimgui::ImPlotPushPlotClipRect(float expand)
+{
+    ::ImPlot::PushPlotClipRect(expand);
+}
+
+CIMGUI_API void        cimgui::ImPlotPopPlotClipRect(void)
+{
+    ::ImPlot::PopPlotClipRect();
+}
+
+CIMGUI_API bool cimgui::ImPlotShowStyleSelector(const char* label)
+{
+    return ::ImPlot::ShowStyleSelector(label);
+}
+
+CIMGUI_API bool cimgui::ImPlotShowColormapSelector(const char* label)
+{
+    return ::ImPlot::ShowColormapSelector(label);
+}
+
+CIMGUI_API bool cimgui::ImPlotShowInputMapSelector(const char* label)
+{
+    return ::ImPlot::ShowInputMapSelector(label);
+}
+
+CIMGUI_API void cimgui::ImPlotShowStyleEditor(cimgui::ImPlotStyle* ref)
+{
+    ::ImPlot::ShowStyleEditor(reinterpret_cast<::ImPlotStyle*>(ref));
+}
+
+CIMGUI_API void cimgui::ImPlotShowUserGuide(void)
+{
+    ::ImPlot::ShowUserGuide();
+}
+
+CIMGUI_API void cimgui::ImPlotShowMetricsWindow(bool* p_popen)
+{
+    ::ImPlot::ShowMetricsWindow(p_popen);
+}
+
+#endif // #ifndef IMGUI_DISABLE
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_S8(const char* label_id, const ImS8* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_S8(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_U8(const char* label_id, const ImU8* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_U8(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_S16(const char* label_id, const ImS16* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_S16(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_U16(const char* label_id, const ImU16* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_U16(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_S32(const char* label_id, const ImS32* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_S32(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_U32(const char* label_id, const ImU32* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_U32(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_S64(const char* label_id, const ImS64* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_S64(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_U64(const char* label_id, const ImU64* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_U64(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_F32(const char* label_id, const float* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_F32(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_F64(const char* label_id, const double* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_F64(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_xy_S8(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_xy_U8(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_xy_S16(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_xy_U16(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_xy_S32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_xy_U32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_xy_S64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_xy_U64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_xy_F32(const char* label_id, const float* xs, const float* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_xy_F32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotLine_xy_F64(const char* label_id, const double* xs, const double* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotLine_xy_F64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_S8(const char* label_id, const ImS8* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_S8(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_U8(const char* label_id, const ImU8* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_U8(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_S16(const char* label_id, const ImS16* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_S16(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_U16(const char* label_id, const ImU16* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_U16(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_S32(const char* label_id, const ImS32* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_S32(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_U32(const char* label_id, const ImU32* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_U32(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_S64(const char* label_id, const ImS64* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_S64(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_U64(const char* label_id, const ImU64* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_U64(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_F32(const char* label_id, const float* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_F32(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_F64(const char* label_id, const double* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_F64(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_xy_S8(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_xy_U8(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_xy_S16(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_xy_U16(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_xy_S32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_xy_U32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_xy_S64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_xy_U64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_xy_F32(const char* label_id, const float* xs, const float* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_xy_F32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotScatter_xy_F64(const char* label_id, const double* xs, const double* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotScatter_xy_F64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_S8(const char* label_id, const ImS8* values, const ImS8* szs, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_S8(label_id, values, szs, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_U8(const char* label_id, const ImU8* values, const ImU8* szs, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_U8(label_id, values, szs, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_S16(const char* label_id, const ImS16* values, const ImS16* szs, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_S16(label_id, values, szs, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_U16(const char* label_id, const ImU16* values, const ImU16* szs, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_U16(label_id, values, szs, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_S32(const char* label_id, const ImS32* values, const ImS32* szs, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_S32(label_id, values, szs, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_U32(const char* label_id, const ImU32* values, const ImU32* szs, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_U32(label_id, values, szs, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_S64(const char* label_id, const ImS64* values, const ImS64* szs, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_S64(label_id, values, szs, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_U64(const char* label_id, const ImU64* values, const ImU64* szs, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_U64(label_id, values, szs, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_F32(const char* label_id, const float* values, const float* szs, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_F32(label_id, values, szs, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_F64(const char* label_id, const double* values, const double* szs, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_F64(label_id, values, szs, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* szs, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_xy_S8(label_id, xs, ys, szs, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* szs, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_xy_U8(label_id, xs, ys, szs, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* szs, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_xy_S16(label_id, xs, ys, szs, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* szs, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_xy_U16(label_id, xs, ys, szs, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* szs, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_xy_S32(label_id, xs, ys, szs, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* szs, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_xy_U32(label_id, xs, ys, szs, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* szs, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_xy_S64(label_id, xs, ys, szs, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* szs, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_xy_U64(label_id, xs, ys, szs, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_xy_F32(const char* label_id, const float* xs, const float* ys, const float* szs, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_xy_F32(label_id, xs, ys, szs, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBubbles_xy_F64(const char* label_id, const double* xs, const double* ys, const double* szs, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBubbles_xy_F64(label_id, xs, ys, szs, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPolygon_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPolygon_S8(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPolygon_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPolygon_U8(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPolygon_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPolygon_S16(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPolygon_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPolygon_U16(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPolygon_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPolygon_S32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPolygon_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPolygon_U32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPolygon_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPolygon_S64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPolygon_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPolygon_U64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPolygon_F32(const char* label_id, const float* xs, const float* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPolygon_F32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPolygon_F64(const char* label_id, const double* xs, const double* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPolygon_F64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_S8(const char* label_id, const ImS8* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_S8(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_U8(const char* label_id, const ImU8* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_U8(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_S16(const char* label_id, const ImS16* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_S16(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_U16(const char* label_id, const ImU16* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_U16(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_S32(const char* label_id, const ImS32* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_S32(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_U32(const char* label_id, const ImU32* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_U32(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_S64(const char* label_id, const ImS64* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_S64(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_U64(const char* label_id, const ImU64* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_U64(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_F32(const char* label_id, const float* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_F32(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_F64(const char* label_id, const double* values, int count, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_F64(label_id, values, count, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_xy_S8(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_xy_U8(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_xy_S16(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_xy_U16(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_xy_S32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_xy_U32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_xy_S64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_xy_U64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_xy_F32(const char* label_id, const float* xs, const float* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_xy_F32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStairs_xy_F64(const char* label_id, const double* xs, const double* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStairs_xy_F64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_S8(const char* label_id, const ImS8* values, int count, double yref, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_S8(label_id, values, count, yref, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_U8(const char* label_id, const ImU8* values, int count, double yref, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_U8(label_id, values, count, yref, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_S16(const char* label_id, const ImS16* values, int count, double yref, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_S16(label_id, values, count, yref, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_U16(const char* label_id, const ImU16* values, int count, double yref, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_U16(label_id, values, count, yref, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_S32(const char* label_id, const ImS32* values, int count, double yref, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_S32(label_id, values, count, yref, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_U32(const char* label_id, const ImU32* values, int count, double yref, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_U32(label_id, values, count, yref, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_S64(const char* label_id, const ImS64* values, int count, double yref, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_S64(label_id, values, count, yref, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_U64(const char* label_id, const ImU64* values, int count, double yref, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_U64(label_id, values, count, yref, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_F32(const char* label_id, const float* values, int count, double yref, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_F32(label_id, values, count, yref, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_F64(const char* label_id, const double* values, int count, double yref, double xscale, double xstart, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_F64(label_id, values, count, yref, xscale, xstart, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double yref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xy_S8(label_id, xs, ys, count, yref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double yref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xy_U8(label_id, xs, ys, count, yref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double yref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xy_S16(label_id, xs, ys, count, yref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double yref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xy_U16(label_id, xs, ys, count, yref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double yref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xy_S32(label_id, xs, ys, count, yref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double yref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xy_U32(label_id, xs, ys, count, yref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double yref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xy_S64(label_id, xs, ys, count, yref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double yref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xy_U64(label_id, xs, ys, count, yref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xy_F32(const char* label_id, const float* xs, const float* ys, int count, double yref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xy_F32(label_id, xs, ys, count, yref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xy_F64(const char* label_id, const double* xs, const double* ys, int count, double yref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xy_F64(label_id, xs, ys, count, yref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xyy_S8(const char* label_id, const ImS8* xs, const ImS8* ys1, const ImS8* ys2, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xyy_S8(label_id, xs, ys1, ys2, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xyy_U8(const char* label_id, const ImU8* xs, const ImU8* ys1, const ImU8* ys2, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xyy_U8(label_id, xs, ys1, ys2, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xyy_S16(const char* label_id, const ImS16* xs, const ImS16* ys1, const ImS16* ys2, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xyy_S16(label_id, xs, ys1, ys2, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xyy_U16(const char* label_id, const ImU16* xs, const ImU16* ys1, const ImU16* ys2, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xyy_U16(label_id, xs, ys1, ys2, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xyy_S32(const char* label_id, const ImS32* xs, const ImS32* ys1, const ImS32* ys2, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xyy_S32(label_id, xs, ys1, ys2, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xyy_U32(const char* label_id, const ImU32* xs, const ImU32* ys1, const ImU32* ys2, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xyy_U32(label_id, xs, ys1, ys2, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xyy_S64(const char* label_id, const ImS64* xs, const ImS64* ys1, const ImS64* ys2, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xyy_S64(label_id, xs, ys1, ys2, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xyy_U64(const char* label_id, const ImU64* xs, const ImU64* ys1, const ImU64* ys2, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xyy_U64(label_id, xs, ys1, ys2, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xyy_F32(const char* label_id, const float* xs, const float* ys1, const float* ys2, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xyy_F32(label_id, xs, ys1, ys2, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotShaded_xyy_F64(const char* label_id, const double* xs, const double* ys1, const double* ys2, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotShaded_xyy_F64(label_id, xs, ys1, ys2, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_S8(const char* label_id, const ImS8* values, int count, double bar_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_S8(label_id, values, count, bar_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_U8(const char* label_id, const ImU8* values, int count, double bar_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_U8(label_id, values, count, bar_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_S16(const char* label_id, const ImS16* values, int count, double bar_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_S16(label_id, values, count, bar_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_U16(const char* label_id, const ImU16* values, int count, double bar_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_U16(label_id, values, count, bar_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_S32(const char* label_id, const ImS32* values, int count, double bar_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_S32(label_id, values, count, bar_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_U32(const char* label_id, const ImU32* values, int count, double bar_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_U32(label_id, values, count, bar_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_S64(const char* label_id, const ImS64* values, int count, double bar_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_S64(label_id, values, count, bar_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_U64(const char* label_id, const ImU64* values, int count, double bar_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_U64(label_id, values, count, bar_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_F32(const char* label_id, const float* values, int count, double bar_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_F32(label_id, values, count, bar_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_F64(const char* label_id, const double* values, int count, double bar_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_F64(label_id, values, count, bar_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double bar_size, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_xy_S8(label_id, xs, ys, count, bar_size, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double bar_size, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_xy_U8(label_id, xs, ys, count, bar_size, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double bar_size, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_xy_S16(label_id, xs, ys, count, bar_size, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double bar_size, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_xy_U16(label_id, xs, ys, count, bar_size, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double bar_size, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_xy_S32(label_id, xs, ys, count, bar_size, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double bar_size, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_xy_U32(label_id, xs, ys, count, bar_size, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double bar_size, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_xy_S64(label_id, xs, ys, count, bar_size, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double bar_size, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_xy_U64(label_id, xs, ys, count, bar_size, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_xy_F32(const char* label_id, const float* xs, const float* ys, int count, double bar_size, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_xy_F32(label_id, xs, ys, count, bar_size, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBars_xy_F64(const char* label_id, const double* xs, const double* ys, int count, double bar_size, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBars_xy_F64(label_id, xs, ys, count, bar_size, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBarGroups_S8(const char*const label_ids[], const ImS8* values, int item_count, int group_count, double group_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBarGroups_S8(label_ids, values, item_count, group_count, group_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBarGroups_U8(const char*const label_ids[], const ImU8* values, int item_count, int group_count, double group_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBarGroups_U8(label_ids, values, item_count, group_count, group_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBarGroups_S16(const char*const label_ids[], const ImS16* values, int item_count, int group_count, double group_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBarGroups_S16(label_ids, values, item_count, group_count, group_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBarGroups_U16(const char*const label_ids[], const ImU16* values, int item_count, int group_count, double group_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBarGroups_U16(label_ids, values, item_count, group_count, group_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBarGroups_S32(const char*const label_ids[], const ImS32* values, int item_count, int group_count, double group_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBarGroups_S32(label_ids, values, item_count, group_count, group_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBarGroups_U32(const char*const label_ids[], const ImU32* values, int item_count, int group_count, double group_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBarGroups_U32(label_ids, values, item_count, group_count, group_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBarGroups_S64(const char*const label_ids[], const ImS64* values, int item_count, int group_count, double group_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBarGroups_S64(label_ids, values, item_count, group_count, group_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBarGroups_U64(const char*const label_ids[], const ImU64* values, int item_count, int group_count, double group_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBarGroups_U64(label_ids, values, item_count, group_count, group_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBarGroups_F32(const char*const label_ids[], const float* values, int item_count, int group_count, double group_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBarGroups_F32(label_ids, values, item_count, group_count, group_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotBarGroups_F64(const char*const label_ids[], const double* values, int item_count, int group_count, double group_size, double shift, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotBarGroups_F64(label_ids, values, item_count, group_count, group_size, shift, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xye_S8(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* err, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xye_S8(label_id, xs, ys, err, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xye_U8(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* err, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xye_U8(label_id, xs, ys, err, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xye_S16(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* err, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xye_S16(label_id, xs, ys, err, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xye_U16(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* err, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xye_U16(label_id, xs, ys, err, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xye_S32(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* err, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xye_S32(label_id, xs, ys, err, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xye_U32(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* err, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xye_U32(label_id, xs, ys, err, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xye_S64(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* err, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xye_S64(label_id, xs, ys, err, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xye_U64(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* err, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xye_U64(label_id, xs, ys, err, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xye_F32(const char* label_id, const float* xs, const float* ys, const float* err, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xye_F32(label_id, xs, ys, err, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xye_F64(const char* label_id, const double* xs, const double* ys, const double* err, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xye_F64(label_id, xs, ys, err, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xynp_S8(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* neg, const ImS8* pos, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xynp_S8(label_id, xs, ys, neg, pos, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xynp_U8(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* neg, const ImU8* pos, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xynp_U8(label_id, xs, ys, neg, pos, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xynp_S16(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* neg, const ImS16* pos, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xynp_S16(label_id, xs, ys, neg, pos, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xynp_U16(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* neg, const ImU16* pos, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xynp_U16(label_id, xs, ys, neg, pos, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xynp_S32(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* neg, const ImS32* pos, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xynp_S32(label_id, xs, ys, neg, pos, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xynp_U32(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* neg, const ImU32* pos, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xynp_U32(label_id, xs, ys, neg, pos, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xynp_S64(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* neg, const ImS64* pos, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xynp_S64(label_id, xs, ys, neg, pos, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xynp_U64(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* neg, const ImU64* pos, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xynp_U64(label_id, xs, ys, neg, pos, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xynp_F32(const char* label_id, const float* xs, const float* ys, const float* neg, const float* pos, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xynp_F32(label_id, xs, ys, neg, pos, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotErrorBars_xynp_F64(const char* label_id, const double* xs, const double* ys, const double* neg, const double* pos, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotErrorBars_xynp_F64(label_id, xs, ys, neg, pos, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_S8(const char* label_id, const ImS8* values, int count, double ref, double scale, double start, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_S8(label_id, values, count, ref, scale, start, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_U8(const char* label_id, const ImU8* values, int count, double ref, double scale, double start, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_U8(label_id, values, count, ref, scale, start, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_S16(const char* label_id, const ImS16* values, int count, double ref, double scale, double start, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_S16(label_id, values, count, ref, scale, start, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_U16(const char* label_id, const ImU16* values, int count, double ref, double scale, double start, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_U16(label_id, values, count, ref, scale, start, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_S32(const char* label_id, const ImS32* values, int count, double ref, double scale, double start, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_S32(label_id, values, count, ref, scale, start, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_U32(const char* label_id, const ImU32* values, int count, double ref, double scale, double start, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_U32(label_id, values, count, ref, scale, start, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_S64(const char* label_id, const ImS64* values, int count, double ref, double scale, double start, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_S64(label_id, values, count, ref, scale, start, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_U64(const char* label_id, const ImU64* values, int count, double ref, double scale, double start, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_U64(label_id, values, count, ref, scale, start, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_F32(const char* label_id, const float* values, int count, double ref, double scale, double start, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_F32(label_id, values, count, ref, scale, start, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_F64(const char* label_id, const double* values, int count, double ref, double scale, double start, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_F64(label_id, values, count, ref, scale, start, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double ref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_xy_S8(label_id, xs, ys, count, ref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double ref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_xy_U8(label_id, xs, ys, count, ref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double ref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_xy_S16(label_id, xs, ys, count, ref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double ref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_xy_U16(label_id, xs, ys, count, ref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double ref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_xy_S32(label_id, xs, ys, count, ref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double ref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_xy_U32(label_id, xs, ys, count, ref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double ref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_xy_S64(label_id, xs, ys, count, ref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double ref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_xy_U64(label_id, xs, ys, count, ref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_xy_F32(const char* label_id, const float* xs, const float* ys, int count, double ref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_xy_F32(label_id, xs, ys, count, ref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotStems_xy_F64(const char* label_id, const double* xs, const double* ys, int count, double ref, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotStems_xy_F64(label_id, xs, ys, count, ref, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotInfLines_S8(const char* label_id, const ImS8* values, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotInfLines_S8(label_id, values, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotInfLines_U8(const char* label_id, const ImU8* values, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotInfLines_U8(label_id, values, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotInfLines_S16(const char* label_id, const ImS16* values, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotInfLines_S16(label_id, values, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotInfLines_U16(const char* label_id, const ImU16* values, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotInfLines_U16(label_id, values, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotInfLines_S32(const char* label_id, const ImS32* values, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotInfLines_S32(label_id, values, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotInfLines_U32(const char* label_id, const ImU32* values, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotInfLines_U32(label_id, values, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotInfLines_S64(const char* label_id, const ImS64* values, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotInfLines_S64(label_id, values, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotInfLines_U64(const char* label_id, const ImU64* values, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotInfLines_U64(label_id, values, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotInfLines_F32(const char* label_id, const float* values, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotInfLines_F32(label_id, values, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotInfLines_F64(const char* label_id, const double* values, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotInfLines_F64(label_id, values, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_fmt_S8(const char*const label_ids[], const ImS8* values, int count, double x, double y, double radius, cimgui::ImPlotFormatter fmt, void* fmt_data, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_fmt_S8(label_ids, values, count, x, y, radius, reinterpret_cast<::ImPlotFormatter>(fmt), fmt_data, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_fmt_U8(const char*const label_ids[], const ImU8* values, int count, double x, double y, double radius, cimgui::ImPlotFormatter fmt, void* fmt_data, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_fmt_U8(label_ids, values, count, x, y, radius, reinterpret_cast<::ImPlotFormatter>(fmt), fmt_data, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_fmt_S16(const char*const label_ids[], const ImS16* values, int count, double x, double y, double radius, cimgui::ImPlotFormatter fmt, void* fmt_data, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_fmt_S16(label_ids, values, count, x, y, radius, reinterpret_cast<::ImPlotFormatter>(fmt), fmt_data, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_fmt_U16(const char*const label_ids[], const ImU16* values, int count, double x, double y, double radius, cimgui::ImPlotFormatter fmt, void* fmt_data, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_fmt_U16(label_ids, values, count, x, y, radius, reinterpret_cast<::ImPlotFormatter>(fmt), fmt_data, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_fmt_S32(const char*const label_ids[], const ImS32* values, int count, double x, double y, double radius, cimgui::ImPlotFormatter fmt, void* fmt_data, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_fmt_S32(label_ids, values, count, x, y, radius, reinterpret_cast<::ImPlotFormatter>(fmt), fmt_data, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_fmt_U32(const char*const label_ids[], const ImU32* values, int count, double x, double y, double radius, cimgui::ImPlotFormatter fmt, void* fmt_data, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_fmt_U32(label_ids, values, count, x, y, radius, reinterpret_cast<::ImPlotFormatter>(fmt), fmt_data, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_fmt_S64(const char*const label_ids[], const ImS64* values, int count, double x, double y, double radius, cimgui::ImPlotFormatter fmt, void* fmt_data, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_fmt_S64(label_ids, values, count, x, y, radius, reinterpret_cast<::ImPlotFormatter>(fmt), fmt_data, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_fmt_U64(const char*const label_ids[], const ImU64* values, int count, double x, double y, double radius, cimgui::ImPlotFormatter fmt, void* fmt_data, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_fmt_U64(label_ids, values, count, x, y, radius, reinterpret_cast<::ImPlotFormatter>(fmt), fmt_data, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_fmt_F32(const char*const label_ids[], const float* values, int count, double x, double y, double radius, cimgui::ImPlotFormatter fmt, void* fmt_data, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_fmt_F32(label_ids, values, count, x, y, radius, reinterpret_cast<::ImPlotFormatter>(fmt), fmt_data, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_fmt_F64(const char*const label_ids[], const double* values, int count, double x, double y, double radius, cimgui::ImPlotFormatter fmt, void* fmt_data, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_fmt_F64(label_ids, values, count, x, y, radius, reinterpret_cast<::ImPlotFormatter>(fmt), fmt_data, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_S8(const char*const label_ids[], const ImS8* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_S8(label_ids, values, count, x, y, radius, label_fmt, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_U8(const char*const label_ids[], const ImU8* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_U8(label_ids, values, count, x, y, radius, label_fmt, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_S16(const char*const label_ids[], const ImS16* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_S16(label_ids, values, count, x, y, radius, label_fmt, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_U16(const char*const label_ids[], const ImU16* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_U16(label_ids, values, count, x, y, radius, label_fmt, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_S32(const char*const label_ids[], const ImS32* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_S32(label_ids, values, count, x, y, radius, label_fmt, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_U32(const char*const label_ids[], const ImU32* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_U32(label_ids, values, count, x, y, radius, label_fmt, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_S64(const char*const label_ids[], const ImS64* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_S64(label_ids, values, count, x, y, radius, label_fmt, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_U64(const char*const label_ids[], const ImU64* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_U64(label_ids, values, count, x, y, radius, label_fmt, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_F32(const char*const label_ids[], const float* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_F32(label_ids, values, count, x, y, radius, label_fmt, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotPieChart_F64(const char*const label_ids[], const double* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotPieChart_F64(label_ids, values, count, x, y, radius, label_fmt, angle0, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotHeatmap_S8(const char* label_id, const ImS8* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, cimgui::ImPlotPoint bounds_min, cimgui::ImPlotPoint bounds_max, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotHeatmap_S8(label_id, values, rows, cols, scale_min, scale_max, label_fmt, reinterpret_cast<const ::ImPlotPoint&>(bounds_min), reinterpret_cast<const ::ImPlotPoint&>(bounds_max), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotHeatmap_U8(const char* label_id, const ImU8* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, cimgui::ImPlotPoint bounds_min, cimgui::ImPlotPoint bounds_max, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotHeatmap_U8(label_id, values, rows, cols, scale_min, scale_max, label_fmt, reinterpret_cast<const ::ImPlotPoint&>(bounds_min), reinterpret_cast<const ::ImPlotPoint&>(bounds_max), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotHeatmap_S16(const char* label_id, const ImS16* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, cimgui::ImPlotPoint bounds_min, cimgui::ImPlotPoint bounds_max, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotHeatmap_S16(label_id, values, rows, cols, scale_min, scale_max, label_fmt, reinterpret_cast<const ::ImPlotPoint&>(bounds_min), reinterpret_cast<const ::ImPlotPoint&>(bounds_max), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotHeatmap_U16(const char* label_id, const ImU16* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, cimgui::ImPlotPoint bounds_min, cimgui::ImPlotPoint bounds_max, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotHeatmap_U16(label_id, values, rows, cols, scale_min, scale_max, label_fmt, reinterpret_cast<const ::ImPlotPoint&>(bounds_min), reinterpret_cast<const ::ImPlotPoint&>(bounds_max), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotHeatmap_S32(const char* label_id, const ImS32* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, cimgui::ImPlotPoint bounds_min, cimgui::ImPlotPoint bounds_max, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotHeatmap_S32(label_id, values, rows, cols, scale_min, scale_max, label_fmt, reinterpret_cast<const ::ImPlotPoint&>(bounds_min), reinterpret_cast<const ::ImPlotPoint&>(bounds_max), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotHeatmap_U32(const char* label_id, const ImU32* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, cimgui::ImPlotPoint bounds_min, cimgui::ImPlotPoint bounds_max, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotHeatmap_U32(label_id, values, rows, cols, scale_min, scale_max, label_fmt, reinterpret_cast<const ::ImPlotPoint&>(bounds_min), reinterpret_cast<const ::ImPlotPoint&>(bounds_max), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotHeatmap_S64(const char* label_id, const ImS64* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, cimgui::ImPlotPoint bounds_min, cimgui::ImPlotPoint bounds_max, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotHeatmap_S64(label_id, values, rows, cols, scale_min, scale_max, label_fmt, reinterpret_cast<const ::ImPlotPoint&>(bounds_min), reinterpret_cast<const ::ImPlotPoint&>(bounds_max), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotHeatmap_U64(const char* label_id, const ImU64* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, cimgui::ImPlotPoint bounds_min, cimgui::ImPlotPoint bounds_max, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotHeatmap_U64(label_id, values, rows, cols, scale_min, scale_max, label_fmt, reinterpret_cast<const ::ImPlotPoint&>(bounds_min), reinterpret_cast<const ::ImPlotPoint&>(bounds_max), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotHeatmap_F32(const char* label_id, const float* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, cimgui::ImPlotPoint bounds_min, cimgui::ImPlotPoint bounds_max, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotHeatmap_F32(label_id, values, rows, cols, scale_min, scale_max, label_fmt, reinterpret_cast<const ::ImPlotPoint&>(bounds_min), reinterpret_cast<const ::ImPlotPoint&>(bounds_max), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotHeatmap_F64(const char* label_id, const double* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, cimgui::ImPlotPoint bounds_min, cimgui::ImPlotPoint bounds_max, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotHeatmap_F64(label_id, values, rows, cols, scale_min, scale_max, label_fmt, reinterpret_cast<const ::ImPlotPoint&>(bounds_min), reinterpret_cast<const ::ImPlotPoint&>(bounds_max), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram_S8(const char* label_id, const ImS8* values, int count, int bins, double bar_scale, cimgui::ImPlotRange range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram_S8(label_id, values, count, bins, bar_scale, reinterpret_cast<const ::ImPlotRange&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram_U8(const char* label_id, const ImU8* values, int count, int bins, double bar_scale, cimgui::ImPlotRange range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram_U8(label_id, values, count, bins, bar_scale, reinterpret_cast<const ::ImPlotRange&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram_S16(const char* label_id, const ImS16* values, int count, int bins, double bar_scale, cimgui::ImPlotRange range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram_S16(label_id, values, count, bins, bar_scale, reinterpret_cast<const ::ImPlotRange&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram_U16(const char* label_id, const ImU16* values, int count, int bins, double bar_scale, cimgui::ImPlotRange range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram_U16(label_id, values, count, bins, bar_scale, reinterpret_cast<const ::ImPlotRange&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram_S32(const char* label_id, const ImS32* values, int count, int bins, double bar_scale, cimgui::ImPlotRange range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram_S32(label_id, values, count, bins, bar_scale, reinterpret_cast<const ::ImPlotRange&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram_U32(const char* label_id, const ImU32* values, int count, int bins, double bar_scale, cimgui::ImPlotRange range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram_U32(label_id, values, count, bins, bar_scale, reinterpret_cast<const ::ImPlotRange&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram_S64(const char* label_id, const ImS64* values, int count, int bins, double bar_scale, cimgui::ImPlotRange range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram_S64(label_id, values, count, bins, bar_scale, reinterpret_cast<const ::ImPlotRange&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram_U64(const char* label_id, const ImU64* values, int count, int bins, double bar_scale, cimgui::ImPlotRange range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram_U64(label_id, values, count, bins, bar_scale, reinterpret_cast<const ::ImPlotRange&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram_F32(const char* label_id, const float* values, int count, int bins, double bar_scale, cimgui::ImPlotRange range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram_F32(label_id, values, count, bins, bar_scale, reinterpret_cast<const ::ImPlotRange&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram_F64(const char* label_id, const double* values, int count, int bins, double bar_scale, cimgui::ImPlotRange range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram_F64(label_id, values, count, bins, bar_scale, reinterpret_cast<const ::ImPlotRange&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram2D_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, int x_bins, int y_bins, cimgui::ImPlotRect range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram2D_S8(label_id, xs, ys, count, x_bins, y_bins, reinterpret_cast<const ::ImPlotRect&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram2D_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, int x_bins, int y_bins, cimgui::ImPlotRect range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram2D_U8(label_id, xs, ys, count, x_bins, y_bins, reinterpret_cast<const ::ImPlotRect&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram2D_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, int x_bins, int y_bins, cimgui::ImPlotRect range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram2D_S16(label_id, xs, ys, count, x_bins, y_bins, reinterpret_cast<const ::ImPlotRect&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram2D_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, int x_bins, int y_bins, cimgui::ImPlotRect range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram2D_U16(label_id, xs, ys, count, x_bins, y_bins, reinterpret_cast<const ::ImPlotRect&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram2D_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, int x_bins, int y_bins, cimgui::ImPlotRect range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram2D_S32(label_id, xs, ys, count, x_bins, y_bins, reinterpret_cast<const ::ImPlotRect&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram2D_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, int x_bins, int y_bins, cimgui::ImPlotRect range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram2D_U32(label_id, xs, ys, count, x_bins, y_bins, reinterpret_cast<const ::ImPlotRect&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram2D_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, int x_bins, int y_bins, cimgui::ImPlotRect range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram2D_S64(label_id, xs, ys, count, x_bins, y_bins, reinterpret_cast<const ::ImPlotRect&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram2D_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, int x_bins, int y_bins, cimgui::ImPlotRect range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram2D_U64(label_id, xs, ys, count, x_bins, y_bins, reinterpret_cast<const ::ImPlotRect&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram2D_F32(const char* label_id, const float* xs, const float* ys, int count, int x_bins, int y_bins, cimgui::ImPlotRect range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram2D_F32(label_id, xs, ys, count, x_bins, y_bins, reinterpret_cast<const ::ImPlotRect&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API double cimgui::ImPlotPlotHistogram2D_F64(const char* label_id, const double* xs, const double* ys, int count, int x_bins, int y_bins, cimgui::ImPlotRect range, cimgui::ImPlotSpec spec)
+{
+    return ::ImPlot::PlotHistogram2D_F64(label_id, xs, ys, count, x_bins, y_bins, reinterpret_cast<const ::ImPlotRect&>(range), reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotDigital_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotDigital_S8(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotDigital_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotDigital_U8(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotDigital_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotDigital_S16(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotDigital_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotDigital_U16(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotDigital_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotDigital_S32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotDigital_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotDigital_U32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotDigital_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotDigital_S64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotDigital_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotDigital_U64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotDigital_F32(const char* label_id, const float* xs, const float* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotDigital_F32(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
+
+CIMGUI_API void   cimgui::ImPlotPlotDigital_F64(const char* label_id, const double* xs, const double* ys, int count, cimgui::ImPlotSpec spec)
+{
+    ::ImPlot::PlotDigital_F64(label_id, xs, ys, count, reinterpret_cast<const ::ImPlotSpec&>(spec));
+}
diff --git a/cbits/dcimgui_implot.h b/cbits/dcimgui_implot.h
new file mode 100644
--- /dev/null
+++ b/cbits/dcimgui_implot.h
@@ -0,0 +1,1599 @@
+// THIS FILE HAS BEEN AUTO-GENERATED BY THE 'DEAR BINDINGS' GENERATOR.
+// **DO NOT EDIT DIRECTLY**
+// https://github.com/dearimgui/dear_bindings
+
+// MIT License
+// Auto-generated forward declarations for C header
+typedef struct ImPlotSpec_t ImPlotSpec;
+typedef struct ImPlotPoint_t ImPlotPoint;
+typedef struct ImPlotRange_t ImPlotRange;
+typedef struct ImPlotRect_t ImPlotRect;
+typedef struct ImPlotStyle_t ImPlotStyle;
+typedef struct ImPlotInputMap_t ImPlotInputMap;
+// ImDrawIdx: vertex index. [Compile-time configurable type]
+// - To use 16-bit indices + allow large meshes: backend need to set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset' and handle ImDrawCmd::VtxOffset (recommended).
+// - To use 32-bit indices: override with '#define ImDrawIdx unsigned int' in your imconfig.h file.
+#ifndef ImDrawIdx
+typedef unsigned short ImDrawIdx;  // Default: 16-bit (for maximum compatibility with renderer backends)
+#endif // #ifndef ImDrawIdx
+
+// Copyright (c) 2020-2024 Evan Pezent
+// Copyright (c) 2025-2026 Breno Cunha Queiroz
+
+// 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.
+
+// ImPlot v1.1 WIP
+
+// Table of Contents:
+//
+// [SECTION] Macros and Defines
+// [SECTION] Enums and Types
+// [SECTION] Callbacks
+// [SECTION] Contexts
+// [SECTION] Begin/End Plot
+// [SECTION] Begin/End Subplot
+// [SECTION] Setup
+// [SECTION] SetNext
+// [SECTION] Plot Items
+// [SECTION] Plot Tools
+// [SECTION] Plot Utils
+// [SECTION] Legend Utils
+// [SECTION] Drag and Drop
+// [SECTION] Styling
+// [SECTION] Colormaps
+// [SECTION] Input Mapping
+// [SECTION] Miscellaneous
+// [SECTION] Demo
+// [SECTION] Obsolete API
+
+#pragma once
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+#include "dcimgui.h"
+#ifndef IMGUI_DISABLE
+// [SECTION] Macros and Defines
+//-----------------------------------------------------------------------------
+
+// Define attributes of all API symbols declarations (e.g. for DLL under Windows)
+// Using ImPlot via a shared library is not recommended, because we don't guarantee
+// backward nor forward ABI compatibility and also function call overhead. If you
+// do use ImPlot as a DLL, be sure to call SetImGuiContext (see Miscellaneous section).
+#ifndef CIMGUI_API
+#define CIMGUI_API
+#endif // #ifndef CIMGUI_API
+// ImPlot version string.
+#define IMPLOT_VERSION "1.1 WIP"
+// ImPlot version integer encoded as XYYZZ (X=major, YY=minor, ZZ=patch).
+#define IMPLOT_VERSION_NUM 10100
+// Macro for templated plotting functions; keeps header clean.
+#define IMPLOT_TMP template <typename T> CIMGUI_API
+
+// Indicates variable should deduced automatically.
+// Special color used to indicate that a color should be deduced automatically.
+
+//-----------------------------------------------------------------------------
+// [SECTION] Enums and Types
+//-----------------------------------------------------------------------------
+
+// Forward declarations
+typedef struct ImPlotContext_t ImPlotContext;  // ImPlot context (opaque struct, see implot_internal.h)
+
+// Enums/Flags
+typedef int ImAxis;                    // -> enum ImAxis_
+typedef int ImPlotProp;                // -> enum ImPlotProp_
+typedef int ImPlotFlags;               // -> enum ImPlotFlags_
+typedef int ImPlotAxisFlags;           // -> enum ImPlotAxisFlags_
+typedef int ImPlotSubplotFlags;        // -> enum ImPlotSubplotFlags_
+typedef int ImPlotLegendFlags;         // -> enum ImPlotLegendFlags_
+typedef int ImPlotMouseTextFlags;      // -> enum ImPlotMouseTextFlags_
+typedef int ImPlotDragToolFlags;       // -> ImPlotDragToolFlags_
+typedef int ImPlotColormapScaleFlags;  // -> ImPlotColormapScaleFlags_
+
+typedef int ImPlotItemFlags;       // -> ImPlotItemFlags_
+typedef int ImPlotLineFlags;       // -> ImPlotLineFlags_
+typedef int ImPlotScatterFlags;    // -> ImPlotScatterFlags
+typedef int ImPlotBubblesFlags;    // -> ImPlotBubblesFlags
+typedef int ImPlotPolygonFlags;    // -> ImPlotPolygonFlags_
+typedef int ImPlotStairsFlags;     // -> ImPlotStairsFlags_
+typedef int ImPlotShadedFlags;     // -> ImPlotShadedFlags_
+typedef int ImPlotBarsFlags;       // -> ImPlotBarsFlags_
+typedef int ImPlotBarGroupsFlags;  // -> ImPlotBarGroupsFlags_
+typedef int ImPlotErrorBarsFlags;  // -> ImPlotErrorBarsFlags_
+typedef int ImPlotStemsFlags;      // -> ImPlotStemsFlags_
+typedef int ImPlotInfLinesFlags;   // -> ImPlotInfLinesFlags_
+typedef int ImPlotPieChartFlags;   // -> ImPlotPieChartFlags_
+typedef int ImPlotHeatmapFlags;    // -> ImPlotHeatmapFlags_
+typedef int ImPlotHistogramFlags;  // -> ImPlotHistogramFlags_
+typedef int ImPlotDigitalFlags;    // -> ImPlotDigitalFlags_
+typedef int ImPlotImageFlags;      // -> ImPlotImageFlags_
+typedef int ImPlotTextFlags;       // -> ImPlotTextFlags_
+typedef int ImPlotDummyFlags;      // -> ImPlotDummyFlags_
+
+typedef int ImPlotCond;      // -> enum ImPlotCond_
+typedef int ImPlotCol;       // -> enum ImPlotCol_
+typedef int ImPlotStyleVar;  // -> enum ImPlotStyleVar_
+typedef int ImPlotScale;     // -> enum ImPlotScale_
+typedef int ImPlotMarker;    // -> enum ImPlotMarker_
+typedef int ImPlotColormap;  // -> enum ImPlotColormap_
+typedef int ImPlotLocation;  // -> enum ImPlotLocation_
+typedef int ImPlotBin;       // -> enum ImPlotBin_
+
+// Axis indices. The values assigned may change; NEVER hardcode these.
+typedef enum
+{
+    // horizontal axes
+    ImAxis_X1    = 0,  // enabled by default
+    ImAxis_X2,         // disabled by default
+    ImAxis_X3,         // disabled by default
+    // vertical axes
+    ImAxis_Y1,         // enabled by default
+    ImAxis_Y2,         // disabled by default
+    ImAxis_Y3,         // disabled by default
+    // bookkeeping
+    ImAxis_COUNT,
+} ImAxis_;
+
+// Plotting properties. These provide syntactic sugar for creating ImPlotSpecs from (ImPlotProp,value) pairs. See ImPlotSpec documentation.
+typedef enum
+{
+    ImPlotProp_LineColor,         // line color (applies to lines, bar edges); IMPLOT_AUTO_COL will use next Colormap color or current item color
+    ImPlotProp_LineColors,        // array of colors for each line; if nullptr, use LineColor for all lines
+    ImPlotProp_LineWeight,        // line weight in pixels (applies to lines, bar edges, marker edges)
+    ImPlotProp_FillColor,         // fill color (applies to shaded regions, bar faces); IMPLOT_AUTO_COL will use next Colormap color or current item color
+    ImPlotProp_FillColors,        // array of colors for each fill; if nullptr, use FillColor for all fills
+    ImPlotProp_FillAlpha,         // alpha multiplier (applies to FillColor, FillColors, MarkerFillColor, and MarkerFillColors)
+    ImPlotProp_Marker,            // marker type; specify ImPlotMarker_Auto to use the next unused marker
+    ImPlotProp_MarkerSize,        // size of markers (radius) *in pixels*
+    ImPlotProp_MarkerSizes,       // array of sizes for each marker; if nullptr, use MarkerSize for all markers
+    ImPlotProp_MarkerLineColor,   // marker edge color; IMPLOT_AUTO_COL will use LineColor
+    ImPlotProp_MarkerLineColors,  // array of colors for each marker edge; if nullptr, use MarkerLineColor for all markers
+    ImPlotProp_MarkerFillColor,   // marker face color; IMPLOT_AUTO_COL will use LineColor
+    ImPlotProp_MarkerFillColors,  // array of colors for each marker face; if nullptr, use MarkerFillColor for all markers
+    ImPlotProp_Size,              // size of error bar whiskers (width or height), and digital bars (height) *in pixels*
+    ImPlotProp_Offset,            // data index offset
+    ImPlotProp_Stride,            // data stride in bytes; IMPLOT_AUTO will result in sizeof(T) where T is the type passed to PlotX
+    ImPlotProp_Flags,             // optional item flags; can be composed from common ImPlotItemFlags and/or specialized ImPlotXFlags
+} ImPlotProp_;
+
+// Options for plots (see BeginPlot).
+typedef enum
+{
+    ImPlotFlags_None        = 0,     // default
+    ImPlotFlags_NoTitle     = 1<<0,  // the plot title will not be displayed (titles are also hidden if preceded by double hashes, e.g. "##MyPlot")
+    ImPlotFlags_NoLegend    = 1<<1,  // the legend will not be displayed
+    ImPlotFlags_NoMouseText = 1<<2,  // the mouse position, in plot coordinates, will not be displayed inside of the plot
+    ImPlotFlags_NoInputs    = 1<<3,  // the user will not be able to interact with the plot
+    ImPlotFlags_NoMenus     = 1<<4,  // the user will not be able to open context menus
+    ImPlotFlags_NoBoxSelect = 1<<5,  // the user will not be able to box-select
+    ImPlotFlags_NoFrame     = 1<<6,  // the ImGui frame will not be rendered
+    ImPlotFlags_Equal       = 1<<7,  // x and y axes pairs will be constrained to have the same units/pixel
+    ImPlotFlags_Crosshairs  = 1<<8,  // the default mouse cursor will be replaced with a crosshair when hovered
+    ImPlotFlags_CanvasOnly  = ImPlotFlags_NoTitle | ImPlotFlags_NoLegend | ImPlotFlags_NoMenus | ImPlotFlags_NoBoxSelect | ImPlotFlags_NoMouseText,
+} ImPlotFlags_;
+
+// Options for plot axes (see SetupAxis).
+typedef enum
+{
+    ImPlotAxisFlags_None          = 0,      // default
+    ImPlotAxisFlags_NoLabel       = 1<<0,   // the axis label will not be displayed (axis labels are also hidden if the supplied string name is nullptr)
+    ImPlotAxisFlags_NoGridLines   = 1<<1,   // no grid lines will be displayed
+    ImPlotAxisFlags_NoTickMarks   = 1<<2,   // no tick marks will be displayed
+    ImPlotAxisFlags_NoTickLabels  = 1<<3,   // no text labels will be displayed
+    ImPlotAxisFlags_NoInitialFit  = 1<<4,   // axis will not be initially fit to data extents on the first rendered frame
+    ImPlotAxisFlags_NoMenus       = 1<<5,   // the user will not be able to open context menus with right-click
+    ImPlotAxisFlags_NoSideSwitch  = 1<<6,   // the user will not be able to switch the axis side by dragging it
+    ImPlotAxisFlags_NoHighlight   = 1<<7,   // the axis will not have its background highlighted when hovered or held
+    ImPlotAxisFlags_Opposite      = 1<<8,   // axis ticks and labels will be rendered on the conventionally opposite side (i.e, right or top)
+    ImPlotAxisFlags_Foreground    = 1<<9,   // grid lines will be displayed in the foreground (i.e. on top of data) instead of the background
+    ImPlotAxisFlags_Invert        = 1<<10,  // the axis will be inverted
+    ImPlotAxisFlags_AutoFit       = 1<<11,  // axis will be auto-fitting to data extents
+    ImPlotAxisFlags_RangeFit      = 1<<12,  // axis will only fit points if the point is in the visible range of the **orthogonal** axis
+    ImPlotAxisFlags_PanStretch    = 1<<13,  // panning in a locked or constrained state will cause the axis to stretch if possible
+    ImPlotAxisFlags_LockMin       = 1<<14,  // the axis minimum value will be locked when panning/zooming
+    ImPlotAxisFlags_LockMax       = 1<<15,  // the axis maximum value will be locked when panning/zooming
+    ImPlotAxisFlags_Lock          = ImPlotAxisFlags_LockMin | ImPlotAxisFlags_LockMax,
+    ImPlotAxisFlags_NoDecorations = ImPlotAxisFlags_NoLabel | ImPlotAxisFlags_NoGridLines | ImPlotAxisFlags_NoTickMarks | ImPlotAxisFlags_NoTickLabels,
+    ImPlotAxisFlags_AuxDefault    = ImPlotAxisFlags_NoGridLines | ImPlotAxisFlags_Opposite,
+} ImPlotAxisFlags_;
+
+// Options for subplots (see BeginSubplot)
+typedef enum
+{
+    ImPlotSubplotFlags_None       = 0,      // default
+    ImPlotSubplotFlags_NoTitle    = 1<<0,   // the subplot title will not be displayed (titles are also hidden if preceded by double hashes, e.g. "##MySubplot")
+    ImPlotSubplotFlags_NoLegend   = 1<<1,   // the legend will not be displayed (only applicable if ImPlotSubplotFlags_ShareItems is enabled)
+    ImPlotSubplotFlags_NoMenus    = 1<<2,   // the user will not be able to open context menus with right-click
+    ImPlotSubplotFlags_NoResize   = 1<<3,   // resize splitters between subplot cells will be not be provided
+    ImPlotSubplotFlags_NoAlign    = 1<<4,   // subplot edges will not be aligned vertically or horizontally
+    ImPlotSubplotFlags_ShareItems = 1<<5,   // items across all subplots will be shared and rendered into a single legend entry
+    ImPlotSubplotFlags_LinkRows   = 1<<6,   // link the y-axis limits of all plots in each row (does not apply to auxiliary axes)
+    ImPlotSubplotFlags_LinkCols   = 1<<7,   // link the x-axis limits of all plots in each column (does not apply to auxiliary axes)
+    ImPlotSubplotFlags_LinkAllX   = 1<<8,   // link the x-axis limits in every plot in the subplot (does not apply to auxiliary axes)
+    ImPlotSubplotFlags_LinkAllY   = 1<<9,   // link the y-axis limits in every plot in the subplot (does not apply to auxiliary axes)
+    ImPlotSubplotFlags_ColMajor   = 1<<10,  // subplots are added in column major order instead of the default row major order
+} ImPlotSubplotFlags_;
+
+// Options for legends (see SetupLegend)
+typedef enum
+{
+    ImPlotLegendFlags_None            = 0,     // default
+    ImPlotLegendFlags_NoButtons       = 1<<0,  // legend icons will not function as hide/show buttons
+    ImPlotLegendFlags_NoHighlightItem = 1<<1,  // plot items will not be highlighted when their legend entry is hovered
+    ImPlotLegendFlags_NoHighlightAxis = 1<<2,  // axes will not be highlighted when legend entries are hovered (only relevant if x/y-axis count > 1)
+    ImPlotLegendFlags_NoMenus         = 1<<3,  // the user will not be able to open context menus with right-click
+    ImPlotLegendFlags_Outside         = 1<<4,  // legend will be rendered outside of the plot area
+    ImPlotLegendFlags_Horizontal      = 1<<5,  // legend entries will be displayed horizontally
+    ImPlotLegendFlags_Sort            = 1<<6,  // legend entries will be displayed in alphabetical order
+    ImPlotLegendFlags_Reverse         = 1<<7,  // legend entries will be displayed in reverse order
+} ImPlotLegendFlags_;
+
+// Options for mouse hover text (see SetupMouseText)
+typedef enum
+{
+    ImPlotMouseTextFlags_None       = 0,     // default
+    ImPlotMouseTextFlags_NoAuxAxes  = 1<<0,  // only show the mouse position for primary axes
+    ImPlotMouseTextFlags_NoFormat   = 1<<1,  // axes label formatters won't be used to render text
+    ImPlotMouseTextFlags_ShowAlways = 1<<2,  // always display mouse position even if plot not hovered
+} ImPlotMouseTextFlags_;
+
+// Options for DragPoint, DragLine, DragRect
+typedef enum
+{
+    ImPlotDragToolFlags_None      = 0,     // default
+    ImPlotDragToolFlags_NoCursors = 1<<0,  // drag tools won't change cursor icons when hovered or held
+    ImPlotDragToolFlags_NoFit     = 1<<1,  // the drag tool won't be considered for plot fits
+    ImPlotDragToolFlags_NoInputs  = 1<<2,  // lock the tool from user inputs
+    ImPlotDragToolFlags_Delayed   = 1<<3,  // tool rendering will be delayed one frame; useful when applying position-constraints
+} ImPlotDragToolFlags_;
+
+// Flags for ColormapScale
+typedef enum
+{
+    ImPlotColormapScaleFlags_None     = 0,     // default
+    ImPlotColormapScaleFlags_NoLabel  = 1<<0,  // the colormap axis label will not be displayed
+    ImPlotColormapScaleFlags_Opposite = 1<<1,  // render the colormap label and tick labels on the opposite side
+    ImPlotColormapScaleFlags_Invert   = 1<<2,  // invert the colormap bar and axis scale (this only affects rendering; if you only want to reverse the scale mapping, make scale_min > scale_max)
+} ImPlotColormapScaleFlags_;
+
+// Flags for ANY PlotX function. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotItemFlags_None     = 0,
+    ImPlotItemFlags_NoLegend = 1<<0,  // the item won't have a legend entry displayed
+    ImPlotItemFlags_NoFit    = 1<<1,  // the item won't be considered for plot fits
+} ImPlotItemFlags_;
+
+// Flags for PlotLine. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotLineFlags_None     = 0,      // default
+    ImPlotLineFlags_Segments = 1<<10,  // a line segment will be rendered from every two consecutive points
+    ImPlotLineFlags_Loop     = 1<<11,  // the last and first point will be connected to form a closed loop
+    ImPlotLineFlags_SkipNaN  = 1<<12,  // NaNs values will be skipped instead of rendered as missing data
+    ImPlotLineFlags_NoClip   = 1<<13,  // markers (if displayed) on the edge of a plot will not be clipped
+    ImPlotLineFlags_Shaded   = 1<<14,  // a filled region between the line and horizontal origin will be rendered; use PlotShaded for more advanced cases
+} ImPlotLineFlags_;
+
+// Flags for PlotScatter. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotScatterFlags_None   = 0,      // default
+    ImPlotScatterFlags_NoClip = 1<<10,  // markers on the edge of a plot will not be clipped
+} ImPlotScatterFlags_;
+
+// Flags for PlotBubbles. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotBubblesFlags_None = 0,  // default
+} ImPlotBubblesFlags_;
+
+// Flags for PlotPolygon. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotPolygonFlags_None    = 0,      // default (closed, convex polygon)
+    ImPlotPolygonFlags_Concave = 1<<10,  // use concave polygon filling (slower but supports concave shapes)
+} ImPlotPolygonFlags_;
+
+// Flags for PlotStairs. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotStairsFlags_None    = 0,      // default
+    ImPlotStairsFlags_PreStep = 1<<10,  // the y value is continued constantly to the left from every x position, i.e. the interval (x[i-1], x[i]] has the value y[i]
+    ImPlotStairsFlags_Shaded  = 1<<11,  // a filled region between the stairs and horizontal origin will be rendered; use PlotShaded for more advanced cases
+} ImPlotStairsFlags_;
+
+// Flags for PlotShaded (placeholder). Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotShadedFlags_None = 0,  // default
+} ImPlotShadedFlags_;
+
+// Flags for PlotBars. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotBarsFlags_None       = 0,      // default
+    ImPlotBarsFlags_Horizontal = 1<<10,  // bars will be rendered horizontally on the current y-axis
+} ImPlotBarsFlags_;
+
+// Flags for PlotBarGroups. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotBarGroupsFlags_None       = 0,      // default
+    ImPlotBarGroupsFlags_Horizontal = 1<<10,  // bar groups will be rendered horizontally on the current y-axis
+    ImPlotBarGroupsFlags_Stacked    = 1<<11,  // items in a group will be stacked on top of each other
+} ImPlotBarGroupsFlags_;
+
+// Flags for PlotErrorBars. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotErrorBarsFlags_None       = 0,      // default
+    ImPlotErrorBarsFlags_Horizontal = 1<<10,  // error bars will be rendered horizontally on the current y-axis
+} ImPlotErrorBarsFlags_;
+
+// Flags for PlotStems. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotStemsFlags_None       = 0,      // default
+    ImPlotStemsFlags_Horizontal = 1<<10,  // stems will be rendered horizontally on the current y-axis
+} ImPlotStemsFlags_;
+
+// Flags for PlotInfLines. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotInfLinesFlags_None       = 0,      // default
+    ImPlotInfLinesFlags_Horizontal = 1<<10,  // lines will be rendered horizontally on the current y-axis
+} ImPlotInfLinesFlags_;
+
+// Flags for PlotPieChart. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotPieChartFlags_None          = 0,      // default
+    ImPlotPieChartFlags_Normalize     = 1<<10,  // force normalization of pie chart values (i.e. always make a full circle if sum < 0)
+    ImPlotPieChartFlags_IgnoreHidden  = 1<<11,  // ignore hidden slices when drawing the pie chart (as if they were not there)
+    ImPlotPieChartFlags_Exploding     = 1<<12,  // explode legend-hovered slice
+    ImPlotPieChartFlags_NoSliceBorder = 1<<13,  // do not draw slice borders
+} ImPlotPieChartFlags_;
+
+// Flags for PlotHeatmap. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotHeatmapFlags_None     = 0,      // default
+    ImPlotHeatmapFlags_ColMajor = 1<<10,  // data will be read in column major order
+} ImPlotHeatmapFlags_;
+
+// Flags for PlotHistogram and PlotHistogram2D. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotHistogramFlags_None       = 0,      // default
+    ImPlotHistogramFlags_Horizontal = 1<<10,  // histogram bars will be rendered horizontally (not supported by PlotHistogram2D)
+    ImPlotHistogramFlags_Cumulative = 1<<11,  // each bin will contain its count plus the counts of all previous bins (not supported by PlotHistogram2D)
+    ImPlotHistogramFlags_Density    = 1<<12,  // counts will be normalized, i.e. the PDF will be visualized, or the CDF will be visualized if Cumulative is also set
+    ImPlotHistogramFlags_NoOutliers = 1<<13,  // exclude values outside the specified histogram range from the count toward normalizing and cumulative counts
+    ImPlotHistogramFlags_ColMajor   = 1<<14,  // data will be read in column major order (not supported by PlotHistogram)
+} ImPlotHistogramFlags_;
+
+// Flags for PlotDigital (placeholder). Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotDigitalFlags_None = 0,  // default
+} ImPlotDigitalFlags_;
+
+// Flags for PlotImage (placeholder). Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotImageFlags_None = 0,  // default
+} ImPlotImageFlags_;
+
+// Flags for PlotText. Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotTextFlags_None     = 0,      // default
+    ImPlotTextFlags_Vertical = 1<<10,  // text will be rendered vertically
+} ImPlotTextFlags_;
+
+// Flags for PlotDummy (placeholder). Used by setting ImPlotSpec::Flags.
+typedef enum
+{
+    ImPlotDummyFlags_None = 0,  // default
+} ImPlotDummyFlags_;
+
+// Represents a condition for SetupAxisLimits etc. (same as ImGuiCond, but we only support a subset of those enums)
+typedef enum
+{
+    ImPlotCond_None   = ImGuiCond_None,    // No condition (always set the variable), same as _Always
+    ImPlotCond_Always = ImGuiCond_Always,  // No condition (always set the variable)
+    ImPlotCond_Once   = ImGuiCond_Once,    // Set the variable once per runtime session (only the first call will succeed)
+} ImPlotCond_;
+
+// Plot styling colors.
+typedef enum
+{
+    ImPlotCol_FrameBg,        // plot frame background color (defaults to ImGuiCol_FrameBg)
+    ImPlotCol_PlotBg,         // plot area background color (defaults to ImGuiCol_WindowBg)
+    ImPlotCol_PlotBorder,     // plot area border color (defaults to ImGuiCol_Border)
+    ImPlotCol_LegendBg,       // legend background color (defaults to ImGuiCol_PopupBg)
+    ImPlotCol_LegendBorder,   // legend border color (defaults to ImPlotCol_PlotBorder)
+    ImPlotCol_LegendText,     // legend text color (defaults to ImPlotCol_InlayText)
+    ImPlotCol_TitleText,      // plot title text color (defaults to ImGuiCol_Text)
+    ImPlotCol_InlayText,      // color of text appearing inside of plots (defaults to ImGuiCol_Text)
+    ImPlotCol_AxisText,       // axis label and tick labels color (defaults to ImGuiCol_Text)
+    ImPlotCol_AxisGrid,       // axis grid color (defaults to 25% ImPlotCol_AxisText)
+    ImPlotCol_AxisTick,       // axis tick color (defaults to AxisGrid)
+    ImPlotCol_AxisBg,         // background color of axis hover region (defaults to transparent)
+    ImPlotCol_AxisBgHovered,  // axis hover color (defaults to ImGuiCol_ButtonHovered)
+    ImPlotCol_AxisBgActive,   // axis active color (defaults to ImGuiCol_ButtonActive)
+    ImPlotCol_Selection,      // box-selection color (defaults to yellow)
+    ImPlotCol_Crosshairs,     // crosshairs color (defaults to ImPlotCol_PlotBorder)
+    ImPlotCol_COUNT,
+} ImPlotCol_;
+
+// Plot styling variables.
+typedef enum
+{
+    ImPlotStyleVar_PlotDefaultSize,     // ImVec2, default size used when ImVec2(0,0) is passed to BeginPlot
+    ImPlotStyleVar_PlotMinSize,         // ImVec2, minimum size plot frame can be when shrunk
+    ImPlotStyleVar_PlotBorderSize,      // float,  thickness of border around plot area
+    ImPlotStyleVar_MinorAlpha,          // float,  alpha multiplier applied to minor axis grid lines
+    ImPlotStyleVar_MajorTickLen,        // ImVec2, major tick lengths for X and Y axes
+    ImPlotStyleVar_MinorTickLen,        // ImVec2, minor tick lengths for X and Y axes
+    ImPlotStyleVar_MajorTickSize,       // ImVec2, line thickness of major ticks
+    ImPlotStyleVar_MinorTickSize,       // ImVec2, line thickness of minor ticks
+    ImPlotStyleVar_MajorGridSize,       // ImVec2, line thickness of major grid lines
+    ImPlotStyleVar_MinorGridSize,       // ImVec2, line thickness of minor grid lines
+    ImPlotStyleVar_PlotPadding,         // ImVec2, padding between widget frame and plot area, labels, or outside legends (i.e. main padding)
+    ImPlotStyleVar_LabelPadding,        // ImVec2, padding between axes labels, tick labels, and plot edge
+    ImPlotStyleVar_LegendPadding,       // ImVec2, legend padding from plot edges
+    ImPlotStyleVar_LegendInnerPadding,  // ImVec2, legend inner padding from legend edges
+    ImPlotStyleVar_LegendSpacing,       // ImVec2, spacing between legend entries
+    ImPlotStyleVar_MousePosPadding,     // ImVec2, padding between plot edge and interior info text
+    ImPlotStyleVar_AnnotationPadding,   // ImVec2, text padding around annotation labels
+    ImPlotStyleVar_FitPadding,          // ImVec2, additional fit padding as a percentage of the fit extents (e.g. ImVec2(0.1f,0.1f) adds 10% to the fit extents of X and Y)
+    ImPlotStyleVar_DigitalPadding,      // float,  digital plot padding from bottom in pixels
+    ImPlotStyleVar_DigitalSpacing,      // float,  digital plot spacing gap in pixels
+    ImPlotStyleVar_COUNT,
+} ImPlotStyleVar_;
+
+// Axis scale
+typedef enum
+{
+    ImPlotScale_Linear = 0,  // default linear scale
+    ImPlotScale_Time,        // date/time scale
+    ImPlotScale_Log10,       // base 10 logarithmic scale
+    ImPlotScale_SymLog,      // symmetric log scale
+} ImPlotScale_;
+
+// Marker specifications.
+typedef enum
+{
+    ImPlotMarker_None       = -2,  // no marker
+    ImPlotMarker_Auto       = -1,  // automatic marker selection
+    ImPlotMarker_Circle,           // a circle marker (default)
+    ImPlotMarker_Square,           // a square maker
+    ImPlotMarker_Diamond,          // a diamond marker
+    ImPlotMarker_Up,               // an upward-pointing triangle marker
+    ImPlotMarker_Down,             // an downward-pointing triangle marker
+    ImPlotMarker_Left,             // an leftward-pointing triangle marker
+    ImPlotMarker_Right,            // an rightward-pointing triangle marker
+    ImPlotMarker_Cross,            // a cross marker (not fill-able)
+    ImPlotMarker_Plus,             // a plus marker (not fill-able)
+    ImPlotMarker_Asterisk,         // a asterisk marker (not fill-able)
+    ImPlotMarker_Vertical,         // a vertical line marker (not fill-able)
+    ImPlotMarker_Horizontal,       // a horizontal line marker (not fill-able)
+    ImPlotMarker_COUNT,
+} ImPlotMarker_;
+
+// Built-in colormaps
+typedef enum
+{
+    ImPlotColormap_Deep     = 0,   // a.k.a. seaborn deep             (qual=true,  n=10) (default)
+    ImPlotColormap_Dark     = 1,   // a.k.a. matplotlib "Set1"        (qual=true,  n=9 )
+    ImPlotColormap_Pastel   = 2,   // a.k.a. matplotlib "Pastel1"     (qual=true,  n=9 )
+    ImPlotColormap_Paired   = 3,   // a.k.a. matplotlib "Paired"      (qual=true,  n=12)
+    ImPlotColormap_Viridis  = 4,   // a.k.a. matplotlib "viridis"     (qual=false, n=11)
+    ImPlotColormap_Plasma   = 5,   // a.k.a. matplotlib "plasma"      (qual=false, n=11)
+    ImPlotColormap_Hot      = 6,   // a.k.a. matplotlib/MATLAB "hot"  (qual=false, n=11)
+    ImPlotColormap_Cool     = 7,   // a.k.a. matplotlib/MATLAB "cool" (qual=false, n=11)
+    ImPlotColormap_Pink     = 8,   // a.k.a. matplotlib/MATLAB "pink" (qual=false, n=11)
+    ImPlotColormap_Jet      = 9,   // a.k.a. MATLAB "jet"             (qual=false, n=11)
+    ImPlotColormap_Twilight = 10,  // a.k.a. matplotlib "twilight"    (qual=false, n=11)
+    ImPlotColormap_RdBu     = 11,  // red/blue, Color Brewer          (qual=false, n=11)
+    ImPlotColormap_BrBG     = 12,  // brown/blue-green, Color Brewer  (qual=false, n=11)
+    ImPlotColormap_PiYG     = 13,  // pink/yellow-green, Color Brewer (qual=false, n=11)
+    ImPlotColormap_Spectral = 14,  // color spectrum, Color Brewer    (qual=false, n=11)
+    ImPlotColormap_Greys    = 15,  // white/black                     (qual=false, n=2 )
+} ImPlotColormap_;
+
+// Used to position items on a plot (e.g. legends, labels, etc.)
+typedef enum
+{
+    ImPlotLocation_Center    = 0,                                           // center-center
+    ImPlotLocation_North     = 1<<0,                                        // top-center
+    ImPlotLocation_South     = 1<<1,                                        // bottom-center
+    ImPlotLocation_West      = 1<<2,                                        // center-left
+    ImPlotLocation_East      = 1<<3,                                        // center-right
+    ImPlotLocation_NorthWest = ImPlotLocation_North | ImPlotLocation_West,  // top-left
+    ImPlotLocation_NorthEast = ImPlotLocation_North | ImPlotLocation_East,  // top-right
+    ImPlotLocation_SouthWest = ImPlotLocation_South | ImPlotLocation_West,  // bottom-left
+    ImPlotLocation_SouthEast = ImPlotLocation_South | ImPlotLocation_East,  // bottom-right
+} ImPlotLocation_;
+
+// Enums for different automatic histogram binning methods (k = bin count or w = bin width)
+typedef enum
+{
+    ImPlotBin_Sqrt    = -1,  // k = sqrt(n)
+    ImPlotBin_Sturges = -2,  // k = 1 + log2(n)
+    ImPlotBin_Rice    = -3,  // k = 2 * cbrt(n)
+    ImPlotBin_Scott   = -4,  // w = 3.49 * sigma / cbrt(n)
+} ImPlotBin_;
+
+// Plot item styling specification. Provide these to PlotX functions to override styling, specify
+// offsetting or stride, or set optional flags. This struct can be used in the following ways:
+//
+// 1. By declaring and defining a struct instance:
+//
+//    ImPlotSpec spec;
+//    spec.LineColor = ImVec4(1,0,0,1);
+//    spec.LineWeight = 2.0f;
+//    spec.Marker = ImPlotMarker_Circle;
+//    spec.Flags = ImPlotItemFlags_NoLegend | ImPlotLineFlags_Segments;
+//    ImPlot::PlotLine("MyLine", xs, ys, 100, spec);
+//
+// 2. Inline using (ImPlotProp,value) pairs (order does NOT matter):
+//
+//    ImPlot::PlotLine("MyLine", xs, ys, 100, {
+//      ImPlotProp_LineColor, ImVec4(1,0,0,1),
+//      ImPlotProp_LineWeight, 2.0f,
+//      ImPlotProp_Marker, ImPlotMarker_Circle,
+//      ImPlotProp_Flags, ImPlotItemFlags_NoLegend | ImPlotLineFlags_Segments
+//    });
+struct ImPlotSpec_t
+{
+    ImVec4          LineColor /* = IMPLOT_AUTO_COL */;        // line color (applies to lines, bar edges); IMPLOT_AUTO_COL will use next Colormap color or current item color
+    ImU32*          LineColors /* = nullptr */;               // array of colors for each line; if nullptr, use LineColor for all lines
+    float           LineWeight /* = 1.0f */;                  // line weight in pixels (applies to lines, bar edges, marker edges)
+    ImVec4          FillColor /* = IMPLOT_AUTO_COL */;        // fill color (applies to shaded regions, bar faces); IMPLOT_AUTO_COL will use next Colormap color or current item color
+    ImU32*          FillColors /* = nullptr */;               // array of colors for each fill; if nullptr, use FillColor for all fills
+    float           FillAlpha /* = 1.0f */;                   // alpha multiplier (applies to FillColor, FillColors, MarkerFillColor, and MarkerFillColors)
+    ImPlotMarker    Marker /* = ImPlotMarker_None */;         // marker type; specify ImPlotMarker_Auto to use the next unused marker
+    float           MarkerSize /* = 4 */;                     // size of markers (radius) *in pixels*
+    float*          MarkerSizes /* = nullptr */;              // array of sizes for each marker; if nullptr, use MarkerSize for all markers
+    ImVec4          MarkerLineColor /* = IMPLOT_AUTO_COL */;  // marker edge color; IMPLOT_AUTO_COL will use LineColor
+    ImU32*          MarkerLineColors /* = nullptr */;         // array of colors for each marker edge; if nullptr, use MarkerLineColor for all markers
+    ImVec4          MarkerFillColor /* = IMPLOT_AUTO_COL */;  // marker face color; IMPLOT_AUTO_COL will use LineColor
+    ImU32*          MarkerFillColors /* = nullptr */;         // array of colors for each marker face; if nullptr, use MarkerFillColor for all markers
+    float           Size /* = 4 */;                           // size of error bar whiskers (width or height), and digital bars (height) *in pixels*
+    int             Offset /* = 0 */;                         // data index offset
+    int             Stride /* = IMPLOT_AUTO */;               // data stride in bytes; IMPLOT_AUTO will result in sizeof(T) where T is the type passed to PlotX
+    ImPlotItemFlags Flags /* = ImPlotItemFlags_None */;       // optional item flags; can be composed from common ImPlotItemFlags and/or specialized ImPlotXFlags
+};
+
+// Double precision version of ImVec2 used by ImPlot. Extensible by end users.
+IM_MSVC_RUNTIME_CHECKS_OFF
+struct ImPlotPoint_t
+{
+    double x, y;
+#ifdef IMPLOT_POINT_CLASS_EXTRA
+    IMPLOT_POINT_CLASS_EXTRA  // Define additional constructors and implicit cast operators in imconfig.h
+    // to convert back and forth between your math types and ImPlotPoint.
+#endif // #ifdef IMPLOT_POINT_CLASS_EXTRA
+};
+IM_MSVC_RUNTIME_CHECKS_RESTORE
+
+// Range defined by a min/max value.
+struct ImPlotRange_t
+{
+    double Min, Max;
+};
+CIMGUI_API bool   ImPlotRange_Contains(const ImPlotRange* self, double value);
+CIMGUI_API double ImPlotRange_Size(const ImPlotRange* self);
+CIMGUI_API double ImPlotRange_Clamp(const ImPlotRange* self, double value);
+
+// Combination of two range limits for X and Y axes. Also an AABB defined by Min()/Max().
+struct ImPlotRect_t
+{
+    ImPlotRange X, Y;
+};
+CIMGUI_API bool ImPlotRect_Contains(const ImPlotRect* self, ImPlotPoint p);
+CIMGUI_API bool ImPlotRect_ContainsDouble(const ImPlotRect* self, double x, double y);
+
+// Plot style structure
+struct ImPlotStyle_t
+{
+    // plot styling
+    ImVec2         PlotDefaultSize;          // = 400,300 default size used when ImVec2(0,0) is passed to BeginPlot
+    ImVec2         PlotMinSize;              // = 200,150 minimum size plot frame can be when shrunk
+    float          PlotBorderSize;           // = 1,      line thickness of border around plot area
+    float          MinorAlpha;               // = 0.25    alpha multiplier applied to minor axis grid lines
+    ImVec2         MajorTickLen;             // = 10,10   major tick lengths for X and Y axes
+    ImVec2         MinorTickLen;             // = 5,5     minor tick lengths for X and Y axes
+    ImVec2         MajorTickSize;            // = 1,1     line thickness of major ticks
+    ImVec2         MinorTickSize;            // = 1,1     line thickness of minor ticks
+    ImVec2         MajorGridSize;            // = 1,1     line thickness of major grid lines
+    ImVec2         MinorGridSize;            // = 1,1     line thickness of minor grid lines
+    // plot padding
+    ImVec2         PlotPadding;              // = 10,10   padding between widget frame and plot area, labels, or outside legends (i.e. main padding)
+    ImVec2         LabelPadding;             // = 5,5     padding between axes labels, tick labels, and plot edge
+    ImVec2         LegendPadding;            // = 10,10   legend padding from plot edges
+    ImVec2         LegendInnerPadding;       // = 5,5     legend inner padding from legend edges
+    ImVec2         LegendSpacing;            // = 5,0     spacing between legend entries
+    ImVec2         MousePosPadding;          // = 10,10   padding between plot edge and interior mouse location text
+    ImVec2         AnnotationPadding;        // = 2,2     text padding around annotation labels
+    ImVec2         FitPadding;               // = 0,0     additional fit padding as a percentage of the fit extents (e.g. ImVec2(0.1f,0.1f) adds 10% to the fit extents of X and Y)
+    float          DigitalPadding;           // = 20,     digital plot padding from bottom in pixels
+    float          DigitalSpacing;           // = 4,      digital plot spacing gap in pixels
+    // style colors
+    ImVec4         Colors[ImPlotCol_COUNT];  // Array of styling colors. Indexable with ImPlotCol_ enums.
+    // colormap
+    ImPlotColormap Colormap;                 // The current colormap. Set this to either an ImPlotColormap_ enum or an index returned by AddColormap.
+    // settings/flags
+    bool           UseLocalTime;             // = false,  axis labels will be formatted for your timezone when ImPlotAxisFlag_Time is enabled
+    bool           UseISO8601;               // = false,  dates will be formatted according to ISO 8601 where applicable (e.g. YYYY-MM-DD, YYYY-MM, --MM-DD, etc.)
+    bool           Use24HourClock;           // = false,  times will be formatted using a 24 hour clock
+};
+
+// Support for legacy versions
+
+// Input mapping structure. Default values listed. See also MapInputDefault, MapInputReverse.
+struct ImPlotInputMap_t
+{
+    ImGuiMouseButton Pan;            // LMB    enables panning when held,
+    int              PanMod;         // none   optional modifier that must be held for panning/fitting
+    ImGuiMouseButton Fit;            // LMB    initiates fit when double clicked
+    ImGuiMouseButton Select;         // RMB    begins box selection when pressed and confirms selection when released
+    ImGuiMouseButton SelectCancel;   // LMB    cancels active box selection when pressed; cannot be same as Select
+    int              SelectMod;      // none   optional modifier that must be held for box selection
+    int              SelectHorzMod;  // Alt    expands active box selection horizontally to plot edge when held
+    int              SelectVertMod;  // Shift  expands active box selection vertically to plot edge when held
+    ImGuiMouseButton Menu;           // RMB    opens context menus (if enabled) when clicked
+    int              OverrideMod;    // Ctrl   when held, all input is ignored; used to enable axis/plots as DND sources
+    int              ZoomMod;        // none   optional modifier that must be held for scroll wheel zooming
+    float            ZoomRate;       // 0.1f   zoom rate for scroll (e.g. 0.1f = 10% plot range every scroll click); make negative to invert
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Callbacks
+//-----------------------------------------------------------------------------
+
+// Callback signature for axis tick label formatter.
+typedef int (*ImPlotFormatter)(double value, char* buff, int size, void* user_data);
+
+// Callback signature for data getter.
+typedef ImPlotPoint (*ImPlotGetter)(int idx, void* user_data);
+
+// Callback signature for axis transform.
+typedef double (*ImPlotTransform)(double value, void* user_data);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Contexts
+//-----------------------------------------------------------------------------
+
+// Creates a new ImPlot context. Call this after ImGui::CreateContext.
+CIMGUI_API ImPlotContext* ImPlotCreateContext(void);
+// Destroys an ImPlot context. Call this before ImGui::DestroyContext. nullptr = destroy current context.
+CIMGUI_API void           ImPlotDestroyContext(ImPlotContext* ctx /* = nullptr */);
+// Returns the current ImPlot context. nullptr if no context has ben set.
+CIMGUI_API ImPlotContext* ImPlotGetCurrentContext(void);
+// Sets the current ImPlot context.
+CIMGUI_API void           ImPlotSetCurrentContext(ImPlotContext* ctx);
+
+// Sets the current **ImGui** context. This is ONLY necessary if you are compiling
+// ImPlot as a DLL (not recommended) separate from your ImGui compilation. It
+// sets the global variable GImGui, which is not shared across DLL boundaries.
+// See GImGui documentation in imgui.cpp for more details.
+CIMGUI_API void ImPlotSetImGuiContext(ImGuiContext* ctx);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Begin/End Plot
+//-----------------------------------------------------------------------------
+
+// Starts a 2D plotting context. If this function returns true, EndPlot() MUST
+// be called! You are encouraged to use the following convention:
+//
+// if (BeginPlot(...)) {
+//     PlotLine(...);
+//     ...
+//     EndPlot();
+// }
+//
+// Important notes:
+//
+// - #title_id must be unique to the current ImGui ID scope. If you need to avoid ID
+//   collisions or don't want to display a title in the plot, use double hashes
+//   (e.g. "MyPlot##HiddenIdText" or "##NoTitle").
+// - #size is the **frame** size of the plot widget, not the plot area. The default
+//   size of plots (i.e. when ImVec2(0,0)) can be modified in your ImPlotStyle.
+CIMGUI_API bool ImPlotBeginPlot(const char* title_id, ImVec2 size /* = ImVec2(-1, 0) */, ImPlotFlags flags /* = 0 */);
+
+// Only call EndPlot() if BeginPlot() returns true! Typically called at the end
+// of an if statement conditioned on BeginPlot(). See example above.
+CIMGUI_API void ImPlotEndPlot(void);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Begin/End Subplots
+//-----------------------------------------------------------------------------
+
+// Starts a subdivided plotting context. If the function returns true,
+// EndSubplots() MUST be called! Call BeginPlot/EndPlot AT MOST [rows*cols]
+// times in  between the beginning and end of the subplot context. Plots are
+// added in row major order.
+//
+// Example:
+//
+// if (BeginSubplots("My Subplot",2,3,ImVec2(800,400)) {
+//     for (int i = 0; i < 6; ++i) {
+//         if (BeginPlot(...)) {
+//             ImPlot::PlotLine(...);
+//             ...
+//             EndPlot();
+//         }
+//     }
+//     EndSubplots();
+// }
+//
+// Produces:
+//
+// [0] | [1] | [2]
+// ----|-----|----
+// [3] | [4] | [5]
+//
+// Important notes:
+//
+// - #title_id must be unique to the current ImGui ID scope. If you need to avoid ID
+//   collisions or don't want to display a title in the plot, use double hashes
+//   (e.g. "MySubplot##HiddenIdText" or "##NoTitle").
+// - #rows and #cols must be greater than 0.
+// - #size is the size of the entire grid of subplots, not the individual plots
+// - #row_ratios and #col_ratios must have AT LEAST #rows and #cols elements,
+//   respectively. These are the sizes of the rows and columns expressed in ratios.
+//   If the user adjusts the dimensions, the arrays are updated with new ratios.
+//
+// Important notes regarding BeginPlot from inside of BeginSubplots:
+//
+// - The #title_id parameter of _BeginPlot_ (see above) does NOT have to be
+//   unique when called inside of a subplot context. Subplot IDs are hashed
+//   for your convenience so you don't have call PushID or generate unique title
+//   strings. Simply pass an empty string to BeginPlot unless you want to title
+//   each subplot.
+// - The #size parameter of _BeginPlot_ (see above) is ignored when inside of a
+//   subplot context. The actual size of the subplot will be based on the
+//   #size value you pass to _BeginSubplots_ and #row/#col_ratios if provided.
+
+CIMGUI_API bool ImPlotBeginSubplots(const char* title_id, int rows, int cols, ImVec2 size, ImPlotSubplotFlags flags /* = 0 */, float* row_ratios /* = nullptr */, float* col_ratios /* = nullptr */);
+
+// Only call EndSubplots() if BeginSubplots() returns true! Typically called at the end
+// of an if statement conditioned on BeginSubplots(). See example above.
+CIMGUI_API void ImPlotEndSubplots(void);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Setup
+//-----------------------------------------------------------------------------
+
+// The following API allows you to setup and customize various aspects of the
+// current plot. The functions should be called immediately after BeginPlot
+// and before any other API calls. Typical usage is as follows:
+
+// if (BeginPlot(...)) {                     1) begin a new plot
+//     SetupAxis(ImAxis_X1, "My X-Axis");    2) make Setup calls
+//     SetupAxis(ImAxis_Y1, "My Y-Axis");
+//     SetupLegend(ImPlotLocation_North);
+//     ...
+//     SetupFinish();                        3) [optional] explicitly finish setup
+//     PlotLine(...);                        4) plot items
+//     ...
+//     EndPlot();                            5) end the plot
+// }
+//
+// Important notes:
+//
+// - Always call Setup code at the top of your BeginPlot conditional statement.
+// - Setup is locked once you start plotting or explicitly call SetupFinish.
+//   Do NOT call Setup code after you begin plotting or after you make
+//   any non-Setup API calls (e.g. utils like PlotToPixels also lock Setup)
+// - Calling SetupFinish is OPTIONAL, but probably good practice. If you do not
+//   call it yourself, then the first subsequent plotting or utility function will
+//   call it for you.
+
+// Enables an axis or sets the label and/or flags for an existing axis. Leave #label = nullptr for no label.
+CIMGUI_API void ImPlotSetupAxis(ImAxis axis, const char* label /* = nullptr */, ImPlotAxisFlags flags /* = 0 */);
+// Sets an axis range limits. If ImPlotCond_Always is used, the axes limits will be locked. Inversion with v_min > v_max is not supported; use SetupAxisLimits instead.
+CIMGUI_API void ImPlotSetupAxisLimits(ImAxis axis, double v_min, double v_max, ImPlotCond cond /* = ImPlotCond_Once */);
+// Links an axis range limits to external values. Set to nullptr for no linkage. The pointer data must remain valid until EndPlot.
+CIMGUI_API void ImPlotSetupAxisLinks(ImAxis axis, double* link_min, double* link_max);
+// Sets the format of numeric axis labels via formatter specifier (default="%g"). Formatted values will be double (i.e. use %f).
+CIMGUI_API void ImPlotSetupAxisFormat(ImAxis axis, const char* fmt);
+// Sets the format of numeric axis labels via formatter callback. Given #value, write a label into #buff. Optionally pass user data.
+CIMGUI_API void ImPlotSetupAxisFormatImPlotFormatter(ImAxis axis, ImPlotFormatter formatter, void* data /* = nullptr */);
+// Sets an axis' ticks and optionally the labels. To keep the default ticks, set #keep_default=true.
+CIMGUI_API void ImPlotSetupAxisTicks(ImAxis axis, const double* values, int n_ticks, const char*const labels[] /* = nullptr */, bool keep_default /* = false */);
+// Sets an axis' ticks and optionally the labels for the next plot. To keep the default ticks, set #keep_default=true.
+CIMGUI_API void ImPlotSetupAxisTicksDouble(ImAxis axis, double v_min, double v_max, int n_ticks, const char*const labels[] /* = nullptr */, bool keep_default /* = false */);
+// Sets an axis' scale using built-in options.
+CIMGUI_API void ImPlotSetupAxisScale(ImAxis axis, ImPlotScale scale);
+// Sets an axis' scale using user supplied forward and inverse transforms.
+CIMGUI_API void ImPlotSetupAxisScaleImPlotTransform(ImAxis axis, ImPlotTransform forward, ImPlotTransform inverse, void* data /* = nullptr */);
+// Sets an axis' limits constraints.
+CIMGUI_API void ImPlotSetupAxisLimitsConstraints(ImAxis axis, double v_min, double v_max);
+// Sets an axis' zoom constraints.
+CIMGUI_API void ImPlotSetupAxisZoomConstraints(ImAxis axis, double z_min, double z_max);
+
+// Sets the label and/or flags for primary X and Y axes (shorthand for two calls to SetupAxis).
+CIMGUI_API void ImPlotSetupAxes(const char* x_label, const char* y_label, ImPlotAxisFlags x_flags /* = 0 */, ImPlotAxisFlags y_flags /* = 0 */);
+// Sets the primary X and Y axes range limits. If ImPlotCond_Always is used, the axes limits will be locked (shorthand for two calls to SetupAxisLimits).
+CIMGUI_API void ImPlotSetupAxesLimits(double x_min, double x_max, double y_min, double y_max, ImPlotCond cond /* = ImPlotCond_Once */);
+
+// Sets up the plot legend. This can also be called immediately after BeginSubplots when using ImPlotSubplotFlags_ShareItems.
+CIMGUI_API void ImPlotSetupLegend(ImPlotLocation location, ImPlotLegendFlags flags /* = 0 */);
+// Set the location of the current plot's mouse position text (default = South|East).
+CIMGUI_API void ImPlotSetupMouseText(ImPlotLocation location, ImPlotMouseTextFlags flags /* = 0 */);
+
+// Explicitly finalize plot setup. Once you call this, you cannot make anymore Setup calls for the current plot!
+// Note that calling this function is OPTIONAL; it will be called by the first subsequent setup-locking API call.
+CIMGUI_API void ImPlotSetupFinish(void);
+
+//-----------------------------------------------------------------------------
+// [SECTION] SetNext
+//-----------------------------------------------------------------------------
+
+// Though you should default to the `Setup` API above, there are some scenarios
+// where (re)configuring a plot or axis before `BeginPlot` is needed (e.g. if
+// using a preceding button or slider widget to change the plot limits). In
+// this case, you can use the `SetNext` API below. While this is not as feature
+// rich as the Setup API, most common needs are provided. These functions can be
+// called anywhere except for inside of `Begin/EndPlot`. For example:
+
+// if (ImGui::Button("Center Plot"))
+//     ImPlot::SetNextPlotLimits(-1,1,-1,1);
+// if (ImPlot::BeginPlot(...)) {
+//     ...
+//     ImPlot::EndPlot();
+// }
+//
+// Important notes:
+//
+// - You must still enable non-default axes with SetupAxis for these functions
+//   to work properly.
+
+// Sets an upcoming axis range limits. If ImPlotCond_Always is used, the axes limits will be locked.
+CIMGUI_API void ImPlotSetNextAxisLimits(ImAxis axis, double v_min, double v_max, ImPlotCond cond /* = ImPlotCond_Once */);
+// Links an upcoming axis range limits to external values. Set to nullptr for no linkage. The pointer data must remain valid until EndPlot!
+CIMGUI_API void ImPlotSetNextAxisLinks(ImAxis axis, double* link_min, double* link_max);
+// Set an upcoming axis to auto fit to its data.
+CIMGUI_API void ImPlotSetNextAxisToFit(ImAxis axis);
+
+// Sets the upcoming primary X and Y axes range limits. If ImPlotCond_Always is used, the axes limits will be locked (shorthand for two calls to SetupAxisLimits).
+CIMGUI_API void ImPlotSetNextAxesLimits(double x_min, double x_max, double y_min, double y_max, ImPlotCond cond /* = ImPlotCond_Once */);
+// Sets all upcoming axes to auto fit to their data.
+CIMGUI_API void ImPlotSetNextAxesToFit(void);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Plot Items
+//-----------------------------------------------------------------------------
+
+// The main plotting API is provided below. Call these functions between
+// Begin/EndPlot and after any Setup API calls. Each plots data on the current
+// x and y axes, which can be changed with `SetAxis/Axes`.
+//
+// The templated functions are explicitly instantiated in implot_items.cpp.
+// They are not intended to be used generically with custom types. You will get
+// a linker error if you try! All functions support the following scalar types:
+//
+// float, double, ImS8, ImU8, ImS16, ImU16, ImS32, ImU32, ImS64, ImU64
+//
+//
+// If you need to plot custom or non-homogenous data you have a few options:
+//
+// 1. If your data is a simple struct/class (e.g. Vector2f), you can use striding in your ImPlotSpec.
+//    This is the most performant option if applicable.
+//
+//    struct Vector2f { float X, Y; };
+//    ...
+//    Vector2f data[42];
+//    ImPlot::PlotLine("line", &data[0].x, &data[0].y, 42, {ImPlotProp_Stride, sizeof(Vector2f});
+//
+// 2. Write a custom getter C function or C++ lambda and pass it and optionally your data to
+//    an ImPlot function post-fixed with a G (e.g. PlotScatterG). This has a slight performance
+//    cost, but probably not enough to worry about unless your data is very large. Examples:
+//
+//    ImPlotPoint MyDataGetter(int idx, void* data) {
+//        MyData* my_data = (MyData*)data;
+//        ImPlotPoint p;
+//        p.x = my_data->GetTime(idx);
+//        p.y = my_data->GetValue(idx);
+//        return p
+//    }
+//    ...
+//    auto my_lambda = [](int idx, void*) {
+//        double t = idx / 999.0;
+//        return ImPlotPoint(t, 0.5+0.5*std::sin(2*PI*10*t));
+//    };
+//    ...
+//    if (ImPlot::BeginPlot("MyPlot")) {
+//        MyData my_data;
+//        ImPlot::PlotScatterG("scatter", MyDataGetter, &my_data, my_data.Size());
+//        ImPlot::PlotLineG("line", my_lambda, nullptr, 1000);
+//        ImPlot::EndPlot();
+//    }
+//
+// NB: All types are converted to double before plotting. You may lose information
+// if you try plotting extremely large 64-bit integral types. Proceed with caution!
+
+// Plots a standard 2D line plot.
+CIMGUI_API void ImPlotPlotLineG(const char* label_id, ImPlotGetter getter, void* data, int count, ImPlotSpec spec /* = ImPlotSpec() */);
+
+// Plots a standard 2D scatter plot. Default marker is ImPlotMarker_Circle.
+CIMGUI_API void ImPlotPlotScatterG(const char* label_id, ImPlotGetter getter, void* data, int count, ImPlotSpec spec /* = ImPlotSpec() */);
+
+// Plots a bubble graph. #szs are the radius of each bubble in plot units.
+
+// Plots a polygon. Points are specified in counter-clockwise order. If concave, make sure to set the Concave flag.
+
+// Plots a a stairstep graph. The y value is continued constantly to the right from every x position, i.e. the interval [x[i], x[i+1]) has the value y[i]
+CIMGUI_API void ImPlotPlotStairsG(const char* label_id, ImPlotGetter getter, void* data, int count, ImPlotSpec spec /* = ImPlotSpec() */);
+
+// Plots a shaded (filled) region between two lines, or a line and a horizontal reference. Set yref to +/-INFINITY for infinite fill extents.
+CIMGUI_API void ImPlotPlotShadedG(const char* label_id, ImPlotGetter getter1, void* data1, ImPlotGetter getter2, void* data2, int count, ImPlotSpec spec /* = ImPlotSpec() */);
+
+// Plots a bar graph. Vertical by default. #bar_size and #shift are in plot units.
+CIMGUI_API void ImPlotPlotBarsG(const char* label_id, ImPlotGetter getter, void* data, int count, double bar_size, ImPlotSpec spec /* = ImPlotSpec() */);
+
+// Plots a group of bars. #values is a row-major matrix with #item_count rows and #group_count cols. #label_ids should have #item_count elements.
+
+// Plots vertical error bar. The label_id should be the same as the label_id of the associated line or bar plot.
+
+// Plots stems. Vertical by default.
+
+// Plots infinite vertical or horizontal lines (e.g. for references or asymptotes).
+
+// Plots a pie chart. Center and radius are in plot units. #label_fmt can be set to nullptr for no labels.
+
+// Plots a 2D heatmap chart. Values are expected to be in row-major order by default. Leave #scale_min and scale_max both at 0 for automatic color scaling, or set them to a predefined range. #label_fmt can be set to nullptr for no labels.
+
+// Plots a horizontal histogram. #bins can be a positive integer or an ImPlotBin_ method. If #range is left unspecified, the min/max of #values will be used as the range.
+// Otherwise, outlier values outside of the range are not binned. The largest bin count or density is returned.
+
+// Plots two dimensional, bivariate histogram as a heatmap. #x_bins and #y_bins can be a positive integer or an ImPlotBin. If #range is left unspecified, the min/max of
+// #xs an #ys will be used as the ranges. Otherwise, outlier values outside of range are not binned. The largest bin count or density is returned.
+
+// Plots digital data. Digital plots do not respond to y drag or zoom, and are always referenced to the bottom of the plot.
+CIMGUI_API void ImPlotPlotDigitalG(const char* label_id, ImPlotGetter getter, void* data, int count, ImPlotSpec spec /* = ImPlotSpec() */);
+
+// Plots an axis-aligned image. #bounds_min/bounds_max are in plot coordinates (y-up) and #uv0/uv1 are in texture coordinates (y-down).
+#ifdef IMGUI_HAS_TEXTURES
+CIMGUI_API void ImPlotPlotImage(const char* label_id, ImTextureRef tex_ref, ImPlotPoint bounds_min, ImPlotPoint bounds_max, ImVec2 uv0 /* = ImVec2(0, 0) */, ImVec2 uv1 /* = ImVec2(1, 1) */, ImVec4 tint_col /* = ImVec4(1, 1, 1, 1) */, ImPlotSpec spec /* = ImPlotSpec() */);
+#else
+CIMGUI_API void ImPlotPlotImage(const char* label_id, ImTextureID tex_ref, ImPlotPoint bounds_min, ImPlotPoint bounds_max, ImVec2 uv0 /* = ImVec2(0, 0) */, ImVec2 uv1 /* = ImVec2(1, 1) */, ImVec4 tint_col /* = ImVec4(1, 1, 1, 1) */, ImPlotSpec spec /* = ImPlotSpec() */);
+#endif // #ifdef IMGUI_HAS_TEXTURES
+// Plots a centered text label at point x,y with an optional pixel offset. Text color can be changed with ImPlot::PushStyleColor(ImPlotCol_InlayText, ...).
+CIMGUI_API void ImPlotPlotText(const char* text, double x, double y, ImVec2 pix_offset /* = ImVec2(0, 0) */, ImPlotSpec spec /* = ImPlotSpec() */);
+
+// Plots a dummy item (i.e. adds a legend entry colored by ImPlotCol_Line)
+CIMGUI_API void ImPlotPlotDummy(const char* label_id, ImPlotSpec spec /* = ImPlotSpec() */);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Plot Tools
+//-----------------------------------------------------------------------------
+
+// The following can be used to render interactive elements and/or annotations.
+// Like the item plotting functions above, they apply to the current x and y
+// axes, which can be changed with `SetAxis/SetAxes`. These functions return true
+// when user interaction causes the provided coordinates to change. Additional
+// user interactions can be retrieved through the optional output parameters.
+
+// Shows a draggable point at x,y. #col defaults to ImGuiCol_Text.
+CIMGUI_API bool ImPlotDragPoint(int id, double* x, double* y, ImVec4 col, float size /* = 4 */, ImPlotDragToolFlags flags /* = 0 */, bool* out_clicked /* = nullptr */, bool* out_hovered /* = nullptr */, bool* out_held /* = nullptr */);
+// Shows a draggable vertical guide line at an x-value. #col defaults to ImGuiCol_Text.
+CIMGUI_API bool ImPlotDragLineX(int id, double* x, ImVec4 col, float thickness /* = 1 */, ImPlotDragToolFlags flags /* = 0 */, bool* out_clicked /* = nullptr */, bool* out_hovered /* = nullptr */, bool* out_held /* = nullptr */);
+// Shows a draggable horizontal guide line at a y-value. #col defaults to ImGuiCol_Text.
+CIMGUI_API bool ImPlotDragLineY(int id, double* y, ImVec4 col, float thickness /* = 1 */, ImPlotDragToolFlags flags /* = 0 */, bool* out_clicked /* = nullptr */, bool* out_hovered /* = nullptr */, bool* out_held /* = nullptr */);
+// Shows a draggable and resizeable rectangle.
+CIMGUI_API bool ImPlotDragRect(int id, double* x1, double* y1, double* x2, double* y2, ImVec4 col, ImPlotDragToolFlags flags /* = 0 */, bool* out_clicked /* = nullptr */, bool* out_hovered /* = nullptr */, bool* out_held /* = nullptr */);
+
+// Shows an annotation callout at a chosen point. Clamping keeps annotations in the plot area. Annotations are always rendered on top.
+CIMGUI_API void ImPlotAnnotation(double x, double y, ImVec4 col, ImVec2 pix_offset, bool clamp, bool round /* = false */);
+CIMGUI_API void ImPlotAnnotationStr(double x, double y, ImVec4 col, ImVec2 pix_offset, bool clamp, const char* fmt, ...) IM_FMTARGS(6);
+CIMGUI_API void ImPlotAnnotationStrUnformatted(double x, double y, ImVec4 col, ImVec2 pix_offset, bool clamp, const char* text);
+CIMGUI_API void ImPlotAnnotationV(double x, double y, ImVec4 col, ImVec2 pix_offset, bool clamp, const char* fmt, va_list args) IM_FMTLIST(6);
+
+// Shows a x-axis tag at the specified coordinate value.
+CIMGUI_API void ImPlotTagX(double x, ImVec4 col, bool round /* = false */);
+CIMGUI_API void ImPlotTagXStr(double x, ImVec4 col, const char* fmt, ...) IM_FMTARGS(3);
+CIMGUI_API void ImPlotTagXStrUnformatted(double x, ImVec4 col, const char* text);
+CIMGUI_API void ImPlotTagXV(double x, ImVec4 col, const char* fmt, va_list args) IM_FMTLIST(3);
+
+// Shows a y-axis tag at the specified coordinate value.
+CIMGUI_API void ImPlotTagY(double y, ImVec4 col, bool round /* = false */);
+CIMGUI_API void ImPlotTagYStr(double y, ImVec4 col, const char* fmt, ...) IM_FMTARGS(3);
+CIMGUI_API void ImPlotTagYStrUnformatted(double y, ImVec4 col, const char* text);
+CIMGUI_API void ImPlotTagYV(double y, ImVec4 col, const char* fmt, va_list args) IM_FMTLIST(3);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Plot Utils
+//-----------------------------------------------------------------------------
+
+// Select which axis/axes will be used for subsequent plot elements.
+CIMGUI_API void ImPlotSetAxis(ImAxis axis);
+CIMGUI_API void ImPlotSetAxes(ImAxis x_axis, ImAxis y_axis);
+
+// Convert pixels to a position in the current plot's coordinate system. Passing IMPLOT_AUTO uses the current axes.
+
+// Convert a position in the current plot's coordinate system to pixels. Passing IMPLOT_AUTO uses the current axes.
+CIMGUI_API ImVec2 ImPlotPlotToPixels(ImPlotPoint plt, ImAxis x_axis /* = IMPLOT_AUTO */, ImAxis y_axis /* = IMPLOT_AUTO */);
+CIMGUI_API ImVec2 ImPlotPlotToPixelsDouble(double x, double y, ImAxis x_axis /* = IMPLOT_AUTO */, ImAxis y_axis /* = IMPLOT_AUTO */);
+
+// Get the current Plot position (top-left) in pixels.
+CIMGUI_API ImVec2 ImPlotGetPlotPos(void);
+// Get the current Plot size in pixels.
+CIMGUI_API ImVec2 ImPlotGetPlotSize(void);
+
+// Returns the mouse position in x,y coordinates of the current plot. Passing IMPLOT_AUTO uses the current axes.
+// Returns the current plot axis range.
+
+// Returns true if the plot area in the current plot is hovered.
+CIMGUI_API bool ImPlotIsPlotHovered(void);
+// Returns true if the axis label area in the current plot is hovered.
+CIMGUI_API bool ImPlotIsAxisHovered(ImAxis axis);
+// Returns true if the bounding frame of a subplot is hovered.
+CIMGUI_API bool ImPlotIsSubplotsHovered(void);
+
+// Returns true if the current plot is being box selected.
+CIMGUI_API bool ImPlotIsPlotSelected(void);
+// Returns the current plot box selection bounds. Passing IMPLOT_AUTO uses the current axes.
+// Cancels a the current plot box selection.
+CIMGUI_API void ImPlotCancelPlotSelection(void);
+
+// Hides or shows the next plot item (i.e. as if it were toggled from the legend).
+// Use ImPlotCond_Always if you need to forcefully set this every frame.
+CIMGUI_API void ImPlotHideNextItem(bool hidden /* = true */, ImPlotCond cond /* = ImPlotCond_Once */);
+
+// Use the following around calls to Begin/EndPlot to align l/r/t/b padding.
+// Consider using Begin/EndSubplots first. They are more feature rich and
+// accomplish the same behaviour by default. The functions below offer lower
+// level control of plot alignment.
+
+// Align axis padding over multiple plots in a single row or column. #group_id must
+// be unique. If this function returns true, EndAlignedPlots() must be called.
+CIMGUI_API bool ImPlotBeginAlignedPlots(const char* group_id, bool vertical /* = true */);
+// Only call EndAlignedPlots() if BeginAlignedPlots() returns true!
+CIMGUI_API void ImPlotEndAlignedPlots(void);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Legend Utils
+//-----------------------------------------------------------------------------
+
+// Begin a popup for a legend entry.
+CIMGUI_API bool ImPlotBeginLegendPopup(const char* label_id, ImGuiMouseButton mouse_button /* = 1 */);
+// End a popup for a legend entry.
+CIMGUI_API void ImPlotEndLegendPopup(void);
+// Returns true if a plot item legend entry is hovered.
+CIMGUI_API bool ImPlotIsLegendEntryHovered(const char* label_id);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Drag and Drop
+//-----------------------------------------------------------------------------
+
+// Turns the current plot's plotting area into a drag and drop target. Don't forget to call EndDragDropTarget!
+CIMGUI_API bool ImPlotBeginDragDropTargetPlot(void);
+// Turns the current plot's X-axis into a drag and drop target. Don't forget to call EndDragDropTarget!
+CIMGUI_API bool ImPlotBeginDragDropTargetAxis(ImAxis axis);
+// Turns the current plot's legend into a drag and drop target. Don't forget to call EndDragDropTarget!
+CIMGUI_API bool ImPlotBeginDragDropTargetLegend(void);
+// Ends a drag and drop target (currently just an alias for ImGui::EndDragDropTarget).
+CIMGUI_API void ImPlotEndDragDropTarget(void);
+
+// NB: By default, plot and axes drag and drop *sources* require holding the Ctrl modifier to initiate the drag.
+// You can change the modifier if desired. If ImGuiMod_None is provided, the axes will be locked from panning.
+
+// Turns the current plot's plotting area into a drag and drop source. You must hold Ctrl. Don't forget to call EndDragDropSource!
+CIMGUI_API bool ImPlotBeginDragDropSourcePlot(ImGuiDragDropFlags flags /* = 0 */);
+// Turns the current plot's X-axis into a drag and drop source. You must hold Ctrl. Don't forget to call EndDragDropSource!
+CIMGUI_API bool ImPlotBeginDragDropSourceAxis(ImAxis axis, ImGuiDragDropFlags flags /* = 0 */);
+// Turns an item in the current plot's legend into drag and drop source. Don't forget to call EndDragDropSource!
+CIMGUI_API bool ImPlotBeginDragDropSourceItem(const char* label_id, ImGuiDragDropFlags flags /* = 0 */);
+// Ends a drag and drop source (currently just an alias for ImGui::EndDragDropSource).
+CIMGUI_API void ImPlotEndDragDropSource(void);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Styling
+//-----------------------------------------------------------------------------
+
+// Styling colors in ImPlot works similarly to styling colors in ImGui, but
+// with one important difference. Like ImGui, all style colors are stored in an
+// indexable array in ImPlotStyle. You can permanently modify these values through
+// GetStyle().Colors, or temporarily modify them with Push/Pop functions below.
+// However, by default all style colors in ImPlot default to a special color
+// IMPLOT_AUTO_COL. IMPLOT_AUTO_COL tells ImPlot to set that color from color data
+// in your **ImGuiStyle**. The ImGuiCol_ that these style colors default to are
+// detailed above, and in general have been mapped to produce plots visually
+// consistent with your current ImGui style. Of course, you are free to
+// manually set these colors to whatever you like, and further can Push/Pop
+// them around individual plots for plot-specific styling (e.g. coloring axes).
+
+// Provides access to plot style structure for permanent modifications to colors, sizes, etc.
+CIMGUI_API ImPlotStyle* ImPlotGetStyle(void);
+
+// Style plot colors for current ImGui style (default).
+CIMGUI_API void ImPlotStyleColorsAuto(ImPlotStyle* dst /* = nullptr */);
+// Style plot colors for ImGui "Classic".
+CIMGUI_API void ImPlotStyleColorsClassic(ImPlotStyle* dst /* = nullptr */);
+// Style plot colors for ImGui "Dark".
+CIMGUI_API void ImPlotStyleColorsDark(ImPlotStyle* dst /* = nullptr */);
+// Style plot colors for ImGui "Light".
+CIMGUI_API void ImPlotStyleColorsLight(ImPlotStyle* dst /* = nullptr */);
+
+// Use PushStyleX to temporarily modify your ImPlotStyle. The modification
+// will last until the matching call to PopStyleX. You MUST call a pop for
+// every push, otherwise you will leak memory! This behaves just like ImGui.
+
+// Temporarily modify a style color. Don't forget to call PopStyleColor!
+CIMGUI_API void ImPlotPushStyleColor(ImPlotCol idx, ImU32 col);
+CIMGUI_API void ImPlotPushStyleColorImVec4(ImPlotCol idx, ImVec4 col);
+// Undo temporary style color modification(s). Undo multiple pushes at once by increasing count.
+CIMGUI_API void ImPlotPopStyleColor(int count /* = 1 */);
+
+// Temporarily modify a style variable of float type. Don't forget to call PopStyleVar!
+CIMGUI_API void ImPlotPushStyleVar(ImPlotStyleVar idx, float val);
+// Temporarily modify a style variable of int type. Don't forget to call PopStyleVar!
+CIMGUI_API void ImPlotPushStyleVarInt(ImPlotStyleVar idx, int val);
+// Temporarily modify a style variable of ImVec2 type. Don't forget to call PopStyleVar!
+CIMGUI_API void ImPlotPushStyleVarImVec2(ImPlotStyleVar idx, ImVec2 val);
+// Undo temporary style variable modification(s). Undo multiple pushes at once by increasing count.
+CIMGUI_API void ImPlotPopStyleVar(int count /* = 1 */);
+
+// Gets the last item primary color (i.e. its legend icon color)
+CIMGUI_API ImVec4 ImPlotGetLastItemColor(void);
+
+// Returns the null terminated string name for an ImPlotCol.
+CIMGUI_API const char* ImPlotGetStyleColorName(ImPlotCol idx);
+// Returns the null terminated string name for an ImPlotMarker.
+CIMGUI_API const char* ImPlotGetMarkerName(ImPlotMarker idx);
+
+// Returns the next marker and advances the marker for the current plot. You need to call this between Begin/EndPlot!
+CIMGUI_API ImPlotMarker ImPlotNextMarker(void);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Colormaps
+//-----------------------------------------------------------------------------
+
+// Item styling is based on colormaps when the relevant ImPlotCol_XXX is set to
+// IMPLOT_AUTO_COL (default). Several built-in colormaps are available. You can
+// add and then push/pop your own colormaps as well. To permanently set a colormap,
+// modify the Colormap index member of your ImPlotStyle.
+
+// Colormap data will be ignored and a custom color will be used if you have done one of the following:
+//     1) Modified an item style color in your ImPlotStyle to anything other than IMPLOT_AUTO_COL.
+//     2) Pushed an item style color using PushStyleColor().
+//     3) Set the next item style with a SetNextXXXStyle function.
+
+// Add a new colormap. The color data will be copied. The colormap can be used by pushing either the returned index or the
+// string name with PushColormap. The colormap name must be unique and the size must be greater than 1. You will receive
+// an assert otherwise! By default colormaps are considered to be qualitative (i.e. discrete). If you want to create a
+// continuous colormap, set #qual=false. This will treat the colors you provide as keys, and ImPlot will build a linearly
+// interpolated lookup table. The memory footprint of this table will be exactly ((size-1)*255+1)*4 bytes.
+CIMGUI_API ImPlotColormap ImPlotAddColormap(const char* name, const ImVec4* cols, int size, bool qual /* = true */);
+CIMGUI_API ImPlotColormap ImPlotAddColormapImU32Ptr(const char* name, const ImU32* cols, int size, bool qual /* = true */);
+
+// Returns the number of available colormaps (i.e. the built-in + user-added count).
+CIMGUI_API int            ImPlotGetColormapCount(void);
+// Returns a null terminated string name for a colormap given an index. Returns nullptr if index is invalid.
+CIMGUI_API const char*    ImPlotGetColormapName(ImPlotColormap cmap);
+// Returns an index number for a colormap given a valid string name. Returns -1 if name is invalid.
+CIMGUI_API ImPlotColormap ImPlotGetColormapIndex(const char* name);
+
+// Temporarily switch to one of the built-in (i.e. ImPlotColormap_XXX) or user-added colormaps (i.e. a return value of AddColormap). Don't forget to call PopColormap!
+CIMGUI_API void ImPlotPushColormap(ImPlotColormap cmap);
+// Push a colormap by string name. Use built-in names such as "Default", "Deep", "Jet", etc. or a string you provided to AddColormap. Don't forget to call PopColormap!
+CIMGUI_API void ImPlotPushColormapStr(const char* name);
+// Undo temporary colormap modification(s). Undo multiple pushes at once by increasing count.
+CIMGUI_API void ImPlotPopColormap(int count /* = 1 */);
+
+// Returns the next color from the current colormap and advances the colormap for the current plot.
+// Can also be used with no return value to skip colors if desired. You need to call this between Begin/EndPlot!
+CIMGUI_API ImVec4 ImPlotNextColormapColor(void);
+
+// Colormap utils. If cmap = IMPLOT_AUTO (default), the current colormap is assumed.
+// Pass an explicit colormap index (built-in or user-added) to specify otherwise.
+
+// Returns the size of a colormap.
+CIMGUI_API int    ImPlotGetColormapSize(ImPlotColormap cmap /* = IMPLOT_AUTO */);
+// Returns a color from a colormap given an index >= 0 (modulo will be performed).
+CIMGUI_API ImVec4 ImPlotGetColormapColor(int idx, ImPlotColormap cmap /* = IMPLOT_AUTO */);
+// Sample a color from the current colormap given t between 0 and 1.
+CIMGUI_API ImVec4 ImPlotSampleColormap(float t, ImPlotColormap cmap /* = IMPLOT_AUTO */);
+
+// Shows a vertical color scale with linear spaced ticks using the specified color map. Use double hashes to hide label (e.g. "##NoLabel"). If scale_min > scale_max, the scale to color mapping will be reversed.
+CIMGUI_API void ImPlotColormapScale(const char* label, double scale_min, double scale_max, ImVec2 size /* = ImVec2(0, 0) */, const char* format /* = "%g" */, ImPlotColormapScaleFlags flags /* = 0 */, ImPlotColormap cmap /* = IMPLOT_AUTO */);
+// Shows a horizontal slider with a colormap gradient background. Optionally returns the color sampled at t in [0 1].
+CIMGUI_API bool ImPlotColormapSlider(const char* label, float* t, ImVec4* out /* = nullptr */, const char* format /* = "" */, ImPlotColormap cmap /* = IMPLOT_AUTO */);
+// Shows a button with a colormap gradient background.
+CIMGUI_API bool ImPlotColormapButton(const char* label, ImVec2 size /* = ImVec2(0, 0) */, ImPlotColormap cmap /* = IMPLOT_AUTO */);
+
+// When items in a plot sample their color from a colormap, the color is cached and does not change
+// unless explicitly overridden. Therefore, if you change the colormap after the item has already been plotted,
+// item colors will NOT update. If you need item colors to resample the new colormap, then use this
+// function to bust the cached colors. If #plot_title_id is nullptr, then every item in EVERY existing plot
+// will be cache busted. Otherwise only the plot specified by #plot_title_id will be busted. For the
+// latter, this function must be called in the same ImGui ID scope that the plot is in. You should rarely if ever
+// need this function, but it is available for applications that require runtime colormap swaps (e.g. Heatmaps demo).
+CIMGUI_API void ImPlotBustColorCache(const char* plot_title_id /* = nullptr */);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Input Mapping
+//-----------------------------------------------------------------------------
+
+// Provides access to input mapping structure for permanent modifications to controls for pan, select, etc.
+CIMGUI_API ImPlotInputMap* ImPlotGetInputMap(void);
+
+// Default input mapping: pan = LMB drag, box select = RMB drag, fit = LMB double click, context menu = RMB click, zoom = scroll.
+CIMGUI_API void ImPlotMapInputDefault(ImPlotInputMap* dst /* = nullptr */);
+// Reverse input mapping: pan = RMB drag, box select = LMB drag, fit = LMB double click, context menu = RMB click, zoom = scroll.
+CIMGUI_API void ImPlotMapInputReverse(ImPlotInputMap* dst /* = nullptr */);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Miscellaneous
+//-----------------------------------------------------------------------------
+
+// Render icons similar to those that appear in legends (nifty for data lists).
+CIMGUI_API void ImPlotItemIcon(ImVec4 col);
+CIMGUI_API void ImPlotItemIconImU32(ImU32 col);
+CIMGUI_API void ImPlotColormapIcon(ImPlotColormap cmap);
+
+// Get the plot draw list for custom rendering to the current plot area. Call between Begin/EndPlot.
+CIMGUI_API ImDrawList* ImPlotGetPlotDrawList(void);
+// Push clip rect for rendering to current plot area. The rect can be expanded or contracted by #expand pixels. Call between Begin/EndPlot.
+CIMGUI_API void        ImPlotPushPlotClipRect(float expand /* = 0 */);
+// Pop plot clip rect. Call between Begin/EndPlot.
+CIMGUI_API void        ImPlotPopPlotClipRect(void);
+
+// Shows ImPlot style selector dropdown menu.
+CIMGUI_API bool ImPlotShowStyleSelector(const char* label);
+// Shows ImPlot colormap selector dropdown menu.
+CIMGUI_API bool ImPlotShowColormapSelector(const char* label);
+// Shows ImPlot input map selector dropdown menu.
+CIMGUI_API bool ImPlotShowInputMapSelector(const char* label);
+// Shows ImPlot style editor block (not a window).
+CIMGUI_API void ImPlotShowStyleEditor(ImPlotStyle* ref /* = nullptr */);
+// Add basic help/info block for end users (not a window).
+CIMGUI_API void ImPlotShowUserGuide(void);
+// Shows ImPlot metrics/debug information window.
+CIMGUI_API void ImPlotShowMetricsWindow(bool* p_popen /* = nullptr */);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Demo
+//-----------------------------------------------------------------------------
+
+// Shows the ImPlot demo window (add implot_demo.cpp to your sources!)
+
+//-----------------------------------------------------------------------------
+// [SECTION] Obsolete API
+//-----------------------------------------------------------------------------
+
+// The following functions will be removed! Keep your copy of implot up to date!
+// Occasionally set '#define IMPLOT_DISABLE_OBSOLETE_FUNCTIONS' to stay ahead.
+// If you absolutely must use these functions and do not want to receive compiler
+// warnings, set '#define IMPLOT_DISABLE_OBSOLETE_WARNINGS'.
+
+#ifndef IMPLOT_DISABLE_OBSOLETE_FUNCTIONS
+#ifndef IMPLOT_DISABLE_DEPRECATED_WARNINGS
+#if __cplusplus>201402L
+#define IMPLOT_DEPRECATED(method) [[deprecated]] method
+#else
+#if defined(__GNUC__)&&!defined(__INTEL_COMPILER)&&(__GNUC__>3 ||(__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
+#define IMPLOT_DEPRECATED(method) method __attribute__( ( deprecated ) )
+#else
+#if defined(_MSC_VER)
+#define IMPLOT_DEPRECATED(method) __declspec(deprecated) method
+#else
+#define IMPLOT_DEPRECATED(method) method
+#endif // #if defined(_MSC_VER)
+#endif // #if defined(__GNUC__)&&!defined(__INTEL_COMPILER)&&(__GNUC__>3 ||(__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
+#endif // #if __cplusplus>201402L
+#else
+#define IMPLOT_DEPRECATED(method) method
+#endif // #ifndef IMPLOT_DISABLE_DEPRECATED_WARNINGS
+
+// OBSOLETED in v1.0 (from February 2026)
+// IMGUI_API void SetNextLineStyle(const ImVec4& col = IMPLOT_AUTO_COL, float weight = IMPLOT_AUTO); // OBSOLETED IN v1.0 // Set ImPlotSpec.LineColor/LineWeight or construct ImPlotSpec with { ImPlotSpec_LineColor, color, ImPlotSpec_LineWeight, weight }.
+
+// IMGUI_API void SetNextFillStyle(const ImVec4& col = IMPLOT_AUTO_COL, float alpha_mod = IMPLOT_AUTO);// OBSOLETED IN v1.0 // Set ImPlotSpec.FillColor/FillAlpha or construct ImPlotSpec with { ImPlotSpec_FillColor, color, ImPlotSpec_FillAlpha, alpha }.
+
+// IMGUI_API void SetNextMarkerStyle(ImPlotMarker marker = IMPLOT_AUTO, float size = IMPLOT_AUTO, const ImVec4& fill = IMPLOT_AUTO_COL, float weight = IMPLOT_AUTO, const ImVec4& outline = IMPLOT_AUTO_COL); // OBSOLETED IN v1.0 // Set ImPlotSpec.Marker/MarkerSize/MarkerFillColor/LineWeight/MarkerLineColor or construct ImPlotSpec with { ImPlotSpec_Marker, marker, ImPlotSpec_MarkerSize, size, ImPlotSpec_MarkerFillColor, fill_color, ImPlotSpec_LineWeight, weight, ImPlotSpec_MarkerLineColor, outline }.
+
+// IMGUI_API void SetNextErrorBarStyle(const ImVec4& col = IMPLOT_AUTO_COL, float size = IMPLOT_AUTO, float weight = IMPLOT_AUTO); // OBSOLETED IN v1.0 // Set ImPlotSpec.LineColor/Size/LineWeight or construct ImPlotSpec with { ImPlotSpec_LineColor, col, ImPlotSpec_Size, size, ImPlotSpec_LineWeight, weight }.
+#endif// #ifndef IMPLOT_DISABLE_OBSOLETE_FUNCTIONS
+#endif// #ifndef IMGUI_DISABLE
+// THIS FILE HAS BEEN AUTO-GENERATED BY scripts/generate-implot-shim.py.
+// **DO NOT EDIT DIRECTLY** -- regen via scripts/refresh-generated-in.sh.
+//
+// Monomorphized shim for implot's templated public API. Each
+// IMPLOT_TMP-fronted PlotXxx<T> in upstream's implot.h becomes
+// 10 concrete entry points here, one per scalar type that
+// implot_items.cpp explicitly instantiates. Disambiguation infix:
+//   <Name>_<Tag>           single-overload functions
+//   <Name>_xy_<Tag>        (xs, ys) form
+//   <Name>_xyy_<Tag>       (xs, ys1, ys2) form
+//   <Name>_xye_<Tag>       (xs, ys, err) form
+//   <Name>_xynp_<Tag>      (xs, ys, neg, pos) form
+//   PlotPieChart_fmt_<Tag> formatter-callback overload
+
+CIMGUI_API void   ImPlotPlotLine_S8(const char* label_id, const ImS8* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_U8(const char* label_id, const ImU8* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_S16(const char* label_id, const ImS16* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_U16(const char* label_id, const ImU16* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_S32(const char* label_id, const ImS32* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_U32(const char* label_id, const ImU32* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_S64(const char* label_id, const ImS64* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_U64(const char* label_id, const ImU64* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_F32(const char* label_id, const float* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_F64(const char* label_id, const double* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_xy_F32(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotLine_xy_F64(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_S8(const char* label_id, const ImS8* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_U8(const char* label_id, const ImU8* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_S16(const char* label_id, const ImS16* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_U16(const char* label_id, const ImU16* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_S32(const char* label_id, const ImS32* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_U32(const char* label_id, const ImU32* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_S64(const char* label_id, const ImS64* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_U64(const char* label_id, const ImU64* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_F32(const char* label_id, const float* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_F64(const char* label_id, const double* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_xy_F32(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotScatter_xy_F64(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_S8(const char* label_id, const ImS8* values, const ImS8* szs, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_U8(const char* label_id, const ImU8* values, const ImU8* szs, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_S16(const char* label_id, const ImS16* values, const ImS16* szs, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_U16(const char* label_id, const ImU16* values, const ImU16* szs, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_S32(const char* label_id, const ImS32* values, const ImS32* szs, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_U32(const char* label_id, const ImU32* values, const ImU32* szs, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_S64(const char* label_id, const ImS64* values, const ImS64* szs, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_U64(const char* label_id, const ImU64* values, const ImU64* szs, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_F32(const char* label_id, const float* values, const float* szs, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_F64(const char* label_id, const double* values, const double* szs, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* szs, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* szs, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* szs, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* szs, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* szs, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* szs, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* szs, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* szs, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_xy_F32(const char* label_id, const float* xs, const float* ys, const float* szs, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBubbles_xy_F64(const char* label_id, const double* xs, const double* ys, const double* szs, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPolygon_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPolygon_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPolygon_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPolygon_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPolygon_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPolygon_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPolygon_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPolygon_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPolygon_F32(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPolygon_F64(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_S8(const char* label_id, const ImS8* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_U8(const char* label_id, const ImU8* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_S16(const char* label_id, const ImS16* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_U16(const char* label_id, const ImU16* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_S32(const char* label_id, const ImS32* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_U32(const char* label_id, const ImU32* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_S64(const char* label_id, const ImS64* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_U64(const char* label_id, const ImU64* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_F32(const char* label_id, const float* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_F64(const char* label_id, const double* values, int count, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_xy_F32(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStairs_xy_F64(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_S8(const char* label_id, const ImS8* values, int count, double yref, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_U8(const char* label_id, const ImU8* values, int count, double yref, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_S16(const char* label_id, const ImS16* values, int count, double yref, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_U16(const char* label_id, const ImU16* values, int count, double yref, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_S32(const char* label_id, const ImS32* values, int count, double yref, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_U32(const char* label_id, const ImU32* values, int count, double yref, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_S64(const char* label_id, const ImS64* values, int count, double yref, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_U64(const char* label_id, const ImU64* values, int count, double yref, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_F32(const char* label_id, const float* values, int count, double yref, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_F64(const char* label_id, const double* values, int count, double yref, double xscale, double xstart, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double yref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double yref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double yref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double yref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double yref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double yref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double yref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double yref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xy_F32(const char* label_id, const float* xs, const float* ys, int count, double yref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xy_F64(const char* label_id, const double* xs, const double* ys, int count, double yref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xyy_S8(const char* label_id, const ImS8* xs, const ImS8* ys1, const ImS8* ys2, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xyy_U8(const char* label_id, const ImU8* xs, const ImU8* ys1, const ImU8* ys2, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xyy_S16(const char* label_id, const ImS16* xs, const ImS16* ys1, const ImS16* ys2, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xyy_U16(const char* label_id, const ImU16* xs, const ImU16* ys1, const ImU16* ys2, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xyy_S32(const char* label_id, const ImS32* xs, const ImS32* ys1, const ImS32* ys2, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xyy_U32(const char* label_id, const ImU32* xs, const ImU32* ys1, const ImU32* ys2, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xyy_S64(const char* label_id, const ImS64* xs, const ImS64* ys1, const ImS64* ys2, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xyy_U64(const char* label_id, const ImU64* xs, const ImU64* ys1, const ImU64* ys2, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xyy_F32(const char* label_id, const float* xs, const float* ys1, const float* ys2, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotShaded_xyy_F64(const char* label_id, const double* xs, const double* ys1, const double* ys2, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_S8(const char* label_id, const ImS8* values, int count, double bar_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_U8(const char* label_id, const ImU8* values, int count, double bar_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_S16(const char* label_id, const ImS16* values, int count, double bar_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_U16(const char* label_id, const ImU16* values, int count, double bar_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_S32(const char* label_id, const ImS32* values, int count, double bar_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_U32(const char* label_id, const ImU32* values, int count, double bar_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_S64(const char* label_id, const ImS64* values, int count, double bar_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_U64(const char* label_id, const ImU64* values, int count, double bar_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_F32(const char* label_id, const float* values, int count, double bar_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_F64(const char* label_id, const double* values, int count, double bar_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double bar_size, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double bar_size, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double bar_size, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double bar_size, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double bar_size, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double bar_size, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double bar_size, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double bar_size, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_xy_F32(const char* label_id, const float* xs, const float* ys, int count, double bar_size, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBars_xy_F64(const char* label_id, const double* xs, const double* ys, int count, double bar_size, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBarGroups_S8(const char*const label_ids[], const ImS8* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBarGroups_U8(const char*const label_ids[], const ImU8* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBarGroups_S16(const char*const label_ids[], const ImS16* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBarGroups_U16(const char*const label_ids[], const ImU16* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBarGroups_S32(const char*const label_ids[], const ImS32* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBarGroups_U32(const char*const label_ids[], const ImU32* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBarGroups_S64(const char*const label_ids[], const ImS64* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBarGroups_U64(const char*const label_ids[], const ImU64* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBarGroups_F32(const char*const label_ids[], const float* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotBarGroups_F64(const char*const label_ids[], const double* values, int item_count, int group_count, double group_size, double shift, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xye_S8(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* err, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xye_U8(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* err, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xye_S16(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* err, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xye_U16(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* err, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xye_S32(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* err, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xye_U32(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* err, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xye_S64(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* err, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xye_U64(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* err, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xye_F32(const char* label_id, const float* xs, const float* ys, const float* err, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xye_F64(const char* label_id, const double* xs, const double* ys, const double* err, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xynp_S8(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* neg, const ImS8* pos, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xynp_U8(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* neg, const ImU8* pos, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xynp_S16(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* neg, const ImS16* pos, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xynp_U16(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* neg, const ImU16* pos, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xynp_S32(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* neg, const ImS32* pos, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xynp_U32(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* neg, const ImU32* pos, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xynp_S64(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* neg, const ImS64* pos, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xynp_U64(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* neg, const ImU64* pos, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xynp_F32(const char* label_id, const float* xs, const float* ys, const float* neg, const float* pos, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotErrorBars_xynp_F64(const char* label_id, const double* xs, const double* ys, const double* neg, const double* pos, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_S8(const char* label_id, const ImS8* values, int count, double ref, double scale, double start, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_U8(const char* label_id, const ImU8* values, int count, double ref, double scale, double start, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_S16(const char* label_id, const ImS16* values, int count, double ref, double scale, double start, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_U16(const char* label_id, const ImU16* values, int count, double ref, double scale, double start, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_S32(const char* label_id, const ImS32* values, int count, double ref, double scale, double start, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_U32(const char* label_id, const ImU32* values, int count, double ref, double scale, double start, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_S64(const char* label_id, const ImS64* values, int count, double ref, double scale, double start, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_U64(const char* label_id, const ImU64* values, int count, double ref, double scale, double start, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_F32(const char* label_id, const float* values, int count, double ref, double scale, double start, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_F64(const char* label_id, const double* values, int count, double ref, double scale, double start, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double ref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double ref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double ref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double ref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double ref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double ref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double ref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double ref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_xy_F32(const char* label_id, const float* xs, const float* ys, int count, double ref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotStems_xy_F64(const char* label_id, const double* xs, const double* ys, int count, double ref, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotInfLines_S8(const char* label_id, const ImS8* values, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotInfLines_U8(const char* label_id, const ImU8* values, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotInfLines_S16(const char* label_id, const ImS16* values, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotInfLines_U16(const char* label_id, const ImU16* values, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotInfLines_S32(const char* label_id, const ImS32* values, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotInfLines_U32(const char* label_id, const ImU32* values, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotInfLines_S64(const char* label_id, const ImS64* values, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotInfLines_U64(const char* label_id, const ImU64* values, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotInfLines_F32(const char* label_id, const float* values, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotInfLines_F64(const char* label_id, const double* values, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_fmt_S8(const char*const label_ids[], const ImS8* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_fmt_U8(const char*const label_ids[], const ImU8* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_fmt_S16(const char*const label_ids[], const ImS16* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_fmt_U16(const char*const label_ids[], const ImU16* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_fmt_S32(const char*const label_ids[], const ImS32* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_fmt_U32(const char*const label_ids[], const ImU32* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_fmt_S64(const char*const label_ids[], const ImS64* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_fmt_U64(const char*const label_ids[], const ImU64* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_fmt_F32(const char*const label_ids[], const float* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_fmt_F64(const char*const label_ids[], const double* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_S8(const char*const label_ids[], const ImS8* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_U8(const char*const label_ids[], const ImU8* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_S16(const char*const label_ids[], const ImS16* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_U16(const char*const label_ids[], const ImU16* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_S32(const char*const label_ids[], const ImS32* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_U32(const char*const label_ids[], const ImU32* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_S64(const char*const label_ids[], const ImS64* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_U64(const char*const label_ids[], const ImU64* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_F32(const char*const label_ids[], const float* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotPieChart_F64(const char*const label_ids[], const double* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotHeatmap_S8(const char* label_id, const ImS8* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint bounds_min, ImPlotPoint bounds_max, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotHeatmap_U8(const char* label_id, const ImU8* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint bounds_min, ImPlotPoint bounds_max, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotHeatmap_S16(const char* label_id, const ImS16* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint bounds_min, ImPlotPoint bounds_max, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotHeatmap_U16(const char* label_id, const ImU16* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint bounds_min, ImPlotPoint bounds_max, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotHeatmap_S32(const char* label_id, const ImS32* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint bounds_min, ImPlotPoint bounds_max, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotHeatmap_U32(const char* label_id, const ImU32* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint bounds_min, ImPlotPoint bounds_max, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotHeatmap_S64(const char* label_id, const ImS64* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint bounds_min, ImPlotPoint bounds_max, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotHeatmap_U64(const char* label_id, const ImU64* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint bounds_min, ImPlotPoint bounds_max, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotHeatmap_F32(const char* label_id, const float* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint bounds_min, ImPlotPoint bounds_max, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotHeatmap_F64(const char* label_id, const double* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, ImPlotPoint bounds_min, ImPlotPoint bounds_max, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram_S8(const char* label_id, const ImS8* values, int count, int bins, double bar_scale, ImPlotRange range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram_U8(const char* label_id, const ImU8* values, int count, int bins, double bar_scale, ImPlotRange range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram_S16(const char* label_id, const ImS16* values, int count, int bins, double bar_scale, ImPlotRange range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram_U16(const char* label_id, const ImU16* values, int count, int bins, double bar_scale, ImPlotRange range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram_S32(const char* label_id, const ImS32* values, int count, int bins, double bar_scale, ImPlotRange range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram_U32(const char* label_id, const ImU32* values, int count, int bins, double bar_scale, ImPlotRange range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram_S64(const char* label_id, const ImS64* values, int count, int bins, double bar_scale, ImPlotRange range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram_U64(const char* label_id, const ImU64* values, int count, int bins, double bar_scale, ImPlotRange range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram_F32(const char* label_id, const float* values, int count, int bins, double bar_scale, ImPlotRange range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram_F64(const char* label_id, const double* values, int count, int bins, double bar_scale, ImPlotRange range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram2D_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, int x_bins, int y_bins, ImPlotRect range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram2D_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, int x_bins, int y_bins, ImPlotRect range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram2D_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, int x_bins, int y_bins, ImPlotRect range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram2D_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, int x_bins, int y_bins, ImPlotRect range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram2D_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, int x_bins, int y_bins, ImPlotRect range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram2D_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, int x_bins, int y_bins, ImPlotRect range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram2D_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, int x_bins, int y_bins, ImPlotRect range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram2D_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, int x_bins, int y_bins, ImPlotRect range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram2D_F32(const char* label_id, const float* xs, const float* ys, int count, int x_bins, int y_bins, ImPlotRect range, ImPlotSpec spec);
+CIMGUI_API double ImPlotPlotHistogram2D_F64(const char* label_id, const double* xs, const double* ys, int count, int x_bins, int y_bins, ImPlotRect range, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotDigital_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotDigital_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotDigital_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotDigital_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotDigital_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotDigital_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotDigital_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotDigital_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotDigital_F32(const char* label_id, const float* xs, const float* ys, int count, ImPlotSpec spec);
+CIMGUI_API void   ImPlotPlotDigital_F64(const char* label_id, const double* xs, const double* ys, int count, ImPlotSpec spec);
+#ifdef __cplusplus
+} // End of extern "C" block
+#endif
diff --git a/cbits/implot/implot.cpp b/cbits/implot/implot.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/implot/implot.cpp
@@ -0,0 +1,5931 @@
+// MIT License
+
+// Copyright (c) 2020-2024 Evan Pezent
+// Copyright (c) 2025-2026 Breno Cunha Queiroz
+
+// 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.
+
+// ImPlot v1.1 WIP
+
+/*
+
+API BREAKING CHANGES
+====================
+Occasionally introducing changes that are breaking the API. We try to make the breakage minor and easy to fix.
+Below is a change-log of API breaking changes only. If you are using one of the functions listed, expect to have to fix some code.
+When you are not sure about a old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all implot files.
+You can read releases logs https://github.com/epezent/implot/releases for more details.
+
+- 2026/02/12 (1.0) - ImPlotSpec replaces the SetNextXXX style functions. The guide below shows show to migrate from SetNextXXX to ImPlotSpec.
+                        - `SetNextLineStyle` has been removed, styling should be set via ImPlotSpec.
+                          ```
+                          // Before
+                          ImPlot::SetNextLineStyle(line_color, line_weight);
+                          ImPlot::PlotLine("Line", xs, ys, count);
+
+                          // After
+                          ImPlotSpec spec;
+                          spec.LineColor = line_color;
+                          spec.LineWeight = line_weight;
+                          ImPlot::PlotLine("Line", xs, ys, count, spec);
+                          ```
+                        - `SetNextFillStyle` has been removed, styling should be set via ImPlotSpec.
+                          ```
+                          // Before
+                          ImPlot::SetNextFillStyle(fill_color, fill_alpha);
+                          ImPlot::PlotLine("Shaded", xs, ys, count, ImPlotLineFlags_Shaded);
+
+                          // After
+                          ImPlotSpec spec;
+                          spec.FillColor = fill_color;
+                          spec.FillAlpha = fill_alpha;
+                          spec.Flags = ImPlotLineFlags_Shaded;
+                          ImPlot::PlotTLine("Shaded", xs, ys, count, spec);
+                          ```
+                        - SetNextMarkerStyle has been removed, styling should be set via ImPlotSpec.
+                           ```
+                           // Before
+                           ImPlot::SetNextMarkerStyle(marker, marker_size, fill_color, line_weight, marker_outline_color);
+                           ImPlot::PlotScatter("Scatter", xs, ys, count);
+
+                           // After
+                           ImPlotSpec spec;
+                           spec.LineWeight = line_weight;
+                           spec.Marker = marker;
+                           spec.MarkerSize = marker_size;
+                           spec.MarkerLineColor = marker_outline_color;
+                           spec.MarkerFillColor = fill_color;
+                           ImPlot::PlotScatter("Scatter", xs, ys, count, spec);
+                           ```
+                        - SetNextErrorBarStyle has been removed, styling should be set via ImPlotSpec.
+                           ```
+                           // Before
+                           ImPlot::SetNextErrorBarStyle(color, size, weight);
+                           ImPlot::PlotErrorBars("ErrorBar", xs, ys, err, count);
+
+                           // After
+                           ImPlotSpec spec;
+                           spec.LineColor = color;
+                           spec.Size = size;
+                           spec.LineWeight = weight;
+                           ImPlot::PlotErrorBars("ErrorBar", xs, ys, err, count, spec);
+                           ```
+                        - Flags, Offset and Stride should also be set via ImPlotSpec now.
+- 2023/10/02 (1.0) - ImPlotSpec was made the default and _only_ way of styling plot items. Therefore the following features were removed:
+                      - ImPlotCol_Line, ImPlotCol_Fill, ImPlotCol_MarkerOutline, ImPlotCol_MarkerFill, ImPlotCol_ErrorBar have been removed and thus are no longer supported by PushStyleColor.
+                        You can use a common ImPlotSpec instance across multiple PlotX calls to emulate PushStyleColor behavior.
+                      - ImPlotStyleVar_LineWeight, ImPlotStyleVar_Marker, ImPlotStyleVar_MarkerSize, ImPlotStyleVar_MarkerWeight, ImPlotStyleVar_FillAlpha, ImPlotStyleVar_ErrorBarSize, and ImPlotStyleVar_ErrorBarWeight
+                        have been removed and thus are no longer supported by PushStyleVar. You can use a common ImPlotSpec instance across multiple PlotX calls to emulate PushStyleVar behavior.
+                      - ImPlotStyle/ImPlotStyleVar_ DigitalBitGap was renamed to DigitalSpacing; DigitalBitHeight was removed (use ImPlotSpec::Size); DigitalPadding was added for padding from bottom.
+                      - PlotX offset, stride, and flags parameters are now incorporated into ImPlotSpec; specify these variables in the ImPlotSpec passed to PlotX.
+- 2023/08/20 (0.17) - ImPlotFlags_NoChild was removed as child windows are no longer needed to capture scroll. You can safely remove this flag if you were using it.
+- 2023/06/26 (0.15) - Various build fixes related to updates in Dear ImGui internals.
+- 2022/11/25 (0.15) - Make PlotText honor ImPlotItemFlags_NoFit.
+- 2022/06/19 (0.14) - The signature of ColormapScale has changed to accommodate a new ImPlotColormapScaleFlags parameter
+- 2022/06/17 (0.14) - **IMPORTANT** All PlotX functions now take an ImPlotX_Flags `flags` parameter. Where applicable, it is located before the existing `offset` and `stride` parameters.
+                      If you were providing offset and stride values, you will need to update your function call to include a `flags` value. If you fail to do this, you will likely see
+                      unexpected results or crashes without a compiler warning since these three are all default args. We apologize for the inconvenience, but this was a necessary evil.
+                    - PlotBarsH has been removed; use PlotBars + ImPlotBarsFlags_Horizontal instead
+                    - PlotErrorBarsH has been removed; use PlotErrorBars + ImPlotErrorBarsFlags_Horizontal
+                    - PlotHistogram/PlotHistogram2D signatures changed; `cumulative`, `density`, and `outliers` options now specified via ImPlotHistogramFlags
+                    - PlotPieChart signature changed; `normalize` option now specified via ImPlotPieChartFlags
+                    - PlotText signature changes; `vertical` option now specified via `ImPlotTextFlags_Vertical`
+                    - `PlotVLines` and `PlotHLines` replaced with `PlotInfLines` (+ ImPlotInfLinesFlags_Horizontal )
+                    - arguments of ImPlotGetter have been reversed to be consistent with other API callbacks
+                    - SetupAxisScale + ImPlotScale have replaced ImPlotAxisFlags_LogScale and ImPlotAxisFlags_Time flags
+                    - ImPlotFormatters should now return an int indicating the size written
+                    - the signature of ImPlotGetter has been reversed so that void* user_data is the last argument and consistent with other callbacks
+- 2021/10/19 (0.13) - MAJOR API OVERHAUL! See #168 and #272
+                    - TRIVIAL RENAME:
+                      - ImPlotLimits                              -> ImPlotRect
+                      - ImPlotYAxis_                              -> ImAxis_
+                      - SetPlotYAxis                              -> SetAxis
+                      - BeginDragDropTarget                       -> BeginDragDropTargetPlot
+                      - BeginDragDropSource                       -> BeginDragDropSourcePlot
+                      - ImPlotFlags_NoMousePos                    -> ImPlotFlags_NoMouseText
+                      - SetNextPlotLimits                         -> SetNextAxesLimits
+                      - SetMouseTextLocation                      -> SetupMouseText
+                    - SIGNATURE MODIFIED:
+                      - PixelsToPlot/PlotToPixels                 -> added optional X-Axis arg
+                      - GetPlotMousePos                           -> added optional X-Axis arg
+                      - GetPlotLimits                             -> added optional X-Axis arg
+                      - GetPlotSelection                          -> added optional X-Axis arg
+                      - DragLineX/Y/DragPoint                     -> now takes int id; removed labels (render with Annotation/Tag instead)
+                    - REPLACED:
+                      - IsPlotXAxisHovered/IsPlotXYAxisHovered    -> IsAxisHovered(ImAxis)
+                      - BeginDragDropTargetX/BeginDragDropTargetY -> BeginDragDropTargetAxis(ImAxis)
+                      - BeginDragDropSourceX/BeginDragDropSourceY -> BeginDragDropSourceAxis(ImAxis)
+                      - ImPlotCol_XAxis, ImPlotCol_YAxis1, etc.   -> ImPlotCol_AxisText (push/pop this around SetupAxis to style individual axes)
+                      - ImPlotCol_XAxisGrid, ImPlotCol_Y1AxisGrid -> ImPlotCol_AxisGrid (push/pop this around SetupAxis to style individual axes)
+                      - SetNextPlotLimitsX/Y                      -> SetNextAxisLimits(ImAxis)
+                      - LinkNextPlotLimits                        -> SetNextAxisLinks(ImAxis)
+                      - FitNextPlotAxes                           -> SetNextAxisToFit(ImAxis)/SetNextAxesToFit
+                      - SetLegendLocation                         -> SetupLegend
+                      - ImPlotFlags_NoHighlight                   -> ImPlotLegendFlags_NoHighlight
+                      - ImPlotOrientation                         -> ImPlotLegendFlags_Horizontal
+                      - Annotate                                  -> Annotation
+                    - REMOVED:
+                      - GetPlotQuery, SetPlotQuery, IsPlotQueried -> use DragRect
+                      - SetNextPlotTicksX, SetNextPlotTicksY      -> use SetupAxisTicks
+                      - SetNextPlotFormatX, SetNextPlotFormatY    -> use SetupAxisFormat
+                      - AnnotateClamped                           -> use Annotation(bool clamp = true)
+                    - OBSOLETED:
+                      - BeginPlot (original signature)            -> use simplified signature + Setup API
+- 2021/07/30 (0.12) - The offset argument of `PlotXG` functions was been removed. Implement offsetting in your getter callback instead.
+- 2021/03/08 (0.9)  - SetColormap and PushColormap(ImVec4*) were removed. Use AddColormap for custom colormap support. LerpColormap was changed to SampleColormap.
+                      ShowColormapScale was changed to ColormapScale and requires additional arguments.
+- 2021/03/07 (0.9)  - The signature of ShowColormapScale was modified to accept a ImVec2 size.
+- 2021/02/28 (0.9)  - BeginLegendDragDropSource was changed to BeginDragDropSourceItem with a number of other drag and drop improvements.
+- 2021/01/18 (0.9)  - The default behavior for opening context menus was change from double right-click to single right-click. ImPlotInputMap and related functions were moved
+                      to implot_internal.h due to its immaturity.
+- 2020/10/16 (0.8)  - ImPlotStyleVar_InfoPadding was changed to ImPlotStyleVar_MousePosPadding
+- 2020/09/10 (0.8)  - The single array versions of PlotLine, PlotScatter, PlotStems, and PlotShaded were given additional arguments for x-scale and x0.
+- 2020/09/07 (0.8)  - Plotting functions which accept a custom getter function pointer have been post-fixed with a G (e.g. PlotLineG)
+- 2020/09/06 (0.7)  - Several flags under ImPlotFlags and ImPlotAxisFlags were inverted (e.g. ImPlotFlags_Legend -> ImPlotFlags_NoLegend) so that the default flagset
+                      is simply 0. This more closely matches ImGui's style and makes it easier to enable non-default but commonly used flags (e.g. ImPlotAxisFlags_Time).
+- 2020/08/28 (0.5)  - ImPlotMarker_ can no longer be combined with bitwise OR, |. This features caused unnecessary slow-down, and almost no one used it.
+- 2020/08/25 (0.5)  - ImPlotAxisFlags_Scientific was removed. Logarithmic axes automatically uses scientific notation.
+- 2020/08/17 (0.5)  - PlotText was changed so that text is centered horizontally and vertically about the desired point.
+- 2020/08/16 (0.5)  - An ImPlotContext must be explicitly created and destroyed now with `CreateContext` and `DestroyContext`. Previously, the context was statically initialized in this source file.
+- 2020/06/13 (0.4)  - The flags `ImPlotAxisFlag_Adaptive` and `ImPlotFlags_Cull` were removed. Both are now done internally by default.
+- 2020/06/03 (0.3)  - The signature and behavior of PlotPieChart was changed so that data with sum less than 1 can optionally be normalized. The label format can now be specified as well.
+- 2020/06/01 (0.3)  - SetPalette was changed to `SetColormap` for consistency with other plotting libraries. `RestorePalette` was removed. Use `SetColormap(ImPlotColormap_Default)`.
+- 2020/05/31 (0.3)  - Plot functions taking custom ImVec2* getters were removed. Use the ImPlotPoint* getter versions instead.
+- 2020/05/29 (0.3)  - The signature of ImPlotLimits::Contains was changed to take two doubles instead of ImVec2
+- 2020/05/16 (0.2)  - All plotting functions were reverted to being prefixed with "Plot" to maintain a consistent VerbNoun style. `Plot` was split into `PlotLine`
+                      and `PlotScatter` (however, `PlotLine` can still be used to plot scatter points as `Plot` did before.). `Bar` is not `PlotBars`, to indicate
+                      that multiple bars will be plotted.
+- 2020/05/13 (0.2)  - `ImMarker` was change to `ImPlotMarker` and `ImAxisFlags` was changed to `ImPlotAxisFlags`.
+- 2020/05/11 (0.2)  - `ImPlotFlags_Selection` was changed to `ImPlotFlags_BoxSelect`
+- 2020/05/11 (0.2)  - The namespace ImGui:: was replaced with ImPlot::. As a result, the following additional changes were made:
+                      - Functions that were prefixed or decorated with the word "Plot" have been truncated. E.g., `ImGui::PlotBars` is now just `ImPlot::Bar`.
+                        It should be fairly obvious what was what.
+                      - Some functions have been given names that would have otherwise collided with the ImGui namespace. This has been done to maintain a consistent
+                        style with ImGui. E.g., 'ImGui::PushPlotStyleVar` is now 'ImPlot::PushStyleVar'.
+- 2020/05/10 (0.2)  - The following function/struct names were changes:
+                     - ImPlotRange       -> ImPlotLimits
+                     - GetPlotRange()    -> GetPlotLimits()
+                     - SetNextPlotRange  -> SetNextPlotLimits
+                     - SetNextPlotRangeX -> SetNextPlotLimitsX
+                     - SetNextPlotRangeY -> SetNextPlotLimitsY
+- 2020/05/10 (0.2)  - Plot queries are pixel based by default. Query rects that maintain relative plot position have been removed. This was done to support multi-y-axis.
+
+*/
+
+#ifndef IMGUI_DEFINE_MATH_OPERATORS
+#define IMGUI_DEFINE_MATH_OPERATORS
+#endif
+#include "implot.h"
+#ifndef IMGUI_DISABLE
+#include "implot_internal.h"
+
+#include <stdlib.h>
+
+// Support for pre-1.82 versions. Users on 1.82+ can use 0 (default) flags to mean "all corners" but in order to support older versions we are more explicit.
+#if (IMGUI_VERSION_NUM < 18102) && !defined(ImDrawFlags_RoundCornersAll)
+#define ImDrawFlags_RoundCornersAll ImDrawCornerFlags_All
+#endif
+
+// Support for pre-1.89.7 versions.
+#if (IMGUI_VERSION_NUM < 18966)
+#define ImGuiButtonFlags_AllowOverlap ImGuiButtonFlags_AllowItemOverlap
+#endif
+
+// Visual Studio warnings
+#ifdef _MSC_VER
+#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
+#endif
+
+// Clang/GCC warnings with -Weverything
+#if defined(__clang__)
+#pragma clang diagnostic ignored "-Wformat-nonliteral"  // warning: format string is not a string literal
+#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
+#pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
+#elif defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"    // warning: format not a string literal, format string not checked
+#pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
+#endif
+
+// Global plot context
+#ifndef GImPlot
+ImPlotContext* GImPlot = nullptr;
+#endif
+
+//-----------------------------------------------------------------------------
+// Struct Implementations
+//-----------------------------------------------------------------------------
+
+ImPlotInputMap::ImPlotInputMap() {
+    ImPlot::MapInputDefault(this);
+}
+
+ImPlotStyle::ImPlotStyle() {
+    PlotDefaultSize    = ImVec2(400,300);
+    PlotMinSize        = ImVec2(200,150);
+    PlotBorderSize     = 1;
+    MinorAlpha         = 0.25f;
+    MajorTickLen       = ImVec2(10,10);
+    MinorTickLen       = ImVec2(5,5);
+    MajorTickSize      = ImVec2(1,1);
+    MinorTickSize      = ImVec2(1,1);
+    MajorGridSize      = ImVec2(1,1);
+    MinorGridSize      = ImVec2(1,1);
+    PlotPadding        = ImVec2(10,10);
+    LabelPadding       = ImVec2(5,5);
+    LegendPadding      = ImVec2(10,10);
+    LegendInnerPadding = ImVec2(5,5);
+    LegendSpacing      = ImVec2(5,0);
+    MousePosPadding    = ImVec2(10,10);
+    AnnotationPadding  = ImVec2(2,2);
+    FitPadding         = ImVec2(0,0);
+    DigitalPadding     = 20;
+    DigitalSpacing     = 4;
+    
+    ImPlot::StyleColorsAuto(this);
+
+    Colormap = ImPlotColormap_Deep;
+
+    UseLocalTime     = false;
+    Use24HourClock   = false;
+    UseISO8601       = false;
+}
+
+//-----------------------------------------------------------------------------
+// Style
+//-----------------------------------------------------------------------------
+
+namespace ImPlot {
+
+const char* GetStyleColorName(ImPlotCol col) {
+    static const char* col_names[ImPlotCol_COUNT] = {
+        "FrameBg",
+        "PlotBg",
+        "PlotBorder",
+        "LegendBg",
+        "LegendBorder",
+        "LegendText",
+        "TitleText",
+        "InlayText",
+        "AxisText",
+        "AxisGrid",
+        "AxisTick",
+        "AxisBg",
+        "AxisBgHovered",
+        "AxisBgActive",
+        "Selection",
+        "Crosshairs"
+    };
+    return col_names[col];
+}
+
+const char* GetMarkerName(ImPlotMarker marker) {
+    switch (marker) {
+        case ImPlotMarker_None:     return "None";
+        case ImPlotMarker_Auto:     return "Auto";
+        case ImPlotMarker_Circle:   return "Circle";
+        case ImPlotMarker_Square:   return "Square";
+        case ImPlotMarker_Diamond:  return "Diamond";
+        case ImPlotMarker_Up:       return "Up";
+        case ImPlotMarker_Down:     return "Down";
+        case ImPlotMarker_Left:     return "Left";
+        case ImPlotMarker_Right:    return "Right";
+        case ImPlotMarker_Cross:    return "Cross";
+        case ImPlotMarker_Plus:     return "Plus";
+        case ImPlotMarker_Asterisk: return "Asterisk";
+        case ImPlotMarker_Vertical: return "Vertical";
+        case ImPlotMarker_Horizontal: return "Horizontal";
+        default:                    return "";
+    }
+}
+
+ImVec4 GetAutoColor(ImPlotCol idx) {
+    ImVec4 col(0,0,0,1);
+    switch(idx) {
+        case ImPlotCol_FrameBg:       return ImGui::GetStyleColorVec4(ImGuiCol_FrameBg);
+        case ImPlotCol_PlotBg:        return ImGui::GetStyleColorVec4(ImGuiCol_WindowBg);
+        case ImPlotCol_PlotBorder:    return ImGui::GetStyleColorVec4(ImGuiCol_Border);
+        case ImPlotCol_LegendBg:      return ImGui::GetStyleColorVec4(ImGuiCol_PopupBg);
+        case ImPlotCol_LegendBorder:  return GetStyleColorVec4(ImPlotCol_PlotBorder);
+        case ImPlotCol_LegendText:    return GetStyleColorVec4(ImPlotCol_InlayText);
+        case ImPlotCol_TitleText:     return ImGui::GetStyleColorVec4(ImGuiCol_Text);
+        case ImPlotCol_InlayText:     return ImGui::GetStyleColorVec4(ImGuiCol_Text);
+        case ImPlotCol_AxisText:      return ImGui::GetStyleColorVec4(ImGuiCol_Text);
+        case ImPlotCol_AxisGrid:      return GetStyleColorVec4(ImPlotCol_AxisText) * ImVec4(1,1,1,0.25f);
+        case ImPlotCol_AxisTick:      return GetStyleColorVec4(ImPlotCol_AxisGrid);
+        case ImPlotCol_AxisBg:        return ImVec4(0,0,0,0);
+        case ImPlotCol_AxisBgHovered: return ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
+        case ImPlotCol_AxisBgActive:  return ImGui::GetStyleColorVec4(ImGuiCol_ButtonActive);
+        case ImPlotCol_Selection:     return ImVec4(1,1,0,1);
+        case ImPlotCol_Crosshairs:    return GetStyleColorVec4(ImPlotCol_PlotBorder);
+        default: return col;
+    }
+}
+
+struct ImPlotStyleVarInfo {
+    ImGuiDataType   Type;
+    ImU32           Count;
+    ImU32           Offset;
+    void*           GetVarPtr(ImPlotStyle* style) const { return (void*)((unsigned char*)style + Offset); }
+};
+
+static const ImPlotStyleVarInfo GPlotStyleVarInfo[] =
+{
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, PlotDefaultSize)    }, // ImPlotStyleVar_PlotDefaultSize
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, PlotMinSize)        }, // ImPlotStyleVar_PlotMinSize
+    { ImGuiDataType_Float, 1, (ImU32)offsetof(ImPlotStyle, PlotBorderSize)     }, // ImPlotStyleVar_PlotBorderSize
+    { ImGuiDataType_Float, 1, (ImU32)offsetof(ImPlotStyle, MinorAlpha)         }, // ImPlotStyleVar_MinorAlpha
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, MajorTickLen)       }, // ImPlotStyleVar_MajorTickLen
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, MinorTickLen)       }, // ImPlotStyleVar_MinorTickLen
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, MajorTickSize)      }, // ImPlotStyleVar_MajorTickSize
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, MinorTickSize)      }, // ImPlotStyleVar_MinorTickSize
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, MajorGridSize)      }, // ImPlotStyleVar_MajorGridSize
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, MinorGridSize)      }, // ImPlotStyleVar_MinorGridSize
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, PlotPadding)        }, // ImPlotStyleVar_PlotPadding
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, LabelPadding)       }, // ImPlotStyleVar_LabelPadding
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, LegendPadding)      }, // ImPlotStyleVar_LegendPadding
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, LegendInnerPadding) }, // ImPlotStyleVar_LegendInnerPadding
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, LegendSpacing)      }, // ImPlotStyleVar_LegendSpacing
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, MousePosPadding)    }, // ImPlotStyleVar_MousePosPadding
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, AnnotationPadding)  }, // ImPlotStyleVar_AnnotationPadding
+    { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, FitPadding)         }, // ImPlotStyleVar_FitPadding
+    { ImGuiDataType_Float, 1, (ImU32)offsetof(ImPlotStyle, DigitalPadding)     }, // ImPlotStyleVar_DigitalPadding
+    { ImGuiDataType_Float, 1, (ImU32)offsetof(ImPlotStyle, DigitalSpacing)     }, // ImPlotStyleVar_DigitalSpacing
+};
+
+static const ImPlotStyleVarInfo* GetPlotStyleVarInfo(ImPlotStyleVar idx) {
+    IM_ASSERT(idx >= 0 && idx < ImPlotStyleVar_COUNT);
+    IM_ASSERT(IM_ARRAYSIZE(GPlotStyleVarInfo) == ImPlotStyleVar_COUNT);
+    return &GPlotStyleVarInfo[idx];
+}
+
+//-----------------------------------------------------------------------------
+// Generic Helpers
+//-----------------------------------------------------------------------------
+
+void AddTextVertical(ImDrawList *DrawList, ImVec2 pos, ImU32 col, const char *text_begin, const char* text_end) {
+    // the code below is based loosely on ImFont::RenderText
+    if (!text_end)
+        text_end = text_begin + strlen(text_begin);
+    ImGuiContext& g = *GImGui;
+#ifdef IMGUI_HAS_TEXTURES
+    ImFontBaked* font = g.Font->GetFontBaked(g.FontSize);
+    const float scale = g.FontSize / font->Size;
+#else
+    ImFont* font = g.Font;
+    const float scale = g.FontSize / font->FontSize;
+#endif
+    // Align to be pixel perfect
+    pos.x = ImFloor(pos.x);
+    pos.y = ImFloor(pos.y);
+    const char* s = text_begin;
+    int chars_exp = (int)(text_end - s);
+    int chars_rnd = 0;
+    const int vtx_count_max = chars_exp * 4;
+    const int idx_count_max = chars_exp * 6;
+    DrawList->PrimReserve(idx_count_max, vtx_count_max);
+    while (s < text_end) {
+        unsigned int c = (unsigned int)*s;
+        if (c < 0x80) {
+            s += 1;
+        }
+        else {
+            s += ImTextCharFromUtf8(&c, s, text_end);
+            if (c == 0) // Malformed UTF-8?
+                break;
+        }
+        const ImFontGlyph * glyph = font->FindGlyph((ImWchar)c);
+        if (glyph == nullptr) {
+            continue;
+        }
+        DrawList->PrimQuadUV(pos + ImVec2(glyph->Y0, -glyph->X0) * scale, pos + ImVec2(glyph->Y0, -glyph->X1) * scale,
+                             pos + ImVec2(glyph->Y1, -glyph->X1) * scale, pos + ImVec2(glyph->Y1, -glyph->X0) * scale,
+                             ImVec2(glyph->U0, glyph->V0), ImVec2(glyph->U1, glyph->V0),
+                             ImVec2(glyph->U1, glyph->V1), ImVec2(glyph->U0, glyph->V1),
+                             col);
+        pos.y -= glyph->AdvanceX * scale;
+        chars_rnd++;
+    }
+    // Give back unused vertices
+    int chars_skp = chars_exp-chars_rnd;
+    DrawList->PrimUnreserve(chars_skp*6, chars_skp*4);
+}
+
+void AddTextCentered(ImDrawList* DrawList, ImVec2 top_center, ImU32 col, const char* text_begin, const char* text_end) {
+    float txt_ht = ImGui::GetTextLineHeight();
+    const char* title_end = ImGui::FindRenderedTextEnd(text_begin, text_end);
+    ImVec2 text_size;
+    float  y = 0;
+    while (const char* tmp = (const char*)memchr(text_begin, '\n', title_end-text_begin)) {
+        text_size = ImGui::CalcTextSize(text_begin,tmp,true);
+        DrawList->AddText(ImVec2(top_center.x - text_size.x * 0.5f, top_center.y+y),col,text_begin,tmp);
+        text_begin = tmp + 1;
+        y += txt_ht;
+    }
+    text_size = ImGui::CalcTextSize(text_begin,title_end,true);
+    DrawList->AddText(ImVec2(top_center.x - text_size.x * 0.5f, top_center.y+y),col,text_begin,title_end);
+}
+
+double NiceNum(double x, bool round) {
+    double f;
+    double nf;
+    int expv = (int)floor(ImLog10(x));
+    f = x / ImPow(10.0, (double)expv);
+    if (round)
+        if (f < 1.5)
+            nf = 1;
+        else if (f < 3)
+            nf = 2;
+        else if (f < 7)
+            nf = 5;
+        else
+            nf = 10;
+    else if (f <= 1)
+        nf = 1;
+    else if (f <= 2)
+        nf = 2;
+    else if (f <= 5)
+        nf = 5;
+    else
+        nf = 10;
+    return nf * ImPow(10.0, expv);
+}
+
+//-----------------------------------------------------------------------------
+// Context Utils
+//-----------------------------------------------------------------------------
+
+void SetImGuiContext(ImGuiContext* ctx) {
+    ImGui::SetCurrentContext(ctx);
+}
+
+ImPlotContext* CreateContext() {
+    ImPlotContext* ctx = IM_NEW(ImPlotContext)();
+    Initialize(ctx);
+    if (GImPlot == nullptr)
+        SetCurrentContext(ctx);
+    return ctx;
+}
+
+void DestroyContext(ImPlotContext* ctx) {
+    if (ctx == nullptr)
+        ctx = GImPlot;
+    if (GImPlot == ctx)
+        SetCurrentContext(nullptr);
+    IM_DELETE(ctx);
+}
+
+ImPlotContext* GetCurrentContext() {
+    return GImPlot;
+}
+
+void SetCurrentContext(ImPlotContext* ctx) {
+    GImPlot = ctx;
+}
+
+#define IMPLOT_APPEND_CMAP(name, qual) ctx->ColormapData.Append(#name, name, sizeof(name)/sizeof(ImU32), qual)
+#define IM_RGB(r,g,b) IM_COL32(r,g,b,255)
+
+void Initialize(ImPlotContext* ctx) {
+    ResetCtxForNextPlot(ctx);
+    ResetCtxForNextAlignedPlots(ctx);
+    ResetCtxForNextSubplot(ctx);
+
+    const ImU32 Deep[]     = {IM_RGB(76,114,176),IM_RGB(221,132,82),IM_RGB(85,168,104),IM_RGB(196,78,82),IM_RGB(129,114,179),IM_RGB(147,120,96),IM_RGB(218,139,195),IM_RGB(140,140,140),IM_RGB(204,185,116),IM_RGB(100,181,205)};
+    const ImU32 Dark[]     = {IM_RGB(228,26,28),IM_RGB(55,126,184),IM_RGB(77,175,74),IM_RGB(152,78,163),IM_RGB(255,127,0),IM_RGB(255,255,51),IM_RGB(166,86,40),IM_RGB(247,129,191),IM_RGB(153,153,153)};
+    const ImU32 Pastel[]   = {IM_RGB(251,180,174),IM_RGB(179,205,227),IM_RGB(204,235,197),IM_RGB(222,203,228),IM_RGB(254,217,166),IM_RGB(255,255,204),IM_RGB(229,216,189),IM_RGB(253,218,236),IM_RGB(242,242,242)};
+    const ImU32 Paired[]   = {IM_RGB(66,206,227),IM_RGB(31,120,180),IM_RGB(178,223,138),IM_RGB(51,160,44),IM_RGB(251,154,153),IM_RGB(227,26,28),IM_RGB(253,191,111),IM_RGB(255,127,0),IM_RGB(202,178,214),IM_RGB(106,61,154),IM_RGB(255,255,153),IM_RGB(177,89,40)};
+    const ImU32 Viridis[]  = {IM_RGB(68,1,84),IM_RGB(72,36,117),IM_RGB(65,68,135),IM_RGB(53,95,141),IM_RGB(42,120,142),IM_RGB(33,145,140),IM_RGB(34,168,132),IM_RGB(68,191,112),IM_RGB(122,209,81),IM_RGB(189,223,38),IM_RGB(253,231,37)};
+    const ImU32 Plasma[]   = {IM_RGB(13,8,135),IM_RGB(65,4,157),IM_RGB(106,0,168),IM_RGB(143,13,164),IM_RGB(177,42,144),IM_RGB(204,71,120),IM_RGB(225,100,98),IM_RGB(242,132,75),IM_RGB(252,166,54),IM_RGB(252,206,37),IM_RGB(240,249,33)};
+    const ImU32 Hot[]      = {IM_RGB(64,0,0),IM_RGB(128,0,0),IM_RGB(191,0,0),IM_RGB(255,0,0),IM_RGB(255,64,0),IM_RGB(255,128,0),IM_RGB(255,191,0),IM_RGB(255,255,0),IM_RGB(255,255,85),IM_RGB(255,255,170),IM_RGB(255,255,255)};
+    const ImU32 Cool[]     = {IM_RGB(0,255,255),IM_RGB(26,230,255),IM_RGB(51,204,255),IM_RGB(77,179,255),IM_RGB(102,153,255),IM_RGB(128,128,255),IM_RGB(153,102,255),IM_RGB(179,77,255),IM_RGB(204,51,255),IM_RGB(230,26,255),IM_RGB(255,0,255)};
+    const ImU32 Pink[]     = {IM_RGB(74,0,0),IM_RGB(123,66,66),IM_RGB(158,93,93),IM_RGB(186,114,114),IM_RGB(198,151,132),IM_RGB(208,180,147),IM_RGB(218,206,161),IM_RGB(228,228,174),IM_RGB(237,237,205),IM_RGB(246,246,231),IM_RGB(255,255,255)};
+    const ImU32 Jet[]      = {IM_RGB(0,0,170),IM_RGB(0,0,255),IM_RGB(0,85,255),IM_RGB(0,170,255),IM_RGB(0,255,255),IM_RGB(85,255,170),IM_RGB(170,255,85),IM_RGB(255,255,0),IM_RGB(255,170,0),IM_RGB(255,85,0),IM_RGB(255,0,0)};
+    const ImU32 Twilight[] = {IM_RGB(226,217,226),IM_RGB(166,191,202),IM_RGB(109,144,192),IM_RGB(95,88,176),IM_RGB(83,30,124),IM_RGB(47,20,54),IM_RGB(100,25,75),IM_RGB(159,60,80),IM_RGB(192,117,94),IM_RGB(208,179,158),IM_RGB(226,217,226)};
+    const ImU32 RdBu[]     = {IM_RGB(103,0,31),IM_RGB(178,24,43),IM_RGB(214,96,77),IM_RGB(244,165,130),IM_RGB(253,219,199),IM_RGB(247,247,247),IM_RGB(209,229,240),IM_RGB(146,197,222),IM_RGB(67,147,195),IM_RGB(33,102,172),IM_RGB(5,48,97)};
+    const ImU32 BrBG[]     = {IM_RGB(84,48,5),IM_RGB(140,81,10),IM_RGB(191,129,45),IM_RGB(223,194,125),IM_RGB(246,232,195),IM_RGB(245,245,245),IM_RGB(199,234,229),IM_RGB(128,205,193),IM_RGB(53,151,143),IM_RGB(1,102,94),IM_RGB(0,60,48)};
+    const ImU32 PiYG[]     = {IM_RGB(142,1,82),IM_RGB(197,27,125),IM_RGB(222,119,174),IM_RGB(241,182,218),IM_RGB(253,224,239),IM_RGB(247,247,247),IM_RGB(230,245,208),IM_RGB(184,225,134),IM_RGB(127,188,65),IM_RGB(77,146,33),IM_RGB(39,100,25)};
+    const ImU32 Spectral[] = {IM_RGB(158,1,66),IM_RGB(213,62,79),IM_RGB(244,109,67),IM_RGB(253,174,97),IM_RGB(254,224,139),IM_RGB(255,255,191),IM_RGB(230,245,152),IM_RGB(171,221,164),IM_RGB(102,194,165),IM_RGB(50,136,189),IM_RGB(94,79,162)};
+    const ImU32 Greys[]    = {IM_COL32_WHITE, IM_COL32_BLACK};
+
+    IMPLOT_APPEND_CMAP(Deep, true);
+    IMPLOT_APPEND_CMAP(Dark, true);
+    IMPLOT_APPEND_CMAP(Pastel, true);
+    IMPLOT_APPEND_CMAP(Paired, true);
+    IMPLOT_APPEND_CMAP(Viridis, false);
+    IMPLOT_APPEND_CMAP(Plasma, false);
+    IMPLOT_APPEND_CMAP(Hot, false);
+    IMPLOT_APPEND_CMAP(Cool, false);
+    IMPLOT_APPEND_CMAP(Pink, false);
+    IMPLOT_APPEND_CMAP(Jet, false);
+    IMPLOT_APPEND_CMAP(Twilight, false);
+    IMPLOT_APPEND_CMAP(RdBu, false);
+    IMPLOT_APPEND_CMAP(BrBG, false);
+    IMPLOT_APPEND_CMAP(PiYG, false);
+    IMPLOT_APPEND_CMAP(Spectral, false);
+    IMPLOT_APPEND_CMAP(Greys, false);
+}
+
+void ResetCtxForNextPlot(ImPlotContext* ctx) {
+    // reset the next plot/item data
+    ctx->NextPlotData.Reset();
+    ctx->NextItemData.Reset();
+    // reset labels
+    ctx->Annotations.Reset();
+    ctx->Tags.Reset();
+    // reset extents/fit
+    ctx->OpenContextThisFrame = false;
+    // reset digital plot items count
+    ctx->DigitalPlotItemCnt = 0;
+    ctx->DigitalPlotOffset = 0;
+    // nullify plot
+    ctx->CurrentPlot  = nullptr;
+    ctx->CurrentItem  = nullptr;
+    ctx->PreviousItem = nullptr;
+}
+
+void ResetCtxForNextAlignedPlots(ImPlotContext* ctx) {
+    ctx->CurrentAlignmentH = nullptr;
+    ctx->CurrentAlignmentV = nullptr;
+}
+
+void ResetCtxForNextSubplot(ImPlotContext* ctx) {
+    ctx->CurrentSubplot      = nullptr;
+    ctx->CurrentAlignmentH   = nullptr;
+    ctx->CurrentAlignmentV   = nullptr;
+}
+
+//-----------------------------------------------------------------------------
+// Plot Utils
+//-----------------------------------------------------------------------------
+
+ImPlotPlot* GetPlot(const char* title) {
+    ImGuiWindow*   Window = GImGui->CurrentWindow;
+    const ImGuiID  ID     = Window->GetID(title);
+    return GImPlot->Plots.GetByKey(ID);
+}
+
+ImPlotPlot* GetCurrentPlot() {
+    return GImPlot->CurrentPlot;
+}
+
+void BustPlotCache() {
+    ImPlotContext& gp = *GImPlot;
+    gp.Plots.Clear();
+    gp.Subplots.Clear();
+}
+
+//-----------------------------------------------------------------------------
+// Legend Utils
+//-----------------------------------------------------------------------------
+
+ImVec2 GetLocationPos(const ImRect& outer_rect, const ImVec2& inner_size, ImPlotLocation loc, const ImVec2& pad) {
+    ImVec2 pos;
+    if (ImHasFlag(loc, ImPlotLocation_West) && !ImHasFlag(loc, ImPlotLocation_East))
+        pos.x = outer_rect.Min.x + pad.x;
+    else if (!ImHasFlag(loc, ImPlotLocation_West) && ImHasFlag(loc, ImPlotLocation_East))
+        pos.x = outer_rect.Max.x - pad.x - inner_size.x;
+    else
+        pos.x = outer_rect.GetCenter().x - inner_size.x * 0.5f;
+    // legend reference point y
+    if (ImHasFlag(loc, ImPlotLocation_North) && !ImHasFlag(loc, ImPlotLocation_South))
+        pos.y = outer_rect.Min.y + pad.y;
+    else if (!ImHasFlag(loc, ImPlotLocation_North) && ImHasFlag(loc, ImPlotLocation_South))
+        pos.y = outer_rect.Max.y - pad.y - inner_size.y;
+    else
+        pos.y = outer_rect.GetCenter().y - inner_size.y * 0.5f;
+    pos.x = IM_ROUND(pos.x);
+    pos.y = IM_ROUND(pos.y);
+    return pos;
+}
+
+ImVec2 CalcLegendSize(ImPlotItemGroup& items, const ImVec2& pad, const ImVec2& spacing, bool vertical) {
+    // vars
+    const int   nItems      = items.GetLegendCount();
+    const float txt_ht      = ImGui::GetTextLineHeight();
+    const float icon_size   = txt_ht;
+    // get label max width
+    float max_label_width = 0;
+    float sum_label_width = 0;
+    for (int i = 0; i < nItems; ++i) {
+        const char* label       = items.GetLegendLabel(i);
+        const float label_width = ImGui::CalcTextSize(label, nullptr, true).x;
+        max_label_width         = label_width > max_label_width ? label_width : max_label_width;
+        sum_label_width        += label_width;
+    }
+    // calc legend size
+    const ImVec2 legend_size = vertical ?
+                               ImVec2(pad.x * 2 + icon_size + max_label_width, pad.y * 2 + nItems * txt_ht + (nItems - 1) * spacing.y) :
+                               ImVec2(pad.x * 2 + icon_size * nItems + sum_label_width + (nItems - 1) * spacing.x, pad.y * 2 + txt_ht);
+    return legend_size;
+}
+
+bool ClampLegendRect(ImRect& legend_rect, const ImRect& outer_rect, const ImVec2& pad) {
+    bool clamped = false;
+    ImRect outer_rect_pad(outer_rect.Min + pad, outer_rect.Max - pad);
+    if (legend_rect.Min.x < outer_rect_pad.Min.x) {
+        legend_rect.Min.x = outer_rect_pad.Min.x;
+        clamped = true;
+    }
+    if (legend_rect.Min.y < outer_rect_pad.Min.y) {
+        legend_rect.Min.y = outer_rect_pad.Min.y;
+        clamped = true;
+    }
+    if (legend_rect.Max.x > outer_rect_pad.Max.x) {
+        legend_rect.Max.x = outer_rect_pad.Max.x;
+        clamped = true;
+    }
+    if (legend_rect.Max.y > outer_rect_pad.Max.y) {
+        legend_rect.Max.y = outer_rect_pad.Max.y;
+        clamped = true;
+    }
+    return clamped;
+}
+
+int LegendSortingComp(const void* _a, const void* _b) {
+    ImPlotItemGroup* items = GImPlot->SortItems;
+    const int a = *(const int*)_a;
+    const int b = *(const int*)_b;
+    const char* label_a = items->GetLegendLabel(a);
+    const char* label_b = items->GetLegendLabel(b);
+    return strcmp(label_a,label_b);
+}
+
+bool ShowLegendEntries(ImPlotItemGroup& items, const ImRect& legend_bb, bool hovered, const ImVec2& pad, const ImVec2& spacing, bool vertical, ImDrawList& DrawList) {
+    // vars
+    const float txt_ht      = ImGui::GetTextLineHeight();
+    const float icon_size   = txt_ht;
+    const float icon_shrink = 2;
+    ImU32 col_txt           = GetStyleColorU32(ImPlotCol_LegendText);
+    ImU32 col_txt_dis       = ImAlphaU32(col_txt, 0.25f);
+    // render each legend item
+    float sum_label_width = 0;
+    bool any_item_hovered = false;
+
+    const int num_items = items.GetLegendCount();
+    if (num_items < 1)
+        return hovered;
+    // build render order
+    ImPlotContext& gp = *GImPlot;
+    ImVector<int>& indices = gp.TempInt1;
+    indices.resize(num_items);
+    for (int i = 0; i < num_items; ++i)
+        indices[i] = i;
+    if (ImHasFlag(items.Legend.Flags, ImPlotLegendFlags_Sort) && num_items > 1) {
+        gp.SortItems = &items;
+        qsort(indices.Data, num_items, sizeof(int), LegendSortingComp);
+    }
+    // render
+    for (int i = 0; i < num_items; ++i) {
+        const int idx           = ImHasFlag(items.Legend.Flags, ImPlotLegendFlags_Reverse) ? indices[num_items - 1 - i] : indices[i];
+        ImPlotItem* item        = items.GetLegendItem(idx);
+        const char* label       = items.GetLegendLabel(idx);
+        const float label_width = ImGui::CalcTextSize(label, nullptr, true).x;
+        const ImVec2 top_left   = vertical ?
+                                  legend_bb.Min + pad + ImVec2(0, i * (txt_ht + spacing.y)) :
+                                  legend_bb.Min + pad + ImVec2(i * (icon_size + spacing.x) + sum_label_width, 0);
+        sum_label_width        += label_width;
+        ImRect icon_bb;
+        icon_bb.Min = top_left + ImVec2(icon_shrink,icon_shrink);
+        icon_bb.Max = top_left + ImVec2(icon_size - icon_shrink, icon_size - icon_shrink);
+        ImRect label_bb;
+        label_bb.Min = top_left;
+        label_bb.Max = top_left + ImVec2(label_width + icon_size, icon_size);
+        ImU32 col_txt_hl;
+        ImU32 col_item = ImAlphaU32(item->Color,1);
+
+        ImRect button_bb(icon_bb.Min, label_bb.Max);
+
+        ImGui::KeepAliveID(item->ID);
+
+        bool item_hov = false;
+        bool item_hld = false;
+        bool item_clk = ImHasFlag(items.Legend.Flags, ImPlotLegendFlags_NoButtons)
+                      ? false
+                      : ImGui::ButtonBehavior(button_bb, item->ID, &item_hov, &item_hld);
+
+        if (item_clk)
+            item->Show = !item->Show;
+
+
+        const bool can_hover = (item_hov)
+                             && (!ImHasFlag(items.Legend.Flags, ImPlotLegendFlags_NoHighlightItem)
+                             || !ImHasFlag(items.Legend.Flags, ImPlotLegendFlags_NoHighlightAxis));
+
+        if (can_hover) {
+            item->LegendHoverRect.Min = icon_bb.Min;
+            item->LegendHoverRect.Max = label_bb.Max;
+            item->LegendHovered = true;
+            col_txt_hl = ImMixU32(col_txt, col_item, 64);
+            any_item_hovered = true;
+        }
+        else {
+            col_txt_hl = ImGui::GetColorU32(col_txt);
+        }
+        ImU32 col_icon;
+        if (item_hld)
+            col_icon = item->Show ? ImAlphaU32(col_item,0.5f) : ImGui::GetColorU32(ImGuiCol_TextDisabled, 0.5f);
+        else if (item_hov)
+            col_icon = item->Show ? ImAlphaU32(col_item,0.75f) : ImGui::GetColorU32(ImGuiCol_TextDisabled, 0.75f);
+        else
+            col_icon = item->Show ? col_item : col_txt_dis;
+
+        DrawList.AddRectFilled(icon_bb.Min, icon_bb.Max, col_icon);
+        const char* text_display_end = ImGui::FindRenderedTextEnd(label, nullptr);
+        if (label != text_display_end)
+            DrawList.AddText(top_left + ImVec2(icon_size, 0), item->Show ? col_txt_hl  : col_txt_dis, label, text_display_end);
+    }
+    return hovered && !any_item_hovered;
+}
+
+//-----------------------------------------------------------------------------
+// Locators
+//-----------------------------------------------------------------------------
+
+constexpr float TICK_FILL_X = 0.8f;
+constexpr float TICK_FILL_Y = 1.0f;
+
+void Locator_Default(ImPlotTicker& ticker, const ImPlotRange& range, float pixels, bool vertical, ImPlotFormatter formatter, void* formatter_data) {
+    if (range.Min == range.Max)
+        return;
+    const int nMinor        = 10;
+    const int nMajor        = ImMax(2, (int)IM_ROUND(pixels / (vertical ? 300.0f : 400.0f)));
+    const double nice_range = NiceNum(range.Size() * 0.99, false);
+    const double interval   = NiceNum(nice_range / (nMajor - 1), true);
+    const double graphmin   = floor(range.Min / interval) * interval;
+    const double graphmax   = ceil(range.Max / interval) * interval;
+    bool first_major_set    = false;
+    int  first_major_idx    = 0;
+    const int idx0 = ticker.TickCount(); // ticker may have user custom ticks
+    ImVec2 total_size(0,0);
+    for (double major = graphmin; major < graphmax + 0.5 * interval; major += interval) {
+        // is this zero? combat zero formatting issues
+        if (major-interval < 0 && major+interval > 0)
+            major = 0;
+        if (range.Contains(major)) {
+            if (!first_major_set) {
+                first_major_idx = ticker.TickCount();
+                first_major_set = true;
+            }
+            total_size += ticker.AddTick(major, true, 0, true, formatter, formatter_data).LabelSize;
+        }
+        for (int i = 1; i < nMinor; ++i) {
+            double minor = major + i * interval / nMinor;
+            if (range.Contains(minor)) {
+                total_size += ticker.AddTick(minor, false, 0, true, formatter, formatter_data).LabelSize;
+            }
+        }
+    }
+    // prune if necessary
+    if ((!vertical && total_size.x > pixels*TICK_FILL_X) || (vertical && total_size.y > pixels*TICK_FILL_Y)) {
+        for (int i = first_major_idx-1; i >= idx0; i -= 2)
+            ticker.Ticks[i].ShowLabel = false;
+        for (int i = first_major_idx+1; i < ticker.TickCount(); i += 2)
+            ticker.Ticks[i].ShowLabel = false;
+    }
+}
+
+bool CalcLogarithmicExponents(const ImPlotRange& range, float pix, bool vertical, int& exp_min, int& exp_max, int& exp_step) {
+    if (range.Min * range.Max > 0) {
+        const int nMajor = vertical ? ImMax(2, (int)IM_ROUND(pix * 0.02f)) : ImMax(2, (int)IM_ROUND(pix * 0.01f)); // TODO: magic numbers
+        double log_min = ImLog10(ImAbs(range.Min));
+        double log_max = ImLog10(ImAbs(range.Max));
+        double log_a = ImMin(log_min,log_max);
+        double log_b = ImMax(log_min,log_max);
+        exp_step  = ImMax(1,(int)(log_b - log_a) / nMajor);
+        exp_min   = (int)log_a;
+        exp_max   = (int)log_b;
+        if (exp_step != 1) {
+            while(exp_step % 3 != 0)       exp_step++; // make step size multiple of three
+            while(exp_min % exp_step != 0) exp_min--;  // decrease exp_min until exp_min + N * exp_step will be 0
+        }
+        return true;
+    }
+    return false;
+}
+
+void AddTicksLogarithmic(const ImPlotRange& range, int exp_min, int exp_max, int exp_step, ImPlotTicker& ticker, ImPlotFormatter formatter, void* data) {
+    const double sign = ImSign(range.Max);
+    for (int e = exp_min - exp_step; e < (exp_max + exp_step); e += exp_step) {
+        double major1 = sign*ImPow(10, (double)(e));
+        double major2 = sign*ImPow(10, (double)(e + 1));
+        double interval = (major2 - major1) / 9;
+        if (major1 >= (range.Min - DBL_EPSILON) && major1 <= (range.Max + DBL_EPSILON))
+            ticker.AddTick(major1, true, 0, true, formatter, data);
+        for (int j = 0; j < exp_step; ++j) {
+            major1 = sign*ImPow(10, (double)(e+j));
+            major2 = sign*ImPow(10, (double)(e+j+1));
+            interval = (major2 - major1) / 9;
+            for (int i = 1; i < (9 + (int)(j < (exp_step - 1))); ++i) {
+                double minor = major1 + i * interval;
+                if (minor >= (range.Min - DBL_EPSILON) && minor <= (range.Max + DBL_EPSILON))
+                    ticker.AddTick(minor, false, 0, false, formatter, data);
+            }
+        }
+    }
+}
+
+void Locator_Log10(ImPlotTicker& ticker, const ImPlotRange& range, float pixels, bool vertical, ImPlotFormatter formatter, void* formatter_data) {
+    int exp_min, exp_max, exp_step;
+    if (CalcLogarithmicExponents(range, pixels, vertical, exp_min, exp_max, exp_step))
+        AddTicksLogarithmic(range, exp_min, exp_max, exp_step, ticker, formatter, formatter_data);
+}
+
+float CalcSymLogPixel(double plt, const ImPlotRange& range, float pixels) {
+    double scaleToPixels = pixels / range.Size();
+    double scaleMin      = TransformForward_SymLog(range.Min,nullptr);
+    double scaleMax      = TransformForward_SymLog(range.Max,nullptr);
+    double s             = TransformForward_SymLog(plt, nullptr);
+    double t             = (s - scaleMin) / (scaleMax - scaleMin);
+    plt                  = range.Min + range.Size() * t;
+
+    return (float)(0 + scaleToPixels * (plt - range.Min));
+}
+
+void Locator_SymLog(ImPlotTicker& ticker, const ImPlotRange& range, float pixels, bool vertical, ImPlotFormatter formatter, void* formatter_data) {
+    if (range.Min >= -1 && range.Max <= 1) {
+        Locator_Default(ticker, range, pixels, vertical, formatter, formatter_data);
+    }
+    else if (range.Min * range.Max < 0) { // cross zero
+        const float pix_min = 0;
+        const float pix_max = pixels;
+        const float pix_p1  = CalcSymLogPixel(1, range, pixels);
+        const float pix_n1  = CalcSymLogPixel(-1, range, pixels);
+        int exp_min_p, exp_max_p, exp_step_p;
+        int exp_min_n, exp_max_n, exp_step_n;
+        CalcLogarithmicExponents(ImPlotRange(1,range.Max), ImAbs(pix_max-pix_p1),vertical,exp_min_p,exp_max_p,exp_step_p);
+        CalcLogarithmicExponents(ImPlotRange(range.Min,-1),ImAbs(pix_n1-pix_min),vertical,exp_min_n,exp_max_n,exp_step_n);
+        int exp_step = ImMax(exp_step_n, exp_step_p);
+        ticker.AddTick(0,true,0,true,formatter,formatter_data);
+        AddTicksLogarithmic(ImPlotRange(1,range.Max), exp_min_p,exp_max_p,exp_step,ticker,formatter,formatter_data);
+        AddTicksLogarithmic(ImPlotRange(range.Min,-1),exp_min_n,exp_max_n,exp_step,ticker,formatter,formatter_data);
+    }
+    else {
+        Locator_Log10(ticker, range, pixels, vertical, formatter, formatter_data);
+    }
+}
+
+void AddTicksCustom(const double* values, const char* const labels[], int n, ImPlotTicker& ticker, ImPlotFormatter formatter, void* data) {
+    for (int i = 0; i < n; ++i) {
+        if (labels != nullptr)
+            ticker.AddTick(values[i], false, 0, true, labels[i]);
+        else
+            ticker.AddTick(values[i], false, 0, true, formatter, data);
+    }
+}
+
+//-----------------------------------------------------------------------------
+// Time Ticks and Utils
+//-----------------------------------------------------------------------------
+
+// this may not be thread safe?
+constexpr double TimeUnitSpans[ImPlotTimeUnit_COUNT] = {
+    0.000001,
+    0.001,
+    1,
+    60,
+    3600,
+    86400,
+    2629800,
+    31557600
+};
+
+inline ImPlotTimeUnit GetUnitForRange(double range) {
+    constexpr double cutoffs[ImPlotTimeUnit_COUNT] = {0.001, 1, 60, 3600, 86400, 2629800, 31557600, IMPLOT_MAX_TIME};
+    for (int i = 0; i < ImPlotTimeUnit_COUNT; ++i) {
+        if (range <= cutoffs[i])
+            return (ImPlotTimeUnit)i;
+    }
+    return ImPlotTimeUnit_Yr;
+}
+
+inline int LowerBoundStep(int max_divs, const int* divs, const int* step, int size) {
+    if (max_divs < divs[0])
+        return 0;
+    for (int i = 1; i < size; ++i) {
+        if (max_divs < divs[i])
+            return step[i-1];
+    }
+    return step[size-1];
+}
+
+inline int GetTimeStep(int max_divs, ImPlotTimeUnit unit) {
+    if (unit == ImPlotTimeUnit_Ms || unit == ImPlotTimeUnit_Us) {
+        constexpr int step[] = {500,250,200,100,50,25,20,10,5,2,1};
+        constexpr int divs[] = {2,4,5,10,20,40,50,100,200,500,1000};
+        return LowerBoundStep(max_divs, divs, step, 11);
+    }
+    if (unit == ImPlotTimeUnit_S || unit == ImPlotTimeUnit_Min) {
+        constexpr int step[] = {30,15,10,5,1};
+        constexpr int divs[] = {2,4,6,12,60};
+        return LowerBoundStep(max_divs, divs, step, 5);
+    }
+    else if (unit == ImPlotTimeUnit_Hr) {
+        constexpr int step[] = {12,6,3,2,1};
+        constexpr int divs[] = {2,4,8,12,24};
+        return LowerBoundStep(max_divs, divs, step, 5);
+    }
+    else if (unit == ImPlotTimeUnit_Day) {
+        constexpr int step[] = {14,7,2,1};
+        constexpr int divs[] = {2,4,14,28};
+        return LowerBoundStep(max_divs, divs, step, 4);
+    }
+    else if (unit == ImPlotTimeUnit_Mo) {
+        constexpr int step[] = {6,3,2,1};
+        constexpr int divs[] = {2,4,6,12};
+        return LowerBoundStep(max_divs, divs, step, 4);
+    }
+    return 0;
+}
+
+ImPlotTime MkGmtTime(struct tm *ptm) {
+    ImPlotTime t;
+#ifdef _WIN32
+    t.S = _mkgmtime(ptm);
+#else
+    t.S = timegm(ptm);
+#endif
+    if (t.S < 0)
+        t.S = 0;
+    return t;
+}
+
+tm* GetGmtTime(const ImPlotTime& t, tm* ptm)
+{
+#ifdef _WIN32
+  if (gmtime_s(ptm, &t.S) == 0)
+    return ptm;
+  else
+    return nullptr;
+#else
+  return gmtime_r(&t.S, ptm);
+#endif
+}
+
+ImPlotTime MkLocTime(struct tm *ptm) {
+    ImPlotTime t;
+    t.S = mktime(ptm);
+    if (t.S < 0)
+        t.S = 0;
+    return t;
+}
+
+tm* GetLocTime(const ImPlotTime& t, tm* ptm) {
+#ifdef _WIN32
+  if (localtime_s(ptm, &t.S) == 0)
+    return ptm;
+  else
+    return nullptr;
+#else
+    return localtime_r(&t.S, ptm);
+#endif
+}
+
+ImPlotTime MakeTime(int year, int month, int day, int hour, int min, int sec, int us) {
+    tm& Tm = GImPlot->Tm;
+
+    int yr = year - 1900;
+    if (yr < 0)
+        yr = 0;
+
+    sec  = sec + us / 1000000;
+    us   = us % 1000000;
+
+    Tm.tm_sec  = sec;
+    Tm.tm_min  = min;
+    Tm.tm_hour = hour;
+    Tm.tm_mday = day;
+    Tm.tm_mon  = month;
+    Tm.tm_year = yr;
+
+    ImPlotTime t = MkTime(&Tm);
+
+    t.Us = us;
+    return t;
+}
+
+int GetYear(const ImPlotTime& t) {
+    tm& Tm = GImPlot->Tm;
+    GetTime(t, &Tm);
+    return Tm.tm_year + 1900;
+}
+
+int GetMonth(const ImPlotTime& t) {
+    tm& Tm = GImPlot->Tm;
+    ImPlot::GetTime(t, &Tm);
+    return Tm.tm_mon;
+}
+
+ImPlotTime AddTime(const ImPlotTime& t, ImPlotTimeUnit unit, int count) {
+    tm& Tm = GImPlot->Tm;
+    ImPlotTime t_out = t;
+    switch(unit) {
+        case ImPlotTimeUnit_Us:  t_out.Us += count;         break;
+        case ImPlotTimeUnit_Ms:  t_out.Us += count * 1000;  break;
+        case ImPlotTimeUnit_S:   t_out.S  += count;         break;
+        case ImPlotTimeUnit_Min: t_out.S  += count * 60;    break;
+        case ImPlotTimeUnit_Hr:  t_out.S  += count * 3600;  break;
+        case ImPlotTimeUnit_Day: t_out.S  += count * 86400; break;
+        case ImPlotTimeUnit_Mo:  for (int i = 0; i < abs(count); ++i) {
+                                     GetTime(t_out, &Tm);
+                                     if (count > 0)
+                                        t_out.S += 86400 * GetDaysInMonth(Tm.tm_year + 1900, Tm.tm_mon);
+                                     else if (count < 0)
+                                        t_out.S -= 86400 * GetDaysInMonth(Tm.tm_year + 1900 - (Tm.tm_mon == 0 ? 1 : 0), Tm.tm_mon == 0 ? 11 : Tm.tm_mon - 1); // NOT WORKING
+                                 }
+                                 break;
+        case ImPlotTimeUnit_Yr:  for (int i = 0; i < abs(count); ++i) {
+                                    if (count > 0)
+                                        t_out.S += 86400 * (365 + (int)IsLeapYear(GetYear(t_out)));
+                                    else if (count < 0)
+                                        t_out.S -= 86400 * (365 + (int)IsLeapYear(GetYear(t_out) - 1));
+                                    // this is incorrect if leap year and we are past Feb 28
+                                 }
+                                 break;
+        default:                 break;
+    }
+    t_out.RollOver();
+    return t_out;
+}
+
+ImPlotTime FloorTime(const ImPlotTime& t, ImPlotTimeUnit unit) {
+    ImPlotContext& gp = *GImPlot;
+    GetTime(t, &gp.Tm);
+    switch (unit) {
+        case ImPlotTimeUnit_S:   return ImPlotTime(t.S, 0);
+        case ImPlotTimeUnit_Ms:  return ImPlotTime(t.S, (t.Us / 1000) * 1000);
+        case ImPlotTimeUnit_Us:  return t;
+        case ImPlotTimeUnit_Yr:  gp.Tm.tm_mon  = 0; // fall-through
+        case ImPlotTimeUnit_Mo:  gp.Tm.tm_mday = 1; // fall-through
+        case ImPlotTimeUnit_Day: gp.Tm.tm_hour = 0; // fall-through
+        case ImPlotTimeUnit_Hr:  gp.Tm.tm_min  = 0; // fall-through
+        case ImPlotTimeUnit_Min: gp.Tm.tm_sec  = 0; break;
+        default:                 return t;
+    }
+    return MkTime(&gp.Tm);
+}
+
+ImPlotTime CeilTime(const ImPlotTime& t, ImPlotTimeUnit unit) {
+    return AddTime(FloorTime(t, unit), unit, 1);
+}
+
+ImPlotTime RoundTime(const ImPlotTime& t, ImPlotTimeUnit unit) {
+    ImPlotTime t1 = FloorTime(t, unit);
+    ImPlotTime t2 = AddTime(t1,unit,1);
+    if (t1.S == t2.S)
+        return t.Us - t1.Us < t2.Us - t.Us ? t1 : t2;
+    return t.S - t1.S < t2.S - t.S ? t1 : t2;
+}
+
+ImPlotTime CombineDateTime(const ImPlotTime& date_part, const ImPlotTime& tod_part) {
+    ImPlotContext& gp = *GImPlot;
+    tm& Tm = gp.Tm;
+    GetTime(date_part, &gp.Tm);
+    int y = Tm.tm_year;
+    int m = Tm.tm_mon;
+    int d = Tm.tm_mday;
+    GetTime(tod_part, &gp.Tm);
+    Tm.tm_year = y;
+    Tm.tm_mon  = m;
+    Tm.tm_mday = d;
+    ImPlotTime t = MkTime(&Tm);
+    t.Us = tod_part.Us;
+    return t;
+}
+
+// TODO: allow users to define these
+static const char* MONTH_NAMES[]  = {"January","February","March","April","May","June","July","August","September","October","November","December"};
+static const char* WD_ABRVS[]     = {"Su","Mo","Tu","We","Th","Fr","Sa"};
+static const char* MONTH_ABRVS[]  = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
+
+int FormatTime(const ImPlotTime& t, char* buffer, int size, ImPlotTimeFmt fmt, bool use_24_hr_clk) {
+    tm& Tm = GImPlot->Tm;
+    GetTime(t, &Tm);
+    const int us   = t.Us % 1000;
+    const int ms   = t.Us / 1000;
+    const int sec  = Tm.tm_sec;
+    const int min  = Tm.tm_min;
+    if (use_24_hr_clk) {
+        const int hr   = Tm.tm_hour;
+        switch(fmt) {
+            case ImPlotTimeFmt_Us:        return ImFormatString(buffer, size, ".%03d %03d", ms, us);
+            case ImPlotTimeFmt_SUs:       return ImFormatString(buffer, size, ":%02d.%03d %03d", sec, ms, us);
+            case ImPlotTimeFmt_SMs:       return ImFormatString(buffer, size, ":%02d.%03d", sec, ms);
+            case ImPlotTimeFmt_S:         return ImFormatString(buffer, size, ":%02d", sec);
+            case ImPlotTimeFmt_MinSMs:    return ImFormatString(buffer, size, ":%02d:%02d.%03d", min, sec, ms);
+            case ImPlotTimeFmt_HrMinSMs:  return ImFormatString(buffer, size, "%02d:%02d:%02d.%03d", hr, min, sec, ms);
+            case ImPlotTimeFmt_HrMinS:    return ImFormatString(buffer, size, "%02d:%02d:%02d", hr, min, sec);
+            case ImPlotTimeFmt_HrMin:     return ImFormatString(buffer, size, "%02d:%02d", hr, min);
+            case ImPlotTimeFmt_Hr:        return ImFormatString(buffer, size, "%02d:00", hr);
+            default:                      return 0;
+        }
+    }
+    else {
+        const char* ap = Tm.tm_hour < 12 ? "am" : "pm";
+        const int hr   = (Tm.tm_hour == 0 || Tm.tm_hour == 12) ? 12 : Tm.tm_hour % 12;
+        switch(fmt) {
+            case ImPlotTimeFmt_Us:        return ImFormatString(buffer, size, ".%03d %03d", ms, us);
+            case ImPlotTimeFmt_SUs:       return ImFormatString(buffer, size, ":%02d.%03d %03d", sec, ms, us);
+            case ImPlotTimeFmt_SMs:       return ImFormatString(buffer, size, ":%02d.%03d", sec, ms);
+            case ImPlotTimeFmt_S:         return ImFormatString(buffer, size, ":%02d", sec);
+            case ImPlotTimeFmt_MinSMs:    return ImFormatString(buffer, size, ":%02d:%02d.%03d", min, sec, ms);
+            case ImPlotTimeFmt_HrMinSMs:  return ImFormatString(buffer, size, "%d:%02d:%02d.%03d%s", hr, min, sec, ms, ap);
+            case ImPlotTimeFmt_HrMinS:    return ImFormatString(buffer, size, "%d:%02d:%02d%s", hr, min, sec, ap);
+            case ImPlotTimeFmt_HrMin:     return ImFormatString(buffer, size, "%d:%02d%s", hr, min, ap);
+            case ImPlotTimeFmt_Hr:        return ImFormatString(buffer, size, "%d%s", hr, ap);
+            default:                      return 0;
+        }
+    }
+}
+
+int FormatDate(const ImPlotTime& t, char* buffer, int size, ImPlotDateFmt fmt, bool use_iso_8601) {
+    tm& Tm = GImPlot->Tm;
+    GetTime(t, &Tm);
+    const int day  = Tm.tm_mday;
+    const int mon  = Tm.tm_mon + 1;
+    const int year = Tm.tm_year + 1900;
+    const int yr   = year % 100;
+    if (use_iso_8601) {
+        switch (fmt) {
+            case ImPlotDateFmt_DayMo:   return ImFormatString(buffer, size, "--%02d-%02d", mon, day);
+            case ImPlotDateFmt_DayMoYr: return ImFormatString(buffer, size, "%d-%02d-%02d", year, mon, day);
+            case ImPlotDateFmt_MoYr:    return ImFormatString(buffer, size, "%d-%02d", year, mon);
+            case ImPlotDateFmt_Mo:      return ImFormatString(buffer, size, "--%02d", mon);
+            case ImPlotDateFmt_Yr:      return ImFormatString(buffer, size, "%d", year);
+            default:                    return 0;
+        }
+    }
+    else {
+        switch (fmt) {
+            case ImPlotDateFmt_DayMo:   return ImFormatString(buffer, size, "%d/%d", mon, day);
+            case ImPlotDateFmt_DayMoYr: return ImFormatString(buffer, size, "%d/%d/%02d", mon, day, yr);
+            case ImPlotDateFmt_MoYr:    return ImFormatString(buffer, size, "%s %d", MONTH_ABRVS[Tm.tm_mon], year);
+            case ImPlotDateFmt_Mo:      return ImFormatString(buffer, size, "%s", MONTH_ABRVS[Tm.tm_mon]);
+            case ImPlotDateFmt_Yr:      return ImFormatString(buffer, size, "%d", year);
+            default:                    return 0;
+        }
+    }
+ }
+
+int FormatDateTime(const ImPlotTime& t, char* buffer, int size, ImPlotDateTimeSpec fmt) {
+    int written = 0;
+    if (fmt.Date != ImPlotDateFmt_None)
+        written += FormatDate(t, buffer, size, fmt.Date, fmt.UseISO8601);
+    if (fmt.Time != ImPlotTimeFmt_None) {
+        if (fmt.Date != ImPlotDateFmt_None)
+            buffer[written++] = ' ';
+        written += FormatTime(t, &buffer[written], size - written, fmt.Time, fmt.Use24HourClock);
+    }
+    return written;
+}
+
+inline float GetDateTimeWidth(ImPlotDateTimeSpec fmt) {
+    static const ImPlotTime t_max_width = MakeTime(2888, 12, 22, 12, 58, 58, 888888); // best guess at time that maximizes pixel width
+    char buffer[32];
+    FormatDateTime(t_max_width, buffer, 32, fmt);
+    return ImGui::CalcTextSize(buffer).x;
+}
+
+inline bool TimeLabelSame(const char* l1, const char* l2) {
+    size_t len1 = strlen(l1);
+    size_t len2 = strlen(l2);
+    size_t n  = len1 < len2 ? len1 : len2;
+    return strcmp(l1 + len1 - n, l2 + len2 - n) == 0;
+}
+
+static const ImPlotDateTimeSpec TimeFormatLevel0[ImPlotTimeUnit_COUNT] = {
+    ImPlotDateTimeSpec(ImPlotDateFmt_None,  ImPlotTimeFmt_Us),
+    ImPlotDateTimeSpec(ImPlotDateFmt_None,  ImPlotTimeFmt_SMs),
+    ImPlotDateTimeSpec(ImPlotDateFmt_None,  ImPlotTimeFmt_S),
+    ImPlotDateTimeSpec(ImPlotDateFmt_None,  ImPlotTimeFmt_HrMin),
+    ImPlotDateTimeSpec(ImPlotDateFmt_None,  ImPlotTimeFmt_Hr),
+    ImPlotDateTimeSpec(ImPlotDateFmt_DayMo, ImPlotTimeFmt_None),
+    ImPlotDateTimeSpec(ImPlotDateFmt_Mo,    ImPlotTimeFmt_None),
+    ImPlotDateTimeSpec(ImPlotDateFmt_Yr,    ImPlotTimeFmt_None)
+};
+
+static const ImPlotDateTimeSpec TimeFormatLevel1[ImPlotTimeUnit_COUNT] = {
+    ImPlotDateTimeSpec(ImPlotDateFmt_None,    ImPlotTimeFmt_HrMin),
+    ImPlotDateTimeSpec(ImPlotDateFmt_None,    ImPlotTimeFmt_HrMinS),
+    ImPlotDateTimeSpec(ImPlotDateFmt_None,    ImPlotTimeFmt_HrMin),
+    ImPlotDateTimeSpec(ImPlotDateFmt_None,    ImPlotTimeFmt_HrMin),
+    ImPlotDateTimeSpec(ImPlotDateFmt_DayMoYr, ImPlotTimeFmt_None),
+    ImPlotDateTimeSpec(ImPlotDateFmt_DayMoYr, ImPlotTimeFmt_None),
+    ImPlotDateTimeSpec(ImPlotDateFmt_Yr,      ImPlotTimeFmt_None),
+    ImPlotDateTimeSpec(ImPlotDateFmt_Yr,      ImPlotTimeFmt_None)
+};
+
+static const ImPlotDateTimeSpec TimeFormatLevel1First[ImPlotTimeUnit_COUNT] = {
+    ImPlotDateTimeSpec(ImPlotDateFmt_DayMoYr, ImPlotTimeFmt_HrMinS),
+    ImPlotDateTimeSpec(ImPlotDateFmt_DayMoYr, ImPlotTimeFmt_HrMinS),
+    ImPlotDateTimeSpec(ImPlotDateFmt_DayMoYr, ImPlotTimeFmt_HrMin),
+    ImPlotDateTimeSpec(ImPlotDateFmt_DayMoYr, ImPlotTimeFmt_HrMin),
+    ImPlotDateTimeSpec(ImPlotDateFmt_DayMoYr, ImPlotTimeFmt_None),
+    ImPlotDateTimeSpec(ImPlotDateFmt_DayMoYr, ImPlotTimeFmt_None),
+    ImPlotDateTimeSpec(ImPlotDateFmt_Yr,      ImPlotTimeFmt_None),
+    ImPlotDateTimeSpec(ImPlotDateFmt_Yr,      ImPlotTimeFmt_None)
+};
+
+static const ImPlotDateTimeSpec TimeFormatMouseCursor[ImPlotTimeUnit_COUNT] = {
+    ImPlotDateTimeSpec(ImPlotDateFmt_None,     ImPlotTimeFmt_Us),
+    ImPlotDateTimeSpec(ImPlotDateFmt_None,     ImPlotTimeFmt_SUs),
+    ImPlotDateTimeSpec(ImPlotDateFmt_None,     ImPlotTimeFmt_SMs),
+    ImPlotDateTimeSpec(ImPlotDateFmt_None,     ImPlotTimeFmt_HrMinS),
+    ImPlotDateTimeSpec(ImPlotDateFmt_None,     ImPlotTimeFmt_HrMin),
+    ImPlotDateTimeSpec(ImPlotDateFmt_DayMo,    ImPlotTimeFmt_Hr),
+    ImPlotDateTimeSpec(ImPlotDateFmt_DayMoYr,  ImPlotTimeFmt_None),
+    ImPlotDateTimeSpec(ImPlotDateFmt_MoYr,     ImPlotTimeFmt_None)
+};
+
+inline ImPlotDateTimeSpec GetDateTimeFmt(const ImPlotDateTimeSpec* ctx, ImPlotTimeUnit idx) {
+    ImPlotStyle& style     = GetStyle();
+    ImPlotDateTimeSpec fmt  = ctx[idx];
+    fmt.UseISO8601         = style.UseISO8601;
+    fmt.Use24HourClock     = style.Use24HourClock;
+    return fmt;
+}
+
+void Locator_Time(ImPlotTicker& ticker, const ImPlotRange& range, float pixels, bool vertical, ImPlotFormatter formatter, void* formatter_data) {
+    IM_ASSERT_USER_ERROR(vertical == false, "Cannot locate Time ticks on vertical axis!");
+    (void)vertical;
+    // get units for level 0 and level 1 labels
+    const ImPlotTimeUnit unit0 = GetUnitForRange(range.Size() / (pixels / 100)); // level = 0 (top)
+    const ImPlotTimeUnit unit1 = ImClamp(unit0 + 1, 0, ImPlotTimeUnit_COUNT-1);  // level = 1 (bottom)
+    // get time format specs
+    const ImPlotDateTimeSpec fmt0 = GetDateTimeFmt(TimeFormatLevel0, unit0);
+    const ImPlotDateTimeSpec fmt1 = GetDateTimeFmt(TimeFormatLevel1, unit1);
+    const ImPlotDateTimeSpec fmtf = GetDateTimeFmt(TimeFormatLevel1First, unit1);
+    // min max times
+    const ImPlotTime t_min = ImPlotTime::FromDouble(range.Min);
+    const ImPlotTime t_max = ImPlotTime::FromDouble(range.Max);
+    // maximum allowable density of labels
+    const float max_density = 0.5f;
+    // book keeping
+    int last_major_offset = -1;
+    // formatter data
+    Formatter_Time_Data ftd;
+    ftd.UserFormatter = formatter;
+    ftd.UserFormatterData = formatter_data;
+    if (unit0 != ImPlotTimeUnit_Yr) {
+        // pixels per major (level 1) division
+        const float pix_per_major_div = pixels / (float)(range.Size() / TimeUnitSpans[unit1]);
+        // nominal pixels taken up by labels
+        const float fmt0_width = GetDateTimeWidth(fmt0);
+        const float fmt1_width = GetDateTimeWidth(fmt1);
+        const float fmtf_width = GetDateTimeWidth(fmtf);
+        // the maximum number of minor (level 0) labels that can fit between major (level 1) divisions
+        const int   minor_per_major   = (int)(max_density * pix_per_major_div / fmt0_width);
+        // the minor step size (level 0)
+        const int step = GetTimeStep(minor_per_major, unit0);
+        // generate ticks
+        ImPlotTime t1 = FloorTime(ImPlotTime::FromDouble(range.Min), unit1);
+        while (t1 < t_max) {
+            // get next major
+            const ImPlotTime t2 = AddTime(t1, unit1, 1);
+            // add major tick
+            if (t1 >= t_min && t1 <= t_max) {
+                // minor level 0 tick
+                ftd.Time = t1; ftd.Spec = fmt0;
+                ticker.AddTick(t1.ToDouble(), true, 0, true, Formatter_Time, &ftd);
+                // major level 1 tick
+                ftd.Time = t1; ftd.Spec = last_major_offset < 0 ? fmtf : fmt1;
+                ImPlotTick& tick_maj = ticker.AddTick(t1.ToDouble(), true, 1, true, Formatter_Time, &ftd);
+                const char* this_major = ticker.GetText(tick_maj);
+                if (last_major_offset >= 0 && TimeLabelSame(ticker.TextBuffer.Buf.Data + last_major_offset, this_major))
+                    tick_maj.ShowLabel = false;
+                last_major_offset = tick_maj.TextOffset;
+            }
+            // add minor ticks up until next major
+            if (minor_per_major > 1 && (t_min <= t2 && t1 <= t_max)) {
+                ImPlotTime t12 = AddTime(t1, unit0, step);
+                while (t12 < t2) {
+                    float px_to_t2 = (float)((t2 - t12).ToDouble()/range.Size()) * pixels;
+                    if (t12 >= t_min && t12 <= t_max) {
+                        ftd.Time = t12; ftd.Spec = fmt0;
+                        ticker.AddTick(t12.ToDouble(), false, 0, px_to_t2 >= fmt0_width, Formatter_Time, &ftd);
+                        if (last_major_offset < 0 && px_to_t2 >= fmt0_width && px_to_t2 >= (fmt1_width + fmtf_width) / 2) {
+                            ftd.Time = t12; ftd.Spec = fmtf;
+                            ImPlotTick& tick_maj = ticker.AddTick(t12.ToDouble(), true, 1, true, Formatter_Time, &ftd);
+                            last_major_offset = tick_maj.TextOffset;
+                        }
+                    }
+                    t12 = AddTime(t12, unit0, step);
+                }
+            }
+            t1 = t2;
+        }
+    }
+    else {
+        const ImPlotDateTimeSpec fmty = GetDateTimeFmt(TimeFormatLevel0, ImPlotTimeUnit_Yr);
+        const float label_width = GetDateTimeWidth(fmty);
+        const int   max_labels  = (int)(max_density * pixels / label_width);
+        const int year_min      = GetYear(t_min);
+        const int year_max      = GetYear(CeilTime(t_max, ImPlotTimeUnit_Yr));
+        const double nice_range = NiceNum((year_max - year_min)*0.99,false);
+        const double interval   = NiceNum(nice_range / (max_labels - 1), true);
+        const int graphmin      = (int)(floor(year_min / interval) * interval);
+        const int graphmax      = (int)(ceil(year_max  / interval) * interval);
+        const int step          = (int)interval <= 0 ? 1 : (int)interval;
+
+        for (int y = graphmin; y < graphmax; y += step) {
+            ImPlotTime t = MakeTime(y);
+            if (t >= t_min && t <= t_max) {
+                ftd.Time = t; ftd.Spec = fmty;
+                ticker.AddTick(t.ToDouble(), true, 0, true, Formatter_Time, &ftd);
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+// Context Menu
+//-----------------------------------------------------------------------------
+
+template <typename F>
+bool DragFloat(const char*, F*, float, F, F) {
+    return false;
+}
+
+template <>
+bool DragFloat<double>(const char* label, double* v, float v_speed, double v_min, double v_max) {
+    return ImGui::DragScalar(label, ImGuiDataType_Double, v, v_speed, &v_min, &v_max, "%.3g", 1);
+}
+
+template <>
+bool DragFloat<float>(const char* label, float* v, float v_speed, float v_min, float v_max) {
+    return ImGui::DragScalar(label, ImGuiDataType_Float, v, v_speed, &v_min, &v_max, "%.3g", 1);
+}
+
+inline void BeginDisabledControls(bool cond) {
+    if (cond) {
+        ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
+        ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.25f);
+    }
+}
+
+inline void EndDisabledControls(bool cond) {
+    if (cond) {
+        ImGui::PopItemFlag();
+        ImGui::PopStyleVar();
+    }
+}
+
+void ShowAxisContextMenu(ImPlotAxis& axis, ImPlotAxis* equal_axis, bool /*time_allowed*/) {
+
+    ImGui::PushItemWidth(75);
+    bool always_locked   = axis.IsRangeLocked() || axis.IsAutoFitting();
+    bool label           = axis.HasLabel();
+    bool grid            = axis.HasGridLines();
+    bool ticks           = axis.HasTickMarks();
+    bool labels          = axis.HasTickLabels();
+    double drag_speed    = (axis.Range.Size() <= DBL_EPSILON) ? DBL_EPSILON * 1.0e+13 : 0.01 * axis.Range.Size(); // recover from almost equal axis limits.
+
+    if (axis.Scale == ImPlotScale_Time) {
+        ImPlotTime tmin = ImPlotTime::FromDouble(axis.Range.Min);
+        ImPlotTime tmax = ImPlotTime::FromDouble(axis.Range.Max);
+
+        BeginDisabledControls(always_locked);
+        ImGui::CheckboxFlags("##LockMin", (unsigned int*)&axis.Flags, ImPlotAxisFlags_LockMin);
+        EndDisabledControls(always_locked);
+        ImGui::SameLine();
+        BeginDisabledControls(axis.IsLockedMin() || always_locked);
+        if (ImGui::BeginMenu("Min Time")) {
+            if (ShowTimePicker("mintime", &tmin)) {
+                if (tmin >= tmax)
+                    tmax = AddTime(tmin, ImPlotTimeUnit_S, 1);
+                axis.SetRange(tmin.ToDouble(),tmax.ToDouble());
+            }
+            ImGui::Separator();
+            if (ShowDatePicker("mindate",&axis.PickerLevel,&axis.PickerTimeMin,&tmin,&tmax)) {
+                tmin = CombineDateTime(axis.PickerTimeMin, tmin);
+                if (tmin >= tmax)
+                    tmax = AddTime(tmin, ImPlotTimeUnit_S, 1);
+                axis.SetRange(tmin.ToDouble(), tmax.ToDouble());
+            }
+            ImGui::EndMenu();
+        }
+        EndDisabledControls(axis.IsLockedMin() || always_locked);
+
+        BeginDisabledControls(always_locked);
+        ImGui::CheckboxFlags("##LockMax", (unsigned int*)&axis.Flags, ImPlotAxisFlags_LockMax);
+        EndDisabledControls(always_locked);
+        ImGui::SameLine();
+        BeginDisabledControls(axis.IsLockedMax() || always_locked);
+        if (ImGui::BeginMenu("Max Time")) {
+            if (ShowTimePicker("maxtime", &tmax)) {
+                if (tmax <= tmin)
+                    tmin = AddTime(tmax, ImPlotTimeUnit_S, -1);
+                axis.SetRange(tmin.ToDouble(),tmax.ToDouble());
+            }
+            ImGui::Separator();
+            if (ShowDatePicker("maxdate",&axis.PickerLevel,&axis.PickerTimeMax,&tmin,&tmax)) {
+                tmax = CombineDateTime(axis.PickerTimeMax, tmax);
+                if (tmax <= tmin)
+                    tmin = AddTime(tmax, ImPlotTimeUnit_S, -1);
+                axis.SetRange(tmin.ToDouble(), tmax.ToDouble());
+            }
+            ImGui::EndMenu();
+        }
+        EndDisabledControls(axis.IsLockedMax() || always_locked);
+    }
+    else {
+        BeginDisabledControls(always_locked);
+        ImGui::CheckboxFlags("##LockMin", (unsigned int*)&axis.Flags, ImPlotAxisFlags_LockMin);
+        EndDisabledControls(always_locked);
+        ImGui::SameLine();
+        BeginDisabledControls(axis.IsLockedMin() || always_locked);
+        double temp_min = axis.Range.Min;
+        if (DragFloat("Min", &temp_min, (float)drag_speed, -HUGE_VAL, axis.Range.Max - DBL_EPSILON)) {
+            axis.SetMin(temp_min,true);
+            if (equal_axis != nullptr)
+                equal_axis->SetAspect(axis.GetAspect());
+        }
+        EndDisabledControls(axis.IsLockedMin() || always_locked);
+
+        BeginDisabledControls(always_locked);
+        ImGui::CheckboxFlags("##LockMax", (unsigned int*)&axis.Flags, ImPlotAxisFlags_LockMax);
+        EndDisabledControls(always_locked);
+        ImGui::SameLine();
+        BeginDisabledControls(axis.IsLockedMax() || always_locked);
+        double temp_max = axis.Range.Max;
+        if (DragFloat("Max", &temp_max, (float)drag_speed, axis.Range.Min + DBL_EPSILON, HUGE_VAL)) {
+            axis.SetMax(temp_max,true);
+            if (equal_axis != nullptr)
+                equal_axis->SetAspect(axis.GetAspect());
+        }
+        EndDisabledControls(axis.IsLockedMax() || always_locked);
+    }
+
+    ImGui::Separator();
+
+    ImGui::CheckboxFlags("Auto-Fit",(unsigned int*)&axis.Flags, ImPlotAxisFlags_AutoFit);
+    // TODO
+    // BeginDisabledControls(axis.IsTime() && time_allowed);
+    // ImGui::CheckboxFlags("Log Scale",(unsigned int*)&axis.Flags, ImPlotAxisFlags_LogScale);
+    // EndDisabledControls(axis.IsTime() && time_allowed);
+    // if (time_allowed) {
+    //     BeginDisabledControls(axis.IsLog() || axis.IsSymLog());
+    //     ImGui::CheckboxFlags("Time",(unsigned int*)&axis.Flags, ImPlotAxisFlags_Time);
+    //     EndDisabledControls(axis.IsLog() || axis.IsSymLog());
+    // }
+    ImGui::Separator();
+    ImGui::CheckboxFlags("Invert",(unsigned int*)&axis.Flags, ImPlotAxisFlags_Invert);
+    ImGui::CheckboxFlags("Opposite",(unsigned int*)&axis.Flags, ImPlotAxisFlags_Opposite);
+    ImGui::Separator();
+    BeginDisabledControls(axis.LabelOffset == -1);
+    if (ImGui::Checkbox("Label", &label))
+        ImFlipFlag(axis.Flags, ImPlotAxisFlags_NoLabel);
+    EndDisabledControls(axis.LabelOffset == -1);
+    if (ImGui::Checkbox("Grid Lines", &grid))
+        ImFlipFlag(axis.Flags, ImPlotAxisFlags_NoGridLines);
+    if (ImGui::Checkbox("Tick Marks", &ticks))
+        ImFlipFlag(axis.Flags, ImPlotAxisFlags_NoTickMarks);
+    if (ImGui::Checkbox("Tick Labels", &labels))
+        ImFlipFlag(axis.Flags, ImPlotAxisFlags_NoTickLabels);
+
+}
+
+bool ShowLegendContextMenu(ImPlotLegend& legend, bool visible) {
+    const float s = ImGui::GetFrameHeight();
+    bool ret = false;
+    if (ImGui::Checkbox("Show",&visible))
+        ret = true;
+    if (legend.CanGoInside)
+        ImGui::CheckboxFlags("Outside",(unsigned int*)&legend.Flags, ImPlotLegendFlags_Outside);
+    if (ImGui::RadioButton("H", ImHasFlag(legend.Flags, ImPlotLegendFlags_Horizontal)))
+        legend.Flags |= ImPlotLegendFlags_Horizontal;
+    ImGui::SameLine();
+    if (ImGui::RadioButton("V", !ImHasFlag(legend.Flags, ImPlotLegendFlags_Horizontal)))
+        legend.Flags &= ~ImPlotLegendFlags_Horizontal;
+    ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(2,2));
+    if (ImGui::Button("NW",ImVec2(1.5f*s,s))) { legend.Location = ImPlotLocation_NorthWest; } ImGui::SameLine();
+    if (ImGui::Button("N", ImVec2(1.5f*s,s))) { legend.Location = ImPlotLocation_North;     } ImGui::SameLine();
+    if (ImGui::Button("NE",ImVec2(1.5f*s,s))) { legend.Location = ImPlotLocation_NorthEast; }
+    if (ImGui::Button("W", ImVec2(1.5f*s,s))) { legend.Location = ImPlotLocation_West;      } ImGui::SameLine();
+    if (ImGui::InvisibleButton("C", ImVec2(1.5f*s,s))) {     } ImGui::SameLine();
+    if (ImGui::Button("E", ImVec2(1.5f*s,s))) { legend.Location = ImPlotLocation_East;      }
+    if (ImGui::Button("SW",ImVec2(1.5f*s,s))) { legend.Location = ImPlotLocation_SouthWest; } ImGui::SameLine();
+    if (ImGui::Button("S", ImVec2(1.5f*s,s))) { legend.Location = ImPlotLocation_South;     } ImGui::SameLine();
+    if (ImGui::Button("SE",ImVec2(1.5f*s,s))) { legend.Location = ImPlotLocation_SouthEast; }
+    ImGui::PopStyleVar();
+    return ret;
+}
+
+void ShowSubplotsContextMenu(ImPlotSubplot& subplot) {
+    if ((ImGui::BeginMenu("Linking"))) {
+        if (ImGui::MenuItem("Link Rows",nullptr,ImHasFlag(subplot.Flags, ImPlotSubplotFlags_LinkRows)))
+            ImFlipFlag(subplot.Flags, ImPlotSubplotFlags_LinkRows);
+        if (ImGui::MenuItem("Link Cols",nullptr,ImHasFlag(subplot.Flags, ImPlotSubplotFlags_LinkCols)))
+            ImFlipFlag(subplot.Flags, ImPlotSubplotFlags_LinkCols);
+        if (ImGui::MenuItem("Link All X",nullptr,ImHasFlag(subplot.Flags, ImPlotSubplotFlags_LinkAllX)))
+            ImFlipFlag(subplot.Flags, ImPlotSubplotFlags_LinkAllX);
+        if (ImGui::MenuItem("Link All Y",nullptr,ImHasFlag(subplot.Flags, ImPlotSubplotFlags_LinkAllY)))
+            ImFlipFlag(subplot.Flags, ImPlotSubplotFlags_LinkAllY);
+        ImGui::EndMenu();
+    }
+    if ((ImGui::BeginMenu("Settings"))) {
+        BeginDisabledControls(!subplot.HasTitle);
+        if (ImGui::MenuItem("Title",nullptr,subplot.HasTitle && !ImHasFlag(subplot.Flags, ImPlotSubplotFlags_NoTitle)))
+            ImFlipFlag(subplot.Flags, ImPlotSubplotFlags_NoTitle);
+        EndDisabledControls(!subplot.HasTitle);
+        if (ImGui::MenuItem("Resizable",nullptr,!ImHasFlag(subplot.Flags, ImPlotSubplotFlags_NoResize)))
+            ImFlipFlag(subplot.Flags, ImPlotSubplotFlags_NoResize);
+        if (ImGui::MenuItem("Align",nullptr,!ImHasFlag(subplot.Flags, ImPlotSubplotFlags_NoAlign)))
+            ImFlipFlag(subplot.Flags, ImPlotSubplotFlags_NoAlign);
+        if (ImGui::MenuItem("Share Items",nullptr,ImHasFlag(subplot.Flags, ImPlotSubplotFlags_ShareItems)))
+            ImFlipFlag(subplot.Flags, ImPlotSubplotFlags_ShareItems);
+        ImGui::EndMenu();
+    }
+}
+
+void ShowPlotContextMenu(ImPlotPlot& plot) {
+    ImPlotContext& gp = *GImPlot;
+    const bool owns_legend = gp.CurrentItems == &plot.Items;
+    const bool equal = ImHasFlag(plot.Flags, ImPlotFlags_Equal);
+
+    char buf[16] = {};
+
+    for (int i = 0; i < IMPLOT_NUM_X_AXES; i++) {
+        ImPlotAxis& x_axis = plot.XAxis(i);
+        if (!x_axis.Enabled || !x_axis.HasMenus())
+            continue;
+        ImGui::PushID(i);
+        ImFormatString(buf, sizeof(buf) - 1, i == 0 ? "X-Axis" : "X-Axis %d", i + 1);
+        if (ImGui::BeginMenu(x_axis.HasLabel() ? plot.GetAxisLabel(x_axis) : buf)) {
+            ShowAxisContextMenu(x_axis, equal ? x_axis.OrthoAxis : nullptr, false);
+            ImGui::EndMenu();
+        }
+        ImGui::PopID();
+    }
+
+    for (int i = 0; i < IMPLOT_NUM_Y_AXES; i++) {
+        ImPlotAxis& y_axis = plot.YAxis(i);
+        if (!y_axis.Enabled || !y_axis.HasMenus())
+            continue;
+        ImGui::PushID(i);
+        ImFormatString(buf, sizeof(buf) - 1, i == 0 ? "Y-Axis" : "Y-Axis %d", i + 1);
+        if (ImGui::BeginMenu(y_axis.HasLabel() ? plot.GetAxisLabel(y_axis) : buf)) {
+            ShowAxisContextMenu(y_axis, equal ? y_axis.OrthoAxis : nullptr, false);
+            ImGui::EndMenu();
+        }
+        ImGui::PopID();
+    }
+
+    ImGui::Separator();
+    if (!ImHasFlag(gp.CurrentItems->Legend.Flags, ImPlotLegendFlags_NoMenus)) {
+        if ((ImGui::BeginMenu("Legend"))) {
+            if (owns_legend) {
+                if (ShowLegendContextMenu(plot.Items.Legend, !ImHasFlag(plot.Flags, ImPlotFlags_NoLegend)))
+                    ImFlipFlag(plot.Flags, ImPlotFlags_NoLegend);
+            }
+            else if (gp.CurrentSubplot != nullptr) {
+                if (ShowLegendContextMenu(gp.CurrentSubplot->Items.Legend, !ImHasFlag(gp.CurrentSubplot->Flags, ImPlotSubplotFlags_NoLegend)))
+                    ImFlipFlag(gp.CurrentSubplot->Flags, ImPlotSubplotFlags_NoLegend);
+            }
+            ImGui::EndMenu();
+        }
+    }
+    if ((ImGui::BeginMenu("Settings"))) {
+        if (ImGui::MenuItem("Equal", nullptr, ImHasFlag(plot.Flags, ImPlotFlags_Equal)))
+            ImFlipFlag(plot.Flags, ImPlotFlags_Equal);
+        if (ImGui::MenuItem("Box Select",nullptr,!ImHasFlag(plot.Flags, ImPlotFlags_NoBoxSelect)))
+            ImFlipFlag(plot.Flags, ImPlotFlags_NoBoxSelect);
+        BeginDisabledControls(plot.TitleOffset == -1);
+        if (ImGui::MenuItem("Title",nullptr,plot.HasTitle()))
+            ImFlipFlag(plot.Flags, ImPlotFlags_NoTitle);
+        EndDisabledControls(plot.TitleOffset == -1);
+        if (ImGui::MenuItem("Mouse Position",nullptr,!ImHasFlag(plot.Flags, ImPlotFlags_NoMouseText)))
+            ImFlipFlag(plot.Flags, ImPlotFlags_NoMouseText);
+        if (ImGui::MenuItem("Crosshairs",nullptr,ImHasFlag(plot.Flags, ImPlotFlags_Crosshairs)))
+            ImFlipFlag(plot.Flags, ImPlotFlags_Crosshairs);
+        ImGui::EndMenu();
+    }
+    if (gp.CurrentSubplot != nullptr && !ImHasFlag(gp.CurrentSubplot->Flags, ImPlotSubplotFlags_NoMenus)) {
+        ImGui::Separator();
+        if ((ImGui::BeginMenu("Subplots"))) {
+            ShowSubplotsContextMenu(*gp.CurrentSubplot);
+            ImGui::EndMenu();
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+// Axis Utils
+//-----------------------------------------------------------------------------
+
+static inline int AxisPrecision(const ImPlotAxis& axis) {
+    const double range = axis.Ticker.TickCount() > 1 ? (axis.Ticker.Ticks[1].PlotPos - axis.Ticker.Ticks[0].PlotPos) : axis.Range.Size();
+    return Precision(range);
+}
+
+static inline double RoundAxisValue(const ImPlotAxis& axis, double value) {
+    return RoundTo(value, AxisPrecision(axis));
+}
+
+void LabelAxisValue(const ImPlotAxis& axis, double value, char* buff, int size, bool round) {
+    ImPlotContext& gp = *GImPlot;
+    // TODO: We shouldn't explicitly check that the axis is Time here. Ideally,
+    // Formatter_Time would handle the formatting for us, but the code below
+    // needs additional arguments which are not currently available in ImPlotFormatter
+    if (axis.Locator == Locator_Time) {
+        ImPlotTimeUnit unit = axis.Vertical
+                            ? GetUnitForRange(axis.Range.Size() / (gp.CurrentPlot->PlotRect.GetHeight() / 100)) // TODO: magic value!
+                            : GetUnitForRange(axis.Range.Size() / (gp.CurrentPlot->PlotRect.GetWidth() / 100)); // TODO: magic value!
+        FormatDateTime(ImPlotTime::FromDouble(value), buff, size, GetDateTimeFmt(TimeFormatMouseCursor, unit));
+    }
+    else {
+        if (round)
+            value = RoundAxisValue(axis, value);
+        axis.Formatter(value, buff, size, axis.FormatterData);
+    }
+}
+
+void UpdateAxisColors(ImPlotAxis& axis) {
+    const ImVec4 col_grid = GetStyleColorVec4(ImPlotCol_AxisGrid);
+    axis.ColorMaj         = ImGui::GetColorU32(col_grid);
+    axis.ColorMin         = ImGui::GetColorU32(col_grid*ImVec4(1,1,1,GImPlot->Style.MinorAlpha));
+    axis.ColorTick        = GetStyleColorU32(ImPlotCol_AxisTick);
+    axis.ColorTxt         = GetStyleColorU32(ImPlotCol_AxisText);
+    axis.ColorBg          = GetStyleColorU32(ImPlotCol_AxisBg);
+    axis.ColorHov         = GetStyleColorU32(ImPlotCol_AxisBgHovered);
+    axis.ColorAct         = GetStyleColorU32(ImPlotCol_AxisBgActive);
+    // axis.ColorHiLi     = IM_COL32_BLACK_TRANS;
+}
+
+void PadAndDatumAxesX(ImPlotPlot& plot, float& pad_T, float& pad_B, ImPlotAlignmentData* align) {
+
+    ImPlotContext& gp = *GImPlot;
+
+    const float T = ImGui::GetTextLineHeight();
+    const float P = gp.Style.LabelPadding.y;
+    const float K = gp.Style.MinorTickLen.x;
+
+    int   count_T = 0;
+    int   count_B = 0;
+    float last_T  = plot.AxesRect.Min.y;
+    float last_B  = plot.AxesRect.Max.y;
+
+    for (int i = IMPLOT_NUM_X_AXES; i-- > 0;) { // FYI: can iterate forward
+        ImPlotAxis& axis = plot.XAxis(i);
+        if (!axis.Enabled)
+            continue;
+        const bool label = axis.HasLabel();
+        const bool ticks = axis.HasTickLabels();
+        const bool opp   = axis.IsOpposite();
+        const bool time  = axis.Scale == ImPlotScale_Time;
+        if (opp) {
+            if (count_T++ > 0)
+                pad_T += K + P;
+            if (label) {
+                ImVec2 label_size = ImGui::CalcTextSize(plot.GetAxisLabel(axis));
+                pad_T += label_size.y + P;
+            }
+            if (ticks)
+                pad_T += ImMax(T, axis.Ticker.MaxSize.y) + P + (time ? T + P : 0);
+            axis.Datum1 = plot.CanvasRect.Min.y + pad_T;
+            axis.Datum2 = last_T;
+            last_T = axis.Datum1;
+        }
+        else {
+            if (count_B++ > 0)
+                pad_B += K + P;
+            if (label) {
+                ImVec2 label_size = ImGui::CalcTextSize(plot.GetAxisLabel(axis));
+                pad_B += label_size.y + P;
+            }
+            if (ticks)
+                pad_B += ImMax(T, axis.Ticker.MaxSize.y) + P + (time ? T + P : 0);
+            axis.Datum1 = plot.CanvasRect.Max.y - pad_B;
+            axis.Datum2 = last_B;
+            last_B = axis.Datum1;
+        }
+    }
+
+    if (align) {
+        count_T = count_B = 0;
+        float delta_T, delta_B;
+        align->Update(pad_T,pad_B,delta_T,delta_B);
+        for (int i = IMPLOT_NUM_X_AXES; i-- > 0;) {
+            ImPlotAxis& axis = plot.XAxis(i);
+            if (!axis.Enabled)
+                continue;
+            if (axis.IsOpposite()) {
+                axis.Datum1 += delta_T;
+                axis.Datum2 += count_T++ > 1 ? delta_T : 0;
+            }
+            else {
+                axis.Datum1 -= delta_B;
+                axis.Datum2 -= count_B++ > 1 ? delta_B : 0;
+            }
+        }
+    }
+}
+
+void PadAndDatumAxesY(ImPlotPlot& plot, float& pad_L, float& pad_R, ImPlotAlignmentData* align) {
+
+    //   [   pad_L   ]                 [   pad_R   ]
+    //   .................CanvasRect................
+    //   :TPWPK.PTPWP _____PlotRect____ PWPTP.KPWPT:
+    //   :A # |- A # |-               -| # A -| # A:
+    //   :X   |  X   |                 |   X  |   x:
+    //   :I # |- I # |-               -| # I -| # I:
+    //   :S   |  S   |                 |   S  |   S:
+    //   :3 # |- 0 # |-_______________-| # 1 -| # 2:
+    //   :.........................................:
+    //
+    //   T = text height
+    //   P = label padding
+    //   K = minor tick length
+    //   W = label width
+
+    ImPlotContext& gp = *GImPlot;
+
+    const float T = ImGui::GetTextLineHeight();
+    const float P = gp.Style.LabelPadding.x;
+    const float K = gp.Style.MinorTickLen.y;
+
+    int   count_L = 0;
+    int   count_R = 0;
+    float last_L  = plot.AxesRect.Min.x;
+    float last_R  = plot.AxesRect.Max.x;
+
+    for (int i = IMPLOT_NUM_Y_AXES; i-- > 0;) { // FYI: can iterate forward
+        ImPlotAxis& axis = plot.YAxis(i);
+        if (!axis.Enabled)
+            continue;
+        const bool label = axis.HasLabel();
+        const bool ticks = axis.HasTickLabels();
+        const bool opp   = axis.IsOpposite();
+        if (opp) {
+            if (count_R++ > 0)
+                pad_R += K + P;
+            if (label)
+                pad_R += T + P;
+            if (ticks)
+                pad_R += axis.Ticker.MaxSize.x + P;
+            axis.Datum1 = plot.CanvasRect.Max.x - pad_R;
+            axis.Datum2 = last_R;
+            last_R = axis.Datum1;
+        }
+        else {
+            if (count_L++ > 0)
+                pad_L += K + P;
+            if (label)
+                pad_L += T + P;
+            if (ticks)
+                pad_L += axis.Ticker.MaxSize.x + P;
+            axis.Datum1 = plot.CanvasRect.Min.x + pad_L;
+            axis.Datum2 = last_L;
+            last_L = axis.Datum1;
+        }
+    }
+
+    plot.PlotRect.Min.x = plot.CanvasRect.Min.x + pad_L;
+    plot.PlotRect.Max.x = plot.CanvasRect.Max.x - pad_R;
+
+    if (align) {
+        count_L = count_R = 0;
+        float delta_L, delta_R;
+        align->Update(pad_L,pad_R,delta_L,delta_R);
+        for (int i = IMPLOT_NUM_Y_AXES; i-- > 0;) {
+            ImPlotAxis& axis = plot.YAxis(i);
+            if (!axis.Enabled)
+                continue;
+            if (axis.IsOpposite()) {
+                axis.Datum1 -= delta_R;
+                axis.Datum2 -= count_R++ > 1 ? delta_R : 0;
+            }
+            else {
+                axis.Datum1 += delta_L;
+                axis.Datum2 += count_L++ > 1 ? delta_L : 0;
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+// RENDERING
+//-----------------------------------------------------------------------------
+
+static inline void RenderGridLinesX(ImDrawList& DrawList, const ImPlotTicker& ticker, const ImRect& rect, ImU32 col_maj, ImU32 col_min, float size_maj, float size_min) {
+    const float density   = ticker.TickCount() / rect.GetWidth();
+    ImVec4 col_min4  = ImGui::ColorConvertU32ToFloat4(col_min);
+    col_min4.w      *= ImClamp(ImRemap(density, 0.1f, 0.2f, 1.0f, 0.0f), 0.0f, 1.0f);
+    col_min = ImGui::ColorConvertFloat4ToU32(col_min4);
+    for (int t = 0; t < ticker.TickCount(); t++) {
+        const ImPlotTick& xt = ticker.Ticks[t];
+        if (xt.PixelPos < rect.Min.x || xt.PixelPos > rect.Max.x)
+            continue;
+        if (xt.Level == 0) {
+            if (xt.Major)
+                AddLineV(&DrawList, xt.PixelPos, rect.Min.y, rect.Max.y, col_maj, size_maj);
+            else if (density < 0.2f)
+                AddLineV(&DrawList, xt.PixelPos, rect.Min.y, rect.Max.y, col_min, size_min);
+        }
+    }
+}
+
+static inline void RenderGridLinesY(ImDrawList& DrawList, const ImPlotTicker& ticker, const ImRect& rect, ImU32 col_maj, ImU32 col_min, float size_maj, float size_min) {
+    const float density   = ticker.TickCount() / rect.GetHeight();
+    ImVec4 col_min4  = ImGui::ColorConvertU32ToFloat4(col_min);
+    col_min4.w      *= ImClamp(ImRemap(density, 0.1f, 0.2f, 1.0f, 0.0f), 0.0f, 1.0f);
+    col_min = ImGui::ColorConvertFloat4ToU32(col_min4);
+    for (int t = 0; t < ticker.TickCount(); t++) {
+        const ImPlotTick& yt = ticker.Ticks[t];
+        if (yt.PixelPos < rect.Min.y || yt.PixelPos > rect.Max.y)
+            continue;
+        if (yt.Major)
+            AddLineH(&DrawList, rect.Min.x, rect.Max.x, yt.PixelPos, col_maj, size_maj);
+        else if (density < 0.2f)
+            AddLineH(&DrawList, rect.Min.x, rect.Max.x, yt.PixelPos, col_min, size_min);
+    }
+}
+
+static inline void RenderSelectionRect(ImDrawList& DrawList, const ImVec2& p_min, const ImVec2& p_max, const ImVec4& col) {
+    const ImU32 col_bg = ImGui::GetColorU32(col * ImVec4(1,1,1,0.25f));
+    const ImU32 col_bd = ImGui::GetColorU32(col);
+    DrawList.AddRectFilled(p_min, p_max, col_bg);
+    DrawList.AddRect(p_min, p_max, col_bd);
+}
+
+//-----------------------------------------------------------------------------
+// Input Handling
+//-----------------------------------------------------------------------------
+
+constexpr float MOUSE_CURSOR_DRAG_THRESHOLD = 5.0f;
+constexpr float BOX_SELECT_DRAG_THRESHOLD   = 4.0f;
+
+bool UpdateInput(ImPlotPlot& plot) {
+
+    bool changed = false;
+
+    ImPlotContext& gp = *GImPlot;
+    ImGuiIO& IO = ImGui::GetIO();
+
+    // BUTTON STATE -----------------------------------------------------------
+
+    const ImGuiButtonFlags plot_button_flags = ImGuiButtonFlags_AllowOverlap
+                                             | ImGuiButtonFlags_PressedOnClick
+                                             | ImGuiButtonFlags_PressedOnDoubleClick
+                                             | ImGuiButtonFlags_MouseButtonLeft
+                                             | ImGuiButtonFlags_MouseButtonRight
+                                             | ImGuiButtonFlags_MouseButtonMiddle;
+    const ImGuiButtonFlags axis_button_flags = ImGuiButtonFlags_FlattenChildren
+                                             | plot_button_flags;
+
+    const bool plot_clicked = ImGui::ButtonBehavior(plot.PlotRect,plot.ID,&plot.Hovered,&plot.Held,plot_button_flags);
+#if (IMGUI_VERSION_NUM < 18966)
+    ImGui::SetItemAllowOverlap(); // Handled by ButtonBehavior()
+#endif
+
+    if (plot_clicked) {
+        if (!ImHasFlag(plot.Flags, ImPlotFlags_NoBoxSelect) && IO.MouseClicked[gp.InputMap.Select] && ImHasFlag(IO.KeyMods, gp.InputMap.SelectMod)) {
+            plot.Selecting   = true;
+            plot.SelectStart = IO.MousePos;
+            plot.SelectRect  = ImRect(0,0,0,0);
+        }
+        if (IO.MouseDoubleClicked[gp.InputMap.Fit]) {
+            plot.FitThisFrame = true;
+            for (int i = 0; i < ImAxis_COUNT; ++i)
+                plot.Axes[i].FitThisFrame = true;
+        }
+    }
+
+    const bool can_pan = IO.MouseDown[gp.InputMap.Pan] && ImHasFlag(IO.KeyMods, gp.InputMap.PanMod);
+
+    plot.Held = plot.Held && can_pan;
+
+    bool x_click[IMPLOT_NUM_X_AXES] = {false};
+    bool x_held[IMPLOT_NUM_X_AXES]  = {false};
+    bool x_hov[IMPLOT_NUM_X_AXES]   = {false};
+
+    bool y_click[IMPLOT_NUM_Y_AXES] = {false};
+    bool y_held[IMPLOT_NUM_Y_AXES]  = {false};
+    bool y_hov[IMPLOT_NUM_Y_AXES]   = {false};
+
+    for (int i = 0; i < IMPLOT_NUM_X_AXES; ++i) {
+        ImPlotAxis& xax = plot.XAxis(i);
+        if (xax.Enabled) {
+            ImGui::KeepAliveID(xax.ID);
+            x_click[i]  = ImGui::ButtonBehavior(xax.HoverRect,xax.ID,&xax.Hovered,&xax.Held,axis_button_flags);
+            if (x_click[i] && IO.MouseDoubleClicked[gp.InputMap.Fit])
+                plot.FitThisFrame = xax.FitThisFrame = true;
+            xax.Held  = xax.Held && can_pan;
+            x_hov[i]  = xax.Hovered || plot.Hovered;
+            x_held[i] = xax.Held    || plot.Held;
+        }
+    }
+
+    for (int i = 0; i < IMPLOT_NUM_Y_AXES; ++i) {
+        ImPlotAxis& yax = plot.YAxis(i);
+        if (yax.Enabled) {
+            ImGui::KeepAliveID(yax.ID);
+            y_click[i]  = ImGui::ButtonBehavior(yax.HoverRect,yax.ID,&yax.Hovered,&yax.Held,axis_button_flags);
+            if (y_click[i] && IO.MouseDoubleClicked[gp.InputMap.Fit])
+                plot.FitThisFrame = yax.FitThisFrame = true;
+            yax.Held  = yax.Held && can_pan;
+            y_hov[i]  = yax.Hovered || plot.Hovered;
+            y_held[i] = yax.Held    || plot.Held;
+        }
+    }
+
+    // cancel due to DND activity
+    if (GImGui->DragDropActive || (IO.KeyMods == gp.InputMap.OverrideMod && gp.InputMap.OverrideMod != 0))
+        return false;
+
+    // STATE -------------------------------------------------------------------
+
+    const bool axis_equal      = ImHasFlag(plot.Flags, ImPlotFlags_Equal);
+
+    const bool any_x_hov       = plot.Hovered || AnyAxesHovered(&plot.Axes[ImAxis_X1], IMPLOT_NUM_X_AXES);
+    const bool any_x_held      = plot.Held    || AnyAxesHeld(&plot.Axes[ImAxis_X1], IMPLOT_NUM_X_AXES);
+    const bool any_y_hov       = plot.Hovered || AnyAxesHovered(&plot.Axes[ImAxis_Y1], IMPLOT_NUM_Y_AXES);
+    const bool any_y_held      = plot.Held    || AnyAxesHeld(&plot.Axes[ImAxis_Y1], IMPLOT_NUM_Y_AXES);
+    const bool any_hov         = any_x_hov    || any_y_hov;
+    const bool any_held        = any_x_held   || any_y_held;
+
+    const ImVec2 select_drag   = ImGui::GetMouseDragDelta(gp.InputMap.Select);
+    const ImVec2 pan_drag      = ImGui::GetMouseDragDelta(gp.InputMap.Pan);
+    const float select_drag_sq = ImLengthSqr(select_drag);
+    const float pan_drag_sq    = ImLengthSqr(pan_drag);
+    const bool selecting       = plot.Selecting && select_drag_sq > MOUSE_CURSOR_DRAG_THRESHOLD;
+    const bool panning         = any_held       && pan_drag_sq    > MOUSE_CURSOR_DRAG_THRESHOLD;
+
+    // CONTEXT MENU -----------------------------------------------------------
+
+    if (IO.MouseReleased[gp.InputMap.Menu] && !plot.ContextLocked)
+        gp.OpenContextThisFrame = true;
+
+    if (selecting || panning)
+        plot.ContextLocked = true;
+    else if (!(IO.MouseDown[gp.InputMap.Menu] || IO.MouseReleased[gp.InputMap.Menu]))
+        plot.ContextLocked = false;
+
+    // DRAG INPUT -------------------------------------------------------------
+
+    if (any_held && !plot.Selecting) {
+        int drag_direction = 0;
+        for (int i = 0; i < IMPLOT_NUM_X_AXES; i++) {
+            ImPlotAxis& x_axis = plot.XAxis(i);
+            if (x_held[i] && !x_axis.IsInputLocked()) {
+                drag_direction |= (1 << 1);
+                bool increasing = x_axis.IsInverted() ? IO.MouseDelta.x > 0 : IO.MouseDelta.x < 0;
+                if (IO.MouseDelta.x != 0 && !x_axis.IsPanLocked(increasing)) {
+                    const double plot_l = x_axis.PixelsToPlot(plot.PlotRect.Min.x - IO.MouseDelta.x);
+                    const double plot_r = x_axis.PixelsToPlot(plot.PlotRect.Max.x - IO.MouseDelta.x);
+                    x_axis.SetMin(x_axis.IsInverted() ? plot_r : plot_l);
+                    x_axis.SetMax(x_axis.IsInverted() ? plot_l : plot_r);
+                    if (axis_equal && x_axis.OrthoAxis != nullptr)
+                        x_axis.OrthoAxis->SetAspect(x_axis.GetAspect());
+                    changed = true;
+                }
+            }
+        }
+        for (int i = 0; i < IMPLOT_NUM_Y_AXES; i++) {
+            ImPlotAxis& y_axis = plot.YAxis(i);
+            if (y_held[i] && !y_axis.IsInputLocked()) {
+                drag_direction |= (1 << 2);
+                bool increasing = y_axis.IsInverted() ? IO.MouseDelta.y < 0 : IO.MouseDelta.y > 0;
+                if (IO.MouseDelta.y != 0 && !y_axis.IsPanLocked(increasing)) {
+                    const double plot_t = y_axis.PixelsToPlot(plot.PlotRect.Min.y - IO.MouseDelta.y);
+                    const double plot_b = y_axis.PixelsToPlot(plot.PlotRect.Max.y - IO.MouseDelta.y);
+                    y_axis.SetMin(y_axis.IsInverted() ? plot_t : plot_b);
+                    y_axis.SetMax(y_axis.IsInverted() ? plot_b : plot_t);
+                    if (axis_equal && y_axis.OrthoAxis != nullptr)
+                        y_axis.OrthoAxis->SetAspect(y_axis.GetAspect());
+                    changed = true;
+                }
+            }
+        }
+        if (IO.MouseDragMaxDistanceSqr[gp.InputMap.Pan] > MOUSE_CURSOR_DRAG_THRESHOLD) {
+            switch (drag_direction) {
+                case 0        : ImGui::SetMouseCursor(ImGuiMouseCursor_NotAllowed); break;
+                case (1 << 1) : ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeEW);   break;
+                case (1 << 2) : ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeNS);   break;
+                default       : ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeAll);  break;
+            }
+        }
+    }
+
+    // SCROLL INPUT -----------------------------------------------------------
+
+    if (any_hov && ImHasFlag(IO.KeyMods, gp.InputMap.ZoomMod)) {
+
+        float zoom_rate = gp.InputMap.ZoomRate;
+        if (IO.MouseWheel == 0.0f)
+            zoom_rate = 0;
+        else if (IO.MouseWheel > 0)
+            zoom_rate = (-zoom_rate) / (1.0f + (2.0f * zoom_rate));
+        ImVec2 rect_size = plot.PlotRect.GetSize();
+        float tx = ImRemap(IO.MousePos.x, plot.PlotRect.Min.x, plot.PlotRect.Max.x, 0.0f, 1.0f);
+        float ty = ImRemap(IO.MousePos.y, plot.PlotRect.Min.y, plot.PlotRect.Max.y, 0.0f, 1.0f);
+
+        // Track which axis to use as reference for equal aspect
+        ImPlotAxis* equal_ref_axis = nullptr;
+
+        for (int i = 0; i < IMPLOT_NUM_X_AXES; i++) {
+            ImPlotAxis& x_axis = plot.XAxis(i);
+            const bool equal_zoom   = axis_equal && x_axis.OrthoAxis != nullptr;
+            const bool equal_locked = (equal_zoom != false) && x_axis.OrthoAxis->IsInputLocked();
+            if (x_hov[i] && !x_axis.IsInputLocked() && !equal_locked) {
+                ImGui::SetKeyOwner(ImGuiKey_MouseWheelY, plot.ID);
+                if (zoom_rate != 0.0f) {
+                    const double plot_l = x_axis.PixelsToPlot(plot.PlotRect.Min.x - rect_size.x * tx * zoom_rate);
+                    const double plot_r = x_axis.PixelsToPlot(plot.PlotRect.Max.x + rect_size.x * (1 - tx) * zoom_rate);
+                    x_axis.SetMin(x_axis.IsInverted() ? plot_r : plot_l);
+                    x_axis.SetMax(x_axis.IsInverted() ? plot_l : plot_r);
+                    if (equal_zoom)
+                        equal_ref_axis = &x_axis;
+                    changed = true;
+                }
+            }
+        }
+        for (int i = 0; i < IMPLOT_NUM_Y_AXES; i++) {
+            ImPlotAxis& y_axis = plot.YAxis(i);
+            const bool equal_zoom   = axis_equal && y_axis.OrthoAxis != nullptr;
+            const bool equal_locked = equal_zoom && y_axis.OrthoAxis->IsInputLocked();
+            if (y_hov[i] && !y_axis.IsInputLocked() && !equal_locked) {
+                ImGui::SetKeyOwner(ImGuiKey_MouseWheelY, plot.ID);
+                if (zoom_rate != 0.0f) {
+                    const double plot_t = y_axis.PixelsToPlot(plot.PlotRect.Min.y - rect_size.y * ty * zoom_rate);
+                    const double plot_b = y_axis.PixelsToPlot(plot.PlotRect.Max.y + rect_size.y * (1 - ty) * zoom_rate);
+                    y_axis.SetMin(y_axis.IsInverted() ? plot_t : plot_b);
+                    y_axis.SetMax(y_axis.IsInverted() ? plot_b : plot_t);
+                    if (equal_zoom)
+                        equal_ref_axis = &y_axis;
+                    changed = true;
+                }
+            }
+        }
+
+        // Apply equal aspect constraint after zooming both axes
+        if (equal_ref_axis != nullptr && equal_ref_axis->OrthoAxis != nullptr) {
+            equal_ref_axis->OrthoAxis->SetAspect(equal_ref_axis->GetAspect());
+        }
+    }
+
+    // BOX-SELECTION ----------------------------------------------------------
+
+    if (plot.Selecting) {
+        const ImVec2 d = plot.SelectStart - IO.MousePos;
+        const bool x_can_change = !ImHasFlag(IO.KeyMods,gp.InputMap.SelectHorzMod) && ImFabs(d.x) > 2;
+        const bool y_can_change = !ImHasFlag(IO.KeyMods,gp.InputMap.SelectVertMod) && ImFabs(d.y) > 2;
+        // confirm
+        if (IO.MouseReleased[gp.InputMap.Select]) {
+            for (int i = 0; i < IMPLOT_NUM_X_AXES; i++) {
+                ImPlotAxis& x_axis = plot.XAxis(i);
+                if (!x_axis.IsInputLocked() && x_can_change) {
+                    const double p1 = x_axis.PixelsToPlot(plot.SelectStart.x);
+                    const double p2 = x_axis.PixelsToPlot(IO.MousePos.x);
+                    x_axis.SetMin(ImMin(p1, p2));
+                    x_axis.SetMax(ImMax(p1, p2));
+                    changed = true;
+                }
+            }
+            for (int i = 0; i < IMPLOT_NUM_Y_AXES; i++) {
+                ImPlotAxis& y_axis = plot.YAxis(i);
+                if (!y_axis.IsInputLocked() && y_can_change) {
+                    const double p1 = y_axis.PixelsToPlot(plot.SelectStart.y);
+                    const double p2 = y_axis.PixelsToPlot(IO.MousePos.y);
+                    y_axis.SetMin(ImMin(p1, p2));
+                    y_axis.SetMax(ImMax(p1, p2));
+                    changed = true;
+                }
+            }
+            if (x_can_change || y_can_change || (ImHasFlag(IO.KeyMods,gp.InputMap.SelectHorzMod) && ImHasFlag(IO.KeyMods,gp.InputMap.SelectVertMod)))
+                gp.OpenContextThisFrame = false;
+            plot.Selected = plot.Selecting = false;
+        }
+        // cancel
+        else if (IO.MouseReleased[gp.InputMap.SelectCancel]) {
+            plot.Selected = plot.Selecting = false;
+            gp.OpenContextThisFrame = false;
+        }
+        else if (ImLengthSqr(d) > BOX_SELECT_DRAG_THRESHOLD) {
+            // bad selection
+            if (plot.IsInputLocked()) {
+                ImGui::SetMouseCursor(ImGuiMouseCursor_NotAllowed);
+                gp.OpenContextThisFrame = false;
+                plot.Selected      = false;
+            }
+            else {
+                // TODO: Handle only min or max locked cases
+                const bool full_width  = ImHasFlag(IO.KeyMods, gp.InputMap.SelectHorzMod) || AllAxesInputLocked(&plot.Axes[ImAxis_X1], IMPLOT_NUM_X_AXES);
+                const bool full_height = ImHasFlag(IO.KeyMods, gp.InputMap.SelectVertMod) || AllAxesInputLocked(&plot.Axes[ImAxis_Y1], IMPLOT_NUM_Y_AXES);
+                plot.SelectRect.Min.x = full_width  ? plot.PlotRect.Min.x : ImMin(plot.SelectStart.x, IO.MousePos.x);
+                plot.SelectRect.Max.x = full_width  ? plot.PlotRect.Max.x : ImMax(plot.SelectStart.x, IO.MousePos.x);
+                plot.SelectRect.Min.y = full_height ? plot.PlotRect.Min.y : ImMin(plot.SelectStart.y, IO.MousePos.y);
+                plot.SelectRect.Max.y = full_height ? plot.PlotRect.Max.y : ImMax(plot.SelectStart.y, IO.MousePos.y);
+                plot.SelectRect.Min  -= plot.PlotRect.Min;
+                plot.SelectRect.Max  -= plot.PlotRect.Min;
+                plot.Selected = true;
+            }
+        }
+        else {
+            plot.Selected = false;
+        }
+    }
+    return changed;
+}
+
+//-----------------------------------------------------------------------------
+// Next Plot Data (Legacy)
+//-----------------------------------------------------------------------------
+
+void ApplyNextPlotData(ImAxis idx) {
+    ImPlotContext& gp = *GImPlot;
+    ImPlotPlot& plot  = *gp.CurrentPlot;
+    ImPlotAxis& axis  = plot.Axes[idx];
+    if (!axis.Enabled)
+        return;
+    double*     npd_lmin = gp.NextPlotData.LinkedMin[idx];
+    double*     npd_lmax = gp.NextPlotData.LinkedMax[idx];
+    bool        npd_rngh = gp.NextPlotData.HasRange[idx];
+    ImPlotCond  npd_rngc = gp.NextPlotData.RangeCond[idx];
+    ImPlotRange     npd_rngv = gp.NextPlotData.Range[idx];
+    axis.LinkedMin = npd_lmin;
+    axis.LinkedMax = npd_lmax;
+    axis.PullLinks();
+    if (npd_rngh) {
+        if (!plot.Initialized || npd_rngc == ImPlotCond_Always)
+            axis.SetRange(npd_rngv);
+    }
+    axis.HasRange         = npd_rngh;
+    axis.RangeCond        = npd_rngc;
+}
+
+//-----------------------------------------------------------------------------
+// Setup
+//-----------------------------------------------------------------------------
+
+void SetupAxis(ImAxis idx, const char* label, ImPlotAxisFlags flags) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked,
+                         "Setup needs to be called after BeginPlot and before any setup locking functions (e.g. PlotX)!");
+    // get plot and axis
+    ImPlotPlot& plot = *gp.CurrentPlot;
+    ImPlotAxis& axis = plot.Axes[idx];
+    // set ID
+    axis.ID = plot.ID + idx + 1;
+    // check and set flags
+    if (plot.JustCreated || flags != axis.PreviousFlags)
+        axis.Flags = flags;
+    axis.PreviousFlags = flags;
+    // enable axis
+    axis.Enabled = true;
+    // set label
+    plot.SetAxisLabel(axis,label);
+    // cache colors
+    UpdateAxisColors(axis);
+}
+
+void SetupAxisLimits(ImAxis idx, double min_lim, double max_lim, ImPlotCond cond) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked,
+                         "Setup needs to be called after BeginPlot and before any setup locking functions (e.g. PlotX)!");    // get plot and axis
+    ImPlotPlot& plot = *gp.CurrentPlot;
+    ImPlotAxis& axis = plot.Axes[idx];
+    IM_ASSERT_USER_ERROR(axis.Enabled, "Axis is not enabled! Did you forget to call SetupAxis()?");
+    if (!plot.Initialized || cond == ImPlotCond_Always)
+        axis.SetRange(min_lim, max_lim);
+    axis.HasRange  = true;
+    axis.RangeCond = cond;
+}
+
+void SetupAxisFormat(ImAxis idx, const char* fmt) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked,
+                         "Setup needs to be called after BeginPlot and before any setup locking functions (e.g. PlotX)!");
+    ImPlotPlot& plot = *gp.CurrentPlot;
+    ImPlotAxis& axis = plot.Axes[idx];
+    IM_ASSERT_USER_ERROR(axis.Enabled, "Axis is not enabled! Did you forget to call SetupAxis()?");
+    axis.HasFormatSpec = fmt != nullptr;
+    if (fmt != nullptr)
+        ImStrncpy(axis.FormatSpec,fmt,sizeof(axis.FormatSpec));
+}
+
+void SetupAxisLinks(ImAxis idx, double* min_lnk, double* max_lnk) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked,
+                         "Setup needs to be called after BeginPlot and before any setup locking functions (e.g. PlotX)!");
+    ImPlotPlot& plot = *gp.CurrentPlot;
+    ImPlotAxis& axis = plot.Axes[idx];
+    IM_ASSERT_USER_ERROR(axis.Enabled, "Axis is not enabled! Did you forget to call SetupAxis()?");
+    axis.LinkedMin = min_lnk;
+    axis.LinkedMax = max_lnk;
+    axis.PullLinks();
+}
+
+void SetupAxisFormat(ImAxis idx, ImPlotFormatter formatter, void* data) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked,
+                         "Setup needs to be called after BeginPlot and before any setup locking functions (e.g. PlotX)!");
+    ImPlotPlot& plot = *gp.CurrentPlot;
+    ImPlotAxis& axis = plot.Axes[idx];
+    IM_ASSERT_USER_ERROR(axis.Enabled, "Axis is not enabled! Did you forget to call SetupAxis()?");
+    axis.Formatter = formatter;
+    axis.FormatterData = data;
+}
+
+void SetupAxisTicks(ImAxis idx, const double* values, int n_ticks, const char* const labels[], bool show_default) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked,
+                        "Setup needs to be called after BeginPlot and before any setup locking functions (e.g. PlotX)!");
+    ImPlotPlot& plot = *gp.CurrentPlot;
+    ImPlotAxis& axis = plot.Axes[idx];
+    IM_ASSERT_USER_ERROR(axis.Enabled, "Axis is not enabled! Did you forget to call SetupAxis()?");
+    axis.ShowDefaultTicks = show_default;
+    AddTicksCustom(values,
+                  labels,
+                  n_ticks,
+                  axis.Ticker,
+                  axis.Formatter ? axis.Formatter : Formatter_Default,
+                  (axis.Formatter && axis.FormatterData) ? axis.FormatterData : axis.HasFormatSpec ? axis.FormatSpec : (void*)IMPLOT_LABEL_FORMAT);
+}
+
+void SetupAxisTicks(ImAxis idx, double v_min, double v_max, int n_ticks, const char* const labels[], bool show_default) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked,
+                         "Setup needs to be called after BeginPlot and before any setup locking functions (e.g. PlotX)!");
+    IM_ASSERT_USER_ERROR(labels == nullptr || n_ticks >= 2,
+                         "When providing custom labels, n_ticks must be at least 2!");
+    n_ticks = n_ticks < 2 ? 2 : n_ticks;
+    FillRange(gp.TempDouble1, n_ticks, v_min, v_max);
+    SetupAxisTicks(idx, gp.TempDouble1.Data, n_ticks, labels, show_default);
+}
+
+void SetupAxisScale(ImAxis idx, ImPlotScale scale) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked,
+                        "Setup needs to be called after BeginPlot and before any setup locking functions (e.g. PlotX)!");
+    ImPlotPlot& plot = *gp.CurrentPlot;
+    ImPlotAxis& axis = plot.Axes[idx];
+    IM_ASSERT_USER_ERROR(axis.Enabled, "Axis is not enabled! Did you forget to call SetupAxis()?");
+    axis.Scale = scale;
+    switch (scale)
+    {
+    case ImPlotScale_Time:
+        axis.TransformForward = nullptr;
+        axis.TransformInverse = nullptr;
+        axis.TransformData    = nullptr;
+        axis.Locator          = Locator_Time;
+        axis.ConstraintRange  = ImPlotRange(IMPLOT_MIN_TIME, IMPLOT_MAX_TIME);
+        axis.Ticker.Levels    = 2;
+        break;
+    case ImPlotScale_Log10:
+        axis.TransformForward = TransformForward_Log10;
+        axis.TransformInverse = TransformInverse_Log10;
+        axis.TransformData    = nullptr;
+        axis.Locator          = Locator_Log10;
+        axis.ConstraintRange  = ImPlotRange(DBL_MIN, INFINITY);
+        break;
+    case ImPlotScale_SymLog:
+        axis.TransformForward = TransformForward_SymLog;
+        axis.TransformInverse = TransformInverse_SymLog;
+        axis.TransformData    = nullptr;
+        axis.Locator          = Locator_SymLog;
+        axis.ConstraintRange  = ImPlotRange(-INFINITY, INFINITY);
+        break;
+    default:
+        axis.TransformForward = nullptr;
+        axis.TransformInverse = nullptr;
+        axis.TransformData    = nullptr;
+        axis.Locator          = nullptr;
+        axis.ConstraintRange  = ImPlotRange(-INFINITY, INFINITY);
+        break;
+    }
+}
+
+void SetupAxisScale(ImAxis idx, ImPlotTransform fwd, ImPlotTransform inv, void* data) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked,
+                        "Setup needs to be called after BeginPlot and before any setup locking functions (e.g. PlotX)!");
+    ImPlotPlot& plot = *gp.CurrentPlot;
+    ImPlotAxis& axis = plot.Axes[idx];
+    IM_ASSERT_USER_ERROR(axis.Enabled, "Axis is not enabled! Did you forget to call SetupAxis()?");
+    axis.Scale = IMPLOT_AUTO;
+    axis.TransformForward = fwd;
+    axis.TransformInverse = inv;
+    axis.TransformData = data;
+}
+
+void SetupAxisLimitsConstraints(ImAxis idx, double v_min, double v_max) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked,
+                        "Setup needs to be called after BeginPlot and before any setup locking functions (e.g. PlotX)!");
+    ImPlotPlot& plot = *gp.CurrentPlot;
+    ImPlotAxis& axis = plot.Axes[idx];
+    IM_ASSERT_USER_ERROR(axis.Enabled, "Axis is not enabled! Did you forget to call SetupAxis()?");
+    axis.ConstraintRange.Min = v_min;
+    axis.ConstraintRange.Max = v_max;
+}
+
+void SetupAxisZoomConstraints(ImAxis idx, double z_min, double z_max) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked,
+                        "Setup needs to be called after BeginPlot and before any setup locking functions (e.g. PlotX)!");
+    ImPlotPlot& plot = *gp.CurrentPlot;
+    ImPlotAxis& axis = plot.Axes[idx];
+    IM_ASSERT_USER_ERROR(axis.Enabled, "Axis is not enabled! Did you forget to call SetupAxis()?");
+    axis.ConstraintZoom.Min = z_min;
+    axis.ConstraintZoom.Max = z_max;
+}
+
+void SetupAxes(const char* x_label, const char* y_label, ImPlotAxisFlags x_flags, ImPlotAxisFlags y_flags) {
+    SetupAxis(ImAxis_X1, x_label, x_flags);
+    SetupAxis(ImAxis_Y1, y_label, y_flags);
+}
+
+void SetupAxesLimits(double x_min, double x_max, double y_min, double y_max, ImPlotCond cond) {
+    SetupAxisLimits(ImAxis_X1, x_min, x_max, cond);
+    SetupAxisLimits(ImAxis_Y1, y_min, y_max, cond);
+}
+
+void SetupLegend(ImPlotLocation location, ImPlotLegendFlags flags) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR((gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked) || (gp.CurrentSubplot != nullptr && gp.CurrentPlot == nullptr),
+                         "Setup needs to be called after BeginPlot or BeginSubplots and before any setup locking functions (e.g. PlotX)!");
+    if (gp.CurrentItems) {
+        ImPlotLegend& legend = gp.CurrentItems->Legend;
+        // check and set location
+        if (location != legend.PreviousLocation)
+            legend.Location = location;
+        legend.PreviousLocation = location;
+        // check and set flags
+        if (flags != legend.PreviousFlags)
+            legend.Flags = flags;
+        legend.PreviousFlags = flags;
+    }
+}
+
+void SetupMouseText(ImPlotLocation location, ImPlotMouseTextFlags flags) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked,
+                         "Setup needs to be called after BeginPlot and before any setup locking functions (e.g. PlotX)!");
+    gp.CurrentPlot->MouseTextLocation = location;
+    gp.CurrentPlot->MouseTextFlags = flags;
+}
+
+//-----------------------------------------------------------------------------
+// SetNext
+//-----------------------------------------------------------------------------
+
+void SetNextAxisLimits(ImAxis axis, double v_min, double v_max, ImPlotCond cond) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot == nullptr, "SetNextAxisLimits() needs to be called before BeginPlot()!");
+    IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags.
+    gp.NextPlotData.HasRange[axis]  = true;
+    gp.NextPlotData.RangeCond[axis] = cond;
+    gp.NextPlotData.Range[axis].Min = v_min;
+    gp.NextPlotData.Range[axis].Max = v_max;
+}
+
+void SetNextAxisLinks(ImAxis axis, double* link_min, double* link_max) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot == nullptr, "SetNextAxisLinks() needs to be called before BeginPlot()!");
+    gp.NextPlotData.LinkedMin[axis] = link_min;
+    gp.NextPlotData.LinkedMax[axis] = link_max;
+}
+
+void SetNextAxisToFit(ImAxis axis) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot == nullptr, "SetNextAxisToFit() needs to be called before BeginPlot()!");
+    gp.NextPlotData.Fit[axis] = true;
+}
+
+void SetNextAxesLimits(double x_min, double x_max, double y_min, double y_max, ImPlotCond cond) {
+    SetNextAxisLimits(ImAxis_X1, x_min, x_max, cond);
+    SetNextAxisLimits(ImAxis_Y1, y_min, y_max, cond);
+}
+
+void SetNextAxesToFit() {
+    for (int i = 0; i < ImAxis_COUNT; ++i)
+        SetNextAxisToFit(i);
+}
+
+//-----------------------------------------------------------------------------
+// BeginPlot
+//-----------------------------------------------------------------------------
+
+bool BeginPlot(const char* title_id, const ImVec2& size, ImPlotFlags flags) {
+    IM_ASSERT_USER_ERROR(GImPlot != nullptr, "No current context. Did you call ImPlot::CreateContext() or ImPlot::SetCurrentContext()?");
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot == nullptr, "Mismatched BeginPlot()/EndPlot()!");
+
+    // FRONT MATTER -----------------------------------------------------------
+
+    if (gp.CurrentSubplot != nullptr)
+        ImGui::PushID(gp.CurrentSubplot->CurrentIdx);
+
+    // get globals
+    ImGuiContext &G          = *GImGui;
+    ImGuiWindow* Window      = G.CurrentWindow;
+
+    // skip if needed
+    if (Window->SkipItems && !gp.CurrentSubplot) {
+        ResetCtxForNextPlot(GImPlot);
+        return false;
+    }
+
+    // ID and age (TODO: keep track of plot age in frames)
+    const ImGuiID ID         = Window->GetID(title_id);
+    const bool just_created  = gp.Plots.GetByKey(ID) == nullptr;
+    gp.CurrentPlot           = gp.Plots.GetOrAddByKey(ID);
+
+    ImPlotPlot &plot         = *gp.CurrentPlot;
+    plot.ID                  = ID;
+    plot.Items.ID            = ID - 1;
+    plot.JustCreated         = just_created;
+    plot.SetupLocked         = false;
+
+    // check flags
+    if (plot.JustCreated)
+        plot.Flags = flags;
+    else if (flags != plot.PreviousFlags)
+        plot.Flags = flags;
+    plot.PreviousFlags = flags;
+
+    // setup default axes
+    if (plot.JustCreated) {
+        SetupAxis(ImAxis_X1);
+        SetupAxis(ImAxis_Y1);
+    }
+
+    // reset axes
+    for (int i = 0; i < ImAxis_COUNT; ++i) {
+        plot.Axes[i].Reset();
+        UpdateAxisColors(plot.Axes[i]);
+    }
+    // ensure first axes enabled
+    plot.Axes[ImAxis_X1].Enabled = true;
+    plot.Axes[ImAxis_Y1].Enabled = true;
+    // set initial axes
+    plot.CurrentX = ImAxis_X1;
+    plot.CurrentY = ImAxis_Y1;
+
+    // process next plot data (legacy)
+    for (int i = 0; i < ImAxis_COUNT; ++i)
+        ApplyNextPlotData(i);
+
+    // clear text buffers
+    plot.ClearTextBuffer();
+    plot.SetTitle(title_id);
+
+    // set frame size
+    ImVec2 frame_size;
+    if (gp.CurrentSubplot != nullptr)
+        frame_size = gp.CurrentSubplot->CellSize;
+    else
+        frame_size = ImGui::CalcItemSize(size, gp.Style.PlotDefaultSize.x, gp.Style.PlotDefaultSize.y);
+
+    if (frame_size.x < gp.Style.PlotMinSize.x && (size.x < 0.0f || gp.CurrentSubplot != nullptr))
+        frame_size.x = gp.Style.PlotMinSize.x;
+    if (frame_size.y < gp.Style.PlotMinSize.y && (size.y < 0.0f || gp.CurrentSubplot != nullptr))
+        frame_size.y = gp.Style.PlotMinSize.y;
+
+    plot.FrameRect = ImRect(Window->DC.CursorPos, Window->DC.CursorPos + frame_size);
+    ImGui::ItemSize(plot.FrameRect);
+    if (!ImGui::ItemAdd(plot.FrameRect, plot.ID, &plot.FrameRect) && !gp.CurrentSubplot) {
+        ResetCtxForNextPlot(GImPlot);
+        return false;
+    }
+
+    // setup items (or dont)
+    if (gp.CurrentItems == nullptr)
+        gp.CurrentItems = &plot.Items;
+
+    return true;
+}
+
+//-----------------------------------------------------------------------------
+// SetupFinish
+//-----------------------------------------------------------------------------
+
+void SetupFinish() {
+    IM_ASSERT_USER_ERROR(GImPlot != nullptr, "No current context. Did you call ImPlot::CreateContext() or ImPlot::SetCurrentContext()?");
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "SetupFinish needs to be called after BeginPlot!");
+
+    ImGuiContext& G         = *GImGui;
+    ImDrawList& DrawList    = *G.CurrentWindow->DrawList;
+    const ImGuiStyle& Style = G.Style;
+
+    ImPlotPlot &plot  = *gp.CurrentPlot;
+
+    // lock setup
+    plot.SetupLocked = true;
+
+    // finalize axes and set default formatter/locator
+    for (int i = 0; i < ImAxis_COUNT; ++i) {
+        ImPlotAxis& axis = plot.Axes[i];
+        if (axis.Enabled) {
+            axis.Constrain();
+            if (!plot.Initialized && axis.CanInitFit())
+                plot.FitThisFrame = axis.FitThisFrame = true;
+        }
+        if (axis.Formatter == nullptr) {
+            axis.Formatter = Formatter_Default;
+            if (axis.HasFormatSpec)
+                axis.FormatterData = axis.FormatSpec;
+            else
+                axis.FormatterData = (void*)IMPLOT_LABEL_FORMAT;
+        }
+        if (axis.Locator == nullptr) {
+            axis.Locator = Locator_Default;
+        }
+    }
+
+    // setup nullptr orthogonal axes
+    const bool axis_equal = ImHasFlag(plot.Flags, ImPlotFlags_Equal);
+    for (int ix = ImAxis_X1, iy = ImAxis_Y1; ix < ImAxis_Y1 || iy < ImAxis_COUNT; ++ix, ++iy) {
+        ImPlotAxis& x_axis = plot.Axes[ix];
+        ImPlotAxis& y_axis = plot.Axes[iy];
+        if (x_axis.Enabled && y_axis.Enabled) {
+            if (x_axis.OrthoAxis == nullptr)
+                x_axis.OrthoAxis = &y_axis;
+            if (y_axis.OrthoAxis == nullptr)
+                y_axis.OrthoAxis = &x_axis;
+        }
+        else if (x_axis.Enabled)
+        {
+            if (x_axis.OrthoAxis == nullptr && !axis_equal)
+                x_axis.OrthoAxis = &plot.Axes[ImAxis_Y1];
+        }
+        else if (y_axis.Enabled) {
+            if (y_axis.OrthoAxis == nullptr && !axis_equal)
+                y_axis.OrthoAxis = &plot.Axes[ImAxis_X1];
+        }
+    }
+
+    // canvas/axes bb
+    plot.CanvasRect = ImRect(plot.FrameRect.Min + gp.Style.PlotPadding, plot.FrameRect.Max - gp.Style.PlotPadding);
+    plot.AxesRect   = plot.FrameRect;
+
+    // outside legend adjustments
+    if (!ImHasFlag(plot.Flags, ImPlotFlags_NoLegend) && plot.Items.GetLegendCount() > 0 && ImHasFlag(plot.Items.Legend.Flags, ImPlotLegendFlags_Outside)) {
+        ImPlotLegend& legend = plot.Items.Legend;
+        const bool horz = ImHasFlag(legend.Flags, ImPlotLegendFlags_Horizontal);
+        const ImVec2 legend_size = CalcLegendSize(plot.Items, gp.Style.LegendInnerPadding, gp.Style.LegendSpacing, !horz);
+        const bool west = ImHasFlag(legend.Location, ImPlotLocation_West) && !ImHasFlag(legend.Location, ImPlotLocation_East);
+        const bool east = ImHasFlag(legend.Location, ImPlotLocation_East) && !ImHasFlag(legend.Location, ImPlotLocation_West);
+        const bool north = ImHasFlag(legend.Location, ImPlotLocation_North) && !ImHasFlag(legend.Location, ImPlotLocation_South);
+        const bool south = ImHasFlag(legend.Location, ImPlotLocation_South) && !ImHasFlag(legend.Location, ImPlotLocation_North);
+        if ((west && !horz) || (west && horz && !north && !south)) {
+            plot.CanvasRect.Min.x += (legend_size.x + gp.Style.LegendPadding.x);
+            plot.AxesRect.Min.x   += (legend_size.x + gp.Style.PlotPadding.x);
+        }
+        if ((east && !horz) || (east && horz && !north && !south)) {
+            plot.CanvasRect.Max.x -= (legend_size.x + gp.Style.LegendPadding.x);
+            plot.AxesRect.Max.x   -= (legend_size.x + gp.Style.PlotPadding.x);
+        }
+        if ((north && horz) || (north && !horz && !west && !east)) {
+            plot.CanvasRect.Min.y += (legend_size.y + gp.Style.LegendPadding.y);
+            plot.AxesRect.Min.y   += (legend_size.y + gp.Style.PlotPadding.y);
+        }
+        if ((south && horz) || (south && !horz && !west && !east)) {
+            plot.CanvasRect.Max.y -= (legend_size.y + gp.Style.LegendPadding.y);
+            plot.AxesRect.Max.y   -= (legend_size.y + gp.Style.PlotPadding.y);
+        }
+    }
+
+    // plot bb
+    float pad_top = 0, pad_bot = 0, pad_left = 0, pad_right = 0;
+
+    // (0) calc top padding form title
+    ImVec2 title_size(0.0f, 0.0f);
+    if (plot.HasTitle())
+         title_size = ImGui::CalcTextSize(plot.GetTitle(), nullptr, true);
+    if (title_size.x > 0) {
+        pad_top += title_size.y + gp.Style.LabelPadding.y;
+        plot.AxesRect.Min.y += gp.Style.PlotPadding.y + pad_top;
+    }
+
+    // (1) calc addition top padding and bot padding
+    PadAndDatumAxesX(plot,pad_top,pad_bot,gp.CurrentAlignmentH);
+
+    const float plot_height = plot.CanvasRect.GetHeight() - pad_top - pad_bot;
+
+    // (2) get y tick labels (needed for left/right pad)
+    for (int i = 0; i < IMPLOT_NUM_Y_AXES; i++) {
+        ImPlotAxis& axis = plot.YAxis(i);
+        if (axis.WillRender() && axis.ShowDefaultTicks && plot_height > 0) {
+            axis.Locator(axis.Ticker, axis.Range, plot_height, true, axis.Formatter, axis.FormatterData);
+        }
+    }
+
+    // (3) calc left/right pad
+    PadAndDatumAxesY(plot,pad_left,pad_right,gp.CurrentAlignmentV);
+
+    const float plot_width = plot.CanvasRect.GetWidth() - pad_left - pad_right;
+
+    // (4) get x ticks
+    for (int i = 0; i < IMPLOT_NUM_X_AXES; i++) {
+        ImPlotAxis& axis = plot.XAxis(i);
+        if (axis.WillRender() && axis.ShowDefaultTicks && plot_width > 0) {
+            axis.Locator(axis.Ticker, axis.Range, plot_width, false, axis.Formatter, axis.FormatterData);
+        }
+    }
+
+    // (4.5) recalc padding now that we have actual X-axis tick labels (handles multi-line labels)
+    // Save title padding before resetting
+    const float title_pad = (title_size.x > 0) ? (title_size.y + gp.Style.LabelPadding.y) : 0.0f;
+    pad_top = title_pad;
+    pad_bot = 0;
+    PadAndDatumAxesX(plot,pad_top,pad_bot,gp.CurrentAlignmentH);
+    // Update AxesRect to account for title padding (was done in step 0)
+    if (title_size.x > 0) {
+        plot.AxesRect.Min.y = plot.FrameRect.Min.y + gp.Style.PlotPadding.y + title_pad;
+    }
+
+    // (5) calc plot bb
+    plot.PlotRect = ImRect(plot.CanvasRect.Min + ImVec2(pad_left, pad_top), plot.CanvasRect.Max - ImVec2(pad_right, pad_bot));
+
+    // HOVER------------------------------------------------------------
+
+    // axes hover rect, pixel ranges
+    for (int i = 0; i < IMPLOT_NUM_X_AXES; ++i) {
+        ImPlotAxis& xax = plot.XAxis(i);
+        xax.HoverRect   = ImRect(ImVec2(plot.PlotRect.Min.x, ImMin(xax.Datum1,xax.Datum2)),
+                                 ImVec2(plot.PlotRect.Max.x, ImMax(xax.Datum1,xax.Datum2)));
+        xax.PixelMin    = xax.IsInverted() ? plot.PlotRect.Max.x : plot.PlotRect.Min.x;
+        xax.PixelMax    = xax.IsInverted() ? plot.PlotRect.Min.x : plot.PlotRect.Max.x;
+        xax.UpdateTransformCache();
+    }
+
+    for (int i = 0; i < IMPLOT_NUM_Y_AXES; ++i) {
+        ImPlotAxis& yax = plot.YAxis(i);
+        yax.HoverRect   = ImRect(ImVec2(ImMin(yax.Datum1,yax.Datum2),plot.PlotRect.Min.y),
+                                 ImVec2(ImMax(yax.Datum1,yax.Datum2),plot.PlotRect.Max.y));
+        yax.PixelMin    = yax.IsInverted() ? plot.PlotRect.Min.y : plot.PlotRect.Max.y;
+        yax.PixelMax    = yax.IsInverted() ? plot.PlotRect.Max.y : plot.PlotRect.Min.y;
+        yax.UpdateTransformCache();
+    }
+    // Equal axis constraint. Must happen after we set Pixels
+    // constrain equal axes for primary x and y if not approximately equal
+    // constrains x to y since x pixel size depends on y labels width, and causes feedback loops in opposite case
+    if (axis_equal) {
+        for (int i = 0; i < IMPLOT_NUM_X_AXES; ++i) {
+            ImPlotAxis& x_axis = plot.XAxis(i);
+            if (x_axis.OrthoAxis == nullptr)
+                continue;
+            double xar = x_axis.GetAspect();
+            double yar = x_axis.OrthoAxis->GetAspect();
+            // edge case: user has set x range this frame, so fit y to x so that we honor their request for x range
+            // NB: because of feedback across several frames, the user's x request may not be perfectly honored
+            if (x_axis.HasRange)
+                x_axis.OrthoAxis->SetAspect(xar);
+            else if (!ImAlmostEqual(xar,yar) && !x_axis.OrthoAxis->IsInputLocked())
+                 x_axis.SetAspect(yar);
+        }
+    }
+
+    // INPUT ------------------------------------------------------------------
+    if (!ImHasFlag(plot.Flags, ImPlotFlags_NoInputs))
+        UpdateInput(plot);
+
+    // fit from FitNextPlotAxes or auto fit
+    for (int i = 0; i < ImAxis_COUNT; ++i) {
+        if (gp.NextPlotData.Fit[i] || plot.Axes[i].IsAutoFitting()) {
+            plot.FitThisFrame = true;
+            plot.Axes[i].FitThisFrame = true;
+        }
+    }
+
+    // RENDER -----------------------------------------------------------------
+
+    const float txt_height = ImGui::GetTextLineHeight();
+
+    // render frame
+    if (!ImHasFlag(plot.Flags, ImPlotFlags_NoFrame))
+        ImGui::RenderFrame(plot.FrameRect.Min, plot.FrameRect.Max, GetStyleColorU32(ImPlotCol_FrameBg), true, Style.FrameRounding);
+
+    // grid bg
+    DrawList.AddRectFilled(plot.PlotRect.Min, plot.PlotRect.Max, GetStyleColorU32(ImPlotCol_PlotBg));
+
+    // transform ticks
+    for (int i = 0; i < ImAxis_COUNT; i++) {
+        ImPlotAxis& axis = plot.Axes[i];
+        if (axis.WillRender()) {
+            for (int t = 0; t < axis.Ticker.TickCount(); t++) {
+                ImPlotTick& tk = axis.Ticker.Ticks[t];
+                tk.PixelPos = IM_ROUND(axis.PlotToPixels(tk.PlotPos));
+            }
+        }
+    }
+
+    // render grid (background)
+    for (int i = 0; i < IMPLOT_NUM_X_AXES; i++) {
+        ImPlotAxis& x_axis = plot.XAxis(i);
+        if (x_axis.Enabled && x_axis.HasGridLines() && !x_axis.IsForeground())
+            RenderGridLinesX(DrawList, x_axis.Ticker, plot.PlotRect, x_axis.ColorMaj, x_axis.ColorMin, gp.Style.MajorGridSize.x, gp.Style.MinorGridSize.x);
+    }
+    for (int i = 0; i < IMPLOT_NUM_Y_AXES; i++) {
+        ImPlotAxis& y_axis = plot.YAxis(i);
+        if (y_axis.Enabled && y_axis.HasGridLines() && !y_axis.IsForeground())
+            RenderGridLinesY(DrawList, y_axis.Ticker, plot.PlotRect,  y_axis.ColorMaj, y_axis.ColorMin, gp.Style.MajorGridSize.y, gp.Style.MinorGridSize.y);
+    }
+
+    // render x axis button, label, tick labels
+    for (int i = 0; i < IMPLOT_NUM_X_AXES; i++) {
+        ImPlotAxis& ax = plot.XAxis(i);
+        if (!ax.Enabled)
+            continue;
+        if ((ax.Hovered || ax.Held) && !plot.Held && !ImHasFlag(ax.Flags, ImPlotAxisFlags_NoHighlight))
+            DrawList.AddRectFilled(ax.HoverRect.Min, ax.HoverRect.Max, ax.Held ? ax.ColorAct : ax.ColorHov);
+        else if (ax.ColorHiLi != IM_COL32_BLACK_TRANS) {
+            DrawList.AddRectFilled(ax.HoverRect.Min, ax.HoverRect.Max, ax.ColorHiLi);
+            ax.ColorHiLi = IM_COL32_BLACK_TRANS;
+        }
+        else if (ax.ColorBg != IM_COL32_BLACK_TRANS) {
+            DrawList.AddRectFilled(ax.HoverRect.Min, ax.HoverRect.Max, ax.ColorBg);
+        }
+        const ImPlotTicker& tkr = ax.Ticker;
+        const bool opp = ax.IsOpposite();
+        if (ax.HasLabel()) {
+            const char* label        = plot.GetAxisLabel(ax);
+            const ImVec2 label_size  = ImGui::CalcTextSize(label);
+            const float label_offset = (ax.HasTickLabels() ? tkr.MaxSize.y + gp.Style.LabelPadding.y : 0.0f)
+                                     + (tkr.Levels - 1) * (txt_height + gp.Style.LabelPadding.y)
+                                     + gp.Style.LabelPadding.y;
+            const ImVec2 label_pos(plot.PlotRect.GetCenter().x - label_size.x * 0.5f,
+                                   opp ? ax.Datum1 - label_offset - label_size.y : ax.Datum1 + label_offset);
+            DrawList.AddText(label_pos, ax.ColorTxt, label);
+        }
+        if (ax.HasTickLabels()) {
+            for (int j = 0; j < tkr.TickCount(); ++j) {
+                const ImPlotTick& tk = tkr.Ticks[j];
+                const float datum = ax.Datum1 + (opp ? (-gp.Style.LabelPadding.y -txt_height -tk.Level * (txt_height + gp.Style.LabelPadding.y))
+                                                     : gp.Style.LabelPadding.y + tk.Level * (txt_height + gp.Style.LabelPadding.y));
+                if (tk.ShowLabel && tk.PixelPos >= plot.PlotRect.Min.x - 1 && tk.PixelPos <= plot.PlotRect.Max.x + 1) {
+                    ImVec2 start(tk.PixelPos - 0.5f * tk.LabelSize.x, datum);
+                    DrawList.AddText(start, ax.ColorTxt, tkr.GetText(j));
+                }
+            }
+        }
+    }
+
+    // render y axis button, label, tick labels
+    for (int i = 0; i < IMPLOT_NUM_Y_AXES; i++) {
+        ImPlotAxis& ax = plot.YAxis(i);
+        if (!ax.Enabled)
+            continue;
+        if ((ax.Hovered || ax.Held) && !plot.Held && !ImHasFlag(ax.Flags, ImPlotAxisFlags_NoHighlight))
+            DrawList.AddRectFilled(ax.HoverRect.Min, ax.HoverRect.Max, ax.Held ? ax.ColorAct : ax.ColorHov);
+        else if (ax.ColorHiLi != IM_COL32_BLACK_TRANS) {
+            DrawList.AddRectFilled(ax.HoverRect.Min, ax.HoverRect.Max, ax.ColorHiLi);
+            ax.ColorHiLi = IM_COL32_BLACK_TRANS;
+        }
+        else if (ax.ColorBg != IM_COL32_BLACK_TRANS) {
+            DrawList.AddRectFilled(ax.HoverRect.Min, ax.HoverRect.Max, ax.ColorBg);
+        }
+        const ImPlotTicker& tkr = ax.Ticker;
+        const bool opp = ax.IsOpposite();
+        if (ax.HasLabel()) {
+            const char* label        = plot.GetAxisLabel(ax);
+            const ImVec2 label_size  = CalcTextSizeVertical(label);
+            const float label_offset = (ax.HasTickLabels() ? tkr.MaxSize.x + gp.Style.LabelPadding.x : 0.0f)
+                                     + gp.Style.LabelPadding.x;
+            const ImVec2 label_pos(opp ? ax.Datum1 + label_offset : ax.Datum1 - label_offset - label_size.x,
+                                   plot.PlotRect.GetCenter().y + label_size.y * 0.5f);
+            AddTextVertical(&DrawList, label_pos, ax.ColorTxt, label);
+        }
+        if (ax.HasTickLabels()) {
+            for (int j = 0; j < tkr.TickCount(); ++j) {
+                const ImPlotTick& tk = tkr.Ticks[j];
+                const float datum = ax.Datum1 + (opp ? gp.Style.LabelPadding.x : (-gp.Style.LabelPadding.x - tk.LabelSize.x));
+                if (tk.ShowLabel && tk.PixelPos >= plot.PlotRect.Min.y - 1 && tk.PixelPos <= plot.PlotRect.Max.y + 1) {
+                    ImVec2 start(datum, tk.PixelPos - 0.5f * tk.LabelSize.y);
+                    DrawList.AddText(start, ax.ColorTxt, tkr.GetText(j));
+                }
+            }
+        }
+    }
+
+
+    // clear legend (TODO: put elsewhere)
+    plot.Items.Legend.Reset();
+    // push ID to set item hashes (NB: !!!THIS PROBABLY NEEDS TO BE IN BEGIN PLOT!!!!)
+    ImGui::PushOverrideID(gp.CurrentItems->ID);
+}
+
+//-----------------------------------------------------------------------------
+// EndPlot()
+//-----------------------------------------------------------------------------
+
+void EndPlot() {
+    IM_ASSERT_USER_ERROR(GImPlot != nullptr, "No current context. Did you call ImPlot::CreateContext() or ImPlot::SetCurrentContext()?");
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "Mismatched BeginPlot()/EndPlot()!");
+
+    SetupLock();
+
+    ImGuiContext &G       = *GImGui;
+    ImPlotPlot &plot      = *gp.CurrentPlot;
+    ImGuiWindow * Window  = G.CurrentWindow;
+    ImDrawList & DrawList = *Window->DrawList;
+    const ImGuiIO &   IO  = ImGui::GetIO();
+
+    // FINAL RENDER -----------------------------------------------------------
+
+    const bool render_border  = gp.Style.PlotBorderSize > 0 && GetStyleColorVec4(ImPlotCol_PlotBorder).w > 0;
+    const bool any_x_held = plot.Held    || AnyAxesHeld(&plot.Axes[ImAxis_X1], IMPLOT_NUM_X_AXES);
+    const bool any_y_held = plot.Held    || AnyAxesHeld(&plot.Axes[ImAxis_Y1], IMPLOT_NUM_Y_AXES);
+
+    ImGui::PushClipRect(plot.FrameRect.Min, plot.FrameRect.Max, true);
+
+    // render grid (foreground)
+    for (int i = 0; i < IMPLOT_NUM_X_AXES; i++) {
+        ImPlotAxis& x_axis = plot.XAxis(i);
+        if (x_axis.Enabled && x_axis.HasGridLines() && x_axis.IsForeground())
+            RenderGridLinesX(DrawList, x_axis.Ticker, plot.PlotRect, x_axis.ColorMaj, x_axis.ColorMin, gp.Style.MajorGridSize.x, gp.Style.MinorGridSize.x);
+    }
+    for (int i = 0; i < IMPLOT_NUM_Y_AXES; i++) {
+        ImPlotAxis& y_axis = plot.YAxis(i);
+        if (y_axis.Enabled && y_axis.HasGridLines() && y_axis.IsForeground())
+            RenderGridLinesY(DrawList, y_axis.Ticker, plot.PlotRect,  y_axis.ColorMaj, y_axis.ColorMin, gp.Style.MajorGridSize.y, gp.Style.MinorGridSize.y);
+    }
+
+
+    // render title
+    if (plot.HasTitle()) {
+        ImU32 col = GetStyleColorU32(ImPlotCol_TitleText);
+        AddTextCentered(&DrawList,ImVec2(plot.PlotRect.GetCenter().x, plot.CanvasRect.Min.y),col,plot.GetTitle());
+    }
+
+    // render x ticks
+    int count_B = 0, count_T = 0;
+    for (int i = 0; i < IMPLOT_NUM_X_AXES; i++) {
+        const ImPlotAxis& ax = plot.XAxis(i);
+        if (!ax.Enabled)
+            continue;
+        const ImPlotTicker& tkr = ax.Ticker;
+        const bool opp = ax.IsOpposite();
+        const bool aux = ((opp && count_T > 0)||(!opp && count_B > 0));
+        if (ax.HasTickMarks()) {
+            const float direction = opp ? 1.0f : -1.0f;
+            for (int j = 0; j < tkr.TickCount(); ++j) {
+                const ImPlotTick& tk = tkr.Ticks[j];
+                if (tk.Level != 0 || tk.PixelPos < plot.PlotRect.Min.x || tk.PixelPos > plot.PlotRect.Max.x)
+                    continue;
+                const ImVec2 start(tk.PixelPos, ax.Datum1);
+                const float len = (!aux && tk.Major) ? gp.Style.MajorTickLen.x  : gp.Style.MinorTickLen.x;
+                const float thk = (!aux && tk.Major) ? gp.Style.MajorTickSize.x : gp.Style.MinorTickSize.x;
+                AddLineV(&DrawList, start.x, start.y, start.y + direction*len, ax.ColorTick, thk);
+            }
+            if (aux || !render_border)
+                AddLineH(&DrawList, plot.PlotRect.Min.x,plot.PlotRect.Max.x,ax.Datum1, ax.ColorTick, gp.Style.MinorTickSize.x);
+        }
+        count_B += !opp;
+        count_T +=  opp;
+    }
+
+    // render y ticks
+    int count_L = 0, count_R = 0;
+    for (int i = 0; i < IMPLOT_NUM_Y_AXES; i++) {
+        const ImPlotAxis& ax = plot.YAxis(i);
+        if (!ax.Enabled)
+            continue;
+        const ImPlotTicker& tkr = ax.Ticker;
+        const bool opp = ax.IsOpposite();
+        const bool aux = ((opp && count_R > 0)||(!opp && count_L > 0));
+        if (ax.HasTickMarks()) {
+            const float direction = opp ? -1.0f : 1.0f;
+            for (int j = 0; j < tkr.TickCount(); ++j) {
+                const ImPlotTick& tk = tkr.Ticks[j];
+                if (tk.Level != 0 || tk.PixelPos < plot.PlotRect.Min.y || tk.PixelPos > plot.PlotRect.Max.y)
+                    continue;
+                const ImVec2 start(ax.Datum1, tk.PixelPos);
+                const float len = (!aux && tk.Major) ? gp.Style.MajorTickLen.y  : gp.Style.MinorTickLen.y;
+                const float thk = (!aux && tk.Major) ? gp.Style.MajorTickSize.y : gp.Style.MinorTickSize.y;
+                AddLineH(&DrawList, start.x, start.x + direction*len, start.y, ax.ColorTick, thk);
+            }
+            if (aux || !render_border)
+                AddLineV(&DrawList, ax.Datum1, plot.PlotRect.Min.y, plot.PlotRect.Max.y, ax.ColorTick, gp.Style.MinorTickSize.y);
+        }
+        count_L += !opp;
+        count_R +=  opp;
+    }
+    ImGui::PopClipRect();
+
+    // render annotations
+    PushPlotClipRect();
+    for (int i = 0; i < gp.Annotations.Size; ++i) {
+        const char* txt       = gp.Annotations.GetText(i);
+        ImPlotAnnotation& an  = gp.Annotations.Annotations[i];
+        const ImVec2 txt_size = ImGui::CalcTextSize(txt);
+        const ImVec2 size     = txt_size + gp.Style.AnnotationPadding * 2;
+        ImVec2 pos            = an.Pos;
+        if (an.Offset.x == 0)
+            pos.x -= size.x / 2;
+        else if (an.Offset.x > 0)
+            pos.x += an.Offset.x;
+        else
+            pos.x -= size.x - an.Offset.x;
+        if (an.Offset.y == 0)
+            pos.y -= size.y / 2;
+        else if (an.Offset.y > 0)
+            pos.y += an.Offset.y;
+        else
+            pos.y -= size.y - an.Offset.y;
+        if (an.Clamp)
+            pos = ClampLabelPos(pos, size, plot.PlotRect.Min, plot.PlotRect.Max);
+        ImRect rect(pos,pos+size);
+        if (an.Offset.x != 0 || an.Offset.y != 0) {
+            ImVec2 corners[4] = {rect.GetTL(), rect.GetTR(), rect.GetBR(), rect.GetBL()};
+            int min_corner = 0;
+            float min_len = FLT_MAX;
+            for (int c = 0; c < 4; ++c) {
+                float len = ImLengthSqr(an.Pos - corners[c]);
+                if (len < min_len) {
+                    min_corner = c;
+                    min_len = len;
+                }
+            }
+            DrawList.AddLine(an.Pos, corners[min_corner], an.ColorBg);
+        }
+        DrawList.AddRectFilled(rect.Min, rect.Max, an.ColorBg);
+        DrawList.AddText(pos + gp.Style.AnnotationPadding, an.ColorFg, txt);
+    }
+
+    // render selection
+    if (plot.Selected)
+        RenderSelectionRect(DrawList, plot.SelectRect.Min + plot.PlotRect.Min, plot.SelectRect.Max + plot.PlotRect.Min, GetStyleColorVec4(ImPlotCol_Selection));
+
+    // render crosshairs
+    if (ImHasFlag(plot.Flags, ImPlotFlags_Crosshairs) && plot.Hovered && !(any_x_held || any_y_held) && !plot.Selecting && !plot.Items.Legend.Hovered) {
+        ImGui::SetMouseCursor(ImGuiMouseCursor_None);
+        ImVec2 xy = IO.MousePos;
+        ImU32 col = GetStyleColorU32(ImPlotCol_Crosshairs);
+        AddLineH(&DrawList, plot.PlotRect.Min.x, xy.x - 5, xy.y, col);
+        AddLineH(&DrawList, xy.x + 5, plot.PlotRect.Max.x, xy.y, col);
+        AddLineV(&DrawList, xy.x, plot.PlotRect.Min.y, xy.y - 5, col);
+        AddLineV(&DrawList, xy.x, xy.y + 5, plot.PlotRect.Max.y, col);
+    }
+
+    // render mouse pos
+    if (!ImHasFlag(plot.Flags, ImPlotFlags_NoMouseText) && (plot.Hovered || ImHasFlag(plot.MouseTextFlags, ImPlotMouseTextFlags_ShowAlways))) {
+
+        const bool no_aux = ImHasFlag(plot.MouseTextFlags, ImPlotMouseTextFlags_NoAuxAxes);
+        const bool no_fmt = ImHasFlag(plot.MouseTextFlags, ImPlotMouseTextFlags_NoFormat);
+
+        ImGuiTextBuffer& builder = gp.MousePosStringBuilder;
+        builder.Buf.shrink(0);
+        char buff[IMPLOT_LABEL_MAX_SIZE];
+
+        const int num_x = no_aux ? 1 : IMPLOT_NUM_X_AXES;
+        for (int i = 0; i < num_x; ++i) {
+            ImPlotAxis& x_axis = plot.XAxis(i);
+            if (!x_axis.Enabled)
+                continue;
+            if (i > 0)
+                builder.append(", (");
+            double v = x_axis.PixelsToPlot(IO.MousePos.x);
+            if (no_fmt)
+                Formatter_Default(v,buff,IMPLOT_LABEL_MAX_SIZE,(void*)IMPLOT_LABEL_FORMAT);
+            else
+                LabelAxisValue(x_axis,v,buff,IMPLOT_LABEL_MAX_SIZE,true);
+            builder.append(buff);
+            if (i > 0)
+                builder.append(")");
+        }
+        builder.append(", ");
+        const int num_y = no_aux ? 1 : IMPLOT_NUM_Y_AXES;
+        for (int i = 0; i < num_y; ++i) {
+            ImPlotAxis& y_axis = plot.YAxis(i);
+            if (!y_axis.Enabled)
+                continue;
+            if (i > 0)
+                builder.append(", (");
+            double v = y_axis.PixelsToPlot(IO.MousePos.y);
+            if (no_fmt)
+                Formatter_Default(v,buff,IMPLOT_LABEL_MAX_SIZE,(void*)IMPLOT_LABEL_FORMAT);
+            else
+                LabelAxisValue(y_axis,v,buff,IMPLOT_LABEL_MAX_SIZE,true);
+            builder.append(buff);
+            if (i > 0)
+                builder.append(")");
+        }
+
+        if (!builder.empty()) {
+            const ImVec2 size = ImGui::CalcTextSize(builder.c_str());
+            const ImVec2 pos = GetLocationPos(plot.PlotRect, size, plot.MouseTextLocation, gp.Style.MousePosPadding);
+            DrawList.AddText(pos, GetStyleColorU32(ImPlotCol_InlayText), builder.c_str());
+        }
+    }
+    PopPlotClipRect();
+
+    // axis side switch
+    if (!plot.Held) {
+        ImVec2 mouse_pos = ImGui::GetIO().MousePos;
+        ImRect trigger_rect = plot.PlotRect;
+        trigger_rect.Expand(-10);
+        for (int i = 0; i < IMPLOT_NUM_X_AXES; ++i) {
+            ImPlotAxis& x_axis = plot.XAxis(i);
+            if (ImHasFlag(x_axis.Flags, ImPlotAxisFlags_NoSideSwitch))
+                continue;
+            if (x_axis.Held && plot.PlotRect.Contains(mouse_pos)) {
+                const bool opp = ImHasFlag(x_axis.Flags, ImPlotAxisFlags_Opposite);
+                if (!opp) {
+                    ImRect rect(plot.PlotRect.Min.x - 5, plot.PlotRect.Min.y - 5,
+                                plot.PlotRect.Max.x + 5, plot.PlotRect.Min.y + 5);
+                    if (mouse_pos.y < plot.PlotRect.Max.y - 10)
+                        DrawList.AddRectFilled(rect.Min, rect.Max, x_axis.ColorHov);
+                    if (rect.Contains(mouse_pos))
+                        x_axis.Flags |= ImPlotAxisFlags_Opposite;
+                }
+                else {
+                    ImRect rect(plot.PlotRect.Min.x - 5, plot.PlotRect.Max.y - 5,
+                                plot.PlotRect.Max.x + 5, plot.PlotRect.Max.y + 5);
+                    if (mouse_pos.y > plot.PlotRect.Min.y + 10)
+                        DrawList.AddRectFilled(rect.Min, rect.Max, x_axis.ColorHov);
+                    if (rect.Contains(mouse_pos))
+                        x_axis.Flags &= ~ImPlotAxisFlags_Opposite;
+                }
+            }
+        }
+        for (int i = 0; i < IMPLOT_NUM_Y_AXES; ++i) {
+            ImPlotAxis& y_axis = plot.YAxis(i);
+            if (ImHasFlag(y_axis.Flags, ImPlotAxisFlags_NoSideSwitch))
+                continue;
+            if (y_axis.Held && plot.PlotRect.Contains(mouse_pos)) {
+                const bool opp = ImHasFlag(y_axis.Flags, ImPlotAxisFlags_Opposite);
+                if (!opp) {
+                    ImRect rect(plot.PlotRect.Max.x - 5, plot.PlotRect.Min.y - 5,
+                                plot.PlotRect.Max.x + 5, plot.PlotRect.Max.y + 5);
+                    if (mouse_pos.x > plot.PlotRect.Min.x + 10)
+                        DrawList.AddRectFilled(rect.Min, rect.Max, y_axis.ColorHov);
+                    if (rect.Contains(mouse_pos))
+                        y_axis.Flags |= ImPlotAxisFlags_Opposite;
+                }
+                else {
+                    ImRect rect(plot.PlotRect.Min.x - 5, plot.PlotRect.Min.y - 5,
+                                plot.PlotRect.Min.x + 5, plot.PlotRect.Max.y + 5);
+                    if (mouse_pos.x < plot.PlotRect.Max.x - 10)
+                        DrawList.AddRectFilled(rect.Min, rect.Max, y_axis.ColorHov);
+                    if (rect.Contains(mouse_pos))
+                        y_axis.Flags &= ~ImPlotAxisFlags_Opposite;
+                }
+            }
+        }
+    }
+
+    // reset legend hovers
+    plot.Items.Legend.Hovered = false;
+    for (int i = 0; i < plot.Items.GetItemCount(); ++i)
+        plot.Items.GetItemByIndex(i)->LegendHovered = false;
+    // render legend
+    if (!ImHasFlag(plot.Flags, ImPlotFlags_NoLegend) && plot.Items.GetLegendCount() > 0) {
+        ImPlotLegend& legend = plot.Items.Legend;
+        const bool   legend_out  = ImHasFlag(legend.Flags, ImPlotLegendFlags_Outside);
+        const bool   legend_horz = ImHasFlag(legend.Flags, ImPlotLegendFlags_Horizontal);
+        const ImVec2 legend_size = CalcLegendSize(plot.Items, gp.Style.LegendInnerPadding, gp.Style.LegendSpacing, !legend_horz);
+        const ImVec2 legend_pos  = GetLocationPos(legend_out ? plot.FrameRect : plot.PlotRect,
+                                                  legend_size,
+                                                  legend.Location,
+                                                  legend_out ? gp.Style.PlotPadding : gp.Style.LegendPadding);
+        legend.Rect = ImRect(legend_pos, legend_pos + legend_size);
+        legend.RectClamped = legend.Rect;
+        const bool legend_scrollable = ClampLegendRect(legend.RectClamped,
+                                                        legend_out ? plot.FrameRect : plot.PlotRect,
+                                                        legend_out ? gp.Style.PlotPadding : gp.Style.LegendPadding
+                                                        );
+        const ImGuiButtonFlags legend_button_flags = ImGuiButtonFlags_AllowOverlap
+                                                    | ImGuiButtonFlags_PressedOnClick
+                                                    | ImGuiButtonFlags_PressedOnDoubleClick
+                                                    | ImGuiButtonFlags_MouseButtonLeft
+                                                    | ImGuiButtonFlags_MouseButtonRight
+                                                    | ImGuiButtonFlags_MouseButtonMiddle
+                                                    | ImGuiButtonFlags_FlattenChildren;
+        ImGui::KeepAliveID(plot.Items.ID);
+        ImGui::ButtonBehavior(legend.RectClamped, plot.Items.ID, &legend.Hovered, &legend.Held, legend_button_flags);
+        legend.Hovered = legend.Hovered || (ImGui::IsWindowHovered() && legend.RectClamped.Contains(IO.MousePos));
+
+        if (legend_scrollable) {
+            if (legend.Hovered) {
+                ImGui::SetKeyOwner(ImGuiKey_MouseWheelY, plot.Items.ID);
+                if (IO.MouseWheel != 0.0f) {
+                    ImVec2 max_step = legend.Rect.GetSize() * 0.67f;
+#if IMGUI_VERSION_NUM < 19172
+                    float font_size = ImGui::GetCurrentWindow()->CalcFontSize();
+#else
+                    float font_size = ImGui::GetCurrentWindow()->FontRefSize;
+#endif
+                    float scroll_step = ImFloor(ImMin(2 * font_size, max_step.x));
+                    legend.Scroll.x += scroll_step * IO.MouseWheel;
+                    legend.Scroll.y += scroll_step * IO.MouseWheel;
+                }
+            }
+            const ImVec2 min_scroll_offset = legend.RectClamped.GetSize() - legend.Rect.GetSize();
+            legend.Scroll.x = ImClamp(legend.Scroll.x, min_scroll_offset.x, 0.0f);
+            legend.Scroll.y = ImClamp(legend.Scroll.y, min_scroll_offset.y, 0.0f);
+            const ImVec2 scroll_offset = legend_horz ? ImVec2(legend.Scroll.x, 0) : ImVec2(0, legend.Scroll.y);
+            ImVec2 legend_offset = legend.RectClamped.Min - legend.Rect.Min + scroll_offset;
+            legend.Rect.Min += legend_offset;
+            legend.Rect.Max += legend_offset;
+        } else {
+            legend.Scroll = ImVec2(0,0);
+        }
+
+        const ImU32 col_bg  = GetStyleColorU32(ImPlotCol_LegendBg);
+        const ImU32 col_bd  = GetStyleColorU32(ImPlotCol_LegendBorder);
+        ImGui::PushClipRect(legend.RectClamped.Min, legend.RectClamped.Max, true);
+        DrawList.AddRectFilled(legend.RectClamped.Min, legend.RectClamped.Max, col_bg);
+        bool legend_contextable = ShowLegendEntries(plot.Items, legend.Rect, legend.Hovered, gp.Style.LegendInnerPadding, gp.Style.LegendSpacing, !legend_horz, DrawList)
+                                && !ImHasFlag(legend.Flags, ImPlotLegendFlags_NoMenus);
+        DrawList.AddRect(legend.RectClamped.Min, legend.RectClamped.Max, col_bd);
+        ImGui::PopClipRect();
+
+        // main ctx menu
+        if (gp.OpenContextThisFrame && legend_contextable && !ImHasFlag(plot.Flags, ImPlotFlags_NoMenus))
+            ImGui::OpenPopup("##LegendContext");
+
+        if (ImGui::BeginPopup("##LegendContext")) {
+            ImGui::Text("Legend"); ImGui::Separator();
+            if (ShowLegendContextMenu(legend, !ImHasFlag(plot.Flags, ImPlotFlags_NoLegend)))
+                ImFlipFlag(plot.Flags, ImPlotFlags_NoLegend);
+            ImGui::EndPopup();
+        }
+    }
+    else {
+        plot.Items.Legend.Rect = ImRect();
+    }
+
+    // render border
+#if IMGUI_VERSION_NUM < 19276
+    if (render_border)
+        DrawList.AddRect(plot.PlotRect.Min, plot.PlotRect.Max, GetStyleColorU32(ImPlotCol_PlotBorder), 0, ImDrawFlags_None, gp.Style.PlotBorderSize);
+#else
+    if (render_border)
+        DrawList.AddRect(plot.PlotRect.Min, plot.PlotRect.Max, GetStyleColorU32(ImPlotCol_PlotBorder), 0, gp.Style.PlotBorderSize, ImDrawFlags_None);
+#endif
+
+    // render tags
+    for (int i = 0; i < gp.Tags.Size; ++i) {
+        ImPlotTag& tag  = gp.Tags.Tags[i];
+        ImPlotAxis& axis = plot.Axes[tag.Axis];
+        if (!axis.Enabled || !axis.Range.Contains(tag.Value))
+            continue;
+        const char* txt = gp.Tags.GetText(i);
+        ImVec2 text_size = ImGui::CalcTextSize(txt);
+        ImVec2 size = text_size + gp.Style.AnnotationPadding * 2;
+        ImVec2 pos;
+        axis.Ticker.OverrideSizeLate(size);
+        float pix = IM_ROUND(axis.PlotToPixels(tag.Value));
+        if (axis.Vertical) {
+            if (axis.IsOpposite()) {
+                pos = ImVec2(axis.Datum1 + gp.Style.LabelPadding.x, pix - size.y * 0.5f);
+                DrawList.AddTriangleFilled(ImVec2(axis.Datum1,pix), pos, pos + ImVec2(0,size.y), tag.ColorBg);
+            }
+            else {
+                pos = ImVec2(axis.Datum1 - size.x - gp.Style.LabelPadding.x, pix - size.y * 0.5f);
+                DrawList.AddTriangleFilled(pos + ImVec2(size.x,0), ImVec2(axis.Datum1,pix), pos+size, tag.ColorBg);
+            }
+        }
+        else {
+            if (axis.IsOpposite()) {
+                pos = ImVec2(pix - size.x * 0.5f, axis.Datum1 - size.y - gp.Style.LabelPadding.y );
+                DrawList.AddTriangleFilled(pos + ImVec2(0,size.y), pos + size, ImVec2(pix,axis.Datum1), tag.ColorBg);
+            }
+            else {
+                pos = ImVec2(pix - size.x * 0.5f, axis.Datum1 + gp.Style.LabelPadding.y);
+                DrawList.AddTriangleFilled(pos, ImVec2(pix,axis.Datum1), pos + ImVec2(size.x, 0), tag.ColorBg);
+            }
+        }
+        DrawList.AddRectFilled(pos,pos+size,tag.ColorBg);
+        DrawList.AddText(pos+gp.Style.AnnotationPadding,tag.ColorFg,txt);
+    }
+
+    // FIT DATA --------------------------------------------------------------
+    const bool axis_equal = ImHasFlag(plot.Flags, ImPlotFlags_Equal);
+    if (plot.FitThisFrame) {
+        for (int i = 0; i < IMPLOT_NUM_X_AXES; i++) {
+            ImPlotAxis& x_axis = plot.XAxis(i);
+            if (x_axis.FitThisFrame) {
+                x_axis.ApplyFit(gp.Style.FitPadding.x);
+                if (axis_equal && x_axis.OrthoAxis != nullptr) {
+                    double aspect = x_axis.GetAspect();
+                    ImPlotAxis& y_axis = *x_axis.OrthoAxis;
+                    if (y_axis.FitThisFrame) {
+                        y_axis.ApplyFit(gp.Style.FitPadding.y);
+                        y_axis.FitThisFrame = false;
+                        aspect = ImMax(aspect, y_axis.GetAspect());
+                    }
+                    x_axis.SetAspect(aspect);
+                    y_axis.SetAspect(aspect);
+                }
+            }
+        }
+        for (int i = 0; i < IMPLOT_NUM_Y_AXES; i++) {
+            ImPlotAxis& y_axis = plot.YAxis(i);
+            if (y_axis.FitThisFrame) {
+                y_axis.ApplyFit(gp.Style.FitPadding.y);
+                if (axis_equal && y_axis.OrthoAxis != nullptr) {
+                    double aspect = y_axis.GetAspect();
+                    ImPlotAxis& x_axis = *y_axis.OrthoAxis;
+                    if (x_axis.FitThisFrame) {
+                        x_axis.ApplyFit(gp.Style.FitPadding.x);
+                        x_axis.FitThisFrame = false;
+                        aspect = ImMax(x_axis.GetAspect(), aspect);
+                    }
+                    x_axis.SetAspect(aspect);
+                    y_axis.SetAspect(aspect);
+                }
+            }
+        }
+        plot.FitThisFrame = false;
+    }
+
+    // CONTEXT MENUS -----------------------------------------------------------
+
+    ImGui::PushOverrideID(plot.ID);
+
+    const bool can_ctx = gp.OpenContextThisFrame &&
+                         !ImHasFlag(plot.Flags, ImPlotFlags_NoMenus) &&
+                         !plot.Items.Legend.Hovered;
+
+
+
+    // main ctx menu
+    if (can_ctx && plot.Hovered)
+        ImGui::OpenPopup("##PlotContext");
+    if (ImGui::BeginPopup("##PlotContext")) {
+        ShowPlotContextMenu(plot);
+        ImGui::EndPopup();
+    }
+
+    // axes ctx menus
+    for (int i = 0; i < IMPLOT_NUM_X_AXES; ++i) {
+        ImGui::PushID(i);
+        ImPlotAxis& x_axis = plot.XAxis(i);
+        if (can_ctx && x_axis.Hovered && x_axis.HasMenus())
+            ImGui::OpenPopup("##XContext");
+        if (ImGui::BeginPopup("##XContext")) {
+            ImGui::Text(x_axis.HasLabel() ? plot.GetAxisLabel(x_axis) :  i == 0 ? "X-Axis" : "X-Axis %d", i + 1);
+            ImGui::Separator();
+            ShowAxisContextMenu(x_axis, axis_equal ? x_axis.OrthoAxis : nullptr, true);
+            ImGui::EndPopup();
+        }
+        ImGui::PopID();
+    }
+    for (int i = 0; i < IMPLOT_NUM_Y_AXES; ++i) {
+        ImGui::PushID(i);
+        ImPlotAxis& y_axis = plot.YAxis(i);
+        if (can_ctx && y_axis.Hovered && y_axis.HasMenus())
+            ImGui::OpenPopup("##YContext");
+        if (ImGui::BeginPopup("##YContext")) {
+            ImGui::Text(y_axis.HasLabel() ? plot.GetAxisLabel(y_axis) : i == 0 ? "Y-Axis" : "Y-Axis %d", i + 1);
+            ImGui::Separator();
+            ShowAxisContextMenu(y_axis, axis_equal ? y_axis.OrthoAxis : nullptr, false);
+            ImGui::EndPopup();
+        }
+        ImGui::PopID();
+    }
+    ImGui::PopID();
+
+    // LINKED AXES ------------------------------------------------------------
+
+    for (int i = 0; i < ImAxis_COUNT; ++i)
+        plot.Axes[i].PushLinks();
+
+
+    // CLEANUP ----------------------------------------------------------------
+
+    // remove items
+    if (gp.CurrentItems == &plot.Items)
+        gp.CurrentItems = nullptr;
+    // reset the plot items for the next frame
+    for (int i = 0; i < plot.Items.GetItemCount(); ++i) {
+        plot.Items.GetItemByIndex(i)->SeenThisFrame = false;
+    }
+
+    // mark the plot as initialized, i.e. having made it through one frame completely
+    plot.Initialized = true;
+    // Pop ImGui::PushID at the end of BeginPlot
+    ImGui::PopID();
+    // Reset context for next plot
+    ResetCtxForNextPlot(GImPlot);
+
+    // setup next subplot
+    if (gp.CurrentSubplot != nullptr) {
+        ImGui::PopID();
+        SubplotNextCell();
+    }
+}
+
+//-----------------------------------------------------------------------------
+// BEGIN/END SUBPLOT
+//-----------------------------------------------------------------------------
+
+constexpr float SUBPLOT_BORDER_SIZE             = 1.0f;
+constexpr float SUBPLOT_SPLITTER_HALF_THICKNESS = 4.0f;
+constexpr float SUBPLOT_SPLITTER_FEEDBACK_TIMER = 0.06f;
+
+void SubplotSetCell(int row, int col) {
+    ImPlotContext& gp      = *GImPlot;
+    ImPlotSubplot& subplot = *gp.CurrentSubplot;
+    if (row >= subplot.Rows || col >= subplot.Cols)
+        return;
+    float xoff = 0;
+    float yoff = 0;
+    for (int c = 0; c < col; ++c)
+        xoff += subplot.ColRatios[c];
+    for (int r = 0; r < row; ++r)
+        yoff += subplot.RowRatios[r];
+    const ImVec2 grid_size = subplot.GridRect.GetSize();
+    ImVec2 cpos            = subplot.GridRect.Min + ImVec2(xoff*grid_size.x,yoff*grid_size.y);
+    cpos.x = IM_ROUND(cpos.x);
+    cpos.y = IM_ROUND(cpos.y);
+    ImGui::GetCurrentWindow()->DC.CursorPos =  cpos;
+    // set cell size
+    subplot.CellSize.x = IM_ROUND(subplot.GridRect.GetWidth()  * subplot.ColRatios[col]);
+    subplot.CellSize.y = IM_ROUND(subplot.GridRect.GetHeight() * subplot.RowRatios[row]);
+    // setup links
+    const bool lx = ImHasFlag(subplot.Flags, ImPlotSubplotFlags_LinkAllX);
+    const bool ly = ImHasFlag(subplot.Flags, ImPlotSubplotFlags_LinkAllY);
+    const bool lr = ImHasFlag(subplot.Flags, ImPlotSubplotFlags_LinkRows);
+    const bool lc = ImHasFlag(subplot.Flags, ImPlotSubplotFlags_LinkCols);
+
+    SetNextAxisLinks(ImAxis_X1, lx ? &subplot.ColLinkData[0].Min : lc ? &subplot.ColLinkData[col].Min : nullptr,
+                                lx ? &subplot.ColLinkData[0].Max : lc ? &subplot.ColLinkData[col].Max : nullptr);
+    SetNextAxisLinks(ImAxis_Y1, ly ? &subplot.RowLinkData[0].Min : lr ? &subplot.RowLinkData[row].Min : nullptr,
+                                ly ? &subplot.RowLinkData[0].Max : lr ? &subplot.RowLinkData[row].Max : nullptr);
+    // setup alignment
+    if (!ImHasFlag(subplot.Flags, ImPlotSubplotFlags_NoAlign)) {
+        gp.CurrentAlignmentH = &subplot.RowAlignmentData[row];
+        gp.CurrentAlignmentV = &subplot.ColAlignmentData[col];
+    }
+    // set idx
+    if (ImHasFlag(subplot.Flags, ImPlotSubplotFlags_ColMajor))
+        subplot.CurrentIdx = col * subplot.Rows + row;
+    else
+        subplot.CurrentIdx = row * subplot.Cols + col;
+}
+
+void SubplotSetCell(int idx) {
+    ImPlotContext& gp      = *GImPlot;
+    ImPlotSubplot& subplot = *gp.CurrentSubplot;
+    if (idx >= subplot.Rows * subplot.Cols)
+        return;
+    int row = 0, col = 0;
+    if (ImHasFlag(subplot.Flags, ImPlotSubplotFlags_ColMajor)) {
+        row = idx % subplot.Rows;
+        col = idx / subplot.Rows;
+    }
+    else {
+        row = idx / subplot.Cols;
+        col = idx % subplot.Cols;
+    }
+    return SubplotSetCell(row, col);
+}
+
+void SubplotNextCell() {
+    ImPlotContext& gp      = *GImPlot;
+    ImPlotSubplot& subplot = *gp.CurrentSubplot;
+    SubplotSetCell(++subplot.CurrentIdx);
+}
+
+bool BeginSubplots(const char* title, int rows, int cols, const ImVec2& size, ImPlotSubplotFlags flags, float* row_sizes, float* col_sizes) {
+    IM_ASSERT_USER_ERROR(rows > 0 && cols > 0, "Invalid sizing arguments!");
+    IM_ASSERT_USER_ERROR(GImPlot != nullptr, "No current context. Did you call ImPlot::CreateContext() or ImPlot::SetCurrentContext()?");
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentSubplot == nullptr, "Mismatched BeginSubplots()/EndSubplots()!");
+    ImGuiContext &G = *GImGui;
+    ImGuiWindow * Window = G.CurrentWindow;
+    if (Window->SkipItems)
+        return false;
+    const ImGuiID ID = Window->GetID(title);
+    bool just_created = gp.Subplots.GetByKey(ID) == nullptr;
+    gp.CurrentSubplot = gp.Subplots.GetOrAddByKey(ID);
+    ImPlotSubplot& subplot = *gp.CurrentSubplot;
+    subplot.ID       = ID;
+    subplot.Items.ID = ID - 1;
+    subplot.HasTitle = ImGui::FindRenderedTextEnd(title, nullptr) != title;
+    // push ID
+    ImGui::PushID(ID);
+
+    if (just_created)
+        subplot.Flags = flags;
+    else if (flags != subplot.PreviousFlags)
+        subplot.Flags = flags;
+    subplot.PreviousFlags = flags;
+
+    // check for change in rows and cols
+    if (subplot.Rows != rows || subplot.Cols != cols) {
+        subplot.RowAlignmentData.resize(rows);
+        subplot.RowLinkData.resize(rows);
+        subplot.RowRatios.resize(rows);
+        for (int r = 0; r < rows; ++r) {
+            subplot.RowAlignmentData[r].Reset();
+            subplot.RowLinkData[r] = ImPlotRange(0,1);
+            subplot.RowRatios[r] = 1.0f / rows;
+        }
+        subplot.ColAlignmentData.resize(cols);
+        subplot.ColLinkData.resize(cols);
+        subplot.ColRatios.resize(cols);
+        for (int c = 0; c < cols; ++c) {
+            subplot.ColAlignmentData[c].Reset();
+            subplot.ColLinkData[c] = ImPlotRange(0,1);
+            subplot.ColRatios[c] = 1.0f / cols;
+        }
+    }
+    // check incoming size requests
+    float row_sum = 0, col_sum = 0;
+    if (row_sizes != nullptr) {
+        row_sum = ImSum(row_sizes, rows);
+        for (int r = 0; r < rows; ++r)
+            subplot.RowRatios[r] = row_sizes[r] / row_sum;
+    }
+    if (col_sizes != nullptr) {
+        col_sum = ImSum(col_sizes, cols);
+        for (int c = 0; c < cols; ++c)
+            subplot.ColRatios[c] = col_sizes[c] / col_sum;
+    }
+    subplot.Rows = rows;
+    subplot.Cols = cols;
+
+    // calc plot frame sizes
+    ImVec2 title_size(0.0f, 0.0f);
+    if (!ImHasFlag(subplot.Flags, ImPlotSubplotFlags_NoTitle))
+         title_size = ImGui::CalcTextSize(title, nullptr, true);
+    const float pad_top = title_size.x > 0.0f ? title_size.y + gp.Style.LabelPadding.y : 0;
+    const ImVec2 half_pad = gp.Style.PlotPadding/2;
+    const ImVec2 frame_size = ImGui::CalcItemSize(size, gp.Style.PlotDefaultSize.x, gp.Style.PlotDefaultSize.y);
+    subplot.FrameRect = ImRect(Window->DC.CursorPos, Window->DC.CursorPos + frame_size);
+    subplot.GridRect.Min = subplot.FrameRect.Min + half_pad + ImVec2(0,pad_top);
+    subplot.GridRect.Max = subplot.FrameRect.Max - half_pad;
+    subplot.FrameHovered = subplot.FrameRect.Contains(ImGui::GetMousePos()) && ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows|ImGuiHoveredFlags_AllowWhenBlockedByActiveItem);
+
+    // outside legend adjustments (TODO: make function)
+    const bool share_items = ImHasFlag(subplot.Flags, ImPlotSubplotFlags_ShareItems);
+    if (share_items)
+        gp.CurrentItems = &subplot.Items;
+    if (share_items && !ImHasFlag(subplot.Flags, ImPlotSubplotFlags_NoLegend) && subplot.Items.GetLegendCount() > 0) {
+        ImPlotLegend& legend = subplot.Items.Legend;
+        const bool horz = ImHasFlag(legend.Flags, ImPlotLegendFlags_Horizontal);
+        const ImVec2 legend_size = CalcLegendSize(subplot.Items, gp.Style.LegendInnerPadding, gp.Style.LegendSpacing, !horz);
+        const bool west = ImHasFlag(legend.Location, ImPlotLocation_West) && !ImHasFlag(legend.Location, ImPlotLocation_East);
+        const bool east = ImHasFlag(legend.Location, ImPlotLocation_East) && !ImHasFlag(legend.Location, ImPlotLocation_West);
+        const bool north = ImHasFlag(legend.Location, ImPlotLocation_North) && !ImHasFlag(legend.Location, ImPlotLocation_South);
+        const bool south = ImHasFlag(legend.Location, ImPlotLocation_South) && !ImHasFlag(legend.Location, ImPlotLocation_North);
+        if ((west && !horz) || (west && horz && !north && !south))
+            subplot.GridRect.Min.x += (legend_size.x + gp.Style.LegendPadding.x);
+        if ((east && !horz) || (east && horz && !north && !south))
+            subplot.GridRect.Max.x -= (legend_size.x + gp.Style.LegendPadding.x);
+        if ((north && horz) || (north && !horz && !west && !east))
+            subplot.GridRect.Min.y += (legend_size.y + gp.Style.LegendPadding.y);
+        if ((south && horz) || (south && !horz && !west && !east))
+            subplot.GridRect.Max.y -= (legend_size.y + gp.Style.LegendPadding.y);
+    }
+
+    // render single background frame
+    ImGui::RenderFrame(subplot.FrameRect.Min, subplot.FrameRect.Max, GetStyleColorU32(ImPlotCol_FrameBg), true, ImGui::GetStyle().FrameRounding);
+    // render title
+    if (title_size.x > 0.0f && !ImHasFlag(subplot.Flags, ImPlotFlags_NoTitle)) {
+        const ImU32 col = GetStyleColorU32(ImPlotCol_TitleText);
+        AddTextCentered(ImGui::GetWindowDrawList(),ImVec2(subplot.GridRect.GetCenter().x, subplot.GridRect.Min.y - pad_top + half_pad.y),col,title);
+    }
+
+    // render splitters
+    if (!ImHasFlag(subplot.Flags, ImPlotSubplotFlags_NoResize)) {
+        ImDrawList& DrawList = *ImGui::GetWindowDrawList();
+        const ImU32 hov_col = ImGui::ColorConvertFloat4ToU32(GImGui->Style.Colors[ImGuiCol_SeparatorHovered]);
+        const ImU32 act_col = ImGui::ColorConvertFloat4ToU32(GImGui->Style.Colors[ImGuiCol_SeparatorActive]);
+        float xpos = subplot.GridRect.Min.x;
+        float ypos = subplot.GridRect.Min.y;
+        int separator = 1;
+        // bool pass = false;
+        for (int r = 0; r < subplot.Rows-1; ++r) {
+            ypos += subplot.RowRatios[r] * subplot.GridRect.GetHeight();
+            const ImGuiID sep_id = subplot.ID + separator;
+            ImGui::KeepAliveID(sep_id);
+            const ImRect sep_bb = ImRect(subplot.GridRect.Min.x, ypos-SUBPLOT_SPLITTER_HALF_THICKNESS, subplot.GridRect.Max.x, ypos+SUBPLOT_SPLITTER_HALF_THICKNESS);
+            bool sep_hov = false, sep_hld = false;
+            const bool sep_clk = ImGui::ButtonBehavior(sep_bb, sep_id, &sep_hov, &sep_hld, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick);
+            if ((sep_hov && G.HoveredIdTimer > SUBPLOT_SPLITTER_FEEDBACK_TIMER) || sep_hld) {
+                if (sep_clk && ImGui::IsMouseDoubleClicked(0)) {
+                    float p = (subplot.RowRatios[r] + subplot.RowRatios[r+1])/2;
+                    subplot.RowRatios[r] = subplot.RowRatios[r+1] = p;
+                }
+                if (sep_clk) {
+                    subplot.TempSizes[0] = subplot.RowRatios[r];
+                    subplot.TempSizes[1] = subplot.RowRatios[r+1];
+                }
+                if (sep_hld) {
+                    float dp = ImGui::GetMouseDragDelta(0).y  / subplot.GridRect.GetHeight();
+                    if (subplot.TempSizes[0] + dp > 0.1f && subplot.TempSizes[1] - dp > 0.1f) {
+                        subplot.RowRatios[r]   = subplot.TempSizes[0] + dp;
+                        subplot.RowRatios[r+1] = subplot.TempSizes[1] - dp;
+                    }
+                }
+                AddLineH(&DrawList, IM_ROUND(subplot.GridRect.Min.x), IM_ROUND(subplot.GridRect.Max.x),IM_ROUND(ypos),
+                                 sep_hld ? act_col : hov_col, SUBPLOT_BORDER_SIZE);
+                ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeNS);
+            }
+            separator++;
+        }
+        for (int c = 0; c < subplot.Cols-1; ++c) {
+            xpos += subplot.ColRatios[c] * subplot.GridRect.GetWidth();
+            const ImGuiID sep_id = subplot.ID + separator;
+            ImGui::KeepAliveID(sep_id);
+            const ImRect sep_bb = ImRect(xpos-SUBPLOT_SPLITTER_HALF_THICKNESS, subplot.GridRect.Min.y, xpos+SUBPLOT_SPLITTER_HALF_THICKNESS, subplot.GridRect.Max.y);
+            bool sep_hov = false, sep_hld = false;
+            const bool sep_clk = ImGui::ButtonBehavior(sep_bb, sep_id, &sep_hov, &sep_hld, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick);
+            if ((sep_hov && G.HoveredIdTimer > SUBPLOT_SPLITTER_FEEDBACK_TIMER) || sep_hld) {
+                if (sep_clk && ImGui::IsMouseDoubleClicked(0)) {
+                    float p = (subplot.ColRatios[c] + subplot.ColRatios[c+1])/2;
+                    subplot.ColRatios[c] = subplot.ColRatios[c+1] = p;
+                }
+                if (sep_clk) {
+                    subplot.TempSizes[0] = subplot.ColRatios[c];
+                    subplot.TempSizes[1] = subplot.ColRatios[c+1];
+                }
+                if (sep_hld) {
+                    float dp = ImGui::GetMouseDragDelta(0).x / subplot.GridRect.GetWidth();
+                    if (subplot.TempSizes[0] + dp > 0.1f && subplot.TempSizes[1] - dp > 0.1f) {
+                        subplot.ColRatios[c]   = subplot.TempSizes[0] + dp;
+                        subplot.ColRatios[c+1] = subplot.TempSizes[1] - dp;
+                    }
+                }
+                AddLineV(&DrawList, IM_ROUND(xpos),IM_ROUND(subplot.GridRect.Min.y),IM_ROUND(subplot.GridRect.Max.y),
+                                 sep_hld ? act_col : hov_col, SUBPLOT_BORDER_SIZE);
+                ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeEW);
+            }
+            separator++;
+        }
+    }
+
+    // set outgoing sizes
+    if (row_sizes != nullptr) {
+        for (int r = 0; r < rows; ++r)
+            row_sizes[r] = subplot.RowRatios[r] * row_sum;
+    }
+    if (col_sizes != nullptr) {
+        for (int c = 0; c < cols; ++c)
+            col_sizes[c] = subplot.ColRatios[c] * col_sum;
+    }
+
+    // push styling
+    PushStyleColor(ImPlotCol_FrameBg, IM_COL32_BLACK_TRANS);
+    PushStyleVar(ImPlotStyleVar_PlotPadding, half_pad);
+    PushStyleVar(ImPlotStyleVar_PlotMinSize, ImVec2(0,0));
+    ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize,0);
+
+    // set initial cursor pos
+    Window->DC.CursorPos = subplot.GridRect.Min;
+    // begin alignments
+    for (int r = 0; r < subplot.Rows; ++r)
+        subplot.RowAlignmentData[r].Begin();
+    for (int c = 0; c < subplot.Cols; ++c)
+        subplot.ColAlignmentData[c].Begin();
+    // clear legend data
+    subplot.Items.Legend.Reset();
+    // Setup first subplot
+    SubplotSetCell(0,0);
+    return true;
+}
+
+void EndSubplots() {
+    IM_ASSERT_USER_ERROR(GImPlot != nullptr, "No current context. Did you call ImPlot::CreateContext() or ImPlot::SetCurrentContext()?");
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentSubplot != nullptr, "Mismatched BeginSubplots()/EndSubplots()!");
+    ImPlotSubplot& subplot = *gp.CurrentSubplot;
+    const ImGuiIO& IO  = ImGui::GetIO();
+    // set alignments
+    for (int r = 0; r < subplot.Rows; ++r)
+        subplot.RowAlignmentData[r].End();
+    for (int c = 0; c < subplot.Cols; ++c)
+        subplot.ColAlignmentData[c].End();
+    // pop styling
+    PopStyleColor();
+    PopStyleVar();
+    PopStyleVar();
+    ImGui::PopStyleVar();
+    // legend
+    subplot.Items.Legend.Hovered = false;
+    for (int i = 0; i < subplot.Items.GetItemCount(); ++i)
+        subplot.Items.GetItemByIndex(i)->LegendHovered = false;
+    // render legend
+    const bool share_items = ImHasFlag(subplot.Flags, ImPlotSubplotFlags_ShareItems);
+    ImDrawList& DrawList = *ImGui::GetWindowDrawList();
+    if (share_items && !ImHasFlag(subplot.Flags, ImPlotSubplotFlags_NoLegend) && subplot.Items.GetLegendCount() > 0) {
+        ImPlotLegend& legend = subplot.Items.Legend;
+        const bool   legend_horz = ImHasFlag(legend.Flags, ImPlotLegendFlags_Horizontal);
+        const ImVec2 legend_size = CalcLegendSize(subplot.Items, gp.Style.LegendInnerPadding, gp.Style.LegendSpacing, !legend_horz);
+        const ImVec2 legend_pos  = GetLocationPos(subplot.FrameRect, legend_size, legend.Location, gp.Style.PlotPadding);
+        legend.Rect = ImRect(legend_pos, legend_pos + legend_size);
+        legend.RectClamped = legend.Rect;
+        const bool legend_scrollable = ClampLegendRect(legend.RectClamped,subplot.FrameRect, gp.Style.PlotPadding);
+        const ImGuiButtonFlags legend_button_flags = ImGuiButtonFlags_AllowOverlap
+                                                    | ImGuiButtonFlags_PressedOnClick
+                                                    | ImGuiButtonFlags_PressedOnDoubleClick
+                                                    | ImGuiButtonFlags_MouseButtonLeft
+                                                    | ImGuiButtonFlags_MouseButtonRight
+                                                    | ImGuiButtonFlags_MouseButtonMiddle
+                                                    | ImGuiButtonFlags_FlattenChildren;
+        ImGui::KeepAliveID(subplot.Items.ID);
+        ImGui::ButtonBehavior(legend.RectClamped, subplot.Items.ID, &legend.Hovered, &legend.Held, legend_button_flags);
+        legend.Hovered = legend.Hovered || (subplot.FrameHovered && legend.RectClamped.Contains(ImGui::GetIO().MousePos));
+
+        if (legend_scrollable) {
+            if (legend.Hovered) {
+                ImGui::SetKeyOwner(ImGuiKey_MouseWheelY, subplot.Items.ID);
+                if (IO.MouseWheel != 0.0f) {
+                    ImVec2 max_step = legend.Rect.GetSize() * 0.67f;
+#if IMGUI_VERSION_NUM < 19172
+                    float font_size = ImGui::GetCurrentWindow()->CalcFontSize();
+#else
+                    float font_size = ImGui::GetCurrentWindow()->FontRefSize;
+#endif
+                    float scroll_step = ImFloor(ImMin(2 * font_size, max_step.x));
+                    legend.Scroll.x += scroll_step * IO.MouseWheel;
+                    legend.Scroll.y += scroll_step * IO.MouseWheel;
+                }
+            }
+            const ImVec2 min_scroll_offset = legend.RectClamped.GetSize() - legend.Rect.GetSize();
+            legend.Scroll.x = ImClamp(legend.Scroll.x, min_scroll_offset.x, 0.0f);
+            legend.Scroll.y = ImClamp(legend.Scroll.y, min_scroll_offset.y, 0.0f);
+            const ImVec2 scroll_offset = legend_horz ? ImVec2(legend.Scroll.x, 0) : ImVec2(0, legend.Scroll.y);
+            ImVec2 legend_offset = legend.RectClamped.Min - legend.Rect.Min + scroll_offset;
+            legend.Rect.Min += legend_offset;
+            legend.Rect.Max += legend_offset;
+        } else {
+            legend.Scroll = ImVec2(0,0);
+        }
+
+        const ImU32 col_bg = GetStyleColorU32(ImPlotCol_LegendBg);
+        const ImU32 col_bd = GetStyleColorU32(ImPlotCol_LegendBorder);
+        ImGui::PushClipRect(legend.RectClamped.Min, legend.RectClamped.Max, true);
+        DrawList.AddRectFilled(legend.RectClamped.Min, legend.RectClamped.Max, col_bg);
+        bool legend_contextable = ShowLegendEntries(subplot.Items, legend.Rect, legend.Hovered, gp.Style.LegendInnerPadding, gp.Style.LegendSpacing, !legend_horz, DrawList)
+                                && !ImHasFlag(legend.Flags, ImPlotLegendFlags_NoMenus);
+        DrawList.AddRect(legend.RectClamped.Min, legend.RectClamped.Max, col_bd);
+        ImGui::PopClipRect();
+
+        if (legend_contextable && !ImHasFlag(subplot.Flags, ImPlotSubplotFlags_NoMenus) && ImGui::GetIO().MouseReleased[gp.InputMap.Menu])
+            ImGui::OpenPopup("##LegendContext");
+        if (ImGui::BeginPopup("##LegendContext")) {
+            ImGui::Text("Legend"); ImGui::Separator();
+            if (ShowLegendContextMenu(legend, !ImHasFlag(subplot.Flags, ImPlotFlags_NoLegend)))
+                ImFlipFlag(subplot.Flags, ImPlotFlags_NoLegend);
+            ImGui::EndPopup();
+        }
+    }
+    else {
+        subplot.Items.Legend.Rect = ImRect();
+    }
+    // remove items
+    if (gp.CurrentItems == &subplot.Items)
+        gp.CurrentItems = nullptr;
+    // reset the plot items for the next frame (TODO: put this elsewhere)
+    for (int i = 0; i < subplot.Items.GetItemCount(); ++i) {
+        subplot.Items.GetItemByIndex(i)->SeenThisFrame = false;
+    }
+    // pop id
+    ImGui::PopID();
+    // set DC back correctly
+    GImGui->CurrentWindow->DC.CursorPos = subplot.FrameRect.Min;
+    ImGui::Dummy(subplot.FrameRect.GetSize());
+    ResetCtxForNextSubplot(GImPlot);
+
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] Plot Utils
+//-----------------------------------------------------------------------------
+
+void SetAxis(ImAxis axis) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "SetAxis() needs to be called between BeginPlot() and EndPlot()!");
+    IM_ASSERT_USER_ERROR(axis >= ImAxis_X1 && axis < ImAxis_COUNT, "Axis index out of bounds!");
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot->Axes[axis].Enabled, "Axis is not enabled! Did you forget to call SetupAxis()?");
+    SetupLock();
+    if (axis < ImAxis_Y1)
+        gp.CurrentPlot->CurrentX = axis;
+    else
+        gp.CurrentPlot->CurrentY = axis;
+}
+
+void SetAxes(ImAxis x_idx, ImAxis y_idx) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "SetAxes() needs to be called between BeginPlot() and EndPlot()!");
+    IM_ASSERT_USER_ERROR(x_idx >= ImAxis_X1 && x_idx < ImAxis_Y1, "X-Axis index out of bounds!");
+    IM_ASSERT_USER_ERROR(y_idx >= ImAxis_Y1 && y_idx < ImAxis_COUNT, "Y-Axis index out of bounds!");
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot->Axes[x_idx].Enabled, "Axis is not enabled! Did you forget to call SetupAxis()?");
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot->Axes[y_idx].Enabled, "Axis is not enabled! Did you forget to call SetupAxis()?");
+    SetupLock();
+    gp.CurrentPlot->CurrentX = x_idx;
+    gp.CurrentPlot->CurrentY = y_idx;
+}
+
+ImPlotPoint PixelsToPlot(float x, float y, ImAxis x_idx, ImAxis y_idx) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "PixelsToPlot() needs to be called between BeginPlot() and EndPlot()!");
+    IM_ASSERT_USER_ERROR(x_idx == IMPLOT_AUTO || (x_idx >= ImAxis_X1 && x_idx < ImAxis_Y1),    "X-Axis index out of bounds!");
+    IM_ASSERT_USER_ERROR(y_idx == IMPLOT_AUTO || (y_idx >= ImAxis_Y1 && y_idx < ImAxis_COUNT), "Y-Axis index out of bounds!");
+    SetupLock();
+    ImPlotPlot& plot   = *gp.CurrentPlot;
+    ImPlotAxis& x_axis = x_idx == IMPLOT_AUTO ? plot.Axes[plot.CurrentX] : plot.Axes[x_idx];
+    ImPlotAxis& y_axis = y_idx == IMPLOT_AUTO ? plot.Axes[plot.CurrentY] : plot.Axes[y_idx];
+    return ImPlotPoint( x_axis.PixelsToPlot(x), y_axis.PixelsToPlot(y) );
+}
+
+ImPlotPoint PixelsToPlot(const ImVec2& pix, ImAxis x_idx, ImAxis y_idx) {
+    return PixelsToPlot(pix.x, pix.y, x_idx, y_idx);
+}
+
+ImVec2 PlotToPixels(double x, double y, ImAxis x_idx, ImAxis y_idx) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "PlotToPixels() needs to be called between BeginPlot() and EndPlot()!");
+    IM_ASSERT_USER_ERROR(x_idx == IMPLOT_AUTO || (x_idx >= ImAxis_X1 && x_idx < ImAxis_Y1),    "X-Axis index out of bounds!");
+    IM_ASSERT_USER_ERROR(y_idx == IMPLOT_AUTO || (y_idx >= ImAxis_Y1 && y_idx < ImAxis_COUNT), "Y-Axis index out of bounds!");
+    SetupLock();
+    ImPlotPlot& plot = *gp.CurrentPlot;
+    ImPlotAxis& x_axis = x_idx == IMPLOT_AUTO ? plot.Axes[plot.CurrentX] : plot.Axes[x_idx];
+    ImPlotAxis& y_axis = y_idx == IMPLOT_AUTO ? plot.Axes[plot.CurrentY] : plot.Axes[y_idx];
+    return ImVec2( x_axis.PlotToPixels(x), y_axis.PlotToPixels(y) );
+}
+
+ImVec2 PlotToPixels(const ImPlotPoint& plt, ImAxis x_idx, ImAxis y_idx) {
+    return PlotToPixels(plt.x, plt.y, x_idx, y_idx);
+}
+
+ImVec2 GetPlotPos() {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "GetPlotPos() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+    return gp.CurrentPlot->PlotRect.Min;
+}
+
+ImVec2 GetPlotSize() {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "GetPlotSize() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+    return gp.CurrentPlot->PlotRect.GetSize();
+}
+
+ImPlotPoint GetPlotMousePos(ImAxis x_idx, ImAxis y_idx) {
+    IM_ASSERT_USER_ERROR(GImPlot->CurrentPlot != nullptr, "GetPlotMousePos() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+    return PixelsToPlot(ImGui::GetMousePos(), x_idx, y_idx);
+}
+
+ImPlotRect GetPlotLimits(ImAxis x_idx, ImAxis y_idx) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "GetPlotLimits() needs to be called between BeginPlot() and EndPlot()!");
+    IM_ASSERT_USER_ERROR(x_idx == IMPLOT_AUTO || (x_idx >= ImAxis_X1 && x_idx < ImAxis_Y1),    "X-Axis index out of bounds!");
+    IM_ASSERT_USER_ERROR(y_idx == IMPLOT_AUTO || (y_idx >= ImAxis_Y1 && y_idx < ImAxis_COUNT), "Y-Axis index out of bounds!");
+    SetupLock();
+    ImPlotPlot& plot = *gp.CurrentPlot;
+    ImPlotAxis& x_axis = x_idx == IMPLOT_AUTO ? plot.Axes[plot.CurrentX] : plot.Axes[x_idx];
+    ImPlotAxis& y_axis = y_idx == IMPLOT_AUTO ? plot.Axes[plot.CurrentY] : plot.Axes[y_idx];
+    ImPlotRect limits;
+    limits.X = x_axis.Range;
+    limits.Y = y_axis.Range;
+    return limits;
+}
+
+bool IsPlotHovered() {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "IsPlotHovered() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+    return gp.CurrentPlot->Hovered;
+}
+
+bool IsAxisHovered(ImAxis axis) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "IsPlotXAxisHovered() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+    return gp.CurrentPlot->Axes[axis].Hovered;
+}
+
+bool IsSubplotsHovered() {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentSubplot != nullptr, "IsSubplotsHovered() needs to be called between BeginSubplots() and EndSubplots()!");
+    return gp.CurrentSubplot->FrameHovered;
+}
+
+bool IsPlotSelected() {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "IsPlotSelected() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+    return gp.CurrentPlot->Selected;
+}
+
+ImPlotRect GetPlotSelection(ImAxis x_idx, ImAxis y_idx) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "GetPlotSelection() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+    ImPlotPlot& plot = *gp.CurrentPlot;
+    if (!plot.Selected)
+        return ImPlotRect(0,0,0,0);
+    ImPlotPoint p1 = PixelsToPlot(plot.SelectRect.Min + plot.PlotRect.Min, x_idx, y_idx);
+    ImPlotPoint p2 = PixelsToPlot(plot.SelectRect.Max + plot.PlotRect.Min, x_idx, y_idx);
+    ImPlotRect result;
+    result.X.Min = ImMin(p1.x, p2.x);
+    result.X.Max = ImMax(p1.x, p2.x);
+    result.Y.Min = ImMin(p1.y, p2.y);
+    result.Y.Max = ImMax(p1.y, p2.y);
+    return result;
+}
+
+void CancelPlotSelection() {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "CancelPlotSelection() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+    ImPlotPlot& plot = *gp.CurrentPlot;
+    if (plot.Selected)
+        plot.Selected = plot.Selecting = false;
+}
+
+void HideNextItem(bool hidden, ImPlotCond cond) {
+    ImPlotContext& gp = *GImPlot;
+    gp.NextItemData.HasHidden  = true;
+    gp.NextItemData.Hidden     = hidden;
+    gp.NextItemData.HiddenCond = cond;
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] Plot Tools
+//-----------------------------------------------------------------------------
+
+void Annotation(double x, double y, const ImVec4& col, const ImVec2& offset, bool clamp, bool round) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "Annotation() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+    char x_buff[IMPLOT_LABEL_MAX_SIZE];
+    char y_buff[IMPLOT_LABEL_MAX_SIZE];
+    ImPlotAxis& x_axis = gp.CurrentPlot->Axes[gp.CurrentPlot->CurrentX];
+    ImPlotAxis& y_axis = gp.CurrentPlot->Axes[gp.CurrentPlot->CurrentY];
+    LabelAxisValue(x_axis, x, x_buff, sizeof(x_buff), round);
+    LabelAxisValue(y_axis, y, y_buff, sizeof(y_buff), round);
+    Annotation(x,y,col,offset,clamp,"%s, %s",x_buff,y_buff);
+}
+
+void AnnotationV(double x, double y, const ImVec4& col, const ImVec2& offset, bool clamp, const char* fmt, va_list args) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "Annotation() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+    ImVec2 pos = PlotToPixels(x,y,IMPLOT_AUTO,IMPLOT_AUTO);
+    ImU32  bg  = ImGui::GetColorU32(col);
+    ImU32  fg  = col.w == 0 ? GetStyleColorU32(ImPlotCol_InlayText) : CalcTextColor(col);
+    gp.Annotations.AppendV(pos, offset, bg, fg, clamp, fmt, args);
+}
+
+void Annotation(double x, double y, const ImVec4& col, const ImVec2& offset, bool clamp, const char* fmt, ...) {
+    va_list args;
+    va_start(args, fmt);
+    AnnotationV(x,y,col,offset,clamp,fmt,args);
+    va_end(args);
+}
+
+void TagV(ImAxis axis, double v, const ImVec4& col, const char* fmt, va_list args) {
+    ImPlotContext& gp = *GImPlot;
+    SetupLock();
+    ImU32 bg = ImGui::GetColorU32(col);
+    ImU32 fg = col.w == 0 ? GetStyleColorU32(ImPlotCol_AxisText) : CalcTextColor(col);
+    gp.Tags.AppendV(axis,v,bg,fg,fmt,args);
+}
+
+void Tag(ImAxis axis, double v, const ImVec4& col, const char* fmt, ...) {
+    va_list args;
+    va_start(args, fmt);
+    TagV(axis,v,col,fmt,args);
+    va_end(args);
+}
+
+void Tag(ImAxis axis, double v, const ImVec4& color, bool round) {
+    ImPlotContext& gp = *GImPlot;
+    SetupLock();
+    char buff[IMPLOT_LABEL_MAX_SIZE];
+    ImPlotAxis& ax = gp.CurrentPlot->Axes[axis];
+    LabelAxisValue(ax, v, buff, sizeof(buff), round);
+    Tag(axis,v,color,"%s",buff);
+}
+
+IMPLOT_API void TagX(double x, const ImVec4& color, bool round) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "TagX() needs to be called between BeginPlot() and EndPlot()!");
+    Tag(gp.CurrentPlot->CurrentX, x, color, round);
+}
+
+IMPLOT_API void TagX(double x, const ImVec4& color, const char* fmt, ...) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "TagX() needs to be called between BeginPlot() and EndPlot()!");
+    va_list args;
+    va_start(args, fmt);
+    TagV(gp.CurrentPlot->CurrentX,x,color,fmt,args);
+    va_end(args);
+}
+
+IMPLOT_API void TagXV(double x, const ImVec4& color, const char* fmt, va_list args) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "TagX() needs to be called between BeginPlot() and EndPlot()!");
+    TagV(gp.CurrentPlot->CurrentX, x, color, fmt, args);
+}
+
+IMPLOT_API void TagY(double y, const ImVec4& color, bool round) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "TagY() needs to be called between BeginPlot() and EndPlot()!");
+    Tag(gp.CurrentPlot->CurrentY, y, color, round);
+}
+
+IMPLOT_API void TagY(double y, const ImVec4& color, const char* fmt, ...) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "TagY() needs to be called between BeginPlot() and EndPlot()!");
+    va_list args;
+    va_start(args, fmt);
+    TagV(gp.CurrentPlot->CurrentY,y,color,fmt,args);
+    va_end(args);
+}
+
+IMPLOT_API void TagYV(double y, const ImVec4& color, const char* fmt, va_list args) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "TagY() needs to be called between BeginPlot() and EndPlot()!");
+    TagV(gp.CurrentPlot->CurrentY, y, color, fmt, args);
+}
+
+constexpr float DRAG_GRAB_HALF_SIZE = 4.0f;
+
+bool DragPoint(int n_id, double* x, double* y, const ImVec4& col, float radius, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held) {
+    ImGui::PushID("#IMPLOT_DRAG_POINT");
+    IM_ASSERT_USER_ERROR(GImPlot->CurrentPlot != nullptr, "DragPoint() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+
+    if (!ImHasFlag(flags,ImPlotDragToolFlags_NoFit) && FitThisFrame()) {
+        FitPoint(ImPlotPoint(*x,*y));
+    }
+
+    const bool input = !ImHasFlag(flags, ImPlotDragToolFlags_NoInputs);
+    const bool show_curs = !ImHasFlag(flags, ImPlotDragToolFlags_NoCursors);
+    const bool no_delay = !ImHasFlag(flags, ImPlotDragToolFlags_Delayed);
+    const float grab_half_size = ImMax(DRAG_GRAB_HALF_SIZE, radius);
+    const ImVec4 color = IsColorAuto(col) ? ImGui::GetStyleColorVec4(ImGuiCol_Text) : col;
+    const ImU32 col32 = ImGui::ColorConvertFloat4ToU32(color);
+
+    ImVec2 pos = PlotToPixels(*x,*y,IMPLOT_AUTO,IMPLOT_AUTO);
+    const ImGuiID id = ImGui::GetCurrentWindow()->GetID(n_id);
+    ImRect rect(pos.x-grab_half_size,pos.y-grab_half_size,pos.x+grab_half_size,pos.y+grab_half_size);
+    bool hovered = false, held = false;
+
+    ImGui::KeepAliveID(id);
+    if (input) {
+        bool clicked = ImGui::ButtonBehavior(rect,id,&hovered,&held);
+        if (out_clicked) *out_clicked = clicked;
+        if (out_hovered) *out_hovered = hovered;
+        if (out_held)    *out_held    = held;
+    }
+
+    bool modified = false;
+    if (held && ImGui::IsMouseDragging(0)) {
+        *x = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).x;
+        *y = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).y;
+        modified = true;
+    }
+
+    PushPlotClipRect();
+    ImDrawList& DrawList = *GetPlotDrawList();
+    if ((hovered || held) && show_curs)
+        ImGui::SetMouseCursor(ImGuiMouseCursor_Hand);
+    if (modified && no_delay)
+        pos = PlotToPixels(*x,*y,IMPLOT_AUTO,IMPLOT_AUTO);
+    DrawList.AddCircleFilled(pos, radius, col32);
+    PopPlotClipRect();
+
+    ImGui::PopID();
+    return modified;
+}
+
+bool DragLineX(int n_id, double* value, const ImVec4& col, float thickness, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held) {
+    // ImGui::PushID("#IMPLOT_DRAG_LINE_X");
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "DragLineX() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+
+    if (!ImHasFlag(flags,ImPlotDragToolFlags_NoFit) && FitThisFrame()) {
+        FitPointX(*value);
+    }
+
+    const bool input = !ImHasFlag(flags, ImPlotDragToolFlags_NoInputs);
+    const bool show_curs = !ImHasFlag(flags, ImPlotDragToolFlags_NoCursors);
+    const bool no_delay = !ImHasFlag(flags, ImPlotDragToolFlags_Delayed);
+    const float grab_half_size = ImMax(DRAG_GRAB_HALF_SIZE, thickness/2);
+    float yt = gp.CurrentPlot->PlotRect.Min.y;
+    float yb = gp.CurrentPlot->PlotRect.Max.y;
+    float x  = IM_ROUND(PlotToPixels(*value,0,IMPLOT_AUTO,IMPLOT_AUTO).x);
+    const ImGuiID id = ImGui::GetCurrentWindow()->GetID(n_id);
+    ImRect rect(x-grab_half_size,yt,x+grab_half_size,yb);
+    bool hovered = false, held = false;
+
+    ImGui::KeepAliveID(id);
+    if (input) {
+        bool clicked = ImGui::ButtonBehavior(rect,id,&hovered,&held);
+        if (out_clicked) *out_clicked = clicked;
+        if (out_hovered) *out_hovered = hovered;
+        if (out_held)    *out_held    = held;
+    }
+
+    if ((hovered || held) && show_curs)
+        ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeEW);
+
+    float len = gp.Style.MajorTickLen.x;
+    ImVec4 color = IsColorAuto(col) ? ImGui::GetStyleColorVec4(ImGuiCol_Text) : col;
+    ImU32 col32 = ImGui::ColorConvertFloat4ToU32(color);
+
+    bool modified = false;
+    if (held && ImGui::IsMouseDragging(0)) {
+        *value = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).x;
+        modified = true;
+    }
+
+    PushPlotClipRect();
+    ImDrawList& DrawList = *GetPlotDrawList();
+    if (modified && no_delay)
+        x  = IM_ROUND(PlotToPixels(*value,0,IMPLOT_AUTO,IMPLOT_AUTO).x);
+    AddLineV(&DrawList,x,yt,yb,     col32,   thickness);
+    AddLineV(&DrawList,x,yt,yt+len, col32, 3*thickness);
+    AddLineV(&DrawList,x,yb,yb-len, col32, 3*thickness);
+    PopPlotClipRect();
+
+    // ImGui::PopID();
+    return modified;
+}
+
+bool DragLineY(int n_id, double* value, const ImVec4& col, float thickness, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held) {
+    ImGui::PushID("#IMPLOT_DRAG_LINE_Y");
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "DragLineY() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+
+    if (!ImHasFlag(flags,ImPlotDragToolFlags_NoFit) && FitThisFrame()) {
+        FitPointY(*value);
+    }
+
+    const bool input = !ImHasFlag(flags, ImPlotDragToolFlags_NoInputs);
+    const bool show_curs = !ImHasFlag(flags, ImPlotDragToolFlags_NoCursors);
+    const bool no_delay = !ImHasFlag(flags, ImPlotDragToolFlags_Delayed);
+    const float grab_half_size = ImMax(DRAG_GRAB_HALF_SIZE, thickness/2);
+    float xl = gp.CurrentPlot->PlotRect.Min.x;
+    float xr = gp.CurrentPlot->PlotRect.Max.x;
+    float y  = IM_ROUND(PlotToPixels(0, *value,IMPLOT_AUTO,IMPLOT_AUTO).y);
+
+    const ImGuiID id = ImGui::GetCurrentWindow()->GetID(n_id);
+    ImRect rect(xl,y-grab_half_size,xr,y+grab_half_size);
+    bool hovered = false, held = false;
+
+    ImGui::KeepAliveID(id);
+    if (input) {
+        bool clicked = ImGui::ButtonBehavior(rect,id,&hovered,&held);
+        if (out_clicked) *out_clicked = clicked;
+        if (out_hovered) *out_hovered = hovered;
+        if (out_held)    *out_held    = held;
+    }
+
+    if ((hovered || held) && show_curs)
+        ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeNS);
+
+    float len = gp.Style.MajorTickLen.y;
+    ImVec4 color = IsColorAuto(col) ? ImGui::GetStyleColorVec4(ImGuiCol_Text) : col;
+    ImU32 col32 = ImGui::ColorConvertFloat4ToU32(color);
+
+    bool modified = false;
+    if (held && ImGui::IsMouseDragging(0)) {
+        *value = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).y;
+        modified = true;
+    }
+
+    PushPlotClipRect();
+    ImDrawList& DrawList = *GetPlotDrawList();
+    if (modified && no_delay)
+        y  = IM_ROUND(PlotToPixels(0, *value,IMPLOT_AUTO,IMPLOT_AUTO).y);
+    AddLineH(&DrawList,xl,xr,y,     col32,   thickness);
+    AddLineH(&DrawList,xl,xl+len,y, col32, 3*thickness);
+    AddLineH(&DrawList,xr,xr-len,y, col32, 3*thickness);
+    PopPlotClipRect();
+
+    ImGui::PopID();
+    return modified;
+}
+
+bool DragRect(int n_id, double* x_min, double* y_min, double* x_max, double* y_max, const ImVec4& col, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held) {
+    ImGui::PushID("#IMPLOT_DRAG_RECT");
+    IM_ASSERT_USER_ERROR(GImPlot->CurrentPlot != nullptr, "DragRect() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+
+    if (!ImHasFlag(flags,ImPlotDragToolFlags_NoFit) && FitThisFrame()) {
+        FitPoint(ImPlotPoint(*x_min,*y_min));
+        FitPoint(ImPlotPoint(*x_max,*y_max));
+    }
+
+    const bool input = !ImHasFlag(flags, ImPlotDragToolFlags_NoInputs);
+    const bool show_curs = !ImHasFlag(flags, ImPlotDragToolFlags_NoCursors);
+    const bool no_delay = !ImHasFlag(flags, ImPlotDragToolFlags_Delayed);
+    bool    h[] = {true,false,true,false};
+    double* x[] = {x_min,x_max,x_max,x_min};
+    double* y[] = {y_min,y_min,y_max,y_max};
+    ImVec2 p[4];
+    for (int i = 0; i < 4; ++i)
+        p[i] = PlotToPixels(*x[i],*y[i],IMPLOT_AUTO,IMPLOT_AUTO);
+    ImVec2 pc = PlotToPixels((*x_min+*x_max)/2,(*y_min+*y_max)/2,IMPLOT_AUTO,IMPLOT_AUTO);
+    ImRect rect(ImMin(p[0],p[2]),ImMax(p[0],p[2]));
+    ImRect rect_grab = rect; rect_grab.Expand(DRAG_GRAB_HALF_SIZE);
+
+    ImGuiMouseCursor cur[4];
+    if (show_curs) {
+        cur[0] = (rect.Min.x == p[0].x && rect.Min.y == p[0].y) || (rect.Max.x == p[0].x && rect.Max.y == p[0].y) ? ImGuiMouseCursor_ResizeNWSE : ImGuiMouseCursor_ResizeNESW;
+        cur[1] = cur[0] == ImGuiMouseCursor_ResizeNWSE ? ImGuiMouseCursor_ResizeNESW : ImGuiMouseCursor_ResizeNWSE;
+        cur[2] = cur[1] == ImGuiMouseCursor_ResizeNWSE ? ImGuiMouseCursor_ResizeNESW : ImGuiMouseCursor_ResizeNWSE;
+        cur[3] = cur[2] == ImGuiMouseCursor_ResizeNWSE ? ImGuiMouseCursor_ResizeNESW : ImGuiMouseCursor_ResizeNWSE;
+    }
+
+    ImVec4 color = IsColorAuto(col) ? ImGui::GetStyleColorVec4(ImGuiCol_Text) : col;
+    ImU32 col32 = ImGui::ColorConvertFloat4ToU32(color);
+    color.w *= 0.25f;
+    ImU32 col32_a = ImGui::ColorConvertFloat4ToU32(color);
+    const ImGuiID id = ImGui::GetCurrentWindow()->GetID(n_id);
+
+    bool modified = false;
+    bool clicked = false, hovered = false, held = false;
+
+    const bool is_movable = *x_min != *x_max || *y_min != *y_max;
+    if (is_movable) {
+        ImGui::KeepAliveID(id);
+        if (input) {
+            // middle point
+            ImRect b_rect(pc.x-DRAG_GRAB_HALF_SIZE,pc.y-DRAG_GRAB_HALF_SIZE,pc.x+DRAG_GRAB_HALF_SIZE,pc.y+DRAG_GRAB_HALF_SIZE);
+            clicked = ImGui::ButtonBehavior(b_rect,id,&hovered,&held);
+            if (out_clicked) *out_clicked = clicked;
+            if (out_hovered) *out_hovered = hovered;
+            if (out_held)    *out_held    = held;
+        }
+
+        if ((hovered || held) && show_curs)
+            ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeAll);
+        if (held && ImGui::IsMouseDragging(0)) {
+            for (int i = 0; i < 4; ++i) {
+                ImPlotPoint pp = PixelsToPlot(p[i] + ImGui::GetIO().MouseDelta,IMPLOT_AUTO,IMPLOT_AUTO);
+                *y[i] = pp.y;
+                *x[i] = pp.x;
+            }
+            modified = true;
+        }
+    }
+
+    for (int i = 0; i < 4; ++i) {
+        // points
+        ImRect b_rect(p[i].x - DRAG_GRAB_HALF_SIZE, p[i].y - DRAG_GRAB_HALF_SIZE, p[i].x + DRAG_GRAB_HALF_SIZE, p[i].y + DRAG_GRAB_HALF_SIZE);
+        ImGuiID p_id = id + i + 1;
+        ImGui::KeepAliveID(p_id);
+        if (input) {
+            clicked = ImGui::ButtonBehavior(b_rect,p_id,&hovered,&held);
+            if (out_clicked) *out_clicked = *out_clicked || clicked;
+            if (out_hovered) *out_hovered = *out_hovered || hovered;
+            if (out_held)    *out_held    = *out_held    || held;
+        }
+        if ((hovered || held) && show_curs)
+            ImGui::SetMouseCursor(cur[i]);
+
+        if (held && ImGui::IsMouseDragging(0)) {
+            *x[i] = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).x;
+            *y[i] = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).y;
+            modified = true;
+        }
+
+        // edges
+        ImVec2 e_min = ImMin(p[i],p[(i+1)%4]);
+        ImVec2 e_max = ImMax(p[i],p[(i+1)%4]);
+        b_rect = h[i] ? ImRect(e_min.x + DRAG_GRAB_HALF_SIZE, e_min.y - DRAG_GRAB_HALF_SIZE, e_max.x - DRAG_GRAB_HALF_SIZE, e_max.y + DRAG_GRAB_HALF_SIZE)
+                    : ImRect(e_min.x - DRAG_GRAB_HALF_SIZE, e_min.y + DRAG_GRAB_HALF_SIZE, e_max.x + DRAG_GRAB_HALF_SIZE, e_max.y - DRAG_GRAB_HALF_SIZE);
+        ImGuiID e_id = id + i + 5;
+        ImGui::KeepAliveID(e_id);
+        if (input) {
+            clicked = ImGui::ButtonBehavior(b_rect,e_id,&hovered,&held);
+            if (out_clicked) *out_clicked = *out_clicked || clicked;
+            if (out_hovered) *out_hovered = *out_hovered || hovered;
+            if (out_held)    *out_held    = *out_held    || held;
+        }
+        if ((hovered || held) && show_curs)
+            h[i] ? ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeNS) : ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeEW);
+        if (held && ImGui::IsMouseDragging(0)) {
+            if (h[i])
+                *y[i] = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).y;
+            else
+                *x[i] = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).x;
+            modified = true;
+        }
+        if (hovered && ImGui::IsMouseDoubleClicked(0))
+        {
+            ImPlotRect b = GetPlotLimits(IMPLOT_AUTO,IMPLOT_AUTO);
+            if (h[i])
+                *y[i] = ((y[i] == y_min && *y_min < *y_max) || (y[i] == y_max && *y_max < *y_min)) ? b.Y.Min : b.Y.Max;
+            else
+                *x[i] = ((x[i] == x_min && *x_min < *x_max) || (x[i] == x_max && *x_max < *x_min)) ? b.X.Min : b.X.Max;
+            modified = true;
+        }
+    }
+
+    const bool mouse_inside = rect_grab.Contains(ImGui::GetMousePos());
+    const bool mouse_clicked = ImGui::IsMouseClicked(0);
+    const bool mouse_down = ImGui::IsMouseDown(0);
+    if (input && mouse_inside) {
+        if (out_clicked) *out_clicked = *out_clicked || mouse_clicked;
+        if (out_hovered) *out_hovered = true;
+        if (out_held)    *out_held    = *out_held    || mouse_down;
+    }
+
+    PushPlotClipRect();
+    ImDrawList& DrawList = *GetPlotDrawList();
+    if (modified && no_delay) {
+        for (int i = 0; i < 4; ++i)
+            p[i] = PlotToPixels(*x[i],*y[i],IMPLOT_AUTO,IMPLOT_AUTO);
+        pc = PlotToPixels((*x_min+*x_max)/2,(*y_min+*y_max)/2,IMPLOT_AUTO,IMPLOT_AUTO);
+        rect = ImRect(ImMin(p[0],p[2]),ImMax(p[0],p[2]));
+    }
+    DrawList.AddRectFilled(rect.Min, rect.Max, col32_a);
+    DrawList.AddRect(rect.Min, rect.Max, col32);
+    if (input && (modified || mouse_inside)) {
+        DrawList.AddCircleFilled(pc,DRAG_GRAB_HALF_SIZE,col32);
+        for (int i = 0; i < 4; ++i)
+            DrawList.AddCircleFilled(p[i],DRAG_GRAB_HALF_SIZE,col32);
+    }
+    PopPlotClipRect();
+    ImGui::PopID();
+    return modified;
+}
+
+bool DragRect(int id, ImPlotRect* bounds, const ImVec4& col, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held) {
+    return DragRect(id, &bounds->X.Min, &bounds->Y.Min,&bounds->X.Max, &bounds->Y.Max, col, flags, out_clicked, out_hovered, out_held);
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] Legend Utils and Tools
+//-----------------------------------------------------------------------------
+
+bool IsLegendEntryHovered(const char* label_id) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentItems != nullptr, "IsPlotItemHighlight() needs to be called within an itemized context!");
+    SetupLock();
+    ImGuiID id = ImGui::GetIDWithSeed(label_id, nullptr, gp.CurrentItems->ID);
+    ImPlotItem* item = gp.CurrentItems->GetItem(id);
+    return item && item->LegendHovered;
+}
+
+bool BeginLegendPopup(const char* label_id, ImGuiMouseButton mouse_button) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentItems != nullptr, "BeginLegendPopup() needs to be called within an itemized context!");
+    SetupLock();
+    ImGuiWindow* window = GImGui->CurrentWindow;
+    if (window->SkipItems)
+        return false;
+    ImGuiID id = ImGui::GetIDWithSeed(label_id, nullptr, gp.CurrentItems->ID);
+    if (ImGui::IsMouseReleased(mouse_button)) {
+        ImPlotItem* item = gp.CurrentItems->GetItem(id);
+        if (item && item->LegendHovered)
+            ImGui::OpenPopupEx(id);
+    }
+    return ImGui::BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings);
+}
+
+void EndLegendPopup() {
+    SetupLock();
+    ImGui::EndPopup();
+}
+
+void ShowAltLegend(const char* title_id, bool vertical, const ImVec2 size, bool interactable) {
+    ImPlotContext& gp    = *GImPlot;
+    ImGuiContext &G      = *GImGui;
+    ImGuiWindow * Window = G.CurrentWindow;
+    if (Window->SkipItems)
+        return;
+    ImDrawList &DrawList = *Window->DrawList;
+    ImPlotPlot* plot = GetPlot(title_id);
+    ImVec2 legend_size;
+    ImVec2 default_size = gp.Style.LegendPadding * 2;
+    if (plot != nullptr) {
+        legend_size  = CalcLegendSize(plot->Items, gp.Style.LegendInnerPadding, gp.Style.LegendSpacing, vertical);
+        default_size = legend_size + gp.Style.LegendPadding * 2;
+    }
+    ImVec2 frame_size = ImGui::CalcItemSize(size, default_size.x, default_size.y);
+    ImRect bb_frame = ImRect(Window->DC.CursorPos, Window->DC.CursorPos + frame_size);
+    ImGui::ItemSize(bb_frame);
+    if (!ImGui::ItemAdd(bb_frame, 0, &bb_frame))
+        return;
+    ImGui::RenderFrame(bb_frame.Min, bb_frame.Max, GetStyleColorU32(ImPlotCol_FrameBg), true, G.Style.FrameRounding);
+    DrawList.PushClipRect(bb_frame.Min, bb_frame.Max, true);
+    if (plot != nullptr) {
+        const ImVec2 legend_pos  = GetLocationPos(bb_frame, legend_size, 0, gp.Style.LegendPadding);
+        const ImRect legend_bb(legend_pos, legend_pos + legend_size);
+        interactable = interactable && bb_frame.Contains(ImGui::GetIO().MousePos);
+        // render legend box
+        ImU32  col_bg      = GetStyleColorU32(ImPlotCol_LegendBg);
+        ImU32  col_bd      = GetStyleColorU32(ImPlotCol_LegendBorder);
+        DrawList.AddRectFilled(legend_bb.Min, legend_bb.Max, col_bg);
+        DrawList.AddRect(legend_bb.Min, legend_bb.Max, col_bd);
+        // render entries
+        ShowLegendEntries(plot->Items, legend_bb, interactable, gp.Style.LegendInnerPadding, gp.Style.LegendSpacing, vertical, DrawList);
+    }
+    DrawList.PopClipRect();
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] Drag and Drop Utils
+//-----------------------------------------------------------------------------
+
+bool BeginDragDropTargetPlot() {
+    SetupLock();
+    ImPlotContext& gp = *GImPlot;
+    ImRect rect = gp.CurrentPlot->PlotRect;
+    return ImGui::BeginDragDropTargetCustom(rect, gp.CurrentPlot->ID);
+}
+
+bool BeginDragDropTargetAxis(ImAxis axis) {
+    SetupLock();
+    ImPlotPlot& plot = *GImPlot->CurrentPlot;
+    ImPlotAxis& ax = plot.Axes[axis];
+    ImRect rect = ax.HoverRect;
+    rect.Expand(-3.5f);
+    return ImGui::BeginDragDropTargetCustom(rect, ax.ID);
+}
+
+bool BeginDragDropTargetLegend() {
+    SetupLock();
+    ImPlotItemGroup& items = *GImPlot->CurrentItems;
+    ImRect rect = items.Legend.RectClamped;
+    return ImGui::BeginDragDropTargetCustom(rect, items.ID);
+}
+
+void EndDragDropTarget() {
+    SetupLock();
+	ImGui::EndDragDropTarget();
+}
+
+bool BeginDragDropSourcePlot(ImGuiDragDropFlags flags) {
+    SetupLock();
+    ImPlotContext& gp = *GImPlot;
+    ImPlotPlot* plot = gp.CurrentPlot;
+    if (GImGui->IO.KeyMods == gp.InputMap.OverrideMod || GImGui->DragDropPayload.SourceId == plot->ID)
+        return ImGui::ItemAdd(plot->PlotRect, plot->ID) && ImGui::BeginDragDropSource(flags);
+    return false;
+}
+
+bool BeginDragDropSourceAxis(ImAxis idx, ImGuiDragDropFlags flags) {
+    SetupLock();
+    ImPlotContext& gp = *GImPlot;
+    ImPlotAxis& axis = gp.CurrentPlot->Axes[idx];
+    if (GImGui->IO.KeyMods == gp.InputMap.OverrideMod || GImGui->DragDropPayload.SourceId == axis.ID)
+        return ImGui::ItemAdd(axis.HoverRect, axis.ID) && ImGui::BeginDragDropSource(flags);
+    return false;
+}
+
+bool BeginDragDropSourceItem(const char* label_id, ImGuiDragDropFlags flags) {
+    SetupLock();
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentItems != nullptr, "BeginDragDropSourceItem() needs to be called within an itemized context!");
+    ImGuiID item_id = ImGui::GetIDWithSeed(label_id, nullptr, gp.CurrentItems->ID);
+    ImPlotItem* item = gp.CurrentItems->GetItem(item_id);
+    if (item != nullptr) {
+        return ImGui::ItemAdd(item->LegendHoverRect, item->ID) && ImGui::BeginDragDropSource(flags);
+    }
+    return false;
+}
+
+void EndDragDropSource() {
+    SetupLock();
+    ImGui::EndDragDropSource();
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] Aligned Plots
+//-----------------------------------------------------------------------------
+
+bool BeginAlignedPlots(const char* group_id, bool vertical) {
+    IM_ASSERT_USER_ERROR(GImPlot != nullptr, "No current context. Did you call ImPlot::CreateContext() or ImPlot::SetCurrentContext()?");
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentAlignmentH == nullptr && gp.CurrentAlignmentV == nullptr, "Mismatched BeginAlignedPlots()/EndAlignedPlots()!");
+    ImGuiContext &G = *GImGui;
+    ImGuiWindow * Window = G.CurrentWindow;
+    if (Window->SkipItems)
+        return false;
+    const ImGuiID ID = Window->GetID(group_id);
+    ImPlotAlignmentData* alignment = gp.AlignmentData.GetOrAddByKey(ID);
+    if (vertical)
+        gp.CurrentAlignmentV = alignment;
+    else
+        gp.CurrentAlignmentH = alignment;
+    if (alignment->Vertical != vertical)
+        alignment->Reset();
+    alignment->Vertical = vertical;
+    alignment->Begin();
+    return true;
+}
+
+void EndAlignedPlots() {
+    IM_ASSERT_USER_ERROR(GImPlot != nullptr, "No current context. Did you call ImPlot::CreateContext() or ImPlot::SetCurrentContext()?");
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentAlignmentH != nullptr || gp.CurrentAlignmentV != nullptr, "Mismatched BeginAlignedPlots()/EndAlignedPlots()!");
+    ImPlotAlignmentData* alignment = gp.CurrentAlignmentH != nullptr ? gp.CurrentAlignmentH : (gp.CurrentAlignmentV != nullptr ? gp.CurrentAlignmentV : nullptr);
+    if (alignment)
+        alignment->End();
+    ResetCtxForNextAlignedPlots(GImPlot);
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] Plot and Item Styling
+//-----------------------------------------------------------------------------
+
+ImPlotStyle& GetStyle() {
+    IM_ASSERT_USER_ERROR(GImPlot != nullptr, "No current context. Did you call ImPlot::CreateContext() or ImPlot::SetCurrentContext()?");
+    ImPlotContext& gp = *GImPlot;
+    return gp.Style;
+}
+
+void PushStyleColor(ImPlotCol idx, ImU32 col) {
+    ImPlotContext& gp = *GImPlot;
+    ImGuiColorMod backup;
+    backup.Col = (ImGuiCol)idx;
+    backup.BackupValue = gp.Style.Colors[idx];
+    gp.ColorModifiers.push_back(backup);
+    gp.Style.Colors[idx] = ImGui::ColorConvertU32ToFloat4(col);
+}
+
+void PushStyleColor(ImPlotCol idx, const ImVec4& col) {
+    ImPlotContext& gp = *GImPlot;
+    ImGuiColorMod backup;
+    backup.Col = (ImGuiCol)idx;
+    backup.BackupValue = gp.Style.Colors[idx];
+    gp.ColorModifiers.push_back(backup);
+    gp.Style.Colors[idx] = col;
+}
+
+void PopStyleColor(int count) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(count <= gp.ColorModifiers.Size, "You can't pop more modifiers than have been pushed!");
+    while (count > 0)
+    {
+        ImGuiColorMod& backup = gp.ColorModifiers.back();
+        gp.Style.Colors[backup.Col] = backup.BackupValue;
+        gp.ColorModifiers.pop_back();
+        count--;
+    }
+}
+
+void PushStyleVar(ImPlotStyleVar idx, float val) {
+    ImPlotContext& gp = *GImPlot;
+    const ImPlotStyleVarInfo* var_info = GetPlotStyleVarInfo(idx);
+    if (var_info->Type == ImGuiDataType_Float && var_info->Count == 1) {
+        float* pvar = (float*)var_info->GetVarPtr(&gp.Style);
+        gp.StyleModifiers.push_back(ImGuiStyleMod((ImGuiStyleVar)idx, *pvar));
+        *pvar = val;
+        return;
+    }
+    IM_ASSERT(0 && "Called PushStyleVar() float variant but variable is not a float!");
+}
+
+void PushStyleVar(ImPlotStyleVar idx, int val) {
+    ImPlotContext& gp = *GImPlot;
+    const ImPlotStyleVarInfo* var_info = GetPlotStyleVarInfo(idx);
+    if (var_info->Type == ImGuiDataType_S32 && var_info->Count == 1) {
+        int* pvar = (int*)var_info->GetVarPtr(&gp.Style);
+        gp.StyleModifiers.push_back(ImGuiStyleMod((ImGuiStyleVar)idx, *pvar));
+        *pvar = val;
+        return;
+    }
+    else if (var_info->Type == ImGuiDataType_Float && var_info->Count == 1) {
+        float* pvar = (float*)var_info->GetVarPtr(&gp.Style);
+        gp.StyleModifiers.push_back(ImGuiStyleMod((ImGuiStyleVar)idx, *pvar));
+        *pvar = (float)val;
+        return;
+    }
+    IM_ASSERT(0 && "Called PushStyleVar() int variant but variable is not a int!");
+}
+
+void PushStyleVar(ImPlotStyleVar idx, const ImVec2& val)
+{
+    ImPlotContext& gp = *GImPlot;
+    const ImPlotStyleVarInfo* var_info = GetPlotStyleVarInfo(idx);
+    if (var_info->Type == ImGuiDataType_Float && var_info->Count == 2)
+    {
+        ImVec2* pvar = (ImVec2*)var_info->GetVarPtr(&gp.Style);
+        gp.StyleModifiers.push_back(ImGuiStyleMod((ImGuiStyleVar)idx, *pvar));
+        *pvar = val;
+        return;
+    }
+    IM_ASSERT(0 && "Called PushStyleVar() ImVec2 variant but variable is not a ImVec2!");
+}
+
+void PopStyleVar(int count) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(count <= gp.StyleModifiers.Size, "You can't pop more modifiers than have been pushed!");
+    while (count > 0) {
+        ImGuiStyleMod& backup = gp.StyleModifiers.back();
+        const ImPlotStyleVarInfo* info = GetPlotStyleVarInfo(backup.VarIdx);
+        void* data = info->GetVarPtr(&gp.Style);
+        if (info->Type == ImGuiDataType_Float && info->Count == 1) {
+            ((float*)data)[0] = backup.BackupFloat[0];
+        }
+        else if (info->Type == ImGuiDataType_Float && info->Count == 2) {
+             ((float*)data)[0] = backup.BackupFloat[0];
+             ((float*)data)[1] = backup.BackupFloat[1];
+        }
+        else if (info->Type == ImGuiDataType_S32 && info->Count == 1) {
+            ((int*)data)[0] = backup.BackupInt[0];
+        }
+        gp.StyleModifiers.pop_back();
+        count--;
+    }
+}
+
+ImPlotMarker NextMarker() {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentItems != nullptr, "NextMarker() needs to be called between BeginPlot() and EndPlot()!");
+    const int idx = gp.CurrentItems->MarkerIdx % ImPlotMarker_COUNT;
+    ++gp.CurrentItems->MarkerIdx;
+    return idx;
+}
+    
+//------------------------------------------------------------------------------
+// [Section] Colormaps
+//------------------------------------------------------------------------------
+
+ImPlotColormap AddColormap(const char* name, const ImVec4* colormap, int size, bool qual) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(size > 1, "The colormap size must be greater than 1!");
+    IM_ASSERT_USER_ERROR(gp.ColormapData.GetIndex(name) == -1, "The colormap name has already been used!");
+    ImVector<ImU32> buffer;
+    buffer.resize(size);
+    for (int i = 0; i < size; ++i)
+        buffer[i] = ImGui::ColorConvertFloat4ToU32(colormap[i]);
+    return gp.ColormapData.Append(name, buffer.Data, size, qual);
+}
+
+ImPlotColormap AddColormap(const char* name, const ImU32*  colormap, int size, bool qual) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(size > 1, "The colormap size must be greater than 1!");
+    IM_ASSERT_USER_ERROR(gp.ColormapData.GetIndex(name) == -1, "The colormap name has already be used!");
+    return gp.ColormapData.Append(name, colormap, size, qual);
+}
+
+int GetColormapCount() {
+    ImPlotContext& gp = *GImPlot;
+    return gp.ColormapData.Count;
+}
+
+const char* GetColormapName(ImPlotColormap colormap) {
+    ImPlotContext& gp = *GImPlot;
+    return gp.ColormapData.GetName(colormap);
+}
+
+ImPlotColormap GetColormapIndex(const char* name) {
+    ImPlotContext& gp = *GImPlot;
+    return gp.ColormapData.GetIndex(name);
+}
+
+void PushColormap(ImPlotColormap colormap) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(colormap >= 0 && colormap < gp.ColormapData.Count, "The colormap index is invalid!");
+    gp.ColormapModifiers.push_back(gp.Style.Colormap);
+    gp.Style.Colormap = colormap;
+}
+
+void PushColormap(const char* name) {
+    ImPlotContext& gp = *GImPlot;
+    ImPlotColormap idx = gp.ColormapData.GetIndex(name);
+    IM_ASSERT_USER_ERROR(idx != -1, "The colormap name is invalid!");
+    PushColormap(idx);
+}
+
+void PopColormap(int count) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(count <= gp.ColormapModifiers.Size, "You can't pop more modifiers than have been pushed!");
+    while (count > 0) {
+        const ImPlotColormap& backup = gp.ColormapModifiers.back();
+        gp.Style.Colormap     = backup;
+        gp.ColormapModifiers.pop_back();
+        count--;
+    }
+}
+
+ImU32 NextColormapColorU32() {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentItems != nullptr, "NextColormapColor() needs to be called between BeginPlot() and EndPlot()!");
+    int idx = gp.CurrentItems->ColormapIdx % gp.ColormapData.GetKeyCount(gp.Style.Colormap);
+    ImU32 col  = gp.ColormapData.GetKeyColor(gp.Style.Colormap, idx);
+    gp.CurrentItems->ColormapIdx++;
+    return col;
+}
+
+ImVec4 NextColormapColor() {
+    return ImGui::ColorConvertU32ToFloat4(NextColormapColorU32());
+}    
+
+int GetColormapSize(ImPlotColormap cmap) {
+    ImPlotContext& gp = *GImPlot;
+    cmap = cmap == IMPLOT_AUTO ? gp.Style.Colormap : cmap;
+    IM_ASSERT_USER_ERROR(cmap >= 0 && cmap < gp.ColormapData.Count, "Invalid colormap index!");
+    return gp.ColormapData.GetKeyCount(cmap);
+}
+
+ImU32 GetColormapColorU32(int idx, ImPlotColormap cmap) {
+    ImPlotContext& gp = *GImPlot;
+    cmap = cmap == IMPLOT_AUTO ? gp.Style.Colormap : cmap;
+    IM_ASSERT_USER_ERROR(cmap >= 0 && cmap < gp.ColormapData.Count, "Invalid colormap index!");
+    idx = idx % gp.ColormapData.GetKeyCount(cmap);
+    return gp.ColormapData.GetKeyColor(cmap, idx);
+}
+
+ImVec4 GetColormapColor(int idx, ImPlotColormap cmap) {
+    return ImGui::ColorConvertU32ToFloat4(GetColormapColorU32(idx,cmap));
+}
+
+ImU32  SampleColormapU32(float t, ImPlotColormap cmap) {
+    ImPlotContext& gp = *GImPlot;
+    cmap = cmap == IMPLOT_AUTO ? gp.Style.Colormap : cmap;
+    IM_ASSERT_USER_ERROR(cmap >= 0 && cmap < gp.ColormapData.Count, "Invalid colormap index!");
+    return gp.ColormapData.LerpTable(cmap, t);
+}
+
+ImVec4 SampleColormap(float t, ImPlotColormap cmap) {
+    return ImGui::ColorConvertU32ToFloat4(SampleColormapU32(t,cmap));
+}
+
+void RenderColorBar(const ImU32* colors, int size, ImDrawList& DrawList, const ImRect& bounds, bool vert, bool reversed, bool continuous) {
+    const int n = continuous ? size - 1 : size;
+    ImU32 col1, col2;
+    if (vert) {
+        const float step = bounds.GetHeight() / n;
+        ImRect rect(bounds.Min.x, bounds.Min.y, bounds.Max.x, bounds.Min.y + step);
+        for (int i = 0; i < n; ++i) {
+            if (reversed) {
+                col1 = colors[size-i-1];
+                col2 = continuous ? colors[size-i-2] : col1;
+            }
+            else {
+                col1 = colors[i];
+                col2 = continuous ? colors[i+1] : col1;
+            }
+            DrawList.AddRectFilledMultiColor(rect.Min, rect.Max, col1, col1, col2, col2);
+            rect.TranslateY(step);
+        }
+    }
+    else {
+        const float step = bounds.GetWidth() / n;
+        ImRect rect(bounds.Min.x, bounds.Min.y, bounds.Min.x + step, bounds.Max.y);
+        for (int i = 0; i < n; ++i) {
+            if (reversed) {
+                col1 = colors[size-i-1];
+                col2 = continuous ? colors[size-i-2] : col1;
+            }
+            else {
+                col1 = colors[i];
+                col2 = continuous ? colors[i+1] : col1;
+            }
+            DrawList.AddRectFilledMultiColor(rect.Min, rect.Max, col1, col2, col2, col1);
+            rect.TranslateX(step);
+        }
+    }
+}
+
+void ColormapScale(const char* label, double scale_min, double scale_max, const ImVec2& size, const char* format, ImPlotColormapScaleFlags flags, ImPlotColormap cmap) {
+    ImGuiContext &G      = *GImGui;
+    ImGuiWindow * Window = G.CurrentWindow;
+    if (Window->SkipItems)
+        return;
+
+    const ImGuiID ID = Window->GetID(label);
+    ImVec2 label_size(0,0);
+    if (!ImHasFlag(flags, ImPlotColormapScaleFlags_NoLabel)) {
+        label_size = ImGui::CalcTextSize(label,nullptr,true);
+    }
+
+    ImPlotContext& gp = *GImPlot;
+    cmap = cmap == IMPLOT_AUTO ? gp.Style.Colormap : cmap;
+    IM_ASSERT_USER_ERROR(cmap >= 0 && cmap < gp.ColormapData.Count, "Invalid colormap index!");
+
+    ImVec2 frame_size  = ImGui::CalcItemSize(size, 0, gp.Style.PlotDefaultSize.y);
+    if (frame_size.y < gp.Style.PlotMinSize.y && size.y < 0.0f)
+        frame_size.y = gp.Style.PlotMinSize.y;
+
+    ImPlotRange range(ImMin(scale_min,scale_max), ImMax(scale_min,scale_max));
+    gp.CTicker.Reset();
+    Locator_Default(gp.CTicker, range, frame_size.y, true, Formatter_Default, (void*)format);
+
+    const bool rend_label = label_size.x > 0;
+    const float txt_off   = gp.Style.LabelPadding.x;
+    const float pad       = txt_off + gp.CTicker.MaxSize.x + (rend_label ? txt_off + label_size.y : 0);
+    float bar_w           = 20;
+    if (frame_size.x == 0)
+        frame_size.x = bar_w + pad + 2 * gp.Style.PlotPadding.x;
+    else {
+        bar_w = frame_size.x - (pad + 2 * gp.Style.PlotPadding.x);
+        if (bar_w < gp.Style.MajorTickLen.y)
+            bar_w = gp.Style.MajorTickLen.y;
+    }
+
+    ImDrawList &DrawList = *Window->DrawList;
+    ImRect bb_frame = ImRect(Window->DC.CursorPos, Window->DC.CursorPos + frame_size);
+    ImGui::ItemSize(bb_frame);
+    if (!ImGui::ItemAdd(bb_frame, ID, &bb_frame))
+        return;
+
+    ImGui::RenderFrame(bb_frame.Min, bb_frame.Max, GetStyleColorU32(ImPlotCol_FrameBg), true, G.Style.FrameRounding);
+
+    const bool opposite = ImHasFlag(flags, ImPlotColormapScaleFlags_Opposite);
+    const bool inverted = ImHasFlag(flags, ImPlotColormapScaleFlags_Invert);
+    const bool reversed = scale_min > scale_max;
+
+    float bb_grad_shift = opposite ? pad : 0;
+    ImRect bb_grad(bb_frame.Min + gp.Style.PlotPadding + ImVec2(bb_grad_shift, 0),
+                   bb_frame.Min + ImVec2(bar_w + gp.Style.PlotPadding.x + bb_grad_shift,
+                                         frame_size.y - gp.Style.PlotPadding.y));
+
+    ImGui::PushClipRect(bb_frame.Min, bb_frame.Max, true);
+    const ImU32 col_text = ImGui::GetColorU32(ImGuiCol_Text);
+
+    const bool invert_scale = inverted ? (reversed ? false : true) : (reversed ? true : false);
+    const float y_min = invert_scale ? bb_grad.Max.y : bb_grad.Min.y;
+    const float y_max = invert_scale ? bb_grad.Min.y : bb_grad.Max.y;
+
+    RenderColorBar(gp.ColormapData.GetKeys(cmap), gp.ColormapData.GetKeyCount(cmap), DrawList, bb_grad, true, !inverted, !gp.ColormapData.IsQual(cmap));
+    for (int i = 0; i < gp.CTicker.TickCount(); ++i) {
+        const double y_pos_plt = gp.CTicker.Ticks[i].PlotPos;
+        const float y_pos = ImRemap((float)y_pos_plt, (float)range.Max, (float)range.Min, y_min, y_max);
+        const float tick_width = gp.CTicker.Ticks[i].Major ? gp.Style.MajorTickLen.y : gp.Style.MinorTickLen.y;
+        const float tick_thick = gp.CTicker.Ticks[i].Major ? gp.Style.MajorTickSize.y : gp.Style.MinorTickSize.y;
+        const float tick_t     = (float)((y_pos_plt - scale_min) / (scale_max - scale_min));
+        const ImU32 tick_col = CalcTextColor(gp.ColormapData.LerpTable(cmap,tick_t));
+        if (y_pos < bb_grad.Max.y - 2 && y_pos > bb_grad.Min.y + 2) {
+            AddLineH(&DrawList,
+                             opposite ? (bb_grad.Min.x+1) : (bb_grad.Max.x-1),
+                             opposite ? (bb_grad.Min.x + tick_width) : (bb_grad.Max.x - tick_width),
+                             y_pos,
+                             tick_col,
+                             tick_thick);
+        }
+        const float txt_x = opposite ? bb_grad.Min.x - txt_off - gp.CTicker.Ticks[i].LabelSize.x : bb_grad.Max.x + txt_off;
+        const float txt_y = y_pos - gp.CTicker.Ticks[i].LabelSize.y * 0.5f;
+        DrawList.AddText(ImVec2(txt_x, txt_y), col_text, gp.CTicker.GetText(i));
+    }
+
+    if (rend_label) {
+        const float pos_x = opposite ? bb_frame.Min.x + gp.Style.PlotPadding.x : bb_grad.Max.x + 2 * txt_off + gp.CTicker.MaxSize.x;
+        const float pos_y = bb_grad.GetCenter().y + label_size.x * 0.5f;
+        const char* label_end = ImGui::FindRenderedTextEnd(label);
+        AddTextVertical(&DrawList,ImVec2(pos_x,pos_y),col_text,label,label_end);
+    }
+    DrawList.AddRect(bb_grad.Min, bb_grad.Max, GetStyleColorU32(ImPlotCol_PlotBorder));
+    ImGui::PopClipRect();
+}
+
+bool ColormapSlider(const char* label, float* t, ImVec4* out, const char* format, ImPlotColormap cmap) {
+    *t = ImClamp(*t,0.0f,1.0f);
+    ImGuiContext &G      = *GImGui;
+    ImGuiWindow * Window = G.CurrentWindow;
+    if (Window->SkipItems)
+        return false;
+    ImPlotContext& gp = *GImPlot;
+    cmap = cmap == IMPLOT_AUTO ? gp.Style.Colormap : cmap;
+    IM_ASSERT_USER_ERROR(cmap >= 0 && cmap < gp.ColormapData.Count, "Invalid colormap index!");
+    const ImU32* keys  = gp.ColormapData.GetKeys(cmap);
+    const int    count = gp.ColormapData.GetKeyCount(cmap);
+    const bool   qual  = gp.ColormapData.IsQual(cmap);
+    const ImVec2 pos  = ImGui::GetCurrentWindow()->DC.CursorPos;
+    const float w     = ImGui::CalcItemWidth();
+    const float h     = ImGui::GetFrameHeight();
+    const ImRect rect = ImRect(pos.x,pos.y,pos.x+w,pos.y+h);
+    RenderColorBar(keys,count,*ImGui::GetWindowDrawList(),rect,false,false,!qual);
+    const ImU32 grab = CalcTextColor(gp.ColormapData.LerpTable(cmap,*t));
+    // const ImU32 text = CalcTextColor(gp.ColormapData.LerpTable(cmap,0.5f));
+    ImGui::PushStyleColor(ImGuiCol_FrameBg,IM_COL32_BLACK_TRANS);
+    ImGui::PushStyleColor(ImGuiCol_FrameBgActive,IM_COL32_BLACK_TRANS);
+    ImGui::PushStyleColor(ImGuiCol_FrameBgHovered,ImVec4(1,1,1,0.1f));
+    ImGui::PushStyleColor(ImGuiCol_SliderGrab,grab);
+    ImGui::PushStyleColor(ImGuiCol_SliderGrabActive, grab);
+    ImGui::PushStyleVar(ImGuiStyleVar_GrabMinSize,2);
+    ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding,0);
+    const bool changed = ImGui::SliderFloat(label,t,0,1,format);
+    ImGui::PopStyleColor(5);
+    ImGui::PopStyleVar(2);
+    if (out != nullptr)
+        *out = ImGui::ColorConvertU32ToFloat4(gp.ColormapData.LerpTable(cmap,*t));
+    return changed;
+}
+
+bool ColormapButton(const char* label, const ImVec2& size_arg, ImPlotColormap cmap) {
+    ImGuiContext &G      = *GImGui;
+    const ImGuiStyle& style = G.Style;
+    ImGuiWindow * Window = G.CurrentWindow;
+    if (Window->SkipItems)
+        return false;
+    ImPlotContext& gp = *GImPlot;
+    cmap = cmap == IMPLOT_AUTO ? gp.Style.Colormap : cmap;
+    IM_ASSERT_USER_ERROR(cmap >= 0 && cmap < gp.ColormapData.Count, "Invalid colormap index!");
+    const ImU32* keys  = gp.ColormapData.GetKeys(cmap);
+    const int    count = gp.ColormapData.GetKeyCount(cmap);
+    const bool   qual  = gp.ColormapData.IsQual(cmap);
+    const ImVec2 pos  = ImGui::GetCurrentWindow()->DC.CursorPos;
+    const ImVec2 label_size = ImGui::CalcTextSize(label, nullptr, true);
+    ImVec2 size = ImGui::CalcItemSize(size_arg, label_size.x + style.FramePadding.x * 2.0f, label_size.y + style.FramePadding.y * 2.0f);
+    const ImRect rect = ImRect(pos.x,pos.y,pos.x+size.x,pos.y+size.y);
+    RenderColorBar(keys,count,*ImGui::GetWindowDrawList(),rect,false,false,!qual);
+    const ImU32 text = CalcTextColor(gp.ColormapData.LerpTable(cmap,G.Style.ButtonTextAlign.x));
+    ImGui::PushStyleColor(ImGuiCol_Button,IM_COL32_BLACK_TRANS);
+    ImGui::PushStyleColor(ImGuiCol_ButtonHovered,ImVec4(1,1,1,0.1f));
+    ImGui::PushStyleColor(ImGuiCol_ButtonActive,ImVec4(1,1,1,0.2f));
+    ImGui::PushStyleColor(ImGuiCol_Text,text);
+    ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding,0);
+    const bool pressed = ImGui::Button(label,size);
+    ImGui::PopStyleColor(4);
+    ImGui::PopStyleVar(1);
+    return pressed;
+}
+
+//-----------------------------------------------------------------------------
+// [Section] Miscellaneous
+//-----------------------------------------------------------------------------
+
+ImPlotInputMap& GetInputMap() {
+    IM_ASSERT_USER_ERROR(GImPlot != nullptr, "No current context. Did you call ImPlot::CreateContext() or ImPlot::SetCurrentContext()?");
+    ImPlotContext& gp = *GImPlot;
+    return gp.InputMap;
+}
+
+void MapInputDefault(ImPlotInputMap* dst) {
+    ImPlotInputMap& map = dst ? *dst : GetInputMap();
+    map.Pan             = ImGuiMouseButton_Left;
+    map.PanMod          = ImGuiMod_None;
+    map.Fit             = ImGuiMouseButton_Left;
+    map.Menu            = ImGuiMouseButton_Right;
+    map.Select          = ImGuiMouseButton_Right;
+    map.SelectMod       = ImGuiMod_None;
+    map.SelectCancel    = ImGuiMouseButton_Left;
+    map.SelectHorzMod   = ImGuiMod_Alt;
+    map.SelectVertMod   = ImGuiMod_Shift;
+    map.OverrideMod     = ImGuiMod_Ctrl;
+    map.ZoomMod         = ImGuiMod_None;
+    map.ZoomRate        = 0.1f;
+}
+
+void MapInputReverse(ImPlotInputMap* dst) {
+    ImPlotInputMap& map = dst ? *dst : GetInputMap();
+    map.Pan             = ImGuiMouseButton_Right;
+    map.PanMod          = ImGuiMod_None;
+    map.Fit             = ImGuiMouseButton_Left;
+    map.Menu            = ImGuiMouseButton_Right;
+    map.Select          = ImGuiMouseButton_Left;
+    map.SelectMod       = ImGuiMod_None;
+    map.SelectCancel    = ImGuiMouseButton_Right;
+    map.SelectHorzMod   = ImGuiMod_Alt;
+    map.SelectVertMod   = ImGuiMod_Shift;
+    map.OverrideMod     = ImGuiMod_Ctrl;
+    map.ZoomMod         = ImGuiMod_None;
+    map.ZoomRate        = 0.1f;
+}
+
+//-----------------------------------------------------------------------------
+// [Section] Miscellaneous
+//-----------------------------------------------------------------------------
+
+void ItemIcon(const ImVec4& col) {
+    ItemIcon(ImGui::ColorConvertFloat4ToU32(col));
+}
+
+void ItemIcon(ImU32 col) {
+    const float txt_size = ImGui::GetTextLineHeight();
+    ImVec2 size(txt_size-4,txt_size);
+    ImGuiWindow* window = ImGui::GetCurrentWindow();
+    ImVec2 pos = window->DC.CursorPos;
+    ImGui::GetWindowDrawList()->AddRectFilled(pos + ImVec2(0,2), pos + size - ImVec2(0,2), col);
+    ImGui::Dummy(size);
+}
+
+void ColormapIcon(ImPlotColormap cmap) {
+    ImPlotContext& gp = *GImPlot;
+    const float txt_size = ImGui::GetTextLineHeight();
+    ImVec2 size(txt_size-4,txt_size);
+    ImGuiWindow* window = ImGui::GetCurrentWindow();
+    ImVec2 pos = window->DC.CursorPos;
+    ImRect rect(pos+ImVec2(0,2),pos+size-ImVec2(0,2));
+    ImDrawList& DrawList = *ImGui::GetWindowDrawList();
+    RenderColorBar(gp.ColormapData.GetKeys(cmap),gp.ColormapData.GetKeyCount(cmap),DrawList,rect,false,false,!gp.ColormapData.IsQual(cmap));
+    ImGui::Dummy(size);
+}
+
+ImDrawList* GetPlotDrawList() {
+    return ImGui::GetWindowDrawList();
+}
+
+void PushPlotClipRect(float expand) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "PushPlotClipRect() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+    ImRect rect = gp.CurrentPlot->PlotRect;
+    rect.Expand(expand);
+    ImGui::PushClipRect(rect.Min, rect.Max, true);
+}
+
+void PopPlotClipRect() {
+    SetupLock();
+    ImGui::PopClipRect();
+}
+
+static void HelpMarker(const char* desc) {
+    ImGui::TextDisabled("(?)");
+    if (ImGui::IsItemHovered()) {
+        ImGui::BeginTooltip();
+        ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f);
+        ImGui::TextUnformatted(desc);
+        ImGui::PopTextWrapPos();
+        ImGui::EndTooltip();
+    }
+}
+
+bool ShowStyleSelector(const char* label)
+{
+    static int style_idx = -1;
+    if (ImGui::Combo(label, &style_idx, "Auto\0Classic\0Dark\0Light\0"))
+    {
+        switch (style_idx)
+        {
+        case 0: StyleColorsAuto(); break;
+        case 1: StyleColorsClassic(); break;
+        case 2: StyleColorsDark(); break;
+        case 3: StyleColorsLight(); break;
+        }
+        return true;
+    }
+    return false;
+}
+
+bool ShowColormapSelector(const char* label) {
+    ImPlotContext& gp = *GImPlot;
+    bool set = false;
+    if (ImGui::BeginCombo(label, gp.ColormapData.GetName(gp.Style.Colormap))) {
+        for (int i = 0; i < gp.ColormapData.Count; ++i) {
+            const char* name = gp.ColormapData.GetName(i);
+            if (ImGui::Selectable(name, gp.Style.Colormap == i)) {
+                gp.Style.Colormap = i;
+                ImPlot::BustItemCache();
+                set = true;
+            }
+        }
+        ImGui::EndCombo();
+    }
+    return set;
+}
+
+bool ShowInputMapSelector(const char* label) {
+    static int map_idx = -1;
+    if (ImGui::Combo(label, &map_idx, "Default\0Reversed\0"))
+    {
+        switch (map_idx)
+        {
+        case 0: MapInputDefault(); break;
+        case 1: MapInputReverse(); break;
+        }
+        return true;
+    }
+    return false;
+}
+
+
+void ShowStyleEditor(ImPlotStyle* ref) {
+    ImPlotContext& gp = *GImPlot;
+    ImPlotStyle& style = GetStyle();
+    static ImPlotStyle ref_saved_style;
+    // Default to using internal storage as reference
+    static bool init = true;
+    if (init && ref == nullptr)
+        ref_saved_style = style;
+    init = false;
+    if (ref == nullptr)
+        ref = &ref_saved_style;
+
+    if (ImPlot::ShowStyleSelector("Colors##Selector"))
+        ref_saved_style = style;
+
+    // Save/Revert button
+    if (ImGui::Button("Save Ref"))
+        *ref = ref_saved_style = style;
+    ImGui::SameLine();
+    if (ImGui::Button("Revert Ref"))
+        style = *ref;
+    ImGui::SameLine();
+    HelpMarker("Save/Revert in local non-persistent storage. Default Colors definition are not affected. "
+               "Use \"Export\" below to save them somewhere.");
+    if (ImGui::BeginTabBar("##StyleEditor")) {
+        if (ImGui::BeginTabItem("Variables")) {
+            ImGui::Text("Plot Styling");
+            ImGui::SliderFloat2("PlotDefaultSize", (float*)&style.PlotDefaultSize, 0.0f, 1000, "%.0f");
+            ImGui::SliderFloat2("PlotMinSize", (float*)&style.PlotMinSize, 0.0f, 300, "%.0f");
+            ImGui::SliderFloat("PlotBorderSize", &style.PlotBorderSize, 0.0f, 2.0f, "%.0f");
+            ImGui::SliderFloat("MinorAlpha", &style.MinorAlpha, 0.0f, 1.0f, "%.2f");
+            ImGui::SliderFloat2("MajorTickLen", (float*)&style.MajorTickLen, 0.0f, 20.0f, "%.0f");
+            ImGui::SliderFloat2("MinorTickLen", (float*)&style.MinorTickLen, 0.0f, 20.0f, "%.0f");
+            ImGui::SliderFloat2("MajorTickSize",  (float*)&style.MajorTickSize, 0.0f, 2.0f, "%.1f");
+            ImGui::SliderFloat2("MinorTickSize", (float*)&style.MinorTickSize, 0.0f, 2.0f, "%.1f");
+            ImGui::SliderFloat2("MajorGridSize", (float*)&style.MajorGridSize, 0.0f, 2.0f, "%.1f");
+            ImGui::SliderFloat2("MinorGridSize", (float*)&style.MinorGridSize, 0.0f, 2.0f, "%.1f");
+            ImGui::Text("Plot Padding");
+            ImGui::SliderFloat2("PlotPadding", (float*)&style.PlotPadding, 0.0f, 20.0f, "%.0f");
+            ImGui::SliderFloat2("LabelPadding", (float*)&style.LabelPadding, 0.0f, 20.0f, "%.0f");
+            ImGui::SliderFloat2("LegendPadding", (float*)&style.LegendPadding, 0.0f, 20.0f, "%.0f");
+            ImGui::SliderFloat2("LegendInnerPadding", (float*)&style.LegendInnerPadding, 0.0f, 10.0f, "%.0f");
+            ImGui::SliderFloat2("LegendSpacing", (float*)&style.LegendSpacing, 0.0f, 5.0f, "%.0f");
+            ImGui::SliderFloat2("MousePosPadding", (float*)&style.MousePosPadding, 0.0f, 20.0f, "%.0f");
+            ImGui::SliderFloat2("AnnotationPadding", (float*)&style.AnnotationPadding, 0.0f, 5.0f, "%.0f");
+            ImGui::SliderFloat2("FitPadding", (float*)&style.FitPadding, 0, 0.2f, "%.2f");
+            ImGui::SliderFloat("DigitalPadding", &style.DigitalPadding, 0.0f, 20.0f, "%.1f");
+            ImGui::SliderFloat("DigitalSpacing", &style.DigitalSpacing, 0.0f, 10.0f, "%.1f");
+            ImGui::EndTabItem();
+        }
+        if (ImGui::BeginTabItem("Colors")) {
+            static int output_dest = 0;
+            static bool output_only_modified = false;
+
+            if (ImGui::Button("Export", ImVec2(75,0))) {
+                if (output_dest == 0)
+                    ImGui::LogToClipboard();
+                else
+                    ImGui::LogToTTY();
+                ImGui::LogText("ImVec4* colors = ImPlot::GetStyle().Colors;\n");
+                for (int i = 0; i < ImPlotCol_COUNT; i++) {
+                    const ImVec4& col = style.Colors[i];
+                    const char* name = ImPlot::GetStyleColorName(i);
+                    if (!output_only_modified || memcmp(&col, &ref->Colors[i], sizeof(ImVec4)) != 0) {
+                        if (IsColorAuto(i))
+                            ImGui::LogText("colors[ImPlotCol_%s]%*s= IMPLOT_AUTO_COL;\n",name,14 - (int)strlen(name), "");
+                        else
+                            ImGui::LogText("colors[ImPlotCol_%s]%*s= ImVec4(%.2ff, %.2ff, %.2ff, %.2ff);\n",
+                                        name, 14 - (int)strlen(name), "", col.x, col.y, col.z, col.w);
+                    }
+                }
+                ImGui::LogFinish();
+            }
+            ImGui::SameLine(); ImGui::SetNextItemWidth(120); ImGui::Combo("##output_type", &output_dest, "To Clipboard\0To TTY\0");
+            ImGui::SameLine(); ImGui::Checkbox("Only Modified Colors", &output_only_modified);
+
+            static ImGuiTextFilter filter;
+            ImGui::SetNextItemWidth(ImGui::GetFontSize() * 16);
+            filter.Draw("Filter colors");
+
+            static ImGuiColorEditFlags alpha_flags = ImGuiColorEditFlags_AlphaPreviewHalf;
+#if IMGUI_VERSION_NUM < 19173
+            if (ImGui::RadioButton("Opaque", alpha_flags == ImGuiColorEditFlags_None))             { alpha_flags = ImGuiColorEditFlags_None; } ImGui::SameLine();
+            if (ImGui::RadioButton("Alpha",  alpha_flags == ImGuiColorEditFlags_AlphaPreview))     { alpha_flags = ImGuiColorEditFlags_AlphaPreview; } ImGui::SameLine();
+            if (ImGui::RadioButton("Both",   alpha_flags == ImGuiColorEditFlags_AlphaPreviewHalf)) { alpha_flags = ImGuiColorEditFlags_AlphaPreviewHalf; } ImGui::SameLine();
+#else
+            if (ImGui::RadioButton("Opaque", alpha_flags == ImGuiColorEditFlags_AlphaOpaque))      { alpha_flags = ImGuiColorEditFlags_AlphaOpaque; } ImGui::SameLine();
+            if (ImGui::RadioButton("Alpha",  alpha_flags == ImGuiColorEditFlags_None))             { alpha_flags = ImGuiColorEditFlags_None; } ImGui::SameLine();
+            if (ImGui::RadioButton("Both",   alpha_flags == ImGuiColorEditFlags_AlphaPreviewHalf)) { alpha_flags = ImGuiColorEditFlags_AlphaPreviewHalf; } ImGui::SameLine();
+#endif
+            HelpMarker(
+                "In the color list:\n"
+                "Left-click on colored square to open color picker,\n"
+                "Right-click to open edit options menu.");
+            ImGui::Separator();
+            ImGui::PushItemWidth(-160);
+            for (int i = 0; i < ImPlotCol_COUNT; i++) {
+                const char* name = ImPlot::GetStyleColorName(i);
+                if (!filter.PassFilter(name))
+                    continue;
+                ImGui::PushID(i);
+                ImVec4 temp = GetStyleColorVec4(i);
+                const bool is_auto = IsColorAuto(i);
+                if (!is_auto)
+                    ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.25f);
+                if (ImGui::Button("Auto")) {
+                    if (is_auto)
+                        style.Colors[i] = temp;
+                    else
+                        style.Colors[i] = IMPLOT_AUTO_COL;
+                    BustItemCache();
+                }
+                if (!is_auto)
+                    ImGui::PopStyleVar();
+                ImGui::SameLine();
+                if (ImGui::ColorEdit4(name, &temp.x, ImGuiColorEditFlags_NoInputs | alpha_flags)) {
+                    style.Colors[i] = temp;
+                    BustItemCache();
+                }
+                if (memcmp(&style.Colors[i], &ref->Colors[i], sizeof(ImVec4)) != 0) {
+                    ImGui::SameLine(175); if (ImGui::Button("Save")) { ref->Colors[i] = style.Colors[i]; }
+                    ImGui::SameLine(); if (ImGui::Button("Revert")) {
+                        style.Colors[i] = ref->Colors[i];
+                        BustItemCache();
+                    }
+                }
+                ImGui::PopID();
+            }
+            ImGui::PopItemWidth();
+            ImGui::Separator();
+            ImGui::Text("Colors that are set to Auto (i.e. IMPLOT_AUTO_COL) will\n"
+                        "be automatically deduced from your ImGui style.");
+            ImGui::EndTabItem();
+        }
+        if (ImGui::BeginTabItem("Colormaps")) {
+            static int output_dest = 0;
+            if (ImGui::Button("Export", ImVec2(75,0))) {
+                if (output_dest == 0)
+                    ImGui::LogToClipboard();
+                else
+                    ImGui::LogToTTY();
+                int size = GetColormapSize();
+                const char* name = GetColormapName(gp.Style.Colormap);
+                ImGui::LogText("static const ImU32 %s_Data[%d] = {\n", name, size);
+                for (int i = 0; i < size; ++i) {
+                    ImU32 col = GetColormapColorU32(i,gp.Style.Colormap);
+                    ImGui::LogText("    %u%s\n", col, i == size - 1 ? "" : ",");
+                }
+                ImGui::LogText("};\nImPlotColormap %s = ImPlot::AddColormap(\"%s\", %s_Data, %d);", name, name, name, size);
+                ImGui::LogFinish();
+            }
+            ImGui::SameLine(); ImGui::SetNextItemWidth(120); ImGui::Combo("##output_type", &output_dest, "To Clipboard\0To TTY\0");
+            ImGui::SameLine();
+            static bool edit = false;
+            ImGui::Checkbox("Edit Mode",&edit);
+
+            // built-in/added
+            ImGui::Separator();
+            for (int i = 0; i < gp.ColormapData.Count; ++i) {
+                ImGui::PushID(i);
+                int size = gp.ColormapData.GetKeyCount(i);
+                bool selected = i == gp.Style.Colormap;
+
+                const char* name = GetColormapName(i);
+                if (!selected)
+                    ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.25f);
+                if (ImGui::Button(name, ImVec2(100,0))) {
+                    gp.Style.Colormap = i;
+                    BustItemCache();
+                }
+                if (!selected)
+                    ImGui::PopStyleVar();
+                ImGui::SameLine();
+                ImGui::BeginGroup();
+                if (edit) {
+                    for (int c = 0; c < size; ++c) {
+                        ImGui::PushID(c);
+                        ImVec4 col4 = ImGui::ColorConvertU32ToFloat4(gp.ColormapData.GetKeyColor(i,c));
+                        if (ImGui::ColorEdit4("",&col4.x,ImGuiColorEditFlags_NoInputs)) {
+                            ImU32 col32 = ImGui::ColorConvertFloat4ToU32(col4);
+                            gp.ColormapData.SetKeyColor(i,c,col32);
+                            BustItemCache();
+                        }
+                        if ((c + 1) % 12 != 0 && c != size -1)
+                            ImGui::SameLine();
+                        ImGui::PopID();
+                    }
+                }
+                else {
+                    if (ImPlot::ColormapButton("##",ImVec2(-1,0),i))
+                        edit = true;
+                }
+                ImGui::EndGroup();
+                ImGui::PopID();
+            }
+
+
+            static ImVector<ImVec4> custom;
+            if (custom.Size == 0) {
+                custom.push_back(ImVec4(1,0,0,1));
+                custom.push_back(ImVec4(0,1,0,1));
+                custom.push_back(ImVec4(0,0,1,1));
+            }
+            ImGui::Separator();
+            ImGui::BeginGroup();
+            static char name[16] = "MyColormap";
+
+
+            if (ImGui::Button("+", ImVec2((100 - ImGui::GetStyle().ItemSpacing.x)/2,0)))
+                custom.push_back(ImVec4(0,0,0,1));
+            ImGui::SameLine();
+            if (ImGui::Button("-", ImVec2((100 - ImGui::GetStyle().ItemSpacing.x)/2,0)) && custom.Size > 2)
+                custom.pop_back();
+            ImGui::SetNextItemWidth(100);
+            ImGui::InputText("##Name",name,16,ImGuiInputTextFlags_CharsNoBlank);
+            static bool qual = true;
+            ImGui::Checkbox("Qualitative",&qual);
+            if (ImGui::Button("Add", ImVec2(100, 0)) && gp.ColormapData.GetIndex(name)==-1)
+                AddColormap(name,custom.Data,custom.Size,qual);
+
+            ImGui::EndGroup();
+            ImGui::SameLine();
+            ImGui::BeginGroup();
+            for (int c = 0; c < custom.Size; ++c) {
+                ImGui::PushID(c);
+                if (ImGui::ColorEdit4("##Col1", &custom[c].x, ImGuiColorEditFlags_NoInputs)) {
+
+                }
+                if ((c + 1) % 12 != 0)
+                    ImGui::SameLine();
+                ImGui::PopID();
+            }
+            ImGui::EndGroup();
+
+
+            ImGui::EndTabItem();
+        }
+        ImGui::EndTabBar();
+    }
+}
+
+void ShowUserGuide() {
+        ImGui::BulletText("Left-click drag within the plot area to pan X and Y axes.");
+    ImGui::Indent();
+        ImGui::BulletText("Left-click drag on axis labels to pan an individual axis.");
+    ImGui::Unindent();
+    ImGui::BulletText("Scroll in the plot area to zoom both X and Y axes.");
+    ImGui::Indent();
+        ImGui::BulletText("Scroll on axis labels to zoom an individual axis.");
+    ImGui::Unindent();
+    ImGui::BulletText("Right-click drag to box select data.");
+    ImGui::Indent();
+        ImGui::BulletText("Hold Alt to expand box selection horizontally.");
+        ImGui::BulletText("Hold Shift to expand box selection vertically.");
+        ImGui::BulletText("Left-click while box selecting to cancel the selection.");
+    ImGui::Unindent();
+    ImGui::BulletText("Double left-click to fit all visible data.");
+    ImGui::Indent();
+        ImGui::BulletText("Double left-click axis labels to fit the individual axis.");
+    ImGui::Unindent();
+    ImGui::BulletText("Right-click open the full plot context menu.");
+    ImGui::Indent();
+        ImGui::BulletText("Right-click axis labels to open an individual axis context menu.");
+    ImGui::Unindent();
+    ImGui::BulletText("Click legend label icons to show/hide plot items.");
+}
+
+void ShowTicksMetrics(const ImPlotTicker& ticker) {
+    ImGui::BulletText("Size: %d", ticker.TickCount());
+    ImGui::BulletText("MaxSize: [%f,%f]", ticker.MaxSize.x, ticker.MaxSize.y);
+}
+
+void ShowAxisMetrics(const ImPlotPlot& plot, const ImPlotAxis& axis) {
+    ImGui::BulletText("Label: %s", axis.LabelOffset == -1 ? "[none]" : plot.GetAxisLabel(axis));
+    ImGui::BulletText("Flags: 0x%08X", axis.Flags);
+    ImGui::BulletText("Range: [%f,%f]",axis.Range.Min, axis.Range.Max);
+    ImGui::BulletText("Pixels: %f", axis.PixelSize());
+    ImGui::BulletText("Aspect: %f", axis.GetAspect());
+    ImGui::BulletText(axis.OrthoAxis == nullptr ? "OrthoAxis: NULL" : "OrthoAxis: 0x%08X", axis.OrthoAxis->ID);
+    ImGui::BulletText("LinkedMin: %p", (void*)axis.LinkedMin);
+    ImGui::BulletText("LinkedMax: %p", (void*)axis.LinkedMax);
+    ImGui::BulletText("HasRange: %s", axis.HasRange ? "true" : "false");
+    ImGui::BulletText("Hovered: %s", axis.Hovered ? "true" : "false");
+    ImGui::BulletText("Held: %s", axis.Held ? "true" : "false");
+
+    if (ImGui::TreeNode("Transform")) {
+        ImGui::BulletText("PixelMin: %f", axis.PixelMin);
+        ImGui::BulletText("PixelMax: %f", axis.PixelMax);
+        ImGui::BulletText("ScaleToPixel: %f", axis.ScaleToPixel);
+        ImGui::BulletText("ScaleMax: %f", axis.ScaleMax);
+        ImGui::TreePop();
+    }
+
+    if (ImGui::TreeNode("Ticks")) {
+        ShowTicksMetrics(axis.Ticker);
+        ImGui::TreePop();
+    }
+}
+
+void ShowMetricsWindow(bool* p_popen) {
+
+    static bool show_plot_rects = false;
+    static bool show_axes_rects = false;
+    static bool show_axis_rects = false;
+    static bool show_canvas_rects = false;
+    static bool show_frame_rects = false;
+    static bool show_subplot_frame_rects = false;
+    static bool show_subplot_grid_rects = false;
+    static bool show_legend_rects = false;
+
+    ImDrawList& fg = *ImGui::GetForegroundDrawList();
+
+    ImPlotContext& gp = *GImPlot;
+    // ImGuiContext& g = *GImGui;
+    ImGuiIO& io = ImGui::GetIO();
+    ImGui::Begin("ImPlot Metrics", p_popen);
+    ImGui::Text("ImPlot " IMPLOT_VERSION);
+    ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate);
+    ImGui::Text("Mouse Position: [%.0f,%.0f]", io.MousePos.x, io.MousePos.y);
+    ImGui::Separator();
+    if (ImGui::TreeNode("Tools")) {
+        if (ImGui::Button("Bust Plot Cache"))
+            BustPlotCache();
+        ImGui::SameLine();
+        if (ImGui::Button("Bust Item Cache"))
+            BustItemCache();
+        ImGui::Checkbox("Show Frame Rects", &show_frame_rects);
+        ImGui::Checkbox("Show Canvas Rects",&show_canvas_rects);
+        ImGui::Checkbox("Show Plot Rects",  &show_plot_rects);
+        ImGui::Checkbox("Show Axes Rects",  &show_axes_rects);
+        ImGui::Checkbox("Show Axis Rects",  &show_axis_rects);
+        ImGui::Checkbox("Show Subplot Frame Rects",  &show_subplot_frame_rects);
+        ImGui::Checkbox("Show Subplot Grid Rects",  &show_subplot_grid_rects);
+        ImGui::Checkbox("Show Legend Rects",  &show_legend_rects);
+        ImGui::TreePop();
+    }
+    const int n_plots = gp.Plots.GetBufSize();
+    const int n_subplots = gp.Subplots.GetBufSize();
+    // render rects
+    for (int p = 0; p < n_plots; ++p) {
+        ImPlotPlot* plot = gp.Plots.GetByIndex(p);
+        if (show_frame_rects)
+            fg.AddRect(plot->FrameRect.Min, plot->FrameRect.Max, IM_COL32(255,0,255,255));
+        if (show_canvas_rects)
+            fg.AddRect(plot->CanvasRect.Min, plot->CanvasRect.Max, IM_COL32(0,255,255,255));
+        if (show_plot_rects)
+            fg.AddRect(plot->PlotRect.Min, plot->PlotRect.Max, IM_COL32(255,255,0,255));
+        if (show_axes_rects)
+            fg.AddRect(plot->AxesRect.Min, plot->AxesRect.Max, IM_COL32(0,255,128,255));
+        if (show_axis_rects) {
+            for (int i = 0; i < ImAxis_COUNT; ++i) {
+                if (plot->Axes[i].Enabled)
+                    fg.AddRect(plot->Axes[i].HoverRect.Min, plot->Axes[i].HoverRect.Max, IM_COL32(0,255,0,255));
+            }
+        }
+        if (show_legend_rects && plot->Items.GetLegendCount() > 0) {
+            fg.AddRect(plot->Items.Legend.Rect.Min, plot->Items.Legend.Rect.Max, IM_COL32(255,192,0,255));
+            fg.AddRect(plot->Items.Legend.RectClamped.Min, plot->Items.Legend.RectClamped.Max, IM_COL32(255,128,0,255));
+        }
+    }
+    for (int p = 0; p < n_subplots; ++p) {
+        ImPlotSubplot* subplot = gp.Subplots.GetByIndex(p);
+        if (show_subplot_frame_rects)
+            fg.AddRect(subplot->FrameRect.Min, subplot->FrameRect.Max, IM_COL32(255,0,0,255));
+        if (show_subplot_grid_rects)
+            fg.AddRect(subplot->GridRect.Min, subplot->GridRect.Max, IM_COL32(0,0,255,255));
+        if (show_legend_rects && subplot->Items.GetLegendCount() > 0) {
+            fg.AddRect(subplot->Items.Legend.Rect.Min, subplot->Items.Legend.Rect.Max, IM_COL32(255,192,0,255));
+            fg.AddRect(subplot->Items.Legend.RectClamped.Min, subplot->Items.Legend.RectClamped.Max, IM_COL32(255,128,0,255));
+        }
+    }
+    if (ImGui::TreeNode("Plots","Plots (%d)", n_plots)) {
+        for (int p = 0; p < n_plots; ++p) {
+            // plot
+            ImPlotPlot& plot = *gp.Plots.GetByIndex(p);
+            ImGui::PushID(p);
+            if (ImGui::TreeNode("Plot", "Plot [0x%08X]", plot.ID)) {
+                int n_items = plot.Items.GetItemCount();
+                if (ImGui::TreeNode("Items", "Items (%d)", n_items)) {
+                    for (int i = 0; i < n_items; ++i) {
+                        ImPlotItem* item = plot.Items.GetItemByIndex(i);
+                        ImGui::PushID(i);
+                        if (ImGui::TreeNode("Item", "Item [0x%08X]", item->ID)) {
+                            ImGui::Bullet(); ImGui::Checkbox("Show", &item->Show);
+                            ImGui::Bullet();
+                            ImVec4 temp = ImGui::ColorConvertU32ToFloat4(item->Color);
+                            if (ImGui::ColorEdit4("Color",&temp.x, ImGuiColorEditFlags_NoInputs))
+                                item->Color = ImGui::ColorConvertFloat4ToU32(temp);
+                            ImGui::BulletText("Marker: %s", GetMarkerName(item->Marker));
+                            ImGui::BulletText("NameOffset: %d",item->NameOffset);
+                            ImGui::BulletText("Name: %s", item->NameOffset != -1 ? plot.Items.Legend.Labels.Buf.Data + item->NameOffset : "N/A");
+                            ImGui::BulletText("Hovered: %s",item->LegendHovered ? "true" : "false");
+                            ImGui::TreePop();
+                        }
+                        ImGui::PopID();
+                    }
+                    ImGui::TreePop();
+                }
+                char buff[16];
+                for (int i = 0; i < IMPLOT_NUM_X_AXES; ++i) {
+                    ImFormatString(buff,16,"X-Axis %d", i+1);
+                    if (plot.XAxis(i).Enabled && ImGui::TreeNode(buff, "X-Axis %d [0x%08X]", i+1, plot.XAxis(i).ID)) {
+                        ShowAxisMetrics(plot, plot.XAxis(i));
+                        ImGui::TreePop();
+                    }
+                }
+                for (int i = 0; i < IMPLOT_NUM_Y_AXES; ++i) {
+                    ImFormatString(buff,16,"Y-Axis %d", i+1);
+                    if (plot.YAxis(i).Enabled && ImGui::TreeNode(buff, "Y-Axis %d [0x%08X]", i+1, plot.YAxis(i).ID)) {
+                        ShowAxisMetrics(plot, plot.YAxis(i));
+                        ImGui::TreePop();
+                    }
+                }
+                ImGui::BulletText("Title: %s", plot.HasTitle() ? plot.GetTitle() : "none");
+                ImGui::BulletText("Flags: 0x%08X", plot.Flags);
+                ImGui::BulletText("Initialized: %s", plot.Initialized ? "true" : "false");
+                ImGui::BulletText("Selecting: %s", plot.Selecting ? "true" : "false");
+                ImGui::BulletText("Selected: %s", plot.Selected ? "true" : "false");
+                ImGui::BulletText("Hovered: %s", plot.Hovered ? "true" : "false");
+                ImGui::BulletText("Held: %s", plot.Held ? "true" : "false");
+                ImGui::BulletText("LegendHovered: %s", plot.Items.Legend.Hovered ? "true" : "false");
+                ImGui::BulletText("ContextLocked: %s", plot.ContextLocked ? "true" : "false");
+                ImGui::TreePop();
+            }
+            ImGui::PopID();
+        }
+        ImGui::TreePop();
+    }
+
+    if (ImGui::TreeNode("Subplots","Subplots (%d)", n_subplots)) {
+        for (int p = 0; p < n_subplots; ++p) {
+            // plot
+            ImPlotSubplot& plot = *gp.Subplots.GetByIndex(p);
+            ImGui::PushID(p);
+            if (ImGui::TreeNode("Subplot", "Subplot [0x%08X]", plot.ID)) {
+                int n_items = plot.Items.GetItemCount();
+                if (ImGui::TreeNode("Items", "Items (%d)", n_items)) {
+                    for (int i = 0; i < n_items; ++i) {
+                        ImPlotItem* item = plot.Items.GetItemByIndex(i);
+                        ImGui::PushID(i);
+                        if (ImGui::TreeNode("Item", "Item [0x%08X]", item->ID)) {
+                            ImGui::Bullet(); ImGui::Checkbox("Show", &item->Show);
+                            ImGui::Bullet();
+                            ImVec4 temp = ImGui::ColorConvertU32ToFloat4(item->Color);
+                            if (ImGui::ColorEdit4("Color",&temp.x, ImGuiColorEditFlags_NoInputs))
+                                item->Color = ImGui::ColorConvertFloat4ToU32(temp);
+
+                            ImGui::BulletText("NameOffset: %d",item->NameOffset);
+                            ImGui::BulletText("Name: %s", item->NameOffset != -1 ? plot.Items.Legend.Labels.Buf.Data + item->NameOffset : "N/A");
+                            ImGui::BulletText("Hovered: %s",item->LegendHovered ? "true" : "false");
+                            ImGui::TreePop();
+                        }
+                        ImGui::PopID();
+                    }
+                    ImGui::TreePop();
+                }
+                ImGui::BulletText("Flags: 0x%08X", plot.Flags);
+                ImGui::BulletText("FrameHovered: %s", plot.FrameHovered ? "true" : "false");
+                ImGui::BulletText("LegendHovered: %s", plot.Items.Legend.Hovered ? "true" : "false");
+                ImGui::TreePop();
+            }
+            ImGui::PopID();
+        }
+        ImGui::TreePop();
+    }
+    if (ImGui::TreeNode("Colormaps")) {
+        ImGui::BulletText("Colormaps:  %d", gp.ColormapData.Count);
+        ImGui::BulletText("Memory: %d bytes", gp.ColormapData.Tables.Size * 4);
+        if (ImGui::TreeNode("Data")) {
+            for (int m = 0; m < gp.ColormapData.Count; ++m) {
+                if (ImGui::TreeNode(gp.ColormapData.GetName(m))) {
+                    int count = gp.ColormapData.GetKeyCount(m);
+                    int size = gp.ColormapData.GetTableSize(m);
+                    bool qual = gp.ColormapData.IsQual(m);
+                    ImGui::BulletText("Qualitative: %s", qual ? "true" : "false");
+                    ImGui::BulletText("Key Count: %d", count);
+                    ImGui::BulletText("Table Size: %d", size);
+                    ImGui::Indent();
+
+                    static float t = 0.5;
+                    ImVec4 samp;
+                    float wid = 32 * 10 - ImGui::GetFrameHeight() - ImGui::GetStyle().ItemSpacing.x;
+                    ImGui::SetNextItemWidth(wid);
+                    ImPlot::ColormapSlider("##Sample",&t,&samp,"%.3f",m);
+                    ImGui::SameLine();
+                    ImGui::ColorButton("Sampler",samp);
+                    ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(0,0,0,0));
+                    ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0,0));
+                    for (int c = 0; c < size; ++c) {
+                        ImVec4 col = ImGui::ColorConvertU32ToFloat4(gp.ColormapData.GetTableColor(m,c));
+                        ImGui::PushID(m*1000+c);
+                        ImGui::ColorButton("",col,0,ImVec2(10,10));
+                        ImGui::PopID();
+                        if ((c + 1) % 32 != 0 && c != size - 1)
+                            ImGui::SameLine();
+                    }
+                    ImGui::PopStyleVar();
+                    ImGui::PopStyleColor();
+                    ImGui::Unindent();
+                    ImGui::TreePop();
+                }
+            }
+            ImGui::TreePop();
+        }
+        ImGui::TreePop();
+    }
+    ImGui::End();
+}
+
+bool ShowDatePicker(const char* id, int* level, ImPlotTime* t, const ImPlotTime* t1, const ImPlotTime* t2) {
+
+    ImGui::PushID(id);
+    ImGui::BeginGroup();
+
+    ImGuiStyle& style = ImGui::GetStyle();
+    ImVec4 col_txt    = style.Colors[ImGuiCol_Text];
+    ImVec4 col_dis    = style.Colors[ImGuiCol_TextDisabled];
+    ImVec4 col_btn    = style.Colors[ImGuiCol_Button];
+    ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0,0,0,0));
+    ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0,0));
+
+    const float ht    = ImGui::GetFrameHeight();
+    ImVec2 cell_size(ht*1.25f,ht);
+    char buff[32];
+    bool clk = false;
+    tm& Tm = GImPlot->Tm;
+
+    const int min_yr = 1970;
+    const int max_yr = 2999;
+
+    // t1 parts
+    int t1_mo = 0; int t1_md = 0; int t1_yr = 0;
+    if (t1 != nullptr) {
+        GetTime(*t1,&Tm);
+        t1_mo = Tm.tm_mon;
+        t1_md = Tm.tm_mday;
+        t1_yr = Tm.tm_year + 1900;
+    }
+
+     // t2 parts
+    int t2_mo = 0; int t2_md = 0; int t2_yr = 0;
+    if (t2 != nullptr) {
+        GetTime(*t2,&Tm);
+        t2_mo = Tm.tm_mon;
+        t2_md = Tm.tm_mday;
+        t2_yr = Tm.tm_year + 1900;
+    }
+
+    // day widget
+    if (*level == 0) {
+        *t = FloorTime(*t, ImPlotTimeUnit_Day);
+        GetTime(*t, &Tm);
+        const int this_year = Tm.tm_year + 1900;
+        const int last_year = this_year - 1;
+        const int next_year = this_year + 1;
+        const int this_mon  = Tm.tm_mon;
+        const int last_mon  = this_mon == 0 ? 11 : this_mon - 1;
+        const int next_mon  = this_mon == 11 ? 0 : this_mon + 1;
+        const int days_this_mo = GetDaysInMonth(this_year, this_mon);
+        const int days_last_mo = GetDaysInMonth(this_mon == 0 ? last_year : this_year, last_mon);
+        ImPlotTime t_first_mo = FloorTime(*t,ImPlotTimeUnit_Mo);
+        GetTime(t_first_mo,&Tm);
+        const int first_wd = Tm.tm_wday;
+        // month year
+        ImFormatString(buff, 32, "%s %d", MONTH_NAMES[this_mon], this_year);
+        if (ImGui::Button(buff))
+            *level = 1;
+        ImGui::SameLine(5*cell_size.x);
+        BeginDisabledControls(this_year <= min_yr && this_mon == 0);
+        if (ImGui::ArrowButtonEx("##Up",ImGuiDir_Up,cell_size))
+            *t = AddTime(*t, ImPlotTimeUnit_Mo, -1);
+        EndDisabledControls(this_year <= min_yr && this_mon == 0);
+        ImGui::SameLine();
+        BeginDisabledControls(this_year >= max_yr && this_mon == 11);
+        if (ImGui::ArrowButtonEx("##Down",ImGuiDir_Down,cell_size))
+            *t = AddTime(*t, ImPlotTimeUnit_Mo, 1);
+        EndDisabledControls(this_year >= max_yr && this_mon == 11);
+        // render weekday abbreviations
+        ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
+        for (int i = 0; i < 7; ++i) {
+            ImGui::Button(WD_ABRVS[i],cell_size);
+            if (i != 6) { ImGui::SameLine(); }
+        }
+        ImGui::PopItemFlag();
+        // 0 = last mo, 1 = this mo, 2 = next mo
+        int mo = first_wd > 0 ? 0 : 1;
+        int day = mo == 1 ? 1 : days_last_mo - first_wd + 1;
+        for (int i = 0; i < 6; ++i) {
+            for (int j = 0; j < 7; ++j) {
+                if (mo == 0 && day > days_last_mo) {
+                    mo = 1;
+                    day = 1;
+                }
+                else if (mo == 1 && day > days_this_mo) {
+                    mo = 2;
+                    day = 1;
+                }
+                const int now_yr = (mo == 0 && this_mon == 0) ? last_year : ((mo == 2 && this_mon == 11) ? next_year : this_year);
+                const int now_mo = mo == 0 ? last_mon : (mo == 1 ? this_mon : next_mon);
+                const int now_md = day;
+
+                const bool off_mo   = mo == 0 || mo == 2;
+                const bool t1_or_t2 = (t1 != nullptr && t1_mo == now_mo && t1_yr == now_yr && t1_md == now_md) ||
+                                      (t2 != nullptr && t2_mo == now_mo && t2_yr == now_yr && t2_md == now_md);
+
+                if (off_mo)
+                    ImGui::PushStyleColor(ImGuiCol_Text, col_dis);
+                if (t1_or_t2) {
+                    ImGui::PushStyleColor(ImGuiCol_Button, col_btn);
+                    ImGui::PushStyleColor(ImGuiCol_Text, col_txt);
+                }
+                ImGui::PushID(i*7+j);
+                ImFormatString(buff,32,"%d",day);
+                if (now_yr == min_yr-1 || now_yr == max_yr+1) {
+                    ImGui::Dummy(cell_size);
+                }
+                else if (ImGui::Button(buff,cell_size) && !clk) {
+                    *t = MakeTime(now_yr, now_mo, now_md);
+                    clk = true;
+                }
+                ImGui::PopID();
+                if (t1_or_t2)
+                    ImGui::PopStyleColor(2);
+                if (off_mo)
+                    ImGui::PopStyleColor();
+                if (j != 6)
+                    ImGui::SameLine();
+                day++;
+            }
+        }
+    }
+    // month widget
+    else if (*level == 1) {
+        *t = FloorTime(*t, ImPlotTimeUnit_Mo);
+        GetTime(*t, &Tm);
+        int this_yr  = Tm.tm_year + 1900;
+        ImFormatString(buff, 32, "%d", this_yr);
+        if (ImGui::Button(buff))
+            *level = 2;
+        BeginDisabledControls(this_yr <= min_yr);
+        ImGui::SameLine(5*cell_size.x);
+        if (ImGui::ArrowButtonEx("##Up",ImGuiDir_Up,cell_size))
+            *t = AddTime(*t, ImPlotTimeUnit_Yr, -1);
+        EndDisabledControls(this_yr <= min_yr);
+        ImGui::SameLine();
+        BeginDisabledControls(this_yr >= max_yr);
+        if (ImGui::ArrowButtonEx("##Down",ImGuiDir_Down,cell_size))
+            *t = AddTime(*t, ImPlotTimeUnit_Yr, 1);
+        EndDisabledControls(this_yr >= max_yr);
+        // ImGui::Dummy(cell_size);
+        cell_size.x *= 7.0f/4.0f;
+        cell_size.y *= 7.0f/3.0f;
+        int mo = 0;
+        for (int i = 0; i < 3; ++i) {
+            for (int j = 0; j < 4; ++j) {
+                const bool t1_or_t2 = (t1 != nullptr && t1_yr == this_yr && t1_mo == mo) ||
+                                      (t2 != nullptr && t2_yr == this_yr && t2_mo == mo);
+                if (t1_or_t2)
+                    ImGui::PushStyleColor(ImGuiCol_Button, col_btn);
+                if (ImGui::Button(MONTH_ABRVS[mo],cell_size) && !clk) {
+                    *t = MakeTime(this_yr, mo);
+                    *level = 0;
+                }
+                if (t1_or_t2)
+                    ImGui::PopStyleColor();
+                if (j != 3)
+                    ImGui::SameLine();
+                mo++;
+            }
+        }
+    }
+    else if (*level == 2) {
+        *t = FloorTime(*t, ImPlotTimeUnit_Yr);
+        int this_yr = GetYear(*t);
+        int yr = this_yr  - this_yr % 20;
+        ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
+        ImFormatString(buff,32,"%d-%d",yr,yr+19);
+        ImGui::Button(buff);
+        ImGui::PopItemFlag();
+        ImGui::SameLine(5*cell_size.x);
+        BeginDisabledControls(yr <= min_yr);
+        if (ImGui::ArrowButtonEx("##Up",ImGuiDir_Up,cell_size))
+            *t = MakeTime(yr-20);
+        EndDisabledControls(yr <= min_yr);
+        ImGui::SameLine();
+        BeginDisabledControls(yr + 20 >= max_yr);
+        if (ImGui::ArrowButtonEx("##Down",ImGuiDir_Down,cell_size))
+            *t = MakeTime(yr+20);
+        EndDisabledControls(yr+ 20 >= max_yr);
+        // ImGui::Dummy(cell_size);
+        cell_size.x *= 7.0f/4.0f;
+        cell_size.y *= 7.0f/5.0f;
+        for (int i = 0; i < 5; ++i) {
+            for (int j = 0; j < 4; ++j) {
+                const bool t1_or_t2 = (t1 != nullptr && t1_yr == yr) || (t2 != nullptr && t2_yr == yr);
+                if (t1_or_t2)
+                    ImGui::PushStyleColor(ImGuiCol_Button, col_btn);
+                ImFormatString(buff,32,"%d",yr);
+                if (yr<1970||yr>3000) {
+                    ImGui::Dummy(cell_size);
+                }
+                else if (ImGui::Button(buff,cell_size)) {
+                    *t = MakeTime(yr);
+                    *level = 1;
+                }
+                if (t1_or_t2)
+                    ImGui::PopStyleColor();
+                if (j != 3)
+                    ImGui::SameLine();
+                yr++;
+            }
+        }
+    }
+    ImGui::PopStyleVar();
+    ImGui::PopStyleColor();
+    ImGui::EndGroup();
+    ImGui::PopID();
+    return clk;
+}
+
+bool ShowTimePicker(const char* id, ImPlotTime* t) {
+    ImPlotContext& gp = *GImPlot;
+    ImGui::PushID(id);
+    tm& Tm = gp.Tm;
+    GetTime(*t,&Tm);
+
+    static const char* nums[] = { "00","01","02","03","04","05","06","07","08","09",
+                                  "10","11","12","13","14","15","16","17","18","19",
+                                  "20","21","22","23","24","25","26","27","28","29",
+                                  "30","31","32","33","34","35","36","37","38","39",
+                                  "40","41","42","43","44","45","46","47","48","49",
+                                  "50","51","52","53","54","55","56","57","58","59"};
+
+    static const char* am_pm[] = {"am","pm"};
+
+    bool hour24 = gp.Style.Use24HourClock;
+
+    int hr  = hour24 ? Tm.tm_hour : ((Tm.tm_hour == 0 || Tm.tm_hour == 12) ? 12 : Tm.tm_hour % 12);
+    int min = Tm.tm_min;
+    int sec = Tm.tm_sec;
+    int ap  = Tm.tm_hour < 12 ? 0 : 1;
+
+    bool changed = false;
+
+    ImVec2 spacing = ImGui::GetStyle().ItemSpacing;
+    spacing.x = 0;
+    float width    = ImGui::CalcTextSize("888").x;
+    float height   = ImGui::GetFrameHeight();
+
+    ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, spacing);
+    ImGui::PushStyleVar(ImGuiStyleVar_ScrollbarSize,2.0f);
+    ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(0,0,0,0));
+    ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0,0,0,0));
+    ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered));
+
+    ImGui::SetNextItemWidth(width);
+    if (ImGui::BeginCombo("##hr",nums[hr],ImGuiComboFlags_NoArrowButton)) {
+        const int ia = hour24 ? 0 : 1;
+        const int ib = hour24 ? 24 : 13;
+        for (int i = ia; i < ib; ++i) {
+            if (ImGui::Selectable(nums[i],i==hr)) {
+                hr = i;
+                changed = true;
+            }
+        }
+        ImGui::EndCombo();
+    }
+    ImGui::SameLine();
+    ImGui::Text(":");
+    ImGui::SameLine();
+    ImGui::SetNextItemWidth(width);
+    if (ImGui::BeginCombo("##min",nums[min],ImGuiComboFlags_NoArrowButton)) {
+        for (int i = 0; i < 60; ++i) {
+            if (ImGui::Selectable(nums[i],i==min)) {
+                min = i;
+                changed = true;
+            }
+        }
+        ImGui::EndCombo();
+    }
+    ImGui::SameLine();
+    ImGui::Text(":");
+    ImGui::SameLine();
+    ImGui::SetNextItemWidth(width);
+    if (ImGui::BeginCombo("##sec",nums[sec],ImGuiComboFlags_NoArrowButton)) {
+        for (int i = 0; i < 60; ++i) {
+            if (ImGui::Selectable(nums[i],i==sec)) {
+                sec = i;
+                changed = true;
+            }
+        }
+        ImGui::EndCombo();
+    }
+    if (!hour24) {
+        ImGui::SameLine();
+        if (ImGui::Button(am_pm[ap],ImVec2(0,height))) {
+            ap = 1 - ap;
+            changed = true;
+        }
+    }
+
+    ImGui::PopStyleColor(3);
+    ImGui::PopStyleVar(2);
+    ImGui::PopID();
+
+    if (changed) {
+        if (!hour24)
+            hr = hr % 12 + ap * 12;
+        Tm.tm_hour = hr;
+        Tm.tm_min  = min;
+        Tm.tm_sec  = sec;
+        *t = MkTime(&Tm);
+    }
+
+    return changed;
+}
+
+void StyleColorsAuto(ImPlotStyle* dst) {
+    ImPlotStyle* style              = dst ? dst : &ImPlot::GetStyle();
+    ImVec4* colors                  = style->Colors;
+
+    style->MinorAlpha               = 0.25f;
+
+    colors[ImPlotCol_FrameBg]       = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_PlotBg]        = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_PlotBorder]    = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_LegendBg]      = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_LegendBorder]  = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_LegendText]    = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_TitleText]     = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_InlayText]     = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_PlotBorder]    = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_AxisText]      = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_AxisGrid]      = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_AxisTick]      = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_AxisBg]        = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_AxisBgHovered] = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_AxisBgActive]  = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_Selection]     = IMPLOT_AUTO_COL;
+    colors[ImPlotCol_Crosshairs]    = IMPLOT_AUTO_COL;
+}
+
+void StyleColorsClassic(ImPlotStyle* dst) {
+    ImPlotStyle* style              = dst ? dst : &ImPlot::GetStyle();
+    ImVec4* colors                  = style->Colors;
+
+    style->MinorAlpha               = 0.5f;
+    
+    colors[ImPlotCol_FrameBg]       = ImVec4(0.43f, 0.43f, 0.43f, 0.39f);
+    colors[ImPlotCol_PlotBg]        = ImVec4(0.00f, 0.00f, 0.00f, 0.35f);
+    colors[ImPlotCol_PlotBorder]    = ImVec4(0.50f, 0.50f, 0.50f, 0.50f);
+    colors[ImPlotCol_LegendBg]      = ImVec4(0.11f, 0.11f, 0.14f, 0.92f);
+    colors[ImPlotCol_LegendBorder]  = ImVec4(0.50f, 0.50f, 0.50f, 0.50f);
+    colors[ImPlotCol_LegendText]    = ImVec4(0.90f, 0.90f, 0.90f, 1.00f);
+    colors[ImPlotCol_TitleText]     = ImVec4(0.90f, 0.90f, 0.90f, 1.00f);
+    colors[ImPlotCol_InlayText]     = ImVec4(0.90f, 0.90f, 0.90f, 1.00f);
+    colors[ImPlotCol_AxisText]      = ImVec4(0.90f, 0.90f, 0.90f, 1.00f);
+    colors[ImPlotCol_AxisGrid]      = ImVec4(0.90f, 0.90f, 0.90f, 0.25f);
+    colors[ImPlotCol_AxisTick]      = IMPLOT_AUTO_COL; // TODO
+    colors[ImPlotCol_AxisBg]        = IMPLOT_AUTO_COL; // TODO
+    colors[ImPlotCol_AxisBgHovered] = IMPLOT_AUTO_COL; // TODO
+    colors[ImPlotCol_AxisBgActive]  = IMPLOT_AUTO_COL; // TODO
+    colors[ImPlotCol_Selection]     = ImVec4(0.97f, 0.97f, 0.39f, 1.00f);
+    colors[ImPlotCol_Crosshairs]    = ImVec4(0.50f, 0.50f, 0.50f, 0.75f);
+}
+
+void StyleColorsDark(ImPlotStyle* dst) {
+    ImPlotStyle* style              = dst ? dst : &ImPlot::GetStyle();
+    ImVec4* colors                  = style->Colors;
+
+    style->MinorAlpha               = 0.25f;
+
+    colors[ImPlotCol_FrameBg]       = ImVec4(1.00f, 1.00f, 1.00f, 0.07f);
+    colors[ImPlotCol_PlotBg]        = ImVec4(0.00f, 0.00f, 0.00f, 0.50f);
+    colors[ImPlotCol_PlotBorder]    = ImVec4(0.43f, 0.43f, 0.50f, 0.50f);
+    colors[ImPlotCol_LegendBg]      = ImVec4(0.08f, 0.08f, 0.08f, 0.94f);
+    colors[ImPlotCol_LegendBorder]  = ImVec4(0.43f, 0.43f, 0.50f, 0.50f);
+    colors[ImPlotCol_LegendText]    = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
+    colors[ImPlotCol_TitleText]     = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
+    colors[ImPlotCol_InlayText]     = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
+    colors[ImPlotCol_AxisText]      = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
+    colors[ImPlotCol_AxisGrid]      = ImVec4(1.00f, 1.00f, 1.00f, 0.25f);
+    colors[ImPlotCol_AxisTick]      = IMPLOT_AUTO_COL; // TODO
+    colors[ImPlotCol_AxisBg]        = IMPLOT_AUTO_COL; // TODO
+    colors[ImPlotCol_AxisBgHovered] = IMPLOT_AUTO_COL; // TODO
+    colors[ImPlotCol_AxisBgActive]  = IMPLOT_AUTO_COL; // TODO
+    colors[ImPlotCol_Selection]     = ImVec4(1.00f, 0.60f, 0.00f, 1.00f);
+    colors[ImPlotCol_Crosshairs]    = ImVec4(1.00f, 1.00f, 1.00f, 0.50f);
+}
+
+void StyleColorsLight(ImPlotStyle* dst) {
+    ImPlotStyle* style              = dst ? dst : &ImPlot::GetStyle();
+    ImVec4* colors                  = style->Colors;
+
+    style->MinorAlpha               = 1.0f;
+
+    colors[ImPlotCol_FrameBg]       = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
+    colors[ImPlotCol_PlotBg]        = ImVec4(0.42f, 0.57f, 1.00f, 0.13f);
+    colors[ImPlotCol_PlotBorder]    = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
+    colors[ImPlotCol_LegendBg]      = ImVec4(1.00f, 1.00f, 1.00f, 0.98f);
+    colors[ImPlotCol_LegendBorder]  = ImVec4(0.82f, 0.82f, 0.82f, 0.80f);
+    colors[ImPlotCol_LegendText]    = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);
+    colors[ImPlotCol_TitleText]     = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);
+    colors[ImPlotCol_InlayText]     = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);
+    colors[ImPlotCol_AxisText]      = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);
+    colors[ImPlotCol_AxisGrid]      = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
+    colors[ImPlotCol_AxisTick]      = ImVec4(0.00f, 0.00f, 0.00f, 0.25f);
+    colors[ImPlotCol_AxisBg]        = IMPLOT_AUTO_COL; // TODO
+    colors[ImPlotCol_AxisBgHovered] = IMPLOT_AUTO_COL; // TODO
+    colors[ImPlotCol_AxisBgActive]  = IMPLOT_AUTO_COL; // TODO
+    colors[ImPlotCol_Selection]     = ImVec4(0.82f, 0.64f, 0.03f, 1.00f);
+    colors[ImPlotCol_Crosshairs]    = ImVec4(0.00f, 0.00f, 0.00f, 0.50f);
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] Obsolete Functions/Types
+//-----------------------------------------------------------------------------
+
+#ifndef IMPLOT_DISABLE_OBSOLETE_FUNCTIONS
+
+// Deprecated method will go in here
+
+#endif
+
+}  // namespace ImPlot
+
+#endif // #ifndef IMGUI_DISABLE
diff --git a/cbits/implot/implot.h b/cbits/implot/implot.h
new file mode 100644
--- /dev/null
+++ b/cbits/implot/implot.h
@@ -0,0 +1,1408 @@
+// MIT License
+
+// Copyright (c) 2020-2024 Evan Pezent
+// Copyright (c) 2025-2026 Breno Cunha Queiroz
+
+// 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.
+
+// ImPlot v1.1 WIP
+
+// Table of Contents:
+//
+// [SECTION] Macros and Defines
+// [SECTION] Enums and Types
+// [SECTION] Callbacks
+// [SECTION] Contexts
+// [SECTION] Begin/End Plot
+// [SECTION] Begin/End Subplot
+// [SECTION] Setup
+// [SECTION] SetNext
+// [SECTION] Plot Items
+// [SECTION] Plot Tools
+// [SECTION] Plot Utils
+// [SECTION] Legend Utils
+// [SECTION] Drag and Drop
+// [SECTION] Styling
+// [SECTION] Colormaps
+// [SECTION] Input Mapping
+// [SECTION] Miscellaneous
+// [SECTION] Demo
+// [SECTION] Obsolete API
+
+#pragma once
+#include "imgui.h"
+#ifndef IMGUI_DISABLE
+
+//-----------------------------------------------------------------------------
+// [SECTION] Macros and Defines
+//-----------------------------------------------------------------------------
+
+// Define attributes of all API symbols declarations (e.g. for DLL under Windows)
+// Using ImPlot via a shared library is not recommended, because we don't guarantee
+// backward nor forward ABI compatibility and also function call overhead. If you
+// do use ImPlot as a DLL, be sure to call SetImGuiContext (see Miscellaneous section).
+#ifndef IMPLOT_API
+#define IMPLOT_API
+#endif
+
+// ImPlot version string.
+#define IMPLOT_VERSION "1.1 WIP"
+// ImPlot version integer encoded as XYYZZ (X=major, YY=minor, ZZ=patch).
+#define IMPLOT_VERSION_NUM 10100
+// Macro for templated plotting functions; keeps header clean.
+#define IMPLOT_TMP template <typename T> IMPLOT_API
+
+// Indicates variable should deduced automatically.
+constexpr int IMPLOT_AUTO = -1;
+// Special color used to indicate that a color should be deduced automatically.
+constexpr ImVec4 IMPLOT_AUTO_COL = ImVec4(0,0,0,-1);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Enums and Types
+//-----------------------------------------------------------------------------
+
+// Forward declarations
+struct ImPlotContext;             // ImPlot context (opaque struct, see implot_internal.h)
+
+// Enums/Flags
+typedef int ImAxis;                   // -> enum ImAxis_
+typedef int ImPlotProp;               // -> enum ImPlotProp_
+typedef int ImPlotFlags;              // -> enum ImPlotFlags_
+typedef int ImPlotAxisFlags;          // -> enum ImPlotAxisFlags_
+typedef int ImPlotSubplotFlags;       // -> enum ImPlotSubplotFlags_
+typedef int ImPlotLegendFlags;        // -> enum ImPlotLegendFlags_
+typedef int ImPlotMouseTextFlags;     // -> enum ImPlotMouseTextFlags_
+typedef int ImPlotDragToolFlags;      // -> ImPlotDragToolFlags_
+typedef int ImPlotColormapScaleFlags; // -> ImPlotColormapScaleFlags_
+
+typedef int ImPlotItemFlags;          // -> ImPlotItemFlags_
+typedef int ImPlotLineFlags;          // -> ImPlotLineFlags_
+typedef int ImPlotScatterFlags;       // -> ImPlotScatterFlags
+typedef int ImPlotBubblesFlags;       // -> ImPlotBubblesFlags
+typedef int ImPlotPolygonFlags;       // -> ImPlotPolygonFlags_
+typedef int ImPlotStairsFlags;        // -> ImPlotStairsFlags_
+typedef int ImPlotShadedFlags;        // -> ImPlotShadedFlags_
+typedef int ImPlotBarsFlags;          // -> ImPlotBarsFlags_
+typedef int ImPlotBarGroupsFlags;     // -> ImPlotBarGroupsFlags_
+typedef int ImPlotErrorBarsFlags;     // -> ImPlotErrorBarsFlags_
+typedef int ImPlotStemsFlags;         // -> ImPlotStemsFlags_
+typedef int ImPlotInfLinesFlags;      // -> ImPlotInfLinesFlags_
+typedef int ImPlotPieChartFlags;      // -> ImPlotPieChartFlags_
+typedef int ImPlotHeatmapFlags;       // -> ImPlotHeatmapFlags_
+typedef int ImPlotHistogramFlags;     // -> ImPlotHistogramFlags_
+typedef int ImPlotDigitalFlags;       // -> ImPlotDigitalFlags_
+typedef int ImPlotImageFlags;         // -> ImPlotImageFlags_
+typedef int ImPlotTextFlags;          // -> ImPlotTextFlags_
+typedef int ImPlotDummyFlags;         // -> ImPlotDummyFlags_
+
+typedef int ImPlotCond;               // -> enum ImPlotCond_
+typedef int ImPlotCol;                // -> enum ImPlotCol_
+typedef int ImPlotStyleVar;           // -> enum ImPlotStyleVar_
+typedef int ImPlotScale;              // -> enum ImPlotScale_
+typedef int ImPlotMarker;             // -> enum ImPlotMarker_
+typedef int ImPlotColormap;           // -> enum ImPlotColormap_
+typedef int ImPlotLocation;           // -> enum ImPlotLocation_
+typedef int ImPlotBin;                // -> enum ImPlotBin_
+
+
+// Axis indices. The values assigned may change; NEVER hardcode these.
+enum ImAxis_ {
+    // horizontal axes
+    ImAxis_X1 = 0, // enabled by default
+    ImAxis_X2,     // disabled by default
+    ImAxis_X3,     // disabled by default
+    // vertical axes
+    ImAxis_Y1,     // enabled by default
+    ImAxis_Y2,     // disabled by default
+    ImAxis_Y3,     // disabled by default
+    // bookkeeping
+    ImAxis_COUNT
+};
+
+// Plotting properties. These provide syntactic sugar for creating ImPlotSpecs from (ImPlotProp,value) pairs. See ImPlotSpec documentation.
+enum ImPlotProp_ {
+    ImPlotProp_LineColor,       // line color (applies to lines, bar edges); IMPLOT_AUTO_COL will use next Colormap color or current item color
+    ImPlotProp_LineColors,      // array of colors for each line; if nullptr, use LineColor for all lines
+    ImPlotProp_LineWeight,      // line weight in pixels (applies to lines, bar edges, marker edges)
+    ImPlotProp_FillColor,       // fill color (applies to shaded regions, bar faces); IMPLOT_AUTO_COL will use next Colormap color or current item color
+    ImPlotProp_FillColors,      // array of colors for each fill; if nullptr, use FillColor for all fills
+    ImPlotProp_FillAlpha,       // alpha multiplier (applies to FillColor, FillColors, MarkerFillColor, and MarkerFillColors)
+    ImPlotProp_Marker,          // marker type; specify ImPlotMarker_Auto to use the next unused marker
+    ImPlotProp_MarkerSize,      // size of markers (radius) *in pixels*
+    ImPlotProp_MarkerSizes,     // array of sizes for each marker; if nullptr, use MarkerSize for all markers
+    ImPlotProp_MarkerLineColor, // marker edge color; IMPLOT_AUTO_COL will use LineColor
+    ImPlotProp_MarkerLineColors, // array of colors for each marker edge; if nullptr, use MarkerLineColor for all markers
+    ImPlotProp_MarkerFillColor, // marker face color; IMPLOT_AUTO_COL will use LineColor
+    ImPlotProp_MarkerFillColors, // array of colors for each marker face; if nullptr, use MarkerFillColor for all markers
+    ImPlotProp_Size,            // size of error bar whiskers (width or height), and digital bars (height) *in pixels*
+    ImPlotProp_Offset,          // data index offset
+    ImPlotProp_Stride,          // data stride in bytes; IMPLOT_AUTO will result in sizeof(T) where T is the type passed to PlotX
+    ImPlotProp_Flags            // optional item flags; can be composed from common ImPlotItemFlags and/or specialized ImPlotXFlags
+};
+
+// Options for plots (see BeginPlot).
+enum ImPlotFlags_ {
+    ImPlotFlags_None          = 0,       // default
+    ImPlotFlags_NoTitle       = 1 << 0,  // the plot title will not be displayed (titles are also hidden if preceded by double hashes, e.g. "##MyPlot")
+    ImPlotFlags_NoLegend      = 1 << 1,  // the legend will not be displayed
+    ImPlotFlags_NoMouseText   = 1 << 2,  // the mouse position, in plot coordinates, will not be displayed inside of the plot
+    ImPlotFlags_NoInputs      = 1 << 3,  // the user will not be able to interact with the plot
+    ImPlotFlags_NoMenus       = 1 << 4,  // the user will not be able to open context menus
+    ImPlotFlags_NoBoxSelect   = 1 << 5,  // the user will not be able to box-select
+    ImPlotFlags_NoFrame       = 1 << 6,  // the ImGui frame will not be rendered
+    ImPlotFlags_Equal         = 1 << 7,  // x and y axes pairs will be constrained to have the same units/pixel
+    ImPlotFlags_Crosshairs    = 1 << 8,  // the default mouse cursor will be replaced with a crosshair when hovered
+    ImPlotFlags_CanvasOnly    = ImPlotFlags_NoTitle | ImPlotFlags_NoLegend | ImPlotFlags_NoMenus | ImPlotFlags_NoBoxSelect | ImPlotFlags_NoMouseText
+};
+
+// Options for plot axes (see SetupAxis).
+enum ImPlotAxisFlags_ {
+    ImPlotAxisFlags_None          = 0,       // default
+    ImPlotAxisFlags_NoLabel       = 1 << 0,  // the axis label will not be displayed (axis labels are also hidden if the supplied string name is nullptr)
+    ImPlotAxisFlags_NoGridLines   = 1 << 1,  // no grid lines will be displayed
+    ImPlotAxisFlags_NoTickMarks   = 1 << 2,  // no tick marks will be displayed
+    ImPlotAxisFlags_NoTickLabels  = 1 << 3,  // no text labels will be displayed
+    ImPlotAxisFlags_NoInitialFit  = 1 << 4,  // axis will not be initially fit to data extents on the first rendered frame
+    ImPlotAxisFlags_NoMenus       = 1 << 5,  // the user will not be able to open context menus with right-click
+    ImPlotAxisFlags_NoSideSwitch  = 1 << 6,  // the user will not be able to switch the axis side by dragging it
+    ImPlotAxisFlags_NoHighlight   = 1 << 7,  // the axis will not have its background highlighted when hovered or held
+    ImPlotAxisFlags_Opposite      = 1 << 8,  // axis ticks and labels will be rendered on the conventionally opposite side (i.e, right or top)
+    ImPlotAxisFlags_Foreground    = 1 << 9,  // grid lines will be displayed in the foreground (i.e. on top of data) instead of the background
+    ImPlotAxisFlags_Invert        = 1 << 10, // the axis will be inverted
+    ImPlotAxisFlags_AutoFit       = 1 << 11, // axis will be auto-fitting to data extents
+    ImPlotAxisFlags_RangeFit      = 1 << 12, // axis will only fit points if the point is in the visible range of the **orthogonal** axis
+    ImPlotAxisFlags_PanStretch    = 1 << 13, // panning in a locked or constrained state will cause the axis to stretch if possible
+    ImPlotAxisFlags_LockMin       = 1 << 14, // the axis minimum value will be locked when panning/zooming
+    ImPlotAxisFlags_LockMax       = 1 << 15, // the axis maximum value will be locked when panning/zooming
+    ImPlotAxisFlags_Lock          = ImPlotAxisFlags_LockMin | ImPlotAxisFlags_LockMax,
+    ImPlotAxisFlags_NoDecorations = ImPlotAxisFlags_NoLabel | ImPlotAxisFlags_NoGridLines | ImPlotAxisFlags_NoTickMarks | ImPlotAxisFlags_NoTickLabels,
+    ImPlotAxisFlags_AuxDefault    = ImPlotAxisFlags_NoGridLines | ImPlotAxisFlags_Opposite
+};
+
+// Options for subplots (see BeginSubplot)
+enum ImPlotSubplotFlags_ {
+    ImPlotSubplotFlags_None        = 0,       // default
+    ImPlotSubplotFlags_NoTitle     = 1 << 0,  // the subplot title will not be displayed (titles are also hidden if preceded by double hashes, e.g. "##MySubplot")
+    ImPlotSubplotFlags_NoLegend    = 1 << 1,  // the legend will not be displayed (only applicable if ImPlotSubplotFlags_ShareItems is enabled)
+    ImPlotSubplotFlags_NoMenus     = 1 << 2,  // the user will not be able to open context menus with right-click
+    ImPlotSubplotFlags_NoResize    = 1 << 3,  // resize splitters between subplot cells will be not be provided
+    ImPlotSubplotFlags_NoAlign     = 1 << 4,  // subplot edges will not be aligned vertically or horizontally
+    ImPlotSubplotFlags_ShareItems  = 1 << 5,  // items across all subplots will be shared and rendered into a single legend entry
+    ImPlotSubplotFlags_LinkRows    = 1 << 6,  // link the y-axis limits of all plots in each row (does not apply to auxiliary axes)
+    ImPlotSubplotFlags_LinkCols    = 1 << 7,  // link the x-axis limits of all plots in each column (does not apply to auxiliary axes)
+    ImPlotSubplotFlags_LinkAllX    = 1 << 8,  // link the x-axis limits in every plot in the subplot (does not apply to auxiliary axes)
+    ImPlotSubplotFlags_LinkAllY    = 1 << 9,  // link the y-axis limits in every plot in the subplot (does not apply to auxiliary axes)
+    ImPlotSubplotFlags_ColMajor    = 1 << 10  // subplots are added in column major order instead of the default row major order
+};
+
+// Options for legends (see SetupLegend)
+enum ImPlotLegendFlags_ {
+    ImPlotLegendFlags_None            = 0,      // default
+    ImPlotLegendFlags_NoButtons       = 1 << 0, // legend icons will not function as hide/show buttons
+    ImPlotLegendFlags_NoHighlightItem = 1 << 1, // plot items will not be highlighted when their legend entry is hovered
+    ImPlotLegendFlags_NoHighlightAxis = 1 << 2, // axes will not be highlighted when legend entries are hovered (only relevant if x/y-axis count > 1)
+    ImPlotLegendFlags_NoMenus         = 1 << 3, // the user will not be able to open context menus with right-click
+    ImPlotLegendFlags_Outside         = 1 << 4, // legend will be rendered outside of the plot area
+    ImPlotLegendFlags_Horizontal      = 1 << 5, // legend entries will be displayed horizontally
+    ImPlotLegendFlags_Sort            = 1 << 6, // legend entries will be displayed in alphabetical order
+    ImPlotLegendFlags_Reverse         = 1 << 7, // legend entries will be displayed in reverse order
+};
+
+// Options for mouse hover text (see SetupMouseText)
+enum ImPlotMouseTextFlags_ {
+    ImPlotMouseTextFlags_None        = 0,      // default
+    ImPlotMouseTextFlags_NoAuxAxes   = 1 << 0, // only show the mouse position for primary axes
+    ImPlotMouseTextFlags_NoFormat    = 1 << 1, // axes label formatters won't be used to render text
+    ImPlotMouseTextFlags_ShowAlways  = 1 << 2, // always display mouse position even if plot not hovered
+};
+
+// Options for DragPoint, DragLine, DragRect
+enum ImPlotDragToolFlags_ {
+    ImPlotDragToolFlags_None      = 0,      // default
+    ImPlotDragToolFlags_NoCursors = 1 << 0, // drag tools won't change cursor icons when hovered or held
+    ImPlotDragToolFlags_NoFit     = 1 << 1, // the drag tool won't be considered for plot fits
+    ImPlotDragToolFlags_NoInputs  = 1 << 2, // lock the tool from user inputs
+    ImPlotDragToolFlags_Delayed   = 1 << 3, // tool rendering will be delayed one frame; useful when applying position-constraints
+};
+
+// Flags for ColormapScale
+enum ImPlotColormapScaleFlags_ {
+    ImPlotColormapScaleFlags_None     = 0,      // default
+    ImPlotColormapScaleFlags_NoLabel  = 1 << 0, // the colormap axis label will not be displayed
+    ImPlotColormapScaleFlags_Opposite = 1 << 1, // render the colormap label and tick labels on the opposite side
+    ImPlotColormapScaleFlags_Invert   = 1 << 2, // invert the colormap bar and axis scale (this only affects rendering; if you only want to reverse the scale mapping, make scale_min > scale_max)
+};
+
+// Flags for ANY PlotX function. Used by setting ImPlotSpec::Flags.
+enum ImPlotItemFlags_ {
+    ImPlotItemFlags_None     = 0,
+    ImPlotItemFlags_NoLegend = 1 << 0, // the item won't have a legend entry displayed
+    ImPlotItemFlags_NoFit    = 1 << 1, // the item won't be considered for plot fits
+};
+
+// Flags for PlotLine. Used by setting ImPlotSpec::Flags.
+enum ImPlotLineFlags_ {
+    ImPlotLineFlags_None        = 0,       // default
+    ImPlotLineFlags_Segments    = 1 << 10, // a line segment will be rendered from every two consecutive points
+    ImPlotLineFlags_Loop        = 1 << 11, // the last and first point will be connected to form a closed loop
+    ImPlotLineFlags_SkipNaN     = 1 << 12, // NaNs values will be skipped instead of rendered as missing data
+    ImPlotLineFlags_NoClip      = 1 << 13, // markers (if displayed) on the edge of a plot will not be clipped
+    ImPlotLineFlags_Shaded      = 1 << 14, // a filled region between the line and horizontal origin will be rendered; use PlotShaded for more advanced cases
+};
+
+// Flags for PlotScatter. Used by setting ImPlotSpec::Flags.
+enum ImPlotScatterFlags_ {
+    ImPlotScatterFlags_None   = 0,       // default
+    ImPlotScatterFlags_NoClip = 1 << 10, // markers on the edge of a plot will not be clipped
+};
+
+// Flags for PlotBubbles. Used by setting ImPlotSpec::Flags.
+enum ImPlotBubblesFlags_ {
+  ImPlotBubblesFlags_None = 0, // default
+};
+
+// Flags for PlotPolygon. Used by setting ImPlotSpec::Flags.
+enum ImPlotPolygonFlags_ {
+  ImPlotPolygonFlags_None     = 0,       // default (closed, convex polygon)
+  ImPlotPolygonFlags_Concave  = 1 << 10, // use concave polygon filling (slower but supports concave shapes)
+};
+
+// Flags for PlotStairs. Used by setting ImPlotSpec::Flags.
+enum ImPlotStairsFlags_ {
+    ImPlotStairsFlags_None     = 0,       // default
+    ImPlotStairsFlags_PreStep  = 1 << 10, // the y value is continued constantly to the left from every x position, i.e. the interval (x[i-1], x[i]] has the value y[i]
+    ImPlotStairsFlags_Shaded   = 1 << 11  // a filled region between the stairs and horizontal origin will be rendered; use PlotShaded for more advanced cases
+};
+
+// Flags for PlotShaded (placeholder). Used by setting ImPlotSpec::Flags.
+enum ImPlotShadedFlags_ {
+    ImPlotShadedFlags_None  = 0 // default
+};
+
+// Flags for PlotBars. Used by setting ImPlotSpec::Flags.
+enum ImPlotBarsFlags_ {
+    ImPlotBarsFlags_None         = 0,       // default
+    ImPlotBarsFlags_Horizontal   = 1 << 10, // bars will be rendered horizontally on the current y-axis
+};
+
+// Flags for PlotBarGroups. Used by setting ImPlotSpec::Flags.
+enum ImPlotBarGroupsFlags_ {
+    ImPlotBarGroupsFlags_None        = 0,       // default
+    ImPlotBarGroupsFlags_Horizontal  = 1 << 10, // bar groups will be rendered horizontally on the current y-axis
+    ImPlotBarGroupsFlags_Stacked     = 1 << 11, // items in a group will be stacked on top of each other
+};
+
+// Flags for PlotErrorBars. Used by setting ImPlotSpec::Flags.
+enum ImPlotErrorBarsFlags_ {
+    ImPlotErrorBarsFlags_None       = 0,       // default
+    ImPlotErrorBarsFlags_Horizontal = 1 << 10, // error bars will be rendered horizontally on the current y-axis
+};
+
+// Flags for PlotStems. Used by setting ImPlotSpec::Flags.
+enum ImPlotStemsFlags_ {
+    ImPlotStemsFlags_None       = 0,       // default
+    ImPlotStemsFlags_Horizontal = 1 << 10, // stems will be rendered horizontally on the current y-axis
+};
+
+// Flags for PlotInfLines. Used by setting ImPlotSpec::Flags.
+enum ImPlotInfLinesFlags_ {
+    ImPlotInfLinesFlags_None       = 0,      // default
+    ImPlotInfLinesFlags_Horizontal = 1 << 10 // lines will be rendered horizontally on the current y-axis
+};
+
+// Flags for PlotPieChart. Used by setting ImPlotSpec::Flags.
+enum ImPlotPieChartFlags_ {
+    ImPlotPieChartFlags_None          = 0,       // default
+    ImPlotPieChartFlags_Normalize     = 1 << 10, // force normalization of pie chart values (i.e. always make a full circle if sum < 0)
+    ImPlotPieChartFlags_IgnoreHidden  = 1 << 11, // ignore hidden slices when drawing the pie chart (as if they were not there)
+    ImPlotPieChartFlags_Exploding     = 1 << 12, // explode legend-hovered slice
+    ImPlotPieChartFlags_NoSliceBorder = 1 << 13  // do not draw slice borders
+};
+
+// Flags for PlotHeatmap. Used by setting ImPlotSpec::Flags.
+enum ImPlotHeatmapFlags_ {
+    ImPlotHeatmapFlags_None     = 0,       // default
+    ImPlotHeatmapFlags_ColMajor = 1 << 10, // data will be read in column major order
+};
+
+// Flags for PlotHistogram and PlotHistogram2D. Used by setting ImPlotSpec::Flags.
+enum ImPlotHistogramFlags_ {
+    ImPlotHistogramFlags_None       = 0,       // default
+    ImPlotHistogramFlags_Horizontal = 1 << 10, // histogram bars will be rendered horizontally (not supported by PlotHistogram2D)
+    ImPlotHistogramFlags_Cumulative = 1 << 11, // each bin will contain its count plus the counts of all previous bins (not supported by PlotHistogram2D)
+    ImPlotHistogramFlags_Density    = 1 << 12, // counts will be normalized, i.e. the PDF will be visualized, or the CDF will be visualized if Cumulative is also set
+    ImPlotHistogramFlags_NoOutliers = 1 << 13, // exclude values outside the specified histogram range from the count toward normalizing and cumulative counts
+    ImPlotHistogramFlags_ColMajor   = 1 << 14  // data will be read in column major order (not supported by PlotHistogram)
+};
+
+// Flags for PlotDigital (placeholder). Used by setting ImPlotSpec::Flags.
+enum ImPlotDigitalFlags_ {
+    ImPlotDigitalFlags_None = 0 // default
+};
+
+// Flags for PlotImage (placeholder). Used by setting ImPlotSpec::Flags.
+enum ImPlotImageFlags_ {
+    ImPlotImageFlags_None = 0 // default
+};
+
+// Flags for PlotText. Used by setting ImPlotSpec::Flags.
+enum ImPlotTextFlags_ {
+    ImPlotTextFlags_None     = 0,       // default
+    ImPlotTextFlags_Vertical = 1 << 10  // text will be rendered vertically
+};
+
+// Flags for PlotDummy (placeholder). Used by setting ImPlotSpec::Flags.
+enum ImPlotDummyFlags_ {
+    ImPlotDummyFlags_None = 0 // default
+};
+
+// Represents a condition for SetupAxisLimits etc. (same as ImGuiCond, but we only support a subset of those enums)
+enum ImPlotCond_
+{
+    ImPlotCond_None   = ImGuiCond_None,    // No condition (always set the variable), same as _Always
+    ImPlotCond_Always = ImGuiCond_Always,  // No condition (always set the variable)
+    ImPlotCond_Once   = ImGuiCond_Once,    // Set the variable once per runtime session (only the first call will succeed)
+};
+
+// Plot styling colors.
+enum ImPlotCol_ {
+    ImPlotCol_FrameBg,       // plot frame background color (defaults to ImGuiCol_FrameBg)
+    ImPlotCol_PlotBg,        // plot area background color (defaults to ImGuiCol_WindowBg)
+    ImPlotCol_PlotBorder,    // plot area border color (defaults to ImGuiCol_Border)
+    ImPlotCol_LegendBg,      // legend background color (defaults to ImGuiCol_PopupBg)
+    ImPlotCol_LegendBorder,  // legend border color (defaults to ImPlotCol_PlotBorder)
+    ImPlotCol_LegendText,    // legend text color (defaults to ImPlotCol_InlayText)
+    ImPlotCol_TitleText,     // plot title text color (defaults to ImGuiCol_Text)
+    ImPlotCol_InlayText,     // color of text appearing inside of plots (defaults to ImGuiCol_Text)
+    ImPlotCol_AxisText,      // axis label and tick labels color (defaults to ImGuiCol_Text)
+    ImPlotCol_AxisGrid,      // axis grid color (defaults to 25% ImPlotCol_AxisText)
+    ImPlotCol_AxisTick,      // axis tick color (defaults to AxisGrid)
+    ImPlotCol_AxisBg,        // background color of axis hover region (defaults to transparent)
+    ImPlotCol_AxisBgHovered, // axis hover color (defaults to ImGuiCol_ButtonHovered)
+    ImPlotCol_AxisBgActive,  // axis active color (defaults to ImGuiCol_ButtonActive)
+    ImPlotCol_Selection,     // box-selection color (defaults to yellow)
+    ImPlotCol_Crosshairs,    // crosshairs color (defaults to ImPlotCol_PlotBorder)
+    ImPlotCol_COUNT
+};
+
+// Plot styling variables.
+enum ImPlotStyleVar_ {
+    ImPlotStyleVar_PlotDefaultSize,    // ImVec2, default size used when ImVec2(0,0) is passed to BeginPlot
+    ImPlotStyleVar_PlotMinSize,        // ImVec2, minimum size plot frame can be when shrunk
+    ImPlotStyleVar_PlotBorderSize,     // float,  thickness of border around plot area
+    ImPlotStyleVar_MinorAlpha,         // float,  alpha multiplier applied to minor axis grid lines
+    ImPlotStyleVar_MajorTickLen,       // ImVec2, major tick lengths for X and Y axes
+    ImPlotStyleVar_MinorTickLen,       // ImVec2, minor tick lengths for X and Y axes
+    ImPlotStyleVar_MajorTickSize,      // ImVec2, line thickness of major ticks
+    ImPlotStyleVar_MinorTickSize,      // ImVec2, line thickness of minor ticks
+    ImPlotStyleVar_MajorGridSize,      // ImVec2, line thickness of major grid lines
+    ImPlotStyleVar_MinorGridSize,      // ImVec2, line thickness of minor grid lines
+    ImPlotStyleVar_PlotPadding,        // ImVec2, padding between widget frame and plot area, labels, or outside legends (i.e. main padding)
+    ImPlotStyleVar_LabelPadding,       // ImVec2, padding between axes labels, tick labels, and plot edge
+    ImPlotStyleVar_LegendPadding,      // ImVec2, legend padding from plot edges
+    ImPlotStyleVar_LegendInnerPadding, // ImVec2, legend inner padding from legend edges
+    ImPlotStyleVar_LegendSpacing,      // ImVec2, spacing between legend entries
+    ImPlotStyleVar_MousePosPadding,    // ImVec2, padding between plot edge and interior info text
+    ImPlotStyleVar_AnnotationPadding,  // ImVec2, text padding around annotation labels
+    ImPlotStyleVar_FitPadding,         // ImVec2, additional fit padding as a percentage of the fit extents (e.g. ImVec2(0.1f,0.1f) adds 10% to the fit extents of X and Y)
+    ImPlotStyleVar_DigitalPadding,     // float,  digital plot padding from bottom in pixels
+    ImPlotStyleVar_DigitalSpacing,     // float,  digital plot spacing gap in pixels
+    ImPlotStyleVar_COUNT
+};
+
+// Axis scale
+enum ImPlotScale_ {
+    ImPlotScale_Linear = 0, // default linear scale
+    ImPlotScale_Time,       // date/time scale
+    ImPlotScale_Log10,      // base 10 logarithmic scale
+    ImPlotScale_SymLog,     // symmetric log scale
+};
+
+// Marker specifications.
+enum ImPlotMarker_ {
+    ImPlotMarker_None = -2, // no marker
+    ImPlotMarker_Auto = -1, // automatic marker selection
+    ImPlotMarker_Circle,    // a circle marker (default)
+    ImPlotMarker_Square,    // a square maker
+    ImPlotMarker_Diamond,   // a diamond marker
+    ImPlotMarker_Up,        // an upward-pointing triangle marker
+    ImPlotMarker_Down,      // an downward-pointing triangle marker
+    ImPlotMarker_Left,      // an leftward-pointing triangle marker
+    ImPlotMarker_Right,     // an rightward-pointing triangle marker
+    ImPlotMarker_Cross,     // a cross marker (not fill-able)
+    ImPlotMarker_Plus,      // a plus marker (not fill-able)
+    ImPlotMarker_Asterisk,  // a asterisk marker (not fill-able)
+    ImPlotMarker_Vertical,   // a vertical line marker (not fill-able)
+    ImPlotMarker_Horizontal, // a horizontal line marker (not fill-able)
+    ImPlotMarker_COUNT
+};
+
+// Built-in colormaps
+enum ImPlotColormap_ {
+    ImPlotColormap_Deep     = 0,   // a.k.a. seaborn deep             (qual=true,  n=10) (default)
+    ImPlotColormap_Dark     = 1,   // a.k.a. matplotlib "Set1"        (qual=true,  n=9 )
+    ImPlotColormap_Pastel   = 2,   // a.k.a. matplotlib "Pastel1"     (qual=true,  n=9 )
+    ImPlotColormap_Paired   = 3,   // a.k.a. matplotlib "Paired"      (qual=true,  n=12)
+    ImPlotColormap_Viridis  = 4,   // a.k.a. matplotlib "viridis"     (qual=false, n=11)
+    ImPlotColormap_Plasma   = 5,   // a.k.a. matplotlib "plasma"      (qual=false, n=11)
+    ImPlotColormap_Hot      = 6,   // a.k.a. matplotlib/MATLAB "hot"  (qual=false, n=11)
+    ImPlotColormap_Cool     = 7,   // a.k.a. matplotlib/MATLAB "cool" (qual=false, n=11)
+    ImPlotColormap_Pink     = 8,   // a.k.a. matplotlib/MATLAB "pink" (qual=false, n=11)
+    ImPlotColormap_Jet      = 9,   // a.k.a. MATLAB "jet"             (qual=false, n=11)
+    ImPlotColormap_Twilight = 10,  // a.k.a. matplotlib "twilight"    (qual=false, n=11)
+    ImPlotColormap_RdBu     = 11,  // red/blue, Color Brewer          (qual=false, n=11)
+    ImPlotColormap_BrBG     = 12,  // brown/blue-green, Color Brewer  (qual=false, n=11)
+    ImPlotColormap_PiYG     = 13,  // pink/yellow-green, Color Brewer (qual=false, n=11)
+    ImPlotColormap_Spectral = 14,  // color spectrum, Color Brewer    (qual=false, n=11)
+    ImPlotColormap_Greys    = 15,  // white/black                     (qual=false, n=2 )
+};
+
+// Used to position items on a plot (e.g. legends, labels, etc.)
+enum ImPlotLocation_ {
+    ImPlotLocation_Center    = 0,                                          // center-center
+    ImPlotLocation_North     = 1 << 0,                                     // top-center
+    ImPlotLocation_South     = 1 << 1,                                     // bottom-center
+    ImPlotLocation_West      = 1 << 2,                                     // center-left
+    ImPlotLocation_East      = 1 << 3,                                     // center-right
+    ImPlotLocation_NorthWest = ImPlotLocation_North | ImPlotLocation_West, // top-left
+    ImPlotLocation_NorthEast = ImPlotLocation_North | ImPlotLocation_East, // top-right
+    ImPlotLocation_SouthWest = ImPlotLocation_South | ImPlotLocation_West, // bottom-left
+    ImPlotLocation_SouthEast = ImPlotLocation_South | ImPlotLocation_East  // bottom-right
+};
+
+// Enums for different automatic histogram binning methods (k = bin count or w = bin width)
+enum ImPlotBin_ {
+    ImPlotBin_Sqrt    = -1, // k = sqrt(n)
+    ImPlotBin_Sturges = -2, // k = 1 + log2(n)
+    ImPlotBin_Rice    = -3, // k = 2 * cbrt(n)
+    ImPlotBin_Scott   = -4, // w = 3.49 * sigma / cbrt(n)
+};
+
+// Plot item styling specification. Provide these to PlotX functions to override styling, specify
+// offsetting or stride, or set optional flags. This struct can be used in the following ways:
+//
+// 1. By declaring and defining a struct instance:
+//
+//    ImPlotSpec spec;
+//    spec.LineColor = ImVec4(1,0,0,1);
+//    spec.LineWeight = 2.0f;
+//    spec.Marker = ImPlotMarker_Circle;
+//    spec.Flags = ImPlotItemFlags_NoLegend | ImPlotLineFlags_Segments;
+//    ImPlot::PlotLine("MyLine", xs, ys, 100, spec);
+//
+// 2. Inline using (ImPlotProp,value) pairs (order does NOT matter):
+//
+//    ImPlot::PlotLine("MyLine", xs, ys, 100, {
+//      ImPlotProp_LineColor, ImVec4(1,0,0,1),
+//      ImPlotProp_LineWeight, 2.0f,
+//      ImPlotProp_Marker, ImPlotMarker_Circle,
+//      ImPlotProp_Flags, ImPlotItemFlags_NoLegend | ImPlotLineFlags_Segments
+//    });
+struct ImPlotSpec {
+    ImVec4          LineColor       = IMPLOT_AUTO_COL;       // line color (applies to lines, bar edges); IMPLOT_AUTO_COL will use next Colormap color or current item color
+    ImU32*          LineColors      = nullptr;               // array of colors for each line; if nullptr, use LineColor for all lines
+    float           LineWeight      = 1.0f;                  // line weight in pixels (applies to lines, bar edges, marker edges)
+    ImVec4          FillColor       = IMPLOT_AUTO_COL;       // fill color (applies to shaded regions, bar faces); IMPLOT_AUTO_COL will use next Colormap color or current item color
+    ImU32*          FillColors      = nullptr;               // array of colors for each fill; if nullptr, use FillColor for all fills
+    float           FillAlpha       = 1.0f;                  // alpha multiplier (applies to FillColor, FillColors, MarkerFillColor, and MarkerFillColors)
+    ImPlotMarker    Marker          = ImPlotMarker_None;     // marker type; specify ImPlotMarker_Auto to use the next unused marker
+    float           MarkerSize      = 4;                     // size of markers (radius) *in pixels*
+    float*          MarkerSizes     = nullptr;               // array of sizes for each marker; if nullptr, use MarkerSize for all markers
+    ImVec4          MarkerLineColor = IMPLOT_AUTO_COL;       // marker edge color; IMPLOT_AUTO_COL will use LineColor
+    ImU32*          MarkerLineColors = nullptr;              // array of colors for each marker edge; if nullptr, use MarkerLineColor for all markers
+    ImVec4          MarkerFillColor = IMPLOT_AUTO_COL;       // marker face color; IMPLOT_AUTO_COL will use LineColor
+    ImU32*          MarkerFillColors = nullptr;              // array of colors for each marker face; if nullptr, use MarkerFillColor for all markers
+    float           Size            = 4;                     // size of error bar whiskers (width or height), and digital bars (height) *in pixels*
+    int             Offset          = 0;                     // data index offset
+    int             Stride          = IMPLOT_AUTO;           // data stride in bytes; IMPLOT_AUTO will result in sizeof(T) where T is the type passed to PlotX
+    ImPlotItemFlags Flags           = ImPlotItemFlags_None;  // optional item flags; can be composed from common ImPlotItemFlags and/or specialized ImPlotXFlags
+
+    ImPlotSpec() { }
+
+    // Construct a plot item specification from (ImPlotProp,value) pairs in any order, e.g. ImPlotSpec(ImPlotProp_LineColor, my_color, ImPlotProp_Marker, 4.0f)
+    template <typename ...Args>
+    ImPlotSpec(Args... args) {
+        static_assert((sizeof ...(Args)) % 2 == 0, "Odd number of arguments! You must provide (ImPlotProp, value) pairs!");
+        SetProp(args...);
+    }
+
+    // Set properties from (ImPlotProp,value) pairs in any order, e.g. SetProp(ImPlotProp_LineColor, my_color, ImPlotProp_Marker, 4.0f)
+    template <typename Arg, typename ...Args>
+    void SetProp(ImPlotProp prop, Arg arg, Args... args) {
+        static_assert((sizeof ...(Args)) % 2 == 0, "Odd number of arguments! You must provide (ImPlotProp,value) pairs!");
+        SetProp(prop, arg);
+        SetProp(args...);
+    }
+
+    // Set a property from a scalar value.
+    template <typename T>
+    void SetProp(ImPlotProp prop, T v) {
+        switch (prop) {
+        case ImPlotProp_LineColor       : LineColor       = ImGui::ColorConvertU32ToFloat4((ImU32)v); return;
+        case ImPlotProp_LineWeight      : LineWeight      = (float)v;                                 return;
+        case ImPlotProp_FillColor       : FillColor       = ImGui::ColorConvertU32ToFloat4((ImU32)v); return;
+        case ImPlotProp_FillAlpha       : FillAlpha       = (float)v;                                 return;
+        case ImPlotProp_Marker          : Marker          = (ImPlotMarker)v;                          return;
+        case ImPlotProp_MarkerSize      : MarkerSize      = (float)v;                                 return;
+        case ImPlotProp_MarkerLineColor : MarkerLineColor = ImGui::ColorConvertU32ToFloat4((ImU32)v); return;
+        case ImPlotProp_MarkerFillColor : MarkerFillColor = ImGui::ColorConvertU32ToFloat4((ImU32)v); return;
+        case ImPlotProp_Size            : Size            = (float)v;                                 return;
+        case ImPlotProp_Offset          : Offset          = (int)v;                                   return;
+        case ImPlotProp_Stride          : Stride          = (int)v;                                   return;
+        case ImPlotProp_Flags           : Flags           = (ImPlotItemFlags)v;                       return;
+        default: break;
+        }
+        IM_ASSERT(0 && "User provided an ImPlotProp which cannot be set from scalar value!");
+    }
+
+    // Set a property from a pointer value.
+    void SetProp(ImPlotProp prop, ImU32* v) {
+        switch (prop) {
+        case ImPlotProp_LineColors       : LineColors       = v;  return;
+        case ImPlotProp_FillColors       : FillColors       = v;  return;
+        case ImPlotProp_MarkerLineColors : MarkerLineColors = v;  return;
+        case ImPlotProp_MarkerFillColors : MarkerFillColors = v;  return;
+        default: break;
+        }
+        IM_ASSERT(0 && "User provided an ImPlotProp which cannot be set from pointer value!");
+    }
+
+    // Set a property from a float pointer value.
+    void SetProp(ImPlotProp prop, float* v) {
+        switch (prop) {
+        case ImPlotProp_MarkerSizes : MarkerSizes = v; return;
+        default: break;
+        }
+        IM_ASSERT(0 && "User provided an ImPlotProp which cannot be set from float pointer value!");
+    }
+
+    // Set a property from an ImVec4 value.
+    void SetProp(ImPlotProp prop, const ImVec4& v) {
+        switch (prop) {
+        case ImPlotProp_LineColor       : LineColor       = v; return;
+        case ImPlotProp_FillColor       : FillColor       = v; return;
+        case ImPlotProp_MarkerLineColor : MarkerLineColor = v; return;
+        case ImPlotProp_MarkerFillColor : MarkerFillColor = v; return;
+        default: break;
+        }
+        IM_ASSERT(0 && "User provided an ImPlotProp which cannot be set from ImVec4 value!");
+    }
+};
+
+// Double precision version of ImVec2 used by ImPlot. Extensible by end users.
+IM_MSVC_RUNTIME_CHECKS_OFF
+struct ImPlotPoint {
+    double x, y;
+    IMPLOT_API constexpr ImPlotPoint()                     : x(0.0), y(0.0) { }
+    IMPLOT_API constexpr ImPlotPoint(double _x, double _y) : x(_x), y(_y) { }
+    IMPLOT_API constexpr ImPlotPoint(const ImVec2& p)      : x((double)p.x), y((double)p.y) { }
+    IMPLOT_API double& operator[] (size_t idx)             { IM_ASSERT(idx == 0 || idx == 1); return ((double*)(void*)(char*)this)[idx]; }
+    IMPLOT_API double  operator[] (size_t idx) const       { IM_ASSERT(idx == 0 || idx == 1); return ((const double*)(const void*)(const char*)this)[idx]; }
+#ifdef IMPLOT_POINT_CLASS_EXTRA
+    IMPLOT_POINT_CLASS_EXTRA     // Define additional constructors and implicit cast operators in imconfig.h
+                                 // to convert back and forth between your math types and ImPlotPoint.
+#endif
+};
+IM_MSVC_RUNTIME_CHECKS_RESTORE
+
+// Range defined by a min/max value.
+struct ImPlotRange {
+    double Min, Max;
+    IMPLOT_API constexpr ImPlotRange()                         : Min(0.0), Max(0.0) { }
+    IMPLOT_API constexpr ImPlotRange(double _min, double _max) : Min(_min), Max(_max) { }
+    IMPLOT_API bool Contains(double value) const               { return value >= Min && value <= Max;                      }
+    IMPLOT_API double Size() const                             { return Max - Min;                                         }
+    IMPLOT_API double Clamp(double value) const                { return (value < Min) ? Min : (value > Max) ? Max : value; }
+};
+
+// Combination of two range limits for X and Y axes. Also an AABB defined by Min()/Max().
+struct ImPlotRect {
+    ImPlotRange X, Y;
+    IMPLOT_API constexpr ImPlotRect()                                                       : X(0.0,0.0), Y(0.0,0.0) { }
+    IMPLOT_API constexpr ImPlotRect(double x_min, double x_max, double y_min, double y_max) : X(x_min, x_max), Y(y_min, y_max) { }
+    IMPLOT_API bool Contains(const ImPlotPoint& p) const                                    { return Contains(p.x, p.y);                 }
+    IMPLOT_API bool Contains(double x, double y) const                                      { return X.Contains(x) && Y.Contains(y);     }
+    IMPLOT_API ImPlotPoint Size() const                                                     { return ImPlotPoint(X.Size(), Y.Size());    }
+    IMPLOT_API ImPlotPoint Clamp(const ImPlotPoint& p) const                                { return Clamp(p.x, p.y);                    }
+    IMPLOT_API ImPlotPoint Clamp(double x, double y) const                                  { return ImPlotPoint(X.Clamp(x),Y.Clamp(y)); }
+    IMPLOT_API ImPlotPoint Min() const                                                      { return ImPlotPoint(X.Min, Y.Min);          }
+    IMPLOT_API ImPlotPoint Max() const                                                      { return ImPlotPoint(X.Max, Y.Max);          }
+};
+
+// Plot style structure
+struct ImPlotStyle {
+    // plot styling
+    ImVec2  PlotDefaultSize;         // = 400,300 default size used when ImVec2(0,0) is passed to BeginPlot
+    ImVec2  PlotMinSize;             // = 200,150 minimum size plot frame can be when shrunk
+    float   PlotBorderSize;          // = 1,      line thickness of border around plot area
+    float   MinorAlpha;              // = 0.25    alpha multiplier applied to minor axis grid lines
+    ImVec2  MajorTickLen;            // = 10,10   major tick lengths for X and Y axes
+    ImVec2  MinorTickLen;            // = 5,5     minor tick lengths for X and Y axes
+    ImVec2  MajorTickSize;           // = 1,1     line thickness of major ticks
+    ImVec2  MinorTickSize;           // = 1,1     line thickness of minor ticks
+    ImVec2  MajorGridSize;           // = 1,1     line thickness of major grid lines
+    ImVec2  MinorGridSize;           // = 1,1     line thickness of minor grid lines
+    // plot padding
+    ImVec2  PlotPadding;             // = 10,10   padding between widget frame and plot area, labels, or outside legends (i.e. main padding)
+    ImVec2  LabelPadding;            // = 5,5     padding between axes labels, tick labels, and plot edge
+    ImVec2  LegendPadding;           // = 10,10   legend padding from plot edges
+    ImVec2  LegendInnerPadding;      // = 5,5     legend inner padding from legend edges
+    ImVec2  LegendSpacing;           // = 5,0     spacing between legend entries
+    ImVec2  MousePosPadding;         // = 10,10   padding between plot edge and interior mouse location text
+    ImVec2  AnnotationPadding;       // = 2,2     text padding around annotation labels
+    ImVec2  FitPadding;              // = 0,0     additional fit padding as a percentage of the fit extents (e.g. ImVec2(0.1f,0.1f) adds 10% to the fit extents of X and Y)
+    float   DigitalPadding;          // = 20,     digital plot padding from bottom in pixels
+    float   DigitalSpacing;          // = 4,      digital plot spacing gap in pixels
+    // style colors
+    ImVec4  Colors[ImPlotCol_COUNT]; // Array of styling colors. Indexable with ImPlotCol_ enums.
+    // colormap
+    ImPlotColormap Colormap;         // The current colormap. Set this to either an ImPlotColormap_ enum or an index returned by AddColormap.
+    // settings/flags
+    bool    UseLocalTime;            // = false,  axis labels will be formatted for your timezone when ImPlotAxisFlag_Time is enabled
+    bool    UseISO8601;              // = false,  dates will be formatted according to ISO 8601 where applicable (e.g. YYYY-MM-DD, YYYY-MM, --MM-DD, etc.)
+    bool    Use24HourClock;          // = false,  times will be formatted using a 24 hour clock
+    IMPLOT_API ImPlotStyle();
+};
+
+// Support for legacy versions
+#if (IMGUI_VERSION_NUM < 18716) // Renamed in 1.88
+#define ImGuiMod_None       0
+#define ImGuiMod_Ctrl       ImGuiKeyModFlags_Ctrl
+#define ImGuiMod_Shift      ImGuiKeyModFlags_Shift
+#define ImGuiMod_Alt        ImGuiKeyModFlags_Alt
+#define ImGuiMod_Super      ImGuiKeyModFlags_Super
+#elif (IMGUI_VERSION_NUM < 18823) // Renamed in 1.89, sorry
+#define ImGuiMod_None       0
+#define ImGuiMod_Ctrl       ImGuiModFlags_Ctrl
+#define ImGuiMod_Shift      ImGuiModFlags_Shift
+#define ImGuiMod_Alt        ImGuiModFlags_Alt
+#define ImGuiMod_Super      ImGuiModFlags_Super
+#endif
+
+// Input mapping structure. Default values listed. See also MapInputDefault, MapInputReverse.
+struct ImPlotInputMap {
+    ImGuiMouseButton Pan;           // LMB    enables panning when held,
+    int              PanMod;        // none   optional modifier that must be held for panning/fitting
+    ImGuiMouseButton Fit;           // LMB    initiates fit when double clicked
+    ImGuiMouseButton Select;        // RMB    begins box selection when pressed and confirms selection when released
+    ImGuiMouseButton SelectCancel;  // LMB    cancels active box selection when pressed; cannot be same as Select
+    int              SelectMod;     // none   optional modifier that must be held for box selection
+    int              SelectHorzMod; // Alt    expands active box selection horizontally to plot edge when held
+    int              SelectVertMod; // Shift  expands active box selection vertically to plot edge when held
+    ImGuiMouseButton Menu;          // RMB    opens context menus (if enabled) when clicked
+    int              OverrideMod;   // Ctrl   when held, all input is ignored; used to enable axis/plots as DND sources
+    int              ZoomMod;       // none   optional modifier that must be held for scroll wheel zooming
+    float            ZoomRate;      // 0.1f   zoom rate for scroll (e.g. 0.1f = 10% plot range every scroll click); make negative to invert
+    IMPLOT_API ImPlotInputMap();
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Callbacks
+//-----------------------------------------------------------------------------
+
+// Callback signature for axis tick label formatter.
+typedef int (*ImPlotFormatter)(double value, char* buff, int size, void* user_data);
+
+// Callback signature for data getter.
+typedef ImPlotPoint (*ImPlotGetter)(int idx, void* user_data);
+
+// Callback signature for axis transform.
+typedef double (*ImPlotTransform)(double value, void* user_data);
+
+namespace ImPlot {
+
+//-----------------------------------------------------------------------------
+// [SECTION] Contexts
+//-----------------------------------------------------------------------------
+
+// Creates a new ImPlot context. Call this after ImGui::CreateContext.
+IMPLOT_API ImPlotContext* CreateContext();
+// Destroys an ImPlot context. Call this before ImGui::DestroyContext. nullptr = destroy current context.
+IMPLOT_API void DestroyContext(ImPlotContext* ctx = nullptr);
+// Returns the current ImPlot context. nullptr if no context has ben set.
+IMPLOT_API ImPlotContext* GetCurrentContext();
+// Sets the current ImPlot context.
+IMPLOT_API void SetCurrentContext(ImPlotContext* ctx);
+
+// Sets the current **ImGui** context. This is ONLY necessary if you are compiling
+// ImPlot as a DLL (not recommended) separate from your ImGui compilation. It
+// sets the global variable GImGui, which is not shared across DLL boundaries.
+// See GImGui documentation in imgui.cpp for more details.
+IMPLOT_API void SetImGuiContext(ImGuiContext* ctx);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Begin/End Plot
+//-----------------------------------------------------------------------------
+
+// Starts a 2D plotting context. If this function returns true, EndPlot() MUST
+// be called! You are encouraged to use the following convention:
+//
+// if (BeginPlot(...)) {
+//     PlotLine(...);
+//     ...
+//     EndPlot();
+// }
+//
+// Important notes:
+//
+// - #title_id must be unique to the current ImGui ID scope. If you need to avoid ID
+//   collisions or don't want to display a title in the plot, use double hashes
+//   (e.g. "MyPlot##HiddenIdText" or "##NoTitle").
+// - #size is the **frame** size of the plot widget, not the plot area. The default
+//   size of plots (i.e. when ImVec2(0,0)) can be modified in your ImPlotStyle.
+IMPLOT_API bool BeginPlot(const char* title_id, const ImVec2& size=ImVec2(-1,0), ImPlotFlags flags=0);
+
+// Only call EndPlot() if BeginPlot() returns true! Typically called at the end
+// of an if statement conditioned on BeginPlot(). See example above.
+IMPLOT_API void EndPlot();
+
+//-----------------------------------------------------------------------------
+// [SECTION] Begin/End Subplots
+//-----------------------------------------------------------------------------
+
+// Starts a subdivided plotting context. If the function returns true,
+// EndSubplots() MUST be called! Call BeginPlot/EndPlot AT MOST [rows*cols]
+// times in  between the beginning and end of the subplot context. Plots are
+// added in row major order.
+//
+// Example:
+//
+// if (BeginSubplots("My Subplot",2,3,ImVec2(800,400)) {
+//     for (int i = 0; i < 6; ++i) {
+//         if (BeginPlot(...)) {
+//             ImPlot::PlotLine(...);
+//             ...
+//             EndPlot();
+//         }
+//     }
+//     EndSubplots();
+// }
+//
+// Produces:
+//
+// [0] | [1] | [2]
+// ----|-----|----
+// [3] | [4] | [5]
+//
+// Important notes:
+//
+// - #title_id must be unique to the current ImGui ID scope. If you need to avoid ID
+//   collisions or don't want to display a title in the plot, use double hashes
+//   (e.g. "MySubplot##HiddenIdText" or "##NoTitle").
+// - #rows and #cols must be greater than 0.
+// - #size is the size of the entire grid of subplots, not the individual plots
+// - #row_ratios and #col_ratios must have AT LEAST #rows and #cols elements,
+//   respectively. These are the sizes of the rows and columns expressed in ratios.
+//   If the user adjusts the dimensions, the arrays are updated with new ratios.
+//
+// Important notes regarding BeginPlot from inside of BeginSubplots:
+//
+// - The #title_id parameter of _BeginPlot_ (see above) does NOT have to be
+//   unique when called inside of a subplot context. Subplot IDs are hashed
+//   for your convenience so you don't have call PushID or generate unique title
+//   strings. Simply pass an empty string to BeginPlot unless you want to title
+//   each subplot.
+// - The #size parameter of _BeginPlot_ (see above) is ignored when inside of a
+//   subplot context. The actual size of the subplot will be based on the
+//   #size value you pass to _BeginSubplots_ and #row/#col_ratios if provided.
+
+IMPLOT_API bool BeginSubplots(const char* title_id,
+                             int rows,
+                             int cols,
+                             const ImVec2& size,
+                             ImPlotSubplotFlags flags = 0,
+                             float* row_ratios        = nullptr,
+                             float* col_ratios        = nullptr);
+
+// Only call EndSubplots() if BeginSubplots() returns true! Typically called at the end
+// of an if statement conditioned on BeginSubplots(). See example above.
+IMPLOT_API void EndSubplots();
+
+//-----------------------------------------------------------------------------
+// [SECTION] Setup
+//-----------------------------------------------------------------------------
+
+// The following API allows you to setup and customize various aspects of the
+// current plot. The functions should be called immediately after BeginPlot
+// and before any other API calls. Typical usage is as follows:
+
+// if (BeginPlot(...)) {                     1) begin a new plot
+//     SetupAxis(ImAxis_X1, "My X-Axis");    2) make Setup calls
+//     SetupAxis(ImAxis_Y1, "My Y-Axis");
+//     SetupLegend(ImPlotLocation_North);
+//     ...
+//     SetupFinish();                        3) [optional] explicitly finish setup
+//     PlotLine(...);                        4) plot items
+//     ...
+//     EndPlot();                            5) end the plot
+// }
+//
+// Important notes:
+//
+// - Always call Setup code at the top of your BeginPlot conditional statement.
+// - Setup is locked once you start plotting or explicitly call SetupFinish.
+//   Do NOT call Setup code after you begin plotting or after you make
+//   any non-Setup API calls (e.g. utils like PlotToPixels also lock Setup)
+// - Calling SetupFinish is OPTIONAL, but probably good practice. If you do not
+//   call it yourself, then the first subsequent plotting or utility function will
+//   call it for you.
+
+// Enables an axis or sets the label and/or flags for an existing axis. Leave #label = nullptr for no label.
+IMPLOT_API void SetupAxis(ImAxis axis, const char* label=nullptr, ImPlotAxisFlags flags=0);
+// Sets an axis range limits. If ImPlotCond_Always is used, the axes limits will be locked. Inversion with v_min > v_max is not supported; use SetupAxisLimits instead.
+IMPLOT_API void SetupAxisLimits(ImAxis axis, double v_min, double v_max, ImPlotCond cond = ImPlotCond_Once);
+// Links an axis range limits to external values. Set to nullptr for no linkage. The pointer data must remain valid until EndPlot.
+IMPLOT_API void SetupAxisLinks(ImAxis axis, double* link_min, double* link_max);
+// Sets the format of numeric axis labels via formatter specifier (default="%g"). Formatted values will be double (i.e. use %f).
+IMPLOT_API void SetupAxisFormat(ImAxis axis, const char* fmt);
+// Sets the format of numeric axis labels via formatter callback. Given #value, write a label into #buff. Optionally pass user data.
+IMPLOT_API void SetupAxisFormat(ImAxis axis, ImPlotFormatter formatter, void* data=nullptr);
+// Sets an axis' ticks and optionally the labels. To keep the default ticks, set #keep_default=true.
+IMPLOT_API void SetupAxisTicks(ImAxis axis, const double* values, int n_ticks, const char* const labels[]=nullptr, bool keep_default=false);
+// Sets an axis' ticks and optionally the labels for the next plot. To keep the default ticks, set #keep_default=true.
+IMPLOT_API void SetupAxisTicks(ImAxis axis, double v_min, double v_max, int n_ticks, const char* const labels[]=nullptr, bool keep_default=false);
+// Sets an axis' scale using built-in options.
+IMPLOT_API void SetupAxisScale(ImAxis axis, ImPlotScale scale);
+// Sets an axis' scale using user supplied forward and inverse transforms.
+IMPLOT_API void SetupAxisScale(ImAxis axis, ImPlotTransform forward, ImPlotTransform inverse, void* data=nullptr);
+// Sets an axis' limits constraints.
+IMPLOT_API void SetupAxisLimitsConstraints(ImAxis axis, double v_min, double v_max);
+// Sets an axis' zoom constraints.
+IMPLOT_API void SetupAxisZoomConstraints(ImAxis axis, double z_min, double z_max);
+
+// Sets the label and/or flags for primary X and Y axes (shorthand for two calls to SetupAxis).
+IMPLOT_API void SetupAxes(const char* x_label, const char* y_label, ImPlotAxisFlags x_flags=0, ImPlotAxisFlags y_flags=0);
+// Sets the primary X and Y axes range limits. If ImPlotCond_Always is used, the axes limits will be locked (shorthand for two calls to SetupAxisLimits).
+IMPLOT_API void SetupAxesLimits(double x_min, double x_max, double y_min, double y_max, ImPlotCond cond = ImPlotCond_Once);
+
+// Sets up the plot legend. This can also be called immediately after BeginSubplots when using ImPlotSubplotFlags_ShareItems.
+IMPLOT_API void SetupLegend(ImPlotLocation location, ImPlotLegendFlags flags=0);
+// Set the location of the current plot's mouse position text (default = South|East).
+IMPLOT_API void SetupMouseText(ImPlotLocation location, ImPlotMouseTextFlags flags=0);
+
+// Explicitly finalize plot setup. Once you call this, you cannot make anymore Setup calls for the current plot!
+// Note that calling this function is OPTIONAL; it will be called by the first subsequent setup-locking API call.
+IMPLOT_API void SetupFinish();
+
+//-----------------------------------------------------------------------------
+// [SECTION] SetNext
+//-----------------------------------------------------------------------------
+
+// Though you should default to the `Setup` API above, there are some scenarios
+// where (re)configuring a plot or axis before `BeginPlot` is needed (e.g. if
+// using a preceding button or slider widget to change the plot limits). In
+// this case, you can use the `SetNext` API below. While this is not as feature
+// rich as the Setup API, most common needs are provided. These functions can be
+// called anywhere except for inside of `Begin/EndPlot`. For example:
+
+// if (ImGui::Button("Center Plot"))
+//     ImPlot::SetNextPlotLimits(-1,1,-1,1);
+// if (ImPlot::BeginPlot(...)) {
+//     ...
+//     ImPlot::EndPlot();
+// }
+//
+// Important notes:
+//
+// - You must still enable non-default axes with SetupAxis for these functions
+//   to work properly.
+
+// Sets an upcoming axis range limits. If ImPlotCond_Always is used, the axes limits will be locked.
+IMPLOT_API void SetNextAxisLimits(ImAxis axis, double v_min, double v_max, ImPlotCond cond = ImPlotCond_Once);
+// Links an upcoming axis range limits to external values. Set to nullptr for no linkage. The pointer data must remain valid until EndPlot!
+IMPLOT_API void SetNextAxisLinks(ImAxis axis, double* link_min, double* link_max);
+// Set an upcoming axis to auto fit to its data.
+IMPLOT_API void SetNextAxisToFit(ImAxis axis);
+
+// Sets the upcoming primary X and Y axes range limits. If ImPlotCond_Always is used, the axes limits will be locked (shorthand for two calls to SetupAxisLimits).
+IMPLOT_API void SetNextAxesLimits(double x_min, double x_max, double y_min, double y_max, ImPlotCond cond = ImPlotCond_Once);
+// Sets all upcoming axes to auto fit to their data.
+IMPLOT_API void SetNextAxesToFit();
+
+//-----------------------------------------------------------------------------
+// [SECTION] Plot Items
+//-----------------------------------------------------------------------------
+
+// The main plotting API is provided below. Call these functions between
+// Begin/EndPlot and after any Setup API calls. Each plots data on the current
+// x and y axes, which can be changed with `SetAxis/Axes`.
+//
+// The templated functions are explicitly instantiated in implot_items.cpp.
+// They are not intended to be used generically with custom types. You will get
+// a linker error if you try! All functions support the following scalar types:
+//
+// float, double, ImS8, ImU8, ImS16, ImU16, ImS32, ImU32, ImS64, ImU64
+//
+//
+// If you need to plot custom or non-homogenous data you have a few options:
+//
+// 1. If your data is a simple struct/class (e.g. Vector2f), you can use striding in your ImPlotSpec.
+//    This is the most performant option if applicable.
+//
+//    struct Vector2f { float X, Y; };
+//    ...
+//    Vector2f data[42];
+//    ImPlot::PlotLine("line", &data[0].x, &data[0].y, 42, {ImPlotProp_Stride, sizeof(Vector2f});
+//
+// 2. Write a custom getter C function or C++ lambda and pass it and optionally your data to
+//    an ImPlot function post-fixed with a G (e.g. PlotScatterG). This has a slight performance
+//    cost, but probably not enough to worry about unless your data is very large. Examples:
+//
+//    ImPlotPoint MyDataGetter(int idx, void* data) {
+//        MyData* my_data = (MyData*)data;
+//        ImPlotPoint p;
+//        p.x = my_data->GetTime(idx);
+//        p.y = my_data->GetValue(idx);
+//        return p
+//    }
+//    ...
+//    auto my_lambda = [](int idx, void*) {
+//        double t = idx / 999.0;
+//        return ImPlotPoint(t, 0.5+0.5*std::sin(2*PI*10*t));
+//    };
+//    ...
+//    if (ImPlot::BeginPlot("MyPlot")) {
+//        MyData my_data;
+//        ImPlot::PlotScatterG("scatter", MyDataGetter, &my_data, my_data.Size());
+//        ImPlot::PlotLineG("line", my_lambda, nullptr, 1000);
+//        ImPlot::EndPlot();
+//    }
+//
+// NB: All types are converted to double before plotting. You may lose information
+// if you try plotting extremely large 64-bit integral types. Proceed with caution!
+
+// Plots a standard 2D line plot.
+IMPLOT_TMP void PlotLine(const char* label_id, const T* values, int count, double xscale=1, double xstart=0, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_TMP void PlotLine(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_API void PlotLineG(const char* label_id, ImPlotGetter getter, void* data, int count, const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots a standard 2D scatter plot. Default marker is ImPlotMarker_Circle.
+IMPLOT_TMP void PlotScatter(const char* label_id, const T* values, int count, double xscale=1, double xstart=0, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_TMP void PlotScatter(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_API void PlotScatterG(const char* label_id, ImPlotGetter getter, void* data, int count, const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots a bubble graph. #szs are the radius of each bubble in plot units.
+IMPLOT_TMP void PlotBubbles(const char* label_id, const T* values, const T* szs, int count, double xscale=1, double xstart=0, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_TMP void PlotBubbles(const char* label_id, const T* xs, const T* ys, const T* szs, int count, const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots a polygon. Points are specified in counter-clockwise order. If concave, make sure to set the Concave flag.
+IMPLOT_TMP void PlotPolygon(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots a a stairstep graph. The y value is continued constantly to the right from every x position, i.e. the interval [x[i], x[i+1]) has the value y[i]
+IMPLOT_TMP void PlotStairs(const char* label_id, const T* values, int count, double xscale=1, double xstart=0, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_TMP void PlotStairs(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_API void PlotStairsG(const char* label_id, ImPlotGetter getter, void* data, int count, const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots a shaded (filled) region between two lines, or a line and a horizontal reference. Set yref to +/-INFINITY for infinite fill extents.
+IMPLOT_TMP void PlotShaded(const char* label_id, const T* values, int count, double yref=0, double xscale=1, double xstart=0, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_TMP void PlotShaded(const char* label_id, const T* xs, const T* ys, int count, double yref=0, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_TMP void PlotShaded(const char* label_id, const T* xs, const T* ys1, const T* ys2, int count, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_API void PlotShadedG(const char* label_id, ImPlotGetter getter1, void* data1, ImPlotGetter getter2, void* data2, int count, const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots a bar graph. Vertical by default. #bar_size and #shift are in plot units.
+IMPLOT_TMP void PlotBars(const char* label_id, const T* values, int count, double bar_size=0.67, double shift=0, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_TMP void PlotBars(const char* label_id, const T* xs, const T* ys, int count, double bar_size, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_API void PlotBarsG(const char* label_id, ImPlotGetter getter, void* data, int count, double bar_size, const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots a group of bars. #values is a row-major matrix with #item_count rows and #group_count cols. #label_ids should have #item_count elements.
+IMPLOT_TMP void PlotBarGroups(const char* const label_ids[], const T* values, int item_count, int group_count, double group_size=0.67, double shift=0, const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots vertical error bar. The label_id should be the same as the label_id of the associated line or bar plot.
+IMPLOT_TMP void PlotErrorBars(const char* label_id, const T* xs, const T* ys, const T* err, int count, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_TMP void PlotErrorBars(const char* label_id, const T* xs, const T* ys, const T* neg, const T* pos, int count, const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots stems. Vertical by default.
+IMPLOT_TMP void PlotStems(const char* label_id, const T* values, int count, double ref=0, double scale=1, double start=0, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_TMP void PlotStems(const char* label_id, const T* xs, const T* ys, int count, double ref=0, const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots infinite vertical or horizontal lines (e.g. for references or asymptotes).
+IMPLOT_TMP void PlotInfLines(const char* label_id, const T* values, int count, const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots a pie chart. Center and radius are in plot units. #label_fmt can be set to nullptr for no labels.
+IMPLOT_TMP void PlotPieChart(const char* const label_ids[], const T* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data=nullptr, double angle0=90, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_TMP void PlotPieChart(const char* const label_ids[], const T* values, int count, double x, double y, double radius, const char* label_fmt="%.1f", double angle0=90, const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots a 2D heatmap chart. Values are expected to be in row-major order by default. Leave #scale_min and scale_max both at 0 for automatic color scaling, or set them to a predefined range. #label_fmt can be set to nullptr for no labels.
+IMPLOT_TMP void PlotHeatmap(const char* label_id, const T* values, int rows, int cols, double scale_min=0, double scale_max=0, const char* label_fmt="%.1f", const ImPlotPoint& bounds_min=ImPlotPoint(0,0), const ImPlotPoint& bounds_max=ImPlotPoint(1,1), const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots a horizontal histogram. #bins can be a positive integer or an ImPlotBin_ method. If #range is left unspecified, the min/max of #values will be used as the range.
+// Otherwise, outlier values outside of the range are not binned. The largest bin count or density is returned.
+IMPLOT_TMP double PlotHistogram(const char* label_id, const T* values, int count, int bins=ImPlotBin_Sturges, double bar_scale=1.0, ImPlotRange range=ImPlotRange(), const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots two dimensional, bivariate histogram as a heatmap. #x_bins and #y_bins can be a positive integer or an ImPlotBin. If #range is left unspecified, the min/max of
+// #xs an #ys will be used as the ranges. Otherwise, outlier values outside of range are not binned. The largest bin count or density is returned.
+IMPLOT_TMP double PlotHistogram2D(const char* label_id, const T* xs, const T* ys, int count, int x_bins=ImPlotBin_Sturges, int y_bins=ImPlotBin_Sturges, ImPlotRect range=ImPlotRect(), const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots digital data. Digital plots do not respond to y drag or zoom, and are always referenced to the bottom of the plot.
+IMPLOT_TMP void PlotDigital(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec=ImPlotSpec());
+IMPLOT_API void PlotDigitalG(const char* label_id, ImPlotGetter getter, void* data, int count, const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots an axis-aligned image. #bounds_min/bounds_max are in plot coordinates (y-up) and #uv0/uv1 are in texture coordinates (y-down).
+#ifdef IMGUI_HAS_TEXTURES
+IMPLOT_API void PlotImage(const char* label_id, ImTextureRef tex_ref, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& tint_col = ImVec4(1, 1, 1, 1), const ImPlotSpec& spec=ImPlotSpec());
+#else
+IMPLOT_API void PlotImage(const char* label_id, ImTextureID tex_ref, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImVec2& uv0=ImVec2(0,0), const ImVec2& uv1=ImVec2(1,1), const ImVec4& tint_col=ImVec4(1,1,1,1), const ImPlotSpec& spec=ImPlotSpec());
+#endif
+
+// Plots a centered text label at point x,y with an optional pixel offset. Text color can be changed with ImPlot::PushStyleColor(ImPlotCol_InlayText, ...).
+IMPLOT_API void PlotText(const char* text, double x, double y, const ImVec2& pix_offset=ImVec2(0,0), const ImPlotSpec& spec=ImPlotSpec());
+
+// Plots a dummy item (i.e. adds a legend entry colored by ImPlotCol_Line)
+IMPLOT_API void PlotDummy(const char* label_id, const ImPlotSpec& spec=ImPlotSpec());
+
+//-----------------------------------------------------------------------------
+// [SECTION] Plot Tools
+//-----------------------------------------------------------------------------
+
+// The following can be used to render interactive elements and/or annotations.
+// Like the item plotting functions above, they apply to the current x and y
+// axes, which can be changed with `SetAxis/SetAxes`. These functions return true
+// when user interaction causes the provided coordinates to change. Additional
+// user interactions can be retrieved through the optional output parameters.
+
+// Shows a draggable point at x,y. #col defaults to ImGuiCol_Text.
+IMPLOT_API bool DragPoint(int id, double* x, double* y, const ImVec4& col, float size = 4, ImPlotDragToolFlags flags = 0, bool* out_clicked = nullptr, bool* out_hovered = nullptr, bool* out_held = nullptr);
+// Shows a draggable vertical guide line at an x-value. #col defaults to ImGuiCol_Text.
+IMPLOT_API bool DragLineX(int id, double* x, const ImVec4& col, float thickness = 1, ImPlotDragToolFlags flags = 0, bool* out_clicked = nullptr, bool* out_hovered = nullptr, bool* out_held = nullptr);
+// Shows a draggable horizontal guide line at a y-value. #col defaults to ImGuiCol_Text.
+IMPLOT_API bool DragLineY(int id, double* y, const ImVec4& col, float thickness = 1, ImPlotDragToolFlags flags = 0, bool* out_clicked = nullptr, bool* out_hovered = nullptr, bool* out_held = nullptr);
+// Shows a draggable and resizeable rectangle.
+IMPLOT_API bool DragRect(int id, double* x1, double* y1, double* x2, double* y2, const ImVec4& col, ImPlotDragToolFlags flags = 0, bool* out_clicked = nullptr, bool* out_hovered = nullptr, bool* out_held = nullptr);
+
+// Shows an annotation callout at a chosen point. Clamping keeps annotations in the plot area. Annotations are always rendered on top.
+IMPLOT_API void Annotation(double x, double y, const ImVec4& col, const ImVec2& pix_offset, bool clamp, bool round = false);
+IMPLOT_API void Annotation(double x, double y, const ImVec4& col, const ImVec2& pix_offset, bool clamp, const char* fmt, ...)           IM_FMTARGS(6);
+IMPLOT_API void AnnotationV(double x, double y, const ImVec4& col, const ImVec2& pix_offset, bool clamp, const char* fmt, va_list args) IM_FMTLIST(6);
+
+// Shows a x-axis tag at the specified coordinate value.
+IMPLOT_API void TagX(double x, const ImVec4& col, bool round = false);
+IMPLOT_API void TagX(double x, const ImVec4& col, const char* fmt, ...)           IM_FMTARGS(3);
+IMPLOT_API void TagXV(double x, const ImVec4& col, const char* fmt, va_list args) IM_FMTLIST(3);
+
+// Shows a y-axis tag at the specified coordinate value.
+IMPLOT_API void TagY(double y, const ImVec4& col, bool round = false);
+IMPLOT_API void TagY(double y, const ImVec4& col, const char* fmt, ...)           IM_FMTARGS(3);
+IMPLOT_API void TagYV(double y, const ImVec4& col, const char* fmt, va_list args) IM_FMTLIST(3);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Plot Utils
+//-----------------------------------------------------------------------------
+
+// Select which axis/axes will be used for subsequent plot elements.
+IMPLOT_API void SetAxis(ImAxis axis);
+IMPLOT_API void SetAxes(ImAxis x_axis, ImAxis y_axis);
+
+// Convert pixels to a position in the current plot's coordinate system. Passing IMPLOT_AUTO uses the current axes.
+IMPLOT_API ImPlotPoint PixelsToPlot(const ImVec2& pix, ImAxis x_axis = IMPLOT_AUTO, ImAxis y_axis = IMPLOT_AUTO);
+IMPLOT_API ImPlotPoint PixelsToPlot(float x, float y, ImAxis x_axis = IMPLOT_AUTO, ImAxis y_axis = IMPLOT_AUTO);
+
+// Convert a position in the current plot's coordinate system to pixels. Passing IMPLOT_AUTO uses the current axes.
+IMPLOT_API ImVec2 PlotToPixels(const ImPlotPoint& plt, ImAxis x_axis = IMPLOT_AUTO, ImAxis y_axis = IMPLOT_AUTO);
+IMPLOT_API ImVec2 PlotToPixels(double x, double y, ImAxis x_axis = IMPLOT_AUTO, ImAxis y_axis = IMPLOT_AUTO);
+
+// Get the current Plot position (top-left) in pixels.
+IMPLOT_API ImVec2 GetPlotPos();
+// Get the current Plot size in pixels.
+IMPLOT_API ImVec2 GetPlotSize();
+
+// Returns the mouse position in x,y coordinates of the current plot. Passing IMPLOT_AUTO uses the current axes.
+IMPLOT_API ImPlotPoint GetPlotMousePos(ImAxis x_axis = IMPLOT_AUTO, ImAxis y_axis = IMPLOT_AUTO);
+// Returns the current plot axis range.
+IMPLOT_API ImPlotRect GetPlotLimits(ImAxis x_axis = IMPLOT_AUTO, ImAxis y_axis = IMPLOT_AUTO);
+
+// Returns true if the plot area in the current plot is hovered.
+IMPLOT_API bool IsPlotHovered();
+// Returns true if the axis label area in the current plot is hovered.
+IMPLOT_API bool IsAxisHovered(ImAxis axis);
+// Returns true if the bounding frame of a subplot is hovered.
+IMPLOT_API bool IsSubplotsHovered();
+
+// Returns true if the current plot is being box selected.
+IMPLOT_API bool IsPlotSelected();
+// Returns the current plot box selection bounds. Passing IMPLOT_AUTO uses the current axes.
+IMPLOT_API ImPlotRect GetPlotSelection(ImAxis x_axis = IMPLOT_AUTO, ImAxis y_axis = IMPLOT_AUTO);
+// Cancels a the current plot box selection.
+IMPLOT_API void CancelPlotSelection();
+
+// Hides or shows the next plot item (i.e. as if it were toggled from the legend).
+// Use ImPlotCond_Always if you need to forcefully set this every frame.
+IMPLOT_API void HideNextItem(bool hidden = true, ImPlotCond cond = ImPlotCond_Once);
+
+// Use the following around calls to Begin/EndPlot to align l/r/t/b padding.
+// Consider using Begin/EndSubplots first. They are more feature rich and
+// accomplish the same behaviour by default. The functions below offer lower
+// level control of plot alignment.
+
+// Align axis padding over multiple plots in a single row or column. #group_id must
+// be unique. If this function returns true, EndAlignedPlots() must be called.
+IMPLOT_API bool BeginAlignedPlots(const char* group_id, bool vertical = true);
+// Only call EndAlignedPlots() if BeginAlignedPlots() returns true!
+IMPLOT_API void EndAlignedPlots();
+
+//-----------------------------------------------------------------------------
+// [SECTION] Legend Utils
+//-----------------------------------------------------------------------------
+
+// Begin a popup for a legend entry.
+IMPLOT_API bool BeginLegendPopup(const char* label_id, ImGuiMouseButton mouse_button=1);
+// End a popup for a legend entry.
+IMPLOT_API void EndLegendPopup();
+// Returns true if a plot item legend entry is hovered.
+IMPLOT_API bool IsLegendEntryHovered(const char* label_id);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Drag and Drop
+//-----------------------------------------------------------------------------
+
+// Turns the current plot's plotting area into a drag and drop target. Don't forget to call EndDragDropTarget!
+IMPLOT_API bool BeginDragDropTargetPlot();
+// Turns the current plot's X-axis into a drag and drop target. Don't forget to call EndDragDropTarget!
+IMPLOT_API bool BeginDragDropTargetAxis(ImAxis axis);
+// Turns the current plot's legend into a drag and drop target. Don't forget to call EndDragDropTarget!
+IMPLOT_API bool BeginDragDropTargetLegend();
+// Ends a drag and drop target (currently just an alias for ImGui::EndDragDropTarget).
+IMPLOT_API void EndDragDropTarget();
+
+// NB: By default, plot and axes drag and drop *sources* require holding the Ctrl modifier to initiate the drag.
+// You can change the modifier if desired. If ImGuiMod_None is provided, the axes will be locked from panning.
+
+// Turns the current plot's plotting area into a drag and drop source. You must hold Ctrl. Don't forget to call EndDragDropSource!
+IMPLOT_API bool BeginDragDropSourcePlot(ImGuiDragDropFlags flags=0);
+// Turns the current plot's X-axis into a drag and drop source. You must hold Ctrl. Don't forget to call EndDragDropSource!
+IMPLOT_API bool BeginDragDropSourceAxis(ImAxis axis, ImGuiDragDropFlags flags=0);
+// Turns an item in the current plot's legend into drag and drop source. Don't forget to call EndDragDropSource!
+IMPLOT_API bool BeginDragDropSourceItem(const char* label_id, ImGuiDragDropFlags flags=0);
+// Ends a drag and drop source (currently just an alias for ImGui::EndDragDropSource).
+IMPLOT_API void EndDragDropSource();
+
+//-----------------------------------------------------------------------------
+// [SECTION] Styling
+//-----------------------------------------------------------------------------
+    
+// Styling colors in ImPlot works similarly to styling colors in ImGui, but
+// with one important difference. Like ImGui, all style colors are stored in an
+// indexable array in ImPlotStyle. You can permanently modify these values through
+// GetStyle().Colors, or temporarily modify them with Push/Pop functions below.
+// However, by default all style colors in ImPlot default to a special color
+// IMPLOT_AUTO_COL. IMPLOT_AUTO_COL tells ImPlot to set that color from color data
+// in your **ImGuiStyle**. The ImGuiCol_ that these style colors default to are
+// detailed above, and in general have been mapped to produce plots visually
+// consistent with your current ImGui style. Of course, you are free to
+// manually set these colors to whatever you like, and further can Push/Pop
+// them around individual plots for plot-specific styling (e.g. coloring axes).
+
+// Provides access to plot style structure for permanent modifications to colors, sizes, etc.
+IMPLOT_API ImPlotStyle& GetStyle();
+
+// Style plot colors for current ImGui style (default).
+IMPLOT_API void StyleColorsAuto(ImPlotStyle* dst = nullptr);
+// Style plot colors for ImGui "Classic".
+IMPLOT_API void StyleColorsClassic(ImPlotStyle* dst = nullptr);
+// Style plot colors for ImGui "Dark".
+IMPLOT_API void StyleColorsDark(ImPlotStyle* dst = nullptr);
+// Style plot colors for ImGui "Light".
+IMPLOT_API void StyleColorsLight(ImPlotStyle* dst = nullptr);
+
+// Use PushStyleX to temporarily modify your ImPlotStyle. The modification
+// will last until the matching call to PopStyleX. You MUST call a pop for
+// every push, otherwise you will leak memory! This behaves just like ImGui.
+
+// Temporarily modify a style color. Don't forget to call PopStyleColor!
+IMPLOT_API void PushStyleColor(ImPlotCol idx, ImU32 col);
+IMPLOT_API void PushStyleColor(ImPlotCol idx, const ImVec4& col);
+// Undo temporary style color modification(s). Undo multiple pushes at once by increasing count.
+IMPLOT_API void PopStyleColor(int count = 1);
+
+// Temporarily modify a style variable of float type. Don't forget to call PopStyleVar!
+IMPLOT_API void PushStyleVar(ImPlotStyleVar idx, float val);
+// Temporarily modify a style variable of int type. Don't forget to call PopStyleVar!
+IMPLOT_API void PushStyleVar(ImPlotStyleVar idx, int val);
+// Temporarily modify a style variable of ImVec2 type. Don't forget to call PopStyleVar!
+IMPLOT_API void PushStyleVar(ImPlotStyleVar idx, const ImVec2& val);
+// Undo temporary style variable modification(s). Undo multiple pushes at once by increasing count.
+IMPLOT_API void PopStyleVar(int count = 1);
+
+// Gets the last item primary color (i.e. its legend icon color)
+IMPLOT_API ImVec4 GetLastItemColor();
+
+// Returns the null terminated string name for an ImPlotCol.
+IMPLOT_API const char* GetStyleColorName(ImPlotCol idx);
+// Returns the null terminated string name for an ImPlotMarker.
+IMPLOT_API const char* GetMarkerName(ImPlotMarker idx);
+
+// Returns the next marker and advances the marker for the current plot. You need to call this between Begin/EndPlot!
+IMPLOT_API ImPlotMarker NextMarker();
+
+//-----------------------------------------------------------------------------
+// [SECTION] Colormaps
+//-----------------------------------------------------------------------------
+
+// Item styling is based on colormaps when the relevant ImPlotCol_XXX is set to
+// IMPLOT_AUTO_COL (default). Several built-in colormaps are available. You can
+// add and then push/pop your own colormaps as well. To permanently set a colormap,
+// modify the Colormap index member of your ImPlotStyle.
+
+// Colormap data will be ignored and a custom color will be used if you have done one of the following:
+//     1) Modified an item style color in your ImPlotStyle to anything other than IMPLOT_AUTO_COL.
+//     2) Pushed an item style color using PushStyleColor().
+//     3) Set the next item style with a SetNextXXXStyle function.
+
+// Add a new colormap. The color data will be copied. The colormap can be used by pushing either the returned index or the
+// string name with PushColormap. The colormap name must be unique and the size must be greater than 1. You will receive
+// an assert otherwise! By default colormaps are considered to be qualitative (i.e. discrete). If you want to create a
+// continuous colormap, set #qual=false. This will treat the colors you provide as keys, and ImPlot will build a linearly
+// interpolated lookup table. The memory footprint of this table will be exactly ((size-1)*255+1)*4 bytes.
+IMPLOT_API ImPlotColormap AddColormap(const char* name, const ImVec4* cols, int size, bool qual=true);
+IMPLOT_API ImPlotColormap AddColormap(const char* name, const ImU32*  cols, int size, bool qual=true);
+
+// Returns the number of available colormaps (i.e. the built-in + user-added count).
+IMPLOT_API int GetColormapCount();
+// Returns a null terminated string name for a colormap given an index. Returns nullptr if index is invalid.
+IMPLOT_API const char* GetColormapName(ImPlotColormap cmap);
+// Returns an index number for a colormap given a valid string name. Returns -1 if name is invalid.
+IMPLOT_API ImPlotColormap GetColormapIndex(const char* name);
+
+// Temporarily switch to one of the built-in (i.e. ImPlotColormap_XXX) or user-added colormaps (i.e. a return value of AddColormap). Don't forget to call PopColormap!
+IMPLOT_API void PushColormap(ImPlotColormap cmap);
+// Push a colormap by string name. Use built-in names such as "Default", "Deep", "Jet", etc. or a string you provided to AddColormap. Don't forget to call PopColormap!
+IMPLOT_API void PushColormap(const char* name);
+// Undo temporary colormap modification(s). Undo multiple pushes at once by increasing count.
+IMPLOT_API void PopColormap(int count = 1);
+
+// Returns the next color from the current colormap and advances the colormap for the current plot.
+// Can also be used with no return value to skip colors if desired. You need to call this between Begin/EndPlot!
+IMPLOT_API ImVec4 NextColormapColor();
+
+// Colormap utils. If cmap = IMPLOT_AUTO (default), the current colormap is assumed.
+// Pass an explicit colormap index (built-in or user-added) to specify otherwise.
+
+// Returns the size of a colormap.
+IMPLOT_API int GetColormapSize(ImPlotColormap cmap = IMPLOT_AUTO);
+// Returns a color from a colormap given an index >= 0 (modulo will be performed).
+IMPLOT_API ImVec4 GetColormapColor(int idx, ImPlotColormap cmap = IMPLOT_AUTO);
+// Sample a color from the current colormap given t between 0 and 1.
+IMPLOT_API ImVec4 SampleColormap(float t, ImPlotColormap cmap = IMPLOT_AUTO);
+
+// Shows a vertical color scale with linear spaced ticks using the specified color map. Use double hashes to hide label (e.g. "##NoLabel"). If scale_min > scale_max, the scale to color mapping will be reversed.
+IMPLOT_API void ColormapScale(const char* label, double scale_min, double scale_max, const ImVec2& size = ImVec2(0,0), const char* format = "%g", ImPlotColormapScaleFlags flags = 0, ImPlotColormap cmap = IMPLOT_AUTO);
+// Shows a horizontal slider with a colormap gradient background. Optionally returns the color sampled at t in [0 1].
+IMPLOT_API bool ColormapSlider(const char* label, float* t, ImVec4* out = nullptr, const char* format = "", ImPlotColormap cmap = IMPLOT_AUTO);
+// Shows a button with a colormap gradient background.
+IMPLOT_API bool ColormapButton(const char* label, const ImVec2& size = ImVec2(0,0), ImPlotColormap cmap = IMPLOT_AUTO);
+
+// When items in a plot sample their color from a colormap, the color is cached and does not change
+// unless explicitly overridden. Therefore, if you change the colormap after the item has already been plotted,
+// item colors will NOT update. If you need item colors to resample the new colormap, then use this
+// function to bust the cached colors. If #plot_title_id is nullptr, then every item in EVERY existing plot
+// will be cache busted. Otherwise only the plot specified by #plot_title_id will be busted. For the
+// latter, this function must be called in the same ImGui ID scope that the plot is in. You should rarely if ever
+// need this function, but it is available for applications that require runtime colormap swaps (e.g. Heatmaps demo).
+IMPLOT_API void BustColorCache(const char* plot_title_id = nullptr);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Input Mapping
+//-----------------------------------------------------------------------------
+
+// Provides access to input mapping structure for permanent modifications to controls for pan, select, etc.
+IMPLOT_API ImPlotInputMap& GetInputMap();
+
+// Default input mapping: pan = LMB drag, box select = RMB drag, fit = LMB double click, context menu = RMB click, zoom = scroll.
+IMPLOT_API void MapInputDefault(ImPlotInputMap* dst = nullptr);
+// Reverse input mapping: pan = RMB drag, box select = LMB drag, fit = LMB double click, context menu = RMB click, zoom = scroll.
+IMPLOT_API void MapInputReverse(ImPlotInputMap* dst = nullptr);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Miscellaneous
+//-----------------------------------------------------------------------------
+
+// Render icons similar to those that appear in legends (nifty for data lists).
+IMPLOT_API void ItemIcon(const ImVec4& col);
+IMPLOT_API void ItemIcon(ImU32 col);
+IMPLOT_API void ColormapIcon(ImPlotColormap cmap);
+
+// Get the plot draw list for custom rendering to the current plot area. Call between Begin/EndPlot.
+IMPLOT_API ImDrawList* GetPlotDrawList();
+// Push clip rect for rendering to current plot area. The rect can be expanded or contracted by #expand pixels. Call between Begin/EndPlot.
+IMPLOT_API void PushPlotClipRect(float expand=0);
+// Pop plot clip rect. Call between Begin/EndPlot.
+IMPLOT_API void PopPlotClipRect();
+
+// Shows ImPlot style selector dropdown menu.
+IMPLOT_API bool ShowStyleSelector(const char* label);
+// Shows ImPlot colormap selector dropdown menu.
+IMPLOT_API bool ShowColormapSelector(const char* label);
+// Shows ImPlot input map selector dropdown menu.
+IMPLOT_API bool ShowInputMapSelector(const char* label);
+// Shows ImPlot style editor block (not a window).
+IMPLOT_API void ShowStyleEditor(ImPlotStyle* ref = nullptr);
+// Add basic help/info block for end users (not a window).
+IMPLOT_API void ShowUserGuide();
+// Shows ImPlot metrics/debug information window.
+IMPLOT_API void ShowMetricsWindow(bool* p_popen = nullptr);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Demo
+//-----------------------------------------------------------------------------
+
+// Shows the ImPlot demo window (add implot_demo.cpp to your sources!)
+IMPLOT_API void ShowDemoWindow(bool* p_open = nullptr);
+
+}  // namespace ImPlot
+
+//-----------------------------------------------------------------------------
+// [SECTION] Obsolete API
+//-----------------------------------------------------------------------------
+
+// The following functions will be removed! Keep your copy of implot up to date!
+// Occasionally set '#define IMPLOT_DISABLE_OBSOLETE_FUNCTIONS' to stay ahead.
+// If you absolutely must use these functions and do not want to receive compiler
+// warnings, set '#define IMPLOT_DISABLE_OBSOLETE_WARNINGS'.
+
+#ifndef IMPLOT_DISABLE_OBSOLETE_FUNCTIONS
+
+#ifndef IMPLOT_DISABLE_DEPRECATED_WARNINGS
+#if __cplusplus > 201402L
+#define IMPLOT_DEPRECATED(method) [[deprecated]] method
+#elif defined( __GNUC__ ) && !defined( __INTEL_COMPILER ) && ( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 1 ) )
+#define IMPLOT_DEPRECATED(method) method __attribute__( ( deprecated ) )
+#elif defined( _MSC_VER )
+#define IMPLOT_DEPRECATED(method) __declspec(deprecated) method
+#else
+#define IMPLOT_DEPRECATED(method) method
+#endif
+#else
+#define IMPLOT_DEPRECATED(method) method
+#endif
+
+namespace ImPlot {
+
+// OBSOLETED in v1.0 (from February 2026)
+// IMPLOT_API void SetNextLineStyle(const ImVec4& col = IMPLOT_AUTO_COL, float weight = IMPLOT_AUTO); // OBSOLETED IN v1.0 // Set ImPlotSpec.LineColor/LineWeight or construct ImPlotSpec with { ImPlotSpec_LineColor, color, ImPlotSpec_LineWeight, weight }.
+
+// IMPLOT_API void SetNextFillStyle(const ImVec4& col = IMPLOT_AUTO_COL, float alpha_mod = IMPLOT_AUTO);// OBSOLETED IN v1.0 // Set ImPlotSpec.FillColor/FillAlpha or construct ImPlotSpec with { ImPlotSpec_FillColor, color, ImPlotSpec_FillAlpha, alpha }.
+
+// IMPLOT_API void SetNextMarkerStyle(ImPlotMarker marker = IMPLOT_AUTO, float size = IMPLOT_AUTO, const ImVec4& fill = IMPLOT_AUTO_COL, float weight = IMPLOT_AUTO, const ImVec4& outline = IMPLOT_AUTO_COL); // OBSOLETED IN v1.0 // Set ImPlotSpec.Marker/MarkerSize/MarkerFillColor/LineWeight/MarkerLineColor or construct ImPlotSpec with { ImPlotSpec_Marker, marker, ImPlotSpec_MarkerSize, size, ImPlotSpec_MarkerFillColor, fill_color, ImPlotSpec_LineWeight, weight, ImPlotSpec_MarkerLineColor, outline }.
+
+// IMPLOT_API void SetNextErrorBarStyle(const ImVec4& col = IMPLOT_AUTO_COL, float size = IMPLOT_AUTO, float weight = IMPLOT_AUTO); // OBSOLETED IN v1.0 // Set ImPlotSpec.LineColor/Size/LineWeight or construct ImPlotSpec with { ImPlotSpec_LineColor, col, ImPlotSpec_Size, size, ImPlotSpec_LineWeight, weight }.
+
+
+} // namespace ImPlot
+
+#endif // #ifndef IMPLOT_DISABLE_OBSOLETE_FUNCTIONS
+#endif // #ifndef IMGUI_DISABLE
diff --git a/cbits/implot/implot_internal.h b/cbits/implot/implot_internal.h
new file mode 100644
--- /dev/null
+++ b/cbits/implot/implot_internal.h
@@ -0,0 +1,1722 @@
+// MIT License
+
+// Copyright (c) 2020-2024 Evan Pezent
+// Copyright (c) 2025-2026 Breno Cunha Queiroz
+
+// 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.
+
+// ImPlot v1.1 WIP
+
+// You may use this file to debug, understand or extend ImPlot features but we
+// don't provide any guarantee of forward compatibility!
+
+//-----------------------------------------------------------------------------
+// [SECTION] Header Mess
+//-----------------------------------------------------------------------------
+
+#pragma once
+
+#ifndef IMPLOT_VERSION
+#error Must include implot.h before implot_internal.h
+#endif
+
+#ifndef IMGUI_DISABLE
+#include <time.h>
+#include "imgui_internal.h"
+
+// Support for pre-1.84 versions. ImPool's GetSize() -> GetBufSize()
+#if (IMGUI_VERSION_NUM < 18303)
+#define GetBufSize GetSize
+#endif
+
+//-----------------------------------------------------------------------------
+// [SECTION] Constants
+//-----------------------------------------------------------------------------
+
+// Constants can be changed unless stated otherwise. We may move some of these
+// to ImPlotStyleVar_ over time.
+
+// Minimum allowable timestamp value 01/01/1970 @ 12:00am (UTC) (DO NOT DECREASE THIS)
+constexpr double IMPLOT_MIN_TIME = 0;
+// Maximum allowable timestamp value 01/01/3000 @ 12:00am (UTC) (DO NOT INCREASE THIS)
+constexpr double IMPLOT_MAX_TIME = 32503680000;
+
+// Default label format for axis labels
+constexpr const char* IMPLOT_LABEL_FORMAT = "%g";
+// Max character size for tick labels
+constexpr int IMPLOT_LABEL_MAX_SIZE = 32;
+
+// Number of X axes
+constexpr int IMPLOT_NUM_X_AXES = ImAxis_Y1;
+// Number of Y axes
+constexpr int IMPLOT_NUM_Y_AXES = ImAxis_COUNT - IMPLOT_NUM_X_AXES;
+
+//-----------------------------------------------------------------------------
+// [SECTION] Macros
+//-----------------------------------------------------------------------------
+
+// Split ImU32 color into RGB components [0 255]
+#define IM_COL32_SPLIT_RGB(col,r,g,b) \
+    ImU32 r = ((col >> IM_COL32_R_SHIFT) & 0xFF); \
+    ImU32 g = ((col >> IM_COL32_G_SHIFT) & 0xFF); \
+    ImU32 b = ((col >> IM_COL32_B_SHIFT) & 0xFF);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Forward Declarations
+//-----------------------------------------------------------------------------
+
+struct ImPlotTick;
+struct ImPlotAxis;
+struct ImPlotAxisColor;
+struct ImPlotItem;
+struct ImPlotLegend;
+struct ImPlotPlot;
+struct ImPlotNextPlotData;
+struct ImPlotTicker;
+
+//-----------------------------------------------------------------------------
+// [SECTION] Context Pointer
+//-----------------------------------------------------------------------------
+
+#ifndef GImPlot
+extern IMPLOT_API ImPlotContext* GImPlot; // Current implicit context pointer
+#endif
+
+//-----------------------------------------------------------------------------
+// [SECTION] Generic Helpers
+//-----------------------------------------------------------------------------
+
+// Computes the common (base-10) logarithm
+static inline float  ImLog10(float x)  { return log10f(x); }
+static inline double ImLog10(double x) { return log10(x);  }
+static inline float  ImSinh(float x)   { return sinhf(x);  }
+static inline double ImSinh(double x)  { return sinh(x);   }
+static inline float  ImAsinh(float x)  { return asinhf(x); }
+static inline double ImAsinh(double x) { return asinh(x);  }
+// Returns true if a flag is set
+template <typename TSet, typename TFlag>
+static inline bool ImHasFlag(TSet set, TFlag flag) { return (set & flag) == flag; }
+// Flips a flag in a flagset
+template <typename TSet, typename TFlag>
+static inline void ImFlipFlag(TSet& set, TFlag flag) { ImHasFlag(set, flag) ? set &= ~flag : set |= flag; }
+// Linearly remaps x from [x0 x1] to [y0 y1].
+template <typename T>
+static inline T ImRemap(T x, T x0, T x1, T y0, T y1) { return y0 + (x - x0) * (y1 - y0) / (x1 - x0); }
+// Linearly remaps x from [x0 x1] to [0 1]
+template <typename T>
+static inline T ImRemap01(T x, T x0, T x1) { return (x - x0) / (x1 - x0); }
+// Returns always positive modulo (assumes r != 0)
+static inline int ImPosMod(int l, int r) { return (l % r + r) % r; }
+// Returns true if val is NAN
+static inline bool ImNan(double val) { return isnan(val); }
+// Returns true if val is NAN or INFINITY
+static inline bool ImNanOrInf(double val) { return !(val >= -DBL_MAX && val <= DBL_MAX) || ImNan(val); }
+// Turns NANs to 0s
+static inline double ImConstrainNan(double val) { return ImNan(val) ? 0 : val; }
+// Turns infinity to floating point maximums
+static inline double ImConstrainInf(double val) { return val >= DBL_MAX ?  DBL_MAX : val <= -DBL_MAX ? - DBL_MAX : val; }
+// Turns numbers less than or equal to 0 to 0.001 (sort of arbitrary, is there a better way?)
+static inline double ImConstrainLog(double val) { return val <= 0 ? 0.001f : val; }
+// Turns numbers less than 0 to zero
+static inline double ImConstrainTime(double val) { return val < IMPLOT_MIN_TIME ? IMPLOT_MIN_TIME : (val > IMPLOT_MAX_TIME ? IMPLOT_MAX_TIME : val); }
+// True if two numbers are approximately equal using units in the last place.
+static inline bool ImAlmostEqual(double v1, double v2, int ulp = 2) { return ImAbs(v1-v2) < DBL_EPSILON * ImAbs(v1+v2) * ulp || ImAbs(v1-v2) < DBL_MIN; }
+
+// Finds min value in an unsorted array
+template <typename T>
+static inline T ImMinArray(const T* values, int count) { T m = values[0]; for (int i = 1; i < count; ++i) { if (values[i] < m) { m = values[i]; } } return m; }
+// Finds the max value in an unsorted array
+template <typename T>
+static inline T ImMaxArray(const T* values, int count) { T m = values[0]; for (int i = 1; i < count; ++i) { if (values[i] > m) { m = values[i]; } } return m; }
+// Finds the min and max value in an unsorted array
+template <typename T>
+static inline void ImMinMaxArray(const T* values, int count, T* min_out, T* max_out) {
+    T Min = values[0]; T Max = values[0];
+    for (int i = 1; i < count; ++i) {
+        if (values[i] < Min) { Min = values[i]; }
+        if (values[i] > Max) { Max = values[i]; }
+    }
+    *min_out = Min; *max_out = Max;
+}
+// Finds the sim of an array
+template <typename T>
+static inline T ImSum(const T* values, int count) {
+    T sum  = 0;
+    for (int i = 0; i < count; ++i)
+        sum += values[i];
+    return sum;
+}
+// Finds the mean of an array
+template <typename T>
+static inline double ImMean(const T* values, int count) {
+    double den = 1.0 / count;
+    double mu  = 0;
+    for (int i = 0; i < count; ++i)
+        mu += (double)values[i] * den;
+    return mu;
+}
+// Finds the sample standard deviation of an array
+template <typename T>
+static inline double ImStdDev(const T* values, int count) {
+    double den = 1.0 / (count - 1.0);
+    double mu  = ImMean(values, count);
+    double x   = 0;
+    for (int i = 0; i < count; ++i)
+        x += ((double)values[i] - mu) * ((double)values[i] - mu) * den;
+    return sqrt(x);
+}
+
+// Mix color a and b by factor s in [0 256]
+static inline ImU32 ImMixU32(ImU32 a, ImU32 b, ImU32 s) {
+#ifdef IMPLOT_MIX64
+    const ImU32 af = 256-s;
+    const ImU32 bf = s;
+    const ImU64 al = (a & 0x00ff00ff) | (((ImU64)(a & 0xff00ff00)) << 24);
+    const ImU64 bl = (b & 0x00ff00ff) | (((ImU64)(b & 0xff00ff00)) << 24);
+    const ImU64 mix = (al * af + bl * bf);
+    return ((mix >> 32) & 0xff00ff00) | ((mix & 0xff00ff00) >> 8);
+#else
+    const ImU32 af = 256-s;
+    const ImU32 bf = s;
+    const ImU32 al = (a & 0x00ff00ff);
+    const ImU32 ah = (a & 0xff00ff00) >> 8;
+    const ImU32 bl = (b & 0x00ff00ff);
+    const ImU32 bh = (b & 0xff00ff00) >> 8;
+    const ImU32 ml = (al * af + bl * bf);
+    const ImU32 mh = (ah * af + bh * bf);
+    return (mh & 0xff00ff00) | ((ml & 0xff00ff00) >> 8);
+#endif
+}
+
+// Lerp across an array of 32-bit colors given t in [0.0 1.0]
+static inline ImU32 ImLerpU32(const ImU32* colors, int size, float t) {
+    int i1 = (int)((size - 1 ) * t);
+    int i2 = i1 + 1;
+    if (i2 == size || size == 1)
+        return colors[i1];
+    float den = 1.0f / (size - 1);
+    float t1 = i1 * den;
+    float t2 = i2 * den;
+    float tr = ImRemap01(t, t1, t2);
+    return ImMixU32(colors[i1], colors[i2], (ImU32)(tr*256));
+}
+
+// Set alpha channel of 32-bit color from float in range [0.0 1.0]
+static inline ImU32 ImAlphaU32(ImU32 col, float alpha) {
+    return col & ~((ImU32)((1.0f-alpha)*255)<<IM_COL32_A_SHIFT);
+}
+
+// Returns true of two ranges overlap
+template <typename T>
+static inline bool ImOverlaps(T min_a, T max_a, T min_b, T max_b) {
+    return min_a <= max_b && min_b <= max_a;
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] ImPlot Enums
+//-----------------------------------------------------------------------------
+
+typedef int ImPlotTimeUnit;       // -> enum ImPlotTimeUnit_
+typedef int ImPlotDateFmt;        // -> enum ImPlotDateFmt_
+typedef int ImPlotTimeFmt;        // -> enum ImPlotTimeFmt_
+typedef int ImPlotMarkerInternal; // -> enum ImPlotMarkerInternal_
+
+enum ImPlotTimeUnit_ {
+    ImPlotTimeUnit_Us,  // microsecond
+    ImPlotTimeUnit_Ms,  // millisecond
+    ImPlotTimeUnit_S,   // second
+    ImPlotTimeUnit_Min, // minute
+    ImPlotTimeUnit_Hr,  // hour
+    ImPlotTimeUnit_Day, // day
+    ImPlotTimeUnit_Mo,  // month
+    ImPlotTimeUnit_Yr,  // year
+    ImPlotTimeUnit_COUNT
+};
+
+enum ImPlotDateFmt_ {              // default        [ ISO 8601     ]
+    ImPlotDateFmt_None = 0,
+    ImPlotDateFmt_DayMo,           // 10/3           [ --10-03      ]
+    ImPlotDateFmt_DayMoYr,         // 10/3/91        [ 1991-10-03   ]
+    ImPlotDateFmt_MoYr,            // Oct 1991       [ 1991-10      ]
+    ImPlotDateFmt_Mo,              // Oct            [ --10         ]
+    ImPlotDateFmt_Yr               // 1991           [ 1991         ]
+};
+
+enum ImPlotTimeFmt_ {              // default        [ 24 Hour Clock ]
+    ImPlotTimeFmt_None = 0,
+    ImPlotTimeFmt_Us,              // .428 552       [ .428 552     ]
+    ImPlotTimeFmt_SUs,             // :29.428 552    [ :29.428 552  ]
+    ImPlotTimeFmt_SMs,             // :29.428        [ :29.428      ]
+    ImPlotTimeFmt_S,               // :29            [ :29          ]
+    ImPlotTimeFmt_MinSMs,          // 21:29.428      [ 21:29.428    ]
+    ImPlotTimeFmt_HrMinSMs,        // 7:21:29.428pm  [ 19:21:29.428 ]
+    ImPlotTimeFmt_HrMinS,          // 7:21:29pm      [ 19:21:29     ]
+    ImPlotTimeFmt_HrMin,           // 7:21pm         [ 19:21        ]
+    ImPlotTimeFmt_Hr               // 7pm            [ 19:00        ]
+};
+
+enum ImPlotMarkerInternal_ {
+    ImPlotMarker_Invalid = -3
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Callbacks
+//-----------------------------------------------------------------------------
+
+typedef void (*ImPlotLocator)(ImPlotTicker& ticker, const ImPlotRange& range, float pixels, bool vertical, ImPlotFormatter formatter, void* formatter_data);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Structs
+//-----------------------------------------------------------------------------
+
+// Combined date/time format spec
+struct ImPlotDateTimeSpec {
+    ImPlotDateTimeSpec() {}
+    ImPlotDateTimeSpec(ImPlotDateFmt date_fmt, ImPlotTimeFmt time_fmt, bool use_24_hr_clk = false, bool use_iso_8601 = false) {
+        Date           = date_fmt;
+        Time           = time_fmt;
+        UseISO8601     = use_iso_8601;
+        Use24HourClock = use_24_hr_clk;
+    }
+    ImPlotDateFmt Date;
+    ImPlotTimeFmt Time;
+    bool UseISO8601;
+    bool Use24HourClock;
+};
+
+// Two part timestamp struct.
+struct ImPlotTime {
+    time_t S;  // second part
+    int    Us; // microsecond part
+    ImPlotTime() { S = 0; Us = 0; }
+    ImPlotTime(time_t s, int us = 0) { S  = s + us / 1000000; Us = us % 1000000; }
+    void RollOver() { S  = S + Us / 1000000;  Us = Us % 1000000; }
+    double ToDouble() const { return (double)S + (double)Us / 1000000.0; }
+    static ImPlotTime FromDouble(double t) { return ImPlotTime((time_t)t, (int)(t * 1000000 - floor(t) * 1000000)); }
+};
+
+static inline ImPlotTime operator+(const ImPlotTime& lhs, const ImPlotTime& rhs)
+{ return ImPlotTime(lhs.S + rhs.S, lhs.Us + rhs.Us); }
+static inline ImPlotTime operator-(const ImPlotTime& lhs, const ImPlotTime& rhs)
+{ return ImPlotTime(lhs.S - rhs.S, lhs.Us - rhs.Us); }
+static inline bool operator==(const ImPlotTime& lhs, const ImPlotTime& rhs)
+{ return lhs.S == rhs.S && lhs.Us == rhs.Us; }
+static inline bool operator<(const ImPlotTime& lhs, const ImPlotTime& rhs)
+{ return lhs.S == rhs.S ? lhs.Us < rhs.Us : lhs.S < rhs.S; }
+static inline bool operator>(const ImPlotTime& lhs, const ImPlotTime& rhs)
+{ return rhs < lhs; }
+static inline bool operator<=(const ImPlotTime& lhs, const ImPlotTime& rhs)
+{ return lhs < rhs || lhs == rhs; }
+static inline bool operator>=(const ImPlotTime& lhs, const ImPlotTime& rhs)
+{ return lhs > rhs || lhs == rhs; }
+
+// Colormap data storage
+struct ImPlotColormapData {
+    ImVector<ImU32> Keys;
+    ImVector<int>   KeyCounts;
+    ImVector<int>   KeyOffsets;
+    ImVector<ImU32> Tables;
+    ImVector<int>   TableSizes;
+    ImVector<int>   TableOffsets;
+    ImGuiTextBuffer Text;
+    ImVector<int>   TextOffsets;
+    ImVector<bool>  Quals;
+    ImGuiStorage    Map;
+    int             Count;
+
+    ImPlotColormapData() { Count = 0; }
+
+    int Append(const char* name, const ImU32* keys, int count, bool qual) {
+        if (GetIndex(name) != -1)
+            return -1;
+        KeyOffsets.push_back(Keys.size());
+        KeyCounts.push_back(count);
+        Keys.reserve(Keys.size()+count);
+        for (int i = 0; i < count; ++i)
+            Keys.push_back(keys[i]);
+        TextOffsets.push_back(Text.size());
+        Text.append(name, name + strlen(name) + 1);
+        Quals.push_back(qual);
+        ImGuiID id = ImHashStr(name);
+        int idx = Count++;
+        Map.SetInt(id,idx);
+        _AppendTable(idx);
+        return idx;
+    }
+
+    void _AppendTable(ImPlotColormap cmap) {
+        int key_count     = GetKeyCount(cmap);
+        const ImU32* keys = GetKeys(cmap);
+        int off = Tables.size();
+        TableOffsets.push_back(off);
+        if (IsQual(cmap)) {
+            Tables.reserve(key_count);
+            for (int i = 0; i < key_count; ++i)
+                Tables.push_back(keys[i]);
+            TableSizes.push_back(key_count);
+        }
+        else {
+            int max_size = 255 * (key_count-1) + 1;
+            Tables.reserve(off + max_size);
+            // ImU32 last = keys[0];
+            // Tables.push_back(last);
+            // int n = 1;
+            for (int i = 0; i < key_count-1; ++i) {
+                for (int s = 0; s < 255; ++s) {
+                    ImU32 a = keys[i];
+                    ImU32 b = keys[i+1];
+                    ImU32 c = ImMixU32(a,b,s);
+                    // if (c != last) {
+                        Tables.push_back(c);
+                        // last = c;
+                        // n++;
+                    // }
+                }
+            }
+            ImU32 c = keys[key_count-1];
+            // if (c != last) {
+                Tables.push_back(c);
+                // n++;
+            // }
+            // TableSizes.push_back(n);
+            TableSizes.push_back(max_size);
+        }
+    }
+
+    void RebuildTables() {
+        Tables.resize(0);
+        TableSizes.resize(0);
+        TableOffsets.resize(0);
+        for (int i = 0; i < Count; ++i)
+            _AppendTable(i);
+    }
+
+    inline bool           IsQual(ImPlotColormap cmap) const                      { return Quals[cmap];                                                }
+    inline const char*    GetName(ImPlotColormap cmap) const                     { return cmap < Count ? Text.Buf.Data + TextOffsets[cmap] : nullptr; }
+    inline ImPlotColormap GetIndex(const char* name) const                       { ImGuiID key = ImHashStr(name); return Map.GetInt(key,-1);          }
+
+    inline const ImU32*   GetKeys(ImPlotColormap cmap) const                     { return &Keys[KeyOffsets[cmap]];                                    }
+    inline int            GetKeyCount(ImPlotColormap cmap) const                 { return KeyCounts[cmap];                                            }
+    inline ImU32          GetKeyColor(ImPlotColormap cmap, int idx) const        { return Keys[KeyOffsets[cmap]+idx];                                 }
+    inline void           SetKeyColor(ImPlotColormap cmap, int idx, ImU32 value) { Keys[KeyOffsets[cmap]+idx] = value; RebuildTables();               }
+
+    inline const ImU32*   GetTable(ImPlotColormap cmap) const                    { return &Tables[TableOffsets[cmap]];                                }
+    inline int            GetTableSize(ImPlotColormap cmap) const                { return TableSizes[cmap];                                           }
+    inline ImU32          GetTableColor(ImPlotColormap cmap, int idx) const      { return Tables[TableOffsets[cmap]+idx];                             }
+
+    inline ImU32 LerpTable(ImPlotColormap cmap, float t) const {
+        int off = TableOffsets[cmap];
+        int siz = TableSizes[cmap];
+        int idx = Quals[cmap] ? ImClamp((int)(siz*t),0,siz-1) : (int)((siz - 1) * t + 0.5f);
+        return Tables[off + idx];
+    }
+};
+
+// ImPlotPoint with positive/negative error values
+struct ImPlotPointError {
+    double X, Y, Neg, Pos;
+    ImPlotPointError() { X = 0; Y = 0; Neg = 0; Pos = 0; }
+    ImPlotPointError(double x, double y, double neg, double pos) {
+        X = x; Y = y; Neg = neg; Pos = pos;
+    }
+};
+
+// Interior plot label/annotation
+struct ImPlotAnnotation {
+    ImVec2 Pos;
+    ImVec2 Offset;
+    ImU32  ColorBg;
+    ImU32  ColorFg;
+    int    TextOffset;
+    bool   Clamp;
+    ImPlotAnnotation() {
+        ColorBg = ColorFg = 0;
+        TextOffset = 0;
+        Clamp = false;
+    }
+};
+
+// Collection of plot labels
+struct ImPlotAnnotationCollection {
+
+    ImVector<ImPlotAnnotation> Annotations;
+    ImGuiTextBuffer            TextBuffer;
+    int                        Size;
+
+    ImPlotAnnotationCollection() { Reset(); }
+
+    void AppendV(const ImVec2& pos, const ImVec2& off, ImU32 bg, ImU32 fg, bool clamp, const char* fmt,  va_list args) IM_FMTLIST(7) {
+        ImPlotAnnotation an;
+        an.Pos = pos; an.Offset = off;
+        an.ColorBg = bg; an.ColorFg = fg;
+        an.TextOffset = TextBuffer.size();
+        an.Clamp = clamp;
+        Annotations.push_back(an);
+        TextBuffer.appendfv(fmt, args);
+        const char nul[] = "";
+        TextBuffer.append(nul,nul+1);
+        Size++;
+    }
+
+    void Append(const ImVec2& pos, const ImVec2& off, ImU32 bg, ImU32 fg, bool clamp, const char* fmt,  ...) IM_FMTARGS(7) {
+        va_list args;
+        va_start(args, fmt);
+        AppendV(pos, off, bg, fg, clamp, fmt, args);
+        va_end(args);
+    }
+
+    const char* GetText(int idx) {
+        return TextBuffer.Buf.Data + Annotations[idx].TextOffset;
+    }
+
+    void Reset() {
+        Annotations.shrink(0);
+        TextBuffer.Buf.shrink(0);
+        Size = 0;
+    }
+};
+
+struct ImPlotTag {
+    ImAxis Axis;
+    double Value;
+    ImU32  ColorBg;
+    ImU32  ColorFg;
+    int    TextOffset;
+
+    ImPlotTag() {
+        Axis       = 0;
+        Value      = 0;
+        ColorBg    = 0;
+        ColorFg    = 0;
+        TextOffset = 0;
+    }
+};
+
+struct ImPlotTagCollection {
+
+    ImVector<ImPlotTag> Tags;
+    ImGuiTextBuffer     TextBuffer;
+    int                 Size;
+
+    ImPlotTagCollection() { Reset(); }
+
+    void AppendV(ImAxis axis, double value, ImU32 bg, ImU32 fg, const char* fmt, va_list args) IM_FMTLIST(6) {
+        ImPlotTag tag;
+        tag.Axis = axis;
+        tag.Value = value;
+        tag.ColorBg = bg;
+        tag.ColorFg = fg;
+        tag.TextOffset = TextBuffer.size();
+        Tags.push_back(tag);
+        TextBuffer.appendfv(fmt, args);
+        const char nul[] = "";
+        TextBuffer.append(nul,nul+1);
+        Size++;
+    }
+
+    void Append(ImAxis axis, double value, ImU32 bg, ImU32 fg, const char* fmt, ...) IM_FMTARGS(6) {
+        va_list args;
+        va_start(args, fmt);
+        AppendV(axis, value, bg, fg, fmt, args);
+        va_end(args);
+    }
+
+    const char* GetText(int idx) {
+        return TextBuffer.Buf.Data + Tags[idx].TextOffset;
+    }
+
+    void Reset() {
+        Tags.shrink(0);
+        TextBuffer.Buf.shrink(0);
+        Size = 0;
+    }
+};
+
+// Tick mark info
+struct ImPlotTick
+{
+    double PlotPos;
+    float  PixelPos;
+    ImVec2 LabelSize;
+    int    TextOffset;
+    bool   Major;
+    bool   ShowLabel;
+    int    Level;
+    int    Idx;
+
+    ImPlotTick() {
+        PlotPos      = 0;
+        PixelPos     = 0;
+        LabelSize    = ImVec2(0,0);
+        TextOffset   = -1;
+        Major        = false;
+        ShowLabel    = false;
+        Level        = 0;
+        Idx          = -1;
+    }
+
+    ImPlotTick(double value, bool major, int level, bool show_label) {
+        PixelPos     = 0;
+        PlotPos      = value;
+        Major        = major;
+        ShowLabel    = show_label;
+        Level        = level;
+        TextOffset   = -1;
+    }
+};
+
+// Collection of ticks
+struct ImPlotTicker {
+    ImVector<ImPlotTick> Ticks;
+    ImGuiTextBuffer      TextBuffer;
+    ImVec2               MaxSize;
+    ImVec2               LateSize;
+    int                  Levels;
+
+    ImPlotTicker() {
+        Reset();
+    }
+
+    ImPlotTick& AddTick(double value, bool major, int level, bool show_label, const char* label) {
+        ImPlotTick tick(value, major, level, show_label);
+        if (show_label && label != nullptr) {
+            tick.TextOffset = TextBuffer.size();
+            TextBuffer.append(label, label + strlen(label) + 1);
+            tick.LabelSize = ImGui::CalcTextSize(TextBuffer.Buf.Data + tick.TextOffset);
+        }
+        return AddTick(tick);
+    }
+
+    ImPlotTick& AddTick(double value, bool major, int level, bool show_label, ImPlotFormatter formatter, void* data) {
+        ImPlotTick tick(value, major, level, show_label);
+        if (show_label && formatter != nullptr) {
+            char buff[IMPLOT_LABEL_MAX_SIZE];
+            tick.TextOffset = TextBuffer.size();
+            formatter(tick.PlotPos, buff, sizeof(buff), data);
+            TextBuffer.append(buff, buff + strlen(buff) + 1);
+            tick.LabelSize = ImGui::CalcTextSize(TextBuffer.Buf.Data + tick.TextOffset);
+        }
+        return AddTick(tick);
+    }
+
+    inline ImPlotTick& AddTick(ImPlotTick tick) {
+        if (tick.ShowLabel) {
+            MaxSize.x     =  tick.LabelSize.x > MaxSize.x ? tick.LabelSize.x : MaxSize.x;
+            MaxSize.y     =  tick.LabelSize.y > MaxSize.y ? tick.LabelSize.y : MaxSize.y;
+        }
+        tick.Idx = Ticks.size();
+        Ticks.push_back(tick);
+        return Ticks.back();
+    }
+
+    const char* GetText(int idx) const {
+        return TextBuffer.Buf.Data + Ticks[idx].TextOffset;
+    }
+
+    const char* GetText(const ImPlotTick& tick) {
+        return GetText(tick.Idx);
+    }
+
+    void OverrideSizeLate(const ImVec2& size) {
+        LateSize.x = size.x > LateSize.x ? size.x : LateSize.x;
+        LateSize.y = size.y > LateSize.y ? size.y : LateSize.y;
+    }
+
+    void Reset() {
+        Ticks.shrink(0);
+        TextBuffer.Buf.shrink(0);
+        MaxSize = LateSize;
+        LateSize = ImVec2(0,0);
+        Levels = 1;
+    }
+
+    int TickCount() const {
+        return Ticks.Size;
+    }
+};
+
+// Axis state information that must persist after EndPlot
+struct ImPlotAxis
+{
+    ImGuiID              ID;
+    ImPlotAxisFlags      Flags;
+    ImPlotAxisFlags      PreviousFlags;
+    ImPlotRange          Range;
+    ImPlotCond           RangeCond;
+    ImPlotScale          Scale;
+    ImPlotRange          FitExtents;
+    ImPlotAxis*          OrthoAxis;
+    ImPlotRange          ConstraintRange;
+    ImPlotRange          ConstraintZoom;
+
+    ImPlotTicker         Ticker;
+    ImPlotFormatter      Formatter;
+    void*                FormatterData;
+    char                 FormatSpec[16];
+    ImPlotLocator        Locator;
+
+    double*              LinkedMin;
+    double*              LinkedMax;
+
+    int                  PickerLevel;
+    ImPlotTime           PickerTimeMin, PickerTimeMax;
+
+    ImPlotTransform      TransformForward;
+    ImPlotTransform      TransformInverse;
+    void*                TransformData;
+    float                PixelMin, PixelMax;
+    double               ScaleMin, ScaleMax;
+    double               ScaleToPixel;
+    float                Datum1, Datum2;
+
+    ImRect               HoverRect;
+    int                  LabelOffset;
+    ImU32                ColorMaj, ColorMin, ColorTick, ColorTxt, ColorBg, ColorHov, ColorAct, ColorHiLi;
+
+    bool                 Enabled;
+    bool                 Vertical;
+    bool                 FitThisFrame;
+    bool                 HasRange;
+    bool                 HasFormatSpec;
+    bool                 ShowDefaultTicks;
+    bool                 Hovered;
+    bool                 Held;
+
+    ImPlotAxis() {
+        ID               = 0;
+        Flags            = PreviousFlags = ImPlotAxisFlags_None;
+        Range.Min        = 0;
+        Range.Max        = 1;
+        Scale            = ImPlotScale_Linear;
+        TransformForward = TransformInverse = nullptr;
+        TransformData    = nullptr;
+        FitExtents.Min   = HUGE_VAL;
+        FitExtents.Max   = -HUGE_VAL;
+        OrthoAxis        = nullptr;
+        ConstraintRange  = ImPlotRange(-INFINITY,INFINITY);
+        ConstraintZoom   = ImPlotRange(DBL_MIN,INFINITY);
+        LinkedMin        = LinkedMax = nullptr;
+        PickerLevel      = 0;
+        Datum1           = Datum2 = 0;
+        PixelMin         = PixelMax = 0;
+        LabelOffset      = -1;
+        ColorMaj         = ColorMin = ColorTick = ColorTxt = ColorBg = ColorHov = ColorAct = 0;
+        ColorHiLi        = IM_COL32_BLACK_TRANS;
+        Formatter        = nullptr;
+        FormatterData    = nullptr;
+        Locator          = nullptr;
+        Enabled          = Hovered = Held = FitThisFrame = HasRange = HasFormatSpec = false;
+        ShowDefaultTicks = true;
+    }
+
+    inline void Reset() {
+        Enabled          = false;
+        Scale            = ImPlotScale_Linear;
+        TransformForward = TransformInverse = nullptr;
+        TransformData    = nullptr;
+        LabelOffset      = -1;
+        HasFormatSpec    = false;
+        Formatter        = nullptr;
+        FormatterData    = nullptr;
+        Locator          = nullptr;
+        ShowDefaultTicks = true;
+        FitThisFrame     = false;
+        FitExtents.Min   = HUGE_VAL;
+        FitExtents.Max   = -HUGE_VAL;
+        OrthoAxis        = nullptr;
+        ConstraintRange  = ImPlotRange(-INFINITY,INFINITY);
+        ConstraintZoom   = ImPlotRange(DBL_MIN,INFINITY);
+        Ticker.Reset();
+    }
+
+    inline bool SetMin(double _min, bool force=false) {
+        if (!force && IsLockedMin())
+            return false;
+        _min = ImConstrainNan(ImConstrainInf(_min));
+        if (_min < ConstraintRange.Min)
+            _min = ConstraintRange.Min;
+        double z = Range.Max - _min;
+        if (z < ConstraintZoom.Min)
+            _min = Range.Max - ConstraintZoom.Min;
+        if (z > ConstraintZoom.Max)
+            _min = Range.Max - ConstraintZoom.Max;
+        if (_min >= Range.Max)
+            return false;
+        Range.Min = _min;
+        PickerTimeMin = ImPlotTime::FromDouble(Range.Min);
+        UpdateTransformCache();
+        return true;
+    }
+
+    inline bool SetMax(double _max, bool force=false) {
+        if (!force && IsLockedMax())
+            return false;
+        _max = ImConstrainNan(ImConstrainInf(_max));
+        if (_max > ConstraintRange.Max)
+            _max = ConstraintRange.Max;
+        double z = _max - Range.Min;
+        if (z < ConstraintZoom.Min)
+            _max = Range.Min + ConstraintZoom.Min;
+        if (z > ConstraintZoom.Max)
+            _max = Range.Min + ConstraintZoom.Max;
+        if (_max <= Range.Min)
+            return false;
+        Range.Max = _max;
+        PickerTimeMax = ImPlotTime::FromDouble(Range.Max);
+        UpdateTransformCache();
+        return true;
+    }
+
+    inline void SetRange(double v1, double v2) {
+        Range.Min = ImMin(v1,v2);
+        Range.Max = ImMax(v1,v2);
+        Constrain();
+        PickerTimeMin = ImPlotTime::FromDouble(Range.Min);
+        PickerTimeMax = ImPlotTime::FromDouble(Range.Max);
+        UpdateTransformCache();
+    }
+
+    inline void SetRange(const ImPlotRange& range) {
+        SetRange(range.Min, range.Max);
+    }
+
+    inline void SetAspect(double unit_per_pix) {
+        double new_size = unit_per_pix * PixelSize();
+        double delta    = (new_size - Range.Size()) * 0.5;
+        if (IsLocked())
+            return;
+        else if (IsLockedMin() && !IsLockedMax())
+            SetRange(Range.Min, Range.Max  + 2*delta);
+        else if (!IsLockedMin() && IsLockedMax())
+            SetRange(Range.Min - 2*delta, Range.Max);
+        else
+            SetRange(Range.Min - delta, Range.Max + delta);
+    }
+
+    inline float PixelSize() const { return ImAbs(PixelMax - PixelMin); }
+
+    inline double GetAspect() const { return Range.Size() / PixelSize(); }
+
+    inline void Constrain() {
+        Range.Min = ImConstrainNan(ImConstrainInf(Range.Min));
+        Range.Max = ImConstrainNan(ImConstrainInf(Range.Max));
+        if (Range.Min < ConstraintRange.Min)
+            Range.Min = ConstraintRange.Min;
+        if (Range.Max > ConstraintRange.Max)
+            Range.Max = ConstraintRange.Max;
+        double z = Range.Size();
+        if (z < ConstraintZoom.Min) {
+            double delta = (ConstraintZoom.Min - z) * 0.5;
+            Range.Min -= delta;
+            Range.Max += delta;
+        }
+        if (z > ConstraintZoom.Max) {
+            double delta = (z - ConstraintZoom.Max) * 0.5;
+            Range.Min += delta;
+            Range.Max -= delta;
+        }
+        if (Range.Max <= Range.Min)
+            Range.Max = Range.Min + DBL_EPSILON;
+    }
+
+    inline void UpdateTransformCache() {
+        ScaleToPixel = (PixelMax - PixelMin) / Range.Size();
+        if (TransformForward != nullptr) {
+            ScaleMin = TransformForward(Range.Min, TransformData);
+            ScaleMax = TransformForward(Range.Max, TransformData);
+        }
+        else {
+            ScaleMin = Range.Min;
+            ScaleMax = Range.Max;
+        }
+    }
+
+    inline float PlotToPixels(double plt) const {
+        if (TransformForward != nullptr) {
+            double s = TransformForward(plt, TransformData);
+            double t = (s - ScaleMin) / (ScaleMax - ScaleMin);
+            plt      = Range.Min + Range.Size() * t;
+        }
+        return (float)(PixelMin + ScaleToPixel * (plt - Range.Min));
+    }
+
+
+    inline double PixelsToPlot(float pix) const {
+        double plt = (pix - PixelMin) / ScaleToPixel + Range.Min;
+        if (TransformInverse != nullptr) {
+            double t = (plt - Range.Min) / Range.Size();
+            double s = t * (ScaleMax - ScaleMin) + ScaleMin;
+            plt = TransformInverse(s, TransformData);
+        }
+        return plt;
+    }
+
+    inline void ExtendFit(double v) {
+        if (!ImNanOrInf(v) && v >= ConstraintRange.Min && v <= ConstraintRange.Max) {
+            FitExtents.Min = v < FitExtents.Min ? v : FitExtents.Min;
+            FitExtents.Max = v > FitExtents.Max ? v : FitExtents.Max;
+        }
+    }
+
+    inline void ExtendFitWith(ImPlotAxis& alt, double v, double v_alt) {
+        if (ImHasFlag(Flags, ImPlotAxisFlags_RangeFit) && !alt.Range.Contains(v_alt))
+            return;
+        if (!ImNanOrInf(v) && v >= ConstraintRange.Min && v <= ConstraintRange.Max) {
+            FitExtents.Min = v < FitExtents.Min ? v : FitExtents.Min;
+            FitExtents.Max = v > FitExtents.Max ? v : FitExtents.Max;
+        }
+    }
+
+    inline void ApplyFit(float padding) {
+        const double ext_size = FitExtents.Size() * 0.5;
+        FitExtents.Min -= ext_size * padding;
+        FitExtents.Max += ext_size * padding;
+        if (!IsLockedMin() && !ImNanOrInf(FitExtents.Min))
+            Range.Min = FitExtents.Min;
+        if (!IsLockedMax() && !ImNanOrInf(FitExtents.Max))
+            Range.Max = FitExtents.Max;
+        if (ImAlmostEqual(Range.Min, Range.Max))  {
+            Range.Max += 0.5;
+            Range.Min -= 0.5;
+        }
+        Constrain();
+        UpdateTransformCache();
+    }
+
+    inline bool HasLabel()          const { return LabelOffset != -1 && !ImHasFlag(Flags, ImPlotAxisFlags_NoLabel);                          }
+    inline bool HasGridLines()      const { return !ImHasFlag(Flags, ImPlotAxisFlags_NoGridLines);                                           }
+    inline bool HasTickLabels()     const { return !ImHasFlag(Flags, ImPlotAxisFlags_NoTickLabels);                                          }
+    inline bool HasTickMarks()      const { return !ImHasFlag(Flags, ImPlotAxisFlags_NoTickMarks);                                           }
+    inline bool WillRender()        const { return Enabled && (HasGridLines() || HasTickLabels() || HasTickMarks());                         }
+    inline bool IsOpposite()        const { return ImHasFlag(Flags, ImPlotAxisFlags_Opposite);                                               }
+    inline bool IsInverted()        const { return ImHasFlag(Flags, ImPlotAxisFlags_Invert);                                                 }
+    inline bool IsForeground()      const { return ImHasFlag(Flags, ImPlotAxisFlags_Foreground);                                             }
+    inline bool IsAutoFitting()     const { return ImHasFlag(Flags, ImPlotAxisFlags_AutoFit);                                                }
+    inline bool CanInitFit()        const { return !ImHasFlag(Flags, ImPlotAxisFlags_NoInitialFit) && !HasRange && !LinkedMin && !LinkedMax; }
+    inline bool IsRangeLocked()     const { return HasRange && RangeCond == ImPlotCond_Always;                                               }
+    inline bool IsLockedMin()       const { return !Enabled || IsRangeLocked() || ImHasFlag(Flags, ImPlotAxisFlags_LockMin);                 }
+    inline bool IsLockedMax()       const { return !Enabled || IsRangeLocked() || ImHasFlag(Flags, ImPlotAxisFlags_LockMax);                 }
+    inline bool IsLocked()          const { return IsLockedMin() && IsLockedMax();                                                           }
+    inline bool IsInputLockedMin()  const { return IsLockedMin() || IsAutoFitting();                                                         }
+    inline bool IsInputLockedMax()  const { return IsLockedMax() || IsAutoFitting();                                                         }
+    inline bool IsInputLocked()     const { return IsLocked()    || IsAutoFitting();                                                         }
+    inline bool HasMenus()          const { return !ImHasFlag(Flags, ImPlotAxisFlags_NoMenus);                                               }
+
+    inline bool IsPanLocked(bool increasing) {
+        if (ImHasFlag(Flags, ImPlotAxisFlags_PanStretch)) {
+            return IsInputLocked();
+        }
+        else {
+            if (IsLockedMin() || IsLockedMax() || IsAutoFitting())
+                return false;
+            if (increasing)
+                return Range.Max == ConstraintRange.Max;
+            else
+                return Range.Min == ConstraintRange.Min;
+        }
+    }
+
+    void PushLinks() {
+        if (LinkedMin) { *LinkedMin = Range.Min; }
+        if (LinkedMax) { *LinkedMax = Range.Max; }
+    }
+
+    void PullLinks() {
+        if (LinkedMin && LinkedMax) { SetRange(*LinkedMin, *LinkedMax); }
+        else if (LinkedMin) { SetMin(*LinkedMin,true); }
+        else if (LinkedMax) { SetMax(*LinkedMax,true); }
+    }
+};
+
+// Align plots group data
+struct ImPlotAlignmentData {
+    bool  Vertical;
+    float PadA;
+    float PadB;
+    float PadAMax;
+    float PadBMax;
+    ImPlotAlignmentData() {
+        Vertical    = true;
+        PadA = PadB = PadAMax = PadBMax = 0;
+    }
+    void Begin() { PadAMax = PadBMax = 0; }
+    void Update(float& pad_a, float& pad_b, float& delta_a, float& delta_b) {
+        float bak_a = pad_a; float bak_b = pad_b;
+        if (PadAMax < pad_a) { PadAMax = pad_a; }
+        if (PadBMax < pad_b) { PadBMax = pad_b; }
+        if (pad_a < PadA)    { pad_a = PadA; delta_a = pad_a - bak_a; } else { delta_a = 0; }
+        if (pad_b < PadB)    { pad_b = PadB; delta_b = pad_b - bak_b; } else { delta_b = 0; }
+    }
+    void End()   { PadA = PadAMax; PadB = PadBMax;      }
+    void Reset() { PadA = PadB = PadAMax = PadBMax = 0; }
+};
+
+// State information for Plot items
+struct ImPlotItem
+{
+    ImGuiID      ID;
+    ImU32        Color;
+    ImPlotMarker Marker;
+    ImRect       LegendHoverRect;
+    int          NameOffset;
+    bool         Show;
+    bool         LegendHovered;
+    bool         SeenThisFrame;
+
+    ImPlotItem() {
+        ID            = 0;
+        Color         = IM_COL32_WHITE;
+        Marker        = ImPlotMarker_None;
+        NameOffset    = -1;
+        Show          = true;
+        SeenThisFrame = false;
+        LegendHovered = false;
+    }
+
+    ~ImPlotItem() { ID = 0; }
+};
+
+// Holds Legend state
+struct ImPlotLegend
+{
+    ImPlotLegendFlags Flags;
+    ImPlotLegendFlags PreviousFlags;
+    ImPlotLocation    Location;
+    ImPlotLocation    PreviousLocation;
+    ImVec2            Scroll;
+    ImVector<int>     Indices;
+    ImGuiTextBuffer   Labels;
+    ImRect            Rect;
+    ImRect            RectClamped;
+    bool              Hovered;
+    bool              Held;
+    bool              CanGoInside;
+
+    ImPlotLegend() {
+        Flags        = PreviousFlags = ImPlotLegendFlags_None;
+        CanGoInside  = true;
+        Hovered      = Held = false;
+        Location     = PreviousLocation = ImPlotLocation_NorthWest;
+        Scroll       = ImVec2(0,0);
+    }
+
+    void Reset() { Indices.shrink(0); Labels.Buf.shrink(0); }
+};
+
+// Holds Items and Legend data
+struct ImPlotItemGroup
+{
+    ImGuiID            ID;
+    ImPlotLegend       Legend;
+    ImPool<ImPlotItem> ItemPool;
+    int                ColormapIdx;
+    ImPlotMarker       MarkerIdx;
+
+    ImPlotItemGroup() { ID = 0; ColormapIdx = 0; MarkerIdx = 0; }
+
+    int         GetItemCount() const             { return ItemPool.GetBufSize();                                 }
+    ImGuiID     GetItemID(const char*  label_id) { return ImGui::GetID(label_id); /* GetIDWithSeed */            }
+    ImPlotItem* GetItem(ImGuiID id)              { return ItemPool.GetByKey(id);                                 }
+    ImPlotItem* GetItem(const char* label_id)    { return GetItem(GetItemID(label_id));                          }
+    ImPlotItem* GetOrAddItem(ImGuiID id)         { return ItemPool.GetOrAddByKey(id);                            }
+    ImPlotItem* GetItemByIndex(int i)            { return ItemPool.GetByIndex(i);                                }
+    int         GetItemIndex(ImPlotItem* item)   { return ItemPool.GetIndex(item);                               }
+    int         GetLegendCount() const           { return Legend.Indices.size();                                 }
+    ImPlotItem* GetLegendItem(int i)             { return ItemPool.GetByIndex(Legend.Indices[i]);                }
+    const char* GetLegendLabel(int i)            { return Legend.Labels.Buf.Data + GetLegendItem(i)->NameOffset; }
+    void        Reset()                          { ItemPool.Clear(); Legend.Reset(); ColormapIdx = 0;            }
+};
+
+// Holds Plot state information that must persist after EndPlot
+struct ImPlotPlot
+{
+    ImGuiID              ID;
+    ImPlotFlags          Flags;
+    ImPlotFlags          PreviousFlags;
+    ImPlotLocation       MouseTextLocation;
+    ImPlotMouseTextFlags MouseTextFlags;
+    ImPlotAxis           Axes[ImAxis_COUNT];
+    ImGuiTextBuffer      TextBuffer;
+    ImPlotItemGroup      Items;
+    ImAxis               CurrentX;
+    ImAxis               CurrentY;
+    ImRect               FrameRect;
+    ImRect               CanvasRect;
+    ImRect               PlotRect;
+    ImRect               AxesRect;
+    ImRect               SelectRect;
+    ImVec2               SelectStart;
+    int                  TitleOffset;
+    bool                 JustCreated;
+    bool                 Initialized;
+    bool                 SetupLocked;
+    bool                 FitThisFrame;
+    bool                 Hovered;
+    bool                 Held;
+    bool                 Selecting;
+    bool                 Selected;
+    bool                 ContextLocked;
+
+    ImPlotPlot() {
+        Flags             = PreviousFlags = ImPlotFlags_None;
+        for (int i = 0; i < IMPLOT_NUM_X_AXES; ++i)
+            XAxis(i).Vertical = false;
+        for (int i = 0; i < IMPLOT_NUM_Y_AXES; ++i)
+            YAxis(i).Vertical = true;
+        SelectStart       = ImVec2(0,0);
+        CurrentX          = ImAxis_X1;
+        CurrentY          = ImAxis_Y1;
+        MouseTextLocation  = ImPlotLocation_South | ImPlotLocation_East;
+        MouseTextFlags     = ImPlotMouseTextFlags_None;
+        TitleOffset       = -1;
+        JustCreated       = true;
+        Initialized = SetupLocked = FitThisFrame = false;
+        Hovered = Held = Selected = Selecting = ContextLocked = false;
+    }
+
+    inline bool IsInputLocked() const {
+        for (int i = 0; i < IMPLOT_NUM_X_AXES; ++i) {
+            if (!XAxis(i).IsInputLocked())
+                return false;
+        }
+        for (int i = 0; i < IMPLOT_NUM_Y_AXES; ++i) {
+            if (!YAxis(i).IsInputLocked())
+                return false;
+        }
+        return true;
+    }
+
+    inline void ClearTextBuffer() { TextBuffer.Buf.shrink(0); }
+
+    inline void SetTitle(const char* title) {
+        if (title && ImGui::FindRenderedTextEnd(title, nullptr) != title) {
+            TitleOffset = TextBuffer.size();
+            TextBuffer.append(title, title + strlen(title) + 1);
+        }
+        else {
+            TitleOffset = -1;
+        }
+    }
+    inline bool HasTitle() const { return TitleOffset != -1 && !ImHasFlag(Flags, ImPlotFlags_NoTitle); }
+    inline const char* GetTitle() const { return TextBuffer.Buf.Data + TitleOffset; }
+
+    inline       ImPlotAxis& XAxis(int i)       { return Axes[ImAxis_X1 + i]; }
+    inline const ImPlotAxis& XAxis(int i) const { return Axes[ImAxis_X1 + i]; }
+    inline       ImPlotAxis& YAxis(int i)       { return Axes[ImAxis_Y1 + i]; }
+    inline const ImPlotAxis& YAxis(int i) const { return Axes[ImAxis_Y1 + i]; }
+
+    inline int EnabledAxesX() {
+        int cnt = 0;
+        for (int i = 0; i < IMPLOT_NUM_X_AXES; ++i)
+            cnt += XAxis(i).Enabled;
+        return cnt;
+    }
+
+    inline int EnabledAxesY() {
+        int cnt = 0;
+        for (int i = 0; i < IMPLOT_NUM_Y_AXES; ++i)
+            cnt += YAxis(i).Enabled;
+        return cnt;
+    }
+
+    inline void SetAxisLabel(ImPlotAxis& axis, const char* label) {
+        if (label && ImGui::FindRenderedTextEnd(label, nullptr) != label) {
+            axis.LabelOffset = TextBuffer.size();
+            TextBuffer.append(label, label + strlen(label) + 1);
+        }
+        else {
+            axis.LabelOffset = -1;
+        }
+    }
+
+    inline const char* GetAxisLabel(const ImPlotAxis& axis) const { return TextBuffer.Buf.Data + axis.LabelOffset; }
+};
+
+// Holds subplot data that must persist after EndSubplot
+struct ImPlotSubplot {
+    ImGuiID                       ID;
+    ImPlotSubplotFlags            Flags;
+    ImPlotSubplotFlags            PreviousFlags;
+    ImPlotItemGroup               Items;
+    int                           Rows;
+    int                           Cols;
+    int                           CurrentIdx;
+    ImRect                        FrameRect;
+    ImRect                        GridRect;
+    ImVec2                        CellSize;
+    ImVector<ImPlotAlignmentData> RowAlignmentData;
+    ImVector<ImPlotAlignmentData> ColAlignmentData;
+    ImVector<float>               RowRatios;
+    ImVector<float>               ColRatios;
+    ImVector<ImPlotRange>         RowLinkData;
+    ImVector<ImPlotRange>         ColLinkData;
+    float                         TempSizes[2];
+    bool                          FrameHovered;
+    bool                          HasTitle;
+
+    ImPlotSubplot() {
+        ID                          = 0;
+        Flags = PreviousFlags       = ImPlotSubplotFlags_None;
+        Rows = Cols = CurrentIdx    = 0;
+        Items.Legend.Location       = ImPlotLocation_North;
+        Items.Legend.Flags          = ImPlotLegendFlags_Horizontal|ImPlotLegendFlags_Outside;
+        Items.Legend.CanGoInside    = false;
+        TempSizes[0] = TempSizes[1] = 0;
+        FrameHovered                = false;
+        HasTitle                    = false;
+    }
+};
+
+// Temporary data storage for upcoming plot
+struct ImPlotNextPlotData
+{
+    ImPlotCond  RangeCond[ImAxis_COUNT];
+    ImPlotRange Range[ImAxis_COUNT];
+    bool        HasRange[ImAxis_COUNT];
+    bool        Fit[ImAxis_COUNT];
+    double*     LinkedMin[ImAxis_COUNT];
+    double*     LinkedMax[ImAxis_COUNT];
+
+    ImPlotNextPlotData() { Reset(); }
+
+    void Reset() {
+        for (int i = 0; i < ImAxis_COUNT; ++i) {
+            HasRange[i]                 = false;
+            Fit[i]                      = false;
+            LinkedMin[i] = LinkedMax[i] = nullptr;
+        }
+    }
+
+};
+
+// Temporary data storage for upcoming item
+struct ImPlotNextItemData {
+    ImPlotSpec      Spec;
+    bool            RenderLine;
+    bool            RenderFill;
+    bool            RenderMarkerLine;
+    bool            RenderMarkerFill;
+    bool            RenderMarkers;
+    bool            HasHidden;
+    bool            Hidden;
+    ImPlotCond      HiddenCond;
+    ImPlotNextItemData() { Reset(); }
+    void Reset() {
+        Spec      = ImPlotSpec();
+        HasHidden = Hidden = false;
+        HiddenCond = ImPlotCond_None;
+    }
+};
+
+// Holds state information that must persist between calls to BeginPlot()/EndPlot()
+struct ImPlotContext {
+    // Plot States
+    ImPool<ImPlotPlot>    Plots;
+    ImPool<ImPlotSubplot> Subplots;
+    ImPlotPlot*           CurrentPlot;
+    ImPlotSubplot*        CurrentSubplot;
+    ImPlotItemGroup*      CurrentItems;
+    ImPlotItem*           CurrentItem;
+    ImPlotItem*           PreviousItem;
+
+    // Tick Marks and Labels
+    ImPlotTicker CTicker;
+
+    // Annotation and Tabs
+    ImPlotAnnotationCollection Annotations;
+    ImPlotTagCollection        Tags;
+
+    // Style and Colormaps
+    ImPlotStyle                 Style;
+    ImVector<ImGuiColorMod>     ColorModifiers;
+    ImVector<ImGuiStyleMod>     StyleModifiers;
+    ImPlotColormapData          ColormapData;
+    ImVector<ImPlotColormap>    ColormapModifiers;
+
+    // Time
+    tm Tm;
+
+    // Temp data for general use
+    ImVector<double>   TempDouble1, TempDouble2;
+    ImVector<int>      TempInt1;
+
+    // Misc
+    int                DigitalPlotItemCnt;
+    int                DigitalPlotOffset;
+    ImPlotNextPlotData NextPlotData;
+    ImPlotNextItemData NextItemData;
+    ImPlotInputMap     InputMap;
+    bool               OpenContextThisFrame;
+    ImGuiTextBuffer    MousePosStringBuilder;
+    ImPlotItemGroup*   SortItems;
+
+    // Align plots
+    ImPool<ImPlotAlignmentData> AlignmentData;
+    ImPlotAlignmentData*        CurrentAlignmentH;
+    ImPlotAlignmentData*        CurrentAlignmentV;
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Internal API
+// No guarantee of forward compatibility here!
+//-----------------------------------------------------------------------------
+
+namespace ImPlot {
+
+//-----------------------------------------------------------------------------
+// [SECTION] Context Utils
+//-----------------------------------------------------------------------------
+
+// Initializes an ImPlotContext
+IMPLOT_API void Initialize(ImPlotContext* ctx);
+// Resets an ImPlot context for the next call to BeginPlot
+IMPLOT_API void ResetCtxForNextPlot(ImPlotContext* ctx);
+// Resets an ImPlot context for the next call to BeginAlignedPlots
+IMPLOT_API void ResetCtxForNextAlignedPlots(ImPlotContext* ctx);
+// Resets an ImPlot context for the next call to BeginSubplot
+IMPLOT_API void ResetCtxForNextSubplot(ImPlotContext* ctx);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Plot Utils
+//-----------------------------------------------------------------------------
+
+// Gets a plot from the current ImPlotContext
+IMPLOT_API ImPlotPlot* GetPlot(const char* title);
+// Gets the current plot from the current ImPlotContext
+IMPLOT_API ImPlotPlot* GetCurrentPlot();
+// Busts the cache for every plot in the current context
+IMPLOT_API void BustPlotCache();
+
+// Shows a plot's context menu.
+IMPLOT_API void ShowPlotContextMenu(ImPlotPlot& plot);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Setup Utils
+//-----------------------------------------------------------------------------
+
+// Lock Setup and call SetupFinish if necessary.
+static inline void SetupLock() {
+    ImPlotContext& gp = *GImPlot;
+    if (!gp.CurrentPlot->SetupLocked)
+        SetupFinish();
+    gp.CurrentPlot->SetupLocked = true;
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] Subplot Utils
+//-----------------------------------------------------------------------------
+
+// Advances to next subplot
+IMPLOT_API void SubplotNextCell();
+
+// Shows a subplot's context menu.
+IMPLOT_API void ShowSubplotsContextMenu(ImPlotSubplot& subplot);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Item Utils
+//-----------------------------------------------------------------------------
+
+// Begins a new item. Returns false if the item should not be plotted. Pushes PlotClipRect.
+IMPLOT_API bool BeginItem(const char* label_id, const ImPlotSpec& spec = ImPlotSpec(), const ImVec4& item_col = IMPLOT_AUTO_COL, ImPlotMarker item_mkr = ImPlotMarker_Invalid);
+
+// Same as above but with fitting functionality.
+template <typename _Fitter>
+bool BeginItemEx(const char* label_id, const _Fitter& fitter, const ImPlotSpec& spec, const ImVec4& item_col = IMPLOT_AUTO_COL, ImPlotMarker item_mkr = ImPlotMarker_Invalid) {
+    if (BeginItem(label_id, spec, item_col, item_mkr)) {
+        ImPlotPlot& plot = *GetCurrentPlot();
+        if (plot.FitThisFrame && !ImHasFlag(spec.Flags, ImPlotItemFlags_NoFit))
+            fitter.Fit(plot.Axes[plot.CurrentX], plot.Axes[plot.CurrentY]);
+        return true;
+    }
+    return false;
+}
+
+// Ends an item (call only if BeginItem returns true). Pops PlotClipRect.
+IMPLOT_API void EndItem();
+
+// Register or get an existing item from the current plot.
+IMPLOT_API ImPlotItem* RegisterOrGetItem(const char* label_id, ImPlotItemFlags flags, bool* just_created = nullptr);
+// Get a plot item from the current plot.
+IMPLOT_API ImPlotItem* GetItem(const char* label_id);
+// Gets the current item.
+IMPLOT_API ImPlotItem* GetCurrentItem();
+// Busts the cache for every item for every plot in the current context.
+IMPLOT_API void BustItemCache();
+
+//-----------------------------------------------------------------------------
+// [SECTION] Axis Utils
+//-----------------------------------------------------------------------------
+
+// Returns true if any enabled axis is locked from user input.
+static inline bool AnyAxesInputLocked(ImPlotAxis* axes, int count) {
+    for (int i = 0; i < count; ++i) {
+        if (axes[i].Enabled && axes[i].IsInputLocked())
+            return true;
+    }
+    return false;
+}
+
+// Returns true if all enabled axes are locked from user input.
+static inline bool AllAxesInputLocked(ImPlotAxis* axes, int count) {
+    for (int i = 0; i < count; ++i) {
+        if (axes[i].Enabled && !axes[i].IsInputLocked())
+            return false;
+    }
+    return true;
+}
+
+static inline bool AnyAxesHeld(ImPlotAxis* axes, int count) {
+    for (int i = 0; i < count; ++i) {
+        if (axes[i].Enabled && axes[i].Held)
+            return true;
+    }
+    return false;
+}
+
+static inline bool AnyAxesHovered(ImPlotAxis* axes, int count) {
+    for (int i = 0; i < count; ++i) {
+        if (axes[i].Enabled && axes[i].Hovered)
+            return true;
+    }
+    return false;
+}
+
+// Returns true if the user has requested data to be fit.
+static inline bool FitThisFrame() {
+    return GImPlot->CurrentPlot->FitThisFrame;
+}
+
+// Extends the current plot's axes so that it encompasses a vertical line at x
+static inline void FitPointX(double x) {
+    ImPlotPlot& plot   = *GetCurrentPlot();
+    ImPlotAxis& x_axis = plot.Axes[plot.CurrentX];
+    x_axis.ExtendFit(x);
+}
+
+// Extends the current plot's axes so that it encompasses a horizontal line at y
+static inline void FitPointY(double y) {
+    ImPlotPlot& plot   = *GetCurrentPlot();
+    ImPlotAxis& y_axis = plot.Axes[plot.CurrentY];
+    y_axis.ExtendFit(y);
+}
+
+// Extends the current plot's axes so that it encompasses point p
+static inline void FitPoint(const ImPlotPoint& p) {
+    ImPlotPlot& plot   = *GetCurrentPlot();
+    ImPlotAxis& x_axis = plot.Axes[plot.CurrentX];
+    ImPlotAxis& y_axis = plot.Axes[plot.CurrentY];
+    x_axis.ExtendFitWith(y_axis, p.x, p.y);
+    y_axis.ExtendFitWith(x_axis, p.y, p.x);
+}
+
+// Returns true if two ranges overlap
+static inline bool RangesOverlap(const ImPlotRange& r1, const ImPlotRange& r2)
+{ return r1.Min <= r2.Max && r2.Min <= r1.Max; }
+
+// Shows an axis's context menu.
+IMPLOT_API void ShowAxisContextMenu(ImPlotAxis& axis, ImPlotAxis* equal_axis, bool time_allowed = false);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Legend Utils
+//-----------------------------------------------------------------------------
+
+// Gets the position of an inner rect that is located inside of an outer rect according to an ImPlotLocation and padding amount.
+IMPLOT_API ImVec2 GetLocationPos(const ImRect& outer_rect, const ImVec2& inner_size, ImPlotLocation location, const ImVec2& pad = ImVec2(0,0));
+// Calculates the bounding box size of a legend _before_ clipping.
+IMPLOT_API ImVec2 CalcLegendSize(ImPlotItemGroup& items, const ImVec2& pad, const ImVec2& spacing, bool vertical);
+// Clips calculated legend size
+IMPLOT_API bool ClampLegendRect(ImRect& legend_rect, const ImRect& outer_rect, const ImVec2& pad);
+// Renders legend entries into a bounding box
+IMPLOT_API bool ShowLegendEntries(ImPlotItemGroup& items, const ImRect& legend_bb, bool interactable, const ImVec2& pad, const ImVec2& spacing, bool vertical, ImDrawList& DrawList);
+// Shows an alternate legend for the plot identified by #title_id, outside of the plot frame (can be called before or after of Begin/EndPlot but must occur in the same ImGui window! This is not thoroughly tested nor scrollable!).
+IMPLOT_API void ShowAltLegend(const char* title_id, bool vertical = true, const ImVec2 size = ImVec2(0,0), bool interactable = true);
+// Shows a legend's context menu.
+IMPLOT_API bool ShowLegendContextMenu(ImPlotLegend& legend, bool visible);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Label Utils
+//-----------------------------------------------------------------------------
+
+// Create a a string label for a an axis value
+IMPLOT_API void LabelAxisValue(const ImPlotAxis& axis, double value, char* buff, int size, bool round = false);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Styling Utils
+//-----------------------------------------------------------------------------
+
+// Get styling data for next item (call between Begin/EndItem)
+static inline const ImPlotNextItemData& GetItemData() { return GImPlot->NextItemData; }
+
+// Returns true if a color is set to be automatically determined
+static inline bool IsColorAuto(const ImVec4& col) { return col.w == -1; }
+// Returns true if a style color is set to be automatically determined
+static inline bool IsColorAuto(ImPlotCol idx) { return IsColorAuto(GImPlot->Style.Colors[idx]); }
+// Returns the automatically deduced style color
+IMPLOT_API ImVec4 GetAutoColor(ImPlotCol idx);
+
+// Returns the style color whether it is automatic or custom set
+static inline ImVec4 GetStyleColorVec4(ImPlotCol idx) { return IsColorAuto(idx) ? GetAutoColor(idx) : GImPlot->Style.Colors[idx]; }
+static inline ImU32  GetStyleColorU32(ImPlotCol idx)  { return ImGui::ColorConvertFloat4ToU32(GetStyleColorVec4(idx)); }
+
+// Draws vertical text. The position is the bottom left of the text rect.
+IMPLOT_API void AddTextVertical(ImDrawList *DrawList, ImVec2 pos, ImU32 col, const char* text_begin, const char* text_end = nullptr);
+// Draws multiline horizontal text centered.
+IMPLOT_API void AddTextCentered(ImDrawList* DrawList, ImVec2 top_center, ImU32 col, const char* text_begin, const char* text_end = nullptr);
+// Calculates the size of vertical text
+static inline ImVec2 CalcTextSizeVertical(const char *text) {
+    ImVec2 sz = ImGui::CalcTextSize(text);
+    return ImVec2(sz.y, sz.x);
+}
+// Returns white or black text given background color
+static inline ImU32 CalcTextColor(const ImVec4& bg) { return (bg.x * 0.299f + bg.y * 0.587f + bg.z * 0.114f) > 0.5f ? IM_COL32_BLACK : IM_COL32_WHITE; }
+static inline ImU32 CalcTextColor(ImU32 bg)         { return CalcTextColor(ImGui::ColorConvertU32ToFloat4(bg)); }
+// Lightens or darkens a color for hover
+static inline ImU32 CalcHoverColor(ImU32 col)       {  return ImMixU32(col, CalcTextColor(col), 32); }
+
+// Clamps a label position so that it fits a rect defined by Min/Max
+static inline ImVec2 ClampLabelPos(ImVec2 pos, const ImVec2& size, const ImVec2& Min, const ImVec2& Max) {
+    if (pos.x < Min.x)              pos.x = Min.x;
+    if (pos.y < Min.y)              pos.y = Min.y;
+    if ((pos.x + size.x) > Max.x)   pos.x = Max.x - size.x;
+    if ((pos.y + size.y) > Max.y)   pos.y = Max.y - size.y;
+    return pos;
+}
+
+// Returns a color from the Color map given an index >= 0 (modulo will be performed).
+IMPLOT_API ImU32  GetColormapColorU32(int idx, ImPlotColormap cmap);
+// Returns the next unused colormap color and advances the colormap. Can be used to skip colors if desired.
+IMPLOT_API ImU32  NextColormapColorU32();
+// Linearly interpolates a color from the current colormap given t between 0 and 1.
+IMPLOT_API ImU32  SampleColormapU32(float t, ImPlotColormap cmap);
+
+// Render a colormap bar
+IMPLOT_API void RenderColorBar(const ImU32* colors, int size, ImDrawList& DrawList, const ImRect& bounds, bool vert, bool reversed, bool continuous);
+
+// Render Horizontal/Vertical lines
+#if (IMGUI_VERSION_NUM < 19275)
+static inline void AddLineH(ImDrawList *draw_list, float x1, float x2, float y, ImU32 col, float thickness = 1.0f)  { draw_list->AddLine(ImVec2(x1, y), ImVec2(x2, y), col, thickness); }
+static inline void AddLineV(ImDrawList* draw_list, float x, float y1, float y2, ImU32 col, float thickness = 1.0f)  { draw_list->AddLine(ImVec2(x, y1), ImVec2(x, y2), col, thickness); }
+#else
+static inline void AddLineH(ImDrawList *draw_list, float x1, float x2, float y, ImU32 col, float thickness = 1.0f)  { draw_list->AddLineH(x1, x2, y, col, thickness); }
+static inline void AddLineV(ImDrawList *draw_list, float x, float y1, float y2, ImU32 col, float thickness = 1.0f)  { draw_list->AddLineV(x, y1, y2, col, thickness); }
+#endif
+
+//-----------------------------------------------------------------------------
+// [SECTION] Math and Misc Utils
+//-----------------------------------------------------------------------------
+
+// Rounds x to powers of 2,5 and 10 for generating axis labels (from Graphics Gems 1 Chapter 11.2)
+IMPLOT_API double NiceNum(double x, bool round);
+// Computes order of magnitude of double.
+static inline int OrderOfMagnitude(double val) { return val == 0 ? 0 : (int)(floor(log10(fabs(val)))); }
+// Returns the precision required for a order of magnitude.
+static inline int OrderToPrecision(int order) { return order > 0 ? 0 : 1 - order; }
+// Returns a floating point precision to use given a value
+static inline int Precision(double val) { return OrderToPrecision(OrderOfMagnitude(val)); }
+// Round a value to a given precision
+static inline double RoundTo(double val, int prec) { double p = pow(10,(double)prec); return floor(val*p+0.5)/p; }
+
+// Returns the intersection point of two lines A and B (assumes they are not parallel!)
+static inline ImVec2 Intersection(const ImVec2& a1, const ImVec2& a2, const ImVec2& b1, const ImVec2& b2) {
+    float v1 = (a1.x * a2.y - a1.y * a2.x);  float v2 = (b1.x * b2.y - b1.y * b2.x);
+    float v3 = ((a1.x - a2.x) * (b1.y - b2.y) - (a1.y - a2.y) * (b1.x - b2.x));
+    return ImVec2((v1 * (b1.x - b2.x) - v2 * (a1.x - a2.x)) / v3, (v1 * (b1.y - b2.y) - v2 * (a1.y - a2.y)) / v3);
+}
+
+// Fills a buffer with n samples linear interpolated from vmin to vmax
+template <typename T>
+void FillRange(ImVector<T>& buffer, int n, T vmin, T vmax) {
+    buffer.resize(n);
+    T step = (vmax - vmin) / (n - 1);
+    for (int i = 0; i < n; ++i) {
+        buffer[i] = vmin + i * step;
+    }
+}
+
+// Calculate histogram bin counts and widths
+template <typename TContainer>
+static inline void CalculateBins(const TContainer& values, int count, ImPlotBin meth, const ImPlotRange& range, int& bins_out, double& width_out) {
+    switch (meth) {
+        case ImPlotBin_Sqrt:
+            bins_out  = (int)ceil(sqrt(count));
+            break;
+        case ImPlotBin_Sturges:
+            bins_out  = (int)ceil(1.0 + log2(count));
+            break;
+        case ImPlotBin_Rice:
+            bins_out  = (int)ceil(2 * cbrt(count));
+            break;
+        case ImPlotBin_Scott:
+            width_out = 3.49 * ImStdDev(values, count) / cbrt(count);
+            bins_out  = (int)round(range.Size() / width_out);
+            break;
+    }
+    width_out = range.Size() / bins_out;
+}
+
+//-----------------------------------------------------------------------------
+// Time Utils
+//-----------------------------------------------------------------------------
+
+// Returns true if year is leap year (366 days long)
+static inline bool IsLeapYear(int year) {
+    return  year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
+}
+// Returns the number of days in a month, accounting for Feb. leap years. #month is zero indexed.
+static inline int GetDaysInMonth(int year, int month) {
+    constexpr int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+    return  days[month] + (int)(month == 1 && IsLeapYear(year));
+}
+
+// Make a UNIX timestamp from a tm struct expressed in UTC time (i.e. GMT timezone).
+IMPLOT_API ImPlotTime MkGmtTime(struct tm *ptm);
+// Make a tm struct expressed in UTC time (i.e. GMT timezone) from a UNIX timestamp.
+IMPLOT_API tm* GetGmtTime(const ImPlotTime& t, tm* ptm);
+
+// Make a UNIX timestamp from a tm struct expressed in local time.
+IMPLOT_API ImPlotTime MkLocTime(struct tm *ptm);
+// Make a tm struct expressed in local time from a UNIX timestamp.
+IMPLOT_API tm* GetLocTime(const ImPlotTime& t, tm* ptm);
+
+// NB: The following functions only work if there is a current ImPlotContext because the
+// internal tm struct is owned by the context! They are aware of ImPlotStyle.UseLocalTime.
+
+// // Make a UNIX timestamp from a tm struct according to the current ImPlotStyle.UseLocalTime setting.
+static inline ImPlotTime MkTime(struct tm *ptm) {
+    if (GetStyle().UseLocalTime) return MkLocTime(ptm);
+    else                         return MkGmtTime(ptm);
+}
+// Get a tm struct from a UNIX timestamp according to the current ImPlotStyle.UseLocalTime setting.
+static inline tm* GetTime(const ImPlotTime& t, tm* ptm) {
+    if (GetStyle().UseLocalTime) return GetLocTime(t,ptm);
+    else                         return GetGmtTime(t,ptm);
+}
+
+// Make a timestamp from time components.
+// year[1970-3000], month[0-11], day[1-31], hour[0-23], min[0-59], sec[0-59], us[0,999999]
+IMPLOT_API ImPlotTime MakeTime(int year, int month = 0, int day = 1, int hour = 0, int min = 0, int sec = 0, int us = 0);
+// Get year component from timestamp [1970-3000]
+IMPLOT_API int GetYear(const ImPlotTime& t);
+// Get month component from timestamp [0-11]
+IMPLOT_API int GetMonth(const ImPlotTime& t);
+
+// Adds or subtracts time from a timestamp. #count > 0 to add, < 0 to subtract.
+IMPLOT_API ImPlotTime AddTime(const ImPlotTime& t, ImPlotTimeUnit unit, int count);
+// Rounds a timestamp down to nearest unit.
+IMPLOT_API ImPlotTime FloorTime(const ImPlotTime& t, ImPlotTimeUnit unit);
+// Rounds a timestamp up to the nearest unit.
+IMPLOT_API ImPlotTime CeilTime(const ImPlotTime& t, ImPlotTimeUnit unit);
+// Rounds a timestamp up or down to the nearest unit.
+IMPLOT_API ImPlotTime RoundTime(const ImPlotTime& t, ImPlotTimeUnit unit);
+// Combines the date of one timestamp with the time-of-day of another timestamp.
+IMPLOT_API ImPlotTime CombineDateTime(const ImPlotTime& date_part, const ImPlotTime& time_part);
+
+// Get the current time as a timestamp.
+static inline ImPlotTime Now() { return ImPlotTime::FromDouble((double)time(nullptr)); }
+// Get the current date as a timestamp.
+static inline ImPlotTime Today() { return ImPlot::FloorTime(Now(), ImPlotTimeUnit_Day); }
+
+// Formats the time part of timestamp t into a buffer according to #fmt
+IMPLOT_API int FormatTime(const ImPlotTime& t, char* buffer, int size, ImPlotTimeFmt fmt, bool use_24_hr_clk);
+// Formats the date part of timestamp t into a buffer according to #fmt
+IMPLOT_API int FormatDate(const ImPlotTime& t, char* buffer, int size, ImPlotDateFmt fmt, bool use_iso_8601);
+// Formats the time and/or date parts of a timestamp t into a buffer according to #fmt
+IMPLOT_API int FormatDateTime(const ImPlotTime& t, char* buffer, int size, ImPlotDateTimeSpec fmt);
+
+// Shows a date picker widget block (year/month/day).
+// #level = 0 for day, 1 for month, 2 for year. Modified by user interaction.
+// #t will be set when a day is clicked and the function will return true.
+// #t1 and #t2 are optional dates to highlight.
+IMPLOT_API bool ShowDatePicker(const char* id, int* level, ImPlotTime* t, const ImPlotTime* t1 = nullptr, const ImPlotTime* t2 = nullptr);
+// Shows a time picker widget block (hour/min/sec).
+// #t will be set when a new hour, minute, or sec is selected or am/pm is toggled, and the function will return true.
+IMPLOT_API bool ShowTimePicker(const char* id, ImPlotTime* t);
+
+//-----------------------------------------------------------------------------
+// [SECTION] Transforms
+//-----------------------------------------------------------------------------
+
+static inline double TransformForward_Log10(double v, void*) {
+    v = v <= 0.0 ? DBL_MIN : v;
+    return ImLog10(v);
+}
+
+static inline double TransformInverse_Log10(double v, void*) {
+    return ImPow(10, v);
+}
+
+static inline double TransformForward_SymLog(double v, void*) {
+    return 2.0 * ImAsinh(v / 2.0);
+}
+
+static inline double TransformInverse_SymLog(double v, void*) {
+    return 2.0 * ImSinh(v / 2.0);
+}
+
+static inline double TransformForward_Logit(double v, void*) {
+    v = ImClamp(v, DBL_MIN, 1.0 - DBL_EPSILON);
+    return ImLog10(v / (1 - v));
+}
+
+static inline double TransformInverse_Logit(double v, void*) {
+    return 1.0 / (1.0 + ImPow(10,-v));
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] Formatters
+//-----------------------------------------------------------------------------
+
+static inline int Formatter_Default(double value, char* buff, int size, void* data) {
+    char* fmt = (char*)data;
+    return ImFormatString(buff, size, fmt, value);
+}
+
+static inline int Formatter_Logit(double value, char* buff, int size, void*) {
+    if (value == 0.5)
+        return ImFormatString(buff,size,"1/2");
+    else if (value < 0.5)
+        return ImFormatString(buff,size,"%g", value);
+    else
+        return ImFormatString(buff,size,"1 - %g", 1 - value);
+}
+
+struct Formatter_Time_Data {
+    ImPlotTime Time;
+    ImPlotDateTimeSpec Spec;
+    ImPlotFormatter UserFormatter;
+    void* UserFormatterData;
+};
+
+static inline int Formatter_Time(double, char* buff, int size, void* data) {
+    Formatter_Time_Data* ftd = (Formatter_Time_Data*)data;
+    return FormatDateTime(ftd->Time, buff, size, ftd->Spec);
+}
+
+//------------------------------------------------------------------------------
+// [SECTION] Locator
+//------------------------------------------------------------------------------
+
+IMPLOT_API void Locator_Default(ImPlotTicker& ticker, const ImPlotRange& range, float pixels, bool vertical, ImPlotFormatter formatter, void* formatter_data);
+IMPLOT_API void Locator_Time(ImPlotTicker& ticker, const ImPlotRange& range, float pixels, bool vertical, ImPlotFormatter formatter, void* formatter_data);
+IMPLOT_API void Locator_Log10(ImPlotTicker& ticker, const ImPlotRange& range, float pixels, bool vertical, ImPlotFormatter formatter, void* formatter_data);
+IMPLOT_API void Locator_SymLog(ImPlotTicker& ticker, const ImPlotRange& range, float pixels, bool vertical, ImPlotFormatter formatter, void* formatter_data);
+
+} // namespace ImPlot
+
+#endif // #ifndef IMGUI_DISABLE
diff --git a/cbits/implot/implot_items.cpp b/cbits/implot/implot_items.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/implot/implot_items.cpp
@@ -0,0 +1,3527 @@
+// MIT License
+
+// Copyright (c) 2020-2024 Evan Pezent
+// Copyright (c) 2025-2026 Breno Cunha Queiroz
+
+// 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.
+
+// ImPlot v1.1 WIP
+
+#ifndef IMGUI_DEFINE_MATH_OPERATORS
+#define IMGUI_DEFINE_MATH_OPERATORS
+#endif
+#include "implot.h"
+#ifndef IMGUI_DISABLE
+#include "implot_internal.h"
+
+//-----------------------------------------------------------------------------
+// [SECTION] Macros and Defines
+//-----------------------------------------------------------------------------
+
+#define SQRT_1_2 0.70710678118f
+#define SQRT_3_2 0.86602540378f
+
+#ifndef IMPLOT_NO_FORCE_INLINE
+    #ifdef _MSC_VER
+        #define IMPLOT_INLINE __forceinline
+    #elif defined(__GNUC__)
+        #define IMPLOT_INLINE inline __attribute__((__always_inline__))
+    #elif defined(__CLANG__)
+        #if __has_attribute(__always_inline__)
+            #define IMPLOT_INLINE inline __attribute__((__always_inline__))
+        #else
+            #define IMPLOT_INLINE inline
+        #endif
+    #else
+        #define IMPLOT_INLINE inline
+    #endif
+#else
+    #define IMPLOT_INLINE inline
+#endif
+
+#if defined __SSE__ || defined __x86_64__ || defined _M_X64
+#ifndef IMGUI_ENABLE_SSE
+#include <immintrin.h>
+#endif
+static IMPLOT_INLINE float  ImInvSqrt(float x) { return _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(x))); }
+#else
+static IMPLOT_INLINE float  ImInvSqrt(float x) { return 1.0f / sqrtf(x); }
+#endif
+
+#define IMPLOT_NORMALIZE2F_OVER_ZERO(VX,VY) do { float d2 = VX*VX + VY*VY; if (d2 > 0.0f) { float inv_len = ImInvSqrt(d2); VX *= inv_len; VY *= inv_len; } } while (0)
+
+// Support for pre-1.82 versions. Users on 1.82+ can use 0 (default) flags to mean "all corners" but in order to support older versions we are more explicit.
+#if (IMGUI_VERSION_NUM < 18102) && !defined(ImDrawFlags_RoundCornersAll)
+#define ImDrawFlags_RoundCornersAll ImDrawCornerFlags_All
+#endif
+
+//-----------------------------------------------------------------------------
+// [SECTION] Template instantiation utility
+//-----------------------------------------------------------------------------
+
+// By default, templates are instantiated for `float`, `double`, and for the following integer types, which are defined in imgui.h:
+//     signed char         ImS8;   // 8-bit signed integer
+//     unsigned char       ImU8;   // 8-bit unsigned integer
+//     signed short        ImS16;  // 16-bit signed integer
+//     unsigned short      ImU16;  // 16-bit unsigned integer
+//     signed int          ImS32;  // 32-bit signed integer == int
+//     unsigned int        ImU32;  // 32-bit unsigned integer
+//     signed   long long  ImS64;  // 64-bit signed integer
+//     unsigned long long  ImU64;  // 64-bit unsigned integer
+// (note: this list does *not* include `long`, `unsigned long` and `long double`)
+//
+// You can customize the supported types by defining IMPLOT_CUSTOM_NUMERIC_TYPES at compile time to define your own type list.
+//    As an example, you could use the compile time define given by the line below in order to support only float and double.
+//        -DIMPLOT_CUSTOM_NUMERIC_TYPES="(float)(double)"
+//    In order to support all known C++ types, use:
+//        -DIMPLOT_CUSTOM_NUMERIC_TYPES="(signed char)(unsigned char)(signed short)(unsigned short)(signed int)(unsigned int)(signed long)(unsigned long)(signed long long)(unsigned long long)(float)(double)(long double)"
+
+#ifdef IMPLOT_CUSTOM_NUMERIC_TYPES
+    #define IMPLOT_NUMERIC_TYPES IMPLOT_CUSTOM_NUMERIC_TYPES
+#else
+    #define IMPLOT_NUMERIC_TYPES (ImS8)(ImU8)(ImS16)(ImU16)(ImS32)(ImU32)(ImS64)(ImU64)(float)(double)
+#endif
+
+// CALL_INSTANTIATE_FOR_NUMERIC_TYPES will duplicate the template instantiation code `INSTANTIATE_MACRO(T)` on supported types.
+#define _CAT(x, y) _CAT_(x, y)
+#define _CAT_(x,y) x ## y
+#define _INSTANTIATE_FOR_NUMERIC_TYPES(chain) _CAT(_INSTANTIATE_FOR_NUMERIC_TYPES_1 chain, _END)
+#define _INSTANTIATE_FOR_NUMERIC_TYPES_1(T) INSTANTIATE_MACRO(T) _INSTANTIATE_FOR_NUMERIC_TYPES_2
+#define _INSTANTIATE_FOR_NUMERIC_TYPES_2(T) INSTANTIATE_MACRO(T) _INSTANTIATE_FOR_NUMERIC_TYPES_1
+#define _INSTANTIATE_FOR_NUMERIC_TYPES_1_END
+#define _INSTANTIATE_FOR_NUMERIC_TYPES_2_END
+#define CALL_INSTANTIATE_FOR_NUMERIC_TYPES() _INSTANTIATE_FOR_NUMERIC_TYPES(IMPLOT_NUMERIC_TYPES)
+
+namespace ImPlot {
+
+//-----------------------------------------------------------------------------
+// [SECTION] Utils
+//-----------------------------------------------------------------------------
+
+// Calc maximum index size of ImDrawIdx
+template <typename T>
+struct MaxIdx { static const unsigned int Value; };
+template <> const unsigned int MaxIdx<unsigned short>::Value = 65535;
+template <> const unsigned int MaxIdx<unsigned int>::Value   = 4294967295;
+
+template <typename T>
+int Stride(const ImPlotSpec& spec) {
+    return spec.Stride == IMPLOT_AUTO ? sizeof(T) : spec.Stride;
+}
+
+// Finds the min and max value in an unsorted array
+template <typename Indexer, typename T>
+static inline void ImMinMaxIndexer(const Indexer& values, int count, T* min_out, T* max_out) {
+    T Min = values[0]; T Max = values[0];
+    for (int i = 1; i < count; ++i) {
+        if (values[i] < Min) { Min = values[i]; }
+        if (values[i] > Max) { Max = values[i]; }
+    }
+    *min_out = Min; *max_out = Max;
+}
+
+// Finds the mean of a container
+template <typename TContainer>
+static inline double ImMean(const TContainer& values, int count) {
+    double den = 1.0 / count;
+    double mu  = 0;
+    for (int i = 0; i < count; ++i)
+        mu += (double)values[i] * den;
+    return mu;
+}
+
+// Finds the sample standard deviation of a container
+template <typename TContainer>
+static inline double ImStdDev(const TContainer& values, int count) {
+    double den = 1.0 / (count - 1.0);
+    double mu  = ImMean(values, count);
+    double x   = 0;
+    for (int i = 0; i < count; ++i)
+        x += ((double)values[i] - mu) * ((double)values[i] - mu) * den;
+    return sqrt(x);
+}
+
+IMPLOT_INLINE void GetLineRenderProps(ImDrawList& draw_list, float& half_weight, ImVec2& tex_uv0, ImVec2& tex_uv1) {
+#if IMGUI_VERSION_NUM >= 19299 || defined(IM_DRAWLIST_TEX_LINES_SAMPLE_COUNT)
+    float fringe;
+    draw_list._SelectLineTexture(half_weight * 2.0f, &tex_uv0, &tex_uv1, &fringe, draw_list.Flags);
+    //tex_uv0.x -= 0.5f * draw_list._Data->FontAtlas->TexUvScale.x; // Changed in features/drawlist_v193 but seems unncessary?
+    //tex_uv1.x -= 0.5f * draw_list._Data->FontAtlas->TexUvScale.x;
+    half_weight += fringe * 0.5f;
+#else
+    const bool aa = ImHasFlag(draw_list.Flags, ImDrawListFlags_AntiAliasedLines) &&
+                    ImHasFlag(draw_list.Flags, ImDrawListFlags_AntiAliasedLinesUseTex);
+    if (aa) {
+        ImVec4 tex_uvs = draw_list._Data->TexUvLines[(int)(half_weight*2)];
+        tex_uv0 = ImVec2(tex_uvs.x, tex_uvs.y);
+        tex_uv1 = ImVec2(tex_uvs.z, tex_uvs.w);
+        half_weight += 1;
+    }
+    else {
+        tex_uv0 = tex_uv1 = draw_list._Data->TexUvWhitePixel;
+    }
+#endif
+}
+
+IMPLOT_INLINE void PrimLine(ImDrawList& draw_list, const ImVec2& P1, const ImVec2& P2, float half_weight, ImU32 col, const ImVec2& tex_uv0, const ImVec2 tex_uv1) {
+    float dx = P2.x - P1.x;
+    float dy = P2.y - P1.y;
+    IMPLOT_NORMALIZE2F_OVER_ZERO(dx, dy);
+    dx *= half_weight;
+    dy *= half_weight;
+    draw_list._VtxWritePtr[0].pos.x = P1.x + dy;
+    draw_list._VtxWritePtr[0].pos.y = P1.y - dx;
+    draw_list._VtxWritePtr[0].uv    = tex_uv0;
+    draw_list._VtxWritePtr[0].col   = col;
+    draw_list._VtxWritePtr[1].pos.x = P2.x + dy;
+    draw_list._VtxWritePtr[1].pos.y = P2.y - dx;
+    draw_list._VtxWritePtr[1].uv    = tex_uv0;
+    draw_list._VtxWritePtr[1].col   = col;
+    draw_list._VtxWritePtr[2].pos.x = P2.x - dy;
+    draw_list._VtxWritePtr[2].pos.y = P2.y + dx;
+    draw_list._VtxWritePtr[2].uv    = tex_uv1;
+    draw_list._VtxWritePtr[2].col   = col;
+    draw_list._VtxWritePtr[3].pos.x = P1.x - dy;
+    draw_list._VtxWritePtr[3].pos.y = P1.y + dx;
+    draw_list._VtxWritePtr[3].uv    = tex_uv1;
+    draw_list._VtxWritePtr[3].col   = col;
+    draw_list._VtxWritePtr += 4;
+    draw_list._IdxWritePtr[0] = (ImDrawIdx)(draw_list._VtxCurrentIdx);
+    draw_list._IdxWritePtr[1] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 1);
+    draw_list._IdxWritePtr[2] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 2);
+    draw_list._IdxWritePtr[3] = (ImDrawIdx)(draw_list._VtxCurrentIdx);
+    draw_list._IdxWritePtr[4] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 2);
+    draw_list._IdxWritePtr[5] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 3);
+    draw_list._IdxWritePtr += 6;
+    draw_list._VtxCurrentIdx += 4;
+}
+
+IMPLOT_INLINE void PrimRectFill(ImDrawList& draw_list, const ImVec2& Pmin, const ImVec2& Pmax, ImU32 col, const ImVec2& uv) {
+    draw_list._VtxWritePtr[0].pos   = Pmin;
+    draw_list._VtxWritePtr[0].uv    = uv;
+    draw_list._VtxWritePtr[0].col   = col;
+    draw_list._VtxWritePtr[1].pos   = Pmax;
+    draw_list._VtxWritePtr[1].uv    = uv;
+    draw_list._VtxWritePtr[1].col   = col;
+    draw_list._VtxWritePtr[2].pos.x = Pmin.x;
+    draw_list._VtxWritePtr[2].pos.y = Pmax.y;
+    draw_list._VtxWritePtr[2].uv    = uv;
+    draw_list._VtxWritePtr[2].col   = col;
+    draw_list._VtxWritePtr[3].pos.x = Pmax.x;
+    draw_list._VtxWritePtr[3].pos.y = Pmin.y;
+    draw_list._VtxWritePtr[3].uv    = uv;
+    draw_list._VtxWritePtr[3].col   = col;
+    draw_list._VtxWritePtr += 4;
+    draw_list._IdxWritePtr[0] = (ImDrawIdx)(draw_list._VtxCurrentIdx);
+    draw_list._IdxWritePtr[1] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 1);
+    draw_list._IdxWritePtr[2] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 2);
+    draw_list._IdxWritePtr[3] = (ImDrawIdx)(draw_list._VtxCurrentIdx);
+    draw_list._IdxWritePtr[4] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 1);
+    draw_list._IdxWritePtr[5] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 3);
+    draw_list._IdxWritePtr += 6;
+    draw_list._VtxCurrentIdx += 4;
+}
+
+IMPLOT_INLINE void PrimRectLine(ImDrawList& draw_list, const ImVec2& Pmin, const ImVec2& Pmax, float weight, ImU32 col, const ImVec2& uv) {
+
+    draw_list._VtxWritePtr[0].pos.x = Pmin.x;
+    draw_list._VtxWritePtr[0].pos.y = Pmin.y;
+    draw_list._VtxWritePtr[0].uv    = uv;
+    draw_list._VtxWritePtr[0].col   = col;
+
+    draw_list._VtxWritePtr[1].pos.x = Pmin.x;
+    draw_list._VtxWritePtr[1].pos.y = Pmax.y;
+    draw_list._VtxWritePtr[1].uv    = uv;
+    draw_list._VtxWritePtr[1].col   = col;
+
+    draw_list._VtxWritePtr[2].pos.x = Pmax.x;
+    draw_list._VtxWritePtr[2].pos.y = Pmax.y;
+    draw_list._VtxWritePtr[2].uv    = uv;
+    draw_list._VtxWritePtr[2].col   = col;
+
+    draw_list._VtxWritePtr[3].pos.x = Pmax.x;
+    draw_list._VtxWritePtr[3].pos.y = Pmin.y;
+    draw_list._VtxWritePtr[3].uv    = uv;
+    draw_list._VtxWritePtr[3].col   = col;
+
+    draw_list._VtxWritePtr[4].pos.x = Pmin.x + weight;
+    draw_list._VtxWritePtr[4].pos.y = Pmin.y + weight;
+    draw_list._VtxWritePtr[4].uv    = uv;
+    draw_list._VtxWritePtr[4].col   = col;
+
+    draw_list._VtxWritePtr[5].pos.x = Pmin.x + weight;
+    draw_list._VtxWritePtr[5].pos.y = Pmax.y - weight;
+    draw_list._VtxWritePtr[5].uv    = uv;
+    draw_list._VtxWritePtr[5].col   = col;
+
+    draw_list._VtxWritePtr[6].pos.x = Pmax.x - weight;
+    draw_list._VtxWritePtr[6].pos.y = Pmax.y - weight;
+    draw_list._VtxWritePtr[6].uv    = uv;
+    draw_list._VtxWritePtr[6].col   = col;
+
+    draw_list._VtxWritePtr[7].pos.x = Pmax.x - weight;
+    draw_list._VtxWritePtr[7].pos.y = Pmin.y + weight;
+    draw_list._VtxWritePtr[7].uv    = uv;
+    draw_list._VtxWritePtr[7].col   = col;
+
+    draw_list._VtxWritePtr += 8;
+
+    draw_list._IdxWritePtr[0] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 0);
+    draw_list._IdxWritePtr[1] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 1);
+    draw_list._IdxWritePtr[2] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 5);
+    draw_list._IdxWritePtr += 3;
+
+    draw_list._IdxWritePtr[0] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 0);
+    draw_list._IdxWritePtr[1] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 5);
+    draw_list._IdxWritePtr[2] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 4);
+    draw_list._IdxWritePtr += 3;
+
+    draw_list._IdxWritePtr[0] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 1);
+    draw_list._IdxWritePtr[1] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 2);
+    draw_list._IdxWritePtr[2] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 6);
+    draw_list._IdxWritePtr += 3;
+
+    draw_list._IdxWritePtr[0] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 1);
+    draw_list._IdxWritePtr[1] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 6);
+    draw_list._IdxWritePtr[2] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 5);
+    draw_list._IdxWritePtr += 3;
+
+    draw_list._IdxWritePtr[0] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 2);
+    draw_list._IdxWritePtr[1] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 3);
+    draw_list._IdxWritePtr[2] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 7);
+    draw_list._IdxWritePtr += 3;
+
+    draw_list._IdxWritePtr[0] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 2);
+    draw_list._IdxWritePtr[1] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 7);
+    draw_list._IdxWritePtr[2] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 6);
+    draw_list._IdxWritePtr += 3;
+
+    draw_list._IdxWritePtr[0] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 3);
+    draw_list._IdxWritePtr[1] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 0);
+    draw_list._IdxWritePtr[2] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 4);
+    draw_list._IdxWritePtr += 3;
+
+    draw_list._IdxWritePtr[0] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 3);
+    draw_list._IdxWritePtr[1] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 4);
+    draw_list._IdxWritePtr[2] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 7);
+    draw_list._IdxWritePtr += 3;
+
+    draw_list._VtxCurrentIdx += 8;
+}
+
+
+//-----------------------------------------------------------------------------
+// [SECTION] Item Utils
+//-----------------------------------------------------------------------------
+
+ImPlotItem* RegisterOrGetItem(const char* label_id, ImPlotItemFlags flags, bool* just_created) {
+    ImPlotContext& gp = *GImPlot;
+    ImPlotItemGroup& Items = *gp.CurrentItems;
+    ImGuiID id = Items.GetItemID(label_id);
+    if (just_created != nullptr)
+        *just_created = Items.GetItem(id) == nullptr;
+    ImPlotItem* item = Items.GetOrAddItem(id);
+    if (item->SeenThisFrame)
+        return item;
+    item->SeenThisFrame = true;
+    int idx = Items.GetItemIndex(item);
+    item->ID = id;
+    if (!ImHasFlag(flags, ImPlotItemFlags_NoLegend) && ImGui::FindRenderedTextEnd(label_id, nullptr) != label_id) {
+        Items.Legend.Indices.push_back(idx);
+        item->NameOffset = Items.Legend.Labels.size();
+        Items.Legend.Labels.append(label_id, label_id + strlen(label_id) + 1);
+    }
+    else {
+        item->Show = true;
+    }
+    return item;
+}
+
+ImPlotItem* GetItem(const char* label_id) {
+    ImPlotContext& gp = *GImPlot;
+    return gp.CurrentItems->GetItem(label_id);
+}
+
+bool IsItemHidden(const char* label_id) {
+    ImPlotItem* item = GetItem(label_id);
+    return item != nullptr && !item->Show;
+}
+
+ImPlotItem* GetCurrentItem() {
+    ImPlotContext& gp = *GImPlot;
+    return gp.CurrentItem;
+}
+
+ImVec4 GetLastItemColor() {
+    ImPlotContext& gp = *GImPlot;
+    if (gp.PreviousItem)
+        return ImGui::ColorConvertU32ToFloat4(gp.PreviousItem->Color);
+    return ImVec4();
+}
+
+void BustItemCache() {
+    ImPlotContext& gp = *GImPlot;
+    for (int p = 0; p < gp.Plots.GetBufSize(); ++p) {
+        ImPlotPlot& plot = *gp.Plots.GetByIndex(p);
+        plot.Items.Reset();
+    }
+    for (int p = 0; p < gp.Subplots.GetBufSize(); ++p) {
+        ImPlotSubplot& subplot = *gp.Subplots.GetByIndex(p);
+        subplot.Items.Reset();
+    }
+}
+
+void BustColorCache(const char* plot_title_id) {
+    ImPlotContext& gp = *GImPlot;
+    if (plot_title_id == nullptr) {
+        BustItemCache();
+    }
+    else {
+        ImGuiID id = ImGui::GetCurrentWindow()->GetID(plot_title_id);
+        ImPlotPlot* plot = gp.Plots.GetByKey(id);
+        if (plot != nullptr)
+            plot->Items.Reset();
+        else {
+            ImPlotSubplot* subplot = gp.Subplots.GetByKey(id);
+            if (subplot != nullptr)
+                subplot->Items.Reset();
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] BeginItem / EndItem
+//-----------------------------------------------------------------------------
+
+constexpr float ITEM_HIGHLIGHT_LINE_SCALE = 2.0f;
+constexpr float ITEM_HIGHLIGHT_MARK_SCALE = 1.25f;
+
+// Begins a new item. Returns false if the item should not be plotted.
+bool BeginItem(const char* label_id, const ImPlotSpec& spec, const ImVec4& item_col, ImPlotMarker item_mkr) {
+    ImPlotContext& gp = *GImPlot;
+    IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "PlotX() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+    bool just_created;
+    ImPlotItem* item = RegisterOrGetItem(label_id, spec.Flags, &just_created);
+    // set current item
+    gp.CurrentItem = item;
+    ImPlotNextItemData& s = gp.NextItemData;
+    // set/override item color
+    if (!IsColorAuto(item_col))
+        item->Color = ImGui::ColorConvertFloat4ToU32(item_col);
+    else if (just_created)
+        item->Color = NextColormapColorU32();
+    if (gp.NextItemData.HasHidden) {
+        if (just_created || gp.NextItemData.HiddenCond == ImGuiCond_Always)
+            item->Show = !gp.NextItemData.Hidden;
+    }
+    // set/override item marker
+    if (item_mkr != ImPlotMarker_Invalid) {
+        if (item_mkr != ImPlotMarker_Auto) {
+            item->Marker = item_mkr;
+        }
+        else if (just_created && item_mkr == ImPlotMarker_Auto) {
+            item->Marker = NextMarker();
+        }
+        else if (item_mkr == ImPlotMarker_Auto && item->Marker == ImPlotMarker_None) {
+            item->Marker = NextMarker();
+        }
+    }
+    // return false if not shown
+    if (!item->Show) {
+        // reset next item data
+        gp.NextItemData.Reset();
+        gp.PreviousItem = item;
+        gp.CurrentItem  = nullptr;
+        return false;
+    }
+    else {
+        ImVec4 item_color = ImGui::ColorConvertU32ToFloat4(item->Color);
+        // stage next item spec
+        s.Spec = spec;
+        s.Spec.LineColor = IsColorAuto(s.Spec.LineColor) ? item_color : s.Spec.LineColor;
+        s.Spec.FillColor = IsColorAuto(s.Spec.FillColor) ? item_color : s.Spec.FillColor;
+        s.Spec.FillColor.w *= s.Spec.FillAlpha;
+        s.Spec.Marker = item->Marker;
+        s.Spec.MarkerLineColor = IsColorAuto(s.Spec.MarkerLineColor) ? s.Spec.LineColor : s.Spec.MarkerLineColor;
+        s.Spec.MarkerFillColor = IsColorAuto(s.Spec.MarkerFillColor) ? s.Spec.LineColor : s.Spec.MarkerFillColor;
+        s.Spec.MarkerFillColor.w *= s.Spec.FillAlpha;
+        // apply highlight mods
+        if (item->LegendHovered) {
+            if (!ImHasFlag(gp.CurrentItems->Legend.Flags, ImPlotLegendFlags_NoHighlightItem)) {
+                s.Spec.LineWeight *= ITEM_HIGHLIGHT_LINE_SCALE;
+                s.Spec.MarkerSize *= ITEM_HIGHLIGHT_MARK_SCALE;
+                s.Spec.Size *= ITEM_HIGHLIGHT_MARK_SCALE;
+                // TODO: how to highlight fills?
+            }
+            if (!ImHasFlag(gp.CurrentItems->Legend.Flags, ImPlotLegendFlags_NoHighlightAxis)) {
+                if (gp.CurrentPlot->EnabledAxesX() > 1)
+                    gp.CurrentPlot->Axes[gp.CurrentPlot->CurrentX].ColorHiLi = item->Color;
+                if (gp.CurrentPlot->EnabledAxesY() > 1)
+                    gp.CurrentPlot->Axes[gp.CurrentPlot->CurrentY].ColorHiLi = item->Color;
+            }
+        }
+        // set render flags
+        s.RenderLine = s.Spec.LineColor.w > 0 && s.Spec.LineWeight > 0;
+        s.RenderFill = s.Spec.FillColor.w > 0;
+        s.RenderMarkerLine = s.Spec.MarkerLineColor.w > 0 && s.Spec.LineWeight > 0;
+        s.RenderMarkerFill = s.Spec.MarkerFillColor.w > 0;
+        s.RenderMarkers = s.Spec.Marker >= 0 && (s.RenderMarkerFill || s.RenderMarkerLine);
+        // push rendering clip rect
+        PushPlotClipRect();
+        return true;
+    }
+}
+
+// Ends an item (call only if BeginItem returns true)
+void EndItem() {
+    ImPlotContext& gp = *GImPlot;
+    // pop rendering clip rect
+    PopPlotClipRect();
+    // reset next item data
+    gp.NextItemData.Reset();
+    // set current item
+    gp.PreviousItem = gp.CurrentItem;
+    gp.CurrentItem  = nullptr;
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] Indexers
+//-----------------------------------------------------------------------------
+
+template <typename T>
+IMPLOT_INLINE T IndexData(const T* data, int idx, int count, int offset, int stride) {
+    const int s = ((offset == 0) << 0) | ((stride == sizeof(T)) << 1);
+    switch (s) {
+        case 3 : return data[idx];
+        case 2 : return data[(offset + idx) % count];
+        case 1 : return *(const T*)(const void*)((const unsigned char*)data + (size_t)((idx) ) * stride);
+        case 0 : return *(const T*)(const void*)((const unsigned char*)data + (size_t)((offset + idx) % count) * stride);
+        default: return T(0);
+    }
+}
+
+template <typename T>
+struct IndexerIdx {
+    IndexerIdx(const T* data, int count, int offset = 0, int stride = sizeof(T)) :
+        Data(data),
+        Count(count),
+        Offset(count ? ImPosMod(offset, count) : 0),
+        Stride(stride)
+    { }
+    template <typename I> IMPLOT_INLINE double operator[](I idx) const {
+        return (double)IndexData(Data, idx, Count, Offset, Stride);
+    }
+    const T* Data;
+    int Count;
+    int Offset;
+    int Stride;
+    typedef double value_type;
+};
+
+template <typename _Indexer1, typename _Indexer2>
+struct IndexerAdd {
+    IndexerAdd(const _Indexer1& indexer1, const _Indexer2& indexer2, double scale1 = 1, double scale2 = 1)
+        : Indexer1(indexer1),
+          Indexer2(indexer2),
+          Scale1(scale1),
+          Scale2(scale2),
+          Count(ImMin(Indexer1.Count, Indexer2.Count))
+    { }
+    template <typename I> IMPLOT_INLINE double operator[](I idx) const {
+        return Scale1 * Indexer1[idx] + Scale2 * Indexer2[idx];
+    }
+    const _Indexer1& Indexer1;
+    const _Indexer2& Indexer2;
+    double Scale1;
+    double Scale2;
+    int Count;
+    typedef double value_type;
+};
+
+struct IndexerLin {
+    IndexerLin(double m, double b) : M(m), B(b) { }
+    template <typename I> IMPLOT_INLINE double operator[](I idx) const {
+        return M * idx + B;
+    }
+    const double M;
+    const double B;
+    typedef double value_type;
+};
+
+struct IndexerConst {
+    IndexerConst(double ref) : Ref(ref) { }
+    template <typename I> IMPLOT_INLINE double operator[](I) const { return Ref; }
+    const double Ref;
+    typedef double value_type;
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Getters
+//-----------------------------------------------------------------------------
+
+template <typename _IndexerX, typename _IndexerY>
+struct GetterXY {
+    GetterXY(_IndexerX x, _IndexerY y, int count) : IndexerX(x), IndexerY(y), Count(count) { }
+    template <typename I> IMPLOT_INLINE ImPlotPoint operator[](I idx) const {
+        return ImPlotPoint(IndexerX[idx],IndexerY[idx]);
+    }
+    const _IndexerX IndexerX;
+    const _IndexerY IndexerY;
+    const int Count;
+    typedef ImPlotPoint value_type;
+};
+
+// Double precision point with three coordinates used by ImPlot.
+struct ImPlotPoint3D {
+  double x, y, z;
+  constexpr ImPlotPoint3D()                     : x(0.0), y(0.0), z(0.0) { }
+  constexpr ImPlotPoint3D(double _x, double _y, double _z) : x(_x), y(_y), z(_z) { }
+  double& operator[] (size_t idx)             { IM_ASSERT(idx == 0 || idx == 1 || idx == 2); return ((double*)(void*)(char*)this)[idx]; }
+  double  operator[] (size_t idx) const       { IM_ASSERT(idx == 0 || idx == 1 || idx == 2); return ((const double*)(const void*)(const char*)this)[idx]; }
+};
+
+template <typename _IndexerX, typename _IndexerY, typename _IndexerZ>
+struct GetterXYZ {
+  GetterXYZ(_IndexerX x, _IndexerY y, _IndexerZ z, int count) : IndxerX(x), IndxerY(y), IndxerZ(z), Count(count) { }
+  template <typename I> IMPLOT_INLINE ImPlotPoint3D operator()(I idx) const {
+    return ImPlotPoint3D(IndxerX[idx],IndxerY[idx],IndxerZ[idx]);
+  }
+  const _IndexerX IndxerX;
+  const _IndexerY IndxerY;
+  const _IndexerZ IndxerZ;
+  const int Count;
+};
+
+/// Interprets a user's function pointer as ImPlotPoints
+struct GetterFuncPtr {
+    GetterFuncPtr(ImPlotGetter getter, void* data, int count) :
+        Getter(getter),
+        Data(data),
+        Count(count)
+    { }
+    template <typename I> IMPLOT_INLINE ImPlotPoint operator[](I idx) const {
+        return Getter(idx, Data);
+    }
+    ImPlotGetter Getter;
+    void* const Data;
+    const int Count;
+    typedef ImPlotPoint value_type;
+};
+
+template <typename _Getter>
+struct GetterOverrideX {
+    GetterOverrideX(_Getter getter, double x) : Getter(getter), X(x), Count(getter.Count) { }
+    template <typename I> IMPLOT_INLINE ImPlotPoint operator[](I idx) const {
+        ImPlotPoint p = Getter[idx];
+        p.x = X;
+        return p;
+    }
+    const _Getter Getter;
+    const double X;
+    const int Count;
+    typedef ImPlotPoint value_type;
+};
+
+template <typename _Getter>
+struct GetterOverrideY {
+    GetterOverrideY(_Getter getter, double y) : Getter(getter), Y(y), Count(getter.Count) { }
+    template <typename I> IMPLOT_INLINE ImPlotPoint operator[](I idx) const {
+        ImPlotPoint p = Getter[idx];
+        p.y = Y;
+        return p;
+    }
+    const _Getter Getter;
+    const double Y;
+    const int Count;
+    typedef ImPlotPoint value_type;
+};
+
+template <typename _Getter>
+struct GetterLoop {
+    GetterLoop(_Getter getter) : Getter(getter), Count(getter.Count + 1) { }
+    template <typename I> IMPLOT_INLINE ImPlotPoint operator[](I idx) const {
+        idx = idx % (Count - 1);
+        return Getter[idx];
+    }
+    const _Getter Getter;
+    const int Count;
+    typedef ImPlotPoint value_type;
+};
+
+template <typename T>
+struct GetterError {
+    GetterError(const T* xs, const T* ys, const T* neg, const T* pos, int count, int offset, int stride) :
+        Xs(xs),
+        Ys(ys),
+        Neg(neg),
+        Pos(pos),
+        Count(count),
+        Offset(count ? ImPosMod(offset, count) : 0),
+        Stride(stride)
+    { }
+    template <typename I> IMPLOT_INLINE ImPlotPointError operator[](I idx) const {
+        return ImPlotPointError((double)IndexData(Xs,  idx, Count, Offset, Stride),
+                                (double)IndexData(Ys,  idx, Count, Offset, Stride),
+                                (double)IndexData(Neg, idx, Count, Offset, Stride),
+                                (double)IndexData(Pos, idx, Count, Offset, Stride));
+    }
+    const T* const Xs;
+    const T* const Ys;
+    const T* const Neg;
+    const T* const Pos;
+    const int Count;
+    const int Offset;
+    const int Stride;
+    typedef ImPlotPointError value_type;
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Color Getters
+//-----------------------------------------------------------------------------
+
+struct GetterConstColor {
+    GetterConstColor(ImU32 color, float alpha = 1.0f) {
+        ImU32 col = color;
+        if (alpha < 1.0f) {
+            ImVec4 col_vec = ImGui::ColorConvertU32ToFloat4(col);
+            col_vec.w *= alpha;
+            col = ImGui::GetColorU32(col_vec);
+        }
+        Color = col;
+    }
+    template <typename I> IMPLOT_INLINE ImU32 operator[](I) const { return Color; }
+    ImU32 Color;
+};
+
+struct GetterIdxColor {
+    GetterIdxColor(const ImU32* data, int count, float alpha = 1.0f) : Data(data), Count(count), Alpha(alpha) { }
+    template <typename I> IMPLOT_INLINE ImU32 operator[](I idx) const {
+        IM_ASSERT(idx >= 0 && idx < Count);
+        ImU32 col = Data[idx];
+        if (Alpha < 1.0f) {
+            ImVec4 col_vec = ImGui::ColorConvertU32ToFloat4(col);
+            col_vec.w *= Alpha;
+            col = ImGui::GetColorU32(col_vec);
+        }
+        return col;
+    }
+    const ImU32* Data;
+    const int Count;
+    const float Alpha;
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Size Getters
+//-----------------------------------------------------------------------------
+
+struct GetterConstSize {
+    GetterConstSize(float size) : Size(size) { }
+    template <typename I> IMPLOT_INLINE float operator[](I) const { return Size; }
+    float Size;
+};
+
+struct GetterIdxSize {
+    GetterIdxSize(const float* data, int count) : Data(data), Count(count) { }
+    template <typename I> IMPLOT_INLINE float operator[](I idx) const {
+        IM_ASSERT(idx >= 0 && idx < Count);
+        return Data[idx];
+    }
+    const float* Data;
+    const int Count;
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Fitters
+//-----------------------------------------------------------------------------
+
+template <typename _Getter1>
+struct Fitter1 {
+    Fitter1(const _Getter1& getter) : Getter(getter) { }
+    void Fit(ImPlotAxis& x_axis, ImPlotAxis& y_axis) const {
+        for (int i = 0; i < Getter.Count; ++i) {
+            ImPlotPoint p = Getter[i];
+            x_axis.ExtendFitWith(y_axis, p.x, p.y);
+            y_axis.ExtendFitWith(x_axis, p.y, p.x);
+        }
+    }
+    const _Getter1& Getter;
+};
+
+template <typename _Getter1>
+struct FitterBubbles1 {
+  FitterBubbles1(const _Getter1& getter) : Getter(getter) { }
+  void Fit(ImPlotAxis& x_axis, ImPlotAxis& y_axis) const {
+    for (int i = 0; i < Getter.Count; ++i) {
+      ImPlotPoint3D p = Getter(i);
+      double half_size = p.z;
+      // Fit left and right edges
+      x_axis.ExtendFitWith(y_axis, p.x - half_size, p.y);
+      x_axis.ExtendFitWith(y_axis, p.x + half_size, p.y);
+      // Fit top and bottom edges
+      y_axis.ExtendFitWith(x_axis, p.y - half_size, p.x);
+      y_axis.ExtendFitWith(x_axis, p.y + half_size, p.x);
+    }
+  }
+  const _Getter1& Getter;
+};
+
+template <typename _Getter1>
+struct FitterX {
+    FitterX(const _Getter1& getter) : Getter(getter) { }
+    void Fit(ImPlotAxis& x_axis, ImPlotAxis&) const {
+        for (int i = 0; i < Getter.Count; ++i) {
+            ImPlotPoint p = Getter[i];
+            x_axis.ExtendFit(p.x);
+        }
+    }
+    const _Getter1& Getter;
+};
+
+template <typename _Getter1>
+struct FitterY {
+    FitterY(const _Getter1& getter) : Getter(getter) { }
+    void Fit(ImPlotAxis&, ImPlotAxis& y_axis) const {
+        for (int i = 0; i < Getter.Count; ++i) {
+            ImPlotPoint p = Getter[i];
+            y_axis.ExtendFit(p.y);
+        }
+    }
+    const _Getter1& Getter;
+};
+
+template <typename _Getter1, typename _Getter2>
+struct Fitter2 {
+    Fitter2(const _Getter1& getter1, const _Getter2& getter2) : Getter1(getter1), Getter2(getter2) { }
+    void Fit(ImPlotAxis& x_axis, ImPlotAxis& y_axis) const {
+        for (int i = 0; i < Getter1.Count; ++i) {
+            ImPlotPoint p = Getter1[i];
+            x_axis.ExtendFitWith(y_axis, p.x, p.y);
+            y_axis.ExtendFitWith(x_axis, p.y, p.x);
+        }
+        for (int i = 0; i < Getter2.Count; ++i) {
+            ImPlotPoint p = Getter2[i];
+            x_axis.ExtendFitWith(y_axis, p.x, p.y);
+            y_axis.ExtendFitWith(x_axis, p.y, p.x);
+        }
+    }
+    const _Getter1& Getter1;
+    const _Getter2& Getter2;
+};
+
+template <typename _Getter1, typename _Getter2>
+struct FitterBarV {
+    FitterBarV(const _Getter1& getter1, const _Getter2& getter2, double width) :
+        Getter1(getter1),
+        Getter2(getter2),
+        HalfWidth(width*0.5)
+    { }
+    void Fit(ImPlotAxis& x_axis, ImPlotAxis& y_axis) const {
+        int count = ImMin(Getter1.Count, Getter2.Count);
+        for (int i = 0; i < count; ++i) {
+            ImPlotPoint p1 = Getter1[i]; p1.x -= HalfWidth;
+            ImPlotPoint p2 = Getter2[i]; p2.x += HalfWidth;
+            x_axis.ExtendFitWith(y_axis, p1.x, p1.y);
+            y_axis.ExtendFitWith(x_axis, p1.y, p1.x);
+            x_axis.ExtendFitWith(y_axis, p2.x, p2.y);
+            y_axis.ExtendFitWith(x_axis, p2.y, p2.x);
+        }
+    }
+    const _Getter1& Getter1;
+    const _Getter2& Getter2;
+    const double    HalfWidth;
+};
+
+template <typename _Getter1, typename _Getter2>
+struct FitterBarH {
+    FitterBarH(const _Getter1& getter1, const _Getter2& getter2, double height) :
+        Getter1(getter1),
+        Getter2(getter2),
+        HalfHeight(height*0.5)
+    { }
+    void Fit(ImPlotAxis& x_axis, ImPlotAxis& y_axis) const {
+        int count = ImMin(Getter1.Count, Getter2.Count);
+        for (int i = 0; i < count; ++i) {
+            ImPlotPoint p1 = Getter1[i]; p1.y -= HalfHeight;
+            ImPlotPoint p2 = Getter2[i]; p2.y += HalfHeight;
+            x_axis.ExtendFitWith(y_axis, p1.x, p1.y);
+            y_axis.ExtendFitWith(x_axis, p1.y, p1.x);
+            x_axis.ExtendFitWith(y_axis, p2.x, p2.y);
+            y_axis.ExtendFitWith(x_axis, p2.y, p2.x);
+        }
+    }
+    const _Getter1& Getter1;
+    const _Getter2& Getter2;
+    const double    HalfHeight;
+};
+
+struct FitterRect {
+    FitterRect(const ImPlotPoint& pmin, const ImPlotPoint& pmax) :
+        Pmin(pmin),
+        Pmax(pmax)
+    { }
+    FitterRect(const ImPlotRect& rect) :
+        FitterRect(rect.Min(), rect.Max())
+    { }
+    void Fit(ImPlotAxis& x_axis, ImPlotAxis& y_axis) const {
+        x_axis.ExtendFitWith(y_axis, Pmin.x, Pmin.y);
+        y_axis.ExtendFitWith(x_axis, Pmin.y, Pmin.x);
+        x_axis.ExtendFitWith(y_axis, Pmax.x, Pmax.y);
+        y_axis.ExtendFitWith(x_axis, Pmax.y, Pmax.x);
+    }
+    const ImPlotPoint Pmin;
+    const ImPlotPoint Pmax;
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Transformers
+//-----------------------------------------------------------------------------
+
+struct Transformer1 {
+    Transformer1(double pixMin, double pltMin, double pltMax, double m, double scaMin, double scaMax, ImPlotTransform fwd, void* data) :
+        ScaMin(scaMin),
+        ScaMax(scaMax),
+        PltMin(pltMin),
+        PltMax(pltMax),
+        PixMin(pixMin),
+        M(m),
+        TransformFwd(fwd),
+        TransformData(data)
+    { }
+
+    template <typename T> IMPLOT_INLINE float operator()(T p) const {
+        if (TransformFwd != nullptr) {
+            double s = TransformFwd(p, TransformData);
+            double t = (s - ScaMin) / (ScaMax - ScaMin);
+            p = PltMin + (PltMax - PltMin) * t;
+        }
+        return (float)(PixMin + M * (p - PltMin));
+    }
+
+    double ScaMin, ScaMax, PltMin, PltMax, PixMin, M;
+    ImPlotTransform TransformFwd;
+    void*           TransformData;
+};
+
+struct Transformer2 {
+    Transformer2(const ImPlotAxis& x_axis, const ImPlotAxis& y_axis) :
+        Tx(x_axis.PixelMin,
+           x_axis.Range.Min,
+           x_axis.Range.Max,
+           x_axis.ScaleToPixel,
+           x_axis.ScaleMin,
+           x_axis.ScaleMax,
+           x_axis.TransformForward,
+           x_axis.TransformData),
+        Ty(y_axis.PixelMin,
+           y_axis.Range.Min,
+           y_axis.Range.Max,
+           y_axis.ScaleToPixel,
+           y_axis.ScaleMin,
+           y_axis.ScaleMax,
+           y_axis.TransformForward,
+           y_axis.TransformData)
+    { }
+
+    Transformer2(const ImPlotPlot& plot) :
+        Transformer2(plot.Axes[plot.CurrentX], plot.Axes[plot.CurrentY])
+    { }
+
+    Transformer2() :
+        Transformer2(*GImPlot->CurrentPlot)
+    { }
+
+    template <typename P> IMPLOT_INLINE ImVec2 operator()(const P& plt) const {
+        ImVec2 out;
+        out.x = Tx(plt.x);
+        out.y = Ty(plt.y);
+        return out;
+    }
+
+    template <typename T> IMPLOT_INLINE ImVec2 operator()(T x, T y) const {
+        ImVec2 out;
+        out.x = Tx(x);
+        out.y = Ty(y);
+        return out;
+    }
+
+    Transformer1 Tx;
+    Transformer1 Ty;
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Renderers
+//-----------------------------------------------------------------------------
+
+struct RendererBase {
+    RendererBase(int prims, int idx_consumed, int vtx_consumed) :
+        Prims(prims),
+        IdxConsumed(idx_consumed),
+        VtxConsumed(vtx_consumed)
+    { }
+    const int Prims;
+    Transformer2 Transformer;
+    const int IdxConsumed;
+    const int VtxConsumed;
+};
+
+template <class _Getter, class _GetterColor>
+struct RendererLineStrip : RendererBase {
+    RendererLineStrip(const _Getter& getter, const _GetterColor& getter_color, float weight) :
+        RendererBase(getter.Count - 1, 6, 4),
+        Getter(getter),
+        GetterColor(getter_color),
+        HalfWeight(ImMax(1.0f,weight)*0.5f)
+    {
+        P1 = this->Transformer(Getter[0]);
+    }
+    void Init(ImDrawList& draw_list) const {
+        GetLineRenderProps(draw_list, HalfWeight, UV0, UV1);
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImVec2 P2 = this->Transformer(Getter[prim + 1]);
+        if (!cull_rect.Overlaps(ImRect(ImMin(P1, P2), ImMax(P1, P2)))) {
+            P1 = P2;
+            return false;
+        }
+        ImU32 col = GetterColor[prim];
+        PrimLine(draw_list,P1,P2,HalfWeight,col,UV0,UV1);
+        P1 = P2;
+        return true;
+    }
+    const _Getter& Getter;
+    const _GetterColor& GetterColor;
+    mutable float HalfWeight;
+    mutable ImVec2 P1;
+    mutable ImVec2 UV0;
+    mutable ImVec2 UV1;
+};
+
+template <class _Getter, class _GetterColor>
+struct RendererLineStripSkip : RendererBase {
+    RendererLineStripSkip(const _Getter& getter, const _GetterColor& getter_color, float weight) :
+        RendererBase(getter.Count - 1, 6, 4),
+        Getter(getter),
+        GetterColor(getter_color),
+        HalfWeight(ImMax(1.0f,weight)*0.5f)
+    {
+        P1 = this->Transformer(Getter[0]);
+    }
+    void Init(ImDrawList& draw_list) const {
+        GetLineRenderProps(draw_list, HalfWeight, UV0, UV1);
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImVec2 P2 = this->Transformer(Getter[prim + 1]);
+        if (!cull_rect.Overlaps(ImRect(ImMin(P1, P2), ImMax(P1, P2)))) {
+            if (!ImNan(P2.x) && !ImNan(P2.y))
+                P1 = P2;
+            return false;
+        }
+        ImU32 col = GetterColor[prim];
+        PrimLine(draw_list,P1,P2,HalfWeight,col,UV0,UV1);
+        if (!ImNan(P2.x) && !ImNan(P2.y))
+            P1 = P2;
+        return true;
+    }
+    const _Getter& Getter;
+    const _GetterColor& GetterColor;
+    mutable float HalfWeight;
+    mutable ImVec2 P1;
+    mutable ImVec2 UV0;
+    mutable ImVec2 UV1;
+};
+
+template <class _Getter, class _GetterColor>
+struct RendererLineSegments1 : RendererBase {
+    RendererLineSegments1(const _Getter& getter, const _GetterColor& getter_color, float weight) :
+        RendererBase(getter.Count / 2, 6, 4),
+        Getter(getter),
+        GetterColor(getter_color),
+        HalfWeight(ImMax(1.0f,weight)*0.5f)
+    { }
+    void Init(ImDrawList& draw_list) const {
+        GetLineRenderProps(draw_list, HalfWeight, UV0, UV1);
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImVec2 P1 = this->Transformer(Getter[prim*2+0]);
+        ImVec2 P2 = this->Transformer(Getter[prim*2+1]);
+        if (!cull_rect.Overlaps(ImRect(ImMin(P1, P2), ImMax(P1, P2))))
+            return false;
+        ImU32 col = GetterColor[prim*2];
+        PrimLine(draw_list,P1,P2,HalfWeight,col,UV0,UV1);
+        return true;
+    }
+    const _Getter& Getter;
+    const _GetterColor& GetterColor;
+    mutable float HalfWeight;
+    mutable ImVec2 UV0;
+    mutable ImVec2 UV1;
+};
+
+template <class _Getter1, class _Getter2, class _GetterColor>
+struct RendererLineSegments2 : RendererBase {
+    RendererLineSegments2(const _Getter1& getter1, const _Getter2& getter2, const _GetterColor& getter_color, float weight) :
+        RendererBase(ImMin(getter1.Count, getter2.Count), 6, 4),
+        Getter1(getter1),
+        Getter2(getter2),
+        GetterColor(getter_color),
+        HalfWeight(ImMax(1.0f,weight)*0.5f)
+    {}
+    void Init(ImDrawList& draw_list) const {
+        GetLineRenderProps(draw_list, HalfWeight, UV0, UV1);
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImVec2 P1 = this->Transformer(Getter1[prim]);
+        ImVec2 P2 = this->Transformer(Getter2[prim]);
+        if (!cull_rect.Overlaps(ImRect(ImMin(P1, P2), ImMax(P1, P2))))
+            return false;
+        ImU32 col = GetterColor[prim];
+        PrimLine(draw_list,P1,P2,HalfWeight,col,UV0,UV1);
+        return true;
+    }
+    const _Getter1& Getter1;
+    const _Getter2& Getter2;
+    const _GetterColor& GetterColor;
+    mutable float HalfWeight;
+    mutable ImVec2 UV0;
+    mutable ImVec2 UV1;
+};
+
+template <class _Getter1, class _Getter2, class _GetterColor>
+struct RendererBarsFillV : RendererBase {
+    RendererBarsFillV(const _Getter1& getter1, const _Getter2& getter2, const _GetterColor& getter_color, double width) :
+        RendererBase(ImMin(getter1.Count, getter2.Count), 6, 4),
+        Getter1(getter1),
+        Getter2(getter2),
+        GetterColor(getter_color),
+        HalfWidth(width/2)
+    {}
+    void Init(ImDrawList& draw_list) const {
+        UV = draw_list._Data->TexUvWhitePixel;
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImPlotPoint p1 = Getter1[prim];
+        ImPlotPoint p2 = Getter2[prim];
+        p1.x += HalfWidth;
+        p2.x -= HalfWidth;
+        ImVec2 P1 = this->Transformer(p1);
+        ImVec2 P2 = this->Transformer(p2);
+        float width_px = ImAbs(P1.x-P2.x);
+        if (width_px < 1.0f) {
+            P1.x += P1.x > P2.x ? (1-width_px) / 2 : (width_px-1) / 2;
+            P2.x += P2.x > P1.x ? (1-width_px) / 2 : (width_px-1) / 2;
+        }
+        ImVec2 PMin = ImMin(P1, P2);
+        ImVec2 PMax = ImMax(P1, P2);
+        if (!cull_rect.Overlaps(ImRect(PMin, PMax)))
+            return false;
+        ImU32 col = GetterColor[prim];
+        PrimRectFill(draw_list,PMin,PMax,col,UV);
+        return true;
+    }
+    const _Getter1& Getter1;
+    const _Getter2& Getter2;
+    const _GetterColor& GetterColor;
+    const double HalfWidth;
+    mutable ImVec2 UV;
+};
+
+template <class _Getter1, class _Getter2, class _GetterColor>
+struct RendererBarsFillH : RendererBase {
+    RendererBarsFillH(const _Getter1& getter1, const _Getter2& getter2, const _GetterColor& getter_color, double height) :
+        RendererBase(ImMin(getter1.Count, getter2.Count), 6, 4),
+        Getter1(getter1),
+        Getter2(getter2),
+        GetterColor(getter_color),
+        HalfHeight(height/2)
+    {}
+    void Init(ImDrawList& draw_list) const {
+        UV = draw_list._Data->TexUvWhitePixel;
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImPlotPoint p1 = Getter1[prim];
+        ImPlotPoint p2 = Getter2[prim];
+        p1.y += HalfHeight;
+        p2.y -= HalfHeight;
+        ImVec2 P1 = this->Transformer(p1);
+        ImVec2 P2 = this->Transformer(p2);
+        float height_px = ImAbs(P1.y-P2.y);
+        if (height_px < 1.0f) {
+            P1.y += P1.y > P2.y ? (1-height_px) / 2 : (height_px-1) / 2;
+            P2.y += P2.y > P1.y ? (1-height_px) / 2 : (height_px-1) / 2;
+        }
+        ImVec2 PMin = ImMin(P1, P2);
+        ImVec2 PMax = ImMax(P1, P2);
+        if (!cull_rect.Overlaps(ImRect(PMin, PMax)))
+            return false;
+        ImU32 col = GetterColor[prim];
+        PrimRectFill(draw_list,PMin,PMax,col,UV);
+        return true;
+    }
+    const _Getter1& Getter1;
+    const _Getter2& Getter2;
+    const _GetterColor& GetterColor;
+    const double HalfHeight;
+    mutable ImVec2 UV;
+};
+
+template <class _Getter1, class _Getter2, class _GetterColor>
+struct RendererBarsLineV : RendererBase {
+    RendererBarsLineV(const _Getter1& getter1, const _Getter2& getter2, const _GetterColor& getter_color, double width, float weight) :
+        RendererBase(ImMin(getter1.Count, getter2.Count), 24, 8),
+        Getter1(getter1),
+        Getter2(getter2),
+        GetterColor(getter_color),
+        HalfWidth(width/2),
+        Weight(weight)
+    {}
+    void Init(ImDrawList& draw_list) const {
+        UV = draw_list._Data->TexUvWhitePixel;
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImPlotPoint p1 = Getter1[prim];
+        ImPlotPoint p2 = Getter2[prim];
+        p1.x += HalfWidth;
+        p2.x -= HalfWidth;
+        ImVec2 P1 = this->Transformer(p1);
+        ImVec2 P2 = this->Transformer(p2);
+        float width_px = ImAbs(P1.x-P2.x);
+        if (width_px < 1.0f) {
+            P1.x += P1.x > P2.x ? (1-width_px) / 2 : (width_px-1) / 2;
+            P2.x += P2.x > P1.x ? (1-width_px) / 2 : (width_px-1) / 2;
+        }
+        ImVec2 PMin = ImMin(P1, P2);
+        ImVec2 PMax = ImMax(P1, P2);
+        if (!cull_rect.Overlaps(ImRect(PMin, PMax)))
+            return false;
+        ImU32 col = GetterColor[prim];
+        PrimRectLine(draw_list,PMin,PMax,Weight,col,UV);
+        return true;
+    }
+    const _Getter1& Getter1;
+    const _Getter2& Getter2;
+    const _GetterColor& GetterColor;
+    const double HalfWidth;
+    const float Weight;
+    mutable ImVec2 UV;
+};
+
+template <class _Getter1, class _Getter2, class _GetterColor>
+struct RendererBarsLineH : RendererBase {
+    RendererBarsLineH(const _Getter1& getter1, const _Getter2& getter2, const _GetterColor& getter_color, double height, float weight) :
+        RendererBase(ImMin(getter1.Count, getter2.Count), 24, 8),
+        Getter1(getter1),
+        Getter2(getter2),
+        GetterColor(getter_color),
+        HalfHeight(height/2),
+        Weight(weight)
+    {}
+    void Init(ImDrawList& draw_list) const {
+        UV = draw_list._Data->TexUvWhitePixel;
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImPlotPoint p1 = Getter1[prim];
+        ImPlotPoint p2 = Getter2[prim];
+        p1.y += HalfHeight;
+        p2.y -= HalfHeight;
+        ImVec2 P1 = this->Transformer(p1);
+        ImVec2 P2 = this->Transformer(p2);
+        float height_px = ImAbs(P1.y-P2.y);
+        if (height_px < 1.0f) {
+            P1.y += P1.y > P2.y ? (1-height_px) / 2 : (height_px-1) / 2;
+            P2.y += P2.y > P1.y ? (1-height_px) / 2 : (height_px-1) / 2;
+        }
+        ImVec2 PMin = ImMin(P1, P2);
+        ImVec2 PMax = ImMax(P1, P2);
+        if (!cull_rect.Overlaps(ImRect(PMin, PMax)))
+            return false;
+        ImU32 col = GetterColor[prim];
+        PrimRectLine(draw_list,PMin,PMax,Weight,col,UV);
+        return true;
+    }
+    const _Getter1& Getter1;
+    const _Getter2& Getter2;
+    const _GetterColor& GetterColor;
+    const double HalfHeight;
+    const float Weight;
+    mutable ImVec2 UV;
+};
+
+
+template <class _Getter, class _GetterColor>
+struct RendererStairsPre : RendererBase {
+    RendererStairsPre(const _Getter& getter, const _GetterColor& getter_color, float weight) :
+        RendererBase(getter.Count - 1, 12, 8),
+        Getter(getter),
+        GetterColor(getter_color),
+        HalfWeight(ImMax(1.0f,weight)*0.5f)
+    {
+        P1 = this->Transformer(Getter[0]);
+    }
+    void Init(ImDrawList& draw_list) const {
+        UV = draw_list._Data->TexUvWhitePixel;
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImVec2 P2 = this->Transformer(Getter[prim + 1]);
+        if (!cull_rect.Overlaps(ImRect(ImMin(P1, P2), ImMax(P1, P2)))) {
+            P1 = P2;
+            return false;
+        }
+        ImU32 col = GetterColor[prim];
+        PrimRectFill(draw_list, ImVec2(P1.x - HalfWeight, P1.y), ImVec2(P1.x + HalfWeight, P2.y), col, UV);
+        PrimRectFill(draw_list, ImVec2(P1.x, P2.y + HalfWeight), ImVec2(P2.x, P2.y - HalfWeight), col, UV);
+        P1 = P2;
+        return true;
+    }
+    const _Getter& Getter;
+    const _GetterColor& GetterColor;
+    mutable float HalfWeight;
+    mutable ImVec2 P1;
+    mutable ImVec2 UV;
+};
+
+template <class _Getter, class _GetterColor>
+struct RendererStairsPost : RendererBase {
+    RendererStairsPost(const _Getter& getter, const _GetterColor& getter_color, float weight) :
+        RendererBase(getter.Count - 1, 12, 8),
+        Getter(getter),
+        GetterColor(getter_color),
+        HalfWeight(ImMax(1.0f,weight) * 0.5f)
+    {
+        P1 = this->Transformer(Getter[0]);
+    }
+    void Init(ImDrawList& draw_list) const {
+        UV = draw_list._Data->TexUvWhitePixel;
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImVec2 P2 = this->Transformer(Getter[prim + 1]);
+        if (!cull_rect.Overlaps(ImRect(ImMin(P1, P2), ImMax(P1, P2)))) {
+            P1 = P2;
+            return false;
+        }
+        ImU32 col = GetterColor[prim];
+        PrimRectFill(draw_list, ImVec2(P1.x, P1.y + HalfWeight), ImVec2(P2.x, P1.y - HalfWeight), col, UV);
+        PrimRectFill(draw_list, ImVec2(P2.x - HalfWeight, P2.y), ImVec2(P2.x + HalfWeight, P1.y), col, UV);
+        P1 = P2;
+        return true;
+    }
+    const _Getter& Getter;
+    const _GetterColor& GetterColor;
+    mutable float HalfWeight;
+    mutable ImVec2 P1;
+    mutable ImVec2 UV;
+};
+
+template <class _Getter, class _GetterColor>
+struct RendererStairsPreShaded : RendererBase {
+    RendererStairsPreShaded(const _Getter& getter, const _GetterColor& getter_color) :
+        RendererBase(getter.Count - 1, 6, 4),
+        Getter(getter),
+        GetterColor(getter_color)
+    {
+        P1 = this->Transformer(Getter[0]);
+        Y0 = this->Transformer(ImPlotPoint(0,0)).y;
+    }
+    void Init(ImDrawList& draw_list) const {
+        UV = draw_list._Data->TexUvWhitePixel;
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImVec2 P2 = this->Transformer(Getter[prim + 1]);
+        ImVec2 PMin(ImMin(P1.x, P2.x), ImMin(Y0, P2.y));
+        ImVec2 PMax(ImMax(P1.x, P2.x), ImMax(Y0, P2.y));
+        if (!cull_rect.Overlaps(ImRect(PMin, PMax))) {
+            P1 = P2;
+            return false;
+        }
+        ImU32 col = GetterColor[prim];
+        PrimRectFill(draw_list, PMin, PMax, col, UV);
+        P1 = P2;
+        return true;
+    }
+    const _Getter& Getter;
+    const _GetterColor& GetterColor;
+    float Y0;
+    mutable ImVec2 P1;
+    mutable ImVec2 UV;
+};
+
+template <class _Getter, class _GetterColor>
+struct RendererStairsPostShaded : RendererBase {
+    RendererStairsPostShaded(const _Getter& getter, const _GetterColor& getter_color) :
+        RendererBase(getter.Count - 1, 6, 4),
+        Getter(getter),
+        GetterColor(getter_color)
+    {
+        P1 = this->Transformer(Getter[0]);
+        Y0 = this->Transformer(ImPlotPoint(0,0)).y;
+    }
+    void Init(ImDrawList& draw_list) const {
+        UV = draw_list._Data->TexUvWhitePixel;
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImVec2 P2 = this->Transformer(Getter[prim + 1]);
+        ImVec2 PMin(ImMin(P1.x, P2.x), ImMin(P1.y, Y0));
+        ImVec2 PMax(ImMax(P1.x, P2.x), ImMax(P1.y, Y0));
+        if (!cull_rect.Overlaps(ImRect(PMin, PMax))) {
+            P1 = P2;
+            return false;
+        }
+        ImU32 col = GetterColor[prim];
+        PrimRectFill(draw_list, PMin, PMax, col, UV);
+        P1 = P2;
+        return true;
+    }
+    const _Getter& Getter;
+    const _GetterColor& GetterColor;
+    float Y0;
+    mutable ImVec2 P1;
+    mutable ImVec2 UV;
+};
+
+
+
+template <class _Getter1, class _Getter2, class _GetterColor>
+struct RendererShaded : RendererBase {
+    RendererShaded(const _Getter1& getter1, const _Getter2& getter2, const _GetterColor& getter_color) :
+        RendererBase(ImMin(getter1.Count, getter2.Count) - 1, 6, 5),
+        Getter1(getter1),
+        Getter2(getter2),
+        GetterColor(getter_color)
+    {
+        P11 = this->Transformer(Getter1[0]);
+        P12 = this->Transformer(Getter2[0]);
+    }
+    void Init(ImDrawList& draw_list) const {
+        UV = draw_list._Data->TexUvWhitePixel;
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImVec2 P21 = this->Transformer(Getter1[prim+1]);
+        ImVec2 P22 = this->Transformer(Getter2[prim+1]);
+        ImRect rect(ImMin(ImMin(ImMin(P11,P12),P21),P22), ImMax(ImMax(ImMax(P11,P12),P21),P22));
+        if (!cull_rect.Overlaps(rect)) {
+            P11 = P21;
+            P12 = P22;
+            return false;
+        }
+        ImU32 col = GetterColor[prim];
+        const int intersect = (P11.y > P12.y && P22.y > P21.y) || (P12.y > P11.y && P21.y > P22.y);
+        const ImVec2 intersection = intersect == 0 ? ImVec2(0,0) : Intersection(P11,P21,P12,P22);
+        draw_list._VtxWritePtr[0].pos = P11;
+        draw_list._VtxWritePtr[0].uv  = UV;
+        draw_list._VtxWritePtr[0].col = col;
+        draw_list._VtxWritePtr[1].pos = P21;
+        draw_list._VtxWritePtr[1].uv  = UV;
+        draw_list._VtxWritePtr[1].col = col;
+        draw_list._VtxWritePtr[2].pos = intersection;
+        draw_list._VtxWritePtr[2].uv  = UV;
+        draw_list._VtxWritePtr[2].col = col;
+        draw_list._VtxWritePtr[3].pos = P12;
+        draw_list._VtxWritePtr[3].uv  = UV;
+        draw_list._VtxWritePtr[3].col = col;
+        draw_list._VtxWritePtr[4].pos = P22;
+        draw_list._VtxWritePtr[4].uv  = UV;
+        draw_list._VtxWritePtr[4].col = col;
+        draw_list._VtxWritePtr += 5;
+        draw_list._IdxWritePtr[0] = (ImDrawIdx)(draw_list._VtxCurrentIdx);
+        draw_list._IdxWritePtr[1] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 1 + intersect);
+        draw_list._IdxWritePtr[2] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 3);
+        draw_list._IdxWritePtr[3] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 1);
+        draw_list._IdxWritePtr[4] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 4);
+        draw_list._IdxWritePtr[5] = (ImDrawIdx)(draw_list._VtxCurrentIdx + 3 - intersect);
+        draw_list._IdxWritePtr += 6;
+        draw_list._VtxCurrentIdx += 5;
+        P11 = P21;
+        P12 = P22;
+        return true;
+    }
+    const _Getter1& Getter1;
+    const _Getter2& Getter2;
+    const _GetterColor& GetterColor;
+    mutable ImVec2 P11;
+    mutable ImVec2 P12;
+    mutable ImVec2 UV;
+};
+
+struct RectC {
+    ImPlotPoint Pos;
+    ImPlotPoint HalfSize;
+    ImU32 Color;
+};
+
+template <typename _Getter>
+struct RendererRectC : RendererBase {
+    RendererRectC(const _Getter& getter) :
+        RendererBase(getter.Count, 6, 4),
+        Getter(getter)
+    {}
+    void Init(ImDrawList& draw_list) const {
+        UV = draw_list._Data->TexUvWhitePixel;
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        RectC rect = Getter[prim];
+        ImVec2 P1 = this->Transformer(rect.Pos.x - rect.HalfSize.x , rect.Pos.y - rect.HalfSize.y);
+        ImVec2 P2 = this->Transformer(rect.Pos.x + rect.HalfSize.x , rect.Pos.y + rect.HalfSize.y);
+        if ((rect.Color & IM_COL32_A_MASK) == 0 || !cull_rect.Overlaps(ImRect(ImMin(P1, P2), ImMax(P1, P2))))
+            return false;
+        PrimRectFill(draw_list,P1,P2,rect.Color,UV);
+        return true;
+    }
+    const _Getter& Getter;
+    mutable ImVec2 UV;
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] RenderPrimitives
+//-----------------------------------------------------------------------------
+
+/// Renders primitive shapes in bulk as efficiently as possible.
+template <class _Renderer>
+void RenderPrimitivesEx(const _Renderer& renderer, ImDrawList& draw_list, const ImRect& cull_rect) {
+    unsigned int prims        = renderer.Prims;
+    unsigned int prims_culled = 0;
+    unsigned int idx          = 0;
+    renderer.Init(draw_list);
+    while (prims) {
+        // find how many can be reserved up to end of current draw command's limit
+        unsigned int cnt = ImMin(prims, (MaxIdx<ImDrawIdx>::Value - draw_list._VtxCurrentIdx) / renderer.VtxConsumed);
+        // make sure at least this many elements can be rendered to avoid situations where at the end of buffer this slow path is not taken all the time
+        if (cnt >= ImMin(64u, prims)) {
+            if (prims_culled >= cnt)
+                prims_culled -= cnt; // reuse previous reservation
+            else {
+                // add more elements to previous reservation
+                draw_list.PrimReserve((cnt - prims_culled) * renderer.IdxConsumed, (cnt - prims_culled) * renderer.VtxConsumed);
+                prims_culled = 0;
+            }
+        }
+        else
+        {
+            if (prims_culled > 0) {
+                draw_list.PrimUnreserve(prims_culled * renderer.IdxConsumed, prims_culled * renderer.VtxConsumed);
+                prims_culled = 0;
+            }
+            cnt = ImMin(prims, (MaxIdx<ImDrawIdx>::Value - 0/*draw_list._VtxCurrentIdx*/) / renderer.VtxConsumed);
+            // reserve new draw command
+            draw_list.PrimReserve(cnt * renderer.IdxConsumed, cnt * renderer.VtxConsumed);
+        }
+        prims -= cnt;
+        for (unsigned int ie = idx + cnt; idx != ie; ++idx) {
+            if (!renderer.Render(draw_list, cull_rect, idx))
+                prims_culled++;
+        }
+    }
+    if (prims_culled > 0)
+        draw_list.PrimUnreserve(prims_culled * renderer.IdxConsumed, prims_culled * renderer.VtxConsumed);
+}
+
+template <template <class> class _Renderer, class _Getter, typename ...Args>
+void RenderPrimitives1(const _Getter& getter, Args... args) {
+    ImDrawList& draw_list = *GetPlotDrawList();
+    const ImRect& cull_rect = GetCurrentPlot()->PlotRect;
+    RenderPrimitivesEx(_Renderer<_Getter>(getter,args...), draw_list, cull_rect);
+}
+
+template <template <class,class> class _Renderer, class _Getter1, class _Getter2, typename ...Args>
+void RenderPrimitives2(const _Getter1& getter1, const _Getter2& getter2, Args... args) {
+    ImDrawList& draw_list = *GetPlotDrawList();
+    const ImRect& cull_rect = GetCurrentPlot()->PlotRect;
+    RenderPrimitivesEx(_Renderer<_Getter1,_Getter2>(getter1,getter2,args...), draw_list, cull_rect);
+}
+
+template <template <class,class,class> class _Renderer, class _Getter1, class _Getter2, class _Getter3, typename ...Args>
+void RenderPrimitives3(const _Getter1& getter1, const _Getter2& getter2, const _Getter3& getter3, Args... args) {
+    ImDrawList& draw_list = *GetPlotDrawList();
+    const ImRect& cull_rect = GetCurrentPlot()->PlotRect;
+    RenderPrimitivesEx(_Renderer<_Getter1,_Getter2,_Getter3>(getter1,getter2,getter3,args...), draw_list, cull_rect);
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] Markers
+//-----------------------------------------------------------------------------
+
+template <class _Getter, class _GetterColor, class _GetterSize>
+struct RendererMarkersFill : RendererBase {
+    RendererMarkersFill(const _Getter& getter, const _GetterColor& getter_color, const _GetterSize& getter_size, const ImVec2* marker, int count) :
+        RendererBase(getter.Count, (count-2)*3, count),
+        Getter(getter),
+        GetterColor(getter_color),
+        GetterSize(getter_size),
+        Marker(marker),
+        Count(count)
+    { }
+    void Init(ImDrawList& draw_list) const {
+        UV = draw_list._Data->TexUvWhitePixel;
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImVec2 p = this->Transformer(Getter[prim]);
+        if (p.x >= cull_rect.Min.x && p.y >= cull_rect.Min.y && p.x <= cull_rect.Max.x && p.y <= cull_rect.Max.y) {
+            ImU32 col = GetterColor[prim];
+            float size = GetterSize[prim];
+            for (int i = 0; i < Count; i++) {
+                draw_list._VtxWritePtr[0].pos.x = p.x + Marker[i].x * size;
+                draw_list._VtxWritePtr[0].pos.y = p.y + Marker[i].y * size;
+                draw_list._VtxWritePtr[0].uv = UV;
+                draw_list._VtxWritePtr[0].col = col;
+                draw_list._VtxWritePtr++;
+            }
+            for (int i = 2; i < Count; i++) {
+                draw_list._IdxWritePtr[0] = (ImDrawIdx)(draw_list._VtxCurrentIdx);
+                draw_list._IdxWritePtr[1] = (ImDrawIdx)(draw_list._VtxCurrentIdx + i - 1);
+                draw_list._IdxWritePtr[2] = (ImDrawIdx)(draw_list._VtxCurrentIdx + i);
+                draw_list._IdxWritePtr += 3;
+            }
+            draw_list._VtxCurrentIdx += (ImDrawIdx)Count;
+            return true;
+        }
+        return false;
+    }
+    const _Getter& Getter;
+    const _GetterColor& GetterColor;
+    const _GetterSize& GetterSize;
+    const ImVec2* Marker;
+    const int Count;
+    mutable ImVec2 UV;
+};
+
+
+template <class _Getter, class _GetterColor, class _GetterSize>
+struct RendererMarkersLine : RendererBase {
+    RendererMarkersLine(const _Getter& getter, const _GetterColor& getter_color, const _GetterSize& getter_size, const ImVec2* marker, int count, float weight) :
+        RendererBase(getter.Count, count/2*6, count/2*4),
+        Getter(getter),
+        GetterColor(getter_color),
+        GetterSize(getter_size),
+        Marker(marker),
+        Count(count),
+        HalfWeight(ImMax(1.0f,weight)*0.5f)
+    { }
+    void Init(ImDrawList& draw_list) const {
+        GetLineRenderProps(draw_list, HalfWeight, UV0, UV1);
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImVec2 p = this->Transformer(Getter[prim]);
+        if (p.x >= cull_rect.Min.x && p.y >= cull_rect.Min.y && p.x <= cull_rect.Max.x && p.y <= cull_rect.Max.y) {
+            ImU32 col = GetterColor[prim];
+            float size = GetterSize[prim];
+            for (int i = 0; i < Count; i = i + 2) {
+                ImVec2 p1(p.x + Marker[i].x * size, p.y + Marker[i].y * size);
+                ImVec2 p2(p.x + Marker[i+1].x * size, p.y + Marker[i+1].y * size);
+                PrimLine(draw_list, p1, p2, HalfWeight, col, UV0, UV1);
+            }
+            return true;
+        }
+        return false;
+    }
+    const _Getter& Getter;
+    const _GetterColor& GetterColor;
+    const _GetterSize& GetterSize;
+    const ImVec2* Marker;
+    const int Count;
+    mutable float HalfWeight;
+    mutable ImVec2 UV0;
+    mutable ImVec2 UV1;
+};
+
+template <class _Getter, class _GetterColor>
+struct RendererCircleFill : RendererBase {
+    RendererCircleFill(const _Getter& getter, const _GetterColor& getter_color) :
+        RendererBase(getter.Count, 62*3, 64),
+        Getter(getter),
+        GetterColor(getter_color)
+    { }
+    void Init(ImDrawList& draw_list) const {
+        UV = draw_list._Data->TexUvWhitePixel;
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImPlotPoint3D p3D = Getter(prim);
+        float size_in_plot_coords = (float)p3D.z;
+        float radius_in_plot_coords = size_in_plot_coords;
+
+        // Compute approximate radius in pixels for LOD
+        float approx_radius_pixels = (float)ImAbs(radius_in_plot_coords * this->Transformer.Tx.M);
+        int num_segments = ImClamp((int)(approx_radius_pixels), 10, 64);
+
+        // Compute bounding box of the bubble in plot coordinates
+        ImPlotPoint plot_min(p3D.x - radius_in_plot_coords, p3D.y - radius_in_plot_coords);
+        ImPlotPoint plot_max(p3D.x + radius_in_plot_coords, p3D.y + radius_in_plot_coords);
+
+        // Transform bounding box to pixel coordinates
+        ImVec2 pixel_min = this->Transformer(plot_min);
+        ImVec2 pixel_max = this->Transformer(plot_max);
+
+        // Create bounding rectangle (handle axis inversion)
+        ImRect bbox(ImMin(pixel_min, pixel_max), ImMax(pixel_min, pixel_max));
+
+        // Check if bounding box overlaps with cull rectangle
+        if (cull_rect.Overlaps(bbox)) {
+            ImU32 col = GetterColor[prim];
+
+            const float a_max = IM_PI * 2.0f;
+            const float a_step = a_max / num_segments;
+
+            ImDrawIdx vtx_base = (ImDrawIdx)draw_list._VtxCurrentIdx;
+
+            for (int i = 0; i < num_segments; i++) {
+                float angle = a_step * i;
+                float cos_a = ImCos(angle);
+                float sin_a = ImSin(angle);
+
+                // Compute point in plot coordinates
+                ImPlotPoint plot_point(p3D.x + cos_a * radius_in_plot_coords,
+                                      p3D.y + sin_a * radius_in_plot_coords);
+                // Transform to pixel coordinates
+                ImVec2 pixel_pos = this->Transformer(plot_point);
+
+                draw_list._VtxWritePtr[0].pos = pixel_pos;
+                draw_list._VtxWritePtr[0].uv = UV;
+                draw_list._VtxWritePtr[0].col = col;
+                draw_list._VtxWritePtr++;
+            }
+
+            for (int i = 2; i < num_segments; i++) {
+                draw_list._IdxWritePtr[0] = vtx_base;
+                draw_list._IdxWritePtr[1] = (ImDrawIdx)(vtx_base + i - 1);
+                draw_list._IdxWritePtr[2] = (ImDrawIdx)(vtx_base + i);
+                draw_list._IdxWritePtr += 3;
+            }
+
+            draw_list._VtxCurrentIdx += num_segments;
+
+            int unused_vtx = 64 - num_segments;
+            int unused_idx = (62 - (num_segments - 2)) * 3;
+            if (unused_vtx > 0 || unused_idx > 0) {
+                draw_list.PrimUnreserve(unused_idx, unused_vtx);
+            }
+
+            return true;
+        }
+        return false;
+    }
+    const _Getter& Getter;
+    const _GetterColor& GetterColor;
+    mutable ImVec2 UV;
+};
+
+template <class _Getter, class _GetterColor>
+struct RendererCircleLine : RendererBase {
+  RendererCircleLine(const _Getter& getter, const _GetterColor& getter_color, float weight) :
+      RendererBase(getter.Count, 64*6, 64*4),
+      Getter(getter),
+      HalfWeight(ImMax(1.0f,weight)*0.5f),
+      GetterColor(getter_color)
+    { }
+    void Init(ImDrawList& draw_list) const {
+      GetLineRenderProps(draw_list, HalfWeight, UV0, UV1);
+    }
+    IMPLOT_INLINE bool Render(ImDrawList& draw_list, const ImRect& cull_rect, int prim) const {
+        ImPlotPoint3D p3D = Getter(prim);
+        float size_in_plot_coords = (float)p3D.z;
+        float radius_in_plot_coords = size_in_plot_coords;
+
+        // Compute approximate radius in pixels for LOD
+        float approx_radius_pixels = (float)ImAbs(radius_in_plot_coords * this->Transformer.Tx.M);
+        int num_segments = ImClamp((int)(approx_radius_pixels), 10, 64);
+
+        // Compute bounding box of the bubble in plot coordinates
+        ImPlotPoint plot_min(p3D.x - radius_in_plot_coords, p3D.y - radius_in_plot_coords);
+        ImPlotPoint plot_max(p3D.x + radius_in_plot_coords, p3D.y + radius_in_plot_coords);
+
+        // Transform bounding box to pixel coordinates
+        ImVec2 pixel_min = this->Transformer(plot_min);
+        ImVec2 pixel_max = this->Transformer(plot_max);
+
+        // Create bounding rectangle (handle axis inversion)
+        ImRect bbox(ImMin(pixel_min, pixel_max), ImMax(pixel_min, pixel_max));
+
+        // Check if bounding box overlaps with cull rectangle
+        if (cull_rect.Overlaps(bbox)) {
+            ImU32 col = GetterColor[prim];
+
+            const float a_max = IM_PI * 2.0f;
+            const float a_step = a_max / num_segments;
+
+            for (int i = 0; i < num_segments; i++) {
+                float angle1 = a_step * i;
+                float angle2 = a_step * ((i + 1) % num_segments);
+
+                // Compute points in plot coordinates
+                ImPlotPoint plot_point1(p3D.x + ImCos(angle1) * radius_in_plot_coords,
+                                       p3D.y + ImSin(angle1) * radius_in_plot_coords);
+                ImPlotPoint plot_point2(p3D.x + ImCos(angle2) * radius_in_plot_coords,
+                                       p3D.y + ImSin(angle2) * radius_in_plot_coords);
+
+                // Transform to pixel coordinates
+                ImVec2 p1 = this->Transformer(plot_point1);
+                ImVec2 p2 = this->Transformer(plot_point2);
+
+                PrimLine(draw_list, p1, p2, HalfWeight, col, UV0, UV1);
+            }
+
+            int unused_vtx = (64 - num_segments) * 4;
+            int unused_idx = (64 - num_segments) * 6;
+            if (unused_vtx > 0 || unused_idx > 0) {
+                draw_list.PrimUnreserve(unused_idx, unused_vtx);
+            }
+
+            return true;
+        }
+        return false;
+    }
+    const _Getter& Getter;
+    mutable float HalfWeight;
+    const _GetterColor& GetterColor;
+    mutable ImVec2 UV0;
+    mutable ImVec2 UV1;
+};
+
+static const ImVec2 MARKER_FILL_CIRCLE[10]  = {ImVec2(1.0f, 0.0f), ImVec2(0.809017f, 0.58778524f),ImVec2(0.30901697f, 0.95105654f),ImVec2(-0.30901703f, 0.9510565f),ImVec2(-0.80901706f, 0.5877852f),ImVec2(-1.0f, 0.0f),ImVec2(-0.80901694f, -0.58778536f),ImVec2(-0.3090171f, -0.9510565f),ImVec2(0.30901712f, -0.9510565f),ImVec2(0.80901694f, -0.5877853f)};
+static const ImVec2 MARKER_FILL_SQUARE[4]   = {ImVec2(SQRT_1_2,SQRT_1_2), ImVec2(SQRT_1_2,-SQRT_1_2), ImVec2(-SQRT_1_2,-SQRT_1_2), ImVec2(-SQRT_1_2,SQRT_1_2)};
+static const ImVec2 MARKER_FILL_DIAMOND[4]  = {ImVec2(1, 0), ImVec2(0, -1), ImVec2(-1, 0), ImVec2(0, 1)};
+static const ImVec2 MARKER_FILL_UP[3]       = {ImVec2(SQRT_3_2,0.5f),ImVec2(0,-1),ImVec2(-SQRT_3_2,0.5f)};
+static const ImVec2 MARKER_FILL_DOWN[3]     = {ImVec2(SQRT_3_2,-0.5f),ImVec2(0,1),ImVec2(-SQRT_3_2,-0.5f)};
+static const ImVec2 MARKER_FILL_LEFT[3]     = {ImVec2(-1,0), ImVec2(0.5, SQRT_3_2), ImVec2(0.5, -SQRT_3_2)};
+static const ImVec2 MARKER_FILL_RIGHT[3]    = {ImVec2(1,0), ImVec2(-0.5, SQRT_3_2), ImVec2(-0.5, -SQRT_3_2)};
+
+static const ImVec2 MARKER_LINE_CIRCLE[20]  = {
+    ImVec2(1.0f, 0.0f),
+    ImVec2(0.809017f, 0.58778524f),
+    ImVec2(0.809017f, 0.58778524f),
+    ImVec2(0.30901697f, 0.95105654f),
+    ImVec2(0.30901697f, 0.95105654f),
+    ImVec2(-0.30901703f, 0.9510565f),
+    ImVec2(-0.30901703f, 0.9510565f),
+    ImVec2(-0.80901706f, 0.5877852f),
+    ImVec2(-0.80901706f, 0.5877852f),
+    ImVec2(-1.0f, 0.0f),
+    ImVec2(-1.0f, 0.0f),
+    ImVec2(-0.80901694f, -0.58778536f),
+    ImVec2(-0.80901694f, -0.58778536f),
+    ImVec2(-0.3090171f, -0.9510565f),
+    ImVec2(-0.3090171f, -0.9510565f),
+    ImVec2(0.30901712f, -0.9510565f),
+    ImVec2(0.30901712f, -0.9510565f),
+    ImVec2(0.80901694f, -0.5877853f),
+    ImVec2(0.80901694f, -0.5877853f),
+    ImVec2(1.0f, 0.0f)
+};
+constexpr ImVec2 MARKER_LINE_SQUARE[8]   = {ImVec2(SQRT_1_2,SQRT_1_2), ImVec2(SQRT_1_2,-SQRT_1_2), ImVec2(SQRT_1_2,-SQRT_1_2), ImVec2(-SQRT_1_2,-SQRT_1_2), ImVec2(-SQRT_1_2,-SQRT_1_2), ImVec2(-SQRT_1_2,SQRT_1_2), ImVec2(-SQRT_1_2,SQRT_1_2), ImVec2(SQRT_1_2,SQRT_1_2)};
+constexpr ImVec2 MARKER_LINE_DIAMOND[8]  = {ImVec2(1, 0), ImVec2(0, -1), ImVec2(0, -1), ImVec2(-1, 0), ImVec2(-1, 0), ImVec2(0, 1), ImVec2(0, 1), ImVec2(1, 0)};
+constexpr ImVec2 MARKER_LINE_UP[6]       = {ImVec2(SQRT_3_2,0.5f), ImVec2(0,-1),ImVec2(0,-1),ImVec2(-SQRT_3_2,0.5f),ImVec2(-SQRT_3_2,0.5f),ImVec2(SQRT_3_2,0.5f)};
+constexpr ImVec2 MARKER_LINE_DOWN[6]     = {ImVec2(SQRT_3_2,-0.5f),ImVec2(0,1),ImVec2(0,1),ImVec2(-SQRT_3_2,-0.5f), ImVec2(-SQRT_3_2,-0.5f), ImVec2(SQRT_3_2,-0.5f)};
+constexpr ImVec2 MARKER_LINE_LEFT[6]     = {ImVec2(-1,0), ImVec2(0.5, SQRT_3_2),  ImVec2(0.5, SQRT_3_2),  ImVec2(0.5, -SQRT_3_2) , ImVec2(0.5, -SQRT_3_2) , ImVec2(-1,0) };
+constexpr ImVec2 MARKER_LINE_RIGHT[6]    = {ImVec2(1,0),  ImVec2(-0.5, SQRT_3_2), ImVec2(-0.5, SQRT_3_2), ImVec2(-0.5, -SQRT_3_2), ImVec2(-0.5, -SQRT_3_2), ImVec2(1,0) };
+constexpr ImVec2 MARKER_LINE_ASTERISK[6] = {ImVec2(-SQRT_3_2, -0.5f), ImVec2(SQRT_3_2, 0.5f),  ImVec2(-SQRT_3_2, 0.5f), ImVec2(SQRT_3_2, -0.5f), ImVec2(0, -1), ImVec2(0, 1)};
+constexpr ImVec2 MARKER_LINE_PLUS[4]     = {ImVec2(-1, 0), ImVec2(1, 0), ImVec2(0, -1), ImVec2(0, 1)};
+constexpr ImVec2 MARKER_LINE_CROSS[4]    = {ImVec2(-SQRT_1_2,-SQRT_1_2),ImVec2(SQRT_1_2,SQRT_1_2),ImVec2(SQRT_1_2,-SQRT_1_2),ImVec2(-SQRT_1_2,SQRT_1_2)};
+constexpr ImVec2 MARKER_LINE_VERTICAL[2] = {ImVec2(0, -1), ImVec2(0, 1)};
+constexpr ImVec2 MARKER_LINE_HORIZONTAL[2] = {ImVec2(-1, 0), ImVec2(1, 0)};
+
+template <typename _Getter, typename _GetterFillColor, typename _GetterLineColor, typename _GetterSize>
+void RenderMarkers(const _Getter& getter, ImPlotMarker marker, bool rend_fill, const _GetterFillColor& col_fill_getter, bool rend_line, const _GetterLineColor& col_line_getter, const _GetterSize& size_getter, float weight) {
+    if (rend_fill) {
+        switch (marker) {
+            case ImPlotMarker_Circle  : RenderPrimitives3<RendererMarkersFill>(getter,col_fill_getter,size_getter,MARKER_FILL_CIRCLE,10); break;
+            case ImPlotMarker_Square  : RenderPrimitives3<RendererMarkersFill>(getter,col_fill_getter,size_getter,MARKER_FILL_SQUARE, 4); break;
+            case ImPlotMarker_Diamond : RenderPrimitives3<RendererMarkersFill>(getter,col_fill_getter,size_getter,MARKER_FILL_DIAMOND,4); break;
+            case ImPlotMarker_Up      : RenderPrimitives3<RendererMarkersFill>(getter,col_fill_getter,size_getter,MARKER_FILL_UP,     3); break;
+            case ImPlotMarker_Down    : RenderPrimitives3<RendererMarkersFill>(getter,col_fill_getter,size_getter,MARKER_FILL_DOWN,   3); break;
+            case ImPlotMarker_Left    : RenderPrimitives3<RendererMarkersFill>(getter,col_fill_getter,size_getter,MARKER_FILL_LEFT,   3); break;
+            case ImPlotMarker_Right   : RenderPrimitives3<RendererMarkersFill>(getter,col_fill_getter,size_getter,MARKER_FILL_RIGHT,  3); break;
+        }
+    }
+    if (rend_line) {
+        switch (marker) {
+            case ImPlotMarker_Circle    : RenderPrimitives3<RendererMarkersLine>(getter,col_line_getter,size_getter,MARKER_LINE_CIRCLE, 20,weight); break;
+            case ImPlotMarker_Square    : RenderPrimitives3<RendererMarkersLine>(getter,col_line_getter,size_getter,MARKER_LINE_SQUARE,  8,weight); break;
+            case ImPlotMarker_Diamond   : RenderPrimitives3<RendererMarkersLine>(getter,col_line_getter,size_getter,MARKER_LINE_DIAMOND, 8,weight); break;
+            case ImPlotMarker_Up        : RenderPrimitives3<RendererMarkersLine>(getter,col_line_getter,size_getter,MARKER_LINE_UP,      6,weight); break;
+            case ImPlotMarker_Down      : RenderPrimitives3<RendererMarkersLine>(getter,col_line_getter,size_getter,MARKER_LINE_DOWN,    6,weight); break;
+            case ImPlotMarker_Left      : RenderPrimitives3<RendererMarkersLine>(getter,col_line_getter,size_getter,MARKER_LINE_LEFT,    6,weight); break;
+            case ImPlotMarker_Right     : RenderPrimitives3<RendererMarkersLine>(getter,col_line_getter,size_getter,MARKER_LINE_RIGHT,   6,weight); break;
+            case ImPlotMarker_Asterisk  : RenderPrimitives3<RendererMarkersLine>(getter,col_line_getter,size_getter,MARKER_LINE_ASTERISK,6,weight); break;
+            case ImPlotMarker_Plus      : RenderPrimitives3<RendererMarkersLine>(getter,col_line_getter,size_getter,MARKER_LINE_PLUS,    4,weight); break;
+            case ImPlotMarker_Cross     : RenderPrimitives3<RendererMarkersLine>(getter,col_line_getter,size_getter,MARKER_LINE_CROSS,   4,weight); break;
+            case ImPlotMarker_Vertical  : RenderPrimitives3<RendererMarkersLine>(getter,col_line_getter,size_getter,MARKER_LINE_VERTICAL,2,weight); break;
+            case ImPlotMarker_Horizontal: RenderPrimitives3<RendererMarkersLine>(getter,col_line_getter,size_getter,MARKER_LINE_HORIZONTAL,2,weight); break;
+        }
+    }
+}
+
+template <typename _Getter>
+void RenderColoredMarkers(const _Getter& getter, const ImPlotNextItemData& s) {
+    const ImU32 col_line = ImGui::GetColorU32(s.Spec.MarkerLineColor);
+    const ImU32 col_fill = ImGui::GetColorU32(s.Spec.MarkerFillColor);
+
+    if (s.Spec.MarkerSizes != nullptr) {
+        GetterIdxSize size_getter(s.Spec.MarkerSizes, getter.Count);
+        if (s.Spec.MarkerFillColors != nullptr && s.Spec.MarkerLineColors != nullptr) {
+            GetterIdxColor fill_getter(s.Spec.MarkerFillColors, getter.Count, s.Spec.FillAlpha);
+            GetterIdxColor line_getter(s.Spec.MarkerLineColors, getter.Count);
+            RenderMarkers<_Getter>(getter, s.Spec.Marker, s.RenderMarkerFill, fill_getter, s.RenderMarkerLine, line_getter, size_getter, s.Spec.LineWeight);
+        } else if (s.Spec.MarkerFillColors != nullptr) {
+            GetterIdxColor fill_getter(s.Spec.MarkerFillColors, getter.Count, s.Spec.FillAlpha);
+            GetterConstColor line_getter(col_line);
+            RenderMarkers<_Getter>(getter, s.Spec.Marker, s.RenderMarkerFill, fill_getter, s.RenderMarkerLine, line_getter, size_getter, s.Spec.LineWeight);
+        } else if (s.Spec.MarkerLineColors != nullptr) {
+            GetterConstColor fill_getter(col_fill);
+            GetterIdxColor line_getter(s.Spec.MarkerLineColors, getter.Count);
+            RenderMarkers<_Getter>(getter, s.Spec.Marker, s.RenderMarkerFill, fill_getter, s.RenderMarkerLine, line_getter, size_getter, s.Spec.LineWeight);
+        } else {
+            GetterConstColor fill_getter(col_fill);
+            GetterConstColor line_getter(col_line);
+            RenderMarkers<_Getter>(getter, s.Spec.Marker, s.RenderMarkerFill, fill_getter, s.RenderMarkerLine, line_getter, size_getter, s.Spec.LineWeight);
+        }
+    } else {
+        GetterConstSize size_getter(s.Spec.MarkerSize);
+        if (s.Spec.MarkerFillColors != nullptr && s.Spec.MarkerLineColors != nullptr) {
+            GetterIdxColor fill_getter(s.Spec.MarkerFillColors, getter.Count, s.Spec.FillAlpha);
+            GetterIdxColor line_getter(s.Spec.MarkerLineColors, getter.Count);
+            RenderMarkers<_Getter>(getter, s.Spec.Marker, s.RenderMarkerFill, fill_getter, s.RenderMarkerLine, line_getter, size_getter, s.Spec.LineWeight);
+        } else if (s.Spec.MarkerFillColors != nullptr) {
+            GetterIdxColor fill_getter(s.Spec.MarkerFillColors, getter.Count, s.Spec.FillAlpha);
+            GetterConstColor line_getter(col_line);
+            RenderMarkers<_Getter>(getter, s.Spec.Marker, s.RenderMarkerFill, fill_getter, s.RenderMarkerLine, line_getter, size_getter, s.Spec.LineWeight);
+        } else if (s.Spec.MarkerLineColors != nullptr) {
+            GetterConstColor fill_getter(col_fill);
+            GetterIdxColor line_getter(s.Spec.MarkerLineColors, getter.Count);
+            RenderMarkers<_Getter>(getter, s.Spec.Marker, s.RenderMarkerFill, fill_getter, s.RenderMarkerLine, line_getter, size_getter, s.Spec.LineWeight);
+        } else {
+            GetterConstColor fill_getter(col_fill);
+            GetterConstColor line_getter(col_line);
+            RenderMarkers<_Getter>(getter, s.Spec.Marker, s.RenderMarkerFill, fill_getter, s.RenderMarkerLine, line_getter, size_getter, s.Spec.LineWeight);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotLine
+//-----------------------------------------------------------------------------
+
+template <typename _Getter>
+void PlotLineEx(const char* label_id, const _Getter& getter, const ImPlotSpec& spec) {
+    if (BeginItemEx(label_id, Fitter1<_Getter>(getter), spec, spec.LineColor, spec.Marker)) {
+        if (getter.Count <= 0) {
+            EndItem();
+            return;
+        }
+        const ImPlotNextItemData& s = GetItemData();
+        if (getter.Count > 1) {
+            if (ImHasFlag(spec.Flags, ImPlotLineFlags_Shaded) && s.RenderFill) {
+                GetterOverrideY<_Getter> getter2(getter, 0);
+                if (s.Spec.FillColors != nullptr) {
+                    GetterIdxColor color_getter(s.Spec.FillColors, getter.Count, s.Spec.FillAlpha);
+                    RenderPrimitives3<RendererShaded>(getter,getter2,color_getter);
+                } else {
+                    const ImU32 col_fill = ImGui::GetColorU32(s.Spec.FillColor);
+                    GetterConstColor color_getter(col_fill, s.Spec.FillAlpha);
+                    RenderPrimitives3<RendererShaded>(getter,getter2,color_getter);
+                }
+            }
+            if (s.RenderLine) {
+                const ImU32 col_line = ImGui::GetColorU32(s.Spec.LineColor);
+                if (ImHasFlag(spec.Flags,ImPlotLineFlags_Segments)) {
+                    if (s.Spec.LineColors != nullptr) {
+                        GetterIdxColor color_getter(s.Spec.LineColors, getter.Count);
+                        RenderPrimitives2<RendererLineSegments1>(getter,color_getter,s.Spec.LineWeight);
+                    } else {
+                        GetterConstColor color_getter(col_line);
+                        RenderPrimitives2<RendererLineSegments1>(getter,color_getter,s.Spec.LineWeight);
+                    }
+                }
+                else if (ImHasFlag(spec.Flags, ImPlotLineFlags_Loop)) {
+                    if (s.Spec.LineColors != nullptr) {
+                        GetterIdxColor color_getter(s.Spec.LineColors, getter.Count);
+                        if (ImHasFlag(spec.Flags, ImPlotLineFlags_SkipNaN))
+                            RenderPrimitives2<RendererLineStripSkip>(GetterLoop<_Getter>(getter),color_getter,s.Spec.LineWeight);
+                        else
+                            RenderPrimitives2<RendererLineStrip>(GetterLoop<_Getter>(getter),color_getter,s.Spec.LineWeight);
+                    } else {
+                        GetterConstColor color_getter(col_line);
+                        if (ImHasFlag(spec.Flags, ImPlotLineFlags_SkipNaN))
+                            RenderPrimitives2<RendererLineStripSkip>(GetterLoop<_Getter>(getter),color_getter,s.Spec.LineWeight);
+                        else
+                            RenderPrimitives2<RendererLineStrip>(GetterLoop<_Getter>(getter),color_getter,s.Spec.LineWeight);
+                    }
+                }
+                else {
+                    if (s.Spec.LineColors != nullptr) {
+                        GetterIdxColor color_getter(s.Spec.LineColors, getter.Count);
+                        if (ImHasFlag(spec.Flags, ImPlotLineFlags_SkipNaN))
+                            RenderPrimitives2<RendererLineStripSkip>(getter,color_getter,s.Spec.LineWeight);
+                        else
+                            RenderPrimitives2<RendererLineStrip>(getter,color_getter,s.Spec.LineWeight);
+                    } else {
+                        GetterConstColor color_getter(col_line);
+                        if (ImHasFlag(spec.Flags, ImPlotLineFlags_SkipNaN))
+                            RenderPrimitives2<RendererLineStripSkip>(getter,color_getter,s.Spec.LineWeight);
+                        else
+                            RenderPrimitives2<RendererLineStrip>(getter,color_getter,s.Spec.LineWeight);
+                    }
+                }
+            }
+        }
+        // render markers
+        if (s.RenderMarkers) {
+            if (ImHasFlag(spec.Flags, ImPlotLineFlags_NoClip)) {
+                PopPlotClipRect();
+                PushPlotClipRect(s.Spec.MarkerSize);
+            }
+            RenderColoredMarkers(getter, s);
+        }
+        EndItem();
+    }
+}
+
+template <typename T>
+void PlotLine(const char* label_id, const T* values, int count, double xscale, double x0, const ImPlotSpec& spec) {
+    GetterXY<IndexerLin,IndexerIdx<T>> getter(IndexerLin(xscale,x0),IndexerIdx<T>(values,count,spec.Offset,Stride<T>(spec)),count);
+    PlotLineEx(label_id, getter, spec);
+}
+
+template <typename T>
+void PlotLine(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec) {
+    GetterXY<IndexerIdx<T>,IndexerIdx<T>> getter(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerIdx<T>(ys,count,spec.Offset,Stride<T>(spec)),count);
+    PlotLineEx(label_id, getter, spec);
+}
+
+#define INSTANTIATE_MACRO(T) \
+    template IMPLOT_API void PlotLine<T> (const char* label_id, const T* values, int count, double xscale, double x0, const ImPlotSpec& spec); \
+    template IMPLOT_API void PlotLine<T>(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+// custom
+void PlotLineG(const char* label_id, ImPlotGetter getter_func, void* data, int count, const ImPlotSpec& spec) {
+    GetterFuncPtr getter(getter_func,data, count);
+    PlotLineEx(label_id, getter, spec);
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotScatter
+//-----------------------------------------------------------------------------
+
+template <typename Getter>
+void PlotScatterEx(const char* label_id, const Getter& getter, const ImPlotSpec& spec) {
+    // force scatter to render a marker even if none
+    ImPlotMarker marker = spec.Marker == ImPlotMarker_None ? ImPlotMarker_Auto: spec.Marker;
+    if (BeginItemEx(label_id, Fitter1<Getter>(getter), spec, spec.MarkerLineColor, marker)) {
+        if (getter.Count <= 0) {
+            EndItem();
+            return;
+        }
+        const ImPlotNextItemData& s = GetItemData();
+        if (s.RenderMarkers) {
+            if (ImHasFlag(spec.Flags,ImPlotScatterFlags_NoClip)) {
+                PopPlotClipRect();
+                PushPlotClipRect(s.Spec.MarkerSize);
+            }
+            RenderColoredMarkers(getter, s);
+        }
+        EndItem();
+    }
+}
+
+template <typename T>
+void PlotScatter(const char* label_id, const T* values, int count, double xscale, double x0, const ImPlotSpec& spec) {
+    GetterXY<IndexerLin,IndexerIdx<T>> getter(IndexerLin(xscale,x0),IndexerIdx<T>(values,count,spec.Offset, Stride<T>(spec)),count);
+    PlotScatterEx(label_id, getter, spec);
+}
+
+template <typename T>
+void PlotScatter(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec) {
+    GetterXY<IndexerIdx<T>,IndexerIdx<T>> getter(IndexerIdx<T>(xs,count,spec.Offset, Stride<T>(spec)),IndexerIdx<T>(ys,count,spec.Offset, Stride<T>(spec)),count);
+    return PlotScatterEx(label_id, getter, spec);
+}
+
+#define INSTANTIATE_MACRO(T) \
+    template IMPLOT_API void PlotScatter<T>(const char* label_id, const T* values, int count, double xscale, double x0, const ImPlotSpec& spec); \
+    template IMPLOT_API void PlotScatter<T>(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+// custom
+void PlotScatterG(const char* label_id, ImPlotGetter getter_func, void* data, int count, const ImPlotSpec& spec) {
+    GetterFuncPtr getter(getter_func,data, count);
+    return PlotScatterEx(label_id, getter, spec);
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotBubbles
+//-----------------------------------------------------------------------------
+
+template <typename Getter>
+void PlotBubblesEx(const char* label_id, const Getter& getter, const ImPlotSpec& spec) {
+    if (BeginItemEx(label_id, FitterBubbles1<Getter>(getter), spec, spec.FillColor, spec.Marker)) {
+        if (getter.Count <= 0) {
+            EndItem();
+            return;
+        }
+        const ImPlotNextItemData& s = GetItemData();
+
+        if (s.RenderFill) {
+            const ImU32 col_fill = ImGui::GetColorU32(s.Spec.FillColor);
+            if (s.Spec.FillColors != nullptr) {
+                GetterIdxColor fill_getter(s.Spec.FillColors, getter.Count, s.Spec.FillAlpha);
+                RenderPrimitives2<RendererCircleFill>(getter, fill_getter);
+            } else {
+                GetterConstColor fill_getter(col_fill);
+                RenderPrimitives2<RendererCircleFill>(getter, fill_getter);
+            }
+        }
+        if (s.RenderLine) {
+            const ImU32 col_line = ImGui::GetColorU32(s.Spec.LineColor);
+            if (s.Spec.LineColors != nullptr) {
+                GetterIdxColor line_getter(s.Spec.LineColors, getter.Count);
+                RenderPrimitives2<RendererCircleLine>(getter, line_getter, s.Spec.LineWeight);
+            } else {
+                GetterConstColor line_getter(col_line);
+                RenderPrimitives2<RendererCircleLine>(getter, line_getter, s.Spec.LineWeight);
+            }
+        }
+
+        EndItem();
+    }
+}
+
+template <typename T>
+void PlotBubbles(const char* label_id, const T* values, const T* szs, int count, double xscale, double x0, const ImPlotSpec& spec) {
+  GetterXYZ<IndexerLin,IndexerIdx<T>,IndexerIdx<T>> getter(IndexerLin(xscale,x0), IndexerIdx<T>(values,count,spec.Offset,Stride<T>(spec)), IndexerIdx<T>(szs,count,spec.Offset,Stride<T>(spec)),count);
+  PlotBubblesEx(label_id, getter, spec);
+}
+
+template <typename T>
+void PlotBubbles(const char* label_id, const T* xs, const T* ys, const T* szs, int count, const ImPlotSpec& spec) {
+  GetterXYZ<IndexerIdx<T>,IndexerIdx<T>,IndexerIdx<T>> getter(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerIdx<T>(ys,count,spec.Offset,Stride<T>(spec)), IndexerIdx<T>(szs,count,spec.Offset,Stride<T>(spec)),count);
+  return PlotBubblesEx(label_id, getter, spec);
+}
+
+#define INSTANTIATE_MACRO(T) \
+    template IMPLOT_API void PlotBubbles<T>(const char* label_id, const T* values, const T* szs, int count, double xscale, double x0, const ImPlotSpec& spec); \
+    template IMPLOT_API void PlotBubbles<T>(const char* label_id, const T* xs, const T* ys, const T* szs, int count, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotPolygon
+//-----------------------------------------------------------------------------
+
+template <typename Getter>
+void PlotPolygonEx(const char* label_id, const Getter& getter, const ImPlotSpec& spec) {
+    if (BeginItemEx(label_id, Fitter1<Getter>(getter), spec, spec.FillColor, spec.Marker)) {
+        if (getter.Count < 2) {
+            EndItem();
+            return;
+        }
+        const ImPlotNextItemData& s = GetItemData();
+        const bool is_concave = ImHasFlag(spec.Flags, ImPlotPolygonFlags_Concave);
+
+        ImDrawList& draw_list = *GetPlotDrawList();
+        const ImPlotAxis& x_axis = GetCurrentPlot()->Axes[GetCurrentPlot()->CurrentX];
+        const ImPlotAxis& y_axis = GetCurrentPlot()->Axes[GetCurrentPlot()->CurrentY];
+        Transformer2 transformer(x_axis, y_axis);
+
+        // Flip points to make sure they are in counter-clockwise order for correct filling when one axis is inverted
+        bool x_inv = ImHasFlag(x_axis.Flags, ImPlotAxisFlags_Invert);
+        bool y_inv = ImHasFlag(y_axis.Flags, ImPlotAxisFlags_Invert);
+        bool flip = !((x_inv ? 1 : 0) ^ (y_inv ? 1 : 0));
+
+        // Transform all points to screen space
+        ImVec2* points = (ImVec2*)IM_ALLOC(getter.Count * sizeof(ImVec2));
+        for (int i = 0; i < getter.Count; ++i) {
+            ImPlotPoint p = flip ? getter[getter.Count - 1 - i] : getter[i];
+            points[i] = transformer(p);
+        }
+
+        if (s.RenderFill && getter.Count >= 3) {
+            const ImU32 col_fill = ImGui::GetColorU32(s.Spec.FillColor);
+            if (is_concave)
+                draw_list.AddConcavePolyFilled(points, getter.Count, col_fill);
+            else
+                draw_list.AddConvexPolyFilled(points, getter.Count, col_fill);
+        }
+        if (s.RenderLine && getter.Count >= 2) {
+            const ImU32 col_line = ImGui::GetColorU32(s.Spec.LineColor);
+#if IMGUI_VERSION_NUM < 19276
+            draw_list.AddPolyline(points, getter.Count, col_line, ImDrawFlags_Closed, s.Spec.LineWeight);
+#else
+            draw_list.AddPolyline(points, getter.Count, col_line, s.Spec.LineWeight, ImDrawFlags_Closed);
+#endif
+        }
+        IM_FREE(points);
+
+        EndItem();
+    }
+}
+
+template <typename T>
+void PlotPolygon(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec) {
+    GetterXY<IndexerIdx<T>,IndexerIdx<T>> getter(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerIdx<T>(ys,count,spec.Offset,Stride<T>(spec)),count);
+    return PlotPolygonEx(label_id, getter, spec);
+}
+
+#define INSTANTIATE_MACRO(T) \
+    template IMPLOT_API void PlotPolygon<T>(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotStairs
+//-----------------------------------------------------------------------------
+
+template <typename Getter>
+void PlotStairsEx(const char* label_id, const Getter& getter, const ImPlotSpec& spec) {
+    if (BeginItemEx(label_id, Fitter1<Getter>(getter), spec, spec.LineColor, spec.Marker)) {
+        if (getter.Count <= 0) {
+            EndItem();
+            return;
+        }
+        const ImPlotNextItemData& s = GetItemData();
+        if (getter.Count > 1) {
+            if (s.RenderFill && ImHasFlag(spec.Flags,ImPlotStairsFlags_Shaded)) {
+                const ImU32 col_fill = ImGui::GetColorU32(s.Spec.FillColor);
+                if (ImHasFlag(spec.Flags, ImPlotStairsFlags_PreStep)) {
+                    if (s.Spec.FillColors != nullptr) {
+                        GetterIdxColor color_getter(s.Spec.FillColors, getter.Count, s.Spec.FillAlpha);
+                        RenderPrimitives2<RendererStairsPreShaded>(getter, color_getter);
+                    } else {
+                        GetterConstColor color_getter(col_fill, s.Spec.FillAlpha);
+                        RenderPrimitives2<RendererStairsPreShaded>(getter, color_getter);
+                    }
+                } else {
+                    if (s.Spec.FillColors != nullptr) {
+                        GetterIdxColor color_getter(s.Spec.FillColors, getter.Count, s.Spec.FillAlpha);
+                        RenderPrimitives2<RendererStairsPostShaded>(getter, color_getter);
+                    } else {
+                        GetterConstColor color_getter(col_fill, s.Spec.FillAlpha);
+                        RenderPrimitives2<RendererStairsPostShaded>(getter, color_getter);
+                    }
+                }
+            }
+            if (s.RenderLine) {
+                const ImU32 col_line = ImGui::GetColorU32(s.Spec.LineColor);
+                if (ImHasFlag(spec.Flags, ImPlotStairsFlags_PreStep)) {
+                    if (s.Spec.LineColors != nullptr) {
+                        GetterIdxColor color_getter(s.Spec.LineColors, getter.Count);
+                        RenderPrimitives2<RendererStairsPre>(getter, color_getter, s.Spec.LineWeight);
+                    } else {
+                        GetterConstColor color_getter(col_line);
+                        RenderPrimitives2<RendererStairsPre>(getter, color_getter, s.Spec.LineWeight);
+                    }
+                } else {
+                    if (s.Spec.LineColors != nullptr) {
+                        GetterIdxColor color_getter(s.Spec.LineColors, getter.Count);
+                        RenderPrimitives2<RendererStairsPost>(getter, color_getter, s.Spec.LineWeight);
+                    } else {
+                        GetterConstColor color_getter(col_line);
+                        RenderPrimitives2<RendererStairsPost>(getter, color_getter, s.Spec.LineWeight);
+                    }
+                }
+            }
+        }
+        // render markers
+        if (s.RenderMarkers) {
+            PopPlotClipRect();
+            PushPlotClipRect(s.Spec.MarkerSize);
+            RenderColoredMarkers(getter, s);
+        }
+        EndItem();
+    }
+}
+
+template <typename T>
+void PlotStairs(const char* label_id, const T* values, int count, double xscale, double x0, const ImPlotSpec& spec) {
+    GetterXY<IndexerLin,IndexerIdx<T>> getter(IndexerLin(xscale,x0),IndexerIdx<T>(values,count,spec.Offset,Stride<T>(spec)),count);
+    PlotStairsEx(label_id, getter, spec);
+}
+
+template <typename T>
+void PlotStairs(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec) {
+    GetterXY<IndexerIdx<T>,IndexerIdx<T>> getter(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerIdx<T>(ys,count,spec.Offset,Stride<T>(spec)),count);
+    return PlotStairsEx(label_id, getter, spec);
+}
+
+#define INSTANTIATE_MACRO(T) \
+    template IMPLOT_API void PlotStairs<T> (const char* label_id, const T* values, int count, double xscale, double x0, const ImPlotSpec& spec); \
+    template IMPLOT_API void PlotStairs<T>(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+// custom
+void PlotStairsG(const char* label_id, ImPlotGetter getter_func, void* data, int count, const ImPlotSpec& spec) {
+    GetterFuncPtr getter(getter_func,data, count);
+    return PlotStairsEx(label_id, getter, spec);
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotShaded
+//-----------------------------------------------------------------------------
+
+template <typename Getter1, typename Getter2>
+void PlotShadedEx(const char* label_id, const Getter1& getter1, const Getter2& getter2, const ImPlotSpec& spec) {
+    if (BeginItemEx(label_id, Fitter2<Getter1,Getter2>(getter1,getter2), spec, spec.FillColor)) {
+        if (getter1.Count <= 0 || getter2.Count <= 0) {
+            EndItem();
+            return;
+        }
+        const ImPlotNextItemData& s = GetItemData();
+        if (s.RenderFill) {
+            if (s.Spec.FillColors != nullptr) {
+                GetterIdxColor color_getter(s.Spec.FillColors, getter1.Count, s.Spec.FillAlpha);
+                RenderPrimitives3<RendererShaded>(getter1,getter2,color_getter);
+            } else {
+                const ImU32 col = ImGui::GetColorU32(s.Spec.FillColor);
+                GetterConstColor color_getter(col, s.Spec.FillAlpha);
+                RenderPrimitives3<RendererShaded>(getter1,getter2,color_getter);
+            }
+        }
+        EndItem();
+    }
+}
+
+template <typename T>
+void PlotShaded(const char* label_id, const T* values, int count, double y_ref, double xscale, double x0, const ImPlotSpec& spec) {
+    if (!(y_ref > -DBL_MAX))
+        y_ref = GetPlotLimits(IMPLOT_AUTO,IMPLOT_AUTO).Y.Min;
+    if (!(y_ref < DBL_MAX))
+        y_ref = GetPlotLimits(IMPLOT_AUTO,IMPLOT_AUTO).Y.Max;
+    GetterXY<IndexerLin,IndexerIdx<T>> getter1(IndexerLin(xscale,x0),IndexerIdx<T>(values,count,spec.Offset,Stride<T>(spec)),count);
+    GetterXY<IndexerLin,IndexerConst>  getter2(IndexerLin(xscale,x0),IndexerConst(y_ref),count);
+    PlotShadedEx(label_id, getter1, getter2, spec);
+}
+
+template <typename T>
+void PlotShaded(const char* label_id, const T* xs, const T* ys, int count, double y_ref, const ImPlotSpec& spec) {
+    if (y_ref == -HUGE_VAL)
+        y_ref = GetPlotLimits(IMPLOT_AUTO,IMPLOT_AUTO).Y.Min;
+    if (y_ref == HUGE_VAL)
+        y_ref = GetPlotLimits(IMPLOT_AUTO,IMPLOT_AUTO).Y.Max;
+    GetterXY<IndexerIdx<T>,IndexerIdx<T>> getter1(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerIdx<T>(ys,count,spec.Offset,Stride<T>(spec)),count);
+    GetterXY<IndexerIdx<T>,IndexerConst>  getter2(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerConst(y_ref),count);
+    PlotShadedEx(label_id, getter1, getter2, spec);
+}
+
+
+template <typename T>
+void PlotShaded(const char* label_id, const T* xs, const T* ys1, const T* ys2, int count, const ImPlotSpec& spec) {
+    GetterXY<IndexerIdx<T>,IndexerIdx<T>> getter1(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerIdx<T>(ys1,count,spec.Offset,Stride<T>(spec)),count);
+    GetterXY<IndexerIdx<T>,IndexerIdx<T>> getter2(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerIdx<T>(ys2,count,spec.Offset,Stride<T>(spec)),count);
+    PlotShadedEx(label_id, getter1, getter2, spec);
+}
+
+#define INSTANTIATE_MACRO(T) \
+    template IMPLOT_API void PlotShaded<T>(const char* label_id, const T* values, int count, double y_ref, double xscale, double x0, const ImPlotSpec& spec); \
+    template IMPLOT_API void PlotShaded<T>(const char* label_id, const T* xs, const T* ys, int count, double y_ref, const ImPlotSpec& spec); \
+    template IMPLOT_API void PlotShaded<T>(const char* label_id, const T* xs, const T* ys1, const T* ys2, int count, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+// custom
+void PlotShadedG(const char* label_id, ImPlotGetter getter_func1, void* data1, ImPlotGetter getter_func2, void* data2, int count, const ImPlotSpec& spec) {
+    GetterFuncPtr getter1(getter_func1, data1, count);
+    GetterFuncPtr getter2(getter_func2, data2, count);
+    PlotShadedEx(label_id, getter1, getter2, spec);
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotBars
+//-----------------------------------------------------------------------------
+
+template <typename Getter1, typename Getter2>
+void PlotBarsVEx(const char* label_id, const Getter1& getter1, const Getter2 getter2, double width, const ImPlotSpec& spec) {
+    if (BeginItemEx(label_id, FitterBarV<Getter1,Getter2>(getter1,getter2,width), spec, spec.FillColor)) {
+        if (getter1.Count <= 0 || getter2.Count <= 0) {
+            EndItem();
+            return;
+        }
+        const ImPlotNextItemData& s = GetItemData();
+        const ImU32 col_fill = ImGui::GetColorU32(s.Spec.FillColor);
+        const ImU32 col_line = ImGui::GetColorU32(s.Spec.LineColor);
+        bool rend_fill = s.RenderFill;
+        bool rend_line = s.RenderLine;
+        if (rend_fill) {
+            if (s.Spec.FillColors != nullptr) {
+                GetterIdxColor fill_getter(s.Spec.FillColors, getter1.Count, s.Spec.FillAlpha);
+                RenderPrimitives3<RendererBarsFillV>(getter1, getter2, fill_getter, width);
+            } else {
+                GetterConstColor fill_getter(col_fill, s.Spec.FillAlpha);
+                RenderPrimitives3<RendererBarsFillV>(getter1, getter2, fill_getter, width);
+            }
+            if (rend_line && col_fill == col_line)
+                rend_line = false;
+        }
+        if (rend_line) {
+            if (s.Spec.LineColors != nullptr) {
+                GetterIdxColor line_getter(s.Spec.LineColors, getter1.Count);
+                RenderPrimitives3<RendererBarsLineV>(getter1, getter2, line_getter, width, s.Spec.LineWeight);
+            } else {
+                GetterConstColor line_getter(col_line);
+                RenderPrimitives3<RendererBarsLineV>(getter1, getter2, line_getter, width, s.Spec.LineWeight);
+            }
+        }
+        EndItem();
+    }
+}
+
+template <typename Getter1, typename Getter2>
+void PlotBarsHEx(const char* label_id, const Getter1& getter1, const Getter2& getter2, double height, const ImPlotSpec& spec) {
+    if (BeginItemEx(label_id, FitterBarH<Getter1,Getter2>(getter1,getter2,height), spec, spec.FillColor)) {
+        if (getter1.Count <= 0 || getter2.Count <= 0) {
+            EndItem();
+            return;
+        }
+        const ImPlotNextItemData& s = GetItemData();
+        const ImU32 col_fill = ImGui::GetColorU32(s.Spec.FillColor);
+        const ImU32 col_line = ImGui::GetColorU32(s.Spec.LineColor);
+        bool rend_fill = s.RenderFill;
+        bool rend_line = s.RenderLine;
+        if (rend_fill) {
+            if (s.Spec.FillColors != nullptr) {
+                GetterIdxColor fill_getter(s.Spec.FillColors, getter1.Count, s.Spec.FillAlpha);
+                RenderPrimitives3<RendererBarsFillH>(getter1, getter2, fill_getter, height);
+            } else {
+                GetterConstColor fill_getter(col_fill, s.Spec.FillAlpha);
+                RenderPrimitives3<RendererBarsFillH>(getter1, getter2, fill_getter, height);
+            }
+            if (rend_line && col_fill == col_line)
+                rend_line = false;
+        }
+        if (rend_line) {
+            if (s.Spec.LineColors != nullptr) {
+                GetterIdxColor line_getter(s.Spec.LineColors, getter1.Count);
+                RenderPrimitives3<RendererBarsLineH>(getter1, getter2, line_getter, height, s.Spec.LineWeight);
+            } else {
+                GetterConstColor line_getter(col_line);
+                RenderPrimitives3<RendererBarsLineH>(getter1, getter2, line_getter, height, s.Spec.LineWeight);
+            }
+        }
+        EndItem();
+    }
+}
+
+template <typename T>
+void PlotBars(const char* label_id, const T* values, int count, double bar_size, double shift, const ImPlotSpec& spec) {
+    if (ImHasFlag(spec.Flags, ImPlotBarsFlags_Horizontal)) {
+        GetterXY<IndexerIdx<T>,IndexerLin> getter1(IndexerIdx<T>(values,count,spec.Offset,Stride<T>(spec)),IndexerLin(1.0,shift),count);
+        GetterXY<IndexerConst,IndexerLin>  getter2(IndexerConst(0),IndexerLin(1.0,shift),count);
+        PlotBarsHEx(label_id, getter1, getter2, bar_size, spec);
+    }
+    else {
+        GetterXY<IndexerLin,IndexerIdx<T>> getter1(IndexerLin(1.0,shift),IndexerIdx<T>(values,count,spec.Offset,Stride<T>(spec)),count);
+        GetterXY<IndexerLin,IndexerConst>  getter2(IndexerLin(1.0,shift),IndexerConst(0),count);
+        PlotBarsVEx(label_id, getter1, getter2, bar_size, spec);
+    }
+}
+
+template <typename T>
+void PlotBars(const char* label_id, const T* xs, const T* ys, int count, double bar_size, const ImPlotSpec& spec) {
+    if (ImHasFlag(spec.Flags, ImPlotBarsFlags_Horizontal)) {
+        GetterXY<IndexerIdx<T>,IndexerIdx<T>> getter1(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerIdx<T>(ys,count,spec.Offset,Stride<T>(spec)),count);
+        GetterXY<IndexerConst, IndexerIdx<T>> getter2(IndexerConst(0),IndexerIdx<T>(ys,count,spec.Offset,Stride<T>(spec)),count);
+        PlotBarsHEx(label_id, getter1, getter2, bar_size, spec);
+    }
+    else {
+        GetterXY<IndexerIdx<T>,IndexerIdx<T>> getter1(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerIdx<T>(ys,count,spec.Offset,Stride<T>(spec)),count);
+        GetterXY<IndexerIdx<T>,IndexerConst>  getter2(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerConst(0),count);
+        PlotBarsVEx(label_id, getter1, getter2, bar_size, spec);
+    }
+}
+
+#define INSTANTIATE_MACRO(T) \
+    template IMPLOT_API void PlotBars<T>(const char* label_id, const T* values, int count, double bar_size, double shift, const ImPlotSpec& spec); \
+    template IMPLOT_API void PlotBars<T>(const char* label_id, const T* xs, const T* ys, int count, double bar_size, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+void PlotBarsG(const char* label_id, ImPlotGetter getter_func, void* data, int count, double bar_size, const ImPlotSpec& spec) {
+    if (ImHasFlag(spec.Flags, ImPlotBarsFlags_Horizontal)) {
+        GetterFuncPtr getter1(getter_func, data, count);
+        GetterOverrideX<GetterFuncPtr> getter2(getter1,0);
+        PlotBarsHEx(label_id, getter1, getter2, bar_size, spec);
+    }
+    else {
+        GetterFuncPtr getter1(getter_func, data, count);
+        GetterOverrideY<GetterFuncPtr> getter2(getter1,0);
+        PlotBarsVEx(label_id, getter1, getter2, bar_size, spec);
+    }
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotBarGroups
+//-----------------------------------------------------------------------------
+
+template <typename T>
+void PlotBarGroups(const char* const label_ids[], const T* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec) {
+    IndexerIdx<T> indexer(values,item_count*group_count,spec.Offset,Stride<T>(spec));
+    const bool horz = ImHasFlag(spec.Flags, ImPlotBarGroupsFlags_Horizontal);
+    const bool stack = ImHasFlag(spec.Flags, ImPlotBarGroupsFlags_Stacked);
+    ImPlotSpec spec_bars = spec;
+    spec_bars.Flags = 0;
+    if (stack) {
+        SetupLock();
+        ImPlotContext& gp = *GImPlot;
+        gp.TempDouble1.resize(4*group_count);
+        double* temp = gp.TempDouble1.Data;
+        double* neg =      &temp[0];
+        double* pos =      &temp[group_count];
+        double* curr_min = &temp[group_count*2];
+        double* curr_max = &temp[group_count*3];
+        for (int g = 0; g < group_count*2; ++g)
+            temp[g] = 0;
+        if (horz) {
+            for (int i = 0; i < item_count; ++i) {
+                if (!IsItemHidden(label_ids[i])) {
+                    for (int g = 0; g < group_count; ++g) {
+                        double v = indexer[i*group_count+g];
+                        if (v > 0) {
+                            curr_min[g] = pos[g];
+                            curr_max[g] = curr_min[g] + v;
+                            pos[g]      += v;
+                        }
+                        else {
+                            curr_max[g] = neg[g];
+                            curr_min[g] = curr_max[g] + v;
+                            neg[g]      += v;
+                        }
+                    }
+                }
+                GetterXY<IndexerIdx<double>,IndexerLin> getter1(IndexerIdx<double>(curr_min,group_count),IndexerLin(1.0,shift),group_count);
+                GetterXY<IndexerIdx<double>,IndexerLin> getter2(IndexerIdx<double>(curr_max,group_count),IndexerLin(1.0,shift),group_count);
+                PlotBarsHEx(label_ids[i],getter1,getter2,group_size,spec_bars);
+            }
+        }
+        else {
+            for (int i = 0; i < item_count; ++i) {
+                if (!IsItemHidden(label_ids[i])) {
+                    for (int g = 0; g < group_count; ++g) {
+                        double v = indexer[i*group_count+g];
+                        if (v > 0) {
+                            curr_min[g] = pos[g];
+                            curr_max[g] = curr_min[g] + v;
+                            pos[g]      += v;
+                        }
+                        else {
+                            curr_max[g] = neg[g];
+                            curr_min[g] = curr_max[g] + v;
+                            neg[g]      += v;
+                        }
+                    }
+                }
+                GetterXY<IndexerLin,IndexerIdx<double>> getter1(IndexerLin(1.0,shift),IndexerIdx<double>(curr_min,group_count),group_count);
+                GetterXY<IndexerLin,IndexerIdx<double>> getter2(IndexerLin(1.0,shift),IndexerIdx<double>(curr_max,group_count),group_count);
+                PlotBarsVEx(label_ids[i],getter1,getter2,group_size,spec_bars);
+            }
+        }
+    }
+    else {
+        const double subsize = group_size / item_count;
+        if (horz) {
+            spec_bars.Flags = ImPlotBarsFlags_Horizontal;
+            for (int i = 0; i < item_count; ++i) {
+                const double subshift = (i+0.5)*subsize - group_size/2;
+                PlotBars(label_ids[i],&values[i*group_count],group_count,subsize,subshift+shift,spec_bars);
+            }
+        }
+        else {
+            for (int i = 0; i < item_count; ++i) {
+                const double subshift = (i+0.5)*subsize - group_size/2;
+                PlotBars(label_ids[i],&values[i*group_count],group_count,subsize,subshift+shift,spec_bars);
+            }
+        }
+    }
+}
+
+#define INSTANTIATE_MACRO(T) template IMPLOT_API void PlotBarGroups<T>(const char* const label_ids[], const T* values, int items, int groups, double width, double shift, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotErrorBars
+//-----------------------------------------------------------------------------
+
+template <typename _GetterPos, typename _GetterNeg>
+void PlotErrorBarsVEx(const char* label_id, const _GetterPos& getter_pos, const _GetterNeg& getter_neg, const ImPlotSpec& spec) {
+    if (BeginItemEx(label_id, Fitter2<_GetterPos,_GetterNeg>(getter_pos, getter_neg), spec, IMPLOT_AUTO_COL)) {
+        if (getter_pos.Count <= 0 || getter_neg.Count <= 0) {
+            EndItem();
+            return;
+        }
+        const ImPlotNextItemData& s = GetItemData();
+        ImDrawList& draw_list = *GetPlotDrawList();
+        const ImU32 col = ImGui::GetColorU32( IsColorAuto(spec.LineColor) ? ImGui::GetStyleColorVec4(ImGuiCol_Text) : s.Spec.LineColor );
+        const bool rend_whisker  = s.Spec.Size > 0;
+        const float half_whisker = s.Spec.Size * 0.5f;
+        for (int i = 0; i < getter_pos.Count; ++i) {
+            ImVec2 p1 = PlotToPixels(getter_neg[i],IMPLOT_AUTO,IMPLOT_AUTO);
+            ImVec2 p2 = PlotToPixels(getter_pos[i],IMPLOT_AUTO,IMPLOT_AUTO);
+            draw_list.AddLine(p1, p2, col, s.Spec.LineWeight);
+            if (rend_whisker) {
+                AddLineH(&draw_list, p1.x - half_whisker, p1.x + half_whisker, p1.y, col, s.Spec.LineWeight);
+                AddLineH(&draw_list, p2.x - half_whisker, p2.x + half_whisker, p2.y, col, s.Spec.LineWeight);
+            }
+        }
+        EndItem();
+    }
+}
+
+template <typename _GetterPos, typename _GetterNeg>
+void PlotErrorBarsHEx(const char* label_id, const _GetterPos& getter_pos, const _GetterNeg& getter_neg, const ImPlotSpec& spec) {
+    if (BeginItemEx(label_id, Fitter2<_GetterPos,_GetterNeg>(getter_pos, getter_neg), spec, IMPLOT_AUTO_COL)) {
+        if (getter_pos.Count <= 0 || getter_neg.Count <= 0) {
+            EndItem();
+            return;
+        }
+        const ImPlotNextItemData& s = GetItemData();
+        ImDrawList& draw_list = *GetPlotDrawList();
+        const ImU32 col = ImGui::GetColorU32( IsColorAuto(spec.LineColor) ? ImGui::GetStyleColorVec4(ImGuiCol_Text) : s.Spec.LineColor );
+        const bool rend_whisker  = s.Spec.Size > 0;
+        const float half_whisker = s.Spec.Size * 0.5f;
+        for (int i = 0; i < getter_pos.Count; ++i) {
+            ImVec2 p1 = PlotToPixels(getter_neg[i],IMPLOT_AUTO,IMPLOT_AUTO);
+            ImVec2 p2 = PlotToPixels(getter_pos[i],IMPLOT_AUTO,IMPLOT_AUTO);
+            draw_list.AddLine(p1, p2, col, s.Spec.LineWeight);
+            if (rend_whisker) {
+                AddLineV(&draw_list, p1.x, p1.y - half_whisker, p1.y + half_whisker, col, s.Spec.LineWeight);
+                AddLineV(&draw_list, p2.x, p2.y - half_whisker, p2.y + half_whisker, col, s.Spec.LineWeight);
+            }
+        }
+        EndItem();
+    }
+}
+
+template <typename T>
+void PlotErrorBars(const char* label_id, const T* xs, const T* ys, const T* err, int count, const ImPlotSpec& spec) {
+    PlotErrorBars(label_id, xs, ys, err, err, count, spec);
+}
+
+template <typename T>
+void PlotErrorBars(const char* label_id, const T* xs, const T* ys, const T* neg, const T* pos, int count, const ImPlotSpec& spec) {
+    IndexerIdx<T> indexer_x(xs, count,spec.Offset,Stride<T>(spec));
+    IndexerIdx<T> indexer_y(ys, count,spec.Offset,Stride<T>(spec));
+    IndexerIdx<T> indexer_n(neg,count,spec.Offset,Stride<T>(spec));
+    IndexerIdx<T> indexer_p(pos,count,spec.Offset,Stride<T>(spec));
+    GetterError<T> getter(xs, ys, neg, pos, count, spec.Offset, Stride<T>(spec));
+    if (ImHasFlag(spec.Flags, ImPlotErrorBarsFlags_Horizontal)) {
+        IndexerAdd<IndexerIdx<T>,IndexerIdx<T>> indexer_xp(indexer_x, indexer_p, 1,  1);
+        IndexerAdd<IndexerIdx<T>,IndexerIdx<T>> indexer_xn(indexer_x, indexer_n, 1, -1);
+        GetterXY<IndexerAdd<IndexerIdx<T>,IndexerIdx<T>>,IndexerIdx<T>> getter_p(indexer_xp, indexer_y, count);
+        GetterXY<IndexerAdd<IndexerIdx<T>,IndexerIdx<T>>,IndexerIdx<T>> getter_n(indexer_xn, indexer_y, count);
+        PlotErrorBarsHEx(label_id, getter_p, getter_n, spec);
+    }
+    else {
+        IndexerAdd<IndexerIdx<T>,IndexerIdx<T>> indexer_yp(indexer_y, indexer_p, 1,  1);
+        IndexerAdd<IndexerIdx<T>,IndexerIdx<T>> indexer_yn(indexer_y, indexer_n, 1, -1);
+        GetterXY<IndexerIdx<T>,IndexerAdd<IndexerIdx<T>,IndexerIdx<T>>> getter_p(indexer_x, indexer_yp, count);
+        GetterXY<IndexerIdx<T>,IndexerAdd<IndexerIdx<T>,IndexerIdx<T>>> getter_n(indexer_x, indexer_yn, count);
+        PlotErrorBarsVEx(label_id, getter_p, getter_n, spec);
+    }
+}
+
+#define INSTANTIATE_MACRO(T) \
+    template IMPLOT_API void PlotErrorBars<T>(const char* label_id, const T* xs, const T* ys, const T* err, int count, const ImPlotSpec& spec); \
+    template IMPLOT_API void PlotErrorBars<T>(const char* label_id, const T* xs, const T* ys, const T* neg, const T* pos, int count, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotStems
+//-----------------------------------------------------------------------------
+
+template <typename _GetterM, typename _GetterB>
+void PlotStemsEx(const char* label_id, const _GetterM& getter_mark, const _GetterB& getter_base, const ImPlotSpec& spec) {
+    if (BeginItemEx(label_id, Fitter2<_GetterM,_GetterB>(getter_mark,getter_base), spec, spec.LineColor, spec.Marker)) {
+        if (getter_mark.Count <= 0 || getter_base.Count <= 0) {
+            EndItem();
+            return;
+        }
+        const ImPlotNextItemData& s = GetItemData();
+        // render stems
+        if (s.RenderLine) {
+            const ImU32 col_line = ImGui::GetColorU32(s.Spec.LineColor);
+            if (s.Spec.LineColors != nullptr) {
+                GetterIdxColor color_getter(s.Spec.LineColors, getter_mark.Count);
+                RenderPrimitives3<RendererLineSegments2>(getter_mark, getter_base, color_getter, s.Spec.LineWeight);
+            } else {
+                GetterConstColor color_getter(col_line);
+                RenderPrimitives3<RendererLineSegments2>(getter_mark, getter_base, color_getter, s.Spec.LineWeight);
+            }
+        }
+        // render markers
+        if (s.RenderMarkers) {
+            PopPlotClipRect();
+            PushPlotClipRect(s.Spec.MarkerSize);
+            RenderColoredMarkers(getter_mark, s);
+        }
+        EndItem();
+    }
+}
+
+template <typename T>
+void PlotStems(const char* label_id, const T* values, int count, double ref, double scale, double start, const ImPlotSpec& spec) {
+    if (ImHasFlag(spec.Flags, ImPlotStemsFlags_Horizontal)) {
+        GetterXY<IndexerIdx<T>,IndexerLin> get_mark(IndexerIdx<T>(values,count,spec.Offset,Stride<T>(spec)),IndexerLin(scale,start),count);
+        GetterXY<IndexerConst,IndexerLin>  get_base(IndexerConst(ref),IndexerLin(scale,start),count);
+        PlotStemsEx(label_id, get_mark, get_base, spec);
+    }
+    else {
+        GetterXY<IndexerLin,IndexerIdx<T>> get_mark(IndexerLin(scale,start),IndexerIdx<T>(values,count,spec.Offset,Stride<T>(spec)),count);
+        GetterXY<IndexerLin,IndexerConst>  get_base(IndexerLin(scale,start),IndexerConst(ref),count);
+        PlotStemsEx(label_id, get_mark, get_base, spec);
+    }
+}
+
+template <typename T>
+void PlotStems(const char* label_id, const T* xs, const T* ys, int count, double ref, const ImPlotSpec& spec) {
+    if (ImHasFlag(spec.Flags, ImPlotStemsFlags_Horizontal)) {
+        GetterXY<IndexerIdx<T>,IndexerIdx<T>> get_mark(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerIdx<T>(ys,count,spec.Offset,Stride<T>(spec)),count);
+        GetterXY<IndexerConst,IndexerIdx<T>>  get_base(IndexerConst(ref),IndexerIdx<T>(ys,count,spec.Offset,Stride<T>(spec)),count);
+        PlotStemsEx(label_id, get_mark, get_base, spec);
+    }
+    else {
+        GetterXY<IndexerIdx<T>,IndexerIdx<T>> get_mark(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerIdx<T>(ys,count,spec.Offset,Stride<T>(spec)),count);
+        GetterXY<IndexerIdx<T>,IndexerConst>  get_base(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerConst(ref),count);
+        PlotStemsEx(label_id, get_mark, get_base, spec);
+    }
+}
+
+#define INSTANTIATE_MACRO(T) \
+    template IMPLOT_API void PlotStems<T>(const char* label_id, const T* values, int count, double ref, double scale, double start, const ImPlotSpec& spec); \
+    template IMPLOT_API void PlotStems<T>(const char* label_id, const T* xs, const T* ys, int count, double ref, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotInfLines
+//-----------------------------------------------------------------------------
+
+template <typename T>
+void PlotInfLines(const char* label_id, const T* values, int count, const ImPlotSpec& spec) {
+    const ImPlotRect lims = GetPlotLimits(IMPLOT_AUTO,IMPLOT_AUTO);
+    if (ImHasFlag(spec.Flags, ImPlotInfLinesFlags_Horizontal)) {
+        GetterXY<IndexerConst,IndexerIdx<T>> getter_min(IndexerConst(lims.X.Min),IndexerIdx<T>(values,count,spec.Offset,Stride<T>(spec)),count);
+        GetterXY<IndexerConst,IndexerIdx<T>> getter_max(IndexerConst(lims.X.Max),IndexerIdx<T>(values,count,spec.Offset,Stride<T>(spec)),count);
+        if (BeginItemEx(label_id, FitterY<GetterXY<IndexerConst,IndexerIdx<T>>>(getter_min), spec, spec.LineColor)) {
+            if (count <= 0) {
+                EndItem();
+                return;
+            }
+            const ImPlotNextItemData& s = GetItemData();
+            const ImU32 col_line = ImGui::GetColorU32(s.Spec.LineColor);
+            if (s.RenderLine) {
+                if (s.Spec.LineColors != nullptr) {
+                    GetterIdxColor color_getter(s.Spec.LineColors, count);
+                    RenderPrimitives3<RendererLineSegments2>(getter_min, getter_max, color_getter, s.Spec.LineWeight);
+                } else {
+                    GetterConstColor color_getter(col_line);
+                    RenderPrimitives3<RendererLineSegments2>(getter_min, getter_max, color_getter, s.Spec.LineWeight);
+                }
+            }
+            EndItem();
+        }
+    }
+    else {
+        GetterXY<IndexerIdx<T>,IndexerConst> get_min(IndexerIdx<T>(values,count,spec.Offset,Stride<T>(spec)),IndexerConst(lims.Y.Min),count);
+        GetterXY<IndexerIdx<T>,IndexerConst> get_max(IndexerIdx<T>(values,count,spec.Offset,Stride<T>(spec)),IndexerConst(lims.Y.Max),count);
+        if (BeginItemEx(label_id, FitterX<GetterXY<IndexerIdx<T>,IndexerConst>>(get_min), spec, spec.LineColor)) {
+            if (count <= 0) {
+                EndItem();
+                return;
+            }
+            const ImPlotNextItemData& s = GetItemData();
+            const ImU32 col_line = ImGui::GetColorU32(s.Spec.LineColor);
+            if (s.RenderLine) {
+                if (s.Spec.LineColors != nullptr) {
+                    GetterIdxColor color_getter(s.Spec.LineColors, count);
+                    RenderPrimitives3<RendererLineSegments2>(get_min, get_max, color_getter, s.Spec.LineWeight);
+                } else {
+                    GetterConstColor color_getter(col_line);
+                    RenderPrimitives3<RendererLineSegments2>(get_min, get_max, color_getter, s.Spec.LineWeight);
+                }
+            }
+            EndItem();
+        }
+    }
+}
+#define INSTANTIATE_MACRO(T) template IMPLOT_API void PlotInfLines<T>(const char* label_id, const T* xs, int count, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotPieChart
+//-----------------------------------------------------------------------------
+
+IMPLOT_INLINE void PrimPieSliceFill(ImDrawList& draw_list, const ImVec2* points, int count, ImU32 col, const ImVec2& uv) {
+    // Write vertices
+    for (int i = 0; i < count; ++i) {
+        draw_list._VtxWritePtr[i].pos = points[i];
+        draw_list._VtxWritePtr[i].uv = uv;
+        draw_list._VtxWritePtr[i].col = col;
+    }
+    draw_list._VtxWritePtr += count;
+
+    // Write indices as a triangle fan (all triangles share first vertex - the center)
+    for (int i = 2; i < count; ++i) {
+        draw_list._IdxWritePtr[0] = (ImDrawIdx)(draw_list._VtxCurrentIdx);
+        draw_list._IdxWritePtr[1] = (ImDrawIdx)(draw_list._VtxCurrentIdx + i - 1);
+        draw_list._IdxWritePtr[2] = (ImDrawIdx)(draw_list._VtxCurrentIdx + i);
+        draw_list._IdxWritePtr += 3;
+    }
+    draw_list._VtxCurrentIdx += count;
+}
+
+IMPLOT_INLINE void PrimPieSliceLine(ImDrawList& draw_list, const ImVec2* points, int count, ImU32 col, float half_weight, const ImVec2& tex_uv0, const ImVec2& tex_uv1) {
+    // Create a thick polyline by drawing quads between each segment
+    const int segments = count - 1;
+
+    for (int i = 0; i < segments; ++i) {
+        const ImVec2& p1 = points[i];
+        const ImVec2& p2 = points[i + 1];
+
+        // Calculate perpendicular vector for line thickness (same as PrimLine)
+        float dx = p2.x - p1.x;
+        float dy = p2.y - p1.y;
+        IMPLOT_NORMALIZE2F_OVER_ZERO(dx, dy);
+        dx *= half_weight;
+        dy *= half_weight;
+
+        // Four vertices for the quad (same layout as PrimLine)
+        draw_list._VtxWritePtr[0].pos.x = p1.x + dy;
+        draw_list._VtxWritePtr[0].pos.y = p1.y - dx;
+        draw_list._VtxWritePtr[0].uv = tex_uv0;
+        draw_list._VtxWritePtr[0].col = col;
+
+        draw_list._VtxWritePtr[1].pos.x = p2.x + dy;
+        draw_list._VtxWritePtr[1].pos.y = p2.y - dx;
+        draw_list._VtxWritePtr[1].uv = tex_uv0;
+        draw_list._VtxWritePtr[1].col = col;
+
+        draw_list._VtxWritePtr[2].pos.x = p2.x - dy;
+        draw_list._VtxWritePtr[2].pos.y = p2.y + dx;
+        draw_list._VtxWritePtr[2].uv = tex_uv1;
+        draw_list._VtxWritePtr[2].col = col;
+
+        draw_list._VtxWritePtr[3].pos.x = p1.x - dy;
+        draw_list._VtxWritePtr[3].pos.y = p1.y + dx;
+        draw_list._VtxWritePtr[3].uv = tex_uv1;
+        draw_list._VtxWritePtr[3].col = col;
+
+        draw_list._VtxWritePtr += 4;
+
+        // Two triangles for the quad
+        const ImDrawIdx vtx_idx = (ImDrawIdx)(draw_list._VtxCurrentIdx);
+        draw_list._IdxWritePtr[0] = vtx_idx;
+        draw_list._IdxWritePtr[1] = vtx_idx + 1;
+        draw_list._IdxWritePtr[2] = vtx_idx + 2;
+        draw_list._IdxWritePtr[3] = vtx_idx;
+        draw_list._IdxWritePtr[4] = vtx_idx + 2;
+        draw_list._IdxWritePtr[5] = vtx_idx + 3;
+        draw_list._IdxWritePtr += 6;
+
+        draw_list._VtxCurrentIdx += 4;
+    }
+}
+
+IMPLOT_INLINE void RenderPieSliceFill(ImDrawList& draw_list, ImVec2* buffer, int count, ImU32 col) {
+    const ImVec2 uv = draw_list._Data->TexUvWhitePixel;
+    // Reserve space for vertices and indices
+    // Triangle fan: n-2 triangles for n vertices, so (n-2)*3 indices
+    const int idx_count = (count - 2) * 3;
+    draw_list.PrimReserve(idx_count, count);
+    PrimPieSliceFill(draw_list, buffer, count, col, uv);
+}
+
+IMPLOT_INLINE void RenderPieSliceLine(ImDrawList& draw_list, ImVec2* buffer, int count, ImU32 col) {
+    float half_weight = 1.0f;  // Weight of 2.0f -> half_weight of 1.0f
+    ImVec2 tex_uv0, tex_uv1;
+    GetLineRenderProps(draw_list, half_weight, tex_uv0, tex_uv1);
+
+    // Polyline with n points has n-1 segments, each needs 4 vertices and 6 indices
+    const int segments = count - 1;
+    const int vtx_count = segments * 4;
+    const int idx_count = segments * 6;
+    draw_list.PrimReserve(idx_count, vtx_count);
+    PrimPieSliceLine(draw_list, buffer, count, col, half_weight, tex_uv0, tex_uv1);
+}
+
+IMPLOT_INLINE void RenderPieSlice(ImDrawList& draw_list, const ImPlotPoint& center, double radius, double a0, double a1, ImU32 col, ImPlotPieChartFlags flags, bool detached = false) {
+    const float resolution = 50 / (2 * IM_PI);
+    ImVec2 buffer[52];
+
+    int n = ImMax(3, (int)((a1 - a0) * resolution));
+    double da = (a1 - a0) / (n - 1);
+    int i = 0;
+
+    if (detached) {
+        const double offset = 0.08; // Offset of the detached slice
+        const double width_scale = 0.95; // Scale factor for the width of the detached slice
+
+        double a_mid = (a0 + a1) / 2;
+        double new_a0 = a_mid - (a1 - a0) * width_scale / 2;
+        double new_a1 = a_mid + (a1 - a0) * width_scale / 2;
+        double new_da = (new_a1 - new_a0) / (n - 1);
+
+        ImPlotPoint offsetCenter(center.x + offset * cos(a_mid), center.y + offset * sin(a_mid));
+
+        // Start point (center of the offset)
+        buffer[0] = PlotToPixels(offsetCenter, IMPLOT_AUTO, IMPLOT_AUTO);
+
+        for (; i < n; ++i) {
+            double a = new_a0 + i * new_da;
+            buffer[i + 1] = PlotToPixels(
+                offsetCenter.x + (radius + offset/2) * cos(a),
+                offsetCenter.y + (radius + offset/2) * sin(a),
+                IMPLOT_AUTO, IMPLOT_AUTO
+            );
+        }
+
+    } else {
+        buffer[0] = PlotToPixels(center, IMPLOT_AUTO, IMPLOT_AUTO);
+        for (; i < n; ++i) {
+            double a = a0 + i * da;
+            buffer[i + 1] = PlotToPixels(
+                center.x + radius * cos(a),
+                center.y + radius * sin(a),
+                IMPLOT_AUTO, IMPLOT_AUTO);
+        }
+    }
+    // Close the shape
+    buffer[i + 1] = buffer[0];
+
+    // fill
+    RenderPieSliceFill(draw_list, buffer, n + 2, col);
+
+    // border (for AA)
+    if (!ImHasFlag(flags, ImPlotPieChartFlags_NoSliceBorder))
+        RenderPieSliceLine(draw_list, buffer, n + 2, col);
+}
+
+template <typename T>
+double PieChartSum(IndexerIdx<T> indexer, bool ignore_hidden) {
+    double sum = 0;
+    if (ignore_hidden) {
+        ImPlotContext& gp = *GImPlot;
+        ImPlotItemGroup& Items = *gp.CurrentItems;
+        for (int i = 0; i < indexer.Count; ++i) {
+            if (i >= Items.GetItemCount())
+                break;
+
+            ImPlotItem* item = Items.GetItemByIndex(i);
+            IM_ASSERT(item != nullptr);
+            if (item->Show) {
+                sum += (double)indexer[i];
+            }
+        }
+    }
+    else {
+        for (int i = 0; i < indexer.Count; ++i) {
+            sum += (double)indexer[i];
+        }
+    }
+    return sum;
+}
+
+template <typename T>
+void PlotPieChartEx(const char* const label_ids[], IndexerIdx<T> indexer, ImPlotPoint center, double radius, double angle0, const ImPlotSpec& spec) {
+    ImDrawList& draw_list  = *GetPlotDrawList();
+
+    const bool ignore_hidden = ImHasFlag(spec.Flags, ImPlotPieChartFlags_IgnoreHidden);
+    const double sum         = PieChartSum(indexer, ignore_hidden);
+    const bool normalize     = ImHasFlag(spec.Flags, ImPlotPieChartFlags_Normalize) || sum > 1.0;
+
+    double a0 = angle0 * 2 * IM_PI / 360.0;
+    double a1 = angle0 * 2 * IM_PI / 360.0;
+    ImPlotPoint Pmin = ImPlotPoint(center.x - radius, center.y - radius);
+    ImPlotPoint Pmax = ImPlotPoint(center.x + radius, center.y + radius);
+    for (int i = 0; i < indexer.Count; ++i) {
+        ImPlotItem* item = GetItem(label_ids[i]);
+
+        const double percent = normalize ? (double)indexer[i] / sum : (double)indexer[i];
+        const bool skip      = sum <= 0.0 || (ignore_hidden && item != nullptr && !item->Show);
+        if (!skip)
+            a1 = a0 + 2 * IM_PI * percent;
+
+        if (BeginItemEx(label_ids[i], FitterRect(Pmin, Pmax), spec)) {
+            const bool hovered = ImPlot::IsLegendEntryHovered(label_ids[i]) && ImHasFlag(spec.Flags, ImPlotPieChartFlags_Exploding);
+            if (sum > 0.0) {
+                ImU32 col = GetCurrentItem()->Color;
+                if (percent < 0.5) {
+                    RenderPieSlice(draw_list, center, radius, a0, a1, col, spec.Flags, hovered);
+                }
+                else {
+                    RenderPieSlice(draw_list, center, radius, a0, a0 + (a1 - a0) * 0.5, col, spec.Flags, hovered);
+                    RenderPieSlice(draw_list, center, radius, a0 + (a1 - a0) * 0.5, a1, col, spec.Flags, hovered);
+                }
+            }
+            EndItem();
+        }
+        if (!skip)
+            a0 = a1;
+    }
+}
+
+int PieChartFormatter(double value, char* buff, int size, void* data) {
+    const char* fmt = (const char*)data;
+    return snprintf(buff, size, fmt, value);
+}
+
+template <typename T>
+void PlotPieChart(const char* const label_ids[], const T* values, int count, double x, double y, double radius, const char* fmt, double angle0, const ImPlotSpec& spec) {
+    PlotPieChart<T>(label_ids, values, count, x, y, radius, PieChartFormatter, (void*)fmt, angle0, spec);
+}
+#define INSTANTIATE_MACRO(T) template IMPLOT_API void PlotPieChart<T>(const char* const label_ids[], const T* values, int count, double x, double y, double radius, const char* fmt, double angle0, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+template <typename T>
+void PlotPieChart(const char* const label_ids[], const T* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec) {
+    IM_ASSERT_USER_ERROR(GImPlot->CurrentPlot != nullptr, "PlotPieChart() needs to be called between BeginPlot() and EndPlot()!");
+    ImDrawList& draw_list = *GetPlotDrawList();
+
+    IndexerIdx<T> indexer(values,count,spec.Offset,Stride<T>(spec));
+
+    const bool ignore_hidden = ImHasFlag(spec.Flags, ImPlotPieChartFlags_IgnoreHidden);
+    const double sum = PieChartSum(indexer, ignore_hidden);
+    const bool normalize = ImHasFlag(spec.Flags, ImPlotPieChartFlags_Normalize) || sum > 1.0;
+    ImPlotPoint center(x, y);
+
+    PushPlotClipRect();
+    PlotPieChartEx(label_ids, indexer, center, radius, angle0, spec);
+    if (fmt != nullptr) {
+        double a0 = angle0 * 2 * IM_PI / 360.0;
+        double a1 = angle0 * 2 * IM_PI / 360.0;
+        char buffer[32];
+        for (int i = 0; i < count; ++i) {
+            ImPlotItem* item = GetItem(label_ids[i]);
+            IM_ASSERT(item != nullptr);
+
+            const double percent = normalize ? (double)indexer[i] / sum : (double)indexer[i];
+            const bool skip = ignore_hidden && item != nullptr && !item->Show;
+
+            if (!skip) {
+                a1 = a0 + 2 * IM_PI * percent;
+                if (item->Show) {
+                    fmt((double)indexer[i], buffer, 32, fmt_data);
+                    ImVec2 size = ImGui::CalcTextSize(buffer);
+                    double angle = a0 + (a1 - a0) * 0.5;
+                    const bool hovered = ImPlot::IsLegendEntryHovered(label_ids[i]) && ImHasFlag(spec.Flags, ImPlotPieChartFlags_Exploding);
+                    const double offset = (hovered ? 0.6 : 0.5) * radius;
+                    ImVec2 pos = PlotToPixels(center.x + offset * cos(angle), center.y + offset * sin(angle), IMPLOT_AUTO, IMPLOT_AUTO);
+                    ImU32 col = CalcTextColor(ImGui::ColorConvertU32ToFloat4(item->Color));
+                    draw_list.AddText(pos - size * 0.5f, col, buffer);
+                }
+                a0 = a1;
+            }
+        }
+    }
+    PopPlotClipRect();
+}
+#define INSTANTIATE_MACRO(T) template IMPLOT_API void PlotPieChart(const char* const label_ids[], const T* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotHeatmap
+//-----------------------------------------------------------------------------
+
+template <typename _Indexer>
+struct GetterHeatmapRowMaj {
+    GetterHeatmapRowMaj(_Indexer indexer, int rows, int cols, double scale_min, double scale_max, double width, double height, double xref, double yref, double ydir) :
+        Indexer(indexer),
+        Count(rows*cols),
+        Rows(rows),
+        Cols(cols),
+        ScaleMin(scale_min),
+        ScaleMax(scale_max),
+        Width(width),
+        Height(height),
+        XRef(xref),
+        YRef(yref),
+        YDir(ydir),
+        HalfSize(Width*0.5, Height*0.5)
+    { }
+    template <typename I> IMPLOT_INLINE RectC operator[](I idx) const {
+        double val = (double)Indexer[idx];
+        const int r = idx / Cols;
+        const int c = idx % Cols;
+        const ImPlotPoint p(XRef + HalfSize.x + c*Width, YRef + YDir * (HalfSize.y + r*Height));
+        RectC rect;
+        rect.Pos = p;
+        rect.HalfSize = HalfSize;
+        const float t = ImClamp((float)ImRemap01(val, ScaleMin, ScaleMax),0.0f,1.0f);
+        ImPlotContext& gp = *GImPlot;
+        rect.Color = gp.ColormapData.LerpTable(gp.Style.Colormap, t);
+        return rect;
+    }
+    const _Indexer Indexer;
+    const int Count, Rows, Cols;
+    const double ScaleMin, ScaleMax, Width, Height, XRef, YRef, YDir;
+    const ImPlotPoint HalfSize;
+    typedef RectC value_type;
+};
+
+template <typename _Indexer>
+struct GetterHeatmapColMaj {
+    GetterHeatmapColMaj(_Indexer indexer, int rows, int cols, double scale_min, double scale_max, double width, double height, double xref, double yref, double ydir) :
+        Indexer(indexer),
+        Count(rows*cols),
+        Rows(rows),
+        Cols(cols),
+        ScaleMin(scale_min),
+        ScaleMax(scale_max),
+        Width(width),
+        Height(height),
+        XRef(xref),
+        YRef(yref),
+        YDir(ydir),
+        HalfSize(Width*0.5, Height*0.5)
+    { }
+    template <typename I> IMPLOT_INLINE RectC operator[](I idx) const {
+        double val = (double)Indexer[idx];
+        const int r = idx % Rows;
+        const int c = idx / Rows;
+        const ImPlotPoint p(XRef + HalfSize.x + c*Width, YRef + YDir * (HalfSize.y + r*Height));
+        RectC rect;
+        rect.Pos = p;
+        rect.HalfSize = HalfSize;
+        const float t = ImClamp((float)ImRemap01(val, ScaleMin, ScaleMax),0.0f,1.0f);
+        ImPlotContext& gp = *GImPlot;
+        rect.Color = gp.ColormapData.LerpTable(gp.Style.Colormap, t);
+        return rect;
+    }
+    // const T* const Values;
+    const _Indexer Indexer;
+    const int Count, Rows, Cols;
+    const double ScaleMin, ScaleMax, Width, Height, XRef, YRef, YDir;
+    const ImPlotPoint HalfSize;
+    typedef RectC value_type;
+};
+
+template <typename T>
+void RenderHeatmap(ImDrawList& draw_list, IndexerIdx<T> indexer, int rows, int cols, double scale_min, double scale_max, const char* fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, bool reverse_y, bool col_maj) {
+    ImPlotContext& gp = *GImPlot;
+    Transformer2 transformer;
+    if (scale_min == 0 && scale_max == 0) {
+        ImMinMaxIndexer(indexer,rows*cols,&scale_min,&scale_max);
+    }
+    if (scale_min == scale_max) {
+        ImVec2 a = transformer(bounds_min);
+        ImVec2 b = transformer(bounds_max);
+        ImU32  col = GetColormapColorU32(0,gp.Style.Colormap);
+        draw_list.AddRectFilled(a, b, col);
+        return;
+    }
+    const double yref = reverse_y ? bounds_max.y : bounds_min.y;
+    const double ydir = reverse_y ? -1 : 1;
+    if (col_maj) {
+        GetterHeatmapColMaj<IndexerIdx<T>> getter(indexer, rows, cols, scale_min, scale_max, (bounds_max.x - bounds_min.x) / cols, (bounds_max.y - bounds_min.y) / rows, bounds_min.x, yref, ydir);
+        RenderPrimitives1<RendererRectC>(getter);
+    }
+    else {
+        GetterHeatmapRowMaj<IndexerIdx<T>> getter(indexer, rows, cols, scale_min, scale_max, (bounds_max.x - bounds_min.x) / cols, (bounds_max.y - bounds_min.y) / rows, bounds_min.x, yref, ydir);
+        RenderPrimitives1<RendererRectC>(getter);
+    }
+    // labels
+    if (fmt != nullptr) {
+        const double w = (bounds_max.x - bounds_min.x) / cols;
+        const double h = (bounds_max.y - bounds_min.y) / rows;
+        const ImPlotPoint half_size(w*0.5,h*0.5);
+        int i = 0;
+        if (col_maj) {
+            for (int c = 0; c < cols; ++c) {
+                for (int r = 0; r < rows; ++r) {
+                    ImPlotPoint p;
+                    p.x = bounds_min.x + 0.5*w + c*w;
+                    p.y = yref + ydir * (0.5*h + r*h);
+                    ImVec2 px = transformer(p);
+                    char buff[32];
+                    ImFormatString(buff, 32, fmt, indexer[i]);
+                    ImVec2 size = ImGui::CalcTextSize(buff);
+                    double t = ImClamp(ImRemap01((double)indexer[i], scale_min, scale_max),0.0,1.0);
+                    ImVec4 color = SampleColormap((float)t);
+                    ImU32 col = CalcTextColor(color);
+                    draw_list.AddText(px - size * 0.5f, col, buff);
+                    i++;
+                }
+            }
+        }
+        else {
+            for (int r = 0; r < rows; ++r) {
+                for (int c = 0; c < cols; ++c) {
+                    ImPlotPoint p;
+                    p.x = bounds_min.x + 0.5*w + c*w;
+                    p.y = yref + ydir * (0.5*h + r*h);
+                    ImVec2 px = transformer(p);
+                    char buff[32];
+                    ImFormatString(buff, 32, fmt, indexer[i]);
+                    ImVec2 size = ImGui::CalcTextSize(buff);
+                    double t = ImClamp(ImRemap01((double)indexer[i], scale_min, scale_max),0.0,1.0);
+                    ImVec4 color = SampleColormap((float)t);
+                    ImU32 col = CalcTextColor(color);
+                    draw_list.AddText(px - size * 0.5f, col, buff);
+                    i++;
+                }
+            }
+        }
+    }
+}
+
+template <typename T>
+void PlotHeatmap(const char* label_id, const T* values, int rows, int cols, double scale_min, double scale_max, const char* fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec) {
+    if (BeginItemEx(label_id, FitterRect(bounds_min, bounds_max), spec)) {
+        if (rows <= 0 || cols <= 0) {
+            EndItem();
+            return;
+        }
+        ImDrawList& draw_list = *GetPlotDrawList();
+        const bool col_maj = ImHasFlag(spec.Flags, ImPlotHeatmapFlags_ColMajor);
+        IndexerIdx<T> indexer(values,rows*cols,spec.Offset,Stride<T>(spec));
+        RenderHeatmap(draw_list, indexer, rows, cols, scale_min, scale_max, fmt, bounds_min, bounds_max, true, col_maj);
+        EndItem();
+    }
+}
+#define INSTANTIATE_MACRO(T) template IMPLOT_API void PlotHeatmap<T>(const char* label_id, const T* values, int rows, int cols, double scale_min, double scale_max, const char* fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotHistogram
+//-----------------------------------------------------------------------------
+
+template <typename T>
+double PlotHistogram(const char* label_id, const T* values, int count, int bins, double bar_scale, ImPlotRange range, const ImPlotSpec& spec) {
+
+    const bool cumulative = ImHasFlag(spec.Flags, ImPlotHistogramFlags_Cumulative);
+    const bool density    = ImHasFlag(spec.Flags, ImPlotHistogramFlags_Density);
+    const bool outliers   = !ImHasFlag(spec.Flags, ImPlotHistogramFlags_NoOutliers);
+
+    IndexerIdx<T> indexer(values,count,spec.Offset,Stride<T>(spec));
+
+    if (count <= 0 || bins == 0)
+        return 0;
+
+    if (range.Min == 0 && range.Max == 0) {
+        ImMinMaxIndexer(indexer, count, &range.Min, &range.Max);
+    }
+
+    double width;
+    if (bins < 0)
+        CalculateBins(indexer, count, bins, range, bins, width);
+    else
+        width = range.Size() / bins;
+
+    ImPlotContext& gp = *GImPlot;
+    ImVector<double>& bin_centers = gp.TempDouble1;
+    ImVector<double>& bin_counts  = gp.TempDouble2;
+    bin_centers.resize(bins);
+    bin_counts.resize(bins);
+    int below = 0;
+
+    for (int b = 0; b < bins; ++b) {
+        bin_centers[b] = range.Min + b * width + width * 0.5;
+        bin_counts[b] = 0;
+    }
+    int counted = 0;
+    double max_count = 0;
+    for (int i = 0; i < count; ++i) {
+        double val = indexer[i];
+        if (range.Contains(val)) {
+            const int b = ImClamp((int)((val - range.Min) / width), 0, bins - 1);
+            bin_counts[b] += 1.0;
+            if (bin_counts[b] > max_count)
+                max_count = bin_counts[b];
+            counted++;
+        }
+        else if (val < range.Min) {
+            below++;
+        }
+    }
+    if (cumulative && density) {
+        if (outliers)
+            bin_counts[0] += below;
+        for (int b = 1; b < bins; ++b)
+            bin_counts[b] += bin_counts[b-1];
+        double scale = 1.0 / (outliers ? count : counted);
+        for (int b = 0; b < bins; ++b)
+            bin_counts[b] *= scale;
+        max_count = bin_counts[bins-1];
+    }
+    else if (cumulative) {
+        if (outliers)
+            bin_counts[0] += below;
+        for (int b = 1; b < bins; ++b)
+            bin_counts[b] += bin_counts[b-1];
+        max_count = bin_counts[bins-1];
+    }
+    else if (density) {
+        double scale = 1.0 / ((outliers ? count : counted) * width);
+        for (int b = 0; b < bins; ++b)
+            bin_counts[b] *= scale;
+        max_count *= scale;
+    }
+    ImPlotSpec spec_bars = spec;
+    if (ImHasFlag(spec.Flags, ImPlotHistogramFlags_Horizontal)) {
+        spec_bars.Flags = ImPlotBarsFlags_Horizontal;
+        PlotBars(label_id, &bin_counts.Data[0], &bin_centers.Data[0], bins, bar_scale*width, spec_bars);
+    }
+    else {
+        spec_bars.Flags = 0;
+        PlotBars(label_id, &bin_centers.Data[0], &bin_counts.Data[0], bins, bar_scale*width, spec_bars);
+    }
+    return max_count;
+}
+#define INSTANTIATE_MACRO(T) template IMPLOT_API double PlotHistogram<T>(const char* label_id, const T* values, int count, int bins, double bar_scale, ImPlotRange range, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotHistogram2D
+//-----------------------------------------------------------------------------
+
+template <typename T>
+double PlotHistogram2D(const char* label_id, const T* xs, const T* ys, int count, int x_bins, int y_bins, ImPlotRect range, const ImPlotSpec& spec) {
+
+    // const bool cumulative = ImHasFlag(flags, ImPlotHistogramFlags_Cumulative); NOT SUPPORTED
+    const bool density  = ImHasFlag(spec.Flags, ImPlotHistogramFlags_Density);
+    const bool outliers = !ImHasFlag(spec.Flags, ImPlotHistogramFlags_NoOutliers);
+    const bool col_maj  = ImHasFlag(spec.Flags, ImPlotHistogramFlags_ColMajor);
+
+    IndexerIdx<T> indexer_x(xs,count,spec.Offset,Stride<T>(spec));
+    IndexerIdx<T> indexer_y(ys,count,spec.Offset,Stride<T>(spec));
+
+    if (count <= 0 || x_bins == 0 || y_bins == 0)
+        return 0;
+
+    if (range.X.Min == 0 && range.X.Max == 0) {
+        ImMinMaxIndexer(indexer_x, count, &range.X.Min, &range.X.Min);
+    }
+    if (range.Y.Min == 0 && range.Y.Max == 0) {
+        ImMinMaxIndexer(indexer_y, count, &range.Y.Min, &range.Y.Max);
+    }
+
+    double width, height;
+    if (x_bins < 0)
+        CalculateBins(indexer_x, count, x_bins, range.X, x_bins, width);
+    else
+        width = range.X.Size() / x_bins;
+    if (y_bins < 0)
+        CalculateBins(indexer_y, count, y_bins, range.Y, y_bins, height);
+    else
+        height = range.Y.Size() / y_bins;
+
+    const int bins = x_bins * y_bins;
+
+    ImPlotContext& gp = *GImPlot;
+    ImVector<double>& bin_counts = gp.TempDouble1;
+    bin_counts.resize(bins);
+
+    for (int b = 0; b < bins; ++b)
+        bin_counts[b] = 0;
+
+    int counted = 0;
+    double max_count = 0;
+    for (int i = 0; i < count; ++i) {
+        if (range.Contains(indexer_x[i], indexer_y[i])) {
+            const int xb = ImClamp( (int)((indexer_x[i] - range.X.Min) / width)  , 0, x_bins - 1);
+            const int yb = ImClamp( (int)((indexer_y[i] - range.Y.Min) / height) , 0, y_bins - 1);
+            const int b  = yb * x_bins + xb;
+            bin_counts[b] += 1.0;
+            if (bin_counts[b] > max_count)
+                max_count = bin_counts[b];
+            counted++;
+        }
+    }
+    if (density) {
+        double scale = 1.0 / ((outliers ? count : counted) * width * height);
+        for (int b = 0; b < bins; ++b)
+            bin_counts[b] *= scale;
+        max_count *= scale;
+    }
+
+    if (BeginItemEx(label_id, FitterRect(range), spec)) {
+        if (y_bins <= 0 || x_bins <= 0) {
+            EndItem();
+            return max_count;
+        }
+        ImDrawList& draw_list = *GetPlotDrawList();
+        IndexerIdx<double> indexer_bin(bin_counts.begin(), y_bins*x_bins, 0, sizeof(double));
+        RenderHeatmap(draw_list, indexer_bin, y_bins, x_bins, 0, max_count, nullptr, range.Min(), range.Max(), false, col_maj);
+        EndItem();
+    }
+    return max_count;
+}
+#define INSTANTIATE_MACRO(T) template IMPLOT_API double PlotHistogram2D<T>(const char* label_id,   const T*   xs, const T*   ys, int count, int x_bins, int y_bins, ImPlotRect range, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotDigital
+//-----------------------------------------------------------------------------
+
+// TODO: Make this behave like all the other plot types (.e. not fixed in y axis)
+// TODO: Currently broken if x or y axis is inverted! (what should happen in this case, anyway?)
+
+template <typename Getter>
+void PlotDigitalEx(const char* label_id, Getter getter, const ImPlotSpec& spec) {
+    if (BeginItem(label_id, spec, spec.FillColor)) {
+        ImPlotContext& gp = *GImPlot;
+        ImDrawList& draw_list = *GetPlotDrawList();
+        const ImPlotNextItemData& s = GetItemData();
+        if (getter.Count > 1 && s.RenderFill) {
+            ImPlotPlot& plot   = *gp.CurrentPlot;
+            ImPlotAxis& x_axis = plot.Axes[plot.CurrentX];
+            ImPlotAxis& y_axis = plot.Axes[plot.CurrentY];
+
+            int pixYMax = 0;
+            ImPlotPoint itemData1 = getter[0];
+            for (int i = 0; i < getter.Count; ++i) {
+                ImPlotPoint itemData2 = getter[i];
+                if (ImNanOrInf(itemData1.y)) {
+                    itemData1 = itemData2;
+                    continue;
+                }
+                if (ImNanOrInf(itemData2.y)) {
+                    itemData2.y = ImConstrainNan(ImConstrainInf(itemData2.y));
+                }
+                int pixY_0 = (int)(s.Spec.LineWeight);
+                itemData1.y = ImMax(0.0, itemData1.y);
+                const float pixY_1 = s.Spec.Size * (float)itemData1.y;
+                const int pixY_chPosOffset = (int)(ImMax(s.Spec.Size, pixY_1) + gp.Style.DigitalSpacing);
+                pixYMax = ImMax(pixYMax, pixY_chPosOffset);
+                ImVec2 pMin = PlotToPixels(itemData1,IMPLOT_AUTO,IMPLOT_AUTO);
+                ImVec2 pMax = PlotToPixels(itemData2,IMPLOT_AUTO,IMPLOT_AUTO);
+                const int pixY_Offset = (int)gp.Style.DigitalPadding;
+                const float y_ref = y_axis.IsInverted() ? y_axis.PixelMax : y_axis.PixelMin;
+                pMin.y = y_ref - (gp.DigitalPlotOffset + pixY_Offset);
+                pMax.y = y_ref - (gp.DigitalPlotOffset + pixY_0 + (int)pixY_1 + pixY_Offset);
+                //plot only one rectangle for same digital state
+                while (((i+2) < getter.Count) && (itemData1.y == itemData2.y)) {
+                    const int in = (i + 1);
+                    itemData2 = getter[in];
+                    if (ImNanOrInf(itemData2.y)) break;
+                    pMax.x = PlotToPixels(itemData2,IMPLOT_AUTO,IMPLOT_AUTO).x;
+                    i++;
+                }
+                // do not extend plot outside plot range
+                pMin.x = ImClamp(pMin.x, !x_axis.IsInverted() ? x_axis.PixelMin : x_axis.PixelMax, !x_axis.IsInverted() ? x_axis.PixelMax - 1 : x_axis.PixelMin - 1);
+                pMax.x = ImClamp(pMax.x, !x_axis.IsInverted() ? x_axis.PixelMin : x_axis.PixelMax, !x_axis.IsInverted() ? x_axis.PixelMax - 1 : x_axis.PixelMin - 1);
+                //plot a rectangle that extends up to x2 with y1 height
+                if ((gp.CurrentPlot->PlotRect.Contains(pMin) || gp.CurrentPlot->PlotRect.Contains(pMax))) {
+                    // ImVec4 colAlpha = item->Color;
+                    // colAlpha.w = item->Highlight ? 1.0f : 0.9f;
+                    draw_list.AddRectFilled(pMin, pMax, ImGui::GetColorU32(s.Spec.FillColor));
+                }
+                itemData1 = itemData2;
+            }
+            gp.DigitalPlotItemCnt++;
+            gp.DigitalPlotOffset += pixYMax;
+        }
+        EndItem();
+    }
+}
+
+
+template <typename T>
+void PlotDigital(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec) {
+    GetterXY<IndexerIdx<T>,IndexerIdx<T>> getter(IndexerIdx<T>(xs,count,spec.Offset,Stride<T>(spec)),IndexerIdx<T>(ys,count,spec.Offset,Stride<T>(spec)),count);
+    return PlotDigitalEx(label_id, getter, spec);
+}
+#define INSTANTIATE_MACRO(T) template IMPLOT_API void PlotDigital<T>(const char* label_id, const T* xs, const T* ys, int count, const ImPlotSpec& spec);
+CALL_INSTANTIATE_FOR_NUMERIC_TYPES()
+#undef INSTANTIATE_MACRO
+
+// custom
+void PlotDigitalG(const char* label_id, ImPlotGetter getter_func, void* data, int count, const ImPlotSpec& spec) {
+    GetterFuncPtr getter(getter_func,data,count);
+    return PlotDigitalEx(label_id, getter, spec);
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotImage
+//-----------------------------------------------------------------------------
+
+#ifdef IMGUI_HAS_TEXTURES
+void PlotImage(const char* label_id, ImTextureRef tex_ref, const ImPlotPoint& bmin, const ImPlotPoint& bmax, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImPlotSpec& spec) {
+#else
+void PlotImage(const char* label_id, ImTextureID tex_ref, const ImPlotPoint& bmin, const ImPlotPoint& bmax, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImPlotSpec& spec) {
+#endif
+    if (BeginItemEx(label_id, FitterRect(bmin,bmax), spec)) {
+        ImU32 tint_col32 = ImGui::ColorConvertFloat4ToU32(tint_col);
+        GetCurrentItem()->Color = tint_col32;
+        ImDrawList& draw_list = *GetPlotDrawList();
+        ImVec2 p1 = PlotToPixels(bmin.x, bmax.y,IMPLOT_AUTO,IMPLOT_AUTO);
+        ImVec2 p2 = PlotToPixels(bmax.x, bmin.y,IMPLOT_AUTO,IMPLOT_AUTO);
+        PushPlotClipRect();
+        draw_list.AddImage(tex_ref, p1, p2, uv0, uv1, tint_col32);
+        PopPlotClipRect();
+        EndItem();
+    }
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotText
+//-----------------------------------------------------------------------------
+
+void PlotText(const char* text, double x, double y, const ImVec2& pixel_offset, const ImPlotSpec& spec) {
+    IM_ASSERT_USER_ERROR(GImPlot->CurrentPlot != nullptr, "PlotText() needs to be called between BeginPlot() and EndPlot()!");
+    SetupLock();
+    ImDrawList & draw_list = *GetPlotDrawList();
+    PushPlotClipRect();
+    ImU32 colTxt = GetStyleColorU32(ImPlotCol_InlayText);
+    if (ImHasFlag(spec.Flags,ImPlotTextFlags_Vertical)) {
+        ImVec2 siz = CalcTextSizeVertical(text) * 0.5f;
+        ImVec2 ctr = siz * 0.5f;
+        ImVec2 pos = PlotToPixels(ImPlotPoint(x,y),IMPLOT_AUTO,IMPLOT_AUTO) + ImVec2(-ctr.x, ctr.y) + pixel_offset;
+        if (FitThisFrame() && !ImHasFlag(spec.Flags, ImPlotItemFlags_NoFit)) {
+            FitPoint(PixelsToPlot(pos));
+            FitPoint(PixelsToPlot(pos.x + siz.x, pos.y - siz.y));
+        }
+        AddTextVertical(&draw_list, pos, colTxt, text);
+    }
+    else {
+        ImVec2 siz = ImGui::CalcTextSize(text);
+        ImVec2 pos = PlotToPixels(ImPlotPoint(x,y),IMPLOT_AUTO,IMPLOT_AUTO) - siz * 0.5f + pixel_offset;
+        if (FitThisFrame() && !ImHasFlag(spec.Flags, ImPlotItemFlags_NoFit)) {
+            FitPoint(PixelsToPlot(pos));
+            FitPoint(PixelsToPlot(pos+siz));
+        }
+        draw_list.AddText(pos, colTxt, text);
+    }
+    PopPlotClipRect();
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] PlotDummy
+//-----------------------------------------------------------------------------
+
+void PlotDummy(const char* label_id, const ImPlotSpec& spec) {
+    // Pick the first non-auto color from the spec to override the legend icon color
+    ImVec4 item_col = spec.LineColor;
+    if (IsColorAuto(item_col))
+        item_col = spec.FillColor;
+    if (IsColorAuto(item_col))
+        item_col = spec.MarkerLineColor;
+    if (IsColorAuto(item_col))
+        item_col = spec.MarkerFillColor;
+    if (BeginItem(label_id, spec, item_col, spec.Marker))
+        EndItem();
+}
+
+} // namespace ImPlot
+
+#endif // #ifndef IMGUI_DISABLE
diff --git a/cbits/implot_shim.cpp b/cbits/implot_shim.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/implot_shim.cpp
@@ -0,0 +1,269 @@
+// THIS FILE HAS BEEN AUTO-GENERATED BY scripts/generate-implot-shim.py.
+// **DO NOT EDIT DIRECTLY** -- regen via scripts/refresh-generated-in.sh.
+
+#include "implot_shim.h"
+
+namespace ImPlot {
+
+void PlotLine_S8(const char* label_id, const ImS8* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotLine<ImS8>(label_id, values, count, xscale, xstart, spec); }
+void PlotLine_U8(const char* label_id, const ImU8* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotLine<ImU8>(label_id, values, count, xscale, xstart, spec); }
+void PlotLine_S16(const char* label_id, const ImS16* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotLine<ImS16>(label_id, values, count, xscale, xstart, spec); }
+void PlotLine_U16(const char* label_id, const ImU16* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotLine<ImU16>(label_id, values, count, xscale, xstart, spec); }
+void PlotLine_S32(const char* label_id, const ImS32* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotLine<ImS32>(label_id, values, count, xscale, xstart, spec); }
+void PlotLine_U32(const char* label_id, const ImU32* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotLine<ImU32>(label_id, values, count, xscale, xstart, spec); }
+void PlotLine_S64(const char* label_id, const ImS64* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotLine<ImS64>(label_id, values, count, xscale, xstart, spec); }
+void PlotLine_U64(const char* label_id, const ImU64* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotLine<ImU64>(label_id, values, count, xscale, xstart, spec); }
+void PlotLine_F32(const char* label_id, const float* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotLine<float>(label_id, values, count, xscale, xstart, spec); }
+void PlotLine_F64(const char* label_id, const double* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotLine<double>(label_id, values, count, xscale, xstart, spec); }
+void PlotLine_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, const ImPlotSpec& spec) { PlotLine<ImS8>(label_id, xs, ys, count, spec); }
+void PlotLine_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, const ImPlotSpec& spec) { PlotLine<ImU8>(label_id, xs, ys, count, spec); }
+void PlotLine_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, const ImPlotSpec& spec) { PlotLine<ImS16>(label_id, xs, ys, count, spec); }
+void PlotLine_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, const ImPlotSpec& spec) { PlotLine<ImU16>(label_id, xs, ys, count, spec); }
+void PlotLine_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, const ImPlotSpec& spec) { PlotLine<ImS32>(label_id, xs, ys, count, spec); }
+void PlotLine_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, const ImPlotSpec& spec) { PlotLine<ImU32>(label_id, xs, ys, count, spec); }
+void PlotLine_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, const ImPlotSpec& spec) { PlotLine<ImS64>(label_id, xs, ys, count, spec); }
+void PlotLine_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, const ImPlotSpec& spec) { PlotLine<ImU64>(label_id, xs, ys, count, spec); }
+void PlotLine_xy_F32(const char* label_id, const float* xs, const float* ys, int count, const ImPlotSpec& spec) { PlotLine<float>(label_id, xs, ys, count, spec); }
+void PlotLine_xy_F64(const char* label_id, const double* xs, const double* ys, int count, const ImPlotSpec& spec) { PlotLine<double>(label_id, xs, ys, count, spec); }
+void PlotScatter_S8(const char* label_id, const ImS8* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotScatter<ImS8>(label_id, values, count, xscale, xstart, spec); }
+void PlotScatter_U8(const char* label_id, const ImU8* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotScatter<ImU8>(label_id, values, count, xscale, xstart, spec); }
+void PlotScatter_S16(const char* label_id, const ImS16* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotScatter<ImS16>(label_id, values, count, xscale, xstart, spec); }
+void PlotScatter_U16(const char* label_id, const ImU16* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotScatter<ImU16>(label_id, values, count, xscale, xstart, spec); }
+void PlotScatter_S32(const char* label_id, const ImS32* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotScatter<ImS32>(label_id, values, count, xscale, xstart, spec); }
+void PlotScatter_U32(const char* label_id, const ImU32* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotScatter<ImU32>(label_id, values, count, xscale, xstart, spec); }
+void PlotScatter_S64(const char* label_id, const ImS64* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotScatter<ImS64>(label_id, values, count, xscale, xstart, spec); }
+void PlotScatter_U64(const char* label_id, const ImU64* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotScatter<ImU64>(label_id, values, count, xscale, xstart, spec); }
+void PlotScatter_F32(const char* label_id, const float* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotScatter<float>(label_id, values, count, xscale, xstart, spec); }
+void PlotScatter_F64(const char* label_id, const double* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotScatter<double>(label_id, values, count, xscale, xstart, spec); }
+void PlotScatter_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, const ImPlotSpec& spec) { PlotScatter<ImS8>(label_id, xs, ys, count, spec); }
+void PlotScatter_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, const ImPlotSpec& spec) { PlotScatter<ImU8>(label_id, xs, ys, count, spec); }
+void PlotScatter_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, const ImPlotSpec& spec) { PlotScatter<ImS16>(label_id, xs, ys, count, spec); }
+void PlotScatter_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, const ImPlotSpec& spec) { PlotScatter<ImU16>(label_id, xs, ys, count, spec); }
+void PlotScatter_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, const ImPlotSpec& spec) { PlotScatter<ImS32>(label_id, xs, ys, count, spec); }
+void PlotScatter_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, const ImPlotSpec& spec) { PlotScatter<ImU32>(label_id, xs, ys, count, spec); }
+void PlotScatter_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, const ImPlotSpec& spec) { PlotScatter<ImS64>(label_id, xs, ys, count, spec); }
+void PlotScatter_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, const ImPlotSpec& spec) { PlotScatter<ImU64>(label_id, xs, ys, count, spec); }
+void PlotScatter_xy_F32(const char* label_id, const float* xs, const float* ys, int count, const ImPlotSpec& spec) { PlotScatter<float>(label_id, xs, ys, count, spec); }
+void PlotScatter_xy_F64(const char* label_id, const double* xs, const double* ys, int count, const ImPlotSpec& spec) { PlotScatter<double>(label_id, xs, ys, count, spec); }
+void PlotBubbles_S8(const char* label_id, const ImS8* values, const ImS8* szs, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotBubbles<ImS8>(label_id, values, szs, count, xscale, xstart, spec); }
+void PlotBubbles_U8(const char* label_id, const ImU8* values, const ImU8* szs, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotBubbles<ImU8>(label_id, values, szs, count, xscale, xstart, spec); }
+void PlotBubbles_S16(const char* label_id, const ImS16* values, const ImS16* szs, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotBubbles<ImS16>(label_id, values, szs, count, xscale, xstart, spec); }
+void PlotBubbles_U16(const char* label_id, const ImU16* values, const ImU16* szs, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotBubbles<ImU16>(label_id, values, szs, count, xscale, xstart, spec); }
+void PlotBubbles_S32(const char* label_id, const ImS32* values, const ImS32* szs, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotBubbles<ImS32>(label_id, values, szs, count, xscale, xstart, spec); }
+void PlotBubbles_U32(const char* label_id, const ImU32* values, const ImU32* szs, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotBubbles<ImU32>(label_id, values, szs, count, xscale, xstart, spec); }
+void PlotBubbles_S64(const char* label_id, const ImS64* values, const ImS64* szs, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotBubbles<ImS64>(label_id, values, szs, count, xscale, xstart, spec); }
+void PlotBubbles_U64(const char* label_id, const ImU64* values, const ImU64* szs, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotBubbles<ImU64>(label_id, values, szs, count, xscale, xstart, spec); }
+void PlotBubbles_F32(const char* label_id, const float* values, const float* szs, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotBubbles<float>(label_id, values, szs, count, xscale, xstart, spec); }
+void PlotBubbles_F64(const char* label_id, const double* values, const double* szs, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotBubbles<double>(label_id, values, szs, count, xscale, xstart, spec); }
+void PlotBubbles_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* szs, int count, const ImPlotSpec& spec) { PlotBubbles<ImS8>(label_id, xs, ys, szs, count, spec); }
+void PlotBubbles_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* szs, int count, const ImPlotSpec& spec) { PlotBubbles<ImU8>(label_id, xs, ys, szs, count, spec); }
+void PlotBubbles_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* szs, int count, const ImPlotSpec& spec) { PlotBubbles<ImS16>(label_id, xs, ys, szs, count, spec); }
+void PlotBubbles_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* szs, int count, const ImPlotSpec& spec) { PlotBubbles<ImU16>(label_id, xs, ys, szs, count, spec); }
+void PlotBubbles_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* szs, int count, const ImPlotSpec& spec) { PlotBubbles<ImS32>(label_id, xs, ys, szs, count, spec); }
+void PlotBubbles_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* szs, int count, const ImPlotSpec& spec) { PlotBubbles<ImU32>(label_id, xs, ys, szs, count, spec); }
+void PlotBubbles_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* szs, int count, const ImPlotSpec& spec) { PlotBubbles<ImS64>(label_id, xs, ys, szs, count, spec); }
+void PlotBubbles_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* szs, int count, const ImPlotSpec& spec) { PlotBubbles<ImU64>(label_id, xs, ys, szs, count, spec); }
+void PlotBubbles_xy_F32(const char* label_id, const float* xs, const float* ys, const float* szs, int count, const ImPlotSpec& spec) { PlotBubbles<float>(label_id, xs, ys, szs, count, spec); }
+void PlotBubbles_xy_F64(const char* label_id, const double* xs, const double* ys, const double* szs, int count, const ImPlotSpec& spec) { PlotBubbles<double>(label_id, xs, ys, szs, count, spec); }
+void PlotPolygon_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, const ImPlotSpec& spec) { PlotPolygon<ImS8>(label_id, xs, ys, count, spec); }
+void PlotPolygon_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, const ImPlotSpec& spec) { PlotPolygon<ImU8>(label_id, xs, ys, count, spec); }
+void PlotPolygon_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, const ImPlotSpec& spec) { PlotPolygon<ImS16>(label_id, xs, ys, count, spec); }
+void PlotPolygon_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, const ImPlotSpec& spec) { PlotPolygon<ImU16>(label_id, xs, ys, count, spec); }
+void PlotPolygon_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, const ImPlotSpec& spec) { PlotPolygon<ImS32>(label_id, xs, ys, count, spec); }
+void PlotPolygon_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, const ImPlotSpec& spec) { PlotPolygon<ImU32>(label_id, xs, ys, count, spec); }
+void PlotPolygon_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, const ImPlotSpec& spec) { PlotPolygon<ImS64>(label_id, xs, ys, count, spec); }
+void PlotPolygon_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, const ImPlotSpec& spec) { PlotPolygon<ImU64>(label_id, xs, ys, count, spec); }
+void PlotPolygon_F32(const char* label_id, const float* xs, const float* ys, int count, const ImPlotSpec& spec) { PlotPolygon<float>(label_id, xs, ys, count, spec); }
+void PlotPolygon_F64(const char* label_id, const double* xs, const double* ys, int count, const ImPlotSpec& spec) { PlotPolygon<double>(label_id, xs, ys, count, spec); }
+void PlotStairs_S8(const char* label_id, const ImS8* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotStairs<ImS8>(label_id, values, count, xscale, xstart, spec); }
+void PlotStairs_U8(const char* label_id, const ImU8* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotStairs<ImU8>(label_id, values, count, xscale, xstart, spec); }
+void PlotStairs_S16(const char* label_id, const ImS16* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotStairs<ImS16>(label_id, values, count, xscale, xstart, spec); }
+void PlotStairs_U16(const char* label_id, const ImU16* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotStairs<ImU16>(label_id, values, count, xscale, xstart, spec); }
+void PlotStairs_S32(const char* label_id, const ImS32* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotStairs<ImS32>(label_id, values, count, xscale, xstart, spec); }
+void PlotStairs_U32(const char* label_id, const ImU32* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotStairs<ImU32>(label_id, values, count, xscale, xstart, spec); }
+void PlotStairs_S64(const char* label_id, const ImS64* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotStairs<ImS64>(label_id, values, count, xscale, xstart, spec); }
+void PlotStairs_U64(const char* label_id, const ImU64* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotStairs<ImU64>(label_id, values, count, xscale, xstart, spec); }
+void PlotStairs_F32(const char* label_id, const float* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotStairs<float>(label_id, values, count, xscale, xstart, spec); }
+void PlotStairs_F64(const char* label_id, const double* values, int count, double xscale, double xstart, const ImPlotSpec& spec) { PlotStairs<double>(label_id, values, count, xscale, xstart, spec); }
+void PlotStairs_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, const ImPlotSpec& spec) { PlotStairs<ImS8>(label_id, xs, ys, count, spec); }
+void PlotStairs_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, const ImPlotSpec& spec) { PlotStairs<ImU8>(label_id, xs, ys, count, spec); }
+void PlotStairs_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, const ImPlotSpec& spec) { PlotStairs<ImS16>(label_id, xs, ys, count, spec); }
+void PlotStairs_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, const ImPlotSpec& spec) { PlotStairs<ImU16>(label_id, xs, ys, count, spec); }
+void PlotStairs_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, const ImPlotSpec& spec) { PlotStairs<ImS32>(label_id, xs, ys, count, spec); }
+void PlotStairs_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, const ImPlotSpec& spec) { PlotStairs<ImU32>(label_id, xs, ys, count, spec); }
+void PlotStairs_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, const ImPlotSpec& spec) { PlotStairs<ImS64>(label_id, xs, ys, count, spec); }
+void PlotStairs_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, const ImPlotSpec& spec) { PlotStairs<ImU64>(label_id, xs, ys, count, spec); }
+void PlotStairs_xy_F32(const char* label_id, const float* xs, const float* ys, int count, const ImPlotSpec& spec) { PlotStairs<float>(label_id, xs, ys, count, spec); }
+void PlotStairs_xy_F64(const char* label_id, const double* xs, const double* ys, int count, const ImPlotSpec& spec) { PlotStairs<double>(label_id, xs, ys, count, spec); }
+void PlotShaded_S8(const char* label_id, const ImS8* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec) { PlotShaded<ImS8>(label_id, values, count, yref, xscale, xstart, spec); }
+void PlotShaded_U8(const char* label_id, const ImU8* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec) { PlotShaded<ImU8>(label_id, values, count, yref, xscale, xstart, spec); }
+void PlotShaded_S16(const char* label_id, const ImS16* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec) { PlotShaded<ImS16>(label_id, values, count, yref, xscale, xstart, spec); }
+void PlotShaded_U16(const char* label_id, const ImU16* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec) { PlotShaded<ImU16>(label_id, values, count, yref, xscale, xstart, spec); }
+void PlotShaded_S32(const char* label_id, const ImS32* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec) { PlotShaded<ImS32>(label_id, values, count, yref, xscale, xstart, spec); }
+void PlotShaded_U32(const char* label_id, const ImU32* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec) { PlotShaded<ImU32>(label_id, values, count, yref, xscale, xstart, spec); }
+void PlotShaded_S64(const char* label_id, const ImS64* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec) { PlotShaded<ImS64>(label_id, values, count, yref, xscale, xstart, spec); }
+void PlotShaded_U64(const char* label_id, const ImU64* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec) { PlotShaded<ImU64>(label_id, values, count, yref, xscale, xstart, spec); }
+void PlotShaded_F32(const char* label_id, const float* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec) { PlotShaded<float>(label_id, values, count, yref, xscale, xstart, spec); }
+void PlotShaded_F64(const char* label_id, const double* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec) { PlotShaded<double>(label_id, values, count, yref, xscale, xstart, spec); }
+void PlotShaded_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double yref, const ImPlotSpec& spec) { PlotShaded<ImS8>(label_id, xs, ys, count, yref, spec); }
+void PlotShaded_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double yref, const ImPlotSpec& spec) { PlotShaded<ImU8>(label_id, xs, ys, count, yref, spec); }
+void PlotShaded_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double yref, const ImPlotSpec& spec) { PlotShaded<ImS16>(label_id, xs, ys, count, yref, spec); }
+void PlotShaded_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double yref, const ImPlotSpec& spec) { PlotShaded<ImU16>(label_id, xs, ys, count, yref, spec); }
+void PlotShaded_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double yref, const ImPlotSpec& spec) { PlotShaded<ImS32>(label_id, xs, ys, count, yref, spec); }
+void PlotShaded_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double yref, const ImPlotSpec& spec) { PlotShaded<ImU32>(label_id, xs, ys, count, yref, spec); }
+void PlotShaded_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double yref, const ImPlotSpec& spec) { PlotShaded<ImS64>(label_id, xs, ys, count, yref, spec); }
+void PlotShaded_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double yref, const ImPlotSpec& spec) { PlotShaded<ImU64>(label_id, xs, ys, count, yref, spec); }
+void PlotShaded_xy_F32(const char* label_id, const float* xs, const float* ys, int count, double yref, const ImPlotSpec& spec) { PlotShaded<float>(label_id, xs, ys, count, yref, spec); }
+void PlotShaded_xy_F64(const char* label_id, const double* xs, const double* ys, int count, double yref, const ImPlotSpec& spec) { PlotShaded<double>(label_id, xs, ys, count, yref, spec); }
+void PlotShaded_xyy_S8(const char* label_id, const ImS8* xs, const ImS8* ys1, const ImS8* ys2, int count, const ImPlotSpec& spec) { PlotShaded<ImS8>(label_id, xs, ys1, ys2, count, spec); }
+void PlotShaded_xyy_U8(const char* label_id, const ImU8* xs, const ImU8* ys1, const ImU8* ys2, int count, const ImPlotSpec& spec) { PlotShaded<ImU8>(label_id, xs, ys1, ys2, count, spec); }
+void PlotShaded_xyy_S16(const char* label_id, const ImS16* xs, const ImS16* ys1, const ImS16* ys2, int count, const ImPlotSpec& spec) { PlotShaded<ImS16>(label_id, xs, ys1, ys2, count, spec); }
+void PlotShaded_xyy_U16(const char* label_id, const ImU16* xs, const ImU16* ys1, const ImU16* ys2, int count, const ImPlotSpec& spec) { PlotShaded<ImU16>(label_id, xs, ys1, ys2, count, spec); }
+void PlotShaded_xyy_S32(const char* label_id, const ImS32* xs, const ImS32* ys1, const ImS32* ys2, int count, const ImPlotSpec& spec) { PlotShaded<ImS32>(label_id, xs, ys1, ys2, count, spec); }
+void PlotShaded_xyy_U32(const char* label_id, const ImU32* xs, const ImU32* ys1, const ImU32* ys2, int count, const ImPlotSpec& spec) { PlotShaded<ImU32>(label_id, xs, ys1, ys2, count, spec); }
+void PlotShaded_xyy_S64(const char* label_id, const ImS64* xs, const ImS64* ys1, const ImS64* ys2, int count, const ImPlotSpec& spec) { PlotShaded<ImS64>(label_id, xs, ys1, ys2, count, spec); }
+void PlotShaded_xyy_U64(const char* label_id, const ImU64* xs, const ImU64* ys1, const ImU64* ys2, int count, const ImPlotSpec& spec) { PlotShaded<ImU64>(label_id, xs, ys1, ys2, count, spec); }
+void PlotShaded_xyy_F32(const char* label_id, const float* xs, const float* ys1, const float* ys2, int count, const ImPlotSpec& spec) { PlotShaded<float>(label_id, xs, ys1, ys2, count, spec); }
+void PlotShaded_xyy_F64(const char* label_id, const double* xs, const double* ys1, const double* ys2, int count, const ImPlotSpec& spec) { PlotShaded<double>(label_id, xs, ys1, ys2, count, spec); }
+void PlotBars_S8(const char* label_id, const ImS8* values, int count, double bar_size, double shift, const ImPlotSpec& spec) { PlotBars<ImS8>(label_id, values, count, bar_size, shift, spec); }
+void PlotBars_U8(const char* label_id, const ImU8* values, int count, double bar_size, double shift, const ImPlotSpec& spec) { PlotBars<ImU8>(label_id, values, count, bar_size, shift, spec); }
+void PlotBars_S16(const char* label_id, const ImS16* values, int count, double bar_size, double shift, const ImPlotSpec& spec) { PlotBars<ImS16>(label_id, values, count, bar_size, shift, spec); }
+void PlotBars_U16(const char* label_id, const ImU16* values, int count, double bar_size, double shift, const ImPlotSpec& spec) { PlotBars<ImU16>(label_id, values, count, bar_size, shift, spec); }
+void PlotBars_S32(const char* label_id, const ImS32* values, int count, double bar_size, double shift, const ImPlotSpec& spec) { PlotBars<ImS32>(label_id, values, count, bar_size, shift, spec); }
+void PlotBars_U32(const char* label_id, const ImU32* values, int count, double bar_size, double shift, const ImPlotSpec& spec) { PlotBars<ImU32>(label_id, values, count, bar_size, shift, spec); }
+void PlotBars_S64(const char* label_id, const ImS64* values, int count, double bar_size, double shift, const ImPlotSpec& spec) { PlotBars<ImS64>(label_id, values, count, bar_size, shift, spec); }
+void PlotBars_U64(const char* label_id, const ImU64* values, int count, double bar_size, double shift, const ImPlotSpec& spec) { PlotBars<ImU64>(label_id, values, count, bar_size, shift, spec); }
+void PlotBars_F32(const char* label_id, const float* values, int count, double bar_size, double shift, const ImPlotSpec& spec) { PlotBars<float>(label_id, values, count, bar_size, shift, spec); }
+void PlotBars_F64(const char* label_id, const double* values, int count, double bar_size, double shift, const ImPlotSpec& spec) { PlotBars<double>(label_id, values, count, bar_size, shift, spec); }
+void PlotBars_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double bar_size, const ImPlotSpec& spec) { PlotBars<ImS8>(label_id, xs, ys, count, bar_size, spec); }
+void PlotBars_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double bar_size, const ImPlotSpec& spec) { PlotBars<ImU8>(label_id, xs, ys, count, bar_size, spec); }
+void PlotBars_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double bar_size, const ImPlotSpec& spec) { PlotBars<ImS16>(label_id, xs, ys, count, bar_size, spec); }
+void PlotBars_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double bar_size, const ImPlotSpec& spec) { PlotBars<ImU16>(label_id, xs, ys, count, bar_size, spec); }
+void PlotBars_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double bar_size, const ImPlotSpec& spec) { PlotBars<ImS32>(label_id, xs, ys, count, bar_size, spec); }
+void PlotBars_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double bar_size, const ImPlotSpec& spec) { PlotBars<ImU32>(label_id, xs, ys, count, bar_size, spec); }
+void PlotBars_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double bar_size, const ImPlotSpec& spec) { PlotBars<ImS64>(label_id, xs, ys, count, bar_size, spec); }
+void PlotBars_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double bar_size, const ImPlotSpec& spec) { PlotBars<ImU64>(label_id, xs, ys, count, bar_size, spec); }
+void PlotBars_xy_F32(const char* label_id, const float* xs, const float* ys, int count, double bar_size, const ImPlotSpec& spec) { PlotBars<float>(label_id, xs, ys, count, bar_size, spec); }
+void PlotBars_xy_F64(const char* label_id, const double* xs, const double* ys, int count, double bar_size, const ImPlotSpec& spec) { PlotBars<double>(label_id, xs, ys, count, bar_size, spec); }
+void PlotBarGroups_S8(const char* const label_ids[], const ImS8* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec) { PlotBarGroups<ImS8>(label_ids, values, item_count, group_count, group_size, shift, spec); }
+void PlotBarGroups_U8(const char* const label_ids[], const ImU8* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec) { PlotBarGroups<ImU8>(label_ids, values, item_count, group_count, group_size, shift, spec); }
+void PlotBarGroups_S16(const char* const label_ids[], const ImS16* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec) { PlotBarGroups<ImS16>(label_ids, values, item_count, group_count, group_size, shift, spec); }
+void PlotBarGroups_U16(const char* const label_ids[], const ImU16* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec) { PlotBarGroups<ImU16>(label_ids, values, item_count, group_count, group_size, shift, spec); }
+void PlotBarGroups_S32(const char* const label_ids[], const ImS32* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec) { PlotBarGroups<ImS32>(label_ids, values, item_count, group_count, group_size, shift, spec); }
+void PlotBarGroups_U32(const char* const label_ids[], const ImU32* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec) { PlotBarGroups<ImU32>(label_ids, values, item_count, group_count, group_size, shift, spec); }
+void PlotBarGroups_S64(const char* const label_ids[], const ImS64* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec) { PlotBarGroups<ImS64>(label_ids, values, item_count, group_count, group_size, shift, spec); }
+void PlotBarGroups_U64(const char* const label_ids[], const ImU64* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec) { PlotBarGroups<ImU64>(label_ids, values, item_count, group_count, group_size, shift, spec); }
+void PlotBarGroups_F32(const char* const label_ids[], const float* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec) { PlotBarGroups<float>(label_ids, values, item_count, group_count, group_size, shift, spec); }
+void PlotBarGroups_F64(const char* const label_ids[], const double* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec) { PlotBarGroups<double>(label_ids, values, item_count, group_count, group_size, shift, spec); }
+void PlotErrorBars_xye_S8(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* err, int count, const ImPlotSpec& spec) { PlotErrorBars<ImS8>(label_id, xs, ys, err, count, spec); }
+void PlotErrorBars_xye_U8(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* err, int count, const ImPlotSpec& spec) { PlotErrorBars<ImU8>(label_id, xs, ys, err, count, spec); }
+void PlotErrorBars_xye_S16(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* err, int count, const ImPlotSpec& spec) { PlotErrorBars<ImS16>(label_id, xs, ys, err, count, spec); }
+void PlotErrorBars_xye_U16(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* err, int count, const ImPlotSpec& spec) { PlotErrorBars<ImU16>(label_id, xs, ys, err, count, spec); }
+void PlotErrorBars_xye_S32(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* err, int count, const ImPlotSpec& spec) { PlotErrorBars<ImS32>(label_id, xs, ys, err, count, spec); }
+void PlotErrorBars_xye_U32(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* err, int count, const ImPlotSpec& spec) { PlotErrorBars<ImU32>(label_id, xs, ys, err, count, spec); }
+void PlotErrorBars_xye_S64(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* err, int count, const ImPlotSpec& spec) { PlotErrorBars<ImS64>(label_id, xs, ys, err, count, spec); }
+void PlotErrorBars_xye_U64(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* err, int count, const ImPlotSpec& spec) { PlotErrorBars<ImU64>(label_id, xs, ys, err, count, spec); }
+void PlotErrorBars_xye_F32(const char* label_id, const float* xs, const float* ys, const float* err, int count, const ImPlotSpec& spec) { PlotErrorBars<float>(label_id, xs, ys, err, count, spec); }
+void PlotErrorBars_xye_F64(const char* label_id, const double* xs, const double* ys, const double* err, int count, const ImPlotSpec& spec) { PlotErrorBars<double>(label_id, xs, ys, err, count, spec); }
+void PlotErrorBars_xynp_S8(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* neg, const ImS8* pos, int count, const ImPlotSpec& spec) { PlotErrorBars<ImS8>(label_id, xs, ys, neg, pos, count, spec); }
+void PlotErrorBars_xynp_U8(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* neg, const ImU8* pos, int count, const ImPlotSpec& spec) { PlotErrorBars<ImU8>(label_id, xs, ys, neg, pos, count, spec); }
+void PlotErrorBars_xynp_S16(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* neg, const ImS16* pos, int count, const ImPlotSpec& spec) { PlotErrorBars<ImS16>(label_id, xs, ys, neg, pos, count, spec); }
+void PlotErrorBars_xynp_U16(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* neg, const ImU16* pos, int count, const ImPlotSpec& spec) { PlotErrorBars<ImU16>(label_id, xs, ys, neg, pos, count, spec); }
+void PlotErrorBars_xynp_S32(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* neg, const ImS32* pos, int count, const ImPlotSpec& spec) { PlotErrorBars<ImS32>(label_id, xs, ys, neg, pos, count, spec); }
+void PlotErrorBars_xynp_U32(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* neg, const ImU32* pos, int count, const ImPlotSpec& spec) { PlotErrorBars<ImU32>(label_id, xs, ys, neg, pos, count, spec); }
+void PlotErrorBars_xynp_S64(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* neg, const ImS64* pos, int count, const ImPlotSpec& spec) { PlotErrorBars<ImS64>(label_id, xs, ys, neg, pos, count, spec); }
+void PlotErrorBars_xynp_U64(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* neg, const ImU64* pos, int count, const ImPlotSpec& spec) { PlotErrorBars<ImU64>(label_id, xs, ys, neg, pos, count, spec); }
+void PlotErrorBars_xynp_F32(const char* label_id, const float* xs, const float* ys, const float* neg, const float* pos, int count, const ImPlotSpec& spec) { PlotErrorBars<float>(label_id, xs, ys, neg, pos, count, spec); }
+void PlotErrorBars_xynp_F64(const char* label_id, const double* xs, const double* ys, const double* neg, const double* pos, int count, const ImPlotSpec& spec) { PlotErrorBars<double>(label_id, xs, ys, neg, pos, count, spec); }
+void PlotStems_S8(const char* label_id, const ImS8* values, int count, double ref, double scale, double start, const ImPlotSpec& spec) { PlotStems<ImS8>(label_id, values, count, ref, scale, start, spec); }
+void PlotStems_U8(const char* label_id, const ImU8* values, int count, double ref, double scale, double start, const ImPlotSpec& spec) { PlotStems<ImU8>(label_id, values, count, ref, scale, start, spec); }
+void PlotStems_S16(const char* label_id, const ImS16* values, int count, double ref, double scale, double start, const ImPlotSpec& spec) { PlotStems<ImS16>(label_id, values, count, ref, scale, start, spec); }
+void PlotStems_U16(const char* label_id, const ImU16* values, int count, double ref, double scale, double start, const ImPlotSpec& spec) { PlotStems<ImU16>(label_id, values, count, ref, scale, start, spec); }
+void PlotStems_S32(const char* label_id, const ImS32* values, int count, double ref, double scale, double start, const ImPlotSpec& spec) { PlotStems<ImS32>(label_id, values, count, ref, scale, start, spec); }
+void PlotStems_U32(const char* label_id, const ImU32* values, int count, double ref, double scale, double start, const ImPlotSpec& spec) { PlotStems<ImU32>(label_id, values, count, ref, scale, start, spec); }
+void PlotStems_S64(const char* label_id, const ImS64* values, int count, double ref, double scale, double start, const ImPlotSpec& spec) { PlotStems<ImS64>(label_id, values, count, ref, scale, start, spec); }
+void PlotStems_U64(const char* label_id, const ImU64* values, int count, double ref, double scale, double start, const ImPlotSpec& spec) { PlotStems<ImU64>(label_id, values, count, ref, scale, start, spec); }
+void PlotStems_F32(const char* label_id, const float* values, int count, double ref, double scale, double start, const ImPlotSpec& spec) { PlotStems<float>(label_id, values, count, ref, scale, start, spec); }
+void PlotStems_F64(const char* label_id, const double* values, int count, double ref, double scale, double start, const ImPlotSpec& spec) { PlotStems<double>(label_id, values, count, ref, scale, start, spec); }
+void PlotStems_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double ref, const ImPlotSpec& spec) { PlotStems<ImS8>(label_id, xs, ys, count, ref, spec); }
+void PlotStems_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double ref, const ImPlotSpec& spec) { PlotStems<ImU8>(label_id, xs, ys, count, ref, spec); }
+void PlotStems_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double ref, const ImPlotSpec& spec) { PlotStems<ImS16>(label_id, xs, ys, count, ref, spec); }
+void PlotStems_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double ref, const ImPlotSpec& spec) { PlotStems<ImU16>(label_id, xs, ys, count, ref, spec); }
+void PlotStems_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double ref, const ImPlotSpec& spec) { PlotStems<ImS32>(label_id, xs, ys, count, ref, spec); }
+void PlotStems_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double ref, const ImPlotSpec& spec) { PlotStems<ImU32>(label_id, xs, ys, count, ref, spec); }
+void PlotStems_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double ref, const ImPlotSpec& spec) { PlotStems<ImS64>(label_id, xs, ys, count, ref, spec); }
+void PlotStems_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double ref, const ImPlotSpec& spec) { PlotStems<ImU64>(label_id, xs, ys, count, ref, spec); }
+void PlotStems_xy_F32(const char* label_id, const float* xs, const float* ys, int count, double ref, const ImPlotSpec& spec) { PlotStems<float>(label_id, xs, ys, count, ref, spec); }
+void PlotStems_xy_F64(const char* label_id, const double* xs, const double* ys, int count, double ref, const ImPlotSpec& spec) { PlotStems<double>(label_id, xs, ys, count, ref, spec); }
+void PlotInfLines_S8(const char* label_id, const ImS8* values, int count, const ImPlotSpec& spec) { PlotInfLines<ImS8>(label_id, values, count, spec); }
+void PlotInfLines_U8(const char* label_id, const ImU8* values, int count, const ImPlotSpec& spec) { PlotInfLines<ImU8>(label_id, values, count, spec); }
+void PlotInfLines_S16(const char* label_id, const ImS16* values, int count, const ImPlotSpec& spec) { PlotInfLines<ImS16>(label_id, values, count, spec); }
+void PlotInfLines_U16(const char* label_id, const ImU16* values, int count, const ImPlotSpec& spec) { PlotInfLines<ImU16>(label_id, values, count, spec); }
+void PlotInfLines_S32(const char* label_id, const ImS32* values, int count, const ImPlotSpec& spec) { PlotInfLines<ImS32>(label_id, values, count, spec); }
+void PlotInfLines_U32(const char* label_id, const ImU32* values, int count, const ImPlotSpec& spec) { PlotInfLines<ImU32>(label_id, values, count, spec); }
+void PlotInfLines_S64(const char* label_id, const ImS64* values, int count, const ImPlotSpec& spec) { PlotInfLines<ImS64>(label_id, values, count, spec); }
+void PlotInfLines_U64(const char* label_id, const ImU64* values, int count, const ImPlotSpec& spec) { PlotInfLines<ImU64>(label_id, values, count, spec); }
+void PlotInfLines_F32(const char* label_id, const float* values, int count, const ImPlotSpec& spec) { PlotInfLines<float>(label_id, values, count, spec); }
+void PlotInfLines_F64(const char* label_id, const double* values, int count, const ImPlotSpec& spec) { PlotInfLines<double>(label_id, values, count, spec); }
+void PlotPieChart_fmt_S8(const char* const label_ids[], const ImS8* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImS8>(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, spec); }
+void PlotPieChart_fmt_U8(const char* const label_ids[], const ImU8* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImU8>(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, spec); }
+void PlotPieChart_fmt_S16(const char* const label_ids[], const ImS16* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImS16>(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, spec); }
+void PlotPieChart_fmt_U16(const char* const label_ids[], const ImU16* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImU16>(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, spec); }
+void PlotPieChart_fmt_S32(const char* const label_ids[], const ImS32* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImS32>(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, spec); }
+void PlotPieChart_fmt_U32(const char* const label_ids[], const ImU32* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImU32>(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, spec); }
+void PlotPieChart_fmt_S64(const char* const label_ids[], const ImS64* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImS64>(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, spec); }
+void PlotPieChart_fmt_U64(const char* const label_ids[], const ImU64* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImU64>(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, spec); }
+void PlotPieChart_fmt_F32(const char* const label_ids[], const float* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec) { PlotPieChart<float>(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, spec); }
+void PlotPieChart_fmt_F64(const char* const label_ids[], const double* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec) { PlotPieChart<double>(label_ids, values, count, x, y, radius, fmt, fmt_data, angle0, spec); }
+void PlotPieChart_S8(const char* const label_ids[], const ImS8* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImS8>(label_ids, values, count, x, y, radius, label_fmt, angle0, spec); }
+void PlotPieChart_U8(const char* const label_ids[], const ImU8* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImU8>(label_ids, values, count, x, y, radius, label_fmt, angle0, spec); }
+void PlotPieChart_S16(const char* const label_ids[], const ImS16* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImS16>(label_ids, values, count, x, y, radius, label_fmt, angle0, spec); }
+void PlotPieChart_U16(const char* const label_ids[], const ImU16* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImU16>(label_ids, values, count, x, y, radius, label_fmt, angle0, spec); }
+void PlotPieChart_S32(const char* const label_ids[], const ImS32* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImS32>(label_ids, values, count, x, y, radius, label_fmt, angle0, spec); }
+void PlotPieChart_U32(const char* const label_ids[], const ImU32* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImU32>(label_ids, values, count, x, y, radius, label_fmt, angle0, spec); }
+void PlotPieChart_S64(const char* const label_ids[], const ImS64* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImS64>(label_ids, values, count, x, y, radius, label_fmt, angle0, spec); }
+void PlotPieChart_U64(const char* const label_ids[], const ImU64* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec) { PlotPieChart<ImU64>(label_ids, values, count, x, y, radius, label_fmt, angle0, spec); }
+void PlotPieChart_F32(const char* const label_ids[], const float* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec) { PlotPieChart<float>(label_ids, values, count, x, y, radius, label_fmt, angle0, spec); }
+void PlotPieChart_F64(const char* const label_ids[], const double* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec) { PlotPieChart<double>(label_ids, values, count, x, y, radius, label_fmt, angle0, spec); }
+void PlotHeatmap_S8(const char* label_id, const ImS8* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec) { PlotHeatmap<ImS8>(label_id, values, rows, cols, scale_min, scale_max, label_fmt, bounds_min, bounds_max, spec); }
+void PlotHeatmap_U8(const char* label_id, const ImU8* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec) { PlotHeatmap<ImU8>(label_id, values, rows, cols, scale_min, scale_max, label_fmt, bounds_min, bounds_max, spec); }
+void PlotHeatmap_S16(const char* label_id, const ImS16* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec) { PlotHeatmap<ImS16>(label_id, values, rows, cols, scale_min, scale_max, label_fmt, bounds_min, bounds_max, spec); }
+void PlotHeatmap_U16(const char* label_id, const ImU16* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec) { PlotHeatmap<ImU16>(label_id, values, rows, cols, scale_min, scale_max, label_fmt, bounds_min, bounds_max, spec); }
+void PlotHeatmap_S32(const char* label_id, const ImS32* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec) { PlotHeatmap<ImS32>(label_id, values, rows, cols, scale_min, scale_max, label_fmt, bounds_min, bounds_max, spec); }
+void PlotHeatmap_U32(const char* label_id, const ImU32* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec) { PlotHeatmap<ImU32>(label_id, values, rows, cols, scale_min, scale_max, label_fmt, bounds_min, bounds_max, spec); }
+void PlotHeatmap_S64(const char* label_id, const ImS64* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec) { PlotHeatmap<ImS64>(label_id, values, rows, cols, scale_min, scale_max, label_fmt, bounds_min, bounds_max, spec); }
+void PlotHeatmap_U64(const char* label_id, const ImU64* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec) { PlotHeatmap<ImU64>(label_id, values, rows, cols, scale_min, scale_max, label_fmt, bounds_min, bounds_max, spec); }
+void PlotHeatmap_F32(const char* label_id, const float* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec) { PlotHeatmap<float>(label_id, values, rows, cols, scale_min, scale_max, label_fmt, bounds_min, bounds_max, spec); }
+void PlotHeatmap_F64(const char* label_id, const double* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec) { PlotHeatmap<double>(label_id, values, rows, cols, scale_min, scale_max, label_fmt, bounds_min, bounds_max, spec); }
+double PlotHistogram_S8(const char* label_id, const ImS8* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec) { return PlotHistogram<ImS8>(label_id, values, count, bins, bar_scale, range, spec); }
+double PlotHistogram_U8(const char* label_id, const ImU8* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec) { return PlotHistogram<ImU8>(label_id, values, count, bins, bar_scale, range, spec); }
+double PlotHistogram_S16(const char* label_id, const ImS16* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec) { return PlotHistogram<ImS16>(label_id, values, count, bins, bar_scale, range, spec); }
+double PlotHistogram_U16(const char* label_id, const ImU16* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec) { return PlotHistogram<ImU16>(label_id, values, count, bins, bar_scale, range, spec); }
+double PlotHistogram_S32(const char* label_id, const ImS32* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec) { return PlotHistogram<ImS32>(label_id, values, count, bins, bar_scale, range, spec); }
+double PlotHistogram_U32(const char* label_id, const ImU32* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec) { return PlotHistogram<ImU32>(label_id, values, count, bins, bar_scale, range, spec); }
+double PlotHistogram_S64(const char* label_id, const ImS64* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec) { return PlotHistogram<ImS64>(label_id, values, count, bins, bar_scale, range, spec); }
+double PlotHistogram_U64(const char* label_id, const ImU64* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec) { return PlotHistogram<ImU64>(label_id, values, count, bins, bar_scale, range, spec); }
+double PlotHistogram_F32(const char* label_id, const float* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec) { return PlotHistogram<float>(label_id, values, count, bins, bar_scale, range, spec); }
+double PlotHistogram_F64(const char* label_id, const double* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec) { return PlotHistogram<double>(label_id, values, count, bins, bar_scale, range, spec); }
+double PlotHistogram2D_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec) { return PlotHistogram2D<ImS8>(label_id, xs, ys, count, x_bins, y_bins, range, spec); }
+double PlotHistogram2D_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec) { return PlotHistogram2D<ImU8>(label_id, xs, ys, count, x_bins, y_bins, range, spec); }
+double PlotHistogram2D_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec) { return PlotHistogram2D<ImS16>(label_id, xs, ys, count, x_bins, y_bins, range, spec); }
+double PlotHistogram2D_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec) { return PlotHistogram2D<ImU16>(label_id, xs, ys, count, x_bins, y_bins, range, spec); }
+double PlotHistogram2D_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec) { return PlotHistogram2D<ImS32>(label_id, xs, ys, count, x_bins, y_bins, range, spec); }
+double PlotHistogram2D_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec) { return PlotHistogram2D<ImU32>(label_id, xs, ys, count, x_bins, y_bins, range, spec); }
+double PlotHistogram2D_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec) { return PlotHistogram2D<ImS64>(label_id, xs, ys, count, x_bins, y_bins, range, spec); }
+double PlotHistogram2D_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec) { return PlotHistogram2D<ImU64>(label_id, xs, ys, count, x_bins, y_bins, range, spec); }
+double PlotHistogram2D_F32(const char* label_id, const float* xs, const float* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec) { return PlotHistogram2D<float>(label_id, xs, ys, count, x_bins, y_bins, range, spec); }
+double PlotHistogram2D_F64(const char* label_id, const double* xs, const double* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec) { return PlotHistogram2D<double>(label_id, xs, ys, count, x_bins, y_bins, range, spec); }
+void PlotDigital_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, const ImPlotSpec& spec) { PlotDigital<ImS8>(label_id, xs, ys, count, spec); }
+void PlotDigital_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, const ImPlotSpec& spec) { PlotDigital<ImU8>(label_id, xs, ys, count, spec); }
+void PlotDigital_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, const ImPlotSpec& spec) { PlotDigital<ImS16>(label_id, xs, ys, count, spec); }
+void PlotDigital_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, const ImPlotSpec& spec) { PlotDigital<ImU16>(label_id, xs, ys, count, spec); }
+void PlotDigital_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, const ImPlotSpec& spec) { PlotDigital<ImS32>(label_id, xs, ys, count, spec); }
+void PlotDigital_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, const ImPlotSpec& spec) { PlotDigital<ImU32>(label_id, xs, ys, count, spec); }
+void PlotDigital_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, const ImPlotSpec& spec) { PlotDigital<ImS64>(label_id, xs, ys, count, spec); }
+void PlotDigital_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, const ImPlotSpec& spec) { PlotDigital<ImU64>(label_id, xs, ys, count, spec); }
+void PlotDigital_F32(const char* label_id, const float* xs, const float* ys, int count, const ImPlotSpec& spec) { PlotDigital<float>(label_id, xs, ys, count, spec); }
+void PlotDigital_F64(const char* label_id, const double* xs, const double* ys, int count, const ImPlotSpec& spec) { PlotDigital<double>(label_id, xs, ys, count, spec); }
+
+} // namespace ImPlot
diff --git a/cbits/implot_shim.h b/cbits/implot_shim.h
new file mode 100644
--- /dev/null
+++ b/cbits/implot_shim.h
@@ -0,0 +1,281 @@
+// THIS FILE HAS BEEN AUTO-GENERATED BY scripts/generate-implot-shim.py.
+// **DO NOT EDIT DIRECTLY** -- regen via scripts/refresh-generated-in.sh.
+//
+// Monomorphized shim for implot's templated public API. Each
+// IMPLOT_TMP-fronted PlotXxx<T> in upstream's implot.h becomes
+// 10 concrete entry points here, one per scalar type that
+// implot_items.cpp explicitly instantiates. Disambiguation infix:
+//   <Name>_<Tag>           single-overload functions
+//   <Name>_xy_<Tag>        (xs, ys) form
+//   <Name>_xyy_<Tag>       (xs, ys1, ys2) form
+//   <Name>_xye_<Tag>       (xs, ys, err) form
+//   <Name>_xynp_<Tag>      (xs, ys, neg, pos) form
+//   PlotPieChart_fmt_<Tag> formatter-callback overload
+
+#pragma once
+#include "implot.h"
+
+namespace ImPlot {
+
+IMPLOT_API void PlotLine_S8(const char* label_id, const ImS8* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_U8(const char* label_id, const ImU8* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_S16(const char* label_id, const ImS16* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_U16(const char* label_id, const ImU16* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_S32(const char* label_id, const ImS32* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_U32(const char* label_id, const ImU32* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_S64(const char* label_id, const ImS64* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_U64(const char* label_id, const ImU64* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_F32(const char* label_id, const float* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_F64(const char* label_id, const double* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_xy_F32(const char* label_id, const float* xs, const float* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotLine_xy_F64(const char* label_id, const double* xs, const double* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_S8(const char* label_id, const ImS8* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_U8(const char* label_id, const ImU8* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_S16(const char* label_id, const ImS16* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_U16(const char* label_id, const ImU16* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_S32(const char* label_id, const ImS32* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_U32(const char* label_id, const ImU32* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_S64(const char* label_id, const ImS64* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_U64(const char* label_id, const ImU64* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_F32(const char* label_id, const float* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_F64(const char* label_id, const double* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_xy_F32(const char* label_id, const float* xs, const float* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotScatter_xy_F64(const char* label_id, const double* xs, const double* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_S8(const char* label_id, const ImS8* values, const ImS8* szs, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_U8(const char* label_id, const ImU8* values, const ImU8* szs, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_S16(const char* label_id, const ImS16* values, const ImS16* szs, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_U16(const char* label_id, const ImU16* values, const ImU16* szs, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_S32(const char* label_id, const ImS32* values, const ImS32* szs, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_U32(const char* label_id, const ImU32* values, const ImU32* szs, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_S64(const char* label_id, const ImS64* values, const ImS64* szs, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_U64(const char* label_id, const ImU64* values, const ImU64* szs, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_F32(const char* label_id, const float* values, const float* szs, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_F64(const char* label_id, const double* values, const double* szs, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* szs, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* szs, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* szs, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* szs, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* szs, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* szs, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* szs, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* szs, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_xy_F32(const char* label_id, const float* xs, const float* ys, const float* szs, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotBubbles_xy_F64(const char* label_id, const double* xs, const double* ys, const double* szs, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotPolygon_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotPolygon_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotPolygon_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotPolygon_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotPolygon_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotPolygon_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotPolygon_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotPolygon_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotPolygon_F32(const char* label_id, const float* xs, const float* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotPolygon_F64(const char* label_id, const double* xs, const double* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_S8(const char* label_id, const ImS8* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_U8(const char* label_id, const ImU8* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_S16(const char* label_id, const ImS16* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_U16(const char* label_id, const ImU16* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_S32(const char* label_id, const ImS32* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_U32(const char* label_id, const ImU32* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_S64(const char* label_id, const ImS64* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_U64(const char* label_id, const ImU64* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_F32(const char* label_id, const float* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_F64(const char* label_id, const double* values, int count, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_xy_F32(const char* label_id, const float* xs, const float* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotStairs_xy_F64(const char* label_id, const double* xs, const double* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_S8(const char* label_id, const ImS8* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_U8(const char* label_id, const ImU8* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_S16(const char* label_id, const ImS16* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_U16(const char* label_id, const ImU16* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_S32(const char* label_id, const ImS32* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_U32(const char* label_id, const ImU32* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_S64(const char* label_id, const ImS64* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_U64(const char* label_id, const ImU64* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_F32(const char* label_id, const float* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_F64(const char* label_id, const double* values, int count, double yref, double xscale, double xstart, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double yref, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double yref, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double yref, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double yref, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double yref, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double yref, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double yref, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double yref, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xy_F32(const char* label_id, const float* xs, const float* ys, int count, double yref, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xy_F64(const char* label_id, const double* xs, const double* ys, int count, double yref, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xyy_S8(const char* label_id, const ImS8* xs, const ImS8* ys1, const ImS8* ys2, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xyy_U8(const char* label_id, const ImU8* xs, const ImU8* ys1, const ImU8* ys2, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xyy_S16(const char* label_id, const ImS16* xs, const ImS16* ys1, const ImS16* ys2, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xyy_U16(const char* label_id, const ImU16* xs, const ImU16* ys1, const ImU16* ys2, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xyy_S32(const char* label_id, const ImS32* xs, const ImS32* ys1, const ImS32* ys2, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xyy_U32(const char* label_id, const ImU32* xs, const ImU32* ys1, const ImU32* ys2, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xyy_S64(const char* label_id, const ImS64* xs, const ImS64* ys1, const ImS64* ys2, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xyy_U64(const char* label_id, const ImU64* xs, const ImU64* ys1, const ImU64* ys2, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xyy_F32(const char* label_id, const float* xs, const float* ys1, const float* ys2, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotShaded_xyy_F64(const char* label_id, const double* xs, const double* ys1, const double* ys2, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_S8(const char* label_id, const ImS8* values, int count, double bar_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_U8(const char* label_id, const ImU8* values, int count, double bar_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_S16(const char* label_id, const ImS16* values, int count, double bar_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_U16(const char* label_id, const ImU16* values, int count, double bar_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_S32(const char* label_id, const ImS32* values, int count, double bar_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_U32(const char* label_id, const ImU32* values, int count, double bar_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_S64(const char* label_id, const ImS64* values, int count, double bar_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_U64(const char* label_id, const ImU64* values, int count, double bar_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_F32(const char* label_id, const float* values, int count, double bar_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_F64(const char* label_id, const double* values, int count, double bar_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double bar_size, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double bar_size, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double bar_size, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double bar_size, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double bar_size, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double bar_size, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double bar_size, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double bar_size, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_xy_F32(const char* label_id, const float* xs, const float* ys, int count, double bar_size, const ImPlotSpec& spec);
+IMPLOT_API void PlotBars_xy_F64(const char* label_id, const double* xs, const double* ys, int count, double bar_size, const ImPlotSpec& spec);
+IMPLOT_API void PlotBarGroups_S8(const char* const label_ids[], const ImS8* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBarGroups_U8(const char* const label_ids[], const ImU8* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBarGroups_S16(const char* const label_ids[], const ImS16* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBarGroups_U16(const char* const label_ids[], const ImU16* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBarGroups_S32(const char* const label_ids[], const ImS32* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBarGroups_U32(const char* const label_ids[], const ImU32* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBarGroups_S64(const char* const label_ids[], const ImS64* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBarGroups_U64(const char* const label_ids[], const ImU64* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBarGroups_F32(const char* const label_ids[], const float* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotBarGroups_F64(const char* const label_ids[], const double* values, int item_count, int group_count, double group_size, double shift, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xye_S8(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* err, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xye_U8(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* err, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xye_S16(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* err, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xye_U16(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* err, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xye_S32(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* err, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xye_U32(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* err, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xye_S64(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* err, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xye_U64(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* err, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xye_F32(const char* label_id, const float* xs, const float* ys, const float* err, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xye_F64(const char* label_id, const double* xs, const double* ys, const double* err, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xynp_S8(const char* label_id, const ImS8* xs, const ImS8* ys, const ImS8* neg, const ImS8* pos, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xynp_U8(const char* label_id, const ImU8* xs, const ImU8* ys, const ImU8* neg, const ImU8* pos, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xynp_S16(const char* label_id, const ImS16* xs, const ImS16* ys, const ImS16* neg, const ImS16* pos, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xynp_U16(const char* label_id, const ImU16* xs, const ImU16* ys, const ImU16* neg, const ImU16* pos, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xynp_S32(const char* label_id, const ImS32* xs, const ImS32* ys, const ImS32* neg, const ImS32* pos, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xynp_U32(const char* label_id, const ImU32* xs, const ImU32* ys, const ImU32* neg, const ImU32* pos, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xynp_S64(const char* label_id, const ImS64* xs, const ImS64* ys, const ImS64* neg, const ImS64* pos, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xynp_U64(const char* label_id, const ImU64* xs, const ImU64* ys, const ImU64* neg, const ImU64* pos, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xynp_F32(const char* label_id, const float* xs, const float* ys, const float* neg, const float* pos, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotErrorBars_xynp_F64(const char* label_id, const double* xs, const double* ys, const double* neg, const double* pos, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_S8(const char* label_id, const ImS8* values, int count, double ref, double scale, double start, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_U8(const char* label_id, const ImU8* values, int count, double ref, double scale, double start, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_S16(const char* label_id, const ImS16* values, int count, double ref, double scale, double start, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_U16(const char* label_id, const ImU16* values, int count, double ref, double scale, double start, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_S32(const char* label_id, const ImS32* values, int count, double ref, double scale, double start, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_U32(const char* label_id, const ImU32* values, int count, double ref, double scale, double start, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_S64(const char* label_id, const ImS64* values, int count, double ref, double scale, double start, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_U64(const char* label_id, const ImU64* values, int count, double ref, double scale, double start, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_F32(const char* label_id, const float* values, int count, double ref, double scale, double start, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_F64(const char* label_id, const double* values, int count, double ref, double scale, double start, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_xy_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, double ref, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_xy_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, double ref, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_xy_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, double ref, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_xy_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, double ref, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_xy_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, double ref, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_xy_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, double ref, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_xy_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, double ref, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_xy_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, double ref, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_xy_F32(const char* label_id, const float* xs, const float* ys, int count, double ref, const ImPlotSpec& spec);
+IMPLOT_API void PlotStems_xy_F64(const char* label_id, const double* xs, const double* ys, int count, double ref, const ImPlotSpec& spec);
+IMPLOT_API void PlotInfLines_S8(const char* label_id, const ImS8* values, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotInfLines_U8(const char* label_id, const ImU8* values, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotInfLines_S16(const char* label_id, const ImS16* values, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotInfLines_U16(const char* label_id, const ImU16* values, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotInfLines_S32(const char* label_id, const ImS32* values, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotInfLines_U32(const char* label_id, const ImU32* values, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotInfLines_S64(const char* label_id, const ImS64* values, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotInfLines_U64(const char* label_id, const ImU64* values, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotInfLines_F32(const char* label_id, const float* values, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotInfLines_F64(const char* label_id, const double* values, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_fmt_S8(const char* const label_ids[], const ImS8* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_fmt_U8(const char* const label_ids[], const ImU8* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_fmt_S16(const char* const label_ids[], const ImS16* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_fmt_U16(const char* const label_ids[], const ImU16* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_fmt_S32(const char* const label_ids[], const ImS32* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_fmt_U32(const char* const label_ids[], const ImU32* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_fmt_S64(const char* const label_ids[], const ImS64* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_fmt_U64(const char* const label_ids[], const ImU64* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_fmt_F32(const char* const label_ids[], const float* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_fmt_F64(const char* const label_ids[], const double* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_S8(const char* const label_ids[], const ImS8* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_U8(const char* const label_ids[], const ImU8* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_S16(const char* const label_ids[], const ImS16* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_U16(const char* const label_ids[], const ImU16* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_S32(const char* const label_ids[], const ImS32* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_U32(const char* const label_ids[], const ImU32* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_S64(const char* const label_ids[], const ImS64* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_U64(const char* const label_ids[], const ImU64* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_F32(const char* const label_ids[], const float* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotPieChart_F64(const char* const label_ids[], const double* values, int count, double x, double y, double radius, const char* label_fmt, double angle0, const ImPlotSpec& spec);
+IMPLOT_API void PlotHeatmap_S8(const char* label_id, const ImS8* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec);
+IMPLOT_API void PlotHeatmap_U8(const char* label_id, const ImU8* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec);
+IMPLOT_API void PlotHeatmap_S16(const char* label_id, const ImS16* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec);
+IMPLOT_API void PlotHeatmap_U16(const char* label_id, const ImU16* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec);
+IMPLOT_API void PlotHeatmap_S32(const char* label_id, const ImS32* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec);
+IMPLOT_API void PlotHeatmap_U32(const char* label_id, const ImU32* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec);
+IMPLOT_API void PlotHeatmap_S64(const char* label_id, const ImS64* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec);
+IMPLOT_API void PlotHeatmap_U64(const char* label_id, const ImU64* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec);
+IMPLOT_API void PlotHeatmap_F32(const char* label_id, const float* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec);
+IMPLOT_API void PlotHeatmap_F64(const char* label_id, const double* values, int rows, int cols, double scale_min, double scale_max, const char* label_fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram_S8(const char* label_id, const ImS8* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram_U8(const char* label_id, const ImU8* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram_S16(const char* label_id, const ImS16* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram_U16(const char* label_id, const ImU16* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram_S32(const char* label_id, const ImS32* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram_U32(const char* label_id, const ImU32* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram_S64(const char* label_id, const ImS64* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram_U64(const char* label_id, const ImU64* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram_F32(const char* label_id, const float* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram_F64(const char* label_id, const double* values, int count, int bins, double bar_scale, const ImPlotRange& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram2D_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram2D_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram2D_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram2D_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram2D_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram2D_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram2D_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram2D_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram2D_F32(const char* label_id, const float* xs, const float* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec);
+IMPLOT_API double PlotHistogram2D_F64(const char* label_id, const double* xs, const double* ys, int count, int x_bins, int y_bins, const ImPlotRect& range, const ImPlotSpec& spec);
+IMPLOT_API void PlotDigital_S8(const char* label_id, const ImS8* xs, const ImS8* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotDigital_U8(const char* label_id, const ImU8* xs, const ImU8* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotDigital_S16(const char* label_id, const ImS16* xs, const ImS16* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotDigital_U16(const char* label_id, const ImU16* xs, const ImU16* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotDigital_S32(const char* label_id, const ImS32* xs, const ImS32* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotDigital_U32(const char* label_id, const ImU32* xs, const ImU32* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotDigital_S64(const char* label_id, const ImS64* xs, const ImS64* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotDigital_U64(const char* label_id, const ImU64* xs, const ImU64* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotDigital_F32(const char* label_id, const float* xs, const float* ys, int count, const ImPlotSpec& spec);
+IMPLOT_API void PlotDigital_F64(const char* label_id, const double* xs, const double* ys, int count, const ImPlotSpec& spec);
+
+} // namespace ImPlot
diff --git a/dear-imgui-raw-implot.cabal b/dear-imgui-raw-implot.cabal
new file mode 100644
--- /dev/null
+++ b/dear-imgui-raw-implot.cabal
@@ -0,0 +1,108 @@
+cabal-version: 2.2
+
+-- This file has been generated from package.yaml by hpack version 0.39.6.
+--
+-- see: https://github.com/sol/hpack
+
+name:           dear-imgui-raw-implot
+version:        1.0.0
+synopsis:       Raw FFI bindings to implot (epezent/implot) for dear-imgui-raw.
+description:    Generated with dear_bindings from the bundled implot sources, compiled against the Dear ImGui build in dear-imgui-raw.
+category:       GUI
+maintainer:     IC Rainbow <aenor.realm@gmail.com>
+license:        BSD-3-Clause
+license-file:   LICENSE
+build-type:     Simple
+extra-doc-files:
+    README.md
+    CHANGELOG.md
+
+library
+  exposed-modules:
+      DearImGui.ImPlot.Context
+      DearImGui.Raw.ImPlot
+      DearImGui.Raw.ImPlot.Context
+      DearImGui.Raw.ImPlot.Enums.AxisFlags
+      DearImGui.Raw.ImPlot.Enums.BarGroupsFlags
+      DearImGui.Raw.ImPlot.Enums.BarsFlags
+      DearImGui.Raw.ImPlot.Enums.Bin
+      DearImGui.Raw.ImPlot.Enums.BubblesFlags
+      DearImGui.Raw.ImPlot.Enums.Col
+      DearImGui.Raw.ImPlot.Enums.Colormap
+      DearImGui.Raw.ImPlot.Enums.ColormapScaleFlags
+      DearImGui.Raw.ImPlot.Enums.Cond
+      DearImGui.Raw.ImPlot.Enums.DigitalFlags
+      DearImGui.Raw.ImPlot.Enums.DragToolFlags
+      DearImGui.Raw.ImPlot.Enums.DummyFlags
+      DearImGui.Raw.ImPlot.Enums.ErrorBarsFlags
+      DearImGui.Raw.ImPlot.Enums.Flags
+      DearImGui.Raw.ImPlot.Enums.HeatmapFlags
+      DearImGui.Raw.ImPlot.Enums.HistogramFlags
+      DearImGui.Raw.ImPlot.Enums.ImageFlags
+      DearImGui.Raw.ImPlot.Enums.ImAxis
+      DearImGui.Raw.ImPlot.Enums.InfLinesFlags
+      DearImGui.Raw.ImPlot.Enums.ItemFlags
+      DearImGui.Raw.ImPlot.Enums.LegendFlags
+      DearImGui.Raw.ImPlot.Enums.LineFlags
+      DearImGui.Raw.ImPlot.Enums.Location
+      DearImGui.Raw.ImPlot.Enums.Marker
+      DearImGui.Raw.ImPlot.Enums.MouseTextFlags
+      DearImGui.Raw.ImPlot.Enums.PieChartFlags
+      DearImGui.Raw.ImPlot.Enums.PolygonFlags
+      DearImGui.Raw.ImPlot.Enums.Prop
+      DearImGui.Raw.ImPlot.Enums.Scale
+      DearImGui.Raw.ImPlot.Enums.ScatterFlags
+      DearImGui.Raw.ImPlot.Enums.ShadedFlags
+      DearImGui.Raw.ImPlot.Enums.StairsFlags
+      DearImGui.Raw.ImPlot.Enums.StemsFlags
+      DearImGui.Raw.ImPlot.Enums.StyleVar
+      DearImGui.Raw.ImPlot.Enums.SubplotFlags
+      DearImGui.Raw.ImPlot.Enums.TextFlags
+      DearImGui.Raw.ImPlot.InputMap
+      DearImGui.Raw.ImPlot.Point
+      DearImGui.Raw.ImPlot.Range
+      DearImGui.Raw.ImPlot.Rect
+      DearImGui.Raw.ImPlot.Spec
+      DearImGui.Raw.ImPlot.Style
+  other-modules:
+      Paths_dear_imgui_raw_implot
+  autogen-modules:
+      Paths_dear_imgui_raw_implot
+  hs-source-dirs:
+      src
+  default-extensions:
+      BlockArguments
+      DataKinds
+      DuplicateRecordFields
+      LambdaCase
+      NoFieldSelectors
+      OverloadedRecordDot
+      OverloadedStrings
+      StrictData
+  ghc-options: -Wall -optc-Wno-discarded-qualifiers -optc-Wno-incompatible-pointer-types
+  cxx-options: -std=c++11 -fpermissive
+  include-dirs:
+      cbits
+      cbits/implot
+  install-includes:
+      dcimgui_implot.h
+      implot_shim.h
+      implot/implot.h
+      implot/implot_internal.h
+      DearImGuiWrappers.h
+  cxx-sources:
+      cbits/dcimgui_implot.cpp
+      cbits/implot_shim.cpp
+      cbits/implot/implot.cpp
+      cbits/implot/implot_items.cpp
+      cbits/DearImGuiWrappers.cpp
+      cbits/DearImGuiCtors.cpp
+  extra-libraries:
+      stdc++
+  build-tool-depends:
+      hsc2hs:hsc2hs
+  build-depends:
+      base >=4.16 && <5
+    , dear-imgui-raw ==1.0.*
+    , unliftio-core
+  default-language: GHC2021
diff --git a/src/DearImGui/ImPlot/Context.hs b/src/DearImGui/ImPlot/Context.hs
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/ImPlot/Context.hs
@@ -0,0 +1,12 @@
+-- | Exception-safe scope around 'ImPlot.createContext' / 'ImPlot.destroyContext'.
+module DearImGui.ImPlot.Context
+  ( withContext
+  ) where
+
+import Control.Monad.IO.Unlift (MonadUnliftIO)
+
+import DearImGui.Bracket (withCreated)
+import DearImGui.Raw.ImPlot qualified as ImPlot
+
+withContext :: (MonadUnliftIO m) => m a -> m a
+withContext = withCreated ImPlot.createContext ImPlot.destroyContext
diff --git a/src/DearImGui/Raw/ImPlot.hsc b/src/DearImGui/Raw/ImPlot.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot.hsc
@@ -0,0 +1,7579 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot
+  ( Formatter
+  , Getter
+  , Transform
+  , addColormap
+  , addColormapImU32Ptr
+  , annotation
+  , annotationStrUnformatted
+  , beginAlignedPlots
+  , beginDragDropSourceAxis
+  , beginDragDropSourceItem
+  , beginDragDropSourcePlot
+  , beginDragDropTargetAxis
+  , beginDragDropTargetLegend
+  , beginDragDropTargetPlot
+  , beginLegendPopup
+  , beginPlot
+  , beginSubplots
+  , bustColorCache
+  , c_annotation
+  , c_annotationStrUnformatted
+  , c_beginPlot
+  , c_beginSubplots
+  , c_colormapButton
+  , c_colormapScale
+  , c_dragLineX
+  , c_dragLineY
+  , c_dragPoint
+  , c_dragRect
+  , c_getColormapColor
+  , c_getLastItemColor
+  , c_getPlotPos
+  , c_getPlotSize
+  , c_itemIcon
+  , c_nextColormapColor
+  , c_plotBarGroups_F32
+  , c_plotBarGroups_F64
+  , c_plotBarGroups_S16
+  , c_plotBarGroups_S32
+  , c_plotBarGroups_S64
+  , c_plotBarGroups_S8
+  , c_plotBarGroups_U16
+  , c_plotBarGroups_U32
+  , c_plotBarGroups_U64
+  , c_plotBarGroups_U8
+  , c_plotBarsG
+  , c_plotBars_F32
+  , c_plotBars_F64
+  , c_plotBars_S16
+  , c_plotBars_S32
+  , c_plotBars_S64
+  , c_plotBars_S8
+  , c_plotBars_U16
+  , c_plotBars_U32
+  , c_plotBars_U64
+  , c_plotBars_U8
+  , c_plotBars_xy_F32
+  , c_plotBars_xy_F64
+  , c_plotBars_xy_S16
+  , c_plotBars_xy_S32
+  , c_plotBars_xy_S64
+  , c_plotBars_xy_S8
+  , c_plotBars_xy_U16
+  , c_plotBars_xy_U32
+  , c_plotBars_xy_U64
+  , c_plotBars_xy_U8
+  , c_plotBubbles_F32
+  , c_plotBubbles_F64
+  , c_plotBubbles_S16
+  , c_plotBubbles_S32
+  , c_plotBubbles_S64
+  , c_plotBubbles_S8
+  , c_plotBubbles_U16
+  , c_plotBubbles_U32
+  , c_plotBubbles_U64
+  , c_plotBubbles_U8
+  , c_plotBubbles_xy_F32
+  , c_plotBubbles_xy_F64
+  , c_plotBubbles_xy_S16
+  , c_plotBubbles_xy_S32
+  , c_plotBubbles_xy_S64
+  , c_plotBubbles_xy_S8
+  , c_plotBubbles_xy_U16
+  , c_plotBubbles_xy_U32
+  , c_plotBubbles_xy_U64
+  , c_plotBubbles_xy_U8
+  , c_plotDigitalG
+  , c_plotDigital_F32
+  , c_plotDigital_F64
+  , c_plotDigital_S16
+  , c_plotDigital_S32
+  , c_plotDigital_S64
+  , c_plotDigital_S8
+  , c_plotDigital_U16
+  , c_plotDigital_U32
+  , c_plotDigital_U64
+  , c_plotDigital_U8
+  , c_plotDummy
+  , c_plotErrorBars_xye_F32
+  , c_plotErrorBars_xye_F64
+  , c_plotErrorBars_xye_S16
+  , c_plotErrorBars_xye_S32
+  , c_plotErrorBars_xye_S64
+  , c_plotErrorBars_xye_S8
+  , c_plotErrorBars_xye_U16
+  , c_plotErrorBars_xye_U32
+  , c_plotErrorBars_xye_U64
+  , c_plotErrorBars_xye_U8
+  , c_plotErrorBars_xynp_F32
+  , c_plotErrorBars_xynp_F64
+  , c_plotErrorBars_xynp_S16
+  , c_plotErrorBars_xynp_S32
+  , c_plotErrorBars_xynp_S64
+  , c_plotErrorBars_xynp_S8
+  , c_plotErrorBars_xynp_U16
+  , c_plotErrorBars_xynp_U32
+  , c_plotErrorBars_xynp_U64
+  , c_plotErrorBars_xynp_U8
+  , c_plotHeatmap_F32
+  , c_plotHeatmap_F64
+  , c_plotHeatmap_S16
+  , c_plotHeatmap_S32
+  , c_plotHeatmap_S64
+  , c_plotHeatmap_S8
+  , c_plotHeatmap_U16
+  , c_plotHeatmap_U32
+  , c_plotHeatmap_U64
+  , c_plotHeatmap_U8
+  , c_plotHistogram2D_F32
+  , c_plotHistogram2D_F64
+  , c_plotHistogram2D_S16
+  , c_plotHistogram2D_S32
+  , c_plotHistogram2D_S64
+  , c_plotHistogram2D_S8
+  , c_plotHistogram2D_U16
+  , c_plotHistogram2D_U32
+  , c_plotHistogram2D_U64
+  , c_plotHistogram2D_U8
+  , c_plotHistogram_F32
+  , c_plotHistogram_F64
+  , c_plotHistogram_S16
+  , c_plotHistogram_S32
+  , c_plotHistogram_S64
+  , c_plotHistogram_S8
+  , c_plotHistogram_U16
+  , c_plotHistogram_U32
+  , c_plotHistogram_U64
+  , c_plotHistogram_U8
+  , c_plotImage
+  , c_plotInfLines_F32
+  , c_plotInfLines_F64
+  , c_plotInfLines_S16
+  , c_plotInfLines_S32
+  , c_plotInfLines_S64
+  , c_plotInfLines_S8
+  , c_plotInfLines_U16
+  , c_plotInfLines_U32
+  , c_plotInfLines_U64
+  , c_plotInfLines_U8
+  , c_plotLineG
+  , c_plotLine_F32
+  , c_plotLine_F64
+  , c_plotLine_S16
+  , c_plotLine_S32
+  , c_plotLine_S64
+  , c_plotLine_S8
+  , c_plotLine_U16
+  , c_plotLine_U32
+  , c_plotLine_U64
+  , c_plotLine_U8
+  , c_plotLine_xy_F32
+  , c_plotLine_xy_F64
+  , c_plotLine_xy_S16
+  , c_plotLine_xy_S32
+  , c_plotLine_xy_S64
+  , c_plotLine_xy_S8
+  , c_plotLine_xy_U16
+  , c_plotLine_xy_U32
+  , c_plotLine_xy_U64
+  , c_plotLine_xy_U8
+  , c_plotPieChart_F32
+  , c_plotPieChart_F64
+  , c_plotPieChart_S16
+  , c_plotPieChart_S32
+  , c_plotPieChart_S64
+  , c_plotPieChart_S8
+  , c_plotPieChart_U16
+  , c_plotPieChart_U32
+  , c_plotPieChart_U64
+  , c_plotPieChart_U8
+  , c_plotPieChart_fmt_F32
+  , c_plotPieChart_fmt_F64
+  , c_plotPieChart_fmt_S16
+  , c_plotPieChart_fmt_S32
+  , c_plotPieChart_fmt_S64
+  , c_plotPieChart_fmt_S8
+  , c_plotPieChart_fmt_U16
+  , c_plotPieChart_fmt_U32
+  , c_plotPieChart_fmt_U64
+  , c_plotPieChart_fmt_U8
+  , c_plotPolygon_F32
+  , c_plotPolygon_F64
+  , c_plotPolygon_S16
+  , c_plotPolygon_S32
+  , c_plotPolygon_S64
+  , c_plotPolygon_S8
+  , c_plotPolygon_U16
+  , c_plotPolygon_U32
+  , c_plotPolygon_U64
+  , c_plotPolygon_U8
+  , c_plotScatterG
+  , c_plotScatter_F32
+  , c_plotScatter_F64
+  , c_plotScatter_S16
+  , c_plotScatter_S32
+  , c_plotScatter_S64
+  , c_plotScatter_S8
+  , c_plotScatter_U16
+  , c_plotScatter_U32
+  , c_plotScatter_U64
+  , c_plotScatter_U8
+  , c_plotScatter_xy_F32
+  , c_plotScatter_xy_F64
+  , c_plotScatter_xy_S16
+  , c_plotScatter_xy_S32
+  , c_plotScatter_xy_S64
+  , c_plotScatter_xy_S8
+  , c_plotScatter_xy_U16
+  , c_plotScatter_xy_U32
+  , c_plotScatter_xy_U64
+  , c_plotScatter_xy_U8
+  , c_plotShadedG
+  , c_plotShaded_F32
+  , c_plotShaded_F64
+  , c_plotShaded_S16
+  , c_plotShaded_S32
+  , c_plotShaded_S64
+  , c_plotShaded_S8
+  , c_plotShaded_U16
+  , c_plotShaded_U32
+  , c_plotShaded_U64
+  , c_plotShaded_U8
+  , c_plotShaded_xy_F32
+  , c_plotShaded_xy_F64
+  , c_plotShaded_xy_S16
+  , c_plotShaded_xy_S32
+  , c_plotShaded_xy_S64
+  , c_plotShaded_xy_S8
+  , c_plotShaded_xy_U16
+  , c_plotShaded_xy_U32
+  , c_plotShaded_xy_U64
+  , c_plotShaded_xy_U8
+  , c_plotShaded_xyy_F32
+  , c_plotShaded_xyy_F64
+  , c_plotShaded_xyy_S16
+  , c_plotShaded_xyy_S32
+  , c_plotShaded_xyy_S64
+  , c_plotShaded_xyy_S8
+  , c_plotShaded_xyy_U16
+  , c_plotShaded_xyy_U32
+  , c_plotShaded_xyy_U64
+  , c_plotShaded_xyy_U8
+  , c_plotStairsG
+  , c_plotStairs_F32
+  , c_plotStairs_F64
+  , c_plotStairs_S16
+  , c_plotStairs_S32
+  , c_plotStairs_S64
+  , c_plotStairs_S8
+  , c_plotStairs_U16
+  , c_plotStairs_U32
+  , c_plotStairs_U64
+  , c_plotStairs_U8
+  , c_plotStairs_xy_F32
+  , c_plotStairs_xy_F64
+  , c_plotStairs_xy_S16
+  , c_plotStairs_xy_S32
+  , c_plotStairs_xy_S64
+  , c_plotStairs_xy_S8
+  , c_plotStairs_xy_U16
+  , c_plotStairs_xy_U32
+  , c_plotStairs_xy_U64
+  , c_plotStairs_xy_U8
+  , c_plotStems_F32
+  , c_plotStems_F64
+  , c_plotStems_S16
+  , c_plotStems_S32
+  , c_plotStems_S64
+  , c_plotStems_S8
+  , c_plotStems_U16
+  , c_plotStems_U32
+  , c_plotStems_U64
+  , c_plotStems_U8
+  , c_plotStems_xy_F32
+  , c_plotStems_xy_F64
+  , c_plotStems_xy_S16
+  , c_plotStems_xy_S32
+  , c_plotStems_xy_S64
+  , c_plotStems_xy_S8
+  , c_plotStems_xy_U16
+  , c_plotStems_xy_U32
+  , c_plotStems_xy_U64
+  , c_plotStems_xy_U8
+  , c_plotText
+  , c_plotToPixels
+  , c_plotToPixelsDouble
+  , c_pushStyleColorImVec4
+  , c_pushStyleVarImVec2
+  , c_sampleColormap
+  , c_tagX
+  , c_tagXStrUnformatted
+  , c_tagY
+  , c_tagYStrUnformatted
+  , cancelPlotSelection
+  , colormapButton
+  , colormapIcon
+  , colormapScale
+  , colormapSlider
+  , createContext
+  , destroyContext
+  , dragLineX
+  , dragLineY
+  , dragPoint
+  , dragRect
+  , endAlignedPlots
+  , endDragDropSource
+  , endDragDropTarget
+  , endLegendPopup
+  , endPlot
+  , endSubplots
+  , getColormapColor
+  , getColormapCount
+  , getColormapIndex
+  , getColormapName
+  , getColormapSize
+  , getCurrentContext
+  , getInputMap
+  , getLastItemColor
+  , getMarkerName
+  , getPlotDrawList
+  , getPlotPos
+  , getPlotSize
+  , getStyle
+  , getStyleColorName
+  , hideNextItem
+  , isAxisHovered
+  , isLegendEntryHovered
+  , isPlotHovered
+  , isPlotSelected
+  , isSubplotsHovered
+  , itemIcon
+  , itemIconImU32
+  , mapInputDefault
+  , mapInputReverse
+  , nextColormapColor
+  , nextMarker
+  , pattern IMPLOT_VERSION_NUM
+  , plotBarGroups_F32
+  , plotBarGroups_F64
+  , plotBarGroups_S16
+  , plotBarGroups_S32
+  , plotBarGroups_S64
+  , plotBarGroups_S8
+  , plotBarGroups_U16
+  , plotBarGroups_U32
+  , plotBarGroups_U64
+  , plotBarGroups_U8
+  , plotBarsG
+  , plotBars_F32
+  , plotBars_F64
+  , plotBars_S16
+  , plotBars_S32
+  , plotBars_S64
+  , plotBars_S8
+  , plotBars_U16
+  , plotBars_U32
+  , plotBars_U64
+  , plotBars_U8
+  , plotBars_xy_F32
+  , plotBars_xy_F64
+  , plotBars_xy_S16
+  , plotBars_xy_S32
+  , plotBars_xy_S64
+  , plotBars_xy_S8
+  , plotBars_xy_U16
+  , plotBars_xy_U32
+  , plotBars_xy_U64
+  , plotBars_xy_U8
+  , plotBubbles_F32
+  , plotBubbles_F64
+  , plotBubbles_S16
+  , plotBubbles_S32
+  , plotBubbles_S64
+  , plotBubbles_S8
+  , plotBubbles_U16
+  , plotBubbles_U32
+  , plotBubbles_U64
+  , plotBubbles_U8
+  , plotBubbles_xy_F32
+  , plotBubbles_xy_F64
+  , plotBubbles_xy_S16
+  , plotBubbles_xy_S32
+  , plotBubbles_xy_S64
+  , plotBubbles_xy_S8
+  , plotBubbles_xy_U16
+  , plotBubbles_xy_U32
+  , plotBubbles_xy_U64
+  , plotBubbles_xy_U8
+  , plotDigitalG
+  , plotDigital_F32
+  , plotDigital_F64
+  , plotDigital_S16
+  , plotDigital_S32
+  , plotDigital_S64
+  , plotDigital_S8
+  , plotDigital_U16
+  , plotDigital_U32
+  , plotDigital_U64
+  , plotDigital_U8
+  , plotDummy
+  , plotErrorBars_xye_F32
+  , plotErrorBars_xye_F64
+  , plotErrorBars_xye_S16
+  , plotErrorBars_xye_S32
+  , plotErrorBars_xye_S64
+  , plotErrorBars_xye_S8
+  , plotErrorBars_xye_U16
+  , plotErrorBars_xye_U32
+  , plotErrorBars_xye_U64
+  , plotErrorBars_xye_U8
+  , plotErrorBars_xynp_F32
+  , plotErrorBars_xynp_F64
+  , plotErrorBars_xynp_S16
+  , plotErrorBars_xynp_S32
+  , plotErrorBars_xynp_S64
+  , plotErrorBars_xynp_S8
+  , plotErrorBars_xynp_U16
+  , plotErrorBars_xynp_U32
+  , plotErrorBars_xynp_U64
+  , plotErrorBars_xynp_U8
+  , plotHeatmap_F32
+  , plotHeatmap_F64
+  , plotHeatmap_S16
+  , plotHeatmap_S32
+  , plotHeatmap_S64
+  , plotHeatmap_S8
+  , plotHeatmap_U16
+  , plotHeatmap_U32
+  , plotHeatmap_U64
+  , plotHeatmap_U8
+  , plotHistogram2D_F32
+  , plotHistogram2D_F64
+  , plotHistogram2D_S16
+  , plotHistogram2D_S32
+  , plotHistogram2D_S64
+  , plotHistogram2D_S8
+  , plotHistogram2D_U16
+  , plotHistogram2D_U32
+  , plotHistogram2D_U64
+  , plotHistogram2D_U8
+  , plotHistogram_F32
+  , plotHistogram_F64
+  , plotHistogram_S16
+  , plotHistogram_S32
+  , plotHistogram_S64
+  , plotHistogram_S8
+  , plotHistogram_U16
+  , plotHistogram_U32
+  , plotHistogram_U64
+  , plotHistogram_U8
+  , plotImage
+  , plotInfLines_F32
+  , plotInfLines_F64
+  , plotInfLines_S16
+  , plotInfLines_S32
+  , plotInfLines_S64
+  , plotInfLines_S8
+  , plotInfLines_U16
+  , plotInfLines_U32
+  , plotInfLines_U64
+  , plotInfLines_U8
+  , plotLineG
+  , plotLine_F32
+  , plotLine_F64
+  , plotLine_S16
+  , plotLine_S32
+  , plotLine_S64
+  , plotLine_S8
+  , plotLine_U16
+  , plotLine_U32
+  , plotLine_U64
+  , plotLine_U8
+  , plotLine_xy_F32
+  , plotLine_xy_F64
+  , plotLine_xy_S16
+  , plotLine_xy_S32
+  , plotLine_xy_S64
+  , plotLine_xy_S8
+  , plotLine_xy_U16
+  , plotLine_xy_U32
+  , plotLine_xy_U64
+  , plotLine_xy_U8
+  , plotPieChart_F32
+  , plotPieChart_F64
+  , plotPieChart_S16
+  , plotPieChart_S32
+  , plotPieChart_S64
+  , plotPieChart_S8
+  , plotPieChart_U16
+  , plotPieChart_U32
+  , plotPieChart_U64
+  , plotPieChart_U8
+  , plotPieChart_fmt_F32
+  , plotPieChart_fmt_F64
+  , plotPieChart_fmt_S16
+  , plotPieChart_fmt_S32
+  , plotPieChart_fmt_S64
+  , plotPieChart_fmt_S8
+  , plotPieChart_fmt_U16
+  , plotPieChart_fmt_U32
+  , plotPieChart_fmt_U64
+  , plotPieChart_fmt_U8
+  , plotPolygon_F32
+  , plotPolygon_F64
+  , plotPolygon_S16
+  , plotPolygon_S32
+  , plotPolygon_S64
+  , plotPolygon_S8
+  , plotPolygon_U16
+  , plotPolygon_U32
+  , plotPolygon_U64
+  , plotPolygon_U8
+  , plotScatterG
+  , plotScatter_F32
+  , plotScatter_F64
+  , plotScatter_S16
+  , plotScatter_S32
+  , plotScatter_S64
+  , plotScatter_S8
+  , plotScatter_U16
+  , plotScatter_U32
+  , plotScatter_U64
+  , plotScatter_U8
+  , plotScatter_xy_F32
+  , plotScatter_xy_F64
+  , plotScatter_xy_S16
+  , plotScatter_xy_S32
+  , plotScatter_xy_S64
+  , plotScatter_xy_S8
+  , plotScatter_xy_U16
+  , plotScatter_xy_U32
+  , plotScatter_xy_U64
+  , plotScatter_xy_U8
+  , plotShadedG
+  , plotShaded_F32
+  , plotShaded_F64
+  , plotShaded_S16
+  , plotShaded_S32
+  , plotShaded_S64
+  , plotShaded_S8
+  , plotShaded_U16
+  , plotShaded_U32
+  , plotShaded_U64
+  , plotShaded_U8
+  , plotShaded_xy_F32
+  , plotShaded_xy_F64
+  , plotShaded_xy_S16
+  , plotShaded_xy_S32
+  , plotShaded_xy_S64
+  , plotShaded_xy_S8
+  , plotShaded_xy_U16
+  , plotShaded_xy_U32
+  , plotShaded_xy_U64
+  , plotShaded_xy_U8
+  , plotShaded_xyy_F32
+  , plotShaded_xyy_F64
+  , plotShaded_xyy_S16
+  , plotShaded_xyy_S32
+  , plotShaded_xyy_S64
+  , plotShaded_xyy_S8
+  , plotShaded_xyy_U16
+  , plotShaded_xyy_U32
+  , plotShaded_xyy_U64
+  , plotShaded_xyy_U8
+  , plotStairsG
+  , plotStairs_F32
+  , plotStairs_F64
+  , plotStairs_S16
+  , plotStairs_S32
+  , plotStairs_S64
+  , plotStairs_S8
+  , plotStairs_U16
+  , plotStairs_U32
+  , plotStairs_U64
+  , plotStairs_U8
+  , plotStairs_xy_F32
+  , plotStairs_xy_F64
+  , plotStairs_xy_S16
+  , plotStairs_xy_S32
+  , plotStairs_xy_S64
+  , plotStairs_xy_S8
+  , plotStairs_xy_U16
+  , plotStairs_xy_U32
+  , plotStairs_xy_U64
+  , plotStairs_xy_U8
+  , plotStems_F32
+  , plotStems_F64
+  , plotStems_S16
+  , plotStems_S32
+  , plotStems_S64
+  , plotStems_S8
+  , plotStems_U16
+  , plotStems_U32
+  , plotStems_U64
+  , plotStems_U8
+  , plotStems_xy_F32
+  , plotStems_xy_F64
+  , plotStems_xy_S16
+  , plotStems_xy_S32
+  , plotStems_xy_S64
+  , plotStems_xy_S8
+  , plotStems_xy_U16
+  , plotStems_xy_U32
+  , plotStems_xy_U64
+  , plotStems_xy_U8
+  , plotText
+  , plotToPixels
+  , plotToPixelsDouble
+  , popColormap
+  , popPlotClipRect
+  , popStyleColor
+  , popStyleVar
+  , pushColormap
+  , pushColormapStr
+  , pushPlotClipRect
+  , pushStyleColor
+  , pushStyleColorImVec4
+  , pushStyleVar
+  , pushStyleVarImVec2
+  , pushStyleVarInt
+  , sampleColormap
+  , setAxes
+  , setAxis
+  , setCurrentContext
+  , setImGuiContext
+  , setNextAxesLimits
+  , setNextAxesToFit
+  , setNextAxisLimits
+  , setNextAxisLinks
+  , setNextAxisToFit
+  , setupAxes
+  , setupAxesLimits
+  , setupAxis
+  , setupAxisFormat
+  , setupAxisFormatImPlotFormatter
+  , setupAxisLimits
+  , setupAxisLimitsConstraints
+  , setupAxisLinks
+  , setupAxisScale
+  , setupAxisScaleImPlotTransform
+  , setupAxisTicks
+  , setupAxisTicksDouble
+  , setupAxisZoomConstraints
+  , setupFinish
+  , setupLegend
+  , setupMouseText
+  , showColormapSelector
+  , showInputMapSelector
+  , showMetricsWindow
+  , showStyleEditor
+  , showStyleSelector
+  , showUserGuide
+  , styleColorsAuto
+  , styleColorsClassic
+  , styleColorsDark
+  , styleColorsLight
+  , tagX
+  , tagXStrUnformatted
+  , tagY
+  , tagYStrUnformatted
+  ) where
+
+import DearImGui.Raw (ImS16, ImS32, ImS64, ImS8, ImU16, ImU32, ImU64, ImU8)
+import DearImGui.Raw.Enums.ImGuiDragDropFlags (ImGuiDragDropFlags)
+import DearImGui.Raw.Enums.ImGuiMouseButton (ImGuiMouseButton)
+import DearImGui.Raw.ImDrawList (ImDrawList)
+import DearImGui.Raw.ImGuiContext (ImGuiContext)
+import DearImGui.Raw.ImPlot.Context (Context)
+import DearImGui.Raw.ImPlot.Enums.AxisFlags (AxisFlags)
+import DearImGui.Raw.ImPlot.Enums.Col (Col)
+import DearImGui.Raw.ImPlot.Enums.Colormap (Colormap)
+import DearImGui.Raw.ImPlot.Enums.ColormapScaleFlags (ColormapScaleFlags)
+import DearImGui.Raw.ImPlot.Enums.Cond (Cond)
+import DearImGui.Raw.ImPlot.Enums.DragToolFlags (DragToolFlags)
+import DearImGui.Raw.ImPlot.Enums.Flags (Flags)
+import DearImGui.Raw.ImPlot.Enums.ImAxis (ImAxis)
+import DearImGui.Raw.ImPlot.Enums.LegendFlags (LegendFlags)
+import DearImGui.Raw.ImPlot.Enums.Location (Location)
+import DearImGui.Raw.ImPlot.Enums.Marker (Marker)
+import DearImGui.Raw.ImPlot.Enums.MouseTextFlags (MouseTextFlags)
+import DearImGui.Raw.ImPlot.Enums.Scale (Scale)
+import DearImGui.Raw.ImPlot.Enums.StyleVar (StyleVar)
+import DearImGui.Raw.ImPlot.Enums.SubplotFlags (SubplotFlags)
+import DearImGui.Raw.ImPlot.InputMap (InputMap)
+import DearImGui.Raw.ImPlot.Point (Point)
+import DearImGui.Raw.ImPlot.Range (Range)
+import DearImGui.Raw.ImPlot.Rect (Rect)
+import DearImGui.Raw.ImPlot.Spec (Spec)
+import DearImGui.Raw.ImPlot.Style (Style)
+import DearImGui.Raw.ImTextureRef (ImTextureRef)
+import DearImGui.Raw.ImVec2 (ImVec2)
+import DearImGui.Raw.ImVec4 (ImVec4)
+import Foreign.C.String (CString)
+import Foreign.C.Types
+import Foreign.Marshal.Alloc (alloca)
+import Foreign.Marshal.Utils (with)
+import Foreign.Ptr (FunPtr, Ptr)
+import Foreign.Storable (Storable (..))
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Callback signature for axis tick label formatter.
+type Formatter = FunPtr (Double -> (Ptr CChar) -> CInt -> (Ptr ()) -> IO CInt)
+
+-- | Callback signature for data getter.
+type Getter = FunPtr (CInt -> (Ptr ()) -> IO Point)
+
+-- | Callback signature for axis transform.
+type Transform = FunPtr (Double -> (Ptr ()) -> IO Double)
+
+-- defines
+
+pattern IMPLOT_VERSION_NUM :: (Eq a, Num a) => a
+pattern IMPLOT_VERSION_NUM = #{const IMPLOT_VERSION_NUM}
+
+-- functions
+
+-- C: ImPlotColormap ImPlot::AddColormap(const char* name, const ImVec4* cols, int size, bool qual)
+foreign import capi unsafe "dcimgui_implot.h ImPlotAddColormap"
+  addColormap
+    :: CString -- ^ name
+    -> (Ptr ImVec4) -- ^ cols
+    -> CInt -- ^ size
+    -> CBool -- ^ qual
+    -> IO Colormap
+
+-- C: ImPlotColormap ImPlot::AddColormap(const char* name, const ImU32* cols, int size, bool qual)
+foreign import capi unsafe "dcimgui_implot.h ImPlotAddColormapImU32Ptr"
+  addColormapImU32Ptr
+    :: CString -- ^ name
+    -> (Ptr ImU32) -- ^ cols
+    -> CInt -- ^ size
+    -> CBool -- ^ qual
+    -> IO Colormap
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotAnnotation_wrap"
+  c_annotation
+    :: Double -- ^ x
+    -> Double -- ^ y
+    -> (Ptr ImVec4) -- ^ col
+    -> (Ptr ImVec2) -- ^ pix_offset
+    -> CBool -- ^ clamp
+    -> CBool -- ^ round
+    -> IO ()
+
+annotation
+  :: Double -- ^ x
+  -> Double -- ^ y
+  -> ImVec4 -- ^ col
+  -> ImVec2 -- ^ pix_offset
+  -> CBool -- ^ clamp
+  -> CBool -- ^ round
+  -> IO ()
+annotation x y col pix_offset clamp round =
+  with col $ \colPtr -> with pix_offset $ \pix_offsetPtr -> c_annotation x y colPtr pix_offsetPtr clamp round
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotAnnotationStrUnformatted_wrap"
+  c_annotationStrUnformatted
+    :: Double -- ^ x
+    -> Double -- ^ y
+    -> (Ptr ImVec4) -- ^ col
+    -> (Ptr ImVec2) -- ^ pix_offset
+    -> CBool -- ^ clamp
+    -> CString -- ^ text
+    -> IO ()
+
+annotationStrUnformatted
+  :: Double -- ^ x
+  -> Double -- ^ y
+  -> ImVec4 -- ^ col
+  -> ImVec2 -- ^ pix_offset
+  -> CBool -- ^ clamp
+  -> CString -- ^ text
+  -> IO ()
+annotationStrUnformatted x y col pix_offset clamp text =
+  with col $ \colPtr -> with pix_offset $ \pix_offsetPtr -> c_annotationStrUnformatted x y colPtr pix_offsetPtr clamp text
+
+-- C: bool ImPlot::BeginAlignedPlots(const char* group_id, bool vertical)
+foreign import capi unsafe "dcimgui_implot.h ImPlotBeginAlignedPlots"
+  beginAlignedPlots
+    :: CString -- ^ group_id
+    -> CBool -- ^ vertical
+    -> IO CBool
+
+-- C: bool ImPlot::BeginDragDropSourceAxis(ImAxis axis, ImGuiDragDropFlags flags)
+foreign import capi unsafe "dcimgui_implot.h ImPlotBeginDragDropSourceAxis"
+  beginDragDropSourceAxis
+    :: ImAxis -- ^ axis
+    -> ImGuiDragDropFlags -- ^ flags
+    -> IO CBool
+
+-- C: bool ImPlot::BeginDragDropSourceItem(const char* label_id, ImGuiDragDropFlags flags)
+foreign import capi unsafe "dcimgui_implot.h ImPlotBeginDragDropSourceItem"
+  beginDragDropSourceItem
+    :: CString -- ^ label_id
+    -> ImGuiDragDropFlags -- ^ flags
+    -> IO CBool
+
+-- C: bool ImPlot::BeginDragDropSourcePlot(ImGuiDragDropFlags flags)
+foreign import capi unsafe "dcimgui_implot.h ImPlotBeginDragDropSourcePlot"
+  beginDragDropSourcePlot
+    :: ImGuiDragDropFlags -- ^ flags
+    -> IO CBool
+
+-- C: bool ImPlot::BeginDragDropTargetAxis(ImAxis axis)
+foreign import capi unsafe "dcimgui_implot.h ImPlotBeginDragDropTargetAxis"
+  beginDragDropTargetAxis
+    :: ImAxis -- ^ axis
+    -> IO CBool
+
+-- C: bool ImPlot::BeginDragDropTargetLegend()
+foreign import capi unsafe "dcimgui_implot.h ImPlotBeginDragDropTargetLegend"
+  beginDragDropTargetLegend :: IO CBool
+
+-- C: bool ImPlot::BeginDragDropTargetPlot()
+foreign import capi unsafe "dcimgui_implot.h ImPlotBeginDragDropTargetPlot"
+  beginDragDropTargetPlot :: IO CBool
+
+-- C: bool ImPlot::BeginLegendPopup(const char* label_id, ImGuiMouseButton mouse_button)
+foreign import capi unsafe "dcimgui_implot.h ImPlotBeginLegendPopup"
+  beginLegendPopup
+    :: CString -- ^ label_id
+    -> ImGuiMouseButton -- ^ mouse_button
+    -> IO CBool
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotBeginPlot_wrap"
+  c_beginPlot
+    :: CString -- ^ title_id
+    -> (Ptr ImVec2) -- ^ size
+    -> Flags -- ^ flags
+    -> IO CBool
+
+beginPlot
+  :: CString -- ^ title_id
+  -> ImVec2 -- ^ size
+  -> Flags -- ^ flags
+  -> IO CBool
+beginPlot title_id size flags =
+  with size $ \sizePtr -> c_beginPlot title_id sizePtr flags
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotBeginSubplots_wrap"
+  c_beginSubplots
+    :: CString -- ^ title_id
+    -> CInt -- ^ rows
+    -> CInt -- ^ cols
+    -> (Ptr ImVec2) -- ^ size
+    -> SubplotFlags -- ^ flags
+    -> (Ptr Float) -- ^ row_ratios
+    -> (Ptr Float) -- ^ col_ratios
+    -> IO CBool
+
+beginSubplots
+  :: CString -- ^ title_id
+  -> CInt -- ^ rows
+  -> CInt -- ^ cols
+  -> ImVec2 -- ^ size
+  -> SubplotFlags -- ^ flags
+  -> (Ptr Float) -- ^ row_ratios
+  -> (Ptr Float) -- ^ col_ratios
+  -> IO CBool
+beginSubplots title_id rows cols size flags row_ratios col_ratios =
+  with size $ \sizePtr -> c_beginSubplots title_id rows cols sizePtr flags row_ratios col_ratios
+
+-- C: void ImPlot::BustColorCache(const char* plot_title_id)
+foreign import capi unsafe "dcimgui_implot.h ImPlotBustColorCache"
+  bustColorCache
+    :: CString -- ^ plot_title_id
+    -> IO ()
+
+-- C: void ImPlot::CancelPlotSelection()
+foreign import capi unsafe "dcimgui_implot.h ImPlotCancelPlotSelection"
+  cancelPlotSelection :: IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotColormapButton_wrap"
+  c_colormapButton
+    :: CString -- ^ label
+    -> (Ptr ImVec2) -- ^ size
+    -> Colormap -- ^ cmap
+    -> IO CBool
+
+colormapButton
+  :: CString -- ^ label
+  -> ImVec2 -- ^ size
+  -> Colormap -- ^ cmap
+  -> IO CBool
+colormapButton label size cmap =
+  with size $ \sizePtr -> c_colormapButton label sizePtr cmap
+
+-- C: void ImPlot::ColormapIcon(ImPlotColormap cmap)
+foreign import capi unsafe "dcimgui_implot.h ImPlotColormapIcon"
+  colormapIcon
+    :: Colormap -- ^ cmap
+    -> IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotColormapScale_wrap"
+  c_colormapScale
+    :: CString -- ^ label
+    -> Double -- ^ scale_min
+    -> Double -- ^ scale_max
+    -> (Ptr ImVec2) -- ^ size
+    -> CString -- ^ format
+    -> ColormapScaleFlags -- ^ flags
+    -> Colormap -- ^ cmap
+    -> IO ()
+
+colormapScale
+  :: CString -- ^ label
+  -> Double -- ^ scale_min
+  -> Double -- ^ scale_max
+  -> ImVec2 -- ^ size
+  -> CString -- ^ format
+  -> ColormapScaleFlags -- ^ flags
+  -> Colormap -- ^ cmap
+  -> IO ()
+colormapScale label scale_min scale_max size format flags cmap =
+  with size $ \sizePtr -> c_colormapScale label scale_min scale_max sizePtr format flags cmap
+
+-- C: bool ImPlot::ColormapSlider(const char* label, float* t, ImVec4* out, const char* format, ImPlotColormap cmap)
+foreign import capi unsafe "dcimgui_implot.h ImPlotColormapSlider"
+  colormapSlider
+    :: CString -- ^ label
+    -> (Ptr Float) -- ^ t
+    -> (Ptr ImVec4) -- ^ out
+    -> CString -- ^ format
+    -> Colormap -- ^ cmap
+    -> IO CBool
+
+-- C: ImPlotContext* ImPlot::CreateContext()
+foreign import capi unsafe "dcimgui_implot.h ImPlotCreateContext"
+  createContext :: IO (Ptr Context)
+
+-- C: void ImPlot::DestroyContext(ImPlotContext* ctx)
+foreign import capi unsafe "dcimgui_implot.h ImPlotDestroyContext"
+  destroyContext
+    :: (Ptr Context) -- ^ ctx
+    -> IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotDragLineX_wrap"
+  c_dragLineX
+    :: CInt -- ^ id
+    -> (Ptr Double) -- ^ x
+    -> (Ptr ImVec4) -- ^ col
+    -> Float -- ^ thickness
+    -> DragToolFlags -- ^ flags
+    -> (Ptr CBool) -- ^ out_clicked
+    -> (Ptr CBool) -- ^ out_hovered
+    -> (Ptr CBool) -- ^ out_held
+    -> IO CBool
+
+dragLineX
+  :: CInt -- ^ id
+  -> (Ptr Double) -- ^ x
+  -> ImVec4 -- ^ col
+  -> Float -- ^ thickness
+  -> DragToolFlags -- ^ flags
+  -> (Ptr CBool) -- ^ out_clicked
+  -> (Ptr CBool) -- ^ out_hovered
+  -> (Ptr CBool) -- ^ out_held
+  -> IO CBool
+dragLineX id_ x col thickness flags out_clicked out_hovered out_held =
+  with col $ \colPtr -> c_dragLineX id_ x colPtr thickness flags out_clicked out_hovered out_held
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotDragLineY_wrap"
+  c_dragLineY
+    :: CInt -- ^ id
+    -> (Ptr Double) -- ^ y
+    -> (Ptr ImVec4) -- ^ col
+    -> Float -- ^ thickness
+    -> DragToolFlags -- ^ flags
+    -> (Ptr CBool) -- ^ out_clicked
+    -> (Ptr CBool) -- ^ out_hovered
+    -> (Ptr CBool) -- ^ out_held
+    -> IO CBool
+
+dragLineY
+  :: CInt -- ^ id
+  -> (Ptr Double) -- ^ y
+  -> ImVec4 -- ^ col
+  -> Float -- ^ thickness
+  -> DragToolFlags -- ^ flags
+  -> (Ptr CBool) -- ^ out_clicked
+  -> (Ptr CBool) -- ^ out_hovered
+  -> (Ptr CBool) -- ^ out_held
+  -> IO CBool
+dragLineY id_ y col thickness flags out_clicked out_hovered out_held =
+  with col $ \colPtr -> c_dragLineY id_ y colPtr thickness flags out_clicked out_hovered out_held
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotDragPoint_wrap"
+  c_dragPoint
+    :: CInt -- ^ id
+    -> (Ptr Double) -- ^ x
+    -> (Ptr Double) -- ^ y
+    -> (Ptr ImVec4) -- ^ col
+    -> Float -- ^ size
+    -> DragToolFlags -- ^ flags
+    -> (Ptr CBool) -- ^ out_clicked
+    -> (Ptr CBool) -- ^ out_hovered
+    -> (Ptr CBool) -- ^ out_held
+    -> IO CBool
+
+dragPoint
+  :: CInt -- ^ id
+  -> (Ptr Double) -- ^ x
+  -> (Ptr Double) -- ^ y
+  -> ImVec4 -- ^ col
+  -> Float -- ^ size
+  -> DragToolFlags -- ^ flags
+  -> (Ptr CBool) -- ^ out_clicked
+  -> (Ptr CBool) -- ^ out_hovered
+  -> (Ptr CBool) -- ^ out_held
+  -> IO CBool
+dragPoint id_ x y col size flags out_clicked out_hovered out_held =
+  with col $ \colPtr -> c_dragPoint id_ x y colPtr size flags out_clicked out_hovered out_held
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotDragRect_wrap"
+  c_dragRect
+    :: CInt -- ^ id
+    -> (Ptr Double) -- ^ x1
+    -> (Ptr Double) -- ^ y1
+    -> (Ptr Double) -- ^ x2
+    -> (Ptr Double) -- ^ y2
+    -> (Ptr ImVec4) -- ^ col
+    -> DragToolFlags -- ^ flags
+    -> (Ptr CBool) -- ^ out_clicked
+    -> (Ptr CBool) -- ^ out_hovered
+    -> (Ptr CBool) -- ^ out_held
+    -> IO CBool
+
+dragRect
+  :: CInt -- ^ id
+  -> (Ptr Double) -- ^ x1
+  -> (Ptr Double) -- ^ y1
+  -> (Ptr Double) -- ^ x2
+  -> (Ptr Double) -- ^ y2
+  -> ImVec4 -- ^ col
+  -> DragToolFlags -- ^ flags
+  -> (Ptr CBool) -- ^ out_clicked
+  -> (Ptr CBool) -- ^ out_hovered
+  -> (Ptr CBool) -- ^ out_held
+  -> IO CBool
+dragRect id_ x1 y1 x2 y2 col flags out_clicked out_hovered out_held =
+  with col $ \colPtr -> c_dragRect id_ x1 y1 x2 y2 colPtr flags out_clicked out_hovered out_held
+
+-- C: void ImPlot::EndAlignedPlots()
+foreign import capi unsafe "dcimgui_implot.h ImPlotEndAlignedPlots"
+  endAlignedPlots :: IO ()
+
+-- C: void ImPlot::EndDragDropSource()
+foreign import capi unsafe "dcimgui_implot.h ImPlotEndDragDropSource"
+  endDragDropSource :: IO ()
+
+-- C: void ImPlot::EndDragDropTarget()
+foreign import capi unsafe "dcimgui_implot.h ImPlotEndDragDropTarget"
+  endDragDropTarget :: IO ()
+
+-- C: void ImPlot::EndLegendPopup()
+foreign import capi unsafe "dcimgui_implot.h ImPlotEndLegendPopup"
+  endLegendPopup :: IO ()
+
+-- C: void ImPlot::EndPlot()
+foreign import capi unsafe "dcimgui_implot.h ImPlotEndPlot"
+  endPlot :: IO ()
+
+-- C: void ImPlot::EndSubplots()
+foreign import capi unsafe "dcimgui_implot.h ImPlotEndSubplots"
+  endSubplots :: IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotGetColormapColor_wrap"
+  c_getColormapColor
+    :: CInt -- ^ idx
+    -> Colormap -- ^ cmap
+    -> (Ptr ImVec4) -- ^ out
+    -> IO ()
+
+getColormapColor
+  :: CInt -- ^ idx
+  -> Colormap -- ^ cmap
+  -> IO ImVec4
+getColormapColor idx cmap =
+  alloca $ \outPtr -> c_getColormapColor idx cmap outPtr >> peek outPtr
+
+-- C: int ImPlot::GetColormapCount()
+foreign import capi unsafe "dcimgui_implot.h ImPlotGetColormapCount"
+  getColormapCount :: IO CInt
+
+-- C: ImPlotColormap ImPlot::GetColormapIndex(const char* name)
+foreign import capi unsafe "dcimgui_implot.h ImPlotGetColormapIndex"
+  getColormapIndex
+    :: CString -- ^ name
+    -> IO Colormap
+
+-- C: const char* ImPlot::GetColormapName(ImPlotColormap cmap)
+foreign import capi unsafe "dcimgui_implot.h ImPlotGetColormapName"
+  getColormapName
+    :: Colormap -- ^ cmap
+    -> IO CString
+
+-- C: int ImPlot::GetColormapSize(ImPlotColormap cmap)
+foreign import capi unsafe "dcimgui_implot.h ImPlotGetColormapSize"
+  getColormapSize
+    :: Colormap -- ^ cmap
+    -> IO CInt
+
+-- C: ImPlotContext* ImPlot::GetCurrentContext()
+foreign import capi unsafe "dcimgui_implot.h ImPlotGetCurrentContext"
+  getCurrentContext :: IO (Ptr Context)
+
+-- C: ImPlotInputMap* ImPlot::GetInputMap()
+foreign import capi unsafe "dcimgui_implot.h ImPlotGetInputMap"
+  getInputMap :: IO (Ptr InputMap)
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotGetLastItemColor_wrap"
+  c_getLastItemColor
+    :: (Ptr ImVec4) -- ^ out
+    -> IO ()
+
+getLastItemColor :: IO ImVec4
+getLastItemColor =
+  alloca $ \outPtr -> c_getLastItemColor outPtr >> peek outPtr
+
+-- C: const char* ImPlot::GetMarkerName(ImPlotMarker idx)
+foreign import capi unsafe "dcimgui_implot.h ImPlotGetMarkerName"
+  getMarkerName
+    :: Marker -- ^ idx
+    -> IO CString
+
+-- C: ImDrawList* ImPlot::GetPlotDrawList()
+foreign import capi unsafe "dcimgui_implot.h ImPlotGetPlotDrawList"
+  getPlotDrawList :: IO (Ptr ImDrawList)
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotGetPlotPos_wrap"
+  c_getPlotPos
+    :: (Ptr ImVec2) -- ^ out
+    -> IO ()
+
+getPlotPos :: IO ImVec2
+getPlotPos =
+  alloca $ \outPtr -> c_getPlotPos outPtr >> peek outPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotGetPlotSize_wrap"
+  c_getPlotSize
+    :: (Ptr ImVec2) -- ^ out
+    -> IO ()
+
+getPlotSize :: IO ImVec2
+getPlotSize =
+  alloca $ \outPtr -> c_getPlotSize outPtr >> peek outPtr
+
+-- C: ImPlotStyle* ImPlot::GetStyle()
+foreign import capi unsafe "dcimgui_implot.h ImPlotGetStyle"
+  getStyle :: IO (Ptr Style)
+
+-- C: const char* ImPlot::GetStyleColorName(ImPlotCol idx)
+foreign import capi unsafe "dcimgui_implot.h ImPlotGetStyleColorName"
+  getStyleColorName
+    :: Col -- ^ idx
+    -> IO CString
+
+-- C: void ImPlot::HideNextItem(bool hidden, ImPlotCond cond)
+foreign import capi unsafe "dcimgui_implot.h ImPlotHideNextItem"
+  hideNextItem
+    :: CBool -- ^ hidden
+    -> Cond -- ^ cond
+    -> IO ()
+
+-- C: bool ImPlot::IsAxisHovered(ImAxis axis)
+foreign import capi unsafe "dcimgui_implot.h ImPlotIsAxisHovered"
+  isAxisHovered
+    :: ImAxis -- ^ axis
+    -> IO CBool
+
+-- C: bool ImPlot::IsLegendEntryHovered(const char* label_id)
+foreign import capi unsafe "dcimgui_implot.h ImPlotIsLegendEntryHovered"
+  isLegendEntryHovered
+    :: CString -- ^ label_id
+    -> IO CBool
+
+-- C: bool ImPlot::IsPlotHovered()
+foreign import capi unsafe "dcimgui_implot.h ImPlotIsPlotHovered"
+  isPlotHovered :: IO CBool
+
+-- C: bool ImPlot::IsPlotSelected()
+foreign import capi unsafe "dcimgui_implot.h ImPlotIsPlotSelected"
+  isPlotSelected :: IO CBool
+
+-- C: bool ImPlot::IsSubplotsHovered()
+foreign import capi unsafe "dcimgui_implot.h ImPlotIsSubplotsHovered"
+  isSubplotsHovered :: IO CBool
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotItemIcon_wrap"
+  c_itemIcon
+    :: (Ptr ImVec4) -- ^ col
+    -> IO ()
+
+itemIcon
+  :: ImVec4 -- ^ col
+  -> IO ()
+itemIcon col =
+  with col $ \colPtr -> c_itemIcon colPtr
+
+-- C: void ImPlot::ItemIcon(ImU32 col)
+foreign import capi unsafe "dcimgui_implot.h ImPlotItemIconImU32"
+  itemIconImU32
+    :: ImU32 -- ^ col
+    -> IO ()
+
+-- C: void ImPlot::MapInputDefault(ImPlotInputMap* dst)
+foreign import capi unsafe "dcimgui_implot.h ImPlotMapInputDefault"
+  mapInputDefault
+    :: (Ptr InputMap) -- ^ dst
+    -> IO ()
+
+-- C: void ImPlot::MapInputReverse(ImPlotInputMap* dst)
+foreign import capi unsafe "dcimgui_implot.h ImPlotMapInputReverse"
+  mapInputReverse
+    :: (Ptr InputMap) -- ^ dst
+    -> IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotNextColormapColor_wrap"
+  c_nextColormapColor
+    :: (Ptr ImVec4) -- ^ out
+    -> IO ()
+
+nextColormapColor :: IO ImVec4
+nextColormapColor =
+  alloca $ \outPtr -> c_nextColormapColor outPtr >> peek outPtr
+
+-- C: ImPlotMarker ImPlot::NextMarker()
+foreign import capi unsafe "dcimgui_implot.h ImPlotNextMarker"
+  nextMarker :: IO Marker
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBarGroups_F32_wrap"
+  c_plotBarGroups_F32
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr Float) -- ^ values
+    -> CInt -- ^ item_count
+    -> CInt -- ^ group_count
+    -> Double -- ^ group_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBarGroups_F32
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr Float) -- ^ values
+  -> CInt -- ^ item_count
+  -> CInt -- ^ group_count
+  -> Double -- ^ group_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBarGroups_F32 label_ids values item_count group_count group_size shift spec =
+  with spec $ \specPtr -> c_plotBarGroups_F32 label_ids values item_count group_count group_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBarGroups_F64_wrap"
+  c_plotBarGroups_F64
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr Double) -- ^ values
+    -> CInt -- ^ item_count
+    -> CInt -- ^ group_count
+    -> Double -- ^ group_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBarGroups_F64
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr Double) -- ^ values
+  -> CInt -- ^ item_count
+  -> CInt -- ^ group_count
+  -> Double -- ^ group_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBarGroups_F64 label_ids values item_count group_count group_size shift spec =
+  with spec $ \specPtr -> c_plotBarGroups_F64 label_ids values item_count group_count group_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBarGroups_S16_wrap"
+  c_plotBarGroups_S16
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImS16) -- ^ values
+    -> CInt -- ^ item_count
+    -> CInt -- ^ group_count
+    -> Double -- ^ group_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBarGroups_S16
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImS16) -- ^ values
+  -> CInt -- ^ item_count
+  -> CInt -- ^ group_count
+  -> Double -- ^ group_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBarGroups_S16 label_ids values item_count group_count group_size shift spec =
+  with spec $ \specPtr -> c_plotBarGroups_S16 label_ids values item_count group_count group_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBarGroups_S32_wrap"
+  c_plotBarGroups_S32
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImS32) -- ^ values
+    -> CInt -- ^ item_count
+    -> CInt -- ^ group_count
+    -> Double -- ^ group_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBarGroups_S32
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImS32) -- ^ values
+  -> CInt -- ^ item_count
+  -> CInt -- ^ group_count
+  -> Double -- ^ group_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBarGroups_S32 label_ids values item_count group_count group_size shift spec =
+  with spec $ \specPtr -> c_plotBarGroups_S32 label_ids values item_count group_count group_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBarGroups_S64_wrap"
+  c_plotBarGroups_S64
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImS64) -- ^ values
+    -> CInt -- ^ item_count
+    -> CInt -- ^ group_count
+    -> Double -- ^ group_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBarGroups_S64
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImS64) -- ^ values
+  -> CInt -- ^ item_count
+  -> CInt -- ^ group_count
+  -> Double -- ^ group_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBarGroups_S64 label_ids values item_count group_count group_size shift spec =
+  with spec $ \specPtr -> c_plotBarGroups_S64 label_ids values item_count group_count group_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBarGroups_S8_wrap"
+  c_plotBarGroups_S8
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImS8) -- ^ values
+    -> CInt -- ^ item_count
+    -> CInt -- ^ group_count
+    -> Double -- ^ group_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBarGroups_S8
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImS8) -- ^ values
+  -> CInt -- ^ item_count
+  -> CInt -- ^ group_count
+  -> Double -- ^ group_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBarGroups_S8 label_ids values item_count group_count group_size shift spec =
+  with spec $ \specPtr -> c_plotBarGroups_S8 label_ids values item_count group_count group_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBarGroups_U16_wrap"
+  c_plotBarGroups_U16
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImU16) -- ^ values
+    -> CInt -- ^ item_count
+    -> CInt -- ^ group_count
+    -> Double -- ^ group_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBarGroups_U16
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImU16) -- ^ values
+  -> CInt -- ^ item_count
+  -> CInt -- ^ group_count
+  -> Double -- ^ group_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBarGroups_U16 label_ids values item_count group_count group_size shift spec =
+  with spec $ \specPtr -> c_plotBarGroups_U16 label_ids values item_count group_count group_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBarGroups_U32_wrap"
+  c_plotBarGroups_U32
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImU32) -- ^ values
+    -> CInt -- ^ item_count
+    -> CInt -- ^ group_count
+    -> Double -- ^ group_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBarGroups_U32
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImU32) -- ^ values
+  -> CInt -- ^ item_count
+  -> CInt -- ^ group_count
+  -> Double -- ^ group_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBarGroups_U32 label_ids values item_count group_count group_size shift spec =
+  with spec $ \specPtr -> c_plotBarGroups_U32 label_ids values item_count group_count group_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBarGroups_U64_wrap"
+  c_plotBarGroups_U64
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImU64) -- ^ values
+    -> CInt -- ^ item_count
+    -> CInt -- ^ group_count
+    -> Double -- ^ group_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBarGroups_U64
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImU64) -- ^ values
+  -> CInt -- ^ item_count
+  -> CInt -- ^ group_count
+  -> Double -- ^ group_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBarGroups_U64 label_ids values item_count group_count group_size shift spec =
+  with spec $ \specPtr -> c_plotBarGroups_U64 label_ids values item_count group_count group_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBarGroups_U8_wrap"
+  c_plotBarGroups_U8
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImU8) -- ^ values
+    -> CInt -- ^ item_count
+    -> CInt -- ^ group_count
+    -> Double -- ^ group_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBarGroups_U8
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImU8) -- ^ values
+  -> CInt -- ^ item_count
+  -> CInt -- ^ group_count
+  -> Double -- ^ group_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBarGroups_U8 label_ids values item_count group_count group_size shift spec =
+  with spec $ \specPtr -> c_plotBarGroups_U8 label_ids values item_count group_count group_size shift specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotBarsG_wrap"
+  c_plotBarsG
+    :: CString -- ^ label_id
+    -> Getter -- ^ getter
+    -> (Ptr ()) -- ^ data
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBarsG
+  :: CString -- ^ label_id
+  -> Getter -- ^ getter
+  -> (Ptr ()) -- ^ data
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Spec -- ^ spec
+  -> IO ()
+plotBarsG label_id getter data_ count bar_size spec =
+  with spec $ \specPtr -> c_plotBarsG label_id getter data_ count bar_size specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_F32_wrap"
+  c_plotBars_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_F32 label_id values count bar_size shift spec =
+  with spec $ \specPtr -> c_plotBars_F32 label_id values count bar_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_F64_wrap"
+  c_plotBars_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_F64 label_id values count bar_size shift spec =
+  with spec $ \specPtr -> c_plotBars_F64 label_id values count bar_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_S16_wrap"
+  c_plotBars_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_S16 label_id values count bar_size shift spec =
+  with spec $ \specPtr -> c_plotBars_S16 label_id values count bar_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_S32_wrap"
+  c_plotBars_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_S32 label_id values count bar_size shift spec =
+  with spec $ \specPtr -> c_plotBars_S32 label_id values count bar_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_S64_wrap"
+  c_plotBars_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_S64 label_id values count bar_size shift spec =
+  with spec $ \specPtr -> c_plotBars_S64 label_id values count bar_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_S8_wrap"
+  c_plotBars_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_S8 label_id values count bar_size shift spec =
+  with spec $ \specPtr -> c_plotBars_S8 label_id values count bar_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_U16_wrap"
+  c_plotBars_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_U16 label_id values count bar_size shift spec =
+  with spec $ \specPtr -> c_plotBars_U16 label_id values count bar_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_U32_wrap"
+  c_plotBars_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_U32 label_id values count bar_size shift spec =
+  with spec $ \specPtr -> c_plotBars_U32 label_id values count bar_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_U64_wrap"
+  c_plotBars_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_U64 label_id values count bar_size shift spec =
+  with spec $ \specPtr -> c_plotBars_U64 label_id values count bar_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_U8_wrap"
+  c_plotBars_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> Double -- ^ shift
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Double -- ^ shift
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_U8 label_id values count bar_size shift spec =
+  with spec $ \specPtr -> c_plotBars_U8 label_id values count bar_size shift specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_xy_F32_wrap"
+  c_plotBars_xy_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ xs
+    -> (Ptr Float) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_xy_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ xs
+  -> (Ptr Float) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_xy_F32 label_id xs ys count bar_size spec =
+  with spec $ \specPtr -> c_plotBars_xy_F32 label_id xs ys count bar_size specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_xy_F64_wrap"
+  c_plotBars_xy_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ xs
+    -> (Ptr Double) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_xy_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ xs
+  -> (Ptr Double) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_xy_F64 label_id xs ys count bar_size spec =
+  with spec $ \specPtr -> c_plotBars_xy_F64 label_id xs ys count bar_size specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_xy_S16_wrap"
+  c_plotBars_xy_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ xs
+    -> (Ptr ImS16) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_xy_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ xs
+  -> (Ptr ImS16) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_xy_S16 label_id xs ys count bar_size spec =
+  with spec $ \specPtr -> c_plotBars_xy_S16 label_id xs ys count bar_size specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_xy_S32_wrap"
+  c_plotBars_xy_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ xs
+    -> (Ptr ImS32) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_xy_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ xs
+  -> (Ptr ImS32) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_xy_S32 label_id xs ys count bar_size spec =
+  with spec $ \specPtr -> c_plotBars_xy_S32 label_id xs ys count bar_size specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_xy_S64_wrap"
+  c_plotBars_xy_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ xs
+    -> (Ptr ImS64) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_xy_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ xs
+  -> (Ptr ImS64) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_xy_S64 label_id xs ys count bar_size spec =
+  with spec $ \specPtr -> c_plotBars_xy_S64 label_id xs ys count bar_size specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_xy_S8_wrap"
+  c_plotBars_xy_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ xs
+    -> (Ptr ImS8) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_xy_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ xs
+  -> (Ptr ImS8) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_xy_S8 label_id xs ys count bar_size spec =
+  with spec $ \specPtr -> c_plotBars_xy_S8 label_id xs ys count bar_size specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_xy_U16_wrap"
+  c_plotBars_xy_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ xs
+    -> (Ptr ImU16) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_xy_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ xs
+  -> (Ptr ImU16) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_xy_U16 label_id xs ys count bar_size spec =
+  with spec $ \specPtr -> c_plotBars_xy_U16 label_id xs ys count bar_size specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_xy_U32_wrap"
+  c_plotBars_xy_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ xs
+    -> (Ptr ImU32) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_xy_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ xs
+  -> (Ptr ImU32) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_xy_U32 label_id xs ys count bar_size spec =
+  with spec $ \specPtr -> c_plotBars_xy_U32 label_id xs ys count bar_size specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_xy_U64_wrap"
+  c_plotBars_xy_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ xs
+    -> (Ptr ImU64) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_xy_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ xs
+  -> (Ptr ImU64) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_xy_U64 label_id xs ys count bar_size spec =
+  with spec $ \specPtr -> c_plotBars_xy_U64 label_id xs ys count bar_size specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBars_xy_U8_wrap"
+  c_plotBars_xy_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ xs
+    -> (Ptr ImU8) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ bar_size
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBars_xy_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ xs
+  -> (Ptr ImU8) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ bar_size
+  -> Spec -- ^ spec
+  -> IO ()
+plotBars_xy_U8 label_id xs ys count bar_size spec =
+  with spec $ \specPtr -> c_plotBars_xy_U8 label_id xs ys count bar_size specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_F32_wrap"
+  c_plotBubbles_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ values
+    -> (Ptr Float) -- ^ szs
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ values
+  -> (Ptr Float) -- ^ szs
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_F32 label_id values szs count xscale xstart spec =
+  with spec $ \specPtr -> c_plotBubbles_F32 label_id values szs count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_F64_wrap"
+  c_plotBubbles_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ values
+    -> (Ptr Double) -- ^ szs
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ values
+  -> (Ptr Double) -- ^ szs
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_F64 label_id values szs count xscale xstart spec =
+  with spec $ \specPtr -> c_plotBubbles_F64 label_id values szs count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_S16_wrap"
+  c_plotBubbles_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ values
+    -> (Ptr ImS16) -- ^ szs
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ values
+  -> (Ptr ImS16) -- ^ szs
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_S16 label_id values szs count xscale xstart spec =
+  with spec $ \specPtr -> c_plotBubbles_S16 label_id values szs count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_S32_wrap"
+  c_plotBubbles_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ values
+    -> (Ptr ImS32) -- ^ szs
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ values
+  -> (Ptr ImS32) -- ^ szs
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_S32 label_id values szs count xscale xstart spec =
+  with spec $ \specPtr -> c_plotBubbles_S32 label_id values szs count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_S64_wrap"
+  c_plotBubbles_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ values
+    -> (Ptr ImS64) -- ^ szs
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ values
+  -> (Ptr ImS64) -- ^ szs
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_S64 label_id values szs count xscale xstart spec =
+  with spec $ \specPtr -> c_plotBubbles_S64 label_id values szs count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_S8_wrap"
+  c_plotBubbles_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ values
+    -> (Ptr ImS8) -- ^ szs
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ values
+  -> (Ptr ImS8) -- ^ szs
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_S8 label_id values szs count xscale xstart spec =
+  with spec $ \specPtr -> c_plotBubbles_S8 label_id values szs count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_U16_wrap"
+  c_plotBubbles_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ values
+    -> (Ptr ImU16) -- ^ szs
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ values
+  -> (Ptr ImU16) -- ^ szs
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_U16 label_id values szs count xscale xstart spec =
+  with spec $ \specPtr -> c_plotBubbles_U16 label_id values szs count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_U32_wrap"
+  c_plotBubbles_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ values
+    -> (Ptr ImU32) -- ^ szs
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ values
+  -> (Ptr ImU32) -- ^ szs
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_U32 label_id values szs count xscale xstart spec =
+  with spec $ \specPtr -> c_plotBubbles_U32 label_id values szs count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_U64_wrap"
+  c_plotBubbles_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ values
+    -> (Ptr ImU64) -- ^ szs
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ values
+  -> (Ptr ImU64) -- ^ szs
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_U64 label_id values szs count xscale xstart spec =
+  with spec $ \specPtr -> c_plotBubbles_U64 label_id values szs count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_U8_wrap"
+  c_plotBubbles_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ values
+    -> (Ptr ImU8) -- ^ szs
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ values
+  -> (Ptr ImU8) -- ^ szs
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_U8 label_id values szs count xscale xstart spec =
+  with spec $ \specPtr -> c_plotBubbles_U8 label_id values szs count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_xy_F32_wrap"
+  c_plotBubbles_xy_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ xs
+    -> (Ptr Float) -- ^ ys
+    -> (Ptr Float) -- ^ szs
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_xy_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ xs
+  -> (Ptr Float) -- ^ ys
+  -> (Ptr Float) -- ^ szs
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_xy_F32 label_id xs ys szs count spec =
+  with spec $ \specPtr -> c_plotBubbles_xy_F32 label_id xs ys szs count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_xy_F64_wrap"
+  c_plotBubbles_xy_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ xs
+    -> (Ptr Double) -- ^ ys
+    -> (Ptr Double) -- ^ szs
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_xy_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ xs
+  -> (Ptr Double) -- ^ ys
+  -> (Ptr Double) -- ^ szs
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_xy_F64 label_id xs ys szs count spec =
+  with spec $ \specPtr -> c_plotBubbles_xy_F64 label_id xs ys szs count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_xy_S16_wrap"
+  c_plotBubbles_xy_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ xs
+    -> (Ptr ImS16) -- ^ ys
+    -> (Ptr ImS16) -- ^ szs
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_xy_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ xs
+  -> (Ptr ImS16) -- ^ ys
+  -> (Ptr ImS16) -- ^ szs
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_xy_S16 label_id xs ys szs count spec =
+  with spec $ \specPtr -> c_plotBubbles_xy_S16 label_id xs ys szs count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_xy_S32_wrap"
+  c_plotBubbles_xy_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ xs
+    -> (Ptr ImS32) -- ^ ys
+    -> (Ptr ImS32) -- ^ szs
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_xy_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ xs
+  -> (Ptr ImS32) -- ^ ys
+  -> (Ptr ImS32) -- ^ szs
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_xy_S32 label_id xs ys szs count spec =
+  with spec $ \specPtr -> c_plotBubbles_xy_S32 label_id xs ys szs count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_xy_S64_wrap"
+  c_plotBubbles_xy_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ xs
+    -> (Ptr ImS64) -- ^ ys
+    -> (Ptr ImS64) -- ^ szs
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_xy_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ xs
+  -> (Ptr ImS64) -- ^ ys
+  -> (Ptr ImS64) -- ^ szs
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_xy_S64 label_id xs ys szs count spec =
+  with spec $ \specPtr -> c_plotBubbles_xy_S64 label_id xs ys szs count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_xy_S8_wrap"
+  c_plotBubbles_xy_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ xs
+    -> (Ptr ImS8) -- ^ ys
+    -> (Ptr ImS8) -- ^ szs
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_xy_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ xs
+  -> (Ptr ImS8) -- ^ ys
+  -> (Ptr ImS8) -- ^ szs
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_xy_S8 label_id xs ys szs count spec =
+  with spec $ \specPtr -> c_plotBubbles_xy_S8 label_id xs ys szs count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_xy_U16_wrap"
+  c_plotBubbles_xy_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ xs
+    -> (Ptr ImU16) -- ^ ys
+    -> (Ptr ImU16) -- ^ szs
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_xy_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ xs
+  -> (Ptr ImU16) -- ^ ys
+  -> (Ptr ImU16) -- ^ szs
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_xy_U16 label_id xs ys szs count spec =
+  with spec $ \specPtr -> c_plotBubbles_xy_U16 label_id xs ys szs count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_xy_U32_wrap"
+  c_plotBubbles_xy_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ xs
+    -> (Ptr ImU32) -- ^ ys
+    -> (Ptr ImU32) -- ^ szs
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_xy_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ xs
+  -> (Ptr ImU32) -- ^ ys
+  -> (Ptr ImU32) -- ^ szs
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_xy_U32 label_id xs ys szs count spec =
+  with spec $ \specPtr -> c_plotBubbles_xy_U32 label_id xs ys szs count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_xy_U64_wrap"
+  c_plotBubbles_xy_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ xs
+    -> (Ptr ImU64) -- ^ ys
+    -> (Ptr ImU64) -- ^ szs
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_xy_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ xs
+  -> (Ptr ImU64) -- ^ ys
+  -> (Ptr ImU64) -- ^ szs
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_xy_U64 label_id xs ys szs count spec =
+  with spec $ \specPtr -> c_plotBubbles_xy_U64 label_id xs ys szs count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotBubbles_xy_U8_wrap"
+  c_plotBubbles_xy_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ xs
+    -> (Ptr ImU8) -- ^ ys
+    -> (Ptr ImU8) -- ^ szs
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotBubbles_xy_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ xs
+  -> (Ptr ImU8) -- ^ ys
+  -> (Ptr ImU8) -- ^ szs
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotBubbles_xy_U8 label_id xs ys szs count spec =
+  with spec $ \specPtr -> c_plotBubbles_xy_U8 label_id xs ys szs count specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotDigitalG_wrap"
+  c_plotDigitalG
+    :: CString -- ^ label_id
+    -> Getter -- ^ getter
+    -> (Ptr ()) -- ^ data
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotDigitalG
+  :: CString -- ^ label_id
+  -> Getter -- ^ getter
+  -> (Ptr ()) -- ^ data
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotDigitalG label_id getter data_ count spec =
+  with spec $ \specPtr -> c_plotDigitalG label_id getter data_ count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotDigital_F32_wrap"
+  c_plotDigital_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ xs
+    -> (Ptr Float) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotDigital_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ xs
+  -> (Ptr Float) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotDigital_F32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotDigital_F32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotDigital_F64_wrap"
+  c_plotDigital_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ xs
+    -> (Ptr Double) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotDigital_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ xs
+  -> (Ptr Double) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotDigital_F64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotDigital_F64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotDigital_S16_wrap"
+  c_plotDigital_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ xs
+    -> (Ptr ImS16) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotDigital_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ xs
+  -> (Ptr ImS16) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotDigital_S16 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotDigital_S16 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotDigital_S32_wrap"
+  c_plotDigital_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ xs
+    -> (Ptr ImS32) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotDigital_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ xs
+  -> (Ptr ImS32) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotDigital_S32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotDigital_S32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotDigital_S64_wrap"
+  c_plotDigital_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ xs
+    -> (Ptr ImS64) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotDigital_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ xs
+  -> (Ptr ImS64) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotDigital_S64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotDigital_S64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotDigital_S8_wrap"
+  c_plotDigital_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ xs
+    -> (Ptr ImS8) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotDigital_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ xs
+  -> (Ptr ImS8) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotDigital_S8 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotDigital_S8 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotDigital_U16_wrap"
+  c_plotDigital_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ xs
+    -> (Ptr ImU16) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotDigital_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ xs
+  -> (Ptr ImU16) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotDigital_U16 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotDigital_U16 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotDigital_U32_wrap"
+  c_plotDigital_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ xs
+    -> (Ptr ImU32) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotDigital_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ xs
+  -> (Ptr ImU32) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotDigital_U32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotDigital_U32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotDigital_U64_wrap"
+  c_plotDigital_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ xs
+    -> (Ptr ImU64) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotDigital_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ xs
+  -> (Ptr ImU64) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotDigital_U64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotDigital_U64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotDigital_U8_wrap"
+  c_plotDigital_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ xs
+    -> (Ptr ImU8) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotDigital_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ xs
+  -> (Ptr ImU8) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotDigital_U8 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotDigital_U8 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotDummy_wrap"
+  c_plotDummy
+    :: CString -- ^ label_id
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotDummy
+  :: CString -- ^ label_id
+  -> Spec -- ^ spec
+  -> IO ()
+plotDummy label_id spec =
+  with spec $ \specPtr -> c_plotDummy label_id specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xye_F32_wrap"
+  c_plotErrorBars_xye_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ xs
+    -> (Ptr Float) -- ^ ys
+    -> (Ptr Float) -- ^ err
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xye_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ xs
+  -> (Ptr Float) -- ^ ys
+  -> (Ptr Float) -- ^ err
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xye_F32 label_id xs ys err count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xye_F32 label_id xs ys err count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xye_F64_wrap"
+  c_plotErrorBars_xye_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ xs
+    -> (Ptr Double) -- ^ ys
+    -> (Ptr Double) -- ^ err
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xye_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ xs
+  -> (Ptr Double) -- ^ ys
+  -> (Ptr Double) -- ^ err
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xye_F64 label_id xs ys err count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xye_F64 label_id xs ys err count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xye_S16_wrap"
+  c_plotErrorBars_xye_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ xs
+    -> (Ptr ImS16) -- ^ ys
+    -> (Ptr ImS16) -- ^ err
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xye_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ xs
+  -> (Ptr ImS16) -- ^ ys
+  -> (Ptr ImS16) -- ^ err
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xye_S16 label_id xs ys err count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xye_S16 label_id xs ys err count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xye_S32_wrap"
+  c_plotErrorBars_xye_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ xs
+    -> (Ptr ImS32) -- ^ ys
+    -> (Ptr ImS32) -- ^ err
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xye_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ xs
+  -> (Ptr ImS32) -- ^ ys
+  -> (Ptr ImS32) -- ^ err
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xye_S32 label_id xs ys err count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xye_S32 label_id xs ys err count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xye_S64_wrap"
+  c_plotErrorBars_xye_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ xs
+    -> (Ptr ImS64) -- ^ ys
+    -> (Ptr ImS64) -- ^ err
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xye_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ xs
+  -> (Ptr ImS64) -- ^ ys
+  -> (Ptr ImS64) -- ^ err
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xye_S64 label_id xs ys err count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xye_S64 label_id xs ys err count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xye_S8_wrap"
+  c_plotErrorBars_xye_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ xs
+    -> (Ptr ImS8) -- ^ ys
+    -> (Ptr ImS8) -- ^ err
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xye_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ xs
+  -> (Ptr ImS8) -- ^ ys
+  -> (Ptr ImS8) -- ^ err
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xye_S8 label_id xs ys err count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xye_S8 label_id xs ys err count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xye_U16_wrap"
+  c_plotErrorBars_xye_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ xs
+    -> (Ptr ImU16) -- ^ ys
+    -> (Ptr ImU16) -- ^ err
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xye_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ xs
+  -> (Ptr ImU16) -- ^ ys
+  -> (Ptr ImU16) -- ^ err
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xye_U16 label_id xs ys err count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xye_U16 label_id xs ys err count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xye_U32_wrap"
+  c_plotErrorBars_xye_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ xs
+    -> (Ptr ImU32) -- ^ ys
+    -> (Ptr ImU32) -- ^ err
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xye_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ xs
+  -> (Ptr ImU32) -- ^ ys
+  -> (Ptr ImU32) -- ^ err
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xye_U32 label_id xs ys err count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xye_U32 label_id xs ys err count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xye_U64_wrap"
+  c_plotErrorBars_xye_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ xs
+    -> (Ptr ImU64) -- ^ ys
+    -> (Ptr ImU64) -- ^ err
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xye_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ xs
+  -> (Ptr ImU64) -- ^ ys
+  -> (Ptr ImU64) -- ^ err
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xye_U64 label_id xs ys err count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xye_U64 label_id xs ys err count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xye_U8_wrap"
+  c_plotErrorBars_xye_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ xs
+    -> (Ptr ImU8) -- ^ ys
+    -> (Ptr ImU8) -- ^ err
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xye_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ xs
+  -> (Ptr ImU8) -- ^ ys
+  -> (Ptr ImU8) -- ^ err
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xye_U8 label_id xs ys err count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xye_U8 label_id xs ys err count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xynp_F32_wrap"
+  c_plotErrorBars_xynp_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ xs
+    -> (Ptr Float) -- ^ ys
+    -> (Ptr Float) -- ^ neg
+    -> (Ptr Float) -- ^ pos
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xynp_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ xs
+  -> (Ptr Float) -- ^ ys
+  -> (Ptr Float) -- ^ neg
+  -> (Ptr Float) -- ^ pos
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xynp_F32 label_id xs ys neg pos count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xynp_F32 label_id xs ys neg pos count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xynp_F64_wrap"
+  c_plotErrorBars_xynp_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ xs
+    -> (Ptr Double) -- ^ ys
+    -> (Ptr Double) -- ^ neg
+    -> (Ptr Double) -- ^ pos
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xynp_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ xs
+  -> (Ptr Double) -- ^ ys
+  -> (Ptr Double) -- ^ neg
+  -> (Ptr Double) -- ^ pos
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xynp_F64 label_id xs ys neg pos count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xynp_F64 label_id xs ys neg pos count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xynp_S16_wrap"
+  c_plotErrorBars_xynp_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ xs
+    -> (Ptr ImS16) -- ^ ys
+    -> (Ptr ImS16) -- ^ neg
+    -> (Ptr ImS16) -- ^ pos
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xynp_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ xs
+  -> (Ptr ImS16) -- ^ ys
+  -> (Ptr ImS16) -- ^ neg
+  -> (Ptr ImS16) -- ^ pos
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xynp_S16 label_id xs ys neg pos count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xynp_S16 label_id xs ys neg pos count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xynp_S32_wrap"
+  c_plotErrorBars_xynp_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ xs
+    -> (Ptr ImS32) -- ^ ys
+    -> (Ptr ImS32) -- ^ neg
+    -> (Ptr ImS32) -- ^ pos
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xynp_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ xs
+  -> (Ptr ImS32) -- ^ ys
+  -> (Ptr ImS32) -- ^ neg
+  -> (Ptr ImS32) -- ^ pos
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xynp_S32 label_id xs ys neg pos count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xynp_S32 label_id xs ys neg pos count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xynp_S64_wrap"
+  c_plotErrorBars_xynp_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ xs
+    -> (Ptr ImS64) -- ^ ys
+    -> (Ptr ImS64) -- ^ neg
+    -> (Ptr ImS64) -- ^ pos
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xynp_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ xs
+  -> (Ptr ImS64) -- ^ ys
+  -> (Ptr ImS64) -- ^ neg
+  -> (Ptr ImS64) -- ^ pos
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xynp_S64 label_id xs ys neg pos count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xynp_S64 label_id xs ys neg pos count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xynp_S8_wrap"
+  c_plotErrorBars_xynp_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ xs
+    -> (Ptr ImS8) -- ^ ys
+    -> (Ptr ImS8) -- ^ neg
+    -> (Ptr ImS8) -- ^ pos
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xynp_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ xs
+  -> (Ptr ImS8) -- ^ ys
+  -> (Ptr ImS8) -- ^ neg
+  -> (Ptr ImS8) -- ^ pos
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xynp_S8 label_id xs ys neg pos count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xynp_S8 label_id xs ys neg pos count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xynp_U16_wrap"
+  c_plotErrorBars_xynp_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ xs
+    -> (Ptr ImU16) -- ^ ys
+    -> (Ptr ImU16) -- ^ neg
+    -> (Ptr ImU16) -- ^ pos
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xynp_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ xs
+  -> (Ptr ImU16) -- ^ ys
+  -> (Ptr ImU16) -- ^ neg
+  -> (Ptr ImU16) -- ^ pos
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xynp_U16 label_id xs ys neg pos count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xynp_U16 label_id xs ys neg pos count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xynp_U32_wrap"
+  c_plotErrorBars_xynp_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ xs
+    -> (Ptr ImU32) -- ^ ys
+    -> (Ptr ImU32) -- ^ neg
+    -> (Ptr ImU32) -- ^ pos
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xynp_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ xs
+  -> (Ptr ImU32) -- ^ ys
+  -> (Ptr ImU32) -- ^ neg
+  -> (Ptr ImU32) -- ^ pos
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xynp_U32 label_id xs ys neg pos count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xynp_U32 label_id xs ys neg pos count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xynp_U64_wrap"
+  c_plotErrorBars_xynp_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ xs
+    -> (Ptr ImU64) -- ^ ys
+    -> (Ptr ImU64) -- ^ neg
+    -> (Ptr ImU64) -- ^ pos
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xynp_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ xs
+  -> (Ptr ImU64) -- ^ ys
+  -> (Ptr ImU64) -- ^ neg
+  -> (Ptr ImU64) -- ^ pos
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xynp_U64 label_id xs ys neg pos count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xynp_U64 label_id xs ys neg pos count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotErrorBars_xynp_U8_wrap"
+  c_plotErrorBars_xynp_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ xs
+    -> (Ptr ImU8) -- ^ ys
+    -> (Ptr ImU8) -- ^ neg
+    -> (Ptr ImU8) -- ^ pos
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotErrorBars_xynp_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ xs
+  -> (Ptr ImU8) -- ^ ys
+  -> (Ptr ImU8) -- ^ neg
+  -> (Ptr ImU8) -- ^ pos
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotErrorBars_xynp_U8 label_id xs ys neg pos count spec =
+  with spec $ \specPtr -> c_plotErrorBars_xynp_U8 label_id xs ys neg pos count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHeatmap_F32_wrap"
+  c_plotHeatmap_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ values
+    -> CInt -- ^ rows
+    -> CInt -- ^ cols
+    -> Double -- ^ scale_min
+    -> Double -- ^ scale_max
+    -> CString -- ^ label_fmt
+    -> (Ptr Point) -- ^ bounds_min
+    -> (Ptr Point) -- ^ bounds_max
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotHeatmap_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ values
+  -> CInt -- ^ rows
+  -> CInt -- ^ cols
+  -> Double -- ^ scale_min
+  -> Double -- ^ scale_max
+  -> CString -- ^ label_fmt
+  -> Point -- ^ bounds_min
+  -> Point -- ^ bounds_max
+  -> Spec -- ^ spec
+  -> IO ()
+plotHeatmap_F32 label_id values rows cols scale_min scale_max label_fmt bounds_min bounds_max spec =
+  with bounds_min $ \bounds_minPtr -> with bounds_max $ \bounds_maxPtr -> with spec $ \specPtr -> c_plotHeatmap_F32 label_id values rows cols scale_min scale_max label_fmt bounds_minPtr bounds_maxPtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHeatmap_F64_wrap"
+  c_plotHeatmap_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ values
+    -> CInt -- ^ rows
+    -> CInt -- ^ cols
+    -> Double -- ^ scale_min
+    -> Double -- ^ scale_max
+    -> CString -- ^ label_fmt
+    -> (Ptr Point) -- ^ bounds_min
+    -> (Ptr Point) -- ^ bounds_max
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotHeatmap_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ values
+  -> CInt -- ^ rows
+  -> CInt -- ^ cols
+  -> Double -- ^ scale_min
+  -> Double -- ^ scale_max
+  -> CString -- ^ label_fmt
+  -> Point -- ^ bounds_min
+  -> Point -- ^ bounds_max
+  -> Spec -- ^ spec
+  -> IO ()
+plotHeatmap_F64 label_id values rows cols scale_min scale_max label_fmt bounds_min bounds_max spec =
+  with bounds_min $ \bounds_minPtr -> with bounds_max $ \bounds_maxPtr -> with spec $ \specPtr -> c_plotHeatmap_F64 label_id values rows cols scale_min scale_max label_fmt bounds_minPtr bounds_maxPtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHeatmap_S16_wrap"
+  c_plotHeatmap_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ values
+    -> CInt -- ^ rows
+    -> CInt -- ^ cols
+    -> Double -- ^ scale_min
+    -> Double -- ^ scale_max
+    -> CString -- ^ label_fmt
+    -> (Ptr Point) -- ^ bounds_min
+    -> (Ptr Point) -- ^ bounds_max
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotHeatmap_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ values
+  -> CInt -- ^ rows
+  -> CInt -- ^ cols
+  -> Double -- ^ scale_min
+  -> Double -- ^ scale_max
+  -> CString -- ^ label_fmt
+  -> Point -- ^ bounds_min
+  -> Point -- ^ bounds_max
+  -> Spec -- ^ spec
+  -> IO ()
+plotHeatmap_S16 label_id values rows cols scale_min scale_max label_fmt bounds_min bounds_max spec =
+  with bounds_min $ \bounds_minPtr -> with bounds_max $ \bounds_maxPtr -> with spec $ \specPtr -> c_plotHeatmap_S16 label_id values rows cols scale_min scale_max label_fmt bounds_minPtr bounds_maxPtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHeatmap_S32_wrap"
+  c_plotHeatmap_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ values
+    -> CInt -- ^ rows
+    -> CInt -- ^ cols
+    -> Double -- ^ scale_min
+    -> Double -- ^ scale_max
+    -> CString -- ^ label_fmt
+    -> (Ptr Point) -- ^ bounds_min
+    -> (Ptr Point) -- ^ bounds_max
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotHeatmap_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ values
+  -> CInt -- ^ rows
+  -> CInt -- ^ cols
+  -> Double -- ^ scale_min
+  -> Double -- ^ scale_max
+  -> CString -- ^ label_fmt
+  -> Point -- ^ bounds_min
+  -> Point -- ^ bounds_max
+  -> Spec -- ^ spec
+  -> IO ()
+plotHeatmap_S32 label_id values rows cols scale_min scale_max label_fmt bounds_min bounds_max spec =
+  with bounds_min $ \bounds_minPtr -> with bounds_max $ \bounds_maxPtr -> with spec $ \specPtr -> c_plotHeatmap_S32 label_id values rows cols scale_min scale_max label_fmt bounds_minPtr bounds_maxPtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHeatmap_S64_wrap"
+  c_plotHeatmap_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ values
+    -> CInt -- ^ rows
+    -> CInt -- ^ cols
+    -> Double -- ^ scale_min
+    -> Double -- ^ scale_max
+    -> CString -- ^ label_fmt
+    -> (Ptr Point) -- ^ bounds_min
+    -> (Ptr Point) -- ^ bounds_max
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotHeatmap_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ values
+  -> CInt -- ^ rows
+  -> CInt -- ^ cols
+  -> Double -- ^ scale_min
+  -> Double -- ^ scale_max
+  -> CString -- ^ label_fmt
+  -> Point -- ^ bounds_min
+  -> Point -- ^ bounds_max
+  -> Spec -- ^ spec
+  -> IO ()
+plotHeatmap_S64 label_id values rows cols scale_min scale_max label_fmt bounds_min bounds_max spec =
+  with bounds_min $ \bounds_minPtr -> with bounds_max $ \bounds_maxPtr -> with spec $ \specPtr -> c_plotHeatmap_S64 label_id values rows cols scale_min scale_max label_fmt bounds_minPtr bounds_maxPtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHeatmap_S8_wrap"
+  c_plotHeatmap_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ values
+    -> CInt -- ^ rows
+    -> CInt -- ^ cols
+    -> Double -- ^ scale_min
+    -> Double -- ^ scale_max
+    -> CString -- ^ label_fmt
+    -> (Ptr Point) -- ^ bounds_min
+    -> (Ptr Point) -- ^ bounds_max
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotHeatmap_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ values
+  -> CInt -- ^ rows
+  -> CInt -- ^ cols
+  -> Double -- ^ scale_min
+  -> Double -- ^ scale_max
+  -> CString -- ^ label_fmt
+  -> Point -- ^ bounds_min
+  -> Point -- ^ bounds_max
+  -> Spec -- ^ spec
+  -> IO ()
+plotHeatmap_S8 label_id values rows cols scale_min scale_max label_fmt bounds_min bounds_max spec =
+  with bounds_min $ \bounds_minPtr -> with bounds_max $ \bounds_maxPtr -> with spec $ \specPtr -> c_plotHeatmap_S8 label_id values rows cols scale_min scale_max label_fmt bounds_minPtr bounds_maxPtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHeatmap_U16_wrap"
+  c_plotHeatmap_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ values
+    -> CInt -- ^ rows
+    -> CInt -- ^ cols
+    -> Double -- ^ scale_min
+    -> Double -- ^ scale_max
+    -> CString -- ^ label_fmt
+    -> (Ptr Point) -- ^ bounds_min
+    -> (Ptr Point) -- ^ bounds_max
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotHeatmap_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ values
+  -> CInt -- ^ rows
+  -> CInt -- ^ cols
+  -> Double -- ^ scale_min
+  -> Double -- ^ scale_max
+  -> CString -- ^ label_fmt
+  -> Point -- ^ bounds_min
+  -> Point -- ^ bounds_max
+  -> Spec -- ^ spec
+  -> IO ()
+plotHeatmap_U16 label_id values rows cols scale_min scale_max label_fmt bounds_min bounds_max spec =
+  with bounds_min $ \bounds_minPtr -> with bounds_max $ \bounds_maxPtr -> with spec $ \specPtr -> c_plotHeatmap_U16 label_id values rows cols scale_min scale_max label_fmt bounds_minPtr bounds_maxPtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHeatmap_U32_wrap"
+  c_plotHeatmap_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ values
+    -> CInt -- ^ rows
+    -> CInt -- ^ cols
+    -> Double -- ^ scale_min
+    -> Double -- ^ scale_max
+    -> CString -- ^ label_fmt
+    -> (Ptr Point) -- ^ bounds_min
+    -> (Ptr Point) -- ^ bounds_max
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotHeatmap_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ values
+  -> CInt -- ^ rows
+  -> CInt -- ^ cols
+  -> Double -- ^ scale_min
+  -> Double -- ^ scale_max
+  -> CString -- ^ label_fmt
+  -> Point -- ^ bounds_min
+  -> Point -- ^ bounds_max
+  -> Spec -- ^ spec
+  -> IO ()
+plotHeatmap_U32 label_id values rows cols scale_min scale_max label_fmt bounds_min bounds_max spec =
+  with bounds_min $ \bounds_minPtr -> with bounds_max $ \bounds_maxPtr -> with spec $ \specPtr -> c_plotHeatmap_U32 label_id values rows cols scale_min scale_max label_fmt bounds_minPtr bounds_maxPtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHeatmap_U64_wrap"
+  c_plotHeatmap_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ values
+    -> CInt -- ^ rows
+    -> CInt -- ^ cols
+    -> Double -- ^ scale_min
+    -> Double -- ^ scale_max
+    -> CString -- ^ label_fmt
+    -> (Ptr Point) -- ^ bounds_min
+    -> (Ptr Point) -- ^ bounds_max
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotHeatmap_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ values
+  -> CInt -- ^ rows
+  -> CInt -- ^ cols
+  -> Double -- ^ scale_min
+  -> Double -- ^ scale_max
+  -> CString -- ^ label_fmt
+  -> Point -- ^ bounds_min
+  -> Point -- ^ bounds_max
+  -> Spec -- ^ spec
+  -> IO ()
+plotHeatmap_U64 label_id values rows cols scale_min scale_max label_fmt bounds_min bounds_max spec =
+  with bounds_min $ \bounds_minPtr -> with bounds_max $ \bounds_maxPtr -> with spec $ \specPtr -> c_plotHeatmap_U64 label_id values rows cols scale_min scale_max label_fmt bounds_minPtr bounds_maxPtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHeatmap_U8_wrap"
+  c_plotHeatmap_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ values
+    -> CInt -- ^ rows
+    -> CInt -- ^ cols
+    -> Double -- ^ scale_min
+    -> Double -- ^ scale_max
+    -> CString -- ^ label_fmt
+    -> (Ptr Point) -- ^ bounds_min
+    -> (Ptr Point) -- ^ bounds_max
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotHeatmap_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ values
+  -> CInt -- ^ rows
+  -> CInt -- ^ cols
+  -> Double -- ^ scale_min
+  -> Double -- ^ scale_max
+  -> CString -- ^ label_fmt
+  -> Point -- ^ bounds_min
+  -> Point -- ^ bounds_max
+  -> Spec -- ^ spec
+  -> IO ()
+plotHeatmap_U8 label_id values rows cols scale_min scale_max label_fmt bounds_min bounds_max spec =
+  with bounds_min $ \bounds_minPtr -> with bounds_max $ \bounds_maxPtr -> with spec $ \specPtr -> c_plotHeatmap_U8 label_id values rows cols scale_min scale_max label_fmt bounds_minPtr bounds_maxPtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram2D_F32_wrap"
+  c_plotHistogram2D_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ xs
+    -> (Ptr Float) -- ^ ys
+    -> CInt -- ^ count
+    -> CInt -- ^ x_bins
+    -> CInt -- ^ y_bins
+    -> (Ptr Rect) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram2D_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ xs
+  -> (Ptr Float) -- ^ ys
+  -> CInt -- ^ count
+  -> CInt -- ^ x_bins
+  -> CInt -- ^ y_bins
+  -> Rect -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram2D_F32 label_id xs ys count x_bins y_bins range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram2D_F32 label_id xs ys count x_bins y_bins rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram2D_F64_wrap"
+  c_plotHistogram2D_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ xs
+    -> (Ptr Double) -- ^ ys
+    -> CInt -- ^ count
+    -> CInt -- ^ x_bins
+    -> CInt -- ^ y_bins
+    -> (Ptr Rect) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram2D_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ xs
+  -> (Ptr Double) -- ^ ys
+  -> CInt -- ^ count
+  -> CInt -- ^ x_bins
+  -> CInt -- ^ y_bins
+  -> Rect -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram2D_F64 label_id xs ys count x_bins y_bins range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram2D_F64 label_id xs ys count x_bins y_bins rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram2D_S16_wrap"
+  c_plotHistogram2D_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ xs
+    -> (Ptr ImS16) -- ^ ys
+    -> CInt -- ^ count
+    -> CInt -- ^ x_bins
+    -> CInt -- ^ y_bins
+    -> (Ptr Rect) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram2D_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ xs
+  -> (Ptr ImS16) -- ^ ys
+  -> CInt -- ^ count
+  -> CInt -- ^ x_bins
+  -> CInt -- ^ y_bins
+  -> Rect -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram2D_S16 label_id xs ys count x_bins y_bins range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram2D_S16 label_id xs ys count x_bins y_bins rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram2D_S32_wrap"
+  c_plotHistogram2D_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ xs
+    -> (Ptr ImS32) -- ^ ys
+    -> CInt -- ^ count
+    -> CInt -- ^ x_bins
+    -> CInt -- ^ y_bins
+    -> (Ptr Rect) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram2D_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ xs
+  -> (Ptr ImS32) -- ^ ys
+  -> CInt -- ^ count
+  -> CInt -- ^ x_bins
+  -> CInt -- ^ y_bins
+  -> Rect -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram2D_S32 label_id xs ys count x_bins y_bins range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram2D_S32 label_id xs ys count x_bins y_bins rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram2D_S64_wrap"
+  c_plotHistogram2D_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ xs
+    -> (Ptr ImS64) -- ^ ys
+    -> CInt -- ^ count
+    -> CInt -- ^ x_bins
+    -> CInt -- ^ y_bins
+    -> (Ptr Rect) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram2D_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ xs
+  -> (Ptr ImS64) -- ^ ys
+  -> CInt -- ^ count
+  -> CInt -- ^ x_bins
+  -> CInt -- ^ y_bins
+  -> Rect -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram2D_S64 label_id xs ys count x_bins y_bins range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram2D_S64 label_id xs ys count x_bins y_bins rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram2D_S8_wrap"
+  c_plotHistogram2D_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ xs
+    -> (Ptr ImS8) -- ^ ys
+    -> CInt -- ^ count
+    -> CInt -- ^ x_bins
+    -> CInt -- ^ y_bins
+    -> (Ptr Rect) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram2D_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ xs
+  -> (Ptr ImS8) -- ^ ys
+  -> CInt -- ^ count
+  -> CInt -- ^ x_bins
+  -> CInt -- ^ y_bins
+  -> Rect -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram2D_S8 label_id xs ys count x_bins y_bins range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram2D_S8 label_id xs ys count x_bins y_bins rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram2D_U16_wrap"
+  c_plotHistogram2D_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ xs
+    -> (Ptr ImU16) -- ^ ys
+    -> CInt -- ^ count
+    -> CInt -- ^ x_bins
+    -> CInt -- ^ y_bins
+    -> (Ptr Rect) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram2D_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ xs
+  -> (Ptr ImU16) -- ^ ys
+  -> CInt -- ^ count
+  -> CInt -- ^ x_bins
+  -> CInt -- ^ y_bins
+  -> Rect -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram2D_U16 label_id xs ys count x_bins y_bins range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram2D_U16 label_id xs ys count x_bins y_bins rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram2D_U32_wrap"
+  c_plotHistogram2D_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ xs
+    -> (Ptr ImU32) -- ^ ys
+    -> CInt -- ^ count
+    -> CInt -- ^ x_bins
+    -> CInt -- ^ y_bins
+    -> (Ptr Rect) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram2D_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ xs
+  -> (Ptr ImU32) -- ^ ys
+  -> CInt -- ^ count
+  -> CInt -- ^ x_bins
+  -> CInt -- ^ y_bins
+  -> Rect -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram2D_U32 label_id xs ys count x_bins y_bins range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram2D_U32 label_id xs ys count x_bins y_bins rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram2D_U64_wrap"
+  c_plotHistogram2D_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ xs
+    -> (Ptr ImU64) -- ^ ys
+    -> CInt -- ^ count
+    -> CInt -- ^ x_bins
+    -> CInt -- ^ y_bins
+    -> (Ptr Rect) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram2D_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ xs
+  -> (Ptr ImU64) -- ^ ys
+  -> CInt -- ^ count
+  -> CInt -- ^ x_bins
+  -> CInt -- ^ y_bins
+  -> Rect -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram2D_U64 label_id xs ys count x_bins y_bins range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram2D_U64 label_id xs ys count x_bins y_bins rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram2D_U8_wrap"
+  c_plotHistogram2D_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ xs
+    -> (Ptr ImU8) -- ^ ys
+    -> CInt -- ^ count
+    -> CInt -- ^ x_bins
+    -> CInt -- ^ y_bins
+    -> (Ptr Rect) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram2D_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ xs
+  -> (Ptr ImU8) -- ^ ys
+  -> CInt -- ^ count
+  -> CInt -- ^ x_bins
+  -> CInt -- ^ y_bins
+  -> Rect -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram2D_U8 label_id xs ys count x_bins y_bins range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram2D_U8 label_id xs ys count x_bins y_bins rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram_F32_wrap"
+  c_plotHistogram_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ values
+    -> CInt -- ^ count
+    -> CInt -- ^ bins
+    -> Double -- ^ bar_scale
+    -> (Ptr Range) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ values
+  -> CInt -- ^ count
+  -> CInt -- ^ bins
+  -> Double -- ^ bar_scale
+  -> Range -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram_F32 label_id values count bins bar_scale range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram_F32 label_id values count bins bar_scale rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram_F64_wrap"
+  c_plotHistogram_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ values
+    -> CInt -- ^ count
+    -> CInt -- ^ bins
+    -> Double -- ^ bar_scale
+    -> (Ptr Range) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ values
+  -> CInt -- ^ count
+  -> CInt -- ^ bins
+  -> Double -- ^ bar_scale
+  -> Range -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram_F64 label_id values count bins bar_scale range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram_F64 label_id values count bins bar_scale rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram_S16_wrap"
+  c_plotHistogram_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ values
+    -> CInt -- ^ count
+    -> CInt -- ^ bins
+    -> Double -- ^ bar_scale
+    -> (Ptr Range) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ values
+  -> CInt -- ^ count
+  -> CInt -- ^ bins
+  -> Double -- ^ bar_scale
+  -> Range -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram_S16 label_id values count bins bar_scale range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram_S16 label_id values count bins bar_scale rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram_S32_wrap"
+  c_plotHistogram_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ values
+    -> CInt -- ^ count
+    -> CInt -- ^ bins
+    -> Double -- ^ bar_scale
+    -> (Ptr Range) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ values
+  -> CInt -- ^ count
+  -> CInt -- ^ bins
+  -> Double -- ^ bar_scale
+  -> Range -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram_S32 label_id values count bins bar_scale range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram_S32 label_id values count bins bar_scale rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram_S64_wrap"
+  c_plotHistogram_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ values
+    -> CInt -- ^ count
+    -> CInt -- ^ bins
+    -> Double -- ^ bar_scale
+    -> (Ptr Range) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ values
+  -> CInt -- ^ count
+  -> CInt -- ^ bins
+  -> Double -- ^ bar_scale
+  -> Range -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram_S64 label_id values count bins bar_scale range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram_S64 label_id values count bins bar_scale rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram_S8_wrap"
+  c_plotHistogram_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ values
+    -> CInt -- ^ count
+    -> CInt -- ^ bins
+    -> Double -- ^ bar_scale
+    -> (Ptr Range) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ values
+  -> CInt -- ^ count
+  -> CInt -- ^ bins
+  -> Double -- ^ bar_scale
+  -> Range -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram_S8 label_id values count bins bar_scale range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram_S8 label_id values count bins bar_scale rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram_U16_wrap"
+  c_plotHistogram_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ values
+    -> CInt -- ^ count
+    -> CInt -- ^ bins
+    -> Double -- ^ bar_scale
+    -> (Ptr Range) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ values
+  -> CInt -- ^ count
+  -> CInt -- ^ bins
+  -> Double -- ^ bar_scale
+  -> Range -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram_U16 label_id values count bins bar_scale range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram_U16 label_id values count bins bar_scale rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram_U32_wrap"
+  c_plotHistogram_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ values
+    -> CInt -- ^ count
+    -> CInt -- ^ bins
+    -> Double -- ^ bar_scale
+    -> (Ptr Range) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ values
+  -> CInt -- ^ count
+  -> CInt -- ^ bins
+  -> Double -- ^ bar_scale
+  -> Range -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram_U32 label_id values count bins bar_scale range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram_U32 label_id values count bins bar_scale rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram_U64_wrap"
+  c_plotHistogram_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ values
+    -> CInt -- ^ count
+    -> CInt -- ^ bins
+    -> Double -- ^ bar_scale
+    -> (Ptr Range) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ values
+  -> CInt -- ^ count
+  -> CInt -- ^ bins
+  -> Double -- ^ bar_scale
+  -> Range -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram_U64 label_id values count bins bar_scale range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram_U64 label_id values count bins bar_scale rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotHistogram_U8_wrap"
+  c_plotHistogram_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ values
+    -> CInt -- ^ count
+    -> CInt -- ^ bins
+    -> Double -- ^ bar_scale
+    -> (Ptr Range) -- ^ range
+    -> (Ptr Spec) -- ^ spec
+    -> IO Double
+
+plotHistogram_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ values
+  -> CInt -- ^ count
+  -> CInt -- ^ bins
+  -> Double -- ^ bar_scale
+  -> Range -- ^ range
+  -> Spec -- ^ spec
+  -> IO Double
+plotHistogram_U8 label_id values count bins bar_scale range spec =
+  with range $ \rangePtr -> with spec $ \specPtr -> c_plotHistogram_U8 label_id values count bins bar_scale rangePtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotImage_wrap"
+  c_plotImage
+    :: CString -- ^ label_id
+    -> (Ptr ImTextureRef) -- ^ tex_ref
+    -> (Ptr Point) -- ^ bounds_min
+    -> (Ptr Point) -- ^ bounds_max
+    -> (Ptr ImVec2) -- ^ uv0
+    -> (Ptr ImVec2) -- ^ uv1
+    -> (Ptr ImVec4) -- ^ tint_col
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotImage
+  :: CString -- ^ label_id
+  -> ImTextureRef -- ^ tex_ref
+  -> Point -- ^ bounds_min
+  -> Point -- ^ bounds_max
+  -> ImVec2 -- ^ uv0
+  -> ImVec2 -- ^ uv1
+  -> ImVec4 -- ^ tint_col
+  -> Spec -- ^ spec
+  -> IO ()
+plotImage label_id tex_ref bounds_min bounds_max uv0 uv1 tint_col spec =
+  with tex_ref $ \tex_refPtr -> with bounds_min $ \bounds_minPtr -> with bounds_max $ \bounds_maxPtr -> with uv0 $ \uv0Ptr -> with uv1 $ \uv1Ptr -> with tint_col $ \tint_colPtr -> with spec $ \specPtr -> c_plotImage label_id tex_refPtr bounds_minPtr bounds_maxPtr uv0Ptr uv1Ptr tint_colPtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotInfLines_F32_wrap"
+  c_plotInfLines_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ values
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotInfLines_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ values
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotInfLines_F32 label_id values count spec =
+  with spec $ \specPtr -> c_plotInfLines_F32 label_id values count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotInfLines_F64_wrap"
+  c_plotInfLines_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ values
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotInfLines_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ values
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotInfLines_F64 label_id values count spec =
+  with spec $ \specPtr -> c_plotInfLines_F64 label_id values count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotInfLines_S16_wrap"
+  c_plotInfLines_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ values
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotInfLines_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ values
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotInfLines_S16 label_id values count spec =
+  with spec $ \specPtr -> c_plotInfLines_S16 label_id values count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotInfLines_S32_wrap"
+  c_plotInfLines_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ values
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotInfLines_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ values
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotInfLines_S32 label_id values count spec =
+  with spec $ \specPtr -> c_plotInfLines_S32 label_id values count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotInfLines_S64_wrap"
+  c_plotInfLines_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ values
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotInfLines_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ values
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotInfLines_S64 label_id values count spec =
+  with spec $ \specPtr -> c_plotInfLines_S64 label_id values count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotInfLines_S8_wrap"
+  c_plotInfLines_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ values
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotInfLines_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ values
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotInfLines_S8 label_id values count spec =
+  with spec $ \specPtr -> c_plotInfLines_S8 label_id values count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotInfLines_U16_wrap"
+  c_plotInfLines_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ values
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotInfLines_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ values
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotInfLines_U16 label_id values count spec =
+  with spec $ \specPtr -> c_plotInfLines_U16 label_id values count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotInfLines_U32_wrap"
+  c_plotInfLines_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ values
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotInfLines_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ values
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotInfLines_U32 label_id values count spec =
+  with spec $ \specPtr -> c_plotInfLines_U32 label_id values count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotInfLines_U64_wrap"
+  c_plotInfLines_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ values
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotInfLines_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ values
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotInfLines_U64 label_id values count spec =
+  with spec $ \specPtr -> c_plotInfLines_U64 label_id values count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotInfLines_U8_wrap"
+  c_plotInfLines_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ values
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotInfLines_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ values
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotInfLines_U8 label_id values count spec =
+  with spec $ \specPtr -> c_plotInfLines_U8 label_id values count specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotLineG_wrap"
+  c_plotLineG
+    :: CString -- ^ label_id
+    -> Getter -- ^ getter
+    -> (Ptr ()) -- ^ data
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLineG
+  :: CString -- ^ label_id
+  -> Getter -- ^ getter
+  -> (Ptr ()) -- ^ data
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotLineG label_id getter data_ count spec =
+  with spec $ \specPtr -> c_plotLineG label_id getter data_ count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_F32_wrap"
+  c_plotLine_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_F32 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotLine_F32 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_F64_wrap"
+  c_plotLine_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_F64 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotLine_F64 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_S16_wrap"
+  c_plotLine_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_S16 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotLine_S16 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_S32_wrap"
+  c_plotLine_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_S32 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotLine_S32 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_S64_wrap"
+  c_plotLine_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_S64 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotLine_S64 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_S8_wrap"
+  c_plotLine_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_S8 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotLine_S8 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_U16_wrap"
+  c_plotLine_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_U16 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotLine_U16 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_U32_wrap"
+  c_plotLine_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_U32 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotLine_U32 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_U64_wrap"
+  c_plotLine_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_U64 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotLine_U64 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_U8_wrap"
+  c_plotLine_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_U8 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotLine_U8 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_xy_F32_wrap"
+  c_plotLine_xy_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ xs
+    -> (Ptr Float) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_xy_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ xs
+  -> (Ptr Float) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_xy_F32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotLine_xy_F32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_xy_F64_wrap"
+  c_plotLine_xy_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ xs
+    -> (Ptr Double) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_xy_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ xs
+  -> (Ptr Double) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_xy_F64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotLine_xy_F64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_xy_S16_wrap"
+  c_plotLine_xy_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ xs
+    -> (Ptr ImS16) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_xy_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ xs
+  -> (Ptr ImS16) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_xy_S16 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotLine_xy_S16 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_xy_S32_wrap"
+  c_plotLine_xy_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ xs
+    -> (Ptr ImS32) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_xy_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ xs
+  -> (Ptr ImS32) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_xy_S32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotLine_xy_S32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_xy_S64_wrap"
+  c_plotLine_xy_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ xs
+    -> (Ptr ImS64) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_xy_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ xs
+  -> (Ptr ImS64) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_xy_S64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotLine_xy_S64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_xy_S8_wrap"
+  c_plotLine_xy_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ xs
+    -> (Ptr ImS8) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_xy_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ xs
+  -> (Ptr ImS8) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_xy_S8 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotLine_xy_S8 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_xy_U16_wrap"
+  c_plotLine_xy_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ xs
+    -> (Ptr ImU16) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_xy_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ xs
+  -> (Ptr ImU16) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_xy_U16 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotLine_xy_U16 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_xy_U32_wrap"
+  c_plotLine_xy_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ xs
+    -> (Ptr ImU32) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_xy_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ xs
+  -> (Ptr ImU32) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_xy_U32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotLine_xy_U32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_xy_U64_wrap"
+  c_plotLine_xy_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ xs
+    -> (Ptr ImU64) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_xy_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ xs
+  -> (Ptr ImU64) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_xy_U64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotLine_xy_U64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotLine_xy_U8_wrap"
+  c_plotLine_xy_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ xs
+    -> (Ptr ImU8) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotLine_xy_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ xs
+  -> (Ptr ImU8) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotLine_xy_U8 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotLine_xy_U8 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPieChart_F32_wrap"
+  c_plotPieChart_F32
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr Float) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> CString -- ^ label_fmt
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_F32
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr Float) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> CString -- ^ label_fmt
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_F32 label_ids values count x y radius label_fmt angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_F32 label_ids values count x y radius label_fmt angle0 specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPieChart_F64_wrap"
+  c_plotPieChart_F64
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr Double) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> CString -- ^ label_fmt
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_F64
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr Double) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> CString -- ^ label_fmt
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_F64 label_ids values count x y radius label_fmt angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_F64 label_ids values count x y radius label_fmt angle0 specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPieChart_S16_wrap"
+  c_plotPieChart_S16
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImS16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> CString -- ^ label_fmt
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_S16
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImS16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> CString -- ^ label_fmt
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_S16 label_ids values count x y radius label_fmt angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_S16 label_ids values count x y radius label_fmt angle0 specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPieChart_S32_wrap"
+  c_plotPieChart_S32
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImS32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> CString -- ^ label_fmt
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_S32
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImS32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> CString -- ^ label_fmt
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_S32 label_ids values count x y radius label_fmt angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_S32 label_ids values count x y radius label_fmt angle0 specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPieChart_S64_wrap"
+  c_plotPieChart_S64
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImS64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> CString -- ^ label_fmt
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_S64
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImS64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> CString -- ^ label_fmt
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_S64 label_ids values count x y radius label_fmt angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_S64 label_ids values count x y radius label_fmt angle0 specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPieChart_S8_wrap"
+  c_plotPieChart_S8
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImS8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> CString -- ^ label_fmt
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_S8
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImS8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> CString -- ^ label_fmt
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_S8 label_ids values count x y radius label_fmt angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_S8 label_ids values count x y radius label_fmt angle0 specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPieChart_U16_wrap"
+  c_plotPieChart_U16
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImU16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> CString -- ^ label_fmt
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_U16
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImU16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> CString -- ^ label_fmt
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_U16 label_ids values count x y radius label_fmt angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_U16 label_ids values count x y radius label_fmt angle0 specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPieChart_U32_wrap"
+  c_plotPieChart_U32
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImU32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> CString -- ^ label_fmt
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_U32
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImU32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> CString -- ^ label_fmt
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_U32 label_ids values count x y radius label_fmt angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_U32 label_ids values count x y radius label_fmt angle0 specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPieChart_U64_wrap"
+  c_plotPieChart_U64
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImU64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> CString -- ^ label_fmt
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_U64
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImU64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> CString -- ^ label_fmt
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_U64 label_ids values count x y radius label_fmt angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_U64 label_ids values count x y radius label_fmt angle0 specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPieChart_U8_wrap"
+  c_plotPieChart_U8
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImU8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> CString -- ^ label_fmt
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_U8
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImU8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> CString -- ^ label_fmt
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_U8 label_ids values count x y radius label_fmt angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_U8 label_ids values count x y radius label_fmt angle0 specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotPieChart_fmt_F32_wrap"
+  c_plotPieChart_fmt_F32
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr Float) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> Formatter -- ^ fmt
+    -> (Ptr ()) -- ^ fmt_data
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_fmt_F32
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr Float) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> Formatter -- ^ fmt
+  -> (Ptr ()) -- ^ fmt_data
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_fmt_F32 label_ids values count x y radius fmt fmt_data angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_fmt_F32 label_ids values count x y radius fmt fmt_data angle0 specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotPieChart_fmt_F64_wrap"
+  c_plotPieChart_fmt_F64
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr Double) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> Formatter -- ^ fmt
+    -> (Ptr ()) -- ^ fmt_data
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_fmt_F64
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr Double) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> Formatter -- ^ fmt
+  -> (Ptr ()) -- ^ fmt_data
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_fmt_F64 label_ids values count x y radius fmt fmt_data angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_fmt_F64 label_ids values count x y radius fmt fmt_data angle0 specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotPieChart_fmt_S16_wrap"
+  c_plotPieChart_fmt_S16
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImS16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> Formatter -- ^ fmt
+    -> (Ptr ()) -- ^ fmt_data
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_fmt_S16
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImS16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> Formatter -- ^ fmt
+  -> (Ptr ()) -- ^ fmt_data
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_fmt_S16 label_ids values count x y radius fmt fmt_data angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_fmt_S16 label_ids values count x y radius fmt fmt_data angle0 specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotPieChart_fmt_S32_wrap"
+  c_plotPieChart_fmt_S32
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImS32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> Formatter -- ^ fmt
+    -> (Ptr ()) -- ^ fmt_data
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_fmt_S32
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImS32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> Formatter -- ^ fmt
+  -> (Ptr ()) -- ^ fmt_data
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_fmt_S32 label_ids values count x y radius fmt fmt_data angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_fmt_S32 label_ids values count x y radius fmt fmt_data angle0 specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotPieChart_fmt_S64_wrap"
+  c_plotPieChart_fmt_S64
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImS64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> Formatter -- ^ fmt
+    -> (Ptr ()) -- ^ fmt_data
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_fmt_S64
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImS64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> Formatter -- ^ fmt
+  -> (Ptr ()) -- ^ fmt_data
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_fmt_S64 label_ids values count x y radius fmt fmt_data angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_fmt_S64 label_ids values count x y radius fmt fmt_data angle0 specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotPieChart_fmt_S8_wrap"
+  c_plotPieChart_fmt_S8
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImS8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> Formatter -- ^ fmt
+    -> (Ptr ()) -- ^ fmt_data
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_fmt_S8
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImS8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> Formatter -- ^ fmt
+  -> (Ptr ()) -- ^ fmt_data
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_fmt_S8 label_ids values count x y radius fmt fmt_data angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_fmt_S8 label_ids values count x y radius fmt fmt_data angle0 specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotPieChart_fmt_U16_wrap"
+  c_plotPieChart_fmt_U16
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImU16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> Formatter -- ^ fmt
+    -> (Ptr ()) -- ^ fmt_data
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_fmt_U16
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImU16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> Formatter -- ^ fmt
+  -> (Ptr ()) -- ^ fmt_data
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_fmt_U16 label_ids values count x y radius fmt fmt_data angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_fmt_U16 label_ids values count x y radius fmt fmt_data angle0 specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotPieChart_fmt_U32_wrap"
+  c_plotPieChart_fmt_U32
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImU32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> Formatter -- ^ fmt
+    -> (Ptr ()) -- ^ fmt_data
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_fmt_U32
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImU32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> Formatter -- ^ fmt
+  -> (Ptr ()) -- ^ fmt_data
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_fmt_U32 label_ids values count x y radius fmt fmt_data angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_fmt_U32 label_ids values count x y radius fmt fmt_data angle0 specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotPieChart_fmt_U64_wrap"
+  c_plotPieChart_fmt_U64
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImU64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> Formatter -- ^ fmt
+    -> (Ptr ()) -- ^ fmt_data
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_fmt_U64
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImU64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> Formatter -- ^ fmt
+  -> (Ptr ()) -- ^ fmt_data
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_fmt_U64 label_ids values count x y radius fmt fmt_data angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_fmt_U64 label_ids values count x y radius fmt fmt_data angle0 specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotPieChart_fmt_U8_wrap"
+  c_plotPieChart_fmt_U8
+    :: (Ptr CString) -- ^ label_ids
+    -> (Ptr ImU8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> Double -- ^ radius
+    -> Formatter -- ^ fmt
+    -> (Ptr ()) -- ^ fmt_data
+    -> Double -- ^ angle0
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPieChart_fmt_U8
+  :: (Ptr CString) -- ^ label_ids
+  -> (Ptr ImU8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> Double -- ^ radius
+  -> Formatter -- ^ fmt
+  -> (Ptr ()) -- ^ fmt_data
+  -> Double -- ^ angle0
+  -> Spec -- ^ spec
+  -> IO ()
+plotPieChart_fmt_U8 label_ids values count x y radius fmt fmt_data angle0 spec =
+  with spec $ \specPtr -> c_plotPieChart_fmt_U8 label_ids values count x y radius fmt fmt_data angle0 specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPolygon_F32_wrap"
+  c_plotPolygon_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ xs
+    -> (Ptr Float) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPolygon_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ xs
+  -> (Ptr Float) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotPolygon_F32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotPolygon_F32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPolygon_F64_wrap"
+  c_plotPolygon_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ xs
+    -> (Ptr Double) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPolygon_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ xs
+  -> (Ptr Double) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotPolygon_F64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotPolygon_F64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPolygon_S16_wrap"
+  c_plotPolygon_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ xs
+    -> (Ptr ImS16) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPolygon_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ xs
+  -> (Ptr ImS16) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotPolygon_S16 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotPolygon_S16 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPolygon_S32_wrap"
+  c_plotPolygon_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ xs
+    -> (Ptr ImS32) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPolygon_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ xs
+  -> (Ptr ImS32) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotPolygon_S32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotPolygon_S32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPolygon_S64_wrap"
+  c_plotPolygon_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ xs
+    -> (Ptr ImS64) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPolygon_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ xs
+  -> (Ptr ImS64) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotPolygon_S64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotPolygon_S64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPolygon_S8_wrap"
+  c_plotPolygon_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ xs
+    -> (Ptr ImS8) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPolygon_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ xs
+  -> (Ptr ImS8) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotPolygon_S8 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotPolygon_S8 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPolygon_U16_wrap"
+  c_plotPolygon_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ xs
+    -> (Ptr ImU16) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPolygon_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ xs
+  -> (Ptr ImU16) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotPolygon_U16 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotPolygon_U16 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPolygon_U32_wrap"
+  c_plotPolygon_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ xs
+    -> (Ptr ImU32) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPolygon_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ xs
+  -> (Ptr ImU32) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotPolygon_U32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotPolygon_U32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPolygon_U64_wrap"
+  c_plotPolygon_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ xs
+    -> (Ptr ImU64) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPolygon_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ xs
+  -> (Ptr ImU64) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotPolygon_U64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotPolygon_U64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotPolygon_U8_wrap"
+  c_plotPolygon_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ xs
+    -> (Ptr ImU8) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotPolygon_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ xs
+  -> (Ptr ImU8) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotPolygon_U8 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotPolygon_U8 label_id xs ys count specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotScatterG_wrap"
+  c_plotScatterG
+    :: CString -- ^ label_id
+    -> Getter -- ^ getter
+    -> (Ptr ()) -- ^ data
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatterG
+  :: CString -- ^ label_id
+  -> Getter -- ^ getter
+  -> (Ptr ()) -- ^ data
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatterG label_id getter data_ count spec =
+  with spec $ \specPtr -> c_plotScatterG label_id getter data_ count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_F32_wrap"
+  c_plotScatter_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_F32 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotScatter_F32 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_F64_wrap"
+  c_plotScatter_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_F64 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotScatter_F64 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_S16_wrap"
+  c_plotScatter_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_S16 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotScatter_S16 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_S32_wrap"
+  c_plotScatter_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_S32 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotScatter_S32 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_S64_wrap"
+  c_plotScatter_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_S64 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotScatter_S64 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_S8_wrap"
+  c_plotScatter_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_S8 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotScatter_S8 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_U16_wrap"
+  c_plotScatter_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_U16 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotScatter_U16 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_U32_wrap"
+  c_plotScatter_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_U32 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotScatter_U32 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_U64_wrap"
+  c_plotScatter_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_U64 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotScatter_U64 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_U8_wrap"
+  c_plotScatter_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_U8 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotScatter_U8 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_xy_F32_wrap"
+  c_plotScatter_xy_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ xs
+    -> (Ptr Float) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_xy_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ xs
+  -> (Ptr Float) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_xy_F32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotScatter_xy_F32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_xy_F64_wrap"
+  c_plotScatter_xy_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ xs
+    -> (Ptr Double) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_xy_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ xs
+  -> (Ptr Double) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_xy_F64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotScatter_xy_F64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_xy_S16_wrap"
+  c_plotScatter_xy_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ xs
+    -> (Ptr ImS16) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_xy_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ xs
+  -> (Ptr ImS16) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_xy_S16 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotScatter_xy_S16 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_xy_S32_wrap"
+  c_plotScatter_xy_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ xs
+    -> (Ptr ImS32) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_xy_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ xs
+  -> (Ptr ImS32) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_xy_S32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotScatter_xy_S32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_xy_S64_wrap"
+  c_plotScatter_xy_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ xs
+    -> (Ptr ImS64) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_xy_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ xs
+  -> (Ptr ImS64) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_xy_S64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotScatter_xy_S64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_xy_S8_wrap"
+  c_plotScatter_xy_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ xs
+    -> (Ptr ImS8) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_xy_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ xs
+  -> (Ptr ImS8) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_xy_S8 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotScatter_xy_S8 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_xy_U16_wrap"
+  c_plotScatter_xy_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ xs
+    -> (Ptr ImU16) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_xy_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ xs
+  -> (Ptr ImU16) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_xy_U16 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotScatter_xy_U16 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_xy_U32_wrap"
+  c_plotScatter_xy_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ xs
+    -> (Ptr ImU32) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_xy_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ xs
+  -> (Ptr ImU32) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_xy_U32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotScatter_xy_U32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_xy_U64_wrap"
+  c_plotScatter_xy_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ xs
+    -> (Ptr ImU64) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_xy_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ xs
+  -> (Ptr ImU64) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_xy_U64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotScatter_xy_U64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotScatter_xy_U8_wrap"
+  c_plotScatter_xy_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ xs
+    -> (Ptr ImU8) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotScatter_xy_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ xs
+  -> (Ptr ImU8) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotScatter_xy_U8 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotScatter_xy_U8 label_id xs ys count specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotShadedG_wrap"
+  c_plotShadedG
+    :: CString -- ^ label_id
+    -> Getter -- ^ getter1
+    -> (Ptr ()) -- ^ data1
+    -> Getter -- ^ getter2
+    -> (Ptr ()) -- ^ data2
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShadedG
+  :: CString -- ^ label_id
+  -> Getter -- ^ getter1
+  -> (Ptr ()) -- ^ data1
+  -> Getter -- ^ getter2
+  -> (Ptr ()) -- ^ data2
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotShadedG label_id getter1 data1 getter2 data2 count spec =
+  with spec $ \specPtr -> c_plotShadedG label_id getter1 data1 getter2 data2 count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_F32_wrap"
+  c_plotShaded_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_F32 label_id values count yref xscale xstart spec =
+  with spec $ \specPtr -> c_plotShaded_F32 label_id values count yref xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_F64_wrap"
+  c_plotShaded_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_F64 label_id values count yref xscale xstart spec =
+  with spec $ \specPtr -> c_plotShaded_F64 label_id values count yref xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_S16_wrap"
+  c_plotShaded_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_S16 label_id values count yref xscale xstart spec =
+  with spec $ \specPtr -> c_plotShaded_S16 label_id values count yref xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_S32_wrap"
+  c_plotShaded_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_S32 label_id values count yref xscale xstart spec =
+  with spec $ \specPtr -> c_plotShaded_S32 label_id values count yref xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_S64_wrap"
+  c_plotShaded_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_S64 label_id values count yref xscale xstart spec =
+  with spec $ \specPtr -> c_plotShaded_S64 label_id values count yref xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_S8_wrap"
+  c_plotShaded_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_S8 label_id values count yref xscale xstart spec =
+  with spec $ \specPtr -> c_plotShaded_S8 label_id values count yref xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_U16_wrap"
+  c_plotShaded_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_U16 label_id values count yref xscale xstart spec =
+  with spec $ \specPtr -> c_plotShaded_U16 label_id values count yref xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_U32_wrap"
+  c_plotShaded_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_U32 label_id values count yref xscale xstart spec =
+  with spec $ \specPtr -> c_plotShaded_U32 label_id values count yref xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_U64_wrap"
+  c_plotShaded_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_U64 label_id values count yref xscale xstart spec =
+  with spec $ \specPtr -> c_plotShaded_U64 label_id values count yref xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_U8_wrap"
+  c_plotShaded_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_U8 label_id values count yref xscale xstart spec =
+  with spec $ \specPtr -> c_plotShaded_U8 label_id values count yref xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xy_F32_wrap"
+  c_plotShaded_xy_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ xs
+    -> (Ptr Float) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xy_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ xs
+  -> (Ptr Float) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xy_F32 label_id xs ys count yref spec =
+  with spec $ \specPtr -> c_plotShaded_xy_F32 label_id xs ys count yref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xy_F64_wrap"
+  c_plotShaded_xy_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ xs
+    -> (Ptr Double) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xy_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ xs
+  -> (Ptr Double) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xy_F64 label_id xs ys count yref spec =
+  with spec $ \specPtr -> c_plotShaded_xy_F64 label_id xs ys count yref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xy_S16_wrap"
+  c_plotShaded_xy_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ xs
+    -> (Ptr ImS16) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xy_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ xs
+  -> (Ptr ImS16) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xy_S16 label_id xs ys count yref spec =
+  with spec $ \specPtr -> c_plotShaded_xy_S16 label_id xs ys count yref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xy_S32_wrap"
+  c_plotShaded_xy_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ xs
+    -> (Ptr ImS32) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xy_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ xs
+  -> (Ptr ImS32) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xy_S32 label_id xs ys count yref spec =
+  with spec $ \specPtr -> c_plotShaded_xy_S32 label_id xs ys count yref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xy_S64_wrap"
+  c_plotShaded_xy_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ xs
+    -> (Ptr ImS64) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xy_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ xs
+  -> (Ptr ImS64) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xy_S64 label_id xs ys count yref spec =
+  with spec $ \specPtr -> c_plotShaded_xy_S64 label_id xs ys count yref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xy_S8_wrap"
+  c_plotShaded_xy_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ xs
+    -> (Ptr ImS8) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xy_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ xs
+  -> (Ptr ImS8) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xy_S8 label_id xs ys count yref spec =
+  with spec $ \specPtr -> c_plotShaded_xy_S8 label_id xs ys count yref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xy_U16_wrap"
+  c_plotShaded_xy_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ xs
+    -> (Ptr ImU16) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xy_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ xs
+  -> (Ptr ImU16) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xy_U16 label_id xs ys count yref spec =
+  with spec $ \specPtr -> c_plotShaded_xy_U16 label_id xs ys count yref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xy_U32_wrap"
+  c_plotShaded_xy_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ xs
+    -> (Ptr ImU32) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xy_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ xs
+  -> (Ptr ImU32) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xy_U32 label_id xs ys count yref spec =
+  with spec $ \specPtr -> c_plotShaded_xy_U32 label_id xs ys count yref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xy_U64_wrap"
+  c_plotShaded_xy_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ xs
+    -> (Ptr ImU64) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xy_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ xs
+  -> (Ptr ImU64) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xy_U64 label_id xs ys count yref spec =
+  with spec $ \specPtr -> c_plotShaded_xy_U64 label_id xs ys count yref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xy_U8_wrap"
+  c_plotShaded_xy_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ xs
+    -> (Ptr ImU8) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ yref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xy_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ xs
+  -> (Ptr ImU8) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ yref
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xy_U8 label_id xs ys count yref spec =
+  with spec $ \specPtr -> c_plotShaded_xy_U8 label_id xs ys count yref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xyy_F32_wrap"
+  c_plotShaded_xyy_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ xs
+    -> (Ptr Float) -- ^ ys1
+    -> (Ptr Float) -- ^ ys2
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xyy_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ xs
+  -> (Ptr Float) -- ^ ys1
+  -> (Ptr Float) -- ^ ys2
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xyy_F32 label_id xs ys1 ys2 count spec =
+  with spec $ \specPtr -> c_plotShaded_xyy_F32 label_id xs ys1 ys2 count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xyy_F64_wrap"
+  c_plotShaded_xyy_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ xs
+    -> (Ptr Double) -- ^ ys1
+    -> (Ptr Double) -- ^ ys2
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xyy_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ xs
+  -> (Ptr Double) -- ^ ys1
+  -> (Ptr Double) -- ^ ys2
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xyy_F64 label_id xs ys1 ys2 count spec =
+  with spec $ \specPtr -> c_plotShaded_xyy_F64 label_id xs ys1 ys2 count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xyy_S16_wrap"
+  c_plotShaded_xyy_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ xs
+    -> (Ptr ImS16) -- ^ ys1
+    -> (Ptr ImS16) -- ^ ys2
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xyy_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ xs
+  -> (Ptr ImS16) -- ^ ys1
+  -> (Ptr ImS16) -- ^ ys2
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xyy_S16 label_id xs ys1 ys2 count spec =
+  with spec $ \specPtr -> c_plotShaded_xyy_S16 label_id xs ys1 ys2 count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xyy_S32_wrap"
+  c_plotShaded_xyy_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ xs
+    -> (Ptr ImS32) -- ^ ys1
+    -> (Ptr ImS32) -- ^ ys2
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xyy_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ xs
+  -> (Ptr ImS32) -- ^ ys1
+  -> (Ptr ImS32) -- ^ ys2
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xyy_S32 label_id xs ys1 ys2 count spec =
+  with spec $ \specPtr -> c_plotShaded_xyy_S32 label_id xs ys1 ys2 count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xyy_S64_wrap"
+  c_plotShaded_xyy_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ xs
+    -> (Ptr ImS64) -- ^ ys1
+    -> (Ptr ImS64) -- ^ ys2
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xyy_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ xs
+  -> (Ptr ImS64) -- ^ ys1
+  -> (Ptr ImS64) -- ^ ys2
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xyy_S64 label_id xs ys1 ys2 count spec =
+  with spec $ \specPtr -> c_plotShaded_xyy_S64 label_id xs ys1 ys2 count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xyy_S8_wrap"
+  c_plotShaded_xyy_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ xs
+    -> (Ptr ImS8) -- ^ ys1
+    -> (Ptr ImS8) -- ^ ys2
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xyy_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ xs
+  -> (Ptr ImS8) -- ^ ys1
+  -> (Ptr ImS8) -- ^ ys2
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xyy_S8 label_id xs ys1 ys2 count spec =
+  with spec $ \specPtr -> c_plotShaded_xyy_S8 label_id xs ys1 ys2 count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xyy_U16_wrap"
+  c_plotShaded_xyy_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ xs
+    -> (Ptr ImU16) -- ^ ys1
+    -> (Ptr ImU16) -- ^ ys2
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xyy_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ xs
+  -> (Ptr ImU16) -- ^ ys1
+  -> (Ptr ImU16) -- ^ ys2
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xyy_U16 label_id xs ys1 ys2 count spec =
+  with spec $ \specPtr -> c_plotShaded_xyy_U16 label_id xs ys1 ys2 count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xyy_U32_wrap"
+  c_plotShaded_xyy_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ xs
+    -> (Ptr ImU32) -- ^ ys1
+    -> (Ptr ImU32) -- ^ ys2
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xyy_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ xs
+  -> (Ptr ImU32) -- ^ ys1
+  -> (Ptr ImU32) -- ^ ys2
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xyy_U32 label_id xs ys1 ys2 count spec =
+  with spec $ \specPtr -> c_plotShaded_xyy_U32 label_id xs ys1 ys2 count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xyy_U64_wrap"
+  c_plotShaded_xyy_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ xs
+    -> (Ptr ImU64) -- ^ ys1
+    -> (Ptr ImU64) -- ^ ys2
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xyy_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ xs
+  -> (Ptr ImU64) -- ^ ys1
+  -> (Ptr ImU64) -- ^ ys2
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xyy_U64 label_id xs ys1 ys2 count spec =
+  with spec $ \specPtr -> c_plotShaded_xyy_U64 label_id xs ys1 ys2 count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotShaded_xyy_U8_wrap"
+  c_plotShaded_xyy_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ xs
+    -> (Ptr ImU8) -- ^ ys1
+    -> (Ptr ImU8) -- ^ ys2
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotShaded_xyy_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ xs
+  -> (Ptr ImU8) -- ^ ys1
+  -> (Ptr ImU8) -- ^ ys2
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotShaded_xyy_U8 label_id xs ys1 ys2 count spec =
+  with spec $ \specPtr -> c_plotShaded_xyy_U8 label_id xs ys1 ys2 count specPtr
+
+foreign import capi safe "DearImGuiWrappers.h ImPlotPlotStairsG_wrap"
+  c_plotStairsG
+    :: CString -- ^ label_id
+    -> Getter -- ^ getter
+    -> (Ptr ()) -- ^ data
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairsG
+  :: CString -- ^ label_id
+  -> Getter -- ^ getter
+  -> (Ptr ()) -- ^ data
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairsG label_id getter data_ count spec =
+  with spec $ \specPtr -> c_plotStairsG label_id getter data_ count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_F32_wrap"
+  c_plotStairs_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_F32 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotStairs_F32 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_F64_wrap"
+  c_plotStairs_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_F64 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotStairs_F64 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_S16_wrap"
+  c_plotStairs_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_S16 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotStairs_S16 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_S32_wrap"
+  c_plotStairs_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_S32 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotStairs_S32 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_S64_wrap"
+  c_plotStairs_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_S64 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotStairs_S64 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_S8_wrap"
+  c_plotStairs_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_S8 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotStairs_S8 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_U16_wrap"
+  c_plotStairs_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_U16 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotStairs_U16 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_U32_wrap"
+  c_plotStairs_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_U32 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotStairs_U32 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_U64_wrap"
+  c_plotStairs_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_U64 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotStairs_U64 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_U8_wrap"
+  c_plotStairs_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ xscale
+    -> Double -- ^ xstart
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ xscale
+  -> Double -- ^ xstart
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_U8 label_id values count xscale xstart spec =
+  with spec $ \specPtr -> c_plotStairs_U8 label_id values count xscale xstart specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_xy_F32_wrap"
+  c_plotStairs_xy_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ xs
+    -> (Ptr Float) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_xy_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ xs
+  -> (Ptr Float) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_xy_F32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotStairs_xy_F32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_xy_F64_wrap"
+  c_plotStairs_xy_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ xs
+    -> (Ptr Double) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_xy_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ xs
+  -> (Ptr Double) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_xy_F64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotStairs_xy_F64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_xy_S16_wrap"
+  c_plotStairs_xy_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ xs
+    -> (Ptr ImS16) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_xy_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ xs
+  -> (Ptr ImS16) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_xy_S16 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotStairs_xy_S16 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_xy_S32_wrap"
+  c_plotStairs_xy_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ xs
+    -> (Ptr ImS32) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_xy_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ xs
+  -> (Ptr ImS32) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_xy_S32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotStairs_xy_S32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_xy_S64_wrap"
+  c_plotStairs_xy_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ xs
+    -> (Ptr ImS64) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_xy_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ xs
+  -> (Ptr ImS64) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_xy_S64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotStairs_xy_S64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_xy_S8_wrap"
+  c_plotStairs_xy_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ xs
+    -> (Ptr ImS8) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_xy_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ xs
+  -> (Ptr ImS8) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_xy_S8 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotStairs_xy_S8 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_xy_U16_wrap"
+  c_plotStairs_xy_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ xs
+    -> (Ptr ImU16) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_xy_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ xs
+  -> (Ptr ImU16) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_xy_U16 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotStairs_xy_U16 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_xy_U32_wrap"
+  c_plotStairs_xy_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ xs
+    -> (Ptr ImU32) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_xy_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ xs
+  -> (Ptr ImU32) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_xy_U32 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotStairs_xy_U32 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_xy_U64_wrap"
+  c_plotStairs_xy_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ xs
+    -> (Ptr ImU64) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_xy_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ xs
+  -> (Ptr ImU64) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_xy_U64 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotStairs_xy_U64 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStairs_xy_U8_wrap"
+  c_plotStairs_xy_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ xs
+    -> (Ptr ImU8) -- ^ ys
+    -> CInt -- ^ count
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStairs_xy_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ xs
+  -> (Ptr ImU8) -- ^ ys
+  -> CInt -- ^ count
+  -> Spec -- ^ spec
+  -> IO ()
+plotStairs_xy_U8 label_id xs ys count spec =
+  with spec $ \specPtr -> c_plotStairs_xy_U8 label_id xs ys count specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_F32_wrap"
+  c_plotStems_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> Double -- ^ scale
+    -> Double -- ^ start
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Double -- ^ scale
+  -> Double -- ^ start
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_F32 label_id values count ref scale start spec =
+  with spec $ \specPtr -> c_plotStems_F32 label_id values count ref scale start specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_F64_wrap"
+  c_plotStems_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> Double -- ^ scale
+    -> Double -- ^ start
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Double -- ^ scale
+  -> Double -- ^ start
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_F64 label_id values count ref scale start spec =
+  with spec $ \specPtr -> c_plotStems_F64 label_id values count ref scale start specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_S16_wrap"
+  c_plotStems_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> Double -- ^ scale
+    -> Double -- ^ start
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Double -- ^ scale
+  -> Double -- ^ start
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_S16 label_id values count ref scale start spec =
+  with spec $ \specPtr -> c_plotStems_S16 label_id values count ref scale start specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_S32_wrap"
+  c_plotStems_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> Double -- ^ scale
+    -> Double -- ^ start
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Double -- ^ scale
+  -> Double -- ^ start
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_S32 label_id values count ref scale start spec =
+  with spec $ \specPtr -> c_plotStems_S32 label_id values count ref scale start specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_S64_wrap"
+  c_plotStems_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> Double -- ^ scale
+    -> Double -- ^ start
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Double -- ^ scale
+  -> Double -- ^ start
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_S64 label_id values count ref scale start spec =
+  with spec $ \specPtr -> c_plotStems_S64 label_id values count ref scale start specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_S8_wrap"
+  c_plotStems_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> Double -- ^ scale
+    -> Double -- ^ start
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Double -- ^ scale
+  -> Double -- ^ start
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_S8 label_id values count ref scale start spec =
+  with spec $ \specPtr -> c_plotStems_S8 label_id values count ref scale start specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_U16_wrap"
+  c_plotStems_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> Double -- ^ scale
+    -> Double -- ^ start
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Double -- ^ scale
+  -> Double -- ^ start
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_U16 label_id values count ref scale start spec =
+  with spec $ \specPtr -> c_plotStems_U16 label_id values count ref scale start specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_U32_wrap"
+  c_plotStems_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> Double -- ^ scale
+    -> Double -- ^ start
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Double -- ^ scale
+  -> Double -- ^ start
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_U32 label_id values count ref scale start spec =
+  with spec $ \specPtr -> c_plotStems_U32 label_id values count ref scale start specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_U64_wrap"
+  c_plotStems_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> Double -- ^ scale
+    -> Double -- ^ start
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Double -- ^ scale
+  -> Double -- ^ start
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_U64 label_id values count ref scale start spec =
+  with spec $ \specPtr -> c_plotStems_U64 label_id values count ref scale start specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_U8_wrap"
+  c_plotStems_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ values
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> Double -- ^ scale
+    -> Double -- ^ start
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ values
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Double -- ^ scale
+  -> Double -- ^ start
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_U8 label_id values count ref scale start spec =
+  with spec $ \specPtr -> c_plotStems_U8 label_id values count ref scale start specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_xy_F32_wrap"
+  c_plotStems_xy_F32
+    :: CString -- ^ label_id
+    -> (Ptr Float) -- ^ xs
+    -> (Ptr Float) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_xy_F32
+  :: CString -- ^ label_id
+  -> (Ptr Float) -- ^ xs
+  -> (Ptr Float) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_xy_F32 label_id xs ys count ref spec =
+  with spec $ \specPtr -> c_plotStems_xy_F32 label_id xs ys count ref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_xy_F64_wrap"
+  c_plotStems_xy_F64
+    :: CString -- ^ label_id
+    -> (Ptr Double) -- ^ xs
+    -> (Ptr Double) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_xy_F64
+  :: CString -- ^ label_id
+  -> (Ptr Double) -- ^ xs
+  -> (Ptr Double) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_xy_F64 label_id xs ys count ref spec =
+  with spec $ \specPtr -> c_plotStems_xy_F64 label_id xs ys count ref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_xy_S16_wrap"
+  c_plotStems_xy_S16
+    :: CString -- ^ label_id
+    -> (Ptr ImS16) -- ^ xs
+    -> (Ptr ImS16) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_xy_S16
+  :: CString -- ^ label_id
+  -> (Ptr ImS16) -- ^ xs
+  -> (Ptr ImS16) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_xy_S16 label_id xs ys count ref spec =
+  with spec $ \specPtr -> c_plotStems_xy_S16 label_id xs ys count ref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_xy_S32_wrap"
+  c_plotStems_xy_S32
+    :: CString -- ^ label_id
+    -> (Ptr ImS32) -- ^ xs
+    -> (Ptr ImS32) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_xy_S32
+  :: CString -- ^ label_id
+  -> (Ptr ImS32) -- ^ xs
+  -> (Ptr ImS32) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_xy_S32 label_id xs ys count ref spec =
+  with spec $ \specPtr -> c_plotStems_xy_S32 label_id xs ys count ref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_xy_S64_wrap"
+  c_plotStems_xy_S64
+    :: CString -- ^ label_id
+    -> (Ptr ImS64) -- ^ xs
+    -> (Ptr ImS64) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_xy_S64
+  :: CString -- ^ label_id
+  -> (Ptr ImS64) -- ^ xs
+  -> (Ptr ImS64) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_xy_S64 label_id xs ys count ref spec =
+  with spec $ \specPtr -> c_plotStems_xy_S64 label_id xs ys count ref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_xy_S8_wrap"
+  c_plotStems_xy_S8
+    :: CString -- ^ label_id
+    -> (Ptr ImS8) -- ^ xs
+    -> (Ptr ImS8) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_xy_S8
+  :: CString -- ^ label_id
+  -> (Ptr ImS8) -- ^ xs
+  -> (Ptr ImS8) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_xy_S8 label_id xs ys count ref spec =
+  with spec $ \specPtr -> c_plotStems_xy_S8 label_id xs ys count ref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_xy_U16_wrap"
+  c_plotStems_xy_U16
+    :: CString -- ^ label_id
+    -> (Ptr ImU16) -- ^ xs
+    -> (Ptr ImU16) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_xy_U16
+  :: CString -- ^ label_id
+  -> (Ptr ImU16) -- ^ xs
+  -> (Ptr ImU16) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_xy_U16 label_id xs ys count ref spec =
+  with spec $ \specPtr -> c_plotStems_xy_U16 label_id xs ys count ref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_xy_U32_wrap"
+  c_plotStems_xy_U32
+    :: CString -- ^ label_id
+    -> (Ptr ImU32) -- ^ xs
+    -> (Ptr ImU32) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_xy_U32
+  :: CString -- ^ label_id
+  -> (Ptr ImU32) -- ^ xs
+  -> (Ptr ImU32) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_xy_U32 label_id xs ys count ref spec =
+  with spec $ \specPtr -> c_plotStems_xy_U32 label_id xs ys count ref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_xy_U64_wrap"
+  c_plotStems_xy_U64
+    :: CString -- ^ label_id
+    -> (Ptr ImU64) -- ^ xs
+    -> (Ptr ImU64) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_xy_U64
+  :: CString -- ^ label_id
+  -> (Ptr ImU64) -- ^ xs
+  -> (Ptr ImU64) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_xy_U64 label_id xs ys count ref spec =
+  with spec $ \specPtr -> c_plotStems_xy_U64 label_id xs ys count ref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotStems_xy_U8_wrap"
+  c_plotStems_xy_U8
+    :: CString -- ^ label_id
+    -> (Ptr ImU8) -- ^ xs
+    -> (Ptr ImU8) -- ^ ys
+    -> CInt -- ^ count
+    -> Double -- ^ ref
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotStems_xy_U8
+  :: CString -- ^ label_id
+  -> (Ptr ImU8) -- ^ xs
+  -> (Ptr ImU8) -- ^ ys
+  -> CInt -- ^ count
+  -> Double -- ^ ref
+  -> Spec -- ^ spec
+  -> IO ()
+plotStems_xy_U8 label_id xs ys count ref spec =
+  with spec $ \specPtr -> c_plotStems_xy_U8 label_id xs ys count ref specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotText_wrap"
+  c_plotText
+    :: CString -- ^ text
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> (Ptr ImVec2) -- ^ pix_offset
+    -> (Ptr Spec) -- ^ spec
+    -> IO ()
+
+plotText
+  :: CString -- ^ text
+  -> Double -- ^ x
+  -> Double -- ^ y
+  -> ImVec2 -- ^ pix_offset
+  -> Spec -- ^ spec
+  -> IO ()
+plotText text x y pix_offset spec =
+  with pix_offset $ \pix_offsetPtr -> with spec $ \specPtr -> c_plotText text x y pix_offsetPtr specPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotToPixels_wrap"
+  c_plotToPixels
+    :: (Ptr Point) -- ^ plt
+    -> ImAxis -- ^ x_axis
+    -> ImAxis -- ^ y_axis
+    -> (Ptr ImVec2) -- ^ out
+    -> IO ()
+
+plotToPixels
+  :: Point -- ^ plt
+  -> ImAxis -- ^ x_axis
+  -> ImAxis -- ^ y_axis
+  -> IO ImVec2
+plotToPixels plt x_axis y_axis =
+  with plt $ \pltPtr -> alloca $ \outPtr -> c_plotToPixels pltPtr x_axis y_axis outPtr >> peek outPtr
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPlotToPixelsDouble_wrap"
+  c_plotToPixelsDouble
+    :: Double -- ^ x
+    -> Double -- ^ y
+    -> ImAxis -- ^ x_axis
+    -> ImAxis -- ^ y_axis
+    -> (Ptr ImVec2) -- ^ out
+    -> IO ()
+
+plotToPixelsDouble
+  :: Double -- ^ x
+  -> Double -- ^ y
+  -> ImAxis -- ^ x_axis
+  -> ImAxis -- ^ y_axis
+  -> IO ImVec2
+plotToPixelsDouble x y x_axis y_axis =
+  alloca $ \outPtr -> c_plotToPixelsDouble x y x_axis y_axis outPtr >> peek outPtr
+
+-- C: void ImPlot::PopColormap(int count)
+foreign import capi unsafe "dcimgui_implot.h ImPlotPopColormap"
+  popColormap
+    :: CInt -- ^ count
+    -> IO ()
+
+-- C: void ImPlot::PopPlotClipRect()
+foreign import capi unsafe "dcimgui_implot.h ImPlotPopPlotClipRect"
+  popPlotClipRect :: IO ()
+
+-- C: void ImPlot::PopStyleColor(int count)
+foreign import capi unsafe "dcimgui_implot.h ImPlotPopStyleColor"
+  popStyleColor
+    :: CInt -- ^ count
+    -> IO ()
+
+-- C: void ImPlot::PopStyleVar(int count)
+foreign import capi unsafe "dcimgui_implot.h ImPlotPopStyleVar"
+  popStyleVar
+    :: CInt -- ^ count
+    -> IO ()
+
+-- C: void ImPlot::PushColormap(ImPlotColormap cmap)
+foreign import capi unsafe "dcimgui_implot.h ImPlotPushColormap"
+  pushColormap
+    :: Colormap -- ^ cmap
+    -> IO ()
+
+-- C: void ImPlot::PushColormap(const char* name)
+foreign import capi unsafe "dcimgui_implot.h ImPlotPushColormapStr"
+  pushColormapStr
+    :: CString -- ^ name
+    -> IO ()
+
+-- C: void ImPlot::PushPlotClipRect(float expand)
+foreign import capi unsafe "dcimgui_implot.h ImPlotPushPlotClipRect"
+  pushPlotClipRect
+    :: Float -- ^ expand
+    -> IO ()
+
+-- C: void ImPlot::PushStyleColor(ImPlotCol idx, ImU32 col)
+foreign import capi unsafe "dcimgui_implot.h ImPlotPushStyleColor"
+  pushStyleColor
+    :: Col -- ^ idx
+    -> ImU32 -- ^ col
+    -> IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPushStyleColorImVec4_wrap"
+  c_pushStyleColorImVec4
+    :: Col -- ^ idx
+    -> (Ptr ImVec4) -- ^ col
+    -> IO ()
+
+pushStyleColorImVec4
+  :: Col -- ^ idx
+  -> ImVec4 -- ^ col
+  -> IO ()
+pushStyleColorImVec4 idx col =
+  with col $ \colPtr -> c_pushStyleColorImVec4 idx colPtr
+
+-- C: void ImPlot::PushStyleVar(ImPlotStyleVar idx, float val)
+foreign import capi unsafe "dcimgui_implot.h ImPlotPushStyleVar"
+  pushStyleVar
+    :: StyleVar -- ^ idx
+    -> Float -- ^ val
+    -> IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPushStyleVarImVec2_wrap"
+  c_pushStyleVarImVec2
+    :: StyleVar -- ^ idx
+    -> (Ptr ImVec2) -- ^ val
+    -> IO ()
+
+pushStyleVarImVec2
+  :: StyleVar -- ^ idx
+  -> ImVec2 -- ^ val
+  -> IO ()
+pushStyleVarImVec2 idx val =
+  with val $ \valPtr -> c_pushStyleVarImVec2 idx valPtr
+
+-- C: void ImPlot::PushStyleVar(ImPlotStyleVar idx, int val)
+foreign import capi unsafe "dcimgui_implot.h ImPlotPushStyleVarInt"
+  pushStyleVarInt
+    :: StyleVar -- ^ idx
+    -> CInt -- ^ val
+    -> IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotSampleColormap_wrap"
+  c_sampleColormap
+    :: Float -- ^ t
+    -> Colormap -- ^ cmap
+    -> (Ptr ImVec4) -- ^ out
+    -> IO ()
+
+sampleColormap
+  :: Float -- ^ t
+  -> Colormap -- ^ cmap
+  -> IO ImVec4
+sampleColormap t cmap =
+  alloca $ \outPtr -> c_sampleColormap t cmap outPtr >> peek outPtr
+
+-- C: void ImPlot::SetAxes(ImAxis x_axis, ImAxis y_axis)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetAxes"
+  setAxes
+    :: ImAxis -- ^ x_axis
+    -> ImAxis -- ^ y_axis
+    -> IO ()
+
+-- C: void ImPlot::SetAxis(ImAxis axis)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetAxis"
+  setAxis
+    :: ImAxis -- ^ axis
+    -> IO ()
+
+-- C: void ImPlot::SetCurrentContext(ImPlotContext* ctx)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetCurrentContext"
+  setCurrentContext
+    :: (Ptr Context) -- ^ ctx
+    -> IO ()
+
+-- C: void ImPlot::SetImGuiContext(ImGuiContext* ctx)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetImGuiContext"
+  setImGuiContext
+    :: (Ptr ImGuiContext) -- ^ ctx
+    -> IO ()
+
+-- C: void ImPlot::SetNextAxesLimits(double x_min, double x_max, double y_min, double y_max, ImPlotCond cond)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetNextAxesLimits"
+  setNextAxesLimits
+    :: Double -- ^ x_min
+    -> Double -- ^ x_max
+    -> Double -- ^ y_min
+    -> Double -- ^ y_max
+    -> Cond -- ^ cond
+    -> IO ()
+
+-- C: void ImPlot::SetNextAxesToFit()
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetNextAxesToFit"
+  setNextAxesToFit :: IO ()
+
+-- C: void ImPlot::SetNextAxisLimits(ImAxis axis, double v_min, double v_max, ImPlotCond cond)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetNextAxisLimits"
+  setNextAxisLimits
+    :: ImAxis -- ^ axis
+    -> Double -- ^ v_min
+    -> Double -- ^ v_max
+    -> Cond -- ^ cond
+    -> IO ()
+
+-- C: void ImPlot::SetNextAxisLinks(ImAxis axis, double* link_min, double* link_max)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetNextAxisLinks"
+  setNextAxisLinks
+    :: ImAxis -- ^ axis
+    -> (Ptr Double) -- ^ link_min
+    -> (Ptr Double) -- ^ link_max
+    -> IO ()
+
+-- C: void ImPlot::SetNextAxisToFit(ImAxis axis)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetNextAxisToFit"
+  setNextAxisToFit
+    :: ImAxis -- ^ axis
+    -> IO ()
+
+-- C: void ImPlot::SetupAxes(const char* x_label, const char* y_label, ImPlotAxisFlags x_flags, ImPlotAxisFlags y_flags)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetupAxes"
+  setupAxes
+    :: CString -- ^ x_label
+    -> CString -- ^ y_label
+    -> AxisFlags -- ^ x_flags
+    -> AxisFlags -- ^ y_flags
+    -> IO ()
+
+-- C: void ImPlot::SetupAxesLimits(double x_min, double x_max, double y_min, double y_max, ImPlotCond cond)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetupAxesLimits"
+  setupAxesLimits
+    :: Double -- ^ x_min
+    -> Double -- ^ x_max
+    -> Double -- ^ y_min
+    -> Double -- ^ y_max
+    -> Cond -- ^ cond
+    -> IO ()
+
+-- C: void ImPlot::SetupAxis(ImAxis axis, const char* label, ImPlotAxisFlags flags)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetupAxis"
+  setupAxis
+    :: ImAxis -- ^ axis
+    -> CString -- ^ label
+    -> AxisFlags -- ^ flags
+    -> IO ()
+
+-- C: void ImPlot::SetupAxisFormat(ImAxis axis, const char* fmt)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetupAxisFormat"
+  setupAxisFormat
+    :: ImAxis -- ^ axis
+    -> CString -- ^ fmt
+    -> IO ()
+
+-- C: void ImPlot::SetupAxisFormat(ImAxis axis, ImPlotFormatter formatter, void* data)
+foreign import capi safe "dcimgui_implot.h ImPlotSetupAxisFormatImPlotFormatter"
+  setupAxisFormatImPlotFormatter
+    :: ImAxis -- ^ axis
+    -> Formatter -- ^ formatter
+    -> (Ptr ()) -- ^ data
+    -> IO ()
+
+-- C: void ImPlot::SetupAxisLimits(ImAxis axis, double v_min, double v_max, ImPlotCond cond)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetupAxisLimits"
+  setupAxisLimits
+    :: ImAxis -- ^ axis
+    -> Double -- ^ v_min
+    -> Double -- ^ v_max
+    -> Cond -- ^ cond
+    -> IO ()
+
+-- C: void ImPlot::SetupAxisLimitsConstraints(ImAxis axis, double v_min, double v_max)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetupAxisLimitsConstraints"
+  setupAxisLimitsConstraints
+    :: ImAxis -- ^ axis
+    -> Double -- ^ v_min
+    -> Double -- ^ v_max
+    -> IO ()
+
+-- C: void ImPlot::SetupAxisLinks(ImAxis axis, double* link_min, double* link_max)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetupAxisLinks"
+  setupAxisLinks
+    :: ImAxis -- ^ axis
+    -> (Ptr Double) -- ^ link_min
+    -> (Ptr Double) -- ^ link_max
+    -> IO ()
+
+-- C: void ImPlot::SetupAxisScale(ImAxis axis, ImPlotScale scale)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetupAxisScale"
+  setupAxisScale
+    :: ImAxis -- ^ axis
+    -> Scale -- ^ scale
+    -> IO ()
+
+-- C: void ImPlot::SetupAxisScale(ImAxis axis, ImPlotTransform forward, ImPlotTransform inverse, void* data)
+foreign import capi safe "dcimgui_implot.h ImPlotSetupAxisScaleImPlotTransform"
+  setupAxisScaleImPlotTransform
+    :: ImAxis -- ^ axis
+    -> Transform -- ^ forward
+    -> Transform -- ^ inverse
+    -> (Ptr ()) -- ^ data
+    -> IO ()
+
+-- C: void ImPlot::SetupAxisTicks(ImAxis axis, const double* values, int n_ticks, const char*const[] labels, bool keep_default)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetupAxisTicks"
+  setupAxisTicks
+    :: ImAxis -- ^ axis
+    -> (Ptr Double) -- ^ values
+    -> CInt -- ^ n_ticks
+    -> (Ptr CString) -- ^ labels
+    -> CBool -- ^ keep_default
+    -> IO ()
+
+-- C: void ImPlot::SetupAxisTicks(ImAxis axis, double v_min, double v_max, int n_ticks, const char*const[] labels, bool keep_default)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetupAxisTicksDouble"
+  setupAxisTicksDouble
+    :: ImAxis -- ^ axis
+    -> Double -- ^ v_min
+    -> Double -- ^ v_max
+    -> CInt -- ^ n_ticks
+    -> (Ptr CString) -- ^ labels
+    -> CBool -- ^ keep_default
+    -> IO ()
+
+-- C: void ImPlot::SetupAxisZoomConstraints(ImAxis axis, double z_min, double z_max)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetupAxisZoomConstraints"
+  setupAxisZoomConstraints
+    :: ImAxis -- ^ axis
+    -> Double -- ^ z_min
+    -> Double -- ^ z_max
+    -> IO ()
+
+-- C: void ImPlot::SetupFinish()
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetupFinish"
+  setupFinish :: IO ()
+
+-- C: void ImPlot::SetupLegend(ImPlotLocation location, ImPlotLegendFlags flags)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetupLegend"
+  setupLegend
+    :: Location -- ^ location
+    -> LegendFlags -- ^ flags
+    -> IO ()
+
+-- C: void ImPlot::SetupMouseText(ImPlotLocation location, ImPlotMouseTextFlags flags)
+foreign import capi unsafe "dcimgui_implot.h ImPlotSetupMouseText"
+  setupMouseText
+    :: Location -- ^ location
+    -> MouseTextFlags -- ^ flags
+    -> IO ()
+
+-- C: bool ImPlot::ShowColormapSelector(const char* label)
+foreign import capi unsafe "dcimgui_implot.h ImPlotShowColormapSelector"
+  showColormapSelector
+    :: CString -- ^ label
+    -> IO CBool
+
+-- C: bool ImPlot::ShowInputMapSelector(const char* label)
+foreign import capi unsafe "dcimgui_implot.h ImPlotShowInputMapSelector"
+  showInputMapSelector
+    :: CString -- ^ label
+    -> IO CBool
+
+-- C: void ImPlot::ShowMetricsWindow(bool* p_popen)
+foreign import capi unsafe "dcimgui_implot.h ImPlotShowMetricsWindow"
+  showMetricsWindow
+    :: (Ptr CBool) -- ^ p_popen
+    -> IO ()
+
+-- C: void ImPlot::ShowStyleEditor(ImPlotStyle* ref)
+foreign import capi unsafe "dcimgui_implot.h ImPlotShowStyleEditor"
+  showStyleEditor
+    :: (Ptr Style) -- ^ ref
+    -> IO ()
+
+-- C: bool ImPlot::ShowStyleSelector(const char* label)
+foreign import capi unsafe "dcimgui_implot.h ImPlotShowStyleSelector"
+  showStyleSelector
+    :: CString -- ^ label
+    -> IO CBool
+
+-- C: void ImPlot::ShowUserGuide()
+foreign import capi unsafe "dcimgui_implot.h ImPlotShowUserGuide"
+  showUserGuide :: IO ()
+
+-- C: void ImPlot::StyleColorsAuto(ImPlotStyle* dst)
+foreign import capi unsafe "dcimgui_implot.h ImPlotStyleColorsAuto"
+  styleColorsAuto
+    :: (Ptr Style) -- ^ dst
+    -> IO ()
+
+-- C: void ImPlot::StyleColorsClassic(ImPlotStyle* dst)
+foreign import capi unsafe "dcimgui_implot.h ImPlotStyleColorsClassic"
+  styleColorsClassic
+    :: (Ptr Style) -- ^ dst
+    -> IO ()
+
+-- C: void ImPlot::StyleColorsDark(ImPlotStyle* dst)
+foreign import capi unsafe "dcimgui_implot.h ImPlotStyleColorsDark"
+  styleColorsDark
+    :: (Ptr Style) -- ^ dst
+    -> IO ()
+
+-- C: void ImPlot::StyleColorsLight(ImPlotStyle* dst)
+foreign import capi unsafe "dcimgui_implot.h ImPlotStyleColorsLight"
+  styleColorsLight
+    :: (Ptr Style) -- ^ dst
+    -> IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotTagX_wrap"
+  c_tagX
+    :: Double -- ^ x
+    -> (Ptr ImVec4) -- ^ col
+    -> CBool -- ^ round
+    -> IO ()
+
+tagX
+  :: Double -- ^ x
+  -> ImVec4 -- ^ col
+  -> CBool -- ^ round
+  -> IO ()
+tagX x col round =
+  with col $ \colPtr -> c_tagX x colPtr round
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotTagXStrUnformatted_wrap"
+  c_tagXStrUnformatted
+    :: Double -- ^ x
+    -> (Ptr ImVec4) -- ^ col
+    -> CString -- ^ text
+    -> IO ()
+
+tagXStrUnformatted
+  :: Double -- ^ x
+  -> ImVec4 -- ^ col
+  -> CString -- ^ text
+  -> IO ()
+tagXStrUnformatted x col text =
+  with col $ \colPtr -> c_tagXStrUnformatted x colPtr text
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotTagY_wrap"
+  c_tagY
+    :: Double -- ^ y
+    -> (Ptr ImVec4) -- ^ col
+    -> CBool -- ^ round
+    -> IO ()
+
+tagY
+  :: Double -- ^ y
+  -> ImVec4 -- ^ col
+  -> CBool -- ^ round
+  -> IO ()
+tagY y col round =
+  with col $ \colPtr -> c_tagY y colPtr round
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotTagYStrUnformatted_wrap"
+  c_tagYStrUnformatted
+    :: Double -- ^ y
+    -> (Ptr ImVec4) -- ^ col
+    -> CString -- ^ text
+    -> IO ()
+
+tagYStrUnformatted
+  :: Double -- ^ y
+  -> ImVec4 -- ^ col
+  -> CString -- ^ text
+  -> IO ()
+tagYStrUnformatted y col text =
+  with col $ \colPtr -> c_tagYStrUnformatted y colPtr text
diff --git a/src/DearImGui/Raw/ImPlot/Context.hsc b/src/DearImGui/Raw/ImPlot/Context.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Context.hsc
@@ -0,0 +1,14 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Context
+  ( Context
+  ) where
+
+#include "dcimgui_implot.h"
+
+-- structs (opaque)
+
+data Context
diff --git a/src/DearImGui/Raw/ImPlot/Enums/AxisFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/AxisFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/AxisFlags.hsc
@@ -0,0 +1,116 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.AxisFlags
+  ( AxisFlags
+  , pattern AutoFit
+  , pattern AuxDefault
+  , pattern Foreground
+  , pattern Invert
+  , pattern Lock
+  , pattern LockMax
+  , pattern LockMin
+  , pattern NoDecorations
+  , pattern NoGridLines
+  , pattern NoHighlight
+  , pattern NoInitialFit
+  , pattern NoLabel
+  , pattern NoMenus
+  , pattern NoSideSwitch
+  , pattern NoTickLabels
+  , pattern NoTickMarks
+  , pattern None
+  , pattern Opposite
+  , pattern PanStretch
+  , pattern RangeFit
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Options for plot axes (see SetupAxis).
+type AxisFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: AxisFlags
+pattern None = #{const ImPlotAxisFlags_None}
+
+-- | the axis label will not be displayed (axis labels are also hidden if the supplied string name is nullptr)
+pattern NoLabel :: AxisFlags
+pattern NoLabel = #{const ImPlotAxisFlags_NoLabel}
+
+-- | no grid lines will be displayed
+pattern NoGridLines :: AxisFlags
+pattern NoGridLines = #{const ImPlotAxisFlags_NoGridLines}
+
+-- | no tick marks will be displayed
+pattern NoTickMarks :: AxisFlags
+pattern NoTickMarks = #{const ImPlotAxisFlags_NoTickMarks}
+
+-- | no text labels will be displayed
+pattern NoTickLabels :: AxisFlags
+pattern NoTickLabels = #{const ImPlotAxisFlags_NoTickLabels}
+
+-- | axis will not be initially fit to data extents on the first rendered frame
+pattern NoInitialFit :: AxisFlags
+pattern NoInitialFit = #{const ImPlotAxisFlags_NoInitialFit}
+
+-- | the user will not be able to open context menus with right-click
+pattern NoMenus :: AxisFlags
+pattern NoMenus = #{const ImPlotAxisFlags_NoMenus}
+
+-- | the user will not be able to switch the axis side by dragging it
+pattern NoSideSwitch :: AxisFlags
+pattern NoSideSwitch = #{const ImPlotAxisFlags_NoSideSwitch}
+
+-- | the axis will not have its background highlighted when hovered or held
+pattern NoHighlight :: AxisFlags
+pattern NoHighlight = #{const ImPlotAxisFlags_NoHighlight}
+
+-- | axis ticks and labels will be rendered on the conventionally opposite side (i.e, right or top)
+pattern Opposite :: AxisFlags
+pattern Opposite = #{const ImPlotAxisFlags_Opposite}
+
+-- | grid lines will be displayed in the foreground (i.e. on top of data) instead of the background
+pattern Foreground :: AxisFlags
+pattern Foreground = #{const ImPlotAxisFlags_Foreground}
+
+-- | the axis will be inverted
+pattern Invert :: AxisFlags
+pattern Invert = #{const ImPlotAxisFlags_Invert}
+
+-- | axis will be auto-fitting to data extents
+pattern AutoFit :: AxisFlags
+pattern AutoFit = #{const ImPlotAxisFlags_AutoFit}
+
+-- | axis will only fit points if the point is in the visible range of the **orthogonal** axis
+pattern RangeFit :: AxisFlags
+pattern RangeFit = #{const ImPlotAxisFlags_RangeFit}
+
+-- | panning in a locked or constrained state will cause the axis to stretch if possible
+pattern PanStretch :: AxisFlags
+pattern PanStretch = #{const ImPlotAxisFlags_PanStretch}
+
+-- | the axis minimum value will be locked when panning/zooming
+pattern LockMin :: AxisFlags
+pattern LockMin = #{const ImPlotAxisFlags_LockMin}
+
+-- | the axis maximum value will be locked when panning/zooming
+pattern LockMax :: AxisFlags
+pattern LockMax = #{const ImPlotAxisFlags_LockMax}
+
+pattern Lock :: AxisFlags
+pattern Lock = #{const ImPlotAxisFlags_Lock}
+
+pattern NoDecorations :: AxisFlags
+pattern NoDecorations = #{const ImPlotAxisFlags_NoDecorations}
+
+pattern AuxDefault :: AxisFlags
+pattern AuxDefault = #{const ImPlotAxisFlags_AuxDefault}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/BarGroupsFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/BarGroupsFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/BarGroupsFlags.hsc
@@ -0,0 +1,34 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.BarGroupsFlags
+  ( BarGroupsFlags
+  , pattern Horizontal
+  , pattern None
+  , pattern Stacked
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotBarGroups. Used by setting ImPlotSpec::Flags.
+type BarGroupsFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: BarGroupsFlags
+pattern None = #{const ImPlotBarGroupsFlags_None}
+
+-- | bar groups will be rendered horizontally on the current y-axis
+pattern Horizontal :: BarGroupsFlags
+pattern Horizontal = #{const ImPlotBarGroupsFlags_Horizontal}
+
+-- | items in a group will be stacked on top of each other
+pattern Stacked :: BarGroupsFlags
+pattern Stacked = #{const ImPlotBarGroupsFlags_Stacked}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/BarsFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/BarsFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/BarsFlags.hsc
@@ -0,0 +1,29 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.BarsFlags
+  ( BarsFlags
+  , pattern Horizontal
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotBars. Used by setting ImPlotSpec::Flags.
+type BarsFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: BarsFlags
+pattern None = #{const ImPlotBarsFlags_None}
+
+-- | bars will be rendered horizontally on the current y-axis
+pattern Horizontal :: BarsFlags
+pattern Horizontal = #{const ImPlotBarsFlags_Horizontal}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/Bin.hsc b/src/DearImGui/Raw/ImPlot/Enums/Bin.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/Bin.hsc
@@ -0,0 +1,39 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.Bin
+  ( Bin
+  , pattern Rice
+  , pattern Scott
+  , pattern Sqrt
+  , pattern Sturges
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Enums for different automatic histogram binning methods (k = bin count or w = bin width)
+type Bin = CInt
+
+-- enums
+
+-- | k = sqrt(n)
+pattern Sqrt :: Bin
+pattern Sqrt = #{const ImPlotBin_Sqrt}
+
+-- | k = 1 + log2(n)
+pattern Sturges :: Bin
+pattern Sturges = #{const ImPlotBin_Sturges}
+
+-- | k = 2 * cbrt(n)
+pattern Rice :: Bin
+pattern Rice = #{const ImPlotBin_Rice}
+
+-- | w = 3.49 * sigma / cbrt(n)
+pattern Scott :: Bin
+pattern Scott = #{const ImPlotBin_Scott}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/BubblesFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/BubblesFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/BubblesFlags.hsc
@@ -0,0 +1,24 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.BubblesFlags
+  ( BubblesFlags
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotBubbles. Used by setting ImPlotSpec::Flags.
+type BubblesFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: BubblesFlags
+pattern None = #{const ImPlotBubblesFlags_None}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/Col.hsc b/src/DearImGui/Raw/ImPlot/Enums/Col.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/Col.hsc
@@ -0,0 +1,103 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.Col
+  ( Col
+  , pattern AxisBg
+  , pattern AxisBgActive
+  , pattern AxisBgHovered
+  , pattern AxisGrid
+  , pattern AxisText
+  , pattern AxisTick
+  , pattern COUNT
+  , pattern Crosshairs
+  , pattern FrameBg
+  , pattern InlayText
+  , pattern LegendBg
+  , pattern LegendBorder
+  , pattern LegendText
+  , pattern PlotBg
+  , pattern PlotBorder
+  , pattern Selection
+  , pattern TitleText
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Plot styling colors.
+type Col = CInt
+
+-- enums
+
+-- | plot frame background color (defaults to ImGuiCol_FrameBg)
+pattern FrameBg :: Col
+pattern FrameBg = #{const ImPlotCol_FrameBg}
+
+-- | plot area background color (defaults to ImGuiCol_WindowBg)
+pattern PlotBg :: Col
+pattern PlotBg = #{const ImPlotCol_PlotBg}
+
+-- | plot area border color (defaults to ImGuiCol_Border)
+pattern PlotBorder :: Col
+pattern PlotBorder = #{const ImPlotCol_PlotBorder}
+
+-- | legend background color (defaults to ImGuiCol_PopupBg)
+pattern LegendBg :: Col
+pattern LegendBg = #{const ImPlotCol_LegendBg}
+
+-- | legend border color (defaults to ImPlotCol_PlotBorder)
+pattern LegendBorder :: Col
+pattern LegendBorder = #{const ImPlotCol_LegendBorder}
+
+-- | legend text color (defaults to ImPlotCol_InlayText)
+pattern LegendText :: Col
+pattern LegendText = #{const ImPlotCol_LegendText}
+
+-- | plot title text color (defaults to ImGuiCol_Text)
+pattern TitleText :: Col
+pattern TitleText = #{const ImPlotCol_TitleText}
+
+-- | color of text appearing inside of plots (defaults to ImGuiCol_Text)
+pattern InlayText :: Col
+pattern InlayText = #{const ImPlotCol_InlayText}
+
+-- | axis label and tick labels color (defaults to ImGuiCol_Text)
+pattern AxisText :: Col
+pattern AxisText = #{const ImPlotCol_AxisText}
+
+-- | axis grid color (defaults to 25% ImPlotCol_AxisText)
+pattern AxisGrid :: Col
+pattern AxisGrid = #{const ImPlotCol_AxisGrid}
+
+-- | axis tick color (defaults to AxisGrid)
+pattern AxisTick :: Col
+pattern AxisTick = #{const ImPlotCol_AxisTick}
+
+-- | background color of axis hover region (defaults to transparent)
+pattern AxisBg :: Col
+pattern AxisBg = #{const ImPlotCol_AxisBg}
+
+-- | axis hover color (defaults to ImGuiCol_ButtonHovered)
+pattern AxisBgHovered :: Col
+pattern AxisBgHovered = #{const ImPlotCol_AxisBgHovered}
+
+-- | axis active color (defaults to ImGuiCol_ButtonActive)
+pattern AxisBgActive :: Col
+pattern AxisBgActive = #{const ImPlotCol_AxisBgActive}
+
+-- | box-selection color (defaults to yellow)
+pattern Selection :: Col
+pattern Selection = #{const ImPlotCol_Selection}
+
+-- | crosshairs color (defaults to ImPlotCol_PlotBorder)
+pattern Crosshairs :: Col
+pattern Crosshairs = #{const ImPlotCol_Crosshairs}
+
+pattern COUNT :: Col
+pattern COUNT = #{const ImPlotCol_COUNT}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/Colormap.hsc b/src/DearImGui/Raw/ImPlot/Enums/Colormap.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/Colormap.hsc
@@ -0,0 +1,99 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.Colormap
+  ( Colormap
+  , pattern BrBG
+  , pattern Cool
+  , pattern Dark
+  , pattern Deep
+  , pattern Greys
+  , pattern Hot
+  , pattern Jet
+  , pattern Paired
+  , pattern Pastel
+  , pattern PiYG
+  , pattern Pink
+  , pattern Plasma
+  , pattern RdBu
+  , pattern Spectral
+  , pattern Twilight
+  , pattern Viridis
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Built-in colormaps
+type Colormap = CInt
+
+-- enums
+
+-- | a.k.a. seaborn deep             (qual=true,  n=10) (default)
+pattern Deep :: Colormap
+pattern Deep = #{const ImPlotColormap_Deep}
+
+-- | a.k.a. matplotlib "Set1"        (qual=true,  n=9 )
+pattern Dark :: Colormap
+pattern Dark = #{const ImPlotColormap_Dark}
+
+-- | a.k.a. matplotlib "Pastel1"     (qual=true,  n=9 )
+pattern Pastel :: Colormap
+pattern Pastel = #{const ImPlotColormap_Pastel}
+
+-- | a.k.a. matplotlib "Paired"      (qual=true,  n=12)
+pattern Paired :: Colormap
+pattern Paired = #{const ImPlotColormap_Paired}
+
+-- | a.k.a. matplotlib "viridis"     (qual=false, n=11)
+pattern Viridis :: Colormap
+pattern Viridis = #{const ImPlotColormap_Viridis}
+
+-- | a.k.a. matplotlib "plasma"      (qual=false, n=11)
+pattern Plasma :: Colormap
+pattern Plasma = #{const ImPlotColormap_Plasma}
+
+-- | a.k.a. matplotlib/MATLAB "hot"  (qual=false, n=11)
+pattern Hot :: Colormap
+pattern Hot = #{const ImPlotColormap_Hot}
+
+-- | a.k.a. matplotlib/MATLAB "cool" (qual=false, n=11)
+pattern Cool :: Colormap
+pattern Cool = #{const ImPlotColormap_Cool}
+
+-- | a.k.a. matplotlib/MATLAB "pink" (qual=false, n=11)
+pattern Pink :: Colormap
+pattern Pink = #{const ImPlotColormap_Pink}
+
+-- | a.k.a. MATLAB "jet"             (qual=false, n=11)
+pattern Jet :: Colormap
+pattern Jet = #{const ImPlotColormap_Jet}
+
+-- | a.k.a. matplotlib "twilight"    (qual=false, n=11)
+pattern Twilight :: Colormap
+pattern Twilight = #{const ImPlotColormap_Twilight}
+
+-- | red/blue, Color Brewer          (qual=false, n=11)
+pattern RdBu :: Colormap
+pattern RdBu = #{const ImPlotColormap_RdBu}
+
+-- | brown/blue-green, Color Brewer  (qual=false, n=11)
+pattern BrBG :: Colormap
+pattern BrBG = #{const ImPlotColormap_BrBG}
+
+-- | pink/yellow-green, Color Brewer (qual=false, n=11)
+pattern PiYG :: Colormap
+pattern PiYG = #{const ImPlotColormap_PiYG}
+
+-- | color spectrum, Color Brewer    (qual=false, n=11)
+pattern Spectral :: Colormap
+pattern Spectral = #{const ImPlotColormap_Spectral}
+
+-- | white/black                     (qual=false, n=2 )
+pattern Greys :: Colormap
+pattern Greys = #{const ImPlotColormap_Greys}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/ColormapScaleFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/ColormapScaleFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/ColormapScaleFlags.hsc
@@ -0,0 +1,39 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.ColormapScaleFlags
+  ( ColormapScaleFlags
+  , pattern Invert
+  , pattern NoLabel
+  , pattern None
+  , pattern Opposite
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for ColormapScale
+type ColormapScaleFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: ColormapScaleFlags
+pattern None = #{const ImPlotColormapScaleFlags_None}
+
+-- | the colormap axis label will not be displayed
+pattern NoLabel :: ColormapScaleFlags
+pattern NoLabel = #{const ImPlotColormapScaleFlags_NoLabel}
+
+-- | render the colormap label and tick labels on the opposite side
+pattern Opposite :: ColormapScaleFlags
+pattern Opposite = #{const ImPlotColormapScaleFlags_Opposite}
+
+-- | invert the colormap bar and axis scale (this only affects rendering; if you only want to reverse the scale mapping, make scale_min > scale_max)
+pattern Invert :: ColormapScaleFlags
+pattern Invert = #{const ImPlotColormapScaleFlags_Invert}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/Cond.hsc b/src/DearImGui/Raw/ImPlot/Enums/Cond.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/Cond.hsc
@@ -0,0 +1,34 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.Cond
+  ( Cond
+  , pattern Always
+  , pattern None
+  , pattern Once
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Represents a condition for SetupAxisLimits etc. (same as ImGuiCond, but we only support a subset of those enums)
+type Cond = CInt
+
+-- enums
+
+-- | No condition (always set the variable), same as _Always
+pattern None :: Cond
+pattern None = #{const ImPlotCond_None}
+
+-- | No condition (always set the variable)
+pattern Always :: Cond
+pattern Always = #{const ImPlotCond_Always}
+
+-- | Set the variable once per runtime session (only the first call will succeed)
+pattern Once :: Cond
+pattern Once = #{const ImPlotCond_Once}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/DigitalFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/DigitalFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/DigitalFlags.hsc
@@ -0,0 +1,24 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.DigitalFlags
+  ( DigitalFlags
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotDigital (placeholder). Used by setting ImPlotSpec::Flags.
+type DigitalFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: DigitalFlags
+pattern None = #{const ImPlotDigitalFlags_None}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/DragToolFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/DragToolFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/DragToolFlags.hsc
@@ -0,0 +1,44 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.DragToolFlags
+  ( DragToolFlags
+  , pattern Delayed
+  , pattern NoCursors
+  , pattern NoFit
+  , pattern NoInputs
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Options for DragPoint, DragLine, DragRect
+type DragToolFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: DragToolFlags
+pattern None = #{const ImPlotDragToolFlags_None}
+
+-- | drag tools won't change cursor icons when hovered or held
+pattern NoCursors :: DragToolFlags
+pattern NoCursors = #{const ImPlotDragToolFlags_NoCursors}
+
+-- | the drag tool won't be considered for plot fits
+pattern NoFit :: DragToolFlags
+pattern NoFit = #{const ImPlotDragToolFlags_NoFit}
+
+-- | lock the tool from user inputs
+pattern NoInputs :: DragToolFlags
+pattern NoInputs = #{const ImPlotDragToolFlags_NoInputs}
+
+-- | tool rendering will be delayed one frame; useful when applying position-constraints
+pattern Delayed :: DragToolFlags
+pattern Delayed = #{const ImPlotDragToolFlags_Delayed}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/DummyFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/DummyFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/DummyFlags.hsc
@@ -0,0 +1,24 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.DummyFlags
+  ( DummyFlags
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotDummy (placeholder). Used by setting ImPlotSpec::Flags.
+type DummyFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: DummyFlags
+pattern None = #{const ImPlotDummyFlags_None}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/ErrorBarsFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/ErrorBarsFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/ErrorBarsFlags.hsc
@@ -0,0 +1,29 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.ErrorBarsFlags
+  ( ErrorBarsFlags
+  , pattern Horizontal
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotErrorBars. Used by setting ImPlotSpec::Flags.
+type ErrorBarsFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: ErrorBarsFlags
+pattern None = #{const ImPlotErrorBarsFlags_None}
+
+-- | error bars will be rendered horizontally on the current y-axis
+pattern Horizontal :: ErrorBarsFlags
+pattern Horizontal = #{const ImPlotErrorBarsFlags_Horizontal}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/Flags.hsc b/src/DearImGui/Raw/ImPlot/Enums/Flags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/Flags.hsc
@@ -0,0 +1,73 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.Flags
+  ( Flags
+  , pattern CanvasOnly
+  , pattern Crosshairs
+  , pattern Equal
+  , pattern NoBoxSelect
+  , pattern NoFrame
+  , pattern NoInputs
+  , pattern NoLegend
+  , pattern NoMenus
+  , pattern NoMouseText
+  , pattern NoTitle
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Options for plots (see BeginPlot).
+type Flags = CInt
+
+-- enums
+
+-- | default
+pattern None :: Flags
+pattern None = #{const ImPlotFlags_None}
+
+-- | the plot title will not be displayed (titles are also hidden if preceded by double hashes, e.g. "##MyPlot")
+pattern NoTitle :: Flags
+pattern NoTitle = #{const ImPlotFlags_NoTitle}
+
+-- | the legend will not be displayed
+pattern NoLegend :: Flags
+pattern NoLegend = #{const ImPlotFlags_NoLegend}
+
+-- | the mouse position, in plot coordinates, will not be displayed inside of the plot
+pattern NoMouseText :: Flags
+pattern NoMouseText = #{const ImPlotFlags_NoMouseText}
+
+-- | the user will not be able to interact with the plot
+pattern NoInputs :: Flags
+pattern NoInputs = #{const ImPlotFlags_NoInputs}
+
+-- | the user will not be able to open context menus
+pattern NoMenus :: Flags
+pattern NoMenus = #{const ImPlotFlags_NoMenus}
+
+-- | the user will not be able to box-select
+pattern NoBoxSelect :: Flags
+pattern NoBoxSelect = #{const ImPlotFlags_NoBoxSelect}
+
+-- | the ImGui frame will not be rendered
+pattern NoFrame :: Flags
+pattern NoFrame = #{const ImPlotFlags_NoFrame}
+
+-- | x and y axes pairs will be constrained to have the same units/pixel
+pattern Equal :: Flags
+pattern Equal = #{const ImPlotFlags_Equal}
+
+-- | the default mouse cursor will be replaced with a crosshair when hovered
+pattern Crosshairs :: Flags
+pattern Crosshairs = #{const ImPlotFlags_Crosshairs}
+
+pattern CanvasOnly :: Flags
+pattern CanvasOnly = #{const ImPlotFlags_CanvasOnly}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/HeatmapFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/HeatmapFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/HeatmapFlags.hsc
@@ -0,0 +1,29 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.HeatmapFlags
+  ( HeatmapFlags
+  , pattern ColMajor
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotHeatmap. Used by setting ImPlotSpec::Flags.
+type HeatmapFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: HeatmapFlags
+pattern None = #{const ImPlotHeatmapFlags_None}
+
+-- | data will be read in column major order
+pattern ColMajor :: HeatmapFlags
+pattern ColMajor = #{const ImPlotHeatmapFlags_ColMajor}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/HistogramFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/HistogramFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/HistogramFlags.hsc
@@ -0,0 +1,49 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.HistogramFlags
+  ( HistogramFlags
+  , pattern ColMajor
+  , pattern Cumulative
+  , pattern Density
+  , pattern Horizontal
+  , pattern NoOutliers
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotHistogram and PlotHistogram2D. Used by setting ImPlotSpec::Flags.
+type HistogramFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: HistogramFlags
+pattern None = #{const ImPlotHistogramFlags_None}
+
+-- | histogram bars will be rendered horizontally (not supported by PlotHistogram2D)
+pattern Horizontal :: HistogramFlags
+pattern Horizontal = #{const ImPlotHistogramFlags_Horizontal}
+
+-- | each bin will contain its count plus the counts of all previous bins (not supported by PlotHistogram2D)
+pattern Cumulative :: HistogramFlags
+pattern Cumulative = #{const ImPlotHistogramFlags_Cumulative}
+
+-- | counts will be normalized, i.e. the PDF will be visualized, or the CDF will be visualized if Cumulative is also set
+pattern Density :: HistogramFlags
+pattern Density = #{const ImPlotHistogramFlags_Density}
+
+-- | exclude values outside the specified histogram range from the count toward normalizing and cumulative counts
+pattern NoOutliers :: HistogramFlags
+pattern NoOutliers = #{const ImPlotHistogramFlags_NoOutliers}
+
+-- | data will be read in column major order (not supported by PlotHistogram)
+pattern ColMajor :: HistogramFlags
+pattern ColMajor = #{const ImPlotHistogramFlags_ColMajor}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/ImAxis.hsc b/src/DearImGui/Raw/ImPlot/Enums/ImAxis.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/ImAxis.hsc
@@ -0,0 +1,56 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.ImAxis
+  ( ImAxis
+  , pattern COUNT
+  , pattern X1
+  , pattern X2
+  , pattern X3
+  , pattern Y1
+  , pattern Y2
+  , pattern Y3
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Axis indices. The values assigned may change; NEVER hardcode these.
+type ImAxis = CInt
+
+-- enums
+
+-- | horizontal axes
+-- enabled by default
+pattern X1 :: ImAxis
+pattern X1 = #{const ImAxis_X1}
+
+-- | disabled by default
+pattern X2 :: ImAxis
+pattern X2 = #{const ImAxis_X2}
+
+-- | disabled by default
+pattern X3 :: ImAxis
+pattern X3 = #{const ImAxis_X3}
+
+-- | vertical axes
+-- enabled by default
+pattern Y1 :: ImAxis
+pattern Y1 = #{const ImAxis_Y1}
+
+-- | disabled by default
+pattern Y2 :: ImAxis
+pattern Y2 = #{const ImAxis_Y2}
+
+-- | disabled by default
+pattern Y3 :: ImAxis
+pattern Y3 = #{const ImAxis_Y3}
+
+-- | bookkeeping
+pattern COUNT :: ImAxis
+pattern COUNT = #{const ImAxis_COUNT}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/ImageFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/ImageFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/ImageFlags.hsc
@@ -0,0 +1,24 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.ImageFlags
+  ( ImageFlags
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotImage (placeholder). Used by setting ImPlotSpec::Flags.
+type ImageFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: ImageFlags
+pattern None = #{const ImPlotImageFlags_None}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/InfLinesFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/InfLinesFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/InfLinesFlags.hsc
@@ -0,0 +1,29 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.InfLinesFlags
+  ( InfLinesFlags
+  , pattern Horizontal
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotInfLines. Used by setting ImPlotSpec::Flags.
+type InfLinesFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: InfLinesFlags
+pattern None = #{const ImPlotInfLinesFlags_None}
+
+-- | lines will be rendered horizontally on the current y-axis
+pattern Horizontal :: InfLinesFlags
+pattern Horizontal = #{const ImPlotInfLinesFlags_Horizontal}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/ItemFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/ItemFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/ItemFlags.hsc
@@ -0,0 +1,33 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.ItemFlags
+  ( ItemFlags
+  , pattern NoFit
+  , pattern NoLegend
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for ANY PlotX function. Used by setting ImPlotSpec::Flags.
+type ItemFlags = CInt
+
+-- enums
+
+pattern None :: ItemFlags
+pattern None = #{const ImPlotItemFlags_None}
+
+-- | the item won't have a legend entry displayed
+pattern NoLegend :: ItemFlags
+pattern NoLegend = #{const ImPlotItemFlags_NoLegend}
+
+-- | the item won't be considered for plot fits
+pattern NoFit :: ItemFlags
+pattern NoFit = #{const ImPlotItemFlags_NoFit}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/LegendFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/LegendFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/LegendFlags.hsc
@@ -0,0 +1,64 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.LegendFlags
+  ( LegendFlags
+  , pattern Horizontal
+  , pattern NoButtons
+  , pattern NoHighlightAxis
+  , pattern NoHighlightItem
+  , pattern NoMenus
+  , pattern None
+  , pattern Outside
+  , pattern Reverse
+  , pattern Sort
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Options for legends (see SetupLegend)
+type LegendFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: LegendFlags
+pattern None = #{const ImPlotLegendFlags_None}
+
+-- | legend icons will not function as hide/show buttons
+pattern NoButtons :: LegendFlags
+pattern NoButtons = #{const ImPlotLegendFlags_NoButtons}
+
+-- | plot items will not be highlighted when their legend entry is hovered
+pattern NoHighlightItem :: LegendFlags
+pattern NoHighlightItem = #{const ImPlotLegendFlags_NoHighlightItem}
+
+-- | axes will not be highlighted when legend entries are hovered (only relevant if x/y-axis count > 1)
+pattern NoHighlightAxis :: LegendFlags
+pattern NoHighlightAxis = #{const ImPlotLegendFlags_NoHighlightAxis}
+
+-- | the user will not be able to open context menus with right-click
+pattern NoMenus :: LegendFlags
+pattern NoMenus = #{const ImPlotLegendFlags_NoMenus}
+
+-- | legend will be rendered outside of the plot area
+pattern Outside :: LegendFlags
+pattern Outside = #{const ImPlotLegendFlags_Outside}
+
+-- | legend entries will be displayed horizontally
+pattern Horizontal :: LegendFlags
+pattern Horizontal = #{const ImPlotLegendFlags_Horizontal}
+
+-- | legend entries will be displayed in alphabetical order
+pattern Sort :: LegendFlags
+pattern Sort = #{const ImPlotLegendFlags_Sort}
+
+-- | legend entries will be displayed in reverse order
+pattern Reverse :: LegendFlags
+pattern Reverse = #{const ImPlotLegendFlags_Reverse}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/LineFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/LineFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/LineFlags.hsc
@@ -0,0 +1,49 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.LineFlags
+  ( LineFlags
+  , pattern Loop
+  , pattern NoClip
+  , pattern None
+  , pattern Segments
+  , pattern Shaded
+  , pattern SkipNaN
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotLine. Used by setting ImPlotSpec::Flags.
+type LineFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: LineFlags
+pattern None = #{const ImPlotLineFlags_None}
+
+-- | a line segment will be rendered from every two consecutive points
+pattern Segments :: LineFlags
+pattern Segments = #{const ImPlotLineFlags_Segments}
+
+-- | the last and first point will be connected to form a closed loop
+pattern Loop :: LineFlags
+pattern Loop = #{const ImPlotLineFlags_Loop}
+
+-- | NaNs values will be skipped instead of rendered as missing data
+pattern SkipNaN :: LineFlags
+pattern SkipNaN = #{const ImPlotLineFlags_SkipNaN}
+
+-- | markers (if displayed) on the edge of a plot will not be clipped
+pattern NoClip :: LineFlags
+pattern NoClip = #{const ImPlotLineFlags_NoClip}
+
+-- | a filled region between the line and horizontal origin will be rendered; use PlotShaded for more advanced cases
+pattern Shaded :: LineFlags
+pattern Shaded = #{const ImPlotLineFlags_Shaded}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/Location.hsc b/src/DearImGui/Raw/ImPlot/Enums/Location.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/Location.hsc
@@ -0,0 +1,64 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.Location
+  ( Location
+  , pattern Center
+  , pattern East
+  , pattern North
+  , pattern NorthEast
+  , pattern NorthWest
+  , pattern South
+  , pattern SouthEast
+  , pattern SouthWest
+  , pattern West
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Used to position items on a plot (e.g. legends, labels, etc.)
+type Location = CInt
+
+-- enums
+
+-- | center-center
+pattern Center :: Location
+pattern Center = #{const ImPlotLocation_Center}
+
+-- | top-center
+pattern North :: Location
+pattern North = #{const ImPlotLocation_North}
+
+-- | bottom-center
+pattern South :: Location
+pattern South = #{const ImPlotLocation_South}
+
+-- | center-left
+pattern West :: Location
+pattern West = #{const ImPlotLocation_West}
+
+-- | center-right
+pattern East :: Location
+pattern East = #{const ImPlotLocation_East}
+
+-- | top-left
+pattern NorthWest :: Location
+pattern NorthWest = #{const ImPlotLocation_NorthWest}
+
+-- | top-right
+pattern NorthEast :: Location
+pattern NorthEast = #{const ImPlotLocation_NorthEast}
+
+-- | bottom-left
+pattern SouthWest :: Location
+pattern SouthWest = #{const ImPlotLocation_SouthWest}
+
+-- | bottom-right
+pattern SouthEast :: Location
+pattern SouthEast = #{const ImPlotLocation_SouthEast}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/Marker.hsc b/src/DearImGui/Raw/ImPlot/Enums/Marker.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/Marker.hsc
@@ -0,0 +1,94 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.Marker
+  ( Marker
+  , pattern Asterisk
+  , pattern Auto
+  , pattern COUNT
+  , pattern Circle
+  , pattern Cross
+  , pattern Diamond
+  , pattern Down
+  , pattern Horizontal
+  , pattern Left
+  , pattern None
+  , pattern Plus
+  , pattern Right
+  , pattern Square
+  , pattern Up
+  , pattern Vertical
+  ) where
+
+import Foreign.C.Types
+import Prelude hiding (Left, Right)
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Marker specifications.
+type Marker = CInt
+
+-- enums
+
+-- | no marker
+pattern None :: Marker
+pattern None = #{const ImPlotMarker_None}
+
+-- | automatic marker selection
+pattern Auto :: Marker
+pattern Auto = #{const ImPlotMarker_Auto}
+
+-- | a circle marker (default)
+pattern Circle :: Marker
+pattern Circle = #{const ImPlotMarker_Circle}
+
+-- | a square maker
+pattern Square :: Marker
+pattern Square = #{const ImPlotMarker_Square}
+
+-- | a diamond marker
+pattern Diamond :: Marker
+pattern Diamond = #{const ImPlotMarker_Diamond}
+
+-- | an upward-pointing triangle marker
+pattern Up :: Marker
+pattern Up = #{const ImPlotMarker_Up}
+
+-- | an downward-pointing triangle marker
+pattern Down :: Marker
+pattern Down = #{const ImPlotMarker_Down}
+
+-- | an leftward-pointing triangle marker
+pattern Left :: Marker
+pattern Left = #{const ImPlotMarker_Left}
+
+-- | an rightward-pointing triangle marker
+pattern Right :: Marker
+pattern Right = #{const ImPlotMarker_Right}
+
+-- | a cross marker (not fill-able)
+pattern Cross :: Marker
+pattern Cross = #{const ImPlotMarker_Cross}
+
+-- | a plus marker (not fill-able)
+pattern Plus :: Marker
+pattern Plus = #{const ImPlotMarker_Plus}
+
+-- | a asterisk marker (not fill-able)
+pattern Asterisk :: Marker
+pattern Asterisk = #{const ImPlotMarker_Asterisk}
+
+-- | a vertical line marker (not fill-able)
+pattern Vertical :: Marker
+pattern Vertical = #{const ImPlotMarker_Vertical}
+
+-- | a horizontal line marker (not fill-able)
+pattern Horizontal :: Marker
+pattern Horizontal = #{const ImPlotMarker_Horizontal}
+
+pattern COUNT :: Marker
+pattern COUNT = #{const ImPlotMarker_COUNT}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/MouseTextFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/MouseTextFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/MouseTextFlags.hsc
@@ -0,0 +1,39 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.MouseTextFlags
+  ( MouseTextFlags
+  , pattern NoAuxAxes
+  , pattern NoFormat
+  , pattern None
+  , pattern ShowAlways
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Options for mouse hover text (see SetupMouseText)
+type MouseTextFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: MouseTextFlags
+pattern None = #{const ImPlotMouseTextFlags_None}
+
+-- | only show the mouse position for primary axes
+pattern NoAuxAxes :: MouseTextFlags
+pattern NoAuxAxes = #{const ImPlotMouseTextFlags_NoAuxAxes}
+
+-- | axes label formatters won't be used to render text
+pattern NoFormat :: MouseTextFlags
+pattern NoFormat = #{const ImPlotMouseTextFlags_NoFormat}
+
+-- | always display mouse position even if plot not hovered
+pattern ShowAlways :: MouseTextFlags
+pattern ShowAlways = #{const ImPlotMouseTextFlags_ShowAlways}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/PieChartFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/PieChartFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/PieChartFlags.hsc
@@ -0,0 +1,44 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.PieChartFlags
+  ( PieChartFlags
+  , pattern Exploding
+  , pattern IgnoreHidden
+  , pattern NoSliceBorder
+  , pattern None
+  , pattern Normalize
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotPieChart. Used by setting ImPlotSpec::Flags.
+type PieChartFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: PieChartFlags
+pattern None = #{const ImPlotPieChartFlags_None}
+
+-- | force normalization of pie chart values (i.e. always make a full circle if sum < 0)
+pattern Normalize :: PieChartFlags
+pattern Normalize = #{const ImPlotPieChartFlags_Normalize}
+
+-- | ignore hidden slices when drawing the pie chart (as if they were not there)
+pattern IgnoreHidden :: PieChartFlags
+pattern IgnoreHidden = #{const ImPlotPieChartFlags_IgnoreHidden}
+
+-- | explode legend-hovered slice
+pattern Exploding :: PieChartFlags
+pattern Exploding = #{const ImPlotPieChartFlags_Exploding}
+
+-- | do not draw slice borders
+pattern NoSliceBorder :: PieChartFlags
+pattern NoSliceBorder = #{const ImPlotPieChartFlags_NoSliceBorder}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/PolygonFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/PolygonFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/PolygonFlags.hsc
@@ -0,0 +1,29 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.PolygonFlags
+  ( PolygonFlags
+  , pattern Concave
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotPolygon. Used by setting ImPlotSpec::Flags.
+type PolygonFlags = CInt
+
+-- enums
+
+-- | default (closed, convex polygon)
+pattern None :: PolygonFlags
+pattern None = #{const ImPlotPolygonFlags_None}
+
+-- | use concave polygon filling (slower but supports concave shapes)
+pattern Concave :: PolygonFlags
+pattern Concave = #{const ImPlotPolygonFlags_Concave}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/Prop.hsc b/src/DearImGui/Raw/ImPlot/Enums/Prop.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/Prop.hsc
@@ -0,0 +1,104 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.Prop
+  ( Prop
+  , pattern FillAlpha
+  , pattern FillColor
+  , pattern FillColors
+  , pattern Flags
+  , pattern LineColor
+  , pattern LineColors
+  , pattern LineWeight
+  , pattern Marker
+  , pattern MarkerFillColor
+  , pattern MarkerFillColors
+  , pattern MarkerLineColor
+  , pattern MarkerLineColors
+  , pattern MarkerSize
+  , pattern MarkerSizes
+  , pattern Offset
+  , pattern Size
+  , pattern Stride
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Plotting properties. These provide syntactic sugar for creating ImPlotSpecs from (ImPlotProp,value) pairs. See ImPlotSpec documentation.
+type Prop = CInt
+
+-- enums
+
+-- | line color (applies to lines, bar edges); IMPLOT_AUTO_COL will use next Colormap color or current item color
+pattern LineColor :: Prop
+pattern LineColor = #{const ImPlotProp_LineColor}
+
+-- | array of colors for each line; if nullptr, use LineColor for all lines
+pattern LineColors :: Prop
+pattern LineColors = #{const ImPlotProp_LineColors}
+
+-- | line weight in pixels (applies to lines, bar edges, marker edges)
+pattern LineWeight :: Prop
+pattern LineWeight = #{const ImPlotProp_LineWeight}
+
+-- | fill color (applies to shaded regions, bar faces); IMPLOT_AUTO_COL will use next Colormap color or current item color
+pattern FillColor :: Prop
+pattern FillColor = #{const ImPlotProp_FillColor}
+
+-- | array of colors for each fill; if nullptr, use FillColor for all fills
+pattern FillColors :: Prop
+pattern FillColors = #{const ImPlotProp_FillColors}
+
+-- | alpha multiplier (applies to FillColor, FillColors, MarkerFillColor, and MarkerFillColors)
+pattern FillAlpha :: Prop
+pattern FillAlpha = #{const ImPlotProp_FillAlpha}
+
+-- | marker type; specify ImPlotMarker_Auto to use the next unused marker
+pattern Marker :: Prop
+pattern Marker = #{const ImPlotProp_Marker}
+
+-- | size of markers (radius) *in pixels*
+pattern MarkerSize :: Prop
+pattern MarkerSize = #{const ImPlotProp_MarkerSize}
+
+-- | array of sizes for each marker; if nullptr, use MarkerSize for all markers
+pattern MarkerSizes :: Prop
+pattern MarkerSizes = #{const ImPlotProp_MarkerSizes}
+
+-- | marker edge color; IMPLOT_AUTO_COL will use LineColor
+pattern MarkerLineColor :: Prop
+pattern MarkerLineColor = #{const ImPlotProp_MarkerLineColor}
+
+-- | array of colors for each marker edge; if nullptr, use MarkerLineColor for all markers
+pattern MarkerLineColors :: Prop
+pattern MarkerLineColors = #{const ImPlotProp_MarkerLineColors}
+
+-- | marker face color; IMPLOT_AUTO_COL will use LineColor
+pattern MarkerFillColor :: Prop
+pattern MarkerFillColor = #{const ImPlotProp_MarkerFillColor}
+
+-- | array of colors for each marker face; if nullptr, use MarkerFillColor for all markers
+pattern MarkerFillColors :: Prop
+pattern MarkerFillColors = #{const ImPlotProp_MarkerFillColors}
+
+-- | size of error bar whiskers (width or height), and digital bars (height) *in pixels*
+pattern Size :: Prop
+pattern Size = #{const ImPlotProp_Size}
+
+-- | data index offset
+pattern Offset :: Prop
+pattern Offset = #{const ImPlotProp_Offset}
+
+-- | data stride in bytes; IMPLOT_AUTO will result in sizeof(T) where T is the type passed to PlotX
+pattern Stride :: Prop
+pattern Stride = #{const ImPlotProp_Stride}
+
+-- | optional item flags; can be composed from common ImPlotItemFlags and/or specialized ImPlotXFlags
+pattern Flags :: Prop
+pattern Flags = #{const ImPlotProp_Flags}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/Scale.hsc b/src/DearImGui/Raw/ImPlot/Enums/Scale.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/Scale.hsc
@@ -0,0 +1,39 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.Scale
+  ( Scale
+  , pattern Linear
+  , pattern Log10
+  , pattern SymLog
+  , pattern Time
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Axis scale
+type Scale = CInt
+
+-- enums
+
+-- | default linear scale
+pattern Linear :: Scale
+pattern Linear = #{const ImPlotScale_Linear}
+
+-- | date/time scale
+pattern Time :: Scale
+pattern Time = #{const ImPlotScale_Time}
+
+-- | base 10 logarithmic scale
+pattern Log10 :: Scale
+pattern Log10 = #{const ImPlotScale_Log10}
+
+-- | symmetric log scale
+pattern SymLog :: Scale
+pattern SymLog = #{const ImPlotScale_SymLog}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/ScatterFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/ScatterFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/ScatterFlags.hsc
@@ -0,0 +1,29 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.ScatterFlags
+  ( ScatterFlags
+  , pattern NoClip
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotScatter. Used by setting ImPlotSpec::Flags.
+type ScatterFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: ScatterFlags
+pattern None = #{const ImPlotScatterFlags_None}
+
+-- | markers on the edge of a plot will not be clipped
+pattern NoClip :: ScatterFlags
+pattern NoClip = #{const ImPlotScatterFlags_NoClip}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/ShadedFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/ShadedFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/ShadedFlags.hsc
@@ -0,0 +1,24 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.ShadedFlags
+  ( ShadedFlags
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotShaded (placeholder). Used by setting ImPlotSpec::Flags.
+type ShadedFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: ShadedFlags
+pattern None = #{const ImPlotShadedFlags_None}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/StairsFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/StairsFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/StairsFlags.hsc
@@ -0,0 +1,34 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.StairsFlags
+  ( StairsFlags
+  , pattern None
+  , pattern PreStep
+  , pattern Shaded
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotStairs. Used by setting ImPlotSpec::Flags.
+type StairsFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: StairsFlags
+pattern None = #{const ImPlotStairsFlags_None}
+
+-- | the y value is continued constantly to the left from every x position, i.e. the interval (x[i-1], x[i]] has the value y[i]
+pattern PreStep :: StairsFlags
+pattern PreStep = #{const ImPlotStairsFlags_PreStep}
+
+-- | a filled region between the stairs and horizontal origin will be rendered; use PlotShaded for more advanced cases
+pattern Shaded :: StairsFlags
+pattern Shaded = #{const ImPlotStairsFlags_Shaded}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/StemsFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/StemsFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/StemsFlags.hsc
@@ -0,0 +1,29 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.StemsFlags
+  ( StemsFlags
+  , pattern Horizontal
+  , pattern None
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotStems. Used by setting ImPlotSpec::Flags.
+type StemsFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: StemsFlags
+pattern None = #{const ImPlotStemsFlags_None}
+
+-- | stems will be rendered horizontally on the current y-axis
+pattern Horizontal :: StemsFlags
+pattern Horizontal = #{const ImPlotStemsFlags_Horizontal}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/StyleVar.hsc b/src/DearImGui/Raw/ImPlot/Enums/StyleVar.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/StyleVar.hsc
@@ -0,0 +1,123 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.StyleVar
+  ( StyleVar
+  , pattern AnnotationPadding
+  , pattern COUNT
+  , pattern DigitalPadding
+  , pattern DigitalSpacing
+  , pattern FitPadding
+  , pattern LabelPadding
+  , pattern LegendInnerPadding
+  , pattern LegendPadding
+  , pattern LegendSpacing
+  , pattern MajorGridSize
+  , pattern MajorTickLen
+  , pattern MajorTickSize
+  , pattern MinorAlpha
+  , pattern MinorGridSize
+  , pattern MinorTickLen
+  , pattern MinorTickSize
+  , pattern MousePosPadding
+  , pattern PlotBorderSize
+  , pattern PlotDefaultSize
+  , pattern PlotMinSize
+  , pattern PlotPadding
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Plot styling variables.
+type StyleVar = CInt
+
+-- enums
+
+-- | ImVec2, default size used when ImVec2(0,0) is passed to BeginPlot
+pattern PlotDefaultSize :: StyleVar
+pattern PlotDefaultSize = #{const ImPlotStyleVar_PlotDefaultSize}
+
+-- | ImVec2, minimum size plot frame can be when shrunk
+pattern PlotMinSize :: StyleVar
+pattern PlotMinSize = #{const ImPlotStyleVar_PlotMinSize}
+
+-- | float,  thickness of border around plot area
+pattern PlotBorderSize :: StyleVar
+pattern PlotBorderSize = #{const ImPlotStyleVar_PlotBorderSize}
+
+-- | float,  alpha multiplier applied to minor axis grid lines
+pattern MinorAlpha :: StyleVar
+pattern MinorAlpha = #{const ImPlotStyleVar_MinorAlpha}
+
+-- | ImVec2, major tick lengths for X and Y axes
+pattern MajorTickLen :: StyleVar
+pattern MajorTickLen = #{const ImPlotStyleVar_MajorTickLen}
+
+-- | ImVec2, minor tick lengths for X and Y axes
+pattern MinorTickLen :: StyleVar
+pattern MinorTickLen = #{const ImPlotStyleVar_MinorTickLen}
+
+-- | ImVec2, line thickness of major ticks
+pattern MajorTickSize :: StyleVar
+pattern MajorTickSize = #{const ImPlotStyleVar_MajorTickSize}
+
+-- | ImVec2, line thickness of minor ticks
+pattern MinorTickSize :: StyleVar
+pattern MinorTickSize = #{const ImPlotStyleVar_MinorTickSize}
+
+-- | ImVec2, line thickness of major grid lines
+pattern MajorGridSize :: StyleVar
+pattern MajorGridSize = #{const ImPlotStyleVar_MajorGridSize}
+
+-- | ImVec2, line thickness of minor grid lines
+pattern MinorGridSize :: StyleVar
+pattern MinorGridSize = #{const ImPlotStyleVar_MinorGridSize}
+
+-- | ImVec2, padding between widget frame and plot area, labels, or outside legends (i.e. main padding)
+pattern PlotPadding :: StyleVar
+pattern PlotPadding = #{const ImPlotStyleVar_PlotPadding}
+
+-- | ImVec2, padding between axes labels, tick labels, and plot edge
+pattern LabelPadding :: StyleVar
+pattern LabelPadding = #{const ImPlotStyleVar_LabelPadding}
+
+-- | ImVec2, legend padding from plot edges
+pattern LegendPadding :: StyleVar
+pattern LegendPadding = #{const ImPlotStyleVar_LegendPadding}
+
+-- | ImVec2, legend inner padding from legend edges
+pattern LegendInnerPadding :: StyleVar
+pattern LegendInnerPadding = #{const ImPlotStyleVar_LegendInnerPadding}
+
+-- | ImVec2, spacing between legend entries
+pattern LegendSpacing :: StyleVar
+pattern LegendSpacing = #{const ImPlotStyleVar_LegendSpacing}
+
+-- | ImVec2, padding between plot edge and interior info text
+pattern MousePosPadding :: StyleVar
+pattern MousePosPadding = #{const ImPlotStyleVar_MousePosPadding}
+
+-- | ImVec2, text padding around annotation labels
+pattern AnnotationPadding :: StyleVar
+pattern AnnotationPadding = #{const ImPlotStyleVar_AnnotationPadding}
+
+-- | ImVec2, additional fit padding as a percentage of the fit extents (e.g. ImVec2(0.1f,0.1f) adds 10% to the fit extents of X and Y)
+pattern FitPadding :: StyleVar
+pattern FitPadding = #{const ImPlotStyleVar_FitPadding}
+
+-- | float,  digital plot padding from bottom in pixels
+pattern DigitalPadding :: StyleVar
+pattern DigitalPadding = #{const ImPlotStyleVar_DigitalPadding}
+
+-- | float,  digital plot spacing gap in pixels
+pattern DigitalSpacing :: StyleVar
+pattern DigitalSpacing = #{const ImPlotStyleVar_DigitalSpacing}
+
+pattern COUNT :: StyleVar
+pattern COUNT = #{const ImPlotStyleVar_COUNT}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/SubplotFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/SubplotFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/SubplotFlags.hsc
@@ -0,0 +1,79 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.SubplotFlags
+  ( SubplotFlags
+  , pattern ColMajor
+  , pattern LinkAllX
+  , pattern LinkAllY
+  , pattern LinkCols
+  , pattern LinkRows
+  , pattern NoAlign
+  , pattern NoLegend
+  , pattern NoMenus
+  , pattern NoResize
+  , pattern NoTitle
+  , pattern None
+  , pattern ShareItems
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Options for subplots (see BeginSubplot)
+type SubplotFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: SubplotFlags
+pattern None = #{const ImPlotSubplotFlags_None}
+
+-- | the subplot title will not be displayed (titles are also hidden if preceded by double hashes, e.g. "##MySubplot")
+pattern NoTitle :: SubplotFlags
+pattern NoTitle = #{const ImPlotSubplotFlags_NoTitle}
+
+-- | the legend will not be displayed (only applicable if ImPlotSubplotFlags_ShareItems is enabled)
+pattern NoLegend :: SubplotFlags
+pattern NoLegend = #{const ImPlotSubplotFlags_NoLegend}
+
+-- | the user will not be able to open context menus with right-click
+pattern NoMenus :: SubplotFlags
+pattern NoMenus = #{const ImPlotSubplotFlags_NoMenus}
+
+-- | resize splitters between subplot cells will be not be provided
+pattern NoResize :: SubplotFlags
+pattern NoResize = #{const ImPlotSubplotFlags_NoResize}
+
+-- | subplot edges will not be aligned vertically or horizontally
+pattern NoAlign :: SubplotFlags
+pattern NoAlign = #{const ImPlotSubplotFlags_NoAlign}
+
+-- | items across all subplots will be shared and rendered into a single legend entry
+pattern ShareItems :: SubplotFlags
+pattern ShareItems = #{const ImPlotSubplotFlags_ShareItems}
+
+-- | link the y-axis limits of all plots in each row (does not apply to auxiliary axes)
+pattern LinkRows :: SubplotFlags
+pattern LinkRows = #{const ImPlotSubplotFlags_LinkRows}
+
+-- | link the x-axis limits of all plots in each column (does not apply to auxiliary axes)
+pattern LinkCols :: SubplotFlags
+pattern LinkCols = #{const ImPlotSubplotFlags_LinkCols}
+
+-- | link the x-axis limits in every plot in the subplot (does not apply to auxiliary axes)
+pattern LinkAllX :: SubplotFlags
+pattern LinkAllX = #{const ImPlotSubplotFlags_LinkAllX}
+
+-- | link the y-axis limits in every plot in the subplot (does not apply to auxiliary axes)
+pattern LinkAllY :: SubplotFlags
+pattern LinkAllY = #{const ImPlotSubplotFlags_LinkAllY}
+
+-- | subplots are added in column major order instead of the default row major order
+pattern ColMajor :: SubplotFlags
+pattern ColMajor = #{const ImPlotSubplotFlags_ColMajor}
diff --git a/src/DearImGui/Raw/ImPlot/Enums/TextFlags.hsc b/src/DearImGui/Raw/ImPlot/Enums/TextFlags.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Enums/TextFlags.hsc
@@ -0,0 +1,29 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Enums.TextFlags
+  ( TextFlags
+  , pattern None
+  , pattern Vertical
+  ) where
+
+import Foreign.C.Types
+
+#include "dcimgui_implot.h"
+
+-- typedefs
+
+-- | Flags for PlotText. Used by setting ImPlotSpec::Flags.
+type TextFlags = CInt
+
+-- enums
+
+-- | default
+pattern None :: TextFlags
+pattern None = #{const ImPlotTextFlags_None}
+
+-- | text will be rendered vertically
+pattern Vertical :: TextFlags
+pattern Vertical = #{const ImPlotTextFlags_Vertical}
diff --git a/src/DearImGui/Raw/ImPlot/InputMap.hsc b/src/DearImGui/Raw/ImPlot/InputMap.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/InputMap.hsc
@@ -0,0 +1,106 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.InputMap
+  ( InputMap (..)
+  , destroy
+  , init
+  , withDefault
+  ) where
+
+import Control.Exception (bracket_)
+import DearImGui.Raw.Enums.ImGuiMouseButton (ImGuiMouseButton)
+import Foreign.C.Types
+import Foreign.Marshal.Alloc (alloca)
+import Foreign.Ptr (Ptr, plusPtr)
+import Foreign.Storable (Storable (..))
+import GHC.Records (HasField (..))
+import Prelude hiding (init)
+
+#include "dcimgui_implot.h"
+
+-- structs (opaque)
+
+data {-# CTYPE "dcimgui_implot.h" "ImPlotInputMap" #-} InputMap = InputMap
+  { pan :: ImGuiMouseButton
+  , panMod :: CInt
+  , fit :: ImGuiMouseButton
+  , select :: ImGuiMouseButton
+  , selectCancel :: ImGuiMouseButton
+  , selectMod :: CInt
+  , selectHorzMod :: CInt
+  , selectVertMod :: CInt
+  , menu :: ImGuiMouseButton
+  , overrideMod :: CInt
+  , zoomMod :: CInt
+  , zoomRate :: Float
+  }
+  deriving (Eq, Show)
+instance Storable InputMap where
+  sizeOf _    = #{size ImPlotInputMap}
+  alignment _ = #{alignment ImPlotInputMap}
+  peek p = InputMap <$> #{peek ImPlotInputMap, Pan} p <*> #{peek ImPlotInputMap, PanMod} p <*> #{peek ImPlotInputMap, Fit} p <*> #{peek ImPlotInputMap, Select} p <*> #{peek ImPlotInputMap, SelectCancel} p <*> #{peek ImPlotInputMap, SelectMod} p <*> #{peek ImPlotInputMap, SelectHorzMod} p <*> #{peek ImPlotInputMap, SelectVertMod} p <*> #{peek ImPlotInputMap, Menu} p <*> #{peek ImPlotInputMap, OverrideMod} p <*> #{peek ImPlotInputMap, ZoomMod} p <*> #{peek ImPlotInputMap, ZoomRate} p
+  poke p v = do
+    #{poke ImPlotInputMap, Pan} p v.pan
+    #{poke ImPlotInputMap, PanMod} p v.panMod
+    #{poke ImPlotInputMap, Fit} p v.fit
+    #{poke ImPlotInputMap, Select} p v.select
+    #{poke ImPlotInputMap, SelectCancel} p v.selectCancel
+    #{poke ImPlotInputMap, SelectMod} p v.selectMod
+    #{poke ImPlotInputMap, SelectHorzMod} p v.selectHorzMod
+    #{poke ImPlotInputMap, SelectVertMod} p v.selectVertMod
+    #{poke ImPlotInputMap, Menu} p v.menu
+    #{poke ImPlotInputMap, OverrideMod} p v.overrideMod
+    #{poke ImPlotInputMap, ZoomMod} p v.zoomMod
+    #{poke ImPlotInputMap, ZoomRate} p v.zoomRate
+
+instance HasField "pan" (Ptr InputMap) (Ptr ImGuiMouseButton) where
+  getField = #{ptr ImPlotInputMap, Pan}
+
+instance HasField "panMod" (Ptr InputMap) (Ptr CInt) where
+  getField = #{ptr ImPlotInputMap, PanMod}
+
+instance HasField "fit" (Ptr InputMap) (Ptr ImGuiMouseButton) where
+  getField = #{ptr ImPlotInputMap, Fit}
+
+instance HasField "select" (Ptr InputMap) (Ptr ImGuiMouseButton) where
+  getField = #{ptr ImPlotInputMap, Select}
+
+instance HasField "selectCancel" (Ptr InputMap) (Ptr ImGuiMouseButton) where
+  getField = #{ptr ImPlotInputMap, SelectCancel}
+
+instance HasField "selectMod" (Ptr InputMap) (Ptr CInt) where
+  getField = #{ptr ImPlotInputMap, SelectMod}
+
+instance HasField "selectHorzMod" (Ptr InputMap) (Ptr CInt) where
+  getField = #{ptr ImPlotInputMap, SelectHorzMod}
+
+instance HasField "selectVertMod" (Ptr InputMap) (Ptr CInt) where
+  getField = #{ptr ImPlotInputMap, SelectVertMod}
+
+instance HasField "menu" (Ptr InputMap) (Ptr ImGuiMouseButton) where
+  getField = #{ptr ImPlotInputMap, Menu}
+
+instance HasField "overrideMod" (Ptr InputMap) (Ptr CInt) where
+  getField = #{ptr ImPlotInputMap, OverrideMod}
+
+instance HasField "zoomMod" (Ptr InputMap) (Ptr CInt) where
+  getField = #{ptr ImPlotInputMap, ZoomMod}
+
+instance HasField "zoomRate" (Ptr InputMap) (Ptr Float) where
+  getField = #{ptr ImPlotInputMap, ZoomRate}
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotInputMap_Init_wrap"
+  init
+    :: Ptr InputMap
+    -> IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotInputMap_Destroy_wrap"
+  destroy
+    :: Ptr InputMap
+    -> IO ()
+
+withDefault :: (Ptr InputMap -> IO a) -> IO a
+withDefault k = alloca $ \p -> bracket_ (init p) (destroy p) (k p)
diff --git a/src/DearImGui/Raw/ImPlot/Point.hsc b/src/DearImGui/Raw/ImPlot/Point.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Point.hsc
@@ -0,0 +1,55 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Point
+  ( Point (..)
+  , destroy
+  , init
+  , withDefault
+  ) where
+
+import Control.Exception (bracket_)
+import Foreign.Marshal.Alloc (alloca)
+import Foreign.Ptr (Ptr, plusPtr)
+import Foreign.Storable (Storable (..))
+import GHC.Records (HasField (..))
+import Prelude hiding (init)
+
+#include "dcimgui_implot.h"
+
+-- structs (opaque)
+
+-- by-value
+data {-# CTYPE "dcimgui_implot.h" "ImPlotPoint" #-} Point = Point
+  { x :: Double
+  , y :: Double
+  }
+  deriving (Eq, Show)
+instance Storable Point where
+  sizeOf _    = #{size ImPlotPoint}
+  alignment _ = #{alignment ImPlotPoint}
+  peek p = Point <$> #{peek ImPlotPoint, x} p <*> #{peek ImPlotPoint, y} p
+  poke p v = do
+    #{poke ImPlotPoint, x} p v.x
+    #{poke ImPlotPoint, y} p v.y
+
+instance HasField "x" (Ptr Point) (Ptr Double) where
+  getField = #{ptr ImPlotPoint, x}
+
+instance HasField "y" (Ptr Point) (Ptr Double) where
+  getField = #{ptr ImPlotPoint, y}
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPoint_Init_wrap"
+  init
+    :: Ptr Point
+    -> IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotPoint_Destroy_wrap"
+  destroy
+    :: Ptr Point
+    -> IO ()
+
+withDefault :: (Ptr Point -> IO a) -> IO a
+withDefault k = alloca $ \p -> bracket_ (init p) (destroy p) (k p)
diff --git a/src/DearImGui/Raw/ImPlot/Range.hsc b/src/DearImGui/Raw/ImPlot/Range.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Range.hsc
@@ -0,0 +1,81 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Range
+  ( Range (..)
+  , clamp
+  , contains
+  , destroy
+  , init
+  , size
+  , withDefault
+  ) where
+
+import Control.Exception (bracket_)
+import Foreign.C.Types
+import Foreign.Marshal.Alloc (alloca)
+import Foreign.Ptr (Ptr, plusPtr)
+import Foreign.Storable (Storable (..))
+import GHC.Records (HasField (..))
+import Prelude hiding (init)
+
+#include "dcimgui_implot.h"
+
+-- structs (opaque)
+
+-- by-value
+data {-# CTYPE "dcimgui_implot.h" "ImPlotRange" #-} Range = Range
+  { min :: Double
+  , max :: Double
+  }
+  deriving (Eq, Show)
+instance Storable Range where
+  sizeOf _    = #{size ImPlotRange}
+  alignment _ = #{alignment ImPlotRange}
+  peek p = Range <$> #{peek ImPlotRange, Min} p <*> #{peek ImPlotRange, Max} p
+  poke p v = do
+    #{poke ImPlotRange, Min} p v.min
+    #{poke ImPlotRange, Max} p v.max
+
+instance HasField "min" (Ptr Range) (Ptr Double) where
+  getField = #{ptr ImPlotRange, Min}
+
+instance HasField "max" (Ptr Range) (Ptr Double) where
+  getField = #{ptr ImPlotRange, Max}
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotRange_Init_wrap"
+  init
+    :: Ptr Range
+    -> IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotRange_Destroy_wrap"
+  destroy
+    :: Ptr Range
+    -> IO ()
+
+withDefault :: (Ptr Range -> IO a) -> IO a
+withDefault k = alloca $ \p -> bracket_ (init p) (destroy p) (k p)
+
+-- functions
+
+-- C: double Clamp(const ImPlotRange* self, double value)
+foreign import capi unsafe "dcimgui_implot.h ImPlotRange_Clamp"
+  clamp
+    :: (Ptr Range) -- ^ self
+    -> Double -- ^ value
+    -> IO Double
+
+-- C: bool Contains(const ImPlotRange* self, double value)
+foreign import capi unsafe "dcimgui_implot.h ImPlotRange_Contains"
+  contains
+    :: (Ptr Range) -- ^ self
+    -> Double -- ^ value
+    -> IO CBool
+
+-- C: double Size(const ImPlotRange* self)
+foreign import capi unsafe "dcimgui_implot.h ImPlotRange_Size"
+  size
+    :: (Ptr Range) -- ^ self
+    -> IO Double
diff --git a/src/DearImGui/Raw/ImPlot/Rect.hsc b/src/DearImGui/Raw/ImPlot/Rect.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Rect.hsc
@@ -0,0 +1,85 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Rect
+  ( Rect (..)
+  , c_contains
+  , contains
+  , containsDouble
+  , destroy
+  , init
+  , withDefault
+  ) where
+
+import Control.Exception (bracket_)
+import DearImGui.Raw.ImPlot.Point (Point)
+import DearImGui.Raw.ImPlot.Range (Range)
+import Foreign.C.Types
+import Foreign.Marshal.Alloc (alloca)
+import Foreign.Marshal.Utils (with)
+import Foreign.Ptr (Ptr, plusPtr)
+import Foreign.Storable (Storable (..))
+import GHC.Records (HasField (..))
+import Prelude hiding (init)
+
+#include "dcimgui_implot.h"
+
+-- structs (opaque)
+
+-- by-value
+data {-# CTYPE "dcimgui_implot.h" "ImPlotRect" #-} Rect = Rect
+  { x :: Range
+  , y :: Range
+  }
+  deriving (Eq, Show)
+instance Storable Rect where
+  sizeOf _    = #{size ImPlotRect}
+  alignment _ = #{alignment ImPlotRect}
+  peek p = Rect <$> #{peek ImPlotRect, X} p <*> #{peek ImPlotRect, Y} p
+  poke p v = do
+    #{poke ImPlotRect, X} p v.x
+    #{poke ImPlotRect, Y} p v.y
+
+instance HasField "x" (Ptr Rect) (Ptr Range) where
+  getField = #{ptr ImPlotRect, X}
+
+instance HasField "y" (Ptr Rect) (Ptr Range) where
+  getField = #{ptr ImPlotRect, Y}
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotRect_Init_wrap"
+  init
+    :: Ptr Rect
+    -> IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotRect_Destroy_wrap"
+  destroy
+    :: Ptr Rect
+    -> IO ()
+
+withDefault :: (Ptr Rect -> IO a) -> IO a
+withDefault k = alloca $ \p -> bracket_ (init p) (destroy p) (k p)
+
+-- functions
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotRect_Contains_wrap"
+  c_contains
+    :: (Ptr Rect) -- ^ self
+    -> (Ptr Point) -- ^ p
+    -> IO CBool
+
+contains
+  :: (Ptr Rect) -- ^ self
+  -> Point -- ^ p
+  -> IO CBool
+contains self p =
+  with p $ \pPtr -> c_contains self pPtr
+
+-- C: bool Contains(const ImPlotRect* self, double x, double y)
+foreign import capi unsafe "dcimgui_implot.h ImPlotRect_ContainsDouble"
+  containsDouble
+    :: (Ptr Rect) -- ^ self
+    -> Double -- ^ x
+    -> Double -- ^ y
+    -> IO CBool
diff --git a/src/DearImGui/Raw/ImPlot/Spec.hsc b/src/DearImGui/Raw/ImPlot/Spec.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Spec.hsc
@@ -0,0 +1,135 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Spec
+  ( Spec (..)
+  , destroy
+  , init
+  , withDefault
+  ) where
+
+import Control.Exception (bracket_)
+import DearImGui.Raw (ImU32)
+import DearImGui.Raw.ImPlot.Enums.ItemFlags (ItemFlags)
+import DearImGui.Raw.ImPlot.Enums.Marker (Marker)
+import DearImGui.Raw.ImVec4 (ImVec4)
+import Foreign.C.Types
+import Foreign.Marshal.Alloc (alloca)
+import Foreign.Ptr (Ptr, plusPtr)
+import Foreign.Storable (Storable (..))
+import GHC.Records (HasField (..))
+import Prelude hiding (init)
+
+#include "dcimgui_implot.h"
+
+-- structs (opaque)
+
+-- by-value
+data {-# CTYPE "dcimgui_implot.h" "ImPlotSpec" #-} Spec = Spec
+  { lineColor :: ImVec4
+  , lineColors :: Ptr ImU32
+  , lineWeight :: Float
+  , fillColor :: ImVec4
+  , fillColors :: Ptr ImU32
+  , fillAlpha :: Float
+  , marker :: Marker
+  , markerSize :: Float
+  , markerSizes :: Ptr Float
+  , markerLineColor :: ImVec4
+  , markerLineColors :: Ptr ImU32
+  , markerFillColor :: ImVec4
+  , markerFillColors :: Ptr ImU32
+  , size :: Float
+  , offset :: CInt
+  , stride :: CInt
+  , flags :: ItemFlags
+  }
+  deriving (Eq, Show)
+instance Storable Spec where
+  sizeOf _    = #{size ImPlotSpec}
+  alignment _ = #{alignment ImPlotSpec}
+  peek p = Spec <$> #{peek ImPlotSpec, LineColor} p <*> #{peek ImPlotSpec, LineColors} p <*> #{peek ImPlotSpec, LineWeight} p <*> #{peek ImPlotSpec, FillColor} p <*> #{peek ImPlotSpec, FillColors} p <*> #{peek ImPlotSpec, FillAlpha} p <*> #{peek ImPlotSpec, Marker} p <*> #{peek ImPlotSpec, MarkerSize} p <*> #{peek ImPlotSpec, MarkerSizes} p <*> #{peek ImPlotSpec, MarkerLineColor} p <*> #{peek ImPlotSpec, MarkerLineColors} p <*> #{peek ImPlotSpec, MarkerFillColor} p <*> #{peek ImPlotSpec, MarkerFillColors} p <*> #{peek ImPlotSpec, Size} p <*> #{peek ImPlotSpec, Offset} p <*> #{peek ImPlotSpec, Stride} p <*> #{peek ImPlotSpec, Flags} p
+  poke p v = do
+    #{poke ImPlotSpec, LineColor} p v.lineColor
+    #{poke ImPlotSpec, LineColors} p v.lineColors
+    #{poke ImPlotSpec, LineWeight} p v.lineWeight
+    #{poke ImPlotSpec, FillColor} p v.fillColor
+    #{poke ImPlotSpec, FillColors} p v.fillColors
+    #{poke ImPlotSpec, FillAlpha} p v.fillAlpha
+    #{poke ImPlotSpec, Marker} p v.marker
+    #{poke ImPlotSpec, MarkerSize} p v.markerSize
+    #{poke ImPlotSpec, MarkerSizes} p v.markerSizes
+    #{poke ImPlotSpec, MarkerLineColor} p v.markerLineColor
+    #{poke ImPlotSpec, MarkerLineColors} p v.markerLineColors
+    #{poke ImPlotSpec, MarkerFillColor} p v.markerFillColor
+    #{poke ImPlotSpec, MarkerFillColors} p v.markerFillColors
+    #{poke ImPlotSpec, Size} p v.size
+    #{poke ImPlotSpec, Offset} p v.offset
+    #{poke ImPlotSpec, Stride} p v.stride
+    #{poke ImPlotSpec, Flags} p v.flags
+
+instance HasField "lineColor" (Ptr Spec) (Ptr ImVec4) where
+  getField = #{ptr ImPlotSpec, LineColor}
+
+instance HasField "lineColors" (Ptr Spec) (Ptr (Ptr ImU32)) where
+  getField = #{ptr ImPlotSpec, LineColors}
+
+instance HasField "lineWeight" (Ptr Spec) (Ptr Float) where
+  getField = #{ptr ImPlotSpec, LineWeight}
+
+instance HasField "fillColor" (Ptr Spec) (Ptr ImVec4) where
+  getField = #{ptr ImPlotSpec, FillColor}
+
+instance HasField "fillColors" (Ptr Spec) (Ptr (Ptr ImU32)) where
+  getField = #{ptr ImPlotSpec, FillColors}
+
+instance HasField "fillAlpha" (Ptr Spec) (Ptr Float) where
+  getField = #{ptr ImPlotSpec, FillAlpha}
+
+instance HasField "marker" (Ptr Spec) (Ptr Marker) where
+  getField = #{ptr ImPlotSpec, Marker}
+
+instance HasField "markerSize" (Ptr Spec) (Ptr Float) where
+  getField = #{ptr ImPlotSpec, MarkerSize}
+
+instance HasField "markerSizes" (Ptr Spec) (Ptr (Ptr Float)) where
+  getField = #{ptr ImPlotSpec, MarkerSizes}
+
+instance HasField "markerLineColor" (Ptr Spec) (Ptr ImVec4) where
+  getField = #{ptr ImPlotSpec, MarkerLineColor}
+
+instance HasField "markerLineColors" (Ptr Spec) (Ptr (Ptr ImU32)) where
+  getField = #{ptr ImPlotSpec, MarkerLineColors}
+
+instance HasField "markerFillColor" (Ptr Spec) (Ptr ImVec4) where
+  getField = #{ptr ImPlotSpec, MarkerFillColor}
+
+instance HasField "markerFillColors" (Ptr Spec) (Ptr (Ptr ImU32)) where
+  getField = #{ptr ImPlotSpec, MarkerFillColors}
+
+instance HasField "size" (Ptr Spec) (Ptr Float) where
+  getField = #{ptr ImPlotSpec, Size}
+
+instance HasField "offset" (Ptr Spec) (Ptr CInt) where
+  getField = #{ptr ImPlotSpec, Offset}
+
+instance HasField "stride" (Ptr Spec) (Ptr CInt) where
+  getField = #{ptr ImPlotSpec, Stride}
+
+instance HasField "flags" (Ptr Spec) (Ptr ItemFlags) where
+  getField = #{ptr ImPlotSpec, Flags}
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotSpec_Init_wrap"
+  init
+    :: Ptr Spec
+    -> IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotSpec_Destroy_wrap"
+  destroy
+    :: Ptr Spec
+    -> IO ()
+
+withDefault :: (Ptr Spec -> IO a) -> IO a
+withDefault k = alloca $ \p -> bracket_ (init p) (destroy p) (k p)
diff --git a/src/DearImGui/Raw/ImPlot/Style.hsc b/src/DearImGui/Raw/ImPlot/Style.hsc
new file mode 100644
--- /dev/null
+++ b/src/DearImGui/Raw/ImPlot/Style.hsc
@@ -0,0 +1,125 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE PatternSynonyms #-}
+
+-- This file was generated by dear-bindings-ffi. Do not edit by hand.
+
+module DearImGui.Raw.ImPlot.Style
+  ( Style
+  , colorsLength
+  , destroy
+  , init
+  , withDefault
+  ) where
+
+import Control.Exception (bracket_)
+import DearImGui.Raw.ImPlot.Enums.Colormap (Colormap)
+import DearImGui.Raw.ImVec2 (ImVec2)
+import DearImGui.Raw.ImVec4 (ImVec4)
+import Foreign.C.Types
+import Foreign.Marshal.Alloc (alloca)
+import Foreign.Ptr (Ptr, plusPtr)
+import Foreign.Storable (Storable (..))
+import GHC.Records (HasField (..))
+import Prelude hiding (init)
+
+#include "dcimgui_implot.h"
+
+-- structs (opaque)
+
+data Style
+instance Storable Style where
+  sizeOf _    = #{size ImPlotStyle}
+  alignment _ = #{alignment ImPlotStyle}
+  peek _ = error "Style: opaque struct, peek not supported in v0"
+  poke _ _ = error "Style: opaque struct, poke not supported in v0"
+
+instance HasField "plotDefaultSize" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, PlotDefaultSize}
+
+instance HasField "plotMinSize" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, PlotMinSize}
+
+instance HasField "plotBorderSize" (Ptr Style) (Ptr Float) where
+  getField = #{ptr ImPlotStyle, PlotBorderSize}
+
+instance HasField "minorAlpha" (Ptr Style) (Ptr Float) where
+  getField = #{ptr ImPlotStyle, MinorAlpha}
+
+instance HasField "majorTickLen" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, MajorTickLen}
+
+instance HasField "minorTickLen" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, MinorTickLen}
+
+instance HasField "majorTickSize" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, MajorTickSize}
+
+instance HasField "minorTickSize" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, MinorTickSize}
+
+instance HasField "majorGridSize" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, MajorGridSize}
+
+instance HasField "minorGridSize" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, MinorGridSize}
+
+instance HasField "plotPadding" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, PlotPadding}
+
+instance HasField "labelPadding" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, LabelPadding}
+
+instance HasField "legendPadding" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, LegendPadding}
+
+instance HasField "legendInnerPadding" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, LegendInnerPadding}
+
+instance HasField "legendSpacing" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, LegendSpacing}
+
+instance HasField "mousePosPadding" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, MousePosPadding}
+
+instance HasField "annotationPadding" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, AnnotationPadding}
+
+instance HasField "fitPadding" (Ptr Style) (Ptr ImVec2) where
+  getField = #{ptr ImPlotStyle, FitPadding}
+
+instance HasField "digitalPadding" (Ptr Style) (Ptr Float) where
+  getField = #{ptr ImPlotStyle, DigitalPadding}
+
+instance HasField "digitalSpacing" (Ptr Style) (Ptr Float) where
+  getField = #{ptr ImPlotStyle, DigitalSpacing}
+
+instance HasField "colors" (Ptr Style) (Ptr ImVec4) where
+  getField = #{ptr ImPlotStyle, Colors}
+
+colorsLength :: Int
+colorsLength = #{const ImPlotCol_COUNT}
+
+instance HasField "colormap" (Ptr Style) (Ptr Colormap) where
+  getField = #{ptr ImPlotStyle, Colormap}
+
+instance HasField "useLocalTime" (Ptr Style) (Ptr CBool) where
+  getField = #{ptr ImPlotStyle, UseLocalTime}
+
+instance HasField "useISO8601" (Ptr Style) (Ptr CBool) where
+  getField = #{ptr ImPlotStyle, UseISO8601}
+
+instance HasField "use24HourClock" (Ptr Style) (Ptr CBool) where
+  getField = #{ptr ImPlotStyle, Use24HourClock}
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotStyle_Init_wrap"
+  init
+    :: Ptr Style
+    -> IO ()
+
+foreign import capi unsafe "DearImGuiWrappers.h ImPlotStyle_Destroy_wrap"
+  destroy
+    :: Ptr Style
+    -> IO ()
+
+withDefault :: (Ptr Style -> IO a) -> IO a
+withDefault k = alloca $ \p -> bracket_ (init p) (destroy p) (k p)
