ide: clang-tidy integration

This commit is contained in:
mirek-fidler 2026-07-21 17:30:37 +02:00 committed by GitHub
parent 3d0e0e786a
commit 8ac9776c16
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 770 additions and 259 deletions

View file

@ -25,6 +25,8 @@ String NoCr(const char *s);
int CharFilterSlash(int c);
String GetDefaultMethod();
String GetMethodName(const String& method);
String GetMethodPath(const String& method);
VectorMap<String, String> GetMethodVars(const String& method);
String MainConf(const Workspace& wspc, String& add_includes);
@ -95,7 +97,10 @@ public:
void Clean();
void RebuildAll();
void SaveMakeFile(const String& fn, bool exporting);
void SaveCCJ(const String& fn, bool exporting);
Array<CompileCommand> GetCompileCommands();
void SaveCCJ(const String& fn, bool exporting);
MakeBuild();

View file

@ -17,8 +17,8 @@ Vector<String> RepoInfo(const String& package);
String MakeIdent(const char *name);
struct CppBuilder : Builder {
virtual String GetTargetExt() const;
virtual void CleanPackage(const String& package, const String& outdir);
String GetTargetExt() const override;
void CleanPackage(const String& package, const String& outdir) override;
const Workspace& wspc;
Time targettime;
@ -38,8 +38,8 @@ struct CppBuilder : Builder {
void DoRc(Vector<String>& sfile, Vector<String>& soptions, const Package& pkg, const String& package);
String Includes(const char *sep, const String& package, const Package& pkg);
virtual String GetBuildInfoPath() const;
void SaveBuildInfo(const String& package);
String GetBuildInfoPath() const override;
void SaveBuildInfo(const String& package) override;
String DefinesTargetTime(const char *sep, const String& package, const Package& pkg);
String IncludesDefinesTargetTime(const String& package, const Package& pkg);
bool HasAnyDebug() const;
@ -59,12 +59,14 @@ struct CppBuilder : Builder {
void ShowTime(int count, int start_time);
virtual void AddMakeFile(MakeFile& makefile, String package,
void AddMakeFile(MakeFile& makefile, String package,
const Vector<String>& all_uses, const Vector<String>& all_libraries,
const Index<String>& common_config, bool exporting);
const Index<String>& common_config, bool exporting) override;
virtual void AddCCJ(MakeFile& mfinfo, String package,
const Index<String>& common_config, bool exporting, bool last_ws);
void AddCCJ(MakeFile& mfinfo, String package,
const Index<String>& common_config, bool exporting, bool last_ws) override;
void AddCommands(Array<CompileCommand>& commands, const String& package) override;
CppBuilder() : wspc(GetIdeWorkspace()) {}
};
@ -171,4 +173,6 @@ INITIALIZE(JavaBuilder)
INITIALIZE(AndroidBuilder)
INITIALIZE(ScriptBuilder)
#include "ClangTidy.h"
#endif

View file

@ -16,7 +16,6 @@ file
Builders.h options(BUILDER_OPTION) PCH,
CppBuilder.cpp,
MakeFile.cpp,
CCJ.cpp,
coff.h,
Builders readonly separator,
GccBuilder.cpp,
@ -41,7 +40,11 @@ file
Blitz.cpp,
Build.h,
Build.cpp,
CCJ.cpp,
Install.cpp,
Clant-Tidy readonly separator,
ClangTidy.h,
ClangTidy.cpp,
Helpers readonly separator,
BuilderUtils.h,
BuilderUtils.cpp,

View file

@ -267,3 +267,96 @@ void MakeBuild::SaveCCJ(const String& fn, bool exporting)
PutConsole(NFormat("%s: error writing compile_commands.json", fn));
}
}
void CppBuilder::AddCommands(Array<CompileCommand>& commands, const String& package)
{
Package pkg;
pkg.Load(PackageFile(package));
String pack_ident = MakeIdent(package);
String ci;
for(const String& m : include)
ci << " -I" << GetPathQ(UnixPath(m));
for(const String& m : config)
ci << " -Dflag" << m;
for(int i = 0; i < pkg.GetCount(); i++)
if(!pkg[i].separator) {
String fn = SourcePath(package, pkg[i]);
String ext = ToLower(GetFileExt(fn));
if(findarg(ext, ".c", ".cpp", ".cc", ".cxx", ".icpp") >= 0) {
String gop = Gather(pkg[i].option, config.GetKeys());
String outfile;
outfile << outdir << "/" << GetFileTitle(fn) << ".o";
CompileCommand& cc = commands.Add();
cc.command << Nvl(compiler, "c++") << " -c" << " -x";
if (ext == ".c")
cc.command << " c " << c_options;
else
cc.command << " c++ " << cpp_options;
cc.command << ci << ' ' << debug_options << ' ' << GetPathQ(UnixPath(fn)) << " -o" << GetPathQ(outfile);
cc.file = fn;
cc.ofile = outfile;
}
}
}
Array<CompileCommand> MakeBuild::GetCompileCommands()
{
Array<CompileCommand> commands;
VectorMap<String, String> bm = GetMethodVars(method);
Host host;
CreateHost(host, false, false);
One<Builder> b = CreateBuilder(&host);
if(!b)
return commands;
Index<String> allconfig = PackageConfig(GetIdeWorkspace(), 0, bm, mainconfigparam, host, *b);
Workspace wspc;
wspc.Scan(GetMain(), allconfig.GetKeys());
Index<String> pkg_config;
for(int i = 0; i < wspc.GetCount(); i++) {
Index<String> modconfig = PackageConfig(wspc, i, bm, mainconfigparam, host, *b);
PkgConfig(wspc, modconfig, pkg_config);
if(i)
for(int a = allconfig.GetCount(); --a >= 0;)
if(modconfig.Find(allconfig[a]) < 0)
allconfig.Remove(a);
}
String incs;
for(const String& s: pkg_config) {
String str;
String out;
str << "pkg-config --cflags " << s;
if (Sys(str, out) < 0)
continue;
out.TrimEnd("\n");
if (out.IsEmpty())
continue;
for(const String& m : Split(out, ' '))
b->include << m;
}
incs << ' ' << "-I" << GetPathQ(UnixPath(GetUppOut()));
b->cc_inc = incs;
for(int i = 0; i < wspc.GetCount(); i++) {
const String package = wspc[i];
b->config = PackageConfig(wspc, i, bm, mainconfigparam, host, *b);
b->method = method;
b->outdir = UnixPath(OutDir(b->config, package, bm));
b->AddCommands(commands, package);
}
return commands;
}

