diff --git a/uppbox/UppBuilder/Make.hpp b/uppbox/UppBuilder/Make.hpp index 2461d940d..683a73703 100644 --- a/uppbox/UppBuilder/Make.hpp +++ b/uppbox/UppBuilder/Make.hpp @@ -1,251 +1,250 @@ -#include - -String ParseCustomStep(const String& s){ - String cmd; - for(const char* c=~s;*c;c++){ - if(c[0]=='\\' && c[1]=='\"') continue; - if(strncmp(c,"$(PATH)",7)==0){ - cmd+="$$f"; - c+=6; - } else if(strncmp(c,"$(DIR)",6)==0){ - cmd+="`dirname $$f`"; - c+=5; - } else if(strncmp(c,"$(FILE)",7)==0){ - cmd+="`basename $$f`"; - c+=6; - } else if(strncmp(c,"$(TITLE)",8)==0){ - cmd+="`basename $$f | sed 's/[.][^.]*$//'`"; - c+=7; - } else if(strncmp(c,"$(OUTDIR)",9)==0){ - cmd+="$(BIN)/"; - c+=8; - } else - cmd+=*c; -// $(INCLUDE),$(!) etc. not implemented yet - } - return cmd; -} - -String CustomRule(String rule, const String& pkg){ - String ext=ReadValue(rule); - String cmd=ParseCustomStep(ReadValue(rule)); - //ignore last part for simplicity - if (cmd.IsEmpty() || ext.IsEmpty()) - return ""; - if (ext=="pre-link") - return " $E cd $("+pkg+"_src) &&" - "echo \" Applying custom build pre-link step " - "(warning: this is an experimental feature)\"; " - +cmd+";\n"; - if (ext=="post-link") - return " $E cd $("+pkg+"_src) &&" - "echo \" Applying custom build post-link step " - "(warning: this is an experimental feature)\"; " - +cmd+";\n"; - return " $E cd $("+pkg+"_src) && for f in *"+ext+"; " - "do echo \" Applying custom build step on $$f " - "(warning: this is an experimental feature)\"; " - +cmd+"; done;\n"; -} - -void Parser::Process(){ - String uppout=GetEnv("OUT","/tmp/_out"); - String makefile=uppout+"/Makefile"; - FILE* mf=fopen(makefile,"w"); - if(!mf){ - printf("Failed to open file %s\n", ~makefile); - exit(1); - } - - fprintf(mf, "# This is an automatically generated makefile for %s package\n" - "# You should never need to modify it...\n", ~main); - - bool dep = GetEnv("DEPS","0")=="1"; - bool color = GetEnv("COLOR","0")=="1"; - String includes; - Vector inc; - Split(GetEnv("INCPATHS"),inc); - for(int i=0; i lpaths; - Split(GetEnv("LIBPATHS"),lpaths); - for(int i=0; itm_year+1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); - - fprintf(mf, "OUT:=%s\n" - "BIN:=%s\n" - "CFLAGS:=%s\n" - "CXXFLAGS:=%s\n" - "SPEEDFLAGS:=%s\n" - "SIZEFLAGS:=%s\n" - "LDFLAGS:=%s\n" - "CC:=%s\n" - "CXX:=%s\n" - "AR:=%s\n" - "MKDIRP:=%s\n" - "E:=%s\n" - "M:=%s\n" - "C:=%s\n" - "B:=%s\n" - "N:=%s\n" - "mc=$M \" Compiling $C$<$N\"\n" - "ma=$M \"=> $BCreating archive$N $C$@$N\"\n" - "cc=$E $(CC) -c -x c %s $< -o $@ $(CPPFLAGS) %s\n" - "cxx=$E $(CXX) -c -x c++ %s $< -o $@ $(CPPFLAGS) %s\n" - "includes:=%s\n" - "LIBPATHS:=%s\n" - "default: build\n" - ".PHONY:build clean createdirs custom default\n\n", - ~uppout, ~GetEnv("BIN","$(OUT)/bin"), - ~GetEnv("CFLAGS","-O2"), - ~GetEnv("CXXFLAGS","$(CFLAGS)"), - ~GetEnv("SPEEDFLAGS","-O3 -ffunction-sections -fdata-sections"), - ~GetEnv("SIZEFLAGS","-Os -finline-limit=20 -ffunction-sections -fdata-sections"), - ~GetEnv("LDFLAGS","-Wl,--gc-sections -Wl,-s -Wl,-O,2"), - ~GetEnv("CC","$(CC)"), ~GetEnv("CXX","$(CXX)"), - ~GetEnv("AR","ar -src"), ~GetEnv("MKDIRP","mkdir -p"), - GetEnv("ECHO","0")=="1"?"":"@", - GetEnv("SILENT","0")=="1"?"@true":(color?"@echo -e":"@echo"), - color?(const char*)("\\e[3"+GetEnv("HIGHLIGHT","4")+"m"):"", - color?"\\e[1m":"", color?"\\e[0m":"", - dep?"-MMD":"", date, dep?"-MMD":"", - date, ~includes, ~libpaths); - String icpps, archives, prelink, postlink, custom; - Vector dirs; - dirs.Add("$(BIN)"); - for(int i=0;i pflags; - - String opt; - //we add the internal includes twice, to fix the case with relative paths... isn't there a better solution? - opt=EvalVector(pkgs[i].include,i,"-I"); - opt+=EvalVector(pkgs[i].include,i,"-I$("+pkg+"_src)/"); - opt+=EvalVector(pkgs[i].option,i,""); - for(int j=0;j $(%s_out)/%s.cpp\n" - " $E $(CXX) -c -x c++ $(%s_out)/%s.cpp -o $@ $(CPPFLAGS) $(CXXFLAGS)\n", - ~pkg, ~f.name, ~pkg, ~f.name, ~pkg, ~f.name, ~pkg, ~f.name); - objlist+=" $("+pkg+"_out)/"+f.name+".o"; - continue; - } - String ext,fopt; - if(f.lang=="c++") - opt="$(CXXFLAGS) "; - else if(f.lang=="c") - opt="$(CFLAGS) "; - if(pkgs[i].opt==SPEED) ext=".speed.o"; - else if(pkgs[i].opt==SIZE) ext=".size.o"; - else{ - if(f.opt==SPEED) ext=".speed.o"; - if(f.opt==SIZE) ext=".size.o"; - else ext=".o"; - } - if(ext==".speed.o") - fopt+="$(SPEEDFLAGS)"; - else if(ext==".size.o") - fopt+="$(SIZEFLAGS)"; - String fn="$("+pkg+"_out)/" + f.name + ext; - if(dep){ - String dep = uppout + "/" + fdir + "/" + f.name + ext; - dep[dep.GetCount()-1]='d'; - dep=LoadFile(dep); - if(dep.GetCount()) - fprintf(mf, "%s", ~dep); - else - fprintf(mf, "%s: $("+pkg+"_src)/%s\n", ~fn, ~f.name); - } else { - fprintf(mf, "%s: $("+pkg+"_src)/%s\n", ~fn, ~f.name); - } - fprintf(mf," $(mc)\n" - " $(%s) %s $(%s_opt)\n", - ~f.lang, ~fopt, ~pkg); - - if(f.name.Mid(f.name.GetCount()-4)=="icpp") - icpps+=" "+fn; - else - objlist+=" "+fn; - } - fprintf(mf,"%s_custom:\n", ~pkgs[i].name); - for(int j=0;j + +String ParseCustomStep(const String& s){ + String cmd; + for(const char* c=~s;*c;c++){ + if(c[0]=='\\' && c[1]=='\"') continue; + if(strncmp(c,"$(PATH)",7)==0){ + cmd+="$$f"; + c+=6; + } else if(strncmp(c,"$(DIR)",6)==0){ + cmd+="`dirname $$f`"; + c+=5; + } else if(strncmp(c,"$(FILE)",7)==0){ + cmd+="`basename $$f`"; + c+=6; + } else if(strncmp(c,"$(TITLE)",8)==0){ + cmd+="`basename $$f | sed 's/[.][^.]*$//'`"; + c+=7; + } else if(strncmp(c,"$(OUTDIR)",9)==0){ + cmd+="$(BIN)/"; + c+=8; + } else + cmd+=*c; +// $(INCLUDE),$(!) etc. not implemented yet + } + return cmd; +} + +String CustomRule(String rule, const String& pkg){ + String ext=ReadValue(rule); + String cmd=ParseCustomStep(ReadValue(rule)); + //ignore last part for simplicity + if (cmd.IsEmpty() || ext.IsEmpty()) + return ""; + if (ext=="pre-link") + return " $E cd $("+pkg+"_src) &&" + "echo \" Applying custom build pre-link step " + "(warning: this is an experimental feature)\"; " + +cmd+";\n"; + if (ext=="post-link") + return " $E cd $("+pkg+"_src) &&" + "echo \" Applying custom build post-link step " + "(warning: this is an experimental feature)\"; " + +cmd+";\n"; + return " $E cd $("+pkg+"_src) && for f in *"+ext+"; " + "do echo \" Applying custom build step on $$f " + "(warning: this is an experimental feature)\"; " + +cmd+"; done;\n"; +} + +void Parser::Process(){ + String uppout=GetEnv("OUT","/tmp/_out"); + String makefile=uppout+"/Makefile"; + FILE* mf=fopen(makefile,"w"); + if(!mf){ + printf("Failed to open file %s\n", ~makefile); + exit(1); + } + + fprintf(mf, "# This is an automatically generated makefile for %s package\n" + "# You should never need to modify it...\n", ~main); + + bool dep = GetEnv("DEPS","0")=="1"; + bool color = GetEnv("COLOR","0")=="1"; + String includes; + Vector inc; + Split(GetEnv("INCPATHS"),inc); + for(int i=0; i lpaths; + Split(GetEnv("LIBPATHS"),lpaths); + for(int i=0; itm_year+1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); + + fprintf(mf, "OUT:=%s\n" + "BIN:=%s\n" + "CFLAGS:=%s\n" + "CXXFLAGS:=%s\n" + "SPEEDFLAGS:=%s\n" + "SIZEFLAGS:=%s\n" + "LDFLAGS:=%s\n" + "CC:=%s\n" + "CXX:=%s\n" + "AR:=%s\n" + "MKDIRP:=%s\n" + "E:=%s\n" + "M:=%s\n" + "C:=%s\n" + "B:=%s\n" + "N:=%s\n" + "mc=$M \" Compiling $C$<$N\"\n" + "ma=$M \"=> $BCreating archive$N $C$@$N\"\n" + "cc=$E $(CC) -c -x c %s $< -o $@ $(CPPFLAGS) %s\n" + "cxx=$E $(CXX) -c -x c++ %s $< -o $@ $(CPPFLAGS) %s\n" + "includes:=%s\n" + "LIBPATHS:=%s\n" + "default: build\n" + ".PHONY:build clean createdirs custom default\n\n", + ~uppout, ~GetEnv("BIN","$(OUT)/bin"), + ~GetEnv("CFLAGS","-O2"), + ~GetEnv("CXXFLAGS","$(CFLAGS)"), + ~GetEnv("SPEEDFLAGS","-O3 -ffunction-sections -fdata-sections"), + ~GetEnv("SIZEFLAGS","-Os -finline-limit=20 -ffunction-sections -fdata-sections"), + ~GetEnv("LDFLAGS","-Wl,--gc-sections -Wl,-s -Wl,-O,2"), + ~GetEnv("CC","$(CC)"), ~GetEnv("CXX","$(CXX)"), + ~GetEnv("AR","ar -src"), ~GetEnv("MKDIRP","mkdir -p"), + GetEnv("ECHO","0")=="1"?"":"@", + GetEnv("SILENT","0")=="1"?"@true":(color?"@echo -e":"@echo"), + color?(const char*)("\\e[3"+GetEnv("HIGHLIGHT","4")+"m"):"", + color?"\\e[1m":"", color?"\\e[0m":"", + dep?"-MMD":"", date, dep?"-MMD":"", + date, ~includes, ~libpaths); + String icpps, archives, prelink, postlink, custom; + Vector dirs; + dirs.Add("$(BIN)"); + for(int i=0;i pflags; + + String opt; + //we add the internal includes twice, to fix the case with relative paths... isn't there a better solution? + opt=EvalVector(pkgs[i].include,i,"-I"); + opt+=EvalVector(pkgs[i].include,i,"-I$("+pkg+"_src)/"); + opt+=EvalVector(pkgs[i].option,i,""); + for(int j=0;j $(%s_out)/%s.cpp\n" + " $E $(CXX) -c -x c++ $(%s_out)/%s.cpp -o $@ $(CPPFLAGS) $(CXXFLAGS)\n", + ~pkg, ~f.name, ~pkg, ~f.name, ~pkg, ~f.name, ~pkg, ~f.name); + objlist+=" $("+pkg+"_out)/"+f.name+".o"; + continue; + } + String ext,fopt; + if(f.lang=="c++") + opt="$(CXXFLAGS) "; + else if(f.lang=="c") + opt="$(CFLAGS) "; + if(pkgs[i].opt==SPEED) ext=".speed.o"; + else if(pkgs[i].opt==SIZE) ext=".size.o"; + else{ + if(f.opt==SPEED) ext=".speed.o"; + if(f.opt==SIZE) ext=".size.o"; + else ext=".o"; + } + if(ext==".speed.o") + fopt+="$(SPEEDFLAGS)"; + else if(ext==".size.o") + fopt+="$(SIZEFLAGS)"; + String fn="$("+pkg+"_out)/" + f.name + ext; + if(dep){ + String dep = uppout + "/" + fdir + "/" + f.name + ext; + dep[dep.GetCount()-1]='d'; + dep=LoadFile(dep); + if(dep.GetCount()) + fprintf(mf, "%s", ~dep); + else + fprintf(mf, "%s: $("+pkg+"_src)/%s\n", ~fn, ~f.name); + } else { + fprintf(mf, "%s: $("+pkg+"_src)/%s\n", ~fn, ~f.name); + } + fprintf(mf," $(mc)\n" + " $(%s) %s $(%s_opt)\n", + ~f.lang, ~fopt, ~pkg); + + if(f.name.Mid(f.name.GetCount()-4)=="icpp") + icpps+=" "+fn; + else + objlist+=" "+fn; + } + fprintf(mf,"%s_custom:\n", ~pkgs[i].name); + for(int j=0;j $@ - -$(OUT)/brc.sh: $(thisfile) - @$m "Extracting brc parser..." - +$e [ -d $(OUT) ] || $(MKDIRP) $(OUT) - +$e $(TIME) sed -n 's/^#~//p;' $< | base64 -d | gzip -d > $@ - -$(OUT)/color.sh: $(thisfile) - @$m "Extracting colorizer script..." - +$e [ -d $(OUT) ] || $(MKDIRP) $(OUT) - +$e $(TIME) sed -n 's/^#%//p;' $< | base64 -d | gzip -d > $@ - -build: do-build - $e for pkg in $(PKG); do \ - if [ "$(RUN)" = "1" ]; then \ - for target in "$(TARGET)" "$(BIN)/$(TARGET)" "$(BIN)/$$pkg"; do \ - [ -f "$$target" ] && break; \ - done; \ - [ -e "$$target" ] && { $m "Running $$target"; } && $$target; \ - fi; \ - done - -simulate: $(OUT)/Makefile - +$e for pkg in $(PKG) ; do \ - $m Parsing package $$pkg ... && \ - $(pass) $(OUT)/parser $$pkg && \ - $m Building package $$pkg ... && \ - $(MAKE) -nf $(OUT)/Makefile; \ - done - -help: - $e sed '/^$$/{s/.*//;q;}' $(thisfile); - -clean: - +$e for pkg in $(PKG); do \ - $m Parsing package $$pkg... && \ - $(pass) $(OUT)/parser $$pkg && \ - $m Cleaning package $$pkg && \ - $(MAKE) -f $(OUT)/Makefile clean; \ - done - -dist-clean: - @$m Deleting $(OUT) ... - $e rm -rf $(OUT) - -parser-clean: - @$m Deleting parser files ... - $e rm -f $(OUT)/parser $(OUT)/parser.cpp - -.SUFFIXES: - -.PHONY: all help simulate clean dist-clean parser-clean \ - build do-build no-package-specified - +######################################################################## +# __ __ _ _ __ __ __ _ _ ___ ___ __ __ ___ # +# ( )( ) _( )_ _( )_ ( \/ ) ( ) ( )/ )( _)( _)( )( ) ( _) # +# )(__)( (_ _)(_ _) ) ( /__\ ) \ ) _) ) _) )( )(__ ) _) # +# \____/ (_) (_) (_/\/\_)(_)(_)(_)\_)(___)(_) (__)(____)(___) # +# # +############################## USAGE ################################### +# This makefile is controlled through a set of variables, similar to # +# any other makefile. The prefered way to change them is via command # +# line, e.g.: make PKG="ide usvn" CXX=g++ # +# # +# All of the variables that can control the bahaviour are listed below # +# in DEFAULTS section. Also their default value is shown here. Notice # +# that many of them can contain shell commands (enclosed in ``) which # +# are evaluated before parsing and building each package. +# # +# For boolean type of variables value "1" represents true, anything # +# else is evaluated as false. # +############################# TARGETS ################################## +# This makefile defines five targets that are meant to be used # +# directly by user from the command line: # +# # +# all - builds all (default if any packages are specified) # +# help - shows this help (default if no packages are given) # +# simulate - prints all commands, without executing them # +# clean - deletes all compiled files related to given packages # +# dist-clean - deletes the entire OUT directory (including parsers) # +############################# EXAMPLES ################################# +# Typical usage: # +# make PKG=ide FLAGS="GCC" # +# More complicated usage: # +# make PKG="ide UWord Bombs" FLAGS="GCC .NOGTK" ECHO=1 # +# Show help: # +# make help # +# Silent mode: # +# make PKG=ide SILENT=1 # +############################# DEFAULTS ################################# +# List of packages to build (space separated). If empty, this help # +# text will be shown. # +PKG:= +# Paths where to look for packages. # +NESTS:=uppsrc bazaar examples reference tutorial $$HOME/MyApps +# Building flags (as in TheIDE). +FLAGS:=GCC +# Additional include paths for compiler (without the leading "-I"). # +INCPATHS:= /usr/include/freetype2 /usr/include/gtk-2.0 +INCPATHS+= /usr/local/include/gtk-2.0 /usr/include/glib-2.0 +INCPATHS+= /usr/local/include/glib-2.0 /usr/lib/glib-2.0/include +INCPATHS+= /usr/local/lib/glib-2.0/include /usr/lib/gtk-2.0/include +INCPATHS+= /usr/local/lib/gtk-2.0/include /usr/include/cairo +INCPATHS+= /usr/include/pango-1.0 /usr/include/atk-1.0 +INCPATHS+= /usr/X11R6/include /usr/X11R6/include/freetype2 +INCPATHS+= /usr/X11R6/include/gtk-2.0 /usr/X11R6/include/glib-2.0 +INCPATHS+= /usr/X11R6/lib/glib-2.0/include +INCPATHS+= /usr/X11R6/lib/gtk-2.0/include /usr/X11R6/include/cairo +INCPATHS+= /usr/X11R6/include/pango-1.0 /usr/X11R6/include/atk-1.0 +INCPATHS+= /usr/local/include/cairo /usr/local/include/pango-1.0 +INCPATHS+= /usr/local/include/atk-1.0 /usr/local/include +INCPATHS+= /usr/local/include/libpng /usr/include/gdk-pixbuf-2.0 +INCPATHS+= /usr/lib/i386-linux-gnu/glib-2.0/include +INCPATHS+= /usr/lib/x86_64-linux-gnu/glib-2.0/include +# Paths to libraries for linker. # +LIBPATHS:=/usr/X11R6/lib /usr/lib /usr/local/lib +# Directory to store intermediate object files # +OUT:=_out +# Directory where the resulting binaries will be stored # +BIN:=$(OUT)/bin +# ar command # +AR:=ar -src +# Command to create directories equivalent to "mkdir -p". The only # +# good reason to change is if your platform uses mkdir command which # +# doesn't support the -p option # +MKDIRP:=mkdir -p +# C compiler command # +CC:=cc +# C++ compiler command # +CXX:=c++ +# Options for C/C++ preprocessor # +CPPFLAGS:= +# Options for C compiler # +CFLAGS:= +# Options for C++ compiler # +CXXFLAGS:= +# Options for linker # +LDFLAGS:=-Wl,--gc-sections -Wl,-s -Wl,-O,2 +# Additional options for speed optimization # +SPEEDFLAGS:=-O3 -ffunction-sections -fdata-sections +# Additional options for size optimization # +SIZEFLAGS:=-Os -finline-limit=20 -ffunction-sections -fdata-sections +# Optimization, supply SPEED or SIZE to optimize the executables # +OPT:= +# Platform flag, added to FLAGS, can include shell commands # +PLATFORM:=`uname | tr a-z A-Z` POSIX +# Suppress all messagges # +SILENT:=0 +# Print each executed command # +ECHO:=0 +# Use dependency files. This will probably work only with gcc-like # +# compilers (requires -MD option). The build usually works correctly # +# even without specifying the dependencies unless you modify included # +# files (*.h, *.lay, ...) without modifying the *.c/cpp files that # +# include them. # +DEPS:=0 +# Run the executable(s) sequntially when compiled # +RUN:=0 +# Override default name of final executable (absolute or relative path) +TARGET:= +# Add flags from based on mainconfig section (1-based index, set # +# to 0 to disable completely # +USEMAINCFG:=1 +# Ask for some additional details during parsing # +INTERACTIVE:=0 +# Use colorized output, recognized values are 0, 1 or auto # +COLOR:=auto +# What color should be used in colorized mode, number from 0 to 7 # +HIGHLIGHT:=4 +TIME:=TIMEFORMAT=" time taken: %Es"; time +######################################################################## + +m:=[ "$(SILENT)" = "1" ] || echo +e:=@ #comment out for debugging +dbgparser:=-DflagDEBUG -ggdb3 + +thisfile:=$(MAKEFILE_LIST)$(.MAKEFILE_LIST) +color:=if [ "$(COLOR)" = "auto" ]; then [ -t 1 ] && c=1 || c=0; else c="$(COLOR)"; fi +pass:=$(color); UPP_NESTS="$(NESTS)" UPP_FLAGS="$(FLAGS)" \ + UPP_INCPATHS="$(INCPATHS)" UPP_LIBPATHS="$(LIBPATHS)" UPP_OUT="$(OUT)" \ + UPP_BIN="$(BIN)" UPP_AR="$(AR)" UPP_MKDIRP="$(MKDIRP)" UPP_CC="$(CC)" \ + UPP_CXX="$(CXX)" UPP_CFLAGS="$(CFLAGS)" UPP_CXXFLAGS="$(CXXFLAGS)" \ + UPP_LDFLAGS="$(LDFLAGS)" UPP_SPEEDFLAGS="$(SPEEDFLAGS)" \ + UPP_SIZEFLAGS="$(SIZEFLAGS)" UPP_PLATFORM="$(PLATFORM)" \ + UPP_SILENT="$(SILENT)" UPP_ECHO="$(ECHO)" UPP_DEPS="$(DEPS)" \ + UPP_RUN="$(RUN)" UPP_TARGET="$(TARGET)" UPP_USEMAINCFG="$(USEMAINCFG)" \ + UPP_OPT="$(OPT)" UPP_INTERACTIVE="$(INTERACTIVE)" UPP_COLOR="$$c" \ + UPP_HIGHLIGHT="$(HIGHLIGHT)" + +all: no-package-specified build + +do-build: $(OUT)/parser $(OUT)/brc.sh $(OUT)/color.sh + +$e set -e; $(color); B=""; N=""; C=""; color=""; \ + [ $$c -eq 1 ] && color="$(SHELL) $(OUT)/color.sh" && B="\e[1m" && N="\e[0m" && C="\e[1;3$(HIGHLIGHT)m"; \ + for pkg in $(PKG) ; do \ + $m $${B}Parsing package $$C$$pkg$$N $$B...$$N; \ + $(TIME) $(pass) $$color $(OUT)/parser $$pkg; \ + $m $${B}Building package$$N $$C$$pkg$$N $$B...$$N; \ + $(TIME) $$color $(MAKE) -j 3 -f $(OUT)/Makefile && \ + $m $${B}Package$$N $$C$$pkg$$N$$B finished ...$$N; \ + done; set +e + +no-package-specified: + $e if [ -z "$(PKG)" ]; then sed '/^$$/{s/.*//;q;}' $(thisfile) && false; fi + +$(OUT)/parser: $(OUT)/parser.cpp + @$m Compiling parser... + +$e $(TIME) $(CXX) -x c++ -o $@ $^ $(dbgparser) + +$(OUT)/parser.cpp: $(thisfile) + @$m "Extracting parser..." + +$e [ -d $(OUT) ] || $(MKDIRP) $(OUT) + +$e $(TIME) sed -n 's/^#://p;' $< | base64 -d | gzip -d > $@ + +$(OUT)/brc.sh: $(thisfile) + @$m "Extracting brc parser..." + +$e [ -d $(OUT) ] || $(MKDIRP) $(OUT) + +$e $(TIME) sed -n 's/^#~//p;' $< | base64 -d | gzip -d > $@ + +$(OUT)/color.sh: $(thisfile) + @$m "Extracting colorizer script..." + +$e [ -d $(OUT) ] || $(MKDIRP) $(OUT) + +$e $(TIME) sed -n 's/^#%//p;' $< | base64 -d | gzip -d > $@ + +build: do-build + $e for pkg in $(PKG); do \ + if [ "$(RUN)" = "1" ]; then \ + for target in "$(TARGET)" "$(BIN)/$(TARGET)" "$(BIN)/$$pkg"; do \ + [ -f "$$target" ] && break; \ + done; \ + [ -e "$$target" ] && { $m "Running $$target"; } && $$target; \ + fi; \ + done + +simulate: $(OUT)/Makefile + +$e for pkg in $(PKG) ; do \ + $m Parsing package $$pkg ... && \ + $(pass) $(OUT)/parser $$pkg && \ + $m Building package $$pkg ... && \ + $(MAKE) -nf $(OUT)/Makefile; \ + done + +help: + $e sed '/^$$/{s/.*//;q;}' $(thisfile); + +clean: + +$e for pkg in $(PKG); do \ + $m Parsing package $$pkg... && \ + $(pass) $(OUT)/parser $$pkg && \ + $m Cleaning package $$pkg && \ + $(MAKE) -f $(OUT)/Makefile clean; \ + done + +dist-clean: + @$m Deleting $(OUT) ... + $e rm -rf $(OUT) + +parser-clean: + @$m Deleting parser files ... + $e rm -f $(OUT)/parser $(OUT)/parser.cpp + +.SUFFIXES: + +.PHONY: all help simulate clean dist-clean parser-clean \ + build do-build no-package-specified + diff --git a/uppbox/UppBuilder/Parser.cpp b/uppbox/UppBuilder/Parser.cpp index 486775e54..849b577cb 100644 --- a/uppbox/UppBuilder/Parser.cpp +++ b/uppbox/UppBuilder/Parser.cpp @@ -62,7 +62,7 @@ public: ~String() {free(p);} char& operator[](const int n) const {return p[n];} - bool IsEmpty() const {return *p == 0;} + bool IsEmpty() const {return *p == 0 || strlen(p) == 0;} const char* operator~() const {return p;} operator const char*() const {return p;} String& operator=(const String& s) {return operator=(s.p);} @@ -418,7 +418,11 @@ struct Upp{ }; inline void Split(String s,Vector& v){ - while(s.GetCount()) v.AddUnique(ReadValue(s,' ')); + while(s.GetCount()){ + String val = ReadValue(s,' '); + if(val.GetCount()) + v.AddUnique(val); + } } String FlagDir(const Vector& v){ diff --git a/uppbox/UppBuilder/brc.sh b/uppbox/UppBuilder/brc.sh index 6c5a8e351..a1c5cb0ed 100644 --- a/uppbox/UppBuilder/brc.sh +++ b/uppbox/UppBuilder/brc.sh @@ -15,7 +15,7 @@ toBin() { BZ2) obj=$tmp/obj.bz2; cat "$1" | bzip2 -9 > $obj ;; *) obj="$1" ;; esac - hexdump -e '"\t" 16/1 "%i, " "\n"' $obj | sed '$s/[ ,]\+$/, 0/g' + hexdump -v -e '"\t" 16/1 "%i, " "\n"' $obj | sed '$s/[ ,]\+$/, 0/g' len="`cat $obj | wc -c`" } diff --git a/uppbox/UppBuilder/init b/uppbox/UppBuilder/init index 65268c8aa..2a6bf65ca 100644 --- a/uppbox/UppBuilder/init +++ b/uppbox/UppBuilder/init @@ -1,3 +1,3 @@ -#ifndef _UppBuilder_icpp_init_stub -#define _UppBuilder_icpp_init_stub -#endif +#ifndef _UppBuilder_icpp_init_stub +#define _UppBuilder_icpp_init_stub +#endif diff --git a/uppbox/lpbuild2/Makefile b/uppbox/lpbuild2/Makefile index db33d5ef5..b3dac63d4 100644 --- a/uppbox/lpbuild2/Makefile +++ b/uppbox/lpbuild2/Makefile @@ -11,14 +11,14 @@ ARCH="`dpkg-architecture -qDEB_HOST_ARCH`" ide: sed -i -e 's/IDE_VERSION[ \t]*"\([0-9]*\)[^"]*"/IDE_VERSION "\1-'$(SERIES)-$(ARCH)'"/' $(CURDIR)/uppsrc/ide/version.h - $(MAKE) -f mkfile $(JOBS) PKG=ide "NESTS=uppsrc" "FLAGS=GUI GCC" TARGET=$@ TIME= COLOR=0 + $(MAKE) -f mkfile $(JOBS) PKG=ide "NESTS=uppsrc" "FLAGS=GUI GCC" TARGET=`pwd`/$@ TIME= COLOR=0 ide-nogtk: sed -i -e 's/IDE_VERSION[ \t]*"\([0-9]*\)[^"]*"/IDE_VERSION "\1-'$(SERIES)-$(ARCH)'-nogtk"/' $(CURDIR)/uppsrc/ide/version.h - $(MAKE) -f mkfile $(JOBS) PKG=ide "NESTS=uppsrc" "FLAGS=GUI NOGTK GCC " TARGET=$@ TIME= COLOR=0 + $(MAKE) -f mkfile $(JOBS) PKG=ide "NESTS=uppsrc" "FLAGS=GUI .NOGTK GCC" TARGET=`pwd`/$@ TIME= COLOR=0 umk: - $(MAKE) -f mkfile $(JOBS) PKG=umk "NESTS=uppsrc" "FLAGS=GCC" TARGET=$@ TIME= COLOR=0 + $(MAKE) -f mkfile $(JOBS) PKG=umk "NESTS=uppsrc" "FLAGS=GCC" TARGET=`pwd`/$@ TIME= COLOR=0 install: # this is just a trick to rename files diff --git a/uppbox/lpbuild2/mkfile b/uppbox/lpbuild2/mkfile index b3690bf8b..b62681cb1 100755 --- a/uppbox/lpbuild2/mkfile +++ b/uppbox/lpbuild2/mkfile @@ -1,368 +1,367 @@ -######################################################################## -# __ __ _ _ __ __ __ _ _ ___ ___ __ __ ___ # -# ( )( ) _( )_ _( )_ ( \/ ) ( ) ( )/ )( _)( _)( )( ) ( _) # -# )(__)( (_ _)(_ _) ) ( /__\ ) \ ) _) ) _) )( )(__ ) _) # -# \____/ (_) (_) (_/\/\_)(_)(_)(_)\_)(___)(_) (__)(____)(___) # -# # -############################## USAGE ################################### -# This makefile is controlled through a set of variables, similar to # -# any other makefile. The prefered way to change them is via command # -# line, e.g.: make PKG="ide usvn" CXX=g++ # -# # -# All of the variables that can control the bahaviour are listed below # -# in DEFAULTS section. Also their default value is shown here. Notice # -# that many of them can contain shell commands (enclosed in ``) which # -# are evaluated before parsing and building each package. -# # -# For boolean type of variables value "1" represents true, anything # -# else is evaluated as false. # -############################# TARGETS ################################## -# This makefile defines five targets that are meant to be used # -# directly by user from the command line: # -# # -# all - builds all (default if any packages are specified) # -# help - shows this help (default if no packages are given) # -# simulate - prints all commands, without executing them # -# clean - deletes all compiled files related to given packages # -# dist-clean - deletes the entire OUT directory (including parsers) # -############################# EXAMPLES ################################# -# Typical usage: # -# make PKG=ide FLAGS="GCC" # -# More complicated usage: # -# make PKG="ide UWord Bombs" FLAGS="GCC .NOGTK" ECHO=1 # -# Show help: # -# make help # -# Silent mode: # -# make PKG=ide SILENT=1 # -############################# DEFAULTS ################################# -# List of packages to build (space separated). If empty, this help # -# text will be shown. # -PKG:= -# Paths where to look for packages. # -NESTS:=uppsrc bazaar examples reference tutorial $$HOME/MyApps -# Building flags (as in TheIDE). -FLAGS:=GCC -# Additional include paths for compiler (without the leading "-I"). # -INCPATHS:= /usr/include/freetype2 /usr/include/gtk-2.0 -INCPATHS+= /usr/local/include/gtk-2.0 /usr/include/glib-2.0 -INCPATHS+= /usr/local/include/glib-2.0 /usr/lib/glib-2.0/include -INCPATHS+= /usr/local/lib/glib-2.0/include /usr/lib/gtk-2.0/include -INCPATHS+= /usr/local/lib/gtk-2.0/include /usr/include/cairo -INCPATHS+= /usr/include/pango-1.0 /usr/include/atk-1.0 -INCPATHS+= /usr/X11R6/include /usr/X11R6/include/freetype2 -INCPATHS+= /usr/X11R6/include/gtk-2.0 /usr/X11R6/include/glib-2.0 -INCPATHS+= /usr/X11R6/lib/glib-2.0/include -INCPATHS+= /usr/X11R6/lib/gtk-2.0/include /usr/X11R6/include/cairo -INCPATHS+= /usr/X11R6/include/pango-1.0 /usr/X11R6/include/atk-1.0 -INCPATHS+= /usr/local/include/cairo /usr/local/include/pango-1.0 -INCPATHS+= /usr/local/include/atk-1.0 /usr/local/include -INCPATHS+= /usr/local/include/libpng /usr/include/gdk-pixbuf-2.0 -INCPATHS+= /usr/lib/i386-linux-gnu/glib-2.0/include -INCPATHS+= /usr/lib/x86_64-linux-gnu/glib-2.0/include -# Paths to libraries for linker. # -LIBPATHS:=/usr/X11R6/lib /usr/lib /usr/local/lib -# Directory to store intermediate object files # -OUT:=_out -# Directory where the resulting binaries will be stored # -BIN:=$(OUT)/bin -# ar command # -AR:=ar -src -# Command to create directories equivalent to "mkdir -p". The only # -# good reason to change is if your platform uses mkdir command which # -# doesn't support the -p option # -MKDIRP:=mkdir -p -# C compiler command # -CC:=cc -# C++ compiler command # -CXX:=c++ -# Options for C/C++ preprocessor # -CPPFLAGS:= -# Options for C compiler # -CFLAGS:= -# Options for C++ compiler # -CXXFLAGS:= -# Options for linker # -LDFLAGS:=-Wl,--gc-sections -Wl,-s -Wl,-O,2 -# Additional options for speed optimization # -SPEEDFLAGS:=-O3 -ffunction-sections -fdata-sections -# Additional options for size optimization # -SIZEFLAGS:=-Os -finline-limit=20 -ffunction-sections -fdata-sections -# Optimization, supply SPEED or SIZE to optimize the executables # -OPT:= -# Platform flag, added to FLAGS, can include shell commands # -PLATFORM:=`uname | tr a-z A-Z` POSIX -# Suppress all messagges # -SILENT:=0 -# Print each executed command # -ECHO:=0 -# Use dependency files. This will probably work only with gcc-like # -# compilers (requires -MD option). The build usually works correctly # -# even without specifying the dependencies unless you modify included # -# files (*.h, *.lay, ...) without modifying the *.c/cpp files that # -# include them. # -DEPS:=0 -# Run the executable(s) sequntially when compiled # -RUN:=0 -# Override default name of final executable (absolute or relative path) -TARGET:= -# Add flags from based on mainconfig section (1-based index, set # -# to 0 to disable completely # -USEMAINCFG:=1 -# Ask for some additional details during parsing # -INTERACTIVE:=0 -# Use colorized output, recognized values are 0, 1 or auto # -COLOR:=auto -# What color should be used in colorized mode, number from 0 to 7 # -HIGHLIGHT:=4 -TIME:=TIMEFORMAT=" time taken: %Es"; time -######################################################################## - -m:=[ "$(SILENT)" = "1" ] || echo -e:=@ #comment out for debugging -dbgparser:=-DflagDEBUG -ggdb3 - -thisfile:=$(MAKEFILE_LIST)$(.MAKEFILE_LIST) -color:=if [ "$(COLOR)" = "auto" ]; then [ -t 1 ] && c=1 || c=0; else c="$(COLOR)"; fi -pass:=$(color); UPP_NESTS="$(NESTS)" UPP_FLAGS="$(FLAGS)" \ - UPP_INCPATHS="$(INCPATHS)" UPP_LIBPATHS="$(LIBPATHS)" UPP_OUT="$(OUT)" \ - UPP_BIN="$(BIN)" UPP_AR="$(AR)" UPP_MKDIRP="$(MKDIRP)" UPP_CC="$(CC)" \ - UPP_CXX="$(CXX)" UPP_CFLAGS="$(CFLAGS)" UPP_CXXFLAGS="$(CXXFLAGS)" \ - UPP_LDFLAGS="$(LDFLAGS)" UPP_SPEEDFLAGS="$(SPEEDFLAGS)" \ - UPP_SIZEFLAGS="$(SIZEFLAGS)" UPP_PLATFORM="$(PLATFORM)" \ - UPP_SILENT="$(SILENT)" UPP_ECHO="$(ECHO)" UPP_DEPS="$(DEPS)" \ - UPP_RUN="$(RUN)" UPP_TARGET="$(TARGET)" UPP_USEMAINCFG="$(USEMAINCFG)" \ - UPP_OPT="$(OPT)" UPP_INTERACTIVE="$(INTERACTIVE)" UPP_COLOR="$$c" \ - UPP_HIGHLIGHT="$(HIGHLIGHT)" - -all: no-package-specified build - -do-build: $(OUT)/parser $(OUT)/brc.sh $(OUT)/color.sh - +$e set -e; $(color); B=""; N=""; C=""; color=""; \ - [ $$c -eq 1 ] && color="$(SHELL) $(OUT)/color.sh" && B="\e[1m" && N="\e[0m" && C="\e[1;3$(HIGHLIGHT)m"; \ - for pkg in $(PKG) ; do \ - $m $${B}Parsing package $$C$$pkg$$N $$B...$$N; \ - $(TIME) $(pass) $$color $(OUT)/parser $$pkg; \ - $m $${B}Building package$$N $$C$$pkg$$N $$B...$$N; \ - $(TIME) $$color $(MAKE) -j 3 -f $(OUT)/Makefile && \ - $m $${B}Package$$N $$C$$pkg$$N$$B finished ...$$N; \ - done; set +e - -no-package-specified: - $e if [ -z "$(PKG)" ]; then sed '/^$$/{s/.*//;q;}' $(thisfile) && false; fi - -$(OUT)/parser: $(OUT)/parser.cpp - @$m Compiling parser... - +$e $(TIME) $(CXX) -x c++ -o $@ $^ $(dbgparser) - -$(OUT)/parser.cpp: $(thisfile) - @$m "Extracting parser..." - +$e [ -d $(OUT) ] || $(MKDIRP) $(OUT) - +$e $(TIME) sed -n 's/^#://p;' $< | base64 -d | gzip -d > $@ - -$(OUT)/brc.sh: $(thisfile) - @$m "Extracting brc parser..." - +$e [ -d $(OUT) ] || $(MKDIRP) $(OUT) - +$e $(TIME) sed -n 's/^#~//p;' $< | base64 -d | gzip -d > $@ - -$(OUT)/color.sh: $(thisfile) - @$m "Extracting colorizer script..." - +$e [ -d $(OUT) ] || $(MKDIRP) $(OUT) - +$e $(TIME) sed -n 's/^#%//p;' $< | base64 -d | gzip -d > $@ - -build: do-build - $e for pkg in $(PKG); do \ - if [ "$(RUN)" = "1" ]; then \ - for target in "$(TARGET)" "$(BIN)/$(TARGET)" "$(BIN)/$$pkg"; do \ - [ -f "$$target" ] && break; \ - done; \ - [ -e "$$target" ] && { $m "Running $$target"; } && $$target; \ - fi; \ - done - -simulate: $(OUT)/Makefile - +$e for pkg in $(PKG) ; do \ - $m Parsing package $$pkg ... && \ - $(pass) $(OUT)/parser $$pkg && \ - $m Building package $$pkg ... && \ - $(MAKE) -nf $(OUT)/Makefile; \ - done - -help: - $e sed '/^$$/{s/.*//;q;}' $(thisfile); - -clean: - +$e for pkg in $(PKG); do \ - $m Parsing package $$pkg... && \ - $(pass) $(OUT)/parser $$pkg && \ - $m Cleaning package $$pkg && \ - $(MAKE) -f $(OUT)/Makefile clean; \ - done - -dist-clean: - @$m Deleting $(OUT) ... - $e rm -rf $(OUT) - -parser-clean: - @$m Deleting parser files ... - $e rm -f $(OUT)/parser $(OUT)/parser.cpp - -.SUFFIXES: - -.PHONY: all help simulate clean dist-clean parser-clean \ - build do-build no-package-specified - +######################################################################## +# __ __ _ _ __ __ __ _ _ ___ ___ __ __ ___ # +# ( )( ) _( )_ _( )_ ( \/ ) ( ) ( )/ )( _)( _)( )( ) ( _) # +# )(__)( (_ _)(_ _) ) ( /__\ ) \ ) _) ) _) )( )(__ ) _) # +# \____/ (_) (_) (_/\/\_)(_)(_)(_)\_)(___)(_) (__)(____)(___) # +# # +############################## USAGE ################################### +# This makefile is controlled through a set of variables, similar to # +# any other makefile. The prefered way to change them is via command # +# line, e.g.: make PKG="ide usvn" CXX=g++ # +# # +# All of the variables that can control the bahaviour are listed below # +# in DEFAULTS section. Also their default value is shown here. Notice # +# that many of them can contain shell commands (enclosed in ``) which # +# are evaluated before parsing and building each package. +# # +# For boolean type of variables value "1" represents true, anything # +# else is evaluated as false. # +############################# TARGETS ################################## +# This makefile defines five targets that are meant to be used # +# directly by user from the command line: # +# # +# all - builds all (default if any packages are specified) # +# help - shows this help (default if no packages are given) # +# simulate - prints all commands, without executing them # +# clean - deletes all compiled files related to given packages # +# dist-clean - deletes the entire OUT directory (including parsers) # +############################# EXAMPLES ################################# +# Typical usage: # +# make PKG=ide FLAGS="GCC" # +# More complicated usage: # +# make PKG="ide UWord Bombs" FLAGS="GCC .NOGTK" ECHO=1 # +# Show help: # +# make help # +# Silent mode: # +# make PKG=ide SILENT=1 # +############################# DEFAULTS ################################# +# List of packages to build (space separated). If empty, this help # +# text will be shown. # +PKG:= +# Paths where to look for packages. # +NESTS:=uppsrc bazaar examples reference tutorial $$HOME/MyApps +# Building flags (as in TheIDE). +FLAGS:=GCC +# Additional include paths for compiler (without the leading "-I"). # +INCPATHS:= /usr/include/freetype2 /usr/include/gtk-2.0 +INCPATHS+= /usr/local/include/gtk-2.0 /usr/include/glib-2.0 +INCPATHS+= /usr/local/include/glib-2.0 /usr/lib/glib-2.0/include +INCPATHS+= /usr/local/lib/glib-2.0/include /usr/lib/gtk-2.0/include +INCPATHS+= /usr/local/lib/gtk-2.0/include /usr/include/cairo +INCPATHS+= /usr/include/pango-1.0 /usr/include/atk-1.0 +INCPATHS+= /usr/X11R6/include /usr/X11R6/include/freetype2 +INCPATHS+= /usr/X11R6/include/gtk-2.0 /usr/X11R6/include/glib-2.0 +INCPATHS+= /usr/X11R6/lib/glib-2.0/include +INCPATHS+= /usr/X11R6/lib/gtk-2.0/include /usr/X11R6/include/cairo +INCPATHS+= /usr/X11R6/include/pango-1.0 /usr/X11R6/include/atk-1.0 +INCPATHS+= /usr/local/include/cairo /usr/local/include/pango-1.0 +INCPATHS+= /usr/local/include/atk-1.0 /usr/local/include +INCPATHS+= /usr/local/include/libpng /usr/include/gdk-pixbuf-2.0 +INCPATHS+= /usr/lib/i386-linux-gnu/glib-2.0/include +INCPATHS+= /usr/lib/x86_64-linux-gnu/glib-2.0/include +# Paths to libraries for linker. # +LIBPATHS:=/usr/X11R6/lib /usr/lib /usr/local/lib +# Directory to store intermediate object files # +OUT:=_out +# Directory where the resulting binaries will be stored # +BIN:=$(OUT)/bin +# ar command # +AR:=ar -src +# Command to create directories equivalent to "mkdir -p". The only # +# good reason to change is if your platform uses mkdir command which # +# doesn't support the -p option # +MKDIRP:=mkdir -p +# C compiler command # +CC:=cc +# C++ compiler command # +CXX:=c++ +# Options for C/C++ preprocessor # +CPPFLAGS:= +# Options for C compiler # +CFLAGS:= +# Options for C++ compiler # +CXXFLAGS:= +# Options for linker # +LDFLAGS:=-Wl,--gc-sections -Wl,-s -Wl,-O,2 +# Additional options for speed optimization # +SPEEDFLAGS:=-O3 -ffunction-sections -fdata-sections +# Additional options for size optimization # +SIZEFLAGS:=-Os -finline-limit=20 -ffunction-sections -fdata-sections +# Optimization, supply SPEED or SIZE to optimize the executables # +OPT:= +# Platform flag, added to FLAGS, can include shell commands # +PLATFORM:=`uname | tr a-z A-Z` POSIX +# Suppress all messagges # +SILENT:=0 +# Print each executed command # +ECHO:=0 +# Use dependency files. This will probably work only with gcc-like # +# compilers (requires -MD option). The build usually works correctly # +# even without specifying the dependencies unless you modify included # +# files (*.h, *.lay, ...) without modifying the *.c/cpp files that # +# include them. # +DEPS:=0 +# Run the executable(s) sequntially when compiled # +RUN:=0 +# Override default name of final executable (absolute or relative path) +TARGET:= +# Add flags from based on mainconfig section (1-based index, set # +# to 0 to disable completely # +USEMAINCFG:=1 +# Ask for some additional details during parsing # +INTERACTIVE:=0 +# Use colorized output, recognized values are 0, 1 or auto # +COLOR:=auto +# What color should be used in colorized mode, number from 0 to 7 # +HIGHLIGHT:=4 +TIME:=TIMEFORMAT=" time taken: %Es"; time +######################################################################## + +m:=[ "$(SILENT)" = "1" ] || echo +e:=@ #comment out for debugging +dbgparser:=-DflagDEBUG -ggdb3 + +thisfile:=$(MAKEFILE_LIST)$(.MAKEFILE_LIST) +color:=if [ "$(COLOR)" = "auto" ]; then [ -t 1 ] && c=1 || c=0; else c="$(COLOR)"; fi +pass:=$(color); UPP_NESTS="$(NESTS)" UPP_FLAGS="$(FLAGS)" \ + UPP_INCPATHS="$(INCPATHS)" UPP_LIBPATHS="$(LIBPATHS)" UPP_OUT="$(OUT)" \ + UPP_BIN="$(BIN)" UPP_AR="$(AR)" UPP_MKDIRP="$(MKDIRP)" UPP_CC="$(CC)" \ + UPP_CXX="$(CXX)" UPP_CFLAGS="$(CFLAGS)" UPP_CXXFLAGS="$(CXXFLAGS)" \ + UPP_LDFLAGS="$(LDFLAGS)" UPP_SPEEDFLAGS="$(SPEEDFLAGS)" \ + UPP_SIZEFLAGS="$(SIZEFLAGS)" UPP_PLATFORM="$(PLATFORM)" \ + UPP_SILENT="$(SILENT)" UPP_ECHO="$(ECHO)" UPP_DEPS="$(DEPS)" \ + UPP_RUN="$(RUN)" UPP_TARGET="$(TARGET)" UPP_USEMAINCFG="$(USEMAINCFG)" \ + UPP_OPT="$(OPT)" UPP_INTERACTIVE="$(INTERACTIVE)" UPP_COLOR="$$c" \ + UPP_HIGHLIGHT="$(HIGHLIGHT)" + +all: no-package-specified build + +do-build: $(OUT)/parser $(OUT)/brc.sh $(OUT)/color.sh + +$e set -e; $(color); B=""; N=""; C=""; color=""; \ + [ $$c -eq 1 ] && color="$(SHELL) $(OUT)/color.sh" && B="\e[1m" && N="\e[0m" && C="\e[1;3$(HIGHLIGHT)m"; \ + for pkg in $(PKG) ; do \ + $m $${B}Parsing package $$C$$pkg$$N $$B...$$N; \ + $(TIME) $(pass) $$color $(OUT)/parser $$pkg; \ + $m $${B}Building package$$N $$C$$pkg$$N $$B...$$N; \ + $(TIME) $$color $(MAKE) -j 3 -f $(OUT)/Makefile && \ + $m $${B}Package$$N $$C$$pkg$$N$$B finished ...$$N; \ + done; set +e + +no-package-specified: + $e if [ -z "$(PKG)" ]; then sed '/^$$/{s/.*//;q;}' $(thisfile) && false; fi + +$(OUT)/parser: $(OUT)/parser.cpp + @$m Compiling parser... + +$e $(TIME) $(CXX) -x c++ -o $@ $^ $(dbgparser) + +$(OUT)/parser.cpp: $(thisfile) + @$m "Extracting parser..." + +$e [ -d $(OUT) ] || $(MKDIRP) $(OUT) + +$e $(TIME) sed -n 's/^#://p;' $< | base64 -d | gzip -d > $@ + +$(OUT)/brc.sh: $(thisfile) + @$m "Extracting brc parser..." + +$e [ -d $(OUT) ] || $(MKDIRP) $(OUT) + +$e $(TIME) sed -n 's/^#~//p;' $< | base64 -d | gzip -d > $@ + +$(OUT)/color.sh: $(thisfile) + @$m "Extracting colorizer script..." + +$e [ -d $(OUT) ] || $(MKDIRP) $(OUT) + +$e $(TIME) sed -n 's/^#%//p;' $< | base64 -d | gzip -d > $@ + +build: do-build + $e for pkg in $(PKG); do \ + if [ "$(RUN)" = "1" ]; then \ + for target in "$(TARGET)" "$(BIN)/$(TARGET)" "$(BIN)/$$pkg"; do \ + [ -f "$$target" ] && break; \ + done; \ + [ -e "$$target" ] && { $m "Running $$target"; } && $$target; \ + fi; \ + done + +simulate: $(OUT)/Makefile + +$e for pkg in $(PKG) ; do \ + $m Parsing package $$pkg ... && \ + $(pass) $(OUT)/parser $$pkg && \ + $m Building package $$pkg ... && \ + $(MAKE) -nf $(OUT)/Makefile; \ + done + +help: + $e sed '/^$$/{s/.*//;q;}' $(thisfile); + +clean: + +$e for pkg in $(PKG); do \ + $m Parsing package $$pkg... && \ + $(pass) $(OUT)/parser $$pkg && \ + $m Cleaning package $$pkg && \ + $(MAKE) -f $(OUT)/Makefile clean; \ + done + +dist-clean: + @$m Deleting $(OUT) ... + $e rm -rf $(OUT) + +parser-clean: + @$m Deleting parser files ... + $e rm -f $(OUT)/parser $(OUT)/parser.cpp + +.SUFFIXES: + +.PHONY: all help simulate clean dist-clean parser-clean \ + build do-build no-package-specified + ### PARSER CODE (gzipped and base64 encoded) ### -#:H4sIAI+CLk8CA7Q7bVPbSNKfoYr/MGgJSFjYJle3e4sROZY4WerAULzsJgs8WVkag4IsKZJsYA -#:n89qe7Z0YayS8hW3epFEgzPd09Pf2u4Ycg8sKRz9n2KAqy3G/e7Cz+UIx5+UPCq0MRv9NfszwN -#:ousqCKAJg/7EWBDj0GLOh0no5nzbC90sY2c7i0EUBhFn4zjwWa/7W/fEPGOZ9bi4EAxM+r0wSI -#:BKDm+5z9PUNronJ0cnW+w0HvL8Buiz/MbNWXYTj0KfRXzMU3bjJgmPuA8PWfHSbDYvI8PqAEp+ -#:H+TmJj4+LT51prElHn7jXh6nyEwEFIK/uO2GYezBurN1lnQWk1E/DLytxQUBaFpbCGS2LZsRID -#:0l8JPJf48nnCBeW52nxYVntYzN/6dWtWmVlBiy9J7ne/Eoyk3Li6Msr61KeT5KI+JbW3e2yuKE -#:py4QvrgyEUtkTV2XXERX2jpBYepqMVVfB6C7vm/SGeJhAhs7DonFYjC0oESxLsbwXCSGdRMUzU -#:waON9oWOxMnJTCWHByb7FHJtcQKee+wwq48yj4MuIl9FhwAiwncea8CyLfHBNVYA5Gdhw4pmIL -#:MHClcYTYx5ILxECrNcxCBKStcJ4IETjtTrBNsg9gDziFhMaOk1wEVwWlAIk8lYQ2NgURsgcpIU -#:QX8qgiSPWu0YMhnSJOLoAQA2tj5/nMpJ0u4CwBSqoJc5h5tm6lXOhrYsPkOkLFA/PMokU0Ixc9 -#:LYIxjsFSCp3fPtspVcKRMtGmQOrCxoRFnZLLYMC6d+OmVSMSc2ANW3UDSMD4U3+UmIZhwZk/Fb -#:CCnHhZBb8BSwvYrJlY1gSsIJsJIiUsoCW8zwUTE0Y4SDk3EzJBwX3FFAT2ikHMNql+HIdsP+sO -#:k/zBnARn0w15HU7LYW1EoO9FMfE8E1NBHpcqcKbhmM1DZamSc/24NflPWVpC44kU2y+GnfrJ1F -#:hReJbhrLxhAjoKQLPRaMxUEE1DI/khY9sLufttV6wrAkPrKRWzI31D6ZRferCAA8xL6lZdyI3J -#:jaHhl/oGSyUjEkl9NitncceswdDJLIhFbh54nzw3y7dJ/jtm6QoE5gahEK5ABOhlQWPIh8N4DJ -#:JoIBxJ0xawuiuHEJ0JlzZtY0DyRft5Ma+vpzCaXODkFaIoXxubONB+Gat1FRWemJkJW3ZQ0cgT -#:02bWvTh5KNVCyGJBaQw+41YQqOb4NeoohL14mLgpr9K1lXycjc0i6pYoYOIN0I2EdmfoyiEhUd -#:qe1cLXAchRQ888HWMZVYpjgMgU7GBQ29iwZDDDSOY4XjWY1QJZLVrWjFxFZFQbRUrITGmCU9GD -#:anTF+Q1cWgQ8DI9KAo1AyAB9+xwGZUQ6DHzNh4OupbnNKkp5nd+UctcY13V1gxbKpAKGttsySl -#:dzWGZ00zROt9h+NHZDcD5w1i6kszzNWB4jL8siUdUy1YWnjtQ6ooFGtyO4Yqurkr+dNklBMCWG -#:IPIuqD2S+pMukueDF/g93bKGwrAAR2OzYlJqJVi/lzyYZPRoeFJiqHMSMZoZ2tjaZXtNk7tU8k -#:VgJOCRrzKCwivUvF14k6lzUEPpDamIXI+noBZvv3QxyFKmtX+PPByq3I7MFwAOHKuDk4B9UcvR -#:v5O3EjMANJUbeJZsLy5Kfk+46//mhpDfFmHBJjP2eRgMN1Hs9po28lqMqMLKcSBgKaswjE5hBm -#:lHFju3QeKgd7y7CUJumtkFjoC1S/xfvzI5hDmJJFEObjv/eG2hXsr3ZYc0E58bDcBKIamJNodD -#:eJoUzL84AzfMeEcwedEGemuXBnGtLRHm8AXe83TEhTrp3sWTnh6dRQc8cod5MgMHrOuevofijZ -#:g3vyDLOEZU8cW72IBAsYxafAkjfYg4tx2Fadsxv7xpb8FWySvkQUTsLKSoCeuedIAD84uFHMht -#:47AUfEqKuEhb34MNjIaV49QdJiTUQUwpvwoBylvKGSmzQmPkOAUBx2nXRKjMVDJSylEOyGNA7n -#:g0GrKjJH/sHfW6Njs97nbfwq/9P7owqyZPwYNwKMbOe//pHf3es1nvyGYfu6cMMQCnIw+jQMiB -#:C4AGm8hLlYvA84HjcKNrGEMgKKMBwER6kL9rMtrPTuNR6nEToVbZQIkD67lBE/E0i8i21lyTMl -#:mGaavcq9IwSZ3f5yAVuRpFA9AN0rBqrAG4ZpnZqYADoxgD8ziM73hqildBl+FbcRyGlyRgcZi/ -#:Ly5g7gfqVpkPvgXgefOn7+/lvGiaNFGgDg1POWjGQQhsksmpKLzvwNBPp+LA4RfqGyXjp1As3v -#:DMrOS8+oEwqHT182BBaeIZpSXCYOl5rbVWtHqkMoIW7ud8+Fjowd0NFbjyLYA5eBuOcrcf8lLD -#:MVIi53I5NnxwxJR6X1XXg9j1AVDbha0VXWz9lj/YqlSWCKlgZsJJK4+Q2QBoiSSzdItsjUJ93S -#:tWd6PBm8KLLuCMQ4mAlr+0y/dxWLyjvCt+1SG0hUcVaS9mG+TcFqRXxNNHcohLTUhlUbOWZAYW -#:j8ONDQFDKROSR+UpPa3IksUPpF9suG0rLzbFsSG4HwsOpWxX2dAZN6lPRIuGTYlOCQtG8NxhpI -#:yumY1Rk2aVTgooQUVERxQx7UuCvkDL5Tn94ma8B55nWomnPFumObXWDKeWlUElq3gxjdbbIP1v -#:kKJsoUKrbSOEoFXNqtACyKNXaQ4okGkZB9lD/2Kz3W5j1+3d/kF3nQ2cAeROkfk8iGwjNRQ3g2 -#:reQh0XLVNZHmDramCRgkUNB9Jd1zf79qaN2O2BOKCG08ffrRZWXQz+u+zG9W7RPtMULJIFwyTk -#:Qx5hZhxH7E40l2OgxTnknDkicVK5/ciqHHNKiVpVEuCqutG4Yk5RNcJjRlZKJTGN8+PjT7TrpO -#:GgfurQqXMN1QIgpNxJ0X2TbmUd3cudJ8ljNc76PPPSIKHUwA/Sjh6Pa64IRxGMwT5u8Wc/dVPw -#:WK7vD0L3GpwZpPzAhs1GGafalNr9IMNRlsfDEqGgv8Ncz+PgDgFgcH1LP8c2I1QlLGrLDhvATx -#:xcXIAdUEOwkhDQaFWlEjg995ojKO7TVO/2S1falc6lZHkVjjvLSfs1Ftgj6rUiYQuQ2Q0pILnK -#:Rla1SY5MOs6I0g5cSkD1doNc+ShKL3QnEOgq/YKyfsVYGLpwEqa0HjIAzcaEeydLqSfb0nQ2ZZ -#:ca4DCFHsDZeqYwGLQ8SIu7R+8oT16mRBnz5M6apftqBKPc/1HFg+W0WTY6YVF6kWpxG5Lr5SKW -#:ycQZXoXf11NqmXAIGswUYQSSdKp9y/xckP3iLH/pFEEjlEm3RO/VGi8oG6kZq+Sw/oZ+kK/BE5 -#:XA1IJDn4Yfli7wQHq7h91Ph7sfrrQg7d35wBpK+c43EdJmOqho5AEMMG20DG3hgMKVPGezd35w -#:MNEcgfyIWJuaIy2A5WPjnyAgQRIZQmvtjWFsAUHsEKopeATa8FPb2cIAoybiUJNFGCvMEGaaI8 -#:hoBTxqE/ny0pWTcgw03XkS6cryYH7H5FhQYK8ycscD2Ju/fBkZNntWxCcaJ7UOSEXbMXUobafU -#:drPI3sBhGcIVZoYtnaIFZoCAmIlXANFXGsJlzoEhT2oUPnUmJDlHo3S5MwGFJzaUS54Jh57aEA -#:57Joz040bh0S0RTCsmqGWnhhZTDEtZfiWjMI3Ly3/89JM8ePnBTdp8piV0OIqqc2kYnXkURSQR -#:0rGU1fuxzCllnKFUT8vkLEl9RtI2k1gU98Mg/6vYWqvFgusoTiEPAIsDLbybt3roghTjaBBc65 -#:zKhwWMhLP4lHqq4WIGHhrTRi7xg5gE14YdJWkkMP4vEfheuaGlDIO/+KcsgZwJ0BAWGIUDpy6C -#:sNNvrIUftaX7f3TnrMTUoTiqQiUwrWADuW1R7NfTfLamxELRMePYk8VgXETJQmLrmWhttTF42U -#:UtUziZPJ2NvMJuns4SE7FZl5VWSM1AoUlLx6BENgtBsVltcSkAWccUpZjw08U8yqLozAysUhqy -#:XhLiLvZPuR2p5MCqYP1e/RJpZulx6qXxZHFcKQXFcq0enKiHp1TPk0XytDI5m6iRK1XynDp5Tq -#:VcrZVnV8vFIclfRZk7UTVLiKLqrVbQVbmrqopWVGL2wAvjInLWP2ZVikLR2UnAmZrKUux6PkWX -#:NKQiaLmLxciLySsdddOqdMbfQVSAUtecnq8R/lpdghlgq5VRyQcxL+Mp1XxZnEKZlzblLYyxzs -#:5Ee3A8pTmYknKNZUcQYwUt+Oxsdtjn6grWaHwWulJvZD+PLz5fqfQ9cD7TZyspIfweJ3Lq4Kpo -#:wXnWTluqHYw3Nq8cnBZpjVAfSn7FlFf5BpYBKBXg5d42YW/plL1lDcdoGg2JuuxCPKmLHsduCo -#:IshQ3p9Q5LbqnWk+QwNE7coSpOhTJQWR/aTJWckDFlIr0C14a4xLcrJlVMton3fWLfs/TPo1A0 -#:7IBFuVQzeGwbnv9ao3gnZ3a1mT/EjDDCT2saVFuD+nlNVv4iZBy6uXeD+qd1/CgRur1WvUnNfy -#:1LZ1vcSyiXZzYu6UwsMYscggj20Whp1VGqrdEzAUtmApJIX8u0s7Iw0/lQ3l59Z2iX+kaCzei7 -#:nqU+NArPpdqm/hQ/M9mcE/TpREV6GPiWfv1KsaDU8DMw8XlbqICui5/Lr74mbN5x2l+/oopdwI -#:+rpkoDiYJYDKYkCMEJ+pP0ybnVxTCQqFdXA99xjMPd/Z4xwWnt2wJ939R0YhdoTFeJ2jnWTl+I -#:nUm5t68s8YmNQtLymvZirtXyttXViVRuVerbVGookb62k/6UXYCSvWgTuNv6HjQ+vn6dYO3rXN -#:YAdjZr3bEbQlSX7r6I7+Ad6qYHQ03q1i87ql2vqX0x6zgfu6ed+kfzeowHRnFFtSG+WIT2Hexi -#:WCwrPgSqr66mZYiAXtKT5OqK97Q438opB9NM+EX3DH7/tdtj4truFpTQWDc/q31MrZtLNvtvgN -#:Gt3tHkSVBcB7N8y5Os3jwpxY+GKawNe3A4UdicQIeIqQkD1S5HR0IrKD9riobb7bUtGy4IW4sX -#:o8n7IYSoicXulAiGPCnlKQEhntlEV+9RybRnRMxUYMtPAVXKo2kElYhGMiMoAy/yIe8CV9IW7a -#:uQ0ma7JuCUD4L7iV7fN5KTx9r+x3LbcqMpBHdmNATuxljtc1rjTJ4+IkKTzUydldHQE90VbH0b -#:56dddJ57794btrFpFLd86OCzzHOjgfkMS2zjlW/Yq5FVul/0ck2qlcuNOFJ56tfDf3fTSKo382 -#:OeRWs5FHOQ4OYx63PmUtqh2llN2TmSJIpCRXXhi2YpkOCp6+XBmGtb2u+ddU929872f+vCntoG -#:MAU7U/d0lrVFMmxHTvQm2tjcEllc8RHV1CEfVZNzxsZlQSC3bRyOwjzAzFV0GUYpfbHImDt2gx -#:C/Xtqw/RC/acQRVxfgVTopaxi6KRFszyBYXicuiDL2KrDY2qtsbYt+ohghobSfdRSoVPqAyoSr -#:iNYttkelmEj1mIl/dgDyZm7GMjgmrkpx8AlhkOVWuQeF5CPUnnKTmLhfvPKvtpCjSiHDqmIDU5 -#:YfKhTdWfTYxaVxaRBGq+wqDwbhKLvBK/nF3b/+aHDx+p8/ilwbu+eZCUM2gzE4g9wPItVdxDtc -#:dHsD5sXXcorlwgZoDdkAAyNQFWQkS7/qZkAXAVxIA2s8oVcAVKZ5EWatVCZEbJvN0il1M7FyXN -#:GVMkGaF6VbYotWJF2ldIzzjDrS1Iqb0oSeyNmYUqZEOBmRl4kCRZ2NDEzJNDfvqw9GL6ekcs2i -#:091URbXMAakZISFku6A8aSWRElTmgJN+thY4Slf70kQWWQ3AsaE2EN1gbhorTUkClgyWUJ1J6g -#:Vefw4fKjDUgQGnHQis9SKaD4uT+U6KRf9mPlWr6D1NmacApRJj1cOSCjsDWp60XbCufJNqe3wT -#:g80qste9Q0UA83etUCrdxMNXLIlTr9Yulc9iU06/evhPwhPogZo6/XqcVv1DR8W1o+Oz79Jv7U -#:wAl+PgZ1L0OArxZPRCH1iQdQzqcRo1hUZUWvOzuHCkr9v/ozt1mep4Ps1WR/nx5cXaKOEryoiY -#:i+bJJKBImyoyqzeLx86cRvEY72miPuADNucrfT7shWhdsXGlnTp349HtLO8zuenotrJj1XohVa -#:tBaRdjSONED6hSOGHyRUXdFj2a6p20kYxN6WCve3p2ClnVKEmy1GN99y8XYiykpDzlEUTpfATu -#:J3BDxu9d7NxlrHUTD3nrpnX4sAtrDEsvFqq43x3svkfc7/f22PvzfQQtLbgKenywe/bu6OQQoI -#:+PTvc/sIP93vmH6orFMrfH/dCYlhGrV2F3csFxGns8E+/KOLUxbJuWf0AJ+o5/ibm0uKS6nCRa -#:kTed5jyZvNSzVBQX3tDvLC1OaVM/Zx2oTelu7JKI8568cnspelwXm+oCbul0JKS6ZQ/Z+op5vH -#:v2q2XYP4mLpkuUEA19iO8rKwOjI94bzo/0VOa8FRRv908Aw48TGP70g5S+1gCqP0tc/5yHCz+M -#:T2Xnz76b8SnY5nJ2tn9G6P41Hx2D/A0yxrWsddG8uvi/5tX6Squ1phH5aR6Ro/MzIYGfJ2Vo/r -#:Lfs1olon9piEo4OMmlxVZrYWHFhBrr4Pxt17JXzGWL8dxr0qfy4koTsPnAc1j6tFS0boWSPGka -#:JpTrZBSqO8ksHWExMaXAX9Jv02r+DBdYnYomOnXFrUETeKslPrCy0AVSkIzn9KWVOvSBF+QPS+ -#:KCLeDTLpfIG7FlR2SpcmltqbiUC74UStsN+lRfAVpY6TLPZysm1L631w3jEzge7IwZS+LOrfxn -#:cO8mZpcGPoOnCR9ob6KW6I+C0GcKPWT9PGH15eadKlGL22cRsJ7wNKAbZyEbcBc44tal0amvbu -#:BpGx1IkGs7irP8f7olhf9/vqdvsU66MMAKcd1owOYbVYSGH7Nv7ob2AKUiGq6+9m9vQ26B+VBk -#:y42QMQm/TnFwa6vw75rFQHiLR3mZeZ2fQaRp5cOk9QnGDd18hu4tx6+njljTMFqHcoTkJu4DDd -#:W1SQVtG3cCCzYMhwPhW1Sl9c4FCB9bI7iG7t3JtiB7VghocdEXlG4DA4pEMsRy9Qd2VgrMhdA8 -#:xM8ybhg+sGsecVFOK4x0gq8y1YQBclV9QHRQ01f/pp8uXgKjw9gPBg8syMXf8xOjGHMFU9Ss8X -#:miNWnedo9P9e6MgvLiME41uL2jg6OTGqD6riECcYZDtboHpgiwkjSAB8aYeAppAsxbKvx+83IW -#:BVdJC8vjjX2joW5iTUECoC9CAe8CQbkjyB0TN7+ZtqOwmKhu6mD/F7UpATJtX2JmKleKJHF1YD -#:QEaMEY5jifcpa6d/jUkSPmqhwgYuLvmUCXLn5uk0DkPdd8uM7wokMYg8pNLsukpuJKG4i/7Q8/ -#:dndPnFcBPR8e9c5+VS9vdz+qx1+PzksYyPrOuurttLt31HsLb4Zd01yWb+zkw08P3E0bmz+327 -#:YcGOJFWvnouw/qGRQ8LcaDAiTjnlLoipWBd9hyyD7rBgM5woyZPUp2Z01++DBvmqqvuQBQZ82b -#:P5i7em9vNlszZnZPZkwc/gcSqOMZk91Zi2bRnyXlGeOzZD/0nJVDGYjw+3wQou2t7K1sr/QujW -#:kLXLHA2WErv+xBsZfjAjf1boIxX+nh0n/PWOoBrS5Ey709i214bOOeeehjV7bZRsxW/o0zx8d0 -#:Ghabyqx3fy8xfPhQoGg0vg+Jcj2z9EH6kBnTPh+4ozDfElF6CkDz+Nej3sctEcS9kEOw8VBKHM -#:qETIV4ieUywvCgYXgWcRMihnJpYDWGTL+tVj+IwLXp8EVkUPXixtHrWSDSkAidgLdmgJZGRRj/ -#:v5Rj2W3jBp4VQP9AEBaszWolOclJ6DZxHSMO4CBA4qAHxy0UResqtR6Q5Lo9WN/eeZEccld20x -#:wMr8iZITm7M5wHh89NUVW3CwpdF1K1t4E2UFZj/3sfKSd+RAmx+BwEGGrz2bZ8NvwB2udhjr/e -#:9IrieqIoYIv8e9/by5MT5sYJciJiFbfDZ7YH8xj3YVD1xQbLyRQuSzl0zv/E88fFKibgwE5Pzt -#:6rnRzPNdtXtgnyIx64vohgX2EG1o66ZB/ATzImiymSwMd4RAbSjnWGh12nl89t7sY4e/vm7Bz+ -#:cJgXNsvt3GYjC5ZLjQ5hHs0t9aqmITcpeDBxXtri3bvXDEs7W9Kooal754QTHt1mrO1LLEGEPt -#:E28ARuDNd+oPHPT1LbUbcaUACxGf9zlJwdV1uzEvbEEdv+8JPyLX1Mjeok2iFkia53GY6dY05c -#:9S6/fMPUDTUl81xxlJpMDhX/JNDB4G6K2Wcw/qec8VuMb7zxZ7Z3swmwEWzQavY3wUxgAuZutv -#:3DAKfGlBxk+6ffB1MYM48Atcak45fpFsiZzfLmFkXoZZtz66XK/LqlujqaGUjeW2YfguaPwsae -#:0gBQzUO4Ut4DqDJIc7SwMXjdliMMZMu9RhAaOiDgoTUEUlyu4NMoaX4Dm7tTekkAva3u+yKLp4 -#:PH1Xddv6wyjAPkctwIc0SKbgsiYPSqRLPbvHoMeIXA7k1nxua4OETI6rwxijl0mFVbu9/ctywf -#:s5QqlxGG446XFgnhuhI9G14lLIMWwLlpngxlDaiyFnOHXHPLY8bMO+h2Nkygs+kvR4Z+07fhdt -#:9WzAzwubvzSbav7xQ8MuN2y/Wkj79+Mj+baBxQIvvxa8ZFitpgZxAOP8uGnlDe0cGQHbOo9z0/ -#:hZ0t0Rf4Ne/hfG77SwnBtaJYKHnDLRX/6lVOnYTXBDsLLJYjMyz3Vq3KCGEXGQw4KUYMn2ZdyL -#:DIKAZn+3Sa3M/ZkY7hwXrw4Jil0dDyPdF0HqOuofbR5Clwh2u7d8vgEJanKquuWMEcdIPFlCXr -#:cYg8Ug3PmUcOzddPlTUJM7lcAmDgCch6FsOm6oRL0Dm8wMakL4GqdD2UUFKEWoB0CX9x7Vt5+P -#:Uw9Je+XBbHDKyN0WSRTWpSofngcA1wlETUBi7eUy1SuXBnDRpUy/fRaT+J8RM9k2igziYjp4NU -#:w2obpF7LPAsJjoRH/UisZbQgev5OB3lUvH+B1h7fuSB8RuNHjiQswkdW0w+++z7Zq4Alv7N1NF -#:KHimZXihHNG6wUIqRpyPaT5owcg0tOLkhprZtz3P5ihs8+5v0ZbMOjIeUZ2u4wDtl5eali/s30 -#:QsZbq89UuzwwBxdFpkkcRZMQG/OHZiH8aKmMBYjq/ySIbEUKfFlOrPXTV297O5/toD2C6Ms5Ok -#:UbhEXqVgTyPkhI7YuKNsfxyG/a6Y49zho7cLs9/pDRfvqb94ZbybaJljT8k0+cF+BcgLqazBEc -#:NsMxrMtBuZhwCC0ipR7IJf0HxeiM8eT6LsxfJ26ABAqdtBU3Nkewhvgn4ksquoGGDM4vwAE2Ui -#:ETrIGCTJspIJBgyyq50FKFjy+OP7w5vfChdu7X53ORKLcGx8WHrhs8JDx0JFSafKWabvDgeO5u -#:6HWDn2gNiE8ntFVJT/wt3uuVcLHb4DBTy/C5yZwbtP+XWLRSl8rOoN5IKJQz0lGczsanIFhU4E -#:HQa9i4DTn4NFbUokjawS/n8PbhjT0cPdPGqVigEgBBA9SFrWhf4nAI3XdWXK+XtyuQrtA+XXzl -#:1oZBUE2otsHTnfOwnw7cGtFNZz98FxzxnZMlctzlySnMOlcCM0d7+WJ0gHExxbzUeP0PuvHkJc -#:7A3wUv9gFuuQgMvysdxRHJiTK/GKr7b4EAigMguLLGtfpEPWSTJVtCqC+WJrqem2JdGdLRBMcM -#:47K1eYW/8MK2LR9IwQd4EZP4qh5o+evySm5Pw268cuBZ0/XUxn7ajK+nozi/hVEVoDC80lVycg -#:EhZwfNuksgR1fqRo8hFlT9C96lKgGmWwAA +#:H4sIAEZDOE8CA7Qb/VfbRvJn81csKgEJC9uk79orRuQocVre8fX4aJMCl8qSDAqypEiyCU3gb7 +#:+Z2Q+tZNkhfXd9fYm1OzszOzvfu/kujL1o4gdsexKHeeF3bneWvlNjXvGQBtWhOLjXP/MiC+Ob +#:KgigicLhzFiY4NBSEYzTyC2CbS9y85yd7yyFcRTGAZsmoc+OBr8NTs1zllufl1rhyKS/W6MUqB +#:TwVfhBltnG4PT0+HSLnSXjoLgF+qy4dQuW3yaTyGdxMA0yduumaRAHPvzI1Uen07mKDasPKINP +#:YWFu4s/Hpcd+E1v8x2+BVyQZMhMDhfCvwHajKPFg3fk6S/tL6WQYhd7WUosDmtYWApk9y2YESL +#:9S+JOJ/z6fBgTx0uo/LrWe5DK2+D+5qkerhMSQpV+CYi+ZxIVpeUmcF7VVWVBMspj41tadr7Ik +#:DTIXCF9em4glthrXpZfxtbaOU2hczafq6wB01/dNOkM8TGBjxyGxWAyGWlIU63wMz0VgWDdB0c +#:y0jfPttsXO+UlJjIqTTxb7zMQaIuV86jMFdxGHHydBCT3lnADLaZI7b8LYN6dEFZiDkR0Hjklt +#:AQauNY4Q+1RwgRhotYaZi4C0Fc4TIUKn1w+3SfYh7AGnkNDUcdLL8FpRCpHIY0loY5MTIXsQEk +#:J0URBXBCm/NXowpFPEyRYIMbQ2dp7OTdppC2cJUFBNmcPM83UrC7i+pjZMriNUMjLPLVpEM2LR +#:4xIY4xQsRen89vlOqRKOkIk2BVLnNsYt6oxcBgPWvVs3qxoRnwNr2KobQArGn/mT1DQMC878Uc +#:FycvxjFfwGLFWweSe1rBlYTjbnREpYQEt4nxQTM0Y4yoLATMkEOfcVU+DYKwYx36SGSRKx/Xww +#:TosHcxacNRvyOpyWw3rsyxcGbMOBADc0gij13Um2nubiVgzhUgnONBzzuaoslZKvK4B2Ig1LS2 +#:g8IyUQNezUz6rGisSzDGLwxiloLQDNR6MxU0HUhEbwQ+a3FwXu152zrhoM7alU1b7wFqWbfu5R +#:q/NtEnJ7dmPoCkoNhKWCEYGkPpuXs7hj1mbodlp8kVuE3nvPzYttkv+OWToHjrlNKLhz4CF7md +#:MYB+NxMgVJtBGOpGlzWN25Q9DOuZNr2hiQfNZ+ns3rywZG00ucvEYU5Wd7Ewd6z2O1rqLcNzMz +#:ZcsOKhr5ZtrMupekD6VacFm0pMbgb9wKAtVCgUYdhbCXjFM3C6p0bSkfZ2NTxeESBUy8Arox1+ +#:4cnTukKFLb81pAOwA5auiZp2Ms44w6BohV4Q6GuY0NS4Q3jG2O41XDWy201eJnzchljEa1kaS4 +#:zKQmOBU9qMZbnN/ApSoEYsCUEmiHXAbo7RcwKGLUYehrXh10LStsVlHKm+K2lLvGuK6rG7RQpB +#:kwtN0Tcbua1TJjkGVJtsX246kbgfOBs3YhwQ2ynBUJ8rLMU1ctd2099oXWEQ00uh3OFVtdFfzt +#:9EgKnCk+BLG4JfdI6k+6SJ4PPuDvZssac8MCHO3NiknJlWD9XvpgktGj4QmJoc4JxGhmaGNrV7 +#:01Te5CyZeAkTCIfZkjKK9Q83bRbS7PQQ5lt6QiYj2egly8/dzFIEuR6P498nCoYjsigwA4cKwO +#:TgL2JS1r/0beSswA0JFu4EmwvbQk+D0NXP83N4KMV4UFm8zYD6JwvIlit9e0kZd8RJZajgMBS1 +#:qFYfSVGWR9Uf7chamD3vH+NowC08wvcQSsXeDHrIQPYU4iSJSD2873Ly3US/G97JBm4u92G7BS +#:SOqgzeEQniYF84/OyI3yoM+ZvOwBvbUrg7jWlnBz+AjfRTYJuDrp3sUTnh6dRR88cp95IicHrO +#:uevgf1RcybH5FlHCOq+OFdbkCgWEYtvoKRIUScu77EtO2YH1/1tmCr5BWKMCZ2WhlqwronHODI +#:/GghB2LbOCwEn5EiLtHW92ADk3HlOHWHCSl2mFARIEOA9JZiRshMaYwYpyDgOL2aCKWZCkZKOY +#:oBcQzIXRBPxuw4LT4fHR8NbHZ2Mhi8hr/2/xjArJw8Aw8SQHl2cfTvo+Pfj2x2dGyzd4MzhhiA +#:04mHUSAKgAuABpsoSpWLwfOB43DjGxhDICisAcBEepDRazLaz8+SSeYFJkKtspEUB1Z4ow7i6a +#:jIttZZEzJZhmmr3KvUMEE9+FSAVMRqFA1At0nDqrEG4DplZicDDoxiDCySKLkPMpN/croMv9Rx +#:GF6aGjx/X2ph7gfqVpkPvwbgeYunP30S87yN0kGBOjTccNAsACGwWSYbUXjfgGGYNeLA4WfqGy +#:XjZ1A+3ga5Wcl59QNhUPvq58HC0sRzSku4wdLvte6aav4IZQQt3C+C8WelB/e3VPKKrxDm4Gs8 +#:KdxhFJQajpESORfLsQWEI6bQ+6q6HiSuD4DaLmyt6GLrd8GDLYtngZBKaMadtPQIuQ2AFk8yS7 +#:fI1ijU171idTcavMm9aAtnHEoEtPylV35PI/WN8q74VYfQKo/K017MNsi5tYRXxNNHcohLTghl +#:kbOWYAYWT6ONDQ5DKROSR+UpPS3PkvkfSF9tuGdLL9bg2BDcTziHQrarbOxMO9Q5okXjjkAnhQ +#:UjeO4wUkbX3MaoSbNSJzkUp8KjI4qY9iVAn6Hl4px+dvPgCDxPU4knPVuuObXuHKeWl0Elr3gx +#:jdbrMPtfkKJsoUKrZyMEp1XNqtACyKNXaY4okGkZB9nD8HKz1+thH+7N/sFgnY2cEeROsfk0im +#:0jMyQ3o2reQj0YLVNZHmEza2SRgsVtB9Jd1zeH9qaN2O0RP6C2M8S/u12suhj877Jb17tD+8wy +#:sEgWjtMoGAcxZsZJzO55uzkBWkEAOWeBSJxMbD+2KsecUaJWlQS4qkE8rZhTXI3wmJGVUklN4+ +#:Lk5D3tOm07qJ86dObcQLUACCl3knRfZVt5X/dyF2n6uRpn/SD3sjCl1MAPs74ej2uuCEcRjME+ +#:7vDPYeZm4LFc3x9F7g04M0j5gQ2bTfKAalO6AAAZTvIiGZcIOf0d5npeAO4QAEY3d/Tn1GaEqo +#:RFbdlhI/gTB5dasANqEVYSAhqtqlQKp+feBAiK+zTlt/3clXallylYXoXjzgvSfo0F9hn1WpKw +#:Ocj8hhSQXGUTq9o2RyYdZ0JpBy4loHq7Qaz8zEsvdCcQ6Cr9grJ+xVgYuXASprAeMgDNxrh7J0 +#:upJ9vCdDZF3xrgMIUewdl6JjcYtDxIiwfHbyhPXqZEGfPk/pql+2oEo9z/s4wHy1mnbH3Couwy +#:0+I2JNfLKpaJxBk+ud/XU2qRcHAazORhBJJ0qn3L/JyT/egsf+yroBGJpFug92qNF5SN0IxVcl +#:h/Qz/I1+CJCmBqwaFPw6umSzyQo93DwfvD3bfXWpD27n1gDaV875sIaTMdlDfyAAaYNrqGtnBE +#:4Uqcs3l0cXAw0xyB/IhYa8yRWmD5eBVAEJAg8Qyhu/bKMLaAIHYI5RT8BNrwp7az1gijJuKQky +#:qMKTOEmc4EMloOj9pEvrx05aQcI013Hnm6sjxa3DE54RTYi5zc8Qj25i9fxYbNniTxmcZJrQNS +#:0XZMHUrbKbXdVNkbOCyDu8LcsIVTtMAMEBAz8Qog+kqDu8wFMORJDeVT50KSczRKlzsXkHtiQ7 +#:rkuXDoqQ3usOfCCD9uKI9u8WBaMUEtOzW0mGJY0vIrGYVpXF19/+OP4uDFFZyw+VxL6HAUVefK +#:MPqLKPJIwqVjSav3E5FTijhDqZ6WyVmC+pykbS6xOBlGYfGX2lq3y8KbOMkgDwCLAy28X7R67I +#:IUk3gU3uicih8tjITz+BR6quFiBh4a00au8IpMgGvDjpQ0Epj+jwh8q9zQUsbhX8H7PIWcCdAQ +#:FhiFA6cuArfTr6yFP2pL9/8YLFiJqYM6KqUSmFawkdg2L/braT5bk2Kh6JgH2JPFYKyipJLYes +#:5bWz0MXraqZZSTKbL5yCvsFtk8MRGbdVlphdQcFJq0dAxSZPMQqM1qi0sBiDpGlWLcT6t5lIXq +#:zIysUhqiXuLiVvun3I5UcmRVsH6rfvE0s/Q49dJ4tjiulIJ8uVYPztTDDdXzbJHcVCbnMzVypU +#:peUCcvqJSrtfL8alkdkvhLlbkzVbOAUFVvtYKuyl1WVbSiErNHXpSoyFm/zKoUhbyzk4IzNaWl +#:2PV8ip5tCEXQchc9mZ260RzzwhcXbqQvQ3bJ/4nnITAt3gGpsvgNRBEojc3m/I74qdUxmDF2uz +#:mViBAj8yCjGjFPMigLs454xzHV+ZhpJ04bmokZKeNUdBAxttCCD85mn32ormDt9geuW/XG99P0 +#:8sO1TPdD5wNdcwmJ4v0dz8HDa9Wy86ydnlBTGG9vXjs4zdMgrm6ULPMpr3JnlgMoFezl3jZhb1 +#:nD3vK2Y3SMtkBddi0e5VOREzcDQZbChnR8h6V3VBsKchhKZ15hqVOhjFXUkzaTJSpkWDlPx8AV +#:Ii5+18WESoq28r5P7HuWfp0KRcYOWKBLNYbHtuH3X2sUH8XMrjbzB5/hRvt+TYPqaVA/rYlOAQ +#:8xh27h3aL+aR1CSpzubmQvU/N3y8I5q3cM5fLcxiX9mSWmyjmI4BCNnFYdZ9oaPXOwROYgiAy1 +#:zDwvCzmdDxkd5L1Er9Q3EmxO94CWvJjknk62Wf0GvzTbzOP06UR5Ohn6lv6AS7Ig1fADMPFhm6 +#:uArosfyltiEzbvOL0vX1DFLuGP645MG4kCXwymxAnBCfqz9MkZ1sUwEqhXV0PfcYzD3f0jY4bT +#:2l0E3YdqOrELNJpVonaOtdPnYmdC7r1ri1/JUQhbXtM+zLVanre6OpP6rQp9a6SGEhlqOxk27A +#:KU7FmbwN3W96Dx8eXLDGtfFrIGsPNZG0AIgCxAuHuVD4B3qJseDHWou7/syPa+pvZq1nHeDc76 +#:9Uv2ek4AjOKKagN9SaUCO9j1sFiuLg7lLa1pGTwBKOkJcnXFe1xabOWUs2km/Kx3Cb//Ojhi/O +#:HvFpTcWGc/yX001tklm8NXwOjW0fHsSVAeAGb5OkjzerOlFD8aJrc27NnhhLI5jg4RU9MGquMA +#:HQmtoHyuwxt0dze2aNAgbC1eTGbfkxCiDhbHDREMeZLKUwJCPLOJrt7TEmnShJipwJZXB1XKky +#:aCUkQTkRGUgRf5EK+JK2mLdosktdmuCTgLRuGnmd7gV5KTz7X9T8W2xUYzCO7MaHPc7ancZ1Oj +#:TZw+IkKTzU2dlcnY490YbJUbF2cDdJ57b34xbGPTUK+C6ODz3HPjkfkES2zjhW/Yq7FVul/0ch +#:2qrcuNOEJ56g/Mf3ezWKg385Mgj9cKKP4gIS4SNgyYS2mHbH91RKdJkFCFjezaq+YqkAgy1yvC +#:aaBtaf/ofHC6u3e+/9sA9tQzgCnYmXzXs6wtEmE7duJX8cbmFs/i1KWrqUN+lk3RORsXBYTYtn +#:E4iYoQM1felZhkdMORM3fqhhHedtqw/QjvQJI4kE/oZTopah56WRFuzyFYPkhWRBl7EVps7UW+ +#:tkV/ohghobSfdBSoVPqAzISriNYttkelG0/1mIn/cAHkzdyc5XBMgSzdwSdEYV5Y5R4kkndQq4 +#:pNYuJ++cK/3kKOKoUPq4oNTFlcbEi68+ixyyvjyiCMVtmFHo2iSX6Lj/rVW8HhZHT58h8/8Fwb +#:u+25CUM2gzE4g8IPY9mNxDdf9NoD5q3yWTC3AVpDNsDACGTFGYtSsboZ0EUA59LAmpDrFQCVaV +#:6MWSuVCTHbZvN0Sr5krBxXfC1NkOZ5qZfavHVJTy8d4yKnDja17hqa1jM5G5PKlHInw/MyXqDI +#:sxGBKW1y8768YHo+JZlrqs54RxbhIgek5oWAEO2F8qSlREpQkQPO+tla4Chd7XMTWWQ1BMeG2k +#:B0w4VprDAlAVgyWEL1Z6krvP4CPmRgqAMDTjvkWOtFdDBWJ/ONFFW/ZzFVS/WqGuYpQMnEWPa8 +#:hMLOgRYnbSvWpW+SbZKvYrBZRfa6d6gIYPGuJUqpm3j4kiV+6tXapXKN1nD61cN/5J5AD9R0M6 +#:DHadlvdGRcOz45/yb91s4EcDkOXquix5GIZ6MX+kBF1jGoJ2rUFBpRac1S9UBJX7f/x6BxmeyQ +#:Ps5XR3FZ82xtFPAVZUTMqnkyC8jTporM6s3lqbOgsTzFd52oD/gDm/mVviD2QvReWKX9unDj8d +#:087zO76fiusmPZeiFVq0FpD2lI43gPqFI4YfJFRd0W/TTlN2kjGZvUwaPB2fkZZFWTNM0zjw3d +#:v1yIsZCSBlkQQ5QuJuB+QjdiwScXO3c5694m46B72z182IU1hqUXC1Xcbw52f0Hcv+ztsV8u9h +#:G0tOAq6MnB7vmb49NDgD45Ptt/yw72jy7eVlcslbk97ofGtIxYfnK7EwtOssQLcv4tjVMbwzZr +#:+U8wQd/p33LKHicJlmdNZ0WQNj0BknfSY1/086ot7ae8D3Wp9o7WE69zr3h763JTvtWt+BvtPT +#:7k6Svmye75r5Zh/6iepLaAIAT2lZURv/Hz2s4P1VS3sv71/iks/6G+/E8/zOhOB/D8qRD9YwEi +#:vDxvYuTPoZsHs6gW8XS+f064/rkQF4N8DTLEtbx72bm+/E/nen2l210rKfy4gMLxxTnf+E8zcj +#:N/3j+yugrLP0ssCgj7Cd1uq7ViQjF1cPF6YNkr5rLFgsLr0B26eusE/D0Ehf6UidSh7JVzFTqd +#:RPKdMssmWDA0FvHlA1vNZSG81dfVzakrZw3Yom47v3FlkQt0INsu6OqVWvChFxYP/MEtYNMem4 +#:gXspWmZeXlGH+7Cp4SCtcNurjXQVorA+b5bMWEwvbupm28B6+CbS+Dv78V/xmBd5uwKwN/gxeJ +#:HmhXvE4YTsLIZxI5ZPRBymqrzXtZfaqHaDFwnQZZSI/PIjYKXOAnsK6Mfm1xG0/X6EPqW91Mkh +#:f/x91I7P/f7XyNbTr+EVZ960Yb9t2uoDP8hH11J8Q/VH9om9rSv7sFwT7zoWrmm3gUb5l5VNva +#:Ut66tA2IVcmkKNOoi3MIG91inHbfw7hh6XcfdwHenDp8SdvoHooRQz2YHMsXkxLYNu7Vs8kxf1 +#:cjS6Y3UOyDuRcJPjqL6cGd6O+xJ7l85h/P4z/aEQjGWHN+x85LGbkQX8d4t+JG0QO7CeKA18QS +#:Gx3Zi1x2UoBU5fgRG9Tl1X/ZT48tgcdx4oejBxYW/F/1E488boqurh+kWpvl9eDkrNpfISAviZ +#:JMA9s7Pjg+rcLJewkeSPPZN4wwg2CVkA9uFePaGQR5mK7f9c19iUXtLE4HS9uNfaMtX13NogDI +#:5yCAb1qudgI5X+oWtw07ieR4dTMH+z/LzXCIhv3wiSZ+JDni58Boc0jBEmYl7wuWuff4q88HzF +#:Xxbcl3wD6ozeVPdK8onrEW43WG7xiiBJRrZlEuVBLX2UD29XD8brB76rwI6ffh8dH5r/Lj9e47 +#:+fPX44sSBnK084H8OhvsHR+9hi/DrqooKzZ2ivH7h8DN2ps/9Xq2GBjjK1nx03cf5G/Q5EyNhw +#:okDzyuuRVbAtvfcsgCa2YBAb55Yo+y0jlzb98umKUiadE8VEMLpg8Wrd3bm8tR88TuafP44b8h +#:5zlpnhvMWTKH9BzBNg/PkfbYc1YORUDBq/MwQvNa2VvZXjm6MhrgXQ7v7LCVn/egDCsQ3s2823 +#:AarBzhyn81r/SA0gBC3t6exTY8tvGJeeg3V7bZRsJW/oUzJyd0AhZr4tT79EkgePtWYWi3vwmH +#:9CtzFED4iOZZPxi5k6jY4nF2dr5z8uvx0bstHoW9KIDY4aF8AkjicxmjBZKrGN19ieCJhz8IAN +#:JfgXkYIke2usMwBr+lgStXLyu4jeOXcyCExRAyDm41Q5bWQ/i+Zxuj0SSmVvKG+Fd3OYyBO3LV +#:9xxM0s4IES7izxIgwRqH/y3l6HqbyIHP7a+wrEZk2XwVeFrdHpRStUhFSNDTPZQeCiHp5a5Joy +#:RQeCC/nfmyPbY3zV2pVGXjnRl7Jzueb6/rJ4OHkz4PK/zzptPtXo8UARyRj7edbfw4Zk4cIxci +#:NvE4vFvNiEeoUmEb766wFUyhskDDzdm/WDvcXUT4Durk+Oyt0slYkmxf2AbA91gqfRGBvsBcqK +#:3apOjhK9mA3TFSwMtoPobRXm6BVarjy6e2dFOcvT49O4d/nOWZLUo7s0VlwfxIyRDi4czSTTU0 +#:4KEADnbKc9t98+YVg5LKSgYVMN3dOFmES6delWGIfYNwSzYWuAJ/gxs20FTnq20NGShwMIofHK +#:hmd9Lm5UrbInmZ4+eDWtTYEEKG6ArXoUxcctIunvjpH8ycNETvFxIjjmKP3LlzN8bEL1jpY062 +#:zYc33m4z67vpCHgHpuNk+o1gRjC3uZuu/zbAnyHl5diK6fXAgMWkH0AtMd/3abwGcmZ1e/MF5e +#:U5Z7VrlXN1z+g6XqYgZa85AAqQ5U7Q2J3pA6a5B1XacACTp3Am/KuXpxWyPGTUNpr5RV4RE8d+ +#:m+KYEW38Q9CcfhwypoWj4YXD9GQRUFKCP4HXraan79vSFd/lcfHIOGph0fqm7XlWh1mAWolKtN +#:zfi9QMw6J3JbrBlpMdsAuEda9QYWyJD4bwRcZLo5hJ9azaFvbcZOmQZuU6QhC+eNmTmKzr0bPh +#:FYFHoMXzjxpaJ6izFnOB3HPLYeKIawft1orRW6vebWXoO71xorb3YjaAt92ejYott07ANTNOzy +#:5HPfz2m/ndRLPAZrQVPTNIUswG24Rw+JoNgYTwhmo8Nsyczv/5KsFv2Xrw/d3C8tL2bm1TQ9J+ +#:CMqPv607E9mZwo8DWgke0/ri9dqqxzHWF7GbCCOBj6DTvAmZIgWF2GyP6sfdWh3dGBzsDQ+NaR +#:YFHNJLu0hroC0EeXoel6Efsn4OUnmKhdQT0BZy0A62VRE/h0PjSVIsZ0cJkm+TqjM5MqX0+hu4 +#:AqKOraCDRYQEmSMKbG76PqeJbnoSOoHMHuBcwn/c31Y/+vzI3659RyxO6NkZI7lcUb4DBqSQc0 +#:zAqiRY1ndRnck8efejyoCHU9mPseNNJNldWquC3BAS/MXay7SWaJYEnAVr8khoeSYvW/6oBrlU +#:7H6GpiAfpcC8RetICgfmUdeIlnx380esd4APH9l0qlTZz271Kp0FTfq1IWPG0JIz81KY3eUUtD +#:9n4YMPWn8Am/Fw4MubUIeTAVjWKlrfTC7ko9WOmO4c96zAxYJpCYd6CWJ6/soaJO+p8gwgjw8j +#:hwxFAnzqTZwPT35wMHJcioJ2fCIu5W2KMIiFtJ8kRxSkr1Ck44aVU7yp1h0WTeOoM4/eFaQU/3 +#:Ku8F6i+9Cyhg95nfkMR3EG8u2vRGjQaEN4HgcVVRaCh4FkOiB79AkbnpjmydFbmEvOS74EnczB +#:G1siVB7ORGxJCucUZGJmuYNrokGWU44vC2Z8hGFceTxuj1Qx4Iujd6cnFy5KzreTIlkeDM6LT9 +#:nmLhLW/QiNHRWUMTRWvg2c9Ps1ZjC+qlK14KiCDf8A3JjWp7oWWb3PFJY8oNy+xPSUDlLyAbVS +#:oHhNpUM1rZVPGbAwwIVgp8ioURz4fmoaYpjs4OU5/NbwE90bGtNmpNiKEuhAU9GFpUjHcNiDTi +#:XrXi9vvyxAhML4eP6ZR/M5cA8IQ/3HG+dQP+67x0OnnN3uTfC7N05kyE2XK7cRZgwJbKy2scTo +#:wOF8jLmj4fI7Ou3kH07BzQXndTujXJiFfyMVqRER0WlYjML9J6cffX4EVgaz3hRxl7Hxs1qCz5 +#:6Slricme5yYmjbJTDiEzeUzSYFn6S25soPvADuj+IzdGDk6+WVHGuGt/EsgCdNJ0kb+8dqeD2u +#:4hwURk6AwuBKt6/JyYCcuDPLNoEcXqmjNga4tJ9nOaOTUVsAAA== ### BRC parser (gzipped and base64 encoded) ### -#~H4sIAI+CLk8CA31UXW/aMBR9z6+4c70GKMENnSZ1EZXoW1VtmrqXtYSBcQzJBk4Um3Wj7X/ftR -#~MItGh+IP645/r43HM5ecdmmWI69U7ApJkGLcqsMCBy9VuWRkNvVgqYZ0sJmTI59OqFXmeGz3Ay -#~z0sMXhXZkpssV5hmrflCfgLE9XTqol2OK8jXplibnvA8LQ0E0hMJkGmSlYqvJNBwSrz5gExnXM -#~tmxzOrAjdXv4xcFRAkNu/kuxt4qmUCvmajVrs7ZsAWkWZxyZgPdI4XUsSyopQFLzEQU+XXmWq1 -#~4ckDHALvAdrHd7mlHQ83X9uQz34OHBInvcUmwkADhIYEnmGxyZDEpc2NpxBFO+j1Q/8VdLbpH2 -#~BniO0fB3fa+GPBLrQ+kJoLN0nln2RtHy/BJ7EhEH5kIZD3WRcIkFgRv0r4DE4OinpAdxyfUdaF -#~c7bwXZKlVCijpVPHPgoIBEr44nnXN1+Gd/c7YaRIcyDaYEEFiJSXWInJaAwDeCIuwOmIz+oToB -#~d7kJeI7K0cskNDxCH+4AitZPeQ08Kk9hxnEYkaLpPPw2+3TaUG5+5rvVZbEQsXQZI38lew4d3d -#~8B5TAxVoARtaE6zS0FbLnpxBCO32bt/GaZTefWMVm7iax6RbkU5yJRv2WIb6bdg5E75cThywEm -#~ibxErRvMbR+r++tH9M4QtU+MMRhUcQbLB33CblZcn/autOtLrrGhjD6SlU+9ZT25j9Grg7nfIE -#~rupewYVl3XvVOZjaSFltYhN7ni0Ed1Wo8u5KIdBjjkWA+nN/MjoPLtGJ/g47fWMDTshE5Gucog -#~9EdPS8Msq+QKq2xGNqizwCqiBYGlvc8YEvLPsAlWQuD7W9wjTrdSBuOW6duM2w4GGXFX6jwRat -#~KseofcccmsFV5K3pecUVKrKVIvlxRbZtq9kPZMLwHwz7lkX+XlKwl9h7wfPKFQSlA3v/ACS0qg -#~m8BQAA +#~H4sIAEZDOE8CA31UXW/aMBR9z6+4c70GKMGFTpO6iEr0rZo2Td3LWsLAcQzJBk4Um3aj7X/ftR +#~MItGh+IP645/r43HM5ecfiTDGdeidg0kyDFmVWGBC5epCl0dCLSwHzbCkhUyaHXr3Q68zwGCfz +#~vMTgVZEtuclyhWnWmi/kJ0BcT6cu2uW4gnxtirXpCc/T0kAgPZEAmSVZqfhKAu3PiDcfklnMtW +#~x2PLMqcHP128hVAUFi805/uIGnWibgazZutbsTBmwRahaVjPlA53ghRSwrSlnwEgMxVX6dqVYb +#~njzAIfAeoAN8l1vacX/zrQ15/GvokDjpLTYhBhogtE/gGRabDElc2tx4CmG4g17fD15B483gAB +#~sjdnAc3GnjjwW70PpAai7cJJV/krV9/AOKBj6JDIH+R9YH8j7rAgESKeJXOZ/BKUJREuhOojPK +#~unDOFr7Ls5QKlbSM6thHAYFAFV887/rm6+j2bqeNFGkORBusqQCR8hKLMR1PYAhPxAU4KfFlAw +#~L0Yg/yEpK9lUN2aB9xiD84QjfZPeS0MKk9x1lIwobL9Mvo++emWMNz97V2q92ItQshyZsKVLDR +#~7e3oDlMDFegCG1oTrNLQVsuenEEf2u3dvo3TqL77RioyUTWPSLcineRKNuyxDPXbsHmmfLmcOm +#~Al0DaJlaJ5jaP1f33p4JjCF6jwhyMKjyHYYPu4TcrLkv/V1qDodtc4MIHTU6j2ra22Mfs1cHc6 +#~5Qlc1e2CC8u696p5MLWRstrEPvY8WwjuqlDl3ZVCoMcciwD15/50fB5cohP9HXb2xgackKnI1z +#~hFH4jw6HlllH2BVG2Jx9QWeQxUQbA0triTA19Y9gEqyVweanuFadbrQNRy3DpRm2HB+11W+I0G +#~W7SqHKP2HXNoBleRt6bnFVeoyFaK5McV2batZj+RCcM/MexbFvp7ScFeYu8FzytXEJQO7P0DVg +#~ZKir8FAAA= ### Colorizer (gzipped and base64 encoded) ### -#%H4sIAI+CLk8CA32PwU7DMAyG73mKn67qLozQVlwoK4inQILDQuO2UZdkSlK1EuzdScth0iSwJd +#%H4sIAEZDOE8CA32PwU7DMAyG73mKn67qLozQVlwoK4inQILDQuO2UZdkSlK1EuzdScth0iSwJd #%vy/9myNzf8Uxnue+b3W8/JOese+cecv77nVZnrbC3vNVddxTyfhDPKdBfi4ZowNtBFLq5lZVr7 #%l7xlGziSylETlDXQolNNjAN5hJ7gSaKxWgsjMVk3IDI+SDsGxEnhMdHxuOTffvzlFpMK/QJoNc #%e7lzUa44m1++Sgh0D6hF2IsAijv3tb7ZCwL0RnQPrCzqhATW+RPqNG2lY4o6yzHHmdFSjqrMT3