Skip to content

Commit 60dce8b

Browse files
committed
Fix to get all code ShowTestWindow() copiable outside. Moved ShowMetricsWindows() above. (#219)
1 parent 0eb196d commit 60dce8b

File tree

1 file changed

+118
-115
lines changed

1 file changed

+118
-115
lines changed

imgui.cpp

+118-115
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,7 @@
483483
#ifdef _MSC_VER
484484
#pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff)
485485
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
486+
#define snprintf _snprintf
486487
#endif
487488

488489
// Clang warnings with -Weverything
@@ -9871,7 +9872,7 @@ ImFont* ImFontAtlas::AddFontFromFileTTF(const char* filename, float size_pixels,
98719872
ImFont* ImFontAtlas::AddFontFromMemoryTTF(void* ttf_data, int ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges)
98729873
{
98739874
ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig();
9874-
IM_ASSERT(font_cfg.FontData == NULL);
9875+
IM_ASSERT(font_cfg.FontData == NULL);
98759876
font_cfg.FontData = ttf_data;
98769877
font_cfg.FontDataSize = ttf_size;
98779878
font_cfg.SizePixels = size_pixels;
@@ -9887,7 +9888,7 @@ ImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_d
98879888
stb_decompress(buf_decompressed_data, (unsigned char*)compressed_ttf_data, (unsigned int)compressed_ttf_size);
98889889

98899890
ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig();
9890-
IM_ASSERT(font_cfg.FontData == NULL);
9891+
IM_ASSERT(font_cfg.FontData == NULL);
98919892
font_cfg.FontDataOwnedByAtlas = true;
98929893
return AddFontFromMemoryTTF(buf_decompressed_data, (int)buf_decompressed_size, size_pixels, font_cfg_template, glyph_ranges);
98939894
}
@@ -10039,7 +10040,7 @@ bool ImFontAtlas::Build()
1003910040
float descent = unscaled_descent * font_scale;
1004010041
if (!cfg.MergeMode)
1004110042
{
10042-
dst_font->ContainerAtlas = this;
10043+
dst_font->ContainerAtlas = this;
1004310044
dst_font->ConfigData = &cfg;
1004410045
dst_font->ConfigDataCount = 0;
1004510046
dst_font->FontSize = cfg.SizePixels;
@@ -10063,7 +10064,7 @@ bool ImFontAtlas::Build()
1006310064
const int codepoint = range.first_unicode_char_in_range + char_idx;
1006410065
if (cfg.MergeMode && dst_font->FindGlyph((unsigned short)codepoint))
1006510066
continue;
10066-
10067+
1006710068
stbtt_aligned_quad q;
1006810069
float dummy_x = 0.0f, dummy_y = 0.0f;
1006910070
stbtt_GetPackedQuad(range.chardata_for_range, TexWidth, TexHeight, char_idx, &dummy_x, &dummy_y, &q, 0);
@@ -10705,7 +10706,7 @@ ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, cons
1070510706
if (c == 0)
1070610707
break;
1070710708
}
10708-
10709+
1070910710
if (c < 32)
1071010711
{
1071110712
if (c == '\n')
@@ -10718,7 +10719,7 @@ ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, cons
1071810719
if (c == '\r')
1071910720
continue;
1072010721
}
10721-
10722+
1072210723
const float char_width = ((int)c < IndexXAdvance.Size ? IndexXAdvance[(int)c] : FallbackXAdvance) * scale;
1072310724
if (line_width + char_width >= max_width)
1072410725
{
@@ -10830,7 +10831,7 @@ void ImFont::RenderText(float size, ImVec2 pos, ImU32 col, const ImVec4& clip_re
1083010831
if (const Glyph* glyph = FindGlyph((unsigned short)c))
1083110832
{
1083210833
char_width = glyph->XAdvance * scale;
10833-
10834+
1083410835
// Clipping on Y is more likely
1083510836
if (c != ' ' && c != '\t')
1083610837
{
@@ -11014,19 +11015,103 @@ static void ImeSetInputScreenPosFn_DefaultImpl(int, int)
1101411015

1101511016
#endif
1101611017

11017-
#ifdef IMGUI_DISABLE_TEST_WINDOWS
11018-
11019-
void ImGui::ShowUserGuide() {}
11020-
void ImGui::ShowStyleEditor(ImGuiStyle*) {}
11021-
void ImGui::ShowTestWindow(bool*) {}
11022-
void ImGui::ShowMetricsWindow(bool*) {}
11023-
11024-
#else
11025-
1102611018
//-----------------------------------------------------------------------------
1102711019
// HELP
1102811020
//-----------------------------------------------------------------------------
1102911021

11022+
void ImGui::ShowMetricsWindow(bool* opened)
11023+
{
11024+
if (ImGui::Begin("ImGui Metrics", opened))
11025+
{
11026+
ImGui::Text("ImGui %s", ImGui::GetVersion());
11027+
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
11028+
ImGui::Text("%d vertices, %d triangles", ImGui::GetIO().MetricsRenderVertices, ImGui::GetIO().MetricsRenderIndices / 3);
11029+
ImGui::Text("%d allocations", ImGui::GetIO().MetricsAllocs);
11030+
static bool show_clip_rects = true;
11031+
ImGui::Checkbox("Show clipping rectangles when hovering ImDrawList", &show_clip_rects);
11032+
ImGui::Separator();
11033+
11034+
struct Funcs
11035+
{
11036+
static void NodeDrawList(ImDrawList* draw_list, const char* label)
11037+
{
11038+
bool node_opened = ImGui::TreeNode(draw_list, "%s: '%s' %d vtx, %d indices, %d cmds", label, draw_list->_OwnerName ? draw_list->_OwnerName : "", draw_list->VtxBuffer.Size, draw_list->IdxBuffer.Size, draw_list->CmdBuffer.Size);
11039+
if (draw_list == ImGui::GetWindowDrawList())
11040+
{
11041+
ImGui::SameLine();
11042+
ImGui::TextColored(ImColor(255,100,100), "CURRENTLY APPENDING"); // Can't display stats for active draw list! (we don't have the data double-buffered)
11043+
}
11044+
if (!node_opened)
11045+
return;
11046+
11047+
int elem_offset = 0;
11048+
for (const ImDrawCmd* pcmd = draw_list->CmdBuffer.begin(); pcmd < draw_list->CmdBuffer.end(); elem_offset += pcmd->ElemCount, pcmd++)
11049+
{
11050+
if (pcmd->UserCallback)
11051+
ImGui::BulletText("Callback %p, user_data %p", pcmd->UserCallback, pcmd->UserCallbackData);
11052+
else
11053+
{
11054+
ImGui::BulletText("Draw %d indexed vtx, tex = %p, clip_rect = (%.0f,%.0f)..(%.0f,%.0f)", pcmd->ElemCount, pcmd->TextureId, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w);
11055+
if (show_clip_rects && ImGui::IsItemHovered())
11056+
{
11057+
ImRect clip_rect = pcmd->ClipRect;
11058+
ImRect vtxs_rect;
11059+
for (int i = elem_offset; i < elem_offset + (int)pcmd->ElemCount; i++)
11060+
vtxs_rect.Add(draw_list->VtxBuffer[draw_list->IdxBuffer[i]].pos);
11061+
GImGui->OverlayDrawList.PushClipRectFullScreen();
11062+
clip_rect.Round(); GImGui->OverlayDrawList.AddRect(clip_rect.Min, clip_rect.Max, ImColor(255,255,0));
11063+
vtxs_rect.Round(); GImGui->OverlayDrawList.AddRect(vtxs_rect.Min, vtxs_rect.Max, ImColor(255,0,255));
11064+
GImGui->OverlayDrawList.PopClipRect();
11065+
}
11066+
}
11067+
}
11068+
ImGui::TreePop();
11069+
}
11070+
11071+
static void NodeWindows(ImVector<ImGuiWindow*>& windows, const char* label)
11072+
{
11073+
if (!ImGui::TreeNode(label, "%s (%d)", label, windows.Size))
11074+
return;
11075+
for (int i = 0; i < windows.Size; i++)
11076+
Funcs::NodeWindow(windows[i], "Window");
11077+
ImGui::TreePop();
11078+
}
11079+
11080+
static void NodeWindow(ImGuiWindow* window, const char* label)
11081+
{
11082+
if (!ImGui::TreeNode(window, "%s '%s', %d @ 0x%p", label, window->Name, window->Active || window->WasActive, window))
11083+
return;
11084+
NodeDrawList(window->DrawList, "DrawList");
11085+
if (window->RootWindow != window) NodeWindow(window->RootWindow, "RootWindow");
11086+
if (window->DC.ChildWindows.Size > 0) NodeWindows(window->DC.ChildWindows, "ChildWindows");
11087+
ImGui::BulletText("Storage: %d bytes", window->StateStorage.Data.Size * sizeof(ImGuiStorage::Pair));
11088+
ImGui::TreePop();
11089+
}
11090+
};
11091+
11092+
ImGuiState& g = *GImGui; // Access private state
11093+
g.DisableHideTextAfterDoubleHash++; // Not exposed (yet). Disable processing that hides text after '##' markers.
11094+
Funcs::NodeWindows(g.Windows, "Windows");
11095+
if (ImGui::TreeNode("DrawList", "Active DrawLists (%d)", g.RenderDrawLists[0].Size))
11096+
{
11097+
for (int i = 0; i < g.RenderDrawLists[0].Size; i++)
11098+
Funcs::NodeDrawList(g.RenderDrawLists[0][i], "DrawList");
11099+
ImGui::TreePop();
11100+
}
11101+
if (ImGui::TreeNode("Popups", "Opened Popups Stack (%d)", g.OpenedPopupStack.Size))
11102+
{
11103+
for (int i = 0; i < g.OpenedPopupStack.Size; i++)
11104+
{
11105+
ImGuiWindow* window = g.OpenedPopupStack[i].Window;
11106+
ImGui::BulletText("PopupID: %08x, Window: '%s'%s%s", g.OpenedPopupStack[i].PopupID, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? " ChildWindow" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? " ChildMenu" : "");
11107+
}
11108+
ImGui::TreePop();
11109+
}
11110+
g.DisableHideTextAfterDoubleHash--;
11111+
}
11112+
ImGui::End();
11113+
}
11114+
1103011115
void ImGui::ShowUserGuide()
1103111116
{
1103211117
ImGui::BulletText("Double-click on title bar to collapse window.");
@@ -11155,6 +11240,8 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
1115511240
// SAMPLE CODE
1115611241
//-----------------------------------------------------------------------------
1115711242

11243+
#ifndef IMGUI_DISABLE_TEST_WINDOWS
11244+
1115811245
static void ShowExampleAppConsole(bool* opened);
1115911246
static void ShowExampleAppLayout(bool* opened);
1116011247
static void ShowExampleAppLongText(bool* opened);
@@ -11381,14 +11468,16 @@ void ImGui::ShowTestWindow(bool* opened)
1138111468
ImGui::SliderFloat("Wrap width", &wrap_width, -20, 600, "%.0f");
1138211469

1138311470
ImGui::Text("Test paragraph 1:");
11384-
ImGui::GetWindowDrawList()->AddRectFilled(ImGui::GetCursorScreenPos() + ImVec2(wrap_width, 0.0f), ImGui::GetCursorScreenPos() + ImVec2(wrap_width+10, ImGui::GetTextLineHeight()), 0xFFFF00FF);
11471+
ImVec2 pos = ImGui::GetCursorScreenPos();
11472+
ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(pos.x + wrap_width, pos.y), ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight()), 0xFFFF00FF);
1138511473
ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width);
1138611474
ImGui::Text("lazy dog. This paragraph is made to fit within %.0f pixels. The quick brown fox jumps over the lazy dog.", wrap_width);
1138711475
ImGui::GetWindowDrawList()->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), 0xFF00FFFF);
1138811476
ImGui::PopTextWrapPos();
1138911477

1139011478
ImGui::Text("Test paragraph 2:");
11391-
ImGui::GetWindowDrawList()->AddRectFilled(ImGui::GetCursorScreenPos() + ImVec2(wrap_width, 0.0f), ImGui::GetCursorScreenPos() + ImVec2(wrap_width+10, ImGui::GetTextLineHeight()), 0xFFFF00FF);
11479+
pos = ImGui::GetCursorScreenPos();
11480+
ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(pos.x + wrap_width, pos.y), ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight()), 0xFFFF00FF);
1139211481
ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width);
1139311482
ImGui::Text("aaaaaaaa bbbbbbbb, cccccccc,dddddddd. eeeeeeee ffffffff. gggggggg!hhhhhhhh");
1139411483
ImGui::GetWindowDrawList()->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), 0xFF00FFFF);
@@ -12030,8 +12119,8 @@ void ImGui::ShowTestWindow(bool* opened)
1203012119
ImGui::DragFloat2("offset", (float*)&offset, 0.5f, -200, 200.0f, "%.0f");
1203112120
ImVec2 pos = ImGui::GetCursorScreenPos();
1203212121
ImVec4 clip_rect(pos.x, pos.y, pos.x+size.x, pos.y+size.y);
12033-
ImGui::GetWindowDrawList()->AddRectFilled(pos, pos+size, ImColor(90,90,120,255));
12034-
ImGui::GetWindowDrawList()->AddText(ImGui::GetWindowFont(), ImGui::GetWindowFontSize()*2.0f, pos+offset, ImColor(255,255,255,255), "Line 1 hello\nLine 2 clip me!", NULL, 0.0f, &clip_rect);
12122+
ImGui::GetWindowDrawList()->AddRectFilled(pos, ImVec2(pos.x+size.x,pos.y+size.y), ImColor(90,90,120,255));
12123+
ImGui::GetWindowDrawList()->AddText(ImGui::GetWindowFont(), ImGui::GetWindowFontSize()*2.0f, ImVec2(pos.x+offset.x,pos.y+offset.y), ImColor(255,255,255,255), "Line 1 hello\nLine 2 clip me!", NULL, 0.0f, &clip_rect);
1203512124
ImGui::Dummy(size);
1203612125
ImGui::TreePop();
1203712126
}
@@ -12455,97 +12544,6 @@ void ImGui::ShowTestWindow(bool* opened)
1245512544
ImGui::End();
1245612545
}
1245712546