View file

@ -0,0 +1,117 @@
#include "Builders.h"
#define LDUMP(x) // DDUMP(x)
String ClangTidy::path;
Index<String> ClangTidy::options;
Index<String> ClangTidy::groups;
Index<String> ClangTidy::active_checks;
bool ClangTidy::HasClangTidy()
{
ONCELOCK {
#ifdef PLATFORM_WIN32
for(String p : Split(GetMethodVars("CLANGx64").Get("PATH", ""), ';')) {
p << "/clang-tidy.exe";
#else
String p = "clang-tidy";
#endif
String s = Sys(p + " -checks=* --list-checks");
if(s.GetCount()) {
path = p;
for(String l : Split(s, '\n')) {
l = TrimBoth(l);
if(*l.Last() != ':') // Ignore "Enabled checks:"
options.FindAdd(l);
}
for(String s : options) {
int q = s.Find('.');
if(q < 0)
q = s.Find('-');
if(q >= 0)
s.Trim(q);
groups.FindAdd(s);
}
Load(ClangTidyConfigPath());
goto exit; // break not compatible with POSIX / ONCELOCK
}
#ifdef PLATFORM_WIN32
}
#endif
}
exit:
return path.GetCount() && options.GetCount();
}
String ClangTidy::ClangTidyConfigPath() {
return ConfigFile("ide-clang-tidy.json");
}
void ClangTidy::Load(const char *path)
{
if(FileExists(path)) {
Value json = ParseJSON(LoadFile(path));
active_checks.Clear();
for(Value v : json["active_checks"])
active_checks << ~v;
}
else
for(const String& s : options) {
if(s.StartsWith("clang-analyzer-core."))
active_checks << s;
}
}
void ClangTidy::Save(const char *path)
{
Value json;
ValueArray va;
for(String s : active_checks)
va << s;
json("active_checks") = va;
SaveChangedFile(path, AsJSON(json, true));
}
void ClangTidy::RunClangTidy(const Array<CompileCommand>& commands)
{
String cmdline;
String win32_cmdline; // fix mingw-clang issue
#ifdef PLATFORM_WIN32
// "C:/upp/bin/clang/bin/clang-tidy.exe"
// "C:/upp/bin/clang/include/c++/v1/typeinfo"
win32_cmdline = " -I" + GetPathQ(GetFileFolder(GetFileFolder(path)) + "/include/c++/v1");
#endif
JsonArray ccj;
String outdir;
for(const auto& m : commands) {
if(IsNull(outdir))
outdir = GetFileFolder(m.ofile);
ccj << Upp::Json("directory", GetFileFolder(m.file))
("command", m.command + win32_cmdline)
("file", GetFileName(m.file));
cmdline << ' ' << GetPathQ(m.file);
LDUMP(cmdline);
}
String cc_path = outdir + "/compile_commands.json";
RealizePath(cc_path);
Upp::SaveFile(cc_path, ccj.ToString());
cmdline << " -checks=" << Join(active_checks.GetKeys(), ",")
<< " -p " << cc_path;
String rf_path = outdir + "/clang_tidy_parameters_file";
Upp::SaveFile(rf_path, cmdline);
Host host;
MakeBuild *mb = dynamic_cast<MakeBuild *>(TheIdeContext());
if(mb) {
mb->CreateHost(host, false, false);
host.Execute(path + " @" + rf_path);
}
}

View file

@ -0,0 +1,13 @@
struct ClangTidy {
static String path;
static Index<String> options;
static Index<String> groups;
static Index<String> active_checks;
static bool HasClangTidy();
static String ClangTidyConfigPath();
static void Load(const char *path);
static void Save(const char *path);
static void RunClangTidy(const Array<CompileCommand>& commands);
};

197
uppsrc/ide/ClangTidy.cpp Normal file
View file

@ -0,0 +1,197 @@
#include "ide.h"
struct ClangTidyDlg : WithClangTidyLayout<TopWindow>, ClangTidy {
struct OptionWithLink : Option {
RichTextCtrl text;
};
ArrayMap<String, OptionWithLink> checks;
void SyncGroupCounts();
void Group();
void SetOptions();
void ReadOptions();
ClangTidyDlg();
};
ClangTidyDlg::ClangTidyDlg()
{
CtrlLayoutOKCancel(*this, "Clang-Tidy");
group.AddIndex();
group.AddColumn("Group");
group.NoHeader();
group.Add(Null, AttrText("All").Italic().NormalInk(SLtBlue()));
for(String s : groups)
group.Add(s, s);
group.WhenSel = [=] {
Group();
};
option.NoHeader();
option.AddKey();
option.AddColumn();
option.NoCursor();
SetOptions();
auto Set = [=](bool b) {
for(int i = 0; i < option.GetCount(); i++) {
auto *o = dynamic_cast<Option *>(option.GetCtrl(i, 0));
if(o)
*o <<= b;
}
SyncGroupCounts();
};
set << [=] { Set(true); };
reset << [=] { Set(false); };
save << [=] {
ReadOptions();
String p = SelectFileSaveAs("*.json\n*.*");
if(!IsNull(p))
Save(p);
};
load << [=] {
String p = SelectFileOpen("*.json\n*.*");
Load(p);
SetOptions();
Group();
};
}
void ClangTidyDlg::Group()
{
String g = ~group.GetKey();
option.Clear();
for(auto m : ~checks) {
if(m.key.StartsWith(g)) {
option.Add(m.key);
option.SetCtrl(option.GetCount() - 1, 0, m.value, false);
}
}
}
void ClangTidyDlg::SyncGroupCounts()
{
for(int i = 1; i < group.GetCount(); i++) {
String g = ~group.Get(i, 0);
int count = 0;
for(auto m : ~checks)
if(m.key.StartsWith(g) && ~m.value)
count++;
if(count) {
g << " (" << count << ")";
group.Set(i, 1, AttrText(g).Bold());
}
else
group.Set(i, 1, g);
}
}
void ClangTidyDlg::SetOptions()
{
checks.Clear();
for(String s : options) {
OptionWithLink& opt = checks.Add(s);
opt.NoWantFocus();
opt << opt.text.NoSb().VCenter().HSizePos(DPI(18), 0).VSizePos();
opt << [=] { SyncGroupCounts(); };
String txt = "[g";
String cs;
if(cs.TrimStart("clang-analyzer-")) // TODO: Improve
txt << "^https://clang.llvm.org/extra/clang-tidy/checks/clang-analyzer/" + cs + "^";
else {
int q = s.Find('-');
if(q >= 0)
txt << "^https://clang.llvm.org/extra/clang-tidy/checks/" << s.Mid(0, q) << "/" << s.Mid(q + 1) << ".html^";
}
txt << " \1" << s;
opt.text <<= txt;
opt <<= active_checks.Find(s) >= 0;
}
SyncGroupCounts();
}
void ClangTidyDlg::ReadOptions()
{
active_checks.Clear();
for(auto m : ~checks)
if(m.value)
active_checks.FindAdd(m.key);
}
bool Ide::HasClangTidy()
{
return ClangTidyDlg::HasClangTidy();
}
void Ide::ClangTidy(Gate<const String&> what)
{
if(!HasClangTidy()) {
Exclamation("No clang-tidy!");
return;
}
MakeBuild *mb = dynamic_cast<MakeBuild *>(TheIdeContext()); // TODO: Move to Builders/umk
if(!mb)
return;
Array<CompileCommand> cs = mb->GetCompileCommands();
cs.RemoveIf([&](int i) {
return !what(cs[i].file);
});
if(cs.GetCount() == 0) {
Exclamation("No files to check!");
return;
}
ClangTidyDlg dlg;
bool b = dlg.ExecuteOK();
dlg.ReadOptions();
dlg.Save(dlg.ClangTidyConfigPath());
if(!b)
return;
BeginBuilding(true);
dlg.RunClangTidy(cs);
EndBuilding(true);
SetErrorEditor();
/*
String files;
for(const String& f : ResolveFiles(sc, ccjpath, paths))
path << "\"" << f << "\" ";
if(IsNull(v))
return sExeFilePath + " --checks=* " + path;
String checks = Nvl(v["checks"], "*");
String extraargs = Nvl(v["extra_args"], "");
String standard = Nvl(v["standard"], "c++14");
String s;
s << sExeFilePath << " "
<< "--checks=\"" << checks << "\" "
<< "--quiet ";
if(FileExists(ccjpath))
s << "-p=\"" << ccjdir << "\" ";
return s + extraargs + (extraargs.GetCount() ? " " : "") + path
+ (FileExists(ccjpath) ? "" : "-- -std=" + standard);
*/
}