12458-
void ImGui::ShowMetricsWindow(bool* opened)
12459-
{
12460-
if (ImGui::Begin("ImGui Metrics", opened))
12461-
{
12462-
ImGui::Text("ImGui %s", ImGui::GetVersion());
12463-
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
12464-
ImGui::Text("%d vertices, %d triangles", ImGui::GetIO().MetricsRenderVertices, ImGui::GetIO().MetricsRenderIndices / 3);
12465-
ImGui::Text("%d allocations", ImGui::GetIO().MetricsAllocs);
12466-
static bool show_clip_rects = true;
12467-
ImGui::Checkbox("Show clipping rectangles when hovering ImDrawList", &show_clip_rects);
12468-
ImGui::Separator();
12469-
12470-
struct Funcs
12471-
{
12472-
static void NodeDrawList(ImDrawList* draw_list, const char* label)
12473-
{
12474-
bool node_opened = ImGui::TreeNode(draw_list, "%s: '%s' %d vtx, %d indices, %d cmds", label, draw_list->_OwnerName ? draw_list->_OwnerName : "", draw_list->VtxBuffer.Size, draw_list->IdxBuffer.Size, draw_list->CmdBuffer.Size);
12475-
if (draw_list == ImGui::GetWindowDrawList())
12476-
{
12477-
ImGui::SameLine();
12478-
ImGui::TextColored(ImColor(255,100,100), "CURRENTLY APPENDING"); // Can't display stats for active draw list! (we don't have the data double-buffered)
12479-
}
12480-
if (!node_opened)
12481-
return;
12482-
12483-
int elem_offset = 0;
12484-
for (const ImDrawCmd* pcmd = draw_list->CmdBuffer.begin(); pcmd < draw_list->CmdBuffer.end(); elem_offset += pcmd->ElemCount, pcmd++)
12485-
if (pcmd->UserCallback)
12486-
ImGui::BulletText("Callback %p, user_data %p", pcmd->UserCallback, pcmd->UserCallbackData);
12487-
else
12488-
{
12489-
ImGui::BulletText("Draw %d indexed vtx, tex = %p, clip_rect = (%.0f,%.0f)..(%.0f,%.0f)", pcmd->ElemCount, pcmd->TextureId, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w);
12490-
if (show_clip_rects && ImGui::IsItemHovered())
12491-
{
12492-
ImRect clip_rect = pcmd->ClipRect;
12493-
ImRect vtxs_rect;
12494-
for (int i = elem_offset; i < elem_offset + (int)pcmd->ElemCount; i++)
12495-
vtxs_rect.Add(draw_list->VtxBuffer[draw_list->IdxBuffer[i]].pos);
12496-
GImGui->OverlayDrawList.PushClipRectFullScreen();
12497-
clip_rect.Round(); GImGui->OverlayDrawList.AddRect(clip_rect.Min, clip_rect.Max, ImColor(255,255,0));
12498-
vtxs_rect.Round(); GImGui->OverlayDrawList.AddRect(vtxs_rect.Min, vtxs_rect.Max, ImColor(255,0,255));
12499-
GImGui->OverlayDrawList.PopClipRect();
12500-
}
12501-
}
12502-
ImGui::TreePop();
12503-
}
12504-
12505-
static void NodeWindows(ImVector<ImGuiWindow*>& windows, const char* label)
12506-
{
12507-
if (!ImGui::TreeNode(label, "%s (%d)", label, windows.Size))
12508-
return;
12509-
for (int i = 0; i < windows.Size; i++)
12510-
Funcs::NodeWindow(windows[i], "Window");
12511-
ImGui::TreePop();
12512-
}
12513-
12514-
static void NodeWindow(ImGuiWindow* window, const char* label)
12515-
{
12516-
if (!ImGui::TreeNode(window, "%s '%s', %d @ 0x%p", label, window->Name, window->Active || window->WasActive, window))
12517-
return;
12518-
NodeDrawList(window->DrawList, "DrawList");
12519-
if (window->RootWindow != window) NodeWindow(window->RootWindow, "RootWindow");
12520-
if (window->DC.ChildWindows.Size > 0) NodeWindows(window->DC.ChildWindows, "ChildWindows");
12521-
ImGui::BulletText("Storage: %d bytes", window->StateStorage.Data.Size * sizeof(ImGuiStorage::Pair));
12522-
ImGui::TreePop();
12523-
}
12524-
};
12525-
12526-
ImGuiState& g = *GImGui; // Access private state
12527-
g.DisableHideTextAfterDoubleHash++; // Not exposed (yet). Disable processing that hides text after '##' markers.
12528-
Funcs::NodeWindows(g.Windows, "Windows");
12529-
if (ImGui::TreeNode("DrawList", "Active DrawLists (%d)", g.RenderDrawLists[0].Size))
12530-
{
12531-
for (int i = 0; i < g.RenderDrawLists[0].Size; i++)
12532-
Funcs::NodeDrawList(g.RenderDrawLists[0][i], "DrawList");
12533-
ImGui::TreePop();
12534-
}
12535-
if (ImGui::TreeNode("Popups", "Opened Popups Stack (%d)", g.OpenedPopupStack.Size))
12536-
{
12537-
for (int i = 0; i < g.OpenedPopupStack.Size; i++)
12538-
{
12539-
ImGuiWindow* window = g.OpenedPopupStack[i].Window;
12540-
ImGui::BulletText("PopupID: %08x, Window: '%s'%s%s", g.OpenedPopupStack[i].PopupID, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? " ChildWindow" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? " ChildMenu" : "");
12541-
}
12542-
ImGui::TreePop();
12543-
}
12544-
g.DisableHideTextAfterDoubleHash--;
12545-
}
12546-
ImGui::End();
12547-
}
12548-
1254912547
static void ShowExampleAppMainMenuBar()
1255012548
{
1255112549
if (ImGui::BeginMainMenuBar())
@@ -12674,7 +12672,7 @@ static void ShowExampleAppManipulatingWindowTitle(bool* opened)
1267412672

1267512673
// Using "###" to display a changing title but keep a static identifier "AnimatedTitle"
1267612674
char buf[128];
12677-
ImFormatString(buf, IM_ARRAYSIZE(buf), "Animated title %c %d###AnimatedTitle", "|/-\\"[(int)(ImGui::GetTime()/0.25f)&3], rand());
12675+
sprintf(buf, "Animated title %c %d###AnimatedTitle", "|/-\\"[(int)(ImGui::GetTime()/0.25f)&3], rand());
1267812676
ImGui::SetNextWindowPos(ImVec2(100,300), ImGuiSetCond_FirstUseEver);
1267912677
ImGui::Begin(buf);
1268012678
ImGui::Text("This window has a changing title.");
@@ -12783,7 +12781,8 @@ struct ExampleAppConsole
1278312781
char buf[1024];
1278412782
va_list args;
1278512783
va_start(args, fmt);
12786-
ImFormatStringV(buf, IM_ARRAYSIZE(buf), fmt, args);
12784+
vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args);
12785+
buf[IM_ARRAYSIZE(buf)-1] = 0;
1278712786
va_end(args);
1278812787
Items.push_back(strdup(buf));
1278912788
ScrollToBottom = true;
@@ -12920,7 +12919,7 @@ struct ExampleAppConsole
1292012919
while (word_start > data->Buf)
1292112920
{
1292212921
const char c = word_start[-1];
12923-
if (ImCharIsSpace(c) || c == ',' || c == ';')
12922+
if (c == ' ' || c == '\t' || c == 0x3000 || c == ',' || c == ';')
1292412923
break;
1292512924
word_start--;
1292612925
}
@@ -12996,7 +12995,7 @@ struct ExampleAppConsole
1299612995
// A better implementation would preserve the data on the current input line along with cursor position.
1299712996
if (prev_history_pos != HistoryPos)
1299812997
{
12999-
ImFormatString(data->Buf, data->BufSize, "%s", (HistoryPos >= 0) ? History[HistoryPos] : "");
12998+
snprintf(data->Buf, data->BufSize, "%s", (HistoryPos >= 0) ? History[HistoryPos] : "");
1300012999
data->BufDirty = true;
1300113000
data->CursorPos = data->SelectionStart = data->SelectionEnd = (int)strlen(data->Buf);
1300213001
}
@@ -13111,6 +13110,10 @@ static void ShowExampleAppLongText(bool* opened)
1311113110
}
1311213111

1311313112
// End of Sample code
13113+
#else
13114+
13115+
void ImGui::ShowTestWindow(bool*) {}
13116+
1311413117
#endif
1311513118

1311613119
//-----------------------------------------------------------------------------

0 commit comments

Comments
 (0)