View file

@ -12,7 +12,7 @@ String TrimSlash(String s)
return s;
}
String Builder::GetPathQ(const String& path) const
String GetPathQ(const String& path)
{
return '\"' + TrimSlash(path) + '\"';
}

View file

@ -184,8 +184,6 @@ public:
virtual String IdeGetIncludePath() = 0;
virtual String GetDefaultMethod();
virtual VectorMap<String, String> GetMethodVars(const String& method);
virtual String GetMethodName(const String& method);
virtual bool IsPersistentFindReplace() = 0;
@ -531,6 +529,12 @@ String GetExeExt();
String NormalizeExePath(String exePath);
String NormalizePathSeparator(String path);
struct CompileCommand {
String command;
String file;
String ofile;
};
struct Builder {
Host *host;
Index<String> config;
@ -564,6 +568,8 @@ struct Builder {
Index<String> pkg_config; // names of packages for pkg-config
Vector<String> CINC;
Vector<String> Macro;
String cc_inc; // for AddCommands only
VectorMap<String, int> tmpfilei; // for naming automatic response files
VectorMap<String, Time> dependencies; // dependencies of the last HdependFileTime call
@ -589,6 +595,7 @@ struct Builder {
const Index<String>& common_config, bool exporting) {}
virtual void AddCCJ(MakeFile& mfinfo, String package,
const Index<String>& common_config, bool exporting, bool last_ws) {}
virtual void AddCommands(Array<CompileCommand>& commands, const String& package) {}
virtual String GetTargetExt() const = 0;
virtual void SaveBuildInfo(const String& package) {}
virtual String GetBuildInfoPath() const { return String(); }
@ -598,7 +605,6 @@ struct Builder {
virtual ~Builder() {}
void ChDir(const String& path);
String GetPathQ(const String& path) const;
Vector<Host::FileInfo> GetFileInfo(const Vector<String>& path) const;
Host::FileInfo GetFileInfo(const String& path) const;
Time GetFileTime(const String& path) const;
@ -607,6 +613,9 @@ struct Builder {
bool HasFlag(const char *f) const { return config.Find(f) >= 0; }
};
String TrimSlash(String s);
String GetPathQ(const String& path);
VectorMap<String, Builder *(*)()>& BuilderMap();
void RegisterBuilder(const char *name, Builder *(*create)());

View file

@ -39,16 +39,16 @@ String IdeContext::GetDefaultMethod()
return LoadFile(ConfigFile("default_method"));
}
VectorMap<String, String> IdeContext::GetMethodVars(const String& method)
String GetMethodName(const String& method)
{
VectorMap<String, String> map;
LoadVarFile(ConfigFile(GetMethodName(method)), map);
return map;
return method + ".bm";
}
String IdeContext::GetMethodName(const String& method)
VectorMap<String, String> GetMethodVars(const String& method)
{
return (String)~method + ".bm";
VectorMap<String, String> map;
LoadVarFile(GetMethodPath(method), map);
return map;
}
String GetDefaultMethod()
@ -56,14 +56,9 @@ String GetDefaultMethod()
return the_ide ? the_ide->GetDefaultMethod() : String();
}
VectorMap<String, String> GetMethodVars(const String& method)
{
return the_ide ? the_ide->GetMethodVars(method) : VectorMap<String, String>();
}
String GetMethodPath(const String& method)
{
return the_ide ? the_ide->GetMethodName(method) : String();
return ConfigFile(GetMethodName(method));
}
bool IdeIsBuilding()

View file

@ -616,16 +616,46 @@ void Ide::CopyError(bool all)
WriteClipboardText(s);
}
void Ide::RemoveError()
{
if(!error.IsCursor())
return;
RemoveErrorNotes();
String err = ~error.Get(2);
int c = error.GetCursor();
for(int i = error.GetCount() - 1; i >= 0; i--)
if(~error.Get(i, 2) == err)
error.Remove(i);
error.SetCursor(min(error.GetCount() - 1, c));
SelError();
SyncErrorsMessage();
}
void Ide::ErrorMenu(Bar& bar)
{
bar.Add(error.IsCursor(), "Copy", THISBACK1(CopyError, false));
bar.Add("Copy all", THISBACK1(CopyError, true));
bar.Add(error.IsCursor(), "Copy", [this] { CopyError(false); });
bar.Add("Copy all", [this] { CopyError(false); });
bar.Separator();
bar.Add(error.IsCursor(), "Search the web..", IdeImg::Google(), [=] {
bar.Add(error.IsCursor() && error.Get("NOTES") != "0",
"Remove all instances of this error", [this] { RemoveError(); });
bar.Separator();
bar.Add(error.IsCursor(), "Search the web..", IdeImg::Google(), [this] {
LaunchWebBrowser("https://www.google.com/search?q=" + GetErrorsText(false, false));
});
}
void Ide::RemoveErrorNotes()
{
int sc = error.GetScroll();
removing_notes = true;
for(int i = error.GetCount() - 1; i >= 0; i--)
if(error.Get(i, "NOTES") == "0")
error.Remove(i);
removing_notes = false;
error.ScrollTo(sc);
error.ScrollIntoCursor();
}
void Ide::SelError()
{
if(removing_notes)
@ -633,14 +663,7 @@ void Ide::SelError()
if(error.IsCursor()) {
Value v = error.Get("NOTES");
if(v != "0") { // "0" - expanded note
int sc = error.GetScroll();
removing_notes = true;
for(int i = error.GetCount() - 1; i >= 0; i--)
if(error.Get(i, "NOTES") == "0")
error.Remove(i);
removing_notes = false;
error.ScrollTo(sc);
error.ScrollIntoCursor();
RemoveErrorNotes();
ValueArray n = v;
int ii = error.GetCursor();
for(int i = 0; i < n.GetCount(); i++) {

View file

@ -309,7 +309,7 @@ void OutMode::CmdOptions()
PromptOK("No main package");
return;
}
VectorMap<String, String> bm = ide.GetMethodVars(~method);
VectorMap<String, String> bm = GetMethodVars(~method);
if (bm.GetCount() == 0) {
PromptOK("Invalid build method");
return;

View file

@ -974,6 +974,18 @@ void WorkspaceWork::FileMenu(Bar& menu)
menu.Separator();
if(!isaux) {
menu.Sub("Build", [=] (Bar& menu) { BuildFileMenu(menu); });
Ide *ide = dynamic_cast<Ide *>(TheIde());
if(ide && ide->HasClangTidy()) {
menu.Separator();
String path = NormalizePath(GetActiveFilePath());
menu.Add(IsCSourceFile(path), "Check file with Clang-Tidy", IdeImg::ClangTidy(), [=] {
ide->ClangTidy([=](const String& p) {
return NormalizePath(p) == path;
});
});
}
menu.Separator();
}
}

View file

@ -811,8 +811,6 @@ public:
void AKEditor();
void PackageMenu(Bar& menu);
void UscFile(const String& file);
void UscProcessDir(const String& dir);
void UscProcessDirDeep(const String& dir);
@ -1134,6 +1132,7 @@ public:
void SyncErrorsMessage();
String GetErrorsText(bool all, bool src);
void CopyError(bool all);
void RemoveError();
void ErrorMenu(Bar& bar);
void ShowError();
void NewFFound();
@ -1144,6 +1143,7 @@ public:
void ShowFound(ArrayCtrl& list);
void CopyFound(ArrayCtrl& list, bool all);
void FFoundMenu(ArrayCtrl& list, Bar& bar);
void RemoveErrorNotes();
void SelError();
void ClearErrorsPane();
WString FormatErrorLine(const String& text, int& linecy);
@ -1299,6 +1299,9 @@ public:
void MacroAllPackages(EscEscape& e);
void MacroTarget(EscEscape& e);
void ClangTidy(Gate<const String&> what);
bool HasClangTidy();
String GetAndroidSdkPath();
void TriggerIndexer0();

View file

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

View file

@ -1028,3 +1028,14 @@ LAYOUT(SeqLayout, 764, 544)
ITEM(Upp::EditString, postfix, LeftPosZ(708, 48).TopPosZ(8, 19))
END_LAYOUT
LAYOUT(ClangTidyLayout, 624, 580)
ITEM(Upp::ArrayCtrl, group, LeftPosZ(8, 184).TopPosZ(8, 532))
ITEM(Upp::ArrayCtrl, option, LeftPosZ(196, 420).TopPosZ(8, 532))
ITEM(Upp::Button, save, SetLabel(t_("Save..")).RightPosZ(568, 48).BottomPosZ(8, 24))
ITEM(Upp::Button, load, SetLabel(t_("Load..")).RightPosZ(516, 48).BottomPosZ(8, 24))
ITEM(Upp::Button, set, SetLabel(t_("Set All")).RightPosZ(380, 48).BottomPosZ(8, 24))
ITEM(Upp::Button, reset, SetLabel(t_("Reset All")).RightPosZ(320, 56).BottomPosZ(8, 24))
ITEM(Upp::Button, ok, SetLabel(t_("OK")).RightPosZ(76, 64).BottomPosZ(8, 24))
ITEM(Upp::Button, cancel, SetLabel(t_("Cancel")).RightPosZ(8, 64).BottomPosZ(8, 24))
END_LAYOUT

View file

@ -103,6 +103,7 @@ file
Build.cpp,
Debug.cpp,
Valgrind.cpp,
ClangTidy.cpp,
Export.cpp,
Repo readonly separator,
urepo.h,

View file

@ -22,11 +22,6 @@ void Ide::AKEditor()
CodeEditor::replace_key = AK_DOREPLACE().key[0];
}
void Ide::PackageMenu(Bar& menu)
{
Project(menu);
}
void Ide::FileBookmark(Bar& menu)
{
LTIMESTOP("FileBookMark");
@ -524,8 +519,6 @@ void Ide::Project(Bar& menu)
menu.Separator();
}
if(!IsEditorMode()) {
WorkspaceWork::PackageMenu(menu);
menu.MenuSeparator();
menu.AddMenu(AK_ORGANIZER, IdeImg::package_organizer(), THISBACK(EditWorkspace))
.Help("Package dependencies, compiler & linker options, output path override");
menu.Add(AK_CUSTOM, THISBACK(CustomSteps))
@ -569,6 +562,11 @@ void Ide::Project(Bar& menu)
else
menu.Add("Synchronize all repositories..", IdeImg::svn(), THISBACK(SyncRepo));
}
if(HasClangTidy()) {
menu.MenuSeparator();
menu.AddMenu("Check project with Clang-Tidy", IdeImg::ClangTidy(),
[=] { ClangTidy([](const String&) { return true; }); });
}
}
}
@ -750,13 +748,23 @@ void Ide::BuildPackageMenu(Bar& menu)
{
int pi = GetPackageIndex();
bool b = !IdeIsDebugLock() && idestate == EDITING && pi >= 0 && pi < IdeWorkspace().GetCount();
String name;
if(b)
name = '\'' + IdeWorkspace()[pi] + '\'';
menu.Add(b, "Build package " + name, THISBACK(PackageBuild))
menu.Add(b, "Build package", THISBACK(PackageBuild))
.Help("Build current package");
menu.Add(b, "Clean package " + name, THISBACK(PackageClean))
menu.Add(b, "Clean package", THISBACK(PackageClean))
.Help("Remove all intermediate files of the current package");
if(HasClangTidy()) {
menu.Separator();
menu.Add(b, "Check package with Clang-Tidy", IdeImg::ClangTidy(), [=] {
const Package& p = IdeWorkspace().GetPackage(pi);
String pp = PackageDirectory(IdeWorkspace()[pi]);
Index<String> pf;
for(int i = 0; i < p.GetCount(); i++)
pf.Add(NormalizePath(pp + '/' + p[i]));
ClangTidy([&](const String& p) {
return pf.Find(NormalizePath(p)) >= 0;
});
});
}
menu.MenuSeparator();
}
@ -850,7 +858,6 @@ void Ide::DebugMenu(Bar& menu)
menu.Add(b, AK_VALGRIND, THISBACK(Valgrind))
.Help("Build application & run in valgring");
#endif
menu.Separator();
}
}

View file

@ -406,7 +406,7 @@ void AppMain___()
ide.disable_custom_caption2 = ide.disable_custom_caption;
ide.SetupBars();
#ifdef PLATFORM_COCOA
if(!ide.macos_update_icon)
Ctrl::SetAlwaysUseBundledIcon();