tora-2.1.3/0000755000175000017500000000000011445450564012260 5ustar michaelmichaeltora-2.1.3/Makefile.mingw0000644000175000017500000003136311353141700015031 0ustar michaelmichael # BEGIN_COMMON_COPYRIGHT_HEADER # # TOra - An Oracle Toolkit for DBA's and developers # # Shared/mixed copyright is held throughout files in this product # # Portions Copyright (C) 2000-2001 Underscore AB # Portions Copyright (C) 2003-2005 Quest Software, Inc. # Portions Copyright (C) 2004-2009 Numerous Other Contributors # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; only version 2 of # the License is valid for this program. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception, you have permission to link this program # with the Oracle Client libraries and distribute executables, as long # as you follow the requirements of the GNU GPL in regard to all of the # software in the executable aside from Oracle client libraries. # # Specifically you are not permitted to link this program with the # Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. # And you are not permitted to distribute binaries compiled against # these libraries. # # You may link this product with any GPL'd Qt library. # # All trademarks belong to their respective owners. # # END_COMMON_COPYRIGHT_HEADER # Locations of OCI Dll and home, QT and QScintilla # paths below are just an example OCI_DLL=/c/oracle/ora81/bin/oci.dll OCI_HOME=/c/oracle/ora81/oci QTDIR=/c/qt-3 ##Perl PERL=/c/Perl/bin/perl # Where to create installation bundle INSTALLDIR=/c/TOra # OTL is now in external directory OTL_DIR=../ext/otl #Loki LOKI_DIR=../ext/loki/loki-0.1.6 # What to compile, can be tora for tora-mono for monolithic, tora-static for static version # (for Windows build these targets seems to have no difference so they better left default) TARGET=tora # Additional includes needed to compile program INCLUDES="-I$(OCI_HOME)/include" \ "-I$(QTDIR)/include" \ "-I$(OTL_DIR)" \ "-I$(LOKI_DIR)/include" # C++ Compiler to use GCC=g++ # Additional libraries to link with LIBS_GLOB=-lwsock32 # Standard C++ library STDCPP_SHARED=-lstdc++ # Static version of C++ library (Only needed when linking statically STDCPP_STATIC= # Qt and QScintilla libraries (QScintilla is only shared on Windows) QT_SHARED=-lqt-mt QT_SCINTILLA=-lqscintilla # Static Qt library QT_STATIC= # Path to Qt meta compiler MOC="$(QTDIR)/bin/moc" # Path to Qt interface compiler UIC="$(QTDIR)/bin/uic" # Path to Qt translation compiler LRELEASE="$(QTDIR)/bin/lrelease" # Path to Qt translation update LUPDATE="$(QTDIR)/bin/lupdate" # Additional paths to find libraries LFLAGS="-L$(QTDIR)/lib" "-Llib" # Oracle OCI export library OCI_LIB=lib/liboci.a # Oracle library ORACLE_SHARED=-loci # Static Oracle libraries ORACLE_STATIC=$(STATIC_ORACLETTLIBS) # MySQL found MYSQL_FOUND=0 # MySQL library MYSQL_SHARED= # Static MySQL libraries MYSQL_STATIC= # Additional defines to use while compiling, except for the normal these are available # OTL_ORA9I - Compile for Oracle 9.x # OTL_ORA8I - Compile for Oracle 8.1.x # OTL_ORA8 - Compile for Oracle 8.0.x # OTL_ORA_TIMESTAMP - Include support for timestamps # TO_NEW_CHECK - Disable new version check globally DEFINES+=-DOTL_ORA8I -DOTL_ORA_TIMESTAMP -DOTL_ANSI_CPP -DOTL_EXCEPTION_ENABLE_ERROR_OFFSET DEFINES+=-D_REENTRANT DEFINES+=-DQT_THREAD_SUPPORT DEFINES+=-DTOMONOLITHIC DEFINES+=-DWIN32 -D_WIN32 DEFINES+=-D_int64="long long" # Comment out this line if you want more output from compile .SILENT: # Additional flags set when using only the precompiler. CPPFLAGS_GLOB= # Additional flags to set when linking. LFLAGS_GLOB=-O2 # Additional flags set when compiling. CFLAGS_GLOB=-O2 -W -Wall -c -mthreads -w ############################################################################ # # End of configuration part of Makefile # ############################################################################ TITLE=TOra API= \ tochangeconnection.h \ tobackground.h \ tobackgroundlabel.h \ tobackuptool.h \ tobarchart.h \ toconf.h \ toconfiguration.h \ toconnection.h \ todatatype.h \ todefaultkeywords.h \ toeditwidget.h \ toextract.h \ tofilesize.h \ tohelp.h \ tohelpbrowser.h \ tohighlightedtext.h \ tohtml.h \ tolegendchart.h \ tolinechart.h \ tolistviewformatter.h \ tolistviewformattercsv.h \ tolistviewformatterfactory.h \ tolistviewformatterhtml.h \ tolistviewformatteridentifier.h \ tolistviewformattersql.h \ tolistviewformattertabdel.h \ tolistviewformattertext.h \ tomain.h \ tomainwindow.kde.h \ tomarkedtext.h \ tomemoeditor.h \ tonoblockquery.h \ toparamget.h \ topiechart.h \ toqvalue.h \ toreport.h \ toresult.h \ toresultbar.h \ toresultcols.h \ toresultcolscomment.h \ toresultcombo.h \ toresultconstraint.h \ toresultcontent.h \ toresultdepend.h \ toresultfield.h \ toresultindexes.h \ toresultitem.h \ toresultlabel.h \ toresultline.h \ toresultlong.h \ toresultpie.h \ toresultplan.h \ toresultreferences.h \ toresultresources.h \ toresultstats.h \ toresultview.h \ tosgastatement.h \ tosmtp.h \ tosql.h \ tosqlparse.h \ totabwidget.h \ totemplate.h \ totextview.h \ tothread.h \ totimer.h \ totool.h \ tovisualize.h \ utils.h SOURCES=\ toabout.cpp \ toalert.cpp \ toanalyze.cpp \ tobackground.cpp \ tobackgroundlabel.cpp \ tobackup.cpp \ tobackuptool.cpp \ tobarchart.cpp \ tobrowser.cpp \ tobrowserconstraint.cpp \ tobrowserindex.cpp \ tobrowsertable.cpp \ tochangeconnection.cpp \ tochartmanager.cpp \ toconnection.cpp \ toconfiguration.cpp \ tocurrent.cpp \ todatatype.cpp \ todebug.cpp \ todebugtext.cpp \ toeditextensions.cpp \ toeditwidget.cpp \ toextract.cpp \ tofilesize.cpp \ toglobalsetting.cpp \ tohelp.cpp \ tohighlightedtext.cpp \ tohtml.cpp \ toinvalid.cpp \ tolegendchart.cpp \ tolinechart.cpp \ tolistviewformatter.cpp \ tolistviewformattercsv.cpp \ tolistviewformatterhtml.cpp \ tolistviewformattersql.cpp \ tolistviewformattertabdel.cpp \ tolistviewformattertext.cpp \ tomain.cpp \ tomarkedtext.cpp \ tomemoeditor.cpp \ tonewconnection.cpp \ tonoblockquery.cpp \ tooracleconnection.cpp \ tooracleextract.cpp \ tooraclepreload.cpp \ tooutput.cpp \ toparamget.cpp \ topassword.cpp \ topiechart.cpp \ topreferences.cpp \ toprofiler.cpp \ toproject.cpp \ toqsqlconnection.cpp \ toreport.cpp \ toresult.cpp \ toresultbar.cpp \ toresultcols.cpp \ toresultcolscomment.cpp \ toresultcombo.cpp \ toresultconstraint.cpp \ toresultcontent.cpp \ toresultdepend.cpp \ toresultextract.cpp \ toresultfield.cpp \ toresultindexes.cpp \ toresultitem.cpp \ toresultlabel.cpp \ toresultline.cpp \ toresultlock.cpp \ toresultlong.cpp \ toresultparam.cpp \ toresultpie.cpp \ toresultplan.cpp \ toresultreferences.cpp \ toresultstats.cpp \ toresultstorage.cpp \ toresultview.cpp \ torollback.cpp \ toscript.cpp \ tosearchreplace.cpp \ tosecurity.cpp \ tosession.cpp \ tosgastatement.cpp \ tosgatrace.cpp \ tosmtp.cpp \ tosplash.cpp \ tosql.cpp \ tosqledit.cpp \ tosqlparse.cpp \ tostorage.cpp \ tostoragedefinition.cpp \ tosyntaxsetup.cpp \ totableselect.cpp \ totabwidget.cpp \ totemplate.cpp \ totemplateprovider.cpp \ totemporary.cpp \ totextview.cpp \ tothread.cpp \ totimer.cpp \ totool.cpp \ totuning.cpp \ tovisualize.cpp \ towaitevents.cpp \ toworksheet.cpp \ toworksheetstatistic.cpp \ utils.cpp \ $(LOKI_DIR)/src/OrderedStatic.cpp \ $(LOKI_DIR)/src/SafeFormat.cpp \ $(LOKI_DIR)/src/Singleton.cpp \ $(LOKI_DIR)/src/SmallObj.cpp \ $(LOKI_DIR)/src/SmartPtr.cpp UI_FILES = \ toaboutui.ui \ tobrowserconstraintui.ui \ tobrowserfilterui.ui \ tobrowserindexui.ui \ tobrowsertableui.ui \ todroptablespaceui.ui \ tooraclesettingui.ui \ tostoragetablespaceui.ui \ tochartalarmui.ui \ topreferencesui.ui \ tosyntaxsetupui.ui \ tochartsetupui.ui \ toresultcontentfilterui.ui \ totemplateaddfileui.ui \ todatabasesettingui.ui \ toresultlistformatui.ui \ totemplateeditui.ui \ todebugchangeui.ui \ torollbackdialogui.ui \ totemplatesetupui.ui \ todebugwatch.ui \ toscriptui.ui \ totoolsettingui.ui \ toeditextensiongotoui.ui \ tosearchreplaceui.ui \ totuningoverviewui.ui \ toeditextensionsetupui.ui \ tosecurityquotaui.ui \ totuningsettingui.ui \ toglobalsettingui.ui \ tosecurityroleui.ui \ toworksheetsetupui.ui \ tohelpaddfileui.ui \ tosecurityuserui.ui \ tohelpsetupui.ui \ tostoragedatafileui.ui \ tolinechartsetupui.ui \ tostoragedefinitionui.ui \ tomessageui.ui \ tostoragedialogui.ui \ tonewconnectionui.ui \ tostorageprefsui.ui GENERATED_SOURCES=$(UI_FILES:%.ui=%.cpp) default: all TRANSLATIONS=\ i18n/tora_se.ts\ i18n/tora_fr.ts\ i18n/tora_it.ts\ CPPFLAGS=$(CPPFLAGS_GLOB) $(DEFINES) $(INCLUDES) CFLAGS=$(CFLAGS_GLOB) $(INCLUDES) $(DEFINES) OBJECTS=$(filter %.o,$(SOURCES:%.cpp=objs/%.o) $(GENERATED_SOURCES:%.cpp=objs/%.o)) objs/main.o TRANSOBJ=$(filter %.qm,$(TRANSLATIONS:%.ts=%.qm)) DEPENDS=$(filter %.d,$(SOURCES:%.cpp=.depends/%.d)) .depends/main.d vpath %.h $(INCLUDE) .PHONY: all clean fixmod install distclean oraclelib all: $(TARGET) %.moc: %.h @echo Metacompiling $< $(MOC) -o $@ $< %.cpp %.h: %.ui @echo Generating $(<:%.ui=%.cpp) \& $(<:%.ui=%.h) $(UIC) -o $(<:%.ui=%.h) $< $(UIC) -i $(<:%.ui=%.h) -o $(<:%.ui=%.cpp) $< plugins/%.tso: @echo Linking plugin $@ if [ ! -d plugins ] ; then mkdir -p plugins ; fi $(GCC) -shared $(LFLAGS) $(LFLAGS_GLOB) $(CFLAGS) $(QT_SHARED) -o $@ $^ objs/%.o: %.cpp @echo Compiling $< if [ ! -d objs ] ; then mkdir -p objs ; fi $(GCC) $(CFLAGS) -o $@ -c $< %.o : objs/%.o @echo Faulty dependency, forgot the objs/ part $(OCI_LIB): $(OCI_DLL) @echo Preparing OCI library $@ if [ ! -d lib ] ; then mkdir -p lib ; fi pexports -o $< > lib/oci.def dlltool --def lib/oci.def --output-lib $@ -rm -f lib/oci.def .depends/%.d: %.cpp @echo Making dependencies for $< if [ ! -d `dirname $@` ] ; then mkdir -p `dirname $@` ; fi $(GCC) -MM -MG $(CPPFLAGS) $< > $@.tmp && \ ( sed "s/^\(.*\.\)o\([ :]*\)/objs\/\1o \ $(subst /,\\/,$@)\2/g" < $@.tmp > $@ ; rm -f $@.tmp ) include $(DEPENDS) windows/%.o: @echo Making $< $(MAKE) -C windows install-common: if [ \! -f $(TARGET) ] ; then cp tora $(TARGET) ; fi mkdir -p $(INSTALLDIR) mkdir -p $(INSTALLDIR)/help -cp templates/*.tpl $(INSTALLDIR) >/dev/null 2>&1 -cp -r help/* $(INSTALLDIR)/help >/dev/null 2>&1 -cp *.qm $(INSTALLDIR) >/dev/null 2>&1 install: $(TARGET) install-common @echo Install $(TARGET) to $(INSTALLDIR) cp $(TARGET).exe $(INSTALLDIR) -strip -s $(INSTALLDIR)/$(TARGET).exe >/dev/null 2>&1 install-debug: tora install-common @echo Install tora with debugging symbols to $(INSTALLDIR) cp tora.exe $(INSTALLDIR) uninstall: @echo Uninstalling from $(INSTALLDIR) -rm -rf $(INSTALLDIR) clean: @echo Cleaning $(TITLE) -rm -rf objs tora tora-static tora-mono >/dev/null 2>&1 -rm -f *~ >/dev/null 2>&1 -rm -f *~ */*~ >/dev/null 2>&1 -rm -f *.bak >/dev/null 2>&1 -rm -rf plugins >/dev/null 2>&1 -rm -rf lib >/dev/null 2>&1 -for a in *.ui ; \ do rm -f `$(PERL) -e '$$_=shift(@ARGV); s/\.[^\.]*$$//; print "$$_.h\n$$_.cpp";' $$a`; \ done distclean: clean -rm -rf .depends >/dev/null 2>&1 -rm -rf .xvpics >/dev/null 2>&1 -rm -rf icons/.xvpics >/dev/null 2>&1 -rm -f *.moc >/dev/null 2>&1 -rm -f rpmcommon rpmoracle rpmmysql >/dev/null 2>&1 -rm -f \#*\# >/dev/null 2>&1 -rm -f Makefile >/dev/null 2>&1 -rm -f configure.setup >/dev/null 2>&1 # Specific rule for generation of LICENSE.h file config.h: windows/config.h @echo Creating default config.h @cp $< $@ # Keyboard shortcuts main.cpp: tora_toad.h tora_toad.h: tora_toad.qm chex.exe chex.exe $< > $@ chex.exe: ../utils/chex/chex.cpp $(GCC) $< -o $@ tora_toad.qm: i18n/tora_toad.ts $(LRELEASE) $< # Static target, easier to distribute (oracle is always shared on Windows) tora-static: $(OCI_LIB) $(OBJECTS) windows/tora.o windows/cregistry.o @echo Linking $@ $(GCC) $(LFLAGS) $(LFLAGS_GLOB) -o -mwindows $@ $(OBJECTS) windows/tora.o windows/cregistry.o \ $(LIBS_GLOB) $(QT_STATIC) $(ORACLE_SHARED) $(STDCPP_STATIC) $(MYSQL_STATIC) \ $(QT_SCINTILLA) # The binary for the tora tora: $(OCI_LIB) $(OBJECTS) windows/tora.o windows/cregistry.o @echo Linking $@ $(GCC) $(LFLAGS) $(LFLAGS_GLOB) -mwindows -o $@ $(OBJECTS) windows/tora.o windows/cregistry.o \ $(LIBS_GLOB) $(QT_SHARED) $(ORACLE_SHARED) $(STDCPP_SHARED) \ $(QT_SCINTILLA) tora-2.1.3/configure0000755000175000017500000230052511445442510014166 0ustar michaelmichael#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.65 for tora 2.1.3. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: tora-develop@lists.sourceforge.net about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$lt_ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` ;; esac ECHO=${lt_ECHO-echo} if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then # Yippee, $ECHO works! : else # Restart under the correct shell. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat <<_LT_EOF $* _LT_EOF exit 0 fi # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test -z "$lt_ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if { echo_test_string=`eval $cmd`; } 2>/dev/null && { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null then break fi done fi if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$ECHO" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. ECHO='print -r' elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} else # Try using printf. ECHO='printf %s\n' if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL ECHO="$CONFIG_SHELL $0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$CONFIG_SHELL $0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "$0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} else # Oops. We lost completely, so just stick with echo. ECHO=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. lt_ECHO=$ECHO if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" fi test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='tora' PACKAGE_TARNAME='tora' PACKAGE_VERSION='2.1.3' PACKAGE_STRING='tora 2.1.3' PACKAGE_BUGREPORT='tora-develop@lists.sourceforge.net' PACKAGE_URL='' ac_unique_file="src/main.cpp" ac_default_prefix=/usr/local/tora # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS HAVE_TERADATA_FALSE HAVE_TERADATA_TRUE HAVE_ORACLE_FALSE HAVE_ORACLE_TRUE CPPUNIT_FALSE CPPUNIT_TRUE CPPUNIT_LIBS CPPUNIT_CFLAGS CPPUNIT_CONFIG PCRE_CFLAGS PCRE_LIBS QSCINTILLA_LDFLAGS QSCINTILLA_CXXFLAGS ORACLE_LIBS ORACLE_LDFLAGS ORACLE_CXXFLAGS TERADATA_LIBS TERADATA_LDFLAGS TERADATA_CXXFLAGS PQ_LIBS RCC ac_path_rcc UIC ac_path_uic MOC ac_path_moc LUPDATE LRELEASE QT_LDFLAGS QT_INCLUDES QT_DEFINES qt_includes qt_libraries QTDIR X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF WIN_LDFLAGS WIN_CXXFLAGS LIBTOOL_DEPS CXXCPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL lt_ECHO RANLIB AR OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP SED LIBTOOL LIBOBJS ALLOCA EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX host_os host_vendor host_cpu host build_os build_vendor build_cpu build ISODATE am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking enable_debug enable_shared enable_static with_pic enable_fast_install with_gnu_ld enable_libtool_lock with_x with_qt_dir with_qt_includes with_qt_include with_qt_libraries with_moc with_uic with_rcc with_teradata with_teradata_includes with_teradata_libraries with_oracle with_oracle_includes with_oracle_libraries with_instant_client with_oci_version with_qscintilla with_qscintilla_includes with_qscintilla_libraries with_pcre with_cppunit_prefix with_cppunit_exec_prefix ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP CXXCPP XMKMF QTDIR' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error "unrecognized option: \`$ac_option' Try \`$0 --help' for more information." ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures tora 2.1.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/tora] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of tora 2.1.3:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-debug enable debugging options --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-x use the X Window System --with-qt-dir=DIR where the root of Qt is installed --with-qt-includes=DIR where the Qt includes are. --with-qt-include=DIR same as above. --with-qt-libraries=DIR where the Qt library is installed. --with-moc path to moc (default searches PATH) --with-uic path to uic (default searches PATH) --with-rcc path to rcc (default searches PATH) --with-teradata=DIR enable support for Teradata (default NO) --with-teradata-includes=DIR set teradata include dir --with-teradata-libraries=DIR set teradata lib dir --with-oracle=DIR enable support for Oracle (default ORACLE_HOME) --with-oracle-includes=DIR set oracle include dir (default ORACLE_HOME/subdirs) --with-oracle-libraries=DIR set oracle lib dir (default ORACLE_HOME/lib) --with-instant-client=DIR Path to your instant client. If you've unpacked all the zip files to this folder, then this is all you need to use an instant client. Disables testing for ORACLE_HOME and tnsnames. --with-oci-version=[8, 8I, 9I, 10G, 10G_R2, 11G] this is the version of the client, not the database. --with-qscintilla=DIR Directory containing QScintilla 2 --with-qscintilla-includes=DIR QScintilla header file location --with-qscintilla-libraries=DIR QScintilla library dir --with-pcre[=prefix] compile xmlpcre part (via libpcre check) --with-cppunit-prefix=PFX Prefix where CppUnit is installed (optional) --with-cppunit-exec-prefix=PFX Exec prefix where CppUnit is installed (optional) Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor CXXCPP C++ preprocessor XMKMF Path to xmkmf, Makefile generator for X Window System QTDIR Path to your QT folder. Not required but still useful. Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF tora configure 2.1.3 generated by GNU Autoconf 2.65 Copyright (C) 2009 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( cat <<\_ASBOX ## ------------------------------------------------- ## ## Report this to tora-develop@lists.sourceforge.net ## ## ------------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_func # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_type # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if { as_var=$4; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_member # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_check_decl LINENO SYMBOL VAR # -------------------------------------- # Tests whether SYMBOL is declared, setting cache variable VAR accordingly. ac_fn_cxx_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $2 is declared" >&5 $as_echo_n "checking whether $2 is declared... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $2 (void) $2; #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_cxx_check_decl # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_run cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by tora $as_me 2.1.3, which was generated by GNU Autoconf 2.65. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in config "$srcdir"/config; do for ac_t in install-sh install.sh shtool; do if test -f "$ac_dir/$ac_t"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/$ac_t -c" break 2 fi done done if test -z "$ac_aux_dir"; then as_fn_error "cannot find install-sh, install.sh, or shtool in config \"$srcdir\"/config" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Every other copy of the package version number gets its value from here am__api_version='1.11' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AWK+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='tora' VERSION='2.1.3' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' # create a config.h file (Automake will add -DHAVE_CONFIG_H) ac_config_headers="$ac_config_headers config.h" ISODATE=`date +%Y-%m-%d` # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if test "${ac_cv_build+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if test "${ac_cv_host+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Checks for programs. # AC_PROG_CC ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { as_fn_set_status 77 as_fn_error "C++ compiler cannot create executables See \`config.log' for more details." "$LINENO" 5; }; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of object files: cannot compile See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi # Extract the first word of "makeinfo", so it can be a program name with args. set dummy makeinfo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_MAKEINFO+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$MAKEINFO"; then ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_MAKEINFO="makeinfo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_MAKEINFO" && ac_cv_prog_MAKEINFO="no" fi fi MAKEINFO=$ac_cv_prog_MAKEINFO if test -n "$MAKEINFO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKEINFO" >&5 $as_echo "$MAKEINFO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "${MAKEINFO}" = no; then as_fn_error "makeinfo not found" "$LINENO" 5 fi # Checks for header files. # AC_HEADER_STDC ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "no acceptable C compiler found in \$PATH See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in unistd.h sys/param.h sys/time.h time.h sys/mkdev.h sys/sysmacros.h string.h memory.h fcntl.h dirent.h sys/ndir.h ndir.h alloca.h locale.h utime.h postgresql/libpq-fe.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/types.h defines makedev" >&5 $as_echo_n "checking whether sys/types.h defines makedev... " >&6; } if test "${ac_cv_header_sys_types_h_makedev+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return makedev(0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_header_sys_types_h_makedev=yes else ac_cv_header_sys_types_h_makedev=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_types_h_makedev" >&5 $as_echo "$ac_cv_header_sys_types_h_makedev" >&6; } if test $ac_cv_header_sys_types_h_makedev = no; then ac_fn_c_check_header_mongrel "$LINENO" "sys/mkdev.h" "ac_cv_header_sys_mkdev_h" "$ac_includes_default" if test "x$ac_cv_header_sys_mkdev_h" = x""yes; then : $as_echo "#define MAJOR_IN_MKDEV 1" >>confdefs.h fi if test $ac_cv_header_sys_mkdev_h = no; then ac_fn_c_check_header_mongrel "$LINENO" "sys/sysmacros.h" "ac_cv_header_sys_sysmacros_h" "$ac_includes_default" if test "x$ac_cv_header_sys_sysmacros_h" = x""yes; then : $as_echo "#define MAJOR_IN_SYSMACROS 1" >>confdefs.h fi fi fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if test "${ac_cv_working_alloca_h+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if test "${ac_cv_func_alloca_works+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } if test "${ac_cv_os_cray+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then : ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 $as_echo "$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" eval as_val=\$$as_ac_var if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if test "${ac_cv_c_stack_direction+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction () { static char *addr = 0; auto char dummy; if (addr == 0) { addr = &dummy; return find_stack_direction (); } else return (&dummy > addr) ? 1 : -1; } int main () { return find_stack_direction () < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "#define HAVE_MALLOC 1" >>confdefs.h else $as_echo "#define HAVE_MALLOC 0" >>confdefs.h case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac $as_echo "#define malloc rpl_malloc" >>confdefs.h fi for ac_func in snprintf vsnprintf setenv do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" eval as_val=\$$as_ac_var if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if test "${ac_cv_header_stdbool_h+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; bool e = &s; char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; # if defined __xlc__ || defined __GNUC__ /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0 reported by James Lemley on 2005-10-05; see http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html This test is not quite right, since xlc is allowed to reject this program, as the initializer for xlcbug is not one of the forms that C requires support for. However, doing the test right would require a runtime test, and that would make cross-compilation harder. Let us hope that IBM fixes the xlc bug, and also adds support for this kind of constant expression. In the meantime, this test will reject xlc, which is OK, since our stdbool.h substitute should suffice. We also test this with GCC, where it should work, to detect more quickly whether someone messes up the test in the future. */ char digs[] = "0123456789"; int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1); # endif /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if test "${ac_cv_struct_tm+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks" "ac_cv_member_struct_stat_st_blocks" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_blocks" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BLOCKS 1 _ACEOF $as_echo "#define HAVE_ST_BLOCKS 1" >>confdefs.h else case " $LIBOBJS " in *" fileblocks.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS fileblocks.$ac_objext" ;; esac fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then : break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then : break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5 $as_echo_n "checking whether closedir returns void... " >&6; } if test "${ac_cv_func_closedir_void+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_closedir_void=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include <$ac_header_dirent> #ifndef __cplusplus int closedir (); #endif int main () { return closedir (opendir (".")) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_closedir_void=no else ac_cv_func_closedir_void=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5 $as_echo "$ac_cv_func_closedir_void" >&6; } if test $ac_cv_func_closedir_void = yes; then $as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi $as_echo "#define SCI_LEXER 1" >>confdefs.h if test "x$kde_use_qt_emb" != "xyes"; then __val=$CXX __forbid=" -fno-rtti -rpath " if test -n "$__val"; then __new="" ac_save_IFS=$IFS IFS=" " for i in $__val; do case "$__forbid" in *" $i "*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: found forbidden $i in CXX, removing it" >&5 $as_echo "$as_me: WARNING: found forbidden $i in CXX, removing it" >&2;} ;; *) # Careful to not add spaces, where there were none, because otherwise # libtool gets confused, if we change e.g. CXX if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;; esac done IFS=$ac_save_IFS CXX=$__new fi __val=$CXXFLAGS __forbid=" -fno-rtti -rpath " if test -n "$__val"; then __new="" ac_save_IFS=$IFS IFS=" " for i in $__val; do case "$__forbid" in *" $i "*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: found forbidden $i in CXXFLAGS, removing it" >&5 $as_echo "$as_me: WARNING: found forbidden $i in CXXFLAGS, removing it" >&2;} ;; *) # Careful to not add spaces, where there were none, because otherwise # libtool gets confused, if we change e.g. CXX if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;; esac done IFS=$ac_save_IFS CXXFLAGS=$__new fi else __val=$CXX __forbid=" -rpath " if test -n "$__val"; then __new="" ac_save_IFS=$IFS IFS=" " for i in $__val; do case "$__forbid" in *" $i "*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: found forbidden $i in CXX, removing it" >&5 $as_echo "$as_me: WARNING: found forbidden $i in CXX, removing it" >&2;} ;; *) # Careful to not add spaces, where there were none, because otherwise # libtool gets confused, if we change e.g. CXX if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;; esac done IFS=$ac_save_IFS CXX=$__new fi __val=$CXXFLAGS __forbid=" -rpath " if test -n "$__val"; then __new="" ac_save_IFS=$IFS IFS=" " for i in $__val; do case "$__forbid" in *" $i "*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: found forbidden $i in CXXFLAGS, removing it" >&5 $as_echo "$as_me: WARNING: found forbidden $i in CXXFLAGS, removing it" >&2;} ;; *) # Careful to not add spaces, where there were none, because otherwise # libtool gets confused, if we change e.g. CXX if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;; esac done IFS=$ac_save_IFS CXXFLAGS=$__new fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking CXXFLAGS for gcc -fno-inline" >&5 $as_echo_n "checking CXXFLAGS for gcc -fno-inline... " >&6; } if test "${ac_cv_cxxflags_gcc_option__fno_inline+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_cxxflags_gcc_option__fno_inline="no, unknown" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_save_CXXFLAGS="$CXXFLAGS" for ac_arg in "-pedantic -Werror % -fno-inline" "-pedantic % -fno-inline %% no, obsolete" # do CXXFLAGS="$ac_save_CXXFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_cxxflags_gcc_option__fno_inline=`echo $ac_arg | sed -e 's,.*% *,,'` ; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done CXXFLAGS="$ac_save_CXXFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxxflags_gcc_option__fno_inline" >&5 $as_echo "$ac_cv_cxxflags_gcc_option__fno_inline" >&6; } case ".$ac_cv_cxxflags_gcc_option__fno_inline" in .ok|.ok,*) ;; .|.no|.no,*) ;; *) if echo " $CXXFLAGS " | grep " $ac_cv_cxxflags_gcc_option__fno_inline " 2>&1 >/dev/null then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CXXFLAGS does contain \$ac_cv_cxxflags_gcc_option__fno_inline"; } >&5 (: CXXFLAGS does contain $ac_cv_cxxflags_gcc_option__fno_inline) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CXXFLAGS=\"\$CXXFLAGS \$ac_cv_cxxflags_gcc_option__fno_inline\""; } >&5 (: CXXFLAGS="$CXXFLAGS $ac_cv_cxxflags_gcc_option__fno_inline") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } CXXFLAGS="$CXXFLAGS $ac_cv_cxxflags_gcc_option__fno_inline" fi ;; esac # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; tora_debug=$enableval else tora_debug=no fi if test $tora_debug != no; then tora_debug=yes if test "x$ac_cv_prog_cxx_g" = "xyes"; then CXXFLAGS="$CXXFLAGS -g -Wall" LDFLAGS="$LDFLAGS -g" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Debug enabled. You *must* compile qscintilla with debug support until this build supports using the builded source. ldd the finished executable to be sure your binary only depends on the debug qt libraries." >&5 $as_echo "$as_me: WARNING: Debug enabled. You *must* compile qscintilla with debug support until this build supports using the builded source. ldd the finished executable to be sure your binary only depends on the debug qt libraries." >&2;} fi else CXXFLAGS="$CXXFLAGS -O2" LDFLAGS="$LDFLAGS -DQT_NO_DEBUG" fi enable_mono=yes $as_echo "#define TOMONOLITHIC 1" >>confdefs.h case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.2.6b' macro_revision='1.3017' ltmain="$ac_aux_dir/ltmain.sh" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if test "${ac_cv_path_SED+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if test "${ac_cv_path_FGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if test "${lt_cv_path_LD+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if test "${lt_cv_path_NM+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$ac_tool_prefix"; then for ac_prog in "dumpbin -symbols" "link -dump -symbols" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_DUMPBIN+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in "dumpbin -symbols" "link -dump -symbols" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if test "${lt_cv_nm_interface+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:6514: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:6517: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:6520: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if test "${lt_cv_sys_max_cmd_len+set}" = set; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ = "XX$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if test "${lt_cv_ld_reload_flag+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if test "${lt_cv_deplibs_check_method+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ const struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line 7725 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if test "${lt_cv_cc_needs_belf+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_DSYMUTIL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_NMEDIT+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_LIPO+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OTOOL64+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if test "${lt_cv_apple_cc_single_mod+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if test "${lt_cv_ld_exported_symbols_list+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} _lt_caught_CXX_error=yes; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi enable_dlopen=yes # Set options enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; pic_mode="$withval" else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if test "${lt_cv_objdir+set}" = set; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:9516: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:9520: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl*) # IBM XL C 8.0/Fortran 10.1 on PPC lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 $as_echo "$lt_prog_compiler_pic" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if test "${lt_cv_prog_compiler_pic_works+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:9855: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:9859: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test "${lt_cv_prog_compiler_static_works+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:9960: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:9964: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:10015: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:10019: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag= tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld='-rpath $libdir' archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='' link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=echo archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo(void) {} _ACEOF if ac_fn_c_try_link "$LINENO"; then : archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then archive_cmds_need_lc=no else archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 $as_echo "$archive_cmds_need_lc" >&6; } ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` else lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if test "${ac_cv_lib_dld_shl_load+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if test "${ac_cv_lib_svld_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if test "${ac_cv_lib_dld_dld_link+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if test "${lt_cv_dlopen_self+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line 12385 "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if test "${lt_cv_dlopen_self_static+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line 12481 "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if test "${lt_cv_path_LD+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported whole_archive_flag_spec_CXX='' link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=echo archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5]* | *pgcpp\ [1-5]*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 will use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; xl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=echo else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC*) # IBM XL 8.0 on PPC lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_CXX" >&5 $as_echo "$lt_prog_compiler_pic_CXX" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:14437: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:14441: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:14536: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:14540: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:14588: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:14592: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then archive_cmds_need_lc_CXX=no else archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_CXX" >&5 $as_echo "$archive_cmds_need_lc_CXX" >&6; } ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: WIN_CXXFLAGS= WIN_LDFLAGS= case $host_os in cygwin* | mingw*) WIN_CXXFLAGS="-DQT_DLL -DQ_OS_WIN32 -mwindows" WIN_LDFLAGS="-mwindows" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = x""yes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = x""yes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = x""yes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = x""yes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = x""yes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if test "${ac_cv_lib_socket_connect+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = x""yes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = x""yes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if test "${ac_cv_lib_posix_remove+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = x""yes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = x""yes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if test "${ac_cv_lib_ipc_shmat+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = x""yes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = x""yes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt" >&5 $as_echo_n "checking for Qt... " >&6; } ac_qt_includes=NO ac_qt_libraries=NO ac_qt_bindir=NO qt_libraries="" qt_includes="" # Check whether --with-qt-dir was given. if test "${with_qt_dir+set}" = set; then : withval=$with_qt_dir; QTDIR="$withval" ac_qt_includes="$withval"/include ac_qt_libraries="$withval"/lib ac_qt_bindir="$withval"/bin fi # Check whether --with-qt-includes was given. if test "${with_qt_includes+set}" = set; then : withval=$with_qt_includes; ac_qt_includes="$withval" fi # Check whether --with-qt-include was given. if test "${with_qt_include+set}" = set; then : withval=$with_qt_include; ac_qt_includes="$ac_qt_includes $withval" fi # Check whether --with-qt-libraries was given. if test "${with_qt_libraries+set}" = set; then : withval=$with_qt_libraries; ac_qt_libraries="$withval" fi if test "${ac_cv_have_qt+set}" = set; then : $as_echo_n "(cached) " >&6 else #try to guess Qt locations qt_incdirs="" for dir in $kde_qt_dirs; do qt_incdirs="$qt_incdirs $dir/include $dir" done qt_incdirs="$QTINC $qt_incdirs $QTDIR/include /usr/local/qt/include /usr/include/qt /usr/include/qt4 /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/X11R6/include/qt4 /Developer/qt/include /sw/include/qt /usr/qt/4/include /usr/lib/qt4/include $x_includes" if test "$ac_qt_includes" != "NO"; then qt_incdirs="$ac_qt_includes $qt_incdirs" fi kde_qt_header=Qt/qglobal.h qt_incdir=NO for i in $qt_incdirs; do for j in $kde_qt_header; do echo "configure: 16325: $i/$j" >&5 if test -r "$i/$j"; then echo "taking that" >&5 qt_incdir=$i break 2 fi done done ac_qt_includes="$qt_incdir" qt_libdirs="$ac_qt_libraries $QTLIB $qt_libdirs $QTDIR/lib /Developer/qt/lib /sw/lib /usr/X11R6/lib /usr/lib /usr/local/qt/lib /usr/lib/qt4/lib $x_libraries" ac_qt_libdir=NO LIB_QT_GLOB=QtCore ac_lib_type= for dir in $qt_libdirs; do if test "x$tora_debug" = "xyes"; then try="ls -1 $dir/*${LIB_QT_GLOB}d4.*" echo "trying $try" >&5 if test -n "`$try 2> /dev/null`"; then ac_qt_libdir="$dir" ac_lib_type=d4 break fi try="ls -1 $dir/*${LIB_QT_GLOB}d.*" echo "trying $try" >&5 if test -n "`$try 2> /dev/null`"; then ac_qt_libdir="$dir" ac_lib_type=d break fi else try="ls -1 $dir/*${LIB_QT_GLOB}4.*" echo "trying $try" >&5 if test -n "`$try 2> /dev/null`"; then ac_qt_libdir="$dir" ac_lib_type=4 break fi try="ls -1 $dir/*${LIB_QT_GLOB}.*" echo "trying $try" >&5 if test -n "`$try 2> /dev/null`"; then ac_qt_libdir="$dir" ac_lib_type= break fi fi done if test "x$ac_qt_libdir" = "xNO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no library folders found" >&5 $as_echo "$as_me: WARNING: no library folders found" >&2;} fi pv_qt_libs="QtCore QtGui QtGui QtSql QtNetwork QtXml" all_qt_libs= for needed in $pv_qt_libs; do all_qt_libs="$all_qt_libs -l${needed}${ac_lib_type}" done ac_cppflags_safe="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I$qt_incdir $all_includes $X_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef Q_OS_MACX # error no #endif _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : have_qt_mac_native=yes else have_qt_mac_native=no fi rm -f conftest.err conftest.$ac_ext if test $have_qt_mac_native = no; then echo "no mac native" >&5 else echo "using mac native" >&5 LIBS="$LIBS -bind_at_load -framework Carbon -framework QuickTime -lz -framework OpenGL -framework AGL" fi CPPFLAGS="$ac_cppflags_safe" ac_cxxflags_safe="$CXXFLAGS" ac_ldflags_safe="$LDFLAGS" ac_libs_safe="$LIBS" CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes $X_CFLAGS" LDFLAGS="$LDFLAGS -L$ac_qt_libdir $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" LIBS="$LIBS $all_qt_libs $X_LIBS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "confdefs.h" #include #include #include #include int main () { QString::fromLatin1("Elvis is alive"); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : qt_compiled=yes else qt_compiled=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$qt_compiled" = no; then have_qt=no as_fn_error "Qt not found. Please check your installation! For more details about this problem, look at the end of config.log." "$LINENO" 5 else have_qt=yes fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "confdefs.h" #include #if QT_VERSION < 0x040200 #error Your Qt version is too old. #endif _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : qt_compiled=yes else qt_compiled=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$qt_compiled" = no; then have_qt=no as_fn_error "Your Qt version is too old. Please upgrade to a newer version." "$LINENO" 5 else have_qt=yes fi CXXFLAGS="$ac_cxxflags_safe" LDFLAGS="$ac_ldflags_safe" LIBS="$ac_libs_safe" fi eval "$ac_cv_have_qt" if test "x$have_qt" != xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_qt" >&5 $as_echo "$have_qt" >&6; }; else ac_cv_have_qt="have_qt=yes \ ac_qt_includes=$ac_qt_includes ac_qt_libraries=$ac_qt_libraries" qt_libraries="$ac_qt_libraries" qt_includes="$ac_qt_includes" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libqt: $all_qt_libs, libraries: $ac_qt_libdir, headers: $ac_qt_includes" >&5 $as_echo " libqt: $all_qt_libs, libraries: $ac_qt_libdir, headers: $ac_qt_includes" >&6; } fi QT_DEFINES="" QT_INCLUDES="-I$qt_includes -I$qt_incdir/Qt -I$qt_incdir/QtCore -I$qt_incdir/QtGui -I$qt_incdir/QtSql -I$qt_incdir/QtNetwork -I$qt_incdir/QtXml" all_includes="$QT_INCLUDES $all_includes" QT_LDFLAGS="$all_qt_libs" if test "x$ac_qt_libdir" != "xNO"; then QT_LDFLAGS="$QT_LDFLAGS -L$ac_qt_libdir" fi qt_bindirs="" for dir in $kde_qt_dirs; do qt_bindirs="$qt_bindirs $dir/bin $dir/src/moc" done qt_bindirs="$qt_bindirs /usr/bin /usr/X11R6/bin /usr/local/qt/bin" if test ! "$ac_qt_bindir" = "NO"; then qt_bindirs="$ac_qt_bindir $qt_bindirs" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lrelease" >&5 $as_echo_n "checking for lrelease... " >&6; } if test -n "$LRELEASE"; then kde_cv_path="$LRELEASE"; else kde_cache=`echo lrelease | sed 'y%./+-%__p_%'` if { as_var=kde_cv_path_$kde_cache; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else kde_cv_path="NONE" dirs="$qt_bindirs" kde_save_IFS=$IFS IFS=':' for dir in $PATH; do dirs="$dirs $dir" done dirs="$QTDIR/bin $dirs" IFS=$kde_save_IFS exts="-4 -qt4" found=no for ext in $exts ""; do for dir in $dirs; do if test -x "$dir/lrelease${ext}${EXEEXT}"; then if test -n ""; then evalstr="$dir/lrelease${ext} 2>&1 " if eval $evalstr; then kde_cv_path="$dir/lrelease${ext}" found=yes break fi else kde_cv_path="$dir/lrelease${ext}" found=yes break fi fi done if test $found = yes; then break fi done eval "kde_cv_path_$kde_cache=$kde_cv_path" fi eval "kde_cv_path=\"`echo '$kde_cv_path_'$kde_cache`\"" fi if test -z "$kde_cv_path" || test "$kde_cv_path" = NONE; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No lrelease found! Please check whether you installed Qt correctly. You need to have a running lrelease binary. configure tried to run $ac_cv_path_lrelease and the test didn't succeed. If configure shouldn't have tried this one, set the environment variable LRELEASE to the right one before running configure. " >&5 $as_echo "$as_me: WARNING: No lrelease found! Please check whether you installed Qt correctly. You need to have a running lrelease binary. configure tried to run $ac_cv_path_lrelease and the test didn't succeed. If configure shouldn't have tried this one, set the environment variable LRELEASE to the right one before running configure. " >&2;} else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $kde_cv_path" >&5 $as_echo "$kde_cv_path" >&6; } LRELEASE=$kde_cv_path fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lupdate" >&5 $as_echo_n "checking for lupdate... " >&6; } if test -n "$LUPDATE"; then kde_cv_path="$LUPDATE"; else kde_cache=`echo lupdate | sed 'y%./+-%__p_%'` if { as_var=kde_cv_path_$kde_cache; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else kde_cv_path="NONE" dirs="$qt_bindirs" kde_save_IFS=$IFS IFS=':' for dir in $PATH; do dirs="$dirs $dir" done dirs="$QTDIR/bin $dirs" IFS=$kde_save_IFS exts="-4 -qt4" found=no for ext in $exts ""; do for dir in $dirs; do if test -x "$dir/lupdate${ext}${EXEEXT}"; then if test -n ""; then evalstr="$dir/lupdate${ext} 2>&1 " if eval $evalstr; then kde_cv_path="$dir/lupdate${ext}" found=yes break fi else kde_cv_path="$dir/lupdate${ext}" found=yes break fi fi done if test $found = yes; then break fi done eval "kde_cv_path_$kde_cache=$kde_cv_path" fi eval "kde_cv_path=\"`echo '$kde_cv_path_'$kde_cache`\"" fi if test -z "$kde_cv_path" || test "$kde_cv_path" = NONE; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No lupdate found! Please check whether you installed Qt correctly. You need to have a running lupdate binary. configure tried to run $ac_cv_path_lupdate and the test didn't succeed. If configure shouldn't have tried this one, set the environment variable LUPDATE to the right one before running configure. " >&5 $as_echo "$as_me: WARNING: No lupdate found! Please check whether you installed Qt correctly. You need to have a running lupdate binary. configure tried to run $ac_cv_path_lupdate and the test didn't succeed. If configure shouldn't have tried this one, set the environment variable LUPDATE to the right one before running configure. " >&2;} else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $kde_cv_path" >&5 $as_echo "$kde_cv_path" >&6; } LUPDATE=$kde_cv_path fi ac_path_moc=NO # Check whether --with-moc was given. if test "${with_moc+set}" = set; then : withval=$with_moc; ac_path_moc="$withval" fi if test "$ac_path_moc" = NO && test "x$QTDIR" != ""; then for ac_prog in moc-qt4 moc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_ac_path_moc+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_path_moc in [\\/]* | ?:[\\/]*) ac_cv_path_ac_path_moc="$ac_path_moc" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_path_moc="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_path_moc=$ac_cv_path_ac_path_moc if test -n "$ac_path_moc"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_path_moc" >&5 $as_echo "$ac_path_moc" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_path_moc" && break done test -n "$ac_path_moc" || ac_path_moc="NO" fi if test "$ac_path_moc" = NO; then for ac_prog in moc-qt4 moc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_ac_path_moc+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_path_moc in [\\/]* | ?:[\\/]*) ac_cv_path_ac_path_moc="$ac_path_moc" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_path_moc="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_path_moc=$ac_cv_path_ac_path_moc if test -n "$ac_path_moc"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_path_moc" >&5 $as_echo "$ac_path_moc" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_path_moc" && break done test -n "$ac_path_moc" || ac_path_moc="NO" fi if test "$ac_path_moc" = NO; then as_fn_error " moc binary not found. You can change this by using --with-moc=PATH Please check you have the moc program installed. For more details about this problem, look at the end of config.log." "$LINENO" 5 fi MOC="$ac_path_moc" { $as_echo "$as_me:${as_lineno-$LINENO}: checking $MOC works" >&5 $as_echo_n "checking $MOC works... " >&6; } ac_path_moc_cmd="$MOC src/toabout.h -o test.cpp" echo "trying moc $ac_path_moc_cmd" >&5 $ac_path_moc_cmd 2>conftest.err ac_path_moc_status=$? cat conftest.err >&5 echo "status $ac_path_moc_status" >&5 rm -f conftest.err rm -f test.cpp if test "$ac_path_moc_status" != "0"; then as_fn_error " Running $MOC failed. It is likely the wrong version. Please check your installation. You can change this by using --with-moc=PATH" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_path_uic=NO # Check whether --with-uic was given. if test "${with_uic+set}" = set; then : withval=$with_uic; ac_path_uic="$withval" fi if test "$ac_path_uic" = NO && test "x$QTDIR" != ""; then for ac_prog in uic-qt4 uic do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_ac_path_uic+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_path_uic in [\\/]* | ?:[\\/]*) ac_cv_path_ac_path_uic="$ac_path_uic" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_path_uic="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_path_uic=$ac_cv_path_ac_path_uic if test -n "$ac_path_uic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_path_uic" >&5 $as_echo "$ac_path_uic" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_path_uic" && break done test -n "$ac_path_uic" || ac_path_uic="NO" fi if test "$ac_path_uic" = NO; then for ac_prog in uic-qt4 uic do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_ac_path_uic+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_path_uic in [\\/]* | ?:[\\/]*) ac_cv_path_ac_path_uic="$ac_path_uic" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_path_uic="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_path_uic=$ac_cv_path_ac_path_uic if test -n "$ac_path_uic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_path_uic" >&5 $as_echo "$ac_path_uic" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_path_uic" && break done test -n "$ac_path_uic" || ac_path_uic="NO" fi if test "$ac_path_uic" = NO; then as_fn_error " uic binary not found. You can change this by using --with-uic=PATH Please check you have the uic program installed. For more details about this problem, look at the end of config.log." "$LINENO" 5 fi UIC="$ac_path_uic" { $as_echo "$as_me:${as_lineno-$LINENO}: checking $UIC works" >&5 $as_echo_n "checking $UIC works... " >&6; } ac_path_uic_cmd="$UIC src/toaboutui.ui -o test.h" echo "trying uic $ac_path_uic_cmd" >&5 $ac_path_uic_cmd 2>conftest.err ac_path_uic_status=$? cat conftest.err >&5 echo "status $ac_path_uic_status" >&5 rm -f conftest.err rm -f test.h if test "$ac_path_uic_status" != "0"; then as_fn_error " Running $UIC failed. It is likely the wrong version. Please check your installation. You can change this by using --with-uic=PATH" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_path_rcc=NO # Check whether --with-rcc was given. if test "${with_rcc+set}" = set; then : withval=$with_rcc; ac_path_rcc="$withval" fi if test "$ac_path_rcc" = NO && test "x$QTDIR" != ""; then for ac_prog in rcc-qt4 rcc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_ac_path_rcc+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_path_rcc in [\\/]* | ?:[\\/]*) ac_cv_path_ac_path_rcc="$ac_path_rcc" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QTDIR/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_path_rcc="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_path_rcc=$ac_cv_path_ac_path_rcc if test -n "$ac_path_rcc"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_path_rcc" >&5 $as_echo "$ac_path_rcc" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_path_rcc" && break done test -n "$ac_path_rcc" || ac_path_rcc="NO" fi if test "$ac_path_rcc" = NO; then for ac_prog in rcc-qt4 rcc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_ac_path_rcc+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_path_rcc in [\\/]* | ?:[\\/]*) ac_cv_path_ac_path_rcc="$ac_path_rcc" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_path_rcc="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_path_rcc=$ac_cv_path_ac_path_rcc if test -n "$ac_path_rcc"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_path_rcc" >&5 $as_echo "$ac_path_rcc" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_path_rcc" && break done test -n "$ac_path_rcc" || ac_path_rcc="NO" fi if test "$ac_path_rcc" = NO; then as_fn_error " rcc binary not found. $QTDIR/bin:$PATH You can change this by using --with-rcc=PATH Please check you have the rcc program installed. For more details about this problem, look at the end of config.log." "$LINENO" 5 fi RCC="$ac_path_rcc" { $as_echo "$as_me:${as_lineno-$LINENO}: checking $RCC works" >&5 $as_echo_n "checking $RCC works... " >&6; } ac_path_rcc_cmd="$RCC src/tora.qrc -o test.cpp" echo "trying rcc $ac_path_rcc_cmd" >&5 $ac_path_rcc_cmd 2>conftest.err ac_path_rcc_status=$? cat conftest.err >&5 echo "status $ac_path_rcc_status" >&5 rm -f conftest.err rm -f test.cpp if test "$ac_path_rcc_status" != "0"; then as_fn_error " Running $RCC failed. It is likely the wrong version. Please check your installation. You can change this by using --with-rcc=PATH" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_fn_cxx_check_decl "$LINENO" "PQcancel" "ac_cv_have_decl_PQcancel" "#include " if test "x$ac_cv_have_decl_PQcancel" = x""yes; then : ac_pg_cancel=yes else ac_pg_cancel=no fi if test $ac_pg_cancel = yes; then $as_echo "#define LIBPQ_DECL_CANCEL 1" >>confdefs.h PQ_LIBS=-lpq fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for teradata" >&5 $as_echo_n "checking for teradata... " >&6; } have_teradata=no # Check whether --with-teradata was given. if test "${with_teradata+set}" = set; then : withval=$with_teradata; have_teradata=$withval fi teradata_user_inc= # Check whether --with-teradata-includes was given. if test "${with_teradata_includes+set}" = set; then : withval=$with_teradata_includes; have_teradata=yes teradata_user_inc=$withval fi teradata_user_lib= # Check whether --with-teradata-libraries was given. if test "${with_teradata_libraries+set}" = set; then : withval=$with_teradata_libraries; have_teradata=yes teradata_user_lib=$withval fi cflags_td_save=$CXXFLAGS ldflags_td_save=$LDFLAGS libs_td_save=$LIBS td_cflags= td_ldflags= td_lib="-lcliv2 -ltdusr" if test "x$teradata_user_lib" != "x"; then td_ldflags="-L$teradata_user_lib" fi if test "x$teradata_user_inc" != "x"; then td_cflags="-I$teradata_user_inc" fi if test $have_teradata = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else $as_echo "#define TO_HAVE_TERADATA 1" >>confdefs.h CXXFLAGS="$CXXFLAGS $td_cflags" LDFLAGS="$LDFLAGS $td_ldflags" LIBS="$td_lib" if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot run test program while cross compiling See \`config.log' for more details." "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* Teradata include files */ #include #include #include #include int main(int c, char **v) { static Int32 result; static char cnta[4]; struct DBCAREA *dbcp; dbcp = (DBCAREA *) malloc(sizeof(struct DBCAREA)); dbcp->total_len = sizeof(struct DBCAREA); DBCHINI(&result,cnta, dbcp); return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : found_td=yes else found_td=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $found_td = no; then as_fn_error " Couldn't compile and run a Teradata client." "$LINENO" 5 fi # AM_CONDITIONAL in configure.in uses this variable to enable td # targets. enable_teradata=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # don't change flags for all targets, just export TD variables. CXXFLAGS=$cflags_td_save TERADATA_CXXFLAGS=$td_cflags LDFLAGS=$ldflags_td_save TERADATA_LDFLAGS=$td_ldflags LIBS=$libs_td_save TERADATA_LIBS=$td_lib fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for oracle" >&5 $as_echo_n "checking for oracle... " >&6; } have_oracle=yes # Check whether --with-oracle was given. if test "${with_oracle+set}" = set; then : withval=$with_oracle; if test $withval = no; then have_oracle=no elif test $withval != yes; then ORACLE_HOME=$withval fi fi oracle_user_inc= # Check whether --with-oracle-includes was given. if test "${with_oracle_includes+set}" = set; then : withval=$with_oracle_includes; have_oracle=yes oracle_user_inc=$withval fi oracle_user_lib= # Check whether --with-oracle-libraries was given. if test "${with_oracle_libraries+set}" = set; then : withval=$with_oracle_libraries; have_oracle=yes oracle_user_lib=$withval fi oracle_user_instant= # Check whether --with-instant-client was given. if test "${with_instant_client+set}" = set; then : withval=$with_instant_client; have_oracle=yes oracle_user_instant=$withval fi cflags_ora_save=$CXXFLAGS ldflags_ora_save=$LDFLAGS libs_ora_save=$LIBS ora_cflags= ora_libdir= ora_ldflags= ora_lib=-lclntsh if test $have_oracle = no; then $as_echo "#define TO_NO_ORACLE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } elif test "x$oracle_user_instant" != "x"; then $as_echo "#define TO_INSTANT_CLIENT 1" >>confdefs.h instant_ora_libs="$oracle_user_instant" instant_ora_inc="$oracle_user_instant/sdk/include" if test "x$oracle_user_lib" = "x"; then if test "`ls $instant_ora_libs/libclntsh*so 2>/dev/null || echo x`" != "x"; then ora_ldflags=-L$instant_ora_libs else as_fn_error " The path \"$instant_ora_libs\"/libclntsh*so does not exist. Because of the way Oracle versions its libraries, you need to create a symlink to the library. Try something like this: cd $instant_ora_libs ln -s libclntsh.so.11.1 libclntsh.so " "$LINENO" 5 fi else ora_ldflags="-L$oracle_user_lib" fi if test "x$oracle_user_inc" = "x"; then if test -d $instant_ora_inc; then ora_cflags="-I$instant_ora_inc" else as_fn_error " $instant_ora_inc doesn't exist. Please install the instant client sdk package or use --with-oracle-includes=DIR." "$LINENO" 5 fi else ora_cflags="-I$oracle_user_inc" fi elif test "x$ORACLE_HOME" != "x"; then ora_check_inc=" $oracle_user_inc $ORACLE_HOME/rdbms/demo $ORACLE_HOME/plsql/public $ORACLE_HOME/rdbms/public $ORACLE_HOME/network/public $ORACLE_HOME/sdk/ $ORACLE_HOME/include/" for dir in $ora_check_inc; do echo "trying oci.h $dir/oci.h" >&5 if test -r $dir/oci.h; then ora_cflags="$ora_cflags -I$dir" echo "adding -I$dir" >&5 fi done ora_check_lib=" $oracle_user_lib $ORACLE_HOME/lib $ORACLE_HOME/lib32 $ORACLE_HOME/lib64" for dir in $ora_check_lib; do if test -d $dir; then ora_ldflags="$ora_ldflags -L$dir" fi done else if test -z "$oracle_user_lib" || test -z "$oracle_user_inc"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no" >&5 $as_echo "$as_me: WARNING: no" >&2;} have_oracle=no else ora_ldflags="-L$oracle_user_lib" ora_cflags="-I$oracle_user_inc" fi fi if test "x$ORACLE_HOME" != "x"; then ora_home_oops=`echo $ORACLE_HOME | $AWK '/\/$/ {print "oops"}'` if test "$ora_home_oops" = "oops"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your ORACLE_HOME environment variable ends with a slash (i.e. /). Oracle Instant Client is known to have a problem with this. If you get the message \"otl_initialize failed!\" at the console when running TOra, this is probably why." >&5 $as_echo "$as_me: WARNING: Your ORACLE_HOME environment variable ends with a slash (i.e. /). Oracle Instant Client is known to have a problem with this. If you get the message \"otl_initialize failed!\" at the console when running TOra, this is probably why." >&2;} fi fi if test $have_oracle = yes; then CXXFLAGS="$CXXFLAGS $ora_cflags" LDFLAGS="$LDFLAGS $ora_ldflags" LIBS="$ora_lib" if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot run test program while cross compiling See \`config.log' for more details." "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Lda_Def lda; ub4 hda [HDA_SIZE/(sizeof(ub4))]; int main(int c, char **v) { return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : found_oracle=yes else found_oracle=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $found_oracle = no; then as_fn_error " Couldn't compile and run a simpile OCI app. Try setting ORACLE_HOME or check config.log. Also make sure ORACLE_HOME/lib is in /etc/ld.so.conf or LD_LIBRARY_PATH" "$LINENO" 5 fi # AM_CONDITIONAL in configure.in uses this variable to enable oracle # targets. enable_oracle=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } oracle_user_otl_ver= # Check whether --with-oci-version was given. if test "${with_oci_version+set}" = set; then : withval=$with_oci_version; oracle_user_otl_ver=$withval fi if test $have_oracle = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking oci version" >&5 $as_echo_n "checking oci version... " >&6; } if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot run test program while cross compiling See \`config.log' for more details." "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include using namespace std; int main(int c, char **v) { ofstream version; version.open("ociversion", ios::out); if(!version.is_open()) { cerr << "Cannot open ociversion output file"; exit(1); } sword major, minor, update, patch, port; OCIClientVersion(&major, &minor, &update, &patch, &port); switch(major) { default: exit(1); /* unknown */ case 11: version << "11G"; break; case 10: if(minor >= 2) version << "10G_R2"; else version << "10G"; break; case 9: version << "9I"; break; case 8: if(minor >= 1) version << "8I"; else version << "8"; } version.close(); return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : found_oracle=yes else found_oracle=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $found_oracle = no; then if test "x$oracle_user_otl_ver" != "x"; then otl_ver=$oracle_user_otl_ver else sqlplus_try=" $oracle_user_instant/sqlplus $ORACLE_HOME/bin/sqlplus $ORACLE_HOME/bin/sqlplusO" for try in $sqlplus_try; do if test -x "$try"; then sqlplus="$try" break; fi done if test "x${sqlplus}" = "x"; then as_fn_error " Couldn't find sqlplus. Please set the Oracle version manually using --with-oci-version." "$LINENO" 5 else # get oracle oci version. know a better way? sqlplus_ver=`$sqlplus -? | $AWK '/Release/ {print $3}'` echo "sqlplus_ver: $sqlplus_ver" >&5 if expr $sqlplus_ver \> 11 >/dev/null; then otl_ver=11G elif expr $sqlplus_ver \> 10.2 >/dev/null; then otl_ver=10G_R2 elif expr $sqlplus_ver \> 10 >/dev/null; then otl_ver=10G elif expr $sqlplus_ver \> 9 >/dev/null; then otl_ver=9I elif expr $sqlplus_ver \< 8.1 >/dev/null; then otl_ver=8 else otl_ver=8I fi fi fi else if test -r "ociversion"; then otl_ver="`cat ociversion`" rm -f ociversion else as_fn_error " Couldn't find ociversion output file. Please mail the tora-dev email list and let us know about this problem." "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $otl_ver" >&5 $as_echo "$otl_ver" >&6; } ora_cflags="$ora_cflags -DOTL_ORA${otl_ver}" fi # don't change flags for all targets, just export ORA variables. CXXFLAGS=$cflags_ora_save ORACLE_CXXFLAGS=$ora_cflags LDFLAGS=$ldflags_ora_save ORACLE_LDFLAGS=$ora_ldflags LIBS=$libs_ora_save ORACLE_LIBS=$ora_lib fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for qscintilla" >&5 $as_echo_n "checking for qscintilla... " >&6; } scin_cflags= scin_ldflags= qscintilla_user_dir= # Check whether --with-qscintilla was given. if test "${with_qscintilla+set}" = set; then : withval=$with_qscintilla; qscintilla_user_dir=$withval fi qscintilla_user_inc= # Check whether --with-qscintilla-includes was given. if test "${with_qscintilla_includes+set}" = set; then : withval=$with_qscintilla_includes; qscintilla_user_inc=$withval fi qscintilla_user_lib= # Check whether --with-qscintilla-libraries was given. if test "${with_qscintilla_libraries+set}" = set; then : withval=$with_qscintilla_libraries; qscintilla_user_lib=$withval fi scin_check_inc=" $qscintilla_user_dir/Qt4 $qscintilla_user_inc /usr/include/qscintilla" for dir in $scin_check_inc; do echo "looking for headers $dir" >&5 if test -d $dir; then scin_cflags="$scin_cflags -I$dir" fi done scin_check_lib=" $qscintilla_user_dir/Qt4 $qscintilla_user_lib" for dir in $scin_check_lib; do echo "looking for lib folder $dir" >&5 if test -d $dir; then scin_ldflags="$scin_ldflags -L$dir" fi done cflags_scin_save=$CXXFLAGS ldflags_scin_save=$LDFLAGS libs_scin_save=$LIBS CXXFLAGS="$CXXFLAGS $KDE_INCLUDES $QT_INCLUDES $scin_cflags" LDFLAGS="$LDFLAGS @KDE_LDFLAGS@ \ @X_LDFLAGS@ \ @QT_LDFLAGS@ \ @LIB_KPARTS@ \ @LIB_KDEPRINT@ \ @LIB_KDECORE@ \ @LIB_KDEUI@ \ @LIB_KIO@ \ @LIB_KFILE@ \ @LIB_DCOP@ \ @LIB_KHTML@ \ $scin_ldflags" LIBS="-lqscintilla2" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { QsciLexerSQL sqlLexer(0); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : scin_works=yes else scin_works=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test $scin_works = no; then as_fn_error "Couldn't compile a simple QScintilla application. See config.log or specify its location with --with-qscintilla=/path/to/qscintilla You can download qscintilla here: http://www.riverbankcomputing.co.uk/software/qscintilla/ Or alternatively see if your OS offers a QScintilla 2 package with development headers." "$LINENO" 5 fi CXXFLAGS=$cflags_scin_save LDFLAGS=$ldflags_scin_save LIBS=$libs_scin_save scin_dll=0 case $host_os in cygwin* | mingw*) scin_dll=1 ;; esac cat >>confdefs.h <<_ACEOF #define QSCINTILLA_DLL 1 _ACEOF QSCINTILLA_CXXFLAGS=$scin_cflags QSCINTILLA_LDFLAGS="$scin_ldflags -lqscintilla2" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lib pcre" >&5 $as_echo_n "checking lib pcre... " >&6; } # Check whether --with-pcre was given. if test "${with_pcre+set}" = set; then : withval=$with_pcre; else with_pcre="yes" fi if test ".$with_pcre" = ".no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 $as_echo "disabled" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: (testing)" >&5 $as_echo "(testing)" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcre_study in -lpcre" >&5 $as_echo_n "checking for pcre_study in -lpcre... " >&6; } if test "${ac_cv_lib_pcre_pcre_study+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpcre $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pcre_study (); int main () { return pcre_study (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_pcre_pcre_study=yes else ac_cv_lib_pcre_pcre_study=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcre_pcre_study" >&5 $as_echo "$ac_cv_lib_pcre_pcre_study" >&6; } if test "x$ac_cv_lib_pcre_pcre_study" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPCRE 1 _ACEOF LIBS="-lpcre $LIBS" fi if test "$ac_cv_lib_pcre_pcre_study" = "yes" ; then PCRE_LIBS="-lpcre" { $as_echo "$as_me:${as_lineno-$LINENO}: checking lib pcre" >&5 $as_echo_n "checking lib pcre... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PCRE_LIBS" >&5 $as_echo "$PCRE_LIBS" >&6; } else OLDLDFLAGS="$LDFLAGS" ; LDFLAGS="$LDFLAGS -L$with_pcre/lib" OLDCPPFLAGS="$CPPFLAGS" ; CPPFLAGS="$CPPFLAGS -I$with_pcre/include" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcre_compile in -lpcre" >&5 $as_echo_n "checking for pcre_compile in -lpcre... " >&6; } if test "${ac_cv_lib_pcre_pcre_compile+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpcre $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pcre_compile (); int main () { return pcre_compile (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_pcre_pcre_compile=yes else ac_cv_lib_pcre_pcre_compile=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcre_pcre_compile" >&5 $as_echo "$ac_cv_lib_pcre_pcre_compile" >&6; } if test "x$ac_cv_lib_pcre_pcre_compile" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPCRE 1 _ACEOF LIBS="-lpcre $LIBS" fi CPPFLAGS="$OLDCPPFLAGS" LDFLAGS="$OLDLDFLAGS" if test "$ac_cv_lib_pcre_pcre_compile" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: .setting PCRE_LIBS -L$with_pcre/lib -lpcre" >&5 $as_echo ".setting PCRE_LIBS -L$with_pcre/lib -lpcre" >&6; } PCRE_LIBS="-L$with_pcre/lib -lpcre" test -d "$with_pcre/include" && PCRE_CFLAGS="-I$with_pcre/include" { $as_echo "$as_me:${as_lineno-$LINENO}: checking lib pcre" >&5 $as_echo_n "checking lib pcre... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PCRE_LIBS" >&5 $as_echo "$PCRE_LIBS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking lib pcre" >&5 $as_echo_n "checking lib pcre... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, (WARNING)" >&5 $as_echo "no, (WARNING)" >&6; } fi fi fi PCRE_LIBS=$PCRE_LIBS PCRE_CFLAGS=$PCRE_CFLAGS # Check whether --with-cppunit-prefix was given. if test "${with_cppunit_prefix+set}" = set; then : withval=$with_cppunit_prefix; cppunit_config_prefix="$withval" else cppunit_config_prefix="" fi # Check whether --with-cppunit-exec-prefix was given. if test "${with_cppunit_exec_prefix+set}" = set; then : withval=$with_cppunit_exec_prefix; cppunit_config_exec_prefix="$withval" else cppunit_config_exec_prefix="" fi if test x$cppunit_config_exec_prefix != x ; then cppunit_config_args="$cppunit_config_args --exec-prefix=$cppunit_config_exec_prefix" if test x${CPPUNIT_CONFIG+set} != xset ; then CPPUNIT_CONFIG=$cppunit_config_exec_prefix/bin/cppunit-config fi fi if test x$cppunit_config_prefix != x ; then cppunit_config_args="$cppunit_config_args --prefix=$cppunit_config_prefix" if test x${CPPUNIT_CONFIG+set} != xset ; then CPPUNIT_CONFIG=$cppunit_config_prefix/bin/cppunit-config fi fi # Extract the first word of "cppunit-config", so it can be a program name with args. set dummy cppunit-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_CPPUNIT_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $CPPUNIT_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_CPPUNIT_CONFIG="$CPPUNIT_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CPPUNIT_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_CPPUNIT_CONFIG" && ac_cv_path_CPPUNIT_CONFIG="no" ;; esac fi CPPUNIT_CONFIG=$ac_cv_path_CPPUNIT_CONFIG if test -n "$CPPUNIT_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPPUNIT_CONFIG" >&5 $as_echo "$CPPUNIT_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cppunit_version_min=1.10.2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Cppunit - version >= $cppunit_version_min" >&5 $as_echo_n "checking for Cppunit - version >= $cppunit_version_min... " >&6; } no_cppunit="" if test "$CPPUNIT_CONFIG" = "no" ; then no_cppunit=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else CPPUNIT_CFLAGS=`$CPPUNIT_CONFIG --cflags` CPPUNIT_LIBS=`$CPPUNIT_CONFIG --libs` cppunit_version=`$CPPUNIT_CONFIG --version` cppunit_major_version=`echo $cppunit_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` cppunit_minor_version=`echo $cppunit_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` cppunit_micro_version=`echo $cppunit_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` cppunit_major_min=`echo $cppunit_version_min | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` cppunit_minor_min=`echo $cppunit_version_min | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` cppunit_micro_min=`echo $cppunit_version_min | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` cppunit_version_proper=`expr \ $cppunit_major_version \> $cppunit_major_min \| \ $cppunit_major_version \= $cppunit_major_min \& \ $cppunit_minor_version \> $cppunit_minor_min \| \ $cppunit_major_version \= $cppunit_major_min \& \ $cppunit_minor_version \= $cppunit_minor_min \& \ $cppunit_micro_version \>= $cppunit_micro_min ` if test "$cppunit_version_proper" = "1" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version" >&5 $as_echo "$cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } no_cppunit=yes fi fi if test "x$no_cppunit" = x ; then found_cppunit=yes else CPPUNIT_CFLAGS="" CPPUNIT_LIBS="" : fi if test "x$found_cppunit" = "xyes"; then CPPUNIT_TRUE= CPPUNIT_FALSE='#' else CPPUNIT_TRUE='#' CPPUNIT_FALSE= fi # Makefile.am uses these if test "$enable_oracle" = yes; then HAVE_ORACLE_TRUE= HAVE_ORACLE_FALSE='#' else HAVE_ORACLE_TRUE='#' HAVE_ORACLE_FALSE= fi if test "$enable_teradata" = yes; then HAVE_TERADATA_TRUE= HAVE_TERADATA_FALSE='#' else HAVE_TERADATA_TRUE='#' HAVE_TERADATA_FALSE= fi ac_config_files="$ac_config_files Makefile" ac_config_files="$ac_config_files utils/Makefile" ac_config_files="$ac_config_files utils/chex/Makefile" ac_config_files="$ac_config_files src/Makefile" ac_config_files="$ac_config_files test/Makefile" ac_config_files="$ac_config_files test/configuration/Makefile" ac_config_files="$ac_config_files doc/Makefile" ac_config_files="$ac_config_files doc/help/Makefile" ac_config_files="$ac_config_files rpm/tora.spec" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CPPUNIT_TRUE}" && test -z "${CPPUNIT_FALSE}"; then as_fn_error "conditional \"CPPUNIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ORACLE_TRUE}" && test -z "${HAVE_ORACLE_FALSE}"; then as_fn_error "conditional \"HAVE_ORACLE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_TERADATA_TRUE}" && test -z "${HAVE_TERADATA_FALSE}"; then as_fn_error "conditional \"HAVE_TERADATA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by tora $as_me 2.1.3, which was generated by GNU Autoconf 2.65. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ tora config.status 2.1.3 configured by $0, generated by GNU Autoconf 2.65, with options \\"\$ac_cs_config\\" Copyright (C) 2009 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`' predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`' postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`' predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`' postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`' LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`' fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # Quote evaled strings. for var in SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ AR \ AR_FLAGS \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ SHELL \ ECHO \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ fix_srcfile_path \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ fix_srcfile_path_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX; do case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Fix-up fallback echo if it was mangled by the above quoting rules. case \$lt_ECHO in *'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` ;; esac ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;; "utils/chex/Makefile") CONFIG_FILES="$CONFIG_FILES utils/chex/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; "test/configuration/Makefile") CONFIG_FILES="$CONFIG_FILES test/configuration/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/help/Makefile") CONFIG_FILES="$CONFIG_FILES doc/help/Makefile" ;; "rpm/tora.spec") CONFIG_FILES="$CONFIG_FILES rpm/tora.spec" ;; *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || as_fn_error "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || as_fn_error "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == "file_magic". file_magic_cmd=$lt_file_magic_cmd # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name of the directory that contains temporary libtool files. objdir=$objdir # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that does not interpret backslashes. ECHO=$lt_ECHO # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) case $xsi_shell in yes) cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac } # func_basename file func_basename () { func_basename_result="${1##*/}" } # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}" } # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). func_stripname () { # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"} } # func_opt_split func_opt_split () { func_opt_split_opt=${1%%=*} func_opt_split_arg=${1#*=} } # func_lo2o object func_lo2o () { case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac } # func_xform libobj-or-source func_xform () { func_xform_result=${1%.*}.lo } # func_arith arithmetic-term... func_arith () { func_arith_result=$(( $* )) } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=${#1} } _LT_EOF ;; *) # Bourne compatible functions. cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_basename file func_basename () { func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` } # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; esac } # sed scripts: my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^-[^=]*=//' # func_opt_split func_opt_split () { func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` } # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` } # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` } # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "$@"` } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } _LT_EOF esac case $lt_shell_append in yes) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$1+=\$2" } _LT_EOF ;; *) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$1=\$$1\$2" } _LT_EOF ;; esac sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit $? fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi tora-2.1.3/src/0000755000175000017500000000000011445450572013046 5ustar michaelmichaeltora-2.1.3/src/precompiled.h0000644000175000017500000001014711342143740015515 0ustar michaelmichael #pragma once // QT headers first #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // STL headers #include #include #include #include // TOra headers //#include "toresultview.h" //#include "tomain.h" //#include "tosql.h" //#include "toconf.h" //#include "totool.h" //#include "toconnection.h" //#include "utils.h" //#include "config.h" //#include "tologger.h" tora-2.1.3/src/toconnectionpool.cpp0000644000175000017500000002350711346736116017156 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconnectionpool.h" #include "toconfiguration.h" #include "tosql.h" #include #include #include toConnectionPoolTest::toConnectionPoolTest(toConnectionPool *pool) : QThread(0), timer(0) { setObjectName("toConnectionPoolTest"); Pool = pool; } void toConnectionPoolTest::run() { timer = new QTimer(); timer->setInterval(toConfigurationSingle::Instance().connTestInterval()); connect(timer, SIGNAL(timeout()), this, SLOT(test()), Qt::DirectConnection); timer->start(); exec(); delete timer; } void toConnectionPoolTest::test() { for(int i = 0; Pool && i < Pool->size(); i++) { toConnectionPool::PooledState state = Pool->test(i); if(state == toConnectionPool::Busy) continue; if(state == toConnectionPool::Broken) Pool->fix(i); } } toConnectionPoolExec::toConnectionPoolExec(toConnectionPool *pool, Action act) { action = act; Pool = pool; setObjectName("toConnectionPoolExec"); } toConnectionPoolExec::toConnectionPoolExec(toConnectionPool *pool, Action act, const QString &sql, toQList ¶ms) { action = act; Pool = pool; Sql = sql; Params = params; } void toConnectionPoolExec::run() { for(int mem = 0; Pool && mem < Pool->size(); mem++) { toConnectionSub *sub = Pool->steal(mem); if(!sub) continue; try { switch(action) { case Commit: Pool->Connection->commit(sub); break; case Rollback: Pool->Connection->rollback(sub); break; case Cancel: sub->cancel(); // send it back to the pool // edit: not a good idea, can cause dead locks in sub // if you're extremely unlucky // Pool->release(sub); break; case Execute: { toQuery q(*(Pool->Connection), sub, Sql, Params); // Pool->Connection->commit(sub); break; } } // switch } TOCATCH; // show errors to user } } toConnectionPool::toConnectionPool(toConnection *conn) : QObject(conn) { Connection = conn; LockingPtr ptr(Pool, PoolLock); for(int i = 0; i < PreferredSize; i++) { PooledSub *psub = new PooledSub; psub->Sub = Connection->addConnection(); psub->State = Free; ptr->append(psub); } if(toConfigurationSingle::Instance().firewallMode()) { TestThread = new toConnectionPoolTest(this); TestThread->start(); TestThreadRunning = true; } else TestThreadRunning = false; } toConnectionPool::~toConnectionPool() { if (TestThreadRunning) { QMetaObject::invokeMethod(TestThread, "quit", Qt::QueuedConnection); #ifdef Q_WS_MAC // This is propably mandatory on Mac. If it's missing, the TestThread->wait() // will block entire GUI for ever. TestThread->quit(); #endif // must call this or the queued call never executes while we wait // on the thread. Awesome. qApp->processEvents(); TestThread->wait(); delete TestThread; } toConnection *conn = Connection; Connection = 0; LockingPtr ptr(Pool, PoolLock); for(int mem = 0; mem < ptr->size(); mem++) { PooledSub *psub = (*ptr)[mem]; try { if(psub->Sub) psub->Sub->cancel(); } catch(...) { } if(psub->Sub) conn->closeConnection(psub->Sub); } while(!ptr->isEmpty()) delete ptr->takeFirst(); } void toConnectionPool::fix(int member) { if(!Connection) return; LockingPtr ptr(Pool, PoolLock); PooledSub *psub = (*ptr)[member]; psub->State = Broken; ptr.unlock(); Connection->closeConnection(psub->Sub); PooledState state = Broken; toConnectionSub *sub = 0; try { sub = Connection->addConnection(); state = Free; } catch(...) { state = Broken; } ptr.lock(); psub->State = state; psub->Sub = sub; } toConnectionPool::PooledState toConnectionPool::test(int member) { if(!Connection) return Broken; LockingPtr ptr(Pool, PoolLock); PooledSub *psub = (*ptr)[member]; if(psub->State != Free) return psub->State; psub->State = Busy; ptr.unlock(); PooledState state = test(psub); ptr.lock(); psub->State = state; return psub->State; } toConnectionPool::PooledState toConnectionPool::test(PooledSub *sub) { PooledState state = Free; try { QString sql = toSQL::string("Global:Now", *Connection); if(sql.isEmpty()) return state; toQList params; toQuery q(*Connection, sub->Sub, sql, params); } catch(...) { state = Broken; } return state; } int toConnectionPool::size() { LockingPtr ptr(Pool, PoolLock); return ptr->size(); } toConnectionSub* toConnectionPool::steal(int member) { LockingPtr ptr(Pool, PoolLock); return (*ptr)[member]->Sub; } toConnectionSub* toConnectionPool::borrow() { { // keep lock here so adding connection below can be sure // there's no current lock in case of exception LockingPtr ptr(Pool, PoolLock); for(int mem = 0; mem < ptr->size(); mem++) { PooledSub *psub = (*ptr)[mem]; if(psub->State == Free) { psub->State = Busy; ptr.unlock(); PooledState state = test(psub); if(state == Free) return psub->Sub; else { ptr.lock(); psub->State = state; } // be careful adding code after this, as the pool size // might have changed since lock was last acquired. } } } toConnectionSub *sub = Connection->addConnection(); PooledSub *psub = new PooledSub(sub, Busy); LockingPtr ptr(Pool, PoolLock); ptr->append(psub); return psub->Sub; } void toConnectionPool::release(toConnectionSub *sub) { LockingPtr ptr(Pool, PoolLock); for(int mem = 0; mem < ptr->size(); mem++) { PooledSub *psub = (*ptr)[mem]; if(psub->Sub == sub) { // if needscommit is false, we can eliminate extra // connections here. if(ptr->size() > PreferredSize && Connection && !Connection->needCommit()) { PooledSub *psub = ptr->takeAt(mem); Connection->closeConnection(psub->Sub); delete psub; } else psub->State = Free; return; } } if(Connection) Connection->closeConnection(sub); } void toConnectionPool::commit(bool wait) { toConnectionPoolExec *ex = new toConnectionPoolExec( this, toConnectionPoolExec::Commit); if(!wait) (new toRunnableThread(ex))->start(); else ex->run(); } void toConnectionPool::rollback(bool wait) { toConnectionPoolExec *ex = new toConnectionPoolExec( this, toConnectionPoolExec::Rollback); if(!wait) (new toRunnableThread(ex))->start(); else ex->run(); } void toConnectionPool::cancelAll(bool wait) { toConnectionPoolExec *ex = new toConnectionPoolExec( this, toConnectionPoolExec::Cancel); if(!wait) (new toRunnableThread(ex))->start(); else ex->run(); } void toConnectionPool::executeAll(const QString &sql, toQList ¶ms) { (new toRunnableThread(new toConnectionPoolExec( this, toConnectionPoolExec::Execute, sql, params)))->start(); } tora-2.1.3/src/toconnectionmodel.cpp0000644000175000017500000001270211332067047017273 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "toconnectionmodel.h" #include "tonewconnection.h" #include "utils.h" #include toConnectionModel::toConnectionModel() { } void toConnectionModel::setupData(QMap list) { m_data.clear(); m_data = list; reset(); } void toConnectionModel::readConfig() { m_data.clear(); QSettings Settings; Settings.beginGroup("connections"); Settings.beginGroup("history"); for (int pos = 0; pos < Settings.childGroups().count(); ++pos) { Settings.beginGroup(QString::number(pos)); // history\## entry in TOra.conf if (!Settings.contains("provider")) { Settings.endGroup(); break; } QString provider = Settings.value("provider", "").toString(); QString host = Settings.value("host", "").toString(); QString database = Settings.value("database", "").toString(); QString username = Settings.value("username", "").toString(); QString password = toUnobfuscate(Settings.value("password", "").toString()); QString schema = Settings.value("schema", "").toString(); QString color = Settings.value("color", "").toString(); if (provider == toNewConnection::ORACLE_TNS) host = ""; Settings.beginGroup("options"); std::set options; QStringList keys = Settings.allKeys(); Q_FOREACH(QString s, keys) { if (Settings.value(s, false).toBool()) options.insert(s); } Settings.endGroup(); toConnectionOptions opt( provider, host, database, username, password, schema, color, Settings.value("port", 0).toInt(), options); m_data[pos] = opt; Settings.endGroup(); } Settings.endGroup(); // history section reset(); } void toConnectionModel::append(int ix, toConnectionOptions conn) { m_data[ix] = conn; reset(); } bool toConnectionModel::removeRow(int row, const QModelIndex &parent) { beginRemoveRows(QModelIndex(), row, row + 1); QModelIndex ix = index(row, 0); int key = data(ix, Qt::DisplayRole).toInt(); bool ret = m_data.remove(key); endRemoveRows(); return ret; } QVariant toConnectionModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); if (orientation == Qt::Vertical) return section + 1; switch (section) { case 0 : return "#"; case 1 : return "Provider"; case 2 : return "Host"; case 3 : return "Database"; case 4 : return "Username"; case 5 : return "Schema"; } return "oops!"; } QVariant toConnectionModel::data(const QModelIndex & index, int role) const { if (!index.isValid()) return QVariant(); toConnectionOptions opt = m_data[index.row()]; switch (role) { case Qt::DisplayRole: switch (index.column()) { case 0 : return index.row(); case 1 : return opt.provider; case 2 : return opt.host; case 3 : return opt.database; case 4 : return opt.username; case 5 : return opt.schema; default : return "oops!"; } break; case Qt::DecorationRole: if (index.column() == 1 && toConfigurationSingle::Instance().colorizedConnections()) return connectionColorPixmap(opt.color); break; } return QVariant(); } Qt::ItemFlags toConnectionModel::flags(const QModelIndex & index) const { return Qt::ItemIsSelectable | Qt::ItemIsEnabled; } tora-2.1.3/src/toresultlistformat.cpp0000644000175000017500000001007511270353625017540 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #include "config.h" #include "toconf.h" #include "utils.h" #include "tolistviewformatter.h" #include "toresultlistformat.h" #include "toconfiguration.h" toResultListFormat::toResultListFormat(QWidget *parent, DialogType type, const char *name) : QDialog(parent) { setupUi(this); setModal(true); formatCombo->addItem(tr("Text")); formatCombo->addItem(tr("Tab delimited")); formatCombo->addItem(tr("CSV")); formatCombo->addItem(tr("HTML")); formatCombo->addItem(tr("SQL")); int num = toConfigurationSingle::Instance().defaultFormat(); formatCombo->setCurrentIndex(num); formatChanged(num); delimiterEdit->setText(toConfigurationSingle::Instance().csvDelimiter()); separatorEdit->setText(toConfigurationSingle::Instance().csvSeparator()); selectedRowsRadio->setChecked(type == TypeCopy); selectedColumnsRadio->setChecked(type == TypeCopy); allRowsRadio->setChecked(type == TypeExport); allColumnsRadio->setChecked(type == TypeExport); } toExportSettings toResultListFormat::exportSettings() { toExportSettings::RowExport r; toExportSettings::ColumnExport c; if (selectedRowsRadio->isChecked()) r = toExportSettings::RowsSelected; else if (displayedRowsRadio->isChecked()) r = toExportSettings::RowsDisplayed; else r = toExportSettings::RowsAll; if (selectedColumnsRadio->isChecked()) c = toExportSettings::ColumnsSelected; else c = toExportSettings::ColumnsAll; return toExportSettings(r, c, formatCombo->currentIndex(), includeRowHeaderCheck->isChecked(), includeColumnHeaderCheck->isChecked(), separatorEdit->text(), delimiterEdit->text()); } toExportSettings toResultListFormat::plaintextCopySettings() { return toExportSettings(toExportSettings::RowsSelected, toExportSettings::ColumnsSelected, 0, false, false, "", ""); } void toResultListFormat::formatChanged(int pos) { separatorEdit->setEnabled(pos == 2); delimiterEdit->setEnabled(pos == 2); } void toResultListFormat::accept() { toConfigurationSingle::Instance().setDefaultFormat(formatCombo->currentIndex()); QDialog::accept(); } tora-2.1.3/src/tosyntaxsetup.h0000644000175000017500000000554111336031775016175 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOSYNTAXSETUP_H #define TOSYNTAXSETUP_H #include "config.h" #include "tohelp.h" #include "tohighlightedtext.h" #include "ui_tosyntaxsetupui.h" #include "totool.h" #include #include class QFont; class toSyntaxSetup : public QWidget, public Ui::toSyntaxSetupUI, public toSettingTab { Q_OBJECT; QString List; QListWidgetItem *Current; std::map Colors; toSyntaxAnalyzer Analyzer; QString color(); public: toSyntaxSetup(QWidget *parent = 0, const char *name = 0, Qt::WFlags fl = 0); virtual void saveSetting(void); void checkFixedWidth(const QFont &fnt); public slots: virtual void changeLine(QListWidgetItem *); virtual void selectColor(void); virtual void selectFont(void); virtual void selectText(void); virtual void selectResultFont(void); virtual void changeUpper(bool val) { Example->setKeywordUpper(val); Example->update(); } virtual void changeHighlight(bool val) { Example->setSyntaxColoring(val); Example->update(); } void openEditorShortcutsDialog(); }; #endif tora-2.1.3/src/totuningsettingui.ui0000644000175000017500000000532311270353625017210 0ustar michaelmichael toTuningSettingUI 0 0 588 480 Form1 0 0 0 0 6 6 Server tuning 11 11 11 11 6 6 QAbstractItemView::MultiSelection true Available tabs Select which views collect data in the background that should be run. &Enabled background views false EnabledTabs toTreeWidget QTreeWidget
totreewidget.h
tora-2.1.3/src/topreferences.cpp0000644000175000017500000001222411270353625016414 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconnection.h" #include "toglobalsetting.h" #include "tohelp.h" #include "tomain.h" #include "topreferences.h" #include "tosyntaxsetup.h" #include #include #include #include #include void toPreferences::addWidget(QListWidgetItem *item, QWidget *widget) { Parent->layout()->addWidget(widget); Tabs[item] = widget; if (!Shown) Shown = widget; else widget->hide(); } void toPreferences::selectTab(QListWidgetItem *item) { QWidget *tab = Tabs[item]; if (tab) { if (Shown) Shown->hide(); tab->show(); Shown = tab; } } void toPreferences::displayPreferences(QWidget *parent) { toPreferences dialog(parent, "Options", true); if (dialog.exec()) dialog.saveSetting(); } void toPreferences::saveSetting(void) { for (std::map::iterator i = Tabs.begin();i != Tabs.end();i++) { toSettingTab *tab = dynamic_cast((*i).second); if (tab) tab->saveSetting(); } toConfigurationSingle::Instance().saveConfig(); } toPreferences::toPreferences(QWidget* parent, const char* name, bool modal, Qt::WFlags fl) : QDialog(parent), toHelpContext(QString::fromLatin1("preferences.html")) { setupUi(this); try { toHelp::connectDialog(this); Shown = NULL; // QVBoxLayout *vbox = new QVBoxLayout; // vbox->setSpacing(0); // vbox->setContentsMargins(0, 0, 0, 0); // setLayout(vbox); QListWidgetItem *item; item = new QListWidgetItem(tr("Global Settings"), TabSelection); addWidget(item, new toGlobalSetting(Parent)); item = new QListWidgetItem(tr("Editor Settings"), TabSelection); addWidget(item, new toSyntaxSetup(Parent)); item = new QListWidgetItem(tr("Database Settings"), TabSelection); addWidget(item, new toDatabaseSetting(Parent)); std::list prov = toConnectionProvider::providers(); for (std::list::iterator i = prov.begin();i != prov.end();i++) { QWidget *tab = toConnectionProvider::configurationTab(*i, Parent); if (tab) { QString str(QString::fromLatin1(" ")); str.append((*i)); addWidget(new QListWidgetItem(str, TabSelection), tab); } } item = new QListWidgetItem(tr("Tools"), TabSelection); addWidget(item, new toToolSetting(Parent)); TabSelection->setCurrentItem(0); std::map tools = toTool::tools(); std::map newSort; { for (std::map::iterator i = tools.begin();i != tools.end();i++) newSort[(*i).second->name()] = (*i).second; } { for (std::map::iterator i = newSort.begin();i != newSort.end();i++) { QWidget *tab = (*i).second->configurationTab(Parent); if (tab) { QString str(QString::fromLatin1(" ")); str.append((*i).first); addWidget(new QListWidgetItem(str, TabSelection), tab); } } } } TOCATCH; } void toPreferences::help(void) { if (Shown) Shown->setFocus(); toHelp::displayHelp(this); } tora-2.1.3/src/towaitevents.cpp0000644000175000017500000005543211270353625016314 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "tonoblockquery.h" #include "topiechart.h" #include "toresultbar.h" #include "toresultview.h" #include "totool.h" #include "towaitevents.h" #include #include #include #include "totreewidget.h" #include #include #include #include #include #include #include #include #include class toWaitEventsItem : public toResultViewItem { int Color; public: toWaitEventsItem(toTreeWidget *parent, toTreeWidgetItem *after, const QString &buf = QString::null) : toResultViewItem(parent, after, QString::null) { Color = 0; setText(1, buf); int num = 1; if (after) num = after->text(0).toInt() + 1; setText(0, QString::number(num)); } void setColor(int color) { Color = color; } #if 0 // disabled, wrong override virtual void paintCell(QPainter * p, const QColorGroup & cg, int column, int width, int align) { if (column == 0) { QString ct = text(column); QBrush brush(isSelected() ? toChartBrush(Color) : QBrush(cg.base())); p->fillRect(0, 0, width, height(), QBrush(brush.color())); if (brush.style() != Qt::SolidPattern) p->fillRect(0, 0, width, height(), QBrush(Qt::white, brush.style())); } else toTreeWidgetItem::paintCell(p, cg, column, width, align); } #endif }; toWaitEvents::toWaitEvents(QWidget *parent, const char *name) : QWidget(parent) { if (name) setObjectName(name); setup( -1); } toWaitEvents::toWaitEvents(int session, QWidget *parent, const char *name) : QWidget(parent) { if (name) setObjectName(name); setup(session); } toWaitEvents::~toWaitEvents() { QSettings s; s.beginGroup("toWaitEvents"); s.setValue("splitter", splitter->saveState()); s.endGroup(); } void toWaitEvents::setup(int session) { Session = session; QVBoxLayout *vbox = new QVBoxLayout; vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); setLayout(vbox); QToolBar *toolbar = toAllocBar(this, tr("Server Tuning")); vbox->addWidget(toolbar); toolbar->addWidget( new QLabel(tr("Display") + " ", toolbar)); QComboBox *type = new QComboBox(toolbar); type->addItem(tr("Time")); type->addItem(tr("Count")); toolbar->addWidget(type); connect(type, SIGNAL(activated(int)), this, SLOT(changeType(int))); QLabel *stretch = new QLabel(toolbar); toolbar->addWidget(stretch); stretch->setAlignment(Qt::AlignRight | Qt::AlignVCenter); stretch->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum)); splitter = new QSplitter(Qt::Horizontal, this); vbox->addWidget(splitter); Types = new toTreeWidget(splitter); Types->addColumn(tr("Color")); Types->addColumn(tr("Wait type")); Types->addColumn(tr("Delta (ms/s)")); Types->addColumn(tr("Total (ms)")); Types->addColumn(tr("Delta (1/s)")); Types->addColumn(tr("Total")); Types->setColumnAlignment(2, Qt::AlignRight); Types->setColumnAlignment(3, Qt::AlignRight); Types->setColumnAlignment(4, Qt::AlignRight); Types->setColumnAlignment(5, Qt::AlignRight); Types->setAllColumnsShowFocus(true); Types->setSelectionMode(toTreeWidget::Multi); Types->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); QString str(toConfigurationSingle::Instance().listFont()); if (!str.isEmpty()) { QFont font(toStringToFont(str)); Types->setFont(font); } QFrame *frame = new QFrame(splitter); QGridLayout *layout = new QGridLayout(frame); Delta = new toResultBar(frame); Delta->setTitle(tr("System wait events")); Delta->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); Delta->showLegend(false); Delta->setYPostfix(" " + tr("ms/s")); Delta->setYPostfix(" " + tr("ms/s")); Delta->setSQLName(QString::fromLatin1("toTuning:WaitEvents")); layout->addWidget(Delta, 0, 0, 1, 0); DeltaTimes = new toResultBar(frame); DeltaTimes->setTitle(tr("System wait events count")); DeltaTimes->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); DeltaTimes->showLegend(false); DeltaTimes->setYPostfix(" " + tr("ms/s")); DeltaTimes->hide(); DeltaTimes->setYPostfix(" " + tr("waits/s")); DeltaTimes->setSQLName(QString::fromLatin1("toTuning:WaitEventsCount")); layout->addWidget(DeltaTimes, 0, 0, 1, 0); connect(Types, SIGNAL(selectionChanged()), this, SLOT(changeSelection())); DeltaPie = new toPieChart(frame); DeltaPie->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); DeltaPie->showLegend(false); layout->addWidget(DeltaPie, 1, 0); AbsolutePie = new toPieChart(frame); AbsolutePie->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); AbsolutePie->showLegend(false); layout->addWidget(AbsolutePie, 1, 1); connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); Query = NULL; start(); try { connect(toCurrentTool(this), SIGNAL(connectionChange()), this, SLOT(connectionChanged())); } TOCATCH QSettings s; s.beginGroup("toWaitEvents"); QByteArray ba = s.value("splitter", QByteArray()).toByteArray(); s.endGroup(); if (ba.isNull()) { // first run QList siz; siz << 1 << 2; splitter->setSizes(siz); } else splitter->restoreState(ba); LastTime = 0; First = true; ShowTimes = false; } void toWaitEvents::changeType(int item) { ShowTimes = item; if (ShowTimes) { DeltaTimes->show(); Delta->hide(); } else { DeltaTimes->hide(); Delta->show(); } changeSelection(); } void toWaitEvents::setSession(int session) { try { Types->clear(); Session = session; First = true; Now = QString::null; LastTime = 0; Labels.clear(); LastCurrent.clear(); Current.clear(); CurrentTimes.clear(); Relative.clear(); RelativeTimes.clear(); Enabled.clear(); Poll.stop(); delete Query; Query = NULL; refresh(); } TOCATCH } void toWaitEvents::start(void) { try { connect(toCurrentTool(this)->timer(), SIGNAL(timeout()), this, SLOT(refresh())); } TOCATCH } void toWaitEvents::stop(void) { try { disconnect(toCurrentTool(this)->timer(), SIGNAL(timeout()), this, SLOT(refresh())); } TOCATCH } void toWaitEvents::changeSelection(void) { int count = int(Labels.size()); bool *enabled = new bool[count]; int typ = 0; std::map usedMap; { for (std::list::iterator i = Labels.begin();i != Labels.end();i++) { usedMap[*i] = typ; enabled[typ] = false; typ++; } } for (toTreeWidgetItem *item = Types->firstChild();item;item = item->nextSibling()) { QString txt = item->text(1); if (usedMap.find(txt) == usedMap.end()) toStatusMessage(tr("Internal error, can't find (%1) in usedMap").arg(txt)); if (item->isSelected()) enabled[usedMap[txt]] = true; } try { Enabled.clear(); int ind = 0; { for (std::list::iterator i = Labels.begin();i != Labels.end();i++) { Enabled.insert(Enabled.end(), enabled[ind]); ind++; } } Delta->setEnabledCharts(Enabled); DeltaTimes->setEnabledCharts(Enabled); std::list absolute; std::list relative; { std::list::iterator i = (ShowTimes ? LastTimes : LastCurrent).begin(); std::list::iterator j = (ShowTimes ? RelativeTimes : Relative).begin(); std::list::iterator k = Enabled.begin(); while (i != (ShowTimes ? LastTimes : LastCurrent).end() && k != Enabled.end()) { if (*k) { if (j != (ShowTimes ? RelativeTimes : Relative).end()) relative.insert(relative.end(), *j); absolute.insert(absolute.end(), *i); } else { if (j != (ShowTimes ? RelativeTimes : Relative).end()) relative.insert(relative.end(), 0); absolute.insert(absolute.end(), 0); } i++; if (j != (ShowTimes ? RelativeTimes : Relative).end()) j++; k++; } } double total = 0; { for (std::list::iterator i = absolute.begin();i != absolute.end();i++) total += *i; } AbsolutePie->setValues(absolute, Labels); AbsolutePie->setTitle(tr("Absolute system wait events\nTotal %1%2"). arg(total / 1000).arg(QString::fromLatin1(ShowTimes ? "" : " s"))); total = 0; for (std::list::iterator i = relative.begin();i != relative.end();i++) total += *i; DeltaPie->setValues(relative, Labels); if (total > 0) DeltaPie->setTitle(tr("Delta system wait events\nTotal %1%2"). arg(total).arg(QString::fromLatin1(ShowTimes ? "/s" : " ms/s"))); else DeltaPie->setTitle(QString::null); } TOCATCH delete[] enabled; } void toWaitEvents::connectionChanged(void) { LastCurrent.clear(); LastTimes.clear(); Labels.clear(); Relative.clear(); RelativeTimes.clear(); delete Query; Query = NULL; LastTime = 0; First = true; refresh(); } void toWaitEvents::poll(void) { try { if (!toCheckModal(this)) return ; if (Query && Query->poll()) { while (Query->poll() && !Query->eof()) { QString cur = Query->readValueNull(); Now = Query->readValueNull(); if (First) { Labels.insert(Labels.end(), cur); Current.insert(Current.end(), Query->readValueNull().toDouble()); CurrentTimes.insert(CurrentTimes.end(), Query->readValueNull().toDouble()); } else { double val = Query->readValueNull().toDouble(); double tim = Query->readValueNull().toDouble(); std::list::iterator i = Current.begin(); std::list::iterator j = CurrentTimes.begin(); std::list::iterator k = Labels.begin(); while (i != Current.end() && j != CurrentTimes.end() && k != Labels.end()) { if (*k == cur) { *i = val; *j = tim; break; } i++; j++; k++; } } Query->readValueNull().toDouble(); } if (Query->eof()) { std::map types; toTreeWidgetItem *item = NULL; { for (toTreeWidgetItem *ci = Types->firstChild();ci;ci = ci->nextSibling()) { types[ci->text(1)] = true; item = ci; } } { std::list::iterator j = CurrentTimes.begin(); for (std::list::iterator i = Labels.begin();i != Labels.end();i++, j++) { if ((*j) != 0 && types.find(*i) == types.end()) { item = new toWaitEventsItem(Types, item, *i); item->setSelected(First && HideMap.find(*i) == HideMap.end()); types[*i] = true; } } } if (First) { Delta->setLabels(Labels); DeltaTimes->setLabels(Labels); First = false; } time_t now = time(NULL); for (toTreeWidgetItem *ci = Types->firstChild();ci;ci = ci->nextSibling()) { toWaitEventsItem * item = dynamic_cast(ci); if (item) { int col = 0; std::list::iterator i = Current.begin(); std::list::iterator j = CurrentTimes.begin(); std::list::iterator k = Labels.begin(); while (i != Current.end() && j != CurrentTimes.end() && k != Labels.end()) { if (item->text(1) == *k) { item->setColor(col); item->setText(2, QString::number((*i - item->text(3).toDouble()) / std::max(int(now - LastTime), 1))); item->setText(3, QString::number(*i)); item->setText(4, QString::number((*j - item->text(5).toDouble()) / std::max(int(now - LastTime), 1))); item->setText(5, QString::number(*j)); break; } col++; i++; j++; k++; } } } Relative.clear(); RelativeTimes.clear(); std::list::iterator j = LastCurrent.begin(); std::list::iterator i = Current.begin(); while (i != Current.end() && j != LastCurrent.end()) { Relative.insert(Relative.end(), ((*i) - (*j)) / std::max(int(now - LastTime), 1)); i++; j++; } j = LastTimes.begin(); i = CurrentTimes.begin(); while (i != CurrentTimes.end() && j != LastTimes.end()) { RelativeTimes.insert(RelativeTimes.end(), ((*i) - (*j)) / std::max(int(now - LastTime), 1)); i++; j++; } LastTime = now; LastTimes = CurrentTimes; LastCurrent = Current; if (Relative.begin() != Relative.end()) { Delta->addValues(Relative, Now); DeltaTimes->addValues(RelativeTimes, Now); } changeSelection(); delete Query; Query = NULL; Poll.stop(); } } } catch (const QString &exc) { delete Query; Query = NULL; Poll.stop(); toStatusMessage(exc); } } static toSQL SQLSessionWaitEvents("toWaitEvents:Session", "SELECT b.name,\n" " SYSDATE,\n" " NVL(a.time_waited,0)*10,\n" " NVL(a.total_waits,0),\n" " NVL(a.time_waited,0)\n" " FROM v$session_event a,\n" " v$event_name b\n" " WHERE b.name=a.event(+)\n" " AND a.sid=:sid\n" " AND b.name NOT LIKE'%timer%'\n" " AND b.name NOT IN('rdbms ipc message',\n" " 'SQL*Net message from client')\n" " UNION ALL SELECT b.name,\n" " SYSDATE,\n" " NVL(a.time_waited,0)*10,\n" " NVL(a.total_waits,0),\n" " 1\n" " FROM v$session_event a,\n" " v$event_name b\n" " WHERE b.name=a.event(+)\n" " AND a.sid=:sid\n" " AND (b.name LIKE'%timer%'OR b.name IN('rdbms ipc message',\n" " 'SQL*Net message from client'))\n" " UNION ALL SELECT b.name,\n" " SYSDATE,\n" " NVL(a.VALUE,0)*10,\n" " 1,\n" " NVL(a.VALUE,0)\n" " FROM v$sesstat a,\n" " v$statname b\n" " WHERE b.name='CPU used by this session'\n" " AND a.sid=:sid\n" " AND a.statistic#=b.statistic#\n" " ORDER BY 5 DESC,\n" " 3 DESC,\n" " 4 DESC", "Get all available session wait events"); static toSQL SQLWaitEvents("toWaitEvents:System", "SELECT b.name,\n" " SYSDATE,\n" " NVL(a.time_waited,0)*10,\n" " NVL(a.total_waits,0),\n" " NVL(a.time_waited,0)\n" " FROM v$system_event a,\n" " v$event_name b\n" " WHERE b.name=a.event(+)\n" " AND b.name NOT LIKE'%timer%'\n" " AND b.name NOT IN('rdbms ipc message',\n" " 'SQL*Net message from client')\n" " UNION ALL SELECT b.name,\n" " SYSDATE,\n" " NVL(a.time_waited,0)*10,\n" " NVL(a.total_waits,0),\n" " 1\n" " FROM v$system_event a,\n" " v$event_name b\n" " WHERE b.name=a.event(+)\n" " AND (b.name LIKE'%timer%'OR b.name IN('rdbms ipc message',\n" " 'SQL*Net message from client'))\n" " UNION ALL SELECT s.name,\n" " SYSDATE,\n" " NVL(s.VALUE,0)*10,\n" " 1,\n" " NVL(s.VALUE,0)\n" " FROM v$sysstat s\n" " WHERE s.name='CPU used by this session'\n" " ORDER BY 5 DESC,\n" " 3 DESC,\n" " 4 DESC", "Get all available system wait events"); void toWaitEvents::refresh(void) { try { if (Query || LastTime == time(NULL)) return ; toConnection &conn = toCurrentTool(this)->connection(); toQList par; QString sql; if (Session > 0) { sql = toSQL::string(SQLSessionWaitEvents, conn); par.insert(par.end(), toQValue(Session)); } else sql = toSQL::string(SQLWaitEvents, conn); Query = new toNoBlockQuery(conn, sql, par); Poll.start(100); } TOCATCH } void toWaitEvents::importData(std::map &data, const QString &prefix) { std::map::iterator i; int id = 1; while ((i = data.find(prefix + ":" + QString::number(id).toLatin1())) != data.end()) { HideMap[(*i).second] = true; id++; } } void toWaitEvents::exportData(std::map &data, const QString &prefix) { int id = 1; for (toTreeWidgetItem *ci = Types->firstChild();ci;ci = ci->nextSibling()) { toWaitEventsItem * item = dynamic_cast(ci); if (!item->isSelected()) { data[prefix + ":" + QString::number(id).toLatin1()] = item->allText(1); id++; } } } tora-2.1.3/src/tosecurityuserui.ui0000644000175000017500000002326011270353625017054 0ustar michaelmichael toSecurityUserUI 0 0 560 480 Form1 11 6 &Name Name false P&rofile Profile false 20 20 QSizePolicy::Expanding Qt::Vertical 7 1 &Password 11 6 Enter Password Password false QLineEdit::Password QLineEdit::Password Confirm Password Password2 false 20 20 QSizePolicy::Expanding Qt::Horizontal Expire Password &External 11 6 User authenticated by the operating system false &Global 11 6 &X.500 External Name GlobalName false 20 20 QSizePolicy::Expanding Qt::Vertical &Temporary Tablespace TempSpace false &Account Locked &Default Tablespace DefaultSpace false Name Profile Authentication Password Password2 ExpirePassword GlobalName DefaultSpace TempSpace Locked tora-2.1.3/src/tosgatrace.cpp0000644000175000017500000003633011270353625015710 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "tochangeconnection.h" #include "toconf.h" #include "toconnection.h" #include "tomain.h" #include "toresultcombo.h" #include "toresulttableview.h" #include "toresultresources.h" #include "toresultview.h" #include "tosgastatement.h" #include "tosgatrace.h" #include "tosql.h" #include "totool.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "icons/refresh.xpm" #include "icons/tosgatrace.xpm" // #define CONF_AUTO_UPDATE "AutoUpdate" class toSGATracePrefs : public QGroupBox, public toSettingTab { QCheckBox* AutoUpdate; toTool *Tool; public: toSGATracePrefs(toTool *tool, QWidget* parent = 0, const char* name = 0) : QGroupBox(parent), toSettingTab("trace.html"), Tool(tool) { if (name) setObjectName(name); QVBoxLayout *vbox = new QVBoxLayout; vbox->setSpacing(6); vbox->setContentsMargins(11, 11, 11, 11); setLayout(vbox); setTitle(qApp->translate("toSGATracePrefs", "SGA Trace")); AutoUpdate = new QCheckBox(this); AutoUpdate->setText(qApp->translate("toSGATracePrefs", "&Auto update")); AutoUpdate->setToolTip(qApp->translate("toSGATracePrefs", "Update automatically after change of schema.")); vbox->addWidget(AutoUpdate); QSpacerItem *spacer = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding); vbox->addItem(spacer); // if (!Tool->config(CONF_AUTO_UPDATE, "Yes").isEmpty()) // AutoUpdate->setChecked(true); AutoUpdate->setChecked(toConfigurationSingle::Instance().autoUpdate()); } virtual void saveSetting(void) { // if (AutoUpdate->isChecked()) // Tool->setConfig(CONF_AUTO_UPDATE, "Yes"); // else // Tool->setConfig(CONF_AUTO_UPDATE, ""); toConfigurationSingle::Instance().setAutoUpdate(AutoUpdate->isChecked()); } }; class toSGATraceTool : public toTool { protected: virtual const char **pictureXPM(void) { return const_cast(tosgatrace_xpm); } public: toSGATraceTool() : toTool(230, "SGA Trace") { } virtual const char *menuItem() { return "SGA Trace"; } virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) { return new toSGATrace(parent, connection); } virtual QWidget *configurationTab(QWidget *parent) { return new toSGATracePrefs(this, parent); } virtual void closeWindow(toConnection &connection) {}; }; static toSGATraceTool SGATraceTool; toSGATrace::toSGATrace(QWidget *main, toConnection &connection) : toToolWidget(SGATraceTool, "trace.html", main, connection, "toSGATrace") { QToolBar *toolbar = toAllocBar(this, tr("SGA trace")); layout()->addWidget(toolbar); FetchAct = new QAction(QPixmap(const_cast(refresh_xpm)), tr("Fetch statements in SGA"), this); FetchAct->setShortcut(QKeySequence::Refresh); connect(FetchAct, SIGNAL(triggered()), this, SLOT(refresh(void))); toolbar->addAction(FetchAct); toolbar->addSeparator(); QLabel * labSchema = new QLabel(tr("Schema") + " ", toolbar); toolbar->addWidget(labSchema); Schema = new toResultCombo(toolbar); Schema->additionalItem(tr("Any")); Schema->setSelected(connection.user().toUpper()); Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST)); toolbar->addWidget(Schema); connect(Schema, SIGNAL(activated(const QString &)), this, SLOT(changeSchema(const QString &))); toolbar->addSeparator(); QLabel * labRef = new QLabel(tr("Refresh") + " ", toolbar); toolbar->addWidget(labRef); connect(Refresh = toRefreshCreate(toolbar, TO_TOOLBAR_WIDGET_NAME), SIGNAL(activated(const QString &)), this, SLOT(changeRefresh(const QString &))); toolbar->addWidget(Refresh); toolbar->addSeparator(); QLabel * labType = new QLabel(tr("Type") + " ", toolbar); toolbar->addWidget(labType); Type = new QComboBox(toolbar); Type->addItem(tr("SGA")); Type->addItem(tr("Long operations")); toolbar->addWidget(Type); toolbar->addSeparator(); QLabel * labSelect = new QLabel(tr("Selection") + " ", toolbar); toolbar->addWidget(labSelect); Limit = new QComboBox(toolbar); Limit->addItem(tr("All")); Limit->addItem(tr("Unfinished")); Limit->addItem(tr("1 execution, 1 parse")); Limit->addItem(tr("Top executions")); Limit->addItem(tr("Top sorts")); Limit->addItem(tr("Top diskreads")); Limit->addItem(tr("Top buffergets")); Limit->addItem(tr("Top rows")); Limit->addItem(tr("Top sorts/exec")); Limit->addItem(tr("Top diskreads/exec")); Limit->addItem(tr("Top buffergets/exec")); Limit->addItem(tr("Top rows/exec")); Limit->addItem(tr("Top buffers/row")); toolbar->addWidget(Limit); toolbar->addWidget(new toSpacer()); new toChangeConnection(toolbar, TO_TOOLBAR_WIDGET_NAME); QSplitter *splitter = new QSplitter(Qt::Vertical, this); layout()->addWidget(splitter); Trace = new toResultTableView(false, false, splitter); QList list; list.append(75); splitter->setSizes(list); Trace->setReadAll(true); Statement = new toSGAStatement(splitter); connect(Trace, SIGNAL(selectionChanged()), this, SLOT(changeItem())); CurrentSchema = connection.user().toUpper(); updateSchemas(); try { connect(timer(), SIGNAL(timeout(void)), this, SLOT(refresh(void))); toRefreshParse(timer(), toConfigurationSingle::Instance().refresh()); } TOCATCH; setFocusProxy(Trace); } void toSGATrace::changeRefresh(const QString &str) { try { toRefreshParse(timer(), str); } TOCATCH; } #define LARGE_BUFFER 4096 void toSGATrace::changeSchema(const QString &str) { if (str != tr("Any")) CurrentSchema = str; else CurrentSchema = QString::null; if (toConfigurationSingle::Instance().autoUpdate()) refresh(); } static toSQL SQLSGATrace("toSGATrace:SGATrace", "SELECT a.SQL_Text \"SQL Text\",\n" " a.First_Load_Time \"First Load Time\",\n" " b.username \"Parsing Schema\",\n" " a.Parse_Calls \"Parse Calls\",\n" " a.Executions \"Executions\",\n" " a.Sorts \"Sorts\",\n" " a.Disk_Reads \"Disk Reads\",\n" " a.Buffer_Gets \"Buffer Gets\",\n" " a.Rows_Processed \"Rows\",\n" " DECODE(a.Executions,0,'N/A',ROUND(a.Sorts/a.Executions,3)) \"Sorts/Exec\",\n" " DECODE(a.Executions,0,'N/A',ROUND(a.Disk_Reads/a.Executions,3)) \"Disk/Exec\",\n" " DECODE(a.Executions,0,'N/A',ROUND(a.Buffer_Gets/a.Executions,3)) \"Buffers/Exec\",\n" " DECODE(a.Executions,0,'N/A',ROUND(a.Rows_Processed/a.Executions,3)) \"Rows/Exec\",\n" " DECODE(a.Rows_Processed,0,'N/A',ROUND(a.Sorts/a.Rows_Processed,3)) \"Sorts/Rows\",\n" " DECODE(a.Rows_Processed,0,'N/A',ROUND(a.Disk_Reads/a.Rows_Processed,3)) \"Disk/Rows\",\n" " DECODE(a.Rows_Processed,0,'N/A',ROUND(a.Buffer_Gets/a.Rows_Processed,3)) \"Buffers/Rows\",\n" " a.Address||':'||a.Hash_Value \" \"\n" " from v$sqlarea a,\n" " sys.all_users b\n" " where a.parsing_user_id = b.user_id", "Display the contents of the SGA stack. Must have one hidden column " "with SGA address at the end and a table name 'b' with a column username and must accept \"and ...\" clauses at end."); static toSQL SQLLongOps(TOSQL_LONGOPS, "SELECT b.opname \"Type\",\n" " a.SQL_Text \"SQL Text\",\n" " b.start_time \"Start Time\",\n" " b.sofar||'/'||b.totalwork \"Completed/Total\",\n" " b.elapsed_seconds||'/'||(b.elapsed_seconds+b.time_remaining) \"Completed/Total Time\",\n" " b.username \"Parsing Schema\",\n" " a.Parse_Calls \"Parse Calls\",\n" " a.Executions \"Executions\",\n" " a.Sorts \"Sorts\",\n" " a.Disk_Reads \"Disk Reads\",\n" " a.Buffer_Gets \"Buffer Gets\",\n" " a.Rows_Processed \"Rows\",\n" " DECODE(a.Executions,0,'N/A',ROUND(a.Sorts/a.Executions,3)) \"Sorts/Exec\",\n" " DECODE(a.Executions,0,'N/A',ROUND(a.Disk_Reads/a.Executions,3)) \"Disk/Exec\",\n" " DECODE(a.Executions,0,'N/A',ROUND(a.Buffer_Gets/a.Executions,3)) \"Buffers/Exec\",\n" " DECODE(a.Executions,0,'N/A',ROUND(a.Rows_Processed/a.Executions,3)) \"Rows/Exec\",\n" " DECODE(a.Rows_Processed,0,'N/A',ROUND(a.Sorts/a.Rows_Processed,3)) \"Sorts/Rows\",\n" " DECODE(a.Rows_Processed,0,'N/A',ROUND(a.Disk_Reads/a.Rows_Processed,3)) \"Disk/Rows\",\n" " DECODE(a.Rows_Processed,0,'N/A',ROUND(a.Buffer_Gets/a.Rows_Processed,3)) \"Buffers/Rows\",\n" " b.SQL_Address||':'||b.SQL_Hash_Value \" \"\n" " from v$sqlarea a,\n" " v$session_longops b\n" " where b.sql_address = a.address(+)\n" " and b.sql_hash_value = a.hash_value(+)\n" " and b.opname is not null", "Display the contents of long the long operations list. Must have a hidden column " "with SGA address at the end and a table name 'b' with a column username and sid " "and must accept \"and ...\" clauses at end."); void toSGATrace::refresh(void) { try { updateSchemas(); QString select; switch (Type->currentIndex()) { case 0: select = toSQL::string(SQLSGATrace, connection()); break; case 1: select = toSQL::string(SQLLongOps, connection()); break; default: toStatusMessage(tr("Unknown type of trace")); return ; } if (!CurrentSchema.isEmpty()) select.append(QString::fromLatin1("\n and b.username = :f1")); QString order; switch (Limit->currentIndex()) { case 0: break; case 1: if (Type->currentIndex() == 1) select += QString::fromLatin1("\n and b.sofar != b.totalwork"); else toStatusMessage(tr("Unfinished is only available for long operations")); break; case 2: select += QString::fromLatin1("\n and a.executions = 1 and a.parse = 1"); break; case 3: order = QString::fromLatin1("a.Executions"); break; case 4: order = QString::fromLatin1("a.Sorts"); break; case 5: order = QString::fromLatin1("a.Disk_Reads"); break; case 6: order = QString::fromLatin1("a.Buffer_Gets"); break; case 7: order = QString::fromLatin1("a.Rows_Processed"); break; case 8: order = QString::fromLatin1("DECODE(a.Executions,0,0,a.Sorts/a.Executions)"); break; case 9: order = QString::fromLatin1("DECODE(a.Executions,0,0,a.Disk_Reads/a.Executions)"); break; case 10: order = QString::fromLatin1("DECODE(a.Executions,0,0,a.Buffer_Gets/a.Executions)"); break; case 11: order = QString::fromLatin1("DECODE(a.Executions,0,0,a.Rows_Processed/a.Executions)"); break; case 12: order = QString::fromLatin1("DECODE(a.Rows_Processed,0,0,a.Buffer_Gets/a.Rows_Processed)"); break; default: toStatusMessage(tr("Unknown selection")); break; } if (!order.isEmpty()) select = QString("SELECT * FROM (\n") + select + QString("\n ORDER BY " + order + " DESC)\n WHERE ROWNUM < 20"); Trace->setSQL(QString::null); if (!CurrentSchema.isEmpty()) { toQList p; p.insert(p.end(), CurrentSchema); Trace->query(select, p); } else Trace->query(select); Statement->refresh(); } TOCATCH; } void toSGATrace::updateSchemas(void) { try { Schema->refresh(); } TOCATCH; } void toSGATrace::changeItem() { QModelIndex s = Trace->selectedIndex(Trace->model()->columnCount() - 1); if (s.isValid()) Statement->changeAddress(s.data(Qt::EditRole).toString()); } tora-2.1.3/src/tohelpsetup.h0000644000175000017500000000503411270353625015572 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOHELPSETUP_H #define TOHELPSETUP_H #include "config.h" #include #include #include "ui_tohelpui.h" #include "ui_tohelpaddfileui.h" #include "ui_tohelpsetupui.h" #include "totool.h" class toHelpAddFile : public QDialog, public Ui::toHelpAddFileUI { Q_OBJECT; public: toHelpAddFile(QWidget *parent, const char *name = 0); public slots: virtual void browse(void); virtual void valid(void); }; class toHelpPrefs : public QWidget, public Ui::toHelpSetupUI, public toSettingTab { Q_OBJECT; toTool *Tool; public: toHelpPrefs(toTool *tool, QWidget *parent, const char *name = 0); public slots: virtual void saveSetting(void); virtual void addFile(void); virtual void delFile(void); virtual void oracleManuals(void); }; #endif tora-2.1.3/src/toaboutui.ui0000644000175000017500000000505111270353625015416 0ustar michaelmichael toAboutUI 0 0 625 500 toAboutUI 9 9 9 9 6 6 &Ok true Cancel Qt::Horizontal QSizePolicy::Expanding 20 20 false OkButton CancelButton OkButton clicked() toAboutUI accept() 20 20 20 20 CancelButton clicked() toAboutUI reject() 20 20 20 20 tora-2.1.3/src/toresultfield.cpp0000644000175000017500000001201511364116201016422 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "tonoblockquery.h" #include "toresultfield.h" #include "tosql.h" #include "tosqlparse.h" #include "totool.h" toResultField::toResultField(QWidget *parent, const char *name) : toHighlightedText(parent, name) { setReadOnly(true); Query = NULL; connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); whichResultField = 1; } toResultField::~toResultField() { delete Query; } void toResultField::query(const QString &sql, const toQList ¶m) { if (!setSQLParams(sql, param)) return ; setFilename(QString::null); try { clear(); Unapplied = QString::null; if (Query) { delete Query; Query = NULL; } Query = new toNoBlockQuery(connection(), toQuery::Background, sql, param); Poll.start(100); } TOCATCH } #define THRESHOLD 10240 void toResultField::poll(void) { try { if (!toCheckModal(this)) return ; if (Query && Query->poll()) { while (Query->poll() && !Query->eof()) { // For some MySQL statements (say "show create function aaa.bbb") more than one column is returned // and it is not possible to control that (or I do not know how to do it). This workaround will get // a required field (say 3rd) from a result set returned. int fieldNo = whichResultField; // by default this would be set to 1 in constructor while (fieldNo > 1) { fieldNo--; Query->readValue(); } Unapplied += Query->readValue(); // Read any remaining columns for queries with specific field to fetch. // This is primarily used for MySQL statements like "show create..." which // return different uncontrollable number of fields for different users. // If remaining fields are not fetched polling thread will loop. if (whichResultField > 1) while (!Query->eof()) Query->readValue(); } if (Unapplied.length() > THRESHOLD) { append(Unapplied); Unapplied = QString::null; } if (Query->eof()) { delete Query; Query = NULL; Poll.stop(); try { // Code is formatted if it is set in preferences (Preferences->Editor Extensions) to // indent (format) a read only code AND! if it is not a MySQL code because current // TOra code parser/indenter does not work correctly with MySQL code (routines) if (toConfigurationSingle::Instance().autoIndentRo() && !toIsMySQL(connection())) setText(toSQLParse::indent(text() + Unapplied)); else append(Unapplied); } TOCATCH Unapplied = QString::null; } } } catch (const QString &exc) { delete Query; Query = NULL; Poll.stop(); toStatusMessage(exc); } } tora-2.1.3/src/toawr.h0000644000175000017500000000463711414153116014353 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOAWR_H #define TOAWR_H #include #include "totool.h" #include class toResultView; class QLineEdit; class toConnection; class toResultCombo; class toAWR : public toToolWidget { Q_OBJECT; toResultView *Result; QAction *updateAct; QTabWidget *Tabs; QTextBrowser *tb; toResultCombo *dbid, *fsnap, *tsnap; QDateTimeEdit *startdate, *enddate; public: toAWR(/*toTool *tool,*/ QWidget *parent,toConnection &connection); virtual ~toAWR(); protected: void closeEvent(QCloseEvent *event); private slots: void execute(void); void instanceChanged(int); void instanceRead(void); void startDateChanged(QDate); void endDateChanged(QDate); }; #endif tora-2.1.3/src/tolistviewformattertabdel.h0000644000175000017500000000430511270353625020527 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOLISTVIEWFORMATTERTABDEL_H #define TOLISTVIEWFORMATTERTABDEL_H #include "config.h" #include "tolistviewformatter.h" class toListViewFormatterTabDel : public toListViewFormatter { public: toListViewFormatterTabDel(); virtual ~toListViewFormatterTabDel(); //virtual QString getFormattedString(toListView& tListView); virtual QString getFormattedString(toExportSettings &settings, const QAbstractItemModel * model); }; #endif tora-2.1.3/src/toconnectionimportui.ui0000644000175000017500000000475111270353625017704 0ustar michaelmichael toConnectionImport 0 0 679 456 Import Connections &From: toolComboBox 0 0 &Run... true Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() toConnectionImport accept() 248 254 157 274 buttonBox rejected() toConnectionImport reject() 316 260 286 274 tora-2.1.3/src/tosyntaxsetup.cpp0000644000175000017500000003437611351477072016541 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "tohighlightedtext.h" #include "tosyntaxsetup.h" #include "shortcuteditor/shortcuteditordialog.h" #include #include #include #include #include #include #include #include #include "totreewidget.h" #include #include #include toSyntaxSetup::toSyntaxSetup(QWidget *parent, const char *name, Qt::WFlags fl) : QWidget(parent), toSettingTab("fonts.html"), Analyzer(toSyntaxAnalyzer::defaultAnalyzer()) { if (name) setObjectName(name); setupUi(this); KeywordUpper->setChecked(toConfigurationSingle::Instance().keywordUpper()); ObjectNamesUpper->setChecked(toConfigurationSingle::Instance().objectNamesUpper()); SyntaxHighlighting->setChecked(toConfigurationSingle::Instance().highlight()); EdgeMarkCheckBox->setChecked(toConfigurationSingle::Instance().useMaxTextWidthMark()); EdgeSizeSpinBox->setValue(toConfigurationSingle::Instance().maxTextWidthMark()); CodeCompletion->setChecked(toConfigurationSingle::Instance().codeCompletion()); EditorShortcuts->setChecked(toConfigurationSingle::Instance().useEditorShortcuts()); connect(EditorShortcutsEdit, SIGNAL(clicked()), this, SLOT(openEditorShortcutsDialog())); CompletionSort->setChecked(toConfigurationSingle::Instance().completionSort()); AutoIndent->setChecked(toConfigurationSingle::Instance().autoIndent()); Extensions->setText(toConfigurationSingle::Instance().extensions()); TabStop->setValue(toMarkedText::defaultTabWidth()); TabSpaces->setChecked(toConfigurationSingle::Instance().tabSpaces()); EStaticChecker->setText(toConfigurationSingle::Instance().staticChecker()); { QFont font(toStringToFont(toConfigurationSingle::Instance().codeFont())); checkFixedWidth(font); CodeExample->setFont(font); } TextExample->setFont(toStringToFont(toConfigurationSingle::Instance().textFont())); { QString str(toConfigurationSingle::Instance().listFont()); QFont font; if (str.isEmpty()) { QWidget *wid = new toTreeWidget; font = qApp->font(wid); } else { font = toStringToFont(str); } List = toFontToString(font); ResultExample->setFont(font); } try { #define INIT_COL(c) { \ Colors[Analyzer.typeString(c)] = Analyzer.getColor(c); \ SyntaxComponent->addItem(tr(Analyzer.typeString(c).toAscii().constData())); \ } INIT_COL(toSyntaxAnalyzer::Default); INIT_COL(toSyntaxAnalyzer::Comment); INIT_COL(toSyntaxAnalyzer::Number); INIT_COL(toSyntaxAnalyzer::Keyword); INIT_COL(toSyntaxAnalyzer::String); INIT_COL(toSyntaxAnalyzer::DefaultBg); INIT_COL(toSyntaxAnalyzer::ErrorBg); INIT_COL(toSyntaxAnalyzer::DebugBg); INIT_COL(toSyntaxAnalyzer::CurrentLineMarker); INIT_COL(toSyntaxAnalyzer::StaticBg); } TOCATCH; Example->setAnalyzer(Analyzer); Example->setReadOnly(true); #ifdef TO_NO_ORACLE Example->setText(QString::fromLatin1("create procedure CheckObvious\n" "begin\n" " set Quest = 'Great'; -- This variable doesn't exist\n" " if Quest = 'Great' then\n" " call Obvious(true);\n" " end if;\n" "end")); #else Example->setText(QString::fromLatin1("create procedure CheckObvious as\n" "begin\n" " Quest:='Great'; -- This variable doesn't exist\n" " if Quest = 'Great' then\n" " Obvious(true);\n" " end if;\n" " HugeNumber := -12345678.90;\n" "/*\n" " * multi line comment\n" " */\n" "end;")); #endif Example->setCurrent(4); QMap Errors; Errors[2] = tr("Unknown variable"); Example->setErrors(Errors); Current = NULL; } // void toSyntaxAnalyzer::readColor(const QColor &def, infoType typ) { // QString conf(CONF_COLOR ":"); // conf += typeString(typ); // QString res = toConfigurationSingle::Instance().globalConfig(conf, ""); // // if (res.isEmpty()) // Colors[typ] = def; // else { // int r, g, b; // if (sscanf(res.toAscii().constData(), "%d,%d,%d", &r, &g, &b) != 3) // throw qApp->translate("toSyntaxAnalyzer", "Wrong format of color in setings"); // QColor col(r, g, b); // Colors[typ] = col; // } // } toSyntaxAnalyzer::infoType toSyntaxAnalyzer::typeString(const QString &str) { if (str == "Default") return Default; if (str == "Comment") return Comment; if (str == "Number") return Number; if (str == "Keyword") return Keyword; if (str == "String") return String; if (str == "Background") return DefaultBg; if (str == "Error background") return ErrorBg; if (str == "Debug background") return DebugBg; if (str == "Current line highlight") return CurrentLineMarker; if (str == "Static check background") return StaticBg; throw qApp->translate("toSyntaxAnalyzer", "Unknown type"); } QString toSyntaxAnalyzer::typeString(infoType typ) { switch (typ) { case Default: return "Default"; case Comment: return "Comment"; case Number: return "Number"; case Keyword: return "Keyword"; case String: return "String"; case DefaultBg: return "Background"; case ErrorBg: return "Error background"; case DebugBg: return "Debug background"; case CurrentLineMarker: return "Current line highlight"; case StaticBg: return "Static check background"; } throw qApp->translate("toSyntaxAnalyzer", "Unknown type"); } void toSyntaxAnalyzer::updateSettings(void) { try { Colors[Default] = toConfigurationSingle::Instance().syntaxDefault(); Colors[Comment] = toConfigurationSingle::Instance().syntaxComment(); Colors[Number] = toConfigurationSingle::Instance().syntaxNumber(); Colors[Keyword] = toConfigurationSingle::Instance().syntaxKeyword(); Colors[String] = toConfigurationSingle::Instance().syntaxString(); Colors[DefaultBg] = toConfigurationSingle::Instance().syntaxDefaultBg(); Colors[ErrorBg] = toConfigurationSingle::Instance().syntaxErrorBg(); Colors[DebugBg] = toConfigurationSingle::Instance().syntaxDebugBg(); Colors[CurrentLineMarker] = toConfigurationSingle::Instance().syntaxCurrentLineMarker(); Colors[StaticBg] = toConfigurationSingle::Instance().syntaxStaticBg(); } TOCATCH } void toSyntaxSetup::checkFixedWidth(const QFont &fnt) { QFontMetrics mtr(fnt); if (mtr.width(QString::fromLatin1("iiiiiiii")) == mtr.width(QString::fromLatin1("MMMMMMMM"))) KeywordUpper->setEnabled(true); else { KeywordUpper->setChecked(false); KeywordUpper->setEnabled(false); } } void toSyntaxSetup::selectFont(void) { bool ok = true; QFont font = QFontDialog::getFont(&ok, CodeExample->font(), this); if (ok) { CodeExample->setFont(font); Example->setFont(font); checkFixedWidth(font); } } void toSyntaxSetup::selectText(void) { bool ok = true; QFont font = QFontDialog::getFont(&ok, TextExample->font(), this); if (ok) TextExample->setFont(font); } void toSyntaxSetup::selectResultFont(void) { bool ok = true; QFont font = QFontDialog::getFont(&ok, toStringToFont(List), this); if (ok) { List = toFontToString(font); ResultExample->setFont(font); } } void toSyntaxSetup::openEditorShortcutsDialog() { ShortcutEditorDialog dia(this); dia.exec(); } QString toSyntaxSetup::color() { QString t = Current->text(); for (std::map::iterator i = Colors.begin();i != Colors.end();i++) if (qApp->translate("toSyntaxSetup", (*i).first.toAscii().constData()) == t) return (*i).first; throw tr("Unknown color name %1").arg(t); } void toSyntaxSetup::changeLine(QListWidgetItem *item) { Current = item; if (Current) { QColor col = Colors[color()]; QPalette palette = ExampleColor->palette(); palette.setColor(QPalette::Background, col); ExampleColor->setPalette(palette); } } void toSyntaxSetup::selectColor(void) { try { if (Current) { QString coleng = color(); QColor col = QColorDialog::getColor(Colors[coleng]); if (col.isValid()) { Colors[coleng] = col; QPalette palette = ExampleColor->palette(); palette.setColor(QPalette::Background, col); ExampleColor->setPalette(palette); Example->analyzer().Colors[toSyntaxAnalyzer::typeString(coleng)] = col; Example->updateSyntaxColor(toSyntaxAnalyzer::typeString(coleng)); Example->update(); } } } TOCATCH } void toSyntaxSetup::saveSetting(void) { toConfigurationSingle::Instance().setTextFont(toFontToString(TextExample->font())); toConfigurationSingle::Instance().setCodeFont(toFontToString(CodeExample->font())); toConfigurationSingle::Instance().setListFont(List); bool highlight = SyntaxHighlighting->isChecked(); toConfigurationSingle::Instance().setHighlight(highlight); toConfigurationSingle::Instance().setUseMaxTextWidthMark(EdgeMarkCheckBox->isChecked()); toConfigurationSingle::Instance().setMaxTextWidthMark(EdgeSizeSpinBox->value()); toConfigurationSingle::Instance().setKeywordUpper(KeywordUpper->isChecked()); toConfigurationSingle::Instance().setObjectNamesUpper(ObjectNamesUpper->isChecked()); toConfigurationSingle::Instance().setCodeCompletion(highlight && CodeCompletion->isChecked()); toConfigurationSingle::Instance().setCodeCompletionSort(CompletionSort->isChecked()); toConfigurationSingle::Instance().setUseEditorShortcuts(EditorShortcuts->isChecked()); toConfigurationSingle::Instance().setAutoIndent(AutoIndent->isChecked()); toMarkedText::setDefaultTabWidth(TabStop->value()); toConfigurationSingle::Instance().setTabStop(toMarkedText::defaultTabWidth()); toMarkedText::setDefaultTabSpaces(TabSpaces->isChecked()); toConfigurationSingle::Instance().setTabSpaces(TabSpaces->isChecked()); // for (std::map::iterator i = Colors.begin();i != Colors.end();i++) { // QString str(CONF_COLOR); // str += ":"; // str += (*i).first; // QString res; // res.sprintf("%d,%d,%d", // (*i).second.red(), // (*i).second.green(), // (*i).second.blue()); // toConfigurationSingle::Instance().globalSetConfig(str, res); // } #define C2T(c) (Colors[Analyzer.typeString((c))]) toConfigurationSingle::Instance().setSyntaxDefault(C2T(toSyntaxAnalyzer::Default)); toConfigurationSingle::Instance().setSyntaxComment(C2T(toSyntaxAnalyzer::Comment)); toConfigurationSingle::Instance().setSyntaxNumber(C2T(toSyntaxAnalyzer::Number)); toConfigurationSingle::Instance().setSyntaxKeyword(C2T(toSyntaxAnalyzer::Keyword)); toConfigurationSingle::Instance().setSyntaxString(C2T(toSyntaxAnalyzer::String)); toConfigurationSingle::Instance().setSyntaxDefaultBg(C2T(toSyntaxAnalyzer::DefaultBg)); toConfigurationSingle::Instance().setSyntaxDebugBg(C2T(toSyntaxAnalyzer::DebugBg)); toConfigurationSingle::Instance().setSyntaxErrorBg(C2T(toSyntaxAnalyzer::ErrorBg)); toConfigurationSingle::Instance().setSyntaxCurrentLineMarker(C2T(toSyntaxAnalyzer::CurrentLineMarker)); toConfigurationSingle::Instance().setSyntaxStaticBg(C2T(toSyntaxAnalyzer::StaticBg)); toSyntaxAnalyzer::defaultAnalyzer().updateSettings(); toConfigurationSingle::Instance().setExtensions(Extensions->text()); toConfigurationSingle::Instance().setStaticChecker(EStaticChecker->text()); } tora-2.1.3/src/tobrowserconstraintui.ui0000644000175000017500000004062311270353625020100 0ustar michaelmichael toBrowserConstraintUI 0 0 640 669 Constraint info 11 11 11 11 6 6 3 0 1 0 Foreign Key Check Unique Primary Key Qt::Horizontal QSizePolicy::Expanding 20 20 0 0 &Name false Name Cancel 0 0 0 0 &Columns false SourceColumns 0 0 Qt::StrongFocus 0 0 R&efered columns false ReferedColumns 0 0 Qt::StrongFocus QFrame::HLine QFrame::Sunken QFrame::VLine QFrame::Sunken 0 0 true 0 0 Refers &To false ReferTable 0 0 &Type 11 11 11 11 6 6 Primary key true Unique &Columns false UniqueCols 0 0 Qt::StrongFocus C&ondition false CheckCondition &Column false CheckColumn 0 0 Qt::StrongFocus &Ok true Qt::StrongFocus Display SQL to create this constraint toResultCols QWidget
toresultcols.h
toTableSelect QWidget
totableselect.h
Name ReferTable SourceColumns ReferedColumns SourceColList ReferColList Primary UniqueCols UniqueColList CheckColumn CheckCondition ToolButton1 ApplyButton PushButton2 toresultcols.h toresultcols.h toresultcols.h toresultcols.h totableselect.h ToolButton1 clicked() toBrowserConstraintUI displaySQL() 20 20 20 20 PushButton2 clicked() toBrowserConstraintUI reject() 20 20 20 20 ApplyButton clicked() toBrowserConstraintUI accept() 20 20 20 20 Name activated(int) toBrowserConstraintUI changeConstraint() 20 20 20 20 AddButton clicked() toBrowserConstraintUI addConstraint() 20 20 20 20 DeleteButton clicked() toBrowserConstraintUI delConstraint() 20 20 20 20 ReferTable activated(QString) toBrowserConstraintUI changeRefered() 20 20 20 20 Type activated(int) toBrowserConstraintUI changeType(int) 20 20 20 20
tora-2.1.3/src/toeventquery.cpp0000644000175000017500000001220511270353625016321 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toeventquery.h" #include "toeventquerytask.h" #include "toresultstats.h" #include "totool.h" #include "torunnable.h" toQValue toEventQuery::readValueNull() { if(Values.isEmpty()) throw tr("Read past end of query"); if((Values.size() == 15 || Values.size() == 1) && !eof()) { if(Task) Task->read(); // getting close to end, request read } return Values.takeFirst(); } toQValue toEventQuery::readValue() { return toNull(readValueNull()); } toEventQuery::toEventQuery(toConnection &conn, const QString &sql, const toQList ¶m, toResultStats *stats) : SQL(sql), Param(param), Statistics(stats), Task(0) { Connection = &conn; Processed = 0; Columns = 0; TaskDone = false; } toEventQuery::toEventQuery(toConnection &conn, toQuery::queryMode mode, const QString &sql, const toQList ¶m, toResultStats *stats) : SQL(sql), Param(param), Statistics(stats), Task(0) { Connection = &conn; Processed = 0; Columns = 0; TaskDone = false; } void toEventQuery::start() { Task = new toEventQueryTask(this, *Connection, SQL, Param, Statistics); Task->ThreadAlive.lock(); qRegisterMetaType("toQDescList&"); qRegisterMetaType("ValuesList&"); connect(Task, SIGNAL(headers(toQDescList &, int)), this, SLOT(taskDesc(toQDescList &, int)), Qt::QueuedConnection); connect(Task, SIGNAL(data(ValuesList &)), this, SLOT(taskData(ValuesList &)), Qt::QueuedConnection); connect(Task, SIGNAL(error(const toConnection::exception &)), this, SLOT(taskError(const toConnection::exception &)), Qt::QueuedConnection); connect(Task, SIGNAL(done()), this, SLOT(taskFinished()), Qt::QueuedConnection); connect(Task, SIGNAL(rowsProcessed(int)), this, SLOT(taskRowsProcessed(int)), Qt::QueuedConnection); (new toRunnableThread(Task))->start(); } toEventQuery::~toEventQuery() { try { if(Task) { disconnect(Task, 0, 0, 0); if(Task->thread()) Task->thread()->exit(); Task->ThreadAlive.unlock(); } } catch(...) { ; // ignored } } bool toEventQuery::eof(void) const { if(hasMore()) return false; return TaskDone; } void toEventQuery::stop(void) { if(!TaskDone && Task) Task->close(); } void toEventQuery::taskData(ValuesList &values) { Values += values; emit dataAvailable(); try { if(Statistics) Statistics->refreshStats(false); } catch(...) { // ignored } } void toEventQuery::taskDesc(toQDescList &desc, int column) { Description = desc; Columns = column; emit descriptionAvailable(); } void toEventQuery::taskError(const toConnection::exception &msg) { emit error(msg); } void toEventQuery::taskFinished() { TaskDone = true; emit done(); } void toEventQuery::taskRowsProcessed(int rows) { Processed = rows; } tora-2.1.3/src/tobrowseraccesswidget.cpp0000644000175000017500000000740211351613205020157 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "toresultdata.h" #include "utils.h" #include "tobrowseraccesswidget.h" toBrowserAccessWidget::toBrowserAccessWidget(QWidget * parent) : toBrowserBaseWidget(parent) { setObjectName("toBrowserAccessWidget"); #ifdef TOEXTENDED_MYSQL // This is propably never compiled... // I'm leaving this code as is UserPanel = new toMySQLUser(curr, TAB_ACCESS_USER); curr->addTab(UserPanel, tr("&User")); SecondMap[TAB_ACCESS] = UserPanel; SecondMap[TAB_ACCESS_USER] = UserPanel; AccessPanel = new toMySQLUserAccess(curr, TAB_ACCESS_OBJECTS); curr->addTab(AccessPanel, tr("&Objects")); SecondMap[TAB_ACCESS_OBJECTS] = UserPanel; // Yes, it should be // this one, it will // signal the // TAB_ACCESS_OBJECTS // to update. connect(AccessPanel, SIGNAL(hasChanged()), UserPanel, SLOT(hasChanged())); connect(UserPanel, SIGNAL(saveChanges(const QString &, const QString &)), AccessPanel, SLOT(saveChanges(const QString &, const QString &))); connect(UserPanel, SIGNAL(changeUser(const QString &)), AccessPanel, SLOT(changeUser(const QString &))); accessContent = new toResultData(curr, TAB_ACCESS_CONTENT); accessContent->setObjectName("accessContent"); #else accessContent = new toResultData(this); accessContent->setObjectName("accessContent"); connect(accessContent, SIGNAL(changesSaved()), this, SLOT(flushPrivs())); #endif changeConnection(); } void toBrowserAccessWidget::changeConnection() { toBrowserBaseWidget::changeConnection(); if (toIsMySQL(toCurrentConnection(this))) addTab(accessContent, "&Data"); else accessContent->setVisible(false); } void toBrowserAccessWidget::changeParams(const QString & schema, const QString & object) { toBrowserBaseWidget::changeParams("mysql", object); } void toBrowserAccessWidget::flushPrivs(void) { try { toCurrentConnection(this).execute("FLUSH PRIVILEGES"); } TOCATCH } tora-2.1.3/src/tolistviewformattersql.h0000644000175000017500000000430611417670657020106 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOLISTVIEWFORMATTERSQL_H #define TOLISTVIEWFORMATTERSQL_H #include #include #include #include "tolistviewformatter.h" typedef std::map SQLTypeMap; class toListViewFormatterSQL : public toListViewFormatter { public: toListViewFormatterSQL(); virtual ~toListViewFormatterSQL(); virtual QString getFormattedString(toExportSettings &settings, const QAbstractItemModel * model); }; #endif tora-2.1.3/src/tolistviewformattersql.cpp0000644000175000017500000001264311420551660020426 0ustar michaelmichael/* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ // // C++ Implementation: toListViewFormatterSQL // #include "utils.h" #include "toconfiguration.h" #include "tolistviewformattersql.h" #include "tolistviewformatterfactory.h" #include "tolistviewformatteridentifier.h" #include "toresultmodel.h" namespace { toListViewFormatter* createSQL() { return new toListViewFormatterSQL(); } const bool registered = toListViewFormatterFactory::Instance().Register( toListViewFormatterIdentifier::SQL, createSQL ); } toListViewFormatterSQL::toListViewFormatterSQL() : toListViewFormatter() {} toListViewFormatterSQL::~toListViewFormatterSQL() {} QString toListViewFormatterSQL::getFormattedString(toExportSettings &settings, //const toResultModel *model); const QAbstractItemModel * model) { int columns = model->columnCount(); int rows = model->rowCount(); QVector rlist = selectedRows(settings.selected); QVector clist = selectedColumns(settings.selected); QString sql; QString objectName; QString columnNames; QString output; if (toConfigurationSingle::Instance().keywordUpper()) sql = "INSERT INTO %1%2 VALUES (%3);"; else sql = "insert into %1%2 values (%3);"; if (!settings.objectName.isEmpty()) { if (!settings.owner.isEmpty()) objectName = settings.owner + "." + settings.objectName; else objectName = settings.objectName; } else { // If name of object is unknown (which shouldn't be the case) // fall back to "general" name for object. objectName = "tablename"; } if (settings.columnsHeader) { columnNames += " ("; for (int j = 1; j < columns; j++) { if (settings.columnsExport == toExportSettings::ColumnsSelected && !clist.contains(j)) continue; columnNames += model->headerData( j, Qt::Horizontal, Qt::DisplayRole).toString(); columnNames += ", "; } columnNames = columnNames.left(columnNames.length() - 2) + ")"; } const toResultModel *resultModel = reinterpret_cast(model); if (!model) return "-- cannot access data result. Maybe it's not a SQL export"; QModelIndex mi; toResultModel::HeaderList hdr = resultModel->headers(); for (int row = 0; row < rows; row++) { if (settings.rowsExport == toExportSettings::RowsSelected && !rlist.contains(row)) continue; QString values; for (int i = 1; i < columns; i++) { if (settings.columnsExport == toExportSettings::ColumnsSelected && !clist.contains(i)) continue; // if (!settings.rowsHeader && i == 0) // continue; mi = model->index(row, i); QString currVal(model->data(mi, Qt::EditRole).toString()); QString h(hdr.at(i).datatype.toUpper()); if (h.contains("DATE")) { if (currVal.isEmpty()) values += "NULL"; else { values += "TO_DATE(\'" + currVal + "\' ,\'" + toConfigurationSingle::Instance().dateFormat() + "\')"; } } else if (h.contains("CHAR")) values += (currVal.isEmpty()) ? "NULL" : "\'" + currVal + "\'"; else values += (currVal.isEmpty()) ? "NULL" : currVal; values += ", "; } values = values.left(values.length() - 2); QString line(sql.arg(objectName).arg(columnNames).arg(values)); endLine(line); output += line; } return output; } tora-2.1.3/src/todebugtext.h0000644000175000017500000000770211270353625015560 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TODEBUGTEXT_H #define TODEBUGTEXT_H #include "config.h" #include "tohighlightedtext.h" #include "totreewidget.h" //Added by qt3to4: #include #include #include class toConnection; class toDebug; class toBreakpointItem : public toTreeWidgetItem { int Line; int Namespace; public: toBreakpointItem(toTreeWidget *parent, toTreeWidgetItem *after, const QString &schema, const QString &type, const QString &object, int line); void setBreakpoint(void); void clearBreakpoint(void); void disableBreakpoint(void); void enableBreakpoint(void); int line() { return Line; } }; class toDebugText : public toHighlightedText { Q_OBJECT QString Schema; QString Object; QString Type; int LastX; toDebug *Debugger; toTreeWidget *Breakpoints; bool NoBreakpoints; toBreakpointItem *FirstItem; toBreakpointItem *CurrentItem; bool checkItem(toBreakpointItem *item); bool hasBreakpoint(int row); int breakMarker; int disabledBreakMarker; static int ID; public: toDebugText(toTreeWidget *breakpoints, QWidget *parent, toDebug *debugger); void toggleBreakpoint(int row = -1, bool enable = false); void setData(const QString &schema, const QString &type, const QString &data); const QString &schema(void) const { return Schema; } const QString &object(void) const { return Object; } void setType(const QString &type) { setData(Schema, type, Object); } void setSchema(const QString &schema) { setData(schema, Type, Object); } const QString &type(void) const { return Type; } void clear(void); bool readData(toConnection &connection, toTreeWidget *); bool readErrors(toConnection &connection); bool compile(void); virtual void exportData(std::map &data, const QString &prefix); virtual void importData(std::map &data, const QString &prefix); protected slots: virtual void toggleBreakpoint(int margin, int line, Qt::KeyboardModifiers state); protected: virtual void mouseMoveEvent (QMouseEvent *me); }; #endif tora-2.1.3/src/toconnectionmodel.h0000644000175000017500000000613311270353625016742 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOCONNECTIONMODEL_H #define TOCONNECTIONMODEL_H #include #include "tonewconnection.h" /*! \brief Display imported/available connections in the Import dialog's view. \author Petr Vanek */ class toConnectionModel : public QAbstractTableModel { Q_OBJECT public: toConnectionModel(); //! \brief Pull connections from QSettings void readConfig(); //! \brief Set the m_data and update all connected views. void setupData(QMap list); void append(int ix, toConnectionOptions conn); bool removeRow(int row, const QModelIndex & parent = QModelIndex()); //! \brief Bring m_data back to caller. QMap availableConnections() { return m_data; }; toConnectionOptions availableConnection(int ix) { return m_data[ix]; }; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; int columnCount(const QModelIndex & parent = QModelIndex()) const { return 6; }; int rowCount(const QModelIndex & parent = QModelIndex()) const { return m_data.count(); }; Qt::ItemFlags flags(const QModelIndex & index) const; private: QMap m_data; }; #endif tora-2.1.3/src/tostoragetablespaceui.ui0000644000175000017500000001653711270353625020007 0ustar michaelmichael toStorageTablespaceUI 0 0 592 480 Form1 11 11 11 11 6 6 &Options 11 11 11 11 6 6 Should objects created in this tablespace be logging by default &Logging true Should tablespace be online at the time of creation &Online true Should objects in this tablespace be permanent after the end of the session &Permanent true Specify default storage clause (In separate tab) &Default storage &Extent allocation 11 11 11 11 6 6 Manage tablespace extents using dictionary tables &Dictionary true Specify how space is allocated in the tablespace Local &autoallocation true The tablespace is locally managed with fixed extent sizes of specified size Local &uniform false Qt::Vertical QSizePolicy::Expanding 20 20 toFilesize QWidget
tofilesize.h
DefaultStorage toggled(bool) toStorageTablespaceUI allowDefault(bool) 20 20 20 20 Permanent toggled(bool) toStorageTablespaceUI permanentToggle(bool) 20 20 20 20 Dictionary toggled(bool) toStorageTablespaceUI dictionaryToggle(bool) 20 20 20 20 LocalSelect toggled(bool) toStorageTablespaceUI uniformToggle(bool) 20 20 20 20
tora-2.1.3/src/tobrowsertriggerwidget.cpp0000644000175000017500000001206511351613555020372 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "toresultcols.h" #include "toresultdepend.h" #include "toresultextract.h" #include "toresultfield.h" #include "toresultitem.h" #include "toresultgrants.h" #include "utils.h" #include "tobrowsertriggerwidget.h" static toSQL SQLTriggerInfo("toBrowser:TriggerInfo", "SELECT Owner,Trigger_Name,\n" " Trigger_Type,Triggering_Event,\n" " Table_Owner,Base_Object_Type,Table_Name,Column_Name,\n" " Referencing_Names,When_Clause,Status,\n" " Description,Action_Type\n" " FROM SYS.ALL_TRIGGERS\n" "WHERE Owner = :f1 AND Trigger_Name = :f2", "Display information about a trigger", "0801"); static toSQL SQLTriggerInfo8("toBrowser:TriggerInfo", "SELECT Owner,Trigger_Name,\n" " Trigger_Type,Triggering_Event,\n" " Table_Owner,Table_Name,\n" " Referencing_Names,When_Clause,Status,\n" " Description\n" " FROM SYS.ALL_TRIGGERS\n" "WHERE Owner = :f1 AND Trigger_Name = :f2", "", "0800"); static toSQL SQLTriggerBody("toBrowser:TriggerBody", "SELECT Trigger_Body FROM SYS.ALL_TRIGGERS\n" " WHERE Owner = :f1 AND Trigger_Name = :f2", "Implementation of trigger"); static toSQL SQLTriggerCols("toBrowser:TriggerCols", "SELECT Column_Name,Column_List \"In Update\",Column_Usage Usage\n" " FROM SYS.ALL_TRIGGER_COLS\n" " WHERE Trigger_Owner = :f1 AND Trigger_Name = :f2", "Columns used by trigger"); toBrowserTriggerWidget::toBrowserTriggerWidget(QWidget * parent) : toBrowserBaseWidget(parent) { setObjectName("toBrowserTriggerWidget"); infoView = new toResultItem(this); infoView->setObjectName("infoView"); infoView->setSQL(SQLTriggerInfo); codeView = new toResultField(this); codeView->setObjectName("codeView"); codeView->setSQL(SQLTriggerBody); columnsWidget = new toResultCols(this); columnsWidget->setObjectName("columnsWidget"); columnsWidget->setSQL(SQLTriggerCols); grantsView = new toResultGrants(this); grantsView->setObjectName("grantsView"); dependView = new toResultDepend(this, "dependView"); // dependView->setObjectName("dependView"); extractView = new toResultExtract(this); extractView->setObjectName("extractView"); changeConnection(); } void toBrowserTriggerWidget::changeConnection() { toBrowserBaseWidget::changeConnection(); toConnection & c = toCurrentConnection(this); addTab(infoView, "Info"); addTab(codeView, "Code"); addTab(columnsWidget, "&Columns"); addTab(grantsView, "&Grants"); if (toIsOracle(c)) addTab(dependView, "De&pendencies"); else dependView->setVisible(false); addTab(extractView, "Script"); } tora-2.1.3/src/toqsqlconnection.cpp0000644000175000017500000020604711402776023017161 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconnection.h" #include "tohighlightedtext.h" #include "tomain.h" #include "tomysqlkeywords.h" #include "tosql.h" #include "totool.h" #include "tothread.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_POSTGRESQL_LIBPQ_FE_H #ifdef CMAKE_BUILD // There is different location of pgsql includes sometimes // E.g. /usr/include/pgsql on suse etc. Cmake hadles it // easily for us. #include #else // This is for autotools #include #endif #endif // #include static toSQL SQLVersion("toQSqlConnection:Version", "SHOW VARIABLES LIKE 'version'", "Show version of database, " "last value of first return record of result is used.", "3.0", "MySQL"); static toSQL SQLVersionSapDb("toQSqlConnection:Version", "select ltrim(substring(kernel,10,10)) from versions", "", "", "SapDB"); static toSQL SQLVersionPgSQL("toQSqlConnection:Version", "SELECT SUBSTR(version(), STRPOS(version(), ' ') + 1, STRPOS(version(), 'on') - STRPOS(version(), ' ') - 2)", "", "7.1", "PostgreSQL"); static toSQL SQLListDatabases("toQSqlConnection:ListDatabases", "show databases", "List the available databases for a mysql connection", "3.0", "MySQL"); static toSQL SQLListObjectsDatabase("toQSqlConnection:ListObjectsDatabase", "show table status from :f1", "Get the available tables for a specific database (MySQL specific, won't work for anything else)", "3.0", "MySQL"); static toSQL SQLListObjects("toQSqlConnection:ListObjects", "show tables", "Get the available tables for a connection", "3.0", "MySQL"); static toSQL SQLListObjectsSapDb("toQSqlConnection:ListObjects", "select tablename \"Tablename\",\n" " owner \"Owner\",\n" " tabletype \"Type\",\n" "from tables \n" "where tabletype not in (\'SYNONYM\',\'RESULT\') \n" "order by tablename", "", "", "SapDB"); static toSQL SQLListObjectsPgSQL("toQSqlConnection:ListObjects", "SELECT c.relname AS \"Tablename\",\n" " n.nspname AS \"Owner\",\n" " c.relkind AS \"Type\"\n" " FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid\n" " ORDER BY \"Tablename\"", "", "7.1", "PostgreSQL"); static toSQL SQLListSynonymsSapDb("toQSqlConnection:ListSynonyms", "SELECT synonymname \"Synonym\", owner \"Schema\", tablename \"Object\"\n" "from synonyms \n" "where tabletype not in (\'SYNONYM\',\'RESULT\') \n" "order by owner,tablename", "Get synonym list, should have same columns", "", "SapDb"); static toSQL SQLListSynonyms("toQSqlConnection:ListSynonyms", "SELECT c.relname AS \"Synonym\", n.nspname AS \"Schema\", c.relname AS \"Object\"\n" " FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid\n" " ORDER BY n.nspname, c.relname", "", "7.1", "PostgreSQL"); static toSQL SQLColumnComments("toQSqlConnection:ColumnComments", "select a.attname,b.description\n" "from\n" " pg_attribute a,\n" " pg_description b,\n" " pg_class c LEFT OUTER JOIN pg_namespace n ON c.relowner=n.oid\n" "where\n" " a.oid=b.objoid\n" " and c.oid=a.attrelid\n" " and (u.nspname = :owner OR u.usesysid IS NULL)\n" " and c.relname=:table", "Get the available comments on columns of a table, " "must have same binds and columns", "7.1", "PostgreSQL"); static toSQL SQLColumnComments72("toQSqlConnection:ColumnComments", "select a.attname,b.description\n" "from\n" " pg_attribute a,\n" " pg_description b,\n" " pg_class c LEFT OUTER JOIN pg_namespace n ON c.relowner=n.oid\n" "where\n" " a.attnum=b.objsubid\n" " and b.objoid=a.attrelid\n" " and c.oid=a.attrelid\n" " and (n.nspname = :owner OR u.usesysid IS NULL)\n" " and c.relname=:table", "", "7.2", "PostgreSQL"); static toSQL SQLConnectionID("toQSqlConnection:ConnectionID", "SELECT connection_id()", "Get a connection ID for a session", "3.23", "MySQL"); static toSQL SQLConnectionIDPg("toQSqlConnection:ConnectionID", "SELECT pg_backend_pid()", "", "", "PostgreSQL"); static toSQL SQLCancel("toQSqlConnection:Cancel", "KILL :f1", "Cancel a connection given it's connection ID", "3.23", "MySQL"); static toSQL SQLCancelM5("toQSqlConnection:Cancel", "KILL QUERY :f1", "", "5.0", "MySQL"); static toSQL SQLCancelPg("toQSqlConnection:Cancel", "SELECT pg_cancel_backend(:pid)", "", "8.0", "PostgreSQL"); // seems to be the only way for < 8.0 to not get pg_cancel_backend static toSQL SQLCancelPgOld("toQSqlConnection:Cancel", "native", "", "", "PostgreSQL"); void native_cancel(QSqlDriver *driver) { QVariant v = driver->handle(); if(v.isValid() && v.typeName() == QString("PGconn*")) { #ifdef LIBPQ_DECL_CANCEL PGconn *handle = *static_cast(v.data()); if(!handle) return; PGcancel *cancel = PQgetCancel(handle); if(!cancel) return; char *errbuf = new char[1024]; PQcancel(cancel, errbuf, 1024); PQfreeCancel(cancel); delete[] errbuf; #endif } } struct toQSqlProviderAggregate { enum aggregateType { None, AllDatabases, AllTables, CurrentDatabase, SpecifiedDatabase } Type; QString Data; toQSqlProviderAggregate() : Type(None) { } toQSqlProviderAggregate(aggregateType type, const QString &data = QString::null) : Type(type), Data(data) { } } ; static QString QueryParam(const QString &in, toQList ¶ms, std::list *extradata) { QString ret; bool inString = false; toQList::iterator cpar = params.begin(); QString query = QString(in); std::map binds; for (int i = 0;i < query.length();i++) { QChar rc = query.at(i); char c = rc.toLatin1(); char nc = 0; if (i + 1 < query.length()) nc = query.at(i + 1).toLatin1(); switch (c) { case '\\': ret += rc; ret += query.at(++i); break; case '\'': inString = !inString; ret += rc; break; case ':': // mostly for postgres-style casts, ignore :: if (nc == ':') { ret += rc; ret += nc; i++; break; } if (!inString) { QString nam; for (i++;i < query.length();i++) { rc = query.at(i); if (!rc.isLetterOrNumber()) break; nam += rc; } c = rc.toLatin1(); QString in; if (c == '<') { for (i++;i < query.length();i++) { rc = query.at(i); c = rc.toLatin1(); if (c == '>') { i++; break; } in += rc; } } i--; toQSqlProviderAggregate aggr; ; if (in == "alldatabases") aggr = toQSqlProviderAggregate(toQSqlProviderAggregate::AllDatabases); else if (in == "alltables") aggr = toQSqlProviderAggregate(toQSqlProviderAggregate::AllTables); else if (in == "currenttables") aggr = toQSqlProviderAggregate(toQSqlProviderAggregate::CurrentDatabase); else if (in == "database") { aggr = toQSqlProviderAggregate(toQSqlProviderAggregate::SpecifiedDatabase); } QString str; QString tmp; if (aggr.Type == toQSqlProviderAggregate::None || aggr.Type == toQSqlProviderAggregate::SpecifiedDatabase) { if (nam.isEmpty()) break; if (binds.find(nam) != binds.end()) { ret += binds[nam]; break; } if (cpar == params.end()) throw toConnection::exception(QString::fromLatin1("Not all bind variables supplied"), i); if ((*cpar).isNull()) { str = QString::fromLatin1("NULL"); } else if ((*cpar).isInt() || (*cpar).isDouble()) { str = QString(*cpar); } tmp = (*cpar); cpar++; } if (str.isNull()) { if (aggr.Type != toQSqlProviderAggregate::None) { if (extradata) { if ( extradata->empty() ) return QString::null; tmp = toShift(*extradata); } else { aggr.Data = tmp; throw aggr; } } else { if (in != QString::fromLatin1("noquote")) str += QString::fromLatin1("'"); } for (int j = 0;j < tmp.length();j++) { QChar d = tmp.at(j); switch (d.toLatin1()) { case 0: str += QString::fromLatin1("\\0"); break; case '\n': str += QString::fromLatin1("\\n"); break; case '\t': str += QString::fromLatin1("\\t"); break; case '\r': str += QString::fromLatin1("\\r"); break; case '\'': str += QString::fromLatin1("\\\'"); break; case '\"': str += QString::fromLatin1("\\\""); break; case '\\': str += QString::fromLatin1("\\\\"); break; default: str += d; } } if (in != QString::fromLatin1("noquote") && aggr.Type == toQSqlProviderAggregate::None) str += QString::fromLatin1("'"); } binds[nam] = str; ret += str; break; } default: ret += rc; } } return ret; } static QString ErrorString(const QSqlError &err, const QString &sql = QString::null) { QString ret; if (err.databaseText().isEmpty()) { if (err.driverText().isEmpty()) ret = QString::fromLatin1("Unknown error"); else ret = err.driverText(); } else ret = err.databaseText(); if (!sql.isEmpty()) ret += QString::fromLatin1("\n\n") + sql; return ret; } // PostgreSQL datatypes (From pg_type.h) #define BOOLOID 16 #define BYTEAOID 17 #define CHAROID 18 #define NAMEOID 19 #define INT8OID 20 #define INT2OID 21 #define INT2VECTOROID 22 #define INT4OID 23 #define REGPROCOID 24 #define TEXTOID 25 #define OIDOID 26 #define TIDOID 27 #define XIDOID 28 #define CIDOID 29 #define OIDVECTOROID 30 #define POINTOID 600 #define LSEGOID 601 #define PATHOID 602 #define BOXOID 603 #define POLYGONOID 604 #define LINEOID 628 #define FLOAT4OID 700 #define FLOAT8OID 701 #define ABSTIMEOID 702 #define RELTIMEOID 703 #define TINTERVALOID 704 #define UNKNOWNOID 705 #define CIRCLEOID 718 #define CASHOID 790 #define MACADDROID 829 #define INETOID 869 #define CIDROID 650 #define BPCHAROID 1042 #define VARCHAROID 1043 #define DATEOID 1082 #define TIMEOID 1083 #define TIMESTAMPOID 1114 #define TIMESTAMPTZOID 1184 #define INTERVALOID 1186 #define TIMETZOID 1266 #define BITOID 1560 #define VARBITOID 1562 #define NUMERICOID 1700 #define REFCURSOROID 1790 // MySQL datatypes (From mysql_com.h) enum enum_field_types { FIELD_TYPE_DECIMAL, FIELD_TYPE_TINY, FIELD_TYPE_SHORT, FIELD_TYPE_LONG, FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE, FIELD_TYPE_NULL, FIELD_TYPE_TIMESTAMP, FIELD_TYPE_LONGLONG, FIELD_TYPE_INT24, FIELD_TYPE_DATE, FIELD_TYPE_TIME, FIELD_TYPE_DATETIME, FIELD_TYPE_YEAR, FIELD_TYPE_NEWDATE, FIELD_TYPE_ENUM = 247, FIELD_TYPE_SET = 248, FIELD_TYPE_TINY_BLOB = 249, FIELD_TYPE_MEDIUM_BLOB = 250, FIELD_TYPE_LONG_BLOB = 251, FIELD_TYPE_BLOB = 252, FIELD_TYPE_VAR_STRING = 253, FIELD_TYPE_STRING = 254 }; // SAPDb Datatypes (from /opt/sapdb/interfaces/odbc/incl/*.h) #define SAP_SQL_UNKNOWN_TYPE 0 #define SAP_SQL_DECIMAL 3 #define SAP_SQL_NUMERIC 2 #define SAP_SQL_REAL 7 #define SAP_SQL_FLOAT 6 #define SAP_SQL_DOUBLE 8 #define SAP_SQL_INTEGER 4 #define SAP_SQL_SMALLINT 5 #define SAP_SQL_BIT (-7) #define SAP_SQL_TINYINT (-6) #define SAP_SQL_BIGINT (-5) #define SAP_SQL_CHAR 1 #define SAP_SQL_VARCHAR 12 #define SAP_SQL_LONGVARCHAR (-1) #define SAP_SQL_BINARY (-2) #define SAP_SQL_VARBINARY (-3) #define SAP_SQL_LONGVARBINARY (-4) #define SAP_SQL_DATE 9 #define SAP_SQL_DATETIME 9 #define SAP_SQL_TYPE_DATE 91 #define SAP_SQL_TIME 10 #define SAP_SQL_TYPE_TIME 92 #define SAP_SQL_TIMESTAMP 11 #define SAP_SQL_TYPE_TIMESTAMP 93 static std::list Describe(const QString &type, QSqlRecord record, int *order, unsigned int orderSize) { std::list ret; unsigned int count = record.count(); if (order) { count = orderSize; } for (unsigned int i = 0;i < count;i++) { toQuery::queryDescribe desc; desc.AlignRight = false; int col = i; if (order) col = order[i] - 1; if (col == -1) { desc.Name = "Database"; desc.Datatype = "STRING"; desc.Null = false; desc.AlignRight = false; ret.insert(ret.end(), desc); continue; } desc.Name = record.fieldName(col); desc.AlignRight = false; int size = 1; QSqlField info = record.field(desc.Name); if (type == "MySQL") { switch (info.typeID()) { case FIELD_TYPE_DECIMAL: desc.Datatype = QString::fromLatin1("DECIMAL"); break; case FIELD_TYPE_TINY: desc.Datatype = QString::fromLatin1("TINY"); break; case FIELD_TYPE_SHORT: desc.Datatype = QString::fromLatin1("SHORT"); break; case FIELD_TYPE_LONG: desc.Datatype = QString::fromLatin1("LONG"); break; case FIELD_TYPE_FLOAT: desc.Datatype = QString::fromLatin1("FLOAT"); break; case FIELD_TYPE_DOUBLE: desc.Datatype = QString::fromLatin1("DOUBLE"); break; case FIELD_TYPE_NULL: desc.Datatype = QString::fromLatin1("NULL"); break; case FIELD_TYPE_TIMESTAMP: desc.Datatype = QString::fromLatin1("TIMESTAMP"); break; case FIELD_TYPE_LONGLONG: desc.Datatype = QString::fromLatin1("LONGLONG"); break; case FIELD_TYPE_INT24: desc.Datatype = QString::fromLatin1("INT23"); break; case FIELD_TYPE_DATE: desc.Datatype = QString::fromLatin1("DATE"); break; case FIELD_TYPE_TIME: desc.Datatype = QString::fromLatin1("TIME"); break; case FIELD_TYPE_DATETIME: desc.Datatype = QString::fromLatin1("DATETIME"); break; case FIELD_TYPE_YEAR: desc.Datatype = QString::fromLatin1("YEAR"); break; case FIELD_TYPE_NEWDATE: desc.Datatype = QString::fromLatin1("NEWDATE"); break; case FIELD_TYPE_ENUM: desc.Datatype = QString::fromLatin1("ENUM"); break; case FIELD_TYPE_SET: desc.Datatype = QString::fromLatin1("SET"); break; case FIELD_TYPE_TINY_BLOB: desc.Datatype = QString::fromLatin1("TINY_BLOB"); break; case FIELD_TYPE_MEDIUM_BLOB: desc.Datatype = QString::fromLatin1("MEDIUM_BLOB"); break; case FIELD_TYPE_LONG_BLOB: desc.Datatype = QString::fromLatin1("LONG_BLOB"); break; case FIELD_TYPE_BLOB: desc.Datatype = QString::fromLatin1("BLOB"); break; case FIELD_TYPE_VAR_STRING: desc.Datatype = QString::fromLatin1("VAR_STRING"); break; case FIELD_TYPE_STRING: desc.Datatype = QString::fromLatin1("STRING"); break; default: desc.Datatype = QString::fromLatin1("UNKNOWN"); break; } } else if (type == "PostgreSQL") { switch (info.typeID()) { case BOOLOID: desc.Datatype = QString::fromLatin1("BOOL"); break; case BYTEAOID: desc.Datatype = QString::fromLatin1("BYTEA"); break; case CHAROID: desc.Datatype = QString::fromLatin1("CHAR"); break; case NAMEOID: size = 32; desc.Datatype = QString::fromLatin1("NAME"); break; case INT8OID: size = 8; desc.Datatype = QString::fromLatin1("INT8"); break; case INT2OID: size = 2; desc.Datatype = QString::fromLatin1("INT2"); break; case INT2VECTOROID: size = 2; desc.Datatype = QString::fromLatin1("INT2VECTOR"); break; case INT4OID: size = 4; desc.Datatype = QString::fromLatin1("INT4"); break; case REGPROCOID: size = 4; desc.Datatype = QString::fromLatin1("REGPROC"); break; case TEXTOID: desc.Datatype = QString::fromLatin1("TEXT"); break; case OIDOID: size = 4; desc.Datatype = QString::fromLatin1("OID"); break; case TIDOID: size = 6; desc.Datatype = QString::fromLatin1("TID"); break; case XIDOID: size = 4; desc.Datatype = QString::fromLatin1("XID"); break; case CIDOID: size = 4; desc.Datatype = QString::fromLatin1("CID"); break; case OIDVECTOROID: size = 4; desc.Datatype = QString::fromLatin1("OIDVECTOR"); break; case POINTOID: size = 16; desc.Datatype = QString::fromLatin1("POINT"); break; case LSEGOID: size = 32; desc.Datatype = QString::fromLatin1("LSEG"); break; case PATHOID: desc.Datatype = QString::fromLatin1("PATH"); break; case BOXOID: size = 32; desc.Datatype = QString::fromLatin1("BOX"); break; case POLYGONOID: desc.Datatype = QString::fromLatin1("POLYGON"); break; case LINEOID: size = 32; desc.Datatype = QString::fromLatin1("LINE"); break; case FLOAT4OID: size = 4; desc.Datatype = QString::fromLatin1("FLOAT4"); break; case FLOAT8OID: size = 8; desc.Datatype = QString::fromLatin1("FLOAT8"); break; case ABSTIMEOID: size = 4; desc.Datatype = QString::fromLatin1("ABSTIME"); break; case RELTIMEOID: size = 4; desc.Datatype = QString::fromLatin1("RELTIME"); break; case TINTERVALOID: size = 12; desc.Datatype = QString::fromLatin1("TINTERVAL"); break; case UNKNOWNOID: desc.Datatype = QString::fromLatin1("UNKNOWN"); break; case CIRCLEOID: size = 24; desc.Datatype = QString::fromLatin1("CIRCLE"); break; case CASHOID: size = 4; desc.Datatype = QString::fromLatin1("MONEY"); break; case MACADDROID: size = 6; desc.Datatype = QString::fromLatin1("MACADDR"); break; case INETOID: desc.Datatype = QString::fromLatin1("INET"); break; case CIDROID: desc.Datatype = QString::fromLatin1("CIDR"); break; case BPCHAROID: desc.Datatype = QString::fromLatin1("BPCHAR"); break; case VARCHAROID: desc.Datatype = QString::fromLatin1("VARCHAR"); break; case DATEOID: size = 4; desc.Datatype = QString::fromLatin1("DATE"); break; case TIMEOID: size = 8; desc.Datatype = QString::fromLatin1("TIME"); break; case TIMESTAMPOID: size = 8; desc.Datatype = QString::fromLatin1("TIMESTAMP"); break; case TIMESTAMPTZOID: size = 8; desc.Datatype = QString::fromLatin1("TIMESTAMPTZ"); break; case INTERVALOID: size = 12; desc.Datatype = QString::fromLatin1("INTERVAL"); break; case TIMETZOID: size = 12; desc.Datatype = QString::fromLatin1("TIMETZ"); break; case BITOID: desc.Datatype = QString::fromLatin1("BIT"); break; case VARBITOID: desc.Datatype = QString::fromLatin1("VARBIT"); break; case NUMERICOID: desc.Datatype = QString::fromLatin1("NUMERIC"); break; case REFCURSOROID: desc.Datatype = QString::fromLatin1("REFCURSOR"); break; default: desc.Datatype = QString::fromLatin1("UNKNOWN"); break; } } else if (type == "SapDB") { switch (info.typeID()) { case SAP_SQL_UNKNOWN_TYPE: desc.Datatype = QString::fromLatin1("UNKNOWN"); break; case SAP_SQL_BIT: desc.Datatype = QString::fromLatin1("BIT"); break; case SAP_SQL_INTEGER: desc.Datatype = QString::fromLatin1("INTEGER"); break; case SAP_SQL_SMALLINT: desc.Datatype = QString::fromLatin1("SMALLINT"); break; case SAP_SQL_BIGINT: desc.Datatype = QString::fromLatin1("BIGINT"); break; case SAP_SQL_TINYINT: desc.Datatype = QString::fromLatin1("TINYINT"); break; case SAP_SQL_NUMERIC: desc.Datatype = QString::fromLatin1("NUMERIC"); break; case SAP_SQL_DECIMAL: desc.Datatype = QString::fromLatin1("DECIMAL"); break; case SAP_SQL_FLOAT: desc.Datatype = QString::fromLatin1("FLOAT"); break; case SAP_SQL_REAL: desc.Datatype = QString::fromLatin1("REAL"); break; case SAP_SQL_DOUBLE: desc.Datatype = QString::fromLatin1("DOUBLE"); break; case SAP_SQL_DATE: desc.Datatype = QString::fromLatin1("DATE"); break; case SAP_SQL_TYPE_DATE: desc.Datatype = QString::fromLatin1("DATE"); break; case SAP_SQL_TIME: desc.Datatype = QString::fromLatin1("TIME"); break; case SAP_SQL_TYPE_TIME: desc.Datatype = QString::fromLatin1("TIME"); break; case SAP_SQL_TIMESTAMP: desc.Datatype = QString::fromLatin1("TIMESTAMP"); break; case SAP_SQL_TYPE_TIMESTAMP: desc.Datatype = QString::fromLatin1("TIMESTAMP"); break; case SAP_SQL_CHAR: desc.Datatype = QString::fromLatin1("CHAR"); break; case SAP_SQL_VARCHAR: desc.Datatype = QString::fromLatin1("VARCHAR"); break; case SAP_SQL_LONGVARCHAR: desc.Datatype = QString::fromLatin1("LONGVARCHAR"); break; case SAP_SQL_BINARY: desc.Datatype = QString::fromLatin1("BINARY"); break; case SAP_SQL_VARBINARY: desc.Datatype = QString::fromLatin1("BINARY"); break; case SAP_SQL_LONGVARBINARY: desc.Datatype = QString::fromLatin1("LONGVARBINARY"); break; default: desc.Datatype = QString::fromLatin1("UNKNOWN"); break; } } else { switch (info.type()) { default: desc.Datatype = QString::fromLatin1("UNKNOWN"); break; case QVariant::Invalid: desc.Datatype = QString::fromLatin1("INVALID"); break; case QVariant::List: desc.Datatype = QString::fromLatin1("LIST"); break; case QVariant::Map: desc.Datatype = QString::fromLatin1("MAP"); break; case QVariant::String: desc.Datatype = QString::fromLatin1("VARCHAR"); break; case QVariant::StringList: desc.Datatype = QString::fromLatin1("STRINGLIST"); break; case QVariant::Font: desc.Datatype = QString::fromLatin1("FONT"); break; case QVariant::Pixmap: desc.Datatype = QString::fromLatin1("PIXMAP"); break; case QVariant::Brush: desc.Datatype = QString::fromLatin1("BRUSH"); break; case QVariant::Rect: desc.Datatype = QString::fromLatin1("RECT"); break; case QVariant::Size: desc.Datatype = QString::fromLatin1("SIZE"); break; case QVariant::Color: desc.Datatype = QString::fromLatin1("COLOR"); break; case QVariant::Palette: desc.Datatype = QString::fromLatin1("PALETTE"); break; case QVariant::Icon: desc.Datatype = QString::fromLatin1("ICON"); break; case QVariant::Point: desc.Datatype = QString::fromLatin1("POINT"); break; case QVariant::Image: desc.Datatype = QString::fromLatin1("IMAGE"); break; case QVariant::Int: desc.Datatype = QString::fromLatin1("INT"); desc.AlignRight = true; break; case QVariant::UInt: desc.Datatype = QString::fromLatin1("UINT"); desc.AlignRight = true; break; case QVariant::Bool: desc.Datatype = QString::fromLatin1("BOOL"); break; case QVariant::Double: desc.Datatype = QString::fromLatin1("DOUBLE"); desc.AlignRight = true; break; case QVariant::Region: desc.Datatype = QString::fromLatin1("REGION"); break; case QVariant::Bitmap: desc.Datatype = QString::fromLatin1("BITMAP"); break; case QVariant::Cursor: desc.Datatype = QString::fromLatin1("CURSOR"); break; case QVariant::Date: desc.Datatype = QString::fromLatin1("DATE"); break; case QVariant::Time: desc.Datatype = QString::fromLatin1("TIME"); break; case QVariant::DateTime: desc.Datatype = QString::fromLatin1("DATETIME"); break; case QVariant::ByteArray: // qt4 ByteArray == CString desc.Datatype = QString::fromLatin1("BLOB"); break; case QVariant::BitArray: desc.Datatype = QString::fromLatin1("BITARRAY"); break; case QVariant::SizePolicy: desc.Datatype = QString::fromLatin1("SIZEPOLICY"); break; case QVariant::KeySequence: desc.Datatype = QString::fromLatin1("KEYSEQUENCE"); break; } } if (info.length() > size) { desc.Datatype += QString::fromLatin1(" ("); if (info.length() % size == 0) desc.Datatype += QString::number(info.length() / size); else desc.Datatype += QString::number(info.length()); if (info.precision() > 0) { desc.Datatype += QString::fromLatin1(","); desc.Datatype += QString::number(info.precision()); } desc.Datatype += QString::fromLatin1(")"); } desc.Null = !info.requiredStatus(); ret.insert(ret.end(), desc); } return ret; } class toQSqlProvider : public toConnectionProvider { QStringList Drivers; public: static bool OnlyForward; class qSqlSetting : public QWidget, public toSettingTab { QCheckBox *OnlyForward; QLabel *CreateLabel; QComboBox *BeforeCreateAction; public: qSqlSetting(QWidget *parent) : QWidget(parent), toSettingTab("database.html#qsql") { QVBoxLayout *vbox = new QVBoxLayout; this->setLayout(vbox); vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); QGroupBox *box = new QGroupBox(this); box->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); vbox->addWidget(box); vbox = new QVBoxLayout; vbox->setSpacing(6); vbox->setContentsMargins(11, 11, 11, 11); OnlyForward = new QCheckBox( qApp->translate( "qSqlSetting", "Posibility to break MySQL queries (Can require more connections)"), box); OnlyForward->setChecked(toConfigurationSingle::Instance().onlyForward()); vbox->addWidget(OnlyForward); CreateLabel = new QLabel( qApp->translate("qSqlSetting", "When calling create routine statement in worksheet"), box); vbox->addWidget(CreateLabel); BeforeCreateAction = new QComboBox(box); BeforeCreateAction->clear(); BeforeCreateAction->insertItems(0, QStringList() << qApp->translate("qSqlSetting", "Do nothing") << qApp->translate("qSqlSetting", "Drop before creating") << qApp->translate("qSqlSetting", "Drop before creating (if exists)") << qApp->translate("qSqlSetting", "Ask") << qApp->translate("qSqlSetting", "Ask (if exists)")); BeforeCreateAction->setCurrentIndex(toConfigurationSingle::Instance().createAction()); vbox->addWidget(BeforeCreateAction); QSpacerItem *spacer = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding); vbox->addItem(spacer); box->setLayout(vbox); } virtual void saveSetting(void) { toConfigurationSingle::Instance().setOnlyForward(OnlyForward->isChecked()); toQSqlProvider::OnlyForward = OnlyForward->isChecked(); toConfigurationSingle::Instance().setCreateAction(BeforeCreateAction->currentIndex()); } }; static QString fromQSqlName(const QString &driv) { if (driv == QString::fromLatin1("QMYSQL")) return "MySQL"; else if (driv == QString::fromLatin1("QPSQL")) return "PostgreSQL"; else if (driv == QString::fromLatin1("QTDS")) return "Microsoft SQL/TDS"; else if (driv == QString::fromLatin1("QSAPDB")) return "SapDB"; else if (driv == QString::fromLatin1("QODBC")) return "ODBC"; return ""; } static QString toQSqlName(const QString &driv) { if (driv == "MySQL") return QString::fromLatin1("QMYSQL"); else if (driv == "PostgreSQL") return QString::fromLatin1("QPSQL"); else if (driv == "Microsoft SQL/TDS") return QString::fromLatin1("QTDS"); else if (driv == "SapDB") return QString::fromLatin1("QSAPDB"); else if (driv == "ODBC") return QString::fromLatin1("QODBC"); return QString::null; } class mySQLAnalyzer : public toSyntaxAnalyzer { public: mySQLAnalyzer() : toSyntaxAnalyzer(MySQLKeywords) { } virtual QChar quoteCharacter() { return '`'; } virtual bool declareBlock() { return false; } }; class qSqlSub : public toConnectionSub { public: // use compilter to prevent accidental unprotected access. Use // LockingPtr. volatile QSqlDatabase Connection; QMutex Lock; QString Name; QString ConnectionID; qSqlSub(QSqlDatabase conn, const QString &name) : Connection(conn), Name(name) { } void lockUp() { } void lockDown () { } int getLockValue() { return 1; } ~qSqlSub() { LockingPtr ptr(Connection, Lock); ptr->close(); } virtual void cancel() { if (!ConnectionID.isEmpty()) { // try a native cancel if possible. because // qsqldatabase can't cancel queries itself and this // is called during pool shutdown, we can't rely on // calling another connection to cancel this one. QSqlDatabase *c = const_cast(&(Connection)); native_cancel(c->driver()); } } // doh. better release the lock before calling this void throwError(const QString &sql) { LockingPtr ptr(Connection, Lock); throw ErrorString(ptr->lastError(), sql); } }; class qSqlQuery : public toQuery::queryImpl { QSqlQuery *Query; QSqlRecord Record; qSqlSub *Connection; QString CurrentExtra; std::list ExtraData; bool EOQ; unsigned int Column; unsigned int ColumnOrderSize; int *ColumnOrder; void checkQuery(void); std::list extraData(const toQSqlProviderAggregate &aggr) { std::list ret; std::list &objects = query()->connection().objects(false); for (std::list::iterator i = objects.begin();i != objects.end();i++) { if ((*i).Type == "DATABASE" && aggr.Type == toQSqlProviderAggregate::AllDatabases) { toPush(ret, (*i).Owner); } else if ((*i).Type == "TABLE") { if (aggr.Type == toQSqlProviderAggregate::AllTables || (aggr.Type == toQSqlProviderAggregate::CurrentDatabase && (*i).Owner == query()->connection().user()) || (aggr.Type == toQSqlProviderAggregate::SpecifiedDatabase && (*i).Owner == aggr.Data)) toPush(ret, (*i).Owner + "." + (*i).Name); } } return ret; } QSqlQuery *createQuery(const QString &query) { LockingPtr ptr(Connection->Connection, Connection->Lock); QSqlQuery *ret; ret = new QSqlQuery(*ptr); if (toQSqlProvider::OnlyForward) ret->setForwardOnly(true); ret->exec(query); return ret; } public: qSqlQuery(toQuery *query, qSqlSub *conn) : toQuery::queryImpl(query), Connection(conn) { Column = 0; ColumnOrder = NULL; EOQ = true; Query = NULL; } virtual ~qSqlQuery() { delete Query; delete[] ColumnOrder; } virtual void execute(void); virtual void cancel(void) { if (!Connection->ConnectionID.isEmpty()) { try { toConnection &conn = query()->connection(); const QString &sql = toSQL::sql(SQLCancel, conn); if(!sql.isEmpty() && sql != "native") { toQList pars; pars.insert(pars.end(), Connection->ConnectionID); conn.execute(sql, pars); } else { // don't lock here or deadlock while waiting // for query to finish QSqlDatabase *c = const_cast(&(Connection->Connection)); native_cancel(c->driver()); } } catch (...) {} } } QString parseReorder(const QString &str) { if (str.toUpper().startsWith("TOAD")) { std::list order; int num = -1; int i; for (i = 4;i < str.length();i++) { char c = str.at(i).toAscii(); if (isspace(c)) ; else if (isdigit(c)) { if (num < 0) num = 0; num *= 10; num += c - '0'; } else if (c == '*') { if (num >= 0) throw QString("Invalid column selection, number before *"); if (c == '*') { order.insert(order.end(), -1); do { i++; } while (str.at(i).isSpace()); break; } } else { if (num < 0) throw QString("Invalid column selection, number missing"); order.insert(order.end(), num); num = -1; if (c != ',') break; } } ColumnOrderSize = order.size(); if (ColumnOrderSize == 0) throw QString("Missing column selection"); delete[] ColumnOrder; ColumnOrder = new int[ColumnOrderSize]; int pos = 0; for (std::list::iterator j = order.begin();j != order.end();j++, pos++) ColumnOrder[pos] = *j; return str.mid(i); } else return str; } virtual toQValue readValue(void) { if (!Query) throw QString::fromLatin1("Fetching from unexecuted query"); if (EOQ) throw QString::fromLatin1("Tried to read past end of query"); LockingPtr ptr(Connection->Connection, Connection->Lock); QVariant val; bool fixEmpty = false; if (ColumnOrder) { int col = ColumnOrder[Column]; if (col >= 1) { val = Query->value(col - 1); if (Query->isNull(col - 1)) val.clear(); else if ((val.type() == QVariant::Date || val.type() == QVariant::DateTime) && val.isNull()) fixEmpty = true; } else if (col == 0) { val = CurrentExtra; } } else { val = Query->value(Column); if (Query->isNull(Column)) val.clear(); else if ((val.type() == QVariant::Date || val.type() == QVariant::DateTime) && val.isNull()) fixEmpty = true; } if (fixEmpty) { switch (val.type()) { case QVariant::Date: val = QVariant(QString("0000-00-00")); break; case QVariant::DateTime: val = QVariant(QString("0000-00-00T00:00:00")); break; default: break; // Do nothing } } // sapdb marks value as invalid on some views // for example tables,indexes etc, so ignore this check Column++; if ((ColumnOrder && Column == ColumnOrderSize) || (!ColumnOrder && Column == (unsigned int) Record.count())) { Column = 0; EOQ = !Query->next(); } if (EOQ && ExtraData.begin() != ExtraData.end()) { delete Query; Query = NULL; CurrentExtra = *ExtraData.begin(); ptr.unlock(); Query = createQuery(QueryParam(parseReorder(query()->sql()), query()->params(), &ExtraData)); checkQuery(); ptr.lock(); } return toQValue::fromVariant(val); } virtual bool eof(void) { return EOQ; } virtual int rowsProcessed(void) { try { LockingPtr ptr(Connection->Connection, Connection->Lock, true); if (!Query) return 0; return Query->numRowsAffected(); } catch(...) { return 0; } } virtual int columns(void) { LockingPtr ptr(Connection->Connection, Connection->Lock); int ret = Record.count(); if (ColumnOrder) ret = ColumnOrderSize; return ret; } virtual std::list describe(void) { LockingPtr ptr(Connection->Connection, Connection->Lock); std::list ret; if (Query && Query->isSelect()) { QString provider = query()->connection().provider(); QSqlRecord rec = Query->record(); ret = Describe(provider, rec, ColumnOrder, ColumnOrderSize); } return ret; } }; class qSqlConnection : public toConnection::connectionImpl { bool Multiple; bool HasTransactions; qSqlSub *qSqlConv(toConnectionSub *sub) { qSqlSub *conn = dynamic_cast(sub); if (!conn) throw QString::fromLatin1("Internal error, not QSql sub connection"); return conn; } toSyntaxAnalyzer *MySQLAnalyzer; public: qSqlConnection(toConnection *conn) : toConnection::connectionImpl(conn) { if (conn->provider() == "SapDB" || (conn->provider() == "MySQL" && toQSqlProvider::OnlyForward)) Multiple = false; else Multiple = true; if (conn->provider() == "MySQL") HasTransactions = false; else HasTransactions = true; MySQLAnalyzer = NULL; } virtual toSyntaxAnalyzer &analyzer() { if (connection().provider() == "MySQL") { if (!MySQLAnalyzer) MySQLAnalyzer = new mySQLAnalyzer(); return *MySQLAnalyzer; } else return toSyntaxAnalyzer::defaultAnalyzer(); } virtual QString quote(const QString &name) { if (connection().provider() == "PostgreSQL") { bool ok = true; for (int i = 0;i < name.length();i++) { if (name.at(i).toLower() != name.at(i) || !toIsIdent(name.at(i))) ok = false; } if (!ok) return QString::fromLatin1("\"") + name + QString::fromLatin1("\""); } return name; } virtual QString unQuote(const QString &name) { if (connection().provider() == "PostgreSQL") { if (name.at(0).toLatin1() == '\"' && name.at(name.length() - 1).toLatin1() == '\"') return name.left(name.length() - 1).right(name.length() - 2); } else if (connection().provider() == "MySQL") { if (name.at(0).toLatin1() == '`' && name.at(name.length() - 1).toLatin1() == '`') return name.left(name.length() - 1).right(name.length() - 2); } return name; } virtual std::list objectNames(void) { std::list ret; toConnection::objectName cur; try { toQuery databases(connection(), SQLListDatabases); while (!databases.eof()) { QString db = databases.readValueNull(); cur.Owner = db; cur.Type = "DATABASE"; cur.Name = QString::null; ret.insert(ret.end(), cur); try { toQuery tables(connection(), SQLListObjectsDatabase, db); while (!tables.eof()) { cur.Name = tables.readValueNull(); cur.Owner = db; cur.Type = "TABLE"; for (int i = 2;i < tables.columns();i++) // I just wan't the last column except for the first one tables.readValueNull(); cur.Comment = tables.readValueNull(); ret.insert(ret.end(), cur); } } catch (...) {} } } catch (...) { toQuery tables(connection(), SQLListObjects); while (!tables.eof()) { cur.Name = tables.readValueNull(); if (tables.columns() > 1) cur.Owner = tables.readValueNull(); else cur.Owner = connection().database(); if (tables.columns() > 2) cur.Type = tables.readValueNull(); else cur.Type = QString::fromLatin1("TABLE"); ret.insert(ret.end(), cur); } } return ret; } virtual std::map synonymMap(std::list &objects) { std::map ret; try { toConnection::objectName cur; cur.Type = QString::fromLatin1("A"); toQuery synonyms(connection(), SQLListSynonyms); std::list::iterator i = objects.begin(); while (!synonyms.eof()) { QString synonym = synonyms.readValueNull(); cur.Owner = synonyms.readValueNull(); cur.Name = synonyms.readValueNull(); while (i != objects.end() && (*i) < cur) i++; if (i == objects.end()) break; if (cur.Name == (*i).Name && cur.Owner == (*i).Owner) { ret[synonym] = (*i); (*i).Synonyms.insert((*i).Synonyms.end(), synonym); } } } catch (...) {} return ret; } virtual toQDescList columnDesc(const toConnection::objectName &table) { toBusy busy; std::map comments; try { toQuery comment(connection(), SQLColumnComments, table.Owner, table.Name); while (!comment.eof()) { QString col = comment.readValue(); comments[col] = comment.readValueNull(); } } catch (...) {} try { toQDescList desc; if (connection().provider() == "PostgreSQL") { toQuery query(connection(), toQuery::Normal); qSqlSub *sub = dynamic_cast(query.connectionSub()); if (sub) { LockingPtr ptr(sub->Connection, sub->Lock); desc = Describe(connection().provider(), ptr->record(quote(table.Name)), NULL, 0); } } else { QString SQL = QString::fromLatin1("SELECT * FROM "); SQL += quote(table.Owner); SQL += QString::fromLatin1("."); SQL += quote(table.Name); SQL += QString::fromLatin1(" WHERE NULL=NULL"); toQuery query(connection(), SQL); desc = query.describe(); } for (toQDescList::iterator j = desc.begin();j != desc.end();j++) (*j).Comment = comments[(*j).Name]; return desc; } catch (...) {} toQDescList ret; return ret; } virtual bool handleMultipleQueries() { return Multiple; } virtual void commit(toConnectionSub *sub) { qSqlSub *conn = qSqlConv(sub); LockingPtr ptr(conn->Connection, conn->Lock); if(!ptr->commit() && HasTransactions) { ptr.unlock(); conn->throwError(QString::fromLatin1("COMMIT")); } } virtual void rollback(toConnectionSub *sub) { qSqlSub *conn = qSqlConv(sub); LockingPtr ptr(conn->Connection, conn->Lock); if(!ptr->rollback() && HasTransactions) { ptr.unlock(); conn->throwError(QString::fromLatin1("ROLLBACK")); } } virtual toConnectionSub *createConnection(void); void closeConnection(toConnectionSub *conn) { delete conn; } virtual QString version(toConnectionSub *sub) { QString ret; qSqlSub *conn = qSqlConv(sub); try { LockingPtr ptr(conn->Connection, conn->Lock); QSqlQuery query = ptr->exec(toSQL::string(SQLVersion, connection())); if (query.next()) { if (query.isValid()) { QSqlRecord record = query.record(); QVariant val = query.value(record.count() - 1); ret = val.toString().toLatin1(); } } } catch (...) {} return ret; } virtual toQuery::queryImpl *createQuery(toQuery *query, toConnectionSub *sub) { return new qSqlQuery(query, qSqlConv(sub)); } virtual void execute(toConnectionSub *sub, const QString &sql, toQList ¶ms) { qSqlSub *conn = qSqlConv(sub); try { LockingPtr ptr(conn->Connection, conn->Lock); QSqlQuery Query(ptr->exec(QueryParam(sql, params, NULL))); if (!Query.isActive()) { QString msg = QString::fromLatin1("Query not active "); msg += sql; ptr.unlock(); throw ErrorString(Query.lastError(), msg); } } catch (const toQSqlProviderAggregate &) { // Ok, this one is complicated and will probably never be used. throw QString("Direct exec aggregate queries are not supported, use a toQuery object for this one"); } } }; toQSqlProvider(void) : toConnectionProvider("QSql", false) { OnlyForward = toConfigurationSingle::Instance().onlyForward(); } virtual void initialize(void) { Drivers = QSqlDatabase::drivers(); for (int i = 0;i < Drivers.count();i++) { QString t = fromQSqlName(Drivers[i]); if (!t.isEmpty()) addProvider(t); } } ~toQSqlProvider() { #ifdef Q_WS_MAC #warning "toQSqlProvider is disabled for Mac OS X due crashes. Maybe it is not a correct solution..." #else for (int i = 0;i < Drivers.count();i++) { QString t = fromQSqlName(Drivers[i]); if (!t.isEmpty()) removeProvider(t); } #endif } virtual QWidget *providerConfigurationTab(const QString &provider, QWidget *parent) { if (provider == "MySQL") return new qSqlSetting(parent); return NULL; } virtual toConnection::connectionImpl *provideConnection(const QString &, toConnection *conn) { return new qSqlConnection(conn); } virtual std::list providedHosts(const QString &provider) { std::list ret; ret.insert(ret.end(), "localhost"); if (provider == "MySQL") ret.insert(ret.end(), ":3306"); else if (provider == "PostgreSQL") ret.insert(ret.end(), ":5432"); return ret; } virtual std::list providedOptions(const QString &provider) { std::list ret; if (provider == "MySQL") { ret.insert(ret.end(), "*SSL"); ret.insert(ret.end(), "*Compress"); ret.insert(ret.end(), "-"); ret.insert(ret.end(), "Ignore Space"); ret.insert(ret.end(), "No Schema"); } return ret; } virtual std::list providedDatabases(const QString &, const QString &, const QString &, const QString &) { std::list ret; // Need implementation return ret; } static qSqlSub* createConnection(toConnection &conn); }; static toQSqlProvider QSqlProvider; toLock myLock; void toQSqlProvider::qSqlQuery::execute(void) { Query = NULL; try { Query = createQuery(QueryParam(parseReorder(query()->sql()), query()->params(), NULL)); } catch (const toQSqlProviderAggregate &aggr) { ExtraData = extraData(aggr); if (ExtraData.begin() != ExtraData.end()) CurrentExtra = *ExtraData.begin(); QString t = QueryParam(parseReorder(query()->sql()), query()->params(), &ExtraData); if (t.isEmpty()) { toStatusMessage("Nothing to send to aggregate query"); Query = NULL; EOQ = true; return; } else Query = createQuery(t); } checkQuery(); } void toQSqlProvider::qSqlQuery::checkQuery(void) // Must *not* call while locked { LockingPtr ptr(Connection->Connection, Connection->Lock); do { if (!Query->isActive()) { QString msg = QString::fromLatin1("Query not active "); msg += query()->sql(); throw ErrorString(Query->lastError(), msg); } if (Query->isSelect()) { Record = Query->record(); if (ColumnOrder && ColumnOrder[ColumnOrderSize - 1] == -1) { unsigned int newsize = ColumnOrderSize + Record.count() - 1; int *newalloc = new int[newsize]; unsigned int i; for (i = 0;i < ColumnOrderSize - 1;i++) newalloc[i] = ColumnOrder[i]; for (int colnum = 1;i < newsize;i++, colnum++) newalloc[i] = colnum; delete[] ColumnOrder; ColumnOrder = newalloc; ColumnOrderSize = newsize; } EOQ = !Query->next(); Column = 0; } else { EOQ = true; } if (EOQ && ExtraData.begin() != ExtraData.end()) { delete Query; Query = NULL; ptr.unlock(); Query = createQuery(QueryParam(parseReorder(query()->sql()), query()->params(), &ExtraData)); ptr.lock(); } } while (ExtraData.begin() != ExtraData.end() && EOQ); } toQSqlProvider::qSqlSub *toQSqlProvider::createConnection(toConnection &conn) { static int ID = 0; ID++; QString dbName = QString::number(ID); QSqlDatabase db = QSqlDatabase::addDatabase(toQSqlName(conn.provider()), dbName); db.setDatabaseName(conn.database()); QString host = conn.host(); int pos = host.indexOf(QString(":")); if (pos < 0) db.setHostName(host); else { db.setHostName(host.mid(0, pos)); db.setPort(host.mid(pos + 1).toInt()); } QString opt; std::set options = conn.options(); if (options.find("Compress") != options.end()) opt += ";CLIENT_COMPRESS"; if (options.find("Ignore Space") != options.end()) opt += ";CLIENT_IGNORE_SPACE"; if (options.find("No Schema") != options.end()) opt += ";CLIENT_NO_SCHEMA"; if (options.find("SSL") != options.end()) opt += ";CLIENT_SSL"; if (!opt.isEmpty()) db.setConnectOptions(opt.mid(1)); // Strip first ; character db.open(conn.user(), conn.password()); if (!db.isOpen()) { QString t = ErrorString(db.lastError()); QSqlDatabase::removeDatabase(dbName); throw t; } toQSqlProvider::qSqlSub *ret = new toQSqlProvider::qSqlSub(db, dbName); // Try to figure out the connection ID for canceling try { QString sql = SQLConnectionID(conn); QSqlQuery query = db.exec(sql); if (query.next()) ret->ConnectionID = query.value(0).toString(); } catch (...) {} return ret; } toConnectionSub *toQSqlProvider::qSqlConnection::createConnection(void) { return toQSqlProvider::createConnection(connection()); } bool toQSqlProvider::OnlyForward; tora-2.1.3/src/icons/0000755000175000017500000000000011445450571014160 5ustar michaelmichaeltora-2.1.3/src/icons/todebug.xpm0000644000175000017500000000071311270353517016336 0ustar michaelmichael/* XPM */ static const char* const todebug_xpm[] = { "16 16 5 1", " c None", ". c #000000", "+ c #474747", "@ c #AA2323", "# c #777777", " ", " ", " . +. .+ . ", " . .+ +. . ", " +. .... .+ ", " +..@++@..+ ", " .+##+. ", " .+##+. ", " ....++##++.... ", " .+####+. ", " ..++##++.. ", " .+.++++++.+. ", " .+ ...... +. ", " . . ", " . . ", " "}; tora-2.1.3/src/icons/tobrowser.xpm0000644000175000017500000000105011270353517016726 0ustar michaelmichael/* XPM */ static const char* const tobrowser_xpm[] = { "16 16 11 1", " c None", ". c #000000", "+ c #5F5FFF", "@ c #000093", "# c #7F7F7F", "$ c #DFDFDF", "% c #1F1F1F", "& c #3F3F3F", "* c #5F5F5F", "= c #9F9F9F", "- c #BFBFBF", " ", " ... ", " .+++. ", " .+++++. ", " .+++++. ", " .....@++++. ", " .#####.@++. ", ".#######..... ", "..######.. ... ", "........$. ... ", "..%&*#=-$. .. ", "..%&*#=-$. ", "..%&*#=-$. ", "..%&*#=-$. ", " .%&*#=-. ", " ...... "}; tora-2.1.3/src/icons/tolongops.xpm0000644000175000017500000000064011270353517016730 0ustar michaelmichael/* XPM */ static const char* const tolongops_xpm[] = { "16 16 2 1", " c None", ". c #000000", " ......", " ......", " ..", " .. ", " .. ", " .... .. ", " ... ", " . ......", " . ......", " . ", " .... ", " ... ", " . ", " . ", " . ", " ... "}; tora-2.1.3/src/icons/package.png0000644000175000017500000000130611270353517016257 0ustar michaelmichaelPNG  IHDR&N:sBIT|d pHYstEXtSoftwarewww.inkscape.org<CIDAT(mKkAzt30DHEڍ FBq'dAW.DbJ|$A]Eg\(.TS""[ˋ^DKkOoFC,=?3?x}[W_gnj͝y $@InُOOQkz c0!JI}Yif7޶6v7bglQ)]JQ@燪#y*D]6;2^9hT#1C!Mt0LbƪvJl}jS~vuTi'rt5F6E;ZU:]/BXTYd/ O%L( 'HY"}@X >K9WxTd^VXq9dNc OtH+,A"#w$ZqIRnNpxY>:^jӼ]@͌tigS{:qJ%`XwOR|f]vdn%V#EDIW[ Se IENDB`tora-2.1.3/src/icons/addtablespace.xpm0000644000175000017500000000072111270353517017460 0ustar michaelmichael/* XPM */ static const char* const addtablespace_xpm[] = { "16 16 5 1", " c None", ". c #000000", "+ c #7F7F7F", "@ c #00FF00", "# c #FFFFFF", " ........ ", " .+++++.@. ", " .++++++.@. ", " ..++....@....", " .#...@@@@@@@.", " .........@....", " .+++++..+.@.+..", ".+++++++...@..#.", "..+++++......##.", ".#......#.####..", ".########.....#.", "..######..#####.", ".#......#.####. ", ".########..... ", " .######. ", " ...... "}; tora-2.1.3/src/icons/xmlwrap.png0000644000175000017500000000327511361122016016352 0ustar michaelmichaelPNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<:IDATxZ]oU~vvv[CA,*DHg@(U ۤA%;oLy字%1!Q XAAhR m|ή/g;#I͜3sgf[u]<,BGWhžB%\x8x(PerR&m|FFe]!oID^x^kkFDUiګӽvRk*Yf#} xi>I{ /?P*@-(Xy4H@@5~I* l'\<R pjKH&:EKd-Qr#*H0/8"CgjU$V砃 {9U#*\ Z62ЏL*i|c 0iX#жw%~3 ҹ mPZIUsw!X#d ײaMPZټFeaD ySpG6Ǜٺecaʈ{6  /=yBuh/>+Q.%vtB{i%Bj)4̟/uwu Tz+[;}A/i7V#Q[XDT<&jw ״Z6!# @Dt d^ql| $O>y+ )1'3 )ۛӮ 8naΈ <&֢$'a~B~ન<-aa;9MJs6p!\Y83:B߹:y ڦ0O`$}}y7!t}.gFD:|2o`؏x=$IZCtQ#Ώ!Os|~n"t!ogc#ѽŏjHeۈQNw6!U4!* 0{]B{x v-,f8 |Ebx"w! m3k  q |NdNmDA-$Tm)n۶[ :!@qO@)9JåB㓯uX˲`|>/k5MiHRY@ȏ/42 "&,홙\(]ޚn?u'2"R| >/A">\TSJeʿ障*<VH$%6㙃Ҕ9Bթl + `U˜JD@ʶ9p@ ^ 'r,FttU6e[(83"Bڻwoy2K`xxxbCi2>8&?Ty!`UUmoa>uQF!f\ zH=p'7 Iq{l ,͕G٢m@0}ɨVyg aZMtIENDB`tora-2.1.3/src/icons/nofilter.xpm0000644000175000017500000000071411270353517016530 0ustar michaelmichael/* XPM */ static const char* const nofilter_xpm[] = { "16 16 5 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #FF0000", "# c #7F7F7F", " . ", " .. ", " .+. @@ ", "........++.@@@ ", " #####.++#@@@ ", " ####.++#@@@ ", " ####.+#@@@.....", " ####.#@@@##### ", " ####.@@@###### ", " ####@@@........", " ###@@@++#. ", " ##@@@++#. ", "..@@@.+#. ", " @@ .#. ", " .. ", " . "}; tora-2.1.3/src/icons/movefile.xpm0000644000175000017500000000067511270353517016522 0ustar michaelmichael/* XPM */ static const char* const movefile_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #7F7F7F", " .......... ", " .++++++++. ", " .+.....+++. ", " .+. ...+.. ", " .+. .@@@.@@. ", " ..+...@@@@@@@.", " .@...@@.@@@@@..", ".@@@@@@@@.....+.", "..@@@@@@..+++++.", ".+......+.++++..", ".++++++++.....+.", "..++++++..+++++.", ".+......+.++++. ", ".++++++++..... ", " .++++++. ", " ...... "}; tora-2.1.3/src/icons/addtable.xpm0000644000175000017500000000067511270353517016454 0ustar michaelmichael/* XPM */ static const char* const addtable_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #00FF00", "@ c #FFFFFF", " ... ", " .+. ", " .+. ", "...........+....", ".@@@.@@.+++++++.", "...........+....", ".@@@.@@@.@.+. ", ".@@@.@@@.@.+. ", "............. ", ".@@@.@@@.@@@. ", ".@@@.@@@.@@@. ", "............. ", ".@@@.@@@.@@@. ", ".@@@.@@@.@@@. ", "............. ", " "}; tora-2.1.3/src/icons/executeall.xpm0000644000175000017500000000066011270353517017041 0ustar michaelmichael/* XPM */ static const char* const executeall_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #0FFE14", " . ", " .. ", " .+. ", " .++. ", " .+++. ", " .+++. ", " .++. ", " .+. ", " .. ", " .+. ", " .++. ", " .+++. ", " .+++. ", " .++. ", " .+. ", " .. "}; tora-2.1.3/src/icons/tree.xpm0000644000175000017500000000067111270353517015647 0ustar michaelmichael/* XPM */ static const char* const tree_xpm[] = { "16 16 4 1", " c None", ". c #E69500", "+ c #AC7100", "@ c #000000", " ....+ ", " ....+ ", " ....+ ", " ....+ ", " +++++ ", " @ ....+ ", " @@@@@....+ ", " @ ....+ ", " @ ....+ ", " @ +++++ ", " @ @ ", " @....+ @....+", " @....+ @....+", " ....+ ....+", " ....+ ....+", " +++++ +++++"}; tora-2.1.3/src/icons/view.xpm0000644000175000017500000000071011270353517015654 0ustar michaelmichael/* XPM */ static const char* const view_xpm[] = { "16 16 5 1", " c None", ". c #FFFFFF", "+ c #000000", "@ c #5F5FFF", "# c #000093", "................", "................", ".+++++++++++++..", ".+...+...+...+..", ".+++++++++++++..", ".+...+@@@+...+..", ".+..+@@@@@+..+..", ".++++@@@@@++++..", ".+..+#@@@@+..+..", ".+...+#@@+...+..", ".+++++++++++++..", ".+...+...+++.+..", ".+...+...+++++..", ".+++++++++++++..", "................", "................"}; tora-2.1.3/src/icons/table.xpm0000644000175000017500000000065311270353517015777 0ustar michaelmichael/* XPM */ static const char* const table_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #FFFFFF", " ", " ", " ............. ", " .+++.+++.+++. ", " ............. ", " .+++.+++.+++. ", " .+++.+++.+++. ", " ............. ", " .+++.+++.+++. ", " .+++.+++.+++. ", " ............. ", " .+++.+++.+++. ", " .+++.+++.+++. ", " ............. ", " ", " "}; tora-2.1.3/src/icons/previous.xpm0000644000175000017500000000104711270353517016562 0ustar michaelmichael/* XPM */ static const char* const previous_xpm[] = { "16 16 11 1", " c None", ". c #A6A6A6", "+ c #383838", "@ c #404040", "# c #000000", "$ c #BFBFBF", "% c #F7F7F7", "& c #777777", "* c #E6E6E6", "= c #DEDEDE", "- c #6F6F6F", " ", " ", " .++ ", " .+@@# ", " .+@$%&# ", " .+@$%*=-# ", " .+@$%*===-# ", " +@$%*=====-# ", " +##+.=====-# ", " .+##+.===-# ", " .+##+.=-# ", " .+##++# ", " .+### ", " .++ ", " ", " "}; tora-2.1.3/src/icons/add.xpm0000644000175000017500000000065111270353517015436 0ustar michaelmichael/* XPM */ static const char* const add_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #00FF00", " ... ", " .+. ", " .+. ", " ....+....", " .+++++++.", " ....+....", " .+. ", " .+. ", " ... ", " ", " ", " ", " ", " ", " ", " "}; tora-2.1.3/src/icons/tosecurity.xpm0000644000175000017500000000073511270353517017123 0ustar michaelmichael/* XPM */ static const char* const tosecurity_xpm[] = { "16 16 6 1", " c None", ". c #000000", "+ c #999999", "@ c #4C4C4C", "# c #BCBCBC", "$ c #707070", " ", " .... ", " .++++. ", " .++..++. ", " .+. .+. ", " ..+....+.. ", " .@.+.@@.+.@. ", " ............ ", " .##$$$$$$@@. ", " .##$$$$$$@@. ", " .##$$$$$$@@. ", " .##$$$$$$@@. ", " .##$$$$$$@@. ", " .##$$$$$$@@. ", " .##$$$$$$@@. ", " .......... "}; tora-2.1.3/src/icons/tosession.xpm0000644000175000017500000000103111270353517016725 0ustar michaelmichael/* XPM */ static const char* const tosession_xpm[] = { "16 16 10 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #7F7F7F", "# c #DFDFDF", "$ c #1F1F1F", "% c #3F3F3F", "& c #5F5F5F", "* c #9F9F9F", "= c #BFBFBF", " .... ", " .++. ", " ..++.. ", " .. ..++++.. .. ", ".++.+..++..+.++.", " .+++......+++. ", " .++.@@@@.++. ", " .+++.@@@@.+++. ", " .....@@@@.... ", " ........#. ", " ..$%&@*=#. ", " ..$%&@*=#. ", " ..$%&@*=#. ", " ..$%&@*=#. ", " .$%&@*=. ", " ...... "}; tora-2.1.3/src/icons/addtemplate.xpm0000644000175000017500000000070011270353517017165 0ustar michaelmichael/* XPM */ static const char* const addtemplate_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #00FF00", "@ c #FFFFFF", " .... ", " .....+.@. ", " .@@@.+.@@.", " .....+....", "........+++++++.", "@@@@@@.....+....", "@....@@@@@.+. ", "@@@@@@@@@@.+. ", "@...@...@@... ", "@@@@@@@@@@. ", "@......@@@. ", "@@@@@@@@@@. ", "@.....@@@@. ", "@@@@@@@@@@. ", "@..@.....@. ", "@@@@@@@@@@. "}; tora-2.1.3/src/icons/tostorage.xpm0000644000175000017500000000067611270353517016724 0ustar michaelmichael/* XPM */ static const char* const tostorage_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #7F7F7F", "@ c #FFFFFF", " ...... ", " .++++++. ", " .++++++++. ", " ..+++...... ", " .@...++++++. ", " ......+++++++.", " .++++++.+++++..", ".++++++++.....@.", "..++++++..@@@@@.", ".@......@.@@@@..", ".@@@@@@@@.....@.", "..@@@@@@..@@@@@.", ".@......@.@@@@. ", ".@@@@@@@@..... ", " .@@@@@@. ", " ...... "}; tora-2.1.3/src/icons/tooutput.xpm0000644000175000017500000000103011270353517016601 0ustar michaelmichael/* XPM */ static const char* const tooutput_xpm[] = { "16 16 10 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #7F7F7F", "# c #DFDFDF", "$ c #1F1F1F", "% c #3F3F3F", "& c #5F5F5F", "* c #9F9F9F", "= c #BFBFBF", " .. .... ", " ...+. .++.. ", " .++++..++...", " .+.+. .++++.", " .+.. .+..+.", " ...+.. .++++.", " .@@...@. ......", ".@@@@@@@@. ", "..@@@@@@.. ", "........#. ", "..$%&@*=#. ", "..$%&@*=#. ", "..$%&@*=#. ", "..$%&@*=#. ", " .$%&@*=. ", " ...... "}; tora-2.1.3/src/icons/coalesce.xpm0000644000175000017500000000065611270353517016471 0ustar michaelmichael/* XPM */ static const char* const coalesce_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #FFFFFF", " . ", " ... ... ", " . ..... ", "..... ..... ", " . ... ", " . . . ", ". . . .......", " .. . ", " . ...+. . ", " ... .++++. . ", " . ...+. . ", "..... .. . . ", " . . . . ", " . . . .", ". . ", " "}; tora-2.1.3/src/icons/toanalyze.xpm0000644000175000017500000000101111270353517016703 0ustar michaelmichael/* XPM */ static const char* const toanalyze_xpm[] = { "16 16 9 1", " c None", ". c #000000", "+ c #BFBFBF", "@ c #3F3F3F", "# c #7F7F7F", "$ c #1F1F1F", "% c #5F5F5F", "& c #9F9F9F", "* c #DFDFDF", " ....... ", " .+++++++.", " .+@@@@@+.", " .+@@@@@+.", " .+++++++.", " ......+@+@+@+.", " .#####.+++++++.", ".######.+@+@+@+.", "..#####.+++++++.", "........+@+@+@+.", "..$@%#&.+++++++.", "..$@%#&+....... ", "..$@%#&+*. ", "..$@%#&+*. ", " .$@%#&+. ", " ...... "}; tora-2.1.3/src/icons/legend.xpm0000644000175000017500000000065411270353517016147 0ustar michaelmichael/* XPM */ static const char* const legend_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #FFFFFF", " ", " ........ ", " .++++++. ", " .+..+++. ", " .++++++. ", " .+...++. ", " .++++++. ", " .+.++++. ", " .++++++. ", " .+....+. ", " .++++++. ", " ........ ", " ", " ", " ", " "}; tora-2.1.3/src/icons/checkcode.xpm0000644000175000017500000000067511316741067016626 0ustar michaelmichael/* XPM */ static const char * const checkcode_xpm[]={ "16 16 4 1", ". c none", "a c #00ff00", "# c #ffff00", "* c #777777", "................", "...**********...", "..*##########*..", ".*############*.", ".*############*.", ".*##**####**##*.", ".*#*aa*##*aa*#*.", ".*#*aaa**aaa*#*.", ".*##*aaaaaa*##*.", ".*###*aaaa*###*.", ".*####*aa*####*.", ".*#####**#####*.", ".*############*.", "..*##########*..", "...**********...", "................"}; tora-2.1.3/src/icons/compile.xpm0000644000175000017500000000253711270353517016343 0ustar michaelmichael/* XPM */ static const char* const compile_xpm[] = { "16 16 66 1", " c None", ". c #929253", "+ c #767611", "@ c #B7B79F", "# c #FDFDAA", "$ c #EFEF12", "% c #888800", "& c #B5B59D", "* c #FDFDDB", "= c #F7F758", "- c #969600", "; c #B3B39A", "> c #FCFCDB", ", c #F7F763", "' c #989804", ") c #B0B096", "! c #FDFDDD", "~ c #F8F865", "{ c #909004", "] c #ADAD7F", "^ c #FDFDB7", "/ c #FFFF32", "( c #F9F904", "_ c #D8D800", ": c #D5D500", "< c #CFCF00", "[ c #D2D264", "} c #D5D51C", "| c #E6E617", "1 c #FFFF2C", "2 c #FFFF1B", "3 c #FAFA00", "4 c #ADAD00", "5 c #56561D", "6 c #D4D4C0", "7 c #FFFFC7", "8 c #FBFB37", "9 c #B2B200", "0 c #D7D7C5", "a c #FFFFDF", "b c #FFFF83", "c c #ABAB09", "d c #D6D6C1", "e c #FFFFDE", "f c #FFFF87", "g c #FFFF08", "h c #C2C200", "i c #B6B600", "j c #696901", "k c #C7C793", "l c #F1F187", "m c #F1F14E", "n c #F7F70D", "o c #FFFF02", "p c #FDFD00", "q c #BBBB00", "r c #949463", "s c #FEFE4C", "t c #BCBC00", "u c #7D7D51", "v c #F7F7A2", "w c #BDBD0A", "x c #D1D19E", "y c #BEBE14", "z c #979775", "A c #BFBF4B", " ", " .+ ", " @#$% ", " &*=- ", " ;>,' ", " )!~{ ", " ]^/(_::< ", " [}:|1234 ", " 56789 ", " 0abc ", " defghij ", " klmnopq ", " rst ", " uvw ", " xy ", " zA "}; tora-2.1.3/src/icons/unittest.xpm0000644000175000017500000000417511270353517016572 0ustar michaelmichael/* XPM */ static const char * unittest_xpm[] = { "16 16 96 2", " c None", ". c #66D866", "+ c #67D667", "@ c #64D464", "# c #6ED76E", "$ c #5CCA5C", "% c #B2DBB2", "& c #A9D7A9", "* c #55C455", "= c #51BF51", "- c #9CD59C", "; c #93D193", "> c #4CBA4C", ", c #46B546", "' c #86D086", ") c #7DCC7D", "! c #43B243", "~ c #DEC467", "{ c #DEC057", "] c #DEBF54", "^ c #E0C56D", "/ c #3BAD3B", "( c #70CC70", "_ c #67C967", ": c #3AAA3A", "< c #D7AF4B", "[ c #F3D68E", "} c #F2D286", "| c #D7AD45", "1 c #30A430", "2 c #5ACB5A", "3 c #51C751", "4 c #34A434", "5 c #D2A240", "6 c #F2D278", "7 c #F1CF70", "8 c #D2A13D", "9 c #289F28", "0 c #47CC47", "a c #3EC83E", "b c #119611", "c c #CD9736", "d c #F2D162", "e c #F1CE5A", "f c #CE9838", "g c #239B23", "h c #1DC81D", "i c #00C000", "j c #0C930C", "k c #CD5F5F", "l c #C54646", "m c #C34343", "n c #CD6666", "o c #CA8E30", "p c #F2D14C", "q c #F1D049", "r c #CB9035", "s c #0F940F", "t c #00CA00", "u c #00C900", "v c #129312", "w c #B53333", "x c #CC5959", "y c #C85454", "z c #B33434", "A c #C68520", "B c #F1CE1E", "C c #F0C90D", "D c #C68211", "E c #149514", "F c #00D300", "G c #00D200", "H c #189418", "I c #AA0C0C", "J c #CE0000", "K c #CC0000", "L c #A81010", "M c #C37E13", "N c #F2D000", "O c #C47F17", "P c #1A951A", "Q c #00DD00", "R c #00DC00", "S c #1D941D", "T c #932323", "U c #A71313", "V c #A61414", "W c #912424", "X c #AE5729", "Y c #C27B1A", "Z c #C27B1B", "` c #AE562A", " . c #2E722E", ".. c #1D911D", "+. c #1D901D", "@. c #2C6E2C", " ", " ", " . + @ # ", " $ % & * ", " = - ; > ", " , ' ) ! ", " ~ { ] ^ / ( _ : ", " < [ } | 1 2 3 4 ", " 5 6 7 8 9 0 a b ", " c d e f g h i j ", "k l m n o p q r s t u v ", "w x y z A B C D E F G H ", "I J K L M N N O P Q R S ", "T U V W X Y Z ` ...+.@.", " ", " "}; tora-2.1.3/src/icons/awrtool.xpm0000644000175000017500000000072511411113466016371 0ustar michaelmichael/* XPM */ static const char * awrtool_xpm[] = { "16 16 6 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #7D7D7D", "# c #333333", "$ c #C2C2C2", " ...... ", " ..++++. ", " .+.++++. ", " .++.++++. ", " .....++++. ", " .+++....+. ", " .++.++@.+. ", " .+#$++@.+. ", " .+#+++@.+. ", " .+.+++@.+. ", " .+......+. ", " .+.+++@.+. ", " .+.+++@.+. ", " .+.+++@.+. ", " .++++++++. ", " .......... "}; tora-2.1.3/src/icons/prevbug.xpm0000644000175000017500000000073211270353517016360 0ustar michaelmichael/* XPM */ static const char* const prevbug_xpm[] = { "16 16 6 1", " c None", ". c #000000", "+ c #474747", "@ c #00FF00", "# c #AA2323", "$ c #777777", " ", " ", " ", " . +. .+ . ", " . .+ .........", " +. ...@@@@@@@.", " +..#+.........", " .+$$+. ", " .+$$+. ", "....++$$++.... ", " .+$$$$+. ", " ..++$$++.. ", " .+.++++++.+. ", ".+ ...... +. ", ". . ", ". . "}; tora-2.1.3/src/icons/commit.xpm0000644000175000017500000000102611270353517016173 0ustar michaelmichael/* XPM */ static const char* const commit_xpm[] = { "16 16 10 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #7F7F7F", "# c #DFDFDF", "$ c #1F1F1F", "% c #3F3F3F", "& c #5F5F5F", "* c #9F9F9F", "= c #BFBFBF", " ...... ", " .++++. ", " ...++. ", " ....++.... ", " ..++++.. ", " ..++.. ", " .@....@. ", " .@@@..@@@. ", " ..@@@@@@.. ", " ........#. ", " ..$%&@*=#. ", " ..$%&@*=#. ", " ..$%&@*=#. ", " ..$%&@*=#. ", " .$%&@*=. ", " ...... "}; tora-2.1.3/src/icons/torollback.xpm0000644000175000017500000000066011270353517017042 0ustar michaelmichael/* XPM */ static const char* const torollback_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #FFFFFF", " ", " . ", " ..+. ... ", " .++++..++. ", " .++.+. ..++. ", " .+. . .+. ", " ... .+++. ", " . .+. ", " .+. . ", " .+++. ... ", " .+. . .+. ", " .++.. .+.++. ", " .+++.++++. ", " ... .+.. ", " . ", " "}; tora-2.1.3/src/icons/delwatch.xpm0000644000175000017500000000317511270353517016505 0ustar michaelmichael/* XPM */ static const char* const delwatch_xpm[] = { "16 16 85 1", " c None", ". c #000000", "+ c #262626", "@ c #828282", "# c #D2D2D2", "$ c #D7D7D7", "% c #A2A2A2", "& c #393939", "* c #00FF00", "= c #8C8C8C", "- c #FAFAFA", "; c #FFFFFF", "> c #FCFCFC", ", c #BABABA", "' c #E8E8E8", ") c #FDFDFD", "! c #FBFBFB", "~ c #F9F9F9", "{ c #F1F1F1", "] c #333333", "^ c #ABABAB", "/ c #F3F3F3", "( c #EFEFEF", "_ c #EEEEEE", ": c #EBEBEB", "< c #646464", "[ c #3B3939", "} c #F6F6F6", "| c #F4F4F4", "1 c #F0F0F0", "2 c #363636", "3 c #B0B0B0", "4 c #EAEAEA", "5 c #E7E7E7", "6 c #E5E5E5", "7 c #676767", "8 c #424040", "9 c #E6E6E6", "0 c #848484", "a c #696969", "b c #E4E4E4", "c c #343434", "d c #A9A9A9", "e c #A7A7A7", "f c #4D4D4D", "g c #CECECE", "h c #E0E0E0", "i c #DEDEDE", "j c #C2C2C2", "k c #252525", "l c #101010", "m c #CCCCCC", "n c #E3E3E3", "o c #D3D3D3", "p c #282828", "q c #565656", "r c #070707", "s c #9B9B9B", "t c #D9D9D9", "u c #D4D4D4", "v c #4F4F4F", "w c #494646", "x c #535353", "y c #B1B1B1", "z c #DDDDDD", "A c #D0D0D0", "B c #818181", "C c #100F0F", "D c #2E2E2E", "E c #ADADAD", "F c #9A9A9A", "G c #A4A4A4", "H c #0E0E0E", "I c #232323", "J c #201F1F", "K c #4A4A4A", "L c #494949", "M c #434343", "N c #141313", "O c #5C5A5A", "P c #464444", "Q c #494747", "R c #525050", "S c #3D3B3B", "T c #4C4949", " ", " ", " ", " .... .........", " +@#$%&.*******.", ".=-;;>,.........", ".')!-~{]^/{(_:<[", ".(}|/{123:4'5678", ".90ab4'cdefghi<8", ".jklmnop=qrstuvw", " xdyzABCDEFogGH ", " .Iff&J lKLMNO ", " PQR SQT ", " ", " ", " "}; tora-2.1.3/src/icons/executestep.xpm0000644000175000017500000000066111270353517017245 0ustar michaelmichael/* XPM */ static const char* const executestep_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #0FFE14", " ", " ", " ", " . ", " .. ", " .+. ", " .++. ", " .+++. ", " .+++. ", " .++. ", " .+. ", " .. .. .. ..", " . .. .. ..", " ", " ", " "}; tora-2.1.3/src/icons/toalert.xpm0000644000175000017500000000102711270353517016356 0ustar michaelmichael/* XPM */ static const char* const toalert_xpm[] = { "16 16 10 1", " c None", ". c #000000", "+ c #FFFF00", "@ c #7F7F7F", "# c #DFDFDF", "$ c #1F1F1F", "% c #3F3F3F", "& c #5F5F5F", "* c #9F9F9F", "= c #BFBFBF", " ", " .... ", " .++++. ", " .++++. ", " .++++. ", " .++++. ", " .@.++... ", " .@@.++.@.. ", " ..@.++.@.. ", " ........#. ", " ..$%&@*=#. ", " ..$%..*=#. ", " ..$.++.=#. ", " ..$.++.=#. ", " .$%..*=. ", " ...... "}; tora-2.1.3/src/icons/offline.xpm0000644000175000017500000000065511270353517016334 0ustar michaelmichael/* XPM */ static const char* const offline_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #828282", " ", " ", " ", " .... ", " .++++. ", " .++.+++. ", " .+++.++. ", " .++.+++. ", " .++++. ", " .... ", " .++. ", " .... ", " .++. ", " .. ", " ", " "}; tora-2.1.3/src/icons/togglebreak.xpm0000644000175000017500000000124211270353517017171 0ustar michaelmichael/* XPM */ static const char* const togglebreak_xpm[] = { "16 16 19 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #00FF00", "# c #FF0000", "$ c #FF0303", "% c #FF8484", "& c #FF1C1C", "* c #FF0707", "= c #FFC9C9", "- c #FF1111", "; c #FF1F1F", "> c #FF2828", ", c #FF4A4A", "' c #FF0F0F", ") c #FF0202", "! c #FF1313", "~ c #FF9999", "{ c #FF3838", " ......... ", " .++++++.@. ", " .++#####.@.. ", " .++###....@....", ".++####.@@@@@@@.", ".+#####....@....", ".+$+++++%+.@.&+.", ".+*=#-+;+>.@.,+.", ".+'#=-+;+>...)+.", ".+#++!+-~+%+{#+.", ".........#####+.", ".@@@@@@@.####++.", ".........###++. ", " .++######++. ", " .++++++++. ", " ........ "}; tora-2.1.3/src/icons/scheduler.xpm0000644000175000017500000001422211270353517016663 0ustar michaelmichael/* XPM */ static const char* const scheduler_xpm[]={ "32 32 253 2", "Qt c None", ".a c #b5b5b5", "bS c #000000", "b6 c #000000", "b3 c #000000", "bV c #141414", "b2 c #141414", "bY c #262626", "b0 c #252525", "b4 c #000000", "b5 c #000000", "bN c #000000", "aD c #000000", ".c c #003d00", ".d c #003c00", ".e c #003e00", ".g c #0a460a", ".i c #003b00", ".X c #003c00", "bR c #c2c2c2", "b1 c #c5c5c5", "bU c #c9c9c9", "bZ c #c9c9c9", "bX c #cdcdcd", ".b c #8e8e8e", ".h c #e9eae9", ".H c #006000", "au c #008200", "at c #008300", "ab c #008400", "ac c #008500", "#A c #008600", "#g c #008700", ".F c #008800", "#h c #008900", ".Y c #008a00", ".G c #008b00", ".W c #008c00", ".U c #015501", "av c #018c00", "aC c #018d00", ".Z c #027401", "#i c #028d01", ".J c #035502", ".k c #038d03", "#V c #038e01", "#f c #038e02", ".l c #048603", ".j c #048b04", ".E c #048d04", ".V c #048e02", ".D c #058e04", "ad c #058f02", "as c #058f03", "#e c #067203", "#B c #068f03", ".C c #078905", "aa c #079005", "#U c #089005", "#j c #089104", ".S c #096407", "#W c #099104", "ae c #0a9205", "aw c #0b9205", "#C c #0b9306", "#k c #0e9407", "af c #0f9508", "#D c #129609", "#l c #15980b", "ag c #15990b", "#E c #199b0d", ".4 c #1a7c0d", "ax c #1a9b0d", "#X c #1b9c0e", "#m c #1d9d0f", "ay c #1e9e10", "#a c #208512", "#F c #209f11", "#Y c #21a011", "#z c #229d1b", "az c #22a012", "#n c #24a113", "aA c #25a213", "ah c #26a314", "#G c #27a314", "#Z c #28a415", "#d c #293728", ".1 c #293729", ".0 c #293929", "aB c #29a516", ".2 c #2a3429", "ai c #2aa516", "#c c #2b3729", "#b c #2b3a2a", "#o c #2ba617", ".3 c #2c392b", "#H c #2da718", ".5 c #2ea818", "#y c #2fa326", ".K c #30a919", "ar c #31a42d", "aj c #31a91a", "#p c #32aa1a", "#x c #33a727", "ak c #33aa1a", "al c #33ab1b", "#I c #34ab1b", ".6 c #36ad1c", "#0 c #37ad1d", ".n c #38a32c", ".L c #39ae1e", "#q c #3aaf1f", "#1 c #3baf1f", "#w c #3cad2a", "#2 c #3db120", "#3 c #3eb121", ".7 c #3fb221", "#J c #40b322", ".M c #42b423", "#v c #44b12e", ".A c #45a938", "ao c #45af37", "#K c #45b625", ".8 c #48b726", "#L c #48b826", "#r c #49b827", "ap c #4ab042", ".N c #4bb928", "#u c #4db735", ".o c #4fb83e", "#s c #4fbc2a", ".9 c #50bc2b", "#t c #53be2c", "#Q c #54b548", ".O c #55bf2d", "#. c #58c12f", "am c #5ab94b", ".p c #5bbd46", ".z c #5bbe47", ".P c #5ec432", "## c #60c633", "aq c #63ba5e", ".q c #65c450", ".Q c #66ca36", "#M c #67c152", ".R c #6bcd39", ".r c #70cb57", ".y c #71cb57", "an c #72c366", ".s c #7cd15f", ".x c #7cd160", "#8 c #83c97c", ".t c #84d766", ".w c #85d766", ".u c #8ddb6c", ".# c #8e8e8e", ".T c #8e908e", "#4 c #8ed081", ".v c #90dd6f", ".I c #929292", "#R c #99d394", "bT c #9b9b9b", "#T c #9bd398", "a# c #9cd39a", "bW c #9d9d9d", "#S c #a1d59e", "#N c #a5da9a", "#P c #a6d99e", "#7 c #a6d99f", "bA c #a70000", "#O c #a8da9f", "by c #a90000", "aH c #aaaaaa", "a. c #aad9a7", "bu c #acacac", "aL c #aeaeae", "bE c #b0b0b0", "aP c #b1b1b1", "bJ c #b2b2b2", "bO c #b3b3b3", "#9 c #b3ddb0", "#6 c #b3dfac", "aT c #b5b5b5", "bP c #b6b6b6", "bL c #b7b7b7", "bK c #b8b8b8", "bG c #b9b9b9", "bx c #bababa", "aW c #bbbbbb", "#5 c #bbe2b4", "bQ c #bdbdbd", "aI c #c0c0c0", "aJ c #c1c1c1", "bm c #c2c2c2", "aK c #c3c3c3", "a3 c #c4c4c4", "bv c #c5c5c5", "aM c #c6c6c6", "aN c #c7c7c7", "bo c #c8c8c8", "aO c #c9c9c9", "a7 c #cacaca", "aQ c #cbcbcb", "aR c #cccccc", "bj c #cdcdcd", "aS c #cecece", "b# c #cfcfcf", ".B c #cfd3cf", "aU c #d1d1d1", "aV c #d2d2d2", "bI c #d3d3d3", "bF c #d4d4d4", ".m c #d5d5d5", "bl c #d6d6d6", "aX c #d7d7d7", "aY c #dddddd", "aZ c #dedede", "a0 c #dfdfdf", "bD c #e00000", "a1 c #e0e0e0", "be c #e1e1e1", "bw c #e20000", "a2 c #e2e2e2", "bn c #e3e3e3", "bf c #e4e4e4", "a4 c #e5e5e5", "bg c #e6e6e6", "a5 c #e7e7e7", "bh c #e8e8e8", "a6 c #e9e9e9", "bp c #eaeaea", "bi c #ebebeb", "a8 c #ececec", "a9 c #ededed", ".f c #eeeeee", "b. c #efefef", "bq c #f0f0f0", "bk c #f1f1f1", "br c #f2f2f2", "ba c #f3f3f3", "bs c #f4f4f4", "bb c #f5f5f5", "bB c #f6e6e6", "bM c #f6f6f6", "bz c #f7e6e6", "bc c #f7f7f7", "bH c #f8f8f8", "bC c #f9f9f9", "bt c #fafafa", "bd c #fbfbfb", "aG c #fcfcfc", "aF c #fdfdfd", "aE c #fefefe", "QtQtQtQt.#.#.#.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.a.#.#.#.bQtQtQtQt", ".c.d.d.e.f.f.f.f.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.g.f.f.f.h.e.e.d.c", ".i.j.k.l.m.m.m.m.n.o.p.q.r.s.t.u.v.u.w.x.y.q.z.A.m.m.m.B.C.D.E.i", ".i.F.G.H.I.I.I.I.J.K.L.M.N.O.P.Q.R.Q.P.O.N.M.L.S.I.I.I.T.U.V.W.i", ".X.F.Y.Z.0.1.2.3.4.5.6.7.8.9#..P##.P#..9.8.7.6#a#b#c.2#d#e#f.G.X", ".X#g#h#i#j#k#l#m#n#o#p#q.M#r#s#t.O#t#s#r.M#u#v#w#n#x#y#z#j#i.Y.X", ".X#A.F.W#B#C#D#E#F#G#H#I#q#J#K#L#r#L#K#J#M#N#O#P#Q#R#S#T#U.W#h.X", ".X#A#A.Y#V#W#k#l#X#Y#Z#H#p#0#1#2#3#2#1#0#4#5#6#7#8#9a.a#aa.Y.F.X", ".Xabac.F.Wadaeafag#X#Yahai.5ajakalakaj.5amanao#Xapaqaras.W.F#g.X", ".Xatau#A#hav#Bawaf#laxayazaA#ZaBaiaB#ZaAazayax#lafaw#BaC#h#Aac.X", "aDaEaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaEaD", "aDaEaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaFaGaFaD", "aDaFaGaGaHaIaIaIaIaIaHaJaKaKaLaMaNaOaPaQaRaSaTaUaVaVaWaXaGaGaFaD", "aDaFaGaGaIaYaZaZa0a0aIaZa1a2a3a4a5a6a7a8a9b.b#babbbcaXaGaGaGaFaD", "aDaFbdbdaJa0a1a1bebeaIaZa1a1aKbfbgbhaObia9.fbjbkbabbblbdbdbdaFaD", "aDaFbdbdbmbebebea2a2aIaYa0beaKbna4a5bobpa8.faSbqbrbsblbdbdbdaFaD", "aDaFbdbtbuaKaKa3a3bvbwbwbwbwbwbwbwbwbx.m.m.mbx.m.m.mbx.mbtbtaGaD", "aDaGbtbta3bfbfa4a4bgbybzbzbzbzbzbzby.mbtbtbt.mbtbtbt.mbtbtbtaGaD", "aDaGbtbtaMbgbgbgbga5bAbBbBbBbBbBbBbA.mbCbCbC.mbCbCbC.mbCbCbCaGaD", "aDaGbCbCaMbga5bhbha6bDbDbDbDbDbDbDbD.mbCbCbC.mbCbCbC.mbCbCbCaGaD", "aDaGbCbCbEboaOboaOaObx.m.m.mbxbFbFbFbwbwbwbwbGbFbFbFbGbFbHbHbdaD", "aDbdbHbHaOa6bpbpbibpbFbHbHbHbFbHbHbHbybzbzbybFbHbHbHbFbHbHbHbdaD", "aDbdbHbHa7bpbibia8a8bFbHbHbHbFbHbHbHbAbBbBbAbIbcbcbcbIbcbcbcbdaD", "aDbdbcbcaQa8a8a8a9a9bIbcbcbcbIbcbcbcbDbDbDbDbIbcbcbcbIbcbcbcbdaD", "aDbdbcbcbJaRaRaRaRbjbKbIbIbIbKbIbIbIbKbIbIbIbwbwbwbwbLaVbMbMbtbN", "aDbtbMbMaR.f.fb.b.b.aVbMbMbMaVbMbMbMaVbMbMbMbybzbzbyaVbMbMbMbtbN", "aDbtbMbMbjb.b.bqbqbkaVbMbMbMaVbMbMbMaVbMbMbMbAbBbBbAbObPbQaObRbS", "aDbtbbbbbjbqbqbkbkbraVbbbbbbaVbbbbbbaVbbbbbbbDbDbDbDbTaEbMbUbVQt", "aDbtbbbbbLaVaVaVaVaVbLaVaVaVbLaVaVaVbLaVaVaVbLaVaVaVbWbsbXbYQtQt", "bNbCbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsaNbZb0QtQtQt", "bNaGbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCb1b2QtQtQtQt", "b3b4b4b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b4b6QtQtQtQtQt"}; tora-2.1.3/src/icons/indent.xpm0000644000175000017500000000067311270353517016173 0ustar michaelmichael/* XPM */ static const char* const indent_xpm[] = { "16 16 4 1", " c None", ". c #FFFFFF", "+ c #000000", "@ c #00FF00", " ", " .++++++++++++. ", " .............. ", " .......+++.... ", " .............. ", " ..++...++++++. ", " +++@+......... ", " +@@@@+.++++... ", " +++@+......... ", " ..++...+++.... ", " .............. ", " .......+++++++ ", " .............. ", " .+++++++...... ", " .............. ", " "}; tora-2.1.3/src/icons/refresh.xpm0000644000175000017500000000060511270353517016343 0ustar michaelmichael/* XPM */ static const char* const refresh_xpm[] = { "16 14 3 1", " c None", ". c #7F7F7F", "+ c #000000", " ..+++. ", " .+++++++ ", " .++. .+ ", " ++. ", " +++ + ", "+++++++ +++ ", " +++++ +++++ ", " +++ +++++++", " + +++ ", " .++ ", " +. .++. ", " +++++++. ", " .+++.. ", " "}; tora-2.1.3/src/icons/toworksheet.xpm0000644000175000017500000000066111270353517017265 0ustar michaelmichael/* XPM */ static const char* const toworksheet_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #FFFFFF", " ...... ", " ..++++. ", " .+.++++. ", " .++.++++. ", " .....++++. ", " .++++++++. ", " .++++++++. ", " .++++++++. ", " .++++++++. ", " .++++++++. ", " .++++++++. ", " .++++++++. ", " .++++++++. ", " .++++++++. ", " .++++++++. ", " .......... "}; tora-2.1.3/src/icons/return.xpm0000644000175000017500000000065411270353517016230 0ustar michaelmichael/* XPM */ static const char* const return_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #FFFFFF", " ", " ", " ", " ", " .... ", " .. .++. ", " .+. .++. ", " .++.....++. ", " .++++++++++. ", " .++++++++++. ", " .++........ ", " .+. ", " .. ", " ", " ", " "}; tora-2.1.3/src/icons/new.xpm0000644000175000017500000000071411270353517015477 0ustar michaelmichael/* XPM */ static const char* const new_xpm[] = { "16 14 8 1", " c None", ". c #000000", "+ c #FFFFC5", "@ c #313031", "# c #FFFF00", "$ c #312C31", "% c #C5C200", "& c #FFFFFF", " ", " ", " .+ ", " .+ @#$.+ ", " .#%#%# ", " .%+++%$ ", " .+##+&+##+ ", " .%+++%. ", " .#%#%# ", " .+ .#..+ ", " .+ ", " ", " ", " "}; tora-2.1.3/src/icons/kill.xpm0000644000175000017500000000074611270353517015646 0ustar michaelmichael/* XPM */ static const char* const kill_xpm[] = { "16 16 7 1", " c None", ". c #000000", "+ c #7F7F7F", "@ c #FF0000", "# c #FFFF00", "$ c #000055", "% c #000082", " .++++++ ", " . ..@@@@@+ ", "+++++++..@@@@@..", "#######..@@@@@+ ", "+++++++.@@@@@@..", " .. ..+@@@@@+ ", " .... ++++++ ", " .. ", " $$ ", " %%%%%% ", " % %% % ", " % %% % ", " % %% % ", " % % % % ", " % % %% ", " %% "}; tora-2.1.3/src/icons/breakpoint.xpm0000644000175000017500000000033511270353517017043 0ustar michaelmichael/* XPM */ static const char* const breakpoint_xpm[] = { "8 8 4 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #FF0000", " .... ", " .++++. ", ".++@@++.", ".+@@@@+.", ".+@@@@+.", ".++@@++.", " .++++. ", " .... "}; tora-2.1.3/src/icons/copyuser.xpm0000644000175000017500000000067511270353517016565 0ustar michaelmichael/* XPM */ static const char* const copyuser_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #545454", "@ c #00FF00", " ... ... ", " .+++. .+++. ", " .+++. .+++. ", " .+++. .+++. ", " .......... ", " ..+.@@@@@@@... ", ".+++.........++.", ".++++++.+++++++.", ".+++.........++.", ".+++.@@@@@@@.++.", " .++.........+. ", " .++.++..++.++. ", " .++.++..++.++. ", " .++.++..++.++. ", " .++.++..++.++. ", " .. .. .. .. "}; tora-2.1.3/src/icons/droptablespace.xpm0000644000175000017500000000100311270353517017666 0ustar michaelmichael/* XPM */ static const char* const droptablespace_xpm[] = { /* columns rows colors chars-per-pixel */ "16 16 5 1", " c black", ". c gray50", "X c red", "o c gray100", "O c None", /* pixels */ "OOOOO XX XX", "OOOO .... XXXXXX", "OOO ...... XXXX ", "OOO ... XXXX ", "OOO o . XXXXXX", "OO . XX XX", "O ...... .. ", " ........ o ", " ...... ooooo ", " o o oooo ", " oooooooo o ", " oooooo ooooo ", " o o oooo O", " oooooooo OO", "O oooooo OOOOOOO", "OO OOOOOOOO" }; tora-2.1.3/src/icons/wordwrap.xpm0000644000175000017500000001306311270353517016554 0ustar michaelmichael/* XPM */ static const char* const wordwrap_xpm[] = { "42 42 120 2", " c None", ". c #000000", "+ c #020202", "@ c #949496", "# c #B0B0B2", "$ c #0B0B0B", "% c #9F9FA1", "& c #757577", "* c #161616", "= c #EDEDF0", "- c #181818", "; c #707072", "> c #3B3B3C", ", c #575758", "' c #EEEEF1", ") c #39393A", "! c #070707", "~ c #DBDBDE", "{ c #9A9A9B", "] c #010101", "^ c #090909", "/ c #E0E0E2", "( c #A2A2A4", "_ c #DAB6B9", ": c #141414", "< c #ABABAD", "[ c #717173", "} c #020000", "| c #921515", "1 c #E44748", "2 c #111111", "3 c #7D7D7F", "4 c #3C3C3D", "5 c #363636", "6 c #8F0000", "7 c #E00000", "8 c #E22F30", "9 c #474748", "0 c #B5B5B7", "a c #050505", "b c #D7D7DA", "c c #6B0000", "d c #E22728", "e c #080808", "f c #121212", "g c #232323", "h c #9D9D9F", "i c #860000", "j c #E11E1E", "k c #B9B9BC", "l c #535354", "m c #262626", "n c #6C6C6D", "o c #E11516", "p c #8A8A8B", "q c #909092", "r c #313132", "s c #890000", "t c #E00202", "u c #565657", "v c #CDCDCF", "w c #030303", "x c #D3D3D6", "y c #9C0000", "z c #111112", "A c #1E1E1F", "B c #1C1C1D", "C c #99999B", "D c #A70B0B", "E c #C7C7C9", "F c #5A5A5B", "G c #686869", "H c #BB1F1F", "I c #959597", "J c #979799", "K c #2C2C2D", "L c #CF3333", "M c #060606", "N c #646466", "O c #CECED1", "P c #E14445", "Q c #969697", "R c #414142", "S c #D5D5D7", "T c #616162", "U c #0A0A0A", "V c #646465", "W c #838385", "X c #E33A3B", "Y c #A0A0A2", "Z c #282828", "` c #C5C5C8", " . c #E22425", ".. c #0F0F0F", "+. c #5B5B5C", "@. c #D9D9DC", "#. c #3F3F40", "$. c #1C1C1C", "%. c #E11818", "&. c #2A2A2B", "*. c #131313", "=. c #040404", "-. c #5D5D5E", ";. c #E00A0A", ">. c #676768", ",. c #A5A5A7", "'. c #DDDDDF", "). c #161617", "!. c #DEDEE0", "~. c #131314", "{. c #787879", "]. c #6F6F70", "^. c #BABABD", "/. c #0C0C0D", "(. c #EAEAED", "_. c #1D1D1D", ":. c #1D1D1E", "<. c #202021", "[. c #E2E2E5", "}. c #626263", " ", " ", " . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . ", " . . . . . + . . . . . . . @ . . . . . . # ", " $ . . . . . % . . . . . . . & . . . . . * = ", " - . . . . . ; . . . . . . . . > . . . . . , ' ", " . . . . . ) . . . . . . . . ! ~ . . . . . . { ' ", " ] . . . . ^ / . . . . . . . . . ( . . . . . ] _ ' ", " : . . . . . < . . . . . . . . . [ . . . . } | 1 ", " 2 . . . . . 3 . . . . . 4 . . . . 5 . . . } 6 7 8 ", " . . . . . 9 . . . . . 0 ] . . . a b . . . . c 7 7 d ", " e . . . . f . . . . * = g . . . . h . . . . i 7 7 j ", " - . . . . . k . . . . . l ' m . . . . n . . . . i 7 7 o ", " . . . . . p . . . . . q ' . . . . r . . . . s 7 7 t ", " . . . . . u . . . . . v ' ] . . . w x . . . . . y 7 7 7 ", " z . . . . A . . . . B ' 2 . . . . C . . . . . D 7 7 7 ", " : . . . . . E . . . . . F ' $ . . . . G . . . . . H 7 7 7 ", " . . . . . I . . . . . J ' . . . . K . . . . . L 7 7 7 ", " M . . . . N . . . . . x ' + . . . + O . . . . . e P 7 7 7 ", " - . . . . K . . . . g ' z . . . . Q . . . . . R 1 7 7 7 ", " . . . . w S . . . . . T ' U . . . . V . . . . . W X 7 7 7 ", " . . . . . Y . . . . . h ' . . . . Z n . . . . . ` .7 7 7 ", " ... . . . +.. . . . ] @.' w . . . ] #.. . . . $.= %.7 7 7 ", " * . . . . a . . . . &.' *.. . . . =.. . . . -.' ;.7 7 7 ", " . . . . . . . . . >.' ^ . . . . . . . . . % ' 7 7 7 7 ", " =.. . . . . . . . ,.' . . . . . . . . =.'.' 7 7 7 7 ", " ).. . . . . . . w !.' =.. . . . . . . 5 ' 7 7 7 7 ", " . . . . . . . r ' ~.. . . . . . . {.' 7 7 7 7 ", " . . . . . . . ].' . . . . . . . ^.' 7 7 7 ", " /.. . . . . . < ' . . . . . . f (. 7 7 7 ", " _.:.:.:.:.:.<.[.' *.:.:.:.:.:.}.' 7 7 7 ", " ' ' ' ' ' ' ' ' ' ' ' ' ' ' 7 7 7 ", " ' ' ' ' ' ' ' 7 ' ' ' ' ' ' ' 7 7 7 ", " 7 7 7 7 7 ", " 7 7 7 7 7 7 ", " 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 ", " 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 ", " 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 ", " 7 7 7 7 ", " 7 7 7 ", " 7 7 7 "}; tora-2.1.3/src/icons/filter.xpm0000644000175000017500000000067311270353517016177 0ustar michaelmichael/* XPM */ static const char* const filter_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #7F7F7F", " . ", " .. ", " .+. ", "........++. ", " @@@@@.++@. ", " @@@@.++@+. ", " @@@@.+@........", " @@@@.@+@@@@@@@ ", " @@@@.++@@@@@@@ ", " @@@@.+@........", " @@@@.@++@. ", " @@@@.++@. ", "......+@. ", " .@. ", " .. ", " . "}; tora-2.1.3/src/icons/index.xpm0000644000175000017500000000063311270353517016015 0ustar michaelmichael/* XPM */ static const char* const index_xpm[] = { "16 16 2 1", " c white", ". c black", " ", " ", " ......... ", " . . . ", " ......... ", " . . . . ", " .. . . . ", " ............ ", " .. . . . ", " . . . . ", " ......... ", " . . . ", " . . . ", " ......... ", " ", " "}; tora-2.1.3/src/icons/minus.xpm0000644000175000017500000000065311270353517016043 0ustar michaelmichael/* XPM */ static const char* const minus_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #FF0000", " ", " ", " ", " .........", " .+++++++.", " .........", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; tora-2.1.3/src/icons/single.xpm0000644000175000017500000000063511270353517016171 0ustar michaelmichael/* XPM */ static const char* const single_xpm[] = { "16 16 2 1", " c None", ". c #000000", " ", " ", " ... ", " .... ", " ..... ", " ..... ", " .... ", " .... ", " .... ", " .... ", " .... ", " .... ", " ...... ", " ...... ", " ", " "}; tora-2.1.3/src/icons/grid.xpm0000644000175000017500000000065211270353517015634 0ustar michaelmichael/* XPM */ static const char* const grid_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #FFFFFF", " ", " ", " .+.+.+.+.+.+. ", " .++++++++++++ ", " .+++.+++.+++. ", " .++++++++++++ ", " .+.+.+.+.+.+. ", " .++++++++++++ ", " .+++.+++.+++. ", " .++++++++++++ ", " .+.+.+.+.+.+. ", " .++++++++++++ ", " .+++.+++.+++. ", " .++++++++++++ ", " ............. ", " "}; tora-2.1.3/src/icons/scansource.xpm0000644000175000017500000000071611270353517017055 0ustar michaelmichael/* XPM */ static const char* const scansource_xpm[] = { "16 16 5 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #5F5FFF", "# c #000093", " ...... ", " ..++++. ", " .+.++++. ", " .++.++++. ", " .......++. ", " .++.@@@.+. ", " .+.@@@@@.. ", " .+.@@@@@.. ", " .+.#@@@@.. ", " .++.#@@.+. ", " .+++...... ", " .++++++... ", " .+++++++... ", " .++++++++.. ", " .++++++++. ", " .......... "}; tora-2.1.3/src/icons/database.xpm0000644000175000017500000000101011270353517016440 0ustar michaelmichael/* XPM */ static const char* const database_xpm[] = { "16 16 9 1", " c None", ". c #000000", "+ c #7F7F7F", "@ c #DFDFDF", "# c #1F1F1F", "$ c #3F3F3F", "% c #5F5F5F", "& c #9F9F9F", "* c #BFBFBF", " ", " ", " ", " ...... ", " .++++++. ", " .++++++++. ", " ..++++++.. ", " ........@. ", " ..#$%+&*@. ", " ..#$%+&*@. ", " ..#$%+&*@. ", " ..#$%+&*@. ", " .#$%+&*. ", " ...... ", " ", " "}; tora-2.1.3/src/icons/totemplate.xpm0000644000175000017500000000066011270353517017064 0ustar michaelmichael/* XPM */ static const char* const totemplate_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #FFFFFF", " .. ", " .......+. ", " .++++++++.", " .+.....+. ", ".......+... .. ", "++++++...+. ", "+....+++++. ", "++++++++++. ", "+...+...++. ", "++++++++++. ", "+......+++. ", "++++++++++. ", "+.....++++. ", "++++++++++. ", "+..+.....+. ", "++++++++++. "}; tora-2.1.3/src/icons/paste.xpm0000644000175000017500000000076611270353517016031 0ustar michaelmichael/* XPM */ static const char* const paste_xpm[] = { "16 16 8 1", " c None", ". c #000000", "+ c #FFFF00", "@ c #848284", "# c #C6C3C6", "$ c #848200", "% c #000084", "& c #FFFFFF", " ..... ", " ..+++++.. ", " ...+...+... ", " .@.#####.@. ", " .$.#####.$. ", " .@.......@. ", " .$@$@$@$@$. ", " .@$@%%%%%%% ", " .$@$%&&&&%&% ", " .@$@%&%%&%&&% ", " .$@$%&&&&%%%% ", " .@$@%&%%&&&&% ", " .$@$%&&&&&&&% ", " ...%&%%%%%&% ", " %&&&&&&&% ", " %%%%%%%%% "}; tora-2.1.3/src/icons/addrollback.xpm0000644000175000017500000000070011270353517017143 0ustar michaelmichael/* XPM */ static const char* const addrollback_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #00FF00", "@ c #FFFFFF", " ... ", " . .+. ", " ..@. ..+. ", " .@@@....+....", " .@@.@.+++++++.", " .@. .....+....", " ... .+.@. ", " . .+.. ", " .@. ... ", " .@@@. ... ", " .@. . .@. ", " .@@.. .@.@@. ", " .@@@.@@@@. ", " ... .@.. ", " . ", " "}; tora-2.1.3/src/icons/chart.xpm0000644000175000017500000000065311270353517016011 0ustar michaelmichael/* XPM */ static const char* const chart_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #FFFFFF", " ", " ", " .+.+.+.+.+.+. ", " .++++++++++++ ", " .+++.+++.+++. ", " .++++++++++++ ", " .+.+.+.+.+.+. ", " .++++++++++++ ", " .+++.+++.+++. ", " .++++++++++++ ", " .+.+.+.+.+.+. ", " .++++++++++++ ", " .+++.+++.+++. ", " .++++++++++++ ", " ............. ", " "}; tora-2.1.3/src/icons/cut.xpm0000644000175000017500000000067011270353517015502 0ustar michaelmichael/* XPM */ static const char* const cut_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #000055", "@ c #000082", " . . ", " . . ", " . . ", " .. . ", " . . ", " .... ", " .. ", " .. ", " ++ ", " @@@@@@ ", " @ @@ @ ", " @ @@ @ ", " @ @@ @ ", " @ @ @ @ ", " @ @ @@ ", " @@ "}; tora-2.1.3/src/icons/procedure.png0000644000175000017500000000112311270353517016651 0ustar michaelmichaelPNG  IHDR $sBIT|d pHYs pOtEXtSoftwarewww.inkscape.org<IDAT(=kQ;s7qcEEQcҨ@BˤP a%vh `a"`B413wcDEӝ{\%"lE)L'cD2me`x[Osav#R׍X*N I$=b=_B'މMYɇ0Vm`ZB^Դα™هu+ 8׻hsyɍhn`ρE6[~6*Pz |kL״:J*U64tf:C#VRlw6"NM `/ V9&ͽ?\l{LH0VXwNumS=7ne/zDRz̅N"ɁK8+20);}+aH:j|||G'j@ IENDB`tora-2.1.3/src/icons/changeconnect.xpm0000644000175000017500000000067011270353517017506 0ustar michaelmichael/* XPM */ static const char* const changeconnect_xpm[] = { "16 14 6 1", " c None", ". c #000000", "+ c #7F7F7F", "@ c #FF0000", "# c #FFFF00", "$ c #FFFFFF", " . ", " + .+ ", " +@@+ . ", " +@@@@ .+ ", " +@@@@@@+ ", " +@@@@@@+ ", " +@@@@@+. ", " +@@@@+. ", " +#++++....... ", " +#++...$$$$$$$.", "+#++ .$$$$$. ", " ++ .$$$. ", " + .$. ", " . "}; tora-2.1.3/src/icons/rollback.xpm0000644000175000017500000000114311270353517016474 0ustar michaelmichael/* XPM */ static const char* const rollback_xpm[] = { "16 16 15 1", " c None", ". c #000000", "+ c #F1F1F1", "@ c #DADADA", "# c #D6D6D6", "$ c #C7C7C7", "% c #7F7F7F", "& c #D5D5D5", "* c #C5C5C5", "= c #1F1F1F", "- c #3F3F3F", "; c #5F5F5F", "> c #9F9F9F", ", c #BFBFBF", "' c #DFDFDF", " ..... ", " ..++++@.. ", " .. ..++++++++#.", " .+.++++.....+$.", " .++++.. .+.", " .+++...... .+.", " .++++.%%%%. .+.", " ......%%%%%.+&.", " ..%%%%%%.++*.", " ........@++. ", " ..=-;%>,... ", " ..=-;%>,'. ", " ..=-;%>,'. ", " ..=-;%>,'. ", " .=-;%>,. ", " ...... "}; tora-2.1.3/src/icons/svg/0000755000175000017500000000000011445450571014757 5ustar michaelmichaeltora-2.1.3/src/icons/svg/package.svg0000644000175000017500000001721311270353516017074 0ustar michaelmichael Cubo giallo unsorted Open Clip Art Library Architetto Francesco Rollandin Architetto Francesco Rollandin image/svg+xml en tora-2.1.3/src/icons/svg/param.svg0000644000175000017500000001341711270353516016603 0ustar michaelmichael image/svg+xml tora-2.1.3/src/icons/svg/procedure.svg0000644000175000017500000002267211270353516017476 0ustar michaelmichael image/svg+xml tora-2.1.3/src/icons/svg/type.svg0000644000175000017500000016635111270353516016472 0ustar michaelmichael image/svg+xml tora-2.1.3/src/icons/svg/procedure-invalid.svg0000644000175000017500000004305411270353516021117 0ustar michaelmichael image/svg+xml tora-2.1.3/src/icons/svg/function.svg0000644000175000017500000003325111270353516017326 0ustar michaelmichael image/svg+xml tora-2.1.3/src/icons/svg/package-invalid.svg0000644000175000017500000034500611270353516020524 0ustar michaelmichael Cubo giallo unsorted Open Clip Art Library Architetto Francesco Rollandin Architetto Francesco Rollandin image/svg+xml en tora-2.1.3/src/icons/svg/function-invalid.svg0000644000175000017500000005547011270353516020761 0ustar michaelmichael image/svg+xml tora-2.1.3/src/icons/svg/type-invalid.svg0000644000175000017500000020642711270353516020115 0ustar michaelmichael image/svg+xml tora-2.1.3/src/icons/tocurrent.xpm0000644000175000017500000000067611270353517016742 0ustar michaelmichael/* XPM */ static const char* const tocurrent_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #545454", "@ c #FFFFFF", " ... ", " ..+++.. ", " .@.+++.@. ", " .@@.+++.@@. ", " .@@@@.+.@@@@. ", " .@@..+++..@@. ", ".@@.+++++++.@@. ", ".@@.+++++++.@@. ", ".@@.+++++++.@@. ", ".@@.+++++++.@@. ", ".@@@.++.++.@@@. ", " .@@.++.++.@@. ", " .@@.++.++.@@. ", " .@.++.++.@. ", " ..++.++.. ", " ..... "}; tora-2.1.3/src/icons/changewatch.xpm0000644000175000017500000000273311270353517017165 0ustar michaelmichael/* XPM */ static const char* const changewatch_xpm[] = { "16 16 74 1", " c None", ". c #000000", "+ c #8E8E8E", "@ c #FFFFFF", "# c #262626", "$ c #828282", "% c #D2D2D2", "& c #D7D7D7", "* c #A2A2A2", "= c #393939", "- c #8C8C8C", "; c #FAFAFA", "> c #FCFCFC", ", c #BABABA", "' c #EBEBEB", ") c #646464", "! c #E8E8E8", "~ c #FDFDFD", "{ c #FBFBFB", "] c #F9F9F9", "^ c #F1F1F1", "/ c #EEEEEE", "( c #3B3939", "_ c #EFEFEF", ": c #F6F6F6", "< c #F4F4F4", "[ c #F3F3F3", "} c #E7E7E7", "| c #E5E5E5", "1 c #676767", "2 c #424040", "3 c #E6E6E6", "4 c #848484", "5 c #696969", "6 c #E4E4E4", "7 c #EAEAEA", "8 c #4D4D4D", "9 c #CECECE", "0 c #E0E0E0", "a c #DEDEDE", "b c #C2C2C2", "c c #252525", "d c #101010", "e c #CCCCCC", "f c #565656", "g c #070707", "h c #9B9B9B", "i c #D9D9D9", "j c #D4D4D4", "k c #4F4F4F", "l c #494646", "m c #535353", "n c #A9A9A9", "o c #B1B1B1", "p c #DDDDDD", "q c #100F0F", "r c #2E2E2E", "s c #ADADAD", "t c #9A9A9A", "u c #D3D3D3", "v c #A4A4A4", "w c #0E0E0E", "x c #232323", "y c #201F1F", "z c #4A4A4A", "A c #494949", "B c #434343", "C c #141313", "D c #5C5A5A", "E c #464444", "F c #494747", "G c #525050", "H c #3D3B3B", "I c #4C4949", " .. ", " .++.", " .@.+.", " .... ..@@@. ", " #$%&*= #.@@@.= ", ".-;@@>,..@@@.').", ".!~{;]^.@@@./')(", "._:<[^.@@@.!}|12", ".34567..@.890a)2", ".bcde....fghijkl", " mnop..qrstu9vw ", " .x88=y dzABCD ", " EFG HFI ", " ", " ", " "}; tora-2.1.3/src/icons/forward.xpm0000644000175000017500000000112311270353517016345 0ustar michaelmichael/* XPM */ static const char* const forward_xpm[] = { "16 16 14 1", " c None", ". c #383838", "+ c #A6A6A6", "@ c #000000", "# c #BFBFBF", "$ c #404040", "% c #FFFFFF", "& c #808080", "* c #F7F7F7", "= c #EEEEEE", "- c #6F6F6F", "; c #DEDEDE", "> c #E6E6E6", ", c #777777", " ", " ", " ..+ +@@@. ", " @#$.+ @%%&@ ", " @%*#$.+ @%=-@ ", " @%;>*#$.+@%=-@ ", " @%;;;>*#$@%=-@ ", " @%;;;;;>*@%=-@ ", " @%;;;;;+.@%=-@ ", " @%;;;+.@@@%=-@ ", " @%;+.@@.+@%=-@ ", " @#.@@.+ @%=-@ ", " @@@.+ @&,.@ ", " ..+ +@@@. ", " ", " "}; tora-2.1.3/src/icons/search.xpm0000644000175000017500000000261311270353517016153 0ustar michaelmichael/* XPM */ static const char* const search_xpm[] = { "16 16 69 1", " c None", ". c #FFFFFF", "+ c #272727", "@ c #3F3F3F", "# c #0E0E0E", "$ c #3F3F40", "% c #020202", "& c #CED8D9", "* c #D7E5E8", "= c #C1D4D6", "- c #000000", "; c #7F8281", "> c #E3F3F4", ", c #DCF2F3", "' c #C5E9EE", ") c #A8DEE5", "! c #ADE4E8", "~ c #010101", "{ c #E3F4F3", "] c #EAFBFA", "^ c #DEF5F7", "/ c #BEEDF1", "( c #90D9DF", "_ c #6DC4CC", ": c #BAECEF", "< c #101010", "[ c #B6D9DD", "} c #D5F2F4", "| c #D0F1F5", "1 c #AFE9F0", "2 c #8FDFE8", "3 c #71C6CE", "4 c #79CAD4", "5 c #B9DBE0", "6 c #0B0B0B", "7 c #D7E5E6", "8 c #C3EAEC", "9 c #B0EAEF", "0 c #95E1EA", "a c #76D7E3", "b c #60C1CD", "c c #85CCD2", "d c #CDECF0", "e c #090909", "f c #A8D1D5", "g c #ADDDE2", "h c #8BD7E0", "i c #8ADBE5", "j c #78D8E3", "k c #53C9D4", "l c #43B2BC", "m c #7CC9CD", "n c #AED6DB", "o c #76CBD5", "p c #6FC4CE", "q c #68C6D1", "r c #3EAAB3", "s c #90D5DB", "t c #7AC4CB", "u c #89C8D0", "v c #00FFFF", "w c #B9DADE", "x c #CAEAED", "y c #ADD6DA", "z c #404041", "A c #070707", "B c #00C0C0", "C c #707071", "D c #C3C3C3", " +@# ", " $%&*=-$ ", " $;>,')!;$ ", " ~{]^/(_:- ", "<[}^|123456 ", "+78/90abcde ", "6fghijklmn- ", " -/opqlr/- ", " $;/stu/;-v ", " $-wxy-zv-- ", " ~A~ B-CD- ", " -zCD- ", " -zCD- ", " -zCD-", " -zC-", " -- "}; tora-2.1.3/src/icons/sequence.xpm0000644000175000017500000000065211270353517016517 0ustar michaelmichael/* XPM */ static const char* const sequence_xpm[] = { "16 16 3 1", " c white", ". c black", "X c blue", " ", " . ", " .. XXXXXXXX ", " . X ", " . X X X ", " ... .. XXX ", " . . X ", " . ", " . .. ", " . . . ", " .... . ", " .. ", " . ", " . . ", " .. ", " "}; tora-2.1.3/src/icons/addproject.xpm0000644000175000017500000000067711270353517017035 0ustar michaelmichael/* XPM */ static const char* const addproject_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #00FF00", " ........ ", " ..++++.@. ", " .+.++++.@. ", " .++.+....@....", " .....+.@@@@@@@.", " .+++++....@....", " .++++++++.@. ", " .++++++++.@. ", " .++++++++... ", " .++++++++. ", " .++++++++. ", " .++++++++. ", " .++++++++. ", " .++++++++. ", " .++++++++. ", " .......... "}; tora-2.1.3/src/icons/online.xpm0000644000175000017500000000067311270353517016176 0ustar michaelmichael/* XPM */ static const char* const online_xpm[] = { "16 16 4 1", " c None", ". c #FFFF00", "+ c #000000", "@ c #828282", " ", " . . ", " ", " . ++++ . ", " +....+ ", " . +......+ . ", " +......+ ", " . +......+ . ", " +....+ ", " . ++++ . ", " +@@+ ", " ++++ ", " +@@+ ", " ++ ", " ", " "}; tora-2.1.3/src/icons/largelogo.xpm0000644000175000017500000021340011270353517016657 0ustar michaelmichael/* XPM */ static const char* const largelogo_xpm[] = { "341 204 65 1", " c None", ". c #0058A1", "+ c #E3B836", "@ c #768A69", "# c #A9A051", "$ c #D5B23D", "% c #346C88", "& c #0E5D9B", "* c #456E80", "= c #92955D", "- c #B9A54B", "; c #1D6594", "> c #608074", ", c #C7AB43", "' c #1F6BAC", ") c #4484BA", "! c #72A1CA", "~ c #A7BCDA", "{ c #C0D5E8", "] c #F2F5FA", "^ c #FFFFFF", "/ c #D2DAEB", "( c #81ACD0", "_ c #6A92C3", ": c #3071AF", "< c #1265A9", "[ c #5787BD", "} c #91B5D6", "| c #B9CAE2", "1 c #3575B2", "2 c #E3EAF3", "3 c #015CA3", "4 c #0161A7", "5 c #296FAE", "6 c #3D76B1", "7 c #3D7BB6", "8 c #4B7DB7", "9 c #618ABE", "0 c #678EC1", "a c #7998C6", "b c #809ECA", "c c #87A1CC", "d c #92AAD0", "e c #9EB2D4", "f c #B4C2DD", "g c #2D6B8C", "h c #C2CDE4", "i c #C8D1E6", "j c #DAE2EF", "k c #EDEFF7", "l c #F7F8FB", "m c #3D7284", "n c #FBFBFC", "o c #C7D4E4", "p c #E8C867", "q c #F7EBC8", "r c #F4DE97", "s c #68846F", "t c #1465A8", "u c #035AA2", "v c #0158A1", "w c #5E8074", "x c #176196", "y c #738B7B", "z c #4D85AA", ".......................................................................................................................................++@...........................................................................................................................................................................................................", ".......................................................................................................................................++@...........................................................................................................................................................................................................", ".......................................................................................................................................++@..@#####################################################################################################################################################################################################@..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++$#@@%%&..........%%*@=#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-@*;........................%>=,++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++$=>&..........'))))))))))...........%>-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=*........)!~{]^^^^^^^^^^^^^^/{(_:.......;>,++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++,>&.....<[}/^^^^^^^^^^^^^^^^^^^^^^^^^]|!1......%=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#*.....<_|^^^^^^^^^^^^^2{{{{{{^^^^^^^^^^^^^2}).....&@$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#%.....[|^^^^^^^^]{(_)'............))(~/^^^^^^^^2}'....&@$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++++++++++++++++++++++++,%....<(2^^^^^^2~_'........................)({^^^^^^^{)....&@++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++++++++++++++++++++++$>....<(]^^^^^2(1.........3333333333333.........<_|^^^^^^2_....;#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++++=;...<(]^^^^]}1......3334444444444444444444433......<_{^^^^^2)....*$++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++++++++++++++++++++++++++$*....!]^^^^2_<.....34444444444<<<<<<<<<<44444444433.....1~^^^^^{1...&=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++++++++++++++++++#;...)/^^^^2_.....3444444<<<''''''''''''''''''<<44444433....'~^^^^^}<...*$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++++++++++++++++++++++++@...<}^^^^2_....344444<<''''''''5555555555'5''''''''<444443....'~^^^^2)...;-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++++++++++++++++++++++$*...1/^^^](....34444<<'''''55::1111111111111111::5''''''<444433...1{^^^^}...&=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++++++++++++++,%...!^^^^|'...34444<'''''5:11111116667777776661111111:5''''<<44443...!]^^^/1...>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++++++++++++++++++++-&..<~^^^][...34444<''''5111116778888888888888888887611111:5''''<4443...<{^^^][...>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++++++++++++-&..++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++++++++++++++$&..1]^^/<..444<''511178888[[[990______aaaaaaaaaaaaaaa97:80____09[[[[8888611:'''<443.._^^^~...>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++++++$%..:]^^/<..444'''51168888[[[90_____aaaaaaaaabbbbbbbaaaa_761[_____09[[[[8887111'''<443.._^^^~...=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++++++>....']^^}..444''51178889[90__88aab0[[0bddddddeeeeeeeeeeeeeb0ddddddddccccaaaa___0[[[88811:''<443.']^^~..&,++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++-...{^^/..444''511788[[[9_0[_7_bcccc_[9_bdeeeeeeeeeeeeeeed0beeeeddddddcccbaaaa__09[[88811:''<443.[^^^[..%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++%..!^^]'.344''511788[[90__6:67bcccdddda90adeee~~~~~~~~~~~c_eeeeeeeedddddcccbaaa__09[[88811:''<44..}^^]<..=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++++++++@..']^^_.344<''11788[[90__05'518addddeeee!9_bd~~~~~~~~~~~e_d~~~~eeeeeedddddcccaaa__09[[88811:''<44.<2^^|..&$++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++$&..{^^|..44<''11688[[90__a75555:[ddeeeee~~~b__ce~ffffffffd!~f~~~~~~eeeeeddddcccaaaa_09[[888115''443.)^^^)..>++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++>..[^^]'.444'':16888[90__a_55555:8deeee~~~~~f~(_a(effffff~!dffffff~~~~eeeeedddcccbaa__09[[887115''443.}^^2...,+++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++$#@>g++++$#@>g+++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++++++,...2^^(.344''5168889[0__aa75555:1aeee~~~~fffffff(a!d~||||d!f||ffffff~~~~eeeeddddccbaaa_09[[88611''<44.<]^^(..>+++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@....++++>....+++++++++++++=%%;.+++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++++++>.._^^2..44<''11888[[0__aa_5555:5[dee~~~fffff|||||fd!!d~hf!eh|h|||fffff~~~~eeeddddccbaa__09[[8861:''443._^^]<..,++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@...%++++@...%+++++++++++++@....+++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++,..<]^^[.444'':1788[[9__aaaa7::::1ae~~~fffff||h|hhhih|}!b(!b|hhh|h|h||ffff~~~eeeedddccbaa__0[[[88115''44..2^^(..>++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@...%++++@...%+++++++++++++@....+++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++>..!^^{.344''51688[[9__aaaccca811[d~~~ffff||h|hhiiiiiii|}bdfiiiiiih||h||fff~~~~eeedddccbaa__0[[88711''<44.)^^]<..,+++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "++++++++++++++++++++++,=++++++++++++++++++++++++++++++++++++++++++++++++@...%++++@...%+++++++++++++@....+++++++,=$+++++++++++++++++++++++@..#+++++++++++++++++++++++++++++$&..2^^).44<''11888[90__aacccdddb[b~~~fff||h|hiiiiiii/////i///iiiiiiih||h|ffff~~~eeedddccaaa__9[[8861:''443.{^^(..>+++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++,>;..++++++++++++++++++++++++++++++++++++++++++++++++@...%++++@...%+++++++++++++#=###+++++>%..#+++++++++++++++++++++++@..#+++++++++++++++++++++++++++++@.._^^/.344'':1788[[0__aaba[bddeee~~ffff|h|hiiiii/////i/////i/////iiiiih|h||fff~~~eeedddccaaa_09[[88115'<44._^^2..&$++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++#....++++++++++++++++++++++++++++++++++++++++++++++++#...%++++#...%+++++++++++++++++++++++....#+++++++++++++++++++++++@..#+++++++++++++++++++++++++++++;../^^_.44<'51188[[9__aabc8:7_dee~~ffff||hiiiii///i////j////j////////iiiih|h|fff~~~eeedddccaa__0[[8861:''443.2^^_..=++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++#....++++++++++++++++++++++++++++++++++++++++++++++++#...%++++#...%+++++++++++++++++++++++....-+++++++++++++++++++++++@..#++++++++++++++++++++++++++++-..1^^2.344'':1788[90__aaca5::7)_~~fff|h|hiiii//////j/j/j/jjj/j/j///////iiiih||fff~~~eedddccbaa__9[[88115'<44.!^^{..%++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++#...%++++++++++++++++++++++++++++++++++++++++++++++++#...%++++#...%+++++++++++++++++++++++....++++++++++++++++++++++++@..#++++++++++++++++++++++++++++>..~^^(.44<''1688[[9__aacc8:::::7dfff|||hiii//////jj/jjjjjjjjjjjj/j//////iiiih|hfff~~~eedddccaaa_0[[88711''44.<]^^'..,+++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++#...%++++++++++++$####$+++++++++++++++$####$+++++++++#...%++++#...%+++++++++++++++++++++++....++++++++++++++++++++++++@..#++++++++++++++++++++++++++++&..]^^'344'':1788[9__aabca5::::1[eff|h|iiii/////jjjjjjjjjjjjjjjjjjjjhj/////iiih||fff~~eeedddccaa__9[[88115'<43.~^^}..@+++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++>%%...&%%&.++++++=;......%=+++++++++++=;......%=+++++++#...%++++#...%+++++@%...,++=@%;.++>%%....%%;.#+++++++++++++++++++@..#++++++++++$=>=+++++++++++++=..[^^{.34<''1188[[9__aacc7::::17cff||hiiii////jjjjjj222222222222jjj|9}h/////iiih|hfff~~eeeddccbaa__[[8861:''44.)^^2..%+++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++&..........++++-%..........%$+++++++-%..........*$+++++#...%++++#...%++++=....=+++>....++%..........#+++++++++++++++++++@..#+++++++,@%...@+++++++++++++>..~^^_.44<'51788[9__aabca5::::19~ffh|iii/////jjjjj2222222222222222j!))_}h~f//iiih||ff~~~eedddccaa__9[[8811''<43.2^^1..,++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++...........+++-&....;%%&....%++++++-&....;%%&....%+++++#...%++++#...%+++,&...@++++@....++%..........#+++++++++++++++++++@..#+++++++@.....@+++++++++++++;..]^^<344''1188[[9__aaccc8:::17(ff||hii////jjjjj2222222k2kkkk2k222|))))[[9[(f/iii|h|ff~~~eeddccbaa__[[88615'<43.}^^}..@++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++@@@...%####+++%...&#+++$@....@+++++%...&#+++$>....@++++#...%++++#...%++$%...>+++++@...&++=@#....####$+++++++++++++++++++@..#+++++++@.....@++++++++++++,..)^^{.34<'51688[[0_aabccdb911)9~fh|hiiii/j/jjjj222222kkkkkkkkkkk22!)))))))))[(fiiih|fff~~eedddccaa__9[[8711''44.[^^/..*++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++#...%++++++=....-++++++>...&++++=....-++++++>...&++++#...%++++#...%++>...%++++++=...%+++++....++++++++++++++++++++++++@..#+++++++@.....@++++++++++++=..(^^!.44<':1788[9__aaccdda[[bd~ff||iii////jjj22222kkkkkkkkkkkkkkk|)))))))))7))[(~ih|hff~~~eeddccaaa_0[[8811''<43.^^^<.&++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++#...%++++++*...>+++++++$....=+++*...>+++++++$....#+++#...%++++#...%+@...%$++++++#...%+++++....++++++++++++++++++++++++@..#+++++++@.....=++++++++++++>..{^^1344''1188[[0__abccdb)be~~ffh|iii///jjjjj2222kkkkkkkk]k]kkkkk!))))))))))7)7)[b~|||ff~~eedddcbaa__9[88615'<43.|^^[..-+++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++#...%++++++....=++++++++%...@+++....#++++++++%...@+++#...%++++#...%=...&,+++++++#...%+++++....++++++++++++++++++++++++@..#+++++++@.....#++++++++++++;..^^].34<'51688[[__aabcdd00e~~ff||hii////jjj2222kkkkkk]]]]]]]]]]]|[)))))))))))))77)[b~|ff~~~eeddccaa__9[[8711''44.!^^}..@+++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++#...%+++++-....$++++++++@...*++-....$++++++++>...*+++#...%++++#...;&...-++++++++#...%+++++....++++++++++++++++++++++++@..#+++++++@.....#+++++++++++$..)^^{.44<'51788[9__aaccdd_[d~fffh|iii///jjjj222kkkkkk]]]]]]]]]]]]()))))))))))))7)777)[e|ff~~eedddcbaa_0[[8811''44.)^^/..>+++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++#...%+++++#....+++++++++@...%++#....+++++++++@...%+++#...%++++#........@++++++++#...%+++++....++++++++++++++++++++++++@..#+++$###>.....#++###-+++++#..!^^(.44'':188[[0__abccddd0_b~f||hii///j/jj222kkkk]]]]]]lllllll]]{~_)[(!))))))))7)7777[~ff~~eedddcbaa_0[[88615'<43.^^^..%++++++++$=>=++,>%..>+++++++++-@>%%...%m@$++++++++#..", "+++++++++++++++++++#...%+++++#....+++++++++@...%++#....+++++++++@...%+++#...%++++#...%%....-+++++++#...%+++++....++++++++++++++++++++++++@..#+++@...............&+++++@..~^^)344''1188[[0_aabcdddedb_dfh|iii///jjj222kkkkk]]]]llllllllllll2/}(jj|_)))))))777777)eff~~eeddccaa__9[88615'<43./^^1..+++++=>%...@+=&....>+++++$=>&............>$++++++#..", "+++++++++++++++++++#...%+++++#....+++++++++@...%++#....+++++++++@...%+++#...%++++#...%,&...%+++++++#...%+++++....++++++++++++++++++++++++@..#+++@...............%+++++>..{^^'344''1688[9__aaccddeee~d0bf|hi///jjj222kkkkk]]]llllllnnnnlllll]kk]k2}))))))))777777[~f~~eedddcaaa_9[[871:''44.~^^_..-++++%.....@=......=+++++@................%$+++++#..", "+++++++++++++++++++#...%+++++#....+++++++++@...%++#....+++++++++@...%+++#...%++++#...%+=....>++++++#...%+++++....++++++++++++++++++++++++@..#+++@...............%+++++%..^^^.34<'51788[9__aaccddee~~fe!!b~e|/j/jj2222kkk]]]llllnnnnnnnnnnlll]]]]k}))))))7)7)77717[f~~eedddcbaa_0[[8811''44.(^^(..#++++>.....#&......#+++++@.................%+++++#..", "+++++++++++++++++++#...%++++++....#++++++++>...>+++....#++++++++*...@+++#...%++++#...%++*....#+++++#...%+++++....++++++++++++++++++++++++@..#+++@...............%+++++;..^^/.44<'51788[9__abccddee~~ff~e(b(c}hjjj22kkkk]]]lllnnnnnnnnnnnnnlll]]]k~)))))))))7777717bf~~eeddccaa_0[[8811''44.[^^|..@++++@.....*.......++++++@....;%@@@@%.......=++++#..", "+++++++++++++++++++#...%++++++%...>++++++++&...=+++%...>++++++++&...=+++#...%++++#...%++$&...;$++++#...%+++++....++++++++++++++++++++++++@..#+++,###>.....@#####-+++++..)^^{.44<':188[[0_aabcdddee~~ff||ihf}d(~/222kkkk]]]llnnnnnnnnnnnnnnnlll]]]})))))))7)7)77717)e~~eeddccaa__[[88615'<43)^^{..@++++@............%++++++>.;@,+++++++-%.....*++++#..", "+++++++++++++++++++#...;++++++@...&,++++++@...&$+++@...&$++++++@...&$+++#...%++++#...%+++=....*++++#...%+++++....,+++++++++++++++++++++++@..#+++++++@.....#+++++++++++..)^^}.44'':188[[0_aaccddeee~fff|hii//|~d(~/2kkk]]]llnnnnn^n^^^^n^nnnnlll]2[))))))))7)7777717_~~eeddccaa__9[88615'<43<^^2..*++++@.......;=++-=++++++=#+++++++++++,......++++#..", "+++++++++++++++++++#....=++-++$&...%,++++=&...@++++$&...%,++++=....@++++#...%++++#...%++++*....@+++#...;+++++....>++-++++++++++++++++++++@..#+++++++@.....#++++++++++-..!^^(.44''1188[[_0aaccddee~~ffh|hii////h~}}|jkk]]lllnnnnn^^^^^^^^^nnnnll]~)[))))))))!}0777171d~eeddccaa__9[[8615'<43.^^^..%++++#......%$+++++++++++++++++++++++++%.....++++#..", "+++++++++++++++++++$.....&.;+++=.....%@@%....%$+++++=.....%@@%....%+++++=...&++++#...;++++$&...&-++@....+++++%....&..$+++++++++++++++++++@..#+++++++@.....#++++++++++#..(^^(344''1188[[__aaccddee~~ff||hii//jjjji~}}|j]]llnnnn^^^^^^^^^^^nnnnll2[)))))))))_ii|(91717_~eedddcaaa_9[[8715'<43.^^^..%++++#......#++++++++++++++++++++++++++@.....#+++#..", "++++++++++++++++++++>......%++++=...........;$+++++++=...........;$+++++@....++++#....+++++=....%$+@....+++++=.......++++++++++++++++++++@..#+++++++@.....#++++++++++#..(^^_344''1688[[__aaccddee~~ffh|iii///jj222/f}}|kllnnnn^^^^^^^^^^^^nnnll})[)))))))[}///h|!171)eeedddcba__9[[871:'<43.^^^..%++++#.....&+++++++++++++++++++++++++++@.....#+++#..", "+++++++++++++++++++++>.....%+++++-*.......&@$+++++++++-*.......&@$++++++@....++++@....++++++%....@+@....++++++=&.....++++++++++++++++++++@..#+++++++@.....#++++++++++#..(^^)344''1688[9__aaccddee~~ff||iii//jjj222k2/|}{llnnn^^^^^^^^^^^^^nnnn2[[)))))))[_oj//ii~)711b~edddcbaa_9[[871:''44.{^^'.%++++#.....%+++++++++++++++++++++$#@>g;......#+++#..", "++++++++++++++++++++++$####++++++++$=@@@@#++++++++++++++$=@@@@#+++++++++$##,+++++$###-++++++$#,++++,##++++++++++####$++++++++++++++++++++@..#+++++++@.....#++++++++++#..(^^)344'51688[9__aaccddee~~ffh|ii////jj222kkkkh!/lnnn^^^^^^^^^^^^^^nnl~[))[))))[}|j///iihd771[~eeddcba__0[[871:'<44.{^^)..++++#.....>+++++++++++++++++$=>;............#+++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++@.....#++++++++++#..(^^).4<''1688[9__aaccddee~~ff||iii//jjj222kkk]]{(jlnn^^^^^^^^^^^^^n^nk[)[))))))!jjjj//iih|!711deeddcbaa_9[[871:'<44.{^^)..++++#.....@+++++++++++++++#>................#+++#..", "++++++++++++++++++++++pp+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++@.....#++++++++++#..(^^)344'51688[9__aaccddee~~ffh|ii////jj2222kk]]]!{nnn^^^^^^^^^^^^^^nn~[[)[))))[fjjj///iih|fd070edddcba__0[[871:''44.{^^'..++++#.....@+++++++++++++$>..................#+++#..", "++++++++++++++++++++q^^r+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++@.....#++++++++++#..(^^).44''1688[9__aaccddee~~ff||iii//jjj22j|{k]]/(knnnn^^^^^^^^^^^^nn2[))[))[))!jjjj///iih|ffec!edddcbaa_9[[871:'<44.{^^..%++++#.....@++++++++++++-%.........;m@=>.....#+++#..", "+++++++++++++++++++q^^qp+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++@.....#++++++++++#..(^^!344''1688[[__aaccddee~~ffh|iii///jjj2|__}/]({lnn^n^^^^^^^^^^^n^n}[)[)[)))[f2jjj///iih|fff~eedddcba__0[[871:'<43.^^^..%++++#.....@+++++++++++$%......&>=$++++@.....#+++#..", "+++++++++++++++++++q^r+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++@.....#++++++++++#..(^^(344''1188[[__aaccddee~~ff||hii//jjj2j())[!(!klnnnnn^^^^^^^^^n^n2[[))[)))[(j2jjj///ii||ff~~eedddcaaa_9[[8715'<43.^^^..%++++#.....@+++++++++++>......@$+++++++@.....#+++#..", "+++++++++++++++++++q^r+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++@.....#++++++++++,..[^^(.44''1188[[0_aaccddee~~ffh|hii///jjjf[))))[_~/lnnn^n^^^^^^^n^nn}[)[[))))[f22jj///iiih|ff~~eeddccaa__9[[8615'<43.^^^..%++++#.....@++++++++++,......=+++++++++@.....#+++#..", "++++++++++++++++++rn^qrp++rqqqr++++rrpqr+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++@.....#+++++++++++..)^^}.44'':188[[0_aabcddeee~fff|hii//j/jj~)))))))[!~/lnnnnn^^^nn^nn2[)[)))[)[!j2jjjj///ih||ff~~eeddccaa__9[88615'<43'^^{..>++++#.....@++++++++++=.....@++++++++++@.....#+++#..", "++++++++++++++++++^^^^^p+q^^^^^n++p^^n^q+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++s..#+++++++@.....#+++++++++++..1^^{.44<':188[[0__abcdddee~~ff||iii//jjj|[)))))[))[(knnnn^nnnn^nnn})[))[))))~22jjj///iihh|ff~~eeddccaa__[[88115'443)^^{..@++++#.....@++++++++++>.....-++++++++++@.....#+++#..", "++++++++++++++++++pq^qp+r^np+pn^q++^^nrp+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++@.....#+++++++++++%..^^/.44<'51788[0__abccddee~~ff|hiii///jj}[)))))))[[~klnnnnnnnnnnn2[[)[))))[_/22jjj///ii||fff~~eeddcbaa_0[[8811''<4.[^^}..@++++#.....@++++++++++%.....+++++++++++@.....#+++#..", "+++++++++++++++++++q^r++n^r+++r^n++^^p++++++++++++++++++++++++++++++++++++++++++++++++++++$#@>%++++++++++++++++++++++++++++++++++++++++++@..#+++++++@.....#+++++++++++%..2^^.34<'51788[9__aaccddee~~ff||hii//j|}[)))))[)))_jlllnnnnnnnnnl~[)[)[)[))~22jjj////iih|ff~~eedddcbaa_0[[8811''44.(^^(..#++++#.....@++++++++++%.....+++++++++++@.....#+++#..", "+++++++++++++++++++q^r++^^r+++p^^++^^p++++++++++++++++++++++++++++++++++++++++++++++++++++@....++++++++++++++++++++++++++++++++++++++++++@..#+++++++@.....=+++++++++++@..{^^1344''1688[9__aaccddeee~fff|hii//i!)))))))))[)|k]lllllnnnlll2[)[))))))_/22jjjj//iih||ff~~eeddccaa__9[[871:''44.|^^)..,++++#.....@++++++++++*.....#++++++++++@.....#+++#..", "+++++++++++++++++++q^r++^^p+++p^^++^^+++++++++++++++++++++++++++++++++++++++++++++++++++++=....++++++++++++++++++++++++++++++++++++++++++@..#+++++++@.....>+++++++++++=..(^^[344''1188[[0_aabcdddee~~ff||iii/e[7))))))))!{2]]]llllllllll}[))[))))[~22jjj////iih|fff~~eeddccaa__9[88615'<43./^^'..+++++#.....@++++++++++@.....>++++++++++>.....#+++#..", "+++++++++++++++++++q^r++^^p+++r^^++^^+++++++++++++++++++++++++++++++++++++++++++++++++++++#....++++++++++++++++++++++++++++++++++++++++++@..#+++++++#.....;$++++++++++#.._^^(.44'':188[[0__abccddee~~fff|hiih!)))))))))){kk]]]]]]llllll2))[)))[))!/2jjjj///iih||ff~~eedddcbaa__[[88615'<43.^^]..%+++++#.....@++++++++++-......=+++++++$>......#+++#..", "+++++++++++++++++++q^r++q^q+++q^q++^^p++++++++++++++++++++++++++++++++++++++++++++++++++++#....++++++++++++++++++++++++++++++++++++++++++@..#+++++++-......&>@@%*++++++..'^^{.44<'51788[9__aaccddeee~~ff||iie[7)7)))))))~k]kk]]]]]]]]]]}[)))))))[}22jjj////ii|h|ff~~eedddcbaa_0[[8811''44.)^^|..>+++++#.....%+++++++++++;......>#+++#>&.......#+++#..", "+++++++++++++++++++q^r++p^^qrn^^p++^^p++++++++++++++++++++++++++++++++++++++++++++++++++++#....++++++++++++++++++++++++++++++++++++++++++@..#++++++++;..........>++++++%..]^^.34<''1688[[__aabcdddee~~ff|hh|_)77))))))))~2kkkkk]]]]]]]j[)))[))))_/2jjj////iih|hff~~~eeddccaa__9[[871:''44.(^^(..=+++++#.....%+++++++++++=.....................=+++#..", "+++++++++++++++++++q^r+++rn^^^nr+++^^p++++++++++++++++++++++++++++++++++++++++++++++++++++#....++++++++++++++++++++++++++++++++++++++++++@..#++++++++#..........@++++++>..|^^)344''1188[[0__aaccddee~~fff||})7777)7))))_/2kkkk]kkkkkkk()))))))))~2jjj/j//iiih||ff~~eedddcbaa__[[88615'<43.{^^)..,+++++#.....%++++++++++++@..............&.....@+++#..", "+++++++++++++++++++ppp+++++ppp+++++pp+++++++++++++++++++++++++++++++++++++++++++++++++++++#....++++++++++++++++++++++++++++++++++++++++++@..#+++++++++=&........@++++++=.._^^(.44<':1788[9__aaccdddee~~ffff_77777))))))(j22kkkkkkkkkkj[))))))))0{jjjjj///iih||ff~~~eeddccaaa_0[[8811''<43.^^]..;++++++#.....%+++++++++++++@...........&@@.....@+++#..", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#...&++++++++++++++++++++++++++++++++++++++++++@..#++++++++++,@%....g>-++++++$..'^^/.34<'51688[[0_aabccddee~~~ffd)7777777)7))!j22222kkkkkkk()))))))))(/jjj////iih|hfff~~eedddccaa__9[[8711''44.[^^|..>++++++#.;%%g>++++++++++++++-*.......;@$+@..%%%=+++#..", "++++++++++++++++++++++++,####++++++++++++++++++-##++++++++,####$+++++++++++++++,###,++++++#...%+++++++++++$###-++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++%../^^'344'':188[[9__aaccdddee~~ffc)1777777))))(j22222222k2k/[))))))))[|jj/j///iii||hff~~~eeddccaaa_0[[88615'<43.~^^_..=+++++++++++++++++++++++++++++$#@@@=-++++++++++++++#..", "+++++++++++++++++++++$@;......>-++++++++=>%.>-%...++++$=*&......*-++++++++++$@;.....&>,+++$...%+++++++++=%.....&@$+++++++++++++++++++++++@..#+++++++++++++++++++++++++++@..}^^!.44<'51688[90_aabccddeee~~f~d_7777)77)7[|jjjj22222222()))))))))(/j/j///iii|h|ff~~~eedddccaa__9[[8811''<43.]^^<..$++++++++++++++++++++++++++++++++++++++++++++++++++#..", "++++++++++++++++++++=&..........@+++++++%...>;...%++++@..........&-++++++++-;.........m++++...%+++++++$*.........&-++++++++++++++++++++++@..#+++++++++++++++++++++++++++,..1^^/.34<''1188[[0__aaccdddee~~~ff~[71777777}//jjjjjj2222i)))))))))[|/////iiii||hfff~~eeeddccaaa_0[[8861:''44.[^^|..*+++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++=.....%%%.....@++++++%...&....>++++@....%%&....;+++++++-&..........@++++...%+++++++%....m@>&...&,+++++++++++++++++++++@..#++++++++++++++++++++++++++++%../^^'.44'':1788[90_aaaccdddee~~fff0717777)0|/j/jjjjjjjjjb)))))))))b/j////iiihh|fff~~~eedddcbaa__9[[88115'<43.~^^_..=+++++++++++++++++++++++++++++++++++++++++++++++++++#..", "++++++++++++++++++,&...%,+++,%....-+++++@........=++++@;@-++++@....#+++++$&....>-++,@&@++++...%++++++@...%,+++$%...>+++++++++++++++++++++@..#++++++++++++++++++++++++++++@..!^^}.44<''1188[[9__aabccddeee~~~fd))79_[!~////j/jjjjjji))))))7)7[|////iiii|||fff~~~eedddccaaa_0[[8861:''44.<^^]<..$+++++++++++++++++++++++++++++++++++++++++++++++++++#..", "++++++++++++++++++>...;$+++++$%...>+++++@....%-+$+++++$++++++++%...=+++++@....=++++++,,++++...%+++++,...&$+++++$&...,++++++++++++++++++++@..#++++++++++++++++++++++++++++,..<^^].344'':1788[[0__aaccdddeee~~~fdc(ff~|ii////////j/j!)7)7)7)))bi//iiiih|h|fff~~~eedddccbaa__9[[88115'<43.(^^~..>++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "++++++++++++++++++&...=+++++++=....+++++@....,+++++++++++++++++*...@+++++&...>+++++++++++++...%+++++@...@+++++++>...=++++++++++++++++++++@..#+++++++++++++++++++++++++++++*..~^^_.44<''1188[[9__aabccdddee~~~ffff|||iiiii////////|)))7)7777)f/iiiiih||hfff~~~eedddccbaa__0[[8861:''443.2^^1..#++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++#....+++++++++....#++++@...%+++++++++++++$=@m%&...@++++#....,+++++++++++++...%+++++%...-+++++++=...>++++++++++++++++++++@..#+++++++++++++++++++++++++++++#..1^^2.344'':1688[[0__aabccdddeee~~ffffh||hiiiiii/////!777777)77(hiiiih||h|fff~~~eeedddccaaa_0[[[88115'<44._^^{..;+++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++@...%+++++++++%...@++++@...%++++++++++$@%.........@++++@...%++++++++++++++...%+++++....%%%%%%%%;...%++++++++++++++++++++@..#++++++++++++++++++++++++++++++;..{^^_.44<''11888[[0__aacccdddeee~~~fff|h||hiiiiiiiif)777)7777)eiiih||h|ffff~~~eeedddccaaa__9[[8811:''44..2^^)..=+++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++@...%+++++++++%...@++++@...%+++++++++=&...........@++++>...>++++++++++++++...%+++++................%++++++++++++++++++++@..#++++++++++++++++++++++++++++++=..)^^2.344''51188[[9___aacccdddeee~~~ffff|h||hhiiiii!777777777_|hh||h|ffff~~~~eeedddccaaa__9[[88711''<43._^^{..&$+++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++@...%+++++++++%...@++++@...%++++++++=.....;>=#@...@++++%...@++++++++++++++...;+++++................%++++++++++++++++++++@..#+++++++++++++++++++++++++++++++;..{^^_.344'':1788[[9__aaacccdddeee~~~~ffff|h||||hh~7777777777}|||h|fffff~~~eeeddddccbaa__0[[[88115'<44..2^^)..@++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++@...%+++++++++%...@++++@...%+++++++$&...%#++++@...@++++%...@++++++++++++++....+++++....############,++++++++++++++++++++@..#+++++++++++++++++++++++++++++++=..)^^2<.44<''11888[[0__aaacccdddeeee~~~ffffffh|h||_717171717_f|h|fffff~~~~eeeddddccbaa__09[[8861:''443.(^^{..&$++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++@...%+++++++++%...@++++@...%+++++++@...;$+++++@...@++++>...%+++++++++++++#....+++++....,++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++;..|^^(.344''511888[[0__aaacccdddeeee~~~~fffffff|~6717171717dfffffff~~~~eeeeddddccbaa___9[[88611''<44.<]^^)..@+++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++=...&+++++++++&...#++++@...%+++++++>...@++++++@...@++++@...&+++++++++++++#....+++++;...=++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++=..']^^'.444'':16888[[0_0aaacccddddeeee~~~~~fffff07171717170~ffff~~~~~~eeeddddcccaaa__09[[887115'<44..|^^~..;$+++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++$....=+++++++-....$++++@...%+++++++%...@++++++@...@++++,....=++++++++++++#....+++++>...%++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++++++++%..(^^{..44<'':1688[[[0__aaabcccddddeeee~~~~~~~e1171717177d~f~~~~~~~eeeeddddcccaaa___9[[887115''443.)^^]'..=++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "++++++++++++++++++%...%+++++++*...%+++++@...%+++++++>...%++++++@...@+++++%...&-+++++++@+++#....+++++#....=++++++++$>+++++++++++++++++++++@..#+++++++++++++++++++++++++++++++++#.../^^!.344<''11688[[[0_0aaabcccddddeeeeee~~~~[1111111119e~~~~~~eeeeeddddcccbaaa__09[[88811:''443.<2^^!..%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "++++++++++++++++++#....>$++++>....#+++++@...%+++++++=....=+++$@....@+++++#....&=++++=%.+++#....++++++%....@$+++++=;.+++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++>..1^^^1.344'''116888[[0___aaaccccdddddeeeeeed1111111117(~~~eeeeeeedddddcccbaaa__09[[88811:''<44..|^^{...-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++>....&m@@;....>++++++@...%+++++++$&....;%%&.....@++++++>......%%&..;+++#....++++++,&....&%@>%...%+++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++$&..(^^/<.444'''11688[[[9___aaabccccddddddeee[:::::::::[deeeeeeeddddddcccbaaaa__09[[88811:''<44.._^^]'..@++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "++++++++++++++++++++>...........>+++++++@...%++++++++=.............@+++++++>..........%+++#....+++++++-;...........%+++++++++++++++++++++@..#+++++++++++++++++++++++++++++++++++=.../^^~..444''5116888[[90___aaabccccddddddb1::::::::1_eeeeddddddddcccbaaaa__09[[[88811:''<443.1]^^_..%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++=%.......;=++++++++@...;+++++++++#;......>>...%++++++++#%.......%#+++#....-+++++++$@&........>-+++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++++>..']^^!..444'''116888[[90___aaaabcccccddd8:::::::::7bdddddddddccccbaaaa___09[[[88711:''<443.<2^^~...-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++,=@@@=-++++++++++,###-+++++++++++=@@@=$+,##$+++++++++++,=@@@=,+++++$##,++++++++++++-@@@@@#$+++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++++$%..[^^^[..444'''116888[[[9____aaaabbcccca5555:::::10ddddddccccccbaaaaa___9[[[888711:''<443.&...!^^]1..444''':118888[[[00___aaaaabbc75555555557acccccccccbaaaaaa___09[[[8886115''<443..~^^]'..*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++++++++++=......~^^]:..444''':117888[[[99_____aaaa0555555555:[cccccbbaaaaaaa___009[[[88881115''<443..~^^]1..%$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++++++-........|^^]1..444<''51168888[[[[00____aa7''''5'5556_aaaaaaaaaaa_____09[[[[888711:'''<443..~^^^_..&-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++++++++$&..............58[[[3+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++%..:[ceh/2ln^^^n]2/hec[<..(]^^^2_<....33444444<<<''''''''''''''''<<<4444443.....){^^^^{1...&#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++++$>.79d~h22nn^^^n]2/hdb['...'~^^^^]('.....3344444444<44<<<<<4<44444444443......[{^^^^2_....*$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++++-%-@[0dfh2knn^^nnk2i|d_[&.....'~^^^^^|[.......33444444444444444444433.......'(2^^^^](<...;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++$&.1--adfh22lnnnnl2jh~d[7........'~^^^^^]~[..........33333333333..........'!/^^^^^2(<...&@$++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++++%.'[0f+dfhj2]nnn]22h|da['..........'(]^^^^^^{().......................'_~2^^^^^^{_.....>,++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++++>.3619af+ehi222k222ihed[8......#=;.....[|^^^^^^^^/|(_)1.........<))(}{]^^^^^^^2}'.....>,++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++++=.38[ad}|oprfi2222/i|~d_[<.....@+++=%.....<_~]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^/}1.....&>,++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++++-&.7[_d}f|h/pphhhhhh|ed_[5.....>++++++->&......1!|2^^^^^^^^^^^^^^^^^^^^^^{}[<......%=$++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++$;.'670[!!!((|r$|h|f~dd_[:.....%$+++++++++=>&.......<)_(|{{]^^^^^^2{{}([1........;>,+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++++%.<[[bd~||{{{{of$eddda[[:.....&,+++++++++++++=>%..............................*@,++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++++>.<8[c}}||{{{{{~~h+e0[[8<......#+++++++++++++++++$=@%&....................%>@#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++++=..:6)0_!!(((((!!_[a,=853......=++++++++++++++++++++++++##@@>%%%%%%%*@@=#,+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++++-&.6[0d}~|h{{{{|~~c!_6e=&......>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++$;.5[0(d~||{{{{|~~(a_76;%#&....=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++++%.<66[0_!((((((!!0)[:5'..>$@%@,++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++++>.&8[bd}||{{{{{~~}!a[713.%$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++++=.38[ad}||{{{{{f~eba976&.&-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#+++++++++++++++++-&.'67[0!!(((((!!![[755<..=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++$;.5[[d}~||{{{{{~~daa77'..@++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@..#++++++++++++++++*.<[[cd~||{{{{{~~d!a87:..*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++++@.316)0_!!(((((!!_[87553.%$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#++++++++++++++=.37[_d}||{{{{{|~~ba976<.&-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++++-&.7[0d}f||{{{{|~~ba_77<..=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#++++++++++++$%.5[9(d~||{{{{|~~(a_77'..>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#++++++++++++*.&66[0_!!(((((!!0)[:5'..%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++++@.38[ad}||{{{{{f~e!a[713.;$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#++++++++++=..56800!!(((((!!_[[755&.&-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++++-&.<67_[!(!(((((!![[)55<..=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#++++++++$%.'[[dd~||{{{{{~~daa775..>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#++++++++*.<[[(d~||{{{{{~~d!a87:..%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++++@.366[00!!(((((!!_[8655..;$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#++++++=.37[_d}||h{{{{|~~ba976<.&-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++++-&.'6700!!((((((!![)855<..=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#++++$%.<610[!!!(((((_![[[55'..>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#++++>.<[[cde||{{{{{~~}aa87:..%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+++@.&8[b}}||{{{{{f~ea![713.;$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#++#..:6)00!!(((((!!!)[7553..-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#+,&.:[9d(f||{{{{|~~ca_77'..=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#$%.5[[dd~||{{{{|~~d!a77'..>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..#>.366[__!!(((((!!_)[:5'..%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..*.38[!d}||{{{{{f~e!a[763.&$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@....8[_d}||{{{{{|~~ba977&..-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@...'6700!!(((((!!_[[)55<..=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..'[[(d~||{{{{{~~daa875..>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..7[dd~||{{{{{~~d!a87:..%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..5[[_!!(((((!!_)[655..&$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..[d}||{{{{{|~~bb077<..-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@.._df||{{{{|~~ca_77<..=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "....................................................................................................................................t..++@..)!!!(((((!![)[:5<..>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..!||{{{{{~~}aa871..%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", "..........................................................uv...........................................................................++@..(|{{{{{f~}ba[763.&$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..[(((((!_![[7553..#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..}{{{{|~~ca_87'..@+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#..", ".......................................................................................................................................++@..)____[[)77''<..;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>>@@@@@@@@@@@@@@@@@@@########################################################################################@..", ".......................................................................................................................................++@...........................................................................................................................................................................................................", ".......................................................................................................................................++wx..........................................................................................................................................................................................................", ".......................................................................................................................................++yz)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))'''))))6%%%%%%%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"}; tora-2.1.3/src/icons/saverecord.xpm0000644000175000017500000000067711270353517017053 0ustar michaelmichael/* XPM */ static const char* const saverecord_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #00FF00", "@ c #FFFFFF", " ..", " .+.", " .++.", "............++. ", "@@@@.+.@@@.++. ", "..@..++.@.++. ", "@@@@@.++.++. ", ".@...@.+++. ", "@@@@@@@.+.. ", "@.@..@.@.@. ", "@@@@@@@@@@. ", "...@.@..@.. ", "@@@@@@@@@@. ", "...@.@@..@. ", "@@@@@@@@@@. ", "@...@.@.... "}; tora-2.1.3/src/icons/eraselog.xpm0000644000175000017500000000067511270353517016515 0ustar michaelmichael/* XPM */ static const char* const eraselog_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #8E8E8E", " ..", " ....", " .+.. ", "...........+++. ", ".++++++++.+++. ", ".+....++.+++. ", ".++++++.+++. ", ".+..++.+++. ", ".++++.@.+. ", ".+..+.@@.. ", ".+++++..+. ", ".+...++++. ", ".++++++++. ", ".+.....++. ", ".++++++++. ", ".......... "}; tora-2.1.3/src/icons/addindex.xpm0000644000175000017500000000065611270353517016473 0ustar michaelmichael/* XPM */ static const char* const addindex_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #00FF00", " ... ", " .+. ", " .+. ", " ....+....", " .+++++++.", " ....+....", " .+. ", " .+. ", " ... ", " ", " ", " ", " ", " ", " ", " "}; tora-2.1.3/src/icons/modtable.xpm0000644000175000017500000000067511270353517016503 0ustar michaelmichael/* XPM */ static const char* const modtable_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #4C4C4C", "@ c #FFFFFF", " .. ", " .++. ", " .++.+.", "...........+.++.", ".@@@.@@@..++++. ", ".........+++.. ", ".@@@.@.++++.. ", ".@@@..+..+.@. ", "......+..+... ", ".@@@.@.++.@@. ", ".@@@.@@..@@@. ", "............. ", ".@@@.@@@.@@@. ", ".@@@.@@@.@@@. ", "............. ", " "}; tora-2.1.3/src/icons/tosgatrace.xpm0000644000175000017500000000066011270353517017042 0ustar michaelmichael/* XPM */ static const char* const tosgatrace_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #5E5E5E", " ", " ", " ", " .. ", " .++.. .. ", " .+.++. .++.. ", " .++++.. .+.++.", " .+++. .++++..", " ... .+++. ", " ... ", " .. ", " .++.. ", " .+.++. ", " .++++.. ", " .+++. ", " ... "}; tora-2.1.3/src/icons/backgroundlabel.gif0000644000175000017500000000673611270353517020000 0ustar michaelmichaelGIF89aFeiimmquuy y } })})11191999AAJJJRRZZbbbbjjsss{{̓̓͋Ջ͋ՋՔՔ՜՜ޜ՜ޤޤެެ޴޴޴! NETSCAPE2.0!Created with GIMP! ," 7)E7& +$(C*<82! #% %%# /92"+!,+%* > !07!.$4 3 -9# „ +' 890AV! g 1"'9 , A#Aj0( `?A<<σXx$,y {CM-p8` A`9``A.lz r ƆF (rD IE8 (`!ƃ N  l#À+!hE2h`ā!5H y(b!l$M *` | @T! ," (7+$%E7&  #% "<82!2 >C* /9%* 3%#,+$44+!7!..+9; !07#2'B -9 89%C℅Paa"7EBq #(gj0?&T1vZ8h A8QbhC6bxP J BtCD+X$Sucg6|D 4] @ b&P .^P͠a%b<A+AWQFhPA9@>0Ժ Ҋ PpǹVR`@ *! ," (%)+$ " #% >7& * 3E<8294;*7)+##2 33 2*4;B&!4+2'E7229%$..2%;*  3"$%% ;B") #2*+92# +.. !%72!# %E<877''"(*< +X1A,Xh0'?<0C<b@>@@h(i\ FH\(>  ^xNJ-r(L .IC'x   "">3;BB  99';; $%2*42%.)+ 4 .+7 (< %!%$$A##'( &907&  HㆉXȠO/(#@UV τAbp&G "!xo@ X" Dl#ߠ8l: {#!vy֠h! ',)'ЈAh!F(Q+TB O%r8PbH20` RYv  C8@!NE9p! ,#%">3;';;.   92.  ++%%+% !$2*4 ..< "( #('( "")) #& +7%$$A21 2+!r8@ T|DpŃp2f .V!2+4 @ȅ YqPq@PB9: uc5 cŃ z  f;aqJ#@]-Z *@ :Р4a0\+28sz A &ygX+P`@.L64BsY1S-HA㏈.rppi ! ,B# >;';. %" 392%+%!(   "( . *+.<+  %244 (' <$###&+, A7BB7n<ăDH1a@$#^$Bd94 65H%OA@cB\-xC /V IƠ& *£ pH)H8PaM?!n H B(ҷ"j`8 D-, g%   U#ƃ+J؄) 87.c8Dxa(K# IP"G . p )h<A5G̖P3;tora-2.1.3/src/icons/filesave.xpm0000644000175000017500000000057111270353517016505 0ustar michaelmichael/* XPM */ static const char* const filesave_xpm[] = { "14 14 4 1", " c None", ". c #040404", "+ c #808304", "@ c #BFC2BF", "..............", ".+.@@@@@@@@.@.", ".+.@@@@@@@@...", ".+.@@@@@@@@.+.", ".+.@@@@@@@@.+.", ".+.@@@@@@@@.+.", ".+.@@@@@@@@.+.", ".++........++.", ".++++++++++++.", ".++.........+.", ".++......@@.+.", ".++......@@.+.", ".++......@@.+.", " ............."}; tora-2.1.3/src/icons/deindent.xpm0000644000175000017500000000067511270353517016506 0ustar michaelmichael/* XPM */ static const char* const deindent_xpm[] = { "16 16 4 1", " c None", ". c #FFFFFF", "+ c #000000", "@ c #00FF00", " ", " .++++++++++++. ", " .............. ", " .......+++.... ", " .............. ", " ..++...++++++. ", " .+@+++........ ", " +@@@@+.++++... ", " .+@+++........ ", " ..++...+++.... ", " .............. ", " .......+++++++ ", " .............. ", " .+++++++...... ", " .............. ", " "}; tora-2.1.3/src/icons/duplicaterecord.xpm0000644000175000017500000000070411270353517020056 0ustar michaelmichael/* XPM */ static const char* const duplicaterecord_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #00FF00", "@ c #FFFFFF", " .........", " .+++++++.", " .........", "........... ", "@@@@@@@@@@. ", "..@.@.@.........", "@@@@@@@.+++++++.", ".@...@..........", "@@@@@@@@@@. ", "@.@..@.@.@. ", "@@@@@@@@@@. ", "...@.@..@.. ", "@@@@@@@@@@. ", "...@.@@..@. ", "@@@@@@@@@@. ", "@...@.@.... "}; tora-2.1.3/src/icons/insertsaved.xpm0000644000175000017500000000103311270353517017230 0ustar michaelmichael/* XPM */ static const char* const insertsaved_xpm[] = { "16 16 10 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #005500", "# c #000D00", "$ c #002800", "% c #008F00", "& c #00EE00", "* c #007F00", "= c #004C00", " ", " ", " ...... ", " .++++. ", " .++++. . ", " .++++. ... ", " .++++. ... ", " ...... .. ", " . ", " ... ", " ..@#$.. ", " .%&*. ", " .=. ", " . ", " ", " "}; tora-2.1.3/src/icons/returnfrom.xpm0000644000175000017500000000103211270353517017103 0ustar michaelmichael/* XPM */ static const char* const returnfrom_xpm[] = { "16 16 10 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #005500", "# c #000D00", "$ c #002800", "% c #008F00", "& c #00EE00", "* c #007F00", "= c #004C00", " ", " ", " ...... ", " .++++. ", " .++++. . ", " .++++. ... ", " .++++. ... ", " ...... .. ", " . ", " ... ", " ..@#$.. ", " .%&*. ", " .=. ", " . ", " ", " "}; tora-2.1.3/src/icons/sql.xpm0000644000175000017500000000117411270353517015506 0ustar michaelmichael/* XPM */ static const char* const sql_xpm[] = { "16 16 17 1", " c None", ". c #000000", "+ c #5D5DFB", "@ c #5F5FFF", "# c #3F3FAB", "$ c #2B2B74", "% c #4242B2", "& c #5E5EFE", "* c #21215B", "= c #4C4CCE", "- c #5C5CF7", "; c #313185", "> c #1A1A47", ", c #303081", "' c #5959F0", ") c #242463", "! c #2D2D7B", " ", " ... ... .. ", ". . . . . ", ".. . . . ", " . ..... . ", " . .+@#. . ", ". ..$%&*=.. . ", " .. .-;>,@..... ", " .@@')!. ", " .@@@. ", " ..... ", " ... ", " ... ", " .. ", " ", " "}; tora-2.1.3/src/icons/param.png0000644000175000017500000000061511270353517015766 0ustar michaelmichaelPNG  IHDR ObsBIT|d pHYs/tEXtSoftwarewww.inkscape.org< IDAT(u!KDQ](b /j-"Xl~A^1EX}A1YT48p8?03WDPOkY==I==L_udӸ6N)J(e#5Qjd q A)s8ʷ"!GvX'J˟Tng1q~ol^ oXڨ pqfyfXHW^2̌߫ޣ)M7[z㍠4zp?®k73ha jIENDB`tora-2.1.3/src/icons/enablebreak.xpm0000644000175000017500000000114611270353517017141 0ustar michaelmichael/* XPM */ static const char* const enablebreak_xpm[] = { "16 16 15 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #00FF00", "# c #FF0000", "$ c #FF0303", "% c #FF8484", "& c #FF0707", "* c #FFC9C9", "= c #FF1111", "- c #FF1F1F", "; c #FF2828", "> c #FF0F0F", ", c #FF1313", "' c #FF9999", " ......... ", " .+++++++.@. ", " .++#####.@@@. ", " .++#####.@@@@@.", ".++######...@...", ".+#########.@.+.", ".+$+++++%+%.@.+.", ".+&*#=+-+;+...+.", ".+>#*=+-+;+...+.", ".+#++,+='+%.@.+.", ".+#########.@.+.", ".++######...@...", " .++#####.@@@@@.", " .++#####.@@@. ", " .+++++++.@. ", " ......... "}; tora-2.1.3/src/icons/function.png0000644000175000017500000000126511270353517016515 0ustar michaelmichaelPNG  IHDR $sBIT|d pHYs]tEXtSoftwarewww.inkscape.org<2IDAT(e=hSaܛ (* ("]:(ZN1.DpA! "蔺9RCEHbHM{~C]=qxfYzcߌoLtU+\}^櫉!_ `u{7)9#Y;F8XwhF M<&NF'SFwad]=gm7*ʒ5KFSZEin։#]CG18x9cߪp@\bW$clXBUzJ8Z(UR0 `^siIENDB`tora-2.1.3/src/icons/compilewarning.xpm0000644000175000017500000000254711270353517017732 0ustar michaelmichael/* XPM */ static const char * const compilewarning_xpm[] = { "16 16 66 1", " c None", ". c #929253", "+ c #767611", "@ c #B7B79F", "# c #FDFDAA", "$ c #EFEF12", "% c #888800", "& c #B5B59D", "* c #FDFDDB", "= c #F7F758", "- c #969600", "; c #B3B39A", "> c #FCFCDB", ", c #F7F763", "' c #989804", ") c #B0B096", "! c #FDFDDD", "~ c #F8F865", "{ c #909004", "] c #ADAD7F", "^ c #FDFDB7", "/ c #FFFF32", "( c #F9F904", "_ c #D8D800", ": c #D5D500", "< c #CFCF00", "[ c #D2D264", "} c #D5D51C", "| c #E6E617", "1 c #FFFF2C", "2 c #FFFF1B", "3 c #FAFA00", "4 c #ADAD00", "5 c #56561D", "6 c #D4D4C0", "7 c #FFFFC7", "8 c #FBFB37", "9 c #B2B200", "0 c #D7D7C5", "a c #FFFFDF", "b c #F9EF7A", "c c #A98006", "d c #D6D6C1", "e c #FFFFDE", "f c #FFFF87", "g c #E8BF05", "h c #AF3C00", "i c #A70B00", "j c #A30600", "k c #A70000", "l c #C7C793", "m c #F1F187", "n c #F1F14E", "o c #F7F70D", "p c #D89001", "q c #AC0F00", "r c #949463", "s c #D88F2A", "t c #A80B00", "u c #7D7D51", "v c #F7F7A2", "w c #B78D07", "x c #D1D19E", "y c #BEBE14", "z c #979775", "A c #BFBF4B", " ", " .+ ", " @#$% ", " &*=- ", " ;>,' ", " )!~{ ", " ]^/(_::< ", " [}:|1234 ", " 56789 ", " 0abc ", " defghijk ", " lmnopqkkk ", " rstkkk ", " uvwkkkk ", " xy ", " zA "}; tora-2.1.3/src/icons/down.xpm0000644000175000017500000000104311270353517015651 0ustar michaelmichael/* XPM */ static const char* const down_xpm[] = { "16 16 11 1", " c None", ". c #383838", "+ c #000000", "@ c #404040", "# c #777777", "$ c #6F6F6F", "% c #A6A6A6", "& c #F7F7F7", "* c #DEDEDE", "= c #BFBFBF", "- c #E6E6E6", " ", " ", " .++++++++++. ", " .@#$$$$$$.+. ", " %@&******.+% ", " .=-****%+. ", " %@&****.+% ", " .=-**%+. ", " %@&**.+% ", " .=-%+. ", " %@&.+% ", " .=+. ", " %@+% ", " .. ", " ", " "}; tora-2.1.3/src/icons/addwatch.xpm0000644000175000017500000000312011270353517016457 0ustar michaelmichael/* XPM */ static const char* const addwatch_xpm[] = { "16 16 82 1", " c None", ". c #000000", "+ c #00FF00", "@ c #262626", "# c #828282", "$ c #D2D2D2", "% c #D7D7D7", "& c #A2A2A2", "* c #393939", "= c #8C8C8C", "- c #FAFAFA", "; c #FFFFFF", "> c #FCFCFC", ", c #BABABA", "' c #E8E8E8", ") c #FDFDFD", "! c #FBFBFB", "~ c #F9F9F9", "{ c #F1F1F1", "] c #333333", "^ c #ABABAB", "/ c #F3F3F3", "( c #EBEBEB", "_ c #646464", ": c #3B3939", "< c #EFEFEF", "[ c #F6F6F6", "} c #F4F4F4", "| c #F0F0F0", "1 c #363636", "2 c #B0B0B0", "3 c #E5E5E5", "4 c #676767", "5 c #424040", "6 c #E6E6E6", "7 c #848484", "8 c #696969", "9 c #E4E4E4", "0 c #EAEAEA", "a c #343434", "b c #A9A9A9", "c c #A7A7A7", "d c #DEDEDE", "e c #C2C2C2", "f c #252525", "g c #101010", "h c #CCCCCC", "i c #E3E3E3", "j c #D3D3D3", "k c #282828", "l c #565656", "m c #070707", "n c #9B9B9B", "o c #D9D9D9", "p c #D4D4D4", "q c #4F4F4F", "r c #494646", "s c #535353", "t c #B1B1B1", "u c #DDDDDD", "v c #D0D0D0", "w c #818181", "x c #100F0F", "y c #2E2E2E", "z c #ADADAD", "A c #9A9A9A", "B c #CECECE", "C c #A4A4A4", "D c #0E0E0E", "E c #232323", "F c #4D4D4D", "G c #201F1F", "H c #4A4A4A", "I c #494949", "J c #434343", "K c #141313", "L c #5C5A5A", "M c #464444", "N c #494747", "O c #525050", "P c #3D3B3B", "Q c #4C4949", " ... ", " .+. ", " .+. ", " .... ....+....", " @#$%&*.+++++++.", ".=-;;>,....+....", ".')!-~{]^/.+.(_:", ".<[}/{|12(.+.345", ".67890'abc...d_5", ".efghijk=lmnopqr", " sbtuvwxyzAjBCD ", " .EFF*G gHIJKL ", " MNO PNQ ", " ", " ", " "}; tora-2.1.3/src/icons/tosqledit.xpm0000644000175000017500000000105011270353517016710 0ustar michaelmichael/* XPM */ static const char* const tosqledit_xpm[] = { "16 16 11 1", " c None", ". c #000000", "+ c #8E8E8E", "@ c #FFFFFF", "# c #7F7F7F", "$ c #1F1F1F", "% c #3F3F3F", "& c #5F5F5F", "* c #BFBFBF", "= c #DFDFDF", "- c #9F9F9F", " .. ", " .++.", " .@.+.", " .@@@. ", " .@@@. ", " .......@@@. ", " .#####.@@@. ", ".#####.@@@. ", "..####..@. ", ".......... ", "..$%&..*=. ", "..$%&#-*=. ", "..$%&#-*=. ", "..$%&#-*=. ", " .$%&#-*. ", " ...... "}; tora-2.1.3/src/icons/rewind.xpm0000644000175000017500000000110311270353517016167 0ustar michaelmichael/* XPM */ static const char* const rewind_xpm[] = { "16 16 13 1", " c None", ". c #383838", "+ c #000000", "@ c #A6A6A6", "# c #FFFFFF", "$ c #F7F7F7", "% c #808080", "& c #EEEEEE", "* c #404040", "= c #BFBFBF", "- c #E6E6E6", "; c #DEDEDE", "> c #777777", " ", " ", " .++@ @.. ", " +#$+ @.+%+ ", " +#&+ @.*=$*+ ", " +#&+ @.*=$-;++ ", " +#&++*=$-;;;++ ", " +#&+%$-;;;;;++ ", " +#&++.@;;;;;++ ", " +#&+.++.@;;;++ ", " +#&+ @.++.@;++ ", " +#&+ @.++.++ ", " +%>+ @.+++ ", " .++@ @.. ", " ", " "}; tora-2.1.3/src/icons/logging.xpm0000644000175000017500000000067411270353517016341 0ustar michaelmichael/* XPM */ static const char* const logging_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #8E8E8E", "@ c #FFFFFF", " .. ", " .++.", " .@.+.", "...........@@@. ", ".@@@@@@@@.@@@. ", ".@.......@@@. ", ".@@@@@@.@@@. ", ".@.....@@@. ", ".@@@@@..@. ", ".@........ ", ".@@@@..@@. ", ".@...@@@@. ", ".@@@@@@@@. ", ".@@@@@@@@. ", ".@@@@@@@@. ", ".......... "}; tora-2.1.3/src/icons/totuning.xpm0000644000175000017500000000106611270353517016556 0ustar michaelmichael/* XPM */ static const char* const totuning_xpm[] = { "16 16 12 1", " c None", ". c #000000", "+ c #FFBF00", "@ c #CCCCCC", "# c #7F7F7F", "$ c #FFFFFF", "% c #1F1F1F", "& c #3F3F3F", "* c #5F5F5F", "= c #9F9F9F", "- c #DFDFDF", "; c #BFBFBF", " .. ", " .++.", " .+++.", " .+++. ", " .++. ", " ...... .@.. ", " .######.@. ", ".#####..@. ", "..###.$$.. ", ".......$.. ", "..%&*#=.-. ", "..%&*#=;-. ", "..%&*#=;-. ", "..%&*#=;-. ", " .%&*#=;. ", " ...... "}; tora-2.1.3/src/icons/toramini.xpm0000644000175000017500000000217711270353517016535 0ustar michaelmichael/* XPM */ static const char* const toramini_xpm[] = { "16 16 51 1", " c None", ". c #3077BA", "+ c #528EC6", "@ c #5A92C8", "# c #4F8BC4", "$ c #226EB5", "% c #3E80BE", "& c #BAD2E8", "* c #FFFFFF", "= c #DCE8F4", "- c #D6E4F1", "; c #5690C6", "> c #397DBD", ", c #E4EDF6", "' c #A9C6E2", ") c #D9E6F2", "! c #E3EDF6", "~ c #F5F8FC", "{ c #FCFDFE", "] c #8DB4D9", "^ c #F1F6FA", "/ c #E0EBF4", "( c #4283C0", "_ c #EAF2F8", ": c #C8DBEC", "< c #377CBC", "[ c #A5C4E1", "} c #528EC5", "| c #5992C8", "1 c #B7D0E7", "2 c #75A4D1", "3 c #4182BF", "4 c #EEF4F9", "5 c #78A7D2", "6 c #5D94C8", "7 c #BDD4E9", "8 c #90B6DA", "9 c #4F8CC4", "0 c #83AED5", "a c #ACC9E3", "b c #72A2D0", "c c #F8FAFD", "d c #4C89C3", "e c #7CA9D3", "f c #BFD5E9", "g c #CEDFEF", "h c #6097CA", "i c #6EA0CE", "j c #2C75B8", "k c #2771B7", "l c #2B74B8", " ", " .+@#$ ", " %&**=-; ", " >,')!)~{@ ", " %'~]*~!^*/$ ", " (~_:**&<[*} ", " |**{1*/;&*2 ", " ({*~345&**6 ", " .7*_8_9**4% ", " 9~**0a**b ", " ;,cdc~e ", " fgdh0i> ", " $j& ", " $$ ", "k$ ", "$l "}; tora-2.1.3/src/icons/describe.xpm0000644000175000017500000000071411270353517016466 0ustar michaelmichael/* XPM */ static const char* const describe_xpm[] = { "16 16 5 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #5F5FFF", "# c #000093", " ", " ... ", " +++.@@@. ", " +..@@@@@. ", " ++.@@@@@. ", " +.#@@@@. ", " +.#@@. ", " +...... ", " +.+ ... ", " +.+ ... ", " +.+ .. ", " ++.++ ", " ++...++ ", " +..+..+ ", " +++ +++ ", " "}; tora-2.1.3/src/icons/redo.xpm0000644000175000017500000000100411270353517015630 0ustar michaelmichael/* XPM */ static const char* const redo_xpm[] = { "16 16 9 1", " c None", ". c #5D5C84", "+ c #151584", "@ c #000084", "# c #323184", "$ c #201F84", "% c #302F84", "& c #1E1E84", "* c #848284", " ", " ", " ", " ", " .+@@@@ ", " #@@@@@@@@ @ ", " $@ @@@ @@ ", " @ @@@@@ ", " @ @@@@ ", " @ @@@@@ ", " %@ @@@@@@ ", " &@@* ", " @@ ", " ", " ", " "}; tora-2.1.3/src/icons/toinvalid.xpm0000644000175000017500000000273111270353517016700 0ustar michaelmichael/* XPM */ static const char* const toinvalid_xpm[] = { "16 16 74 1", " c None", ". c #929253", "+ c #767611", "@ c #B7B79F", "# c #FDFDAA", "$ c #EFEF12", "% c #888800", "& c #B5B59D", "* c #FDFDDB", "= c #F7F758", "- c #969600", "; c #B3B39A", "> c #FCFCDB", ", c #F7F763", "' c #989804", ") c #B0B096", "! c #FDFDDD", "~ c #F8F865", "{ c #909004", "] c #000000", "^ c #ADAD7F", "/ c #FDFDB7", "( c #FFFF32", "_ c #F9F904", ": c #D8D800", "< c #D5D500", "[ c #CFCF00", "} c #7F7F7F", "| c #D2D264", "1 c #D5D51C", "2 c #E6E617", "3 c #FFFF2C", "4 c #FFFF1B", "5 c #FAFA00", "6 c #ADAD00", "7 c #56561D", "8 c #D4D4C0", "9 c #FFFFC7", "0 c #FBFB37", "a c #B2B200", "b c #D7D7C5", "c c #FFFFDF", "d c #FFFF83", "e c #ABAB09", "f c #D6D6C1", "g c #FFFFDE", "h c #FFFF87", "i c #FFFF08", "j c #C2C200", "k c #B6B600", "l c #696901", "m c #1F1F1F", "n c #3F3F3F", "o c #5F5F5F", "p c #C7C793", "q c #F1F187", "r c #F1F14E", "s c #F7F70D", "t c #FFFF02", "u c #FDFD00", "v c #BBBB00", "w c #9F9F9F", "x c #BFBFBF", "y c #DFDFDF", "z c #949463", "A c #FEFE4C", "B c #BCBC00", "C c #7D7D51", "D c #F7F7A2", "E c #BDBD0A", "F c #D1D19E", "G c #BEBE14", "H c #979775", "I c #BFBF4B", " .+ ", " @#$% ", " &*=- ", " ;>,' ", " )!~{ ", " ]]]]^/(_:<<[ ", " ]}}}}|1<23456 ", "]}}}}}}}7890a ", "]]}}}}}}bcde ", "]]]]]]]fghijkl ", "]]mno}pqrstuv ", "]]mno}wxyzAB ", "]]mno}wxCDE ", "]]mno}wxFG ", " ]mno}wHI ", " ]]]]]] "}; tora-2.1.3/src/icons/type.png0000644000175000017500000000102011270353517015636 0ustar michaelmichaelPNG  IHDR BsBIT|d pHYs:{tEXtSoftwarewww.inkscape.org<IDATci+p-̀0țE2HCU+2\(?e$){hfa``/_dO$>~sYo"$s0ۯ~Y۷ovL/^Z(i}9Y Q'NEw<G߿~NKNN>SXX(gy'׮cdd\r앫RRR֯_SYY>|퐐ݞ۷o?qãCh@=F<IENDB`tora-2.1.3/src/icons/disbreakpoint.xpm0000644000175000017500000000034011270353517017537 0ustar michaelmichael/* XPM */ static const char* const disbreakpoint_xpm[] = { "8 8 4 1", " c None", ". c #000000", "+ c #BEBEBE", "@ c #BE0000", " .... ", " .++++. ", ".++@@++.", ".+@@@@+.", ".+@@@@+.", ".++@@++.", " .++++. ", " .... "}; tora-2.1.3/src/icons/connect.xpm0000644000175000017500000000075711270353517016346 0ustar michaelmichael/* XPM */ static const char* const connect_xpm[] = { "16 14 10 1", " c None", ". c #000000", "+ c #FFFFC5", "@ c #313031", "# c #FFFF00", "$ c #312C31", "% c #C5C200", "& c #7F7F7F", "* c #FFFFFF", "= c #FF0000", " .+ ", " .+ @#$.+ ", " .#%#%# ", " & .%+++%$ ", " &.+##+*+##+", " &===.%+++%. ", " &====.#%#%# ", " &===.+=.#..+ ", " &=====&.+ ", " &====&. ", " &#&&&&. ", " &#&&... ", "&#&& ", " && "}; tora-2.1.3/src/icons/up.xpm0000644000175000017500000000104111270353517015324 0ustar michaelmichael/* XPM */ static const char* const up_xpm[] = { "16 16 11 1", " c None", ". c #383838", "+ c #A6A6A6", "@ c #404040", "# c #000000", "$ c #BFBFBF", "% c #F7F7F7", "& c #E6E6E6", "* c #DEDEDE", "= c #777777", "- c #6F6F6F", " ", " ", " .. ", " +@#+ ", " .$#. ", " +@%.#+ ", " .$&+#. ", " +@%**.#+ ", " .$&**+#. ", " +@%****.#+ ", " .$&****+#. ", " +@%******.#+ ", " .@=------.#. ", " .##########. ", " ", " "}; tora-2.1.3/src/icons/print.xpm0000644000175000017500000000074711270353517016050 0ustar michaelmichael/* XPM */ static const char* const print_xpm[] = { "16 16 7 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #808080", "# c #808000", "$ c #C0C0C0", "% c #800000", " ", " ......... ", " .++++++++. ", " .+.....+. ", " .++++++++. ", " .+.....+.... ", " .++++++++.@.@.", " ..........@.@..", ".#$#$#$#$#$.@.@.", ".............@@.", ".#$#$#$@%%$#.@..", ".$#$#$#$#$#$....", "............... ", " ............. ", " ", " "}; tora-2.1.3/src/icons/tora.xpm0000644000175000017500000000277111270353517015660 0ustar michaelmichael/* XPM */ static const char* const tora_xpm[] = { "32 32 21 1", " c None", ". c #75A5D1", "+ c #4C89C3", "@ c #226EB5", "# c #5992C8", "$ c #3E80BE", "% c #3077BA", "& c #91B7DA", "* c #75A4D1", "= c #4B89C3", "- c #ACC9E3", "; c #FFFFFF", "> c #E3EDF6", ", c #C8DBED", "' c #D6E4F1", ") c #F1F6FA", "! c #679BCC", "~ c #BAD2E8", "{ c #83ADD5", "] c #83AED6", "^ c #9EC0DF", " ", " ", " .+@@@# ", " $@%#&&*=@@ ", " @$-;;;;;;>*@% ", " +@*;;;;;;,-;;'%@ ", " @&;;,->;;,>';;)$% ", " @!;;-%;'->~;;;;;'@ ", " #%);;-&;;;'>;;;;;;&@ ", " @{;;'@';;;;;-,;;;;)@ ", " @';;~-;;;;;>@@$~;;;!% ", " ]@;;;)~~;;;;;>#@@~;;&@ ", " ##;;;;;)-,;;;)%$~=;;,@ ", " ##;;;;;;'&;;;&@,;>;;,@ ", " !$;;;;;;{@~;)%$;;;;;-@ ", " @);;;;'@$;;^@-;;;;;{@ ", " @-;;;;-@!;;$$;;;;;;$# ", " $=;;;;;,);-@^;;;;;~@ ", " @^;;;;;;;$%);;;;)$% ", " +%';;;;;-@&;;;;;*@ ", " %%';;;;$@>;;;;*@ ", " %@&;;>#*;;;'#@ ", " ;>#@%{~'),-#@% ", " +);;]#@@@@@@% ", " @@$~~ ", " @@@% ", " @@@@ ", " @@@@ ", " %@@@ ", "@@@@ ", "@@@$ ", "@@@ "}; tora-2.1.3/src/icons/axis.xpm0000644000175000017500000000065211270353517015653 0ustar michaelmichael/* XPM */ static const char* const axis_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #FFFFFF", " ", " . .+++++++++++ ", " . .+++++++++++ ", " .+++++++++++ ", " .+++++++++++ ", " .+++++++++++ ", " .+++++++++++ ", " .+++++++++++ ", " .+++++++++++ ", " .+++++++++++ ", " .+++++++++++ ", " . .+++++++++++ ", " . ............ ", " ", " .. .. ", " "}; tora-2.1.3/src/icons/disconnect.xpm0000644000175000017500000000075411270353517017043 0ustar michaelmichael/* XPM */ static const char* const disconnect_xpm[] = { "16 16 7 1", " c None", ". c #000000", "+ c #7F7F7F", "@ c #FF0000", "# c #FFFF00", "$ c #000055", "% c #000082", " .++++++ ", " . ..@@@@@+ ", "+++++++..@@@@@..", "#######..@@@@@+ ", "+++++++.@@@@@@..", " .. ..+@@@@@+ ", " .... ++++++ ", " .. ", " $$ ", " %%%%%% ", " % %% % ", " % %% % ", " % %% % ", " % % % % ", " % % %% ", " %% "}; tora-2.1.3/src/icons/nextbug.xpm0000644000175000017500000000073211270353517016362 0ustar michaelmichael/* XPM */ static const char* const nextbug_xpm[] = { "16 16 6 1", " c None", ". c #000000", "+ c #00FF00", "@ c #474747", "# c #AA2323", "$ c #777777", " ... ", " .+. ", " .+. ", " . @. ....+....", " . .@ .+++++++.", " @. ......+....", " @..#@@#..+. ", " .@$$@..+. ", " .@$$@.... ", "....@@$$@@.... ", " .@$$$$@. ", " ..@@$$@@.. ", " .@.@@@@@@.@. ", ".@ ...... @. ", ". . ", ". . "}; tora-2.1.3/src/icons/writetablespace.xpm0000644000175000017500000000072311270353517020064 0ustar michaelmichael/* XPM */ static const char* const writetablespace_xpm[] = { "16 16 5 1", " c None", ". c #000000", "+ c #7F7F7F", "@ c #8E8E8E", "# c #FFFFFF", " ...... .. ", " .++++++..@@.", " .+++++++.#.@.", " ..+++...###. ", " .#...+.###.. ", " .......###.++.", " .+++++.###.++..", ".+++++.###....#.", "..++++..#.#####.", ".#........####..", ".####..##.....#.", "..######..#####.", ".#......#.####. ", ".########..... ", " .######. ", " ...... "}; tora-2.1.3/src/icons/modtablespace.xpm0000644000175000017500000000072111270353517017507 0ustar michaelmichael/* XPM */ static const char* const modtablespace_xpm[] = { "16 16 5 1", " c None", ". c #000000", "+ c #7F7F7F", "@ c #4C4C4C", "# c #FFFFFF", " ...... .. ", " .++++++.@@. ", " .++++++.@@.@.", " ..+++...@.@@.", " .#...+.@@@@. ", " .......@@@..+.", " .++++.@@@@.++..", ".++++.@..@....#.", "..+++.@..@.####.", ".#.....@@.####..", ".######.......#.", "..######..#####.", ".#......#.####. ", ".########..... ", " .######. ", " ...... "}; tora-2.1.3/src/icons/package-invalid.png0000644000175000017500000000152411270353517017705 0ustar michaelmichaelPNG  IHDR&N:sBIT|d pHYstEXtSoftwarewww.inkscape.org<IDAT(mOlU{of:3nP0-X jB 14!AClD^.Dib66^1{AMC=Xj,[vKvvD"/n9^27Z.N}?8o'DGPls 7SYLFn9{6mQ9մQn}8lkt~+kF\_>*ѻz">:\̜#?4MsB3t\Uo囬xK4|Ň}2T07 &~Y.^?|WXѶ -ZTlX$I$߹ Sx]dJF Me3F)EEq֚C,OΐVwR] X$ؽoFRaHE(0;vr9q^06rmg8ZK9d2lqoTzmlz=L.bjjRR Awu 4LĴV\c49Z1V#;usd֢=_=7hQoޜ1"b M dp:PwO+W&V9/k i&xh/:fwrcc O:V?hx"fjcEN{\Ɖ[YNl}:] ?}<'IENDB`tora-2.1.3/src/icons/addrecord.xpm0000644000175000017500000000067611270353517016644 0ustar michaelmichael/* XPM */ static const char* const addrecord_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #00FF00", "@ c #FFFFFF", " ... ", " .+. ", " .+. ", "...........+....", "@@@@@@@.+++++++.", "..@.@.@....+....", "@@@@@@@@@@.+. ", ".@...@..@..+. ", "@@@@@@@@@@... ", "@.@..@.@.@. ", "@@@@@@@@@@. ", "...@.@..@.. ", "@@@@@@@@@@. ", "...@.@@..@. ", "@@@@@@@@@@. ", "@...@.@.... "}; tora-2.1.3/src/icons/modindex.xpm0000644000175000017500000000073311270353517016516 0ustar michaelmichael/* XPM */ static const char* const modindex_xpm[] = { "16 16 6 1", " c None", ". c #000000", "+ c #4C4C4C", "@ c #00FF00", "# c #FFFFFF", "$ c #7F7F7F", " .. ", " .++. ", " .... .++.+.", " ..........+.++.", " .. ..@.+++. ", " .@@.+.. ", " ...... ", "......+..+. ", "####..+..+......", "$$$$. .++..###.#", "####. ...#.###.#", "$$$$. ..........", "..... .###.###.#", " .###.###.#", " ..........", " .###.###.#"}; tora-2.1.3/src/icons/readtablespace.xpm0000644000175000017500000000074111270353517017645 0ustar michaelmichael/* XPM */ static const char* const readtablespace_xpm[] = { "16 16 6 1", " c None", ". c #000000", "+ c #7F7F7F", "@ c #5F5FFF", "# c #FFFFFF", "$ c #000093", " ....... ", " .+++.@@@. ", " .+++.@@@@@. ", " ..++.@@@@@. ", " .#...$@@@@.. ", " .......$@@.++.", " .++++++........", ".++++++++.......", "..++++++..###...", ".#......#.####..", ".########.....#.", "..######..#####.", ".#......#.####. ", ".########..... ", " .######. ", " ...... "}; tora-2.1.3/src/icons/modconstraint.xpm0000644000175000017500000000074011270353517017571 0ustar michaelmichael/* XPM */ static const char* const modconstraint_xpm[] = { "16 16 6 1", " c None", ". c #000000", "+ c #3F3F3F", "@ c #7F7F7F", "# c #A5A5A5", "$ c #4C4C4C", " .+@#. .. ", " .+@#. .$$. ", ". .+@#. .$$.$.", "#. .##+@#..$.$$.", "@#.#@@#@+.$$$$. ", "+@#+@@@..$$$.. ", ".+@#+@.$$$$.. ", " .+@@.$..$.##. ", " .++.$..$.@@#. ", " ....$$.@#+@#.", " ...@@@#+@#", " .+@+@@+.+@", " .+@#++. .+", " .+@#. .", " .+@#. ", " .+@#. "}; tora-2.1.3/src/icons/schema.xpm0000644000175000017500000000071211270353517016144 0ustar michaelmichael/* XPM */ static const char* const schema_xpm[] = { "16 16 5 1", " c None", ". c #0000FF", "+ c #87CEEB", "@ c #00008B", "# c #000000", " ", " ....... ", " .+++++@ ", " .+....@ ", " .+....@ ", " .@@@@@@ ", " # ", " # ", " ######### ", " # # ", " ....... .......", " .+++++@ .+++++@", " .+....@ .+....@", " .+....@ .+....@", " .@@@@@@ .@@@@@@", " "}; tora-2.1.3/src/icons/shrink.xpm0000644000175000017500000000114111270353517016177 0ustar michaelmichael/* XPM */ static const char* const shrink_xpm[] = { "16 16 15 1", " c None", ". c #000000", "+ c #A7A7A7", "@ c #D3D3D3", "# c #AFAFAF", "$ c #B6B6B6", "% c #BDBDBD", "& c #C5C5C5", "* c #CCCCCC", "= c #DADADA", "- c #E1E1E1", "; c #E9E9E9", "> c #F0F0F0", ", c #F7F7F7", "' c #00FF00", " .+@. ", " .+@. ", " .+@. ", " ............ ", " .+#$%&*@=-;>,. ", " .............. ", " .''''''''. ", " .''''''''''. ", " .''''''''''. ", " .''''''''. ", " .............. ", " .+#$%&*@=-;>,. ", " ............ ", " .+@. ", " .+@. ", " .+@. "}; tora-2.1.3/src/icons/noclock.xpm0000644000175000017500000000321311270353517016333 0ustar michaelmichael/* XPM */ static const char* const noclock_xpm[] = { "16 16 86 1", " c None", ". c #848584", "+ c #545454", "@ c #5D5D5D", "# c #555555", "$ c #A1A1A1", "% c #8B8C8B", "& c #A3A2A3", "* c #EBECEB", "= c #DDDCDD", "- c #EFF1EF", "; c #6D6E6D", "> c #CECFCE", ", c #ADADAD", "' c #6B6D6B", ") c #303130", "! c #0D0C0D", "~ c #5A5B5A", "{ c #565656", "] c #E2E1E2", "^ c #FF9494", "/ c #FF0000", "( c #141414", "_ c #191819", ": c #DDDEDD", "< c #989898", "[ c #DBDADB", "} c #C6C6C6", "| c #F6F6F6", "1 c #AFAFAF", "2 c #313131", "3 c #E8E7E8", "4 c #9A9A9A", "5 c #C2C1C2", "6 c #DFDFDF", "7 c #727272", "8 c #323232", "9 c #868586", "0 c #383938", "a c #B5B5B5", "b c #C7C9C7", "c c #D2D2D2", "d c #868886", "e c #0E0E0E", "f c #ECEBEC", "g c #E2E2E2", "h c #9E9C9E", "i c #111111", "j c #161716", "k c #F9F9F9", "l c #F4F4F4", "m c #181818", "n c #4F514F", "o c #5C5C5C", "p c #B0B1B0", "q c #DEDEDE", "r c #716F71", "s c #454545", "t c #BCBBBC", "u c #1B1B1B", "v c #929292", "w c #212021", "x c #A4A3A4", "y c #676867", "z c #363736", "A c #B3B3B3", "B c #8C8C8C", "C c #A6A6A6", "D c #CCCBCC", "E c #808180", "F c #999999", "G c #C1C0C1", "H c #6B6B6B", "I c #1A1A1A", "J c #595759", "K c #959795", "L c #616061", "M c #1C1D1C", "N c #585958", "O c #EAEAEA", "P c #BEBEBE", "Q c #5A5C5A", "R c #232223", "S c #1F201F", "T c #535353", "U c #B3B1B3", " .+@#$ ", " %&*=-;> ", " ,')!~{] ", " ^/^////^ ", " ///^(_^/^: ", " ^///^<[^/^} ", " /^///^|1^/23 ", " 4/5^///^67/89 ", " 0/ab^///^c/d2 ", " e/^fg^///^/hi ", " j^/^kl^///^4m ", " no^/^pq^///rs ", " tuv^////^/^wx ", " yzABCDEFGs{ ", " HIJFFKLMNO ", " PQReSTU "}; tora-2.1.3/src/icons/fileopen.xpm0000644000175000017500000000062011270353517016503 0ustar michaelmichael/* XPM */ static const char* const fileopen_xpm[] = { "16 13 5 1", " c None", ". c #040404", "+ c #F3F704", "@ c #F3F7F3", "# c #808304", " ... ", " . . . ", " .. ", " ... ... ", ".+@+....... ", ".@+@+@+@+@. ", ".+@+@+@+@+. ", ".@+@+...........", ".+@+.#########. ", ".@+.#########. ", ".+.#########. ", "..#########. ", "........... "}; tora-2.1.3/src/icons/undo.xpm0000644000175000017500000000074611270353517015660 0ustar michaelmichael/* XPM */ static const char* const undo_xpm[] = { "16 16 7 1", " c None", ". c #000084", "+ c #1A1A84", "@ c #1E1E84", "# c #302F84", "$ c #201F84", "% c #323184", " ", " ", " ", " ....+ ", " . ........@ ", " .. .... .# ", " ..... . ", " .... . ", " ..... . ", " ...... .$ ", " ..% ", " +.. ", " ", " ", " ", " "}; tora-2.1.3/src/icons/type-invalid.png0000644000175000017500000000131711270353517017273 0ustar michaelmichaelPNG  IHDR k=sBIT|d pHYs:{tEXtSoftwarewww.inkscape.org<LIDAT(u]HSqƟ=尛̭B#NV4袛J^eQWMTADbDWf"h3D(8p mHIMvfnE7y~;[xKw[x- g=w Dvc)}T e|_#1:z1Z{:zn`D*8z94 ٹd+ ^՞& fu0ltq84wOT<9H&Wnq`F0,7!rr,̀ ?"ə/ 6;srAD,`fV,\РeYO+B]弼L55`f CR)MQq@utt f녢(5Ehj>cG;km4"KH #-bcc@f `e7yΗhDD$133K,~ON$ka>iIENDB`tora-2.1.3/src/icons/clock.xpm0000644000175000017500000000562011270353517016002 0ustar michaelmichael/* XPM */ static const char* const clock_xpm[] = { "16 16 145 2", " c None", ". c #848584", "+ c #545454", "@ c #5D5D5D", "# c #555555", "$ c #A1A1A1", "% c #8B8C8B", "& c #A3A2A3", "* c #EBECEB", "= c #DDDCDD", "- c #EFF1EF", "; c #6D6E6D", "> c #CECFCE", ", c #ADADAD", "' c #6B6D6B", ") c #303130", "! c #0D0C0D", "~ c #5A5B5A", "{ c #565656", "] c #E2E1E2", "^ c #B7B7B7", "/ c #383838", "( c #080808", "_ c #4C4D4C", ": c #CACBCA", "< c #E8E8E8", "[ c #777777", "} c #1B1B1B", "| c #141414", "1 c #191819", "2 c #151415", "3 c #151515", "4 c #686868", "5 c #DDDEDD", "6 c #D4D3D4", "7 c #343534", "8 c #3A393A", "9 c #949494", "0 c #AFAFAF", "a c #989898", "b c #DBDADB", "c c #9F9F9F", "d c #454545", "e c #2A2B2A", "f c #C6C6C6", "g c #3E3E3E", "h c #656565", "i c #CDCCCD", "j c #7B7A7B", "k c #CFCFCF", "l c #C9CAC9", "m c #F6F6F6", "n c #F1F2F1", "o c #797879", "p c #313131", "q c #E8E7E8", "r c #9A9A9A", "s c #242524", "t c #C2C1C2", "u c #E5E4E5", "v c #F0F0F0", "w c #F9F9F9", "x c #FBFAFB", "y c #FAFAFA", "z c #DFDFDF", "A c #727272", "B c #A9A9A9", "C c #323232", "D c #868586", "E c #383938", "F c #797979", "G c #B5B5B5", "H c #C7C9C7", "I c #838383", "J c #C8C7C8", "K c #F8F7F8", "L c #CFCECF", "M c #D2D2D2", "N c #DFE1DF", "O c #868886", "P c #0E0E0E", "Q c #A5A4A5", "R c #808080", "S c #ECEBEC", "T c #E2E2E2", "U c #909090", "V c #707070", "W c #F7F7F7", "X c #8D8C8D", "Y c #9E9C9E", "Z c #111111", "` c #161716", " . c #A0A0A0", ".. c #AAAAAA", "+. c #EEEDEE", "@. c #F4F4F4", "#. c #C0C1C0", "$. c #E7E6E7", "%. c #F8FAF8", "&. c #C5C6C5", "*. c #181818", "=. c #4F514F", "-. c #5C5C5C", ";. c #A6A6A6", ">. c #A9A8A9", ",. c #F7F8F7", "'. c #B0B1B0", "). c #DEDEDE", "!. c #BBBBBB", "~. c #E1E1E1", "{. c #BCBDBC", "]. c #B2B3B2", "^. c #716F71", "/. c #BCBBBC", "(. c #B7B8B7", "_. c #B0B2B0", ":. c #969696", "<. c #B7B9B7", "[. c #D4D6D4", "}. c #8E8F8E", "|. c #CFCDCF", "1. c #BEBEBE", "2. c #212021", "3. c #A4A3A4", "4. c #676867", "5. c #363736", "6. c #B3B3B3", "7. c #8C8C8C", "8. c #C9C8C9", "9. c #808180", "0. c #999999", "a. c #C1C0C1", "b. c #6B6B6B", "c. c #1A1A1A", "d. c #595759", "e. c #959795", "f. c #616061", "g. c #1C1D1C", "h. c #585958", "i. c #EAEAEA", "j. c #5A5C5A", "k. c #232223", "l. c #1F201F", "m. c #535353", "n. c #B3B1B3", " . + @ # $ ", " % & * = - ; > ", " , ' ) ! ~ { ] ", " ^ / ( _ : ", " < [ } | 1 2 3 4 5 ", " 6 7 8 9 0 a b c d e f ", " g h i j k l m 0 n o p q ", " r s t u v w x y z A B C D ", " E F G H I J K L F M N O p ", " P Q R S T U V 9 W w X Y Z ", " ` ...+.w @.#.$.%.x &.r *. ", " =.-.;.>.,.'.).!.~.{.].^.d ", " /.} (._.:.<.[.).}.|.1.2.3. ", " 4.5.6.7. .8.9.0.a.d { ", " b.c.d.0.0.e.f.g.h.i. ", " 1.j.k.P l.m.n. "}; tora-2.1.3/src/icons/stepover.xpm0000644000175000017500000000067511270353517016563 0ustar michaelmichael/* XPM */ static const char* const stepover_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #00FF00", "@ c #FFFFFF", " ", " ", " ", " .... . ", " .......... ", " ... ..+. ", " .. .++. ", " . ..... ", " ", " ...... ", " .@@@@. ", " .@@@@. ", " .@@@@. ", " .@@@@. ", " ...... ", " "}; tora-2.1.3/src/icons/addfile.xpm0000644000175000017500000000071311270353517016275 0ustar michaelmichael/* XPM */ static const char* const addfile_xpm[] = { "16 16 5 1", " c None", ". c #000000", "+ c #00FF00", "@ c #7F7F7F", "# c #FFFFFF", " ... ", " .+. ", " .+. ", " ......+....", " .@@.+++++++.", " .@@@....+....", " ..@@@@@.+. ", " .#......+. ", " .######... ", " ..######.. ", " .#......#. ", " .########. ", " .######. ", " ...... ", " ", " "}; tora-2.1.3/src/icons/tora.ico0000644000175000017500000000427611270353517015630 0ustar michaelmichael ( @ѥuÉLn"ȒY>w0ڷѤuÉKɬ̛gҺխ֮anpCdpO \MSoPerUtaTtcEilRneNg\AspM\rEAo=ldPluV cAUtNs\Ee1Kr0s.C2oA.mP0SP\pDseAecTr=AvC=e:Cr\:\w\biDinondc;ouCwm:se\\nwstiysns dtaoenwmds3 \2Ss\eyctsmttdie.nmeg3xs2e\;pCFv:Pa\_nwNeiOkn_\dHAoOpwSpsTl;_iCCc:Ha\EtwCiiKon=ndN oODwasHt\OaSMyECsDLtRAeISmVS3EP2=A\CTW:Hb=eHCmO:;M\CEt:Pi\AbPTcrHoo=\g\trDiaobmcr uvFm\ieLlnIetBss\\ tAaiTnbIdr vTSjee.ctjhtanironlgCosOg\MipMevAsaN\nDAeETkRI_ LDCORoGInOVtNErS=oEClR: VPECaROn=Me\Ml\A;BNCRD:NE\ORPB_rDIoCNgIrN=aUCmM: B\FEwiRil_neOdsFo\_wCPsoR\mOWmCIoENnSC SMFODiR.lSIe=Ns1I\ROCoROxAMiCMoLA ENS_DhHEaORrM_eEPd=A\CTD:HL\=LoCSr:ha\acPrlreeodxg\er;\aCam:p \pFt\iiolbrecasoc\\ltteoi\tbparrlvoc\dmBudIcNtC;\oC1m:0m\.oP2nr.Po0rg\orsgaermra vmFeFiril\leesOs\S=                                                 tora-2.1.3/src/icons/tora.icns0000644000175000017500000000646111270353517016010 0ustar michaelmichaelicns 1is32 Ll,4-9'5D"""$NUQ..ReP/L"% +O/.?1+m9 N4[XUs9[;+g[4/>5PgK:5Gtg%0*@ BJqY"K=\k0&0' #%-.-&@"#""$%a.>7330'##| ,5"" uzu}qzPnnnohblvvvX"np^tvvxtcGl}lz9}~tzwcjz-K}|gpws_T.fn怔wecpfwrmopuvupnonnopv|yiywqnncK҆mudznn ůDĹêֶ󯡴~ڻɛȌ̽3̲Шκ ˹ӣs8mk9==:=8<=il326uL"Y >"0YuK""">u"0L"uȬ0""Ȭ>0 "g0֬㺂"Y0"""ւȁ"""">g0"񺺂Y"""YYȀ0>K"YY֑""g>"0>""">""""g>>>Y>K""">0>0L0ւ"u"00ց>"u"0"YuY" Y"0ȬY"0LY"0"">"0""0""">"n nwnnnɃnwnwnnw nw҂nwɷnnnہnnɂnnҀwn҂nnnۀw҉n䷀nnnwnnnnɂnnɁnnnnwwwnnwwnnwn풤n nwɒnwnwnnҗnwnnwnnnnÀȕ õѵõу񺵍 Ⱥڀڵֵ̺ȵڵȂȃڀڵ̾յ㵈ߵյȈÂ߂赊߄úڂѵѵрȵ ȵȵȃl8mktora-2.1.3/src/icons/explainplan.xpm0000644000175000017500000000075511270353517017226 0ustar michaelmichael/* XPM */ static const char* const explainplan_xpm[] = { "16 16 7 1", " c None", ". c #000000", "+ c #5F5FFF", "@ c #0000FF", "# c #87CEEB", "$ c #000093", "% c #00008B", " ... ", " .+++. ", " @@@.+++++. ", " @##.+++++. ", " @#@.$++++. ", " @#@@.$++. ", " @%%%%..... ", " . ... ", " . ...", " ......... ..", " . . ", "@@@@@@@ @@@@@@@ ", "@#####% @#####% ", "@#@@@@% @#@@@@% ", "@#@@@@% @#@@@@% ", "@%%%%%% @%%%%%% "}; tora-2.1.3/src/icons/storageextents.xpm0000644000175000017500000000074111270353517017765 0ustar michaelmichael/* XPM */ static const char* const storageextents_xpm[] = { "16 16 6 1", " c None", ". c #000000", "+ c #5F5FFF", "@ c #000093", "# c #7F7F7F", "$ c #FFFFFF", " ", " ... ", " .+++. ", " .+++++. ", " .+++++. ", " .....@++++. ", " .#####.@++. ", ".#######..... ", "..######.. ... ", ".$......$. ... ", ".$$$$$$$$. .. ", "..$$$$$$.. ", ".$......$. ", ".$$$$$$$$. ", " .$$$$$$. ", " ...... "}; tora-2.1.3/src/icons/twirl.mng0000644000175000017500000003424011270353517016025 0ustar michaelmichaelMNG  MHDRd C&_ TERM GBACKffYbKGDff(N FRAM >m IHDR$PLTErRn"z6 nڊNjr6n2 jnjŠjjƲꊺ:Nrnޞ֊66fE‘tRNS@fUIDATxUQv0 MmS-09ʰ̙xizzrѹ$DTSw>[Ud#s՛'ېT wVLs}7+{pݢT[7STD@uٚPp((HpF5lSM "Iv# y Mr$D$-HՒML@ΆtK8LeЀ8~x4H˿gZX ,M]W*շa"S)1S J|h=yT"_϶_w/?CLI><#B/QZ`o]]"PsIENDB`FRAM IHDR$MPLTEfF*~nζrR>nƚ"z6z^ nv*ZN޾jrV&~6vnz.zf2> jbJ҂rFvR2Zjj~B:&zvjj~ΒVBbvƲ:Nr&~vn:ޞn6:f$tRNS@fIDATxU_P nlkC C l$y5( $iyқvޝ=<WRR&$p]gR c4p'F} w+3׭OPqي b&29ۅt~K'/8Y*̐[sz9Uͬ>8bw)lpYg<e(P]P9P&T24B7knc.!-BHf j(6g@@Dz(ij4//ͭ^ݒ7k>K~|=Nv.&;W $֛H.uh41V5<›X2>y}6tukW( 6MYz34Gl6IENDB` IHDR$>PLTEfF*~nζrR>n"z6z^ nvvZN޾jrV&~vnz.zf2>ޖ jJ҂rFvRZjnj~B:&zvjƒVBb޲ꊺNr&~bvn:֊&zN6:fwU+tRNS@fIDATxems@`yA& H$Т)MHEhbU(Lz>;Lע0Kn}X.ۿ%㾾팬!':|%޴;w8m(WgqaWHm*QFO!P;]2;Ҭx[zhaBs1;](DebLx5}B9X 24PW!|F)W_|5+U{i3.E8'6uΛɔbaE'^룶׭Luǃ'"h.d `S5<G[9L]ς"}WZ蚓h<#.\F Jv-V^y:^DfdQ?$*IENDB` IHDR$PPLTEfF*~nζrR>n"z6z^ nvv*ZN޾jrV&~vnz.zf2> jbJ҂rFvR2Zjnj~B&zv.jN~ΒVBbvƲ抺:Nr&~bvn:֊&z:fvtRNS@fIDATxe[W@7J0c%%Q kJTQ5Yk9笽7TmJBWz:QO诩;/YדV7;IZӐM-3>m8#ELiͶJ2AK3V䥕t}36̀VR^Z$yug1sǓ!>ԳN襽ɭ"dCn%'`N**(&N"s z6.4A*un 4n&5nK?t>d7n"z6z nvv*Z޾jrV&~6vnz.zf2>ޖ jbJ҂rFvR2Zjnj~B:&zv.jj~ΒVb:Nr&~:ޞ&zn6v6f tRNS@fIDATxeS@h a@As(!5(x(*Ǯu-4W|O@{]C{oq.ߕivtt9p<4Ӂ/zQUءPi@`PJqc(D:3(裦[yɊw@% md:8 /kpa94ݿc;sK 0m]qj3He/􏖱Hum~cc/$0k/x_< aIföTO~=KW&OǞtSS[p'7$ns؈@FW|ei:vJJÉ9*&#=f§q"=ų=~^h3Gt8Z!/*N{=bx?z=Ð#+IENDB` IHDR$JPLTEfF*~nζrR>n"z6z^ nvv*ZN޾rV&~6vnz.zf2>ޖ jbJ҂rFv2Zjnj~B:&zv.NVbvƲ抺:Nr&~bvn:ޞ&zNbn:fI^tRNS@fIDATxeWSP4&C&7* ,@^øOߞ9,[m#[Lz zC6^Y>ƘnIwZH[U՞F"R pO԰?(D݋ ^­XV3P܈% ɭyהJ/uVt"Q ӫN+q7Ɓ9UUY OOu-NuoYJ@c)W 7&R(7bsy&r23~ƵFntʔ_Vo.7ےLmԏRő` nt|#]SF}do)U͵b[l@v6ÌIENDB` IHDR$/PLTEfF*~nζrR>nƚ"z6z nvv*Z޾jV&~6vnz.zf2> jbJ҂rFv2Zjnj~B&zv.j֦޲vƲꊺ:Nr&~bv:ޞbž6vfAa14tRNS@fIDATxm}WA.&ZlRHE/?CGwn"z6^ nvv*Z޾jrV6vnz.zf2>ޖ jbJ҂rFv2ZjnjB:&zvjNjƒVbvƲꊺ:Nr&~vnޞNbn6fSOδtRNS@fIDATxeR0j"C-TZDB-"E+8v79̰ LV@K~P3e~w*-E\Ñ&+T',J\w@c$-#<+M'FV&I'gOm7$(r'; W7gtk7{ķq] :zP|U eu(e2z}9Dx4cOTM>U`{Boh+F&怠+xZ*mw OhUղlmS~/I "vB_;|[RVfo,ԺVF|Sqz,hKq&Qi"%4ڿc&';(xoIENDB` IHDR$,PLTEfF*~nζrR>nƚ"z6z^ nv*ZN޾jV&~vnz.z2> jJ҂rFvR2Zjnj~B:&z.N~ΒVBb޲抺:Nr&~bvn:6:6f涚tRNS@fIDATxegS@/!9P,@DH* 0_}ٽ`?F=t3<^~lW;^ROp[܈n4fڃ i;[nTIܕ.f*DBorشSFGuu^PLTEfF*~nζrR>nƚ"z6z^ nvv*ZN޾jrV&~vnz.zf2 jbJ҂rFvR2Zjnj~Bv.jN~ΒBv抺:r&~bvn:ފ&zNbn6vf@tRNS@fIDATxekW@'%fL ( !^"(HZ(*R.zΗ Ic߲o}T2~EJyEKs~(`+bD3ݝV@Zҿc9}T2:q`|ԞW{^'v߮< Ɣ?Au{Uv׫xZj}'(lX63ڕG $=d>?I WK+٬`0k ,ʕG4Q9—NoMSXչ vR6B$!@/Y [6z~卮vA}$3ԛl?9>;:0C WELKA<2\ҙp鲹7t^mf$ۭ?w9@`2ޮQiD;/<wIENDB` IHDR$;PLTEfF*~nζrR>n"z6z^ nv*ZN޾jrV&~6vnz.z2> jbJ҂rFv2Zjnj~B:&z.jNj~VBꊺ:Nr&~bvn:ޞҲ6vftRNS@fIDATxe{S@o%QER RY)=LK2-4SSΜ9^u߄x-n+]:o9 p꼏)$|xE,~V.wjN*. 9IENDB` IHDR$5PLTEfF*~nζrR>n"z6z^ nvv*ZN޾jrV&~6vnz.zf2> jbJ҂rvR2Znj~B&z.jNj~VBb抺Nr&~bv:֊&z:6fEtRNS@fIDATx]kW@G` i67 I AtiEX ^ rsp?<;g̼ |Y"SG+L>oՏMt_0{oX3+n2=1K_~IG}s@"zƽY7"B:ԐU:wt`Y#\Ph*+r7^T{ʡsq Wy\}s1vܼ\m}7y2C"`cIf1@M%EpH|8x])uU`#eiZP"-aMz>>nMIO4%|NK*2"_;hIENDB` IHDR$MPLTEfF*~nζrR>nƚ"z6z^ nvv*ZN޾jrV&~vnzzf2>ޖ jbJ҂rFvR2Zjnj~B:&zv.j~ΒBb޲ꊺ:Nr&~bvnޞ֊&zn6:v6f!ЪtRNS@fIDATx]kW@P64k"(1xAZ4-"mJPAKs}]NɇW PB0r:_螼7EO-VcݡtQ72ŶzSXDtSκrs՗ LZʶ!,[DgdZx4,Cgvq'ۑųgz8DBm |zPLè$I5pép>*J0K=˃ NW9\"1-y웺7<ٞpJeHXBP6Tu\s6'b>#m캡\fu2c*G?D&ZE1SNy*Fߡ/բk@V IENDB` IHDR$VPLTEfF*~nζrR>nƚ"z6z^ nvv*ZN޾jrV&~vnz.zf2>ޖ jbJ҂rFvR2Zjnj~B:&zv.jj~ΒVBbvƲNr&~bvn:ޞ֊&zN6vf BtRNS@fIDATx]kW@qͭ1ER-EiZ-b-Rj1p4ﳻ3,{ʰs*8DPx&ߎaƢ[MOmit/˚mG)4ӭ'ź$UUHgMMSF8wPStHXY8$rQŰqCT97Q;UvΓFЕaS?ZΊ&ł[f'!:+%O202\{z &e{kOoF(ʜeƢ( XO␫jk۫Egs3mOD,lakK)(6[rs&CbT;imp2.}Y>g:HXs7fõmM_ #Es_]IENDB` IHDR$DPLTEfF*~nζrR>nƚ"z6z^ nvv*ZN޾rV&~6vnz.zf2> jbJ҂rFvR2Zjnj~B:&z.jN~ΒVBbvƲꊺ:Nrbv:ޞ&zN66fjtRNS@fIDATxEQa[@ >b)D6[iWc*NĂNs|H޼'AhaK9Bo&;6iR0$Duf5f\;a%D9S[ztُN~ڊǞ- &dsvv,uiOy8tNnDgm7D! _Ш'&sb%Z$S؃@vՌL 2*4j9BIML| >Q%%lܚEe~!^5۬JTl ּ{Ёǻ#fgJb kxH/|7%$)tDP||V- TPz|ѵFӍ>n"z6z^ nvv*ZNjr&~6vnz.zf2> jbJ҂rFv2Zjj~B:&zv.jNj~Bvƞꊺ:Nr&~bvnޞ6:v6fr3'tRNS@fIDATx=QZ@HnJ0E1 !T.jijh^O$`7s* ly(BNRK6 ] n S65不z Cl m0\9|ǁ=ruNTz%tfFf|\6W=?-aEW*T[I?$nPVr[;;C9; S B~,k59OEn BbahZU5N*YtK$ %uj T96.xF!QwSQ =4rgYwckִ7> z<IENDB` IHDR$SPLTEfF*~nζrR>n"z6^ nvv*N޾jrV&~6vnz.zf2> jbJ҂rFvR2Zjnj~B&zvjNj~ΒVBbvƲ:Nr&~bn:ޞҞn6:f/d`=/=3/a!S f;X Z>z |nD li[(Z{'S\s{Tp$f<]kJ/ _UC#W*\4H>t2W;!ugݸun"z6z^ nvv*ZN޾jrV&~6vnz.zf2>ޖ jbJ҂rFvR2Zjnj~B:&z.jj~ΒBvƲ抺:Nr&~bvn:ޞ֊6v6ftRNS@fIDATx]Q[{@pM7@-AHUh@TBBBDZP"&>ٴ3֩6A|ѯ5v1JjNB3Vxxؓٴ5OT|;B>Rs2TkN($s:"lw?dZwH^ g_UXGx0@1L۹AQ#EQk`$ĴndågI*߫/d B(2k>$[v /'K>Yw{d?mNT Ii5ƃ)BNs' iISJIENDB`MEND! tora-2.1.3/src/icons/stop.xpm0000644000175000017500000000121411270353517015667 0ustar michaelmichael/* XPM */ static const char* const stop_xpm[] = { "16 16 18 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #FF0000", "# c #FF0303", "$ c #FF8484", "% c #FFC9C9", "& c #FF1C1C", "* c #FF0707", "= c #FF1111", "- c #FF1F1F", "; c #FF2828", "> c #FF4A4A", ", c #FF0F0F", "' c #FF3838", ") c #FF0202", "! c #FF1313", "~ c #FF9999", " ........ ", " .++++++++. ", " .++@@@@@@++. ", " .++@@@@@@@@++. ", ".++@@@@@@@@@@++.", ".+@@@@@@@@@@@@+.", ".+#+++++$+$+%&+.", ".+*%@=+-+;++%>+.", ".+,@%=+-+;++')+.", ".+@++!+=~+$+'@+.", ".+@@@@@@@@@@@@+.", ".++@@@@@@@@@@++.", " .++@@@@@@@@++. ", " .++@@@@@@++. ", " .++++++++. ", " ........ "}; tora-2.1.3/src/icons/totemporary.xpm0000644000175000017500000000726611270353517017304 0ustar michaelmichael/* XPM */ static const char* const totemporary_xpm[] = { "16 16 195 2", " c None", ". c #C4C4CE", "+ c #D1D1DB", "@ c #D8D8E0", "# c #C8C8D3", "$ c #B9B9C7", "% c #C8C8D6", "& c #E9E9EE", "* c #F2F1F3", "= c #C3CBE0", "- c #95AAD9", "; c #93A8D8", "> c #B0BAD7", ", c #E2E1E6", "' c #DCDCE3", ") c #A3A3B6", "! c #CACAD5", "~ c #F6F6F7", "{ c #B9C5E2", "] c #8BA7E0", "^ c #BCCCF1", "/ c #CCCCEC", "( c #BCC1E8", "_ c #C9DEF8", ": c #8AABE2", "< c #94A4CE", "[ c #DCDCE4", "} c #9F9FB3", "| c #C3C3D0", "1 c #F4F4F6", "2 c #AABADF", "3 c #99B8EB", "4 c #CDE0F6", "5 c #E6F5FD", "6 c #E9F4FC", "7 c #E1EFFA", "8 c #E0F6FF", "9 c #D7F4FF", "0 c #B2DAF8", "a c #7E98CB", "b c #D4D3DB", "c c #9292A9", "d c #E1E1E8", "e c #C5CFE6", "f c #82AAE9", "g c #C0E0F8", "h c #D8F4FF", "i c #DEF5FF", "j c #E0F5FF", "k c #D7F3FF", "l c #CEF0FF", "m c #C0E7FD", "n c #99C9F8", "o c #899BC4", "p c #B6B6C5", "q c #C6C6D3", "r c #7A9BDA", "s c #A1C6F1", "t c #C4EAFE", "u c #D3F2FF", "v c #D5F2FF", "w c #CDF0FF", "x c #C4E9FE", "y c #B6DFFC", "z c #A8D5FA", "A c #6291D7", "B c #BCBCCA", "C c #81819B", "D c #CDCDD8", "E c #E6E7EE", "F c #6492E3", "G c #A5D0F8", "H c #B5DEFB", "I c #BEE5FD", "J c #C5EBFE", "K c #B8D9E3", "L c #B3D4DF", "M c #BEE6FD", "N c #B4DEFC", "O c #A9D6FA", "P c #5597F2", "Q c #9B9EB6", "R c #9191A7", "S c #D6D6E1", "T c #D7D9E3", "U c #5585E2", "V c #8FBAF1", "W c #A7D4FA", "X c #A1CFF9", "Y c #A2D3FB", "Z c #3B4145", "` c #4A4E51", " . c #A2CDEF", ".. c #9DCCF9", "+. c #85BAF6", "@. c #5E9BEF", "#. c #3875E4", "$. c #8490B5", "%. c #8A8AA2", "&. c #D3D3DF", "*. c #D6D8E1", "=. c #5486E3", "-. c #77A9EF", ";. c #80B6F5", ">. c #8ABEF6", ",. c #98CAFA", "'. c #415059", "). c #1F2122", "!. c #6182A4", "~. c #8CC0F8", "{. c #7DB4F5", "]. c #6AA5F1", "^. c #4C85E8", "/. c #828EB1", "(. c #84849D", "_. c #C4C4D2", ":. c #E4E5EB", "<. c #6393E3", "[. c #7DB5F5", "}. c #91C3F7", "|. c #A0CFFA", "1. c #ACD8FA", "2. c #54676A", "3. c #5A6F7C", "4. c #1C2328", "5. c #7497B5", "6. c #92C5F8", "7. c #7EB4F5", "8. c #68A6F4", "9. c #8C8FA9", "0. c #82829C", "a. c #B5B5C6", "b. c #EFEFF2", "c. c #88A4D7", "d. c #8CBFF7", "e. c #A3D1FA", "f. c #B6E0FC", "g. c #5F696A", "h. c #7C919A", "i. c #ADCED5", "j. c #1F2529", "k. c #7698B6", "l. c #8FC2F8", "m. c #739CD4", "n. c #9A99AE", "o. c #6C6C8A", "p. c #D3D3DC", "q. c #C8CCDC", "r. c #92BEF0", "s. c #B1DCFB", "t. c #C6EBFE", "u. c #B9CBCF", "v. c #B7CBD3", "w. c #D6F4FF", "x. c #A8C6CE", "y. c #4D606E", "z. c #95C4F0", "A. c #828DAE", "B. c #A5A5B9", "C. c #E6E6EB", "D. c #B3BDD3", "E. c #B8DEF7", "F. c #D1F2FF", "G. c #E9F5FD", "H. c #E6F2FB", "I. c #D2F2FF", "J. c #BAE2F7", "K. c #8899B7", "L. c #9696AB", "M. c #70708D", "N. c #AAAABC", "O. c #DEDEE5", "P. c #BBC1D0", "Q. c #BFD5E2", "R. c #E9FAFF", "S. c #DBDFF4", "T. c #CACCED", "U. c #BDD2DF", "V. c #9099B1", "W. c #9898AD", "X. c #6E6E8C", "Y. c #9B9BB2", "Z. c #C4C4D0", "`. c #CBCBD6", " + c #AFB0C0", ".+ c #B0B3C3", "++ c #AEB1C1", "@+ c #9798AE", "#+ c #9D9DB1", "$+ c #9393A9", "%+ c #9494AC", "&+ c #9B9BAF", "*+ c #9999AE", "=+ c #8787A0", "-+ c #797995", " . + @ @ # $ ", " % & * = - ; > , ' ) ", " ! ~ { ] ^ / ( _ : < [ } ", " | 1 2 3 4 5 6 7 8 9 0 a b c ", " d e f g h i j i k l m n o p ", "q 1 r s t l u v u w x y z A B C ", "D E F G H I J K L M N O n P Q R ", "S T U V W X Y Z ` ...+.@.#.$.%.", "&.*.=.-.;.>.,.'.).!.~.{.].^./.(.", "_.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.", "a.b.c.d.e.f.t g.h.i.j.k.l.m.n.o.", " p.q.r.s.t.v u.v.w.x.y.z.A.%. ", " B.C.D.E.F.8 G.H.8 I.J.K.L.M. ", " N.O.P.Q.R.S.T.R.U.V.W.X. ", " Y.Z.`. +.+++@+#+$+M. ", " %+&+} *+=+-+ "}; tora-2.1.3/src/icons/trash.xpm0000644000175000017500000000067211270353517016032 0ustar michaelmichael/* XPM */ static const char* const trash_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #D6D6D6", "@ c #7F7F7F", " ", " ", " ...... ", " ..++++++.. ", " .++++..++++. ", " .++++..++++. ", " ..++++++.. ", " .@......@. ", " .@.@@.@.@. ", " .@.@@.@.@. ", " .@.@@.@.@. ", " .@.@@.@.@. ", " .@.@@.@.@. ", " .@.@@.@.@. ", " ..@@.@@. ", " ...... "}; tora-2.1.3/src/icons/function.xpm0000644000175000017500000000063611270353517016536 0ustar michaelmichael/* XPM */ static const char* const function_xpm[] = { "16 16 2 1", " c white", ". c black", " ", " ", " ", " .. . . ", " . . . ", " . . . ", " .. . . . . ", " .. . . . ", " . . . . ", " . . . . . ", " . . . ", " . . . ", " . . . ", " ", " ", " "}; tora-2.1.3/src/icons/close.xpm0000644000175000017500000000574011270353517016017 0ustar michaelmichael/* XPM */ static const char* const close_xpm[] = { "16 16 150 2", " c None", ". c #B4908D", "+ c #C5AEAA", "@ c #AB8C89", "# c #581212", "$ c #997875", "% c #C3ABA7", "& c #812222", "* c #872827", "= c #C2A39F", "- c #B28F8C", "; c #671616", "> c #5D0F0F", ", c #885A58", "' c #9C4847", ") c #942C2C", "! c #973130", "~ c #C7A4A0", "{ c #BA928F", "] c #7C2121", "^ c #731A1A", "/ c #824241", "( c #A7A395", "_ c #CECAB9", ": c #CCC7B8", "< c #C7B9A9", "[ c #A84C48", "} c #A63535", "| c #A63838", "1 c #C39C93", "2 c #BC8E87", "3 c #922C2C", "4 c #882626", "5 c #8E4640", "6 c #C8BEAF", "7 c #CCC7B6", "8 c #9D9A8E", "9 c #938D79", "0 c #E0D9BF", "a c #D9D2B8", "b c #D6C6AF", "c c #BC5955", "d c #B43D3D", "e c #B03D3C", "f c #A83737", "g c #9D3131", "h c #A5554F", "i c #D5CAB2", "j c #D9D1B8", "k c #D5CDB5", "l c #787465", "m c #989480", "n c #F2EBD0", "o c #EBE3CA", "p c #E7D6C0", "q c #C75754", "r c #BC4141", "s c #B23C3C", "t c #B35551", "u c #E7DBC3", "v c #E1DAC2", "w c #7C7769", "x c #979482", "y c #F7F0D7", "z c #EEE7CF", "A c #E3A799", "B c #D14D4D", "C c #C84747", "D c #BB4040", "E c #AE3C3C", "F c #D4AB9B", "G c #E3DCC6", "H c #7D796B", "I c #949083", "J c #FAF5DD", "K c #F0E9D3", "L c #E4A79A", "M c #DE5353", "N c #DC5252", "O c #D8746E", "P c #C8635E", "Q c #B03B3B", "R c #A33636", "S c #D1A99A", "T c #EFE9D3", "U c #E4DEC9", "V c #7E7B6E", "W c #8F8C80", "X c #FDF9E5", "Y c #F2ECD7", "Z c #DDA397", "` c #CE4B4B", " . c #D95151", ".. c #E07A74", "+. c #F1E6D1", "@. c #EEE0CC", "#. c #BC5D59", "$. c #A13333", "%. c #932E2D", "&. c #D0AE9F", "*. c #F1EBD6", "=. c #E4DECB", "-. c #807D72", ";. c #9E9A91", ">. c #E8E7D7", ",. c #E6C9B9", "'. c #BA4040", "). c #C54646", "!. c #D77671", "~. c #F3E8D5", "{. c #F4EEDB", "]. c #EFE1CF", "^. c #AE5753", "/. c #8E2929", "(. c #AF736B", "_. c #F2ECD9", ":. c #D7D2C0", "<. c #8C8981", "[. c #C5C2BB", "}. c #B3B1A6", "|. c #EEDCCD", "1. c #BA5351", "2. c #CC7771", "3. c #F4EAD9", "4. c #F6F1DF", "5. c #F0E5D4", "6. c #CDA398", "7. c #EDE0D0", "8. c #F2EDDC", "9. c #A9A596", "0. c #B6B3AE", "a. c #8D8A7F", "b. c #F5F4ED", "c. c #F9F4E4", "d. c #F8F3E3", "e. c #EFEADB", "f. c #7D7A6E", "g. c #8F8B80", "h. c #FEFDF4", "i. c #FEFBEF", "j. c #FDFBEF", "k. c #FEFCEF", "l. c #F2EFE1", "m. c #8C877A", "n. c #969389", "o. c #9C998F", "p. c #9C998E", "q. c #9B988F", "r. c #959288", "s. c #8E8A81", " . + @ # $ ", " % & * = - ; > , ", " ' ) ! ~ { ] ^ / ", "( _ : < [ } | 1 2 3 4 5 6 7 7 8 ", "9 0 a a b c d e f g h i j j k l ", "m n o o o p q r s t u o o o v w ", "x y z z z A B C D E F z z z G H ", "I J K K L M N O P Q R S K T U V ", "W X Y Z ` ...+.@.#.$.%.&.*.=.-.", ";.>.,.'.).!.~.{.{.].^./.(._.:.<.", "[.}.|.1.2.3.4.4.4.4.5.6.7.8.9.0.", " a.b.c.d.d.d.d.d.d.d.d.d.e.f. ", " g.h.i.j.j.j.j.j.j.k.l.m. ", " n.o.o.o.o.o.p.q.r.s. ", " ", " "}; tora-2.1.3/src/icons/stepinto.xpm0000644000175000017500000000067511270353517016561 0ustar michaelmichael/* XPM */ static const char* const stepinto_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #00FF00", "@ c #FFFFFF", " ", " ", " ", " .... . ", " .......... ", " ... ..+. ", ".. .++. ", ". ..... ", " ", " ...... ", " .@@@@. ", " .@@@@. ", " .@@@@. ", " .@@@@. ", " ...... ", " "}; tora-2.1.3/src/icons/function-invalid.png0000644000175000017500000000152211270353517020135 0ustar michaelmichaelPNG  IHDR $sBIT|d pHYs`tEXtSoftwarewww.inkscape.org<IDAT(E_hu?}n OSp[3ԭAIea33j9c]&HY#ÈU$sVʄ݄6ZP7iPal;wg{]xypSj.Epg&lpqiFuRFjזno5zC 6w {B߳?S !# +s殁5X\QVu ^6n~T9L4r67KUE%L hTo}|wٵ xS=JTܙdUo-_c[-1"RFђQytI}/wY 2IENDB`tora-2.1.3/src/icons/synonym.xpm0000644000175000017500000000137511270353517016426 0ustar michaelmichael/* XPM */ static const char* const synonym_xpm[] = { "16 11 32 1", " c None", ". c #FFFFFF", "+ c #E57A7A", "@ c #D42121", "# c #FBE9E9", "$ c #CE0000", "% c #F0B1B1", "& c #F4C8C8", "* c #F6D3D3", "= c #E16464", "- c #D21616", "; c #E88585", "> c #D93737", ", c #F2BCBC", "' c #EEA6A6", ") c #120000", "! c #000000", "~ c #980000", "{ c #480000", "] c #630000", "^ c #9A0B0B", "/ c #C3B122", "( c #5A0000", "_ c #D00B0B", ": c #BAB122", "< c #E8851A", "[ c #472C09", "} c #DF5959", "| c #DB430D", "1 c #6F6F15", "2 c #240000", "3 c #D72C2C", "................", "...+@........#$%", "..&$*........#=.", "..-;.........>=.", ".=$$$$,'$$$$$-..", "%$)!!!~${!!!]&..", ".=)!!!^'{!!!]&..", ".=/!!(_'$:!!]&..", ".=$<[$,.}|12+...", "..&$@...._$3....", "................"}; tora-2.1.3/src/icons/background.xpm0000644000175000017500000000071611270353517017027 0ustar michaelmichael/* XPM */ static const char* const background_xpm[] = { "16 16 5 1", " c None", ". c #000000", "+ c #666666", "@ c #A0A0A0", "# c #0FFE14", " ", " ............ ", " .++++++++++. ", " ............ ", " .@@@@@@@@@@. ", " .@@@@@@@@@@. ", " .@@@@@@@@@@. ", " .@@@@@@@@@@. ", " .@@@@@@@@@@.. ", " .@@@@@@@@@@.#. ", " .@@@@@@@@@@.##.", " ............##.", " .##. ", " .#. ", " .. ", " . "}; tora-2.1.3/src/icons/execute.xpm0000644000175000017500000000065511270353517016354 0ustar michaelmichael/* XPM */ static const char* const execute_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #0FFE14", " ", " ", " ", " . ", " .. ", " .+. ", " .++. ", " .+++. ", " .+++. ", " .++. ", " .+. ", " .. ", " . ", " ", " ", " "}; tora-2.1.3/src/icons/recall.xpm0000644000175000017500000000253611270353517016154 0ustar michaelmichael/* XPM */ static const char* const recall_xpm[] = { "16 16 66 1", " c None", ". c #929253", "+ c #767611", "@ c #B7B79F", "# c #FDFDAA", "$ c #EFEF12", "% c #888800", "& c #B5B59D", "* c #FDFDDB", "= c #F7F758", "- c #969600", "; c #B3B39A", "> c #FCFCDB", ", c #F7F763", "' c #989804", ") c #B0B096", "! c #FDFDDD", "~ c #F8F865", "{ c #909004", "] c #ADAD7F", "^ c #FDFDB7", "/ c #FFFF32", "( c #F9F904", "_ c #D8D800", ": c #D5D500", "< c #CFCF00", "[ c #D2D264", "} c #D5D51C", "| c #E6E617", "1 c #FFFF2C", "2 c #FFFF1B", "3 c #FAFA00", "4 c #ADAD00", "5 c #56561D", "6 c #D4D4C0", "7 c #FFFFC7", "8 c #FBFB37", "9 c #B2B200", "0 c #D7D7C5", "a c #FFFFDF", "b c #FFFF83", "c c #ABAB09", "d c #D6D6C1", "e c #FFFFDE", "f c #FFFF87", "g c #FFFF08", "h c #C2C200", "i c #B6B600", "j c #696901", "k c #C7C793", "l c #F1F187", "m c #F1F14E", "n c #F7F70D", "o c #FFFF02", "p c #FDFD00", "q c #BBBB00", "r c #949463", "s c #FEFE4C", "t c #BCBC00", "u c #7D7D51", "v c #F7F7A2", "w c #BDBD0A", "x c #D1D19E", "y c #BEBE14", "z c #979775", "A c #BFBF4B", " ", " .+ ", " @#$% ", " &*=- ", " ;>,' ", " )!~{ ", " ]^/(_::< ", " [}:|1234 ", " 56789 ", " 0abc ", " defghij ", " klmnopq ", " rst ", " uvw ", " xy ", " zA "}; tora-2.1.3/src/icons/copy.xpm0000644000175000017500000000072711270353517015664 0ustar michaelmichael/* XPM */ static const char* const copy_xpm[] = { "16 16 6 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #000082", "# c #3C3CFD", "$ c #8B8BFD", "...... ", ".++++.. ", ".+..+.+. ", ".++++.++. ", ".+..+.@@@@@ ", ".++++.@+++@@ ", ".+...+@+.+@#@ ", ".+++++@+++@$#@ ", ".+...+@+.+@+$#@ ", ".+++++@+++@@@@@@", ".+...+@+..+++++@", "......@++++++++@", " @+......+@", " @++++++++@", " @+......+@", " @@@@@@@@@@"}; tora-2.1.3/src/icons/modfile.xpm0000644000175000017500000000071311270353517016324 0ustar michaelmichael/* XPM */ static const char* const modfile_xpm[] = { "16 16 5 1", " c None", ". c #000000", "+ c #4C4C4C", "@ c #7F7F7F", "# c #FFFFFF", " .. ", " .++. ", " .++.+.", " ......+.++.", " .@@@@.++++. ", " .@@@..+++.. ", " ..@.++++.. ", " .#.+..+.#. ", " .#.+..+.#. ", " ..#.++.#.. ", " .#......#. ", " .########. ", " .######. ", " ...... ", " ", " "}; tora-2.1.3/src/icons/procedure-invalid.png0000644000175000017500000000143011270353517020276 0ustar michaelmichaelPNG  IHDR $sBIT|d pHYs pOtEXtSoftwarewww.inkscape.org<IDAT(m_HVw;><> k9fM|nQl.rIc]Ѵ6u]Dj% ]mf2 EYԐ ج"R[09ysί8{U^V' ЩGGB|XR0`=щBDkZO|g c #FFFFFF", ", c #FDFDFD", "' c #E8E8E8", ") c #EFEFEF", "! c #9E0000", "~ c #A90000", "{ c #C14A4A", "] c #CE6F6F", "^ c #7B0808", "/ c #AB0E0E", "( c #BF4242", "_ c #F8F8F8", ": c #D8D5D5", "< c #8D8D8D", "[ c #353535", "} c #470000", "| c #620101", "1 c #7F0000", "2 c #9C0000", "3 c #9F9F9F", "4 c #373636", "5 c #D98C8C", "6 c #A70C0C", "7 c #847373", "8 c #343434", "9 c #600101", "0 c #927575", "a c #F8F7F7", "b c #E4E4E4", "c c #313030", "d c #A42929", "e c #EDC4C4", "f c #C05959", "g c #6F0000", "h c #430000", "i c #555454", "j c #DEDEDE", "k c #BABABA", "l c #960000", "m c #DB9090", "n c #960B0B", "o c #585858", "p c #FEFEFE", "q c #D7D7D7", "r c #363535", "s c #840000", "t c #BD4242", "u c #6E0000", "v c #330000", "w c #6E0505", "x c #CF7272", "y c #A90202", "z c #4F0000", "A c #3D3D3D", "B c #D6D6D6", "C c #393939", "D c #DCA3A3", "E c #890000", "F c #3D0000", "G c #A2A2A2", "H c #423B3B", "I c #820707", "J c #BC5353", "K c #6A0000", "L c #390000", "M c #3F3F3F", "N c #FBFBFB", "O c #E5E5E5", "P c #967777", "Q c #6E0707", "R c #525151", "S c #967979", "T c #C35C5C", "U c #991414", "V c #4E0000", "W c #404040", "X c #C34E4E", "Y c #E29797", "Z c #800A0A", "` c #7D1212", " . c #545454", ".. c #BCBCBC", "+. c #F7F6F6", "@. c #630000", "#. c #280000", "$. c #590606", "%. c #7B0000", "&. c #A71212", "*. c #C76262", "=. c #ECC0C0", "-. c #C76666", ";. c #F2F2F2", ">. c #E7E7E7", ",. c #111111", "'. c #5A0000", "). c #8B0C0C", "!. c #9B2C2C", "~. c #9A9A9A", "{. c #C5C5C5", " ", " . + @ # $ ", " . . % % & * = - ; ", " ; > , ' ) ! ~ { ] @ ^ ", " / ( _ : < [ } | 1 2 , 3 4 ", " & 5 6 7 8 9 0 a b c ", " d e f g h i j _ k 4 ", " l m n h o p q r ", " s t u v w x y z ", " A , B C ^ D E F ", " A p , G H I e J K L ", " M N O P Q R S T U V ", " W , > X Y Z ` ...+.) @.#. ", " $.%.&.*.=.-.% ;.>.3 ,. ", " z '.K ).!.~.{.,.,. ", " z #.#.,.,. "}; tora-2.1.3/src/icons/addrole.xpm0000644000175000017500000000071311270353517016317 0ustar michaelmichael/* XPM */ static const char* const addrole_xpm[] = { "16 16 5 1", " c None", ". c #000000", "+ c #00FF00", "@ c #0000FF", "# c #FFFFFF", " .. ... ... ", ". ... ..+. ", ".. ..+. ", ".@.........+....", ".@@@@@@.+++++++.", ".@.@@@@....+....", ".@..@@@..@.+. ", ".@@.@@@.@@.+. ", ".@@@@@@@@@.... ", ".@.@@@@@.@. . ", ".@.......@. . ", ".@.#####.@.. . ", ".@.#####.@. . ", ".@@.....@@. ", " .@@@@@@@. ", " ....... "}; tora-2.1.3/src/icons/toscript.xpm0000644000175000017500000000103011270353517016545 0ustar michaelmichael/* XPM */ static const char* const toscript_xpm[] = { "16 16 10 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #7F7F7F", "# c #DFDFDF", "$ c #9F9F9F", "% c #BFBFBF", "& c #1F1F1F", "* c #3F3F3F", "= c #5F5F5F", " ..... ", " .+++++. ", " .++...+. ", " .. ..+... ", " .+++.@@. ", " ......+..@@@@.", " .@@@@@.+.@@@@..", ".@@@@.........#.", "..@@@.+++++.$%#.", "............$%#.", "..&*=@$.+.=@$%#.", "..&*=.......$%#.", "..&*=.+++++.$%. ", "..&*=......... ", " .&*=@$%. ", " ...... "}; tora-2.1.3/src/icons/adduser.xpm0000644000175000017500000000067411270353517016342 0ustar michaelmichael/* XPM */ static const char* const adduser_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #545454", "@ c #00FF00", " ... ... ", " .+++. .@. ", " .+++. .@. ", " .+++.....@....", " .+. .@@@@@@@.", " ..+++.....@....", ".+++++++. .@. ", ".+++++++. .@. ", ".+++++++. ... ", ".+++++++. ", " .++.++. ", " .++.++. ", " .++.++. ", " .++.++. ", " .++.++. ", " .. .. "}; tora-2.1.3/src/toresultlabel.h0000644000175000017500000001105511270353625016077 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTLABEL_H #define TORESULTLABEL_H #include "config.h" #include "tobackground.h" #include "toresult.h" #include class toNoBlockQuery; class toSQL; /** This widget displays the result of a query where each item in the stream * is added to a label separated by an optional string. */ class toResultLabel : public QLabel, public toResult { Q_OBJECT toNoBlockQuery *Query; toBackground Poll; QString Separator; public: /** Create the widget. * @param parent Parent widget. * @param name Name of widget. */ toResultLabel(QWidget *parent, const char *name = NULL); /** Destruct object */ ~toResultLabel(); /** Reimplemented for internal reasons. */ virtual void query(const QString &sql, const toQList ¶m); /** Handle any connection by default */ virtual bool canHandle(toConnection &) { return true; } /** Get separator string to use between result. */ const QString &separator(void) const { return Separator; } /** Set separator string to use between result. */ void setSeparator(const QString &sep) { Separator = sep; } // Why are these needed? #if 1 /** Set the SQL statement of this list * @param sql String containing statement. */ void setSQL(const QString &sql) { toResult::setSQL(sql); } /** Set the SQL statement of this list. This will also affect @ref Name. * @param sql SQL containing statement. */ void setSQL(const toSQL &sql) { toResult::setSQL(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const QString &sql) { toResult::query(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql) { toResult::query(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql, toQList &par) { toResult::query(sql, par); } #endif public slots: /** Reimplemented for internal reasons. */ virtual void refresh(void) { toResult::refresh(); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1) { toResult::changeParams(Param1); } /** Reimplemented For internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2) { toResult::changeParams(Param1, Param2); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3) { toResult::changeParams(Param1, Param2, Param3); } private slots: void poll(void); }; #endif tora-2.1.3/src/tooraclesetting.h0000644000175000017500000000416511270353625016430 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOORACLESETTING_H #define TOORACLESETTING_H #include "config.h" #include "totool.h" #include "ui_tooraclesettingui.h" class toOracleSetting : public QWidget, public Ui::toOracleSettingUI, public toSettingTab { Q_OBJECT; public: toOracleSetting(QWidget *parent); public slots: virtual void saveSetting(void); virtual void createPlanTable(void); }; #endif tora-2.1.3/src/tolegendchart.h0000644000175000017500000000660211270353625016043 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOLEGENDCHART_H #define TOLEGENDCHART_H #include "config.h" #include #include //Added by qt3to4: #include /** A widget that displays a legend to other charts. */ class toLegendChart : public QWidget { Q_OBJECT int Columns; QString Title; std::list Labels; std::list sizeHint(int &height, int &items); public: /** Create a new legend. * @param columns Columns. * @param parent Parent widget. * @param name Name of widget. * @param f Widget flags. */ toLegendChart(int columns, QWidget *parent = NULL, const char *name = NULL, Qt::WFlags f = 0); /** Set title of the chart. Set to empty string to not display title. * @param title Title of chart. */ void setTitle(const QString &title = QString::null) { Title = title; update(); } /** Get title of chart. * @return Title of chart. */ const QString &title(void) { return Title; } /** Set list of chart labels. * @param labels List of labels, if label is empty it will not appear in legend. */ void setLabels(std::list &labels); /** Add a value to the chart. * @param value New value to add. * @param label Label of this new value. */ void addLabel(const QString &label); /** Get labels of chart. * @return List of labels. */ std::list &labels(void) { return Labels; } /** Reimplemented for internal reasons. */ virtual QSize sizeHint(); protected: /** Reimplemented for internal reasons. */ virtual void paintEvent(QPaintEvent *e); }; #endif tora-2.1.3/src/shortcuteditor/0000755000175000017500000000000011445450572016130 5ustar michaelmichaeltora-2.1.3/src/shortcuteditor/shortcuteditordialog.cpp0000644000175000017500000001022411353136310023062 0ustar michaelmichael/* For general Sqliteman copyright and licensing information please refer to the COPYING file provided with the program. Following this notice may exist a copyright and/or license notice that predates the release of Sqliteman for which a new license (GPL+exception) is in place. */ #include #include #include #if QT_VERSION >= 0x040300 #include #else #warning "QXmlStreamReader is disabled. Qt 4.3.x required." #endif #include "shortcuteditordialog.h" #include "shortcutmodel.h" ShortcutEditorDialog::ShortcutEditorDialog(QWidget * parent) : QDialog(parent) { setupUi(this); model = new ShortcutModel(); tableView->setModel(model); tableView->resizeColumnsToContents(); connect(removeAllButton, SIGNAL(clicked()), this, SLOT(removeAllButton_clicked())); connect(removeButton, SIGNAL(clicked()), this, SLOT(removeButton_clicked())); connect(addButton, SIGNAL(clicked()), this, SLOT(addButton_clicked())); connect(model, SIGNAL(keysNotUnique(QString)), this, SLOT(keysNotUnique(QString))); connect(buttonBox, SIGNAL(accepted()), this, SLOT(acceptDialog())); connect(exportButton, SIGNAL(clicked()), this, SLOT(exportButton_clicked())); connect(importButton, SIGNAL(clicked()), this, SLOT(importButton_clicked())); } ShortcutEditorDialog::~ShortcutEditorDialog() { } void ShortcutEditorDialog::removeAllButton_clicked() { model->removeRows(0, model->rowCount()); } void ShortcutEditorDialog::removeButton_clicked() { model->removeRows(tableView->currentIndex().row(), 1); } void ShortcutEditorDialog::addButton_clicked() { model->insertRow(); } void ShortcutEditorDialog::keysNotUnique(QString value) { QMessageBox::warning(this, tr("Shortcut Error"), tr("The value you entered as a key (%1) is not unique. Enter another one, please.").arg(value)); } void ShortcutEditorDialog::acceptDialog() { QPair p; foreach (p, model->values()) { if (p.first.isEmpty()) { int b = QMessageBox::question(this, tr("Shortcut Error"), tr("Some of key values are empty. These items will be lost. Do you want to return to the shortcut editor to fix it?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); if (b == QMessageBox::Yes) return; } } model->saveValues(); accept(); } void ShortcutEditorDialog::exportButton_clicked() { #if QT_VERSION >= 0x040300 QString fileName = QFileDialog::getSaveFileName(this, tr("Save Shortcuts"), QDir::currentPath(), tr("Sqliteman Shortcuts XML (*.xml);;All Files (*)")); if (fileName.isEmpty()) return; QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::warning(this, tr("Export Error"), tr("Cannot open file %1 for writting.").arg(fileName)); return; } QXmlStreamWriter xml(&file); xml.writeStartDocument(); xml.writeStartElement("sqliteman-shortcuts"); QPair p; foreach (p, model->values()) { xml.writeStartElement("pair"); xml.writeAttribute("key", p.first); xml.writeAttribute("value", p.second); xml.writeEndElement(); } xml.writeEndElement(); //"sqliteman-shortcuts" xml.writeEndDocument(); file.close(); #endif } void ShortcutEditorDialog::importButton_clicked() { #if QT_VERSION >= 0x040300 QString fileName = QFileDialog::getOpenFileName(this, tr("Load Shortcuts"), QDir::currentPath(), tr("Sqliteman Shortcuts XML (*.xml);;All Files (*)")); if (fileName.isEmpty()) return; QFile file(fileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox::warning(this, tr("Load Error"), tr("Cannot open file %1 for reading.").arg(fileName)); return; } QXmlStreamReader xml(&file); bool isXML = false; while (!xml.atEnd()) { xml.readNext(); if (xml.isStartElement()) { if (xml.name() == "sqliteman-shortcuts") isXML = true; if (isXML && xml.name() == "pair") { model->insertRow(xml.attributes().value("key").toString(), xml.attributes().value("value").toString()); } } } if (xml.error() && xml.error() != QXmlStreamReader::PrematureEndOfDocumentError) { // qWarning() << "XML ERROR:" << xml.lineNumber() << ": " << xml.errorString(); } file.close(); #endif } tora-2.1.3/src/shortcuteditor/shortcuteditordialog.h0000644000175000017500000000214511270353457022545 0ustar michaelmichael/* For general Sqliteman copyright and licensing information please refer to the COPYING file provided with the program. Following this notice may exist a copyright and/or license notice that predates the release of Sqliteman for which a new license (GPL+exception) is in place. */ #ifndef SHORTCUTEDITORDIALOG_H #define SHORTCUTEDITORDIALOG_H #include "ui_shortcuteditordialog.h" class ShortcutModel; /*! \brief A GUI for settings sQL editor shortcuts. The basic idea of "shortcuts" is: user can define some string sequences like "sf" what will be expanded into e.g. "select * from" after pressing Tabelator in the editor. \author Petr Vanek */ class ShortcutEditorDialog : public QDialog, public Ui::ShortcutEditorDialog { Q_OBJECT public: ShortcutEditorDialog(QWidget * parent = 0); ~ShortcutEditorDialog(); private: ShortcutModel * model; private slots: void removeAllButton_clicked(); void removeButton_clicked(); void addButton_clicked(); void acceptDialog(); void keysNotUnique(QString value); void exportButton_clicked(); void importButton_clicked(); }; #endif tora-2.1.3/src/shortcuteditor/shortcutmodel.cpp0000644000175000017500000000643111270353457021534 0ustar michaelmichael/* For general Sqliteman copyright and licensing information please refer to the COPYING file provided with the program. Following this notice may exist a copyright and/or license notice that predates the release of Sqliteman for which a new license (GPL+exception) is in place. */ #include "shortcutmodel.h" #include "toconfiguration.h" ShortcutModel::ShortcutModel(QObject * /*parent*/) : QAbstractTableModel() { EditorShortcutsMap map(toConfigurationSingle::Instance().editorShortcuts()); EditorShortcutsMapIterator i(map); while (i.hasNext()) { i.next(); m_values.append(qMakePair(i.key(), i.value().toString())); } } ShortcutModel::~ShortcutModel() { } int ShortcutModel::rowCount(const QModelIndex & /*parent*/) const { return m_values.count(); } int ShortcutModel::columnCount(const QModelIndex & /*parent*/) const { return 2; } QVariant ShortcutModel::data(const QModelIndex & index, int role) const { if (!index.isValid()) return QVariant(); if (role == Qt::DisplayRole || role == Qt::EditRole) { QString s; return QVariant(index.column() == 0 ? m_values.at(index.row()).first : m_values.at(index.row()).second); } if (role == Qt::BackgroundRole && index.column() == 0 && m_values.at(index.row()).first.isEmpty()) return QVariant(Qt::red); return QVariant(); } bool ShortcutModel::setData(const QModelIndex & index, const QVariant & value, int role) { if (role != Qt::EditRole || !index.isValid()) return false; QString newVal(value.toString()); if (index.column() == 0) { // ensure it's unique. Message is handled in the ShortcutEditorDialog QPair p; foreach (p, m_values) { if (p.first == newVal) { emit keysNotUnique(newVal); return false; } } m_values[index.row()].first = newVal; } else m_values[index.row()].second = newVal; emit dataChanged(index, index); return true; } Qt::ItemFlags ShortcutModel::flags(const QModelIndex & /*index*/) const { return Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable; } QVariant ShortcutModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); if (orientation == Qt::Horizontal) return section == 0 ? tr("Shortcut") : tr("Expanded Text"); else return QString("%1").arg(section + 1); } bool ShortcutModel::removeRows(int row, int count, const QModelIndex & parent) { if(count <= 0 || row < 0 || (row + count) > rowCount(parent)) return false; beginRemoveRows(parent, row, row + count - 1); for (int i = 0; i < count; ++i) m_values.removeAt(row); endRemoveRows(); return true; } bool ShortcutModel::insertRows( int row, int count, const QModelIndex & parent) { beginInsertRows(parent, row, row + count - 1); for (int i = 0; i < count; ++i) m_values.insert(row + count, qMakePair(QString(), QString())); endInsertRows(); return true; } void ShortcutModel::insertRow() { insertRows(rowCount(), 1); } void ShortcutModel::insertRow(QString key, QString value) { beginInsertRows(QModelIndex(), rowCount(), rowCount()); m_values.insert(rowCount(), qMakePair(key, value)); endInsertRows(); } void ShortcutModel::saveValues() { EditorShortcutsMap ret; QPair p; foreach (p, m_values) ret[p.first] = p.second; toConfigurationSingle::Instance().setEditorShortcuts(ret); } tora-2.1.3/src/shortcuteditor/shortcutmodel.h0000644000175000017500000000414111270353457021175 0ustar michaelmichael/* For general Sqliteman copyright and licensing information please refer to the COPYING file provided with the program. Following this notice may exist a copyright and/or license notice that predates the release of Sqliteman for which a new license (GPL+exception) is in place. */ #ifndef SHORTCUTMODEL_H #define SHORTCUTMODEL_H #include #include /*! \brief A model for sQL editor shortcuts. See ShortcutEditorDialog for basic idea of shortcuts. Shortcuts are handled as a QList of QPairs in the model. It's due the need of changing "key" values what is impossible in QMap/QHash structures (well, it could be done but it is expensive). Shortcuts are saved by Preferences as a QMap(QString,QVariant). QVariant due the QSettings limitations. \author Petr Vanek */ class ShortcutModel : public QAbstractTableModel { Q_OBJECT public: ShortcutModel(QObject * parent = 0); ~ShortcutModel(); int rowCount(const QModelIndex & parent = QModelIndex()) const; int columnCount(const QModelIndex & parent = QModelIndex()) const; QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole); Qt::ItemFlags flags(const QModelIndex & index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex()); bool insertRows( int row, int count, const QModelIndex & parent = QModelIndex()); void insertRow(); void insertRow(QString key, QString value); QList > values() { return m_values; }; //! \brief Check emptiness of keys and save it by Preferences. void saveValues(); signals: /*! \brief Signal emmitted when the user finish the editation of one value. */ void valueChanged(); /*! \brief Emitted when user enters duplicate key value. QString is the duplicate value. It's handled in the GUI with message box */ void keysNotUnique(QString); private: QList > m_values; }; #endif tora-2.1.3/src/shortcuteditor/shortcuteditordialog.ui0000644000175000017500000000647411270353457022744 0ustar michaelmichael ShortcutEditorDialog 0 0 557 392 Editor Shortcuts 9 6 Define Editor Shortcuts 9 6 &Import... Qt::Horizontal 61 33 &Add &Remove true QAbstractItemView::SingleSelection R&emove All E&xport... Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok buttonBox rejected() ShortcutEditorDialog reject() 325 350 286 274 tora-2.1.3/src/totuning.cpp0000644000175000017500000024445611270353625015435 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "tochangeconnection.h" #include "toconf.h" #include "toconnection.h" #include "tomain.h" #include "tonoblockquery.h" #include "toresultbar.h" #include "toresultitem.h" #include "toresultline.h" #include "toresultlock.h" #include "toresulttableview.h" #include "toresultparam.h" #include "toresultpie.h" #include "toresultstats.h" #include "toresultview.h" #include "tosql.h" #include "totool.h" #include "totuning.h" #include "ui_totuningsettingui.h" #include "towaitevents.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "icons/refresh.xpm" #include "icons/totuning.xpm" #include "icons/compile.xpm" // #define CONF_OVERVIEW "Overview" // #define CONF_FILEIO "File I/O" // #define CONF_WAITS "Wait events" // #define CONF_CHART "chart" static std::list TabList(void) { std::list ret; ret.insert(ret.end(), CONF_OVERVIEW); std::list val = toSQL::range("toTuning:Charts"); QString last; for (std::list::iterator i = val.begin();i != val.end();i++) { QStringList parts = (*i).split(":"); if (parts.count() == 3) { parts.append(parts[2]); parts[2] = QString::fromLatin1("Charts"); } if (last != parts[2]) ret.insert(ret.end(), parts[2].toLatin1()); last = parts[2]; } ret.insert(ret.end(), CONF_WAITS); ret.insert(ret.end(), CONF_FILEIO); return ret; } class toTuningSetup : public QWidget, public Ui::toTuningSettingUI, public toSettingTab { toTool *Tool; public: toTuningSetup(toTool *tool, QWidget* parent = 0, const char* name = 0) : QWidget(parent), toSettingTab("tuning.html#preferences"), Tool(tool) { setupUi(this); // std::list tabs = TabList(); // for (std::list::iterator i = tabs.begin();i != tabs.end();i++) // { // toTreeWidgetItem *item = new toTreeWidgetItem(EnabledTabs, (*i)); // if (!tool->config(*i, "").isEmpty()) // item->setSelected(true); // } toTreeWidgetItem *item = new toTreeWidgetItem(EnabledTabs, CONF_OVERVIEW); item->setSelected(toConfigurationSingle::Instance().tuningOverview()); toTreeWidgetItem *item1 = new toTreeWidgetItem(EnabledTabs, CONF_FILEIO); item1->setSelected(toConfigurationSingle::Instance().tuningFileIO()); toTreeWidgetItem *item2 = new toTreeWidgetItem(EnabledTabs, CONF_WAITS); item2->setSelected(toConfigurationSingle::Instance().tuningWaits()); toTreeWidgetItem *item3 = new toTreeWidgetItem(EnabledTabs, CONF_CHART); item3->setSelected(toConfigurationSingle::Instance().tuningCharts()); EnabledTabs->setSorting(0); } virtual void saveSetting(void) { for (toTreeWidgetItem *item = EnabledTabs->firstChild();item;item = item->nextSibling()) { // NOTE: OK, it's ugly, but this is the only place where new QSettings fails if (item->text(0) == CONF_OVERVIEW) toConfigurationSingle::Instance().setTuningOverview(item->isSelected()); else if (item->text(0) == CONF_FILEIO) toConfigurationSingle::Instance().setTuningFileIO(item->isSelected()); else if (item->text(0) == CONF_WAITS) toConfigurationSingle::Instance().setTuningWaits(item->isSelected()); else if (item->text(0) == CONF_CHART) toConfigurationSingle::Instance().setTuningCharts(item->isSelected()); // if (item->isSelected() || Tool->config(item->text(0).toLatin1(), "Undefined") != "Undefined") // Tool->setConfig(item->text(0).toLatin1(), QString::fromLatin1((item->isSelected() ? "Yes" : ""))); } } }; class toTuningTool : public toTool { protected: virtual const char **pictureXPM(void) { return const_cast(totuning_xpm); } public: toTuningTool() : toTool(30, "Server Tuning") { } virtual const char *menuItem() { return "Server Tuning"; } virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) { return new toTuning(parent, connection); } virtual QWidget *configurationTab(QWidget *parent) { return new toTuningSetup(this, parent); } virtual void closeWindow(toConnection &connection){}; }; static toTuningTool TuningTool; static toSQL SQLDictionaryMiss("toTuning:Indicators:Important ratios:1DictionaryMiss", "select sum(getmisses)/sum(gets)*100,' %' from v$rowcache", "Data dictionary row cache miss ratio (%). < 10%-15%"); static toSQL SQLImportantLibraryCache("toTuning:Indicators:Important ratios:2LibraryCache", "select sum(reloads)/sum(pins)*100,' %' from v$librarycache", "Library cache (Shared SQL) miss ratio (%). < 1%"); static toSQL SQLDataCache( "toTuning:Indicators:Important ratios:3DataCache", "SELECT ( 1 - SUM ( DECODE ( name,\n" " 'physical reads',\n" " value,\n" " 0 ) ) / SUM ( DECODE ( name,\n" " 'db block gets',\n" " value,\n" " 'consistent gets',\n" " value,\n" " 0 ) ) ) * 100,\n" " ' %'\n" " FROM v$sysstat\n" " WHERE name IN ( 'db block gets',\n" " 'consistent gets',\n" " 'physical reads' )", "Data buffer cache hit ratio (%). > 60% - 70%", "0800"); static toSQL SQLDataCache7( "toTuning:Indicators:Important ratios:3DataCache", "SELECT (1-SUM(DECODE(statistic#,39,value,0))/SUM(DECODE(statistic#,37,value,38,value,0)))*100,' %'\n" " FROM v$sysstat\n" " WHERE statistic# IN (37,38,39)", "", "0703"); static toSQL SQLLogRedo( "toTuning:Indicators:Redo log contention:1LogSpace", "SELECT value\n" " FROM v$sysstat\n" " WHERE name = 'redo log space requests'", "Redo log space requests. Close to 0", "0800"); static toSQL SQLLogRedo7( "toTuning:Indicators:Redo log contention:1LogSpace", "select value from v$sysstat where statistic# = 94", "", "0703"); static toSQL SQLSystemHeadUndo( "toTuning:Indicators:RBS contention:1SystemHeadUndo", "SELECT count / blocks * 100,\n" " ' %'\n" " FROM ( SELECT MAX ( count ) count\n" " FROM v$waitstat\n" " WHERE class = 'system undo header' ) a,\n" " ( SELECT SUM ( value ) blocks\n" " FROM v$sysstat\n" " WHERE name IN ( 'db block gets',\n" " 'consistent gets' ) ) b", "System undo header waits (%). < 1%", "0800"); static toSQL SQLSystemHeadUndo7( "toTuning:Indicators:RBS contention:1SystemHeadUndo", "SELECT count/blocks*100,' %'\n" " FROM (SELECT MAX(count) count FROM v$waitstat WHERE class = 'system undo header') a,\n" " (SELECT SUM(value) blocks FROM v$sysstat WHERE statistic# IN (37,38)) b", "", "0703"); static toSQL SQLSystemBlockUndo( "toTuning:Indicators:RBS contention:2SystemBlockUndo", "SELECT count / blocks * 100,\n" " ' %'\n" " FROM ( SELECT MAX ( count ) count\n" " FROM v$waitstat\n" " WHERE class = 'system undo block' ) a,\n" " ( SELECT SUM ( value ) blocks\n" " FROM v$sysstat\n" " WHERE name IN ( 'db block gets',\n" " 'consistent gets' ) ) b", "System undo block waits (%). < 1%", "0800"); static toSQL SQLSystemBlockUndo7( "toTuning:Indicators:RBS contention:2SystemBlockUndo", "SELECT count/blocks*100,' %'\n" " FROM (SELECT MAX(count) count FROM v$waitstat WHERE class = 'system undo block') a,\n" " (SELECT SUM(value) blocks FROM v$sysstat WHERE statistic# IN (37,38)) b", "", "0703"); static toSQL SQLHeadUndo( "toTuning:Indicators:RBS contention:3HeadUndo", "SELECT count / blocks * 100,\n" " ' %'\n" " FROM ( SELECT MAX ( count ) count\n" " FROM v$waitstat\n" " WHERE class = 'undo header' ) a,\n" " ( SELECT SUM ( value ) blocks\n" " FROM v$sysstat\n" " WHERE name IN ( 'db block gets',\n" " 'consistent gets' ) ) b", "Undo head waits (%). < 1%", "0800"); static toSQL SQLHeadUndo7( "toTuning:Indicators:RBS contention:3HeadUndo", "SELECT count/blocks*100,' %'\n" " FROM (SELECT MAX(count) count FROM v$waitstat WHERE class = 'undo header') a,\n" " (SELECT SUM(value) blocks FROM v$sysstat WHERE statistic# IN (37,38)) b", "", "0703"); static toSQL SQLBlockUndo( "toTuning:Indicators:RBS contention:4BlockUndo", "SELECT count / blocks * 100,\n" " ' %'\n" " FROM ( SELECT MAX ( count ) count\n" " FROM v$waitstat\n" " WHERE class = 'undo block' ) a,\n" " ( SELECT SUM ( value ) blocks\n" " FROM v$sysstat\n" " WHERE name IN ( 'db block gets',\n" " 'consistent gets' ) ) b", "Undo block waits (%). < 1%", "0800"); static toSQL SQLBlockUndo7( "toTuning:Indicators:RBS contention:4BlockUndo", "SELECT count/blocks*100,' %'\n" " FROM (SELECT MAX(count) count FROM v$waitstat WHERE class = 'undo block') a,\n" " (SELECT SUM(value) blocks FROM v$sysstat WHERE statistic# IN (37,38)) b", "", "0703"); static toSQL SQLTotalWaits("toTuning:Indicators:RBS contention:5TotalWaits", "select sum(waits)/sum(gets)*100,' %' from v$rollstat", "Total RBS waits (%). < 1%"); static toSQL SQLBusyRate("toTuning:Indicators:MTS contention:1BusyRate", "SELECT NVL(SUM(busy)/(SUM(busy)+SUM(idle)),0)*100,' %' FROM v$dispatcher", "Busy rate for dispatchers (%). < 50%"); static toSQL SQLDispQueue("toTuning:Indicators:MTS contention:2DispQueue", "SELECT DECODE(NVL(SUM(totalq),0),0, 'No responses', ROUND(SUM(wait)/SUM(totalq),3)) FROM v$queue WHERE type='DISPATCHER'", "Dispatcher response queues waits (1/100s)."); static toSQL SQLServerQueue("toTuning:Indicators:MTS contention:3ServerQueue", "SELECT DECODE (NVL(SUM(totalq),0),0, 'No requests', ROUND(SUM(wait)/SUM(totalq),3)) FROM v$queue WHERE type='COMMON'", "Server request queue waits (1/100s)."); static toSQL SQLOptions("toTuning:Options", "select parameter \"Parameter\",\n" " decode(value,'TRUE','Enabled','Disabled') \"Enabled\"\n" " from v$option order by parameter", "Display options available in database"); static toSQL SQLLicense("toTuning:License", "select * from v$license", "Display licenses available for database"); static toSQL SQLChartsPhysical( "toTuning:Charts:1BBPhysical I/O", "SELECT SYSDATE,\n" " sum ( DECODE ( name,\n" " 'physical reads',\n" " value,\n" " 0 ) ) \"Physical reads\",\n" " sum ( DECODE ( name,\n" " 'physical writes',\n" " value,\n" " 0 ) ) \"Physical writes\",\n" " sum ( DECODE ( name,\n" " 'redo writes',\n" " value,\n" " 0 ) ) \"Redo writes\"\n" " FROM v$sysstat\n" " WHERE name IN ( 'physical reads',\n" " 'physical writes',\n" " 'redo writes' )", "Generate chart of physical I/O of database.", "0800"); static toSQL SQLChartsPhysical7( "toTuning:Charts:1BBPhysical I/O", "select SYSDATE,\n" " sum(decode(statistic#,39,value,0)) \"Physical reads\",\n" " sum(decode(statistic#,40,value,0)) \"Physical writes\",\n" " sum(decode(statistic#,91,value,0)) \"Redo writes\"\n" " from v$sysstat where statistic# in (39,40,91)", "", "0703"); static toSQL SQLChartsLogical( "toTuning:Charts:2BBLogical I/O", "SELECT SYSDATE,\n" " sum ( DECODE ( name,\n" " 'db block gets',\n" " value,\n" " 0 ) ) \"Block gets\",\n" " sum ( DECODE ( name,\n" " 'consistent gets',\n" " value,\n" " 0 ) ) \"Consistent gets\",\n" " sum ( DECODE ( name,\n" " 'db block changes',\n" " value,\n" " 0 ) ) \"Block changes\",\n" " sum ( DECODE ( name,\n" " 'consistent changes',\n" " value,\n" " 0 ) ) \"Consistent changes\"\n" " FROM v$sysstat\n" " WHERE name IN ( 'db block gets',\n" " 'consistent gets',\n" " 'db block changes',\n" " 'consistent changes' )", "Generate chart of physical I/O of database.", "0800"); static toSQL SQLChartsLogical7( "toTuning:Charts:2BBLogical I/O", "select SYSDATE,\n" " sum(decode(statistic#,37,value,0)) \"Block gets\",\n" " sum(decode(statistic#,38,value,0)) \"Consistent gets\",\n" " sum(decode(statistic#,43,value,0)) \"Block changes\",\n" " sum(decode(statistic#,45,value,0)) \"Consistent changes\"\n" " from v$sysstat where statistic# in (37,38,43,45)", "", "0703"); static toSQL SQLChartsWait( "toTuning:Charts:3BMWait events", "SELECT SYSDATE,\n" " cpu * 10 \"CPU\",\n" " PARALLEL * 10 \"Parallel execution\",\n" " filewrite * 10 \"DB File Write\",\n" " writecomplete * 10 \"Write Complete\",\n" " fileread * 10 \"DB File Read\",\n" " singleread * 10 \"DB Single File Read\",\n" " control * 10 \"Control File I/O\",\n" " direct * 10 \"Direct I/O\",\n" " LOG * 10 \"Log file\",\n" " net * 10 \"SQL*Net\"\n" " FROM ( SELECT SUM ( DECODE ( SUBSTR ( event,\n" " 1,\n" " 2 ),\n" " 'PX',\n" " time_waited,\n" " 0 ) ) - SUM ( DECODE ( event,\n" " 'PX Idle Wait',\n" " time_waited,\n" " 0 ) ) as parallel,\n" " SUM ( DECODE ( event,\n" " 'db file parallel write',\n" " time_waited,\n" " 'db file single write',\n" " time_waited,\n" " 0 ) ) filewrite,\n" " SUM ( DECODE ( event,\n" " 'write complete waits',\n" " time_waited,\n" " NULL ) ) writecomplete,\n" " SUM ( DECODE ( event,\n" " 'db file parallel read',\n" " time_waited,\n" " 'db file sequential read',\n" " time_waited,\n" " 0 ) ) fileread,\n" " SUM ( DECODE ( event,\n" " 'db file scattered read',\n" " time_waited,\n" " 0 ) ) singleread,\n" " SUM ( DECODE ( SUBSTR ( event,\n" " 1,\n" " 12 ),\n" " 'control file',\n" " time_waited,\n" " 0 ) ) control,\n" " SUM ( DECODE ( SUBSTR ( event,\n" " 1,\n" " 11 ),\n" " 'direct path',\n" " time_waited,\n" " 0 ) ) direct,\n" " SUM ( DECODE ( SUBSTR ( event,\n" " 1,\n" " 3 ),\n" " 'log',\n" " time_waited,\n" " 0 ) ) as log,\n" " SUM ( DECODE ( SUBSTR ( event,\n" " 1,\n" " 7 ),\n" " 'SQL*Net',\n" " time_waited,\n" " 0 ) ) - SUM ( DECODE ( event,\n" " 'SQL*Net message from client',\n" " time_waited,\n" " 0 ) ) net\n" " FROM v$system_event ),\n" " ( SELECT value * 10 cpu\n" " FROM v$sysstat\n" " WHERE name = 'CPU used by this session' )", "Used to generate chart for system wait time."); static toSQL SQLChartsExecution( "toTuning:Charts:6LNExecution", "select SYSDATE,\n" " sum(decode(name,'execute count',value,0)) \"Execute\",\n" " sum(decode(name,'parse count (hard)',value,0)) \"Hard parse\",\n" " sum(decode(name,'parse count (total)',value,0)) \"Parse\",\n" " sum(decode(name,'user calls',value,0)) \"Calls\",\n" " sum(decode(name,'user commits',value,0)) \"Commit\",\n" " sum(decode(name,'user rollbacks',value,0)) \"Rollbacks\"\n" " from v$sysstat where name IN ('execute count','parse count (hard)','parse count (total)','user calls','user commits','user rollbacks')", "Used to generate chart for execution statistics.", "0800"); static toSQL SQLChartsExecution7( "toTuning:Charts:6LNExecution", "select SYSDATE,\n" " sum(decode(statistic#,132,value,0)) \"Execute\",\n" " sum(decode(statistic#,131,value,0)) \"Parse\",\n" " sum(decode(statistic#,6,value,0)) \"Calls\",\n" " sum(decode(statistic#,4,value,0)) \"Commit\",\n" " sum(decode(statistic#,5,value,0)) \"Rollbacks\"\n" " from v$sysstat where statistic# in (132,131,4,5,6)", "", "0703"); static toSQL SQLChartsExecutionPie( "toTuning:Charts:8PNExecution Total", "select value,decode(name,'execute count','Execute','parse count (hard)','Hard parse','parse count (total)','Parse',\n" " 'user calls','Calls','user commits','Commit','user rollbacks','Rollbacks')\n" " from v$sysstat where name IN ('execute count','parse count (hard)','parse count (total)','user calls','user commits','user rollbacks') order by name", "Used to generate pie chart for execution statistics.", "0800"); static toSQL SQLChartsExecutionPie7( "toTuning:Charts:8PNExecution Total", "select value,decode(statistic#,132,'Execute',131,'Parse',\n" " 6,'Calls',4,'Commit',5,'Rollbacks')\n" " from v$sysstat where statistic# in (132,131,6,4,5) order by name", "", "0703"); static toSQL SQLChartsClients( "toTuning:Charts:4BAClients", "select sysdate,\n" " sum(decode(decode(type,'BACKGROUND','WHATEVER',status),'ACTIVE',1,0)) \"Active\",\n" " sum(decode(status,'INACTIVE',1,0)) \"Inactive\",\n" " sum(decode(type,'BACKGROUND',1,0)) \"System\"\n" " from v$session where sid not in (select nvl(sid,0) from v$px_process)", "Chart displaying connected clients"); static toSQL SQLChartsClients8( "toTuning:Charts:4BAClients", "select sysdate,\n" " sum(decode(decode(type,'BACKGROUND','WHATEVER',status),'ACTIVE',1,0)) \"Active\",\n" " sum(decode(status,'INACTIVE',1,0)) \"Inactive\",\n" " sum(decode(type,'BACKGROUND',1,0)) \"System\"\n" " from v$session", "", "0800"); static toSQL SQLChartsCacheMisses( "toTuning:Charts:5CPCache misses", "SELECT SYSDATE,\n" " pread \"Data buffer cache\",\n" " read \"Dictionary row cache\",\n" " getmiss \"Library cache\",\n" " gets \" \",\n" " reloads \" \",\n" " pins \" \"\n" " FROM ( SELECT 100 * SUM ( DECODE ( name,\n" " 'physical reads',\n" " value,\n" " 0 ) ) pread,\n" " SUM ( DECODE ( name,\n" " 'db block gets',\n" " value,\n" " 'consistent gets',\n" " value,\n" " 41,\n" " value,\n" " 0 ) ) as read\n" " FROM v$sysstat\n" " WHERE name IN ( 'db block gets',\n" " 'consistent gets',\n" " 'physical reads' ) ) \"Data buffer cache\",\n" " ( SELECT 100 * sum ( getmisses ) getmiss,\n" " sum ( gets ) gets\n" " FROM v$rowcache ) \"Dictionary row cache\",\n" " ( SELECT 100 * sum ( reloads ) reloads,\n" " sum ( pins ) pins\n" " FROM v$librarycache ) \"Library cache\"", "Chart display memory allocation. This is really weird to change, especially since the column names " "don't correspond exactly to the column data in the chart. Each group of two are divided with each other before drawn.", "0800"); static toSQL SQLChartsCacheMisses7( "toTuning:Charts:5CPCache misses", "select sysdate,\n" " pread \"Data buffer cache\",read \"Dictionary row cache\",\n" " getmiss \"Library cache\",gets \" \",\n" " reloads \" \",pins \" \"\n" " from (select 100*SUM(DECODE(statistic#,39,value,0)) pread,SUM(DECODE(statistic#,37,value,38,value,0)) read\n" " from v$sysstat where statistic# IN (37,38,39)) \"Data buffer cache\",\n" " (select 100*sum(getmisses) getmiss,sum(gets) gets from v$rowcache) \"Dictionary row cache\",\n" " (select 100*sum(reloads) reloads,sum(pins) pins from v$librarycache) \"Library cache\"\n", "", "0703"); static toSQL SQLChartsRedo( "toTuning:Charts:7BSRedo log I/O", "SELECT SYSDATE,\n" " sum ( DECODE ( name,\n" " 'redo size',\n" " value,\n" " 0 ) ) / :unit \"Redo size\",\n" " sum ( DECODE ( name,\n" " 'redo wastage',\n" " value,\n" " 0 ) ) / :unit \"Redo wastage\"\n" " FROM v$sysstat\n" " WHERE name IN ( 'redo size',\n" " 'redo wastage' )", "Used to generate chart for redo I/O statistics.", "0800"); static toSQL SQLChartsRedo7( "toTuning:Charts:7BSRedo log I/O", "select SYSDATE,\n" " sum(decode(statistic#,85,value,0))/:unit \"Redo size\",\n" " sum(decode(statistic#,89,value,0))/:unit \"Redo wastage\"\n" " from v$sysstat where statistic# in (85,89)", "", "0703"); static toSQL SQLOverviewArchiveWrite("toTuning:Overview:ArchiveWrite", "select sysdate,sum(blocks) from v$archived_log", "Archive log write", "0800"); static toSQL SQLOverviewArchiveWrite7("toTuning:Overview:ArchiveWrite", "select sysdate,0 from sys.dual", "", "0703"); static toSQL SQLOverviewBufferHit( "toTuning:Overview:BufferHit", "SELECT SYSDATE,\n" " ( 1 - SUM ( DECODE ( name,\n" " 'physical reads',\n" " value,\n" " 0 ) ) / SUM ( DECODE ( name,\n" " 'db block gets',\n" " value,\n" " 'consistent gets',\n" " value,\n" " 0 ) ) ) * 100\n" " FROM v$sysstat\n" " WHERE name IN ( 'db block gets',\n" " 'consistent gets',\n" " 'physical reads' )", "Buffer hitrate", "0800"); static toSQL SQLOverviewBufferHit7( "toTuning:Overview:BufferHit", "SELECT SYSDATE,(1-SUM(DECODE(statistic#,39,value,0))/SUM(DECODE(statistic#,37,value,38,value,0)))*100\n" " FROM v$sysstat\n" " WHERE statistic# IN (37,38,39)", "", "0703"); static toSQL SQLOverviewClientInput( "toTuning:Overview:ClientInput", "SELECT SYSDATE,\n" " value / :f1\n" " FROM v$sysstat\n" " WHERE name = 'bytes sent via SQL*Net to client'", "Bytes sent to client", "0800"); static toSQL SQLOverviewClientInput7( "toTuning:Overview:ClientInput", "select sysdate,value/:f1\n" " from v$sysstat where statistic# = 134", "", "0703"); static toSQL SQLOverviewClientOutput( "toTuning:Overview:ClientOutput", "SELECT SYSDATE,\n" " value / :f1\n" " FROM v$sysstat\n" " WHERE name = 'bytes received via SQL*Net from client'", "Bytes sent from client", "0800"); static toSQL SQLOverviewClientOutput7( "toTuning:Overview:ClientOutput", "select sysdate,value/:f1\n" " from v$sysstat where statistic# = 133", "", "0703"); static toSQL SQLOverviewExecute( "toTuning:Overview:Execute", "SELECT SYSDATE,\n" " value\n" " FROM v$sysstat\n" " WHERE name = 'execute count'", "Execute count", "0800"); static toSQL SQLOverviewExecute7( "toTuning:Overview:Execute", "select sysdate,value\n" " from v$sysstat where statistic# = 132", "", "0703"); static toSQL SQLOverviewParse( "toTuning:Overview:Parse", "SELECT SYSDATE,\n" " value\n" " FROM v$sysstat\n" " WHERE name = 'parse count (total)'", "Parse count", "0800"); static toSQL SQLOverviewParse7( "toTuning:Overview:Parse", "select sysdate,value\n" " from v$sysstat where statistic# = 131", "", "0703"); static toSQL SQLOverviewRedoEntries( "toTuning:Overview:RedoEntries", "SELECT SYSDATE,\n" " value\n" " FROM v$sysstat\n" " WHERE name = 'redo entries'", "Redo entries", "0800"); static toSQL SQLOverviewRedoEntries7( "toTuning:Overview:RedoEntries", "select sysdate,value\n" " from v$sysstat where statistic# = 84", "", "0703"); static toSQL SQLOverviewRedoBlocks( "toTuning:Overview:RedoBlocks", "SELECT SYSDATE,\n" " value\n" " FROM v$sysstat\n" " WHERE name = 'redo blocks written'", "Redo blocks written", "0800"); static toSQL SQLOverviewRedoBlocks7( "toTuning:Overview:RedoBlocks", "select sysdate,value\n" " from v$sysstat where statistic# = 92", "", "0703"); static toSQL SQLOverviewLogicalRead( "toTuning:Overview:LogicalRead", "SELECT SYSDATE,\n" " sum ( value )\n" " FROM v$sysstat\n" " WHERE name IN ( 'db block gets',\n" " 'consistent gets' )", "Blocks read", "0800"); static toSQL SQLOverviewLogicalRead7( "toTuning:Overview:LogicalRead", "select sysdate,sum(value)\n" " from v$sysstat where statistic# in (37,38)", "", "0703"); static toSQL SQLOverviewLogicalWrite( "toTuning:Overview:LogicalWrite", "SELECT SYSDATE,\n" " sum ( value )\n" " FROM v$sysstat\n" " WHERE name IN ( 'db block changes',\n" " 'consistent changes' )", "Blocks written", "0800"); static toSQL SQLOverviewLogicalWrite7( "toTuning:Overview:LogicalWrite", "select sysdate,sum(value)\n" " from v$sysstat where statistic# in (43,45)", "", "0703"); static toSQL SQLOverviewPhysicalRead( "toTuning:Overview:PhysicalRead", "SELECT SYSDATE,\n" " value\n" " FROM v$sysstat\n" " WHERE name = 'physical reads'", "Blocks physically read", "0800"); static toSQL SQLOverviewPhysicalRead7( "toTuning:Overview:PhysicalRead", "select sysdate,value\n" " from v$sysstat where statistic# = 39", "", "0703"); static toSQL SQLOverviewPhysicalWrite( "toTuning:Overview:PhysicalWrite", "SELECT SYSDATE,\n" " value\n" " FROM v$sysstat\n" " WHERE name = 'physical writes'", "Blocks physically written", "0800"); static toSQL SQLOverviewPhysicalWrite7( "toTuning:Overview:PhysicalWrite", "select sysdate,value\n" " from v$sysstat where statistic# = 40", "", "0703"); static toSQL SQLOverviewClient("toTuning:Overview:Client", "select sysdate,\n" " sum(decode(status,'INACTIVE',1,0)),\n" " sum(decode(status,'ACTIVE',1,0))\n" " from v$session\n" " where type != 'BACKGROUND' and sid not in (select nvl(sid,0) from v$px_process)", "Information about active/inactive clients"); static toSQL SQLOverviewClient8("toTuning:Overview:Client", "select sysdate,\n" " sum(decode(status,'INACTIVE',1,0)),\n" " sum(decode(status,'ACTIVE',1,0))\n" " from v$session\n" " where type != 'BACKGROUND'", "", "0800"); static toSQL SQLOverviewSGAUsed("toTuning:Overview:SGAUsed", "select sysdate,100*(total-free)/total\n" " from (select sum(value) total from v$sga where name in ('Fixed Size','Variable Size')),\n" " (select bytes free from v$sgastat where pool = 'shared pool' and name = 'free memory')", "SGA used", "0800"); static toSQL SQLOverviewSGAUsed7("toTuning:Overview:SGAUsed", "select sysdate,100*(total-free)/total\n" " from (select sum(value) total from v$sga where name in ('Fixed Size','Variable Size')),\n" " (select bytes free from v$sgastat where name = 'free memory')", "", "0703"); static toSQL SQLOverviewTimescale("toTuning:Overview:Timescale", "select sysdate,0 from sys.dual", "Get timescale of other graphs"); static toSQL SQLOverviewFilespace("toTuning:Overview:Filespace", "select sum(bytes)/:f1,'Free'\n" " from sys.dba_free_space\n" "union\n" "select (total-free)/:f1,'Used'\n" " from (select sum(bytes) free from sys.dba_free_space),\n" " (select sum(bytes) total from sys.dba_data_files)", "Filespace used"); void toTuningOverview::setupChart(toResultLine *chart, const QString &title, const QString &postfix, const toSQL &sql) { chart->setMinValue(0); chart->showGrid(0); chart->showLegend(false); chart->showAxisLegend(false); chart->setTitle(title); chart->showLast(true); toQList val; if (postfix == QString::fromLatin1("b/s")) { QString unitStr(toConfigurationSingle::Instance().sizeUnit()); val.insert(val.end(), toQValue(toSizeDecode(unitStr))); unitStr += QString::fromLatin1("/s"); chart->setYPostfix(unitStr); } else chart->setYPostfix(postfix); chart->query(sql, val); } toTuningOverview::toTuningOverview(QWidget *parent, const char *name, Qt::WFlags fl) : QWidget(parent) { setupUi(this); BackgroundGroup->setLayout(new QVBoxLayout); setupChart(ArchiveWrite, tr("< Archive write"), " " + tr("blocks/s"), SQLOverviewArchiveWrite); setupChart(BufferHit, tr("Hitrate"), QString::fromLatin1("%"), SQLOverviewBufferHit); BufferHit->setMaxValue(100); BufferHit->setFlow(false); setupChart(ClientInput, tr("< Client input"), QString::fromLatin1("b/s"), SQLOverviewClientInput); setupChart(ClientOutput, tr("Client output >"), QString::fromLatin1("b/s"), SQLOverviewClientOutput); setupChart(ExecuteCount, tr("Executes >"), QString::fromLatin1("/s"), SQLOverviewExecute); setupChart(LogWrite, tr("Log writer >"), " " + tr("blocks/s"), SQLOverviewRedoBlocks); setupChart(LogicalChange, tr("Buffer changed >"), tr(" blocks/s"), SQLOverviewLogicalWrite); setupChart(LogicalRead, tr("< Buffer gets"), tr(" blocks/s"), SQLOverviewLogicalRead); setupChart(ParseCount, tr("Parse >"), QString::fromLatin1("/s"), SQLOverviewParse); setupChart(PhysicalRead, tr("< Physical read"), tr(" blocks/s"), SQLOverviewPhysicalRead); setupChart(PhysicalWrite, tr("Physical write >"), tr(" blocks/s"), SQLOverviewPhysicalWrite); setupChart(RedoEntries, tr("Redo entries >"), QString::fromLatin1("/s"), SQLOverviewRedoEntries); setupChart(Timescale, tr("Timescale"), QString::null, SQLOverviewTimescale); Timescale->showAxisLegend(true); Timescale->showLast(false); ClientChart->showGrid(0); ClientChart->showLegend(false); ClientChart->showAxisLegend(false); ClientChart->query(SQLOverviewClient); ClientChart->setFlow(false); SharedUsed->showGrid(0); SharedUsed->showLegend(false); SharedUsed->showAxisLegend(false); SharedUsed->query(SQLOverviewSGAUsed); SharedUsed->setFlow(false); SharedUsed->setMaxValue(100); SharedUsed->setYPostfix(QString::fromLatin1("%")); SharedUsed->showLast(true); try { toQList val; val.insert(val.end(), toQValue(toSizeDecode(toConfigurationSingle::Instance().sizeUnit()))); FileUsed->query(toSQL::string(SQLOverviewFilespace, toCurrentConnection(this)), (const toQList)val); } TOCATCH FileUsed->showLegend(false); Done.up(); connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); // Will be called later anyway //refresh(); } toTuningOverview::~toTuningOverview() { if (Done.getValue() == 0) { Quit = true; Done.down(); } } void toTuningOverview::stop(void) { try { disconnect(toCurrentTool(this)->timer(), SIGNAL(timeout()), this, SLOT(refresh())); } TOCATCH ArchiveWrite->stop(); BufferHit->stop(); ClientInput->stop(); ClientOutput->stop(); ExecuteCount->stop(); LogWrite->stop(); LogicalChange->stop(); LogicalRead->stop(); ParseCount->stop(); PhysicalRead->stop(); PhysicalWrite->stop(); RedoEntries->stop(); Timescale->stop(); ClientChart->stop(); SharedUsed->stop(); FileUsed->stop(); } void toTuningOverview::start(void) { try { connect(toCurrentTool(this)->timer(), SIGNAL(timeout()), this, SLOT(refresh())); } TOCATCH ArchiveWrite->start(); BufferHit->start(); ClientInput->start(); ClientOutput->start(); ExecuteCount->start(); LogWrite->start(); LogicalChange->start(); LogicalRead->start(); ParseCount->start(); PhysicalRead->start(); PhysicalWrite->start(); RedoEntries->start(); Timescale->start(); ClientChart->start(); SharedUsed->start(); FileUsed->start(); } static toSQL SQLOverviewArchive("toTuning:Overview:Archive", "select count(1),\n" " nvl(sum(blocks*block_size),0)/:f1\n" " from v$archived_log where deleted = 'NO'", "Information about archive logs", "0800"); static toSQL SQLOverviewArchive7("toTuning:Overview:Archive", "select 'N/A',\n" " 'N/A'\n" " from sys.dual where 0 != :f1", "", "0703"); static toSQL SQLOverviewLog("toTuning:Overview:Log", "select count(1),\n" " max(decode(status,'CURRENT',group#,0)),\n" " sum(decode(status,'CURRENT',bytes,0))/:f1,\n" " sum(bytes)/:f1 from v$log\n", "Information about redo logs"); static toSQL SQLOverviewTablespaces("toTuning:Overview:Tablespaces", "select count(1) from v$tablespace", "Number of tablespaces", "0800"); static toSQL SQLOverviewTablespaces7("toTuning:Overview:Tablespaces", "select count(1) from sys.dba_tablespaces", "", "0703"); static toSQL SQLOverviewSGA("toTuning:Overview:SGA", "select name,value/:f1 from v$sga", "Information about SGA"); static toSQL SQLOverviewBackground("toTuning:Overview:Background", "select substr(name,1,3),count(1) from v$bgprocess where paddr != '00'\n" " group by substr(name,1,3) order by substr(name,1,3)", "Background processes"); static toSQL SQLOverviewDedicated("toTuning:Overview:Dedicated", "select count(1) from v$session\n" " where type = 'USER' and server = 'DEDICATED'\n" " and sid not in (select nvl(sid,0) from v$px_process)", "Dedicated server process", "0801"); static toSQL SQLOverviewDedicated7("toTuning:Overview:Dedicated", "select count(1) from v$session where type = 'USER' and server = 'DEDICATED'", "", "0800"); static toSQL SQLOverviewDispatcher("toTuning:Overview:Dispatcher", "select count(1) from v$dispatcher", "Dispatcher processes"); static toSQL SQLOverviewParallell("toTuning:Overview:Parallel", "select count(1) from v$px_process", "Parallel processes", "0801"); static toSQL SQLOverviewParallell8("toTuning:Overview:Parallel", "select 'N/A' from sys.dual", "", "0800"); static toSQL SQLOverviewShared("toTuning:Overview:Shared", "select count(1) from v$shared_server", "Shared processes"); static toSQL SQLOverviewRound("toTuning:Overview:Roundtime", "select round(average_wait,2) from v$system_event\n" " where event in ('SQL*Net message from client',\n" " 'SQL*Net message to client') order by event", "Client roundtime info"); static toSQL SQLOverviewClientTotal("toTuning:Overview:ClientTotal", "select count(1),\n" " sum(decode(status,'ACTIVE',1,0))\n" " from v$session\n" " where type != 'BACKGROUND' and sid not in (select nvl(sid,0) from v$px_process)", "Information about total and active clients", "0801"); static toSQL SQLOverviewClientTotal8("toTuning:Overview:ClientTotal", "select count(1),\n" " sum(decode(status,'ACTIVE',1,0))\n" " from v$session\n" " where type != 'BACKGROUND'", "", "0800"); static toSQL SQLOverviewDatafiles("toTuning:Overview:Datafiles", "select (select count(1) from v$datafile)+(select count(1) from v$tempfile) from dual", "Number of datafiles", "0800"); static toSQL SQLOverviewDatafiles8("toTuning:Overview:Datafiles", "select count(1) from v$datafile", "", "0800"); static toSQL SQLOverviewDatafiles7("toTuning:Overview:Datafiles", "select count(1) from sys.dba_tablespaces", "", "0703"); void toTuningOverview::overviewQuery::setValue(const QString &nam, const QString &val) { if (Parent.Quit) throw 1; toLocker lock (Parent.Lock) ; Parent.Values[nam] = val; } void toTuningOverview::overviewQuery::run(void) { try { toQList val; val.insert(val.end(), toQValue(toSizeDecode(Parent.UnitString))); toQList res = toQuery::readQuery(*Parent.Connection, SQLOverviewArchive, val); QString tmp = toShift(res); tmp += QString::fromLatin1("/"); tmp += toShift(res); tmp += Parent.UnitString; setValue("ArchiveInfo", tmp); res = toQuery::readQuery(*Parent.Connection, SQLOverviewRound); tmp = toShift(res); tmp += QString::fromLatin1(" ms"); setValue("SendFromClient", tmp); tmp = toShift(res); tmp += QString::fromLatin1(" ms"); setValue("SendToClient", tmp); res = toQuery::readQuery(*Parent.Connection, SQLOverviewClientTotal); tmp = toShift(res); setValue("TotalClient", tmp); tmp = toShift(res); setValue("ActiveClient", tmp); int totJob = 0; res = toQuery::readQuery(*Parent.Connection, SQLOverviewDedicated); tmp = toShift(res); totJob += tmp.toInt(); setValue("DedicatedServer", tmp); res = toQuery::readQuery(*Parent.Connection, SQLOverviewDispatcher); tmp = toShift(res); totJob += tmp.toInt(); setValue("DispatcherServer", tmp); res = toQuery::readQuery(*Parent.Connection, SQLOverviewShared); tmp = toShift(res); totJob += tmp.toInt(); setValue("SharedServer", tmp); res = toQuery::readQuery(*Parent.Connection, SQLOverviewParallell); tmp = toShift(res); totJob += tmp.toInt(); setValue("ParallellServer", tmp); res = toQuery::readQuery(*Parent.Connection, SQLOverviewBackground); QStringList back; while (!res.empty()) { tmp = toShift(res); if (tmp == QString::fromLatin1("DBW")) tmp = QString::fromLatin1("DBWR"); else if (tmp == QString::fromLatin1("PMO")) tmp = QString::fromLatin1("PMON"); else if (tmp == QString::fromLatin1("ARC")) tmp = QString::fromLatin1("ARCH"); else if (tmp == QString::fromLatin1("CKP")) tmp = QString::fromLatin1("CKPT"); else if (tmp == QString::fromLatin1("LGW")) tmp = QString::fromLatin1("LGWR"); else if (tmp == QString::fromLatin1("LMO")) tmp = QString::fromLatin1("LMON"); else if (tmp == QString::fromLatin1("REC")) tmp = QString::fromLatin1("RECO"); else if (tmp == QString::fromLatin1("TRW")) tmp = QString::fromLatin1("TRWR"); else if (tmp == QString::fromLatin1("SMO")) tmp = QString::fromLatin1("SMON"); tmp += QString::fromLatin1(": "); QString job = toShift(res); totJob += job.toInt(); tmp += job; tmp += QString::fromLatin1(""); back << tmp; } setValue("Background", back.join(QString::fromLatin1(","))); setValue("TotalProcess", QString::number(totJob)); double tot = 0; double sql = 0; res = toQuery::readQuery(*Parent.Connection, SQLOverviewSGA, val); while (!res.empty()) { QString nam = toShift(res); tmp = toShift(res); if (nam == "Database Buffers" || nam == "Redo Buffers") setValue(nam.toLatin1(), tmp + Parent.UnitString); else if (nam == "Fixed Size" || nam == "Variable Size") sql += tmp.toDouble(); tot += tmp.toDouble(); } tmp = toQValue::formatNumber(tot); tmp += Parent.UnitString; setValue("SGATotal", tmp); tmp = toQValue::formatNumber(sql); tmp += Parent.UnitString; setValue("SharedSize", tmp); res = toQuery::readQuery(*Parent.Connection, SQLOverviewLog, val); setValue("RedoFiles", toShift(res)); setValue("ActiveRedo", toShift(res)); tmp = toShift(res); tmp += QString::fromLatin1("/"); tmp += toShift(res); tmp += Parent.UnitString; setValue("RedoSize", tmp); res = toQuery::readQuery(*Parent.Connection, SQLOverviewTablespaces); setValue("Tablespaces", toShift(res)); res = toQuery::readQuery(*Parent.Connection, SQLOverviewDatafiles); setValue("Files", toShift(res)); } catch (const QString &str) { fprintf(stderr, "Exception occured:\n\n%s\n", (const char *)str.toLatin1()); } catch (int) {} Parent.Done.up(); } void toTuningOverview::refresh(void) { try { if (Done.getValue() == 1) { Done.down(); Quit = false; Connection = &toCurrentConnection(this); UnitString = toConfigurationSingle::Instance().sizeUnit(); toThread *thread = new toThread(new overviewQuery(*this)); thread->start(); Poll.start(500); } } TOCATCH } void toTuningOverview::setValue(QLabel *label, const QString &nam) { toLocker lock (Lock) ; std::map::iterator i = Values.find(nam); if (i != Values.end()) { label->setText((*i).second); Values.erase(i); } } void toTuningOverview::poll(void) { try { setValue(ArchiveInfo, "ArchiveInfo"); setValue(SendFromClient, "SendFromClient"); setValue(SendToClient, "SendToClient"); setValue(TotalClient, "TotalClient"); setValue(ActiveClient, "ActiveClient"); setValue(DedicatedServer, "DedicatedServer"); setValue(DispatcherServer, "DispatcherServer"); setValue(SharedServer, "SharedServer"); setValue(ParallellServer, "ParallellServer"); { toLocker lock (Lock) ; std::map::iterator i = Values.find("Background"); if (i != Values.end()) { std::list::iterator labIt = Backgrounds.begin(); QStringList lst = (*i).second.split(","); for (int j = 0;j < lst.count();j++) { QLabel *label; if (labIt == Backgrounds.end() || *labIt == NULL) { label = new QLabel(BackgroundGroup); BackgroundGroup->layout()->addWidget(label); label->show(); if (labIt == Backgrounds.end()) { Backgrounds.insert(Backgrounds.end(), label); labIt = Backgrounds.end(); } else { *labIt = label; labIt++; } } else { label = *labIt; labIt++; } label->setText(lst[j]); } while (labIt != Backgrounds.end()) { delete *labIt; *labIt = NULL; labIt++; } Values.erase(i); } } setValue(TotalProcess, "TotalProcess"); setValue(BufferSize, "Database Buffers"); setValue(RedoBuffer, "Redo Buffers"); setValue(SGATotal, "SGATotal"); setValue(SharedSize, "SharedSize"); setValue(RedoFiles, "RedoFiles"); setValue(ActiveRedo, "ActiveRedo"); setValue(RedoSize, "RedoSize"); std::list &values = FileUsed->values(); std::list::iterator j = values.begin(); if (j != values.end()) { double size = 0; double used = 0; if (j != values.end()) used = size = (*j); j++; if (j != values.end()) size += (*j); QString tmp = toQValue::formatNumber(used); tmp += QString::fromLatin1("/"); tmp += toQValue::formatNumber(size); tmp += UnitString; if (tmp != Filesize->text()) Filesize->setText(tmp); } setValue(Tablespaces, "Tablespaces"); setValue(Files, "Files"); if (Done.getValue() == 1) Poll.stop(); } TOCATCH } static toSQL SQLLibraryCache("toTuning:LibraryCache", "SELECT namespace,\n" " gets \"Gets\",\n" " gethits \"Get Hits\",\n" " to_char(trunc(gethitratio*100,\n" " 1))||'%' \"-Ratio\",\n" " pins \"Pins\",\n" " pinhits \"Pin Hits\",\n" " to_char(trunc(pinhitratio*100,\n" " 1))||'%' \"-Ratio\"\n" " FROM v$librarycache", "Library cache view"); static toSQL SQLControlFiles("toTuning:ControlFileRecords", "SELECT type \"Type\",\n" " record_size \"Size\",\n" " records_total \"Total Records\",\n" " records_used \"Used Records\",\n" " round(record_size*records_total/:unt,1)||' '||:unitstr \"-Allocated\",\n" " to_char(round(records_used/records_total*100,1))||'%' \"-Used\",\n" " type \" Sort\"\n" " FROM v$controlfile_record_section\n" "UNION\n" "SELECT 'TOTAL',\n" " round(avg(record_size),1),\n" " sum(records_total),\n" " sum(records_used),\n" " round(sum(record_size*records_total/:unt),1)||' '||:unitstr,\n" " to_char(round(sum(record_size*records_used)/sum(record_size*records_total)*100,1))||'%' \"-Used\",\n" " 'ZZZZZZZZZZZZZ'\n" " FROM v$controlfile_record_section\n" "ORDER BY 7", "Control file record info"); toTuning::toTuning(QWidget *main, toConnection &connection) : toToolWidget(TuningTool, "tuning.html", main, connection, "toTuning") { if (toConfigurationSingle::Instance().tuningFirstRun()) { bool def = false; if (TOMessageBox::warning( toMainWidget(), tr("Enable all tuning statistics"), tr("Are you sure you want to enable all tuning features.\n" "This can put heavy strain on a database and unless you\n" "are the DBA you probably don't want this. Selecting\n" "no here will give you the option to enable or disable\n" "tabs individually as they are needed."), tr("Yes"), tr("&No"), QString::null, 1) == 0) { def = true; } toConfigurationSingle::Instance().setTuningOverview(def); toConfigurationSingle::Instance().setTuningFileIO(def); toConfigurationSingle::Instance().setTuningWaits(def); toConfigurationSingle::Instance().setTuningCharts(def); toConfigurationSingle::Instance().saveConfig(); } QToolBar *toolbar = toAllocBar(this, tr("Server Tuning")); layout()->addWidget(toolbar); refreshAct = toolbar->addAction( QIcon(QPixmap(const_cast(refresh_xpm))), tr("Refresh"), this, SLOT(refresh())); refreshAct->setShortcut(QKeySequence::Refresh); toolbar->addSeparator(); toolbar->addWidget(new QLabel(tr("Refresh") + " ", toolbar)); Refresh = toRefreshCreate(toolbar, TO_TOOLBAR_WIDGET_NAME); connect(Refresh, SIGNAL(activated(const QString &)), this, SLOT(changeRefresh(const QString &))); toolbar->addWidget(Refresh); // used in pulldown menu changeRefreshAct = new QAction(tr("&Change Refresh"), this); changeRefreshAct->setShortcut(Qt::ALT + Qt::Key_R); connect(changeRefreshAct, SIGNAL(triggered()), Refresh, SLOT(setFocus(void))); toolbar->addSeparator(); tabMenu = new QMenu(toolbar); tabMenu->setIcon(QIcon(QPixmap(const_cast(compile_xpm)))); tabMenu->setTitle(tr("Enable and disable tuning tabs")); toolbar->addAction(tabMenu->menuAction()); connect(tabMenu, SIGNAL(aboutToShow()), this, SLOT(showTabMenu())); connect(tabMenu, SIGNAL(triggered(QAction *)), this, SLOT(enableTabMenu(QAction *))); QLabel *stretch = new QLabel(toolbar); toolbar->addWidget(stretch); stretch->setAlignment(Qt::AlignRight | Qt::AlignVCenter); stretch->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum)); new toChangeConnection(toolbar, TO_TOOLBAR_WIDGET_NAME); Tabs = new QTabWidget(this); layout()->addWidget(Tabs); Overview = new toTuningOverview(this, "overview"); Tabs->addTab(Overview, tr("&Overview")); try { toRefreshParse(timer()); connect(timer(), SIGNAL(timeout()), Overview, SLOT(refresh())); } TOCATCH; ChartContainer = new QScrollArea(Tabs); QWidget *chartWidget = new QWidget(ChartContainer); ChartContainer->setWidget(chartWidget); ChartContainer->setWidgetResizable(true); chartWidget->setMinimumHeight(1800); Tabs->addTab(ChartContainer, tr("&Charts")); QVBoxLayout *chartBox = new QVBoxLayout; chartWidget->setLayout(chartBox); QString unitStr = toConfigurationSingle::Instance().sizeUnit(); toQList unit; unit.insert(unit.end(), toQValue(toSizeDecode(unitStr))); { std::list val = toSQL::range("toTuning:Charts"); for (std::list::iterator i = val.begin();i != val.end();i++) { QStringList parts = (*i).split(":"); if (parts.count() == 3) { parts.append(parts[2]); parts[2] = QString::fromLatin1("Charts"); } if (parts[3].mid(1, 1) == QString::fromLatin1("B")) { toResultBar *chart = new toResultBar(chartWidget); chartBox->addWidget(chart); Charts.append(chart); chart->setTitle(parts[3].mid(3)); toQList par; if (parts[3].mid(2, 1) == QString::fromLatin1("B")) chart->setYPostfix(tr(" blocks/s")); else if (parts[3].mid(2, 1) == QString::fromLatin1("M")) chart->setYPostfix(QString::fromLatin1(" ms/s")); else if (parts[3].mid(2, 1) == QString::fromLatin1("S")) { par = unit; QString t = unitStr; t += QString::fromLatin1("/s"); chart->setYPostfix(t); } else if (parts[3].mid(2, 1) == QString::fromLatin1("A")) chart->setFlow(false); else chart->setYPostfix(QString::fromLatin1("/s")); chart->query(toSQL::sql(*i), par); } else if (parts[3].mid(1, 1) == QString::fromLatin1("L") || parts[3].mid(1, 1) == QString::fromLatin1("C")) { toResultLine *chart; if (parts[3].mid(1, 1) == QString::fromLatin1("C")) chart = new toTuningMiss(chartWidget); else chart = new toResultLine(chartWidget); chartBox->addWidget(chart); Charts.append(chart); toQList par; if (parts[3].mid(2, 1) == QString::fromLatin1("B")) chart->setYPostfix(tr(" blocks/s")); else if (parts[3].mid(2, 1) == QString::fromLatin1("S")) { par = unit; QString t = unitStr; t += QString::fromLatin1("/s"); chart->setYPostfix(t); } else if (parts[3].mid(2, 1) == QString::fromLatin1("P")) { chart->setYPostfix(QString::fromLatin1(" %")); chart->setMinValue(0); } else chart->setYPostfix(QString::fromLatin1("/s")); chart->query(toSQL::sql(*i), par); } else if (parts[3].mid(1, 1) == QString::fromLatin1("P")) { toResultPie *chart = new toResultPie(chartWidget); chart->setTitle(parts[3].mid(3)); chartBox->addWidget(chart); Charts.append(chart); if (parts[3].mid(2, 1) == QString::fromLatin1("S")) { chart->query(toSQL::sql(*i), unit); chart->setPostfix(unitStr); } else chart->query(toSQL::sql(*i)); } else toStatusMessage(tr("Wrong format of name on chart (%1).").arg(QString(*i))); } } Waits = new toWaitEvents(this, "waits"); Tabs->addTab(Waits, tr("&Wait events")); FileIO = new toTuningFileIO(Tabs); connect(this, SIGNAL(connectionChange()), FileIO, SLOT(changeConnection())); Tabs->addTab(FileIO, tr("&File I/O")); Indicators = new toListView(Tabs, "indicators"); Indicators->setRootIsDecorated(true); Indicators->addColumn(tr("Indicator")); Indicators->addColumn(tr("Value")); Indicators->addColumn(tr("Reference")); Tabs->addTab(Indicators, tr("&Indicators")); Statistics = new toResultStats(Tabs, "stats"); Tabs->addTab(Statistics, tr("&Statistics")); Parameters = new toResultParam(Tabs, "parameters"); Tabs->addTab(Parameters, tr("&Parameters")); BlockingLocks = new toResultLock(Tabs, "locks"); Tabs->addTab(BlockingLocks, tr("&Blocking locks")); LibraryCache = new toResultTableView(true, false, Tabs, "cache"); LibraryCache->setSQL(SQLLibraryCache); Tabs->addTab(LibraryCache, tr("Library C&ache")); ControlFiles = new toResultTableView(true, false, Tabs, "control"); ControlFiles->setSQL(SQLControlFiles); Tabs->addTab(ControlFiles, tr("C&ontrol Files")); Options = new toResultTableView(true, false, Tabs, "options"); Options->setSQL(SQLOptions); Tabs->addTab(Options, tr("Optio&ns")); Licenses = new toResultItem(2, true, Tabs, "licenses"); Licenses->setSQL(SQLLicense); Tabs->addTab(Licenses, tr("&Licenses")); Tabs->setCurrentIndex(0); LastTab = NULL; connect(Tabs, SIGNAL(currentChanged(int)), this, SLOT(changeTab(int))); ToolMenu = NULL; connect(toMainWidget()->workspace(), SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(windowActivated(QMdiSubWindow *))); if (!toConfigurationSingle::Instance().tuningOverview()) enableTab(CONF_OVERVIEW, false); if (!toConfigurationSingle::Instance().tuningFileIO()) enableTab(CONF_FILEIO, false); if (!toConfigurationSingle::Instance().tuningWaits()) enableTab(CONF_WAITS, false); if (!toConfigurationSingle::Instance().tuningCharts()) enableTab(CONF_CHART, false); refresh(); setFocusProxy(Tabs); } QWidget *toTuning::tabWidget(const QString &name) { QWidget *widget = NULL; if (name == CONF_OVERVIEW) { widget = Overview; } else if (name == CONF_FILEIO) { widget = FileIO; } else if (name == CONF_WAITS) { widget = Waits; } else if (name == CONF_CHART) { widget = ChartContainer; } return widget; } void toTuning::showTabMenu(void) { tabMenu->clear(); std::list tab = TabList(); for (std::list::iterator i = tab.begin(); i != tab.end(); i++) { QAction *act = new QAction(tr((*i).toAscii().constData()), tabMenu); QWidget *widget = tabWidget(*i); act->setCheckable(true); if (widget && Tabs->isTabEnabled(Tabs->indexOf(widget))) act->setChecked(true); tabMenu->addAction(act); } } void toTuning::enableTabMenu(QAction *act) { if (!act) return; QWidget *widget = tabWidget(act->text()); if (widget) enableTab(act->text(), !Tabs->isTabEnabled(Tabs->indexOf(widget))); } void toTuning::enableTab(const QString &name, bool enable) { QWidget *widget = NULL; if (name == CONF_OVERVIEW) { if (enable) Overview->start(); else Overview->stop(); toConfigurationSingle::Instance().setTuningOverview(enable); widget = Overview; } else if (name == CONF_CHART) { Q_FOREACH(QWidget *child, Charts) { toResultLine *line = dynamic_cast(child); if (line) { if (enable) line->start(); else line->stop(); } toResultBar *bar = dynamic_cast(child); if (bar) { if (enable) bar->start(); else bar->stop(); } toResultPie *pie = dynamic_cast(child); if (pie) { if (enable) pie->start(); else pie->stop(); } } toConfigurationSingle::Instance().setTuningCharts(enable); widget = ChartContainer; } else if (name == CONF_WAITS) { if (enable) Waits->start(); else Waits->stop(); toConfigurationSingle::Instance().setTuningWaits(enable); widget = Waits; } else if (name == CONF_FILEIO) { if (enable) FileIO->start(); else FileIO->stop(); toConfigurationSingle::Instance().setTuningFileIO(enable); widget = FileIO; } if (widget) { int ind = Tabs->indexOf(widget); if(ind < 0) return; if(enable) Tabs->setCurrentIndex(ind); else { // qtabwidget is enabling some tabs when we disable one, // so i'm going to pick the next tab to show here for(int pos = 0; pos < Tabs->count(); pos++) { if(pos != ind && Tabs->isTabEnabled(pos)) { Tabs->setCurrentIndex(pos); break; } } } Tabs->setTabEnabled(ind, enable); } } void toTuning::changeTab(int index) { QWidget *widget = Tabs->widget(index); if (!widget || LastTab == widget) return; refresh(); } void toTuning::windowActivated(QMdiSubWindow *widget) { if (!widget) return; if (widget->widget() == this) { if (!ToolMenu) { ToolMenu = new QMenu(tr("&Tuning"), this); ToolMenu->addAction(refreshAct); ToolMenu->addAction(changeRefreshAct); toMainWidget()->addCustomMenu(ToolMenu); } } else { delete ToolMenu; ToolMenu = NULL; } } void toTuning::changeRefresh(const QString &str) { try { toRefreshParse(timer(), str); } TOCATCH } void toTuning::refresh(void) { LastTab = Tabs->currentWidget(); if (LastTab == Overview) { Overview->refresh(); } else if (LastTab == Indicators) { Indicators->clear(); std::list val = toSQL::range("toTuning:Indicators"); toTreeWidgetItem *parent = NULL; toTreeWidgetItem *last = NULL; for (std::list::iterator i = val.begin();i != val.end();i++) { try { toQList val = toQuery::readQuery(connection(), toSQL::string(*i, connection())); QStringList parts = (*i).split(":"); if (!parent || parent->text(0) != parts[2]) { parent = new toResultViewItem(Indicators, NULL, parts[2]); parent->setOpen(true); last = NULL; } QStringList dsc = toSQL::description(*i).split("."); QString first = dsc[0]; first += QString::fromLatin1("."); last = new toResultViewItem(parent, last, first); QString str; for (toQList::iterator j = val.begin();j != val.end();j++) str += *j; last->setText(1, str); if (dsc.count() > 1) last->setText(2, dsc[1]); } TOCATCH } Indicators->resizeColumnsToContents(); } else if (LastTab == Waits) Waits->refresh(); else if (LastTab == Statistics) Statistics->refreshStats(); else if (LastTab == Parameters) Parameters->refresh(); else if (LastTab == BlockingLocks) BlockingLocks->refresh(); else if (LastTab == LibraryCache) LibraryCache->refresh(); else if (LastTab == ControlFiles) { QString unit = toConfigurationSingle::Instance().sizeUnit(); ControlFiles->changeParams(QString::number(toSizeDecode(unit)), unit); } else if (LastTab == Options) Options->refresh(); else if (LastTab == Licenses) Licenses->refresh(); } void toTuning::exportData(std::map &data, const QString &prefix) { toToolWidget::exportData(data, prefix); std::list ret = TabList(); for (std::list::iterator i = ret.begin();i != ret.end();i++) { QWidget *widget = tabWidget(*i); if (widget) { if (!Tabs->isTabEnabled(Tabs->indexOf(widget))) data[prefix + ":" + *i] = QString::fromLatin1("Disabled"); } } data[prefix + ":Current"] = Tabs->currentWidget()->objectName(); Waits->exportData(data, prefix + ":Waits"); } void toTuning::importData(std::map &data, const QString &prefix) { toToolWidget::importData(data, prefix); std::list ret = TabList(); for (std::list::iterator i = ret.begin();i != ret.end();i++) enableTab(*i, data[prefix + ":" + (*i)].isEmpty()); QWidget *chld = findChild(data[prefix + ":Current"]); if (chld) Tabs->setCurrentIndex(Tabs->indexOf(chld)); Waits->importData(data, prefix + ":Waits"); } static toSQL SQLFileIO("toTuning:FileIO", "select a.name,b.name,sysdate,\n" " c.phyrds,c.phywrts,c.phyblkrd,c.phyblkwrt,\n" " c.avgiotim*10,c.miniotim*10,c.maxiortm*10,c.maxiowtm*10\n" " from v$tablespace a,v$datafile b,v$filestat c\n" " where a.ts# = b.ts# and b.file# = c.file#\n" "union\n", "select a.name,b.name,sysdate,\n" " c.phyrds,c.phywrts,c.phyblkrd,c.phyblkwrt,\n" " c.avgiotim*10,c.miniotim*10,c.maxiortm*10,c.maxiowtm*10\n" " from v$tablespace a,v$tempfile b,v$tempstat c\n" " where a.ts# = b.ts# and b.file# = c.file#\n" " order by 1,2", "Get file for files and tablespaces. Must have same columns.", "0801"); static toSQL SQLFileIO8("toTuning:FileIO", "select a.name,b.name,sysdate,\n" " c.phyrds,c.phywrts,c.phyblkrd,c.phyblkwrt,\n" " c.avgiotim*10,c.miniotim*10,c.maxiortm*10,c.maxiowtm*10\n" " from v$tablespace a,v$datafile b,v$filestat c\n" " where a.ts# = b.ts# and b.file# = c.file#\n" " order by a.name", "", "0800"); toTuningFileIO::toTuningFileIO(QWidget *parent) : QWidget(parent) { try { connect(toCurrentTool(this)->timer(), SIGNAL(timeout()), this, SLOT(refresh())); // fscking qscrollarea won't resize unless this is added QHBoxLayout *h = new QHBoxLayout; h->setSpacing(0); h->setContentsMargins(0, 0, 0, 0); QScrollArea *sa = new QScrollArea(this); h->addWidget(sa); setLayout(h); QWidget *Box = new QWidget; QVBoxLayout *vbox = new QVBoxLayout; QComboBox *combo = new QComboBox(Box); combo->addItem(tr("File I/O")); combo->addItem(tr("File timing")); if (toCurrentConnection(this).version() >= "0800") { combo->addItem(tr("Tablespace I/O")); combo->addItem(tr("Tablespace timing")); } vbox->addWidget(combo); connect(combo, SIGNAL(activated(int)), this, SLOT(changeCharts(int))); FileReads = new QWidget(Box); FileTime = new QWidget(Box); TablespaceReads = new QWidget(Box); TablespaceTime = new QWidget(Box); FileReads->setLayout(new QGridLayout); FileTime->setLayout(new QGridLayout); TablespaceReads->setLayout(new QGridLayout); TablespaceTime->setLayout(new QGridLayout); vbox->addWidget(FileReads); vbox->addWidget(FileTime); vbox->addWidget(TablespaceReads); vbox->addWidget(TablespaceTime); Box->setLayout(vbox); sa->setWidget(Box); sa->setWidgetResizable(true); changeCharts(0); CurrentStamp = 0; connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); Query = NULL; refresh(); } TOCATCH } toTuningFileIO::~toTuningFileIO() { delete Query; } void toTuningFileIO::changeCharts(int val) { FileReads->hide(); FileTime->hide(); TablespaceReads->hide(); TablespaceTime->hide(); switch (val) { case 0: FileReads->show(); break; case 1: FileTime->show(); break; case 2: TablespaceReads->show(); break; case 3: TablespaceTime->show(); break; } } void toTuningFileIO::allocCharts(const QString &name) { std::list labels; labels.insert(labels.end(), tr("Reads")); labels.insert(labels.end(), tr("Blocks Read")); labels.insert(labels.end(), tr("Writes")); labels.insert(labels.end(), tr("Blocks Written")); std::list labelTime; labelTime.insert(labelTime.end(), tr("Average")); labelTime.insert(labelTime.end(), tr("Minimum")); labelTime.insert(labelTime.end(), tr("Maximum Read")); labelTime.insert(labelTime.end(), tr("Maximum Write")); toResultBar *barchart; if (name.startsWith(QString::fromLatin1("tspc:"))) { barchart = new toResultBar(TablespaceReads); TablespaceReads->layout()->addWidget(barchart); } else { barchart = new toResultBar(FileReads); FileReads->layout()->addWidget(barchart); } ReadsCharts[name] = barchart; barchart->setTitle(name.mid(5)); barchart->setMinimumSize(200, 170); barchart->setYPostfix(tr("blocks/s")); barchart->setLabels(labels); barchart->setSQLName(QString("toTuning:FileIO:Reads:" + name)); barchart->show(); toResultLine *linechart; if (name.startsWith(QString::fromLatin1("tspc:"))) { linechart = new toResultLine(TablespaceTime); TablespaceTime->layout()->addWidget(linechart); } else { linechart = new toResultLine(FileTime); FileTime->layout()->addWidget(linechart); } TimeCharts[name] = linechart; linechart->setTitle(name.mid(5)); linechart->setMinimumSize(200, 170); linechart->setYPostfix(QString::fromLatin1("ms")); linechart->setLabels(labelTime); linechart->setSQLName(QString("toTuning:FileIO:Time:" + name)); linechart->show(); } void toTuningFileIO::saveSample(const QString &name, const QString &label, double reads, double writes, double readBlk, double writeBlk, double avgTim, double minTim, double maxRead, double maxWrite) { if (CurrentStamp != LastStamp) { std::list vals; vals.insert(vals.end(), reads); vals.insert(vals.end(), writes); vals.insert(vals.end(), readBlk); vals.insert(vals.end(), writeBlk); std::list last = LastValues[name]; std::list dispVal; if (!last.empty()) { std::list::iterator i = vals.begin(); std::list::iterator j = last.begin(); while (i != vals.end() && j != last.end()) { dispVal.insert(dispVal.end(), (*i - *j) / (CurrentStamp - LastStamp)); i++; j++; } } LastValues[name] = vals; if (ReadsCharts.find(name) == ReadsCharts.end()) allocCharts(name); if (!dispVal.empty()) { toBarChart *chart = ReadsCharts[name]; chart->addValues(dispVal, label); } vals.clear(); vals.insert(vals.end(), avgTim); vals.insert(vals.end(), minTim); vals.insert(vals.end(), maxRead); vals.insert(vals.end(), maxWrite); toLineChart *chart = TimeCharts[name]; chart->addValues(vals, label); } } void toTuningFileIO::refresh(void) { if (!Query) { try { toConnection &conn = toCurrentConnection(this); if (conn.version() < "0800") return ; toQList par; LastStamp = CurrentStamp; CurrentStamp = time(NULL); Query = new toNoBlockQuery(conn, toQuery::Background, toSQL::string(SQLFileIO, conn), par); LastTablespace = QString::null; Poll.start(100); } TOCATCH } } void toTuningFileIO::poll(void) { try { if (Query && Query->poll()) { QString tablespace; QString datafile; QString timestr; while (Query->poll()) { if (!Query->eof()) { tablespace = Query->readValueNull(); datafile = Query->readValueNull(); timestr = Query->readValueNull(); } else tablespace = QString::null; if (tablespace != LastTablespace) { if (!LastTablespace.isNull()) { QString name = QString::fromLatin1("tspc:"); name += LastTablespace; saveSample(name, timestr, TblReads, TblWrites, TblReadBlk, TblWriteBlk, TblAvg, TblMin, TblMaxRead, TblMaxWrite); } TblReads = TblWrites = TblReadBlk = TblWriteBlk = TblAvg = TblMin = TblMaxRead = TblMaxWrite = 0; LastTablespace = tablespace; } if (Query->eof()) break; double reads = Query->readValueNull().toDouble(); double writes = Query->readValueNull().toDouble(); double readBlk = Query->readValueNull().toDouble(); double writeBlk = Query->readValueNull().toDouble(); double avgTim = Query->readValueNull().toDouble(); double minTim = Query->readValueNull().toDouble(); double maxRead = Query->readValueNull().toDouble(); double maxWrite = Query->readValueNull().toDouble(); TblReads += reads; TblWrites += writes; TblReadBlk += readBlk; TblWriteBlk += writeBlk; TblAvg += avgTim; TblMin += minTim; TblMaxRead += maxRead; TblMaxWrite += maxWrite; QString name = QString::fromLatin1("file:"); name += datafile; saveSample(name, timestr, reads, writes, readBlk, writeBlk, avgTim, minTim, maxRead, maxWrite); } if (Query->eof()) { Poll.stop(); delete Query; Query = NULL; } } } TOCATCH } void toTuningFileIO::changeConnection(void) { { for (std::map::iterator i = ReadsCharts.begin(); i != ReadsCharts.end();i++) delete (*i).second; } ReadsCharts.clear(); for (std::map::iterator i = TimeCharts.begin(); i != TimeCharts.end();i++) delete (*i).second; TimeCharts.clear(); LastValues.clear(); refresh(); } toTuningMiss::toTuningMiss(QWidget *parent, const char *name) : toResultLine(parent, name) {} std::list toTuningMiss::transform(std::list &inp) { std::list ret; for (std::list::iterator i = inp.begin();i != inp.end();i++) { double first = *i; i++; if (i != inp.end()) { double second = *i; if (second == 0) ret.insert(ret.end(), 0); else ret.insert(ret.end(), first / second); } } return ret; } void toTuningFileIO::stop(void) { try { disconnect(toCurrentTool(this)->timer(), SIGNAL(timeout()), this, SLOT(refresh())); } TOCATCH } void toTuningFileIO::start(void) { try { connect(toCurrentTool(this)->timer(), SIGNAL(timeout()), this, SLOT(refresh())); } TOCATCH } tora-2.1.3/src/todebug.cpp0000644000175000017500000035406311416161766015220 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #include "utils.h" #include "toconf.h" #include "todebug.h" #include "ui_todebugchangeui.h" #include "todebugtext.h" #include "tohelp.h" #include "tohighlightedtext.h" #include "tomarkedtext.h" #include "tomain.h" #include "tooutput.h" #include "toparamget.h" #include "toresultview.h" #include "tosql.h" #include "tosqlparse.h" #include "totool.h" #include "tocodemodel.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "icons/addwatch.xpm" #include "icons/changewatch.xpm" #include "icons/close.xpm" #include "icons/compile.xpm" #include "icons/delwatch.xpm" #include "icons/enablebreak.xpm" #include "icons/execute.xpm" #include "icons/nextbug.xpm" #include "icons/prevbug.xpm" #include "icons/refresh.xpm" #include "icons/returnfrom.xpm" #include "icons/scansource.xpm" #include "icons/stepinto.xpm" #include "icons/stepover.xpm" #include "icons/stop.xpm" #include "icons/todebug.xpm" #include "icons/togglebreak.xpm" #include "icons/toworksheet.xpm" #ifdef DEBUG // Performs standard Oracle debugger selfcheck: // debug package existance, version, pipe health etc. // This is required in order not to debug debugger when // the problem is in Oracle database itself. static toSQL SQLDebugSelfCheck("toDebug:SelfCheck", "DECLARE\n" " error_message VARCHAR2(1000);\n" "BEGIN\n" " SYS.DBMS_DEBUG.SELF_CHECK;\n" " SELECT 'OK' INTO :line FROM sys.DUAL;\n" "EXCEPTION WHEN OTHERS THEN\n" " error_message := sqlerrm;\n" " SELECT error_message INTO :line FROM sys.DUAL;\n" "END;", "Perform Self-check of debugging system"); #endif class toDebugTool : public toTool { std::map Windows; virtual const char **pictureXPM(void) { return const_cast(todebug_xpm); } public: toDebugTool() : toTool(110, "PL/SQL Debugger") { } virtual const char *menuItem() { return "PL/SQL Debugger"; } // This one is called then Debug Tool is being launched by TOra user virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) { #ifdef DEBUG // perform self-check (should probably display scary message and close if this test fails) toQuery selfCheck(connection, SQLDebugSelfCheck); QString str = selfCheck.readValueNull(); qDebug() << "DBMS_DEBUG.SELF_CHECK result: " << str; #endif // Only one Debug Tool window is allowed per connection. // Therefore if Debug Tool is being launched for a connection with an already // opened Debug window - that window is activated instead of opening a new one. std::map::iterator i = Windows.find(&connection); if (i != Windows.end()) { (*i).second->raise(); (*i).second->setFocus(); return NULL; } else { QWidget *window = new toDebug(parent, connection); Windows[&connection] = window; return window; } } // toolWindow void closeWindow(toConnection &connection) { std::map::iterator i = Windows.find(&connection); if (i != Windows.end()) Windows.erase(i); } virtual bool canHandle(toConnection &conn) { // Debug Tool is only available for Oracle DB if (!toIsOracle(conn)) { return false; } #if 1 // Only Oracle DB version 8 and above can handle debugging of plsql code QString version = conn.version(); if (version.left(version.indexOf('.')).toInt() < 8) { return false; } #endif return true; } }; // class toDebugTool static toDebugTool DebugTool; // A class for a Watch dialog (adding/modifying a watch) toDebugWatch::toDebugWatch(toDebug *parent) : QDialog(parent), Debugger(parent) { setupUi(this); setModal(true); toHelp::connectDialog(this); { int curline, curcol; Debugger->currentEditor()->getCursorPosition (&curline, &curcol); Default = Debugger->currentEditor()->text(curline); while (curcol > 0 && toIsIdent(Default[curcol - 1])) curcol--; while (curcol < int(Default.length()) && !toIsIdent(Default[curcol])) curcol++; Default.replace(0, curcol, QString::null); curcol = 1; while (curcol < int(Default.length()) && toIsIdent(Default[curcol])) curcol++; Default = Default.left(curcol); } Object = Debugger->currentEditor()->object(); ScopeGroup = new QButtonGroup(Scope); ScopeGroup->addButton(LocalScope_2, 1); ScopeGroup->addButton(LocalScope, 2); ScopeGroup->addButton(Package, 3); ScopeGroup->addButton(GlobalScope, 4); connect(ScopeGroup, SIGNAL(buttonClicked(int)), this, SLOT(changeScope(int))); changeScope(1); } // toDebugWatch::toDebugWatch void toDebugWatch::changeScope(int num) { switch (num) { default: Name->clear(); Name->addItem(Default); break; case 4: { Name->clear(); QString str = Debugger->currentEditor()->schema(); str += QString::fromLatin1("."); if (!Object.isEmpty()) { str += Object; str += QString::fromLatin1("."); } str += Default; Name->addItem(str); } break; } } // toDebugWatch::changeScope toTreeWidgetItem *toDebugWatch::createWatch(toTreeWidget *watches) { QString str; switch (ScopeGroup->checkedId()) { case 1: case 5: { toResultViewItem *item = new toResultViewItem(watches, NULL); item->setText(0, QString::null); item->setText(1, QString::null); item->setText(2, Name->currentText()); item->setText(3, QString::null); item->setText(4, QString::fromLatin1("NOCHANGE")); item->setText(6, ScopeGroup->checkedId() == 5 ? "AUTO" : ""); return item; } case 3: str = Debugger->currentEditor()->schema(); str += QString::fromLatin1("."); str += Debugger->currentEditor()->object(); str += QString::fromLatin1("."); str += Name->currentText(); break; case 4: str = Name->currentText(); break; } QString schema; QString object; QString name; int pos = str.indexOf(QString::fromLatin1(".")); if (pos > 0) { schema = str.left(pos); str.remove(0, pos + 1); } else { toStatusMessage(tr("Can't parse location")); return NULL; } pos = str.indexOf(QString::fromLatin1(".")); if (pos > 0) { object = str.left(pos); str.remove(0, pos + 1); } toResultViewItem *item = new toResultViewItem(watches, NULL); item->setText(0, schema); item->setText(1, object); item->setText(2, str); item->setText(3, QString::null); item->setText(4, QString::fromLatin1("NOCHANGE")); return item; } // toDebugWatch::createWatch static toSQL SQLDebugOutputPoll("toDebugOutput:Poll", "DECLARE\n" " coll sys.dbms_debug_vc2coll;\n" " ret INTEGER;\n" " i INTEGER;\n" " line VARCHAR2(100);\n" " errm VARCHAR2(100);\n" "BEGIN\n" " SYS.DBMS_DEBUG.EXECUTE('DECLARE '||\n" " ' pp SYS.dbms_debug_vc2coll := SYS.dbms_debug_vc2coll(); '||\n" " ' line VARCHAR2(100); '||\n" " ' ret INTEGER; '||\n" " 'BEGIN '||\n" " ' SYS.DBMS_OUTPUT.GET_LINE(line,ret); '||\n" " ' pp.EXTEND(2); '||\n" " ' pp(1):=ret; '||\n" " ' pp(2):=line; '||\n" " ' :1 := pp; '||\n" " 'END;',\n" " -1,\n" " 1,\n" " coll,\n" " line);\n" " i:=coll.first;\n" " IF i IS NOT NULL THEN\n" " ret:=coll(i);\n" " IF ret = 0 THEN\n" " i:=coll.next(i);\n" " line:=coll(i);\n" " ELSE\n" " line:='';\n" " END IF;\n" " ELSE\n" " ret:=1;\n" " END IF;\n" " SELECT ret,line INTO :ret,:line FROM sys.DUAL;\n" "END;", "Poll for output in the debug session, must have same bindings"); static toSQL SQLDebugOutputDisable("toDebugOutput:Disable", "DECLARE\n" " coll sys.dbms_debug_vc2coll;\n" " errm VARCHAR2(100);\n" "BEGIN\n" " SYS.DBMS_DEBUG.EXECUTE('BEGIN SYS.DBMS_OUTPUT.DISABLE; END;',\n" " -1,\n" " 0,\n" " coll,\n" " errm);\n" "END;", "Disable output in the debug session"); static toSQL SQLDebugOutputEnable("toDebugOutput:Enable", "DECLARE\n" " coll sys.dbms_debug_vc2coll;\n" " errm VARCHAR2(100);\n" "BEGIN\n" " SYS.DBMS_DEBUG.EXECUTE('BEGIN SYS.DBMS_OUTPUT.ENABLE; END;',\n" " -1,\n" " 0,\n" " coll,\n" " errm);\n" "END;", "Enable output in the debug session"); // Class handling output from target session // Note: as this one is inherited from toOutput - by default it will be refreshing // (calling refresh(void) every N seconds (as specified in TOra preference). // As this makes no sense when debugging is stopped this refresh timer has to be // adjusted when starting/stopping debugging. class toDebugOutput : public toOutput { toDebug *Debugger; // A specific debug session, the only one having target session attached. // Attempts to call output functions from any other session will fail. toQuery * outputSession; public: toDebugOutput(toDebug *debug, QWidget *parent, toConnection &conn, toQuery *query) : toOutput(parent, conn), Debugger(debug) { outputSession = query; // One specific oracle session must be used. } virtual void refresh(void) { if (Debugger->isRunning() && enabled()) { try { int ret = -1; do { outputSession->execute(SQLDebugOutputPoll); ret = outputSession->readValue().toInt(); QString str = outputSession->readValueNull(); if (ret == 0 || str.length()) insertLine(str); } while (ret == 0); } TOCATCH } } // refresh virtual void disable(bool dis) { #ifdef DEBUG if (dis) qDebug() << "toDebugOutput::disable DISABLE!"; else qDebug() << "toDebugOutput::disable ENABLE!"; #endif if (Debugger->isRunning()) { try { if (dis) outputSession->execute(SQLDebugOutputDisable); else outputSession->execute(SQLDebugOutputEnable); } // catch (...) catch (const QString &exc) { toStatusMessage(qApp->translate( "toDebugOutput", "Couldn't enable/disable output for session")); } } } // disable virtual void closeEvent(QCloseEvent *event) { toOutput::closeEvent(event); } }; // class toDebugOutput #ifdef DEBUG // Get text version from error/return/reason code returned by DBMS_DEBUG routines // Used for debug purposes // type: 1 - error, 2 - reason, 3 - continue void toDebug::getErrorText(int code, int type, QString &ret) { if (type == 1) // error codes { switch (code) { case TO_SUCCESS: ret = "SUCCESS"; break; case TO_NO_SUCH_BREAKPOINT: ret = "NO_SUCH_BREAKPOINT"; break; case TO_ERROR_NO_DEBUG_INFO: ret = "ERROR_NO_DEBUG_INFO"; break; case TO_ERROR_ILLEGAL_LINE: ret = "ERROR_ILLEGAL_LINE"; break; case TO_ERROR_BAD_HANDLE: ret = "ERROR_BAD_HANDLE"; break; case TO_ERROR_UNIMPLEMENTED: ret = "ERROR_UNIMPLEMENTED"; break; case TO_ERROR_TIMEOUT: ret = "ERROR_TIMEOUT"; break; case TO_ERROR_NULLVALUE: ret = "ERROR_NULLVALUE"; break; case TO_ERROR_NULLCOLLECTION: ret = "ERROR_NULLCOLLECTION"; break; case TO_ERROR_INDEX_TABLE: ret = "ERROR_INDEX_TABLE"; break; case TO_ERROR_DEFERRED: ret = "ERROR_DEFERRED"; break; case TO_ERROR_EXCEPTION: ret = "ERROR_EXCEPTION"; break; case TO_ERROR_COMMUNICATION: ret = "ERROR_COMMUNICATION"; break; default: ret = "UNKNOWN ERROR CODE " + code; } // switch } else if (type == 2) // reason codes { switch (code) { case TO_REASON_WHATEVER: ret = "TO_REASON_WHATEVER (0)"; break; case TO_REASON_STARTING: ret = "TO_REASON_STARTING (2)"; break; case TO_REASON_BREAKPOINT: ret = "TO_REASON_BREAKPOINT (3)"; break; case TO_REASON_ENTER: ret = "TO_REASON_ENTER (6)"; break; case TO_REASON_RETURN: ret = "TO_REASON_RETURN (7)"; break; case TO_REASON_FINISH: ret = "TO_REASON_FINISH (8)"; break; case TO_REASON_LINE: ret = "TO_REASON_LINE (9)"; break; case TO_REASON_EXIT: ret = "TO_REASON_EXIT (15)"; break; case TO_REASON_TIMEOUT: ret = "TO_REASON_TIMEOUT (17)"; break; case TO_REASON_KNL_EXIT: ret = "TO_REASON_KNL_EXIT (25)"; break; case TO_REASON_NO_SESSION: ret = "TO_REASON_NO_SESSION (-1)"; break; default: ret = "UNKNOWN REASON CODE " + QString(code); } } else if (type == 3) // continue code { switch (code) { case TO_BREAK_ANY_CALL: ret = "TO_BREAK_ANY_CALL (12)"; break; case TO_BREAK_NEXT_LINE: ret = "TO_BREAK_NEXT_LINE (32)"; break; case TO_ABORT_EXECUTION: ret = "TO_ABORT_EXECUTION (8192)"; break; default: ret = "UNKOWN CONTINUE CODE " + code; } } else ret = "ERROR! Unknown type " + type; } // getTextVersion #endif bool toDebug::isRunning(void) { toLocker lock (Lock); return RunningTarget; } // TODO: PLSQL_DEBUG is deprecated, PLSQL_OPTIMIZE_LEVEL=1 should be used instead // Should be analysed which OracleDB versions support this new way. static toSQL SQLDebugEnable("toDebug:EnableDebug", // "ALTER SESSION SET PLSQL_DEBUG = TRUE", "ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL = 1", "Enable PL/SQL debugging"); static toSQL SQLDebugInit("toDebug:Initialize", "DECLARE\n" " ret VARCHAR2(200);\n" "BEGIN\n" " ret:=SYS.DBMS_DEBUG.INITIALIZE;\n" " SELECT ret INTO :f2 FROM sys.DUAL;\n" "END;", "Initialize the debug session, must have same bindings"); static toSQL SQLDebugOn("toDebug:DebugOn", "BEGIN\n" " SYS.DBMS_DEBUG.DEBUG_ON;\n" "END;\n", "Switch on debugging mode"); static toSQL SQLDebugOff("toDebug:DebugOff", "BEGIN\n" " SYS.DBMS_DEBUG.DEBUG_OFF;\n" "END;\n", "Switch off debugging mode"); // Target session running in a separate thread void toDebug::targetTask::run(void) { //qDebug() << "toDebug::targetTask::run"; bool debugModeOn = false; // is debug mode switched on in target session? try { // Create a target session using parameters of a current "debug" connection toQuery * targetSession = new toQuery(Parent.connection()); // give pointer of target session to main debug session so that it can cancell // this query if/when user presses "stop" button Parent.TargetQuery = targetSession; try { #ifdef DEBUG qDebug() << "toDebug::targetTask::run ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL = 1"; #endif targetSession->execute(SQLDebugEnable); } catch (...) { toLocker lock (Parent.Lock); Parent.TargetLog += QString::fromLatin1("Couldn't enable debugging for target session\n"); } try { #ifdef DEBUG qDebug() << "toDebug::targetTask::run DBMS_DEBUG.INITIALIZE"; #endif targetSession->execute(SQLDebugInit); // can't use moc from nested class QMetaObject::invokeMethod(&Parent, "enableDebugger", Qt::QueuedConnection, Q_ARG(bool, true)); toLocker lock (Parent.Lock); Parent.DebuggerStarted = true; Parent.TargetID = targetSession->readValue(); Parent.TargetLog += QString::fromLatin1("Debug session connected\n"); Parent.ChildSemaphore.up(); // resume main TOra thread } catch (const QString &exc) { QMetaObject::invokeMethod(&Parent, "enableDebugger", Qt::QueuedConnection, Q_ARG(bool, false)); toLocker lock (Parent.Lock); Parent.TargetLog += QString::fromLatin1("Couldn't start debugging:"); Parent.TargetLog += exc; Parent.DebuggerStarted = false; Parent.ChildSemaphore.up(); // resume main TOra thread delete targetSession; return; } // Do not show "busy" cursor for target task as it will be running/suspended // until the code is finished or until a user stops debugging targetSession->setShowBusy(false); while (1) // this will loop until target thread is required (while debugger tool is running) { { toLocker lock (Parent.Lock); Parent.RunningTarget = false; } #ifdef DEBUG qDebug() << "toDebug::targetTask::run sleep until TargetSemaphore goes up"; #endif Parent.TargetSemaphore.down(); #ifdef DEBUG qDebug() << "toDebug::targetTask::run TargetSemaphore up! Continue!"; #endif QString sql; bool debugTarget; toQList inParams; toQList outParams; { toLocker lock (Parent.Lock); Parent.RunningTarget = true; sql = Parent.TargetSQL; debugTarget = Parent.DebugTarget; Parent.TargetSQL = ""; #ifdef DEBUG qDebug() << "toDebug::targetTask::run Target now RUNNING! Got sql to execute/debug: " << sql; #endif inParams = Parent.InputData; Parent.InputData.clear(); // To make sure data is not shared Parent.OutputData.clear(); } // Target thread is closed when empty sql is given to be executed if (sql.isEmpty()) break; try { Parent.Lock.lock(); Parent.TargetLog += QString::fromLatin1("Executing SQL\n"); Parent.Lock.unlock(); Parent.ChildSemaphore.up(); // resume main TOra thread // Check if debug mode has to be turned on (for debbuging code) // of not (for say compilation of code in target session) if (debugTarget && !debugModeOn) { #ifdef DEBUG qDebug() << "toDebug::targetTask::run DBMS_DEBUG.DEBUG_ON"; #endif targetSession->execute(SQLDebugOn); debugModeOn = true; } else if (!debugTarget && debugModeOn) { #ifdef DEBUG qDebug() << "toDebug::targetTask::run DBMS_DEBUG.DEBUG_OFF"; #endif targetSession->execute(SQLDebugOff); debugModeOn = false; } // TODO: refresh timer should probably be restored to previously set // value rather than to a default one... Parent.Output->changeRefresh(""); // enable output refresh timer #ifdef DEBUG qDebug() << "toDebug::targetTask::run before execution of sql"; #endif outParams = targetSession->readQuery(sql, inParams); #ifdef DEBUG qDebug() << "toDebug::targetTask::run after execution of sql."; #endif } catch (const QString &str) { #ifdef DEBUG qDebug() << "toDebug::targetTask::run ERROR! catch1. str = " << str; #endif Parent.Lock.lock(); Parent.TargetLog += QString::fromLatin1("Encountered error: "); Parent.TargetLog += str; if (!str.startsWith("ORA-06543:") && // PL/SQL: execution error - execution aborted !str.startsWith("ORA-01013")) Parent.TargetException += str; Parent.TargetLog += QString::fromLatin1("\n"); Parent.Lock.unlock(); } catch (...) { #ifdef DEBUG qDebug() << "toDebug::targetTask::run ERROR! catch2"; #endif Parent.Lock.lock(); Parent.TargetLog += QString::fromLatin1("Encountered unknown exception\n"); Parent.TargetException += QString::fromLatin1("Encountered unknown exception\n"); Parent.Lock.unlock(); } Parent.Output->changeRefresh("None"); // disable debug output refresh timer { toLocker lock (Parent.Lock); Parent.OutputData = outParams; Parent.TargetLog += QString::fromLatin1("Execution ended\n"); } Parent.ChildSemaphore.up(); } // while (1) // Before closing target thread switch off debug mode in target session. // It is not mandatory to call DEBUG_OFF when ending session, but in TOra // that oracle session could be re-used (from connection pool) for something // else therefore debug mode must be switched off. if (debugModeOn) { try { qDebug() << "DBMS_DEBUG.DEBUG_OFF"; targetSession->execute(SQLDebugOff); //targetSession->disconnect(); } catch (...) { qDebug() << "We actually excpect this to fail..."; } } // TS 2010-07-10 Doesn't seem right to skipt this delete, but with it // debugger hangs on subsequent restart of debugger during // DBMS_DEBUG.INITIALIZE. targetSession->disconnect(); //delete targetSession; } TOCATCH #ifdef DEBUG qDebug() << "toDebug::targetTask::run DONE. Finishing target session."; #endif toLocker lock (Parent.Lock); Parent.DebuggerStarted = false; Parent.RunningTarget = false; // QMetaObject::invokeMethod(&Parent, // "enableDebugger", // Qt::QueuedConnection, // Q_ARG(bool, false)); Parent.TargetLog += QString::fromLatin1("Closing debug session\n"); Parent.TargetThread = NULL; Parent.ChildSemaphore.up(); // Resume main TOra thread } static toTreeWidgetItem *toLastItem(toTreeWidgetItem *parent) { toTreeWidgetItem *lastItem = NULL; for (toTreeWidgetItem *item = parent->firstChild(); item; item = item->nextSibling()) lastItem = item; return lastItem; } class toContentsItem : public toTreeWidgetItem { public: int Line; toContentsItem(toTreeWidgetItem *parent, const QString &name, int line) : toTreeWidgetItem(parent, toLastItem(parent), name) { Line = line; } toContentsItem(toTreeWidget *parent, const QString &name, const QString &id, int line) : toTreeWidgetItem(parent, name, id) { Line = line; } }; void toDebug::reorderContent(toTreeWidgetItem *parent, int start, int diff) { toTreeWidgetItem *next; for (toTreeWidgetItem *item = parent->firstChild(); item; item = next) { toContentsItem * cont = dynamic_cast(item); next = item->nextSibling(); bool del = false; if (cont) { int line = toHighlightedText::convertLine(cont->Line, start, diff); if (line >= 0) cont->Line = line; else { delete cont; del = true; } } if (!del && item->firstChild()) reorderContent(item, start, diff); } } QString toDebug::editorName(const QString &schema, const QString &object, const QString &type) { QString ret = connection().quote(schema) + "." + connection().quote(object); if (type.contains("BODY")) ret += tr(" body"); return ret; } QString toDebug::editorName(toDebugText *text) { return editorName(text->schema(), text->object(), text->type()); } QString toDebug::currentSchema(void) { return Schema->currentText(); } toTreeWidgetItem *toDebug::contents(void) { return Contents->firstChild(); } void toDebug::reorderContent(int start, int diff) { QString name = currentEditor()->objectName(); for (toTreeWidgetItem *item = Contents->firstChild(); item; item = item->nextSibling()) { if (item->text(1) == name) reorderContent(item, start, diff); } } bool toDebug::hasMembers(const QString &str) { if (str == QString::fromLatin1("PACKAGE") || str == QString::fromLatin1("PACKAGE BODY") || str == QString::fromLatin1("TYPE") || str == QString::fromLatin1("TYPE BODY")) return true; else return false; } QString toDebug::constructAnonymousBlock(toTreeWidgetItem * head, toTreeWidgetItem * last) { // Anonymous plsql block has to be constructed calling function/procedure // requested for debugging and handling return value (if any). QString curName = currentEditor()->objectName(); toHighlightedText *current = currentEditor(); int curline, curcol; current->getCursorPosition (&curline, &curcol); bool valid = false; int line = -1; // Check if it is clear which procedure/function to run. This is only a question if // package is being tested, in which case cursor must be placed on procedure/function. if (hasMembers(currentEditor()->type())) { for (toTreeWidgetItem *parent = Contents->firstChild(); parent; parent = parent->nextSibling()) { #ifdef DEBUG qDebug() << parent->text(1); #endif if (parent->text(1) == curName) { for (parent = parent->firstChild(); parent; parent = parent->nextSibling()) { toContentsItem * cont = dynamic_cast(parent); if (cont) { QString type = cont->text(0); if (cont->Line > curline) break; if (cont->Line > line) { line = cont->Line; if (type.startsWith("Procedure ") || type.startsWith("Function ")) valid = true; else valid = false; } } } break; } } } else if (currentEditor()->type() == QString::fromLatin1("PROCEDURE") || currentEditor()->type() == QString::fromLatin1("FUNCTION")) { valid = true; line = 0; } // Only procede if it is clear which procedure/function should be tested if (valid) { try { QString token; int level = 0; enum { beginning, waitingEnd, returnType, parType, inOut, name, done } state = beginning; CurrentParams.clear(); std::list::iterator cp = CurrentParams.begin(); QString callName; QString retType; toSQLParse::editorTokenizer tokens(current, 0, line); do { token = tokens.getToken(); } while (token.toUpper() == QString::fromLatin1("CREATE") || token.toUpper() == QString::fromLatin1("OR") || token.toUpper() == QString::fromLatin1("REPLACE")); if (token.toUpper() != QString::fromLatin1("FUNCTION") && token.toUpper() != QString::fromLatin1("PROCEDURE")) { toStatusMessage(tr("Expected function or procedure, internal error")); return QString(""); } do { token = tokens.getToken(); if (token.isEmpty()) { toStatusMessage(tr("Unexpected end of declaration.")); return QString(""); } if (state == returnType) { if (retType.isEmpty() || retType.at(retType.length() - 1) == '.' || token == QString::fromLatin1(".")) retType += token; else state = done; } else if (token.toUpper() == QString::fromLatin1("RETURN") && level == 0) { state = returnType; } if (token == QString::fromLatin1("(")) { level++; } else if (token == QString::fromLatin1(")")) level--; else if (level == 1) { switch (state) { case name: { debugParam newPar; CurrentParams.insert(CurrentParams.end(), newPar); cp++; (*cp).Name = token; state = inOut; break; } case inOut: if (token.toUpper() == QString::fromLatin1("IN")) { (*cp).In = true; break; } else if (token.toUpper() == QString::fromLatin1("OUT")) { (*cp).Out = true; break; } else if (token.toUpper() == QString::fromLatin1("NOCOPY")) break; if (!(*cp).In && !(*cp).Out) (*cp).In = true; state = parType; case parType: if (token == QString::fromLatin1(",")) { state = name; break; } else if (token.toUpper() == QString::fromLatin1("DEFAULT") || token == QString::fromLatin1(":=")) { state = waitingEnd; break; } else { (*cp).Type += token; } break; case waitingEnd: if (token == QString::fromLatin1(",")) state = name; else { if (token[0] == '\'' && token.length() >= 2) token = token.mid(1, token.length() - 2); if (token.toUpper() == QString::fromLatin1("NULL")) toParamGet::setDefault(connection(), (*cp).Name, QString::null); else toParamGet::setDefault(connection(), (*cp).Name, token); } break; case done: case returnType: case beginning: break; } } else if (state == beginning) { callName = token; state = name; } } while (state != done && token.toUpper() != "IS" && token.toUpper() != "AS" && token != ";"); // construct an anonymous block calling chosen procedure/function QChar sep = '('; QString sql; if (!retType.isEmpty()) sql += QString::fromLatin1("DECLARE\n ret VARCHAR2(4000);\n"); sql += QString::fromLatin1("BEGIN\n "); if (!retType.isEmpty()) sql += QString::fromLatin1("ret:="); sql += currentEditor()->schema(); sql += QString::fromLatin1("."); if (hasMembers(currentEditor()->type())) { sql += currentEditor()->object(); sql += QString::fromLatin1("."); } sql += callName; for (std::list::iterator i = CurrentParams.begin(); i != CurrentParams.end(); i++) { if ((*i).In) last = new toResultViewItem(head, last, (*i).Name); sql += sep; sql += QString::fromLatin1(":"); QString nam = (*i).Name; nam.replace(QRegExp(QString::fromLatin1("[^a-zA-Z0-9]+")), QString::fromLatin1("_")); sql += nam; sql += QString::fromLatin1(""); sep = ','; } if (sep == ',') sql += QString::fromLatin1(")"); if (!retType.isEmpty()) { sql += QString::fromLatin1(";\n SELECT ret INTO :tora_int_return FROM sys.DUAL"); } sql += QString::fromLatin1(";\nEND;"); return sql; } TOCATCH } else toStatusMessage(tr("Couldn't find any function or procedure under cursor.")); return QString(""); } // constructAnonymousBlock // Action when button "Execute/Run" is pressed void toDebug::execute(void) { //qDebug() << "toDebug::execute"; if (!DebuggerStarted) { // Actually start target session which will be running code being debugged startTarget(); } if (RunningTarget) { // If target is already running, continue to next breakpoint continueExecution(TO_BREAK_CONTINUE); return ; } // Check if current code has been modified in TOra and not committed to database. // If so - force user to compile code. if (!checkCompile()) return ; // Anonymous plsql block has to be constructed calling function/procedure // requested for debugging and handling return value (if any). Parameters->clear(); toTreeWidgetItem *head = new toResultViewItem(Parameters, NULL, tr("Input")); toTreeWidgetItem *last = NULL; head->setOpen(true); QString sql = constructAnonymousBlock(head, last); if (!sql.isEmpty()) { // Can't hold lock since refresh of output will try to lock toQList input; try { // Parse generated anonymous block and check if there are any input // parameters to be entered by user. If there are any - display a // screen asking user to do so. input = toParamGet::getParam(connection(), this, sql); } catch (...) { return ; } { toLocker lock (Lock); InputData = input; last = head->firstChild(); if (InputData.begin() != InputData.end()) for (toQList::iterator i = InputData.begin(); last && i != InputData.end(); i++, last = last->nextSibling()) { // Is there a smarter way to make a deep copy last->setText(1, toDeepCopy(*i)); } else delete head; TargetSQL = toDeepCopy(sql); // Deep copy of SQL DebugTarget = true; // switch target to debug mode, we're debuggin'! } #ifdef DEBUG qDebug() << "toDebug::execute sql has been prepared. upping TargetSemaphore!"; #endif TargetSemaphore.up(); // Go go power rangers! Target should now execute given statement ChildSemaphore.down(); // Wait until target actually runs the statement #ifdef DEBUG qDebug() << "toDebug::execute before sync()"; #endif if (sync() >= 0 && RunningTarget) continueExecution(TO_BREAK_ANY_CALL); #ifdef DEBUG qDebug() << "toDebug::execute after sync() & continueExecution"; #endif } #ifdef DEBUG qDebug() << "toDebug::execute DONE!"; #endif } // execute static toSQL SQLSync("toDebug:Sync", "DECLARE\n" " ret binary_integer;\n" " runinf SYS.DBMS_DEBUG.Runtime_Info;\n" "BEGIN\n" " ret:=SYS.DBMS_DEBUG.SYNCHRONIZE(runinf,:info);\n" " SELECT ret,\n" " runinf.Reason\n" " INTO :ret,\n" " :reason\n" " FROM sys.DUAL;\n" "END;", "Sync with the debugging session, must have same binds"); int toDebug::sync(void) { //qDebug() << "toDebug::sync"; try { toQList args; toPush(args, toQValue(0)); int ret; int reason; do { #ifdef DEBUG qDebug() << "toDebug::sync DBMS_DEBUG.SYNCHRONIZE"; #endif debugSession->execute(SQLSync, args); ret = debugSession->readValue().toInt(); reason = debugSession->readValue().toInt(); #ifdef DEBUG if (ret == TO_ERROR_COMMUNICATION) { qDebug() << "Error in communication with target session."; } QString error; getErrorText(reason, 2, error); qDebug() << "toDebug::sync ret = " << ret << ", reason = " << error; #endif { toLocker lock (Lock); TargetLog += QString::fromLatin1("Syncing debug session\n"); if (!RunningTarget) { #ifdef DEBUG qDebug() << "toDebug::sync no running target. exit"; #endif return TO_REASON_KNL_EXIT; } } #if 0 qApp->processEvents(); #endif } while (reason == TO_REASON_TIMEOUT || ret == TO_ERROR_TIMEOUT); #ifdef DEBUG QString error; getErrorText(reason, 2, error); qDebug() << "toDebug::sync got reason = " << error; #endif setDeferedBreakpoints(); if (Output->enabled()) Output->disable(false); else Output->disable(true); #ifdef DEBUG qDebug() << "toDebug::sync returning"; #endif return reason; } TOCATCH return -1; } static struct TypeMapType { const char *Type; const char *Description; bool WantName; bool Declaration; } TypeMap[] = { { "FUNCTION", "Function", true , true }, // Must be first in list { "PROCEDURE", "Procedure", true , true }, { "PACKAGE", "Package", true , true }, { "DECLARE", "Anonymous", false, true }, { "TYPE", "Type", true , false}, { "CURSOR", "Cursor", true , false}, { "IF", "Conditional", false, false}, { "LOOP", "Loop", false, false}, { "WHILE", "Loop", false, false}, { "FOR", "Loop", false, false}, { NULL, NULL, false, false} }; static bool FindKeyword(toSQLParse::statement &statements, bool onlyNames, bool &declaration, int &line, QString &name) { if (statements.Type == toSQLParse::statement::Keyword || statements.Type == toSQLParse::statement::Token) { line = statements.Line; if (name.isEmpty()) { name = statements.String.toUpper(); int j; for (j = 0; TypeMap[j].Type && TypeMap[j].Type != name; j++) ; if (TypeMap[j].Type) name = TypeMap[j].Description; else name = "Anonymous"; declaration = TypeMap[j].Declaration; if (onlyNames && !TypeMap[j].WantName) { name = QString::null; return true; } return !TypeMap[j].WantName; } else if (statements.String.toUpper() != "BODY") { name += " " + statements.String; return true; } else name += " body"; } for (std::list::iterator i = statements.subTokens().begin(); i != statements.subTokens().end(); i++) { bool ret = FindKeyword(*i, onlyNames, declaration, line, name); if (ret) return ret; } return false; } void toDebug::updateArguments(toSQLParse::statement &statements, toTreeWidgetItem *parent) { for (std::list::iterator i = statements.subTokens().begin(); i != statements.subTokens().end(); i++) { if ((*i).Type == toSQLParse::statement::List) { bool first = true; for (std::list::iterator j = (*i).subTokens().begin(); j != (*i).subTokens().end(); j++) { if ((*j).String == ",") first = true; else if (first) { new toContentsItem(parent, "Parameter " + (*j).String, (*j).Line); first = false; } } } } } void toDebug::updateContent(toSQLParse::statement &statements, toTreeWidgetItem *parent, const QString &id) { toTreeWidgetItem *item = NULL; int line; QString name; bool declaration; if (!FindKeyword(statements, statements.Type == toSQLParse::statement::Statement, declaration, line, name) || name.isNull()) return ; if (parent) item = new toContentsItem(parent, name, line); else { for (item = Contents->firstChild(); item; item = item->nextSibling()) if (item->text(0) == name && item->text(1) == id) { item->setText(2, QString::null); break; } if (!item) item = new toContentsItem(Contents, name, id, line); else { while (item->firstChild()) delete item->firstChild(); toContentsItem *ci = dynamic_cast(item); if (ci) ci->Line = line; } item->setOpen(true); } std::list::iterator i = statements.subTokens().begin(); if (statements.Type == toSQLParse::statement::Block) { if (i != statements.subTokens().end()) { updateArguments(*i, item); i++; } } else { updateArguments(statements, item); if (i != statements.subTokens().end()) i++; } while (i != statements.subTokens().end()) { if ((*i).Type == toSQLParse::statement::Block || (*i).Type == toSQLParse::statement::Statement) { if (declaration) { std::list::iterator j = (*i).subTokens().begin(); if (j != (*i).subTokens().end()) { if ((*j).String.toUpper() == "BEGIN") declaration = false; else if ((*j).Type == toSQLParse::statement::Token && (*j).String.toUpper() != "END") new toContentsItem(item, "Variable " + (*j).String, (*j).Line); } } updateContent(*i, item); } i++; } if (!parent && !item->firstChild()) delete item; } void toDebug::updateContent(toDebugText *current) { toSQLParse::editorTokenizer tokenizer(current); std::list statements = toSQLParse::parse(tokenizer); toTreeWidgetItem *item; for (item = Contents->firstChild(); item; item = item->nextSibling()) if (item->text(1) == current->objectName()) item->setText(2, "DELETE"); for (std::list::iterator i = statements.begin(); i != statements.end(); i++) updateContent(*i, NULL, current->objectName()); toTreeWidgetItem *ni; for (item = Contents->firstChild(); item; item = ni) { ni = item->nextSibling(); if (item->text(2) == "DELETE") delete item; } } void toDebug::readLog(void) { #ifdef DEBUG qDebug() << "toDebug::readLog"; #endif toLocker lock (Lock); if (!TargetLog.isEmpty()) { TargetLog.replace(TargetLog.length() - 1, 1, QString::null); RuntimeLog->insert(TargetLog); RuntimeLog->setCursorPosition(RuntimeLog->lines() - 1, 0); TargetLog = QString::null; } if (!TargetException.isEmpty()) { toStatusMessage(TargetException); TargetException = QString::null; } } static toSQL SQLRuntimeInfo("toDebug:RuntimeInfo", "DECLARE\n" " info SYS.DBMS_DEBUG.RUNTIME_INFO;\n" " ret BINARY_INTEGER;\n" "BEGIN\n" " ret:=SYS.DBMS_DEBUG.GET_RUNTIME_INFO(SYS.DBMS_DEBUG.info_getStackDepth,info);\n" " SELECT ret,info.stackDepth INTO :ret,:depth FROM sys.DUAL;\n" "EXCEPTION WHEN OTHERS THEN\n" " SELECT -1,-1 INTO :ret,:depth FROM sys.DUAL;\n" "END;", "Get runtime info from debug session, must have same bindings"); static toSQL SQLStackTrace("toDebug:StackTrace", "DECLARE\n" " info SYS.DBMS_DEBUG.PROGRAM_INFO;\n" " stack SYS.DBMS_DEBUG.BACKTRACE_TABLE;\n" " i BINARY_INTEGER;\n" "BEGIN\n" " SYS.DBMS_DEBUG.PRINT_BACKTRACE(stack);\n" " i:=:num;\n" " info:=stack(i);\n" " SELECT info.Name,info.Owner,info.Line#,DECODE(info.LibunitType,SYS.DBMS_DEBUG.LibunitType_cursor,'CURSOR',\n" " SYS.DBMS_DEBUG.LibunitType_function,'FUNCTION',\n" " SYS.DBMS_DEBUG.LibunitType_procedure,'PROCEDURE',\n" " SYS.DBMS_DEBUG.LibunitType_package,'PACKAGE',\n" " SYS.DBMS_DEBUG.LibunitType_package_body,'PACKAGE BODY',\n" " SYS.DBMS_DEBUG.LibunitType_trigger,'TRIGGER',\n" " 'UNKNOWN')\n" " INTO :name,:owner,:line,:type FROM sys.DUAL;\n" "END;", "Get stacktrace from debug session, must have same bindings"); static toSQL SQLLocalWatch("toDebug:LocalWatch", "DECLARE\n" " ret BINARY_INTEGER;\n" " data VARCHAR2(4000);\n" "BEGIN\n" " ret:=SYS.DBMS_DEBUG.GET_VALUE(:name,0,data,NULL);\n" " SELECT ret,data INTO :ret,:val FROM sys.DUAL;\n" "END;", "Get data from local watch, must have same bindings"); static toSQL SQLGlobalWatch("toDebug:GlobalWatch", "DECLARE\n" " data VARCHAR2(4000);\n" " proginf SYS.DBMS_DEBUG.program_info;\n" " ret BINARY_INTEGER;\n" "BEGIN\n" " proginf.Namespace:=SYS.DBMS_DEBUG.Namespace_pkg_body;\n" " proginf.Name:=:object;\n" " proginf.Owner:=:owner;\n" " proginf.DBLink:=NULL;\n" " ret:=SYS.DBMS_DEBUG.GET_VALUE(:name,proginf,data,NULL);\n" " IF ret =SYS.DBMS_DEBUG.error_no_such_object THEN\n" " proginf.Namespace:=SYS.DBMS_DEBUG.namespace_pkgspec_or_toplevel;\n" " ret:=SYS.DBMS_DEBUG.GET_VALUE(:name,proginf,data,NULL);\n" " END IF;\n" " SELECT ret ,data ,proginf.Namespace\n" " INTO :ret,:val,:namespace\n" " FROM sys.DUAL;\n" "END;", "Get data from global watch, must have same bindings"); static toSQL SQLLocalIndex("toDebug:LocalIndex", "DECLARE\n" " ret BINARY_INTEGER;\n" " proginf SYS.DBMS_DEBUG.program_info;\n" " i BINARY_INTEGER;\n" " indata SYS.DBMS_DEBUG.index_table;\n" " outdata VARCHAR2(4000);\n" "BEGIN\n" " ret:=SYS.DBMS_DEBUG.GET_INDEXES(:name,0,proginf,indata);\n" " IF ret = SYS.DBMS_DEBUG.success THEN\n" " i:=indata.first;\n" " WHILE i IS NOT NULL AND (LENGTH(outdata)<3900 OR outdata IS NULL) LOOP\n" " outdata:=outdata||indata(i)||',';\n" " i:=indata.next(i);\n" " END LOOP;\n" " END IF;\n" " SELECT outdata INTO :data FROM sys.DUAL;\n" "END;", "Get indexes of local watch, must have same bindings"); static toSQL SQLGlobalIndex("toDebug:GlobalIndex", "DECLARE\n" " ret BINARY_INTEGER;\n" " proginf SYS.DBMS_DEBUG.program_info;\n" " i BINARY_INTEGER;\n" " indata SYS.DBMS_DEBUG.index_table;\n" " outdata VARCHAR2(4000);\n" "BEGIN\n" " proginf.Namespace:=:namespace;\n" " proginf.Name:=:object;\n" " proginf.Owner:=:owner;\n" " proginf.DBLink:=NULL;\n" " ret:=SYS.DBMS_DEBUG.GET_INDEXES(:name,NULL,proginf,indata);\n" " IF ret = SYS.DBMS_DEBUG.success THEN\n" " i:=indata.first;\n" " WHILE i IS NOT NULL AND (LENGTH(outdata)<3900 OR outdata IS NULL) LOOP\n" " outdata:=outdata||indata(i)||',';\n" " i:=indata.next(i);\n" " END LOOP;\n" " END IF;\n" " SELECT outdata INTO :data FROM sys.DUAL;\n" "END;", "Get indexes of global watch, must have same bindings"); // Called from updateState. Processes watches. void toDebug::processWatches(void) { toTreeWidgetItem *next = NULL; for (toTreeWidgetItem *item = Watch->firstChild(); item; item = next) { #ifdef DEBUG qDebug() << "toDebug::processWatches watch = " << item->text(2); #endif int ret = -1; int space = 0; QString value; bool local = false; QString object; QString schema; if (!item->text(6).isEmpty()) { local = true; /* Get value of given variable. Note, that this call can semi-fail raising exception telling that given object/variable is: * The object is a table, but no index was provided * Value of current variable is NULL */ debugSession->execute(SQLLocalWatch, item->text(2)); ret = debugSession->readValue().toInt(); value = debugSession->readValue(); if (ret != TO_SUCCESS && ret != TO_ERROR_NULLVALUE && ret != TO_ERROR_INDEX_TABLE && ret != TO_ERROR_NULLCOLLECTION) { object = currentEditor()->object(); schema = currentEditor()->schema(); local = false; debugSession->execute(SQLGlobalWatch, object, schema, item->text(2)); ret = debugSession->readValue().toInt(); value = debugSession->readValue(); space = debugSession->readValue().toInt(); item->setText(0, schema); item->setText(1, object); } } else if (item->text(0).isEmpty()) { debugSession->execute(SQLLocalWatch, item->text(2)); ret = debugSession->readValue().toInt(); value = debugSession->readValue(); local = true; } else { object = item->text(1); schema = item->text(0); debugSession->execute(SQLGlobalWatch, object, schema, item->text(2)); ret = debugSession->readValue().toInt(); value = debugSession->readValue(); space = debugSession->readValue().toInt(); local = false; } item->setText(4, QString::null); if (ret == TO_SUCCESS) item->setText(3, value); else if (ret == TO_ERROR_NULLVALUE) { if (toConfigurationSingle::Instance().indicateEmpty()) item->setText(3, QString::fromLatin1("{null}")); else item->setText(3, QString::null); item->setText(5, QString::fromLatin1("NULL")); } else if (ret == TO_ERROR_NULLCOLLECTION) { item->setText(3, tr("[Count %1]").arg(0)); item->setText(5, QString::fromLatin1("LIST")); } else if (ret == TO_ERROR_INDEX_TABLE) { if (local) { // this call get's a list of indexes separated with comma (with trailing comma) // example: -1,0,1,2,5,8, debugSession->execute(SQLLocalIndex, item->text(2)); value = debugSession->readValue(); } else { toQList args; toPush(args, toQValue(space)); toPush(args, toQValue(object)); toPush(args, toQValue(schema)); toPush(args, toQValue(item->text(2))); debugSession->execute(SQLGlobalIndex, args); value = debugSession->readValue(); } int start = 0; int end; toTreeWidgetItem *last = NULL; int num = 0; for (end = start; end < value.length(); end++) { if (value.at(end) == ',') { if (start < end) { QString name = item->text(2); name += QString::fromLatin1("("); name += QString::number(value.mid(start, end - start).toInt()); name += QString::fromLatin1(")"); last = new toResultViewItem(item, last); last->setText(0, schema); last->setText(1, object); last->setText(2, name); last->setText(3, value.mid(start, end - start)); last->setText(4, QString::fromLatin1("NOCHANGE")); num++; } start = end + 1; } } QString str = tr("[Count %1]").arg(num); item->setText(3, str); item->setText(5, QString::fromLatin1("LIST")); } else { item->setText(3, ret == TO_ERROR_NO_DEBUG_INFO ? tr("{No debug info}") : tr("{Unavailable}")); item->setText(4, QString::fromLatin1("NOCHANGE")); } if (item->firstChild()) next = item->firstChild(); else if (item->nextSibling()) next = item->nextSibling(); else { next = item; do { next = next->parent(); } while (next && !next->nextSibling()); if (next) next = next->nextSibling(); } } } // processWatches // Update state of different GUI elements of debugger tool depending on a state of debugging // If debugging session is running this will additionally fetch stack info and display it // in corresponding controls. void toDebug::updateState(int reason) { #ifdef DEBUG QString error; getErrorText(reason, 2, error); qDebug() << "toDebug::updateState, reason = " << error; #endif switch (reason) { case TO_REASON_EXIT: case TO_REASON_KNL_EXIT: qDebug() << "stopping... ChildSemaphore.down()"; ChildSemaphore.down(); qDebug() << "target stopped. continuing"; // query (session) in target is marked as "cancelled" thus unusable // therefore we have to finish it by sending SQL=""... if (manualStopping) { { toLocker lock (Lock); QString emptySql(""); TargetSQL = toDeepCopy(emptySql); } TargetSemaphore.up(); // resume target session (it should quit) ChildSemaphore.down(); // wait until target session finishes qDebug() << "target THREAD has been STOPPED"; manualStopping = false; } // Intentionally no break here case TO_REASON_NO_SESSION: stopAct->setEnabled(false); stepAct->setEnabled(false); nextAct->setEnabled(false); returnAct->setEnabled(false); { for (int i = 0; i < Editors->count(); i++) { toDebugText *editor = dynamic_cast(Editors->widget(i)); editor->setCurrent( -1); } StackTrace->clear(); toLocker lock (Lock); if (OutputData.begin() != OutputData.end()) { toTreeWidgetItem *head = Parameters->firstChild(); while (head && head->nextSibling()) head = head->nextSibling(); head = new toResultViewItem(Parameters, head, tr("Output")); head->setOpen(true); std::list::iterator cp; for (cp = CurrentParams.begin(); cp != CurrentParams.end() && !(*cp).Out; cp++) ; toTreeWidgetItem *last = NULL; { for (toQList::iterator i = OutputData.begin(); i != OutputData.end(); i++) { QString name; if (cp != CurrentParams.end()) { name = (*cp).Name; for (cp++; cp != CurrentParams.end() && !(*cp).Out; cp++) ; } if (name.isEmpty()) name = tr("Returning"); last = new toResultViewItem(head, last, name); last->setText(1, toDeepCopy(*i)); // Deep copy just to be sure } } } toTreeWidgetItem *next = NULL; for (toTreeWidgetItem *item = Watch->firstChild(); item; item = next) { item->setText(4, QString::fromLatin1("NOCHANGE")); if (item->firstChild()) next = item->firstChild(); else if (item->nextSibling()) next = item->nextSibling(); else { next = item; do { next = next->parent(); } while (next && !next->nextSibling()); if (next) next = next->nextSibling(); } } } break; default: debugPaneAct->setChecked(true); stopAct->setEnabled(true); stepAct->setEnabled(true); nextAct->setEnabled(true); returnAct->setEnabled(true); try { #ifdef DEBUG qDebug() << "toDebug::updateState DBMS_DEBUG.GET_RUNTIME_INFO"; #endif debugSession->execute(SQLRuntimeInfo); int ret, depth; ret = debugSession->readValue().toInt(); depth = debugSession->readValue().toInt(); #ifdef DEBUG qDebug() << "toDebug::updateState ret = " << ret << ", depth = " << depth; #endif if (ret != TO_SUCCESS) { QString reason; toStatusMessage(tr("Failed to get runtime info (Reason %1)").arg(ret)); #ifdef DEBUG QString error; getErrorText(ret, 1/*error*/, error); qDebug() << "toDebug::updateState FAILED to get runtime info. Reason " << error; #endif return ; } toTreeWidgetItem *item = NULL; StackTrace->clear(); QString name; QString schema; QString line; QString type; for (int num = 2; num <= depth; num++) { toQList args; toPush(args, toQValue(num)); #ifdef DEBUG qDebug() << "toDebug::updateState DBMS_DEBUG.PRINT_BACKTRACE depth=" << num; #endif debugSession->execute(SQLStackTrace, args); name = debugSession->readValue(); schema = debugSession->readValue(); line = debugSession->readValue(); type = debugSession->readValue(); if (!item) item = new toTreeWidgetItem(StackTrace, name, line, schema, type); else item = new toTreeWidgetItem(item, name, line, schema, type); item->setOpen(true); } Output->refresh(); try { for (toTreeWidgetItem *item = Watch->firstChild(); item; item = item->nextSibling()) { while (item->firstChild()) delete item->firstChild(); } processWatches(); } TOCATCH // Stack depth of 1 means that control is in TOra generated anonymous // block. Therefore we should continue until control is in at least // depth 2 - in function/procedure being debugged. if (depth >= 2) { viewSource(schema, name, type, line.toInt(), true); } else { if (RunningTarget) continueExecution(TO_BREAK_ANY_CALL); // break any call will go INTO code being debugged return ; } } TOCATCH break; } selectedWatch(); readLog(); } // updateState #if 0 // Not used yet QString toDebug::checkWatch(const QString &name) { int ret = -1; int space = 0; bool local; QString object; QString schema; QString value; local = true; toQuery query(connection(), SQLLocalWatch, name); ret = query.readValue().toInt(); value = query.readValue(); if (ret != TO_SUCCESS && ret != TO_ERROR_NULLVALUE && ret != TO_ERROR_INDEX_TABLE && ret != TO_ERROR_NULLCOLLECTION) { object = currentEditor()->object(); schema = currentEditor()->schema(); local = false; toQuery q2(connection(), SQLGlobalWatch, object, schema, name); ret = q2.readValue().toInt(); value = q2.readValue(); space = q2.readValue().toInt(); } if (ret == TO_SUCCESS) return value; else if (ret == TO_ERROR_NULLVALUE) return "{null}"; else if (ret == TO_ERROR_NULLCOLLECTION) return tr("[Count %1]").arg(0); else if (ret == TO_ERROR_INDEX_TABLE) { if (local) { toQuery query(connection(), SQLLocalIndex, name); value = query.readValue(); } else { toQList args; toPush(args, toQValue(space)); toPush(args, toQValue(object)); toPush(args, toQValue(schema)); toPush(args, toQValue(name)); toQuery query(connection(), SQLGlobalIndex, args); value = query.readValue(); } unsigned int start = 0; unsigned int end; int num = 0; QString ret; for (end = start; end < value.length(); end++) { if (value.at(end) == ',') { if (start < end) { ret += "\n" + value.mid(start, end - start); num++; } start = end + 1; } } return tr("[Count %1]").arg(num) + ret; } return QString::null; } #endif bool toDebug::viewSource(const QString &schema, const QString &name, const QString &type, int line, bool setCurrent) { try { toDebugText *editor = NULL; int row = line - 1; int col = 0; for (int i = 0; i < Editors->count(); i++) { QString tabname = editorName(schema, name, type); toDebugText *te = dynamic_cast(Editors->widget(i)); if (Editors->tabText(Editors->indexOf(te)) == tabname) { editor = te; break; } if (Editors->tabText(Editors->indexOf(te)) == tr("Unknown") && !te->isModified()) editor = te; } if (!editor) { editor = new toDebugText(Breakpoints, Editors, this); // signal removed with qscintilla port. // connect(editor, SIGNAL(insertedLines(int, int)), // this, SLOT(reorderContent(int, int))); Editors->addTab(editor, editorName(editor)); } else { editor->getCursorPosition(&row, &col); } if (editor->lines() <= 1) { editor->setData(schema, type, name); editor->readData(connection(), StackTrace); updateContent(editor); Editors->setTabText(Editors->indexOf(editor), editorName(editor)); if (editor->hasErrors()) Editors->setTabIcon(Editors->indexOf(editor), QIcon(QPixmap(const_cast(nextbug_xpm)))); else Editors->setTabIcon(Editors->indexOf(editor), QIcon()); } Editors->setCurrentIndex(Editors->indexOf(editor)); editor->setCursorPosition(row, col); if (setCurrent) editor->setCurrent(line - 1); editor->setFocus(); return true; } catch (const QString &str) { toStatusMessage(str); return false; } } void toDebug::setDeferedBreakpoints(void) { #ifdef DEBUG qDebug() << "toDebug::setDeferedBreakpoints"; #endif for (toTreeWidgetItem *item = Breakpoints->firstChild(); item; item = item->nextSibling()) { toBreakpointItem * point = dynamic_cast(item); if (point) { if (point->text(4) == tr("DEFERED")) point->setBreakpoint(); } } } static toSQL SQLContinue("toDebug:Continue", "DECLARE\n" " runinf SYS.DBMS_DEBUG.runtime_info;\n" " ret BINARY_INTEGER;\n" "BEGIN\n" " ret:=SYS.DBMS_DEBUG.CONTINUE(runinf,:break,NULL);\n" " SELECT ret,\n" " runinf.Reason\n" " INTO :ret,\n" " :reason\n" " FROM sys.DUAL;\n" "END;", "Continue execution, must have same bindings"); static toSQL SQLDetach("toDebug:Detach", "BEGIN\n" " SYS.DBMS_DEBUG.DETACH_SESSION;\n" "END;", "Disconnect from the debugging session"); int toDebug::continueExecution(int stopon) { #ifdef DEBUG QString error; getErrorText(stopon, 3, error); qDebug() << "toDebug::continueExecution(" << error << ")"; #endif Lock.lock(); if (RunningTarget) { Lock.unlock(); try { int ret, reason; if (stopon == TO_ABORT_EXECUTION && manualStopping) // no point to set breakpoints when aborting execution { // When stopping target session we have to cancel corresponding query rather // than sending a ABORT_EXECUTION signal (which apparently kills whole target // session TargetQuery->cancel(); debugSession->execute(SQLDetach); reason = TO_REASON_KNL_EXIT; } // if stopon != TO_ABORT_EXECUTION else { setDeferedBreakpoints(); while (1) { toQList args; toPush(args, toQValue(stopon)); debugSession->execute(SQLContinue, args); ret = debugSession->readValue().toInt(); reason = debugSession->readValue().toInt(); #ifdef DEBUG qDebug() << "toDebug::continueExecution ret=" << ret << ", reason=" << reason; #endif if (reason == TO_REASON_TIMEOUT || ret == TO_ERROR_TIMEOUT) { reason = sync(); if (reason < 0) ret = -1; else ret = TO_SUCCESS; } if (ret != TO_SUCCESS) return -1; if (reason != TO_REASON_STARTING) break; } } updateState(reason); return reason; } TOCATCH } else { toStatusMessage(tr("No running target")); Lock.unlock(); readLog(); } return -1; } // Executes given statement (with given parameters) in target session in DEBUG mode. // Currently this is only called to compile code in target session /*void toDebug::executeInTarget(const QString &str, toQList ¶ms) { #ifdef DEBUG qDebug() << "toDebug::executeInTarget 1" << str; #endif toBusy busy; { toLocker lock (Lock); TargetSQL = toDeepCopy(str); DebugTarget = false; // this is a compile statement, it must not be debugged InputData = params; TargetSemaphore.up(); } }*/ // Stops execution of a running target session void toDebug::stop(void) { if (RunningTarget) { manualStopping = true; continueExecution(TO_ABORT_EXECUTION); } } toDebug::toDebug(QWidget *main, toConnection &connection) : toToolWidget(DebugTool, "debugger.html", main, connection, "toDebug"), TargetThread() { debugSession = new toQuery(connection); createActions(); QToolBar *toolbar = toAllocBar(this, tr("Debugger")); layout()->addWidget(toolbar); toolbar->addAction(refreshAct); toolbar->addSeparator(); Schema = new QComboBox(toolbar); Schema->setObjectName(TO_TOOLBAR_WIDGET_NAME); toolbar->addWidget(Schema); connect(Schema, SIGNAL(activated(int)), this, SLOT(changeSchema(int))); toolbar->addSeparator(); toolbar->addAction(newSheetAct); toolbar->addAction(scanSourceAct); toolbar->addAction(compileAct); toolbar->addSeparator(); toolbar->addAction(executeAct); toolbar->addAction(stopAct); toolbar->addSeparator(); toolbar->addAction(stepAct); toolbar->addAction(nextAct); toolbar->addAction(returnAct); toolbar->addSeparator(); toolbar->addAction(debugPaneAct); toolbar->addSeparator(); toolbar->addAction(nextErrorAct); toolbar->addAction(previousErrorAct); toolbar->addSeparator(); toolbar->addAction(toggleBreakAct); toolbar->addAction(disableBreakAct); toolbar->addSeparator(); toolbar->addAction(addWatchAct); toolbar->addAction(deleteWatchAct); toolbar->addAction(changeWatchAct); toolbar->addWidget(new toSpacer()); // these buttons should only be enabled after starting debug process stopAct->setEnabled(false); stepAct->setEnabled(false); nextAct->setEnabled(false); returnAct->setEnabled(false); QSplitter *splitter = new QSplitter(Qt::Vertical, this); layout()->addWidget(splitter); QSplitter *hsplitter = new QSplitter(Qt::Horizontal, splitter); DebugTabs = new QTabWidget(splitter); DebugTabs->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum)); DebugTabs->setMinimumHeight(1); QList sizes = splitter->sizes(); sizes[1] = 200; splitter->setSizes(sizes); DebugTabs->hide(); //splitter->setResizeMode(DebugTabs, QSplitter::KeepSize); QSplitter *objSplitter = new QSplitter(Qt::Vertical, hsplitter); Objects = new QTreeView(objSplitter); CodeModel = new toCodeModel(Objects); Objects->setModel(CodeModel); QString selected = Schema->currentText(); if (!selected.isEmpty()) CodeModel->refresh(connection, selected); // Objects->setSelectionMode(toTreeWidget::Single); // Objects->setResizeMode(toTreeWidget::AllColumns); connect(Objects->selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(changePackage(const QModelIndex &, const QModelIndex &))); Contents = new toListView(objSplitter); Contents->addColumn(tr("Contents")); Contents->setRootIsDecorated(true); Contents->setSorting( -1); Contents->setTreeStepSize(10); Contents->setSelectionMode(toTreeWidget::Single); Contents->setResizeMode(toTreeWidget::AllColumns); connect(Contents, SIGNAL(selectionChanged(toTreeWidgetItem *)), this, SLOT(changeContent(toTreeWidgetItem *))); StackTrace = new toListView(DebugTabs); StackTrace->addColumn(tr("Object")); StackTrace->addColumn(tr("Line")); StackTrace->addColumn(tr("Schema")); StackTrace->addColumn(tr("Type")); StackTrace->setColumnAlignment(1, Qt::AlignRight); StackTrace->setSorting( -1); StackTrace->setRootIsDecorated(true); StackTrace->setTreeStepSize(10); StackTrace->setAllColumnsShowFocus(true); StackTrace->setResizeMode(toTreeWidget::AllColumns); DebugTabs->addTab(StackTrace, tr("&Stack Trace")); connect(StackTrace, SIGNAL(clicked(toTreeWidgetItem *)), this, SLOT(showSource(toTreeWidgetItem *))); Watch = new toListView(DebugTabs); Watch->addColumn(tr("Schema")); Watch->addColumn(tr("Object")); Watch->addColumn(tr("Variable")); Watch->addColumn(tr("Data")); Watch->setRootIsDecorated(true); Watch->setTreeStepSize(10); Watch->setAllColumnsShowFocus(true); Watch->setResizeMode(toTreeWidget::AllColumns); DebugTabs->addTab(Watch, tr("W&atch")); Watch->setSelectionMode(toTreeWidget::Single); connect(Watch, SIGNAL(selectionChanged(void)), this, SLOT(selectedWatch(void))); connect(Watch, SIGNAL(doubleClicked(toTreeWidgetItem *)), this, SLOT(changeWatch(toTreeWidgetItem *))); Breakpoints = new toListView(DebugTabs); Breakpoints->addColumn(tr("Object")); Breakpoints->addColumn(tr("Line")); Breakpoints->addColumn(tr("Schema")); Breakpoints->addColumn(tr("Object Type")); Breakpoints->addColumn(tr("Enabled")); Breakpoints->setColumnAlignment(1, Qt::AlignRight); Breakpoints->setSorting( -1); Breakpoints->setAllColumnsShowFocus(true); Breakpoints->setResizeMode(toTreeWidget::AllColumns); DebugTabs->addTab(Breakpoints, tr("&Breakpoints")); connect(Breakpoints, SIGNAL(clicked(toTreeWidgetItem *)), this, SLOT(showSource(toTreeWidgetItem *))); Parameters = new toListView(DebugTabs); Parameters->addColumn(tr("Name")); Parameters->addColumn(tr("Content")); Parameters->setSorting( -1); Parameters->setTreeStepSize(10); Parameters->setRootIsDecorated(true); Parameters->setAllColumnsShowFocus(true); Parameters->setResizeMode(toTreeWidget::AllColumns); DebugTabs->addTab(Parameters, tr("&Parameters")); Output = new toDebugOutput(this, DebugTabs, connection, debugSession); Output->changeRefresh("None"); // disable output refresh timer until debugging starts DebugTabs->addTab(Output, tr("Debug &Output")); RuntimeLog = new toMarkedText(DebugTabs); DebugTabs->addTab(RuntimeLog, tr("&Runtime Log")); Editors = new QTabWidget(hsplitter); Editors->setTabPosition(QTabWidget::North); #if QT_VERSION >= 0x040500 Editors->setTabsClosable(true); connect(Editors, SIGNAL(tabCloseRequested(int)), this, SLOT(closeEditor(int))); #endif QToolButton *closeButton = new toPopupButton(Editors); closeButton->setIcon(QPixmap(const_cast(close_xpm))); closeButton->setFixedSize(20, 18); connect(closeButton, SIGNAL(clicked()), this, SLOT(closeEditor())); Editors->setCornerWidget(closeButton); setFocusProxy(Editors); newSheet(); ToolMenu = NULL; connect(toMainWidget()->workspace(), SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(windowActivated(QMdiSubWindow *))); refresh(); // TS 2010-07-08 Timer was used to initialised target session some time after launching // debugger tool. From now on target session is only initialised when actually needed. //connect(&StartTimer, SIGNAL(timeout(void)), this, SLOT(startTarget(void))); //StartTimer.start(1, true); closedAlready = false; // workaround (see todebug.h for details) manualStopping = false; } void toDebug::enableDebugger(bool enable) { executeAct->setEnabled(enable); stopAct->setEnabled(enable); stepAct->setEnabled(enable); nextAct->setEnabled(enable); returnAct->setEnabled(enable); debugPaneAct->setEnabled(enable); nextErrorAct->setEnabled(enable); previousErrorAct->setEnabled(enable); toggleBreakAct->setEnabled(enable); disableBreakAct->setEnabled(enable); addWatchAct->setEnabled(enable); deleteWatchAct->setEnabled(enable); changeWatchAct->setEnabled(enable); } void toDebug::createActions(void) { refreshAct = new QAction(QIcon(QPixmap(const_cast(refresh_xpm))), tr("Refresh"), this); connect(refreshAct, SIGNAL(triggered()), this, SLOT(refresh()), Qt::QueuedConnection); refreshAct->setShortcut(QKeySequence::Refresh); newSheetAct = new QAction(QIcon(QPixmap(const_cast(toworksheet_xpm))), tr("&New Sheet"), this); connect(newSheetAct, SIGNAL(triggered()), this, SLOT(newSheet()), Qt::QueuedConnection); scanSourceAct = new QAction(QIcon(QPixmap(const_cast(scansource_xpm))), tr("S&can Source"), this); connect(scanSourceAct, SIGNAL(triggered()), this, SLOT(scanSource()), Qt::QueuedConnection); scanSourceAct->setShortcut(Qt::CTRL + Qt::Key_F9); compileAct = new QAction(QIcon(QPixmap(const_cast(compile_xpm))), tr("&Compile"), this); connect(compileAct, SIGNAL(triggered()), this, SLOT(compile()), Qt::QueuedConnection); compileAct->setShortcut(Qt::Key_F9); closeAct = new QAction(QIcon(QPixmap(const_cast(close_xpm))), tr("Close"), this); connect(closeAct, SIGNAL(triggered()), this, SLOT(closeEditor()), Qt::QueuedConnection); closeAllAct = new QAction(tr("Close All"), this); connect(closeAllAct, SIGNAL(triggered()), this, SLOT(closeAllEditor()), Qt::QueuedConnection); executeAct = new QAction(QIcon(QPixmap(const_cast(execute_xpm))), tr("&Execute or continue"), this); connect(executeAct, SIGNAL(triggered()), this, SLOT(execute()), Qt::QueuedConnection); executeAct->setShortcut(Qt::CTRL + Qt::Key_Return); stopAct = new QAction(QIcon(QPixmap(const_cast(stop_xpm))), tr("&Stop"), this); connect(stopAct, SIGNAL(triggered()), this, SLOT(stop()), Qt::QueuedConnection); stopAct->setShortcut(Qt::Key_F12); stepAct = new QAction(QIcon(QPixmap(const_cast(stepinto_xpm))), tr("Step &Into"), this); connect(stepAct, SIGNAL(triggered()), this, SLOT(stepInto()), Qt::QueuedConnection); stepAct->setShortcut(Qt::Key_F7); nextAct = new QAction(QIcon(QPixmap(const_cast(stepover_xpm))), tr("&Next Line"), this); connect(nextAct, SIGNAL(triggered()), this, SLOT(stepOver()), Qt::QueuedConnection); nextAct->setShortcut(Qt::Key_F8); returnAct = new QAction(QIcon(QPixmap(const_cast(returnfrom_xpm))), tr("&Return From"), this); connect(returnAct, SIGNAL(triggered()), this, SLOT(returnFrom()), Qt::QueuedConnection); returnAct->setShortcut(Qt::Key_F6); debugPaneAct = new QAction(tr("&Debug Pane"), this); debugPaneAct->setIcon(QIcon(QPixmap(const_cast(todebug_xpm)))); debugPaneAct->setCheckable(true); connect(debugPaneAct, SIGNAL(toggled(bool)), this, SLOT(showDebug(bool)), Qt::QueuedConnection); debugPaneAct->setShortcut(Qt::Key_F11); nextErrorAct = new QAction(QIcon(QPixmap(const_cast(nextbug_xpm))), tr("Next &Error"), this); connect(nextErrorAct, SIGNAL(triggered()), this, SLOT(nextError()), Qt::QueuedConnection); nextErrorAct->setShortcut(Qt::CTRL + Qt::Key_N); previousErrorAct = new QAction(QIcon(QPixmap(const_cast(prevbug_xpm))), tr("Pre&vious Error"), this); connect(previousErrorAct, SIGNAL(triggered()), this, SLOT(prevError()), Qt::QueuedConnection); previousErrorAct->setShortcut(Qt::CTRL + Qt::Key_P); toggleBreakAct = new QAction(QIcon(QPixmap(const_cast(togglebreak_xpm))), tr("&Toggle Breakpoint"), this); connect(toggleBreakAct, SIGNAL(triggered()), this, SLOT(toggleBreak()), Qt::QueuedConnection); toggleBreakAct->setShortcut(Qt::CTRL + Qt::Key_F5); disableBreakAct = new QAction(QIcon(QPixmap(const_cast(enablebreak_xpm))), tr("D&isable Breakpoint"), this); connect(disableBreakAct, SIGNAL(triggered()), this, SLOT(toggleEnable()), Qt::QueuedConnection); disableBreakAct->setShortcut(Qt::CTRL + Qt::Key_F6); addWatchAct = new QAction(QIcon(QPixmap(const_cast(addwatch_xpm))), tr("&Add Watch..."), this); connect(addWatchAct, SIGNAL(triggered()), this, SLOT(addWatch()), Qt::QueuedConnection); addWatchAct->setShortcut(Qt::Key_F4); deleteWatchAct = new QAction(QIcon(QPixmap(const_cast(delwatch_xpm))), tr("Delete &Watch"), this); deleteWatchAct->setEnabled(false); connect(deleteWatchAct, SIGNAL(triggered()), this, SLOT(deleteWatch()), Qt::QueuedConnection); deleteWatchAct->setShortcut(Qt::CTRL + Qt::Key_Delete); changeWatchAct = new QAction(QIcon(QPixmap(const_cast(changewatch_xpm))), tr("Chan&ge Watch..."), this); changeWatchAct->setEnabled(false); connect(changeWatchAct, SIGNAL(triggered()), this, SLOT(changeWatch()), Qt::QueuedConnection); changeWatchAct->setShortcut(Qt::CTRL + Qt::Key_F4); eraseLogAct = new QAction(tr("Erase Runtime &Log"), this); connect(eraseLogAct, SIGNAL(triggered()), this, SLOT(clearLog()), Qt::QueuedConnection); } static toSQL SQLAttach("toDebug:Attach", "DECLARE\n" " timeout BINARY_INTEGER;\n" "BEGIN\n" " SYS.DBMS_DEBUG.ATTACH_SESSION(:sess);\n" "END;", "Connect to the debugging session"); void toDebug::startTarget(void) { #ifdef DEBUG qDebug() << "toDebug::startTarget"; #endif try { toLocker lock (Lock); TargetThread = new toThread(new targetTask(*this)); TargetThread->start(); } catch (...) { toStatusMessage(tr("Failed to start target task thread, close some other tools and try again")); return ; } ChildSemaphore.down(); // sleep until target session is initialised (or fails doing so) in other // thread (toDebug::targetTask::run must raise this semapthore) if (!DebuggerStarted) { { // toLocker lock (Lock); TOMessageBox::critical(this, tr("Couldn't start debugging"), tr("Couldn't connect to target session:\n") + TargetLog, tr("&Ok")); } // close(); return ; } try { #ifdef DEBUG qDebug() << "toDebug::startTarget DBMS_DEBUG.ATTACH_SESSION " << TargetID; #endif if (DebuggerStarted) debugSession->execute(SQLAttach, TargetID); } TOCATCH // Trying to run somthing after this won't work (And will hang tora I think) readLog(); } toDebugText *toDebug::currentEditor(void) { return dynamic_cast(Editors->currentWidget()); } void toDebug::changeSchema(int) { refresh(); } static toSQL SQLListObjects("toDebug:ListObjects", "SELECT Object_Type,Object_Name Type FROM SYS.ALL_OBJECTS\n" " WHERE OWNER = :owner\n" " AND Object_Type IN ('FUNCTION','PACKAGE',\n" " 'PROCEDURE','TYPE')\n" " ORDER BY Object_Type,Object_Name", "List objects available in a schema, must have same result columns"); void toDebug::refresh(void) { // qDebug() << "toDebug::refresh 1"; try { QString selected = Schema->currentText(); QString currentSchema; if (selected.isEmpty()) { selected = connection().user().toUpper(); Schema->clear(); toQList users = toQuery::readQuery(connection(), toSQL::string(toSQL::TOSQL_USERLIST, connection())); for (toQList::iterator i = users.begin(); i != users.end(); i++) Schema->addItem(*i); } if (!selected.isEmpty()) { for (int i = 0; i < Schema->count(); i++) { if (Schema->itemText(i) == selected) { Schema->setCurrentIndex(i); break; } } CodeModel->refresh(connection(), selected); } } TOCATCH // qDebug() << "toDebug::refresh 2"; } // This function is called before trying to compile something. // As it is not possible to compile an already running code this function // asks user if he/she wants to stop debugging and compile or continue // debugging and not to compile. bool toDebug::checkStop(void) { Lock.lock(); if (RunningTarget) { Lock.unlock(); if (TOMessageBox::information(this, tr("Stop execution?"), tr("Do you want to abort the current execution?"), tr("&Ok"), tr("Cancel")) != 0) { return false; } else stop(); // stop debugging } else Lock.unlock(); return true; } bool toDebug::checkCompile(toDebugText *editor) { // qDebug() << "toDebug::checkCompile 1"; if (editor->isModified()) { switch (TOMessageBox::warning(this, tr("%1 changed").arg(editorName(editor)), tr("%1 changed. Continuing will discard uncompiled or saved changes").arg(editorName(editor)), tr("&Compile"), tr("&Discard changes"), tr("Cancel"))) { case 0: if (!checkStop()) return false; if (!editor->compile()) return false; break; case 1: editor->setModified(false); break; case 2: return false; } } // qDebug() << "toDebug::checkCompile 2"; return true; } bool toDebug::checkCompile(void) { // qDebug() << "toDebug::checkCompile void 1"; for (int i = 0; i < Editors->count(); i++) { toDebugText *editor = dynamic_cast(Editors->widget(i)); if (!checkCompile(editor)) return false; } // qDebug() << "toDebug::checkCompile void 2"; return true; } bool toDebug::close() { // qDebug() << "toDebug::close 1"; if (checkCompile()) { bool ret = toToolWidget::close(); if (ret && Output) Output->close(); return ret; } // qDebug() << "toDebug::close 2"; return false; } void toDebug::closeEvent(QCloseEvent *e) { // Workaround for double-call of this function. See todebug.h for details. if (closedAlready) return; else closedAlready = true; // qDebug() << "toDebug::closeEvent 1"; if (close()) { try { // Check if target thread (with target oracle session) is running. // If it is - send a signal to quit. Lock.lock(); if (DebuggerStarted) { Lock.unlock(); stop(); { toLocker lock (Lock); TargetSQL = ""; // this is a signal for target thread to quit TargetSemaphore.up(); } ChildSemaphore.down(); } else Lock.unlock(); } TOCATCH; try { DebugTool.closeWindow(connection()); } TOCATCH; // qDebug() << "toDebug::closeEvent 2"; e->accept(); } else e->ignore(); // qDebug() << "toDebug::closeEvent 3"; } void toDebug::updateCurrent() { // qDebug() << "toDebug::updateCurrent 1"; try { toDebugText *editor = currentEditor(); editor->readData(connection(), StackTrace); editor->setFocus(); updateContent(); } TOCATCH // qDebug() << "toDebug::updateCurrent 2"; } void toDebug::changePackage(const QModelIndex ¤t, const QModelIndex &previous) { // qDebug() << "toDebug::changePackage 1"; toCodeModelItem *item = static_cast(current.internalPointer()); if (item && item->parent()) { QString ctype = item->parent()->display(); if (ctype.isEmpty() || ctype == "Code") return; ctype = ctype.toUpper(); viewSource(Schema->currentText(), item->display(), ctype, 0); if (ctype == "PACKAGE" || ctype == "TYPE") viewSource(Schema->currentText(), item->display(), ctype + " BODY", 0); } #ifdef AUTOEXPAND else if (item && !item->parent()) item->setOpen(true); #endif // qDebug() << "toDebug::changePackage 2"; } void toDebug::showDebug(bool show) { // qDebug() << "toDebug::showDebug 1"; if (show) DebugTabs->show(); else DebugTabs->hide(); debugPaneAct->setChecked(show); // qDebug() << "toDebug::showDebug 2"; } bool toDebugText::compile(void) { #ifdef DEBUG qDebug() << "toDebugText::compile start 1"; #endif QString str = text(); bool ret = true; if (!str.isEmpty()) { bool body = false; toSQLParse::stringTokenizer tokens(str); QString token = tokens.getToken(); if (token.toUpper() == "CREATE") { token = tokens.getToken(); if (token.toUpper() == "OR") { token = tokens.getToken(); if (token.toUpper() == "REPLACE") token = tokens.getToken(); } } QString type = token.toUpper(); if (type != QString::fromLatin1("PROCEDURE") && type != QString::fromLatin1("TYPE") && type != QString::fromLatin1("FUNCTION") && type != QString::fromLatin1("PACKAGE")) { toStatusMessage(tr("Invalid start of code")); return false; } token = tokens.getToken(); if (token.toUpper() == "BODY") { body = true; token = tokens.getToken(); } QString object = token; QString schema = Schema; int offset = tokens.offset(); token = tokens.getToken(); if (token == ".") { schema = object; object = tokens.getToken(); offset = tokens.offset(); } QString sql = QString::fromLatin1("CREATE OR REPLACE "); sql.append(type); if (body) sql.append(QString::fromLatin1(" BODY ")); else sql.append(QString::fromLatin1(" ")); sql.append(schema); sql.append(QString::fromLatin1(".")); sql.append(object); sql.append(QString::fromLatin1(" ")); sql.append(str.mid(offset)); try { toQList nopar; // TS 2010-07-10 Compilation no longer has to be done in target session // because target session is only initialised when actually debugging. //Debugger->executeInTarget(sql, nopar); Debugger->connection().execute(sql, nopar); Schema = schema.toUpper(); Object = Debugger->connection().unQuote(object.toUpper()); Type = type.toUpper(); if (body) Type += QString::fromLatin1(" BODY"); readErrors(Debugger->connection()); setModified(false); toConnection::objectName no; no.Name = Object; no.Owner = Schema; no.Type = type; Debugger->connection().addIfNotExists(no); } catch (const QString &exc) { toStatusMessage(exc); ret = false; } } #ifdef DEBUG qDebug() << "toDebugText::compile end 1"; #endif return ret; } void toDebug::compile(void) { #ifdef DEBUG qDebug() << "toDebug::compile start 2"; #endif if (!checkStop()) // Check if target is currently running/debugging something return ; QString lastSchema = currentEditor()->schema(); for (int i = 0; i < Editors->count(); i++) { toDebugText *editor = dynamic_cast(Editors->widget(i)); int row, col; editor->getCursorPosition(&row, &col); if (editor->compile()) { if (editor == currentEditor() && lastSchema != currentEditor()->schema()) { for (int i = 0; i < Schema->count(); i++) if (Schema->itemText(i) == lastSchema) { Schema->setCurrentIndex(i); break; } } if (editor->hasErrors()) Editors->setTabIcon(Editors->indexOf(editor), QIcon(QPixmap(const_cast(nextbug_xpm)))); else Editors->setTabIcon(Editors->indexOf(editor), QIcon()); Editors->setTabText(Editors->indexOf(editor), editorName(editor)); editor->setCursorPosition(row, col); } else return ; } refresh(); scanSource(); #ifdef DEBUG qDebug() << "toDebug::compile end 2"; #endif } toDebug::~toDebug() { } void toDebug::prevError(void) { currentEditor()->previousError(); } void toDebug::nextError(void) { currentEditor()->nextError(); } void toDebug::changeContent(toTreeWidgetItem *ci) { // qDebug() << "toDebug::changeContent 1"; toContentsItem *item = dynamic_cast(ci); if (item) { while (ci->parent()) ci = ci->parent(); toHighlightedText *current = NULL; for (int i = 0; i < Editors->count(); i++) { if (Editors->widget(i)->objectName() == ci->text(1)) { current = dynamic_cast(Editors->widget(i)); break; } } if (current) { current->setCursorPosition(item->Line, 0); Editors->setCurrentIndex(Editors->indexOf(current)); current->setFocus(); } } #ifdef AUTOEXPAND else ci->setOpen(true); #endif // qDebug() << "toDebug::changeContent 2"; } void toDebug::scanSource(void) { // qDebug() << "toDebug::scanSource 1"; updateContent(); // qDebug() << "toDebug::scanSource 2"; } void toDebug::newSheet(void) { toDebugText *text = new toDebugText(Breakpoints, Editors, this); // signal removed with qscintilla port. // connect(text, SIGNAL(insertedLines(int, int)), // this, SLOT(reorderContent(int, int))); if (!Schema->currentText().isEmpty()) text->setSchema(Schema->currentText()); else text->setSchema(connection().user().toUpper()); Editors->addTab(text, tr("Unknown")); Editors->setCurrentIndex(Editors->indexOf(text)); } void toDebug::showSource(toTreeWidgetItem *item) { if (item) viewSource(item->text(2), item->text(0), item->text(3), item->text(1).toInt(), false); } void toDebug::toggleBreak(void) { currentEditor()->toggleBreakpoint(); currentEditor()->setFocus(); } void toDebug::toggleEnable(void) { currentEditor()->toggleBreakpoint( -1, true); currentEditor()->setFocus(); } void toDebug::addWatch(void) { toDebugWatch watch(this); if (watch.exec()) { watch.createWatch(Watch); if (isRunning()) updateState(TO_REASON_WHATEVER); } } void toDebug::windowActivated(QMdiSubWindow *widget) { if (!widget) return; if (widget->widget() == this) { if (!ToolMenu) { ToolMenu = new QMenu(tr("&Debug"), this); ToolMenu->addAction(newSheetAct); ToolMenu->addAction(scanSourceAct); ToolMenu->addAction(compileAct); ToolMenu->addAction(closeAct); ToolMenu->addAction(closeAllAct); ToolMenu->addSeparator(); ToolMenu->addAction(executeAct); ToolMenu->addAction(stopAct); ToolMenu->addAction(stepAct); ToolMenu->addAction(nextAct); ToolMenu->addAction(returnAct); ToolMenu->addSeparator(); ToolMenu->addAction(nextErrorAct); ToolMenu->addAction(previousErrorAct); ToolMenu->addSeparator(); ToolMenu->addAction(toggleBreakAct); ToolMenu->addAction(disableBreakAct); ToolMenu->addSeparator(); ToolMenu->addAction(addWatchAct); ToolMenu->addAction(deleteWatchAct); ToolMenu->addAction(changeWatchAct); ToolMenu->addSeparator(); ToolMenu->addAction(refreshAct); ToolMenu->addAction(eraseLogAct); toMainWidget()->addCustomMenu(ToolMenu); } } else { delete ToolMenu; ToolMenu = NULL; } } void toDebug::selectedWatch() { toTreeWidgetItem *item = Watch->selectedItem(); if (item) { if (!item->text(5).isEmpty() && item->text(5) != QString::fromLatin1("LIST") && item->text(5) != QString::fromLatin1("NULL")) { deleteWatchAct->setEnabled(false); } else deleteWatchAct->setEnabled(true); changeWatchAct->setEnabled(item->text(4).isEmpty()); } else { deleteWatchAct->setEnabled(false); changeWatchAct->setEnabled(false); } } void toDebug::deleteWatch(void) { delete Watch->selectedItem(); } void toDebug::clearLog(void) { RuntimeLog->clear(); } void toDebug::changeWatch(void) { changeWatch(Watch->selectedItem()); } static toSQL SQLChangeLocal("toDebug:ChangeLocalWatch", "DECLARE\n" " ret BINARY_INTEGER;\n" " data VARCHAR2(4000);\n" "BEGIN\n" " ret:=SYS.DBMS_DEBUG.SET_VALUE(0,:assign);\n" " SELECT ret INTO :ret FROM sys.DUAL;\n" "END;", "Change local watch value, must have same bindings"); static toSQL SQLChangeGlobal("toDebug:ChangeGlobalWatch", "DECLARE\n" " data VARCHAR2(4000);\n" " proginf SYS.DBMS_DEBUG.program_info;\n" " ret BINARY_INTEGER;\n" "BEGIN\n" " proginf.Namespace:=SYS.DBMS_DEBUG.Namespace_pkg_body;\n" " proginf.Name:=:object;\n" " proginf.Owner:=:owner;\n" " proginf.DBLink:=NULL;\n" " ret:=SYS.DBMS_DEBUG.SET_VALUE(proginf,:assign);\n" " IF ret =SYS.DBMS_DEBUG.error_no_such_object THEN\n" " proginf.Namespace:=SYS.DBMS_DEBUG.namespace_pkgspec_or_toplevel;\n" " ret:=SYS.DBMS_DEBUG.SET_VALUE(proginf,:assign);\n" " END IF;\n" " SELECT ret INTO :ret FROM sys.DUAL;\n" "END;", "Change global watch value, must have same bindings"); void toDebug::changeWatch(toTreeWidgetItem *item) { if (item && item->text(4).isEmpty()) { QString description = tr("Enter new value to the watch %1").arg(item->text(2)); QString data; QDialog qdialog; Ui::toDebugChangeUI dialog; //, "WatchChange", true); dialog.setupUi(&qdialog); toHelp::connectDialog(&qdialog); dialog.HeadLabel->setText(description); QString index = item->text(5); if (item->text(5) == QString::fromLatin1("NULL")) dialog.NullValue->setChecked(true); else data = item->text(3); if (!index.isEmpty() && index != QString::fromLatin1("LIST")) dialog.Index->setValue(item->text(5).toInt()); if (index != QString::fromLatin1("LIST")) { dialog.Index->setEnabled(false); dialog.Value->setText(data); } if (qdialog.exec()) { int ret = -1; QString escdata; QString assign; if (dialog.NullValue->isChecked()) { escdata = QString::fromLatin1("NULL"); } else { escdata = data = dialog.Value->text(); escdata.replace(QRegExp(QString::fromLatin1("'")), QString::fromLatin1("''")); escdata.prepend(QString::fromLatin1("'")); escdata += QString::fromLatin1("'"); } assign = item->text(2); if (index == QString::fromLatin1("LIST")) { assign += QString::fromLatin1("("); assign += dialog.Index->text(); assign += QString::fromLatin1(")"); } assign += QString::fromLatin1(":="); assign += escdata; assign += QString::fromLatin1(";"); try { if (item->text(0).isEmpty()) { debugSession->execute(SQLChangeLocal, assign); ret = debugSession->readValue().toInt(); } else { QString tmp = item->text(1); if (tmp.isEmpty()) tmp = ""; debugSession->execute(SQLChangeGlobal, tmp, item->text(0), assign); ret = debugSession->readValue().toInt(); } if (ret == TO_ERROR_UNIMPLEMENTED) { toStatusMessage(tr("Unimplemented in PL/SQL debug interface")); } else if (ret != TO_SUCCESS) { toStatusMessage(tr("Assignment failed (Reason %1)").arg(ret)); } else updateState(TO_REASON_WHATEVER); } TOCATCH } } } void toDebug::exportData(std::map &data, const QString &prefix) { data[prefix + ":Editors"] = Editors->count(); for (int i = 0; i < Editors->count(); i++) { toHighlightedText *editor = dynamic_cast(Editors->widget(i)); QString num; num.setNum(i); editor->exportData(data, prefix + ":Editor:" + num); } data[prefix + ":Schema"] = Schema->currentText(); int id = 1; for (toTreeWidgetItem *item = Breakpoints->firstChild(); item; item = item->nextSibling()) { toBreakpointItem * point = dynamic_cast(item); if (point) { QString key = prefix + ":Breaks:" + QString::number(id).toLatin1(); data[key + ":Schema"] = point->text(2); data[key + ":Object"] = point->text(0); data[key + ":Type"] = point->text(3); data[key + ":Line"] = QString::number(point->line()); if (point->text(4) == tr("DISABLED")) data[key + ":Status"] = "DISABLED"; } id++; } id = 1; for (toTreeWidgetItem *qitem = Watch->firstChild(); qitem; qitem = qitem->nextSibling()) { toResultViewItem * item = dynamic_cast(qitem); if (item) { QString key = prefix + ":Watch:" + QString::number(id).toLatin1(); data[key + ":Schema"] = item->allText(0); data[key + ":Object"] = item->allText(1); data[key + ":Item"] = item->allText(2); data[key + ":Auto"] = item->allText(6); } id++; } if (debugPaneAct->isChecked()) data[prefix + ":Debug"] = QString::fromLatin1("Show"); toToolWidget::exportData(data, prefix); } void toDebug::importData(std::map &data, const QString &prefix) { QString str = data[prefix + ":Schema"]; { for (int i = 0; i < Schema->count(); i++) if (Schema->itemText(i) == str) { Schema->setCurrentIndex(i); changeSchema(i); break; } } int count = data[prefix + ":Editors"].toInt(); for (int j = 0; j < count; j++) { toDebugText *text = new toDebugText(Breakpoints, Editors, this); // signal removed with qscintilla port. // connect(text, SIGNAL(insertedLines(int, int)), // this, SLOT(reorderContent(int, int))); QString num; num.setNum(j); text->importData(data, prefix + ":Editor:" + num); Editors->addTab(text, editorName(text)); } int id = 1; std::map::iterator i; toBreakpointItem *debug = NULL; while ((i = data.find(prefix + ":Breaks:" + QString::number(id).toLatin1() + ":Line")) != data.end()) { QString key = prefix + ":Breaks:" + QString::number(id).toLatin1(); int line = (*i).second.toInt(); debug = new toBreakpointItem(Breakpoints, debug, data[key + ":Schema"], data[key + ":Type"], data[key + ":Object"], line); if (data[key + ":Status"] == QString::fromLatin1("DISABLED")) debug->setText(4, tr("DISABLED")); id++; } id = 1; toResultViewItem *item = NULL; while ((i = data.find(prefix + ":Watch:" + QString::number(id).toLatin1() + ":Item")) != data.end()) { QString key = prefix + ":Watch:" + QString::number(id).toLatin1(); item = new toResultViewItem(Watch, NULL, data[key + ":Schema"]); item->setText(1, data[key + ":Object"]); item->setText(2, data[key + ":Item"]); item->setText(4, QString::fromLatin1("NOCHANGE")); if (!data[key + ":Auto"].isEmpty()) item->setText(6, "AUTO"); id++; } scanSource(); debugPaneAct->setChecked(data[prefix + ":Debug"] == QString::fromLatin1("Show")); toToolWidget::importData(data, prefix); } void toDebug::closeEditor() { toDebugText *editor = currentEditor(); closeEditor(editor); } void toDebug::closeEditor(int ix) { toDebugText * w = qobject_cast(Editors->widget(ix)); assert(w); closeEditor(w); } void toDebug::closeAllEditor() { int editorCount = Editors->count(); while (editorCount > 0) { editorCount--; toDebugText *editor = dynamic_cast(Editors->widget(editorCount)); if (editor) closeEditor(editor); } } void toDebug::closeEditor(toDebugText* &editor) { if (editor && checkCompile(editor)) { QString name = editor->objectName(); for (toTreeWidgetItem *item = Contents->firstChild(); item; item = item->nextSibling()) { if (item->text(1) == name) { delete item; break; } } // if (Objects->selectedItem() && // Objects->selectedItem()->text(0) == editor->object() && // Schema->currentText() == editor->schema()) // Objects->clearSelection(); Editors->removeTab(Editors->indexOf(editor)); delete editor; if (Editors->count() == 0) newSheet(); } } tora-2.1.3/src/toqvalue.h0000644000175000017500000001517711445353612015067 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOQVALUE_H #define TOQVALUE_H #include "config.h" #include #include #include /** * This is now a wrapper around QVariant to avoid a lot of memory * copies. Choosing not to subclass QVariant though -- it's a * complicated class and it'd be easy to screw it up. * */ class toQValue { QVariant Value; public: /** * This is helper class for visualization of complex types * like: CLOB, BLOB, XML, vector of strings, image... * This class should be subclassed in tooracleconnection and other * connection providers. Subclasses then will be registered * into QT's metatype system using Q_DECLARE_METATYPE and stored inside QVariant */ class complexType { public: virtual bool isBinary() const = 0; virtual bool isLarge() const = 0; virtual QString summary() const = 0; virtual QString dataTypeName() const = 0; virtual ~complexType() {}; }; /** Create null value. */ toQValue(void); /** Create integer value. * @param i Value. */ toQValue(int i); /** Create string value. * @param str Value. */ toQValue(const QString &str); /** Create double value. * @param d Value. */ toQValue(double d); /** Create qlonglong value. * @param d Value. */ toQValue(qlonglong d); /** Create qulonglong value. * @param d Value. */ toQValue(qulonglong d); /** Destruct query. */ ~toQValue(); /** Create a copy of a value. */ toQValue(const toQValue ©); /** Assign this value from another value. */ const toQValue &operator = (const toQValue ©); /** Less than operator */ bool operator<(const toQValue &other) const; /** greater than operator */ bool operator>(const toQValue &other) const; /** Less than operator */ bool operator<=(const toQValue &other) const; /** greater than operator */ bool operator>=(const toQValue &other) const; /** Check a value for equality. Requires same type and same value. NULL is equal to other NULL values. */ bool operator == (const toQValue &) const; /** Check if this is an int value. */ bool isInt(void) const; /** Check if this is a double value. */ bool isDouble(void) const; /** Check if this is a string value. */ bool isString(void) const; /** Check if this value is null. */ bool isNull(void) const; /** Check if this value is one of the number types. Returns true for NULL. */ bool isNumber(void) const; /** Check if this value is binary. */ bool isBinary(void) const; /** Check if this value holds "custom" user type */ bool isUserType(void) const; /** Get toUtf8 format of this value. */ QString toUtf8(void) const; /** Get integer representation of this value. */ int toInt(void) const; /** Get double representation of this value. */ double toDouble(void) const; /** Check if this value is long. */ bool isLong(void) const; /** Get Long representation of this value */ qlonglong toLong(void) const; /** Check if this value is ulong. */ bool isuLong(void) const; /** Get Ulong representation of this value */ qulonglong touLong(void) const; /** Convert value to a QVariant */ QVariant const& toQVariant(void) const; /** Get binary representation of value. Can only be called when the data is actually binary. */ const QByteArray toByteArray(void) const; /** Convert value to a string. If binary convert to hex. */ operator QString() const; /** Convert value to a string. If binary convert to hex. */ QString toString() const; QString toSIsize() const; /** Set numberformat. * @param format 0 = Default, 1 = Scientific, 2 = Fixed Decimals * @param decimals Number on decimals for fixed decimals. */ static void setNumberFormat(int format, int decimals); /** Format a number according to current settings. */ static QString formatNumber(double number); /** Get number format. * @return Format 0 = Default, 1 = Scientific, 2 = Fixed Decimals */ static int numberFormat(void); /** Get decimals if fixed decimals. */ static int numberDecimals(void); /** Create a binary value */ static toQValue createBinary(const QByteArray &arr); /** Create a binary value from it's hex representation. */ static toQValue createFromHex(const QByteArray &hex); /** Create a binary value from it's hex representation. */ static toQValue createFromHex(const QString &hex); /** Create value from qvariant */ static toQValue fromVariant(const QVariant &); }; Q_DECLARE_METATYPE(toQValue::complexType*) /** A short representation of list */ typedef std::list toQList; #endif tora-2.1.3/src/tovisualize.cpp0000644000175000017500000002253011270353625016127 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "tobarchart.h" #include "toconf.h" #include "tolinechart.h" #include "topiechart.h" #include "toresulttableview.h" #include "toresultmodel.h" #include "tovisualize.h" #include #include #include #include #include #include #include "icons/axis.xpm" #include "icons/execute.xpm" #include "icons/grid.xpm" #include "icons/legend.xpm" toVisualize::toVisualize(toResultTableView *source, QWidget *parent, const char *name) : QWidget(parent), Source(source) { if (name) setObjectName(name); QVBoxLayout *vbox = new QVBoxLayout; vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); setLayout(vbox); QToolBar *toolbar = toAllocBar(this, tr("Data visualization")); vbox->addWidget(toolbar); Type = new QComboBox(toolbar); Type->setObjectName(TO_TOOLBAR_WIDGET_NAME); Type->addItem(tr("Bar chart"), 0); Type->addItem(tr("Line chart"), 1); Type->addItem(tr("Pie chart"), 2); toolbar->addWidget(Type); toolbar->addSeparator(); Legend = new QToolButton(toolbar); Legend->setCheckable(true); Legend->setIcon(QIcon(QPixmap(const_cast(legend_xpm)))); Legend->setToolTip(tr("Display legend")); Legend->setChecked(true); toolbar->addWidget(Legend); Grid = new QToolButton(toolbar); Grid->setCheckable(true); Grid->setIcon(QIcon(QPixmap(const_cast(grid_xpm)))); Grid->setToolTip(tr("Display grid")); Grid->setChecked(true); toolbar->addWidget(Grid); Axis = new QToolButton(toolbar); Axis->setCheckable(true); Axis->setIcon(QIcon(QPixmap(const_cast(axis_xpm)))); Axis->setToolTip(tr("Display axis legend")); Axis->setChecked(true); toolbar->addWidget(Axis); QLabel *title = new QLabel(tr("Title columns")); title->setToolTip(tr("Number of columns to use as title")); toolbar->addWidget(title); Title = new QComboBox(toolbar); setObjectName(TO_TOOLBAR_WIDGET_NAME); Title->addItem(QString::fromLatin1("1")); Title->addItem(QString::fromLatin1("2")); Title->addItem(QString::fromLatin1("3")); Title->addItem(QString::fromLatin1("4")); Title->addItem(QString::fromLatin1("5")); Title->addItem(QString::fromLatin1("6")); toolbar->addWidget(Title); toolbar->addSeparator(); toolbar->addAction(QIcon(QPixmap(const_cast(execute_xpm))), tr("Update chart"), this, SLOT(display(void))); QLabel *s = new QLabel(toolbar); s->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum)); toolbar->addWidget(s); Result = new QWidget(this); Result->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); vbox->addWidget(Result); } void toVisualize::display(void) { QWidget *last = Result; toResultModel *model = Source->model(); switch (Type->currentIndex()) { case 0: { toBarChart *chart = new toBarChart(this); layout()->addWidget(chart); chart->showLegend(Legend->isChecked()); int tit = std::max(1, Title->currentText().toInt()) + Source->numberColumn(); chart->setTitle( model->headerData(Source->numberColumn(), Qt::Horizontal, Qt::DisplayRole).toString()); chart->showGrid(Grid->isChecked() ? 5 : 0); chart->showAxisLegend(Axis->isChecked()); chart->setSamples(); std::list lst; for (int i = tit; i < model->columnCount(); i++) { toPush(lst, model->headerData(i, Qt::Horizontal, Qt::DisplayRole) .toString()); } chart->setLabels(lst); for (int row = 0; row < model->rowCount(); row++) { QModelIndex index = model->createIndex(row, Source->numberColumn()); QString label = model->data(index, Qt::EditRole).toString(); for (int j = 1; j < tit; j++) { QModelIndex index = model->createIndex(row, j); label += QString::fromLatin1(", "); label += model->data(index, Qt::EditRole).toString(); } std::list val; for (int i = tit; i < model->columnCount(); i++) { QModelIndex index = model->createIndex(row, i); toPush(val, model->data(index, Qt::EditRole).toDouble()); } chart->addValues(val, label); } Result = chart; } break; case 1: { toLineChart *chart = new toLineChart(this); layout()->addWidget(chart); chart->showLegend(Legend->isChecked()); int tit = std::max(1, Title->currentText().toInt()) + Source->numberColumn(); chart->setTitle( model->headerData(Source->numberColumn(), Qt::Horizontal, Qt::DisplayRole).toString()); chart->showGrid(Grid->isChecked() ? 5 : 0); chart->showAxisLegend(Axis->isChecked()); chart->setSamples(); std::list lst; for (int i = tit; i < model->columnCount(); i++) { toPush(lst, model->headerData( i, Qt::Horizontal, Qt::DisplayRole).toString()); } chart->setLabels(lst); for (int row = 0; row < model->rowCount(); row++) { QModelIndex index = model->createIndex(row, Source->numberColumn()); QString label = model->data(index, Qt::EditRole).toString(); for (int j = 1; j < tit; j++) { QModelIndex index = model->createIndex(row, j); label += QString::fromLatin1(", "); label += model->data(index, Qt::EditRole).toString(); } std::list val; for (int i = tit; i < model->columnCount(); i++) { QModelIndex index = model->createIndex(row, i); toPush(val, model->data(index, Qt::EditRole).toDouble()); } chart->addValues(val, label); } Result = chart; } break; case 2: { toPieChart *chart = new toPieChart(this); layout()->addWidget(chart); chart->showLegend(Legend->isChecked()); int tit = std::max(1, Title->currentText().toInt()) + Source->numberColumn(); chart->setTitle( model->headerData(Source->numberColumn(), Qt::Horizontal, Qt::DisplayRole).toString()); for (int row = 0; row < model->rowCount(); row++) { QModelIndex index = model->createIndex(row, Source->numberColumn()); QString label = model->data(index, Qt::EditRole).toString(); for (int j = 1; j < tit; j++) { QModelIndex index = model->createIndex(row, j); label += QString::fromLatin1(", "); label += model->data(index, Qt::EditRole).toString(); } index = model->createIndex(row, tit); chart->addValue(model->data(index, Qt::EditRole).toDouble(), label); } Result = chart; } break; default: Result = new QWidget(this); layout()->addWidget(Result); } Result->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); Result->show(); delete last; } tora-2.1.3/src/toresultplan.cpp0000644000175000017500000004426211270353625016313 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "tomain.h" #include "tonoblockquery.h" #include "toresultplan.h" #include "tosql.h" #include "totool.h" #include #include #include toResultPlan::toResultPlan(QWidget *parent, const char *name) : toResultView(false, false, parent, name) { setSQLName(QString::fromLatin1("toResultPlan")); connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); setAlternatingRowColors(true); Query = NULL; oracleSetup(); } static toSQL SQLViewVSQLPlan("toResultPlan:ViewVSQLPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" " io_cost,Bytes,Cardinality,\n" " partition_start,partition_stop,temp_space,time\n" "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = 0" "ORDER BY NVL(Parent_ID,0),ID", "Get the contents of SQL plan from V$SQL_PLAN.", "1000"); static toSQL SQLViewVSQLPlan92("toResultPlan:ViewVSQLPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" " io_cost,Bytes,Cardinality,\n" " partition_start,partition_stop,temp_space,null time\n" "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = 0" "ORDER BY NVL(Parent_ID,0),ID", "", "0902"); static toSQL SQLViewVSQLPlan9("toResultPlan:ViewVSQLPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" " io_cost,Bytes,Cardinality,\n" " partition_start,partition_stop,null temp_space,null time\n" "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = 0" "ORDER BY NVL(Parent_ID,0),ID", "", "0900"); static toSQL SQLViewPlan("toResultPlan:ViewPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" " io_cost,Bytes,Cardinality,\n" " partition_start,partition_stop,temp_space,time\n" " FROM %1 WHERE Statement_ID = '%2' ORDER BY NVL(Parent_ID,0),ID", "Get the contents of a plan table. Observe the %1 and %2 which must be present. Must return same columns", "1000"); static toSQL SQLViewPlan8("toResultPlan:ViewPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" " io_cost,Bytes,Cardinality,\n" " partition_start,partition_stop,' ',' '\n" " FROM %1 WHERE Statement_ID = '%2' ORDER BY NVL(Parent_ID,0),ID", "", "0800"); bool toResultPlan::canHandle(toConnection &conn) { return toIsOracle(conn) || toIsMySQL(conn) || toIsPostgreSQL(conn); } toResultPlan::~toResultPlan() { delete Query; } void toResultPlan::oracleSetup(void) { clear(); setAllColumnsShowFocus(true); setSorting( -1); setRootIsDecorated(true); addColumn(QString::fromLatin1("#")); addColumn(tr("Operation")); addColumn(tr("Options")); addColumn(tr("Object name")); addColumn(tr("Mode")); addColumn(tr("Cost")); addColumn(tr("%CPU")); addColumn(tr("Bytes")); addColumn(tr("Rows")); addColumn(tr("TEMP Space")); addColumn(tr("Time")); addColumn(tr("Startpartition")); addColumn(tr("Endpartition")); setColumnAlignment(5, Qt::AlignRight); setColumnAlignment(6, Qt::AlignRight); setColumnAlignment(7, Qt::AlignRight); setColumnAlignment(8, Qt::AlignRight); setColumnAlignment(9, Qt::AlignRight); setColumnAlignment(10, Qt::AlignRight); setColumnAlignment(11, Qt::AlignRight); setColumnAlignment(12, Qt::AlignRight); } void toResultPlan::oracleNext(void) { LastTop = NULL; Parents.clear(); Last.clear(); QString chkPoint(toConfigurationSingle::Instance().planCheckpoint()); toConnection &conn = connection(); conn.execute(QString::fromLatin1("SAVEPOINT %1").arg(chkPoint)); Ident = QString::fromLatin1("TOra ") + QString::number((int)time(NULL) + rand()); QString planTable(toConfigurationSingle::Instance().planTable()); QString sql = toShift(Statements); if (sql.isNull()) { Poll.stop(); return ; } if (sql.length() > 0 && sql.at(sql.length() - 1).toLatin1() == ';') sql = sql.mid(0, sql.length() - 1); QString explain = QString::fromLatin1("EXPLAIN PLAN SET STATEMENT_ID = '%1' INTO %2.%3 FOR %4"). arg(Ident).arg(conn.user()).arg(planTable).arg(toSQLStripSpecifier(sql)); if (!User.isNull() && User != conn.user().toUpper()) { try { conn.execute(QString::fromLatin1("ALTER SESSION SET CURRENT_SCHEMA = \"%1\"").arg(User)); conn.execute(explain); } catch (...) { try { // conn.execute(QString::fromLatin1("ALTER SESSION SET CURRENT_SCHEMA = %1").arg(connection().user())); // when we start connection it is for user but in schema context conn.execute(QString::fromLatin1("ALTER SESSION SET CURRENT_SCHEMA = \"%1\"").arg(connection().schema())); } catch (...) {} throw; } //conn.execute(QString::fromLatin1("ALTER SESSION SET CURRENT_SCHEMA = %1").arg(connection().user())); //when we start connection it is for user but in schema context conn.execute(QString::fromLatin1("ALTER SESSION SET CURRENT_SCHEMA = \"%1\"").arg(connection().schema())); toQList par; Query = new toNoBlockQuery(connection(), toQuery::Normal, toSQL::string(SQLViewPlan, conn). // arg(toConfigurationSingle::Instance().planTable()). // Since EXPLAIN PLAN is always to conn.user() plan_table arg(conn.user()+QString(".")+toConfigurationSingle::Instance().planTable()). arg(Ident), par); Reading = true; } else { Reading = false; toQList par; Query = new toNoBlockQuery(conn, toQuery::Normal, explain, par); } TopItem = new toResultViewItem(this, TopItem, QString::fromLatin1("EXPLAIN PLAN:")); TopItem->setText(1, sql.left(50).trimmed()); Poll.start(100); } static void StripInto(std::list &stats) { std::list res; bool into = false; bool add = true; for (std::list::iterator i = stats.begin();i != stats.end();i++) { if (into) { if (!add && (*i).String.toUpper() == QString::fromLatin1("FROM")) add = true; } else if ((*i).String.toUpper() == QString::fromLatin1("INTO")) { add = false; into = true; } if (add ) res.insert(res.end(), *i); } stats = res; } void toResultPlan::addStatements(std::list &stats) { for (std::list::iterator i = stats.begin();i != stats.end();i++) { if ((*i).Type == toSQLParse::statement::Block) addStatements((*i).subTokens()); else if ((*i).Type == toSQLParse::statement::Statement) { if ((*i).subTokens().begin() != (*i).subTokens().end()) { QString t = (*((*i).subTokens().begin())).String.toUpper(); if (t == QString::fromLatin1("SELECT")) StripInto((*i).subTokens()); if (t == QString::fromLatin1("SELECT") || t == QString::fromLatin1("INSERT") || t == QString::fromLatin1("UPDATE") || t == QString::fromLatin1("DELETE")) Statements.insert(Statements.end(), toSQLParse::indentStatement(*i).trimmed()); } } } } void toResultPlan::query(const QString &sql, const toQList ¶m) { if (!handled()) return ; try { if (!setSQLParams(sql, param)) return ; if (Query) { delete Query; Query = NULL; } if (connection().provider() == "MySQL" || connection().provider() == "PostgreSQL") { setRootIsDecorated(false); setSorting(0); toResultView::query(QString::fromLatin1("EXPLAIN ") + toSQLStripBind(sql), param); return ; } toQList::iterator cp = ((toQList &)param).begin(); if (cp != ((toQList &)param).end()) User = *cp; else User = QString::null; clear(); QString planTable(toConfigurationSingle::Instance().planTable()); Statements.clear(); if (sql.startsWith(QString::fromLatin1("SAVED:"))) { Ident = sql.mid(6); toQList par; Query = new toNoBlockQuery(connection(), toQuery::Background, toSQL::string(SQLViewPlan, connection()). arg(planTable).arg(Ident), par); Reading = true; LastTop = NULL; Parents.clear(); Last.clear(); TopItem = new toResultViewItem(this, NULL, QString::fromLatin1("DML")); TopItem->setText(1, QString::fromLatin1("Saved plan")); Poll.start(100); } else if (sql.startsWith(QString::fromLatin1("SGA:"))) { QString Address = sql.mid(4); toConnection &conn = connection(); toQList par; Query = new toNoBlockQuery(conn, toQuery::Background, toSQL::string(SQLViewVSQLPlan, conn).arg(Address), par); Reading = true; LastTop = NULL; Parents.clear(); Last.clear(); TopItem = new toResultViewItem(this, NULL, QString::fromLatin1("V$SQL_PLAN:")); TopItem->setText(1, toSQLString(conn, Address).left(50).trimmed()); Poll.start(100); } else { TopItem = NULL; std::list ret = toSQLParse::parse(sql); addStatements(ret); oracleNext(); } } catch (const QString &str) { checkException(str); } } void toResultPlan::poll(void) { try { if (!toCheckModal(this)) return ; if (Query && Query->poll()) { if (!Reading) { toQList par; delete Query; Query = NULL; toConnection &conn = connection(); Query = new toNoBlockQuery(connection(), toQuery::Normal, toSQL::string(SQLViewPlan, conn). // arg(toConfigurationSingle::Instance().planTable()). // Since EXPLAIN PLAN is always to conn.user() plan_table // and current_schema can be different arg(conn.user()+QString(".")+toConfigurationSingle::Instance().planTable()). arg(Ident), par); Reading = true; } else { while (Query->poll() && !Query->eof()) { QString id = Query->readValueNull(); QString parentid = Query->readValueNull(); QString operation = Query->readValueNull(); QString options = Query->readValueNull(); QString object = Query->readValueNull(); QString optimizer = Query->readValueNull(); QString cost = Query->readValueNull(); QString iocost = Query->readValueNull(); QString bytes = Query->readValueNull().toSIsize(); QString cardinality = Query->readValueNull(); QString startpartition = Query->readValueNull(); QString endpartition = Query->readValueNull(); QString tempspace = Query->readValueNull().toSIsize(); QString time = Query->readValueNull(); toResultViewItem *item; if (!parentid.isNull() && Parents[parentid]) { item = new toResultViewItem(Parents[parentid], Last[parentid]); // setOpen(Parents[parentid], true); Last[parentid] = item; } else { item = new toResultViewItem(TopItem, LastTop); LastTop = item; } QString cpupct = NULL; if (!cost.isEmpty()) { double pct = 100; if (cost.toDouble() > 0) { pct = 100 - (iocost.toDouble() / cost.toDouble() * 100); } cpupct.setNum(pct, 'f', 2); } if (!time.isEmpty()) { double seconds = time.toDouble(); int hours = (int) (seconds / 3600); int mins = (int) (( seconds - hours * 3600) / 60); int secs = (int) seconds - (hours * 3600 + mins * 60); time.sprintf("%d:%02d:%02d", hours, mins, secs); } item->setText(0, id); item->setText(1, operation); item->setText(2, options); item->setText(3, object); item->setText(4, optimizer); item->setText(5, cost); item->setText(6, cpupct); item->setText(7, bytes); item->setText(8, cardinality); item->setText(9, tempspace); item->setText(10, time); item->setText(11, startpartition); item->setText(12, endpartition); Parents[id] = item; } if (Query->eof()) { delete Query; Query = NULL; QString chkPoint(toConfigurationSingle::Instance().planCheckpoint()); if (!sql().startsWith(QString::fromLatin1("SAVED:"))) { if (toConfigurationSingle::Instance().keepPlans()) connection().execute(QString::fromLatin1("ROLLBACK TO SAVEPOINT %1").arg(chkPoint)); else toMainWidget()->setNeedCommit(connection()); } oracleNext(); } } } expandAll(); resizeColumnsToContents(); } catch (const QString &str) { delete Query; Query = NULL; Poll.stop(); checkException(str); } } void toResultPlan::checkException(const QString &str) { try { if (str.startsWith(QString::fromLatin1("ORA-02404"))) { QString planTable(toConfigurationSingle::Instance().planTable()); int ret = TOMessageBox::warning(this, tr("Plan table doesn't exist"), tr("Specified plan table %1 didn't exist.\n" "Should TOra try to create it?").arg(planTable), tr("&Yes"), tr("&No"), QString::null, 0, 1); if (ret == 0) { connection().execute(toSQL::string(toSQL::TOSQL_CREATEPLAN, connection()).arg(planTable)); QString t = sql(); setSQL(QString::null); query(t, params()); } } else toStatusMessage(str); } TOCATCH } tora-2.1.3/src/toconnectionpool.h0000644000175000017500000001303311346724415016613 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOCONNECTIONPOOL_H #define TOCONNECTIONPOOL_H #include "toconnection.h" #include "torunnable.h" #include #include #include #include #include #include #include #include class toConnectionPool; /** * Tests connections in pool * */ class toConnectionPoolTest : public QThread { Q_OBJECT; QPointer Pool; QTimer *timer; public: toConnectionPoolTest(toConnectionPool *pool); /** * Overrides. Call start() to execute thread. * */ virtual void run(void); private slots: // execute tests void test(void); }; /** * Executes sql on pool connections * */ class toConnectionPoolExec : public toRunnable { Q_OBJECT; public: enum Action { Commit, Rollback, Cancel, Execute }; private: QPointer Pool; Action action; // for Execute toQList Params; QString Sql; public: toConnectionPoolExec(toConnectionPool *pool, Action act); toConnectionPoolExec(toConnectionPool *pool, Action act, const QString &sql, toQList ¶ms); /** * Overrides. Call start() to execute thread. * */ virtual void run(void); }; class toConnectionPool : public QObject { Q_OBJECT; friend class toConnectionPoolTest; friend class toConnectionPoolExec; toConnectionPoolTest *TestThread; bool TestThreadRunning; // indicates if constructor has created a thread for periodic queries // for future configuration static const int PreferredSize = 3; enum PooledState { Busy, Free, Broken }; class PooledSub { public: toConnectionSub *Sub; PooledState State; // need this for template container PooledSub() { Sub = 0; State = Broken; } PooledSub(toConnectionSub *sub, PooledState state = Free) { Sub = sub; State = state; } }; // the pool typedef QList SubList; volatile SubList Pool; // lock for the pool. QMutex PoolLock; // toConnection instance this class is a member of. will be used // to create new connections when needed. QPointer Connection; // this is used internally to test PooledState test(PooledSub *sub); PooledState test(int member); int size(void); // get a specific connection. toConnectionSub* steal(int member); // create new connection at position void fix(int member); public: toConnectionPool(toConnection *conn); ~toConnectionPool(); /** * Get a connection from pool. * * This method is thread safe */ toConnectionSub* borrow(void); /** * Release connection back to pool * * This method is thread safe */ void release(toConnectionSub *sub); /** * Commit connections that are not busy * */ void commit(bool wait = false); /** * Rollback connections that are not busy * */ void rollback(bool wait = false); /** * Cancels all running queries * */ void cancelAll(bool wait = false); /** * Execute sql on all connections * */ void executeAll(const QString &sql, toQList ¶ms); }; /** * Encapsulates returning toConnectionSub to pool for easier exception * proof code. * */ class PoolPtr { QPointer Pool; toConnectionSub *Sub; public: PoolPtr(toConnectionPool *pool) { Pool = pool; Sub = Pool->borrow(); } toConnectionSub* operator*() { return Sub; } ~PoolPtr() { if(Pool) Pool->release(Sub); } }; #endif tora-2.1.3/src/topassword.cpp0000644000175000017500000001041211270353625015752 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconnection.h" #include "tomain.h" #include "tosql.h" #include "totool.h" #include #include #include static toSQL SQLChangePassword("toPassword:ChangePassword", "ALTER USER %1 IDENTIFIED BY \"%2\"", "Change password of a user, must have same %"); class toPasswordTool : public toTool { protected: public: toPasswordTool() : toTool(599, "Password Change") { } virtual const char *menuItem() { return "Password Change"; } virtual QWidget *toolWindow(QWidget *, toConnection &connection) { QString np = QInputDialog::getText(toMainWidget(), qApp->translate("toPasswordTool", "Enter new password"), qApp->translate("toPasswordTool", "Enter new password"), QLineEdit::Password, QString::null, NULL); if (!np.isNull()) { QString np2 = QInputDialog::getText(toMainWidget(), qApp->translate("toPasswordTool", "Enter new password again for confirmation"), qApp->translate("toPasswordTool", "Enter new password again for confirmation"), QLineEdit::Password, QString::null, NULL); if (!np2.isNull()) { if (np != np2) TOMessageBox::warning(toMainWidget(), qApp->translate("toPasswordTool", "Passwords doesn't match"), qApp->translate("toPasswordTool", "The two givens passwords doesn't match, please try again")); else { try { connection.execute(toSQL::string(SQLChangePassword, connection). arg(connection.user()).arg(np)); } catch (const QString &exc) { toStatusMessage(exc); } } } } return NULL; } virtual void closeWindow(toConnection &connection){}; }; static toPasswordTool PasswordTool; tora-2.1.3/src/tobrowseraccesswidget.h0000644000175000017500000000455311270353625017637 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBROWSERACCESSWIDGET_H #define TOBROWSERACCESSWIDGET_H #include "tobrowserbasewidget.h" class toResultData; /*! \brief MySQL Access browser for toBrowser tool. See toBrowserBaseWidget for more info. \author Petr Vanek */ class toBrowserAccessWidget : public toBrowserBaseWidget { Q_OBJECT toResultData * accessContent; public: toBrowserAccessWidget(QWidget * parent); void changeConnection(); //! Reimplemented due schema workaround for this tab void changeParams(const QString & schema, const QString & object); private slots: void flushPrivs(void); }; #endif tora-2.1.3/src/toglobalsetting.h0000644000175000017500000000661711332067047016426 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOGLOBALSETTING_H #define TOGLOBALSETTING_H #include "config.h" #include "ui_todatabasesettingui.h" #include "ui_toglobalsettingui.h" #include "tohelp.h" #include "totool.h" #include "ui_totoolsettingui.h" #include "ui_connectioncolorsdialogui.h" class ConnectionColorsDialog : public QDialog, public Ui::ConnectionColorsDialog { Q_OBJECT public: ConnectionColorsDialog(QWidget * parent); private: void newItem(const QString & color, const QString & desc); private slots: void addItem(); void deleteItem(); void accept(); }; class toGlobalSetting : public QWidget, public Ui::toGlobalSettingUI, public toSettingTab { Q_OBJECT; public: toGlobalSetting(QWidget *parent = 0, const char *name = 0, Qt::WFlags fl = 0); public slots: virtual void saveSetting(void); virtual void pluginBrowse(void); virtual void sqlBrowse(void); virtual void helpBrowse(void); virtual void sessionBrowse(void); virtual void cacheBrowse(void); void ColorizedConnectionsConfigure_clicked(); }; class toDatabaseSetting : public QWidget, public Ui::toDatabaseSettingUI, public toSettingTab { Q_OBJECT; public: toDatabaseSetting(QWidget *parent = 0, const char *name = 0, Qt::WFlags fl = 0); public slots: virtual void saveSetting(void); virtual void numberFormatChange(); virtual void IndicateEmptyColor_clicked(); }; class toToolSetting : public QWidget, public Ui::toToolSettingUI, public toSettingTab { Q_OBJECT; public: toToolSetting(QWidget *parent = 0, const char *name = 0, Qt::WFlags fl = 0); public slots: virtual void saveSetting(void); virtual void changeEnable(void); }; #endif tora-2.1.3/src/migratetool/0000755000175000017500000000000011445450570015372 5ustar michaelmichaeltora-2.1.3/src/migratetool/sqldeveloper.h0000644000175000017500000000421511270353472020251 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef SQLDEVELOPER_H #define SQLDEVELOPER_H #include #include "tonewconnection.h" namespace MigrateTool { /*! \brief Parse Oracle SQL Developer connection export file. Version 1.5 or later ("new" format) is supported only. OK, this code looks ugly but it's enough for "one time runners". \author Petr Vanek */ QMap sqlDeveloper(QWidget * parent = 0); } // namespace #endif tora-2.1.3/src/migratetool/tora3.cpp0000644000175000017500000001475211332067045017133 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "config.h" #include "tora3.h" #include "utils.h" #include #include #include #include namespace MigrateTool { void loadMap(const QString &filename, QMap &pairs); void loadConnections(QMap &pairs, QList &ret); std::set processOptions(const QString &str); QMap tora3(QWidget * parent) { QMap ret; int key = 0; // I can't get the stupid QFileDialog to show hidden files by // default, so I'm going to just try to open the file. // I found plenty of people complaining about it online but with // no solutions for qt4. QFile file(QDir::homePath() + QString("/.torarc")); if(!file.exists()) { QMessageBox::warning(parent, "Load Error", QString("Cannot open file %1 for reading.").arg(file.fileName())); return ret; } QMap config; loadMap(file.fileName(), config); QList l; loadConnections(config, l); foreach(toConnectionOptions o, l) { ret[key] = o; ++key; } return ret; } // updated old code from toconfiguration.cpp rev 2575 void loadMap(const QString &filename, QMap &pairs) { QByteArray data = toReadFileB(filename); int pos = 0; int bol = 0; int endtag = -1; int wpos = 0; int size = data.length(); while (pos < size) { switch (data[pos]) { case '\n': data[wpos] = 0; if (endtag == -1) throw QString(QT_TRANSLATE_NOOP( "toTool", "Malformed tag in config file. Missing = on row. (%1)")).arg( QString(data.mid(bol, wpos - bol))); { QString tag = ((const char *)data) + bol; QString val = ((const char *)data) + endtag + 1; pairs[tag] = val; } bol = pos + 1; endtag = -1; wpos = pos; break; case '=': if (endtag == -1) { endtag = pos; data[wpos] = 0; wpos = pos; } else data[wpos] = data[pos]; break; case '\\': pos++; switch (data[pos]) { case 'n': data[wpos] = '\n'; break; case '\\': if (endtag >= 0) data[wpos] = '\\'; else data[wpos] = ':'; break; default: throw QT_TRANSLATE_NOOP("toTool", "Unknown escape character in string (Only \\\\ and \\n recognised)"); } break; default: data[wpos] = data[pos]; } wpos++; pos++; } return; } // similar, but heavily modified from tonewconnection.cpp:toNewConnection() -r2535 void loadConnections(QMap &pairs, QList &ret) { static const QString HISTORY = "ConnectHistory:"; QString strMax = pairs[QString("ConnectCurrent")]; int max = 0; if(strMax.isEmpty()) max = 40; else { bool ok; int t = strMax.toInt(&ok); if(ok) max = t; } for(int pos = 0; pos < max; pos++) { QString num; num.setNum(pos); QString db = pairs[HISTORY + num + "DefaultDatabase"]; QString pass = pairs[HISTORY + num + "DefaultPassword"]; QString user = pairs[HISTORY + num + "DefaultUser"]; QString host = pairs[HISTORY + num + "Host"]; QString options = pairs[HISTORY + num + "Options"]; QString prov = pairs[HISTORY + num + "Provider"]; QString schema; if(prov.isEmpty()) break; if(prov == "Oracle") prov = "Oracle (TNS)"; if(!pass.isEmpty()) pass = toUnobfuscate(pass); toConnectionOptions conn(prov, host, db, user, pass, schema, "", 0, processOptions(options)); ret.append(conn); } } // also old code from tonewconnection.cpp std::set processOptions(const QString &str) { QStringList options = str.split(","); std::set values; Q_FOREACH(QString val, options) { if(val.startsWith("*")) values.insert(val.mid(1)); } return values; } } // namespace tora-2.1.3/src/migratetool/sqldeveloper.cpp0000644000175000017500000001266211270353472020611 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "sqldeveloper.h" #include #include #include #include namespace MigrateTool { QMap sqlDeveloper(QWidget * parent) { QString fileName = QFileDialog::getOpenFileName(parent, "SQL Developer Connections", QDir::homePath(), "XML Files (*.xml);;All Files (*.*)"); QMap ret; if (fileName.isNull()) return ret; QFile file(fileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox::warning(parent, "Load Error", QString("Cannot open file %1 for reading.").arg(fileName)); return ret; } QXmlStreamReader xml(&file); bool isXML = false; toConnectionOptions opt; QString attr; int key = 0; while (!xml.atEnd()) { xml.readNext(); if (isXML && xml.isEndElement() && xml.name() == "RefAddresses") { // qDebug() << "connection -----"; if (!opt.username.isEmpty() && !opt.provider.isEmpty()) { if (opt.provider == "Oracle") { if (opt.host.isEmpty()) opt.provider = "Oracle (TNS)"; else opt.provider = "Oracle (Instant Client)"; } ret[key] = opt; ++key; opt.username = ""; opt.database = ""; opt.host = ""; opt.provider = ""; } attr = ""; } if (xml.isStartElement()) { // qDebug() << "debug" < #include "tonewconnection.h" namespace MigrateTool { /*! \brief Parse Tora 1.3.x preferences file * * Probably works for older versions, too. But does anybody care? * * \author Mike Johnson */ QMap tora3(QWidget *parent = 0); } // namespace #endif tora-2.1.3/src/migratetool/squirrelsql.cpp0000644000175000017500000001467211270353472020475 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "squirrelsql.h" #include #include #include #include namespace MigrateTool { QMap squirrelSql(QWidget * parent) { QMap ret; int key = 0; QString fileName = QFileDialog::getOpenFileName(parent, "SquirrelSQL Configuration file (SQLAliases23.xml)", QDir::homePath() + "/.squirrel-sql/", "XML Files (*.xml);;All Files (*.*)"); if (fileName.isNull()) return ret; QFile file(fileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox::warning(parent, "Load Error", QString("Cannot open file %1 for reading.").arg(fileName)); return ret; } QXmlStreamReader xml(&file); bool isXML = false; toConnectionOptions opt; while (!xml.atEnd()) { xml.readNext(); if (xml.isEndElement() && isXML && xml.name() == "Bean") { if (!opt.username.isEmpty() && !opt.provider.isEmpty()) { ret[key] = opt; ++key; opt.username = ""; opt.database = ""; opt.host = ""; opt.password = ""; opt.provider = ""; } } if (xml.isStartElement()) { // qDebug() << "debug" < 1) opt.database = l.at(1); QStringList k = l.at(0).split(":", QString::SkipEmptyParts); if (k.size() > 1) opt.port = k.at(1).toInt(); else opt.port = 3306; opt.host = k.at(0); opt.provider = "MySQL"; } else if (url.indexOf("jdbc:oracle:oci8:@") != -1) // oracle found { opt.database = url.replace("jdbc:oracle:oci8:@", ""); opt.provider = "Oracle (TNS)"; } else if (url.indexOf("jdbc:oracle:thin:@") != -1) { // format: server[:port]/sid QString connStr(url.replace("dbc:oracle:thin:@", "")); QStringList l = connStr.split("/", QString::SkipEmptyParts); if (l.size() > 1) opt.database = l.at(1); QStringList k = l.at(0).split(":", QString::SkipEmptyParts); if (k.size() > 1) opt.port = k.at(1).toInt(); else opt.port = 1521; opt.host = k.at(0); opt.provider = "Oracle (Instant Client)"; } else if (url.indexOf("jdbc:postgresql:") != -1) // pgsql { // format: server[:port]/database QString connStr(url.replace("jdbc:postgresql:", "")); QStringList l = connStr.split("/", QString::SkipEmptyParts); if (l.size() > 1) opt.database = l.at(1); QStringList k = l.at(0).split(":", QString::SkipEmptyParts); if (k.size() > 1) opt.port = k.at(1).toInt(); else opt.port = 5432; opt.host = k.at(0); opt.provider = "Oracle (Instant Client)"; } else qDebug() << "TOra cannot handle provider:" << url; } } } if (xml.error() && xml.error() != QXmlStreamReader::PrematureEndOfDocumentError) { qWarning() << "XML ERROR:" << xml.lineNumber() << ": " << xml.errorString(); } file.close(); return ret; } } // namespace tora-2.1.3/src/migratetool/squirrelsql.h0000644000175000017500000000415411270353472020134 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef SQURRELSQL_H #define SQURRELSQL_H #include #include "tonewconnection.h" namespace MigrateTool { /*! \brief Parse SquirrelSQL connection files. Version 2.6.x or later is supported only. OK, this code looks ugly but it's enough for "one time runners". \author Petr Vanek */ QMap squirrelSql(QWidget * parent = 0); } // namespace #endif tora-2.1.3/src/toresult.h0000644000175000017500000001526211402451646015102 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULT_H #define TORESULT_H #include "config.h" #include "toqvalue.h" #include "tosql.h" #include #include class QTabWidget; class toConnection; class toResult; class toTimer; /** Used for getting slots into toResult. * @internal */ class toResultObject : public QObject { Q_OBJECT toResult *Result; public: toResultObject(toResult *result) : Result(result) { } public slots: /** Called when connection is changed. Be sure to call the parent if you reimplement this. */ virtual void connectionChanged(void); /** Called when timer times out */ virtual void setup(void); }; /** Abstract baseclass of widgets that can perform queries. Usefull because you can execute * the query without knowing how it's UI is presented. */ class toResult { toResultObject Slots; bool Handled; QTabWidget *Tabs; QWidget *TabWidget; QString SQL; bool ForceRefresh; bool QueryReady; toQList Params; bool FromSQL; QString Name; bool DisableTab; protected: /** Set parameters of last query. */ void setParams(const toQList &par) { Params = par; QueryReady = true; } /** Set SQL and parameters and return false if query shouldn't be reexecuted. It is * important that all descendants call this function in the beginning of the implementation * of the query function to determine if the query should be reexecuted or not. */ bool setSQLParams(const QString &sql, const toQList &par); public: /** Get the current connection from the closest tool. * @return Reference to connection. */ toConnection &connection(void); /** Get the timer associated with the closest tool. * @return Pointer to tool timer. */ toTimer *timer(void); toResult(void); virtual ~toResult() { } /** Erase last parameters */ virtual void clearParams(void) { Params.clear(); QueryReady = false; } /** Re execute last query */ virtual void refresh(void); /** Perform a query. * @param sql Execute an SQL statement. * @param params Parameters needed as input to execute statement. */ virtual void query(const QString &sql, const toQList ¶ms) = 0; /** Reexecute with changed parameters. * @param Param1 First parameter. */ virtual void changeParams(const QString &Param1); /** Reexecute with changed parameters. * @param Param1 First parameter. * @param Param1 Second parameter. */ virtual void changeParams(const QString &Param1, const QString &Param2); /** Reexecute with changed parameters. * @param Param1 First parameter. * @param Param2 Second parameter. * @param Param3 Third parameter. */ virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3); /** Reimplemented for internal reasons. */ virtual bool canHandle(toConnection &) { return false; } /** Get last parameters used. * @return Don't modify the list returned. */ toQList ¶ms(void) { return Params; } /** Check if this result is handled by the current connection */ bool handled(void) { return Handled; } /** Indicate that this result can not be handled even though indicated otherwise */ void setHandle(bool); /** Indicate what tabbed widget to disable page if not immediate parent if this * result is not handled. */ void setTabWidget(QTabWidget *tab) { Tabs = tab; } /** disable hiding of the tab this result object lives in. * */ void setDisableTab(bool en) { DisableTab = en; } /** Set the SQL statement of this list * @param sql String containing statement. */ void setSQL(const QString &sql) { SQL = sql; } /** Set the SQL statement of this list. This will also affect @ref Name. * @param sql SQL containing statement. */ void setSQL(const toSQL &sql); /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const QString &sql); /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql); /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql, const toQList &par); /** Get SQL to execute */ QString sql(void) { return SQL; } /** Get SQL name of list. */ virtual QString sqlName(void) { return Name; } /** Set SQL name of list. */ virtual void setSQLName(const QString &name) { Name = name; } friend class toResultObject; protected: /** Called when connection is changed. Be sure to call the parent if you reimplement this. */ virtual void connectionChanged(void); private: void changeHandle(void); }; #endif tora-2.1.3/src/toplsqltext.cpp0000644000175000017500000006442411423611417016160 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include #include #include "utils.h" #include "toconnection.h" #include "totreewidget.h" #include "toplsqltext.h" #include "tomarkedtext.h" #include "tomain.h" #include "tosql.h" #include "toresultview.h" #define PLSQL_ERROR "ERROR" #define PLSQL_WARNING "WARNING" #define PLSQL_STATIC "STATIC" #define PLSQL_RESULT "" static struct TypeMapType { const char *Type; const char *Description; const char *Icon; bool WantName; bool Declaration; } TypeMap[] = { { "FUNCTION", "Fc", ":/icons/function.png", true , true }, // Must be first in list { "PROCEDURE", "Pr", ":/icons/procedure.png", true , true }, { "PACKAGE", "Pkg", ":/icons/package.png", true , true }, { "DECLARE", "Anon", NULL, false, true }, { "TYPE", "Type", ":/icons/type.png", true , false}, { "CURSOR", "Cursor", NULL, true , false}, { "IF", "Condition", NULL, false, false}, { "LOOP", "Loop", NULL, false, false}, { "WHILE", "Loop", NULL, false, false}, { "FOR", "Loop", NULL, false, false}, { NULL, NULL, false, false} }; static toTreeWidgetItem *toLastItem(toTreeWidgetItem *parent) { toTreeWidgetItem *lastItem = NULL; for (toTreeWidgetItem *item = parent->firstChild(); item; item = item->nextSibling()) lastItem = item; return lastItem; } // TODO/FIXME: well, icon handling and the "tree item" stuff // is really ugly. It should be simplified one day (model-view) to // allow searching, sorting, etc. Of course it should force me to // understand parser output... class toContentsItem : public toTreeWidgetItem { public: int Line; toContentsItem(toTreeWidgetItem *parent, const QString & icon, const QString &name, int line) : toTreeWidgetItem(parent, toLastItem(parent), name) { setup(icon, line); } toContentsItem(toTreeWidget *parent, const QString & icon, const QString &name, const QString &id, int line) : toTreeWidgetItem(parent, name, id) { setup(icon, line); } private: void setup(const QString & icon, int line) { Line = line; if (!icon.isNull()) setIcon(0, QIcon(icon)); int space = text(0).indexOf(" "); if (space != -1) setText(0, text(0).mid(space)); } }; static bool FindKeyword(toSQLParse::statement &statements, bool onlyNames, bool &declaration, int &line, QString &name, QString & icon, QString & itemtype) { if (statements.Type == toSQLParse::statement::Keyword || statements.Type == toSQLParse::statement::Token) { line = statements.Line; if (name.isEmpty()) { name = statements.String.toUpper(); int j; for (j = 0; TypeMap[j].Type && TypeMap[j].Type != name; j++) ; if (TypeMap[j].Type) { name = TypeMap[j].Description; icon = TypeMap[j].Icon; itemtype = TypeMap[j].Type; } else name = "Anonymous"; declaration = TypeMap[j].Declaration; if (onlyNames && !TypeMap[j].WantName) { name = QString::null; return true; } return !TypeMap[j].WantName; } else if (statements.String.toUpper() != "BODY") { name += " " + statements.String; return true; } else name += " body"; } for (std::list::iterator i = statements.subTokens().begin(); i != statements.subTokens().end(); i++) { bool ret = FindKeyword(*i, onlyNames, declaration, line, name, icon, itemtype); if (ret) return ret; } return false; } /* Parameter t: toPLSQLText::Production - for production compiling (default) toPLSQLText::Warning - to compile with warnings enabled */ bool toPLSQLText::compile(CompilationType t) { QString str = text(); bool ret = true; // indicates if compilation action was successfull if (str.isEmpty()) return true; bool body = false; toSQLParse::stringTokenizer tokens(str); QString token = tokens.getToken(); if (token.toUpper() == "CREATE") { token = tokens.getToken(); if (token.toUpper() == "OR") { token = tokens.getToken(); if (token.toUpper() == "REPLACE") token = tokens.getToken(); } } QString type = token.toUpper(); if (type != QString::fromLatin1("PROCEDURE") && type != QString::fromLatin1("TYPE") && type != QString::fromLatin1("FUNCTION") && type != QString::fromLatin1("PACKAGE")) { toStatusMessage(tr("Invalid start of code")); return false; } token = tokens.getToken(); if (token.toUpper() == "BODY") { body = true; token = tokens.getToken(); } QString object = token; QString schema = Schema; int offset = tokens.offset(); token = tokens.getToken(); if (token == ".") { schema = object; object = tokens.getToken(); offset = tokens.offset(); } QString sql = QString::fromLatin1("CREATE OR REPLACE "); sql.append(type); if (body) sql.append(QString::fromLatin1(" BODY ")); else sql.append(QString::fromLatin1(" ")); sql.append(schema); sql.append(QString::fromLatin1(".")); sql.append(object); sql.append(QString::fromLatin1(" ")); sql.append(str.mid(offset)); // Remove empty space and the slash at the end of statement. // Note: slash is valid in oracle sqlplus only int i = sql.length() - 1; while ((i > 0) && ((sql.at(i) == ' ') || (sql.at(i) == '\r') || (sql.at(i) == '\n') || (sql.at(i) == '\t') || (sql.at(i) == '/'))) i--; sql.truncate(i + 1); compilation_error = ""; try { toQList nopar; Schema = schema.toUpper(); Type = type.toUpper(); if (body) Type += QString::fromLatin1(" BODY"); toQuery q(toMainWidget()->currentConnection(), sql, nopar); setModified(false); } catch (const QString &exc) { // save compilation execution error to be added to error list later by readErrors() compilation_error = exc; // toStatusMessage(exc); ret = false; } try { if (t == toPLSQLText::Warning) // TODO: TS 2009-12-21 is it actually compiling if // button "compile (without warnings) was pressed? { QString alter("ALTER %1 \"%2\".\"%3\" COMPILE "); if (body) alter += "BODY "; alter += "PLSQL_WARNINGS='ENABLE:ALL'"; toQuery w(toMainWidget()->currentConnection(), alter.arg(type).arg(schema).arg(object.toUpper()), toQList()); } } catch (const QString &exc) { // toStatusMessage(exc); ret = false; } readErrors(toMainWidget()->currentConnection()); emit contentChanged(); parent_widget->resizeResults(); return ret; } static toSQL SQLReadSource("toPLSQLEditor:ReadSource", "SELECT Text FROM SYS.All_Source\n" " WHERE OWNER = :f1\n" " AND NAME = :f2\n" " AND TYPE = :f3\n" " ORDER BY Type,Line", "Read sourcecode for object"); static toSQL SQLReadErrors("toPLSQLEditor:ReadErrors", "SELECT attribute, Line,Text FROM SYS.All_Errors\n" " WHERE OWNER = :f1\n" " AND NAME = :f2\n" " AND TYPE = :f3\n" " ORDER BY Attribute, Type, Line", "Get lines with errors in object (Observe first line 0)", "1000", "Oracle"); static toSQL SQLReadErrors9("toPLSQLEditor:ReadErrors", "SELECT 'ERROR', Line,Text FROM SYS.All_Errors\n" " WHERE OWNER = :f1\n" " AND NAME = :f2\n" " AND TYPE = :f3\n" " ORDER BY Type, Line", "", "0900"); int toPLSQLText::ID = 0; toPLSQLText::toPLSQLText(QWidget *parent) : toHighlightedText(parent, QString::number(++ID).toLatin1()) { parent_widget = (toPLSQLWidget*)parent; } void toPLSQLText::clear(void) { setData(QString::null, QString::null, QString::null); toHighlightedText::clear(); } /* This function is called after compiling the code. It's purpose is to read list of warnings/errors. */ bool toPLSQLText::readErrors(toConnection &conn) { int errorCount = 0, warningCount = 0; try { toQuery errors(conn, SQLReadErrors, Schema, Object, Type); QMultiMap Errors; QMultiMap Warnings; QMultiMap Static; // dummy empty array used to clear static messages int line; QString errType; // add compilation execution error (if there was one) if (!compilation_error.isEmpty()) { Errors.insert(1, compilation_error); errorCount++; } while (!errors.eof()) { errType = errors.readValue(); // "ERROR"/"WARNING" etc. line = errors.readValue().toInt(); if (errType == PLSQL_ERROR) { Errors.insert(line, errors.readValue()); errorCount++; } else // "WARNING" { Warnings.insert(line, errors.readValue()); warningCount++; } } setErrors(Errors); emit errorsChanged(PLSQL_ERROR, Errors, true); emit errorsChanged(PLSQL_WARNING, Warnings); emit errorsChanged(PLSQL_STATIC, Static); // clear all static check messages ir result pane setErrors(Static, false); // remove static error markers in code return true; } TOCATCH return false; } bool toPLSQLText::readData(toConnection &conn/*, toTreeWidget *Stack*/) { try { toQuery lines(conn, SQLReadSource, Schema, Object, Type); QString str = "CREATE OR REPLACE "; while (!lines.eof()) str += lines.readValue(); str += "\n/"; setText(str); setModified(false); setCurrent( -1); emit contentChanged(); if (str.isEmpty()) return false; else return readErrors(conn); } TOCATCH return false; } void toPLSQLWidget::updateArguments(toSQLParse::statement &statements, toTreeWidgetItem *parent) { for (std::list::iterator i = statements.subTokens().begin(); i != statements.subTokens().end(); i++) { if ((*i).Type == toSQLParse::statement::List) { bool first = true; for (std::list::iterator j = (*i).subTokens().begin(); j != (*i).subTokens().end(); j++) { if ((*j).String == ",") first = true; else if (first) { // arguments new toContentsItem(parent, ":/icons/type.png", (*j).String, (*j).Line); first = false; } } } } } void toPLSQLWidget::updateContent(toSQLParse::statement &statements, toTreeWidgetItem *parent, const QString &id) { toTreeWidgetItem *item = NULL; int line; QString name; bool declaration; QString icon; QString itemtype; if (!FindKeyword(statements, statements.Type == toSQLParse::statement::Statement, declaration, line, name, icon, itemtype) || name.isNull()) return ; if (parent) item = new toContentsItem(parent, icon, name, line); else { for (item = m_contents->firstChild(); item; item = item->nextSibling()) if (item->text(0) == name && item->text(1) == id) { item->setText(2, QString::null); break; } if (!item) { item = new toContentsItem(m_contents, icon, "Item Unit Content", id, line); } else { while (item->firstChild()) delete item->firstChild(); toContentsItem *ci = dynamic_cast(item); if (ci) ci->Line = line; } item->setOpen(true); } std::list::iterator i = statements.subTokens().begin(); if (statements.Type == toSQLParse::statement::Block) { if (i != statements.subTokens().end()) { updateArguments(*i, item); i++; } } else { updateArguments(statements, item); if (i != statements.subTokens().end()) i++; } while (i != statements.subTokens().end()) { if ((*i).Type == toSQLParse::statement::Block || (*i).Type == toSQLParse::statement::Statement) { if (declaration) { std::list::iterator j = (*i).subTokens().begin(); if (j != (*i).subTokens().end()) { if ((*j).String.toUpper() == "BEGIN") declaration = false; else if ((*j).Type == toSQLParse::statement::Token && (*j).String.toUpper() != "END") // variables new toContentsItem(item, ":/icons/type.png", (*j).String, (*j).Line); } } updateContent(*i, item); } i++; } if (!parent && !item->firstChild()) delete item; } void toPLSQLWidget::updateContent(toPLSQLText *ed) { toSQLParse::editorTokenizer tokenizer(ed); std::list statements = toSQLParse::parse(tokenizer); m_contents->clear(); for (std::list::iterator i = statements.begin(); i != statements.end(); i++) updateContent(*i, NULL, ed->objectName()); } void toPLSQLText::setData(const QString &schema, const QString &type, const QString &object) { Schema = schema; Type = type; Object = object; update(); } toPLSQLWidget::toPLSQLWidget(QWidget * parent) : QWidget(parent) { m_contents = new toTreeWidget(this); m_contents->addColumn(tr("Contents")); m_contents->setRootIsDecorated(true); m_contents->setSorting( -1); m_contents->setTreeStepSize(10); m_contents->setSelectionMode(toTreeWidget::Single); m_contents->setResizeMode(toTreeWidget::AllColumns); connect(m_contents, SIGNAL(selectionChanged(toTreeWidgetItem *)), this, SLOT(changeContent(toTreeWidgetItem *))); m_editor = new toPLSQLText(this); m_result = new QTreeWidget(this); m_result->setColumnCount(2); m_result->setAlternatingRowColors(true); m_result->setAllColumnsShowFocus(true); m_result->setHeaderLabels(QStringList() << tr("Message") << tr("Line")); m_errItem = m_warnItem = m_staticItem = NULL; m_splitter = new QSplitter(Qt::Vertical, this); m_splitter->insertWidget(0, m_editor); m_splitter->insertWidget(1, m_result); errorCount = warningCount = staticCount = 0; resizeResults(); m_contentSplitter = new QSplitter(Qt::Horizontal, this); m_contentSplitter->insertWidget(0, m_contents); m_contentSplitter->insertWidget(1, m_splitter); if (layout() == 0) setLayout(new QVBoxLayout); layout()->addWidget(m_contentSplitter); connect(m_editor, SIGNAL(errorsChanged(const QString &, const QMultiMap&, const bool)), this, SLOT(applyResult(const QString &, const QMultiMap&, const bool))); connect(m_result, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(goToError(QTreeWidgetItem *, QTreeWidgetItem *))); connect(m_editor, SIGNAL(contentChanged()), this, SLOT(updateContent())); QSettings s; s.beginGroup("toPLSQLEditor"); m_splitter->restoreState(s.value("splitterWidget").toByteArray()); m_contentSplitter->restoreState(s.value("contentSplitter").toByteArray()); s.endGroup(); } toPLSQLWidget::~toPLSQLWidget() { // closeEvent is not called at all QSettings s; s.beginGroup("toPLSQLEditor"); s.setValue("splitterWidget", m_splitter->saveState()); s.setValue("contentSplitter", m_contentSplitter->saveState()); s.endGroup(); } /* If NULL is given as type - removes all error, warning and static check messages from m_result list. If argument type has a value - only messages of given type are removed. */ void toPLSQLWidget::cleanupResults(const QString & type) { if ((m_errItem != NULL) && (type == PLSQL_ERROR || type == NULL)) { foreach (QTreeWidgetItem * c, m_errItem->takeChildren()) delete c; delete m_errItem; m_errItem = NULL; } if ((m_warnItem != NULL) && (type == PLSQL_WARNING || type == NULL)) { foreach (QTreeWidgetItem * c, m_warnItem->takeChildren()) delete c; delete m_warnItem; m_warnItem = NULL; } if ((m_staticItem != NULL) && (type == PLSQL_STATIC || type == NULL)) { foreach (QTreeWidgetItem * c, m_staticItem->takeChildren()) delete c; delete m_staticItem; m_staticItem = NULL; } } // cleanupResults /* Resize result pane depending on number of errors, warnings etc. That is if there is anything to show there - restore it's size to "visible". If there are no messages to show - collapse it. */ int resultSize = 1; void toPLSQLWidget::resizeResults(void) { QList widget_sizes = m_splitter->sizes(); if (errorCount == 0 && warningCount == 0 && staticCount == 0 && widget_sizes[1] > 0) { resultSize = widget_sizes[1]; widget_sizes[1] = 0; m_splitter->setSizes(widget_sizes); } else if ((errorCount > 0 || warningCount > 0 || staticCount > 0) && (widget_sizes[1] == 0)) { widget_sizes[1] = resultSize; m_splitter->setSizes(widget_sizes); } } // resizeRezults void toPLSQLWidget::setCount(const QString & type, const int count) { if (type == PLSQL_ERROR) { errorCount = count; } else if (type == PLSQL_WARNING) { warningCount = count; } else if (type == PLSQL_STATIC) { staticCount = count; } } // setCount /* Applies list of errors, warnings or static check observations to corresponding node in results list. This will usually be called after some parts of this list have changed: after compiling (twice: once for errors and once for warnings) or after runing statick check (once: for static observations only). Parameters: type - PLSQL_ERROR, PLSQL_WARNING or PLSQL_STATIC values - multimap containing list of errors or warnings with line number and description cleanup - cleanup result pane of any messages (including root elements): if true - clears all error, warning and static test errors if false - only messages of given type are cleared */ void toPLSQLWidget::applyResult(const QString & type, const QMultiMap & values, const bool cleanup) { QTreeWidgetItem * item = 0; // abstract item will be used as list of errors or // warnings or static check observations etc. int count = 0; if (cleanup) cleanupResults(); else cleanupResults(type); if (values.empty()) { setCount(type, 0); return; } if (type == PLSQL_ERROR) { m_errItem = new QTreeWidgetItem(m_result, QStringList() << tr("Errors") << ""); item = m_errItem; } else if (type == PLSQL_WARNING) { m_warnItem = new QTreeWidgetItem(m_result, QStringList() << tr("Warnings") << ""); item = m_warnItem; } else if (type == PLSQL_STATIC) { m_staticItem = new QTreeWidgetItem(m_result, QStringList() << tr("Static check") << ""); item = m_staticItem; } else qDebug() << "Unknown type " << type << " in toPLSQLWidget::applyResult"; // add new items to the list QMap::const_iterator i = values.constBegin(); while (i != values.constEnd()) { QStringList l(i.value()); l.append(QString().setNum(i.key())); item->addChild(new QTreeWidgetItem(item, l)); ++i; count++; } setCount(type, count); m_result->expandItem(item); m_result->resizeColumnToContents(0); } // applyResult /* Called whenever user selects an error, warning or static observation in results list. It should place cursor at he position of corresponding error, warning or static observation position. Parameters: current - newly selected item - previously selected item - not used */ void toPLSQLWidget::goToError(QTreeWidgetItem * current, QTreeWidgetItem *) { // do not try to move cursor when "parent" item in result list is selected if (current != m_errItem && current != m_warnItem && current != m_staticItem) { m_editor->setCursorPosition(current->text(1).toInt() - 1, 0); m_editor->setFocus(Qt::OtherFocusReason); } } // goToError void toPLSQLWidget::changeContent(toTreeWidgetItem *ci) { toContentsItem *item = dynamic_cast(ci); if (item) { while (ci->parent()) ci = ci->parent(); } m_editor->setCursorPosition(item->Line, 0); m_editor->setFocus(Qt::OtherFocusReason); #ifdef AUTOEXPAND else ci->setOpen(true); #endif } /* All plsql edit widgets are inherited from toMarkedText which does implement save feature. We need to overload it here in order to handle saving of package specification and body into one file. */ bool toPLSQLText::editSave(bool askfile) { // Only packages should be handled differently, for all other types // call original version of save function // TODO: types as well? if ((Type != "PACKAGE") && (Type != "PACKAGE BODY")) return toMarkedText::editSave(askfile); QFileInfo file(filename()); QString fn = filename(); if (askfile || fn.isEmpty()) { // get list of default extensions QString t; t = GetExtensions(); // append extensions for package spec+body // TODO: make this extension configurable t.append(";;Spec & Body (*.pls)"); fn = toSaveFilename(file.dir().path(), t, this); } if (!fn.isEmpty()) { if (fn.endsWith(".pls")) { // if .pls was chosen - both spec and body must be saved in one file // find another part of package toPLSQLText * other_part = (Editor->getAnotherPart(Schema, Object, Type)); if (other_part == NULL) { // other part of package could not be found. Panic! toStatusMessage(qApp->translate("toPLSQLText", "Other part of a package was not found!!!\nNothing will be saved to file.")); return false; } // save specification first if (Type == "PACKAGE") { if (!toWriteFile(fn, text() + "\n" + other_part->text() + "\n")) return false; } else { if (!toWriteFile(fn, other_part->text() + "\n" + text() + "\n")) return false; } toMainWidget()->addRecentFile(fn); setFilename(fn); other_part->setFilename(fn); setModified(false); other_part->setModified(false); emit fileSaved(fn); emit other_part->fileSaved(fn); return true; } else { // if something else (not .pls) was chosen - then default // functionality (save only current tab) must be performed // set chosen file setFilename(fn); // and call default save functionality without choosing a file again return toMarkedText::editSave(false); } } return false; } // editSave tora-2.1.3/src/toscriptschemawidget.h0000644000175000017500000000716111270353625017455 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOSCRIPTSCHEMAWIDGET_H #define TOSCRIPTSCHEMAWIDGET_H #include "ui_toscriptschemawidgetui.h" class toScriptTreeModel; /*! \brief Schema browse widget for toScript tool. See Source and Destination objects in the toscriptui.ui. It reads/handles DB objects into proper tree structure. Items in the tree are selectable by user - and its selection is used for toScript export/comparation. */ class toScriptSchemaWidget : public QWidget, public Ui::toScriptSchemaWidget { Q_OBJECT public: toScriptSchemaWidget(QWidget * parent = 0); ~toScriptSchemaWidget(){}; //! Set the main group box title. void setTitle(const QString & text); //! Create commin string list with all selected objects for given QTreeView QItemSelectionModel * objectList(); //! Return current connection string QString connectionString(); /*! Set the connection string from outside of this widget. \param c QString which will be set when its already in the ConnectionComboBox */ void setConnectionString(const QString & c); private: //! Model for ObjectView QTreeView toScriptTreeModel * Model; //! Select ObjectView's child items in recursion void subSelectionChanged(QModelIndex ix); private slots: /*! Handle changes in ConnectionComboBox. Resets the SchemaComboBox content too. */ void changeConnection(int val); /*! Handle changes in SchemaComboBox. Resets the Model too. */ void changeSchema(int val); //! Add new connection from toMain void addConnection(const QString &name); //! Delete a connection as requested from toMain void delConnection(const QString &name); void objectsView_selectionChanged(const QItemSelection &, const QItemSelection &); }; #endif tora-2.1.3/src/tosession.cpp0000644000175000017500000007660011304157474015610 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "tochangeconnection.h" #include "toconf.h" #include "toconnection.h" #include "tomain.h" #include "toresultbar.h" #include "toresultcombo.h" #include "toresultlock.h" #include "toresultlong.h" #include "toresultstats.h" #include "toresultview.h" #include "tosession.h" #include "tosgastatement.h" #include "tosgatrace.h" #include "tosql.h" #include "totool.h" #include "towaitevents.h" #include "toresulttableview.h" #include "toeventquery.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "icons/add.xpm" #include "icons/clock.xpm" #include "icons/kill.xpm" #include "icons/minus.xpm" #include "icons/noclock.xpm" #include "icons/refresh.xpm" #include "icons/tosession.xpm" // #include "icons/filter.xpm" class toSessionTool : public toTool { protected: virtual const char **pictureXPM(void) { return const_cast(tosession_xpm); } public: toSessionTool() : toTool(210, "Sessions") { } virtual const char *menuItem() { return "Sessions"; } virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) { if (toIsOracle(connection) || toIsPostgreSQL(connection)) return new toSession(parent, connection); return NULL; } virtual bool canHandle(toConnection &conn) { return toIsOracle(conn) || toIsPostgreSQL(conn); } virtual void closeWindow(toConnection &connection) {}; }; static toSessionTool SessionTool; class toSessionFilter : public toViewFilter { QRegExp Filter; public: toSessionFilter() { } virtual toViewFilter* clone() { toSessionFilter *f = new toSessionFilter; f->Filter = Filter; return f; } void setFilterString(const QString &f) { if(f.isEmpty()) { QRegExp filter; Filter = filter; } else { QRegExp filter(QString("*") + f + QString("*"), Qt::CaseInsensitive, QRegExp::Wildcard); Filter = filter; } } /** * return true to show, false to hide * */ virtual bool check(const toResultModel *model, const int row) { if(Filter.isEmpty()) return true; int rows = model->rowCount(); for(int col = 0; col < rows; col++) { QString data = model->data(row, col).toString(); if(data.isEmpty()) continue; if(Filter.exactMatch(data)) return true; } return false; } }; static toSQL SQLConnectInfo( "toSession:ConnectInfo", "select authentication_type,osuser,network_service_banner\n" " from v$session_connect_info where sid = :f1", "Get connection info for a session"); static toSQL SQLLockedObject( "toSession:LockedObject", "select b.Object_Name \"Object Name\",\n" " b.Object_Type \"Type\",\n" " DECODE(a.locked_mode,0,'None',1,'Null',2,'Row-S',\n" " 3,'Row-X',4,'Share',5,'S/Row-X',\n" " 6,'Exclusive',a.Locked_Mode) \"Locked Mode\"\n" " from v$locked_object a,sys.all_objects b\n" " where a.object_id = b.object_id\n" " and a.session_id = :f1", "Display info about objects locked by this session"); static toSQL SQLLockedObjectPg( "toSession:LockedObject", "SELECT c.relname AS \"Name\",\n" " l.locktype,\n" " n.nspname,\n" " l.TRANSACTION,\n" " l.MODE,\n" " l.granted,\n" " l.pid\n" " FROM pg_catalog.pg_locks l,\n" " pg_class c,\n" " pg_namespace n\n" " WHERE l.relation = c.OID\n" " AND c.relnamespace = n.OID\n" " AND l.pid = :f1", "", "", "PostgreSQL"); static toSQL SQLOpenCursors( "toSession:OpenCursor", "select SQL_Text \"SQL\", Address||':'||Hash_Value \" Address\"\n" " from v$open_cursor where sid = :f1", "Display open cursors of this session"); static toSQL SQLSessionWait( TO_SESSION_WAIT, "select sysdate,\n" " cpu*10 \"CPU\",\n" " parallel*10 \"Parallel execution\",\n" " filewrite*10 \"DB File Write\",\n" " writecomplete*10 \"Write Complete\",\n" " fileread*10 \"DB File Read\",\n" " singleread*10 \"DB Single File Read\",\n" " control*10 \"Control File I/O\",\n" " direct*10 \"Direct I/O\",\n" " log*10 \"Log file\",\n" " net*10 \"SQL*Net\",\n" " (total-parallel-filewrite-writecomplete-fileread-singleread-control-direct-log-net)*10 \"Other\"\n" " from (select SUM(DECODE(SUBSTR(event,1,2),'PX',time_waited,0))-SUM(DECODE(event,'PX Idle Wait',time_waited,0)) parallel,\n" " SUM(DECODE(event,'db file parallel write',time_waited,'db file single write',time_waited,0)) filewrite,\n" " SUM(DECODE(event,'write complete waits',time_waited,NULL)) writecomplete,\n" " SUM(DECODE(event,'db file parallel read',time_waited,'db file sequential read',time_waited,0)) fileread,\n" " SUM(DECODE(event,'db file scattered read',time_waited,0)) singleread,\n" " SUM(DECODE(SUBSTR(event,1,12),'control file',time_waited,0)) control,\n" " SUM(DECODE(SUBSTR(event,1,11),'direct path',time_waited,0)) direct,\n" " SUM(DECODE(SUBSTR(event,1,3),'log',time_waited,0)) log,\n" " SUM(DECODE(SUBSTR(event,1,7),'SQL*Net',time_waited,0))-SUM(DECODE(event,'SQL*Net message from client',time_waited,0)) net,\n" " SUM(DECODE(event,'PX Idle Wait',0,'SQL*Net message from client',0,time_waited)) total\n" " from v$session_event where sid in (select b.sid from v$session a,v$session b where a.sid = :f1 and a.audsid = b.audsid)),\n" " (select value*10 cpu from v$sesstat a\n" " where statistic# = 12 and a.sid in (select b.sid from v$session a,v$session b where a.sid = :f1 and a.audsid = b.audsid))", "Used to generate chart for session wait time."); static toSQL SQLSessionIO( TO_SESSION_IO, "select sysdate,\n" " sum(block_gets) \"Block gets\",\n" " sum(consistent_gets) \"Consistent gets\",\n" " sum(physical_reads) \"Physical reads\",\n" " sum(block_changes) \"Block changes\",\n" " sum(consistent_changes) \"Consistent changes\"\n" " from v$sess_io where sid in (select b.sid from v$session a,v$session b where a.sid = :f1 and a.audsid = b.audsid)", "Display chart of session generated I/O"); static toSQL SQLAccessedObjects( "toSession:AccessedObjects", "SELECT owner,\n" " OBJECT,\n" " TYPE FROM v$access\n" " WHERE sid=:f1\n" " ORDER BY owner,\n" " OBJECT,\n" " TYPE", "Which objects are accessed by the current session"); static toSQL SQLSessions( "toSession:ListSession", "SELECT a.Sid \"Id\",\n" " a.Serial# \"Serial#\",\n" " a.SchemaName \"Schema\",\n" " a.Status \"Status\",\n" " a.Server \"Server\",\n" " a.OsUser \"Osuser\",\n" " a.Machine \"Machine\",\n" " a.Program \"Program\",\n" " a.Type \"Type\",\n" " a.Module \"Module\",\n" " a.Action \"Action\",\n" " a.Client_Info \"Client Info\",\n" " b.Block_Gets \"Block Gets\",\n" " b.Consistent_Gets \"Consistent Gets\",\n" " b.Physical_Reads \"Physical Reads\",\n" " b.Block_Changes \"Block Changes\",\n" " b.Consistent_Changes \"Consistent Changes\",\n" " c.Value*10 \"CPU (ms)\",\n" " a.last_call_et \"Last SQL\",\n" " a.Process \"Client PID\",\n" " e.SPid \"Server PID\",\n" " d.sql_text \"Current statement\",\n" " a.SQL_Address||':'||a.SQL_Hash_Value \" SQL Address\",\n" " a.Prev_SQL_Addr||':'||a.Prev_Hash_Value \" Prev SQl Address\"\n" " FROM v$session a left join v$sess_io b on ( a.sid = b.sid)\n" " left join v$sesstat c on ( a.sid = c.sid)\n" " left join v$sql d on (a.sql_address = d.address and\n" " a.sql_hash_value=d.hash_value and\n" " a.sql_child_number = d.child_number)\n" " left join v$process e on (a.paddr = e.addr)\n" " WHERE (c.statistic# = 12 OR c.statistic# IS NULL)\n" "%1 ORDER BY a.Sid", "List sessions, must have same number of columns and the first and last 2 must be the same", "1000"); static toSQL SQLSessions7( "toSession:ListSession", "SELECT a.Sid \"Id\",\n" " a.Serial# \"Serial#\",\n" " a.SchemaName \"Schema\",\n" " a.Status \"Status\",\n" " a.Server \"Server\",\n" " a.OsUser \"Osuser\",\n" " a.Machine \"Machine\",\n" " a.Program \"Program\",\n" " a.Type \"Type\",\n" " a.Module \"Module\",\n" " a.Action \"Action\",\n" " a.Client_Info \"Client Info\",\n" " b.Block_Gets \"Block Gets\",\n" " b.Consistent_Gets \"Consistent Gets\",\n" " b.Physical_Reads \"Physical Reads\",\n" " b.Block_Changes \"Block Changes\",\n" " b.Consistent_Changes \"Consistent Changes\",\n" " c.Value*10 \"CPU (ms)\",\n" " a.last_call_et \"Last SQL\",\n" " a.Process \"Client PID\",\n" " e.SPid \"Server PID\",\n" " d.sql_text \"Current statement\",\n" " a.SQL_Address||':'||a.SQL_Hash_Value \" SQL Address\",\n" " a.Prev_SQL_Addr||':'||a.Prev_Hash_Value \" Prev SQl Address\"\n" " FROM v$session a,\n" " v$sess_io b,\n" " v$sesstat c,\n" " v$sql d,\n" " v$process e\n" " WHERE a.sid = b.sid(+)\n" " AND a.sid = c.sid(+) AND (c.statistic# = 12 OR c.statistic# IS NULL)\n" " AND a.sql_address = d.address(+) AND a.sql_hash_value = d.hash_value(+)\n" " AND (d.child_number = 0 OR d.child_number IS NULL)\n" " AND a.paddr = e.addr(+)\n" "%1 ORDER BY a.Sid", "", "0703"); static toSQL SQLSessionsPg( "toSession:ListSession", "SELECT pg_stat_get_backend_pid ( s.backendid ) AS \"Backend ID\",\n" " ( SELECT u.usename\n" " FROM pg_user u\n" " WHERE u.usesysid = pg_stat_get_backend_userid ( s.backendid ) ) AS \"User\",\n" " ( SELECT datname\n" " FROM pg_database db\n" " WHERE db.OID = pg_stat_get_backend_dbid ( s.backendid ) ) AS \"Database\",\n" " pg_stat_get_backend_client_addr ( s.backendid ) AS \"From\",\n" " pg_stat_get_backend_client_port ( s.backendid ) AS \"Port\",\n" " pg_stat_get_backend_activity_start ( s.backendid ) AS \"Started\",\n" " pg_stat_get_backend_waiting ( s.backendid ) AS \"Waiting\",\n" " pg_stat_get_backend_activity ( s.backendid ) AS \"Current Query\",\n" " s.backendid AS \" current\",\n" " NULL AS \" previous\"\n" " FROM ( SELECT pg_stat_get_backend_idset ( ) AS backendid ) AS s", "", "", "PostgreSQL"); toSession::toSession(QWidget *main, toConnection &connection) : toToolWidget(SessionTool, "session.html", main, connection, "toSession") { QToolBar *toolbar = toAllocBar(this, tr("Session manager")); layout()->addWidget(toolbar); refreshAct = toolbar->addAction( QIcon(QPixmap(const_cast(refresh_xpm))), tr("Update sessionlist"), this, SLOT(refresh(void))); refreshAct->setShortcut(QKeySequence::Refresh); if (toIsOracle(connection)) { toolbar->addSeparator(); Select = new toResultCombo(toolbar, TO_TOOLBAR_WIDGET_NAME); Select->setSelected(tr("Only active users")); Select->additionalItem(tr("Only active users")); Select->additionalItem(tr("All")); Select->additionalItem(tr("No background")); Select->additionalItem(tr("No system")); Select->query(toSQL::sql(toSQL::TOSQL_USERLIST)); toolbar->addWidget(Select); connect(Select, SIGNAL(activated(int)), this, SLOT(refresh())); toolbar->addSeparator(); enableTimedAct = toolbar->addAction( QIcon(QPixmap(const_cast(clock_xpm))), tr("Enable timed statistics"), this, SLOT(enableStatistics(void))); disableTimedAct = toolbar->addAction( QIcon(QPixmap(const_cast(noclock_xpm))), tr("Disable timed statistics"), this, SLOT(disableStatistics(void))); toolbar->addSeparator(); disconnectAct = toolbar->addAction( QIcon(QPixmap(const_cast(kill_xpm))), tr("Disconnect selected session"), this, SLOT(disconnectSession(void))); toolbar->addSeparator(); } else { enableTimedAct = NULL; disableTimedAct = NULL; disconnectAct = toolbar->addAction( QIcon(QPixmap(const_cast(kill_xpm))), tr("Cancel selected backend"), this, SLOT(cancelBackend())); } toolbar->addWidget( new QLabel(tr("Refresh") + " ", toolbar)); Refresh = toRefreshCreate(toolbar, TO_TOOLBAR_WIDGET_NAME); connect(Refresh, SIGNAL(activated(const QString &)), this, SLOT(changeRefresh(const QString &))); toolbar->addWidget(Refresh); toolbar->addSeparator(); toolbar->addAction(QIcon(QPixmap(const_cast(add_xpm))), tr("Select all sessions"), this, SLOT(selectAll(void))); toolbar->addAction(QIcon(QPixmap(const_cast(minus_xpm))), tr("Deselect all sessions"), this, SLOT(selectNone(void))); toolbar->addWidget(new QLabel(tr("Filter"))); QLineEdit *filter = new QLineEdit; filter->setMinimumWidth(200); toolbar->addWidget(filter); connect(filter, SIGNAL(textChanged(const QString &)), this, SLOT(filterChanged(const QString &))); toolbar->addWidget(new toSpacer()); Total = new QLabel(toolbar); Total->setAlignment(Qt::AlignRight | Qt::AlignVCenter/* | Qt::ExpandTabs*/); toolbar->addWidget(Total); new toChangeConnection(toolbar, TO_TOOLBAR_WIDGET_NAME); QSplitter *splitter = new QSplitter(Qt::Vertical, this); layout()->addWidget(splitter); Sessions = new toResultTableView(true, false, splitter, "session list", false); Sessions->setAlternatingRowColors(true); Sessions->horizontalHeader()->setStretchLastSection(true); Sessions->setSelectionBehavior(QAbstractItemView::SelectRows); Sessions->setSelectionMode(QAbstractItemView::ExtendedSelection); Sessions->setReadAll(true); SessionFilter = new toSessionFilter; Sessions->setFilter(SessionFilter); connect(Sessions, SIGNAL(done()), this, SLOT(done())); ResultTab = new QTabWidget(splitter); CurrentStatement = new toSGAStatement(ResultTab); ResultTab->addTab(CurrentStatement, tr("Current Statement")); if (toIsOracle(connection)) { QString sql = toSQL::string(TOSQL_LONGOPS, connection); sql += " AND b.sid = :sid AND b.serial# = :ser order by b.start_time desc"; LongOps = new toResultLong(true, false, toQuery::Background, ResultTab); LongOps->setSQL(sql); ResultTab->addTab(LongOps, tr("Long ops")); StatisticSplitter = new QSplitter(Qt::Horizontal, ResultTab); SessionStatistics = new toResultStats(false, 0, StatisticSplitter); WaitBar = new toResultBar(StatisticSplitter); WaitBar->setSQL(SQLSessionWait); WaitBar->setTitle(tr("Session wait states")); WaitBar->setYPostfix(QString::fromLatin1("ms/s")); IOBar = new toResultBar(StatisticSplitter); IOBar->setSQL(SQLSessionIO); IOBar->setTitle(tr("Session I/O")); IOBar->setYPostfix(QString::fromLatin1("blocks/s")); ResultTab->addTab(StatisticSplitter, tr("Statistics")); Waits = new toWaitEvents(0, ResultTab, "waits"); ResultTab->addTab(Waits, tr("Wait events")); ConnectInfo = new toResultTableView(true, false, ResultTab); ConnectInfo->horizontalHeader()->setStretchLastSection(true); ConnectInfo->setSQL(SQLConnectInfo); ResultTab->addTab(ConnectInfo, tr("Connect Info")); PendingLocks = new toResultLock(ResultTab); ResultTab->addTab(PendingLocks, tr("Pending Locks")); LockedObjects = new toResultTableView(false, false, ResultTab); ResultTab->addTab(LockedObjects, tr("Locked Objects")); LockedObjects->setSQL(SQLLockedObject); AccessedObjects = new toResultTableView(false, false, ResultTab); AccessedObjects->setSQL(SQLAccessedObjects); ResultTab->addTab(AccessedObjects, tr("Accessing")); PreviousStatement = new toSGAStatement(ResultTab); ResultTab->addTab(PreviousStatement, tr("Previous Statement")); OpenSplitter = new QSplitter(Qt::Horizontal, ResultTab); ResultTab->addTab(OpenSplitter, tr("Open Cursors")); OpenCursors = new toResultTableView(false, true, OpenSplitter); OpenCursors->setSQL(SQLOpenCursors); OpenCursors->setSelectionBehavior(QAbstractItemView::SelectRows); connect(OpenCursors, SIGNAL(selectionChanged()), this, SLOT(changeCursor())); OpenStatement = new toSGAStatement(OpenSplitter); } else { LongOps = NULL; StatisticSplitter = NULL; SessionStatistics = NULL; WaitBar = NULL; IOBar = NULL; Waits = NULL; ConnectInfo = NULL; PendingLocks = NULL; AccessedObjects = NULL; PreviousStatement = NULL; OpenSplitter = NULL; OpenCursors = NULL; OpenStatement = NULL; LockedObjects = new toResultTableView(false, false, ResultTab); ResultTab->addTab(LockedObjects, tr("Locked Objects")); LockedObjects->setSQL(SQLLockedObject); } connect(Sessions, SIGNAL(selectionChanged()), this, SLOT(changeItem())); connect(ResultTab, SIGNAL(currentChanged(int)), this, SLOT(changeTab(int))); try { connect(timer(), SIGNAL(timeout(void)), this, SLOT(refreshTabs(void))); toRefreshParse(timer()); } TOCATCH; CurrentTab = CurrentStatement; ToolMenu = NULL; connect(toMainWidget()->workspace(), SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(windowActivated(QMdiSubWindow *))); refresh(); QList list; list.append(999); list.append(1); splitter->setSizes(list); setFocusProxy(Sessions); } bool toSession::canHandle(toConnection &conn) { return toIsOracle(conn) || toIsPostgreSQL(conn); } void toSession::selectAll() { Sessions->selectAll(); } void toSession::selectNone() { Sessions->clearSelection(); } void toSession::windowActivated(QMdiSubWindow *widget) { if (!widget) return; if (widget->widget() == this) { if (!ToolMenu) { ToolMenu = new QMenu(tr("&Session"), this); // don't use toIs here. causes crash on // shutdown when windows are closed/changed. if (refreshAct) ToolMenu->addAction(refreshAct); ToolMenu->addSeparator(); if (enableTimedAct) ToolMenu->addAction(enableTimedAct); if (disableTimedAct) ToolMenu->addAction(disableTimedAct); if (enableTimedAct || disableTimedAct) ToolMenu->addSeparator(); if (disconnectAct) { ToolMenu->addAction(disconnectAct); ToolMenu->addSeparator(); } toMainWidget()->addCustomMenu(ToolMenu); } } else { delete ToolMenu; ToolMenu = NULL; } } void toSession::refresh(void) { try { QModelIndex item = Sessions->currentIndex(); if(item.isValid()) { Session = Sessions->model()->data(item.row(), 1).toString(); Serial = Sessions->model()->data(item.row(), 2).toString(); } else Session = Serial = QString::null; QString sql = toSQL::string(SQLSessions, connection()); if (toIsOracle(connection())) { QString extra; if (Select->currentIndex() == 0) extra = " AND a.Type != 'BACKGROUND' AND a.Status != 'INACTIVE'\n"; else if (Select->currentIndex() == 1) ; // Do nothing else if (Select->currentIndex() == 2) extra = " AND a.Type != 'BACKGROUND'\n"; else if (Select->currentIndex() == 3) extra = " AND a.SchemaName NOT IN ('SYS','SYSTEM')\n"; else extra = " AND a.SchemaName = '" + Select->currentText() + "'\n"; sql = sql.arg(extra); } Sessions->setSQL(sql); Sessions->refresh(); } TOCATCH; } void toSession::done(void) { int system = 0; int total = 0; int active = 0; for (toResultTableView::iterator it(Sessions); (*it).isValid(); it++) { QString session = Sessions->model()->data((*it).row(), 1).toString(); QString serial = Sessions->model()->data((*it).row(), 2).toString(); QString user = Sessions->model()->data((*it).row(), 9).toString(); QString act = Sessions->model()->data((*it).row(), 4).toString(); if(session == Session && serial == Serial) { Sessions->selectionModel()->select( QItemSelection(*it, *it), QItemSelectionModel::ClearAndSelect); Sessions->setCurrentIndex(*it); } total++; if(user != "USER") system++; else if(act == "ACTIVE") active++; } Total->setText(QString("Total %1 (Active %3, System %2)") .arg(total).arg(system).arg(active)); } void toSession::enableStatistics(bool enable) { QString sql; if (enable) sql = QString::fromLatin1("ALTER SYSTEM SET TIMED_STATISTICS = TRUE"); else sql = QString::fromLatin1("ALTER SYSTEM SET TIMED_STATISTICS = FALSE"); try { connection().execute(sql); } catch (...) { toStatusMessage(tr("No access to timed statistics flags")); } } void toSession::changeTab(int index) { QWidget *tab = ResultTab->widget(index); if (tab != CurrentTab) { CurrentTab = tab; QModelIndex item = Sessions->currentIndex(); if(!item.isValid()) return; QString connectionId = Sessions->model()->data(item.row(), 1).toString(); QString serial = Sessions->model()->data(item.row(), 2).toString(); if (CurrentTab == StatisticSplitter) { int ses = connectionId.toInt(); try { SessionStatistics->changeSession(ses); } TOCATCH; } else if (CurrentTab == ConnectInfo) { ConnectInfo->clearParams(); ConnectInfo->changeParams(connectionId); } else if (CurrentTab == LongOps) { LongOps->clearParams(); LongOps->changeParams(connectionId, serial); } else if (CurrentTab == PendingLocks) { PendingLocks->clearParams(); PendingLocks->query(connectionId); } else if (CurrentTab == OpenSplitter) { QModelIndex openitem = OpenCursors->selectedIndex(2); QString address; if(openitem.isValid()) address = openitem.data().toString(); OpenCursors->clearParams(); OpenCursors->changeParams(connectionId); if (!address.isEmpty()) { for (toResultTableView::iterator it(OpenCursors); (*it).isValid(); it++) { if(address == OpenCursors->model()->data(*it).toString()) { OpenCursors->selectionModel()->select( QItemSelection(*it, *it), QItemSelectionModel::ClearAndSelect); OpenCursors->setCurrentIndex(*it); } } } } else if (CurrentTab == CurrentStatement) { QModelIndex sindex = Sessions->model()->index( item.row(), Sessions->model()->columnCount() - 2); if(sindex.isValid()) CurrentStatement->changeAddress(sindex.data().toString()); } else if (CurrentTab == AccessedObjects) { AccessedObjects->clearParams(); AccessedObjects->changeParams(connectionId); } else if (CurrentTab == LockedObjects) { LockedObjects->clearParams(); LockedObjects->changeParams(connectionId); } else if (CurrentTab == PreviousStatement) { QModelIndex sindex = Sessions->model()->index( item.row(), Sessions->model()->columnCount() - 1); if(sindex.isValid()) PreviousStatement->changeAddress(sindex.data().toString()); } } } void toSession::changeCursor() { QModelIndex item = OpenCursors->selectedIndex(2); if (item.isValid()) OpenStatement->changeAddress(item.data().toString()); } void toSession::cancelBackend() { QModelIndexList selected = Sessions->selectionModel()->selectedRows(1); foreach(QModelIndex item, selected) { if(!item.isValid()) return; try { connection().execute( QString("SELECT pg_cancel_backend ( %1 )").arg(item.data().toString())); } TOCATCH; } } void toSession::disconnectSession() { QModelIndexList selected = Sessions->selectionModel()->selectedRows(); if(selected.isEmpty()) return; QString str(tr("Let transaction(s) finish before disconnecting?")); QString sql; bool letcommit = false; switch (TOMessageBox::warning(this, tr("Commit work?"), str, tr("&Yes"), tr("&No"), tr("Cancel"))) { case 0: letcommit = true; break; case 1: letcommit = false; break; case 2: return; } foreach(QModelIndex item, selected) { if(!item.isValid()) return; QString connectionId = Sessions->model()->data(item.row(), 1).toString(); QString serial = Sessions->model()->data(item.row(), 2).toString(); QString sess = QString::fromLatin1("'"); sess.append(connectionId); sess.append(QString::fromLatin1(",")); sess.append(serial); sess.append(QString::fromLatin1("'")); if(letcommit) { sql = QString::fromLatin1("ALTER SYSTEM DISCONNECT SESSION "); sql.append(sess); sql.append(QString::fromLatin1(" POST_TRANSACTION")); } else { sql = QString::fromLatin1("ALTER SYSTEM KILL SESSION "); sql.append(sess); } try { // oracle can take an awful long time to return toQList params; toEventQuery *query = new toEventQuery(connection(), sql, params); connect(query, SIGNAL(done()), query, SLOT(deleteLater())); query->start(); } TOCATCH; } } void toSession::changeRefresh(const QString &str) { try { toRefreshParse(timer(), str); } TOCATCH; } void toSession::changeItem() { QModelIndex selected = Sessions->currentIndex(); if(!selected.isValid()) return; QString item = Sessions->model()->data(selected.row(), 1).toString(); if (LastSession != item) { if (!item.isEmpty()) { if (WaitBar) WaitBar->changeParams(item); if (IOBar) IOBar->changeParams(item); if (Waits) Waits->setSession(item.toInt()); } LastSession = item; } QWidget *t = CurrentTab; CurrentTab = NULL; changeTab(ResultTab->indexOf(t)); } void toSession::refreshTabs(void) { changeItem(); } void toSession::filterChanged(const QString &text) { SessionFilter->setFilterString(text); Sessions->applyFilter(); } tora-2.1.3/src/i18n/0000755000175000017500000000000011445450571013624 5ustar michaelmichaeltora-2.1.3/src/i18n/tora_it.ts0000644000175000017500000175170011354412714015644 0ustar michaelmichael @default Unknown exception Errore sconosciuto QObject Failed to set new default date format for session: %1 Open File utils/toOpenFilename Save File utils/toSaveFilename ShortcutEditorDialog Shortcut Error The value you entered as a key (%1) is not unique. Enter another one, please. Some of key values are empty. These items will be lost. Do you want to return to the shortcut editor to fix it? Save Shortcuts Sqliteman Shortcuts XML (*.xml);;All Files (*) Export Error Cannot open file %1 for writting. Load Shortcuts Load Error Cannot open file %1 for reading. Editor Shortcuts Define Editor Shortcuts &Import... &Add &Aggiungi &Remove &Rimuovi R&emove All E&xport... ShortcutModel Shortcut Expanded Text main Loaded plugin %1 Caricato il plugin %1 Unhandled exception Eccezione non gestita Exit Uscita Unknown type Tipo sconosciuto qSqlSetting Posibility to break MySQL queries (Can require more connections) toAbout Quotes Citazioni TOra for Windows License Licenza di TOra per Windows GNU General Public License GNU General Public LIcense toAboutUI toAboutUI toAboutUI &Ok &Ok Cancel Annulla toAlert Alert Messenger Avvisi Registered Registrato Register current Registra Remove registered Elimina Name Nome Message Messaggio Edit message in memo Modifica messaggio nel memo Send alert Invia avviso Time Tempo Failed to start polling thread, try closing some other tools and restart Alert Messenger Impossibile avviare il monitor, prova a chiudere gli altri tool e a riavviare l'Alert Messenger &Add name &Aggiungi nome &Remove name &Rimuovi nome Edit &name Modifica &nome Edit &message Modifica &messaggio &Message in memo... &Modifica messaggio nel memo ... &Send alert &Invia avviso &Alert &Avvisi toAnalyze Analyze Analizza Statistics Manager Gestione statistiche Refresh Aggiorna All Tutto Not analyzed Non analizzato Analyzed Analizzato Tables Tabelle Indexes Indici Compute statistics Calcola statistiche Estimate statistics Stima statistiche Delete statistics Cancella statistiche Validate references Valida riferimenti for per Table Tabella Indexed columns Colonne indicizzate Local indexes Indici locali Sample Esempio % % Parallel Parallelo Start analyzing Inizia l'analisi Stop current run Interrompi esecuzione Explain plans Explain plans Worksheet statistics Statistiche per il foglio di lavoro &Refresh &Aggiorna &Statistics &Statistiche Running %1 Pending %2 Attive %1 In attesa %2 Display SQL Analyze table Optimize table Vacuum table Internal Error Execute Esegui toAttachDock toBackground %1 queries running in background. %1 query attive in background. One query running in background. Una query in background. No background queries. Nessuna query in background. toBackup Backup Manager Gestione backup Update Aggiorna Logswitches per day and hour Logswitches per giorno e ora Redo Switches Redo Switches Archived Logs Archived Logs Last Backup Ultimo Backup Backup Progress Progresso Backup &Refresh &Aggiorna &Backup Manager &Gestione backup This appears to be a cold backup database Sembra essere un backup a freddo This appears to be a hot backup database Sembra essere un backup a caldo toBackup:CurrentBackup % Complete % completamento Context Contesto Serial# Numero di serie Sid Sid So Far Fino ad ora Total Totale toBackup:LastBackup Bytes Written Bytes scritti Checkpoint Time Intervallo di controllo Ckpt Change# Ckpt Canghe# Completion Time Tempo di completamento File Size Dimensione del file Filename Nome file Level Livello Logically Corrupt Corrotto logicamente Media Crpt Media Crpt Mrkd Crpt Mrkd Crpt Type Tipo toBackup:LogHistory Controlfile Recid Controlfile Stamp Highest Scn Scn Massimo Lowest Scn Scn Minimo Sequence# Sequence# Thread# Thread# Time Of First Entry toBackup:LogSwitches 00 00 01 01 02 02 03 03 04 04 05 05 06 06 07 07 08 08 09 09 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 Date Data toBarChart Zoom Zoom toBrowser No schemas Nessuno schema DB Browser DB Browser Update from DB Aggiorna dal DB Define the object filter Definire filtro su oggetti Remove any object filter Rimuovere ogni filtro su oggetti T&ables T&abelle Table browser Visualizzatore tabelle Create new table Crea nuova tabella Modify table columns Modifica colonne della tabella Modify constraints Modifica constraints Modify indexes Modifica indici &Columns &Colonne &Indexes &Indici C&onstraints C&onstraints &Grants &Grants Triggers Trigger &Data &Dati Information Informazioni Script Script &Views &Viste SQL SQL De&pendencies Di&pendenze Inde&xes Indi&ci Info Info Se&quences Se&quenze S&ynonyms S&inonimi Cod&e Codic&e &Declaration &Dichiarazione B&ody C&orpo Tri&ggers Tri&ggers C&ode C&odice &Refresh &Aggiorna &Change Schema &Cambia Schema Change &Object Cambia &Oggetto &Define filter... &Definisci un filtro ... &Clear filter &Elimina filtri &Browser Schema &Browser Data Dati Indexes Indici Constraints Constraints Tables Tabelle Columns Colonne Grants Grants Dependencies Dipendenze Views Viste Sequences Sequenze Code Codice Synonyms Sinonimi Define the object filter for database browser Definisci filtro sugli oggetti per il database browser Remove any object filter for database browser Elimina ogni filtro sugli oggetti per il database browser Extents Extents Enable constraint or trigger Disable constraint or trigger Database browser Drop table Add indexes Drop index Test DBLink Add user Drop user DBLinks Access Truncate table Check table Optimize table Analyze table Change type Modify index Create index Refresh Aggiorna Dropping %1? Are you sure you want to drop the %1 %2.%3, this action can not be undone? &Yes &Si &Cancel Executing %1 change script Stop Performing %1 changes Canceled ongoing %1 modification, %2 might be corrupt Truncate table? Are you sure you want to truncate the table %2.%3, this action can not be undone? Yes to &all toBrowser:AnyGrants Grantable Grant assegnabile Grantee Grant assegnata a Grantor Grant assegnata da Privilege Privilegio toBrowser:IndexCols Column Length Lunghezza colonna Column Name Nome colonna Descend Discendente Table Name Nome tabella toBrowser:IndexInformation Avg Data Blocks Per Key Avg Leaf Blocks Per Key Blevel Buffer Pool Clustering Factor Compression Compressione Degree Distinct Keys Chiavi distinte Domidx Opstatus Domidx Status Duration Durata Freelist Groups Freelists Funcidx Status Generated Generato Global Stats Statistiche Globali Include Column Index Name Nome indice Index Type Tipo Indice Ini Trans Initial Extent Extent iniziale Instances Istanze Ityp Name Ityp Owner Join Index Last Analyzed Leaf Blocks Logging Max Extents Max Trans Min Extents Next Extent Num Rows Numero di righe Owner Proprietario Parameters Parametri Partitioned Partizionato Pct Direct Access Pct Free Percentuale libera Pct Increase Percentuale di incremento Pct Threshold Percentuale di soglia Prefix Length Sample Size Secondary Secondario Status Stato Table Name Nome tabella Table Owner Proprietario della tabella Table Type Tipo Tabella Tablespace Name Nome tablespace Temporary Temporaneo Uniqueness Unicità User Stats toBrowser:ListCode Object Name Nome oggetto Object Type Tipo oggetto Type Tipo toBrowser:ListIndex Index Name Nome indice toBrowser:ListSequence Sequence Name Nome sequenza toBrowser:ListSynonym Synonym Name Nome sinonimo toBrowser:ListTables Table Name Nome tabella toBrowser:ListTrigger Trigger Name Nome trigger toBrowser:ListView View Name Nome vista toBrowser:SequenceInformation Cache Size Dimensione cache Cycle Flag Ciclica Increment By Incrementa di Last Number Ultimo numero Max Value Valore massimo Min Value Valore minimo Order Flag Ordinata Sequence Name Nome sequenza Sequence Owner Proprietario della sequenza toBrowser:SynonymInformation Db Link Db Link Owner Proprietario Synonym Name Nome sinonimo Table Name Nome tabella Table Owner Proprietario della tabella toBrowser:TableInformation Avg Row Len Avg Space Freelist Blocks Avg Space Backed Up Blocks Blocchi Buffer Pool Cache Cache Chain Cnt Cluster Name Nome del cluster Cluster Owner Proprietario del cluster Degree Dependencies Dipendenze Duration Durata Empty Blocks Blocchi Vuoti Freelist Groups Freelists Global Stats Statistiche Globali Ini Trans Initial Extent Extent iniziale Instances Istanze Iot Name Iot Type Last Analyzed Logging Max Extents Max Trans Min Extents Monitoring Nested Next Extent Num Freelist Blocks Num Rows Numero di righe Owner Proprietario Partitioned Partizionato Pct Free Percentuale Libera Pct Increase Percentuale di Incremento Pct Used Percentuale Utilizzata Row Movement Sample Size Secondary Secondario Skip Corrupt Salta se Corrotto Table Lock Table Name Nome tabella Tablespace Name Nome tablespace Temporary Temporaneo User Stats toBrowser:TableTrigger Column Name Nome colonna Description Descrizione Status Stato Trigger Name Nome trigger Triggering Event Evento scatenante toBrowser:TriggerCols Column Name Nome colonna In Update In aggiornamento Usage Utilizzo toBrowser:TriggerInfo Action Type Tipo di azione Base Object Type Column Name Nome colonna Description Descrizione Owner Proprietario Referencing Names Status Stato Table Name Nome tabella Table Owner Proprietario della tabella Trigger Name Nome trigger Trigger Type Tipo Trigger Triggering Event Evento scatenante When Clause Clausola WHEN toBrowserAccessWidget &User &Objects toBrowserConstraint Performing constraint changes Stop Canceled ongoing constraint modification, constraints might be corrupt Enter new constraint name Enter name of new constraint. toBrowserConstraintUI Constraint info Informazioni sulla constraint Display SQL to create this constraint Mostra l'SQL per creare questa constraint &Name &Nome C&ondition C&ondizione &Column &Colonna &Columns &Colonne &Type &Tipo Primary key Chiave primaria Unique Unico &Primary key/Unique Chiave &primaria/Unico Refers &To Riferi&to A R&efered columns Colonne R&eferenziate &Referential &Referenziale &Apply &Applica Close Chiudi Foreign Key Check Unique Primary Key Cancel &Ok &Ok toBrowserDBLinksWidget status: FAILED status: OK toBrowserFilterUI Filter setting Impostazioni del filtro &Ok &Ok Cancel Annulla Filter on name Filtro sui nomi &No filter A&nnulla filtro &Start with &Inizia con Object name start with Nome oggetto inizia con &End with &Finisce con Object name ends in Nome oggetto finisce con &Contains &Contiene Object name contains Nome oggetto contiene &RegExp &RegExp Object name matches RegExp Nome oggetto corrisponde alla RegExp &Comma list Comma separated list of object names Lista di nomi oggetto separati da virgole Filter on tablespace Filtro su tablespace Include &All Includi &Tutti &Include &Includi &Exclude &Escludi Only display own schema Mostra solo il proprio schema Ignore &Case Ignora &Maiuscole/Minuscole &Invert selection toBrowserIndex Executing index change script Stop Performing index changes Canceled ongoing index modification, indexes might be corrupt Enter new index name Enter name of new index. toBrowserIndexUI Index name Nome indice &Name &Nome Display SQL to create this constraint Mostra l'SQL per creare questa constraint Cancel Annulla &Ok &Ok &Columns &Colonne &Type &Tipo Normal Normale Primary key Chiave primaria Unique Unico Bitmap Bitmap Normal Index Unique Index Type Tipo toBrowserIndexWidget &Statistic toBrowserTable Performing table changes Name Nome Datatype Extra parameters Stop Canceled ongoing table modification, table might be corrupt &Database &Database toBrowserTableUI Table columns Colonne tabella &Ok &Ok Cancel Annulla Display SQL to create this constraint Mostra l'SQL per creare questa constraint &Tablespace &Tablespace C&omment C&ommento &Name &Nome &General &Generale &Columns &Colonne &Extra declarations &Parallel declarations &Storage declarations Custom column declarations &Schema toBrowserTool &Table &Index &Constraint &Create toChangeConnection Change the connection of the tool. Cambia la connessione. Couldn't find selected connection Impossibile trovare la connessione selezionata Couldn't find parent connection. Internal error. Impossibile trovare la connessione padre. Errore interno. toChartAlarm Email Email toChartAlarmUI Chart alarm Any Qualsiasi All Tutto Sum Somma Average Media Max Max Min Min Statusmessage Messaggio di stato Email Email Ignore Ignora = = != != < < > > <= <= >= >= Operation Operazione Operation to perform on the selected columns Operazione da eseguire sulle colonne selezionate Value Valore Value to use in comparison. Valore da usare nella comparazione. Comparison Confronto What comparison to do with the result from the above operation. Quale operazione eseguire con il risultato dell'operazione. Action Azione What to do when alarm is triggered. Cosa fare quando l'allarme è attivato. &Ok &Ok Cancel Annulla Persistent Persistente Remember this alarm when restarting TOra. Ricorda questo allarme al riavvio di TOra. Remember this alarm when restarting. toChartHandler ALARM: ALARM: TOra alert: Avviso di TOra: A defined alert value was detected: %1 At: %2 Alarms Avvisi Persistent Persistente Temporary Temporaneo toChartManager Chart Manager Gestione grafici Refresh list Aggiorna lista Open tracker file Setup chart Connection Connessione Title Titolo ID ID Tracking Alarms Avvisi &Refresh &Aggiorna &Chart Manager &Gestione grafici ALARM: ALARM: TOra alert: Avviso di TOra: Initial value didn't start with " in CSV file Valore iniziale privo di " nel file CSV Missing closing " in CSV file " di chiusura mancante nel file CSV Chart format Formato del grafico Select format of the chart to display Seleziona il formato del grafico Barchart Grafico a barre Linechart Grafico a linee Cancel Annulla Persistent Persistente Temporary Temporaneo toChartSetup Charts Grafici Persistent Persistente Temporary Temporaneo toChartSetupUI Chart manager setup Inizializzazione della gestione grafici Track chart to file Traccia il grafico su file Browse Sfoglia Persistent Persistente Remember to track this chart to this file always when starting TOra. Ricorda di tracciare questo grafico sempre su questo file all'avvio di TOra. Enable tracking Abilita la tracciatura Filename Nome file Alarms Avvisi &Add &Aggiungi Remove Rimuovi Modify Modifica Cancel Annulla &Ok &Ok Remember to track this chart to this file always when starting. toChartTool Chart Manager... Gestione grafici ... Chart Manager Gestione grafici toCheckLicense Welcome to TOra Benvenuti in TOra (Personal license, not for commerical use) (Licenza personale, per uso non commerciale) (Commercial license one user) (Licenza commerciale, un utente) (Commerical site license) (Licenza commerciale) (Commercial license %1 users) (Licenza commerciale %1 utenti) Welcome to TOra (Unregistered version, not for commercial use) Benvenuti in TOra (Versione non registrata, per uso non commerciale) toCodeModel Code Codice Package Procedure Function Type Tipo toConnection All tool widgets need to have autodelete flag set Tutti i componenti dello strumento devono avere il flag di autocancellazione settato Not done caching objects, can not clear unread cache Cache degli oggetti non completata, impossibile vuotare la cache non letta Waiting for object caching to be completed. Canceling this dialog will probably leave some list of database objects empty. In attesa di completare la cache degli oggetti. Chiudere questa finestra lascierà alcune liste di oggetti del database vuote. Cancel Annulla Waiting for object cache In attesa di completare la cache degli oggetti Not done caching objects Cache degli oggetti non completata Object %1 not available for %2 L'oggetto %1 non disponibile per %2 Parse only not implemented for this type of connection toConnectionImport Import connections from an XML file. No passwords or options are imported. Import connections from tool config directory. Import connections from ~/.torarc Select one of tools available. Connections could require manual changes after importing. Seleziona una delle origini a disposizione. Potrebbero essere richieste modifiche manuali dopo l'importazione. Import Connections Importa le connessioni &From: Origine: &Run... &Esegui... toConnectionProvider Tried to fetch unknown provider %1 Tentativo di contattare una fonte sconosciuta %1 toConnectionWidget toConnectionWidget not inherited with a QWidget toCurrent Current Session Sessione corrente Update Aggiorna Privilege Privilegio Type Tipo Grantable Grant assegnabile Privileges Privilegi Version Versione Parameters Parametri Statistics Statistiche Resource Limits Limitazioni sulle Risorse &Refresh &Aggiorna &Current Session &Sessione Corrente System Sistema Object Oggetto Role Ruolo toCurrent:ResourceLimit Current Utilization Utilizzazione corrente Initial Allocation Allocazione iniziale Limit Value Valore limite Max Utilization Utilizzo massimo Resource Name Nome della risorsa toCurrent:Version Version Versione toCurrentConnection Couldn't find parent connection. Internal error. Impossibile trovare la connessione padre. Errore interno. toCurrentTool Couldn't find parent tool. Internal error. Impossibile trovare il tool superiore. Errore interno. toDatabaseSetting Invalid values Valori non validi Doesn't make sense to have max content less than initial fetch size. Will adjust value to be higher. Non è corretto avere una dimensione massima inferiore alla dimensione minima iniziale. Il valore verrà aumentato. &Ok &Ok toDatabaseSettingUI toDatabaseSettingUI &Autocommit changes Salva automaticamente i cambiamenti sul DB (&Autocommit) Specify if changes should be automatically committed. Specificare se i cambiamenti devono essere committati automaticamente. UI feedback settings Impostazioni di risposta dell'interfaccia Abort long running queries and reexecute in own connection Interrompi le query lente e rieseguile in una connessione separata Reexecute a query taking more than 30 seconds in its own connection to prevent blocking other database access. Riesegui una query che impiega più di 30 secondi in una connessione separata per evitare di bloccare gli altri accessi al db. Move to own connection after Sposta ad una connessione separata dopo seconds secondi Run UI blocking queries exclusively in main thread Esegui query che bloccano l'interfaccia solo nel thread principale Let the background queries normally running on the main connection run in a separate connection. Esegui le query in background in una connessione separata invece che nella connessione principale. Don't reread data if parameters are exactly same Non rileggere i dati se i parametri sono gli stessi If checked TOra will not refresh a result if it is reexecuted exactly the same two times in a row. Se selezionato TOra non aggiornerà il risultato se viene eseguito due volte di seguito. Query settings Impostazioni delle query Maximum size &display The largest default size of a column in query results. La larghezza massima di una colonna nei risultati della query. &All &Tutte &Initial rows to fetch in query Numero iniziale di &righe da recuperare nella query The number of rows to always fetch when executing a query. Numero di righe da recuperare sempre quando si esegue una query. Number of rows to initially start reading in content editor, use unlimited on slow connections. Numero di righe da leggere inizialmente nell'editor, usare illimitato con connessioni lente. Indicate empty values as '' instead of NULL as {null}. Indica i valori vuoti come " invece di NULL come {null}. Start read object cache when needed Iniziate a leggere la cache degli oggetti quando necessario Read object cache on connect Leggi la cache degli oggetti alla connessione Never read object cache until mandatory Non leggere mai la cache degli oggetti finchè non è obbligatorio Never read object cache (Will leave parts of application nonfunctianal) Dataformat Number format The way numbers should be presented. Number of decimals for fixed decimal format. Default Standard Scientific Fixed decimal Alt+A Initially &read in content editor When enabled idle queries will request data at regular intervals to keep the connection alive. &Firewall Mode Indicate empty values as '' instead of &NULL as {null}. NULL background color &Decimals toDatatype <B>(</B> <B>,</B> <B>)</B> toDebug Head Testata Body Corpo Misc Varie Expected function or procedure, internal error Funzione o procedura non attesa, errore interno Unexpected end of declaration. Fine inattesa della dichiarazione. Input Input Couldn't find any function or procedure under cursor. Impossibile trovare una funzione o procedura sotto il cursore. Anonymous Anonimo Output Returning Failed to get runtime info (Reason %1) [Count %1] {Unavailable} DEFERED No running target Debugger Debugger Update object list Aggiorna la lista degli oggetti Clean sheet Vuota il foglio Compile Compila Run current block Esegui il blocco corrente Stop running Interrompi l'esecuzione Show/hide debug info pane. Mostra/nascondi il pannello di informazioni per il debug. Go to next error Vai al prossimo errore Go to previous error Vai all'errore precedente Objects Oggetti Contents Contenuti Object Oggetto Line Schema Schema Type Tipo &Stack Trace Variable Variabile Data Dati W&atch Object Type Tipo oggetto Enabled Abilitato &Breakpoints &Breakpoints Name Nome Content Contenuto &Parameters &Parametri Debug &Output &Runtime Log Failed to start target task thread, close some other tools and try again Couldn't start debugging Impossibile avviare il debugging Couldn't connect to target session: &Ok &Ok Stop execution? Interrompere l'esecuzione? Do you want to abort the current execution? Vuoi interrompere l'esecuzione corrente? Cancel Annulla &Compile &Compila &Discard changes &Scarta le modifiche &New Sheet &Nuovo foglio S&can Source &Execute &Esegui &Stop &Stop Step &Into &Next Line Li&nea Successiva &Return From &Debug Pane Next &Error &Errore Successivo Pre&vious Error Errore &Precedente &Toggle Breakpoint D&isable Breakpoint &Add Watch... Delete &Watch Chan&ge Watch... Refresh Object List Aggiorna la lista degli Oggetti Select Schema Seleziona lo Schema Erase Runtime &Log &Debug &Debug Enter new value to the watch %1 Unimplemented in PL/SQL debug interface Non implementato nell'interfaccia di debug del PL/SQL Assignment failed (Reason %1) Assegnazione fallita (Motivo %1) DISABLED DISABILITATO ENABLED ABILITATO Can not enable breakpoint, not a valid line. Perhaps needs to recompile. Impossibile abilitare il breakpoint, linea non valida. Forse è necessario ricompilare. Can not enable breakpoint, not a valid object. Perhaps needs to compile. Impossibile abilitare il breakpoint, oggetto non valido. Forse è necessario compilare. NOT SET NON IMPOSTATO Failed to remove breakpoint (Reason %1) Impossibile rimuovere il breakpoint (Motivo %1) body {No debug info} Unknown Sconosciuto %1 changed %1 changed. Continuing will discard uncompiled or saved changes Close Chiudi &Execute or continue Refresh Aggiorna Close All toDebugChangeUI Change value of watch NULL NULL Cancel Annulla &Ok &Ok &Index toDebugOutput Couldn't enable/disable output for session Impossibile abilitare/disabilitare l'output per la sessione toDebugText Invalid start of code Inizio del codice non valido toDebugWatch Can't parse location toDebugWatchUI Add variable watch Cancel Annulla &Ok &Ok &Variable name Nome &Variabile Variable name to watch. &Scope &Local Currently running scope. The scope of the file in the body editor. &Global &Globale Global scope of variable. &Autodetect &Package toDescribe Object %1 (%2) cannot be described Describe toDropTablespaceUI Form1 Form1 Options even if there is some forerign key referencing them Delete datafiles Drop even if it contains objects toEditExtensionGotoUI Go to line &Ok &Ok &Cancel Line Number toEditExtensionSetupUI Form1 Form1 &Right align keywords in each statement. &Allinea a destra le parole chiave in ogni costrutto. Insert a &newline after each block Inserisci una &nuova linea dopo ogni blocco Place THEN, LOOP, AS and IS on new line at b&eginning of new block Scrivi THEN, LOOP, AS &e IS su una nuova riga all'inizio di un nuovo blocco Place &comma on new line before item instead of after on same line Inseris&ci una virgola in una nuova riga prima dell'oggetto invece che dopo sulla stessa &Expand spaces to tabs when indenting &Espandi gli spazi alle tabulazioni durante l'indentazione Transform spaces to tabs whenever posible when indenting. Trasforma gli spazi in tabulazioni, se possibile, durante l'indentazione. Put spaces around operators Inserisci spazi intorno agli operatori Insert extra spaces between operators. Inserisci spazi aggiuntivi tra gli operatori. Transform keywords to &uppercase Trasforma le parole chiave in &maiuscolo &Indentation level &Livello di indentazione &Same line comment column Inizia i commenti nella &stessa riga alla colonna Example Esempio Auto indent read only SQL text editors Indenta automaticamente gli editor di testo SQL in sola lettura Allow Drag and Drop Consenti trascinamento toEditExtensionTool Forward Avanti Backward Indietro Incremental Search Ricerca incrementale Selection Selezione Editor Editor Obfuscate Selection Selezione tutta su una riga Obfuscate Editor Tutto su una riga Auto Indent Indentazione Automatica Indent Block Indenta il blocco De-indent Block Annulla indentazione del blocco Indent block in editor Indenta il blocco nell'editor De-indent block in editor Annulla indentazione del blocco nell'editor Upper Maiuscole Lower Minuscolo Modify Case Maiuscole/minuscole Goto Line Bookmarks Segnalibri Quote Selection UnQuote Selection Comment or Uncomment Commenta o Decommenta Complete toEditExtensions Go to line Line Number toEditableMenu Remove Rimuovi toEventQuery Read past end of query toExtract Failed to extract owner and name from (%1), internal error %2 Impossibile ricavare il proprietario e il nome da (%1), errore interno %2 CREATE CREATE Creating create script Costruzione dello script di creazione Cancel Annulla Creating script Creazione dello script Creating script was cancelled La creazione dello script è stata annullata Internal error, missing : in object description Errore interno, manca : nella descrizione dell'oggetto Invalid type %1 to create Create Crea Creating description Creazione della descrizione Invalid type %1 to describe Describe DROP DROP Creating drop script Creazione dello script di drop Creating drop script was cancelled La creazione dello script di drop è stata annullata Invalid type %1 to drop Drop script Dropt script Invalid describe context (<3 parts) "%1") Object list not available in migration Lista degli oggetti non disponibile nella migrazione MIGRATE MIGRATE Creating migration script Creazione dello script di migrazione Invalid type %1 to migrate Migration script Script di migrazione Error in toExtract Operation: %1 Object: %2 Error: %3 Malformed resize string (Should contain multiple of 3 number of ':') More than one definition for column %1 Same kind of definition existing more than once for column %1 Creating script was canceled Describe was canceled Creating drop script was canceled -- Generating free space report for: -- -- Generating %1 statement for: toGetSessionType Failed to find style match Impossibile trovare uno stile corrispondente toGlobalSetting Open Plugin Directory toGlobalSettingUI toGlobalSettingUI Paths Percorsi &Custom SQL Browse Sfoglia &Plugin directory Direcroty dei &plugin Directory where to find plugins when starting tora. Cartella in cui cercare i plugin all'avvio di TOra. &Help directory Directory dell'&help Default session Sessione di default What session to use by TOra when saving session. File di sessione usato da TOra per salvare la sessione. Options Opzioni &Save passwords &Salva password Remember the last password you used to connect. Will leave the password unencryptet in the config file. Salva l'ultima password usata per connettersi. Lascia la password non criptata nel file di configurazione. Include DB in caption Inserisci il DB nelle informazioni Include database connection in window captions Includi la connessione al database nelle informazioni della finestra Change current connection with active window Cambia la connessione attuale con la finestra attiva Change currently select connection to the connection of the new active window Cambia la connessione selezionata con la connessione della nuova finestra attiva Connect history Connessioni archiviate Number of connections to save in history. Numero di connessioni da archiviare. Message history Archivio messaggi Number of status messages to save in the message history. Numero di avvisi di stato da salvare nell'archivio messaggi. seconds secondi Status &message &Messaggio di stato The time in seconds temporary messages will be displayed in the status bar. 0 menas keep. Il tempo in secondi per cui saranno mostrati i messaggi nella barra di stato. 0 significa sempre. Display alerts in statusbar only Mostra gli avvisi solo nella barra di stato Display alerts in messagebar instead of poping up a dialog with a warning. Mostra gli avvisi nella barra dei messaggi invece di aprire una finestra con l'avviso. Tools toolbar on left Barra degli strumenti sul lato sinistro Start using the tools toolbar on the left of the main window instead of at the top. Inizia con la barra degli strumenti sulla sinistra della finestra principale invece che sopra. Maximize window on start Massimizza la finestra all'avvio Restore session on startup Ripristina la sessione all'avvio Colors get really weird in KDE if you select this. I colori diventano davvero strani nel KDE se selezioni questo. &Antialiase fonts Usa l'&Antialias per i caratteri Use antialiase fonts if Qt supports this. You need to restart tora for this to take affect. Usa i font con antialias se supportati da QT. E' necessario riavviare TOra per questo. &Style &Stile The style to use for the user interface. Lo stile da usare per l'interfaccia. Size Unit Unità di dimensione Define the unit sizes should be displayed in tora. Definisci l'unità di dimensione da usare in TOra. Bytes Bytes KB KB MB MB Text Testo Tab delimited Delimitato da tabulazioni CSV CSV HTML HTML Default list format Formato standard delle liste &Refresh &Intervallo di aggiornamento Default refreshtime in tools. Tempo di refresh standard per gli strumenti. Chart samples Number of samples to keep in line and barcharts by default. Numero di campioni da conservare nei grafici. Unlimited Illimitati Save unlimited number of samples. Can large amounts of consume memory. Salva un numero illimitato di campioni. Può consumare molta memoria. Display samples Number of samples to display in line and barcharts by default. Numero di campioni da mostrare nei grafici. All Tutto Display all available samples Mostra tutti i campioni disponibili Check for upgrades on startup Cerca aggiornamenti all'avvio Check the TOra webpage for upgrades to the program. Does not send any information about the users computer or TOra installation. Controlla la pagina internet di TOra per nuove versioni. Non invia informazioni riguardo il computer o l'installazione di TOra. Translation Traduzione Which translation locale to use for this program. Must restart to have effect. Quale lingua usare per questo programma. Dovete riavviare per renderla effettiva. Directory where to find plugins when starting. Cartella in cui cercare i plugin all'avvio. &Cache directory Directory della cache Directory where to place cached dataaseinformation. Directory where to find help files. Cartella con i file della guida. Default session to use when saving a session. Define the unit sizes should be displayed. Use Disk Caching Usare la cache del disco Use Disk Caching of ObjectLists and Synonyms Remember the last password you used to connect. Will leave the password unencrypted in the config file. Alt+S The time in seconds temporary messages will be displayed in the status bar. 0 means keep. Save unlimited number of samples. Can consume large amounts of memory. SMTP Server : Use TOAD keybindings instead of classic TOra. Prefer TOAD key bindings Show grid lines in output results table. Mostra la griglia nella tabella dei risultati Display gridlines in results Mostra la griglia nei risultati Arrange Tools in Tabs Organizza gli Strumenti in Schede toHelp Contents Contenuti Search Cerca All manuals Tutti i manuali Result Risultato Manual Manuale TOra Help Browser TOra Help Browser Backward one help page Indietro di una pagina Forward one help page Avanti di una pagina TOra manual Manuale di TOra Missing parent, unbalanced dl in help file content Nodo mancante, dl non bilanciato nel contenuto del file di help Help window Finestra dell'help Help Browser F1 Dialog|Help Search: Cerca: Manuals: Manuali toHelpAddFileUI Add help directory Aggiungi cartella di help &Browse &Sfoglia Canel Annulla &Ok &Ok &Table of contents file &File di indice &Title &Titolo Cancel toHelpPrefs File error Errore nel file toHelpSetupUI Form1 Form1 Add manuals from an Oracle index page. Aggiungi manuali da una pagina Oracle. Add manuals from an Oracle index page. This is the index page that links to the actual manuals. Not the master index page that links to different categories of manuals. Aggiungi manuali da una pagina index Oracle. E' la pagina indice che si collega ai manuali. Non la pagina principale che si collega alle varie categorie di manuali. Title Titolo Filename Nome file &Add Manual &Aggiungi un Manuale &Remove Manual &Rimuovi un Manuale &Oracle Manuals &Manuali Oracle toHighlightedText Init error Cannot read code completion API from %1 toHtml Invalidly went beyond end of file Errato superamento della fine del file Reading HTML after eof Lettura dell'HTML oltre EOF Lone < at end < isolato alla fine Unended tag at end Tag non chiuso alla fine Unended tag qualifier at end Unended tag qualifier data at end Unended quoted string at end Unended qualifier data at end Exceeded qualifier max in toHtml Tried to access string out of bounds in mid (start=%1) Tried to access string out of bounds in mid (size=%1) Tried to access string out of bounds in mid (total=%1+%2>%3) toImport Execute Esegui Couldn't open file Impossibile aprire il file toImportUI Form1 Form1 Operation Operazione &Browse &Sfoglia Delimiter Delimitatore Separator Separatore Database Database Schema Schema Table Tabella Preview Anteprima toInvalid Invalid Objects Oggetti non validi Refresh list Aggiorna lista &Refresh &Aggiorna &Invalid Non val&ido Recompiling all invalid Cancel Recompile all invalid toInvalid:ListInvalid Object Oggetto Owner Proprietario Type Tipo toKeyPath Couldn't find \ in path Impossibile trovare \ nel path toKeyValue Couldn't find \ in path Impossibile trovare \ nel path toLicense Register Registra Quit Esci Continue Continua Not a valid license key Chiave della licenza non valida Please check your name and registration key? Si prega di controllare il nome e la chiave di registrazione? Ok Ok Really quit? Uscire? Are you sure you want to quit? Sei sicuro di voler uscire? Yes Si No No toLicenseUI This version of TOra is unregistered. Questa versione di Tora non è registrata. 3 3 1 1 2 2 &Registration key &Chiave di registrazione &Name &Nome toLineChart Zoom Zoom &Print... &Stampa ... &Open in new window &Apri in una nuova finestra &Chart Manager... &Gestione grafici ... &Properties... &Proprietà ... Clear Chart Vuota il grafico Enabled charts Grafici abilitati TOra TOra toLineChartSetupUI Chart setup Number of samples to keep Numero di campioni da salvare Y-axis Asse Y Max value Valore massimo Min value Valore minimo Auto detect Rileva automaticamente Show last value Mostra ultimo valore Show axis legend Mostra scala degli assi Show chart legend Mostra legenda del grafico &Ok &Ok Cancel Annulla All Tutto Maximum number of samples to display Massimo numero di campioni da mostrare Unlimited Illimitato Divide chart in grids? Dividere il grafico in griglie? toListView Page: %1 Pagina: %1 TOra TOra Printing page %1 Stampa della pagina %1 Done printing Stampa effettuata Display in editor... Mostra nell'editor ... &Copy field &Copia campo Copy selection Copia la selezione Copy selection with header Copy transposed Select all Seleziona tutto Export to file... Esporta su file ... Edit SQL... Modifica SQL ... Left Center Right Alignment toLock toLogOutput SQL Output Output SQL Log4PL/SQL Log4PL/SQL toMain &View &Vista Connections Connessioni &New Connection... &Nuova connessione ... &Close Connection &Chiudi la connessione &Commit Connection &Commit &Rollback Connection &Rollback C&urrent Connection Connessione Att&uale Stop All Queries Blocca tutte le query Reread Object Cache Rileggi la cache degli oggetti &Open File... &Apri file ... &Save &Salva Save A&s... Sal&va con nome ... Open Session... Apri la sessione ... Save Session... Salva la sessione ... Restore Last Session Ripristina l'ultima sessione Close Session Chiudi sessione &Print... &Stampa ... &Quit &Esci &File &File &Undo &Annulla &Redo &Ripeti Cu&t &Taglia &Copy &Copia &Paste &Incolla &Search && Replace... &Trova && Sostituisci ... Search &Next Trova succ&essivo Select &All Seleziona &Tutto Read All &Items Leggi tutti gli oggett&i &Options... &Opzioni ... &Edit &Modifica Application Applicazione Load file into editor Apri file Save file from editor Salva file Print Stampa Undo Annulla Redo Ripeti Cut to clipboard Taglia Copy to clipboard Copia Paste from clipboard Incolla Search & replace Trova & sostituisci Tools Strumenti C&urrent Context... Contesto Att&uale ... &Contents... &Contenuti ... &About TOra... &Informazioni su TOra ... &License... &Licenza ... &Quotes... &Citazioni ... &Register... &Registra... Connect to database Connetti al database Disconnect current connection Interrompi la connessione corrente Commit connection Commit Rollback connection Rollback Stop all running queries on connection Interrompi tutte le query su questa connessione &Tools &Strumenti C&lose C&hiudi Close &All Chiudi &Tutto &Cascade &Sovrapponi &Tile &Affianca verticalmente &Window Fi&nestra &Help &? Check for upgrades? Cerca aggiornamenti? Do you want TOra to automatically check http://tora.sourceforge.net for updates on startup? During this check no information about your computer including TOra version is transmitted to the site Vuoi che TOra verifichi automaticamente all'avvio http://tora.sourceforge.net per aggiornamenti? Durante la verifica non verranno inviate informazioni riguardanti il computer o la versione di TOra &Yes &Si &No &No First connection Prima connessione Can't find active connection Impossibile trovare la connessione attiva Commit work in session to %1 before closing it? Eseguire un Commit delle modifiche su %1 prima di chiudere? Commit work? Salvare il lavoro nel DB? Cancel Annulla Couldn't find specified connectionts (%1) Impossibile trovare la connessione (%1) Row: Riga: Col: Colonna: Invalid session file File di sessione non valido The session file is not valid, can't read it. Il file di sessione non è valido, impossibile leggere. Input password Inserisci la password Enter password for %1 Inserisci la password per %1 Message flood, temporary disabling of message box error reporting from now on. Restart TOra to reenable. You probably have a too high refreshrate in some tool. Troppi messaggi, i messaggi di errore vengono temporaneamente disabilitati. Riavvia TORa per riattivarli. Probabilmente hai un intervallo di aggiornamento troppo breve su qualche strumento. Information Informazioni You can enable this through the Global Settings in the Options (Edit menu) Puoi abilitarlo tramite i Global Settings nelle Opzioni (menù Edit) A new version of TOra (%1) is available from http://tora.sourceforge.net Una nuova versione di TOra (%1) è disponibile presso http://tora.sourceforge.net No background queries. Nessuna query in background. Create a new connection Disconnect Commit transaction Rollback transaction &Current Connection Connessione attuale &Save File... &Salva file... Save &As... Salv&a con nome... Block Selection Selezione a Blocchi &Preferences... &Preferenze &About Inform&azioni su About &Qt... Inform&azioni su Qt... R&ecent Files File r&ecenti Left Dockbar Right Dockbar Commit work in session to %1 before closing it? Eseguire Commit su %1 prima di chiuderlo? toMarkedText TOra TOra Printing page %1 Stampa della pagina %1 Done printing Stampa effettuata Page: %1 Pagina: %1 File opened successfully File aperto correttamente Save changes? Salvare le modifiche? The editor has been changed, do you want to save them before opening a new file? L'editor è stato cambiato, vuoi salvare le modifiche prima di aprire un nuovo file? &Yes &Sì &No &No Cancel Annulla Incremental search Ricerca incrementale Print %1 Stampa %1 Print Document Stampa Documento &Undo Ann&ulla &Redo &Ripeti Cu&t &Taglia Cut to clipboard Taglia &Copy &Copia Copy to clipboard Copia &Paste &Incolla Paste from clipboard Incolla dagli appunti Clear Pulisci Clear editor Pulisci l'editor Select &All Seleziona &Tutto toMemoEditor Memo Editor Save changes Salva le modifiche Open file Apri file Save file Salva file Cut to clipboard Taglia Copy to clipboard Copia Paste from clipboard Incolla First column Prima colonna Previous column Colonna precedente Next column Colonna successiva Last column Ultima colonna NULL NULL Ctrl+Return Memo Editor|Save changes Word Wrap toMessageUI TOra warning message Avviso di TOra &Ok &Ok Display alerts in statusbar only. Mostra gli avvisi solo nella barra di stato. Display alerts in messagebar instead of poping up a dialog with a warning. Mostra gli avvisi nella barra dei messaggi invece di aprire una finestra con l'avviso. Warning message Avviso toModelEditor Ctrl+Return Memo Editor|Save changes Memo Editor Save changes Salva le modifiche Open file Apri file Save file Salva file Cut to clipboard Taglia Copy to clipboard Copia Word Wrap A capo automatico Paste from clipboard Incolla First column Prima colonna Previous column Colonna precedente Next column Colonna successiva Last column Ultima colonna NULL NULL toMySQLExtract toNewConnection Provider Tipo connessione Host Host Database Database Username Nome utente No connection provider Unable to connect to the database. Impossibile connettersi al database. Unable to connect to the database Impossibile connettersi al database Enter password Inserisci la password Enter password to use for connection. Inserire la password da usare per la connessione. No available connection provider &Delete Elimina toNewConnectionUI New connection Nuova connessione Cancel Annulla &Ok &Ok &Previous connections &Archivio connessioni A list of previous connections. Select to bring over to the right. Lista di connessioni utilizzate di recente. Seleziona per attivare. &Username &Nome utente Username to connect with Username con cui connettersi &Password &Password Password to connect with. Password da usare per la connessione. Connection provider Fonte dati Use &SQL*Net Usa &SQL*Net Wether or not connect using the listener or directly to a local database. Connessione diretta a database locale o tramite listener. &Connection Mode &Tipo connessione Mode of the connection. If you don't understand select normal. Modo di connessione. Se non sapete cosa è, scegliete normale. &Database &Database Select the database ID to connect to. Seleziona il database ID a cui connettersi. &Host &Host Previous &connections Archivio &connessioni Se&arch: C&erca: Connection pro&vider Tip&o di connessione Schema to switch to Schema a cui passare &Schema P&ort P&orta Options Opzioni SQL*&Net S&YSDBA SYSOP&ER &Import Connections... &Importa le connessioni... toNoBlockQuery Unknown exception Errore sconosciuto Reading past end of query Couldn't open query Impossibile aprire la query Failed to start background query thread Impossibile avviare la query in background Restarting query in own connection Riavvio della query in una connessione separata toNow Unexpected error Errore inatteso toOracleConnection Password expired Password scaduta Enter new password Inserisci la nuova password Enter password again for confirmation Ripeti la password per conferma The two passwords doesn't match Le due password non coincidono toOracleExtract Couldn't find source for of %1.%2 Displaying source of wrong type for %1. Got %2 expected 0. -- Context indexes can be quite complicated depending upon the -- used parameters. The following is an attempt to recreate this -- context index. But, a close scrutiny of the following code is -- strongly recommended. Couldn't find primary key of %1.%2 Impossibile trovare la chiave primaria di %1.%2 Couldn't find materialised table %1.%2 Couldn't find log %1.%2 Impossibile trovare il log %1.%2 Couldn't find index partitions for %1.%2 Couldn't find partition range %1.%2 Internal error, result should be 18 in segment attributes (Was %1) Internal error, result should be 18 in segment attributes Constraint %1.%2 doesn't exist La Constraint %1.%2 non esiste DBLink %1.%2 doesn't exist Il DBLink %1.%2 non esiste Exchange index %1.%2 doesn't exist Exchange table %1.%2 doesn't exist Couldn't find index %1.%2 Impossibile trovare l'indice %1.%2 Couldn't find profile %1 Impossibile trovare il profilo %1 Couldn't find role %1 Impossibile trovare il ruolo %1 Couldn't find sequence %1 Impossibile trovare la sequenza %1 Couldn't find synonym %1.%2 Impossibile trovare il sinonimo %1.%2 Couldn't find table %1.%2 Impossibile trovare la tabella %1.%2 Couldn't find tablespace %1 Impossibile trovare il tablespace %1 Couldn't find trigger %1.%2 Impossibile trovare il trigger %1.%2 Couldn't find user %1 Impossibile trovare l'utente %1 Couldn't find view %1.%2 Impossibile trovare la vista %1.%2 Couldn't find constraint %1.%2 Impossibile trovare la constraint %1.%2 Missing ON description item on index Couldn't find any COLUMN on index Invalid type %1 to create Invalid type %1 to describe Invalid type %1 to drop toOracleSetting Failed to set new default date format for connection: %1 toOracleSettingUI Form1 Form1 &Default date format Formato &data standard The default dateformat to use when querying the database. Il formato data standard da usare nelle query al database. &Checkpoint name Nome del &Checkpoint The name of the checkpoint used when needed to rollback work. Il nome del checkpoint usato per eseguire il rollback. &Max long and LOB data length &Massima lunghezza dei dati "long" e "blob" Max length to read from LOB or LONG data fields. LONG:s can not be specified unlimited but will be defaulted to 33000 if unlimited. Massima volume letto da campi LOB o LONG. I LONG non possono essere definiti come illimitati ma saranno limitati a 33000 se illimitati. Unlimited Illimitato Create Table Crea Tabella &Explain plan table Tabella per &Explain Name of the table to put explain plan output in. Nome della tabella in cui mettere l'output dell'explain plan. &Keep plans Keep records for the plan explanations in the plan table. Maximum cursors to keep open Numero massimo di cursori da mantenere aperti &V$SQL_PLAN Use V$SQL_PLAN when possible. toOutput SQL Output Output SQL Poll for output now Enable or disable getting SQL output. Abilita o disabilita il recupero dell'SQL in output. Clear output Elimina output Refresh Aggiorna &Refresh &Aggiorna Output enabled Output abilitato &Change Refresh &Cambia intervallo di Aggiornamento &Output &Output Couldn't enable/disable output for session Impossibile abilitare/disabilitare l'output per la sessione toOutputPrefs SQL Output Output SQL &Polling timeout Intervall&o di controllo Time between trying to poll for output. Intervallo di tempo tra due verifiche dell'output. Default &source Log4PL/SQL &User &Utente per Log4PL/SQL toPLSQLEditor body Unknown Sconosciuto PLSQLEditor Refresh Aggiorna &New Sheet &Nuovo foglio &Compile &Compila &Compile with Warnings Close Chiudi Close All Next &Error &Errore Successivo Pre&vious Error Errore &Precedente &PL/SQL Editor toPLSQLText Invalid start of code Inizio del codice non valido toPLSQLWidget Contents Contenuti Message Messaggio Line Errors Warnings toParamGet Define binding variables &Ok &Ok Cancel Annulla Missing field name Nome campo mancante NULL NULL Edit Modifica Aborted execution Esecuzione abbandonata toPasswordTool Enter new password Inserisci la nuova password Enter new password again for confirmation Inserisci la nuova password per conferma Passwords doesn't match Le due password non corrispondono The two givens passwords doesn't match, please try again Le due password non corrispondono, riprova toPieChart &Print... &Stampa ... &Open in new window &Apri in una nuova finestra All values are 0 in this chart Tutti i valori sono a 0 in questo grafico TOra TOra toPreferences Global Settings Impostazioni generali Editor Settings Impostazioni dell'editor Database Settings Impostazioni del database Tools Strumenti toPreferencesUI Preferences Impostazioni &Ok &Ok Cancel Annulla &Help &Aiuto Alt+H Apply Alt+O toProfiler PL/SQL Profiler PL/SQL Profiler Refresh list Aggiorna lista Repeat run Comment Commento Unknown Sconosciuto Run profiling in background Execute current profiling Script Script Result Risultato Profiler tables doesn't exist Profiler tables doesn't exist. Should TOra try to create them in the current schema? &Yes &Si &No &No Select run %1 runs Something went wrong collecting statistics Errore durante la raccolta delle statistiche toProject SQL Project Progetto SQL Add file to project Aggiungi file al progetto Remove file from project Rimuovi file dal progetto SQL project Progetto SQL Save project Salva il progetto Add new subproject Aggiungi un nuovo sottoprogetto Generate SQL for this project Genera l'SQL per questo progetto Move up in project Move down in project File File Size Dimensione untitled.tpr untitled.tpr -- Start of project %1 -- Start of file %1 toQValue toQuery Query aborted Query abbandonata toReadFile Couldn't open file %1. Impossibile aprire il file %1. Encountered problems read configuration Problemi nella lettura della configurazione Couldn't download file Impossibile scaricare il file toRefreshCreate None Nessuno 2 seconds 2 secondi 5 seconds 5 secondi 10 seconds 10 secondi 30 seconds 30 secondi 1 min 1 min 5 min 5 min 10 min 10 min toRefreshParse Unknown timer value toReport <H4>COLUMNS</H4> <TABLE WIDTH=100% BORDER=0><TR><TH ALIGN=left WIDTH=25%>Name</TH> <H4>COLONNE</H4> <TABLE WIDTH=100% BORDER=0><TR><TH ALIGN=left WIDTH=25%>Nome</TH> <TH ALIGN=left WIDTH=25%>Definition</TH> <TH ALIGN=left WIDTH=25%>Definizione</TH> <TH ALIGN=left WIDTH=50%>Description</TH> <TH ALIGN=left WIDTH=50%>Descrizione</TH> <HTML><HEAD><TITLE>Report on database %7</TITLE></HEAD> <BODY><H1>Report on database %8</H1> <TABLE BORDER=0> <TR><TD VALIGN=top>Generated by:</TD><TD VALIGN=top>TOra, Version %1</TD></TR> <TR><TD VALIGN=top>At:</TD><TD VALIGN=top>%2</TD></TR> <TR><TD VALIGN=top>From:</TD><TD VALIGN=top>%3, an %4 %5 database</TD></TR> <TR><TD VALIGN=top>On:</TD><TD VALIGN=top>%6</TD></TR> </TABLE> <HTML><HEAD><TITLE>Report sul database %7</TITLE></HEAD> <BODY><H1>Report sul database %8</H1> <TABLE BORDER=0> <TR><TD VALIGN=top>Generato da:</TD><TD VALIGN=top>TOra, Versione %1</TD></TR> <TR><TD VALIGN=top>Su:</TD><TD VALIGN=top>%2</TD></TR> <TR><TD VALIGN=top>Da:</TD><TD VALIGN=top>%3, un database %4 %5</TD></TR> <TR><TD VALIGN=top>Il:</TD><TD VALIGN=top>%6</TD></TR> </TABLE> <H1>Global Objects</H1> <H1>Oggetti Globali</H1> <H1>Public</H1> <H1>Public</H1> <H1>Schema %1</H1> <H1>Schema %1</H1> toResultBar Edit SQL... Modifica SQL ... toResultCols Average column size: <B> Dimensione media della colonna: <B> </B> synonym for <B> </B> sinonimo per <B> (Object cache not ready) (La cache degli oggetti non è pronta) toResultCols::resultCols Column Name Nome colonna Data Type Tipo dati Comments Commenti Description of %1 Descrizione di %1 Failed to describe %1 Impossibile descrivere %1 toResultConstraint Constraint Name Nome della Constraint Condition Condizione Enabled Abilitato Delete Rule Regola di Cancellazione Generated Generato toResultContent Define filter for editor Definisci un filtro Remove any filter Rimuovi ogni filtro Add a new record Aggiungi un nuovo record Save changes Salva le modifiche Discard changes Scarta le modifiche Delete current record from table Cancella il record corrente dalla tabella Go to first row Vai alla prima riga Go to previous row Vai alla riga precedente Go to next row Vai alla prossima riga Go to last row Vai all'ultima riga Toggle between table or single record editing Visualizzazione tabella o singolo record Remove filter Rimuovi il filtro Remove the filter for this table only or for all tables. Rimuovere il filtro solo per questa tabella o per tutte. &All &Tutte Cancel Annulla toResultContentEditor &Display in editor... &Mostra nell'editor ... &Copy field &Copia campo &Paste field &Incolla campo Copy selection Copia la selezione &Delete record Cancella recor&d Select all Seleziona tutto Export to file... Esporta su file ... This table contains only LOB/LONG columns and can not be edited Questa tabella contiene sono colonne di tipo LOB/LONG e non può essere editata No changes made Nessun cambiamento effettuato Content of %1.%2 Contenuto di %1.%2 toResultContentFilterUI Content editor filter settings Definizione filtri per l'editor Ok Ok Cancel Annulla Selection &criteria &Criteri di selezione Selection criteria to use getting items to edit. Same as after where in a select clause. Criterio di selezione da usare per ottenere gli oggetti da editare. Simile a ciò che segue la WHERE di una SELECT. Sort &order. Separate columns with comma. &Ordinamento dati. Separare le colonne con virgole. The sort order to use when retreiving data from the database. L'ordinamento da usare per i dati estratti dal database. Table &columns &Colonne della tabella Available column names in table. Use for all tables Usa per tutte le tabelle cancel Esc toResultContentSingle Edit Modifica Internal error, save different row than current in content editor Errore interno, salvata una riga differente da quella presente nell'editor toResultData Content editor Define filter for editor Definisci un filtro Remove filters Save changes Salva le modifiche Add a new record Aggiungi un nuovo record Duplicate an existing record Delete current record from table Cancella il record corrente dalla tabella Refresh data Go to first row Vai alla prima riga Go to previous row Vai alla riga precedente Go to next row Vai alla prossima riga Go to last row Vai all'ultima riga Toggle between table or single record editing Visualizzazione tabella o singolo record Remove filter Rimuovi il filtro Remove the filter for this table only or for all tables? &All &Tutte &This Cancel Save changes to %1.%2? Warning Refreshing from the database will lose current changes. toResultDataSingle Edit Modifica toResultDepend Owner Proprietario Name Nome Type Tipo Dependency Dipendenze toResultExtract Object not found Oggetto non trovato toResultIndexes Index Name Nome indice Columns Colonne Type Tipo Unique Unico toResultLine Edit SQL... Modifica SQL ... toResultListFormat Text Testo Tab delimited Delimitato da tabulazioni CSV CSV HTML HTML SQL SQL toResultListFormatUI Choose format Scegli il formato Cancel Annulla &Ok &Ok &Choose format of exported file. &Scegli il formato del file da esportare. Separator Separatore Delimiter Delimitatore toResultLock Session Sessione Schema Schema Osuser Utente di sistema Program Programma Type Tipo Mode Request Object Oggetto Grabbed Requested toResultLong Will not reexecute same query %1 rows processed %1 righe processate Query executed Query eseguita Statement executed Can only hide last column in query toResultModel row processed rows processed Statement executed toResultObject Internal error, toResult is not a descendant of toResult toResultParam Parameter editor Editor dei parametri Display hidden parameters. This will only word if you are logged in as the sys user. Mostra i parametri nascosti. Funziona solo se connessi come utente SYS. Generate pfile Genera pfile Apply changes to system Applica le modifiche al sistema Apply changes to session Applica le modifiche solo alla sessione Drop current changes Annulla i cambiamenti Changed Cambiato # Generated by TOra version %1 # Generato da TOra versione %1 Display hidden parameters. This will only work if you are logged in as the sys user. Switch between global and session variables to show. Generate configuration file Apply changes toResultParam:ListParam Changed Cambiato Description Descrizione Parameter Parametro Value Valore toResultPlan Operation Operazione Options Object name Nome oggetto Mode Cost Costo Bytes Bytes Cardinality Cardinalità Plan table doesn't exist La tabella di explain non esiste Specified plan table %1 didn't exist. Should TOra try to create it? La tabella di explain %1 non esiste. Crearla adesso? &Yes &Si &No &No %CPU Rows TEMP Space Time Tempo Startpartition Endpartition toResultReferences Owner Proprietario Object Oggetto Constraint Constraint Condition Condizione Enabled Abilitato Delete Rule Regola di Cancellazione foreign key (%1) references %2.%3(%4) la chiave esterna (%1) si riferisce a %2.%3(%4) toResultResources:Information Buffer Gets Disk Reads Executions First Load Time Data di primo caricamento Invalidations Kept Versions Loaded Versions Loads Open Versions Optimizer Mode Parse Parsing Schema Id Parsing User Id Persistent Mem Rows Processed Righe Processate Runtime Mem Serializable Aborts Sharable Mem Sorts Users Executing Users Opening toResultStats Name Nome Value Valore Delta Delta Can't change session on system statistics Non è possibile cambiare sessione sulle statistiche di sistema toResultStorage Name Nome Status Stato Information Informazioni Contents Contenuti Logging Size (%1) Dimensione (%1) Free (%1) Libero (%1) Autoextend (%1) Used/Free/Autoextend Utilizzato/Libero/Autoextend Available Disponibile Coalesced Max free (%1) Free fragments Frammenti liberi toResultStorage No tablespace selected Nessun tablespace selezionato Weird, empty tablespace name Strano, nome del tablespace vuoto No file selected Nessun file selezionato Tablespace Tablespace toResultTableView Please wait... &Display in editor... &Mostra nell'editor ... &Refresh &Left &Center &Right &Copy field &Copia campo Copy &selection Copy selection with &header Copy &transposed Select &all E&xport to file... &Edit SQL... &Modifica SQL ... C&ount Rows &Read All A&lignment Row Count %1 row%2. toResultTableViewEdit This table contains only LOB/LONG columns and can not be edited Questa tabella contiene sono colonne di tipo LOB/LONG e non può essere editata No changes made Nessun cambiamento effettuato Internal error. Saved toResultView Can only hide last column in query Reading all entries Read All toRollback Rollback analyzer Update segment list Aggiorna la lista dei segmenti Take segment online Porta il segmento online Take segment offline Porta il segmento offline Create new rollback segment Crea un nuovo rollback segment Drop segment Elimina segmento Refresh Aggiorna Open Cursors Cursori Aperti Transaction Users &Refresh &Aggiorna Online Online Offline Offline Create segment... Crea segmento ... &Change Refresh &Cambia intervallo di Aggiornamento &Rollback &Rollback No segment selected Nessun segmento selezionato Drop rollback segment Elimina il rollback segment Are you sure you want to drop the segment %1. Sei sicuro di voler eliminare il segmento %1. &Drop Cancel Annulla Enable snapshot too old detection. toRollback:Information Block Blocco Blocks Blocchi Current (MB) Attuale (MB) Current Attuale Extents Extents Hitrate Initial (MB) Iniziale (MB) Next (MB) Prossimo (MB) Optimal (MB) Ottimale (MB) Owner Proprietario PCT Increase Incremento percentuale Reads Letture Segment Segmento Status Stato Tablespace Tablespace Transactions Transazioni Used (MB) Usato (MB) toRollback:TransactionUsers Oracle User Utente Oracle Os User Utente di sistema Rollback Seg Rollback Segment Session ID ID di sessione toRollbackDialog Storage Storage No changes made Nessun cambiamento effettuato toRollbackDialogUI Modify tablespace Modifica il tablespace Display the SQL used to generate the specified object Mostra l'SQL utilizzato per generare l'oggetto specificato &Public &Pubblico If this should be a publicly available rollback segment Deve essere un rollback segment pubblico &Name &Nome &Tablespace &Tablespace Rollback Segment Rollback Segment &Ok &Ok Cancel Annulla toRollbackOpen Started User Snapshot SQL SQL toRollbackPrefs Rollback Tool &Restart reexecuted statements Start statements again that have been reexecuted. &Must read buffers Don't display statements that have not read buffers. &Exclude first appearance A statement must be visible at least two consecutive polls to be displayed. &Disregard start extent. Always start from the left border when displaying extent usage. Inizia sempre dal bordo sinistro mostrando l'utilizzo degli extent. &Enable snapshot too old detection. Enable snapshot too old detection, will put load on large databases. toSGAStatement Couldn't find SQL statement in SGA Impossibile trovare l'SQL nella SGA SQL SQL Execution plan Piano di esecuzione Information Informazioni toSGATrace SGA trace SGA Trace Fetch statements in SGA Schema Schema Any Qualsiasi Refresh Aggiorna Type Tipo SGA SGA Long operations Selection Selezione All Tutto Unfinished Top executions Top sorts Top diskreads Top buffergets Top rows Top sorts/exec Top diskreads/exec Top buffergets/exec Top rows/exec Top buffers/row &Refresh &Aggiorna Change &schema Cambia &schema Change &refresh Cambia inte&rvallo di aggiornamento &SGA Trace &SGA Trace Unknown type of trace Unfinished is only available for long operations Unknown selection 1 execution, 1 parse toSGATracePrefs SGA Trace SGA Trace &Auto update &Aggiornamento automatico Update automatically after change of schema. Aggiorna automaticamente dopo un cambiamento dello schema. toSMTP Connecting to %1 Connessione a %1 Connected to %1 Connesso a %1 Message sent Messaggio inviato Unexpected reply from SMTP server: Risposta inattesa dal server SMTP: toSQL Tried to get unknown SQL (%1) Malformed tag in config file. Missing = on row. Malformed line in SQL dictionary file. Two '[' before '=' Errore nel file di dizionario. Due '[' prima di '=' Unknown escape character in string (Only \\ and \n recognised) Carattere di escape sconosciuto nella stringa (Solo \\ e \n sono accettati) SQL Dictionary toSQLEdit SQL editor Editor SQL Load SQL dictionary file Carica un file di dizionario SQL Save modified SQL to dictionary file Salva l'SQL modificato in un file di dizionario Save this entry in the dictionary Delete this version from the SQL dictionary Start new SQL definition Text Name Name Nome Database Database Description Descrizione Wrong format of version Formato o versione errati Should be database provider:version. &Ok &Ok Should be database provider:version. Can't start with :. Should be database provider:version. Can't end with the first :. Missing description Descrizione mancante No description filled in. This is necessary to save SQL. Adding undescribed as description. Descrizione Mancante. E' necessario per salvarel'SQL. Definito "non descritto". Undescribed Non descritto Modified SQL dictionary Save changes into the SQL dictionary Salva i cambiamenti nel dizionario SQL &Yes &Si &No &No Cancel Annulla toSQLEditTool &Edit SQL... &Modifica SQL ... toSQLString SQL Address not found in SGA Indirizzo SQL non trovato nella SGA toSQLToAddress SQL Query not found in SGA Query SQL non trovata nella SGA toSQLparse Unbalanced parenthesis (Too many ')') Parentesi non bilanciate (Troppe ')') Unbalanced parenthesis (Too many '(') Parentesi non bilanciate (Troppe '(') Internal error in toSQLParse, should never get here Errore interno in toSQLParse, non dovresti mai essere qui toSaveFilename toScript Extraction and Compare Estrazione e Confronto Perform defined extraction Esegui l'estrazione definita Search result Dropped Created Creato &Initial &Iniziale &Limit &Next &Prossimo No mode selected Destination shouldn't be enabled now, internal error Internal error, lastLevel < 0 Errore Interno, lastLevel < 0 All Tutto Replacing existing size with new Same Stesso None Nessuno No filename specified Couldn't open file %1 Error writing to file %1 -- Script generated to file %1 successfully rem Master script for DDL reverse engineering by TOra -- Scripts generate to directory %1 successfully Source Destination Overwrite file? The file %1 already exists, are you sure you want to continue and write over it? &Yes &Si &Cancel Select a Directory Selezionare una cartella toScriptSchemaWidget All Tutto Form Connection Connessione Schema Schema &Include objects &Includi oggetti toScriptTreeModel Objects Oggetti toScriptUI Form1 Form1 &Source &Origine Connection Connessione Schema Schema All Tutto Objects Oggetti &Include objects &Includi oggetti &Destination &Destinazione &Options &Opzioni Compare Confronta Compare two databases or schemas Confronta due Database o Schemi Extract Estrai Extract script to recreate database objects. Estrai lo script per ricreare gli oggetti del database. Include code specification Include storage specification Include content of tables Includi il contenuto delle tabelle Include parallel specification Includi dati sul parallelismo Include partition specification Includi dati sul partizionamento Same Stesso None Nessuno Generated schema Schema generato Select the schema to generate in script Seleziona lo schema da riprodurre nello script Include indexes Includi indici Generate prompts Genera avvisi Generate prompts to display progress in SQLPlus Genera avvisi per mostrare l'avanzamento in SQLPlus Include comments Includi commenti Generate header Aggiungi intestazione Generate header at the top of the script Aggiungi intestazione all'inizio dello script Include grants Includi grants Include constraints Includi constraints Include DDL Includi DDL Search Cerca Migrate Create database scripts to convert schema or database from source to destination Crea gli script per convertire lo schema o il database dall'origine alla destinazione Report &Search &Cerca Contain any words Contiene almeno una parola Contain all words Contiene tutte le parole RegExp RegExp Exact match Corrispondenza esatta Configuration Configurazione Script Resize Ridimensionamento Script Don't resize Non ridimensionare Auto resize Ridimensionamento Automatico Custom resize Ridimensionamento manuale Limit Limite max Initial Iniziale Next Prossimo &Add &Aggiungi &Remove &Rimuovi Resize Ridimensiona Result Risultato Difference Differenze Commit distance The number of insertstatements to make between each commit (0 means whole table) Output Output tab Output dir Output to directory so that each object is placed in a different file. Output file Browse Sfoglia toSearchReplace No more matches found Nessun altro elemento trovato toSearchReplaceUI Search & Replace T&rova sostituisci &Search Top Trova &Primo Search &Next Trova &Successivo &Replace &Sostituisci Replace &All Sostituisci &Tutto Close Chiudi Search Cerca Exact Corrispondenza Esatta Match text exactly as written Corrispondenza esatta del testo Match Word Parola intera Only match whole words Solo parole intere Ignore Case Ignora Maiuscole/Minuscole RegExp RegExp Use RegExp semantics for matching (See Qt documentation) Usa una Regular Expression per la ricerca (Vedi documentazione QT) Replace Sostituisci F&ind: Text to search for Jump to next match &Next &Prossimo Jump to previous match &Previous Rep&lace: Text to replace with Replace next match Replace all matches Plain Text Regular Expression Search mode Modo di ricerca Case-sensitive searching &Match case Whole words toSecurity Security manager Gestione della sicurezza Update user and role list Aggiorna la lista degli utenti e dei ruoli Save changes Salva le modifiche Remove user/role Elimina utente/ruolo Add new user Aggiungi nuovo utente Add new role Aggiungi nuovo ruolo Copy current user or role Copia l'utente o il ruolo corrente Display SQL needed to make current changes Mostra l'SQL da utilizzare Users/Roles Utenti/Ruoli &General &Generale &Roles &Ruoli &System Privileges Privilegi di &Sistema &Object Privileges Privilegi su &Oggetti &Quota &Quota di spazio &Refresh &Aggiorna &Save changes &Salva le modifiche &Remove user/role &Elimina utente/ruolo Add &user Aggiungi &utente Add &role Aggiungi &ruolo &Copy current &Copia Display SQL... Mostra l'SQL ... &Security &Sicurezza No changes made Nessun cambiamento effettuato Save changes? Salvare i cambiamenti? Save the changes made to this user? Salvare i cambiamenti fatti da questo utente? Save Salva Discard Scarta Cancel Annulla Invalid security ID ID di sicurezza non valido Roles Ruoli Are you sure? Sei sicuro? The user still owns objects, add the cascade option? L'utente possiede ancora degli oggetti, eliminarli in cascata? Yes Si No No toSecurityObject Object Oggetto Admin Admin ON ON toSecurityQuota None Nessuno Unlimited Illimitato toSecurityQuotaUI Form1 Form1 Tablespace Tablespace Quota Size Dimensione della quota Used Size Dimensione Utilizzata &Unlimited &Illimitato &None &Nessuno &Value &Valore Belongs to Resource group or has unlimited tablespace privilege Appartiene al gruppo Resource o non ha limiti sul tablespace toSecurityRole Passwords don't match Le due password non corrispondono The two versions of the password doesn't match Le due versioni della password non corrispondono Don't save Non salvare Cancel Annulla toSecurityRoleGrant Role name Nome del ruolo Admin Admin Default Standard ON ON YES Si toSecurityRoleUI Form2 Form2 &Name &Nome Enter Password Inserisci una password Confirm Password Conferma la password &Password &Password Role authenticated by the operating system Ruolo autenticato dal sistema operativo &External &Esterno Role authenticated globally Ruolo autenticato globalmente &Global &Globale No password required for role Nessuna pasword richiesta per questo ruolo None Nessuno toSecuritySystem Privilege name Nome del privilegio Admin Admin ON ON NO NO toSecurityTreeModel Objects Oggetti toSecurityUser Passwords don't match Le due password non corrispondono The two versions of the password doesn't match Le due versioni della password non corrispondono Don't save Non salvare Cancel Annulla toSecurityUserUI Form1 Form1 &Name &Nome P&rofile P&rofilo Enter Password Inserisci una password Confirm Password Conferma la password Expire Password Cambia password al primo login &Password &Password User authenticated by the operating system Utente autenticato dal sistema operativo &External &Esterno &X.500 External Name &Global &Globale &Temporary Tablespace Tablespace &Temporaneo &Account Locked &Account Bloccato &Default Tablespace Tablespace di &Default toSemaphore The semaphore function "%1" failed La funzione semaforo "%1" è fallita toSession Session manager Gestione sessioni Update sessionlist Aggiorna la lista delle sessioni All Tutto No background Nascondi sessioni background No system Nascondi sessioni system Enable timed statistics Disable timed statistics Disconnect selected session Annulla la sessione selezionata Refresh Aggiorna Session wait states Session I/O I/O di sessione Statistics Statistiche Wait events Connect Info Informazioni sulla connessione Pending Locks Locked Objects Oggetti Bloccati Current Statement SQL in esecuzione Accessing Oggetti interessati Previous Statement Query precedente Open Cursors Cursori Aperti &Refresh &Aggiorna &Change Refresh &Cambia intervallo di Aggiornamento &Session &Sessione No access to timed statistics flags Let current transaction finish before disconnecting session? Attendere la fine della transazione corrente prima di chiudere la sessione? Commit work? Salvare il lavoro nel DB? &Yes &Si &No &No Cancel Annulla Only active users Select all sessions Deselect all sessions Long ops Cancel selected backend Filter Let transaction(s) finish before disconnecting? toSession:AccessedObjects OBJECT OGGETTO OWNER PROPRIETARIO TYPE TIPO toSession:ConnectInfo Authentication Type Tipo di autenticazione Network Service Banner Messaggio del servizio di rete Osuser Nome Utente toSession:LockedObject Locked Mode Object Name Nome oggetto Type Tipo toSession:OpenCursor SQL SQL toSession:SessionIO Block changes Block gets Consistent changes Consistent gets Physical reads Letture su disco toSession:SessionWait CPU CPU Control File I/O DB File Read DB File Write DB Single File Read Direct I/O I/O Diretto Log file Log file Other Altro Parallel execution Esecuzione parallela SQL*Net SQL*Net Write Complete Scrittura completata toSessionMySQL Session manager Gestione sessioni Update sessionlist Aggiorna la lista delle sessioni All Tutto Refresh Aggiorna &Change Refresh &Cambia intervallo di Aggiornamento &Session &Sessione toSetSessionType Failed to find style %1 Impossibile trovare lo stile %1 toSplash Loading plugins Caricamento plugins toStatusMessage TOra Message toStorage Storage manager Gestione dello storage Update Aggiorna Show extent view. Mostra dettagli ed extent. Show tablespaces or just datafiles. Mostra i tablespaces o solo i datafiles. Take tablespace online Porta il tablespace online Take tablespace offline Porta il tablespace offline Set tablespace default to logging Attiva logging per il tablespace Set tablespace default to no logging Disattiva logging per il tablespace Allow read write access to tablespace Abilita l'accesso in lettura e scrittura al tablespace Set tablespace to read only Imposta tablespace come sola lettura Modify tablespace Modifica tablespace Modify file Modifica il file Create new tablespace Crea un nuovo tablespace Add datafile to tablespace Aggiungi un datafile al tablespace Coalesce tablespace Move datafile Sposta datafile Owner Proprietario Object Oggetto Partition Partizione Extents Extents &Refresh &Aggiorna Tablespace online Tablespace online Tablespace offline Tablespace offline Default logging Attiva Logging Default not logging Disattiva Logging Read write access Accesso in lettura e scrittura Read only access Accesso in sola lettura Modify tablespace... Modifica il tablespace ... Modify datafile... Modifica datafile ... New tablespace... Nuovo tablespace ... Add datafile... Aggiungi datafile ... Move datafile... Sposta datafile ... &Storage &Storage Select mode to take tablespace %1 offline. Seleziona il modo per portare il tablespace %1 offline. Normal Normale Temporary Temporaneo Cancel Annulla Blocks Blocchi Drop tablespace Rename Data File toStorageDatafile Create datafile Crea datafile &Size &Dimensione &Next &Prossimo &Maximum size &Dimensione massima No name available Nessun nome disponibile Open Storage File toStorageDatafileUI Form1 Form1 &Tablespace name &Nome tablespace &Filename &Nome file &Browse &Sfoglia Auto extend Auto estendi &Auto extend datafile &Auto estendi datafile &Unlimited max size Dimensione massima &ILLIMITATA toStorageDefinition &Initial size &Dimensione iniziale &Next size Prossima dime&nsione &Size &Dimensione toStorageDefinitionUI Form1 Form1 Optimal allocation of extents. Will free unused extents down to specified value Allocazione ottima degli extents. Libererà gli extents non utilizzati fino al valore specificato &Extents &Extents &Maximum extents Numero &massimo di extent Maximum number of extents to allocate for an object Massimo numero di extents da allocare per un oggetto &Initial size &Dimensione iniziale Number of extents to initially allocate Numero di extents da allocare inizialmente &Unlimited extents Extents &Illimitati No limit to the number of extents to allocate if needed Numero di extents da allocare illimitato, se necessario &Optimal size Dimensione &ottimale &No optimal size &Default PCT increase Incremento Percentuale di &default Default increase in size of next allocated extent. A size of 0 will prevent background coalesce of free space Incremento dimensionale standard del prossimo extent allcato. Una dimensione 0 impedisce il coalesce in background dello spazio libero toStorageDialog Invalid response from query Risposta non valida dalla query Add datafile Aggiungi datafile Datafile Datafile Add tablespace Aggiungi tablespace Tablespace Tablespace Default Storage Storage di default Modify datafile Modifica datafile Invalid response from query (Wanted 4, got %1 entries) for %2.%3 Risposta non valida dalla query (Attesi 4 valori, ottenuti %1) per %2.%3 No changes made Nessun cambiamento effettuato Drop Tablespace toStorageDialogUI Modify tablespace Modifica il tablespace Display the SQL used to generate the specified object Mostra l'SQL utilizzato per generare l'oggetto specificato Tab 2 Tab 2 &Ok &Ok Cancel Annulla toStorageExtent Files: %1 Files: %1 Extents: %1 Extents: %1 Blocks: %1 Blocchi: %1 Blocks/line: %1 Tablespace: %1 toStorageObjectModel Owner Proprietario Segment Segmento Partition Partizione Extents Extents Blocks Blocchi toStoragePrefsUI Form1 Form1 Storage Manager Gestione dello storage &Display coalesced column Display object &extents Mostra gli &extent dell'oggetto Display object and extent list on startup. Mostra una lista degli Oggetti e delle Extent all'avvio. Display tablespaces or just datafiles. Mostra i tablespaces o solo i datafiles. Display graph of autoextend information instead of just free space. Mostra un grafico di informazioni sull'autoextend invece del solo spazio libero. toStorageTablespace &Minimum Extent Extent &minimo Extent &Size Dimen&sione dell'extent toStorageTablespaceUI Form1 Form1 &Options &Opzioni &Logging Should objects created in this tablespace be logging by default &Online &Online Should tablespace be online at the time of creation Il tablespace deve essere online al momento della creazione &Permanent &Permanente Should objects in this tablespace be permanent after the end of the session &Default storage &Storage di default Specify default storage clause (In separate tab) &Extent allocation Gestione allocazione degli &Extent &Dictionary &Dictionary Manage tablespace extents using dictionary tables Gestisce gli extent dei tablespace usando le tabelle del dizionario Local &autoallocation Locale &automatica Specify how space is allocated in the tablespace Specifica come lo spazio è allocato nel tablespace Local &uniform Locale &uniforme The tablespace is locally managed with fixed extent sizes of specified size Il tablespace è gestito localmente con extent di dimensione fissa e specificata toSyntaxAnalyzer Wrong format of color in setings Formato errato nel settaggio colori Unknown type Tipo sconosciuto toSyntaxSetup Unknown variable Variabile sconosciuta Unknown color name %1 Nome colore sconosciuto %1 toSyntaxSetupUI Form1 Form1 Options Opzioni &Keyword upper Parole chiave &maiuscole Convert all keywords to uppercase when displayingsyntaxhighlighted text. Only available for monospaced fonts. Converti tutte le parole chiave in maiuscolo usando il testo con sintassi evidenziata. Disponibile solo per fonts monospaziati. &Code completion &Completamento del codice Activate code completion in SQL editors. Not recommended on slow connections. Attiva il completamento del codice nell'editor SQL. Sconsigliato per connessioni lente. &Sort completion rows Sort the available completion rows alphabetically or in the order the are. S&yntax highlighting Evidenzia la &sintassi Enable syntax highlighting, or use simple text editor Abilita l'evidenziazione della sintassi, o usa editor di testi semplice &Indent same as previous line &Indenta come la linea precedente Indent a new line in an editor to the same column as the previous line Indenta la nuva linea nell'editor alla stessa colonna della linea precedente Choose Scegli List example Esempio di lista Code example Esempio di codice Text example Esempio di testo Filename extensions Estensioni dei file Sy&ntax components Oggetti della si&ntassi &Pick &Seleziona Tab stop width Number of character width of tabstops If set the editor will insert spaces rather than tabs Use only spaces when indenting &Editor shortcuts (TAB replacement) E&dit... Display the line/column marker at the specified position Use &maximum text width mark Specify the column (text width) where to show marker toTableSelect Table selection Database Database Schema Schema Table Tabella Select database Select schema Select table toTemplate Not a toTemplate parent Template Toolbar Barra dei Modelli Template Modello Template result Internal error, lastLevel < 0 Errore Interno, lastLevel < 0 toTemplateAddFileUI Add template file Aggiungi modello (file) &Browse &Sfoglia Canel Annulla &Ok &Ok &File &File &Root Ogge&tto Cancel toTemplateEdit Internal error, lastLevel < 0 Errore Interno, lastLevel < 0 toTemplateEditUI Template editor Editor dei modelli Template Modello &Description &Descrizione Description text. Can be in HTML format. Descrizione. Può essere anche in formato HTML. &Preview &Anteprima &Name &Nome Name of the template. Nome del modello. Remove the current template Rimuovi il modello attuale Add new template Aggiungi un nuovo modello Preview Anteprima Preview of the description. Press the button to update Anteprima della descrizione. Premere il bottone per aggiornare Cancel Annulla &Ok &Ok Remove Rimuovi Add toTemplatePrefs Couldn't open file. Impossibile aprire il file. Couldn't open file. Start on new file? Impossibile aprire il file. Iniziare su un nuovo file? &Ok &Ok Cancel Annulla Couldn't write file Impossibile scrivere sul file Couldn't open file Impossibile aprire il file toTemplateSetupUI Form1 Form1 Root Oggetto Filename Nome file &Add File &Aggiungi file &Remove File &Rimuovi file &Edit File &Modifica file toTemplateTool Template Modello toTemporary Temporary Objects Refresh list Aggiorna lista &Temporary toThread toTool Alert Messenger Avvisi Backup Manager Gestione backup Current Session Sessione corrente DB Extraction/Compare/Search Estrazione/Confronto/Ricerca nel DB Invalid Objects Oggetti non validi PL/SQL Debugger PL/SQL Debugger PL/SQL Profiler PL/SQL Profiler Password Change Cambio password Rollback Segments Rollback Segments SGA Trace SGA Trace SQL Output Output SQL SQL Template SQL Worksheet Foglio di lavoro SQL Schema Browser Schema Browser Security Manager Gestione della sicurezza Server Tuning Ottimizzazione del server Sessions Sessioni Statistics Manager Gestione delle statistiche Storage Manager Gestione dello storage Malformed tag in config file. Missing = on row. (%1) Tag errato nel file di configurazione. Manca un = sulla riga. (%1) Unknown escape character in string (Only \\ and \n recognised) Carattere di escape sconosciuto nella stringa (Solo \\ e \n sono accettati) toToolSettingUI Form1 Form1 Tool Strumento &Default tool &Strumento standard Select the default tool to pop up when opening a new connection. Seleziona lo strumento da avviare all'apertura di una nuova connessione. &Enabled tools Strumenti &abilitati Select which tools should show up in the menu and toolbar. Seleziona quali strumenti dovrebbero apparire nel menu e nella barra. You must restart TOra for any of these changes to have effect. Dovete riavviare TOra affinchè questi cambiamenti diventino effettivi. You must restart for any of these changes to have effect. toTuning Enable all tuning statistics Attiva tutte le statistiche di ottimizzazione Are you sure you want to enable all tuning features. This can put heavy strain on a database and unless you are the DBA you probably don't want this. Selecting no here will give you the option to enable or disable tabs individually as they are needed. Sei sicuro di voler abilitare tutte le capacità di ottimizzazione. Questo può sovraccaricare il database e, se non sei un Amministratore probabilmente non ti è utile. Scegliere no di consentirà comunque di abilitare o disabilitare le varie opzioni singolarmente quando necessario. Yes Si &No &No Server Tuning Ottimizzazione del server Refresh Aggiorna Enable and disable tuning tabs Abilita e disabilita le opzioni di tuning &Overview blocks/s blocchi Wrong format of name on chart (%1). Formato errato del nome nel grafico (%1). &File I/O &File I/O Indicator Indicatore Value Valore Reference &Indicators &Indicatori &Statistics &Statistiche &Parameters &Parametri &Blocking locks Library C&ache Control Files Control Files Optio&ns Opzio&ni &Licenses &Refresh &Intervallo di aggiornamento &Change Refresh &Cambia intervallo di Aggiornamento &Tuning &Ottimizzazione &Charts &Wait events C&ontrol Files toTuning:Charts:4BAClients Active Attivi Inactive Non attivi System Sistema toTuning:Charts:6LNExecution Calls Chiamate Commit Commit Execute Esegui Hard parse Parse Rollbacks toTuning:ControlFileRecords Allocated Allocati Size Dimensione Total Records Record totali Type Tipo Used Records Record usati Used Usati toTuning:LibraryCache Get Hits Gets Namespace Pin Hits Pins Ratio toTuning:License Sessions Current Sessioni aperte Sessions Highwater Sessions Max Sessions Warning Users Max toTuning:Options Enabled Abilitato Parameter Parametro toTuningFileIO File I/O File I/O File timing Tablespace I/O Tablespace I/O Tablespace timing Reads Letture Blocks Read Blocchi letti Writes Scritture Blocks Written Blocchi scritti Average Media Minimum Minimo Maximum Read Maximum Write blocks/s blocchi toTuningOverview < Archive write blocks/s blocchi Hitrate < Client input Client output > Executes > Log writer > Buffer changed > blocks/s blocchi < Buffer gets Parse > < Physical read < Letture su disco Physical write > Scritture su disco > Redo entries > Timescale Scala temporale toTuningOverviewUI Form1 Form1 SGA SGA Buffer Cache Buffer Cache TextLabel3 TextLabel3 Total Totale Redo Buffer Redo Buffer Shared Pool Shared Pool Archive logs Archive logs Files/Size Files/Dimensioni Files Files Datafiles Datafiles Used/Total Usato/Totale Tablespaces Tablespaces Redo Logs Redo Logs Active/Total Attivo/Totale Active group Gruppo attivo Processes Processi Server Server Shared Condiviso Dispatchers Dispatchers Parallel Parallelo Dedicated Dedicato Background Background Clients Clients Active Attivi TextLabel5 TextLabel5 Send to client Inviati al client Send from client Inviati dal client toTuningSettingUI Form1 Form1 Server tuning Ottimizzazione del server Available tabs Tabs disponibili &Enabled background views Select which views collect data in the background that should be run. Seleziona quali viste che raccolgono dati in background devono essere utilizzate. toUnitTest UTbrowser Refresh list Aggiorna lista Schema Schema toViewConnections Connections Connessioni toViewDirectory Directory Cartelle toVisualize Data visualization Visualizzazione dati Bar chart Grafico a barre Line chart Grafico a linee Pie chart Grafico a torta Display legend Mostra legenda Display grid Mostra griglia Display axis legend Mostra legenda assi Title columns Titoli colonne Number of columns to use as title Numero di colonne da usare come titolo Update chart Aggiorna grafico toWaitEvents Server Tuning Ottimizzazione del server Display Display Time Tempo Count Conta Color Colore Wait type Tipo di wait Delta (ms/s) Delta (ms/s) Total (ms) Totale (ms) Delta (1/s) Delta (1/s) Total Totale System wait events Wait di sistema ms/s ms/s System wait events count Numero di wait di sistema waits/s waits/s Internal error, can't find (%1) in usedMap Errore interno, impossibile trovare (%1) nella usedMap Absolute system wait events Total %1%2 Delta system wait events Total %1%2 toWorkingWidget Waiting... Stop toWorksheet SQL worksheet Foglio di lavoro SQL Execute current statement Esegui la query corrente Execute all statements Esegui tutte le query Step through statements Esegui il successivo Reexecute Last Statement Riesegui l'ultima query Stop execution Interrompi l'esecuzione &Result &Risultato E&xecution plan Piano di e&secuzione &Visualize &Visualizza &Information &Informazioni Worksheet Statistics Statistiche per il foglio di lavoro Save statistics for later analysis Salva le statistiche per un analisi successiva Wait states Stati di wait I/O I/O blocks/s blocchi &Statistics &Statistiche &Logging SQL SQL Result Risultato Timestamp Timestamp Duration Durata Describe under cursor Descrivi elemento sotto il cursore Clear execution log Vuota il log di esecuzione Gather session statistic of execution Raccogli statistiche di esecuzione per la sessione Refresh Aggiorna Run current saved SQL Esegui l'SQL salvato Save last SQL Salva l'ultimo SQL &Execute Current &Esegui Execute &All Esegui &Tutti Execute &Next Esegui &Successivo Execute &Newline Separated Esegui l'SQL fino alla prima riga &vuota &Reexecute Last Statement &Ripeti l'ultima query &Describe Under Cursor &Descrivi elemento sotto il cursore &Explain current statement Costruisci l'&Explain per la query corrente &Enable Statistics &Abilita statistiche &Stop Execution &Interrompi l'esecuzione Execute Saved SQL Esegui l'SQL salvato Select Saved SQL Seleziona l'SQL salvato Edit Saved SQL... Modifica l'SQL salvato ... Previous Log Entry Riga di log precedente Next Log Entry Riga di log successiva Erase &Log Cancella il &Log W&orksheet F&oglio di lavoro Save changes to worksheet for %1 Salva i cambiamenti al foglio di lavoro per %1 Save file Salva file &Yes &Si &No &No Cancel Cancella Wrong number of parameters for describe Numero di parametri errato per describe Ignoring SQL*Plus command Ignora comandi SQL*Plus Processing query Query in esecuzione %1 rows processed %1 righe processate Query executed Query eseguita Duration while query has been running Tempo di esecuzione query (Duration %1) (Durata %1) Aborted Abortito No SQL to save Nessun SQL da salvare You haven't executed any SQL yet Non hai ancora eseguito alcun SQL &Ok &Ok Enter title Inserisci un titolo Undescribed Non descritto No plan available to save Nessun piano disponibile per il salvataggio Previous log entry Next log entry Executing all statements Enter refreshrate Refresh rate of query in seconds Explain plan of current statement Check syntax of buffer Parsing all statements Insert current saved SQL Edit&or Save changes to editor for %1? toWorksheetSetupUI Form1 Form1 Automatically save file when closing worksheet (Without asking any questions). Salva automaticamente alla chiusura del foglio di lavoro (Senza chidere conferma). SQL Worksheet Foglio di lavoro SQL Auto &save &Salvataggio automatico Ask about saving &changes Chiedi il salvataggio dei &cambiamenti Ask about saving changes when closing worksheet. Chiedi per salvare i cambiamenti alla chiusura del foglio di lavoro. Add &log entries at end Aggiungi i valori di &log alla fine Add newly executed queries at end of log instead of top. Changing this will mess up the log in the windows that are opened. Aggiungi le query eseguite alla fine del log invece che all'inizio. Cambiare questa opzione incasinerà i log nelle finestre già aperte. &Multiple lines in log. Linee &multiple nel log. Display multiple lines in the SQL column of the logging. Mostra linee multiple nella colonna SQL del logging. &Enable statistics &Abilita statistiche Enable statistic collection per default. Abilita la raccolta delle statistiche come default. Enable &timed statistics Enable timed statistics as well when collecting normal statistics. Abilita anche le statistiche temporali con la raccolta delle statistiche normali. &Display number column Numera i recor&d di una query Add a numbering column to the left of the result. Aggiungi una colonna di numeri a sinistra dei risultati. &Browse &Sfoglia Default &file &File di default File to automatically open in a new worksheet. Apri il file automaticamente in un nuovo foglio di lavoro. Move &cursor to error Porta il &cursore all'errore Move the cursor to an error if the error occurs. Sposta il cursore all'errore, se esso si presenta. Save previous results Salva i risultati precedenti Keep previous results in while worksheet is open. Will consume lot of memory. Conserva i risultati precedenti finchè il foglio di lavoro è aperto. Richiede molta memoria. Execute a statement when it is selected in the log, if disabled simply selected the statement in the log. Automatically save file when closing editor (Without asking any questions). SQL Editor Keep previous results in while editor is open. Will consume lot of memory. File to automatically open in a new editor. Execute directly when selecting in log Display column descriptions in own toplevel window. toWorksheetStatistic Server Tuning Ottimizzazione del server Load statistics from file Carica le statistiche da file Save statistics to file Salva le statistiche su file Remove statistics Elimina le statistiche Display charts Mostra il grafico Display execution plans Mostra i piani di esecuzione Hide Nascondi toWorksheetText Save changes? Salvare le modifiche? The editor has been changed. Do you want to save them, discard changes or open file in new worksheet? L'editor è stato cambiato. Vuoi salvare, annullare le modifiche o aprire il file in un nuovo foglio? &Save &Salva &Discard &Scarta &New worksheet &Nuovo foglio di lavoro toWorksheetWidget Worksheet Widget toWriteFile File error Errore di file Couldn't write data to tempfile Impossibile scrivere i dati nel file temporaneo Couldn't upload data to URL Impossibile caricare i dati verso l'URL File saved successfully File salvato correttamente Couldn't open file for writing Impossibile aprire il file in scrittura Couldn't write data to file Impossibile scrivere i dati su file tora-2.1.3/src/i18n/tora_se.qm0000644000175000017500000064763311445442526015643 0ustar michaelmichaelmMl012F3q45678H9s@ABCDJEuFGHI!PLQwRSmamx/F>=.>B>GOO8[ n[(+O1+OJ)+O+Oy+O@+ON4+O+O߃+[+[`0+[e+[i +[m+[}+[+[+[e+[J+[W+[ +[%+[P+[W+[^+[+[+[+[i+[\+[t+[++[E+[߮H,DH,n4H,H,%H,H,H,\H,O4HU\HYnbHY H1HL?!SoSpWW~X\*X\X\X\[ X\Y#Zr>]C _"_<_jmb\|,,H5&JUɥN?P}@F#V8D;$jx%Oܳ;TD&+-r0E: /: N: EpEwH5;H5hAH5H5H5 H54H5L'VE5VEVE'KVE=VEEnpSƔDB!@%)dEv55*b9EYP]?55\ee?Feee eee&e eZeįHɴ#]/]%FcJDcj o^4 A .&^r V n%5'P 'b*y0Z* [*` *0*%0*%?*00*0*W+H5ZE+H5e+H5h+H5"-+H5+H5C+H5J&+H5+L+Lp+VE>+o+3#+2+d+3++p+t+`+z+%4i+e[/+ef+į4,DZ,D~,D,D;,nr1 3Sd3s3D23Nz47s;T`>P@dDչ"7Eե"xFU(F|F|FqF7GN4G<GBGFI5kIUDIyGeI3WI I5J J J6[J6qJ6-J9_QJV#+JcbJlT=JáJs!^JΓ JΓ&K\6~L7lL7oL.%MMiͱMiUMiuMi AMi?MiLSMisMiyMiYMiMiMiwMi/MiCMiMiCMiDPWFPP,&|R̼S&SW5SmT¢XUZd5V )V[*V9VwV]VV_V9<VD6VOOVWVVV VVjIW#IiWTCXXFXZX.-Y\5rYb9\Y5=~Y5RZi&Zt2Zy% DZy%iZE0ZeF[ %{[ %|[f3H[f3[j|[j|[j|>\7B\vא\D\rn\>\;\|\U\,v]|aޫbzerfegܱn o2#r)s^tD;uyuz|7(6~`' %v3H2EFy۞c9E^Zd*r#CT$M|2 M[%?%CCaT)d+1)uZ*/,=*/6v4 7 0?!9GI^5JkkM*MDNEW PWTQU QaTFŗU >mVZKL[]V.^C  _r+dbgYmF+m$coa<o1(t^4uw1wwy+$u+C$CC$Oy(,Q%)'׮Gd(JdFt&h~,?ݕ:ݕP(Z5PZJ!jgCW;ȩ.i$> ٥U#fLO&Sݕ.f*0{pz 쥴)U.WN ssGe;Geq k7 ne`C;z:+}HH) >`$ V#Nb#r e& **+ls,%u;,%uQ./ooB0#T{`7,D7,DB8B̄F}GbK$bMKӷR7/SUS61V^MV+~V\Z.~p^=t^O5>cK_egÎ%hxk5p'=5p}Avr Rr.nr<r@UrDrRMrWsQzuwrwUBw0wsspz2izT~|_k4)5ysc*"`qf&T3,w9Yio@4,J/Y|o2Iơ3b3ev%aU % zf34>" Ƿ$ǷYR, KƏήtȏۓ@Ӵ4,:,OiN][MU,zy©zyܞ%5۹fgZ Xp>:@>@VbV* V{V= s5&NFOY|VW 9^<(!C,-q12Q :e;?u<ڴAB%5BsFWJJMZMC jQu,QQQNV8Y0%6Y„ZZǫZ$rZ$Z$cZ[2^.[%[%']]Q]7o]L]٬^PbmbhciVpib3icPdic`rr~ɉvyӰ{%"|!R~ ؇3;nzpۨw,wJEU>#N3Btpn~> vEѳpj%˝s3Cʗ@ ͐dI|bB-BK?SdcbuV$ N8Su|&6$" t8 3b.E"+<"IIft^,>hhu$#&-&.(/)[1ڼ̘2Ts23ښ7Q7?:Go:cj:(K>AmK>HkO%-O%SO%UO%VnO%?Q{1UUPVQ\[f]66^1TMY_as>g_asS@`g uZd~Eg~h h^imqts^t2YEvY=vYRvYvEvY|vYowy Qyrz^mzzz|AGH|CuCwC}:Q44/:DyfH̼/Z#FZ#Z#eTXN9 BrII`IfIiInIwI}IVI6IĒIQIII&cI7IJIZ&IIIIRI-IaIII6[I@IGIO]IeIIIrIn}mnne48e4NJZ+|#f~X;mD&30Hbfs L>>̭>[tPyq bԅ xa H~+9~ wt3ptaD*(=`Y?7#腳&ShEhErNX aiVoRWT^K B $/nv.7EV'9!w! N!.S"7$$6X8[| G9T<[$B2mjE~FGHLNQ)sV|gV|iXlY Y Y Y Y Y =YY j\Зe0Ei2$/ i2$?i2$ii2$cjjZkl&l'ncsy8syt4}ڣ   A)/Fjv))4 /44*-4o'x.E})D7^^G% 1Y111b1*?t*(tsyz `+0tZSϰ29r#ѓE^qLWBnOUn9D&K] q+'W<[T+W]$.9o ]/iÏ*O^hƨ-ƨƨp6UI"c40an,ananHԒCևbfrB" 3'-'~8Ap/C;"nT N PXbV"V"1JS'S)5*+ʞ-b5#-Ӆ4.].C,/n0#P&2 {7jG9qX|#9qXݺ9qXM9qX9:5}N;Jv<~=a?m8B+eUCEXbIsCSIʴ5MMOUɒ0X|iٯZV^ZZ ZK[cHeC5KeeKgRkYq9$qXra"uZ~uN/w4Yws3/rxUUAy@m{*{{%{{.aTsԢ/ԢnʭoEEXFEZ]`Y23@Ytv1?? uYAǒ+Ώ_nZ,9:Y^Nز^NBw~`&\Qlat]X:ěC >nr5K t6 tL*Q~˝  F:!$=%C,Dd,<,E,X.an4ť5ܗj8%J97s>^?GrC$ IzJM %Ne PVUnC\pa.Gc9y/.eM߲eMr6g2 hIBAhIB Ridרlo3L qc6sVUy'{ 7lc3ZN*<2NwYϗϗ+D֙G W$:W$Mv- ['#75_" }n1u3xtTͩN)" U\zNx^nb'(Zlo(v&T;$-Kޞ;ޞM>7EbpA[훞UUBq G /18M/8L5: L  `5 / >d ;3QoYi$SCa% t'֤(xe,N[w,ڴ,1NQ4z.j6Y87s99z9#;}.ZCEGgHAEmJn%:K3$L DNBfRM@cTgWoNXy)Z7,Z7[g&^_`\^dpRsv\vz{z#% LzE{|t@Pl.0hݥBB N&]7 S7owL~@ &Å`D`DFE5 5S755Wt̅}n<P X! C JZoÕ|M-E*t}  V9a(()(!(v(7(((|(@((36(N](`E(c( (->&*X9'%%-c'0 ȼCu\}V̇ṅI]gD(n(bS|莕G5e5sQ~Ri #+ ` S \~$e \~2 \~ \x f j QN ue anX 7    !Eh "'b "'ғ "3! ,vu 6d 8 8sF 9 :L>u :> =oC( @3 A1 At AtR L}. L(` LE MgS MgV MgȪ Mg T4Up W Z/UE [_( `w| b+q h>' h>? h>g h> i4ۨ lU mL pT vL8b v{ xʄ ye1 }% } vi 9i /K 2_ 2} m$( bZ n (A $. h {d βhg jv 1] HA HH k3 v f f p< s & F} K < ¥ ¥- â ī rUH  CV mX ʞN ʞ` ʠ شeT N ~ ͶRZ^ e9 O[ ҫca E لS l9 t3 drW drb M Mk _ Xz v pba t t8 # ]X @ Th X_ t +n q" u |X ~ @ -F Z dt "~ "QI %p (wt ,( -y /ͺ 0-e? 00? 00 14^ 2, 2؅> 2؅Z 4؅ʢ 5, 6  9 9^ :_1k ;fF ># ?Zt ?Z[ Ee@ EeDv E0 C IpE VO Z( [8 [M \05Bi c # cZ ceu chp c#~ cm d<0 dhK dn7 dpe d:} dO dU` d)< d)Qe e e eP{ fc gnEA ky s( wKdj w^7 xk| |05'g |C 8  H 9 x n n nrL n n %Rm [ ~4 <Y 5 KR j d >հ 2v w N ]qS ed4   3 JZ 3q  t tB_  %* e e# e8 e~ Ɍ ɜ.- ˓9  LY ӻ. չ#  ֈ כn w C X\ X\Cx X\I  | 腓!! l B 9 F0 i^- р  3T g : " ` G? S IN <(> <( t 7 $ rڄ j޵ #S #W S: "9 U b <!<  !# !#f !#k #a# ## & 2 8ZI 85{ :DU < =V",* @14 Au F^T* F^T Fj8 N#7@ T@ TSp U* V\6 W?! YS [5 [J b e0e eݕ@J l|s r u vC+ vcS v {!  x > ~9 d `_ F 2 v nU  b =y 4H ^  .[  k@ ȵ* 5z/ )4L g ;iF 0n   Pg  %* G32 G3J uT  ͇+ ͠# o B2 B m uDm %C KG4 : B! i 㽾 '   8 O " > ocK @P OW EO= / G  `s΢ ^dڌ  gR F/9Z r +(v %5* (pߒ )D *Y2g -$acF /dz /dM /d /d 0U( 0.7 4n2” 6Ǟv @0 AZ AB F G-J G- G- Ge G Gͩ G M$# MɎ N(L OI RV½ RV S ê Ti [R _e `Q% b+[ dŢ dc iS6 j%N n q qܘs, r@ rp1 sW sW4 sW sW vPU v zL_N 1v P  9 S S2   pO t 2 24 I(  >pI >z > D2 =Y ( DU o]  F% @ /Å j %t x 4 ! D4r D?w D #  DgN r O7 OL  8O Mh fY "w kC l. H >: Nt A nN % ɠ ɠ  ˺h +U єE {I n2 ݪ|h T s u 奁j( ( Geo ~ 9_ [  I OS rj e Ȇ $ C & w g u@ \  ^ \0E Z$  $Sq $D{ $K  * qa rD e Y1U  ^ .o zR & 4EV 8̸ F6P F;3| InT M]%_ YN Zt \# ^q d@i gR#r iԿ jO.$ qe rO z9 ڴ zۂ z 6  m l a  R% a' L} t\ ? N 9^> )2F' bIM wH h 2s V Ȳ ˞4Q Y ]I ̼w &$ V  @ SB SBI ڡ^ k2 eU h n/| P ~ 5.r_ V ÃQ-\w`MLjWW e \#yG(%(H)$<|0Z51}K3Nu4#?S^EsR09HeL`vLM'kSki 3ZHc.@c.GoЄ;pdqA"qK\qcs.r 0sWsutu} e~Rgs J3޶Ϣf^s>Z,["-#yBHHJNI#nK8$@YV)Wʊo+Sq^^[e .Ci#z°OÐeϭǔ)ǜsp#1 E{4ŃτU Ϭ:N 0}NJ?&7Y%fCO!pLӴf$,RWRbuǫfN9 gl    @k`]H]A m!"ɓK"':)T)hX)z,+2u,+I.7K.8(0 e12N7B5(:>Uy>l@hADI-JMd\P~ ^XI.[`[r`z^pbVe e5tJees~ ghoPtu լvcxabyt%}*y>XJ@'<|G3U/jzrW_d/~O~PqL@6;;C<ID tfIfUfC>dFd136gg7#r!:ɭ4~~6EѤf3qaz1mDٻ.ڠ" ztt*%~1.o2]:]2f~%ogp>H6_i AvslutaExitmainLaddat modul %1Loaded plugin %1mainOhanterat felUnhandled exceptionmainOknd typ Unknown typemain&Slutanvndar licensEnd User LicensetoAboutGNU GPLGNU General Public LicensetoAbout CitatQuotestoAbout&Ok&Ok toAboutUI AvbrytCancel toAboutUItoAboutUI toAboutUI toAboutUI&Lgg till namn &Add nametoAlert &Alarm&AlerttoAlert*&Meddelande i memo...&Message in memo...toAlert&Ta bort namn &Remove nametoAlert&Skicka alarm &Send alerttoAlert"Alarm MeddelandenAlert MessengertoAlert&Editera &meddelande Edit &messagetoAlertEditera &namn Edit &nametoAlert2Editera meddelande i memoEdit message in memotoAlertKunde inte starta pollande trd, frsk stnga ngra andra verktyg och starta om Alarm MeddelandenXFailed to start polling thread, try closing some other tools and restart Alert MessengertoAlertMeddelandeMessagetoAlertNamnNametoAlert(Registrera nuvarandeRegister currenttoAlertRegistrerade RegisteredtoAlert&Ta bort registreradRemove registeredtoAlertSkicka alarm Send alerttoAlertTidTimetoAlert%% toAnalyze&Uppdatera&Refresh toAnalyze&Statestik &Statistics toAnalyzeAllaAll toAnalyzeAnalyseraAnalyze toAnalyzeAnalyseradAnalyzed toAnalyze"Berkna statestikCompute statistics toAnalyze Radera statestikDelete statistics toAnalyzeVisa SQL Display SQL toAnalyze&Uppskatta statestikEstimate statistics toAnalyzeKrplaner Explain plans toAnalyze$Indexerad kolumnerIndexed columns toAnalyze IndexIndexes toAnalyzeLokala index Local indexes toAnalyzeEj analyserad Not analyzed toAnalyzeParallellParallel toAnalyzeUppdateraRefresh toAnalyze*Aktiva %1 Vntande %2Running %1 Pending %2 toAnalyze UrvalSample toAnalyzeBrja analyseraStart analyzing toAnalyze&Statestik HanterareStatistics Manager toAnalyze(Stoppa aktiv krningStop current run toAnalyze TabelTable toAnalyzeTabellerTables toAnalyze,Kontrollera referenserValidate references toAnalyze(Arbetsblad statestikWorksheet statistics toAnalyzefrfor toAnalyzeTHuvudfnster inte av KDockMainWindow klassMain widget not KDockMainWindow toAttachDock.Oknd dockningspositionUnknown dock position toAttachDock<%1 frgor aktiva i bakgrunden.!%1 queries running in background. toBackground2Inga frgor i bakgrunden.No background queries. toBackground8En frga aktiv i bakgrunden. One query running in background. toBackground"&Backup Hanterare&Backup ManagertoBackup&Uppdatera&RefreshtoBackupArkivloggar Archived LogstoBackup Backup HanterareBackup ManagertoBackup$Backup BearbetningBackup ProgresstoBackupSinaste Backup Last BackuptoBackup4Logbyten per dag och timmeLogswitches per day and hourtoBackupRedo Byten Redo SwitchestoBackup<Ser ut att vara en kall backup)This appears to be a cold backup databasetoBackup:Ser ut att vara en hot backup(This appears to be a hot backup databasetoBackupUppdateraUpdatetoBackup% Klart % CompletetoBackup:CurrentBackupKontextContexttoBackup:CurrentBackup Serie#Serial#toBackup:CurrentBackupSIDSidtoBackup:CurrentBackupHittintillsSo FartoBackup:CurrentBackup TotaltTotaltoBackup:CurrentBackupBytes Skrivna Bytes WrittentoBackup:LastBackupCheckpoint TidCheckpoint TimetoBackup:LastBackupCkpt Byte# Ckpt Change#toBackup:LastBackupTidpunkt klarCompletion TimetoBackup:LastBackupFilstorlek File SizetoBackup:LastBackupFilnamnFilenametoBackup:LastBackupNivLeveltoBackup:LastBackupLogiskt FelLogically CorrupttoBackup:LastBackupMedia Crpt Media CrpttoBackup:LastBackupMrkd Crpt Mrkd CrpttoBackup:LastBackupTypTypetoBackup:LastBackup Kontrolfil RecidControlfile RecidtoBackup:LogHistoryKontrolfil TidControlfile StamptoBackup:LogHistoryHgsta Scn Highest ScntoBackup:LogHistoryLgsta Scn Lowest ScntoBackup:LogHistorySekvens# Sequence#toBackup:LogHistory Trd#Thread#toBackup:LogHistory(Tidpunkt Frsta PostTime Of First EntrytoBackup:LogHistory00toBackup:LogSwitches01toBackup:LogSwitches02toBackup:LogSwitches03toBackup:LogSwitches04toBackup:LogSwitches05toBackup:LogSwitches06toBackup:LogSwitches07toBackup:LogSwitches08toBackup:LogSwitches09toBackup:LogSwitches10toBackup:LogSwitches11toBackup:LogSwitches12toBackup:LogSwitches13toBackup:LogSwitches14toBackup:LogSwitches15toBackup:LogSwitches16toBackup:LogSwitches17toBackup:LogSwitches18toBackup:LogSwitches19toBackup:LogSwitches20toBackup:LogSwitches21toBackup:LogSwitches22toBackup:LogSwitches23toBackup:LogSwitches DatumDatetoBackup:LogSwitchesZoomZoom toBarChart&Utforskare&Browser toBrowser&ndra Schema&Change Schema toBrowser&Radera filter &Clear filter toBrowser&Kolumner&Columns toBrowser &Data&Data toBrowser&Deklaration &Declaration toBrowser(&Definiera filter...&Define filter... toBrowserRtti&gheter&Grants toBrowser &Index&Indexes toBrowser&Referenser &References toBrowser&Uppdatera&Refresh toBrowser &Vyer&Views toBrowserImplementati&onB&ody toBrowserK&odC&ode toBrowserC&onstraints C&onstraints toBrowserndra &ObjektChange &Object toBrowser&KodCod&e toBrowserKodCode toBrowserKolumnerColumns toBrowser Constraints toBrowserSkapa ny tabellCreate new table toBrowserDB Utforskare DB Browser toBrowserDataData toBrowser&Beroenden De&pendencies toBrowser,Definiera objektfilterDefine the object filter toBrowserZDefiniera objektfilter fr databas utforskare-Define the object filter for database browser toBrowserBeroenden Dependencies toBrowserAntal ExtentExtents toBrowserRttigheterGrants toBrowser Inde&xInde&xes toBrowser IndexIndexes toBrowserInfoInfo toBrowserInformation Information toBrowser"ndra constraintsModify constraints toBrowserndra indexModify indexes toBrowser$ndra tabellkolumnModify table columns toBrowserInga Scheman No schemas toBrowserReferenser References toBrowser4Ta bort alla objekt filterRemove any object filter toBrowserTRadera objektfilter fr databas utforskare-Remove any object filter for database browser toBrowserS&ynonymer S&ynonyms toBrowserSQLSQL toBrowser ScriptScript toBrowserSekvense&r Se&quences toBrowserSekvenser Sequences toBrowserSynonymerSynonyms toBrowserT&abellerT&ables toBrowser Tabel utforskare Table browser toBrowserTabellerTables toBrowserTri&ggers Tri&ggers toBrowserTriggersTriggers toBrowser Updatera frn DBUpdate from DB toBrowserVyerViews toBrowser Vidare GrantabletoBrowser:AnyGrants gareGranteetoBrowser:AnyGrantsMottagareGrantortoBrowser:AnyGrantsRttighet PrivilegetoBrowser:AnyGrantsKolumnlngd Column LengthtoBrowser:IndexColsKolumnnamn Column NametoBrowser:IndexColsAvtagandeDescendtoBrowser:IndexColsTabelnamn Table NametoBrowser:IndexCols6Medel Data Block Per NyckelAvg Data Blocks Per KeytoBrowser:IndexInformation4Medel Lv Block Per NyckelAvg Leaf Blocks Per KeytoBrowser:IndexInformation BLevelBleveltoBrowser:IndexInformationBuffer Pool Buffer PooltoBrowser:IndexInformation KlustringsfaktorClustering FactortoBrowser:IndexInformationKomprimering CompressiontoBrowser:IndexInformationNivDegreetoBrowser:IndexInformationDistinkt Nyckel Distinct KeystoBrowser:IndexInformationDOMIDX OpstatusDomidx OpstatustoBrowser:IndexInformationDOMIDX Status Domidx StatustoBrowser:IndexInformation LngdDurationtoBrowser:IndexInformationFriliste GruppFreelist GroupstoBrowser:IndexInformationFrilista FreeliststoBrowser:IndexInformationFunkIDX StatusFuncidx StatustoBrowser:IndexInformationGenererad GeneratedtoBrowser:IndexInformation Global Statestik Global StatstoBrowser:IndexInformation Inkludera KolumnInclude ColumntoBrowser:IndexInformationIndexnamn Index NametoBrowser:IndexInformationIndextyp Index TypetoBrowser:IndexInformationIni Trans Ini TranstoBrowser:IndexInformationIni ExtentInitial ExtenttoBrowser:IndexInformationInstans InstancestoBrowser:IndexInformationITyp Namn Ityp NametoBrowser:IndexInformationITyp gare Ityp OwnertoBrowser:IndexInformationJoin Index Join IndextoBrowser:IndexInformationSinaste Analys Last AnalyzedtoBrowser:IndexInformationLv Block Leaf BlockstoBrowser:IndexInformationLoggningLoggingtoBrowser:IndexInformationMax Extents Max ExtentstoBrowser:IndexInformationMax Trans Max TranstoBrowser:IndexInformationMin Extents Min ExtentstoBrowser:IndexInformationNext Extent Next ExtenttoBrowser:IndexInformationAntal RaderNum RowstoBrowser:IndexInformation gareOwnertoBrowser:IndexInformationParametrar ParameterstoBrowser:IndexInformationPartitionerad PartitionedtoBrowser:IndexInformation"PET Direkt AccessPct Direct AccesstoBrowser:IndexInformationPct FreePct FreetoBrowser:IndexInformationPct Increase Pct IncreasetoBrowser:IndexInformationPct Threshold Pct ThresholdtoBrowser:IndexInformationPrefixlngd Prefix LengthtoBrowser:IndexInformationUrvalsstorlek Sample SizetoBrowser:IndexInformationSekundr SecondarytoBrowser:IndexInformation StatusStatustoBrowser:IndexInformationTabelnamn Table NametoBrowser:IndexInformationTabelgare Table OwnertoBrowser:IndexInformationTabeltyp Table TypetoBrowser:IndexInformationTabelspace NamnTablespace NametoBrowser:IndexInformationTillfllig TemporarytoBrowser:IndexInformationUnik UniquenesstoBrowser:IndexInformationAndndar Stats User StatstoBrowser:IndexInformationObjektnamn Object NametoBrowser:ListCodeObjekttyp Object TypetoBrowser:ListCodeTypTypetoBrowser:ListCodeIndexnamn Index NametoBrowser:ListIndexSekvensnamn Sequence NametoBrowser:ListSequenceSynonymnamn Synonym NametoBrowser:ListSynonymTabelnamn Table NametoBrowser:ListTablesTriggernamn Trigger NametoBrowser:ListTrigger Vynamn View NametoBrowser:ListViewCachestorlek Cache SizetoBrowser:SequenceInformationCykelflagga Cycle FlagtoBrowser:SequenceInformationka med Increment BytoBrowser:SequenceInformationSista nummer Last NumbertoBrowser:SequenceInformationMax Max ValuetoBrowser:SequenceInformationMin Min ValuetoBrowser:SequenceInformationOrdningsflagga Order FlagtoBrowser:SequenceInformationSekvensnamn Sequence NametoBrowser:SequenceInformationSekvensgareSequence OwnertoBrowser:SequenceInformationDB LnkDb LinktoBrowser:SynonymInformation gareOwnertoBrowser:SynonymInformationSynonymnamn Synonym NametoBrowser:SynonymInformationTabelnamn Table NametoBrowser:SynonymInformationTabel'gare Table OwnertoBrowser:SynonymInformationMedel Radlngd Avg Row LentoBrowser:TableInformationMedelstorlek Avg SpacetoBrowser:TableInformation6Medel Utrymme FrilisteblockAvg Space Freelist BlockstoBrowser:TableInformationBackuppad Backed UptoBrowser:TableInformation BlockBlockstoBrowser:TableInformationBuffer Pool Buffer PooltoBrowser:TableInformation CacheCachetoBrowser:TableInformationLnkningsantal Chain CnttoBrowser:TableInformationKlusternamn Cluster NametoBrowser:TableInformationKluster gare Cluster OwnertoBrowser:TableInformationNivDegreetoBrowser:TableInformationBeroenden DependenciestoBrowser:TableInformation LngdDurationtoBrowser:TableInformationTomma Block Empty BlockstoBrowser:TableInformationFrilistegruppFreelist GroupstoBrowser:TableInformationFrilista FreeliststoBrowser:TableInformationGlobala Stats Global StatstoBrowser:TableInformationIni Trans Ini TranstoBrowser:TableInformationInitial ExtentInitial ExtenttoBrowser:TableInformationInstanser InstancestoBrowser:TableInformationIOT NamnIot NametoBrowser:TableInformationIOT TypeIot TypetoBrowser:TableInformation"Senast Analyserad Last AnalyzedtoBrowser:TableInformationLoggningLoggingtoBrowser:TableInformationMax Extents Max ExtentstoBrowser:TableInformationMax Trans Max TranstoBrowser:TableInformationMin extents Min ExtentstoBrowser:TableInformationvervakning MonitoringtoBrowser:TableInformationNstladNestedtoBrowser:TableInformationNext Extent Next ExtenttoBrowser:TableInformation&Antal FrilisteblockNum Freelist BlockstoBrowser:TableInformationAntal RaderNum RowstoBrowser:TableInformation gareOwnertoBrowser:TableInformationPartitionerad PartitionedtoBrowser:TableInformationPCT FreePct FreetoBrowser:TableInformationPCT Increase Pct IncreasetoBrowser:TableInformationPCT UsedPct UsedtoBrowser:TableInformationRadrrelse Row MovementtoBrowser:TableInformationUrvalsstorlek Sample SizetoBrowser:TableInformationSekundr SecondarytoBrowser:TableInformationBortse Korrupt Skip CorrupttoBrowser:TableInformationTabells Table LocktoBrowser:TableInformationTabelnamn Table NametoBrowser:TableInformationTablespace NamnTablespace NametoBrowser:TableInformationTillfllig TemporarytoBrowser:TableInformationAnvndar Stats User StatstoBrowser:TableInformationKolumnnamn Column NametoBrowser:TableTriggerBeskrivning DescriptiontoBrowser:TableTrigger StatusStatustoBrowser:TableTriggerTriggernamn Trigger NametoBrowser:TableTriggerHndelseTriggering EventtoBrowser:TableTriggerKolumnnamn Column NametoBrowser:TriggerCols Under Updatering In UpdatetoBrowser:TriggerColsAnvndandeUsagetoBrowser:TriggerCols Krtyp Action TypetoBrowser:TriggerInfoObjekt TypBase Object TypetoBrowser:TriggerInfoKolumnnamn Column NametoBrowser:TriggerInfoBeskrivning DescriptiontoBrowser:TriggerInfo gareOwnertoBrowser:TriggerInfoRefererade NamnReferencing NamestoBrowser:TriggerInfo StatusStatustoBrowser:TriggerInfoTabelnamn Table NametoBrowser:TriggerInfoTabelgare Table OwnertoBrowser:TriggerInfoTriggernamn Trigger NametoBrowser:TriggerInfoTriggertyp Trigger TypetoBrowser:TriggerInfoHndelseTriggering EventtoBrowser:TriggerInfoNr Klausul When ClausetoBrowser:TriggerInfo &Spara&ApplytoBrowserConstraintUI&Kolumn&ColumntoBrowserConstraintUI&Kolumn&ColumnstoBrowserConstraintUI &Namn&NametoBrowserConstraintUI&&Primr nyckel/Unik&Primary key/UniquetoBrowserConstraintUI&Refererande &ReferentialtoBrowserConstraintUI&Typ&TypetoBrowserConstraintUIK&ontrollC&hecktoBrowserConstraintUIVilk&or C&onditiontoBrowserConstraintUI StngClosetoBrowserConstraintUIConstraintinfoConstraint infotoBrowserConstraintUIJVisa SQL fr att terskapa constraint%Display SQL to create this constrainttoBrowserConstraintUIPrimr Nyckel Primary keytoBrowserConstraintUI"R&efererad KolumnR&efered columnstoBrowserConstraintUIRe&fererar Refers &TotoBrowserConstraintUIUnikUniquetoBrowserConstraintUIK&omma lista &Comma listtoBrowserFilterUI&Innehller &ContainstoBrowserFilterUISlutar m&ed &End withtoBrowserFilterUI&Exkludera&ExcludetoBrowserFilterUI&Includera&IncludetoBrowserFilterUI&Invertera Val&Invert selectiontoBrowserFilterUII&nget filter &No filtertoBrowserFilterUI&Ok&OktoBrowserFilterUI&RegExp&RegExptoBrowserFilterUI&Starta med &Start withtoBrowserFilterUI AvbrytCanceltoBrowserFilterUIDKommaseparerad lista av objektnamn$Comma separated list of object namestoBrowserFilterUI Filtrera p namnFilter on nametoBrowserFilterUI,Filtrera p tablespaceFilter on tablespacetoBrowserFilterUI&FilterinstllningarFilter settingtoBrowserFilterUI$Ignorera &Versaler Ignore &CasetoBrowserFilterUIInkludera &Alla Include &AlltoBrowserFilterUI*Objektnamn innehllerObject name containstoBrowserFilterUI,Objekt namn slutar medObject name ends intoBrowserFilterUI2Objektnamn matchar RegExpObject name matches RegExptoBrowserFilterUI0Objekt nammn startar medObject name start withtoBrowserFilterUI0Visa enbart egna schemanOnly display own schematoBrowserFilterUI&Columner&ColumnstoBrowserIndexUI &Namn&NametoBrowserIndexUI&Ok&OktoBrowserIndexUI&Typ&TypetoBrowserIndexUI BitmapBitmaptoBrowserIndexUI AvbrytCanceltoBrowserIndexUINVisa SQL fr att skapa detta constraint%Display SQL to create this constrainttoBrowserIndexUIIndexnamn Index nametoBrowserIndexUI NormalNormaltoBrowserIndexUIPrimrnyckel Primary keytoBrowserIndexUIUnikUniquetoBrowserIndexUINamnNametoBrowserTable&Kolumner&ColumnstoBrowserTableUIAllm&nt&GeneraltoBrowserTableUI &Namn&NametoBrowserTableUI&Ok&OktoBrowserTableUI&Tablespace &TablespacetoBrowserTableUIK&ommentarC&ommenttoBrowserTableUI AvbrytCanceltoBrowserTableUIBVisa SQL fr att skapa constraint%Display SQL to create this constrainttoBrowserTableUITabelkolumner Table columnstoBrowserTableUI>ndra anslutning fr verktyget."Change the connection of the tool.toChangeConnectionlKunde inte hitta verliggande anslutning. Internt fel.0Couldn't find parent connection. Internal error.toChangeConnectionFKunde inte hitta valda anslutningen!Couldn't find selected connectiontoChangeConnection EmailEmail toChartAlarm!=toChartAlarmUI&Ok&OktoChartAlarmUI<toChartAlarmUI<=toChartAlarmUI=toChartAlarmUI>toChartAlarmUI>=toChartAlarmUIGenomfrandeActiontoChartAlarmUIAllaAlltoChartAlarmUI ValfriAnytoChartAlarmUI MedelAveragetoChartAlarmUI AvbrytCanceltoChartAlarmUIDiagram alarm Chart alarmtoChartAlarmUIJmfrelse ComparisontoChartAlarmUI EmailEmailtoChartAlarmUIIgnoreraIgnoretoChartAlarmUIMaxMaxtoChartAlarmUIMinMintoChartAlarmUIOperation OperationtoChartAlarmUILOperation att utfra p valda kolumner,Operation to perform on the selected columnstoChartAlarmUIPermanent PersistenttoChartAlarmUIFKom ihg detta alarm efter omstart.$Remember this alarm when restarting.toChartAlarmUI Statusmeddelande StatusmessagetoChartAlarmUI SummaSumtoChartAlarmUI VrdeValuetoChartAlarmUI>Vrde att anvnda i jmfrelse.Value to use in comparison.toChartAlarmUIVilken jmfrelse att gra med resultatet frn ovannmda operation.?What comparison to do with the result from the above operation.toChartAlarmUINVad som skall gras nr alarmet gr av.#What to do when alarm is triggered.toChartAlarmUIpEtt definierat alarm vrde har detekterats: %1 Vid: %2/A defined alert value was detected: %1 At: %2toChartHandler ALARM:ALARM:toChartHandler AlarmAlarmstoChartHandlerPermanent PersistenttoChartHandlerTOra alarm: TOra alert:toChartHandlerTillfllig TemporarytoChartHandler$&Diagram Hanterare&Chart ManagertoChartManager&Uppdatera&RefreshtoChartManager AlarmAlarmstoChartManagerStapeldiagramBarcharttoChartManager AvbrytCanceltoChartManager"Diagram Hanterare Chart ManagertoChartManagerDiagramformat Chart formattoChartManagerAnslutning ConnectiontoChartManagerIDIDtoChartManagerVFrsta vrdet startade inte med " i CSV fil-Initial value didn't start with " in CSV filetoChartManagerLinjediagram LinecharttoChartManager:Saknar avslutande " i CSV filMissing closing " in CSV filetoChartManager$ppna sprningsfilOpen tracker filetoChartManagerUppdatera lista Refresh listtoChartManagerDVlj format p diagrammet att visa%Select format of the chart to displaytoChartManager(Diagraminstllningar Setup charttoChartManager TitelTitletoChartManagerSprningTrackingtoChartManagerDiagramCharts toChartSetupPermanent Persistent toChartSetupTillfllig Temporary toChartSetup&Lgg till&AddtoChartSetupUI&Ok&OktoChartSetupUI AlarmAlarmstoChartSetupUILetaBrowsetoChartSetupUI AvbrytCanceltoChartSetupUI(DiagraminstllningarChart manager setuptoChartSetupUISpara till filEnable trackingtoChartSetupUIFilnamnFilenametoChartSetupUI ndraModifytoChartSetupUIPermanent PersistenttoChartSetupUIpKom ihg att spara detta diagram till fil efter omstart.?Remember to track this chart to this file always when starting.toChartSetupUI RaderaRemovetoChartSetupUI,Spara diagram till filTrack chart to filetoChartSetupUI"Diagram Hanterare Chart Manager toChartTool(Diagram Hanterare...Chart Manager... toChartToolB(Kommersiell licens %1 anvndare)(Commercial license %1 users)toCheckLicenseB(Kommersiell licens en anvndare)(Commercial license one user)toCheckLicense4(Kommersiell plats licens)(Commerical site license)toCheckLicenseb(Personlig licens, ej fr kommersiell anvndande)*(Personal license, not for commerical use)toCheckLicense&Vlkommen till TOraWelcome to TOratoCheckLicenseVlkommen till TOra (Oregistrerad version, ej fr kommsiellt bruk)>Welcome to TOra (Unregistered version, not for commercial use)toCheckLicensejAlla verktygsfnster mste ha autodelete flaggan satt1All tool widgets need to have autodelete flag set toConnection AvbrytCancel toConnection@Inte klar med att objektcachningNot done caching objects toConnectionvInte klar med att cacha objekt, kan inte radera olst cache4Not done caching objects, can not clear unread cache toConnectionF%2 har inte tillgng till objekt %1Object %1 not available for %2 toConnection2Vntar p objekt cachningWaiting for object cache toConnectionVntar p att objekt cachet skall bli klart. Avbryt denna dialogruta kommer troligtvis lmna ngon lista med databasobjekt tom.zWaiting for object caching to be completed. Canceling this dialog will probably leave some list of database objects empty. toConnectionDFrskte hmta oknt databastyp %1"Tried to fetch unknown provider %1toConnectionProvider$&Nuvarande Session&Current Session toCurrent&Uppdatera&Refresh toCurrent"Nuvarande SessionCurrent Session toCurrent Vidare Grantable toCurrent ObjektObject toCurrentParametrar Parameters toCurrentRttighet Privilege toCurrentRttigheter Privileges toCurrent&ResursbegrnsningarResource Limits toCurrentRollRole toCurrentStatestik Statistics toCurrent SystemSystem toCurrentTypType toCurrentUppdateraUpdate toCurrentVersionVersion toCurrent(Nuvarande AnvndningCurrent UtilizationtoCurrent:ResourceLimit$Initial AllokeringInitial AllocationtoCurrent:ResourceLimit"Begrnsande Vrde Limit ValuetoCurrent:ResourceLimitMax AnvndningMax UtilizationtoCurrent:ResourceLimitResursnamn Resource NametoCurrent:ResourceLimitVersionVersiontoCurrent:VersiondKunde inte hitta verliggare verktyg. Internt fel.*Couldn't find parent tool. Internal error. toCurrentTool&Ok&OktoDatabaseSettingInte vettigt att ha max innehll mindre n initial hmtningsstorlek. ndrar storligt till strra.dDoesn't make sense to have max content less than initial fetch size. Will adjust value to be higher.toDatabaseSetting Felaktiga vrdenInvalid valuestoDatabaseSetting sekunder secondstoDatabaseSettingUI &Alla&AlltoDatabaseSettingUI:&Autocommit p alla ndringar&Autocommit changestoDatabaseSettingUI>&Initialt antal rader att hmta&Initial rows to fetch in querytoDatabaseSettingUI`Avbryt lnga frgor och kr om i egen anslutning:Abort long running queries and reexecute in own connectiontoDatabaseSettingUIDataformat DataformattoDatabaseSettingUIDecimalerDecimalstoDatabaseSettingUIStandardDefaulttoDatabaseSettingUI^Ls inte om data om parametrarna r exakt samma0Don't reread data if parameters are exactly sametoDatabaseSettingUIFasta decimaler Fixed decimaltoDatabaseSettingUIUpdatera inte resultat om det exekveras exakt lika dann tv gnger i rad.]If checked will not refresh a result if it is reexecuted exactly the same two times in a row.toDatabaseSettingUItIndikera tomma vrden som '' istllet fr NUll som {null}.6Indicate empty values as '' instead of NULL as {null}.toDatabaseSettingUI\Initialt antal som lses in i innehllseditorn Initially read in content editortoDatabaseSettingUIHll vid liv Keep alivetoDatabaseSettingUILt bakgrundsfrgor som normalt kr p huvudanslutningen kra i en separat anslutning.`Let the background queries normally running on the main connection run in a separate connection.toDatabaseSettingUISe till att anslutningar hlls vid liv genom att periodiskt (Var 5 minut) snda en frga p alla inaktiva anslutningar.iMake sure connections are kept alive by periodically (5 minutes) sending a query on all idle connections.toDatabaseSettingUI,Maximal &kolumnstorlekMaximum size &displaytoDatabaseSettingUIDFlytta till egen anslutening efterMove to own connection aftertoDatabaseSettingUILs aldrig om cache (Kommer lmna delar av applikationen icke fungerande)GNever read object cache (Will leave parts of application nonfunctianal)toDatabaseSettingUIZLs aldrig cache om det inte r obligatoriskt'Never read object cache until mandatorytoDatabaseSettingUINummerformat Number formattoDatabaseSettingUINAntal decimaler fr fast decimalformat.,Number of decimals for fixed decimal format.toDatabaseSettingUIAntal rader att initialt frga efter vid inlsning i innehllseditorn, anvnd obegrnsat fr lngsamma anslutningar._Number of rows to initially start reading in content editor, use unlimited on slow connections.toDatabaseSettingUI$FrgeinstllningarQuery settingstoDatabaseSettingUILLs objekt cache direkt vid anslutningRead object cache on connecttoDatabaseSettingUIStarta om frgor som tar mer n 30 sekunder i sin egen databasanslutning fr att frhindra att blockera annan databasaccess.nReexecute a query taking more than 30 seconds in its own connection to prevent blocking other database access.toDatabaseSettingUItKr blockerande databasfrgor exklusivt p huvudanslutning6Run UI blocking queries exclusively in main connectiontoDatabaseSettingUIVetenskaplig ScientifictoDatabaseSettingUIAnger att alla databasndringar automatiskt skall sparas i databasen direkt.5Specify if changes should be automatically committed.toDatabaseSettingUILBrja lsa objekt cache nr det behvs#Start read object cache when neededtoDatabaseSettingUIDen strsta storleken en kolumn fr vxa till automatiskt i ett resultat frn en frga.6The largest default size of a column in query results.toDatabaseSettingUI~Antalet rader som alltid skall hmtas frn en frga om mjligt.:The number of rows to always fetch when executing a query.toDatabaseSettingUI4Sttet sifror skall visas.$The way numbers should be presented.toDatabaseSettingUILAnvndarinterface responsinstllningarUI feedback settingstoDatabaseSettingUItoDatabaseSettingUItoDatabaseSettingUI,Lgg Till V&ariabel... &Add Watch...toDebug&Breakpoint &BreakpointstoDebug&Kompilera&CompiletoDebug &Debug&DebugtoDebug&Debug Panel &Debug PanetoDebug Sl&ng ndringar&Discard changestoDebug&Rensa Editor &New SheettoDebug&Nsta rad &Next LinetoDebug&Ok&OktoDebug&Parametrar &ParameterstoDebug&Returnera Frn &Return FromtoDebug&Log &Runtime LogtoDebug &Stack &Stack TracetoDebugAv&sluta&StoptoDebug8&Lgg till/radera Breakpoint&Toggle BreakpointtoDebugBLgg till en ny variabel att visaAdd new variable watchtoDebugFTilldelning gick fel (Anledning %1)Assignment failed (Reason %1)toDebugKan inte sl p breakpoint, rad ej godknd. Du mste kanske kompilera om.HCan not enable breakpoint, not a valid line. Perhaps needs to recompile.toDebugKan inte aktivera breakpoint, inte ett gilltigt objekt. Mste kanske kompilera om.HCan not enable breakpoint, not a valid object. Perhaps needs to compile.toDebug AvbrytCanceltoDebug$&ndra Variabel...Chan&ge Watch...toDebugBndra vrde av betraktad variable Change value of watched variabletoDebugRensa editor Clean sheettoDebug StngClosetoDebugKompileraCompiletoDebugInnehllContenttoDebugInnehllContentstoDebugLKunde inte ansluta till mlsessionen: $Couldn't connect to target session: toDebugpKunde inte hitta funktion eller procedur under markren.5Couldn't find any function or procedure under cursor.toDebug2Kunde inte starta debuggaCouldn't start debuggingtoDebug,Avakt&ivera BreakpointD&isable BreakpointtoDebug SENAREDEFEREDtoDebugEJ AKTIVERADDISABLEDtoDebugDataDatatoDebugDebug &Utdata Debug &OutputtoDebugDebuggerDebuggertoDebug"Ta Bort &Variabel Delete &WatchtoDebug2Ta bort variable att visaDelete variable watchtoDebugPVill du avsluta den nuvarande krningen?+Do you want to abort the current execution?toDebugAKTIVERADENABLEDtoDebugVSl av eller p breakpoint p nuvarande rad)Enable/disable breakpoint on current linetoDebug AktivEnabledtoDebug@Ange nytt vrde fr variabeln %1Enter new value to the watch %1toDebugRadera kr&logErase Runtime &LogtoDebug^Frvntade funktion eller procedur, internt fel.Expected function or procedure, internal errortoDebug&Failed to get runtime info (Reason %1)toDebugXKunde inte ta bort breakpoint (Anledning %1)'Failed to remove breakpoint (Reason %1)toDebug|Kunde inte starta mltrd, stng andra verktyg och frsk igenHFailed to start target task thread, close some other tools and try againtoDebugNsta felGo to next errortoDebugFregende felGo to previous errortoDebugInparametrarInputtoDebugRadLinetoDebugEJ SATTNOT SETtoDebugNamnNametoDebugNsta f&el Next &ErrortoDebug*Ingen krande mltrdNo running targettoDebug ObjektObjecttoDebugObjekttyp Object TypetoDebug ObjektObjectstoDebugUtparametrarOutputtoDebugF&regende FelPre&vious ErrortoDebug*Uppdatera ObjektlistaRefresh Object ListtoDebug Tolka om kllkod Rescan sourcetoDebugLReturnera frn procedur eller funktion!Return from procedure or functiontoDebugReturnerade ReturningtoDebug"&Tolka om kllkod S&can SourcetoDebug SchemaSchematoDebugndra Schema Select SchematoDebugDVisa/dlj debug informationspanel.Show/hide debug info pane.toDebugG in &i Step &IntotoDebug>G in i procedur eller funktionStep into procedure or functiontoDebug>G ver procedur eller funktionStep over procedure or functiontoDebug Avsluta krning?Stop execution?toDebugStanna krning Stop runningtoDebugZLgg till ta bort breakpoint p nuvarande rad!Toggle breakpoint on current linetoDebugTypTypetoDebug8Ovntat slut p deklaration.Unexpected end of declaration.toDebugREj implementera i PL/SQL debug grnssnitt'Unimplemented in PL/SQL debug interfacetoDebug OkndUnknowntoDebug(Updatera objektlistaUpdate object listtoDebugVariabelVariabletoDebugV&ariablerW&atchtoDebug[Antal %1] [Count %1]toDebug"{Ej tillgngligt} {Unavailable}toDebug &Index&IndextoDebugChangeUI&Ok&OktoDebugChangeUI AvbrytCanceltoDebugChangeUI.ndra vrde p variabelChange value of watchtoDebugChangeUINULLNULLtoDebugChangeUIfKunde inte aktivera/avaktivera utdata fr sessionen*Couldn't enable/disable output for session toDebugOutput0Ej gilltig brjan av kodInvalid start of code toDebugText2Kan inte f fram positionCan't parse location toDebugWatch&Global&GlobaltoDebugWatchUI &Lokal&LocaltoDebugWatchUI&Ok&OktoDebugWatchUI &Scope&ScopetoDebugWatchUI&Variabel namn&Variable nametoDebugWatchUI$Lgg till variabelAdd variable watchtoDebugWatchUI AvbrytCanceltoDebugWatchUI Nuvarande scope.Currently running scope.toDebugWatchUI8Globalt scope fr variabler.Global scope of variable.toDebugWatchUI`Samma scope som filen in implementationseditorn.)The scope of the file in the body editor.toDebugWatchUIVariabel namn.Variable name to watch.toDebugWatchUI&Ok&OktoEditExtensionGotoUIb&Expandera mellanslag till tabbar vid indentering%&Expand spaces to tabs when indentingtoEditExtensionSetupUI$&Indenterings niv&Indentation leveltoEditExtensionSetupUI`Juste&ra nyckelord till hger i varje statement.(&Right align keywords in each statement.toEditExtensionSetupUIHKolumn fr kommentarer p &samma rad&Same line comment columntoEditExtensionSetupUIBAuto indenterad ej redigerbar SQL&Auto indent read only SQL text editorstoEditExtensionSetupUIExpempelExampletoEditExtensionSetupUIForm1toEditExtensionSetupUIDLgg till &nyrad efter varje block"Insert a &newline after each blocktoEditExtensionSetupUIZLgg till extra mellanslag mellan operatorer.&Insert extra spaces between operators.toEditExtensionSetupUIPla&cera komma p ny rad fre nsta del i stllet fr efter p samma rad som fregendeBPlace &comma on new line before item instead of after on same linetoEditExtensionSetupUIPlac&era THEN, LOOP, AS och IS p ny rad vid brjan av nya blockBPlace THEN, LOOP, AS and IS on new line at b&eginning of new blocktoEditExtensionSetupUIHLgg till mellanslag runt operatorerPut spaces around operatorstoEditExtensionSetupUIJTransformera nyc&kelord till versaler Transform keywords to &uppercasetoEditExtensionSetupUI~Transformera mellanslag till tabbar om mjligt vid indentering.9Transform spaces to tabs whenever posible when indenting.toEditExtensionSetupUI Auto Indentering Auto IndenttoEditExtensionTool BaktBackwardtoEditExtensionTool"Avindentera BlockDe-indent BlocktoEditExtensionTool4Avindentera block i editorDe-indent block in editortoEditExtensionTool EditorEditortoEditExtensionTool FramtForwardtoEditExtensionTool&Inkrementel SkningIncremental SearchtoEditExtensionToolIndentera Block Indent BlocktoEditExtensionTool0Indentera block i editorIndent block in editortoEditExtensionToolGemenerLowertoEditExtensionToolndra versaler Modify CasetoEditExtensionTool Obfuscera EditorObfuscate EditortoEditExtensionToolObfuscera UrvalObfuscate SelectiontoEditExtensionTool Urval SelectiontoEditExtensionToolVersalerUppertoEditExtensionToolTERSKAPACREATE toExtract AvbrytCancel toExtractterskapaCreate toExtract<Genererar terskapnings skriptCreating create script toExtract*Genererar beskrivningCreating description toExtract4Genererar raderings skriptCreating drop script toExtractNGenerering av raderings skript avbruten"Creating drop script was cancelled toExtract,Skapa migreringsskriptCreating migration script toExtract Genererar scriptCreating script toExtract2Skriptgenerering avbrutenCreating script was cancelled toExtract RADERADROP toExtractBeskrivDescribe toExtract(Beskrivning avbrutenDescribe was cancelled toExtractRaderingsskript Drop script toExtractFel i toExtract: Operation: %1 Objekt: %2 Fel: %3KError in toExtract Operation: %1 Object: %2 Error: %3 toExtractvKunde inte f fram gare och namn frn (%1), internt fel %2=Failed to extract owner and name from (%1), internal error %2 toExtractRInternt fel, saknar : i objektbeskrivning/Internal error, missing : in object description toExtract>Felaktig kontext (<3 delar "%1))Invalid describe context (<3 parts) "%1") toExtract@Felaktig typ %1 fr terskapningInvalid type %1 to create toExtract8Felaktig typ %1 att beskrivaInvalid type %1 to describe toExtract4Felaktig typ %1 att raderaInvalid type %1 to drop toExtract:Felaktig typ %1 fr migreringInvalid type %1 to migrate toExtractMIGRERINGMIGRATE toExtractDMalformed resize string (Should contain multiple of 3 number of ':') toExtract MigrationsskriptMigration script toExtractPObjektlista ej tillgnglig fr migrering&Object list not available in migration toExtract>REM Genererar %1 statement fr:!REM Generating %1 statement for:  toExtractXREM Genererar rapport ver fritt utrymme REM)REM Generating free space report for: REM toExtractREM Denna DDL var terskapad av REM TOra, Version %1 REM REM tid: %2 REM frn: %3, en %4 %5 databas REM REM p: %6 REM REM This DDL was reverse engineered by REM TOra, Version %1 REM REM at: %2 REM from: %3, an %4 %5 database REM REM on: %6 REM  toExtract*Kunde inte hitta stilFailed to find style matchtoGetSessionType sekunder secondstoGlobalSettingUI"&Avrunda typsnitt&Antialiase fontstoGlobalSettingUI &Cache bibliotek&Cache directorytoGlobalSettingUIEgen S&QL &Custom SQLtoGlobalSettingUI&&Skrivbordsmedveten&Desktop awaretoGlobalSettingUI &Hjlp bibliotek&Help directorytoGlobalSettingUI"&Plugin bibliotek&Plugin directorytoGlobalSettingUI&Uppdatera&RefreshtoGlobalSettingUI&Spara lsenord&Save passwordstoGlobalSettingUI &Stil&StyletoGlobalSettingUIAllaAlltoGlobalSettingUILetaBrowsetoGlobalSettingUI BytesBytestoGlobalSettingUICSVCSVtoGlobalSettingUIZndra nuvarande anslutning med aktivt fnster,Change current connection with active windowtoGlobalSettingUIndra nuvarande vald anslutning till den anslutning som r det aktiva fnstret harMChange currently select connection to the connection of the new active windowtoGlobalSettingUI$Diagram mtpunkter Chart samplestoGlobalSettingUINTitta efter uppgraderingar vid uppstartCheck for upgrades on startuptoGlobalSettingUIKontakta TOra hemsida om uppgraderingar kommit till programmet. Snder ingen information angende anvndarens dator eller TOra installationen.Check the TOra webpage for upgrades to the program. Does not send any information about the users computer or TOra installation.toGlobalSettingUIVlj denna om dockade fnster skall anvnda verkygsrader i stllet fr vanliga fnster.ACheck this if docks are to use toolbars instead of normal frames.toGlobalSettingUIhFrger kan bli riktigt fel i KDE om du vljer detta.2Colors get really weird in KDE if you select this.toGlobalSettingUI&AnslutningshistorikConnect historytoGlobalSettingUI&Standard listformatDefault list formattoGlobalSettingUIFStandard uppdateringstid i verktyg.Default refreshtime in tools.toGlobalSettingUIStandardsessionDefault sessiontoGlobalSettingUIFStandard filnamn att spara session.-Default session to use when saving a session.toGlobalSettingUI`Definiera enheted som storlekar skall visas med.*Define the unit sizes should be displayed.toGlobalSettingUI>Bibliotek dr hjlpfiler finns.#Directory where to find help files.toGlobalSettingUIVBibliotek som plugins finns nr du startar..Directory where to find plugins when starting.toGlobalSettingUIDBibliotek att spara databas cache.3Directory where to place cached dataaseinformation.toGlobalSettingUIVisa meddelanden enbart i statusraden i stllet fr att poppa upp en dialogruta fr att visa den.JDisplay alerts in messagebar instead of poping up a dialog with a warning.toGlobalSettingUIDVisa meddelande enbart i statusrad Display alerts in statusbar onlytoGlobalSettingUIBVisa alla tillgngliga mtpunkterDisplay all available samplestoGlobalSettingUIVisa mtpunkterDisplay samplestoGlobalSettingUI4Docks anvnder verktygsradDocks use toolbarstoGlobalSettingUIHTMLHTMLtoGlobalSettingUI2Inkludera databas i titelInclude DB in captiontoGlobalSettingUI^Inkludera databas anslutnigen i fnstrets titel.Include database connection in window captionstoGlobalSettingUIKBKBtoGlobalSettingUIMBMBtoGlobalSettingUI<Maximera fnstret vid uppstartMaximize window on starttoGlobalSettingUI$MeddelandehistorikMessage historytoGlobalSettingUIjAntal olika anslutningar som skall sparas historiskt.)Number of connections to save in history.toGlobalSettingUIAntal mtpunkter som skall visas i linje och stapeldiagram som standard.>Number of samples to display in line and barcharts by default.toGlobalSettingUIrAntal mtpunkter som skall sparas i diagram som standard.;Number of samples to keep in line and barcharts by default.toGlobalSettingUIAntal statusmeddelanden som skall sparas i meddelandehistoriken.9Number of status messages to save in the message history.toGlobalSettingUIValOptionstoGlobalSettingUIBibliotekPathstoGlobalSettingUIKom ihg lsenorden du anvnder nr du ansluter. Kommer lmna lsenorden okrypterade i programmets konfigurationsfil.gRemember the last password you used to connect. Will leave the password unencryptet in the config file.toGlobalSettingUI6terstll session vid startRestore session on startuptoGlobalSettingUISpara obegrnsat antal mtpunkter. Kan ta upp stora mngder interminne.FSave unlimited number of samples. Can large amounts of consume memory.toGlobalSettingUIStorleksenhet Size UnittoGlobalSettingUIPlacera verktygsraden tll vnster av fnstret istllet fr verst.SStart using the tools toolbar on the left of the main window instead of at the top.toGlobalSettingUI"Status&meddelandeStatus &messagetoGlobalSettingUI Tabbar Tab delimitedtoGlobalSettingUITextTexttoGlobalSettingUIjVilken stil som skall anvndas p anvndarinterfacet.(The style to use for the user interface.toGlobalSettingUIHur lnge tillflliga meddelanden visas i statusraden. Om du vljer 0 betyder det att de skall behllas tills nsta.YThe time in seconds temporary messages will be displayed in the status bar. 0 menas keep.toGlobalSettingUI0Verktygsrad till vnsterTools toolbar on lefttoGlobalSettingUIversttning TranslationtoGlobalSettingUIObegrnsat UnlimitedtoGlobalSettingUI"Anvnd disk cacheUse Disk CachingtoGlobalSettingUIbAnvnd disk cachning av objektlista och synonymer,Use Disk Caching of ObjectLists and SynonymstoGlobalSettingUIAnvnd antialias typsnitt om Qt stder det. Du mste starta om fr att ndringar skall f effekt.VUse antialiase fonts if Qt supports this. You need to restart for this to take affect.toGlobalSettingUIVilken versttnings locale som skall anvndas fr programmet. Mste starta om fr innan det fr effekt.NWhich translation locale to use for this program. Must restart to have effect.toGlobalSettingUItoGlobalSettingUItoGlobalSettingUIAlla manualer All manualstoHelp Tillbaka en sidaBackward one help pagetoHelpInnehllContentstoHelpFramt en sidaForward one help pagetoHelpHjlpnavigerare Help BrowsertoHelp Hjlp NavigeringHelp NavigationtoHelpHjlpfnster Help windowtoHelp ManualManualtoHelpnSaknar parent, obalanserade <dl> i hjlpfilens innehll2Missing parent, unbalanced dl in help file contenttoHelpResultatResulttoHelpSkSearchtoHelpTOra manual TOra manualtoHelp &Leta&BrowsetoHelpAddFileUI&Ok&OktoHelpAddFileUI&Innehllsfil&Table of contents filetoHelpAddFileUI &Titel&TitletoHelpAddFileUI&Lgg till bibliotekAdd help directorytoHelpAddFileUI AvbrytCaneltoHelpAddFileUI Filfel File error toHelpPrefs"&Lgg Till Manual &Add Manual toHelpSetupUI &Oracle Manualer&Oracle Manuals toHelpSetupUI&Ta Bort Manual&Remove Manual toHelpSetupUIRLgg till manualer frn Oracle indexsida.&Add manuals from an Oracle index page. toHelpSetupUITLgg till manualer frn Oracle index sida. Detta r den sidan som har lnkarna till sjlva manualerna. Inte frstasidan som lnkar till de olika kategorierna av manualer.Add manuals from an Oracle index page. This is the index page that links to the actual manuals. Not the master index page that links to different categories of manuals. toHelpSetupUIFilnamnFilename toHelpSetupUIForm1 toHelpSetupUI TitelTitle toHelpSetupUI>Attribut verskred max i toHtml Exceeded qualifier max in toHtmltoHtmlLFortsatte felaktigt bortom slut p fil!Invalidly went beyond end of filetoHtml$Ensamt < p slutet Lone < at endtoHtmlDLser HTML fil efter slut p filenReading HTML after eoftoHtmltFrskte komma t strng utanfr dess grnser (storlek=%1)5Tried to access string out of bounds in mid (size=%1)toHtml|Frskte komma t strng utanfr dess grnser i mid (start=%1)6Tried to access string out of bounds in mid (start=%1)toHtml|Frskte komma t strng utanfr dess grnser (total=%1+%2>%3)%3)toHtml8Oavslutat attribut p slutetUnended qualifier data at endtoHtml4Oavslutat strng p slutetUnended quoted string at endtoHtml.Oavslutad tag p slutetUnended tag at endtoHtml@Oavslutat tag attribut p slutetUnended tag qualifier at endtoHtmlHOavslutat tag attributdata p slutet!Unended tag qualifier data at endtoHtml(Kunde inte ppna filCouldn't open filetoImportExekveraExecutetoImport &Leta&Browse toImportUICommit avstndCommit distance toImportUIDatabasDatabase toImportUIAvskiljare Delimiter toImportUIOperation Operation toImportUI$FrhandsgranskningPreview toImportUI SchemaSchema toImportUISeparator Separator toImportUI TabelTable toImportUI&Ogiltig&Invalid toInvalid&Uppdatera&Refresh toInvalid AvbrytCancel toInvalidOgiltiga ObjektInvalid Objects toInvalid$Kompilera om urvalRecompile selected toInvalidBKompilera om alla felaktiga paketRecompiling all invalid toInvalidUppdatera lista Refresh list toInvalid ObjektObjecttoInvalid:ListInvalid gareOwnertoInvalid:ListInvalidTypTypetoInvalid:ListInvalid6Kunde inte hitta \ i skvgCouldn't find \ in path toKeyPath6Kunde inte hitta \ i skvgCouldn't find \ in path toKeyValueZr du sker p att du verkligen vill avsluta?Are you sure you want to quit? toLicenseFortsttContinue toLicenseNejNo toLicense2Ingen giltig licensnyckelNot a valid license key toLicenseOkOk toLicensedKontrollera ditt namn och din registreringsnyckel?,Please check your name and registration key? toLicenseAvslutaQuit toLicense4Vill du verkligen avsluta? Really quit? toLicenseRegistreraRegister toLicenseJaYes toLicense &Namn&Name toLicenseUI$&Registrera nyckel&Registration key toLicenseUI11 toLicenseUI22 toLicenseUI33 toLicenseUIPDenna version av TOra r ej registrerad.%This version of TOra is unregistered. toLicenseUI(&Diagramhanterare...&Chart Manager... toLineChart*&ppna i nytt fnster&Open in new window toLineChart&Skriv ut... &Print... toLineChart&Egenskaper...&Properties... toLineChartRensa diagram Clear Chart toLineChartSl p diagramEnabled charts toLineChartZoomZoom toLineChart&Ok&OktoLineChartSetupUIUppdateraAlltoLineChartSetupUIAutodetektera Auto detecttoLineChartSetupUI AvbrytCanceltoLineChartSetupUI*Diagram instllningar Chart setuptoLineChartSetupUI2Dela in diagram i rutnt?Divide chart in grids?toLineChartSetupUIMaxvrde Max valuetoLineChartSetupUIDMaximalt antal mtvrden som visas$Maximum number of samples to displaytoLineChartSetupUIMinvrde Min valuetoLineChartSetupUIDAntal mtvrden som skall behllasNumber of samples to keeptoLineChartSetupUI$Visa axlars titlarShow axis legendtoLineChartSetupUI(Visa mtvrdestitlarShow chart legendtoLineChartSetupUI Visa sista vrdeShow last valuetoLineChartSetupUIObegrnsat UnlimitedtoLineChartSetupUI Y-axelY-axistoLineChartSetupUI&Koperira flt &Copy field toListViewJustering Alignment toListView MittenCenter toListViewKopier urvalCopy selection toListView.Kopiera urval med huvudCopy selection with header toListView&Copier transposeradCopy transposed toListView Visa i editor...Display in editor... toListViewUtskrift klar Done printing toListViewEditera SQL... Edit SQL... toListView*Exportera till fil...Export to file... toListViewVnsterLeft toListViewSida: %1Page: %1 toListView$Skriver ut sida %1Printing page %1 toListView HgerRight toListViewVlj alla Select all toListViewThe mutex function "%1" failedtoLockLog4PL/SQL Log4PL/SQL toLogOutputSQL Utdata SQL Output toLogOutput&Kaskad&CascadetoMain"St&ng Anslutning&Close ConnectiontoMain$Anslutning &Commit&Commit ConnectiontoMain&Innehll... &Contents...toMain&Kopiera&CopytoMain&Redigera&EdittoMain&Fil&FiletoMain &Hjlp&HelptoMain&Licens... &License...toMain"&Ny anslutning...&New Connection...toMain&Nej&NotoMain&ppna Fil... &Open File...toMain"&Instllningar... &Options...toMainK&listra In&PastetoMainSkriv &Ut... &Print...toMain&Avsluta&QuittoMain&Citat... &Quotes...toMainG&r Om&RedotoMain&Registrera... &Register...toMain(Anslutning &Rollback&Rollback ConnectiontoMain &Spara&SavetoMain"&Sk && Erstt...&Search && Replace...toMainS&tapla&TiletoMain&Verktyg&ToolstoMain &ngra&UndotoMainF&nster&WindowtoMain&Ja&YestoMainA ny version av TOra (%1) finns att hmta frn http://tora.sourceforge.netIA new version of TOra (%1) is available from http://tora.sourceforge.nettoMainApplikation ApplicationtoMain St&ngC&losetoMain*N&uvarande AnslutningC&urrent ConnectiontoMain*N&uvarande Kontext...C&urrent Context...toMain>Kan inte hitta aktiv anslutningCan't find active connectiontoMain AvbrytCanceltoMain4Titta efter uppdateringar?Check for upgrades?toMainStng &Alla Close &AlltoMainStng Session Close SessiontoMainKolumn:Col:toMain"Anslutning CommitCommit connectiontoMain^Spara ndringar p session %1 innan den stngs?0Commit work in session to %1 before closing it?toMainSpara arbete? Commit work?toMain&Anslut Till DatabasConnect to databasetoMainAnslutningar ConnectionstoMainKopieraCopy to clipboardtoMainPKunde inte hitta angiven anslutning (%1))Couldn't find specified connectionts (%1)toMainKlipp U&tCu&ttoMainKlipp UtCut to clipboardtoMain4Stng Nuvarande AnslutningDisconnect current connectiontoMainVill du att TOra automatiskt skall kontrollera http://tora.sourceforge.net fr uppdateringar vid start av programmet. Under denna kontroll skickas ingen information om din dator inklusive version eller platform av TOra till Quest Software, IncDo you want TOra to automatically check http://tora.sourceforge.net for updates on startup? During this check no information about your computer including TOra version is transmitted to the sitetoMain(Ange lsenord fr %1Enter password for %1toMain"Frsta anslutningFirst connectiontoMainInformation InformationtoMainAnge lsenordInput passwordtoMain(Felaktig sessionsfilInvalid session filetoMain&Ls in fil i editorLoad file into editortoMainvMeddelande verbelastning, temporrt stngt av meddelandebox felrapportering frn och med nu. Starta om fr att sl p igen. Du har troligtvis fr hg updateringsfrekvens i ngot verktyg.Message flood, temporary disabling of message box error reporting from now on. Restart to reenable. You probably have a too high refreshrate in some tool.toMain ppna Session...Open Session...toMainKlistra InPaste from clipboardtoMainSkrit utPrinttoMain L&s Alla PosterRead All &ItemstoMain Gr OmRedotoMain&Ls Om Objekt CacheReread Object CachetoMain2terstll Senaste SessionRestore Last SessiontoMain&Anslutning RollbackRollback connectiontoMainRad:Row:toMainSpara &Som... Save A&s...toMain Spara Session...Save Session...toMain*Spara fil till editorSave file from editortoMainSk & ErsttSearch & replacetoMainSk &Nsta Search &NexttoMainMarkera &Allt Select &AlltoMain$Stanna Alla FrgorStop All QueriestoMainNStanna alla aktiva frgor p anslutning&Stop all running queries on connectiontoMain`Sessionsfilen r inte giltig. Kan inte lsa den.-The session file is not valid, can't read it.toMainVerktygToolstoMain ngraUndotoMainDu kan stta p detta genom Globala Instllningar i Instllningar (Redigeringsmenyn)JYou can enable this through the Global Settings in the Options (Edit menu)toMain&Nej&No toMarkedText&Ja&Yes toMarkedText AvbrytCancel toMarkedTextUtskrift klar Done printing toMarkedTextFilen ppnadFile opened successfully toMarkedText(Inkrementell skningIncremental search toMarkedTextSida: %1Page: %1 toMarkedText$Skriver ut sida %1Printing page %1 toMarkedText Spara ndringar? Save changes? toMarkedTextEditorn har ndrats, vill du spara dem innan du ppnar en ny fil?PThe editor has been changed, do you want to save them before opening a new file? toMarkedTextKopieraCopy to clipboard toMemoEditorKlipp utCut to clipboard toMemoEditorFrsta kolumnen First column toMemoEditorSista kolumnen Last column toMemoEditorMemo Editor Memo Editor toMemoEditorNULLNULL toMemoEditorNsta kolumn Next column toMemoEditorppna fil Open file toMemoEditor SparaPaste from clipboard toMemoEditor"Fregende kolumnPrevious column toMemoEditorSpara ndringar Save changes toMemoEditorSpara fil Save file toMemoEditor&Ok&Ok toMessageUIVisa meddelanden endast i meddelanderaden i stllet fr att ppna en dialogruta med varningen.JDisplay alerts in messagebar instead of poping up a dialog with a warning. toMessageUILVisa meddelanden endast i statusraden.!Display alerts in statusbar only. toMessageUI$VarningsmeddelandeWarning message toMessageUI:Felaktig typ %1 fr migreringInvalid type %1 to migratetoMySQLExtractDatabasDatabasetoNewConnectionAnge lsenordEnter passwordtoNewConnection>Ange lsenord fr anslutningen.%Enter password to use for connection.toNewConnectionVrddatorHosttoNewConnectionlIngen tillgnglig databastyp, troligtvis saknas plugin:No available connection provider, plugins probably missingtoNewConnection Ingen databastypNo connection providertoNewConnectionTypProvidertoNewConnection>Kan inte ansluta till databasen!Unable to connect to the databasetoNewConnection>Kan inte ansluta till databas. #Unable to connect to the database. toNewConnectionAnvndarnamnUsernametoNewConnection&Anslutningsmod&Connection ModetoNewConnectionUI&Databas &DatabasetoNewConnectionUI&Vrddator&HosttoNewConnectionUI&Ok&OktoNewConnectionUIL&senord &PasswordtoNewConnectionUI0F&regende anslutningar&Previous connectionstoNewConnectionUI&Anvndarnamn &UsernametoNewConnectionUIEn lista ver fregende anslutningar. Vlj en post fr ver information till hger.BA list of previous connections. Select to bring over to the right.toNewConnectionUI AvbrytCanceltoNewConnectionUIDatabastypConnection providertoNewConnectionUIhAnslutningsmod. Om du inte frstr det, vlj normal.>Mode of the connection. If you don't understand select normal.toNewConnectionUINy anslutningNew connectiontoNewConnectionUI2Lsenord att ansluta med.Password to connect with.toNewConnectionUIpVlj eller ange det databas ID som du vill ansluta till.%Select the database ID to connect to.toNewConnectionUIAnvnd &SQL*Net Use &SQL*NettoNewConnectionUI:Anvndar namn att ansluta medUsername to connect withtoNewConnectionUIOm man skall ansluta via lyssnaren eller direkt till en lokal databas.IWether or not connect using the listener or directly to a local database.toNewConnectionUI.Kunde inte ppna frganCouldn't open querytoNoBlockQueryNKunde inte start backgrundsfrgans trd'Failed to start background query threadtoNoBlockQuery8Lste efter slutet p frganReading past end of querytoNoBlockQueryFterstartar frga i egen anslutning"Restarting query in own connectiontoNoBlockQueryUnknown exceptiontoNoBlockQueryOvntat felUnexpected errortoNow$Ange nytt lsenordEnter new passwordtoOracleConnection.Ange nytt lsenord igen%Enter password again for confirmationtoOracleConnection"Lsenord utgngetPassword expiredtoOracleConnection<De tv lsenorden stmmer inteThe two passwords doesn't matchtoOracleConnection-- Kontext index kan vara ganska komplexa beroende p om de -- anvnda parametrarna. Fljande r ett frsk att terskapa detta -- kontext index. Men nogram kontroll r starkt rekommenderad. -- Context indexes can be quite complicated depending upon the -- used parameters. The following is an attempt to recreate this -- context index. But, a close scrutiny of the following code is -- strongly recommended. toOracleExtract2Constraint %1.%2 finns ejConstraint %1.%2 doesn't existtoOracleExtractLKunde inte hitta ngon COLUMN p index!Couldn't find any COLUMN on indextoOracleExtractBKunde inte hitta constraint %1.%2Couldn't find constraint %1.%2toOracleExtract8Kunde inte hitta index %1.%2Couldn't find index %1.%2toOracleExtractXKunde inte hitta index partitioner fr %1.%2(Couldn't find index partitions for %1.%2toOracleExtract6Kunde inte hitta logg %1.%2Couldn't find log %1.%2toOracleExtractXKunde inte hitta materialiserad tabell %1.%2&Couldn't find materialised table %1.%2toOracleExtractJKunde inte hitta partitions del %1.%2#Couldn't find partition range %1.%2toOracleExtractHKunde inte hitta primr nyckel %1.%2"Couldn't find primary key of %1.%2toOracleExtract4Kunde inte hitta profil %1Couldn't find profile %1toOracleExtract4Kunde inte hitta rollen %1Couldn't find role %1toOracleExtract:Kunde inte hitta sekvensen %1Couldn't find sequence %1toOracleExtract@Kunde inte hitta klla fr %1.%2!Couldn't find source for of %1.%2toOracleExtract@Kunde inte hitta synonymen %1.%2Couldn't find synonym %1.%2toOracleExtract>Kunde inte hitta tabellen %1.%2Couldn't find table %1.%2toOracleExtract0Kunde inte tablespace %1Couldn't find tablespace %1toOracleExtract<Kunde inte hitta trigger %1.%2Couldn't find trigger %1.%2toOracleExtract:Kunde inte hitta anvndare %1Couldn't find user %1toOracleExtract2Kunde inte hitta vy %1.%2Couldn't find view %1.%2toOracleExtract.DBLink %1.%2 finns inteDBLink %1.%2 doesn't existtoOracleExtractnVisar kllkod av fel typ fr %1. Fick %2, frvntade 0.:Displaying source of wrong type for %1. Got %2 expected 0.toOracleExtract6Utbytesindex %1.%2 finns ej"Exchange index %1.%2 doesn't existtoOracleExtract6Utbytesindex %1.%2 finns ej"Exchange table %1.%2 doesn't existtoOracleExtract9Internal error, result should be 18 in segment attributestoOracleExtractBInternal error, result should be 18 in segment attributes (Was %1)toOracleExtract@Felaktig typ %1 fr terskapandeInvalid type %1 to createtoOracleExtract>Felaktig typ %1 fr beskrivningInvalid type %1 to describetoOracleExtract>Felaktig typ %1 fr borttagningInvalid type %1 to droptoOracleExtractFSaknar ON beskrivnings post i index$Missing ON description item on indextoOracleExtract &Checkpoint namn&Checkpoint nametoOracleSettingUI,Standard &datum format&Default date formattoOracleSettingUI*F&rklara plan tabell&Explain plan tabletoOracleSettingUIS&para planer &Keep planstoOracleSettingUI<&Max long och LOB data storlek&Max long and LOB data lengthtoOracleSettingUISkapa Tabell Create TabletoOracleSettingUIForm1toOracleSettingUIPSpara frklarade planer i plan tabellen.9Keep records for the plan explanations in the plan table.toOracleSettingUIMax lngd som lses frn LOB eller LONG data flt. LONG kan inte anges som obegrnsad utan kommer bli 33000 om obegrnsad r vald.Max length to read from LOB or LONG data fields. LONG:s can not be specified unlimited but will be defaulted to 33000 if unlimited.toOracleSettingUI`Maximala andel ppna frgor som kan hllas ppnaMaximum cursors to keep opentoOracleSettingUIjNamn p tabellen som planfrklaringar skall lggas i.0Name of the table to put explain plan output in.toOracleSettingUIStandard format fr datom som anvnds nr data lses till eller frn databasen.9The default dateformat to use when querying the database.toOracleSettingUINamnet p en checkpoint som kan anvndas nr TOra behver gra rollback p ndringar.=The name of the checkpoint used when needed to rollback work.toOracleSettingUIObegrnsad UnlimitedtoOracleSettingUI$&ndra Uppdatering&Change RefreshtoOutput&Utdata&OutputtoOutput&Uppdatera&RefreshtoOutputRensa utdata Clear outputtoOutput^Kunde inte sl av eller p utdata fr sessionen*Couldn't enable/disable output for sessiontoOutputLSl av eller p SQL utdata kontroller.%Enable or disable getting SQL output.toOutputUtdata pslagenOutput enabledtoOutput>Kontrollera om ny data finns nuPoll for output nowtoOutputUppdateraRefreshtoOutputSQL Utdata SQL OutputtoOutput&Updatera&Polling timeout toOutputPrefs&Standard kllaDefault &source toOutputPrefs*Log4PL/SQL &AnvndareLog4PL/SQL &User toOutputPrefsSQL Utdata SQL Output toOutputPrefslTid mellan varje kontrol om ny data finns tillgnglig.'Time between trying to poll for output. toOutputPrefs&Ok&Ok toParamGet&Avbruten exekveringAborted execution toParamGet AvbrytCancel toParamGet4Definiera bundna variablerDefine binding variables toParamGetEditeraEdit toParamGetSaknar fltnamnMissing field name toParamGetNULLNULL toParamGet$Ange nytt lsenordEnter new passwordtoPasswordToolPAnge nytt lsenord igen fr konfirmation)Enter new password again for confirmationtoPasswordTool:Lsenord stmmer inte verensPasswords doesn't matchtoPasswordToolrDe tv angivna lsenorden stmmer ej verens, frsk igen8The two givens passwords doesn't match, please try againtoPasswordTool*&ppna i nytt fnster&Open in new window toPieChart&Skriv ut... &Print... toPieChart@Alla vrden r 0 i detta diagramAll values are 0 in this chart toPieChart*Databas InstllningarDatabase Settings toPreferences(Editor InstllningarEditor Settings toPreferences.Globala InstllningarnaGlobal Settings toPreferencesVerktygTools toPreferences &Hjlp&HelptoPreferencesUI&Ok&OktoPreferencesUI AvbrytCanceltoPreferencesUIInstlllningar PreferencestoPreferencesUI%1 krningar%1 runs toProfiler&Nej&No toProfiler&Ja&Yes toProfilerKommentarComment toProfiler.Kr nuvarande profilingExecute current profiling toProfilerPL/SQL ProfilerPL/SQL Profiler toProfiler*Profiltabeller saknasProfiler tables doesn't exist toProfilerProfiltabellerna finns inte. Skall TOra frska skapa om dem i nuvarande schema?TProfiler tables doesn't exist. Should TOra try to create them in the current schema? toProfilerUppdatera lista Refresh list toProfiler Kr om Repeat run toProfilerResultatResult toProfiler6Kr profiling i backgrundenRun profiling in background toProfiler SkriptScript toProfilerVlj krning Select run toProfilerRNgonting gick fel nr statestik hmtades*Something went wrong collecting statistics toProfiler OkndUnknown toProfiler, -- Start av fil %1  -- Start of file %1  toProject4 -- Start av projekt %1  -- Start of project %1  toProject4Lgg till fil till projektAdd file to project toProject6Lgg till nytt underprojektAdd new subproject toProjectFilFile toProject<Generera SQL fr detta projektGenerate SQL for this project toProject(Flytta ner i projektMove down in project toProject(Flytta upp i projektMove up in project toProject0Ta bort fil frn projektRemove file from project toProjectSQL Projekt SQL Project toProjectSQL projekt SQL project toProjectSpara projekt Save project toProjectStorlekSize toProjectoknd.tpr untitled.tpr toProject4Oknd typ av frgeresultatUnknown type of query valuetoQValueFrgan avbruten Query abortedtoQuery0Kunde inte ladda ner filCouldn't download file toReadFile0Kunde inte ppna fil %1.Couldn't open file %1. toReadFile\Uppstod problem med att lsa konfigurationsfil'Encountered problems read configuration toReadFile 1 min1 mintoRefreshCreate 10 min10 mintoRefreshCreate10 sekunder 10 secondstoRefreshCreate2 sekunder 2 secondstoRefreshCreate30 sekunder 30 secondstoRefreshCreate 5 min5 mintoRefreshCreate5 sekunder 5 secondstoRefreshCreate IngenNonetoRefreshCreate&Oknt tidtagarvrdeUnknown timer valuetoRefreshParse0<H1>Globala Objekt</H1> 

Global Objects

toReport <H1>Publika</H1>

Public

toReport&<H1>Schema %1</H1> 

Schema %1

toReport<H4>COLUMNER</H4> <TABLE WIDTH=100% BORDER=0><TR><TH ALIGN=left WIDTH=25%>Namn</TH>R

COLUMNS

toReport<HTML><HEAD><TITLE>Rapport p databas %7</TITLE></HEAD> <BODY><H1>Rapport p databas %8</H1> <TABLE BORDER=0> <TR><TD VALIGN=top>Genererad av:</TD><TD VALIGN=top>TOra, Version %1</TD></TR> <TR><TD VALIGN=top>Tid:</TD><TD VALIGN=top>%2</TD></TR> <TR><TD VALIGN=top>Frn:</TD><TD VALIGN=top>%3, en %4 %5 databas</TD></TR> <TR><TD VALIGN=top>P:</TD><TD VALIGN=top>%6</TD></TR> </TABLE>Report on database %7

Report on database %8

Name
Generated by:TOra, Version %1
At:%2
From:%3, an %4 %5 database
On:%6
toReportP<TH ALIGN=left WIDTH=25%>Definition</TH>(DefinitiontoReportR<TH ALIGN=left WIDTH=50%>Beskrivning</TH>)DescriptiontoReportEditera SQL... Edit SQL... toResultBar,(Objekt cache ej redo)(Object cache not ready) toResultCols(</B> synonym fr <B> synonym for  toResultCols.Medelkolumnstorlek: <B>Average column size:  toResultCols&Standard vrde: <B>Default value:  toResultColsTthet: <B> Density:  toResultCols*Distinkta vrden: <B>Distinct values:  toResultCols"Hgsta vrde: <B>High value:  toResultCols,Senast analyserad: <B>Last analyzed:  toResultCols"Lgsta vrde: <B>Low value:  toResultCols6Antal histogram hinkar: <B> Number of histogram buckets:  toResultCols*Antal nullvrden: <B>Number of nulls:  toResultCols$Urvalsstorlek: <B>Sample size:  toResultColsKolumnnamn Column NametoResultCols::resultColsKommentarCommentstoResultCols::resultColsDatatyp Data TypetoResultCols::resultCols"Beskrivning av %1Description of %1toResultCols::resultCols,Kunde inte beskriva %1Failed to describe %1toResultCols::resultCols Vilkor ConditiontoResultConstraintConstraint NamnConstraint NametoResultConstraint"Borttagningsregel Delete RuletoResultConstraintPslagetEnabledtoResultConstraintGenererad GeneratedtoResultConstraint &Alla&AlltoResultContent &Denna&ThistoResultContent"Lgg till ny postAdd a new recordtoResultContent AvbrytCanceltoResultContentInnehllseditorContent editortoResultContent6Definiera filter fr editorDefine filter for editortoResultContentHTa bort nuvarande post frn tabellen Delete current record from tabletoResultContent"Ta bort ndringarDiscard changestoResultContent(G till frsta radenGo to first rowtoResultContent"G till sista radGo to last rowtoResultContent"G till nsta radGo to next rowtoResultContent,G till fregende radGo to previous rowtoResultContent&Ta bort alla filterRemove any filtertoResultContentTa bort filter Remove filtertoResultContentvTa bort filter fr denna tabell enbart eller alla tabeller.8Remove the filter for this table only or for all tables.toResultContentSpara ndringar Save changestoResultContent\Vxla mellan tabell eller enkel post editering-Toggle between table or single record editingtoResultContent&Kopiera flt &Copy fieldtoResultContentEditor&Ta bort post&Delete recordtoResultContentEditor"&Visa i editor...&Display in editor...toResultContentEditor K&listra in flt &Paste fieldtoResultContentEditorRKan inte anvnda dessa p toResultContent"Can't use these on toResultContenttoResultContentEditor"Innehll av %1.%2Content of %1.%2toResultContentEditorKopiera urvalCopy selectiontoResultContentEditor.Kopiera urval med huvudCopy selection with headertoResultContentEditor(Kopiera transposeradCopy transposedtoResultContentEditor$Editering avbrutenEdit cancelledtoResultContentEditor*Exportera till fil...Export to file...toResultContentEditor*Inga ndringar gjordaNo changes madetoResultContentEditorLs allaRead alltoResultContentEditorLser alla vrden, flyttar markr till slutet nr inlsning r klar2Reading all values, moving cursor to end when donetoResultContentEditorSparade rad Saved rowtoResultContentEditorVlj alla Select alltoResultContentEditorDenna tabell innehller enbart LOG/LONG kolumner och kan inte bli editerad?This table contains only LOB/LONG columns and can not be editedtoResultContentEditordEj sparad data finns, vlj annan rad fr att spara3Unsaved data in contents, select other row to storetoResultContentEditorBTillgngliga kolumner i tabellen. Available column names in table.toResultContentFilterUI AvbrytCanceltoResultContentFilterUINFilterinstllningar fr innehllseditorContent editor filter settingstoResultContentFilterUIOkOktoResultContentFilterUI"Urvals &kriteriumSelection &criteriatoResultContentFilterUIVal av kriterium att anvnda fr att ange vilka poster som skall editeras. Samma format som efter "where" i en "select"-sats.XSelection criteria to use getting items to edit. Same as after where in a select clause.toResultContentFilterUIbSorterings &ordning. Separera kolumner med komma.)Sort &order. Separate columns with comma.toResultContentFilterUI Tabell &kolumnerTable &columnstoResultContentFilterUI|Sorteringsordning att anvnda nr poster lses frn databasen.=The sort order to use when retreiving data from the database.toResultContentFilterUI8Anvnd fr samtliga tabellerUse for all tablestoResultContentFilterUIEditeraEdittoResultContentSingleAInternal error, save different row than current in content editortoResultContentSingleBeroende DependencytoResultDependNamnNametoResultDepend gareOwnertoResultDependTypTypetoResultDepend"Objektet finns ejObject not foundtoResultExtractKolumnerColumnstoResultIndexesIndexnamn Index NametoResultIndexesTypTypetoResultIndexesUnikUniquetoResultIndexesEditera SQL... Edit SQL... toResultLineCSVCSVtoResultListFormatHTMLHTMLtoResultListFormatTabseparerad Tab delimitedtoResultListFormatTextTexttoResultListFormat@&Vlj format fr exporterad fil. &Choose format of exported file.toResultListFormatUI&Ok&OktoResultListFormatUI AvbrytCanceltoResultListFormatUIVlj format Choose formattoResultListFormatUIAvskiljare DelimitertoResultListFormatUISeparator SeparatortoResultListFormatUI TagenGrabbed toResultLockModMode toResultLock ObjektObject toResultLockOS anvndareOsuser toResultLockProgramProgram toResultLockFrfrganRequest toResultLockEfterfrgad Requested toResultLock SchemaSchema toResultLockSessionSession toResultLockTypType toResultLock&%1 rader bearbetade%1 rows processed toResultLongLKan bara gmma sista kolumnen i frgan"Can only hide last column in query toResultLongFrga exekveradQuery executed toResultLongSats exekveradStatement executed toResultLong.Kr inte om samma frgaWill not reexecute same query toResultLong8Internal error, toResult is not a descendant of toResulttoResultObject@# Genererad av TOra version %1  # Generated by TOra version %1  toResultParam@Spara ndringarna till sessionenApply changes to session toResultParam:Spara ndringar till systemetApply changes to system toResultParam ndradChanged toResultParamVisa gmda parametrar. Detta kommer endast fungera om du r inloggad som anvndaren sys.TDisplay hidden parameters. This will only word if you are logged in as the sys user. toResultParam4Radera nuvarande ndringarDrop current changes toResultParamGenerera pfilGenerate pfile toResultParam Parameter editorParameter editor toResultParam ndradChangedtoResultParam:ListParamBeskrivning DescriptiontoResultParam:ListParamParameter ParametertoResultParam:ListParam VrdeValuetoResultParam:ListParam&Nej&No toResultPlan&Ja&Yes toResultPlan BytesBytes toResultPlanKardinalitet Cardinality toResultPlanKostnadCost toResultPlanModMode toResultPlanObjektnamn Object name toResultPlanOperation Operation toResultPlanInstllningarOptions toResultPlan0Plan tabellen finns intePlan table doesn't exist toResultPlanAngivna plan tabellen %1 fanns ine Skall TOra frska skapa den?CSpecified plan table %1 didn't exist. Should TOra try to create it? toResultPlan Vilkor ConditiontoResultReferences ConstrainttoResultReferencesBeroende DEPENDENCYtoResultReferencesRaderingsregel Delete RuletoResultReferencesPslagetEnabledtoResultReferences ObjektObjecttoResultReferences gareOwnertoResultReferences%foreign key (%1) references %2.%3(%4)toResultReferences"Bugger Hmtningar Buffer GetstoResultResources:InformationDisk lsningar Disk ReadstoResultResources:InformationExekveringar ExecutionstoResultResources:Information(Frsta InlsningstidFirst Load TimetoResultResources:InformationInvalideringar InvalidationstoResultResources:Information"Sparade Versioner Kept VersionstoResultResources:Information"Laddade VersionerLoaded VersionstoResultResources:InformationLaddningarLoadstoResultResources:Informationppna Versioner Open VersionstoResultResources:InformationOptimeringsmodOptimizer ModetoResultResources:Information ParseParsetoResultResources:Information*Bearbetande Schema IDParsing Schema IdtoResultResources:Information.Bearbetande Anvndar IDParsing User IdtoResultResources:InformationBehllt MinnePersistent MemtoResultResources:Information Rader BearbetadeRows ProcessedtoResultResources:InformationKrnings Minne Runtime MemtoResultResources:Information$Serielagda AvbrottSerializable AbortstoResultResources:InformationDelat Minne Sharable MemtoResultResources:InformationSorteringarSortstoResultResources:Information$Anvndare Som KrtUsers ExecutingtoResultResources:Information(Anvndare Som ppnat Users OpeningtoResultResources:InformationRKan inte ndra session p systemstatestik)Can't change session on system statistics toResultStats DeltaDelta toResultStatsNamnName toResultStats VrdeValue toResultStats"Autoutkning (%1)Autoextend (%1)toResultStorageTillgngligt AvailabletoResultStorageSammanslaget CoalescedtoResultStorageInnehllContentstoResultStorage/Couldn't find tablespace parent %1 for datafiletoResultStorageFritt (%1) Free (%1)toResultStorageFria FragmentFree fragmentstoResultStorageInformation InformationtoResultStorageLoggningLoggingtoResultStorageMax fritt (%1) Max free (%1)toResultStorageNamnNametoResultStorageIngen fil valdNo file selectedtoResultStorage*Inget tablespace valtNo tablespace selectedtoResultStorageStorlek (%1) Size (%1)toResultStorage StatusStatustoResultStorage TablespacetoResultStorage2Anvnt/Fritt/AutoutkningUsed/Free/AutoextendtoResultStorageWeird, empty tablespace nametoResultStoragetoResultStoragetoResultStorageJKan bara gmma sista kolumnen i frga"Can only hide last column in query toResultViewLs AllaRead All toResultView"Lser alla posterReading all entries toResultView$&ndra uppdatering&Change Refresh toRollback&Ta bort&Drop toRollback&Uppdatera&Refresh toRollback&Rollback &Rollback toRollback`r du sker p att du vill ta bort segmentet %1.-Are you sure you want to drop the segment %1. toRollback AvbrytCancel toRollback6Skapa nytt rollback segmentCreate new rollback segment toRollback Skapa segment...Create segment... toRollback0Ta bort rollback segmentDrop rollback segment toRollbackTa bort segment Drop segment toRollbackHSl p snapshot too old detektering."Enable snapshot too old detection. toRollback$Inget segment valtNo segment selected toRollbackAvslagenOffline toRollbackPslagenOnline toRollbackppna Frgor Open Cursors toRollbackUppdateraRefresh toRollback$Rollback HanterareRollback analyzer toRollbackSl av segmentTake segment offline toRollbackSl p segmentTake segment online toRollback*TranskationsanvndareTransaction Users toRollback*Updatera SegmentlistaUpdate segment list toRollback BlockBlocktoRollback:Information BlockBlockstoRollback:InformationNuvarandeCurrenttoRollback:InformationNuvarande (MB) Current (MB)toRollback:InformationAntal ExtentExtentstoRollback:InformationTrffratioHitratetoRollback:InformationInitial (MB) Initial (MB)toRollback:InformationNsta (MB) Next (MB)toRollback:Information Optimal (MB)toRollback:Information gareOwnertoRollback:Information PCT IncreasetoRollback:InformationLsningarReadstoRollback:InformationSegmentSegmenttoRollback:Information StatusStatustoRollback:Information TablespacetoRollback:InformationTransaktioner TransactionstoRollback:InformationAnvnd (MB) Used (MB)toRollback:Information Oracle Anvndare Oracle UsertoRollback:TransactionUsersOS AnvndareOs UsertoRollback:TransactionUsersRollback Seg Rollback SegtoRollback:TransactionUsersSessions ID Session IDtoRollback:TransactionUsers*Inga ndringar gjordaNo changes madetoRollbackDialogLagringStoragetoRollbackDialog &Namn&NametoRollbackDialogUI&Ok&OktoRollbackDialogUI&Publik&PublictoRollbackDialogUI&Tablespace &TablespacetoRollbackDialogUI AvbrytCanceltoRollbackDialogUI\Visa SQL fr att generera det angivna objektet5Display the SQL used to generate the specified objecttoRollbackDialogUI`Om denna skall vara ett publikt rollback segment7If this should be a publicly available rollback segmenttoRollbackDialogUI Andra tablespaceModify tablespacetoRollbackDialogUI Rollback SegmentRollback SegmenttoRollbackDialogUISQLSQLtoRollbackOpenSnapshotSnapshottoRollbackOpenStartadStartedtoRollbackOpenAnvndareUsertoRollbackOpen4&Bortse frn start extent.&Disregard start extent.toRollbackPrefsJSl p snapshot too old d&etektering.#&Enable snapshot too old detection.toRollbackPrefs6&Exkludera frsta visningen&Exclude first appearancetoRollbackPrefs(&Mste lsta buffrar&Must read bufferstoRollbackPrefs<Sta&rta om omexekverade satser&Restart reexecuted statementstoRollbackPrefsEn sats mste synas tminstnde tv konsekutiva uppdateringar innan det visas.KA statement must be visible at least two consecutive polls to be displayed.toRollbackPrefsVisa alltid frn brjan av vnstra kanten nr anvndandet av extent visas.?Always start from the left border when displaying extent usage.toRollbackPrefsPVisa inte satser som inte lser buffrar.4Don't display statements that have not read buffers.toRollbackPrefs|Sl p snapshot too old detektering, belastar stora databaser.DEnable snapshot too old detection, will put load on large databases.toRollbackPrefs Rollback Verktyg Rollback TooltoRollbackPrefsXStarta om satser som blivit exekverade igen.1Start statements again that have been reexecuted.toRollbackPrefs>Kunde inte hitta SQL sats i SGA"Couldn't find SQL statement in SGAtoSGAStatement Exekverings planExecution plantoSGAStatementInformation InformationtoSGAStatementSQLSQLtoSGAStatement&Uppdatera&Refresh toSGATrace&SGA Sprning &SGA Trace toSGATrace61 exekvering och 1 parsning1 execution, 1 parse toSGATraceAllaAll toSGATrace ValfriAny toSGATrace$ndra &uppdateringChange &refresh toSGATracendra &schemaChange &schema toSGATracendra t&yp Change t&ype toSGATrace*Hmta satser frn SGAFetch statements in SGA toSGATrace"Lnga operationerLong operations toSGATraceUppdateraRefresh toSGATraceSGASGA toSGATraceSGA sprning SGA trace toSGATrace SchemaSchema toSGATrace Urval Selection toSGATrace(Top bufferhmtningarTop buffergets toSGATrace:Top bufferhmtning/exekveringTop buffergets/exec toSGATrace,Top bufferhmtning/radTop buffers/row toSGATrace"Top disklsningar Top diskreads toSGATrace4Top disklsning/exekveringTop diskreads/exec toSGATrace Top exekveringarTop executions toSGATraceTop raderTop rows toSGATrace$Top rad/exekvering Top rows/exec toSGATraceTop sorteringar Top sorts toSGATrace0Top sortering/exekveringTop sorts/exec toSGATraceTypType toSGATraceOavklarade Unfinished toSGATracelOavklarade r endast tillgnglig fr lnga operationer0Unfinished is only available for long operations toSGATraceOknt urvalUnknown selection toSGATrace*Oknd typ av sprningUnknown type of trace toSGATrace&Auto updatera &Auto updatetoSGATracePrefsSGA Sprning SGA TracetoSGATracePrefsZUpdatera automatiskt efter ndring av schema.,Update automatically after change of schema.toSGATracePrefs Ansluten till %1Connected to %1toSMTP Ansluter till %1Connecting to %1toSMTPMeddelande snt Message senttoSMTP@Ovntat svar frn SMTP server: $Unexpected reply from SMTP server: toSMTP`Felaktig rad i SQL ordboksfil. Tv '[' innan '='9Malformed line in SQL dictionary file. Two '[' before '='toSQL|Felaktigt formaterad tag i konfigurationsfil. Saknar = p rad./Malformed tag in config file. Missing = on row.toSQLSQL OrdbokSQL DictionarytoSQL:Frskte hmta oknt SQL (%1)Tried to get unknown SQL (%1)toSQL^Oknt tecken efter \. Endast \\ och \n tilltna>Unknown escape character in string (Only \\ and \n recognised)toSQL&Nej&No toSQLEdit&Ok&Ok toSQLEdit&Ja&Yes toSQLEdit AvbrytCancel toSQLEditDatabasDatabase toSQLEditNTa bort denna version frn SQL ordboken+Delete this version from the SQL dictionary toSQLEditBeskrivning Description toSQLEdit*Ladda SQL ordboks filLoad SQL dictionary file toSQLEdit$Saknar beskrivningMissing description toSQLEdit(ndrade SQL ordbokenModified SQL dictionary toSQLEditNamnName toSQLEditIngen beskrivning ifylld. Detta r ndvndigt fr att spara SQL. Lgger till obeskrivd som beskrivning.[No description filled in. This is necessary to save SQL. Adding undescribed as description. toSQLEditSQL editor SQL editor toSQLEdit<Spara ndringar i SQL ordboken$Save changes into the SQL dictionary toSQLEditZSpara modifierad SQL tillbaka till ordboksfil$Save modified SQL to dictionary file toSQLEdit6Spara denna post i ordboken!Save this entry in the dictionary toSQLEdit>Skulle vara databastyp:version.$Should be database provider:version. toSQLEditSkulle vara databastyp:version. Kan inte sluta med det frsta :.@Should be database provider:version. Can't end with the first :. toSQLEditjSkulle vara databastyp:version. Kan inte brja med :.8Should be database provider:version. Can't start with :. toSQLEdit6Starta en ny SQL definitionStart new SQL definition toSQLEditText Namn Text Name toSQLEditObeskrivd Undescribed toSQLEdit,Fel format fr versionWrong format of version toSQLEdit&Editera SQL... &Edit SQL... toSQLEditTool4SQL adress ej funnen i SGASQL Address not found in SGA toSQLString2SQL frga ej funnen i SGASQL Query not found in SGAtoSQLToAddress3Internal error in toSQLParse, should never get here toSQLparseNObalanserade paranteser (Fr mnga ')')%Unbalanced parenthesis (Too many '(') toSQLparseNObalanserade paranteser (Fr mnga ')')%Unbalanced parenthesis (Too many ')') toSQLparse4Lsenord fr att ppna filFile open passwordtoSaveFilename&Initial&InitialtoScript&begrnsning&LimittoScript &Nsta&NexttoScriptP-- Skript genererat till fil %1 gick bra+-- Script generated to file %1 successfullytoScriptd-- Generering av skript till bibliotek %1 gick bra0-- Scripts generate to directory %1 successfullytoScriptAllaAlltoScript.Kunde inte ppna fil %1Couldn't open file %1toScript SkapadCreatedtoScript4Destination shouldn't be enabled now, internal errortoScriptBorttagenDroppedtoScript:Fel vid skrivning till fil %1Error writing to file %1toScript4Extrahering och JmfrelseExtraction and ComparetoScriptInternal error, lastLevel < 0toScript*Inget filnamn angivetNo filename specifiedtoScriptIngen mod valdNo mode selectedtoScript IngenNonetoScript>Genomfr definierad extraheringPerform defined extractiontoScriptBErstt existerande storlek med ny Replacing existing size with newtoScript SammaSametoScriptSkresultat Search resulttoScriptXrem Huvudskript fr DDL generering av TOra 7rem Master script for DDL reverse engineering by TOra toScript&Lgg till&Add toScriptUI&Destination &Destination toScriptUI"&Inkludera objekt&Include objects toScriptUI&Instllningar&Options toScriptUI&Radera&Remove toScriptUI&Sk&Search toScriptUI K&lla&Source toScriptUIAllaAll toScriptUI$Automatisk storlek Auto resize toScriptUILetaBrowse toScriptUICommit avstndCommit distance toScriptUIJmfrCompare toScriptUIDJmfr tv databaser eller scheman Compare two databases or schemas toScriptUIKonfiguration Configuration toScriptUIAnslutning Connection toScriptUI&Innehller alla ordContain all words toScriptUI.Innehller valfritt ordContain any words toScriptUISkapa databasskript som konverterar schema eller databas frn klla till destinationPCreate database scripts to convert schema or database from source to destination toScriptUIEgen storlek Custom resize toScriptUISkillnad Difference toScriptUI$ndra inte storlek Don't resize toScriptUIExakt trff Exact match toScriptUIExtraheraExtract toScriptUIbExtrahera skript fr att terskapa databasobjekt.,Extract script to recreate database objects. toScriptUIForm1 toScriptUIGenerera huvudGenerate header toScriptUIFGenerera huvud i toppen av skriptet(Generate header at the top of the script toScriptUI"Generera prompterGenerate prompts toScriptUI^Generera prompter som visar krningen i SQLPlus/Generate prompts to display progress in SQLPlus toScriptUIGenerera schemaGenerated schema toScriptUIIncludera DDL Include DDL toScriptUI4Includera kodspecifikationInclude code specification toScriptUI*Includera kommentarerInclude comments toScriptUI*Includera constraintsInclude constraints toScriptUI>Includera innehllet i tabellerInclude content of tables toScriptUI*Includera rttigheterInclude grants toScriptUIIncludera indexInclude indexes toScriptUIBIncludera parallell specifikationInclude parallel specification toScriptUI@Includera partitionspecifikationInclude partition specification toScriptUI>Includera lagringsspecifikationInclude storage specification toScriptUIInitialInitial toScriptUIBegrnsningLimit toScriptUIMigreraMigrate toScriptUI NstaNext toScriptUI IngenNone toScriptUI ObjektObjects toScriptUI UtdataOutput toScriptUITill bibliotek Output dir toScriptUITill fil Output file toScriptUIUtdata flik Output tab toScriptUISkriv till bibliotek s att varje objekt r placerat i enskilda filer.FOutput to directory so that each object is placed in a different file. toScriptUI RegExpRegExp toScriptUIRapportReport toScriptUIndra storlekResize toScriptUIResultatResult toScriptUI SammaSame toScriptUI SchemaSchema toScriptUIndra storlek Script Resize toScriptUISkSearch toScriptUI^Vlj vilket schema som skall genereras i skript'Select the schema to generate in script toScriptUIAntalet poster som skall skrivas in i databasen mellan varje commit (0 betyder hela tabellen)PThe number of insertstatements to make between each commit (0 means whole table) toScriptUI,Inga mer trffar funnaNo more matches foundtoSearchReplace&Erstt&ReplacetoSearchReplaceUI S&k Frn Brjan &Search ToptoSearchReplaceUI StngClosetoSearchReplaceUI ExaktExacttoSearchReplaceUI"Ignorera Versaler Ignore CasetoSearchReplaceUIEnbart Hela Ord Match WordtoSearchReplaceUI4Sk text exakt som skrivenMatch text exactly as writtentoSearchReplaceUI&Hitta bara hela ordOnly match whole wordstoSearchReplaceUI RegExpRegExptoSearchReplaceUI ErsttReplacetoSearchReplaceUIErstt &Alla Replace &AlltoSearchReplaceUISkSearchtoSearchReplaceUISk & ErsttSearch & ReplacetoSearchReplaceUISk &Nsta Search &NexttoSearchReplaceUIpAnvnd RegExp semantik fr trffar (Se Qt dokumentation)8Use RegExp semantics for matching (See Qt documentation)toSearchReplaceUI$&Kopiera nuvarande &Copy current toSecurityAllm&nt&General toSecurity&&Objekt Privilegier&Object Privileges toSecurityUtr&ymme&Quota toSecurity&Uppdatera&Refresh toSecurity,&Radera anvndare/roll&Remove user/role toSecurity&Roller&Roles toSecurity &Spara ndringar &Save changes toSecurity&Skerhet &Security toSecurity&&System Privilegier&System Privileges toSecurityLgg till &roll Add &role toSecurity(Lgg till anv&ndare Add &user toSecurity"Lgg till ny roll Add new role toSecurity,Lgg till ny anvndare Add new user toSecurityr du sker? Are you sure? toSecurity AvbrytCancel toSecurityLKopiera nuvarande anvndare eller rollCopy current user or role toSecurity SlngDiscard toSecurity\Visa SQL som krvs fr att genomfra ndringar*Display SQL needed to make current changes toSecurityVisa SQL...Display SQL... toSecurity*Felaktig skerhets IDInvalid security ID toSecurityNejNo toSecurity*Inga ndringar gjordaNo changes made toSecurity*Radera anvndare/rollRemove user/role toSecurity RollerRoles toSecurity SparaSave toSecuritySpara ndringar Save changes toSecurity Spara ndringar? Save changes? toSecurityXSpara ndringarna gjorda p denna anvndare?#Save the changes made to this user? toSecurity$SkerhetshanterareSecurity manager toSecuritytAnvndare ger fortfarande objekt, lgg till kaskad valet?4The user still owns objects, add the cascade option? toSecurity@Updatera anvndar och roll listaUpdate user and role list toSecurity Anvndare/Roller Users/Roles toSecurityJaYes toSecurityAdministratrAdmintoSecurityObjectPONtoSecurityObject ObjektObjecttoSecurityObject IngenNonetoSecurityQuotaObegrnsat UnlimitedtoSecurityQuota &Inget&NonetoSecurityQuotaUI&Obegrnsat &UnlimitedtoSecurityQuotaUI &Vrde&ValuetoSecurityQuotaUITillhr till resultgrupp eller har obegrnsat tablespace rttigheter?Belongs to Resource group or has unlimited tablespace privilegetoSecurityQuotaUIForm1toSecurityQuotaUIKvota Storlek Quota SizetoSecurityQuotaUI TablespacetoSecurityQuotaUIAnvnt Utrymme Used SizetoSecurityQuotaUI AvbrytCanceltoSecurityRoleSpara inte Don't savetoSecurityRole*Lsenord stmmer intePasswords don't matchtoSecurityRoleZDe tv versionerna av lsenorden stmmer inte.The two versions of the password doesn't matchtoSecurityRoleAdministratrAdmintoSecurityRoleGrantStandardDefaulttoSecurityRoleGrantPONtoSecurityRoleGrantRollnamn Role nametoSecurityRoleGrantJAYEStoSecurityRoleGrant&Extern &ExternaltoSecurityRoleUI&Global&GlobaltoSecurityRoleUI &Namn&NametoSecurityRoleUIL&senord &PasswordtoSecurityRoleUI Godknn lsenordConfirm PasswordtoSecurityRoleUIAnge lsenordEnter PasswordtoSecurityRoleUIForm2toSecurityRoleUI:Inget lsenord krvs fr rollNo password required for roletoSecurityRoleUI IngenNonetoSecurityRoleUIJRoll autentiserad av operativsystemet*Role authenticated by the operating systemtoSecurityRoleUI2Roll autentiseras globaltRole authenticated globallytoSecurityRoleUIAdministratrAdmintoSecuritySystemNEJNOtoSecuritySystemPONtoSecuritySystemRttighetsnamnPrivilege nametoSecuritySystem AvbrytCanceltoSecurityUserSpara inte Don't savetoSecurityUser&Lsenord stmmer ejPasswords don't matchtoSecurityUserHDe tv lsenorden stmmer ej verens.The two versions of the password doesn't matchtoSecurityUser&Konto Lst&Account LockedtoSecurityUserUI(Standar&d Tablespace&Default TablespacetoSecurityUserUI&Externt &ExternaltoSecurityUserUI&Global&GlobaltoSecurityUserUI &Namn&NametoSecurityUserUIL&senord &PasswordtoSecurityUserUI*&Temporrt Tablespace&Temporary TablespacetoSecurityUserUI&&X.500 Externt Namn&X.500 External NametoSecurityUserUI&Konfirmera LsenordConfirm PasswordtoSecurityUserUIAnge LsenordEnter PasswordtoSecurityUserUINytt LsenordExpire PasswordtoSecurityUserUIForm1toSecurityUserUIP&rofilP&rofiletoSecurityUserUIRAnvndare authentiserad av operativsystem*User authenticated by the operating systemtoSecurityUserUIHSemaphorfunktionen "%1" har fallerat"The semaphore function "%1" failed toSemaphore$&ndra Uppdatering&Change Refresh toSession&Nej&No toSession&Uppdatera&Refresh toSession&Session&Session toSession&Ja&Yes toSessionppna objekt Accessing toSessionAllaAll toSession AvbrytCancel toSessionSpara arbete? Commit work? toSessionAnslutningsinfo Connect Info toSessionNuvarande SatsCurrent Statement toSession0Avmarkera alla sessionerDeselect all sessions toSession(Sl av tidsstatestikDisable timed statistics toSession"Bryt vald sessionDisconnect selected session toSessionBryt sessionDisconnect session toSession(Sl p tidsstatestikEnable timed statistics toSession2Exkludera valda sessionerExclude selected sessions toSession|Lt nuvarande transaktion slutfras innan session bortkopplas?&Indentera samma som fregende&Indent same as previous linetoSyntaxSetupUI&Nyc&kelord Versaler&Keyword uppertoSyntaxSetupUI V&lj&PicktoSyntaxSetupUI8&Sortera kompletteringsrader&Sort completion rowstoSyntaxSetupUIAktivera kod komplettering i SQL editorer. Inte rekommenderat p lngsamma anslutningar.MActivate code completion in SQL editors. Not recommended on slow connections.toSyntaxSetupUIVljChoosetoSyntaxSetupUIExempelkod Code exampletoSyntaxSetupUIKonvertera alla nyckelord till versaler nr syntaxformatterad text visas. Bara tillgngligt fr typsnitt med fast bredd.nConvert all keywords to uppercase when displayingsyntaxhighlighted text. Only available for monospaced fonts.toSyntaxSetupUIzSl p syntaxformattering, eller anvnd en normal text editor5Enable syntax highlighting, or use simple text editortoSyntaxSetupUI"Filnamns ndelserFilename extensionstoSyntaxSetupUIForm1toSyntaxSetupUIIndentera en ny rad i en editor till samma kolumn som den fregende radenFIndent a new line in an editor to the same column as the previous linetoSyntaxSetupUIExempellista List exampletoSyntaxSetupUIInstllningarOptionstoSyntaxSetupUI(S&yntax formatteringS&yntax highlightingtoSyntaxSetupUISortera tillgngliga kompletteringsrader i alfabetisk ordning i stllet fr den ursprunglig ordningen de lstes frn databasen.JSort the available completion rows alphabetically or in the order the are.toSyntaxSetupUI&Syn&tax komponenterSy&ntax componentstoSyntaxSetupUIExempeltext Text exampletoSyntaxSetupUIInternal error, lastLevel < 0 toTemplateNot a toTemplate parent toTemplateMallTemplate toTemplateMall ToolbarTemplate Toolbar toTemplateMallresultatTemplate result toTemplate &Leta&BrowsetoTemplateAddFileUI&Fil&FiletoTemplateAddFileUI&Ok&OktoTemplateAddFileUI&Rot&RoottoTemplateAddFileUI"Lgg till mallfilAdd template filetoTemplateAddFileUI AvbrytCaneltoTemplateAddFileUIInternal error, lastLevel < 0toTemplateEdit&Beskrivning &DescriptiontoTemplateEditUI &Namn&NametoTemplateEditUI&Ok&OktoTemplateEditUI &Frhandsvisning&PreviewtoTemplateEditUI"Lgg till ny mallAdd new templatetoTemplateEditUI AvbrytCanceltoTemplateEditUIRBeskrivande text. Kan vara i HTML format.(Description text. Can be in HTML format.toTemplateEditUINamn p mallen.Name of the template.toTemplateEditUI$FrhandsgranskningPreviewtoTemplateEditUIFrhandsgranskning av beskrivning. Tryck p knappen fr att uppdatera6Preview of the description. Press the button to updatetoTemplateEditUI(Ta bort aktuell mallRemove the current templatetoTemplateEditUIMallTemplatetoTemplateEditUIMalleditorTemplate editortoTemplateEditUI&Ok&OktoTemplatePrefs AvbrytCanceltoTemplatePrefs(Kunde inte ppna filCouldn't open filetoTemplatePrefs*Kunde inte ppna fil.Couldn't open file.toTemplatePrefsNKunde inte ppna fil. Starta p ny fil?&Couldn't open file. Start on new file?toTemplatePrefs*Kunde inte skriva filCouldn't write filetoTemplatePrefs&Lgg till fil &Add FiletoTemplateSetupUI&Editera Fil &Edit FiletoTemplateSetupUI&Radera Fil &Remove FiletoTemplateSetupUIFilnamnFilenametoTemplateSetupUIForm1toTemplateSetupUIRotRoottoTemplateSetupUI MallarTemplatetoTemplateTool&Uppdatera&Refresh toTemporary&Temporr &Temporary toTemporaryUppdatera lista Refresh list toTemporary Temporra ObjektTemporary Objects toTemporary8Thread function "%1" failer.Thread function "%1" failed.toThread Alarm MeddelndenAlert MessengertoTool Backup HanterareBackup ManagertoToolNKunde inte spara vrdet %1 p nyckel %2 Couldn't save %1 value at key %2toToolPKunde inte spara tomt vrde p nyckel %1#Couldn't save empty value at key %1toTool"Nuvarande SessionCurrent SessiontoToolBDB Extrahering/Jmfrelse/SkningDB Extraction/Compare/SearchtoToolOgiltiga ObjektInvalid ObjectstoToolnFelaktig tag i konfigurationsfil. Saknar = p rad. (%1)4Malformed tag in config file. Missing = on row. (%1)toToolPL/SQL DebuggerPL/SQL DebuggertoToolPL/SQL ProfilerPL/SQL ProfilertoTool LsenordsndringPassword ChangetoTool Rollback SegmentRollback SegmentstoToolSGA Sprning SGA TracetoToolSQL Utdata SQL OutputtoToolSQL Mallar SQL TemplatetoToolSQL Arbetsblad SQL WorksheettoTool"Schema UtforskareSchema BrowsertoTool&Skerhets HanterareSecurity ManagertoToolServer Trimning Server TuningtoToolSessionerSessionstoTool&Statestik HanterareStatistics ManagertoTool$Lagrings HanterareStorage ManagertoTool^Oknt tecken efter \. Endast \\ och \n tilltna>Unknown escape character in string (Only \\ and \n recognised)toTool &Standardverktyg &Default tooltoToolSettingUI"&Pslagna verktyg&Enabled toolstoToolSettingUIForm1toToolSettingUIpVlj standardverktyg att visa nr ny anslutning startas.@Select the default tool to pop up when opening a new connection.toToolSettingUItVlj vilka verktyg som skall visas i meny och verktygsrad.:Select which tools should show up in the menu and toolbar.toToolSettingUIVerktygTooltoToolSettingUIDu mste starta om TOra fr att dessa ndringar skall ha effekt.9You must restart for any of these changes to have effect.toToolSettingUIblock/s blocks/stoTuning &Blockerande ls&Blocking lockstoTuning$&ndra Uppdatering&Change RefreshtoTuning&Fil I/O &File I/OtoTuning&Indikatorer &IndicatorstoTuning&Licenser &LicensestoTuning&Nej&NotoTuning&versikt &OverviewtoTuning&Parametrar &ParameterstoTuning&Uppdatera&RefreshtoTuning&Statestik &StatisticstoTuning&Trimning&TuningtoTuningr du sker att du vill sl p alla trimnings funktioner. Detta kan lgga hrd last p en databas och om du inte r DBA vill du troligtvis inte gra detta. Om du vljer nej hr kan du vlja att sl av eller p flikarna individuellt i den mn de behvs.Are you sure you want to enable all tuning features. This can put heavy strain on a database and unless you are the DBA you probably don't want this. Selecting no here will give you the option to enable or disable tabs individually as they are needed.toTuningKontrolfiler Control FilestoTuning:S p all trimnings statestikEnable all tuning statisticstoTuning@Sl av eller p trimnings flikarEnable and disable tuning tabstoTuningIndikatorer IndicatortoTuningLibrary C&acheLibrary C&achetoTuning&ValOptio&nstoTuningReferens ReferencetoTuningUppdateraRefreshtoTuningServer Trimning Server TuningtoTuning VrdeValuetoTuningVntelgen Wait eventstoTuningFFel format p namn av diagram (%1).#Wrong format of name on chart (%1).toTuningJaYestoTuning AktivaActivetoTuning:Charts:4BAClientsInaktivaInactivetoTuning:Charts:4BAClients SystemSystemtoTuning:Charts:4BAClients AnropCallstoTuning:Charts:6LNExecution CommitCommittoTuning:Charts:6LNExecutionExekveraExecutetoTuning:Charts:6LNExecutionHrd parsning Hard parsetoTuning:Charts:6LNExecution ParseParsetoTuning:Charts:6LNExecutionRollbacks RollbackstoTuning:Charts:6LNExecutionAllokerade AllocatedtoTuning:ControlFileRecordsStorlekSizetoTuning:ControlFileRecordsTotala Poster Total RecordstoTuning:ControlFileRecordsTypTypetoTuning:ControlFileRecordsAnvndaUsedtoTuning:ControlFileRecordsAnvnda Poster Used RecordstoTuning:ControlFileRecordsLstrffarGet HitstoTuning:LibraryCacheLsningarGetstoTuning:LibraryCacheNamespace NamespacetoTuning:LibraryCachePintrffarPin HitstoTuning:LibraryCachePinsPinstoTuning:LibraryCache RatioRatiotoTuning:LibraryCache"Session NuvarandeSessions CurrenttoTuning:License Flesta SessionerSessions HighwatertoTuning:LicenseSession Max Sessions MaxtoTuning:LicenseSession VarningSessions WarningtoTuning:LicenseMax Anvndare Users MaxtoTuning:LicensePslagenEnabledtoTuning:OptionsParameter ParametertoTuning:Options MedelAveragetoTuningFileIOBlock Lsta Blocks ReadtoTuningFileIOBlock SkrivnaBlocks WrittentoTuningFileIOFil I/OFile I/OtoTuningFileIOFiltider File timingtoTuningFileIOMaximum Lsning Maximum ReadtoTuningFileIO"Maximum Skrivning Maximum WritetoTuningFileIOMinimumMinimumtoTuningFileIOLsningarReadstoTuningFileIOTablespace I/OTablespace I/OtoTuningFileIOTablespacetiderTablespace timingtoTuningFileIOSkrivningarWritestoTuningFileIOblock/sblocks/stoTuningFileIOblock/s blocks/stoTuningOverview < Arkivskrivning< Archive writetoTuningOverview"< Hmtade buffrar < Buffer getstoTuningOverview< Klient in< Client inputtoTuningOverview&< Fysiska lsningar< Physical readtoTuningOverview"ndrade buffrar >Buffer changed >toTuningOverviewKlient ut >Client output >toTuningOverviewExekveringar > Executes >toTuningOverviewTrffratioHitratetoTuningOverviewLogg skrivare > Log writer >toTuningOverviewTolkningar >Parse >toTuningOverview*Fysiska skrivningar >Physical write >toTuningOverviewRedo poster >Redo entries >toTuningOverviewTidskala TimescaletoTuningOverviewblock/sblocks/stoTuningOverview AktivaActivetoTuningOverviewUIAktiv grupp Active grouptoTuningOverviewUIAktiva/Totala Active/TotaltoTuningOverviewUIArkivloggar Archive logstoTuningOverviewUIBakgrund BackgroundtoTuningOverviewUIBuffer Cache Buffer CachetoTuningOverviewUIKlienterClientstoTuningOverviewUIDatafiler DatafilestoTuningOverviewUITillgnad DedicatedtoTuningOverviewUIDispatcher DispatcherstoTuningOverviewUI FilerFilestoTuningOverviewUIFiler/Storlek Files/SizetoTuningOverviewUIForm1toTuningOverviewUIParallellParalleltoTuningOverviewUIProcesser ProcessestoTuningOverviewUIRedo Buffer Redo BuffertoTuningOverviewUIRedologgar Redo LogstoTuningOverviewUISGASGAtoTuningOverviewUI Snd frn klientSend from clienttoTuningOverviewUI Snd till klientSend to clienttoTuningOverviewUI ServerServertoTuningOverviewUIGemensamSharedtoTuningOverviewUIGemensam Pool Shared PooltoTuningOverviewUITablespace TablespacestoTuningOverviewUI TextLabel3toTuningOverviewUI TextLabel5toTuningOverviewUI TotaltTotaltoTuningOverviewUIAnvnt/Totalt Used/TotaltoTuningOverviewUI.&Pslagna bakgrundsvyer&Enabled background viewstoTuningSettingUI&Tillgngliga flikarAvailable tabstoTuningSettingUIForm1toTuningSettingUIxVlj vilka vyer som hmtar data i bakgrunden som skall kra.ESelect which views collect data in the background that should be run.toTuningSettingUIServer trimning Server tuningtoTuningSettingUIStapeldiagram Bar chart toVisualize$Data visualiseringData visualization toVisualizeVisa axeltitlarDisplay axis legend toVisualizeVisa rutnt Display grid toVisualizeVisa titlarDisplay legend toVisualizeLinjediagram Line chart toVisualizeHAntal kolumner att anvnda som titel!Number of columns to use as title toVisualizePajdiagram Pie chart toVisualizeTitelkolumner Title columns toVisualize"Uppdatera diagram Update chart toVisualizeNAbslut systemvntehndelser Totalt %1%2&Absolute system wait events Total %1%2 toWaitEventsFrgColor toWaitEvents AntalCount toWaitEventsDelta (1/s) Delta (1/s) toWaitEventsDelta (ms/s) Delta (ms/s) toWaitEventsLDelta systemvntehndelser Totalt %1%2#Delta system wait events Total %1%2 toWaitEventsVisaDisplay toWaitEvents*Internal error, can't find (%1) in usedMap toWaitEventsServer Trimning Server Tuning toWaitEvents*System vntehndelserSystem wait events toWaitEvents2System vntehndelseantalSystem wait events count toWaitEventsTidTime toWaitEvents TotaltTotal toWaitEventsTotalt (ms) Total (ms) toWaitEventsVntetyp Wait type toWaitEventsms/sms/s toWaitEventsantal/swaits/s toWaitEvents&%1 rader bearbetade%1 rows processed toWorksheet*Beskriv Un&der Markr&Describe Under Cursor toWorksheet"Sl P Stat&estik&Enable Statistics toWorksheet"&Exekvera Aktuell&Execute Current toWorksheet(Via &Exekveringsplan&Explain current statement toWorksheet&Information &Information toWorksheet &Logg&Logging toWorksheet&Nej&No toWorksheet&Ok&Ok toWorksheet"K&r Senaste Sats&Reexecute Last Statement toWorksheet&Resultat&Result toWorksheet&Statestik &Statistics toWorksheet$&Stoppa Exekvering&Stop Execution toWorksheet&Visualisera &Visualize toWorksheet&Ja&Yes toWorksheet(Tid %1) (Duration %1) toWorksheetAvbrutenAborted toWorksheet AvbrytCancel toWorksheet*Rensa exekveringsloggClear execution log toWorksheet(Beskriv under markrDescribe under cursor toWorksheet LngdDuration toWorksheet2Tid som frgan har krt 'Duration while query has been running  toWorksheet E&xekveringsplanE&xecution plan toWorksheet*Editera Sparad SQL...Edit Saved SQL... toWorksheet0Ange updateringsfrekvensEnter refreshrate toWorksheetAnge titeln i menyn fr sparad SQL, undermenyer separeras med ett ':' tecken.YEnter the title in the menu of the saved SQL, submenues are separated by a ':' character. toWorksheetAnge titel Enter title toWorksheetRadera &Logg Erase &Log toWorksheetExekvera &Alla Execute &All toWorksheet2Exekvera &Nyrad SepareradExecute &Newline Separated toWorksheetExekvera &Nsta Execute &Next toWorksheet&Exekvera Sparad SQLExecute Saved SQL toWorksheet(Exekvera alla satserExecute all statements toWorksheet,Exekvera nuvarand satsExecute current statement toWorksheet(Exekvera alla satserExecuting all statements toWorksheetPHmta sessionsstatestik under exekvering%Gather session statistic of execution toWorksheetI/OI/O toWorksheet6Ignorerar SQL*Plus kommandoIgnoring SQL*Plus command toWorksheetNsta LoggpostNext Log Entry toWorksheetNsta i loggNext log entry toWorksheet&Ingen SQL att sparaNo SQL to save toWorksheet@Ingen plan tillgnglig att sparaNo plan available to save toWorksheet&Fregende LoggpostPrevious Log Entry toWorksheet"Fregende i loggPrevious log entry toWorksheetBearbetar frgaProcessing query toWorksheetFrga exekveradQuery executed toWorksheet&Kr Om Senaste SatsReexecute Last Statement toWorksheetUppdateraRefresh toWorksheet<Updateringsfrekvens i sekunder Refresh rate of query in seconds toWorksheetResultatResult toWorksheet.Kr aktuellt sparad SQLRun current saved SQL toWorksheetSQLSQL toWorksheetSQL Arbetsblad SQL worksheet toWorksheetHSpara ndringar p arbetsblad fr %1 Save changes to worksheet for %1 toWorksheetSpara fil Save file toWorksheet"Spara senaste SQL Save last SQL toWorksheetBSpara statestik fr senare analys"Save statistics for later analysis toWorksheetVlj Sparad SQLSelect Saved SQL toWorksheet$Stega genom satserStep through statements toWorksheet"Stanna exekveringStop execution toWorksheetTid Timestamp toWorksheetObeskrivd Undescribed toWorksheet&Arbetsblad W&orksheet toWorksheetVntelgen Wait states toWorksheet(Arbetsblad StatistikWorksheet Statistics toWorksheetHFel antal parametrar fr beskrivning'Wrong number of parameters for describe toWorksheetDDu har inte exekverat ngon SQL n You haven't executed any SQL yet toWorksheetblock/sblocks/s toWorksheet &Leta&BrowsetoWorksheetSetupUI$Visa nummer&kolumn&Display number columntoWorksheetSetupUI"Sl p stat&estik&Enable statisticstoWorksheetSetupUI.&Multipla rader i logg.&Multiple lines in log.toWorksheetSetupUI<Lgg till &loggposter i slutetAdd &log entries at endtoWorksheetSetupUIbVisa numreringskolumn till vnster om resultatet.1Add a numbering column to the left of the result.toWorksheetSetupUI&Lgg till nyligen exekverade frgor i slutet av loggen istllet fr i brjan. ndring av detta kommer ge felaktig ordning i de fnster om r ppna.{Add newly executed queries at end of log instead of top. Changing this will mess up the log in the windows that are opened.toWorksheetSetupUI@Fr&ga om ndringar skall sparasAsk about saving &changestoWorksheetSetupUIFrga om ndringar i arbetsbladet skall sparas nr arbetsbladet stngs.0Ask about saving changes when closing worksheet.toWorksheetSetupUI&Automati&sk lagring Auto &savetoWorksheetSetupUISpara fil automatiskt nr arbetsblad stngs (Utan att stlla frgor om det).NAutomatically save file when closing worksheet (Without asking any questions).toWorksheetSetupUIStandard&fil Default &filetoWorksheetSetupUITVisa flera rader i SQL kolumnen av loggen.8Display multiple lines in the SQL column of the logging.toWorksheetSetupUI(Sl p &tidstatestikEnable &timed statisticstoWorksheetSetupUINSl p statestik hmtning som standard.(Enable statistic collection per default.toWorksheetSetupUISl p tidsbaserad statestik i sessionen nr statestik hmtas in i arbetsbladet.BEnable timed statistics as well when collecting normal statistics.toWorksheetSetupUIExekvera sats nr den valdes i loggen. Om avslagen s vljs satsen bara i loggen. oExecute a statement when it is selected in the log, if disabled simply selected the statement in the log.toWorksheetSetupUIDExekvera frga nr det vlja i log'Execute directory when selecting in logtoWorksheetSetupUIXFil som automatiskt ppnas i nya arbetsblad..File to automatically open in a new worksheet.toWorksheetSetupUIForm1toWorksheetSetupUISpara fregende resultat medan arbetsbladet r ppet. Kommer att ta upp mycket minne.MKeep previous results in while worksheet is open. Will consume lot of memory.toWorksheetSetupUI.Flytta mark&r till felMove &cursor to errortoWorksheetSetupUIFlytta markren till ett felets plats om fel upptcks i tolkningen.0Move the cursor to an error if the error occurs.toWorksheetSetupUISQL Arbetsblad SQL WorksheettoWorksheetSetupUI2Spara fregende resultatSave previous resultstoWorksheetSetupUIVisa diagramDisplay chartstoWorksheetStatisticVisa krplanDisplay execution planstoWorksheetStatisticGmHidetoWorksheetStatistic0Ladda statestik frn filLoad statistics from filetoWorksheetStatistic Radera statestikRemove statisticstoWorksheetStatistic0Spara statestik till filSave statistics to filetoWorksheetStatisticServer Tuning Server TuningtoWorksheetStatistic &Kasta&DiscardtoWorksheetText &Nytt arbetsblad&New worksheettoWorksheetText &Spara&SavetoWorksheetText Spara ndringar? Save changes?toWorksheetTextEditorn har ndrats. Vill du spara, kasta bort nringarna eller ppna fil i nytt arbetsblad?eThe editor has been changed. Do you want to save them, discard changes or open file in new worksheet?toWorksheetTextHKunde inte ppna filen fr skrivningCouldn't open file for writing toWriteFile@Kunde in ladda upp data till URLCouldn't upload data to URL toWriteFile>Kunde inte skriva data till filCouldn't write data to file toWriteFileNKunde inte skriva data till temporrfilCouldn't write data to tempfile toWriteFileFil fel File error toWriteFileFilen sparadFile saved successfully toWriteFiletora-2.1.3/src/i18n/tora_toad.ts0000644000175000017500000004037411270353622016153 0ustar michaelmichael toAlert Alt+R Alert|Add Name Alt+R Ctrl+Backspace Alert|Remove name Ctrl+Backspace Alt+N Alert|Edit name Alt+N Alt+M Alert|Message Alt+M Ctrl+M Alert|Message in memo Ctrl+M Ctrl+Return Alert|Send alert Ctrl+Return toAnalyze F5 Statistics|Refresh F5 toBackup F5 Backup|Refresh F5 toBrowser F5 Browser|Refresh F5 Alt+S Browser|Change Schema Alt+S Alt+N Browser|Change object Alt+N Ctrl+Shift+G Browser|Define filter Ctrl+Shift+G Ctrl+Shift+H Browser|Clear filter Ctrl+Shift+H toChartManager F5 Chart Manager|Refresh F5 toCurrent F5 Current session|Refresh F5 toDebug Ctrl+F9 Debug|Scan source Ctrl+F9 F9 Debug|Compile F9 Ctrl+Return Debug|Execute F11 F12 Debug|Stop F12 F7 Debug|Step into F7 F8 Debug|Stop over F8 F6 Debug|Return from Shift+F8 F11 Debug|Debug pane F6 Ctrl+N Debug|Next error Ctrl+N Ctrl+P Debug|Previous error Ctrl+P Ctrl+F5 Debug|Toggle breakpoint Ctrl+F5 Ctrl+F6 Debug|Disable breakpoint F5 F4 Debug|Add watch Ctrl+F5 Ctrl+Delete Debug|Delete watch Ctrl+Delete Ctrl+F4 Debug|Change watch Ctrl+Alt+E F5 Debug|Refresh objectlist Shift+F5 Alt+S Debug|Select schema Alt+S toEditExtensionTool Ctrl+S Edit|Incremental search forward Ctrl+Shift+S Ctrl+R Edit|Incremental search backward Ctrl+Shift+R Ctrl+Alt+I Edit|Indent selection Ctrl+Alt+I Ctrl+Alt+Shift+I Edit|Indent editor Ctrl+Alt+Shift+I Ctrl+U Edit|Uppercase Ctrl+U Ctrl+L Edit|Lowercase Ctrl+U Alt+Right Edit|Indent block Alt+Right Alt+Left Edit|De-indent block Alt+Left toHelp F1 Dialog|Help F1 toHighlightedText Ctrl+T Edit|Table lookup Ctrl+. toInvalid F5 Invalid|Refresh F5 toMain Ctrl+G File|New connection Ctrl+G Ctrl+O File|File open Ctrl+O Ctrl+W File|File save Ctrl+S Ctrl+Shift+W File|File save as Ctrl+Shift+S Ctrl+Shift+C File|Commit Ctrl+Shift+C Ctrl+J File|Stop all Ctrl+J Ctrl+< File|Rollback Ctrl+< Ctrl+Shift+U File|Current connection Ctrl+Shift+U Ctrl+Insert Edit|Copy Ctrl+Insert Shift+Delete Edit|Cut Shift+Delete Shift+Insert Edit|Paste Shift+Insert Ctrl+A Edit|Select all Ctrl+A Ctrl+Z Edit|Undo Ctrl+Z Ctrl+Y Edit|Redo Ctrl+Shift+Z Ctrl+X Edit|Cut Ctrl+X Ctrl+C Edit|Copy Ctrl+C Ctrl+V Edit|Paste Ctrl+V Ctrl+F Edit|Search Ctrl+F F3 Edit|Search next F3 F1 Help|Help F1 toMarkedText Ctrl+A Edit|Select All Ctrl+A toMemoEditor Ctrl+Return Memo Editor|Save changes Ctrl+Return toOutput F5 Output|Refresh F5 F4 Output|Enable F4 Ctrl+Backspace Output|Clear output Ctrl+Backspace Alt+R Output|Change refresh Alt+R toRollback F5 Rollback|Refresh F5 Alt+R Rollback|Change refresh Alt+R toSGATrace F5 SGA Trace|Refresh F5 Alt+S SGA Trace|Change schema Alt+S Alt+R SGA Trace|Change refresh Alt+R Alt+Y SGA Trace|Change type Alt+Y toSearchReplace F1 Search|Help F1 Ctrl+Shift+R Edit|Replace Ctrl+R toSecurity F5 Security|Refresh F5 Ctrl+Return Security|Save changes Ctrl+Return Ctrl+Shift+U Security|Add user Ctrl+Shift+U Ctrl+Shift+R Security|Add role Ctrl+Shift+R Ctrl+Shift+O Security|Copy current Ctrl+Shift+O F4 Security|Display SQL F4 toSession F5 Session|Refresh F5 Alt+R Session|Change refresh Alt+R toSessionMySQL F5 Session MySQL|Refresh F5 Alt+R Session MySQL|Change refresh Alt+R toStorage F5 Storage|Refresh F5 toTemporary F5 Temporary|Refresh F5 toTuning F5 Tuning|Refresh F5 Alt+R Tuning|Change refresh Alt+R toWorksheet Ctrl+Return Worksheet|Execute current Ctrl+Return F8 Worksheet|Execute all F8 F9 Worksheet|Execute next F9 Shift+F9 Worksheet|Execute newline separated Shift+F9 F7 Worksheet|Execute saved SQL F7 F4 Worksheet|Describe under cursor F4 Alt+Up Worksheet|Previous log entry Alt+Up Alt+Down Worksheet|Next log entry Alt+Down F5 Worksheet|Reexecute last statement F5 F3 Worksheet|Explain plan CTRL+E Ctrl+Shift+S Worksheet|Select saved SQL Ctrl+N Ctrl+F9 Worksheet|Check syntax of buffer Ctrl+F9 tora-2.1.3/src/i18n/tora_fr.qm0000644000175000017500000000002011445442526015610 0ustar michaelmichael main Loaded plugin %1 Laddat modul %1 Unhandled exception Ohanterat fel Exit Avsluta Unknown type Okänd typ toAbout Quotes Citat TOra for Windows License TOra för Windows Licens GNU General Public License GNU GPL End User License Slutanvändar licens toAboutUI toAboutUI toAboutUI &Ok &Ok Cancel Avbryt toAlert Alert Messenger Alarm Meddelanden Registered Registrerade Register current Registrera nuvarande Remove registered Ta bort registrerad Name Namn Message Meddelande Edit message in memo Editera meddelande i memo Send alert Skicka alarm Time Tid Failed to start polling thread, try closing some other tools and restart Alert Messenger Kunde inte starta pollande tråd, försök stänga några andra verktyg och starta om Alarm Meddelanden &Add name &Lägg till namn &Remove name &Ta bort namn Edit &name Editera &namn Edit &message Editera &meddelande &Message in memo... &Meddelande i memo... &Send alert &Skicka alarm &Alert &Alarm Alt+R Alert|Add Name Ctrl+Backspace Alert|Remove name Alt+N Alert|Edit name Alt+M Alert|Message Ctrl+M Alert|Message in memo Ctrl+Return Alert|Send alert toAnalyze Analyze Analysera Statistics Manager Statestik Hanterare Refresh Uppdatera All Alla Not analyzed Ej analyserad Analyzed Analyserad Tables Tabeller Indexes Index Compute statistics Beräkna statestik Estimate statistics Uppskatta statestik Delete statistics Radera statestik Validate references Kontrollera referenser for för Table Tabel Indexed columns Indexerad kolumner Local indexes Lokala index Sample Urval % % Parallel Parallell Start analyzing Börja analysera Stop current run Stoppa aktiv körning Explain plans Körplaner Worksheet statistics Arbetsblad statestik &Refresh &Uppdatera &Statistics &Statestik Running %1 Pending %2 Aktiva %1 Väntande %2 Display SQL Visa SQL Analyze table Optimize table F5 Statistics|Refresh toAttachDock Unknown dock position Okänd dockningsposition Main widget not KDockMainWindow Huvudfönster inte av KDockMainWindow klass toBackground %1 queries running in background. %1 frågor aktiva i bakgrunden. One query running in background. En fråga aktiv i bakgrunden. No background queries. Inga frågor i bakgrunden. toBackup Backup Manager Backup Hanterare Update Uppdatera Logswitches per day and hour Logbyten per dag och timme Redo Switches Redo Byten Archived Logs Arkivloggar Last Backup Sinaste Backup Backup Progress Backup Bearbetning &Refresh &Uppdatera &Backup Manager &Backup Hanterare This appears to be a cold backup database Ser ut att vara en kall backup This appears to be a hot backup database Ser ut att vara en hot backup F5 Backup|Refresh toBackup:CurrentBackup Sid SID Serial# Serie# Context Kontext So Far Hittintills Total Totalt % Complete % Klart toBackup:LastBackup Filename Filnamn Completion Time Tidpunkt klar Type Typ File Size Filstorlek Bytes Written Bytes Skrivna Level Nivå Ckpt Change# Ckpt Byte# Checkpoint Time Checkpoint Tid Mrkd Crpt Mrkd Crpt Media Crpt Media Crpt Logically Corrupt Logiskt Fel toBackup:LogHistory Thread# Tråd# Sequence# Sekvens# Time Of First Entry Tidpunkt Första Post Lowest Scn Lägsta Scn Highest Scn Högsta Scn Controlfile Recid Kontrolfil Recid Controlfile Stamp Kontrolfil Tid toBackup:LogSwitches Date Datum 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 toBarChart Zoom Zoom toBrowser No schemas Inga Scheman DB Browser DB Utforskare Update from DB Updatera från DB Define the object filter Definiera objektfilter Remove any object filter Ta bort alla objekt filter T&ables T&abeller Table browser Tabel utforskare Create new table Skapa ny tabell Modify table columns Ändra tabellkolumn Modify constraints Ändra constraints Modify indexes Ändra index &Columns &Kolumner &Indexes &Index C&onstraints C&onstraints &References &Referenser &Grants Rätti&gheter Triggers Triggers &Data &Data Information Information Script Script &Views &Vyer SQL SQL De&pendencies &Beroenden Inde&xes Inde&x Info Info Se&quences Sekvense&r S&ynonyms S&ynonymer Cod&e &Kod &Declaration &Deklaration B&ody Implementati&on Tri&ggers Tri&ggers C&ode K&od &Refresh &Uppdatera &Change Schema &Ändra Schema Change &Object Ändra &Objekt &Define filter... &Definiera filter... &Clear filter &Radera filter &Browser &Utforskare Data Data Indexes Index Constraints Tables Tabeller Columns Kolumner References Referenser Grants Rättigheter Dependencies Beroenden Views Vyer Sequences Sekvenser Code Kod Synonyms Synonymer Define the object filter for database browser Definiera objektfilter för databas utforskare Remove any object filter for database browser Radera objektfilter för databas utforskare Extents Antal Extent Enable constraint or trigger Disable constraint or trigger Statistic Partitions &Statistic F5 Browser|Refresh Alt+S Browser|Change Schema Alt+N Browser|Change object Ctrl+Shift+G Browser|Define filter Ctrl+Shift+H Browser|Clear filter toBrowser:AnyGrants Privilege Rättighet Grantee Ägare Grantor Mottagare Grantable Vidare toBrowser:IndexCols Table Name Tabelnamn Column Name Kolumnnamn Column Length Kolumnlängd Descend Avtagande toBrowser:IndexInformation Owner Ägare Index Name Indexnamn Index Type Indextyp Table Owner Tabelägare Table Name Tabelnamn Table Type Tabeltyp Uniqueness Unik Compression Komprimering Prefix Length Prefixlängd Tablespace Name Tabelspace Namn Ini Trans Ini Trans Max Trans Max Trans Initial Extent Ini Extent Next Extent Next Extent Min Extents Min Extents Max Extents Max Extents Pct Increase Pct Increase Pct Threshold Pct Threshold Include Column Inkludera Kolumn Freelists Frilista Freelist Groups Friliste Grupp Pct Free Pct Free Logging Loggning Blevel BLevel Leaf Blocks Löv Block Distinct Keys Distinkt Nyckel Avg Leaf Blocks Per Key Medel Löv Block Per Nyckel Avg Data Blocks Per Key Medel Data Block Per Nyckel Clustering Factor Klustringsfaktor Status Status Num Rows Antal Rader Sample Size Urvalsstorlek Last Analyzed Sinaste Analys Degree Nivå Instances Instans Partitioned Partitionerad Temporary Tillfällig Generated Genererad Secondary Sekundär Buffer Pool Buffer Pool User Stats Andändar Stats Duration Längd Pct Direct Access PET Direkt Access Ityp Owner ITyp Ägare Ityp Name ITyp Namn Parameters Parametrar Global Stats Global Statestik Domidx Status DOMIDX Status Domidx Opstatus DOMIDX Opstatus Funcidx Status FunkIDX Status Join Index Join Index toBrowser:ListCode Object Name Objektnamn Object Type Objekttyp Type Typ toBrowser:ListIndex Index Name Indexnamn toBrowser:ListSequence Sequence Name Sekvensnamn toBrowser:ListSynonym Synonym Name Synonymnamn toBrowser:ListTables Table Name Tabelnamn toBrowser:ListTrigger Trigger Name Triggernamn toBrowser:ListView View Name Vynamn toBrowser:SequenceInformation Sequence Owner Sekvensägare Sequence Name Sekvensnamn Min Value Min Max Value Max Increment By Öka med Cycle Flag Cykelflagga Order Flag Ordningsflagga Cache Size Cachestorlek Last Number Sista nummer toBrowser:SynonymInformation Owner Ägare Synonym Name Synonymnamn Table Owner Tabelä'gare Table Name Tabelnamn Db Link DB Länk toBrowser:TableInformation Owner Ägare Table Name Tabelnamn Tablespace Name Tablespace Namn Cluster Name Klusternamn Iot Name IOT Namn Pct Free PCT Free Pct Used PCT Used Ini Trans Ini Trans Max Trans Max Trans Initial Extent Initial Extent Next Extent Next Extent Min Extents Min extents Max Extents Max Extents Pct Increase PCT Increase Freelists Frilista Freelist Groups Frilistegrupp Logging Loggning Backed Up Backuppad Num Rows Antal Rader Blocks Block Empty Blocks Tomma Block Avg Space Medelstorlek Chain Cnt Länkningsantal Avg Row Len Medel Radlängd Avg Space Freelist Blocks Medel Utrymme Frilisteblock Num Freelist Blocks Antal Frilisteblock Degree Nivå Instances Instanser Cache Cache Table Lock Tabellås Sample Size Urvalsstorlek Last Analyzed Senast Analyserad Partitioned Partitionerad Iot Type IOT Type Temporary Tillfällig Secondary Sekundär Nested Nästlad Buffer Pool Buffer Pool Row Movement Radrörelse Global Stats Globala Stats User Stats Användar Stats Duration Längd Skip Corrupt Bortse Korrupt Monitoring Övervakning Cluster Owner Kluster Ägare Dependencies Beroenden toBrowser:TableTrigger Trigger Name Triggernamn Triggering Event Händelse Column Name Kolumnnamn Status Status Description Beskrivning toBrowser:TriggerCols Column Name Kolumnnamn In Update Under Updatering Usage Användande toBrowser:TriggerInfo Owner Ägare Trigger Name Triggernamn Trigger Type Triggertyp Triggering Event Händelse Table Owner Tabelägare Base Object Type Objekt Typ Table Name Tabelnamn Column Name Kolumnnamn Referencing Names Refererade Namn When Clause När Klausul Status Status Description Beskrivning Action Type Körtyp toBrowserConstraintUI Constraint info Constraintinfo Display SQL to create this constraint Visa SQL för att återskapa constraint &Name &Namn C&ondition Vilk&or &Column &Kolumn C&heck K&ontroll &Columns &Kolumn &Type &Typ Primary key Primär Nyckel Unique Unik &Primary key/Unique &Primär nyckel/Unik Refers &To Re&fererar R&efered columns R&efererad Kolumn &Referential &Refererande &Apply &Spara Close Stäng toBrowserFilterUI Filter setting Filterinställningar &Ok &Ok Cancel Avbryt Filter on name Filtrera på namn &No filter I&nget filter &Start with &Starta med Object name start with Objekt nammn startar med &End with Slutar m&ed Object name ends in Objekt namn slutar med &Contains &Innehåller Object name contains Objektnamn innehåller &RegExp &RegExp Object name matches RegExp Objektnamn matchar RegExp &Comma list K&omma lista Comma separated list of object names Kommaseparerad lista av objektnamn Filter on tablespace Filtrera på tablespace Include &All Inkludera &Alla &Include &Includera &Exclude &Exkludera Only display own schema Visa enbart egna scheman Ignore &Case Ignorera &Versaler &Invert selection &Invertera Val toBrowserIndexUI Index name Indexnamn &Name &Namn Display SQL to create this constraint Visa SQL för att skapa detta constraint Cancel Avbryt &Columns &Columner &Type &Typ Normal Normal Primary key Primärnyckel Unique Unik Bitmap Bitmap &Ok &Ok toBrowserTable Performing table changes Executing table change script Cancelled ongoing table modification, table might be corrupt Name Namn Datatype Extra parameters toBrowserTableUI Table columns Tabelkolumner Cancel Avbryt Display SQL to create this constraint Visa SQL för att skapa constraint &Tablespace &Tablespace C&omment K&ommentar &Name &Namn &General Allm&änt &Columns &Kolumner &Ok &Ok &Extra declarations &Parallel declarations &Storage declarations Custom column declarations toChangeConnection Change the connection of the tool. Ändra anslutning för verktyget. Couldn't find selected connection Kunde inte hitta valda anslutningen Couldn't find parent connection. Internal error. Kunde inte hitta överliggande anslutning. Internt fel. toChartAlarm Email Email toChartAlarmUI Chart alarm Diagram alarm Any Valfri All Alla Sum Summa Average Medel Max Max Min Min Statusmessage Statusmeddelande Email Email Ignore Ignorera = != < > <= >= Operation Operation Operation to perform on the selected columns Operation att utföra på valda kolumner Value Värde Value to use in comparison. Värde att använda i jämförelse. Comparison Jämförelse What comparison to do with the result from the above operation. Vilken jämförelse att göra med resultatet från ovannämda operation. Action Genomförande What to do when alarm is triggered. Vad som skall göras när alarmet går av. &Ok &Ok Cancel Avbryt Persistent Permanent Remember this alarm when restarting TOra. Kom ihåg detta alarm när TOra startar om. Remember this alarm when restarting. Kom ihåg detta alarm efter omstart. toChartHandler ALARM: ALARM: TOra alert: TOra alarm: A defined alert value was detected: %1 At: %2 Ett definierat alarm värde har detekterats: %1 Vid: %2 Alarms Alarm Persistent Permanent Temporary Tillfällig toChartManager Chart Manager Diagram Hanterare Refresh list Uppdatera lista Open tracker file Öppna spårningsfil Setup chart Diagraminställningar Connection Anslutning Title Titel ID ID Tracking Spårning Alarms Alarm &Refresh &Uppdatera &Chart Manager &Diagram Hanterare ALARM: ALARM: TOra alert: TOra alarm: A defined alert value was detected: %1 At: %2 Ett definierat alarm värde har detekterats: %1 Vid: %2 Initial value didn't start with " in CSV file Första värdet startade inte med " i CSV fil Missing closing " in CSV file Saknar avslutande " i CSV fil Chart format Diagramformat Select format of the chart to display Välj format på diagrammet att visa Barchart Stapeldiagram Linechart Linjediagram Cancel Avbryt Persistent Permanent Temporary Tillfällig F5 Chart Manager|Refresh toChartSetup Charts Diagram Persistent Permanent Temporary Tillfällig toChartSetupUI Chart manager setup Diagraminställningar Track chart to file Spara diagram till fil Browse Leta Persistent Permanent Remember to track this chart to this file always when starting TOra. Kom ihåg att spara detta diagram till denna fil om TOra startas om. Enable tracking Spara till fil Filename Filnamn Alarms Alarm &Add &Lägg till Remove Radera Modify Ändra Cancel Avbryt &Ok &Ok Remember to track this chart to this file always when starting. Kom ihåg att spara detta diagram till fil efter omstart. toChartTool Chart Manager... Diagram Hanterare... Chart Manager Diagram Hanterare toCheckLicense Welcome to TOra Välkommen till TOra (Personal license, not for commerical use) (Personlig licens, ej för kommersiell användande) (Commercial license one user) (Kommersiell licens en användare) (Commerical site license) (Kommersiell plats licens) (Commercial license %1 users) (Kommersiell licens %1 användare) Welcome to TOra (Unregistered version, not for commercial use) Välkommen till TOra (Oregistrerad version, ej för kommsiellt bruk) toConnection All tool widgets need to have autodelete flag set Alla verktygsfönster måste ha autodelete flaggan satt Not done caching objects, can not clear unread cache Inte klar med att cacha objekt, kan inte radera oläst cache Waiting for object caching to be completed. Canceling this dialog will probably leave some list of database objects empty. Väntar på att objekt cachet skall bli klart. Avbryt denna dialogruta kommer troligtvis lämna någon lista med databasobjekt tom. Waiting for object cache Väntar på objekt cachning Not done caching objects Inte klar med att objektcachning Object %1 not available for %2 %2 har inte tillgång till objekt %1 Cancel Avbryt Parse only not implemented for this type of connection toConnectionProvider Tried to fetch unknown provider %1 Försökte hämta okänt databastyp %1 toCurrent Current Session Nuvarande Session Update Uppdatera Privilege Rättighet Type Typ Grantable Vidare Privileges Rättigheter Version Version Parameters Parametrar Statistics Statestik Resource Limits Resursbegränsningar &Refresh &Uppdatera &Current Session &Nuvarande Session System System Object Objekt Role Roll F5 Current session|Refresh toCurrent:ResourceLimit Resource Name Resursnamn Current Utilization Nuvarande Användning Max Utilization Max Användning Initial Allocation Initial Allokering Limit Value Begränsande Värde toCurrent:Version Version Version toCurrentTool Couldn't find parent tool. Internal error. Kunde inte hitta överliggare verktyg. Internt fel. toDatabaseSetting Invalid values Felaktiga värden Doesn't make sense to have max content less than initial fetch size. Will adjust value to be higher. Inte vettigt att ha max innehåll mindre än initial hämtningsstorlek. Ändrar storligt till störra. &Ok &Ok toDatabaseSettingUI toDatabaseSettingUI &Autocommit changes &Autocommit på alla ändringar Specify if changes should be automatically committed. Anger att alla databasändringar automatiskt skall sparas i databasen direkt. UI feedback settings Användarinterface responsinställningar Abort long running queries and reexecute in own connection Avbryt långa frågor och kör om i egen anslutning Reexecute a query taking more than 30 seconds in its own connection to prevent blocking other database access. Starta om frågor som tar mer än 30 sekunder i sin egen databasanslutning för att förhindra att blockera annan databasaccess. Move to own connection after Flytta till egen anslutening efter seconds sekunder Run UI blocking queries exclusively in main thread Kör enbart UI blockerande frågor i huvud anslutningen Let the background queries normally running on the main connection run in a separate connection. Låt bakgrundsfrågor som normalt kör på huvudanslutningen köra i en separat anslutning. Don't reread data if parameters are exactly same Läs inte om data om parametrarna är exakt samma If checked TOra will not refresh a result if it is reexecuted exactly the same two times in a row. Om checkad TOra kommer inte läsa om data om omkörda frågan är exakt lika två gånger i rad. Query settings Frågeinställningar Maximum size &display Maximal &kolumnstorlek The largest default size of a column in query results. Den största storleken en kolumn får växa till automatiskt i ett resultat från en fråga. &All &Alla &Initial rows to fetch in query &Initialt antal rader att hämta The number of rows to always fetch when executing a query. Antalet rader som alltid skall hämtas från en fråga om möjligt. Initially read in content editor Initialt antal som läses in i innehållseditorn Number of rows to initially start reading in content editor, use unlimited on slow connections. Antal rader att initialt fråga efter vid inläsning i innehållseditorn, använd obegränsat för långsamma anslutningar. Indicate empty values as '' instead of NULL as {null}. Indikera tomma värden som '' istället för NUll som {null}. Start read object cache when needed Börja läsa objekt cache när det behövs Read object cache on connect Läs objekt cache direkt vid anslutning Never read object cache until mandatory Läs aldrig cache om det inte är obligatoriskt Run UI blocking queries exclusively in main connection Kör blockerande databasfrågor exklusivt på huvudanslutning Never read object cache (Will leave parts of TOra nonfunctianal) Läs aldrig objekt cache (Lämnar delar av TOra icke fungerande) Keep alive Håll vid liv Make sure connections are kept alive by periodically (5 minutes) sending a query on all idle connections. Se till att anslutningar hålls vid liv genom att periodiskt (Var 5 minut) sända en fråga på alla inaktiva anslutningar. Never read object cache (Will leave parts of application nonfunctianal) Läs aldrig om cache (Kommer lämna delar av applikationen icke fungerande) If checked will not refresh a result if it is reexecuted exactly the same two times in a row. Updatera inte resultat om det exekveras exakt lika dann två gånger i rad. Dataformat Dataformat Number format Nummerformat The way numbers should be presented. Sättet sifror skall visas. Decimals Decimaler Number of decimals for fixed decimal format. Antal decimaler för fast decimalformat. Default Standard Scientific Vetenskaplig Fixed decimal Fasta decimaler toDatatype <B>(</B> <B>,</B> <B>)</B> toDebug Head Deklarationer Body Implementation Misc Allmänt Expected function or procedure, internal error Förväntade funktion eller procedur, internt fel Unexpected end of declaration. Oväntat slut på deklaration. Input Inparametrar Couldn't find any function or procedure under cursor. Kunde inte hitta funktion eller procedur under markören. Anonymous Anonymt Output Utparametrar Returning Returnerade Failed to get runtime info (Reason %1) [Count %1] [Antal %1] {Unavailable} {Ej tillgängligt} DEFERED SENARE No running target Ingen körande måltråd Debugger Debugger Update object list Updatera objektlista Clean sheet Rensa editor Rescan source Tolka om källkod Compile Kompilera Run current block Kör nuvarande block Stop running Stanna körning Step into procedure or function Gå in i procedur eller funktion Step over procedure or function Gå över procedur eller funktion Return from procedure or function Returnera från procedur eller funktion Show head or body of packages and procedures. Visa deklaration eller implementation av packet eller procedurer. Show/hide debug info pane. Visa/dölj debug informationspanel. Go to next error Nästa fel Go to previous error Föregående fel Toggle breakpoint on current line Lägg till ta bort breakpoint på nuvarande rad Enable/disable breakpoint on current line Slå av eller på breakpoint på nuvarande rad Add new variable watch Lägg till en ny variabel att visa Delete variable watch Ta bort variable att visa Change value of watched variable Ändra värde av betraktad variable Objects Objekt Contents Innehåll Object Objekt Line Rad Schema Schema Type Typ &Stack Trace &Stack Variable Variabel Data Data W&atch V&ariabler Object Type Objekttyp Enabled Aktiv &Breakpoints &Breakpoint Name Namn Content Innehåll &Parameters &Parametrar Debug &Output Debug &Utdata &Runtime Log &Log Failed to start target task thread, close some other tools and try again Kunde inte starta måltråd, stäng andra verktyg och försök igen Couldn't start debugging Kunde inte starta debugga Couldn't connect to target session: Kunde inte ansluta till målsessionen: &Ok &Ok Stop execution? Avsluta körning? Do you want to abort the current execution? Vill du avsluta den nuvarande körningen? Cancel Avbryt Header changed Deklaration ändrad Header changed. Continuing will discard uncompiled or saved changes Deklaration ändrad. Om du fortsätter kommer ändringar som inte kompilerats eller sparats att förloras &Compile &Kompilera &Discard changes Sl&äng ändringar Body changed Implementation ändrad Body changed. Continuing will discard uncompiled or saved changes Implementation ändrad. Om du fortsätter kommer ändringar som inte kompilerats eller sparats att förloras &New Sheet &Rensa Editor S&can Source &Tolka om källkod &Execute &Exekvera &Stop Av&sluta Step &Into Gå in &i &Next Line &Nästa rad &Return From &Returnera Från &Head Editor &Deklaration/Implementation &Debug Pane &Debug Panel Next &Error Nästa f&el Pre&vious Error F&öregående Fel &Toggle Breakpoint &Lägg till/radera Breakpoint D&isable Breakpoint Avakt&ivera Breakpoint &Add Watch... Lägg Till V&ariabel... Delete &Watch Ta Bort &Variabel Chan&ge Watch... &Ändra Variabel... Refresh Object List Uppdatera Objektlista Select Schema Ändra Schema Erase Runtime &Log Radera kör&log &Debug &Debug Enter new value to the watch %1 Ange nytt värde för variabeln %1 Unimplemented in PL/SQL debug interface Ej implementera i PL/SQL debug grånssnitt Assignment failed (Reason %1) Tilldelning gick fel (Anledning %1) DISABLED EJ AKTIVERAD ENABLED AKTIVERAD Can not enable breakpoint, not a valid line. Perhaps needs to recompile. Kan inte slå på breakpoint, rad ej godkänd. Du måste kanske kompilera om. Can not enable breakpoint, not a valid object. Perhaps needs to compile. Kan inte aktivera breakpoint, inte ett gilltigt objekt. Måste kanske kompilera om. NOT SET EJ SATT Failed to remove breakpoint (Reason %1) Kunde inte ta bort breakpoint (Anledning %1) body {No debug info} Unknown Okänd Execute or continue execution %1 changed %1 changed. Continuing will discard uncompiled or saved changes Ctrl+F9 Debug|Scan source F9 Debug|Compile Close Stäng CloseAll &Execute or continue Ctrl+Return Debug|Execute F12 Debug|Stop F7 Debug|Step into F8 Debug|Stop over F6 Debug|Return from F11 Debug|Debug pane Ctrl+N Debug|Next error Ctrl+P Debug|Previous error Ctrl+F5 Debug|Toggle breakpoint Ctrl+F6 Debug|Disable breakpoint F4 Debug|Add watch Ctrl+Delete Debug|Delete watch Ctrl+F4 Debug|Change watch F5 Debug|Refresh objectlist Alt+S Debug|Select schema toDebugChangeUI Change value of watch Ändra värde på variabel NULL NULL Cancel Avbryt &Ok &Ok &Index &Index toDebugOutput Couldn't enable/disable output for session Kunde inte aktivera/avaktivera utdata för sessionen toDebugText Invalid start of code Ej gilltig början av kod toDebugWatch Can't parse location Kan inte få fram position toDebugWatchUI Add variable watch Lägg till variabel Cancel Avbryt &Ok &Ok &Variable name &Variabel namn Variable name to watch. Variabel namn. &Scope &Scope &Local &Lokal Currently running scope. Nuvarande scope. &Body Scope &Implementation Scope The scope of the file in the body editor. Samma scope som filen in implementationseditorn. &Head Scope &Deklarations Scope Currently package or type scope. Nuvarande packet eller typ scope. &Global &Global Global scope of variable. Globalt scope för variabler. &Autodetect &Package toEditExtensionGotoUI Go to line &Ok &Ok &Cancel Line Number toEditExtensionSetupUI Form1 &Right align keywords in each statement. Juste&ra nyckelord till höger i varje statement. Insert a &newline after each block Lägg till &nyrad efter varje block Place THEN, LOOP, AS and IS on new line at b&eginning of new block Plac&era THEN, LOOP, AS och IS på ny rad vid början av nya block Place &comma on new line before item instead of after on same line Pla&cera komma på ny rad före nästa del i stället för efter på samma rad som föregående &Expand spaces to tabs when indenting &Expandera mellanslag till tabbar vid indentering Transform spaces to tabs whenever posible when indenting. Transformera mellanslag till tabbar om möjligt vid indentering. Put spaces around operators Lägg till mellanslag runt operatorer Insert extra spaces between operators. Lägg till extra mellanslag mellan operatorer. Transform keywords to &uppercase Transformera nyc&kelord till versaler &Indentation level &Indenterings nivå &Same line comment column Kolumn för kommentarer på &samma rad Example Expempel Auto indent read only SQL text editors Auto indenterad ej redigerbar SQL toEditExtensionTool Forward Framåt Backward Bakåt Incremental Search Inkrementel Sökning Selection Urval Editor Editor Obfuscate Selection Obfuscera Urval Obfuscate Editor Obfuscera Editor Auto Indent Auto Indentering Indent Block Indentera Block De-indent Block Avindentera Block Indent block in editor Indentera block i editor De-indent block in editor Avindentera block i editor Upper Versaler Lower Gemener Modify Case Ändra versaler Ctrl+S Edit|Incremental search forward Ctrl+R Edit|Incremental search backward Ctrl+Alt+I Edit|Indent selection Ctrl+Alt+Shift+I Edit|Indent editor Ctrl+U Edit|Uppercase Ctrl+L Edit|Lowercase Alt+Right Edit|Indent block Alt+Left Edit|De-indent block Goto Line toExtract Failed to extract owner and name from (%1), internal error %2 Kunde inte få fram ägare och namn från (%1), internt fel %2 CREATE ÅTERSKAPA Creating create script Genererar återskapnings skript Creating script Genererar script Creating script was cancelled Skriptgenerering avbruten Internal error, missing : in object description Internt fel, saknar : i objektbeskrivning Invalid type %1 to create Felaktig typ %1 för återskapning Create Återskapa Creating description Genererar beskrivning Describe was cancelled Beskrivning avbruten Invalid type %1 to describe Felaktig typ %1 att beskriva Describe Beskriv DROP RADERA Creating drop script Genererar raderings skript Creating drop script was cancelled Generering av raderings skript avbruten Invalid type %1 to drop Felaktig typ %1 att radera Drop script Raderingsskript Invalid describe context (<3 parts) "%1") Felaktig kontext (<3 delar "%1) Object list not available in migration Objektlista ej tillgänglig för migrering MIGRATE MIGRERING Creating migration script Skapa migreringsskript Invalid type %1 to migrate Felaktig typ %1 för migrering Migration script Migrationsskript REM This DDL was reverse engineered by REM TOra, Version %1 REM REM at: %2 REM from: %3, an %4 %5 database REM REM on: %6 REM REM Denna DDL var återskapad av REM TOra, Version %1 REM REM tid: %2 REM från: %3, en %4 %5 databas REM REM på: %6 REM REM Generating free space report for: REM REM Genererar rapport över fritt utrymme REM REM Generating %1 statement for: REM Genererar %1 statement för: Error in toExtract Operation: %1 Object: %2 Error: %3 Fel i toExtract: Operation: %1 Objekt: %2 Fel: %3 Malformed resize string (Should contain multiple of 3 number of ':') Cancel Avbryt More than one definition for column %1 Same kind of definition existing more than once for column %1 toGetSessionType Failed to find style match Kunde inte hitta stil toGlobalSettingUI toGlobalSettingUI Paths Bibliotek &Custom SQL Egen S&QL Browse Leta &Plugin directory &Plugin bibliotek Directory where to find plugins when starting tora. Bibliotek där plugin ligger när TOra startar. &Help directory &Hjälp bibliotek Default session Standardsession What session to use by TOra when saving session. Vilken fil som default skall användas när TOra sparar sessionen. Options Val &Save passwords &Spara lösenord Remember the last password you used to connect. Will leave the password unencryptet in the config file. Kom ihåg lösenorden du använder när du ansluter. Kommer lämna lösenorden okrypterade i programmets konfigurationsfil. Include DB in caption Inkludera databas i titel Include database connection in window captions Inkludera databas anslutnigen i fönstrets titel Change current connection with active window Ändra nuvarande anslutning med aktivt fönster Change currently select connection to the connection of the new active window Ändra nuvarande vald anslutning till den anslutning som är det aktiva fönstret har Connect history Anslutningshistorik Number of connections to save in history. Antal olika anslutningar som skall sparas historiskt. Message history Meddelandehistorik Number of status messages to save in the message history. Antal statusmeddelanden som skall sparas i meddelandehistoriken. seconds sekunder Status &message Status&meddelande The time in seconds temporary messages will be displayed in the status bar. 0 menas keep. Hur länge tillfälliga meddelanden visas i statusraden. Om du väljer 0 betyder det att de skall behållas tills nästa. Display alerts in statusbar only Visa meddelande enbart i statusrad Display alerts in messagebar instead of poping up a dialog with a warning. Visa meddelanden enbart i statusraden i stället för att poppa upp en dialogruta för att visa den. Tools toolbar on left Verktygsrad till vänster Start using the tools toolbar on the left of the main window instead of at the top. Placera verktygsraden tll vänster av fönstret istället för överst. Maximize window on start Maximera fönstret vid uppstart Restore session on startup Återställ session vid start &Desktop aware &Skrivbordsmedveten Colors get really weird in KDE if you select this. Färger kan bli riktigt fel i KDE om du väljer detta. &Antialiase fonts &Avrunda typsnitt Use antialiase fonts if Qt supports this. You need to restart tora for this to take affect. Använd "antialiase" typsnitt om Qt stödjer detta. Du måste starta om för att detta skall verka. Docks use toolbars Docks använder verktygsrad Check this if docks are to use toolbars instead of normal frames. Välj denna om dockade fönster skall använda verkygsrader i stället för vanliga fönster. &Style &Stil The style to use for the user interface. Vilken stil som skall användas på användarinterfacet. Size Unit Storleksenhet Define the unit sizes should be displayed in tora. Definierar vilken storleksenhet som skall visas i TOra. Bytes Bytes KB KB MB MB Text Text Tab delimited Tabbar CSV CSV HTML HTML Default list format Standard listformat &Refresh &Uppdatera Default refreshtime in tools. Standard uppdateringstid i verktyg. Chart samples Diagram mätpunkter Number of samples to keep in line and barcharts by default. Antal mätpunkter som skall sparas i diagram som standard. Unlimited Obegränsat Save unlimited number of samples. Can large amounts of consume memory. Spara obegränsat antal mätpunkter. Kan ta upp stora mängder interminne. Display samples Visa mätpunkter Number of samples to display in line and barcharts by default. Antal mätpunkter som skall visas i linje och stapeldiagram som standard. All Alla Display all available samples Visa alla tillgängliga mätpunkter Check for upgrades on startup Titta efter uppgraderingar vid uppstart Check the TOra webpage for upgrades to the program. Does not send any information about the users computer or TOra installation. Kontakta TOra hemsida om uppgraderingar kommit till programmet. Sänder ingen information angående användarens dator eller TOra installationen. Translation Översättning Which translation locale to use for this program. Must restart to have effect. Vilken översättnings locale som skall användas för programmet. Måste starta om för innan det får effekt. &Cache directory &Cache bibliotek Use Disk Caching Använd disk cache Use Disk Caching of ObjectLists and Synonyms Använd disk cachning av objektlista och synonymer Directory where to find plugins when starting. Bibliotek som plugins finns när du startar. Directory where to place cached dataaseinformation. Bibliotek att spara databas cache. Directory where to find help files. Bibliotek där hjälpfiler finns. Default session to use when saving a session. Standard filnamn att spara session. Use antialiase fonts if Qt supports this. You need to restart for this to take affect. Använd antialias typsnitt om Qt stöder det. Du måste starta om för att ändringar skall få effekt. Define the unit sizes should be displayed. Definiera enheted som storlekar skall visas med. toHelp Help Navigation Hjälp Navigering Contents Innehåll Search Sök All manuals Alla manualer Result Resultat Manual Manual TOra Help Browser TOra Hjälpläsare Backward one help page Tillbaka en sida Forward one help page Framåt en sida TOra manual TOra manual Missing parent, unbalanced dl in help file content Saknar parent, obalanserade <dl> i hjälpfilens innehåll Help window Hjälpfönster Help Browser Hjälpnavigerare F1 Dialog|Help toHelpAddFileUI Add help directory Lägg till bibliotek &Browse &Leta Canel Avbryt &Ok &Ok &Table of contents file &Innehållsfil &Title &Titel toHelpPrefs File error Filfel toHelpSetupUI Form1 Add manuals from an Oracle index page. Lägg till manualer från Oracle indexsida. Add manuals from an Oracle index page. This is the index page that links to the actual manuals. Not the master index page that links to different categories of manuals. Lägg till manualer från Oracle index sida. Detta är den sidan som har länkarna till själva manualerna. Inte förstasidan som länkar till de olika kategorierna av manualer. Title Titel Filename Filnamn &Add Manual &Lägg Till Manual &Remove Manual &Ta Bort Manual &Oracle Manuals &Oracle Manualer toHighlightedText Ctrl+T Edit|Table lookup toHtml Invalidly went beyond end of file Fortsatte felaktigt bortom slut på fil Reading HTML after eof Läser HTML fil efter slut på filen Lone < at end Ensamt < på slutet Unended tag at end Oavslutad tag på slutet Unended tag qualifier at end Oavslutat tag attribut på slutet Unended tag qualifier data at end Oavslutat tag attributdata på slutet Unended quoted string at end Oavslutat sträng på slutet Unended qualifier data at end Oavslutat attribut på slutet Exceeded qualifier max in toHtml Attribut överskred max i toHtml Tried to access string out of bounds in mid (start=%1) Försökte komma åt sträng utanför dess gränser i mid (start=%1) Tried to access string out of bounds in mid (size=%1) Försökte komma åt sträng utanför dess gränser (storlek=%1) Tried to access string out of bounds in mid (total=%1+%2>%3) Försökte komma åt sträng utanför dess gränser (total=%1+%2>%3) toImport Import & Export Execute Exekvera Select schema Select table Couldn't open file Kunde inte öppna fil Couldn't load codec %1 Supplied more than one parameter for field function Need parameter for column (%1) but none specified Inserted %1 rows Tried to define same field twice Not mapped Field %1 Invalid input, non space character between delimiter that is not separator toImportUI Form1 Operation Operation &Import &Export &Browse &Leta Fileformat Fixed width Delimiter Avskiljare , " Separator Separator Variable width Database Databas Schema Schema Table Tabel Define filter Options Include column names as first row File codec Ignore lines Commit distance Commit avstånd Preview Förhandsgranskning Column mapping toInvalid Invalid Objects Ogiltiga Objekt Refresh list Uppdatera lista &Refresh &Uppdatera &Invalid &Ogiltig Recompile all Kompilera om allt Recompiling all invalid Kompilera om alla felaktiga paket Cancel Avbryt Recompile selected Kompilera om urval F5 Invalid|Refresh toInvalid:ListInvalid Owner Ägare Object Objekt Type Typ toKeyPath Couldn't find \ in path Kunde inte hitta \ i sökväg toKeyValue Couldn't find \ in path Kunde inte hitta \ i sökväg toLicense Register Registrera Quit Avsluta Continue Fortsätt Not a valid license key Ingen giltig licensnyckel Please check your name and registration key? Kontrollera ditt namn och din registreringsnyckel? Ok Ok Really quit? Vill du verkligen avsluta? Are you sure you want to quit? Är du säker på att du verkligen vill avsluta? Yes Ja No Nej toLicenseUI This version of TOra is unregistered. Denna version av TOra är ej registrerad. 3 3 1 1 2 2 &Registration key &Registrera nyckel &Name &Namn toLineChart Zoom Zoom &Print... &Skriv ut... &Open in new window &Öppna i nytt fönster &Chart Manager... &Diagramhanterare... &Properties... &Egenskaper... Clear Chart Rensa diagram Enabled charts Slå på diagram TOra TOra toLineChartSetupUI Chart setup Diagram inställningar Number of samples to keep Antal mätvärden som skall behållas Y-axis Y-axel Max value Maxvärde Min value Minvärde Auto detect Autodetektera Show last value Visa sista värde Show axis legend Visa axlars titlar Show chart legend Visa mätvärdestitlar &Ok &Ok Cancel Avbryt All Uppdatera Maximum number of samples to display Maximalt antal mätvärden som visas Unlimited Obegränsat Divide chart in grids? Dela in diagram i rutnät? toListView Page: %1 Sida: %1 Printing page %1 Skriver ut sida %1 Done printing Utskrift klar Display in editor... Visa i editor... &Copy field &Koperira fält Copy selection Kopier urval Copy selection with header Kopiera urval med huvud Copy transposed Copier transposerad Select all Välj alla Export to file... Exportera till fil... Edit SQL... Editera SQL... Left Vänster Center Mitten Right Höger Alignment Justering toLock The mutex function "%1" failed toLogOutput SQL Output SQL Utdata Log4PL/SQL Log4PL/SQL toMain &New Connection... &Ny anslutning... &Close Connection St&äng Anslutning &Commit Connection Anslutning &Commit &Rollback Connection Anslutning &Rollback C&urrent Connection N&uvarande Anslutning Stop All Queries Stanna Alla Frågor Reread Object Cache Läs Om Objekt Cache &Open File... &Öppna Fil... &Save &Spara Save A&s... Spara &Som... Open Session... Öppna Session... Save Session... Spara Session... Restore Last Session Återställ Senaste Session Close Session Stäng Session &Print... Skriv &Ut... &Quit &Avsluta &File &Fil &Undo &Ångra &Redo G&ör Om Cu&t Klipp U&t &Copy &Kopiera &Paste K&listra In &Search && Replace... &Sök && Ersätt... Search &Next Sök &Nästa Select &All Markera &Allt Read All &Items L&äs Alla Poster &Options... &Inställningar... &Edit &Redigera Application Applikation Load file into editor Läs in fil i editor Save file from editor Spara fil till editor Print Skrit ut Undo Ångra Redo Gör Om Cut to clipboard Klipp Ut Copy to clipboard Kopiera Paste from clipboard Klistra In Search & replace Sök & Ersätt Tools Verktyg C&urrent Context... N&uvarande Kontext... &Contents... &Innehåll... &About TOra... &Om TOra... &License... &Licens... &Quotes... &Citat... &Register... &Registrera... Connections Anslutningar Connect to database Anslut Till Databas Disconnect current connection Stäng Nuvarande Anslutning Commit connection Anslutning Commit Rollback connection Anslutning Rollback Stop all running queries on connection Stanna alla aktiva frågor på anslutning &Tools &Verktyg C&lose St&äng Close &All Stäng &Alla &Cascade &Kaskad &Tile S&tapla &Window F&önster &Help &Hjälp Check for upgrades? Titta efter uppdateringar? Do you want TOra to automatically check http://tora.sourceforge.net for updates on startup? During this check no information about your computer including TOra version is transmitted to the site Vill du att TOra automatiskt skall kontrollera http://tora.sourceforge.net för uppdateringar vid start av programmet. Under denna kontroll skickas ingen information om din dator inklusive version eller platform av TOra till Quest Software, Inc &Yes &Ja &No &Nej First connection Första anslutning Can't find active connection Kan inte hitta aktiv anslutning Commit work in session to %1 before closing it? Spara ändringar på session %1 innan den stängs? Commit work? Spara arbete? Couldn't find specified connectionts (%1) Kunde inte hitta angiven anslutning (%1) Row: Rad: Col: Kolumn: Invalid session file Felaktig sessionsfil The session file is not valid, can't read it. Sessionsfilen är inte giltig. Kan inte läsa den. Input password Ange lösenord Enter password for %1 Ange lösenord för %1 Message flood, temporary disabling of message box error reporting from now on. Restart TOra to reenable. You probably have a too high refreshrate in some tool. Meddelande överbelastning. Stänger tillfälligt av meddelanden i dialogruta från och med nu. Starta om TOra för att börja visa igen. Du har troligtvis en för hög uppdateringshastighet i något verktyg. Information Information You can enable this through the Global Settings in the Options (Edit menu) Du kan sätta på detta genom Globala Inställningar i Inställningar (Redigeringsmenyn) A new version of TOra (%1) is available from http://tora.sourceforge.net A ny version av TOra (%1) finns att hämta från http://tora.sourceforge.net Cancel Avbryt Message flood, temporary disabling of message box error reporting from now on. Restart to reenable. You probably have a too high refreshrate in some tool. Meddelande överbelastning, temporärt stängt av meddelandebox felrapportering från och med nu. Starta om för att slå på igen. Du har troligtvis för hög updateringsfrekvens i något verktyg. Ctrl+G File|New connection Ctrl+O File|File open Ctrl+W File|File save Ctrl+Shift+C File|Commit Ctrl+J File|Stop all Ctrl+< File|Rollback Ctrl+Shift+U File|Current connection Ctrl+Insert Edit|Copy Shift+Delete Edit|Cut Shift+Insert Edit|Paste Ctrl+A Edit|Select all Ctrl+Z Edit|Undo Ctrl+Y Edit|Redo Ctrl+X Edit|Cut Ctrl+C Edit|Copy Ctrl+V Edit|Paste Ctrl+F Edit|Search F3 Edit|Search next F1 Help|Help toMarkedText TOra TOra Printing page %1 Skriver ut sida %1 Done printing Utskrift klar Page: %1 Sida: %1 File opened successfully Filen öppnad Save changes? Spara ändringar? The editor has been changed, do you want to save them before opening a new file? Editorn har ändrats, vill du spara dem innan du öppnar en ny fil? &Yes &Ja &No &Nej Incremental search Inkrementell sökning Cancel Avbryt Ctrl+A Edit|Select All toMemoEditor Memo Editor Memo Editor Save changes Spara ändringar Open file Öppna fil Save file Spara fil Cut to clipboard Klipp ut Copy to clipboard Kopiera Paste from clipboard Spara First column Första kolumnen Previous column Föregående kolumn Next column Nästa kolumn Last column Sista kolumnen NULL NULL Ctrl+Return Memo Editor|Save changes toMessageUI TOra warning message TOra varningsmeddelande &Ok &Ok Display alerts in statusbar only. Visa meddelanden endast i statusraden. Display alerts in messagebar instead of poping up a dialog with a warning. Visa meddelanden endast i meddelanderaden i stället för att öppna en dialogruta med varningen. Message Meddelande Warning message Varningsmeddelande toMySQLExtract Expected block from show create table for %1.%2 Internal error, couldn't parse ALTER TABLE clause Invalid type %1 to create Invalid type %1 to describe Invalid type %1 to drop Invalid type %1 to migrate Felaktig typ %1 för migrering toNewConnection Provider Typ Host Värddator Database Databas Username Användarnamn No connection provider Ingen databastyp No available connection provider, plugins probably missing Ingen tillgänglig databastyp, troligtvis saknas plugin Unable to connect to the database. Kan inte ansluta till databas. Unable to connect to the database Kan inte ansluta till databasen Enter password Ange lösenord Enter password to use for connection. Ange lösenord för anslutningen. toNewConnectionUI New connection Ny anslutning &Ok &Ok &Previous connections F&öregående anslutningar &Username &Användarnamn Username to connect with Användar namn att ansluta med &Password L&ösenord Password to connect with. Lösenord att ansluta med. Connection provider Databastyp Use &SQL*Net Använd &SQL*Net Wether or not connect using the listener or directly to a local database. Om man skall ansluta via lyssnaren eller direkt till en lokal databas. &Connection Mode &Anslutningsmod Mode of the connection. If you don't understand select normal. Anslutningsmod. Om du inte förstår det, välj normal. &Database &Databas Select the database ID to connect to. Välj eller ange det databas ID som du vill ansluta till. &Host &Värddator Cancel Avbryt A list of previous connections. Select to bring over to the right. En lista över föregående anslutningar. Välj en post för över information till höger. toNoBlockQuery Unknown exception Reading past end of query Läste efter slutet på frågan Couldn't open query Kunde inte öppna frågan Failed to start background query thread Kunde inte start backgrundsfrågans tråd Restarting query in own connection Återstartar fråga i egen anslutning toNow Unexpected error Oväntat fel toOracleConnection Password expired Lösenord utgånget Enter new password Ange nytt lösenord Enter password again for confirmation Ange nytt lösenord igen The two passwords doesn't match De två lösenorden stämmer inte toOracleExtract Couldn't find source for of %1.%2 Kunde inte hitta källa för %1.%2 Displaying source of wrong type for %1. Got %2 expected 0. Visar källkod av fel typ för %1. Fick %2, förväntade 0. -- Context indexes can be quite complicated depending upon the -- used parameters. The following is an attempt to recreate this -- context index. But, a close scrutiny of the following code is -- strongly recommended. -- Kontext index kan vara ganska komplexa beroende på om de -- använda parametrarna. Följande är ett försök att återskapa detta -- kontext index. Men nogram kontroll är starkt rekommenderad. Couldn't find primary key of %1.%2 Kunde inte hitta primär nyckel %1.%2 Couldn't find materialised table %1.%2 Kunde inte hitta materialiserad tabell %1.%2 Couldn't find log %1.%2 Kunde inte hitta logg %1.%2 Couldn't find index partitions for %1.%2 Kunde inte hitta index partitioner för %1.%2 Couldn't find partition range %1.%2 Kunde inte hitta partitions del %1.%2 Internal error, result should be 18 in segment attributes (Was %1) Internal error, result should be 18 in segment attributes Constraint %1.%2 doesn't exist Constraint %1.%2 finns ej DBLink %1.%2 doesn't exist DBLink %1.%2 finns inte Exchange index %1.%2 doesn't exist Utbytesindex %1.%2 finns ej Exchange table %1.%2 doesn't exist Utbytesindex %1.%2 finns ej Couldn't find index %1.%2 Kunde inte hitta index %1.%2 Couldn't find profile %1 Kunde inte hitta profil %1 Couldn't find role %1 Kunde inte hitta rollen %1 Couldn't find sequence %1 Kunde inte hitta sekvensen %1 Couldn't find synonym %1.%2 Kunde inte hitta synonymen %1.%2 Couldn't find table %1.%2 Kunde inte hitta tabellen %1.%2 Couldn't find tablespace %1 Kunde inte tablespace %1 Couldn't find trigger %1.%2 Kunde inte hitta trigger %1.%2 Couldn't find user %1 Kunde inte hitta användare %1 Couldn't find constraint %1.%2 Kunde inte hitta constraint %1.%2 Missing ON description item on index Saknar ON beskrivnings post i index Couldn't find any COLUMN on index Kunde inte hitta någon COLUMN på index Invalid type %1 to create Felaktig typ %1 för återskapande Invalid type %1 to describe Felaktig typ %1 för beskrivning Invalid type %1 to drop Felaktig typ %1 för borttagning Couldn't find view %1.%2 Kunde inte hitta vy %1.%2 toOracleSettingUI Form1 &Default date format Standard &datum format The default dateformat to use when querying the database. Standard format för datom som används när data läses till eller från databasen. &Checkpoint name &Checkpoint namn The name of the checkpoint used when needed to rollback work. Namnet på en checkpoint som kan användas när TOra behöver göra rollback på ändringar. &Max long and LOB data length &Max long och LOB data storlek Max length to read from LOB or LONG data fields. LONG:s can not be specified unlimited but will be defaulted to 33000 if unlimited. Max längd som läses från LOB eller LONG data fält. LONG kan inte anges som obegränsad utan kommer bli 33000 om obegränsad är vald. Unlimited Obegränsad Create Table Skapa Tabell &Explain plan table F&örklara plan tabell Name of the table to put explain plan output in. Namn på tabellen som planförklaringar skall läggas i. &Keep plans S&para planer Keep records for the plan explanations in the plan table. Spara förklarade planer i plan tabellen. Maximum cursors to keep open Maximala andel öppna frågor som kan hållas öppna toOutput SQL Output SQL Utdata Poll for output now Kontrollera om ny data finns nu Enable or disable getting SQL output. Slå av eller på SQL utdata kontroller. Clear output Rensa utdata Refresh Uppdatera &Refresh &Uppdatera Output enabled Utdata påslagen &Change Refresh &Ändra Uppdatering &Output &Utdata Couldn't enable/disable output for session Kunde inte slå av eller på utdata för sessionen F5 Output|Refresh F4 Output|Enable Ctrl+Backspace Output|Clear output Alt+R Output|Change refresh toOutputPrefs SQL Output SQL Utdata &Polling timeout &Updatera Time between trying to poll for output. Tid mellan varje kontrol om ny data finns tillgänglig. Default &source &Standard källa Log4PL/SQL &User Log4PL/SQL &Användare toParamGet Define binding variables Definiera bundna variabler Cancel Avbryt Missing field name Saknar fältnamn NULL NULL Edit Editera Aborted execution Avbruten exekvering &Ok &Ok toPasswordTool Enter new password Ange nytt lösenord Enter new password again for confirmation Ange nytt lösenord igen för konfirmation Passwords doesn't match Lösenord stämmer inte överens The two givens passwords doesn't match, please try again De två angivna lösenorden stämmer ej överens, försök igen toPieChart &Print... &Skriv ut... &Open in new window &Öppna i nytt fönster All values are 0 in this chart Alla värden är 0 i detta diagram TOra TOra toPreferences Global Settings Globala Inställningarna Editor Settings Editor Inställningar Database Settings Databas Inställningar Tools Verktyg toPreferencesUI Preferences Inställlningar &Ok &Ok Cancel Avbryt &Help &Hjälp toProfiler Refresh list Uppdatera lista Repeat run Kör om Comment Kommentar Unknown Okänd Run profiling in background Kör profiling i backgrunden Execute current profiling Kör nuvarande profiling Script Skript Result Resultat Profiler tables doesn't exist Profiltabeller saknas &Yes &Ja &No &Nej Select run Välj körning %1 runs %1 körningar Something went wrong collecting statistics Någonting gick fel när statestik hämtades PL/SQL Profiler PL/SQL Profiler Profiler tables doesn't exist. Should TOra try to create them in the current schema? Profiltabellerna finns inte. Skall TOra försöka skapa om dem i nuvarande schema? toProject SQL Project SQL Projekt Add file to project Lägg till fil till projekt Remove file from project Ta bort fil från projekt SQL project SQL projekt Save project Spara projekt Add new subproject Lägg till nytt underprojekt Generate SQL for this project Generera SQL för detta projekt Move up in project Flytta upp i projekt Move down in project Flytta ner i projekt File Fil Size Storlek untitled.tpr okänd.tpr -- Start of project %1 -- Start av projekt %1 -- Start of file %1 -- Start av fil %1 toQValue Unknown type of query value Okänd typ av frågeresultat toQuery Query aborted Frågan avbruten toReadFile Couldn't open file %1. Kunde inte öppna fil %1. Encountered problems read configuration Uppstod problem med att läsa konfigurationsfil Couldn't download file Kunde inte ladda ner fil toRefreshCreate None Ingen 2 seconds 2 sekunder 5 seconds 5 sekunder 10 seconds 10 sekunder 30 seconds 30 sekunder 1 min 1 min 5 min 5 min 10 min 10 min toRefreshParse Unknown timer value Okänt tidtagarvärde toReport <H4>COLUMNS</H4> <TABLE WIDTH=100% BORDER=0><TR><TH ALIGN=left WIDTH=25%>Name</TH> <H4>COLUMNER</H4> <TABLE WIDTH=100% BORDER=0><TR><TH ALIGN=left WIDTH=25%>Namn</TH> <TH ALIGN=left WIDTH=25%>Definition</TH> <TH ALIGN=left WIDTH=25%>Definition</TH> <TH ALIGN=left WIDTH=50%>Description</TH> <TH ALIGN=left WIDTH=50%>Beskrivning</TH> <HTML><HEAD><TITLE>Report on database %7</TITLE></HEAD> <BODY><H1>Report on database %8</H1> <TABLE BORDER=0> <TR><TD VALIGN=top>Generated by:</TD><TD VALIGN=top>TOra, Version %1</TD></TR> <TR><TD VALIGN=top>At:</TD><TD VALIGN=top>%2</TD></TR> <TR><TD VALIGN=top>From:</TD><TD VALIGN=top>%3, an %4 %5 database</TD></TR> <TR><TD VALIGN=top>On:</TD><TD VALIGN=top>%6</TD></TR> </TABLE> <HTML><HEAD><TITLE>Rapport på databas %7</TITLE></HEAD> <BODY><H1>Rapport på databas %8</H1> <TABLE BORDER=0> <TR><TD VALIGN=top>Genererad av:</TD><TD VALIGN=top>TOra, Version %1</TD></TR> <TR><TD VALIGN=top>Tid:</TD><TD VALIGN=top>%2</TD></TR> <TR><TD VALIGN=top>Från:</TD><TD VALIGN=top>%3, en %4 %5 databas</TD></TR> <TR><TD VALIGN=top>På:</TD><TD VALIGN=top>%6</TD></TR> </TABLE> <H1>Global Objects</H1> <H1>Globala Objekt</H1> <H1>Public</H1> <H1>Publika</H1> <H1>Schema %1</H1> <H1>Schema %1</H1> toResultBar Edit SQL... Editera SQL... toResultCols Default value: <B> Standard värde: <B> Distinct values: <B> Distinkta värden: <B> Low value: <B> Lägsta värde: <B> High value: <B> Högsta värde: <B> Density: <B> Täthet: <B> Number of nulls: <B> Antal nullvärden: <B> Number of histogram buckets: <B> Antal histogram hinkar: <B> Last analyzed: <B> Senast analyserad: <B> Sample size: <B> Urvalsstorlek: <B> Average column size: <B> Medelkolumnstorlek: <B> </B> synonym for <B> </B> synonym för <B> (Object cache not ready) (Objekt cache ej redo) toResultCols::resultCols Column Name Kolumnnamn Data Type Datatyp Comments Kommentar Description of %1 Beskrivning av %1 Failed to describe %1 Kunde inte beskriva %1 Description of %1.%2 Beskrivning av %1.%2 toResultConstraint Constraint Name Constraint Namn Condition Vilkor Enabled Påslaget Delete Rule Borttagningsregel Generated Genererad toResultContent Content editor Innehållseditor Define filter for editor Definiera filter för editor Remove any filter Ta bort alla filter Add a new record Lägg till ny post Save changes Spara ändringar Discard changes Ta bort ändringar Delete current record from table Ta bort nuvarande post från tabellen Go to first row Gå till första raden Go to previous row Gå till föregående rad Go to next row Gå till nästa rad Go to last row Gå till sista rad Toggle between table or single record editing Växla mellan tabell eller enkel post editering Remove filter Ta bort filter Remove the filter for this table only or for all tables. Ta bort filter för denna tabell enbart eller alla tabeller. &All &Alla &This &Denna Cancel Avbryt Duplicate an existing record toResultContentEditor &Display in editor... &Visa i editor... &Copy field &Kopiera fält &Paste field K&listra in fält Copy selection Kopiera urval Copy selection with header Kopiera urval med huvud Copy transposed Kopiera transposerad &Delete record &Ta bort post Select all Välj alla Export to file... Exportera till fil... Read all Läs alla Can't use these on toResultContent Kan inte använda dessa på toResultContent Unsaved data in contents, select other row to store Ej sparad data finns, välj annan rad för att spara Reading all values, moving cursor to end when done Läser alla värden, flyttar markör till slutet när inläsning är klar Edit cancelled Editering avbruten This table contains only LOB/LONG columns and can not be edited Denna tabell innehåller enbart LOG/LONG kolumner och kan inte bli editerad No changes made Inga ändringar gjorda Saved row Sparade rad Content of %1.%2 Innehåll av %1.%2 toResultContentFilterUI Content editor filter settings Filterinställningar för innehållseditor Ok Ok Cancel Avbryt Selection &criteria Urvals &kriterium Selection criteria to use getting items to edit. Same as after where in a select clause. Val av kriterium att använda för att ange vilka poster som skall editeras. Samma format som efter "where" i en "select"-sats. Sort &order. Separate columns with comma. Sorterings &ordning. Separera kolumner med komma. The sort order to use when retreiving data from the database. Sorteringsordning att använda när poster läses från databasen. Table &columns Tabell &kolumner Available column names in table. Tillgängliga kolumner i tabellen. Use for all tables Använd för samtliga tabeller toResultContentSingle Edit Editera Internal error, save different row than current in content editor toResultDepend Owner Ägare Name Namn Type Typ Dependency Beroende toResultExtract Object not found Objektet finns ej toResultIndexes Index Name Indexnamn Columns Kolumner Type Typ Unique Unik toResultLine Edit SQL... Editera SQL... toResultListFormat Text Text Tab delimited Tabseparerad CSV CSV HTML HTML toResultListFormatUI Choose format Välj format Cancel Avbryt &Ok &Ok &Choose format of exported file. &Välj format för exporterad fil. Separator Separator Delimiter Avskiljare toResultLock Session Session Schema Schema Osuser OS användare Program Program Type Typ Mode Mod Request Förfrågan Object Objekt Grabbed Tagen Requested Efterfrågad toResultLong Will not reexecute same query Kör inte om samma fråga %1 rows processed %1 rader bearbetade Query executed Fråga exekverad Statement executed Sats exekverad Can only hide last column in query Kan bara gömma sista kolumnen i frågan toResultObject Internal error, toResult is not a descendant of toResult toResultParam Parameter editor Parameter editor Display hidden parameters. This will only word if you are logged in as the sys user. Visa gömda parametrar. Detta kommer endast fungera om du är inloggad som användaren sys. Generate pfile Generera pfil Apply changes to system Spara ändringar till systemet Apply changes to session Spara ändringarna till sessionen Drop current changes Radera nuvarande ändringar Changed Ändrad # Generated by TOra version %1 # Genererad av TOra version %1 toResultParam:ListParam Parameter Parameter Value Värde Changed Ändrad Description Beskrivning toResultPlan Operation Operation Options Inställningar Object name Objektnamn Mode Mod Cost Kostnad Bytes Bytes Cardinality Kardinalitet Plan table doesn't exist Plan tabellen finns inte Specified plan table %1 didn't exist. Should TOra try to create it? Angivna plan tabellen %1 fanns ine Skall TOra försöka skapa den? &Yes &Ja &No &Nej toResultReferences Owner Ägare Object Objekt Constraint Condition Vilkor Enabled Påslaget Delete Rule Raderingsregel foreign key (%1) references %2.%3(%4) DEPENDENCY Beroende toResultResources:Information Sorts Sorteringar Parse Parse Disk Reads Disk läsningar Buffer Gets Bugger Hämtningar Rows Processed Rader Bearbetade Executions Exekveringar Loads Laddningar First Load Time Första Inläsningstid Parsing User Id Bearbetande Användar ID Parsing Schema Id Bearbetande Schema ID Users Executing Användare Som Kört Users Opening Användare Som Öppnat Open Versions Öppna Versioner Sharable Mem Delat Minne Kept Versions Sparade Versioner Persistent Mem Behållt Minne Optimizer Mode Optimeringsmod Loaded Versions Laddade Versioner Runtime Mem Körnings Minne Serializable Aborts Serielagda Avbrott Invalidations Invalideringar toResultStats Name Namn Value Värde Delta Delta Can't change session on system statistics Kan inte ändra session på systemstatestik toResultStorage Name Namn Status Status Information Information Contents Innehåll Logging Loggning Size (%1) Storlek (%1) Free (%1) Fritt (%1) Autoextend (%1) Autoutökning (%1) Used/Free/Autoextend Använt/Fritt/Autoutökning Available Tillgängligt Coalesced Sammanslaget Max free (%1) Max fritt (%1) Free fragments Fria Fragment toResultStorage Couldn't find tablespace parent %1 for datafile No tablespace selected Inget tablespace valt Weird, empty tablespace name No file selected Ingen fil vald Tablespace toResultView Can only hide last column in query Kan bara gömma sista kolumnen i fråga Reading all entries Läser alla poster Read All Läs Alla toRollback Rollback analyzer Rollback Hanterare Update segment list Updatera Segmentlista Take segment online Slå på segment Take segment offline Slå av segment Create new rollback segment Skapa nytt rollback segment Drop segment Ta bort segment Refresh Uppdatera Open Cursors Öppna Frågor Transaction Users Transkationsanvändare &Refresh &Uppdatera Online Påslagen Offline Avslagen Create segment... Skapa segment... &Change Refresh &Ändra uppdatering &Rollback &Rollback No segment selected Inget segment valt Drop rollback segment Ta bort rollback segment Are you sure you want to drop the segment %1. Är du säker på att du vill ta bort segmentet %1. &Drop &Ta bort Cancel Avbryt Enable snapshot too old detection. Slå på snapshot too old detektering. F5 Rollback|Refresh Alt+R Rollback|Change refresh toRollback:Information Segment Segment Owner Ägare Tablespace Status Status Transactions Transaktioner Initial (MB) Initial (MB) Next (MB) Nästa (MB) PCT Increase Current (MB) Nuvarande (MB) Optimal (MB) Used (MB) Använd (MB) Extents Antal Extent Current Nuvarande Block Block Blocks Block Reads Läsningar Hitrate Träffratio toRollback:TransactionUsers Rollback Seg Rollback Seg Session ID Sessions ID Os User OS Användare Oracle User Oracle Användare toRollbackDialog Storage Lagring No changes made Inga ändringar gjorda toRollbackDialogUI Modify tablespace Andra tablespace Display the SQL used to generate the specified object Visa SQL för att generera det angivna objektet &Public &Publik If this should be a publicly available rollback segment Om denna skall vara ett publikt rollback segment &Name &Namn &Tablespace &Tablespace Rollback Segment Rollback Segment &Ok &Ok Cancel Avbryt toRollbackOpen Started Startad User Användare Snapshot Snapshot SQL SQL toRollbackPrefs Rollback Tool Rollback Verktyg &Restart reexecuted statements Sta&rta om omexekverade satser Start statements again that have been reexecuted. Starta om satser som blivit exekverade igen. &Must read buffers &Måste lästa buffrar Don't display statements that have not read buffers. Visa inte satser som inte läser buffrar. &Exclude first appearance &Exkludera första visningen A statement must be visible at least two consecutive polls to be displayed. En sats måste synas åtminstånde två konsekutiva uppdateringar innan det visas. &Disregard start extent. &Bortse från start extent. Always start from the left border when displaying extent usage. Visa alltid från början av vänstra kanten när användandet av extent visas. &Enable snapshot too old detection. Slå på snapshot too old d&etektering. Enable snapshot too old detection, will put load on large databases. Slå på snapshot too old detektering, belastar stora databaser. toSGAStatement Couldn't find SQL statement in SGA Kunde inte hitta SQL sats i SGA SQL SQL Execution plan Exekverings plan Information Information toSGATrace SGA trace SGA spårning Fetch statements in SGA Hämta satser från SGA Schema Schema Any Valfri Refresh Uppdatera Type Typ SGA SGA Long operations Långa operationer Selection Urval All Alla Unfinished Oavklarade Top executions Top exekveringar Top sorts Top sorteringar Top diskreads Top diskläsningar Top buffergets Top bufferhämtningar Top rows Top rader Top sorts/exec Top sortering/exekvering Top diskreads/exec Top diskläsning/exekvering Top buffergets/exec Top bufferhämtning/exekvering Top rows/exec Top rad/exekvering &Refresh &Uppdatera Change &schema Ändra &schema Change &refresh Ändra &uppdatering Change t&ype Ändra t&yp &SGA Trace &SGA Spårning Unknown type of trace Okänd typ av spårning Unfinished is only available for long operations Oavklarade är endast tillgänglig för långa operationer Unknown selection Okänt urval Top buffers/row Top bufferhämtning/rad 1 execution, 1 parse 1 exekvering och 1 parsning F5 SGA Trace|Refresh Alt+S SGA Trace|Change schema Alt+R SGA Trace|Change refresh Alt+Y SGA Trace|Change type toSGATracePrefs SGA Trace SGA Spårning &Auto update &Auto updatera Update automatically after change of schema. Updatera automatiskt efter ändring av schema. toSMTP Connecting to %1 Ansluter till %1 Connected to %1 Ansluten till %1 Message sent Meddelande sänt Unexpected reply from SMTP server: Oväntat svar från SMTP server: toSQL Tried to get unknown SQL (%1) Försökte hämta okänt SQL (%1) Malformed tag in config file. Missing = on row. Felaktigt formaterad tag i konfigurationsfil. Saknar = på rad. Malformed line in SQL dictionary file. Two '[' before '=' Felaktig rad i SQL ordboksfil. Två '[' innan '=' Unknown escape character in string (Only \\ and \n recognised) Okänt tecken efter \. Endast \\ och \n tillåtna SQL Dictionary SQL Ordbok toSQLEdit SQL editor SQL editor Load SQL dictionary file Ladda SQL ordboks fil Save modified SQL to dictionary file Spara modifierad SQL tillbaka till ordboksfil Save this entry in the dictionary Spara denna post i ordboken Delete this version from the SQL dictionary Ta bort denna version från SQL ordboken Start new SQL definition Starta en ny SQL definition Text Name Text Namn Name Namn Database Databas Description Beskrivning Wrong format of version Fel format för version Should be database provider:version. Skulle vara databastyp:version. &Ok &Ok Should be database provider:version. Can't start with :. Skulle vara databastyp:version. Kan inte börja med :. Should be database provider:version. Can't end with the first :. Skulle vara databastyp:version. Kan inte sluta med det första :. Missing description Saknar beskrivning No description filled in. This is necessary to save SQL. Adding undescribed as description. Ingen beskrivning ifylld. Detta är nödvändigt för att spara SQL. Lägger till obeskrivd som beskrivning. Undescribed Obeskrivd Modified SQL dictionary Ändrade SQL ordboken Save changes into the SQL dictionary Spara ändringar i SQL ordboken &Yes &Ja &No &Nej Cancel Avbryt toSQLEditTool &Edit SQL... &Editera SQL... toSQLString SQL Address not found in SGA SQL adress ej funnen i SGA toSQLToAddress SQL Query not found in SGA SQL fråga ej funnen i SGA toSQLparse Unbalanced parenthesis (Too many ')') Obalanserade paranteser (För många ')') Unbalanced parenthesis (Too many '(') Obalanserade paranteser (För många ')') Internal error in toSQLParse, should never get here toSaveFilename File open password Lösenord för att öppna fil toScript Extraction and Compare Extrahering och Jämförelse Perform defined extraction Genomför definierad extrahering Search result Sökresultat Dropped Borttagen Created Skapad &Initial &Initial &Limit &begränsning &Next &Nästa No mode selected Ingen mod vald Destination shouldn't be enabled now, internal error Internal error, lastLevel < 0 All Alla Replacing existing size with new Ersätt existerande storlek med ny Same Samma None Ingen No filename specified Inget filnamn angivet Couldn't open file %1 Kunde inte öppna fil %1 Error writing to file %1 Fel vid skrivning till fil %1 -- Script generated to file %1 successfully -- Skript genererat till fil %1 gick bra rem Master script for DDL reverse engineering by TOra rem Huvudskript för DDL generering av TOra -- Scripts generate to directory %1 successfully -- Generering av skript till bibliotek %1 gick bra toScriptUI Form1 &Source K&älla Connection Anslutning Schema Schema All Alla Objects Objekt &Include objects &Inkludera objekt &Destination &Destination &Options &Inställningar Compare Jäämför Compare two databases or schemas Jämför två databaser eller scheman Extract Extrahera Extract script to recreate database objects. Extrahera skript för att återskapa databasobjekt. Include code specification Includera kodspecifikation Include storage specification Includera lagringsspecifikation Include content of tables Includera innehållet i tabeller Include parallel specification Includera parallell specifikation Include partition specification Includera partitionspecifikation Same Samma None Ingen Generated schema Generera schema Select the schema to generate in script Välj vilket schema som skall genereras i skript Include indexes Includera index Generate prompts Generera prompter Generate prompts to display progress in SQLPlus Generera prompter som visar körningen i SQLPlus Include comments Includera kommentarer Generate header Generera huvud Generate header at the top of the script Generera huvud i toppen av skriptet Include grants Includera rättigheter Include constraints Includera constraints Include DDL Includera DDL Search Sök Migrate Migrera Create database scripts to convert schema or database from source to destination Skapa databasskript som konverterar schema eller databas från källa till destination Report Rapport &Search &Sök Contain any words Innehåller valfritt ord Contain all words Innehåller alla ord RegExp RegExp Exact match Exakt träff Configuration Konfiguration Script Resize Ändra storlek Don't resize Ändra inte storlek Auto resize Automatisk storlek Custom resize Egen storlek Limit Begränsning Initial Initial Next Nästa &Add &Lägg till &Remove &Radera Resize Ändra storlek Result Resultat Difference Skillnad Output Utdata Output tab Utdata flik Output dir Till bibliotek Output to directory so that each object is placed in a different file with the objects file. Skriv till bibliotek så att varje objekt är placerat i enskilda filer. Output file Till fil Browse Leta Commit distance Commit avstånd The number of insertstatements to make between each commit (0 means whole table)b Antalet poster som skall skrivas in i databasen mellan varje commit (0 betyder hela tabellen) The number of insertstatements to make between each commit (0 means whole table) Antalet poster som skall skrivas in i databasen mellan varje commit (0 betyder hela tabellen) Output to directory so that each object is placed in a different file. Skriv till bibliotek så att varje objekt är placerat i enskilda filer. toSearchReplace No more matches found Inga mer träffar funna F1 Search|Help Ctrl+Shift+R Edit|Replace toSearchReplaceUI Search & Replace Sök & Ersätt &Search Top S&ök Från Början Search &Next Sök &Nästa &Replace &Ersätt Replace &All Ersätt &Alla Close Stäng Search Sök Exact Exakt Match text exactly as written Sök text exakt som skriven Match Word Enbart Hela Ord Only match whole words Hitta bara hela ord Ignore Case Ignorera Versaler RegExp RegExp Use RegExp semantics for matching (See Qt documentation) Använd RegExp semantik för träffar (Se Qt dokumentation) Replace Ersätt toSecurity Security manager Säkerhetshanterare Update user and role list Updatera användar och roll lista Save changes Spara ändringar Remove user/role Radera användare/roll Add new user Lägg till ny användare Add new role Lägg till ny roll Copy current user or role Kopiera nuvarande användare eller roll Display SQL needed to make current changes Visa SQL som krävs för att genomföra ändringar Users/Roles Användare/Roller &General Allm&änt &Roles &Roller &System Privileges &System Privilegier &Object Privileges &Objekt Privilegier &Quota Utr&ymme &Refresh &Uppdatera &Save changes &Spara ändringar &Remove user/role &Radera användare/roll Add &user Lägg till anv&ändare Add &role Lägg till &roll &Copy current &Kopiera nuvarande Display SQL... Visa SQL... &Security &Säkerhet No changes made Inga ändringar gjorda Save changes? Spara ändringar? Save the changes made to this user? Spara ändringarna gjorda på denna användare? Save Spara Discard Släng Cancel Avbryt Invalid security ID Felaktig säkerhets ID Roles Roller Are you sure? Är du säker? The user still owns objects, add the cascade option? Användare äger fortfarande objekt, lägg till kaskad valet? Yes Ja No Nej F5 Security|Refresh Ctrl+Return Security|Save changes Ctrl+Shift+U Security|Add user Ctrl+Shift+R Security|Add role Ctrl+Shift+O Security|Copy current F4 Security|Display SQL toSecurityObject Object Objekt Admin Administratör ON toSecurityQuota None Ingen Unlimited Obegränsat toSecurityQuotaUI Form1 Tablespace Quota Size Kvota Storlek Used Size Använt Utrymme &Unlimited &Obegränsat &None &Inget &Value &Värde Belongs to Resource group or has unlimited tablespace privilege Tillhör till resultgrupp eller har obegränsat tablespace rättigheter toSecurityRole Passwords don't match Lösenord stämmer inte The two versions of the password doesn't match De två versionerna av lösenorden stämmer inte Don't save Spara inte Cancel Avbryt toSecurityRoleGrant Role name Rollnamn Admin Administratör Default Standard ON YES JA toSecurityRoleUI Form2 &Name &Namn Enter Password Ange lösenord Confirm Password Godkänn lösenord &Password L&ösenord Role authenticated by the operating system Roll autentiserad av operativsystemet &External &Extern Role authenticated globally Roll autentiseras globalt &Global &Global No password required for role Inget lösenord krävs för roll None Ingen toSecuritySystem Privilege name Rättighetsnamn Admin Administratör ON NO NEJ toSecurityUser Passwords don't match Lösenord stämmer ej The two versions of the password doesn't match De två lösenorden stämmer ej överens Don't save Spara inte Cancel Avbryt toSecurityUserUI Form1 &Name &Namn P&rofile P&rofil Enter Password Ange Lösenord Confirm Password Konfirmera Lösenord Expire Password Nytt Lösenord &Password L&ösenord User authenticated by the operating system Användare authentiserad av operativsystem &External &Externt &X.500 External Name &X.500 Externt Namn &Global &Global &Temporary Tablespace &Temporärt Tablespace &Account Locked &Konto Låst &Default Tablespace Standar&d Tablespace toSemaphore The semaphore function "%1" failed Semaphorfunktionen "%1" har fallerat toSession Session manager Sessionshanterare Update sessionlist Uppdatera sessionslista All Alla No background Inga bakgrunds No system Inga system Enable timed statistics Slå på tidsstatestik Disable timed statistics Slå av tidsstatestik Disconnect selected session Bryt vald session Refresh Uppdatera Session wait states Sessions väntelägen Session I/O Sessions I/O Statistics Statestik Wait events Väntelägen Connect Info Anslutningsinfo Pending Locks Väntande Lås Locked Objects Låsta Objekt Current Statement Nuvarande Sats Accessing Öppna objekt Previous Statement Föregående Sats Open Cursors Öppna Frågor &Refresh &Uppdatera Disconnect session Bryt session &Change Refresh &Ändra Uppdatering &Session &Session No access to timed statistics flags Inga rättigheter till tidsstatestikflaggan Let current transaction finish before disconnecting session? Låt nuvarande transaktion slutföras innan session bortkopplas? Commit work? Spara arbete? &Yes &Ja &No &Nej Cancel Avbryt Only active users Endast aktiva användare Exclude selected sessions Exkludera valda sessioner Select all sessions Välj alla sessioner Deselect all sessions Avmarkera alla sessioner Long ops Långa operationer F5 Session|Refresh Alt+R Session|Change refresh toSession:AccessedObjects OWNER ÄGARE OBJECT OBJEKT TYPE TYP toSession:ConnectInfo Authentication Type Autentiseringstyp Osuser OS användare Network Service Banner Nätverks Service Text toSession:LockedObject Object Name Objektnamn Type Typ Locked Mode Låstyp toSession:OpenCursor SQL SQL toSession:SessionIO Block gets Block hämtningar Consistent gets Konsistenta läsningar Physical reads Fysiska läsningar Block changes Blockändringar Consistent changes Konsistenta ändringar toSession:SessionWait CPU CPU Parallel execution Parallell exekvering DB File Write DB Fil Skrivning Write Complete Skrivning Klar DB File Read Db Filläsning DB Single File Read DB Enkel Filläsning Control File I/O Kontrolfil I/O Direct I/O Direkt I/O Log file Logfil SQL*Net SQL*Net Other Annan toSessionMySQL Session manager Sessionshanterare Update sessionlist Uppdatera sessionslista Only active users Endast aktiva användare All Kill selected session Refresh Uppdatera Exclude selected sessions Exkludera valda sessioner Select all sessions Välj alla sessioner Deselect all sessions Avmarkera alla sessioner &Refresh &Uppdatera F5 Session MySQL|Refresh Kill session &Change Refresh Alt+R Session MySQL|Change refresh &Session &Session toSetSessionType Failed to find style %1 Kunde inte hitta stil %1 toSplash Loading plugins Laddar plugins toStorage Storage manager Lagringshanterare Update Uppdatera Show extent view. Visa extentvy. Show tablespaces or just datafiles. Visa tablespaces eller bara datafiler. Take tablespace online Slå på tablespace Take tablespace offline Slå av tablespace Set tablespace default to logging Slå på loggning som standard för tablespace Set tablespace default to no logging Slå av loggning som standard för tablespace Allow read write access to tablespace Tillåt läs och skrivning till tablespace Set tablespace to read only Tillåt endast läsning för tablespace Modify tablespace Andra tablespace Modify file Ändra fil Create new tablespace Skapa nytt tablespace Add datafile to tablespace Lägg till datafil till tablespace Coalesce tablespace Slå samma ledigt utrymme Move datafile Flytta datafil Owner Ägare Object Objekt Partition Partition Extents Antal Extent &Refresh &Uppdatera Tablespace online Tablespace påslaget Tablespace offline Tablespace avslaget Default logging Standard loggning Default not logging Standard ej loggande Read write access Skriv && Läs Read only access Endast läsning Modify tablespace... Ändra tablespace... Modify datafile... Ändra datafil... New tablespace... Nytt tablespace... Add datafile... Lägg till datafil... Move datafile... Flytta datafil... &Storage &Lagring Select mode to take tablespace %1 offline. Välj sätt att slå av tablespace %1. Normal Normal Temporary Tillfällig Cancel Avbryt Blocks Block F5 Storage|Refresh toStorageDatafile Create datafile Skapa datafil &Size &Storlek &Next &Nästa &Maximum size &Maximal storlek No name available Inget namn tillgängligt toStorageDatafileUI Form1 &Tablespace name &Tablespacenamn &Filename &Filnamn &Browse &Leta Auto extend Autoutöka &Auto extend datafile &Autoallokera datafil &Unlimited max size &Obegränsad maxstorlek toStorageDefinition &Initial size &Initial storlek &Next size &Nästa storlek &Size &Storlek toStorageDefinitionUI Form1 Optimal allocation of extents. Will free unused extents down to specified value Optimal allokering av extent. Kommer frigöra oanvända extent new till angiver värde &Extents &Extent &Maximum extents &Max antal extent Maximum number of extents to allocate for an object Maximalt antal extent som allokeras för ett objekt &Initial size &Initial storlek Number of extents to initially allocate Antal extent som skall allokeras från början &Unlimited extents &Obegränsade extent No limit to the number of extents to allocate if needed Ingen övre gräns på antal extent &Optimal size &Optimal storlek &No optimal size I&ngen optimal storlek &Default PCT increase Stan&dard PCT increase Default increase in size of next allocated extent. A size of 0 will prevent background coalesce of free space Stanrdard storlek att utöka storleken på varje nytt ett extent som allokeras. En storlek av 0 kommer stoppa bakgrundssammanslagning av tomt utrymme toStorageDialog Invalid response from query Felaktigt svar på fråga Add datafile Lägg till datafil Datafile Datafil Add tablespace Lägg till tablespace Tablespace Tablespace Default Storage Standardlagring Modify datafile Ändra datafil Invalid response from query (Wanted 4, got %1 entries) for %2.%3 No changes made Inga ändringar gjorda toStorageDialogUI Modify tablespace Andra tablespace Display the SQL used to generate the specified object Visa SQL för att generera det angivna objektet Tab 2 &Ok &Ok Cancel Avbryt toStorageExtent Files: %1 Filer: %1 Extents: %1 Extent: %1 Blocks: %1 Block: %1 Blocks/line: %1 Block/Rad: %1 Tablespace: %1 Tablespace: %1 toStoragePrefsUI Form1 Storage Manager Lagringshanterare &Display coalesced column &Visa fragmenteringskolumn Display object &extents Visa objekt &extent Display object and extent list on startup. Visa objekt och extentlista vid start. Display tablespaces or just datafiles. Visa tablespace eller bara datafiler. Display graph of autoextend information instead of just free space. Visa graf över autoallokering information istället för bara fritt utrymme. toStorageTablespace &Minimum Extent &Minsta Extent Extent &Size Extent &Storlek toStorageTablespaceUI Form1 &Options &Inställningar &Logging &Loggning Should objects created in this tablespace be logging by default Skall objekt som skapas i detta tablespace loggas som standard &Online P&åslaget Should tablespace be online at the time of creation Skall tablespacet vara påslaget när det skapas &Permanent &Permanent Should objects in this tablespace be permanent after the end of the session Skall objekt i detta tablespace vara kvar efter slutet av sessionen &Default storage Stan&dardlagring Specify default storage clause (In separate tab) Ange standard lagrings (I separat flik) &Extent allocation &Extent allokering &Dictionary &Uppslagstabeller Manage tablespace extents using dictionary tables Hantera tablespace extents med hjälp av uppslagstabeller Local &autoallocation Lokal &autoallokering Specify how space is allocated in the tablespace Ange hur utrymme allokeras i tablespacet Local &uniform Lokal &uniform The tablespace is locally managed with fixed extent sizes of specified size Tablespacet hanteras lokalt med en fast extentstorlek toSyntaxAnalyzer Wrong format of color in setings Fel format på fär i inställningar Unknown type Okänd typ toSyntaxSetup Unknown variable Okänd variabel Unknown color name %1 Okänt färgnamn %1 toSyntaxSetupUI Form1 Options Inställningar &Keyword upper Nyc&kelord Versaler Convert all keywords to uppercase when displayingsyntaxhighlighted text. Only available for monospaced fonts. Konvertera alla nyckelord till versaler när syntaxformatterad text visas. Bara tillgängligt för typsnitt med fast bredd. &Code completion &Kod komplettering Activate code completion in SQL editors. Not recommended on slow connections. Aktivera kod komplettering i SQL editorer. Inte rekommenderat på långsamma anslutningar. &Sort completion rows &Sortera kompletteringsrader Sort the available completion rows alphabetically or in the order the are. Sortera tillgängliga kompletteringsrader i alfabetisk ordning i stället för den ursprunglig ordningen de lästes från databasen. S&yntax highlighting S&yntax formattering Enable syntax highlighting, or use simple text editor Slå på syntaxformattering, eller använd en normal text editor &Indent same as previous line &Indentera samma som föregående Indent a new line in an editor to the same column as the previous line Indentera en ny rad i en editor till samma kolumn som den föregående raden Choose Välj List example Exempellista Code example Exempelkod Text example Exempeltext Filename extensions Filnamns ändelser Sy&ntax components Syn&tax komponenter &Pick V&älj Tab stop width Number of character width of tabstops toTemplate Not a toTemplate parent Template Toolbar Mall Toolbar Template Mall Template result Mallresultat Internal error, lastLevel < 0 toTemplateAddFileUI Add template file Lägg till mallfil &Browse &Leta Canel Avbryt &Ok &Ok &File &Fil &Root &Rot toTemplateEdit Internal error, lastLevel < 0 toTemplateEditUI Template editor Malleditor Template Mall &Description &Beskrivning Description text. Can be in HTML format. Beskrivande text. Kan vara i HTML format. &Preview &Förhandsvisning &Name &Namn Name of the template. Namn på mallen. Remove the current template Ta bort aktuell mall Add new template Lägg till ny mall Preview Förhandsgranskning Preview of the description. Press the button to update Förhandsgranskning av beskrivning. Tryck på knappen för att uppdatera Cancel Avbryt &Ok &Ok toTemplatePrefs Couldn't open file. Kunde inte öppna fil. Couldn't open file. Start on new file? Kunde inte öppna fil. Starta på ny fil? &Ok &Ok Cancel Avbryt Couldn't write file Kunde inte skriva fil Couldn't open file Kunde inte öppna fil toTemplateSetupUI Form1 Root Rot Filename Filnamn &Add File &Lägg till fil &Remove File &Radera Fil &Edit File &Editera Fil toTemplateTool Template Mallar toTemporary Temporary Objects Temporära Objekt Refresh list Uppdatera lista &Refresh &Uppdatera &Temporary &Temporär F5 Temporary|Refresh toThread Thread function "%1" failed. Thread function "%1" failer. toTool Malformed tag in config file. Missing = on row. (%1) Felaktig tag i konfigurationsfil. Saknar = på rad. (%1) Unknown escape character in string (Only \\ and \n recognised) Okänt tecken efter \. Endast \\ och \n tillåtna Alert Messenger Alarm Meddelnden Backup Manager Backup Hanterare Current Session Nuvarande Session DB Extraction/Compare/Search DB Extrahering/Jämförelse/Sökning Invalid Objects Ogiltiga Objekt PL/SQL Debugger PL/SQL Debugger PL/SQL Profiler PL/SQL Profiler Password Change Lösenordsändring Rollback Segments Rollback Segment SGA Trace SGA Spårning SQL Output SQL Utdata SQL Template SQL Mallar SQL Worksheet SQL Arbetsblad Schema Browser Schema Utforskare Security Manager Säkerhets Hanterare Server Tuning Server Trimning Sessions Sessioner Statistics Manager Statestik Hanterare Storage Manager Lagrings Hanterare Couldn't save empty value at key %1 Kunde inte spara tomt värde på nyckel %1 Couldn't save %1 value at key %2 Kunde inte spara värdet %1 på nyckel %2 toToolSettingUI Form1 Tool Verktyg &Default tool &Standardverktyg Select the default tool to pop up when opening a new connection. Välj standardverktyg att visa när ny anslutning startas. &Enabled tools &Påslagna verktyg Select which tools should show up in the menu and toolbar. Välj vilka verktyg som skall visas i meny och verktygsrad. You must restart TOra for any of these changes to have effect. Du måste starta om TOra för att dessa ändringar skall ha effekt. You must restart for any of these changes to have effect. Du måste starta om TOra för att dessa ändringar skall ha effekt. toTuning Enable all tuning statistics Så på all trimnings statestik Are you sure you want to enable all tuning features. This can put heavy strain on a database and unless you are the DBA you probably don't want this. Selecting no here will give you the option to enable or disable tabs individually as they are needed. Är du säker att du vill slå på alla trimnings funktioner. Detta kan lägga hård last på en databas och om du inte är DBA vill du troligtvis inte göra detta. Om du väljer nej här kan du välja att slå av eller på flikarna individuellt i den mån de behövs. Yes Ja &No &Nej Server Tuning Server Trimning Refresh Uppdatera Enable and disable tuning tabs Slå av eller på trimnings flikar &Overview &Översikt Wrong format of name on chart (%1). Fel format på namn av diagram (%1). Wait events Väntelägen &File I/O &Fil I/O Indicator Indikatorer Value Värde Reference Referens &Indicators &Indikatorer &Statistics &Statestik &Parameters &Parametrar &Blocking locks &Blockerande lås Library C&ache Library C&ache Control Files Kontrolfiler Optio&ns &Val &Licenses &Licenser &Refresh &Uppdatera &Change Refresh &Ändra Uppdatering &Tuning &Trimning blocks/s block/s F5 Tuning|Refresh Alt+R Tuning|Change refresh toTuning:Charts:4BAClients Active Aktiva Inactive Inaktiva System System toTuning:Charts:6LNExecution Execute Exekvera Hard parse Hård parsning Parse Parse Calls Anrop Commit Commit Rollbacks Rollbacks toTuning:ControlFileRecords Type Typ Size Storlek Total Records Totala Poster Used Records Använda Poster Allocated Allokerade Used Använda toTuning:LibraryCache Namespace Namespace Gets Läsningar Get Hits Lästräffar Ratio Ratio Pins Pins Pin Hits Pinträffar toTuning:License Sessions Max Session Max Sessions Warning Session Varning Sessions Current Session Nuvarande Sessions Highwater Flesta Sessioner Users Max Max Användare toTuning:Options Parameter Parameter Enabled Påslagen toTuningFileIO File I/O Fil I/O File timing Filtider Tablespace I/O Tablespace I/O Tablespace timing Tablespacetider Reads Läsningar Blocks Read Block Lästa Writes Skrivningar Blocks Written Block Skrivna Average Medel Minimum Minimum Maximum Read Maximum Läsning Maximum Write Maximum Skrivning blocks/s block/s toTuningOverview < Archive write < Arkivskrivning blocks/s block/s Hitrate Träffratio < Client input < Klient in Client output > Klient ut > Executes > Exekveringar > Log writer > Logg skrivare > Buffer changed > Ändrade buffrar > < Buffer gets < Hämtade buffrar Parse > Tolkningar > < Physical read < Fysiska läsningar Physical write > Fysiska skrivningar > Redo entries > Redo poster > Timescale Tidskala blocks/s block/s toTuningOverviewUI Form1 SGA SGA Buffer Cache Buffer Cache TextLabel3 Total Totalt Redo Buffer Redo Buffer Shared Pool Gemensam Pool Archive logs Arkivloggar Files/Size Filer/Storlek Files Filer Datafiles Datafiler Used/Total Använt/Totalt Tablespaces Tablespace Redo Logs Redologgar Active/Total Aktiva/Totala Active group Aktiv grupp Processes Processer Server Server Shared Gemensam Dispatchers Dispatcher Parallel Parallell Dedicated Tillägnad Background Bakgrund Clients Klienter Active Aktiva TextLabel5 Send to client Sänd till klient Send from client Sänd från klient toTuningSettingUI Form1 Server tuning Server trimning Available tabs Tillgängliga flikar &Enabled background views &Påslagna bakgrundsvyer Select which views collect data in the background that should be run. Välj vilka vyer som hämtar data i bakgrunden som skall köra. toVisualize Data visualization Data visualisering Bar chart Stapeldiagram Line chart Linjediagram Pie chart Pajdiagram Display legend Visa titlar Display grid Visa rutnät Display axis legend Visa axeltitlar Title columns Titelkolumner Number of columns to use as title Antal kolumner att använda som titel Update chart Uppdatera diagram toWaitEvents Server Tuning Server Trimning Display Visa Time Tid Count Antal Color Färg Wait type Väntetyp Delta (ms/s) Delta (ms/s) Total (ms) Totalt (ms) Delta (1/s) Delta (1/s) Total Totalt System wait events System väntehändelser ms/s ms/s System wait events count System väntehändelseantal waits/s antal/s Internal error, can't find (%1) in usedMap Absolute system wait events Total %1%2 Abslut systemväntehändelser Totalt %1%2 Delta system wait events Total %1%2 Delta systemväntehändelser Totalt %1%2 toWorksheet SQL worksheet SQL Arbetsblad Execute current statement Exekvera nuvarand sats Execute all statements Exekvera alla satser Step through statements Stega genom satser Reexecute Last Statement Kör Om Senaste Sats Stop execution Stanna exekvering &Result &Resultat E&xecution plan E&xekveringsplan &Visualize &Visualisera &Information &Information Worksheet Statistics Arbetsblad Statistik Save statistics for later analysis Spara statestik för senare analys Wait states Väntelägen I/O I/O blocks/s block/s &Statistics &Statestik &Logging &Logg SQL SQL Result Resultat Timestamp Tid Duration Längd Describe under cursor Beskriv under markör Clear execution log Rensa exekveringslogg Gather session statistic of execution Hämta sessionsstatestik under exekvering Refresh Uppdatera Run current saved SQL Kör aktuellt sparad SQL Save last SQL Spara senaste SQL &Execute Current &Exekvera Aktuell Execute &All Exekvera &Alla Execute &Next Exekvera &Nästa Execute &Newline Separated Exekvera &Nyrad Separerad &Reexecute Last Statement Kö&r Senaste Sats &Describe Under Cursor Beskriv Un&der Markör &Explain current statement Via &Exekveringsplan &Enable Statistics Slå På Stat&estik &Stop Execution &Stoppa Exekvering Execute Saved SQL Exekvera Sparad SQL Select Saved SQL Välj Sparad SQL Edit Saved SQL... Editera Sparad SQL... Previous Log Entry Föregående Loggpost Next Log Entry Nästa Loggpost Erase &Log Radera &Logg W&orksheet &Arbetsblad Save changes to worksheet for %1 Spara ändringar på arbetsblad för %1 Save file Spara fil &Yes &Ja &No &Nej Wrong number of parameters for describe Fel antal parametrar för beskrivning Ignoring SQL*Plus command Ignorerar SQL*Plus kommando Processing query Bearbetar fråga %1 rows processed %1 rader bearbetade Query executed Fråga exekverad Duration while query has been running Tid som frågan har kört (Duration %1) (Tid %1) Aborted Avbruten No SQL to save Ingen SQL att spara You haven't executed any SQL yet Du har inte exekverat någon SQL än &Ok &Ok Enter title Ange titel Enter the title in the menu of the saved SQL, submenues are separated by a ':' character. Ange titeln i menyn för sparad SQL, undermenyer separeras med ett ':' tecken. Undescribed Obeskrivd No plan available to save Ingen plan tillgänglig att spara Cancel Avbryt Previous log entry Föregående i logg Next log entry Nästa i logg Executing all statements Exekvera alla satser Enter refreshrate Ange updateringsfrekvens Refresh rate of query in seconds Updateringsfrekvens i sekunder Ctrl+Return Worksheet|Execute current F8 Worksheet|Execute all F9 Worksheet|Execute next Shift+F9 Worksheet|Execute newline separated F7 Worksheet|Execute saved SQL F4 Worksheet|Describe under cursor Alt+Up Worksheet|Previous log entry Alt+Down Worksheet|Next log entry Explain plan of current statement F5 Worksheet|Reexecute last statement Check syntax of buffer F3 Worksheet|Explain plan Ctrl+Shift+S Worksheet|Select saved SQL Parsing all statements Ctrl+F9 toWorksheetSetupUI Form1 Automatically save file when closing worksheet (Without asking any questions). Spara fil automatiskt när arbetsblad stängs (Utan att ställa frågor om det). SQL Worksheet SQL Arbetsblad Auto &save Automati&sk lagring Ask about saving &changes Fr&åga om ändringar skall sparas Ask about saving changes when closing worksheet. Fråga om ändringar i arbetsbladet skall sparas när arbetsbladet stängs. Add &log entries at end Lägg till &loggposter i slutet Add newly executed queries at end of log instead of top. Changing this will mess up the log in the windows that are opened. Lägg till nyligen exekverade frågor i slutet av loggen istället för i början. Ändring av detta kommer ge felaktig ordning i de fönster om är öppna. &Multiple lines in log. &Multipla rader i logg. Display multiple lines in the SQL column of the logging. Visa flera rader i SQL kolumnen av loggen. &Enable statistics Slå på stat&estik Enable statistic collection per default. Slå på statestik hämtning som standard. Enable &timed statistics Slå på &tidstatestik Enable timed statistics as well when collecting normal statistics. Slå på tidsbaserad statestik i sessionen när statestik hämtas in i arbetsbladet. &Display number column Visa nummer&kolumn Add a numbering column to the left of the result. Visa numreringskolumn till vänster om resultatet. &Browse &Leta Default &file Standard&fil File to automatically open in a new worksheet. Fil som automatiskt öppnas i nya arbetsblad. Move &cursor to error Flytta mark&ör till fel Move the cursor to an error if the error occurs. Flytta markören till ett felets plats om fel upptäcks i tolkningen. Save previous results Spara föregående resultat Keep previous results in while worksheet is open. Will consume lot of memory. Spara föregående resultat medan arbetsbladet är öppet. Kommer att ta upp mycket minne. Execute directory when selecting in log Exekvera fråga när det välja i log Execute a statement when it is selected in the log, if disabled simply selected the statement in the log. Exekvera sats när den valdes i loggen. Om avslagen så väljs satsen bara i loggen. toWorksheetStatistic Server Tuning Server Tuning Load statistics from file Ladda statestik från fil Save statistics to file Spara statestik till fil Remove statistics Radera statestik Display charts Visa diagram Display execution plans Visa körplan Hide Göm toWorksheetText Save changes? Spara ändringar? The editor has been changed. Do you want to save them, discard changes or open file in new worksheet? Editorn har ändrats. Vill du spara, kasta bort änringarna eller öppna fil i nytt arbetsblad? &Save &Spara &Discard &Kasta &New worksheet &Nytt arbetsblad toWriteFile File error Fil fel Couldn't write data to tempfile Kunde inte skriva data till temporärfil Couldn't upload data to URL Kunde in ladda upp data till URL File saved successfully Filen sparad Couldn't open file for writing Kunde inte öppna filen för skrivning Couldn't write data to file Kunde inte skriva data till fil tora-2.1.3/src/i18n/tora_fr.ts0000644000175000017500000116204411354412714015634 0ustar michaelmichael main Loaded plugin %1 Unhandled exception Exit Unknown type toAbout Quotes GNU General Public License End User License toAboutUI toAboutUI &Ok Cancel toAlert Alert Messenger Registered Register current Remove registered Name Message Edit message in memo Send alert Time Failed to start polling thread, try closing some other tools and restart Alert Messenger &Add name &Remove name Edit &name Edit &message &Message in memo... &Send alert &Alert Alt+R Alert|Add Name Ctrl+Backspace Alert|Remove name Alt+N Alert|Edit name Alt+M Alert|Message Ctrl+M Alert|Message in memo Ctrl+Return Alert|Send alert toAnalyze Analyze Statistics Manager Refresh All Not analyzed Analyzed Tables Indexes Compute statistics Estimate statistics Delete statistics Validate references for Table Indexed columns Local indexes Sample % Parallel Start analyzing Stop current run Explain plans Worksheet statistics &Refresh &Statistics Running %1 Pending %2 Display SQL Analyze table Optimize table F5 Statistics|Refresh toAttachDock Unknown dock position Main widget not KDockMainWindow toBackground %1 queries running in background. One query running in background. No background queries. toBackup Backup Manager Update Logswitches per day and hour Redo Switches Archived Logs Last Backup Backup Progress &Refresh &Backup Manager This appears to be a cold backup database This appears to be a hot backup database F5 Backup|Refresh toBackup:CurrentBackup % Complete Context Serial# Sid So Far Total toBackup:LastBackup Bytes Written Checkpoint Time Ckpt Change# Completion Time File Size Filename Level Logically Corrupt Media Crpt Mrkd Crpt Type toBackup:LogHistory Controlfile Recid Controlfile Stamp Highest Scn Lowest Scn Sequence# Thread# Time Of First Entry toBackup:LogSwitches 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Date toBarChart Zoom toBrowser No schemas DB Browser Update from DB Define the object filter Remove any object filter T&ables Table browser Create new table Modify table columns Modify constraints Modify indexes &Columns &Indexes C&onstraints &References &Grants Triggers &Data Information Script &Views SQL De&pendencies Inde&xes Info Se&quences S&ynonyms Cod&e &Declaration B&ody Tri&ggers C&ode &Refresh &Change Schema Change &Object &Define filter... &Clear filter &Browser Data Indexes Constraints Tables Columns References Grants Dependencies Views Sequences Code Synonyms Define the object filter for database browser Remove any object filter for database browser Extents Enable constraint or trigger Disable constraint or trigger Statistic Partitions &Statistic F5 Browser|Refresh Alt+S Browser|Change Schema Alt+N Browser|Change object Ctrl+Shift+G Browser|Define filter Ctrl+Shift+H Browser|Clear filter toBrowser:AnyGrants Grantable Grantee Grantor Privilege toBrowser:IndexCols Column Length Column Name Descend Table Name toBrowser:IndexInformation Avg Data Blocks Per Key Avg Leaf Blocks Per Key Blevel Buffer Pool Clustering Factor Compression Degree Distinct Keys Domidx Opstatus Domidx Status Duration Freelist Groups Freelists Funcidx Status Generated Global Stats Include Column Index Name Index Type Ini Trans Initial Extent Instances Ityp Name Ityp Owner Join Index Last Analyzed Leaf Blocks Logging Max Extents Max Trans Min Extents Next Extent Num Rows Owner Parameters Partitioned Pct Direct Access Pct Free Pct Increase Pct Threshold Prefix Length Sample Size Secondary Status Table Name Table Owner Table Type Tablespace Name Temporary Uniqueness User Stats toBrowser:ListCode Object Name Object Type Type toBrowser:ListIndex Index Name toBrowser:ListSequence Sequence Name toBrowser:ListSynonym Synonym Name toBrowser:ListTables Table Name toBrowser:ListTrigger Trigger Name toBrowser:ListView View Name toBrowser:SequenceInformation Cache Size Cycle Flag Increment By Last Number Max Value Min Value Order Flag Sequence Name Sequence Owner toBrowser:SynonymInformation Db Link Owner Synonym Name Table Name Table Owner toBrowser:TableInformation Avg Row Len Avg Space Freelist Blocks Avg Space Backed Up Blocks Buffer Pool Cache Chain Cnt Cluster Name Cluster Owner Degree Dependencies Duration Empty Blocks Freelist Groups Freelists Global Stats Ini Trans Initial Extent Instances Iot Name Iot Type Last Analyzed Logging Max Extents Max Trans Min Extents Monitoring Nested Next Extent Num Freelist Blocks Num Rows Owner Partitioned Pct Free Pct Increase Pct Used Row Movement Sample Size Secondary Skip Corrupt Table Lock Table Name Tablespace Name Temporary User Stats toBrowser:TableTrigger Column Name Description Status Trigger Name Triggering Event toBrowser:TriggerCols Column Name In Update Usage toBrowser:TriggerInfo Action Type Base Object Type Column Name Description Owner Referencing Names Status Table Name Table Owner Trigger Name Trigger Type Triggering Event When Clause toBrowserConstraintUI Constraint info Display SQL to create this constraint &Name C&ondition &Column C&heck &Columns &Type Primary key Unique &Primary key/Unique Refers &To R&efered columns &Referential &Apply Close toBrowserFilterUI Filter setting &Ok Cancel Filter on name &No filter &Start with Object name start with &End with Object name ends in &Contains Object name contains &RegExp Object name matches RegExp &Comma list Comma separated list of object names Filter on tablespace Include &All &Include &Exclude Only display own schema Ignore &Case &Invert selection toBrowserIndexUI Index name &Name Display SQL to create this constraint Cancel &Ok &Columns &Type Normal Primary key Unique Bitmap toBrowserTable Performing table changes Executing table change script Cancelled ongoing table modification, table might be corrupt Name Datatype Extra parameters toBrowserTableUI Table columns &Ok Cancel Display SQL to create this constraint &Tablespace C&omment &Name &General &Columns &Extra declarations &Parallel declarations &Storage declarations Custom column declarations toChangeConnection Change the connection of the tool. Couldn't find selected connection Couldn't find parent connection. Internal error. toChartAlarm Email toChartAlarmUI Chart alarm Any All Sum Average Max Min Statusmessage Email Ignore = != < > <= >= Operation Operation to perform on the selected columns Value Value to use in comparison. Comparison What comparison to do with the result from the above operation. Action What to do when alarm is triggered. &Ok Cancel Persistent Remember this alarm when restarting. toChartHandler ALARM: TOra alert: A defined alert value was detected: %1 At: %2 Alarms Persistent Temporary toChartManager Chart Manager Refresh list Open tracker file Setup chart Connection Title ID Tracking Alarms &Refresh &Chart Manager Initial value didn't start with " in CSV file Missing closing " in CSV file Chart format Select format of the chart to display Barchart Linechart Cancel F5 Chart Manager|Refresh toChartSetup Charts Persistent Temporary toChartSetupUI Chart manager setup Track chart to file Browse Persistent Enable tracking Filename Alarms &Add Remove Modify Cancel &Ok Remember to track this chart to this file always when starting. toChartTool Chart Manager... Chart Manager toCheckLicense Welcome to TOra (Personal license, not for commerical use) (Commercial license one user) (Commerical site license) (Commercial license %1 users) Welcome to TOra (Unregistered version, not for commercial use) toConnection All tool widgets need to have autodelete flag set Not done caching objects, can not clear unread cache Waiting for object caching to be completed. Canceling this dialog will probably leave some list of database objects empty. Cancel Waiting for object cache Not done caching objects Object %1 not available for %2 Parse only not implemented for this type of connection toConnectionProvider Tried to fetch unknown provider %1 toCurrent Current Session Update Privilege Type Grantable Privileges Version Parameters Statistics Resource Limits &Refresh &Current Session System Object Role F5 Current session|Refresh toCurrent:ResourceLimit Current Utilization Initial Allocation Limit Value Max Utilization Resource Name toCurrent:Version Version toCurrentTool Couldn't find parent tool. Internal error. toDatabaseSetting Invalid values Doesn't make sense to have max content less than initial fetch size. Will adjust value to be higher. &Ok toDatabaseSettingUI toDatabaseSettingUI &Autocommit changes Specify if changes should be automatically committed. UI feedback settings Abort long running queries and reexecute in own connection Reexecute a query taking more than 30 seconds in its own connection to prevent blocking other database access. Move to own connection after seconds Let the background queries normally running on the main connection run in a separate connection. Don't reread data if parameters are exactly same Query settings Maximum size &display The largest default size of a column in query results. &All &Initial rows to fetch in query The number of rows to always fetch when executing a query. Initially read in content editor Number of rows to initially start reading in content editor, use unlimited on slow connections. Indicate empty values as '' instead of NULL as {null}. Start read object cache when needed Read object cache on connect Never read object cache until mandatory Run UI blocking queries exclusively in main connection Keep alive Make sure connections are kept alive by periodically (5 minutes) sending a query on all idle connections. Never read object cache (Will leave parts of application nonfunctianal) If checked will not refresh a result if it is reexecuted exactly the same two times in a row. Dataformat Number format The way numbers should be presented. Decimals Number of decimals for fixed decimal format. Default Scientific Fixed decimal toDatatype <B>(</B> <B>,</B> <B>)</B> toDebug Expected function or procedure, internal error Unexpected end of declaration. Input Couldn't find any function or procedure under cursor. Output Returning Failed to get runtime info (Reason %1) [Count %1] {Unavailable} DEFERED No running target Debugger Update object list Clean sheet Rescan source Compile Stop running Step into procedure or function Step over procedure or function Return from procedure or function Show/hide debug info pane. Go to next error Go to previous error Toggle breakpoint on current line Enable/disable breakpoint on current line Add new variable watch Delete variable watch Change value of watched variable Objects Contents Object Line Schema Type &Stack Trace Variable Data W&atch Object Type Enabled &Breakpoints Name Content &Parameters Debug &Output &Runtime Log Failed to start target task thread, close some other tools and try again Couldn't start debugging Couldn't connect to target session: &Ok Stop execution? Do you want to abort the current execution? Cancel &Compile &Discard changes &New Sheet S&can Source &Stop Step &Into &Next Line &Return From &Debug Pane Next &Error Pre&vious Error &Toggle Breakpoint D&isable Breakpoint &Add Watch... Delete &Watch Chan&ge Watch... Refresh Object List Select Schema Erase Runtime &Log &Debug Enter new value to the watch %1 Unimplemented in PL/SQL debug interface Assignment failed (Reason %1) DISABLED ENABLED Can not enable breakpoint, not a valid line. Perhaps needs to recompile. Can not enable breakpoint, not a valid object. Perhaps needs to compile. NOT SET Failed to remove breakpoint (Reason %1) body {No debug info} Unknown Execute or continue execution %1 changed %1 changed. Continuing will discard uncompiled or saved changes Ctrl+F9 Debug|Scan source F9 Debug|Compile Close CloseAll &Execute or continue Ctrl+Return Debug|Execute F12 Debug|Stop F7 Debug|Step into F8 Debug|Stop over F6 Debug|Return from F11 Debug|Debug pane Ctrl+N Debug|Next error Ctrl+P Debug|Previous error Ctrl+F5 Debug|Toggle breakpoint Ctrl+F6 Debug|Disable breakpoint F4 Debug|Add watch Ctrl+Delete Debug|Delete watch Ctrl+F4 Debug|Change watch F5 Debug|Refresh objectlist Alt+S Debug|Select schema toDebugChangeUI Change value of watch NULL Cancel &Ok &Index toDebugOutput Couldn't enable/disable output for session toDebugText Invalid start of code toDebugWatch Can't parse location toDebugWatchUI Add variable watch Cancel &Ok &Variable name Variable name to watch. &Scope &Local Currently running scope. The scope of the file in the body editor. &Global Global scope of variable. &Autodetect &Package toEditExtensionGotoUI Go to line &Ok &Cancel Line Number toEditExtensionSetupUI Form1 &Right align keywords in each statement. Insert a &newline after each block Place THEN, LOOP, AS and IS on new line at b&eginning of new block Place &comma on new line before item instead of after on same line &Expand spaces to tabs when indenting Transform spaces to tabs whenever posible when indenting. Put spaces around operators Insert extra spaces between operators. Transform keywords to &uppercase &Indentation level &Same line comment column Example Auto indent read only SQL text editors toEditExtensionTool Forward Backward Incremental Search Selection Editor Obfuscate Selection Obfuscate Editor Auto Indent Indent Block De-indent Block Indent block in editor De-indent block in editor Upper Lower Modify Case Ctrl+S Edit|Incremental search forward Ctrl+R Edit|Incremental search backward Ctrl+Alt+I Edit|Indent selection Ctrl+Alt+Shift+I Edit|Indent editor Ctrl+U Edit|Uppercase Ctrl+L Edit|Lowercase Alt+Right Edit|Indent block Alt+Left Edit|De-indent block Goto Line toExtract Failed to extract owner and name from (%1), internal error %2 CREATE Creating create script Cancel Creating script Creating script was cancelled Internal error, missing : in object description Invalid type %1 to create Create Creating description Describe was cancelled Invalid type %1 to describe Describe DROP Creating drop script Creating drop script was cancelled Invalid type %1 to drop Drop script Invalid describe context (<3 parts) "%1") Object list not available in migration MIGRATE Creating migration script Invalid type %1 to migrate Migration script REM This DDL was reverse engineered by REM TOra, Version %1 REM REM at: %2 REM from: %3, an %4 %5 database REM REM on: %6 REM REM Generating free space report for: REM REM Generating %1 statement for: Error in toExtract Operation: %1 Object: %2 Error: %3 Malformed resize string (Should contain multiple of 3 number of ':') More than one definition for column %1 Same kind of definition existing more than once for column %1 toGetSessionType Failed to find style match toGlobalSettingUI toGlobalSettingUI Paths &Custom SQL Browse &Plugin directory &Help directory Default session Options &Save passwords Remember the last password you used to connect. Will leave the password unencryptet in the config file. Include DB in caption Include database connection in window captions Change current connection with active window Change currently select connection to the connection of the new active window Connect history Number of connections to save in history. Message history Number of status messages to save in the message history. seconds Status &message The time in seconds temporary messages will be displayed in the status bar. 0 menas keep. Display alerts in statusbar only Display alerts in messagebar instead of poping up a dialog with a warning. Tools toolbar on left Start using the tools toolbar on the left of the main window instead of at the top. Maximize window on start Restore session on startup &Desktop aware Colors get really weird in KDE if you select this. &Antialiase fonts Docks use toolbars Check this if docks are to use toolbars instead of normal frames. &Style The style to use for the user interface. Size Unit Bytes KB MB Text Tab delimited CSV HTML Default list format &Refresh Default refreshtime in tools. Chart samples Number of samples to keep in line and barcharts by default. Unlimited Save unlimited number of samples. Can large amounts of consume memory. Display samples Number of samples to display in line and barcharts by default. All Display all available samples Check for upgrades on startup Check the TOra webpage for upgrades to the program. Does not send any information about the users computer or TOra installation. Translation Which translation locale to use for this program. Must restart to have effect. &Cache directory Use Disk Caching Use Disk Caching of ObjectLists and Synonyms Directory where to find plugins when starting. Directory where to place cached dataaseinformation. Directory where to find help files. Default session to use when saving a session. Use antialiase fonts if Qt supports this. You need to restart for this to take affect. Define the unit sizes should be displayed. toHelp Help Navigation Contents Search All manuals Result Manual Backward one help page Forward one help page TOra manual Missing parent, unbalanced dl in help file content Help window Help Browser F1 Dialog|Help toHelpAddFileUI Add help directory &Browse Canel &Ok &Table of contents file &Title toHelpPrefs File error toHelpSetupUI Form1 Add manuals from an Oracle index page. Add manuals from an Oracle index page. This is the index page that links to the actual manuals. Not the master index page that links to different categories of manuals. Title Filename &Add Manual &Remove Manual &Oracle Manuals toHighlightedText Ctrl+T Edit|Table lookup toHtml Invalidly went beyond end of file Reading HTML after eof Lone < at end Unended tag at end Unended tag qualifier at end Unended tag qualifier data at end Unended quoted string at end Unended qualifier data at end Exceeded qualifier max in toHtml Tried to access string out of bounds in mid (start=%1) Tried to access string out of bounds in mid (size=%1) Tried to access string out of bounds in mid (total=%1+%2>%3) toImport Import & Export Execute Select schema Select table Couldn't open file Couldn't load codec %1 Supplied more than one parameter for field function Need parameter for column (%1) but none specified Inserted %1 rows Tried to define same field twice Not mapped Field %1 Invalid input, non space character between delimiter that is not separator toImportUI Form1 Operation &Import &Export &Browse Fileformat Fixed width Delimiter , " Separator Variable width Database Schema Table Define filter Options Include column names as first row File codec Ignore lines Commit distance Preview Column mapping toInvalid Invalid Objects Refresh list &Refresh &Invalid Recompiling all invalid Cancel Recompile selected F5 Invalid|Refresh toInvalid:ListInvalid Object Owner Type toKeyPath Couldn't find \ in path toKeyValue Couldn't find \ in path toLicense Register Quit Continue Not a valid license key Please check your name and registration key? Ok Really quit? Are you sure you want to quit? Yes No toLicenseUI This version of TOra is unregistered. 3 1 2 &Registration key &Name toLineChart Zoom &Print... &Open in new window &Chart Manager... &Properties... Clear Chart Enabled charts toLineChartSetupUI Chart setup Number of samples to keep Y-axis Max value Min value Auto detect Show last value Show axis legend Show chart legend &Ok Cancel All Maximum number of samples to display Unlimited Divide chart in grids? toListView Page: %1 Printing page %1 Done printing Display in editor... &Copy field Copy selection Copy selection with header Copy transposed Select all Export to file... Edit SQL... Left Center Right Alignment toLock The mutex function "%1" failed toLogOutput SQL Output Log4PL/SQL toMain &New Connection... &Close Connection &Commit Connection &Rollback Connection C&urrent Connection Stop All Queries Reread Object Cache &Open File... &Save Save A&s... Open Session... Save Session... Restore Last Session Close Session &Print... &Quit &File &Undo &Redo Cu&t &Copy &Paste &Search && Replace... Search &Next Select &All Read All &Items &Options... &Edit Application Load file into editor Save file from editor Print Undo Redo Cut to clipboard Copy to clipboard Paste from clipboard Search & replace Tools C&urrent Context... &Contents... &License... &Quotes... &Register... Connections Connect to database Disconnect current connection Commit connection Rollback connection Stop all running queries on connection &Tools C&lose Close &All &Cascade &Tile &Window &Help Check for upgrades? Do you want TOra to automatically check http://tora.sourceforge.net for updates on startup? During this check no information about your computer including TOra version is transmitted to the site &Yes &No First connection Can't find active connection Commit work in session to %1 before closing it? Commit work? Cancel Couldn't find specified connectionts (%1) Row: Col: Invalid session file The session file is not valid, can't read it. Input password Enter password for %1 Information You can enable this through the Global Settings in the Options (Edit menu) A new version of TOra (%1) is available from http://tora.sourceforge.net Message flood, temporary disabling of message box error reporting from now on. Restart to reenable. You probably have a too high refreshrate in some tool. Ctrl+G File|New connection Ctrl+O File|File open Ctrl+W File|File save Ctrl+Shift+C File|Commit Ctrl+J File|Stop all Ctrl+< File|Rollback Ctrl+Shift+U File|Current connection Ctrl+Insert Edit|Copy Shift+Delete Edit|Cut Shift+Insert Edit|Paste Ctrl+A Edit|Select all Ctrl+Z Edit|Undo Ctrl+Y Edit|Redo Ctrl+X Edit|Cut Ctrl+C Edit|Copy Ctrl+V Edit|Paste Ctrl+F Edit|Search F3 Edit|Search next F1 Help|Help toMarkedText Printing page %1 Done printing Page: %1 File opened successfully Save changes? The editor has been changed, do you want to save them before opening a new file? &Yes &No Cancel Incremental search Ctrl+A Edit|Select All toMemoEditor Memo Editor Save changes Open file Save file Cut to clipboard Copy to clipboard Paste from clipboard First column Previous column Next column Last column NULL Ctrl+Return Memo Editor|Save changes toMessageUI &Ok Display alerts in statusbar only. Display alerts in messagebar instead of poping up a dialog with a warning. Warning message toMySQLExtract Expected block from show create table for %1.%2 Internal error, couldn't parse ALTER TABLE clause Invalid type %1 to create Invalid type %1 to describe Invalid type %1 to drop Invalid type %1 to migrate toNewConnection Provider Host Database Username No connection provider No available connection provider, plugins probably missing Unable to connect to the database. Unable to connect to the database Enter password Enter password to use for connection. toNewConnectionUI New connection Cancel &Ok &Previous connections A list of previous connections. Select to bring over to the right. &Username Username to connect with &Password Password to connect with. Connection provider Use &SQL*Net Wether or not connect using the listener or directly to a local database. &Connection Mode Mode of the connection. If you don't understand select normal. &Database Select the database ID to connect to. &Host toNoBlockQuery Unknown exception Reading past end of query Couldn't open query Failed to start background query thread Restarting query in own connection toNow Unexpected error toOracleConnection Password expired Enter new password Enter password again for confirmation The two passwords doesn't match toOracleExtract Couldn't find source for of %1.%2 Displaying source of wrong type for %1. Got %2 expected 0. -- Context indexes can be quite complicated depending upon the -- used parameters. The following is an attempt to recreate this -- context index. But, a close scrutiny of the following code is -- strongly recommended. Couldn't find primary key of %1.%2 Couldn't find materialised table %1.%2 Couldn't find log %1.%2 Couldn't find index partitions for %1.%2 Couldn't find partition range %1.%2 Internal error, result should be 18 in segment attributes (Was %1) Internal error, result should be 18 in segment attributes Constraint %1.%2 doesn't exist DBLink %1.%2 doesn't exist Exchange index %1.%2 doesn't exist Exchange table %1.%2 doesn't exist Couldn't find index %1.%2 Couldn't find profile %1 Couldn't find role %1 Couldn't find sequence %1 Couldn't find synonym %1.%2 Couldn't find table %1.%2 Couldn't find tablespace %1 Couldn't find trigger %1.%2 Couldn't find user %1 Couldn't find view %1.%2 Couldn't find constraint %1.%2 Missing ON description item on index Couldn't find any COLUMN on index Invalid type %1 to create Invalid type %1 to describe Invalid type %1 to drop toOracleSettingUI Form1 &Default date format The default dateformat to use when querying the database. &Checkpoint name The name of the checkpoint used when needed to rollback work. &Max long and LOB data length Max length to read from LOB or LONG data fields. LONG:s can not be specified unlimited but will be defaulted to 33000 if unlimited. Unlimited Create Table &Explain plan table Name of the table to put explain plan output in. &Keep plans Keep records for the plan explanations in the plan table. Maximum cursors to keep open toOutput SQL Output Poll for output now Enable or disable getting SQL output. Clear output Refresh &Refresh Output enabled &Change Refresh &Output Couldn't enable/disable output for session F5 Output|Refresh F4 Output|Enable Ctrl+Backspace Output|Clear output Alt+R Output|Change refresh toOutputPrefs SQL Output &Polling timeout Time between trying to poll for output. Default &source Log4PL/SQL &User toParamGet Define binding variables &Ok Cancel Missing field name NULL Edit Aborted execution toPasswordTool Enter new password Enter new password again for confirmation Passwords doesn't match The two givens passwords doesn't match, please try again toPieChart &Print... &Open in new window All values are 0 in this chart toPreferences Global Settings Editor Settings Database Settings Tools toPreferencesUI Preferences &Ok Cancel &Help toProfiler PL/SQL Profiler Refresh list Repeat run Comment Unknown Run profiling in background Execute current profiling Script Result Profiler tables doesn't exist Profiler tables doesn't exist. Should TOra try to create them in the current schema? &Yes &No Select run %1 runs Something went wrong collecting statistics toProject SQL Project Add file to project Remove file from project SQL project Save project Add new subproject Generate SQL for this project Move up in project Move down in project File Size untitled.tpr -- Start of project %1 -- Start of file %1 toQValue Unknown type of query value toQuery Query aborted toReadFile Couldn't open file %1. Encountered problems read configuration Couldn't download file toRefreshCreate None 2 seconds 5 seconds 10 seconds 30 seconds 1 min 5 min 10 min toRefreshParse Unknown timer value toReport <H4>COLUMNS</H4> <TABLE WIDTH=100% BORDER=0><TR><TH ALIGN=left WIDTH=25%>Name</TH> <TH ALIGN=left WIDTH=25%>Definition</TH> <TH ALIGN=left WIDTH=50%>Description</TH> <HTML><HEAD><TITLE>Report on database %7</TITLE></HEAD> <BODY><H1>Report on database %8</H1> <TABLE BORDER=0> <TR><TD VALIGN=top>Generated by:</TD><TD VALIGN=top>TOra, Version %1</TD></TR> <TR><TD VALIGN=top>At:</TD><TD VALIGN=top>%2</TD></TR> <TR><TD VALIGN=top>From:</TD><TD VALIGN=top>%3, an %4 %5 database</TD></TR> <TR><TD VALIGN=top>On:</TD><TD VALIGN=top>%6</TD></TR> </TABLE> <H1>Global Objects</H1> <H1>Public</H1> <H1>Schema %1</H1> toResultBar Edit SQL... toResultCols Default value: <B> Distinct values: <B> Low value: <B> High value: <B> Density: <B> Number of nulls: <B> Number of histogram buckets: <B> Last analyzed: <B> Sample size: <B> Average column size: <B> </B> synonym for <B> (Object cache not ready) toResultCols::resultCols Column Name Data Type Comments Description of %1 Failed to describe %1 toResultConstraint Constraint Name Condition Enabled Delete Rule Generated toResultContent Content editor Define filter for editor Remove any filter Add a new record Save changes Discard changes Delete current record from table Go to first row Go to previous row Go to next row Go to last row Toggle between table or single record editing Remove filter Remove the filter for this table only or for all tables. &All &This Cancel Duplicate an existing record toResultContentEditor &Display in editor... &Copy field &Paste field Copy selection Copy selection with header Copy transposed &Delete record Select all Export to file... Read all Can't use these on toResultContent Unsaved data in contents, select other row to store Reading all values, moving cursor to end when done Edit cancelled This table contains only LOB/LONG columns and can not be edited No changes made Saved row Content of %1.%2 toResultContentFilterUI Content editor filter settings Ok Cancel Selection &criteria Selection criteria to use getting items to edit. Same as after where in a select clause. Sort &order. Separate columns with comma. The sort order to use when retreiving data from the database. Table &columns Available column names in table. Use for all tables toResultContentSingle Edit Internal error, save different row than current in content editor toResultDepend Owner Name Type Dependency toResultExtract Object not found toResultIndexes Index Name Columns Type Unique toResultLine Edit SQL... toResultListFormat Text Tab delimited CSV HTML toResultListFormatUI Choose format Cancel &Ok &Choose format of exported file. Separator Delimiter toResultLock Session Schema Osuser Program Type Mode Request Object Grabbed Requested toResultLong Will not reexecute same query %1 rows processed Query executed Statement executed Can only hide last column in query toResultObject Internal error, toResult is not a descendant of toResult toResultParam Parameter editor Display hidden parameters. This will only word if you are logged in as the sys user. Generate pfile Apply changes to system Apply changes to session Drop current changes Changed # Generated by TOra version %1 toResultParam:ListParam Changed Description Parameter Value toResultPlan Operation Options Object name Mode Cost Bytes Cardinality Plan table doesn't exist Specified plan table %1 didn't exist. Should TOra try to create it? &Yes &No toResultReferences Owner Object Constraint Condition Enabled Delete Rule foreign key (%1) references %2.%3(%4) DEPENDENCY toResultResources:Information Buffer Gets Disk Reads Executions First Load Time Invalidations Kept Versions Loaded Versions Loads Open Versions Optimizer Mode Parse Parsing Schema Id Parsing User Id Persistent Mem Rows Processed Runtime Mem Serializable Aborts Sharable Mem Sorts Users Executing Users Opening toResultStats Name Value Delta Can't change session on system statistics toResultStorage Name Status Information Contents Logging Size (%1) Free (%1) Autoextend (%1) Used/Free/Autoextend Available Coalesced Max free (%1) Free fragments toResultStorage Couldn't find tablespace parent %1 for datafile No tablespace selected Weird, empty tablespace name No file selected Tablespace toResultView Can only hide last column in query Reading all entries Read All toRollback Rollback analyzer Update segment list Take segment online Take segment offline Create new rollback segment Drop segment Refresh Open Cursors Transaction Users &Refresh Online Offline Create segment... &Change Refresh &Rollback No segment selected Drop rollback segment Are you sure you want to drop the segment %1. &Drop Cancel Enable snapshot too old detection. F5 Rollback|Refresh Alt+R Rollback|Change refresh toRollback:Information Block Blocks Current (MB) Current Extents Hitrate Initial (MB) Next (MB) Optimal (MB) Owner PCT Increase Reads Segment Status Tablespace Transactions Used (MB) toRollback:TransactionUsers Oracle User Os User Rollback Seg Session ID toRollbackDialog Storage No changes made toRollbackDialogUI Modify tablespace Display the SQL used to generate the specified object &Public If this should be a publicly available rollback segment &Name &Tablespace Rollback Segment &Ok Cancel toRollbackOpen Started User Snapshot SQL toRollbackPrefs Rollback Tool &Restart reexecuted statements Start statements again that have been reexecuted. &Must read buffers Don't display statements that have not read buffers. &Exclude first appearance A statement must be visible at least two consecutive polls to be displayed. &Disregard start extent. Always start from the left border when displaying extent usage. &Enable snapshot too old detection. Enable snapshot too old detection, will put load on large databases. toSGAStatement Couldn't find SQL statement in SGA SQL Execution plan Information toSGATrace SGA trace Fetch statements in SGA Schema Any Refresh Type SGA Long operations Selection All Unfinished Top executions Top sorts Top diskreads Top buffergets Top rows Top sorts/exec Top diskreads/exec Top buffergets/exec Top rows/exec Top buffers/row &Refresh Change &schema Change &refresh Change t&ype &SGA Trace Unknown type of trace Unfinished is only available for long operations Unknown selection 1 execution, 1 parse F5 SGA Trace|Refresh Alt+S SGA Trace|Change schema Alt+R SGA Trace|Change refresh Alt+Y SGA Trace|Change type toSGATracePrefs SGA Trace &Auto update Update automatically after change of schema. toSMTP Connecting to %1 Connected to %1 Message sent Unexpected reply from SMTP server: toSQL Tried to get unknown SQL (%1) Malformed tag in config file. Missing = on row. Malformed line in SQL dictionary file. Two '[' before '=' Unknown escape character in string (Only \\ and \n recognised) SQL Dictionary toSQLEdit SQL editor Load SQL dictionary file Save modified SQL to dictionary file Save this entry in the dictionary Delete this version from the SQL dictionary Start new SQL definition Text Name Name Database Description Wrong format of version Should be database provider:version. &Ok Should be database provider:version. Can't start with :. Should be database provider:version. Can't end with the first :. Missing description No description filled in. This is necessary to save SQL. Adding undescribed as description. Undescribed Modified SQL dictionary Save changes into the SQL dictionary &Yes &No Cancel toSQLEditTool &Edit SQL... toSQLString SQL Address not found in SGA toSQLToAddress SQL Query not found in SGA toSQLparse Unbalanced parenthesis (Too many ')') Unbalanced parenthesis (Too many '(') Internal error in toSQLParse, should never get here toSaveFilename File open password toScript Extraction and Compare Perform defined extraction Search result Dropped Created &Initial &Limit &Next No mode selected Destination shouldn't be enabled now, internal error Internal error, lastLevel < 0 All Replacing existing size with new Same None No filename specified Couldn't open file %1 Error writing to file %1 -- Script generated to file %1 successfully rem Master script for DDL reverse engineering by TOra -- Scripts generate to directory %1 successfully toScriptUI Form1 &Source Connection Schema All Objects &Include objects &Destination &Options Compare Compare two databases or schemas Extract Extract script to recreate database objects. Include code specification Include storage specification Include content of tables Include parallel specification Include partition specification Same None Generated schema Select the schema to generate in script Include indexes Generate prompts Generate prompts to display progress in SQLPlus Include comments Generate header Generate header at the top of the script Include grants Include constraints Include DDL Search Migrate Create database scripts to convert schema or database from source to destination Report &Search Contain any words Contain all words RegExp Exact match Configuration Script Resize Don't resize Auto resize Custom resize Limit Initial Next &Add &Remove Resize Result Difference Output Output tab Output dir Output file Browse Commit distance The number of insertstatements to make between each commit (0 means whole table) Output to directory so that each object is placed in a different file. toSearchReplace No more matches found F1 Search|Help Ctrl+R Edit|Replace toSearchReplaceUI Search & Replace &Search Top Search &Next &Replace Replace &All Close Search Exact Match text exactly as written Match Word Only match whole words Ignore Case RegExp Use RegExp semantics for matching (See Qt documentation) Replace toSecurity Security manager Update user and role list Save changes Remove user/role Add new user Add new role Copy current user or role Display SQL needed to make current changes Users/Roles &General &Roles &System Privileges &Object Privileges &Quota &Refresh &Save changes &Remove user/role Add &user Add &role &Copy current Display SQL... &Security No changes made Save changes? Save the changes made to this user? Save Discard Cancel Invalid security ID Roles Are you sure? The user still owns objects, add the cascade option? Yes No F5 Security|Refresh Ctrl+Return Security|Save changes Ctrl+Shift+U Security|Add user Ctrl+Shift+R Security|Add role Ctrl+Shift+O Security|Copy current F4 Security|Display SQL toSecurityObject Object Admin ON toSecurityQuota None Unlimited toSecurityQuotaUI Form1 Tablespace Quota Size Used Size &Unlimited &None &Value Belongs to Resource group or has unlimited tablespace privilege toSecurityRole Passwords don't match The two versions of the password doesn't match Don't save Cancel toSecurityRoleGrant Role name Admin Default ON YES toSecurityRoleUI Form2 &Name Enter Password Confirm Password &Password Role authenticated by the operating system &External Role authenticated globally &Global No password required for role None toSecuritySystem Privilege name Admin ON NO toSecurityUser Passwords don't match The two versions of the password doesn't match Don't save Cancel toSecurityUserUI Form1 &Name P&rofile Enter Password Confirm Password Expire Password &Password User authenticated by the operating system &External &X.500 External Name &Global &Temporary Tablespace &Account Locked &Default Tablespace toSemaphore The semaphore function "%1" failed toSession Session manager Update sessionlist All No background No system Enable timed statistics Disable timed statistics Disconnect selected session Refresh Session wait states Session I/O Statistics Wait events Connect Info Pending Locks Locked Objects Current Statement Accessing Previous Statement Open Cursors &Refresh Disconnect session &Change Refresh &Session No access to timed statistics flags Let current transaction finish before disconnecting session? Commit work? &Yes &No Cancel Only active users Exclude selected sessions Select all sessions Deselect all sessions Long ops F5 Session|Refresh Alt+R Session|Change refresh toSession:AccessedObjects OBJECT OWNER TYPE toSession:ConnectInfo Authentication Type Network Service Banner Osuser toSession:LockedObject Locked Mode Object Name Type toSession:OpenCursor SQL toSession:SessionIO Block changes Block gets Consistent changes Consistent gets Physical reads toSession:SessionWait CPU Control File I/O DB File Read DB File Write DB Single File Read Direct I/O Log file Other Parallel execution SQL*Net Write Complete toSessionMySQL Session manager Update sessionlist Only active users All Kill selected session Refresh Exclude selected sessions Select all sessions Deselect all sessions &Refresh F5 Session MySQL|Refresh Kill session &Change Refresh Alt+R Session MySQL|Change refresh &Session toSetSessionType Failed to find style %1 toSplash Loading plugins toStorage Storage manager Update Show extent view. Show tablespaces or just datafiles. Take tablespace online Take tablespace offline Set tablespace default to logging Set tablespace default to no logging Allow read write access to tablespace Set tablespace to read only Modify tablespace Modify file Create new tablespace Add datafile to tablespace Coalesce tablespace Move datafile Owner Object Partition Extents &Refresh Tablespace online Tablespace offline Default logging Default not logging Read write access Read only access Modify tablespace... Modify datafile... New tablespace... Add datafile... Move datafile... &Storage Select mode to take tablespace %1 offline. Normal Temporary Cancel Blocks F5 Storage|Refresh toStorageDatafile Create datafile &Size &Next &Maximum size No name available toStorageDatafileUI Form1 &Tablespace name &Filename &Browse Auto extend &Auto extend datafile &Unlimited max size toStorageDefinition &Initial size &Next size &Size toStorageDefinitionUI Form1 Optimal allocation of extents. Will free unused extents down to specified value &Extents &Maximum extents Maximum number of extents to allocate for an object &Initial size Number of extents to initially allocate &Unlimited extents No limit to the number of extents to allocate if needed &Optimal size &No optimal size &Default PCT increase Default increase in size of next allocated extent. A size of 0 will prevent background coalesce of free space toStorageDialog Invalid response from query Add datafile Datafile Add tablespace Tablespace Default Storage Modify datafile Invalid response from query (Wanted 4, got %1 entries) for %2.%3 No changes made toStorageDialogUI Modify tablespace Display the SQL used to generate the specified object Tab 2 &Ok Cancel toStorageExtent Files: %1 Extents: %1 Blocks: %1 Blocks/line: %1 Tablespace: %1 toStoragePrefsUI Form1 Storage Manager &Display coalesced column Display object &extents Display object and extent list on startup. Display tablespaces or just datafiles. Display graph of autoextend information instead of just free space. toStorageTablespace &Minimum Extent Extent &Size toStorageTablespaceUI Form1 &Options &Logging Should objects created in this tablespace be logging by default &Online Should tablespace be online at the time of creation &Permanent Should objects in this tablespace be permanent after the end of the session &Default storage Specify default storage clause (In separate tab) &Extent allocation &Dictionary Manage tablespace extents using dictionary tables Local &autoallocation Specify how space is allocated in the tablespace Local &uniform The tablespace is locally managed with fixed extent sizes of specified size toSyntaxAnalyzer Wrong format of color in setings Unknown type toSyntaxSetup Unknown variable Unknown color name %1 toSyntaxSetupUI Form1 Options &Keyword upper Convert all keywords to uppercase when displayingsyntaxhighlighted text. Only available for monospaced fonts. &Code completion Activate code completion in SQL editors. Not recommended on slow connections. &Sort completion rows Sort the available completion rows alphabetically or in the order the are. S&yntax highlighting Enable syntax highlighting, or use simple text editor &Indent same as previous line Indent a new line in an editor to the same column as the previous line Choose List example Code example Text example Filename extensions Sy&ntax components &Pick Tab stop width Number of character width of tabstops toTemplate Not a toTemplate parent Template Toolbar Template Template result Internal error, lastLevel < 0 toTemplateAddFileUI Add template file &Browse Canel &Ok &File &Root toTemplateEdit Internal error, lastLevel < 0 toTemplateEditUI Template editor Template &Description Description text. Can be in HTML format. &Preview &Name Name of the template. Remove the current template Add new template Preview Preview of the description. Press the button to update Cancel &Ok toTemplatePrefs Couldn't open file. Couldn't open file. Start on new file? &Ok Cancel Couldn't write file Couldn't open file toTemplateSetupUI Form1 Root Filename &Add File &Remove File &Edit File toTemplateTool Template toTemporary Temporary Objects Refresh list &Refresh &Temporary F5 Temporary|Refresh toThread Thread function "%1" failed. toTool Alert Messenger Backup Manager Current Session DB Extraction/Compare/Search Invalid Objects PL/SQL Debugger PL/SQL Profiler Password Change Rollback Segments SGA Trace SQL Output SQL Template SQL Worksheet Schema Browser Security Manager Server Tuning Sessions Statistics Manager Storage Manager Malformed tag in config file. Missing = on row. (%1) Unknown escape character in string (Only \\ and \n recognised) Couldn't save empty value at key %1 Couldn't save %1 value at key %2 toToolSettingUI Form1 Tool &Default tool Select the default tool to pop up when opening a new connection. &Enabled tools Select which tools should show up in the menu and toolbar. You must restart for any of these changes to have effect. toTuning Enable all tuning statistics Are you sure you want to enable all tuning features. This can put heavy strain on a database and unless you are the DBA you probably don't want this. Selecting no here will give you the option to enable or disable tabs individually as they are needed. Yes &No Server Tuning Refresh Enable and disable tuning tabs &Overview blocks/s Wrong format of name on chart (%1). Wait events &File I/O Indicator Value Reference &Indicators &Statistics &Parameters &Blocking locks Library C&ache Control Files Optio&ns &Licenses &Refresh &Change Refresh &Tuning F5 Tuning|Refresh Alt+R Tuning|Change refresh toTuning:Charts:4BAClients Active Inactive System toTuning:Charts:6LNExecution Calls Commit Execute Hard parse Parse Rollbacks toTuning:ControlFileRecords Allocated Size Total Records Type Used Records Used toTuning:LibraryCache Get Hits Gets Namespace Pin Hits Pins Ratio toTuning:License Sessions Current Sessions Highwater Sessions Max Sessions Warning Users Max toTuning:Options Enabled Parameter toTuningFileIO File I/O File timing Tablespace I/O Tablespace timing Reads Blocks Read Writes Blocks Written Average Minimum Maximum Read Maximum Write blocks/s toTuningOverview < Archive write blocks/s Hitrate < Client input Client output > Executes > Log writer > Buffer changed > blocks/s < Buffer gets Parse > < Physical read Physical write > Redo entries > Timescale toTuningOverviewUI Form1 SGA Buffer Cache TextLabel3 Total Redo Buffer Shared Pool Archive logs Files/Size Files Datafiles Used/Total Tablespaces Redo Logs Active/Total Active group Processes Server Shared Dispatchers Parallel Dedicated Background Clients Active TextLabel5 Send to client Send from client toTuningSettingUI Form1 Server tuning Available tabs &Enabled background views Select which views collect data in the background that should be run. toVisualize Data visualization Bar chart Line chart Pie chart Display legend Display grid Display axis legend Title columns Number of columns to use as title Update chart toWaitEvents Server Tuning Display Time Count Color Wait type Delta (ms/s) Total (ms) Delta (1/s) Total System wait events ms/s System wait events count waits/s Internal error, can't find (%1) in usedMap Absolute system wait events Total %1%2 Delta system wait events Total %1%2 toWorksheet SQL worksheet Execute current statement Execute all statements Step through statements Reexecute Last Statement Stop execution &Result E&xecution plan &Visualize &Information Worksheet Statistics Save statistics for later analysis Wait states I/O blocks/s &Statistics &Logging SQL Result Timestamp Duration Describe under cursor Clear execution log Gather session statistic of execution Refresh Run current saved SQL Save last SQL &Execute Current Execute &All Execute &Next Execute &Newline Separated &Reexecute Last Statement &Describe Under Cursor &Explain current statement &Enable Statistics &Stop Execution Execute Saved SQL Select Saved SQL Edit Saved SQL... Previous Log Entry Next Log Entry Erase &Log W&orksheet Save changes to worksheet for %1 Save file &Yes &No Cancel Wrong number of parameters for describe Ignoring SQL*Plus command Processing query %1 rows processed Query executed Duration while query has been running (Duration %1) Aborted No SQL to save You haven't executed any SQL yet &Ok Enter title Enter the title in the menu of the saved SQL, submenues are separated by a ':' character. Undescribed No plan available to save Previous log entry Next log entry Executing all statements Enter refreshrate Refresh rate of query in seconds Ctrl+Return Worksheet|Execute current F8 Worksheet|Execute all F9 Worksheet|Execute next Shift+F9 Worksheet|Execute newline separated F7 Worksheet|Execute saved SQL F4 Worksheet|Describe under cursor Alt+Up Worksheet|Previous log entry Alt+Down Worksheet|Next log entry Explain plan of current statement F5 Worksheet|Reexecute last statement Check syntax of buffer F3 Worksheet|Explain plan Ctrl+Shift+S Worksheet|Select saved SQL Parsing all statements Ctrl+F9 toWorksheetSetupUI Form1 Automatically save file when closing worksheet (Without asking any questions). SQL Worksheet Auto &save Ask about saving &changes Ask about saving changes when closing worksheet. Add &log entries at end Add newly executed queries at end of log instead of top. Changing this will mess up the log in the windows that are opened. &Multiple lines in log. Display multiple lines in the SQL column of the logging. &Enable statistics Enable statistic collection per default. Enable &timed statistics Enable timed statistics as well when collecting normal statistics. &Display number column Add a numbering column to the left of the result. &Browse Default &file File to automatically open in a new worksheet. Move &cursor to error Move the cursor to an error if the error occurs. Save previous results Keep previous results in while worksheet is open. Will consume lot of memory. Execute directory when selecting in log Execute a statement when it is selected in the log, if disabled simply selected the statement in the log. toWorksheetStatistic Server Tuning Load statistics from file Save statistics to file Remove statistics Display charts Display execution plans Hide toWorksheetText Save changes? The editor has been changed. Do you want to save them, discard changes or open file in new worksheet? &Save &Discard &New worksheet toWriteFile File error Couldn't write data to tempfile Couldn't upload data to URL File saved successfully Couldn't open file for writing Couldn't write data to file tora-2.1.3/src/i18n/tora_it.qm0000644000175000017500000045042611445442526015640 0ustar michaelmichaelQMP0]12345H6w789@3AbBCDEFMG|HIP Q8RgSQTQZz/f>>Ov[!+O+O++O\+O4+OV+OA+Ov+[ +[@+[E+[J+[M+[Q+[^1+[p+[{+[+[+[+[;+[+[ (+[+[-+[K]+[V+[+[ʖ+[b+[+[H,5H,R'H,H,H,PH,b&H,HUHYRWHYQH5H,L?eSSSSWQWX\,X\NX\PX\X\ YAZU~]A_{}_mb R]c,r,&0<4V_y@a5<.4 *\%,L: Z: : :  iH5H5LH5BH5*H59TH5;H5XLo#VE9VE`VEoVVE{VE:%kIdԆ5aA5p,xEg-557Z5 \ ee,ueLEebeke3ee+Ge0_eRUeQe)ɴe]]Fc&^-J !'P'b*y@*y**%*%_*0*0U*+H5@s+H5J+H5M_+H5K'+H5+H5++H5.+L_E+Lq+L`+VE|+o++܌++d++++`|++%)+e@+įϬ+į+,D,D_,DI,D,n:1 33s3N"7s;T6FUF|0FiqFռGPG2I5DIUذIy3|I3tJ J 5 J+VJ6J6J9DwJV JcbJlTJJá9#JΓL7PL7S9M'MiMiMiMiMi1MiMiMiMiMiūMiQMiMiMi8MiDMiPWP_P,nR̼R֔SnSmT¢SV |VGVV'@V1V6V=sVXV+VFV.W#5XGXY\5YbwY5*Y59Zt2Zy% OZy%Ze[ %][ %[f3[f3[j|[j|c[j|9\70\vS\U\4z\9\\Tdp)u */, ,6v4 7%GHJOJnPWT lTF29U >Z[/]V. P^C Z _rdmFo$ft^uw w=$u=IC$mC$IC$C$׮;GI t&a&M ,mݕ(ݕ7Z&JZ5ȩ6iE\i٥UQfLOݕG#0 쥴ms Vs  k7I nqH"݊ > h#NbI#ri*]*^.7,DLP7,DB|FKm-MK R7SV^fV^Z.^O5_egÎn7hZk5p'*p}.r#r)r-r2vr91r=sQu[wUw0yF~תs*"$*"wf,z f@4?UơsDbs%R %f3w|Ƿ0Ƿ Əts<HA~,,rMKiMUm۹EZv~@XjX&T8|U@.VV7VV{ Vf5 Fh,-2QS:eg;?uBsFWJ9MWMCQu Q0QQY„AZZZZ$Z$8Z$Z[2^}[%R[%bzhcrvy7{%Q;$+wǦLDEU|#  N3!;pn>ivE$p%ʗʗ@ ͐d1 GBClcPQV NS؀" B"oIUIqh&.(%1ڼ2Tsr78\:cOK>K>FO%#:O%:*O%;O%<UU ]6B`g Wg~њh hCiqW>svY+NvY9vYXvY]vYy ygkz^Qzzsz|A|kCXCY C^]4ygZ#39Z#DZ#;N?EBrzI4IEIK+INFIRIYI^Ib=I~I"InII«IRI!I II I.IA)ILIWIu;I~IRI@I8IJI8IIOn^nndQ]DfMj~ZDI+b fsE>At4[m b Zc b\~wet%aD ()`?uXFVSkRH^5 /m. $.ֲ7E!!. 68[|B2E`FHrQ)V|XY j Y Y Y /<\З(i2$ɯi2$i2$i2$j/qjkncRsy0sy 2t) 9oF`FFϋo404v4o4 b.ي})7^G% 11/1Q1b1Ȼ1&?tsy\cpS%29 E^.LuBnoYUn#^ }):=~8A/" V"V"?mI~S{;t#C`.N2 @I9qXߎ9:5O;JX}<=F?m8hHB+e<EX\Iʴ=UɒItX|iZVCZZ.ZZ9cgX3q9mvqDuNw4AxUUy@*{ {{5{0{cP{.aTNԢ.RZB3YW.1ՒYnaY/ǒ ΏDG:>^"^Iز^ز^`M\Qae9X:1/>nQr~ < $=w%C',D;B,*3,2,>@.an>}.an[5ܗi8%?GMIz|MhPVUn\pykg2(hIBahIBid<lgo3LqcunsVuy'lzn΃{ 73'!ZN1Nw̐ϗvDGW$fW$W$W$-/f[l 5_"  n3ͩs^n lcȌ*xoHq&TȔޞ[ޞFޞ)ޞLbk훞3UUqO  192x L[ `5Z Ԝ{$SCE% t&'E(xJ,Na,;4z.Ok67s69'9j;CEƒGCHAE`Jn% K3$T)L NNBRMMWXy|Z7!Z7i[g[Z4^lesvvz#%j.$B43B7 T7Y>~`DZ`D,t5WH5ȁ5Lv5̅   _ÕM|V sWC6QR1 (%+ 9í%%q̇ṘBvn(h׃g莕3tetQQ iF  \~ \~Ͱ \~ . gߨ A Kd N u2 a  օ v "' "' "3j 6 8sr< 9& :L>+ :>` =oC @35 L}q L(Em LE1 Mg:x Mg=( Mg3 MgW~ W[ [_{C [_ `w b+U* h>: h>P i4 vLҁ ye` }%S 9 1 2 2O m b%  t H% H k3e f pF s & F <G < ¥  m ʞh ʠ0' ش  ~`  ҫHV E l( dr M2 M3 7 X pG> 5 t[7 ]> - : > %ra tJ) +q T X: ]y `X d "Q %p' (w - /! 0-e} 00,+ 00 14^ 28 2؅+ 2؅ 4؅5k 9 9^ :_1 ;fx ;f >#ܷ Ee-B Ee2 E0 1 V V Z \05/ c@1 cJ cL d< dhd dnz dns d() d7] dU. d))W d)8 eL e e8% f k[ s( wK w^q yl@ |05a |C] 8 _ w Z n n n n % [ ~q <? & 6$ >" ,N Y a< e J  %K 5h ts t % e> eJ ew$ el ɌE ɜ# չl  X\ X\ X\  1 |z  9 F 3  "  ھ S M  u $ r j@ #ku #c S k} H bl <j  !# !#R # # &"^ 85δ <I =V"!] @14N2 Aub E9an F^Tƴ F^T= Kim N#v TSm V YS bH e0eJ eݕ~R l rl r:6 v {K > E2 F Fc  c b\ .f C *  )s g  Pg 3R ͇!$ B uF %1 KG * W 㽾  & 6j k > ocN @ O Er E ` ^d* ]. +Ď p %5p[ (pA\ *Y2y -$a /d\= /d /d/ /d /d 6Ǟ AZ1 A0p FvI G-ɚ G-8 G-Ծ G\ GJ N(* O RV RV RV `Q%] b+\ iS j%{ rp@ sW- sWe sW sW v v zL 1Z E p )m x> S Sں  tq $ 4 e >S >5 DUi oC- d Fm .+ z % D% D, lY DL U ڇ [ h kCe >P) N nN* ɠlC ɠnR ˺k +Ug 0 ݪi    奁 Ge ~M 9D9   r T E  M h  \r Z$B< $ $b j rD?D e  zA & F6g^ F;3 M]% YN Zt d@N i jO. q z9 7 zON  l(_ br e lx 9^[z w M r Ȳd ˞48 ̼w &$+v V | SB SB ڡ^ k' e  nj J 3I ~D 5M.rc V) Ã }Q\w'dM\1 eM(40Z583NxHeL`LM'c.~c.oЄ(q.oqKsWzsWut} eҽ~d]gs Ϣ3If^'Z![""K#B4N`/$kKYD3VB0S^^)eca°Ðe7ǔGǜ EϬx 0_N$&Yof$e,7RufNm gkHU mר)M))S.v12Nt7B5@.TAgDjI"JMd |[[xbF<e5-es#g{t:yvHxaS!ytXރ@'z/~,-6ypDefBfd/38ɭa~~д3$1mٻX%_]y]2oHti $Errore sconosciutoUnknown exception@default&Aggiungi&AddShortcutEditorDialog&Rimuovi&RemoveShortcutEditorDialog UscitaExitmain*Caricato il plugin %1Loaded plugin %1main*Eccezione non gestitaUnhandled exceptionmain4GNU General Public LIcenseGNU General Public LicensetoAbout&Ok&Ok toAboutUIAnnullaCancel toAboutUItoAboutUI toAboutUI toAboutUI&Avvisi&AlerttoAlert AvvisiAlert MessengertoAlert6Modifica messaggio nel memoEdit message in memotoAlertImpossibile avviare il monitor, prova a chiudere gli altri tool e a riavviare l'Alert MessengerXFailed to start polling thread, try closing some other tools and restart Alert MessengertoAlertMessaggioMessagetoAlertNomeNametoAlertRegistraRegister currenttoAlertRegistrato RegisteredtoAlertEliminaRemove registeredtoAlertInvia avviso Send alerttoAlert TempoTimetoAlert%% toAnalyze TuttoAll toAnalyzeAnalizzaAnalyze toAnalyzeAnalizzatoAnalyzed toAnalyze&Calcola statisticheCompute statistics toAnalyze(Cancella statisticheDelete statistics toAnalyze"Stima statisticheEstimate statistics toAnalyze EseguiExecute toAnalyzeExplain plans Explain plans toAnalyze&Colonne indicizzateIndexed columns toAnalyze IndiciIndexes toAnalyzeIndici locali Local indexes toAnalyzeNon analizzato Not analyzed toAnalyzeParalleloParallel toAnalyzeAggiornaRefresh toAnalyze,Attive %1 In attesa %2Running %1 Pending %2 toAnalyzeEsempioSample toAnalyze Inizia l'analisiStart analyzing toAnalyze(Gestione statisticheStatistics Manager toAnalyze*Interrompi esecuzioneStop current run toAnalyzeTabellaTable toAnalyzeTabelleTables toAnalyze$Valida riferimentiValidate references toAnalyzeFStatistiche per il foglio di lavoroWorksheet statistics toAnalyzeperfor toAnalyze<%1 query attive in background.!%1 queries running in background. toBackground8Nessuna query in background.No background queries. toBackground0Una query in background. One query running in background. toBackground &Gestione backup&Backup ManagertoBackupArchived Logs Archived LogstoBackupGestione backupBackup ManagertoBackup Progresso BackupBackup ProgresstoBackupUltimo Backup Last BackuptoBackup8Logswitches per giorno e oraLogswitches per day and hourtoBackupRedo Switches Redo SwitchestoBackup@Sembra essere un backup a freddo)This appears to be a cold backup databasetoBackup>Sembra essere un backup a caldo(This appears to be a hot backup databasetoBackupAggiornaUpdatetoBackup% completamento % CompletetoBackup:CurrentBackupContestoContexttoBackup:CurrentBackupNumero di serieSerial#toBackup:CurrentBackupSidSidtoBackup:CurrentBackupFino ad oraSo FartoBackup:CurrentBackup TotaleTotaltoBackup:CurrentBackupBytes scritti Bytes WrittentoBackup:LastBackup.Intervallo di controlloCheckpoint TimetoBackup:LastBackupCkpt Canghe# Ckpt Change#toBackup:LastBackup,Tempo di completamentoCompletion TimetoBackup:LastBackup&Dimensione del file File SizetoBackup:LastBackupNome fileFilenametoBackup:LastBackupLivelloLeveltoBackup:LastBackup(Corrotto logicamenteLogically CorrupttoBackup:LastBackupMedia Crpt Media CrpttoBackup:LastBackupMrkd Crpt Mrkd CrpttoBackup:LastBackupTipoTypetoBackup:LastBackupScn Massimo Highest ScntoBackup:LogHistoryScn Minimo Lowest ScntoBackup:LogHistorySequence# Sequence#toBackup:LogHistoryThread#Thread#toBackup:LogHistory0000toBackup:LogSwitches0101toBackup:LogSwitches0202toBackup:LogSwitches0303toBackup:LogSwitches0404toBackup:LogSwitches0505toBackup:LogSwitches0606toBackup:LogSwitches0707toBackup:LogSwitches0808toBackup:LogSwitches0909toBackup:LogSwitches1010toBackup:LogSwitches1111toBackup:LogSwitches1212toBackup:LogSwitches1313toBackup:LogSwitches1414toBackup:LogSwitches1515toBackup:LogSwitches1616toBackup:LogSwitches1717toBackup:LogSwitches1818toBackup:LogSwitches1919toBackup:LogSwitches2020toBackup:LogSwitches2121toBackup:LogSwitches2222toBackup:LogSwitches2323toBackup:LogSwitchesDataDatetoBackup:LogSwitchesZoomZoom toBarChartSchema &Browser&Browser toBrowser0&Definisci un filtro ...&Define filter... toBrowser &Viste&Views toBrowser&Si&Yes toBrowserCodic&eCod&e toBrowser$Crea nuova tabellaCreate new table toBrowserDB Browser DB Browser toBrowser4Definire filtro su oggettiDefine the object filter toBrowserIndi&ciInde&xes toBrowser(Modifica constraintsModify constraints toBrowserModifica indiciModify indexes toBrowser<Modifica colonne della tabellaModify table columns toBrowserNessuno schema No schemas toBrowserAggiornaRefresh toBrowser@Rimuovere ogni filtro su oggettiRemove any object filter toBrowserS&inonimi S&ynonyms toBrowserSe&quenze Se&quences toBrowserT&abelleT&ables toBrowserTri&ggers Tri&ggers toBrowserAggiorna dal DBUpdate from DB toBrowser"Grant assegnabile GrantabletoBrowser:AnyGrants"Grant assegnata aGranteetoBrowser:AnyGrants$Grant assegnata daGrantortoBrowser:AnyGrantsPrivilegio PrivilegetoBrowser:AnyGrants"Lunghezza colonna Column LengthtoBrowser:IndexColsNome colonna Column NametoBrowser:IndexColsDiscendenteDescendtoBrowser:IndexColsNome tabella Table NametoBrowser:IndexColsCompressione CompressiontoBrowser:IndexInformationChiavi distinte Distinct KeystoBrowser:IndexInformation DurataDurationtoBrowser:IndexInformationGenerato GeneratedtoBrowser:IndexInformation&Statistiche Globali Global StatstoBrowser:IndexInformationNome indice Index NametoBrowser:IndexInformationTipo Indice Index TypetoBrowser:IndexInformationExtent inizialeInitial ExtenttoBrowser:IndexInformationIstanze InstancestoBrowser:IndexInformationNumero di righeNum RowstoBrowser:IndexInformationProprietarioOwnertoBrowser:IndexInformationParametri ParameterstoBrowser:IndexInformationPartizionato PartitionedtoBrowser:IndexInformation$Percentuale liberaPct FreetoBrowser:IndexInformation2Percentuale di incremento Pct IncreasetoBrowser:IndexInformation*Percentuale di soglia Pct ThresholdtoBrowser:IndexInformationSecondario SecondarytoBrowser:IndexInformation StatoStatustoBrowser:IndexInformationNome tabella Table NametoBrowser:IndexInformation4Proprietario della tabella Table OwnertoBrowser:IndexInformationTipo Tabella Table TypetoBrowser:IndexInformationNome tablespaceTablespace NametoBrowser:IndexInformationTemporaneo TemporarytoBrowser:IndexInformationUnicit UniquenesstoBrowser:IndexInformationNome oggetto Object NametoBrowser:ListCodeTipo oggetto Object TypetoBrowser:ListCodeTipoTypetoBrowser:ListCodeNome indice Index NametoBrowser:ListIndexNome sequenza Sequence NametoBrowser:ListSequenceNome sinonimo Synonym NametoBrowser:ListSynonymNome tabella Table NametoBrowser:ListTablesNome trigger Trigger NametoBrowser:ListTriggerNome vista View NametoBrowser:ListView Dimensione cache Cache SizetoBrowser:SequenceInformationCiclica Cycle FlagtoBrowser:SequenceInformationIncrementa di Increment BytoBrowser:SequenceInformationUltimo numero Last NumbertoBrowser:SequenceInformationValore massimo Max ValuetoBrowser:SequenceInformationValore minimo Min ValuetoBrowser:SequenceInformationOrdinata Order FlagtoBrowser:SequenceInformationNome sequenza Sequence NametoBrowser:SequenceInformation6Proprietario della sequenzaSequence OwnertoBrowser:SequenceInformationDb LinkDb LinktoBrowser:SynonymInformationProprietarioOwnertoBrowser:SynonymInformationNome sinonimo Synonym NametoBrowser:SynonymInformationNome tabella Table NametoBrowser:SynonymInformation4Proprietario della tabella Table OwnertoBrowser:SynonymInformationBlocchiBlockstoBrowser:TableInformation CacheCachetoBrowser:TableInformation Nome del cluster Cluster NametoBrowser:TableInformation0Proprietario del cluster Cluster OwnertoBrowser:TableInformationDipendenze DependenciestoBrowser:TableInformation DurataDurationtoBrowser:TableInformationBlocchi Vuoti Empty BlockstoBrowser:TableInformation&Statistiche Globali Global StatstoBrowser:TableInformationExtent inizialeInitial ExtenttoBrowser:TableInformationIstanze InstancestoBrowser:TableInformationNumero di righeNum RowstoBrowser:TableInformationProprietarioOwnertoBrowser:TableInformationPartizionato PartitionedtoBrowser:TableInformation$Percentuale LiberaPct FreetoBrowser:TableInformation2Percentuale di Incremento Pct IncreasetoBrowser:TableInformation,Percentuale UtilizzataPct UsedtoBrowser:TableInformationSecondario SecondarytoBrowser:TableInformation"Salta se Corrotto Skip CorrupttoBrowser:TableInformationNome tabella Table NametoBrowser:TableInformationNome tablespaceTablespace NametoBrowser:TableInformationTemporaneo TemporarytoBrowser:TableInformationNome colonna Column NametoBrowser:TableTriggerDescrizione DescriptiontoBrowser:TableTrigger StatoStatustoBrowser:TableTriggerNome trigger Trigger NametoBrowser:TableTrigger"Evento scatenanteTriggering EventtoBrowser:TableTriggerNome colonna Column NametoBrowser:TriggerCols In aggiornamento In UpdatetoBrowser:TriggerColsUtilizzoUsagetoBrowser:TriggerColsTipo di azione Action TypetoBrowser:TriggerInfoNome colonna Column NametoBrowser:TriggerInfoDescrizione DescriptiontoBrowser:TriggerInfoProprietarioOwnertoBrowser:TriggerInfo StatoStatustoBrowser:TriggerInfoNome tabella Table NametoBrowser:TriggerInfo4Proprietario della tabella Table OwnertoBrowser:TriggerInfoNome trigger Trigger NametoBrowser:TriggerInfoTipo Trigger Trigger TypetoBrowser:TriggerInfo"Evento scatenanteTriggering EventtoBrowser:TriggerInfoClausola WHEN When ClausetoBrowser:TriggerInfo&Colonna&ColumntoBrowserConstraintUI&Colonne&ColumnstoBrowserConstraintUI &Nome&NametoBrowserConstraintUI&Ok&OktoBrowserConstraintUI &Tipo&TypetoBrowserConstraintUIC&ondizione C&onditiontoBrowserConstraintUI:Informazioni sulla constraintConstraint infotoBrowserConstraintUIRMostra l'SQL per creare questa constraint%Display SQL to create this constrainttoBrowserConstraintUIChiave primaria Primary keytoBrowserConstraintUI*Colonne R&eferenziateR&efered columnstoBrowserConstraintUIRiferi&to A Refers &TotoBrowserConstraintUI UnicoUniquetoBrowserConstraintUI&Contiene &ContainstoBrowserFilterUI&Finisce con &End withtoBrowserFilterUI&Escludi&ExcludetoBrowserFilterUI&Includi&IncludetoBrowserFilterUIA&nnulla filtro &No filtertoBrowserFilterUI&Ok&OktoBrowserFilterUI&RegExp&RegExptoBrowserFilterUI&Inizia con &Start withtoBrowserFilterUIAnnullaCanceltoBrowserFilterUIRLista di nomi oggetto separati da virgole$Comma separated list of object namestoBrowserFilterUIFiltro sui nomiFilter on nametoBrowserFilterUI(Filtro su tablespaceFilter on tablespacetoBrowserFilterUI.Impostazioni del filtroFilter settingtoBrowserFilterUI6Ignora &Maiuscole/Minuscole Ignore &CasetoBrowserFilterUIIncludi &Tutti Include &AlltoBrowserFilterUI*Nome oggetto contieneObject name containstoBrowserFilterUI0Nome oggetto finisce conObject name ends intoBrowserFilterUIHNome oggetto corrisponde alla RegExpObject name matches RegExptoBrowserFilterUI.Nome oggetto inizia conObject name start withtoBrowserFilterUI:Mostra solo il proprio schemaOnly display own schematoBrowserFilterUI&Colonne&ColumnstoBrowserIndexUI &Nome&NametoBrowserIndexUI&Ok&OktoBrowserIndexUIAnnullaCanceltoBrowserIndexUIRMostra l'SQL per creare questa constraint%Display SQL to create this constrainttoBrowserIndexUINome indice Index nametoBrowserIndexUITipoTypetoBrowserIndexUI&Database &DatabasetoBrowserTableNomeNametoBrowserTable&Colonne&ColumnstoBrowserTableUI&Generale&GeneraltoBrowserTableUI &Nome&NametoBrowserTableUI&Ok&OktoBrowserTableUI&Tablespace &TablespacetoBrowserTableUIC&ommentoC&ommenttoBrowserTableUIAnnullaCanceltoBrowserTableUIRMostra l'SQL per creare questa constraint%Display SQL to create this constrainttoBrowserTableUIColonne tabella Table columnstoBrowserTableUI,Cambia la connessione."Change the connection of the tool.toChangeConnectionrImpossibile trovare la connessione padre. Errore interno.0Couldn't find parent connection. Internal error.toChangeConnection EmailEmail toChartAlarm!=!=toChartAlarmUI&Ok&OktoChartAlarmUI<<toChartAlarmUI<=<=toChartAlarmUI==toChartAlarmUI>>toChartAlarmUI>=>=toChartAlarmUI AzioneActiontoChartAlarmUI TuttoAlltoChartAlarmUIQualsiasiAnytoChartAlarmUI MediaAveragetoChartAlarmUIAnnullaCanceltoChartAlarmUIConfronto ComparisontoChartAlarmUI EmailEmailtoChartAlarmUI IgnoraIgnoretoChartAlarmUIMaxMaxtoChartAlarmUIMinMintoChartAlarmUIOperazione OperationtoChartAlarmUI`Operazione da eseguire sulle colonne selezionate,Operation to perform on the selected columnstoChartAlarmUIPersistente PersistenttoChartAlarmUI$Messaggio di stato StatusmessagetoChartAlarmUI SommaSumtoChartAlarmUI ValoreValuetoChartAlarmUIFValore da usare nella comparazione.Value to use in comparison.toChartAlarmUIvQuale operazione eseguire con il risultato dell'operazione.?What comparison to do with the result from the above operation.toChartAlarmUILCosa fare quando l'allarme attivato.#What to do when alarm is triggered.toChartAlarmUI ALARM:ALARM:toChartHandler AvvisiAlarmstoChartHandlerPersistente PersistenttoChartHandlerAvviso di TOra: TOra alert:toChartHandlerTemporaneo TemporarytoChartHandler AvvisiAlarmstoChartManagerGrafico a barreBarcharttoChartManagerAnnullaCanceltoChartManager Gestione grafici Chart ManagertoChartManager&Formato del grafico Chart formattoChartManagerConnessione ConnectiontoChartManagerIDIDtoChartManagerNValore iniziale privo di " nel file CSV-Initial value didn't start with " in CSV filetoChartManagerGrafico a linee LinecharttoChartManagerF" di chiusura mancante nel file CSVMissing closing " in CSV filetoChartManagerAggiorna lista Refresh listtoChartManager@Seleziona il formato del grafico%Select format of the chart to displaytoChartManager TitoloTitletoChartManagerGraficiCharts toChartSetupPersistente Persistent toChartSetupTemporaneo Temporary toChartSetup&Aggiungi&AddtoChartSetupUI&Ok&OktoChartSetupUI AvvisiAlarmstoChartSetupUISfogliaBrowsetoChartSetupUIAnnullaCanceltoChartSetupUINInizializzazione della gestione graficiChart manager setuptoChartSetupUI,Abilita la tracciaturaEnable trackingtoChartSetupUINome fileFilenametoChartSetupUIModificaModifytoChartSetupUIPersistente PersistenttoChartSetupUIRimuoviRemovetoChartSetupUI4Traccia il grafico su fileTrack chart to filetoChartSetupUI Gestione grafici Chart Manager toChartTool(Gestione grafici ...Chart Manager... toChartTool CodiceCode toCodeModelTipoType toCodeModelAnnullaCancel toConnectionDCache degli oggetti non completataNot done caching objects toConnectionCache degli oggetti non completata, impossibile vuotare la cache non letta4Not done caching objects, can not clear unread cache toConnectionFL'oggetto %1 non disponibile per %2Object %1 not available for %2 toConnection\In attesa di completare la cache degli oggettiWaiting for object cache toConnectionIn attesa di completare la cache degli oggetti. Chiudere questa finestra lascier alcune liste di oggetti del database vuote.zWaiting for object caching to be completed. Canceling this dialog will probably leave some list of database objects empty. toConnectionOrigine:&From:toConnectionImport&Esegui...&Run...toConnectionImport,Importa le connessioniImport ConnectionstoConnectionImportSeleziona una delle origini a disposizione. Potrebbero essere richieste modifiche manuali dopo l'importazione.XSelect one of tools available. Connections could require manual changes after importing.toConnectionImport`Tentativo di contattare una fonte sconosciuta %1"Tried to fetch unknown provider %1toConnectionProvider"Sessione correnteCurrent Session toCurrent"Grant assegnabile Grantable toCurrentOggettoObject toCurrentParametri Parameters toCurrentPrivilegio Privilege toCurrentPrivilegi Privileges toCurrent2Limitazioni sulle RisorseResource Limits toCurrent RuoloRole toCurrentStatistiche Statistics toCurrentSistemaSystem toCurrentTipoType toCurrentAggiornaUpdate toCurrentVersioneVersion toCurrent,Utilizzazione correnteCurrent UtilizationtoCurrent:ResourceLimit(Allocazione inizialeInitial AllocationtoCurrent:ResourceLimitValore limite Limit ValuetoCurrent:ResourceLimit Utilizzo massimoMax UtilizationtoCurrent:ResourceLimit$Nome della risorsa Resource NametoCurrent:ResourceLimitVersioneVersiontoCurrent:VersionrImpossibile trovare la connessione padre. Errore interno.0Couldn't find parent connection. Internal error.toCurrentConnectionlImpossibile trovare il tool superiore. Errore interno.*Couldn't find parent tool. Internal error. toCurrentTool&Ok&OktoDatabaseSettingNon corretto avere una dimensione massima inferiore alla dimensione minima iniziale. Il valore verr aumentato. dDoesn't make sense to have max content less than initial fetch size. Will adjust value to be higher.toDatabaseSetting"Valori non validiInvalid valuestoDatabaseSetting &Tutte&AlltoDatabaseSettingUIpSalva automaticamente i cambiamenti sul DB (&Autocommit)&Autocommit changestoDatabaseSettingUIfNumero iniziale di &righe da recuperare nella query&Initial rows to fetch in querytoDatabaseSettingUIStandardDefaulttoDatabaseSettingUINon leggere mai la cache degli oggetti finch non obbligatorio'Never read object cache until mandatorytoDatabaseSettingUINumero di righe da leggere inizialmente nell'editor, usare illimitato con connessioni lente. _Number of rows to initially start reading in content editor, use unlimited on slow connections.toDatabaseSettingUI0Impostazioni delle queryQuery settingstoDatabaseSettingUIZLeggi la cache degli oggetti alla connessioneRead object cache on connecttoDatabaseSettingUISpecificare se i cambiamenti devono essere committati automaticamente.5Specify if changes should be automatically committed.toDatabaseSettingUIvIniziate a leggere la cache degli oggetti quando necessario#Start read object cache when neededtoDatabaseSettingUI|La larghezza massima di una colonna nei risultati della query.6The largest default size of a column in query results.toDatabaseSettingUINumero di righe da recuperare sempre quando si esegue una query.:The number of rows to always fetch when executing a query.toDatabaseSettingUI&Breakpoints &BreakpointstoDebug&Compila&CompiletoDebug &Debug&DebugtoDebug(&Scarta le modifiche&Discard changestoDebug&Nuovo foglio &New SheettoDebug"Li&nea Successiva &Next LinetoDebug&Ok&OktoDebug&Parametri &ParameterstoDebug &Stop&StoptoDebug@Assegnazione fallita (Motivo %1)Assignment failed (Reason %1)toDebugImpossibile abilitare il breakpoint, linea non valida. Forse necessario ricompilare.HCan not enable breakpoint, not a valid line. Perhaps needs to recompile.toDebugImpossibile abilitare il breakpoint, oggetto non valido. Forse necessario compilare.HCan not enable breakpoint, not a valid object. Perhaps needs to compile.toDebugAnnullaCanceltoDebug ChiudiClosetoDebugContenutoContenttoDebugContenutiContentstoDebug|Impossibile trovare una funzione o procedura sotto il cursore.5Couldn't find any function or procedure under cursor.toDebug@Impossibile avviare il debuggingCouldn't start debuggingtoDebugDISABILITATODISABLEDtoDebugDatiDatatoDebugDebuggerDebuggertoDebugPVuoi interrompere l'esecuzione corrente?+Do you want to abort the current execution?toDebugABILITATOENABLEDtoDebugAbilitatoEnabledtoDebug^Funzione o procedura non attesa, errore interno.Expected function or procedure, internal errortoDebug^Impossibile rimuovere il breakpoint (Motivo %1)'Failed to remove breakpoint (Reason %1)toDebug InputInputtoDebugNON IMPOSTATONOT SETtoDebugNomeNametoDebug$&Errore Successivo Next &ErrortoDebugOggettoObjecttoDebugTipo oggetto Object TypetoDebug$Errore &PrecedentePre&vious ErrortoDebugAggiornaRefreshtoDebug SchemaSchematoDebug4Interrompere l'esecuzione?Stop execution?toDebugTipoTypetoDebugDFine inattesa della dichiarazione.Unexpected end of declaration.toDebugjNon implementato nell'interfaccia di debug del PL/SQL'Unimplemented in PL/SQL debug interfacetoDebugSconosciutoUnknowntoDebugVariabileVariabletoDebug&Ok&OktoDebugChangeUIAnnullaCanceltoDebugChangeUINULLNULLtoDebugChangeUIvImpossibile abilitare/disabilitare l'output per la sessione*Couldn't enable/disable output for session toDebugOutput8Inizio del codice non validoInvalid start of code toDebugText&Globale&GlobaltoDebugWatchUI&Ok&OktoDebugWatchUINome &Variabile&Variable nametoDebugWatchUIAnnullaCanceltoDebugWatchUI Form1Form1toDropTablespaceUI&Ok&OktoEditExtensionGotoUIj&Allinea a destra le parole chiave in ogni costrutto.(&Right align keywords in each statement.toEditExtensionSetupUIbInizia i commenti nella &stessa riga alla colonna&Same line comment columntoEditExtensionSetupUI,Consenti trascinamentoAllow Drag and DroptoEditExtensionSetupUI~Indenta automaticamente gli editor di testo SQL in sola lettura&Auto indent read only SQL text editorstoEditExtensionSetupUIEsempioExampletoEditExtensionSetupUI Form1Form1toEditExtensionSetupUIVInserisci una &nuova linea dopo ogni blocco"Insert a &newline after each blocktoEditExtensionSetupUIZInserisci spazi aggiuntivi tra gli operatori.&Insert extra spaces between operators.toEditExtensionSetupUIInseris&ci una virgola in una nuova riga prima dell'oggetto invece che dopo sulla stessaBPlace &comma on new line before item instead of after on same linetoEditExtensionSetupUIScrivi THEN, LOOP, AS &e IS su una nuova riga all'inizio di un nuovo bloccoBPlace THEN, LOOP, AS and IS on new line at b&eginning of new blocktoEditExtensionSetupUILInserisci spazi intorno agli operatoriPut spaces around operatorstoEditExtensionSetupUIPTrasforma le parole chiave in &maiuscolo Transform keywords to &uppercasetoEditExtensionSetupUI.Indentazione Automatica Auto IndenttoEditExtensionToolIndietroBackwardtoEditExtensionToolSegnalibri BookmarkstoEditExtensionTool*Commenta o DecommentaComment or UncommenttoEditExtensionTool>Annulla indentazione del bloccoDe-indent BlocktoEditExtensionTool EditorEditortoEditExtensionTool AvantiForwardtoEditExtensionTool(Ricerca incrementaleIncremental SearchtoEditExtensionTool"Indenta il blocco Indent BlocktoEditExtensionToolMinuscoloLowertoEditExtensionTool&Maiuscole/minuscole Modify CasetoEditExtensionTool"Tutto su una rigaObfuscate EditortoEditExtensionTool6Selezione tutta su una rigaObfuscate SelectiontoEditExtensionToolSelezione SelectiontoEditExtensionToolMaiuscoleUppertoEditExtensionToolRimuoviRemovetoEditableMenu CREATECREATE toExtractAnnullaCancel toExtractCreaCreate toExtractJCostruzione dello script di creazioneCreating create script toExtract6Creazione della descrizioneCreating description toExtract<Creazione dello script di dropCreating drop script toExtractHCreazione dello script di migrazioneCreating migration script toExtract,Creazione dello scriptCreating script toExtractDROPDROP toExtractDropt script Drop script toExtractImpossibile ricavare il proprietario e il nome da (%1), errore interno %2=Failed to extract owner and name from (%1), internal error %2 toExtractlErrore interno, manca : nella descrizione dell'oggetto/Internal error, missing : in object description toExtractMIGRATEMIGRATE toExtract(Script di migrazioneMigration script toExtracthLista degli oggetti non disponibile nella migrazione&Object list not available in migration toExtractsecondi secondstoGlobalSettingUI*Directory della cache&Cache directorytoGlobalSettingUI(Directory dell'&help&Help directorytoGlobalSettingUI*Direcroty dei &plugin&Plugin directorytoGlobalSettingUI8&Intervallo di aggiornamento&RefreshtoGlobalSettingUI&Salva password&Save passwordstoGlobalSettingUI &Stile&StyletoGlobalSettingUI TuttoAlltoGlobalSettingUIBOrganizza gli Strumenti in SchedeArrange Tools in TabstoGlobalSettingUISfogliaBrowsetoGlobalSettingUI BytesBytestoGlobalSettingUICSVCSVtoGlobalSettingUIhCambia la connessione attuale con la finestra attiva,Change current connection with active windowtoGlobalSettingUICambia la connessione selezionata con la connessione della nuova finestra attivaMChange currently select connection to the connection of the new active windowtoGlobalSettingUI,Connessioni archiviateConnect historytoGlobalSettingUI8Formato standard delle listeDefault list formattoGlobalSettingUIXTempo di refresh standard per gli strumenti.Default refreshtime in tools.toGlobalSettingUI&Sessione di defaultDefault sessiontoGlobalSettingUI@Cartella con i file della guida.#Directory where to find help files.toGlobalSettingUIVCartella in cui cercare i plugin all'avvio..Directory where to find plugins when starting.toGlobalSettingUIMostra gli avvisi nella barra dei messaggi invece di aprire una finestra con l'avviso.JDisplay alerts in messagebar instead of poping up a dialog with a warning.toGlobalSettingUIVMostra gli avvisi solo nella barra di stato Display alerts in statusbar onlytoGlobalSettingUIFMostra tutti i campioni disponibiliDisplay all available samplestoGlobalSettingUI>Mostra la griglia nei risultatiDisplay gridlines in resultstoGlobalSettingUIHTMLHTMLtoGlobalSettingUIDInserisci il DB nelle informazioniInclude DB in captiontoGlobalSettingUIIncludi la connessione al database nelle informazioni della finestra.Include database connection in window captionstoGlobalSettingUIKBKBtoGlobalSettingUIMBMBtoGlobalSettingUI"Archivio messaggiMessage historytoGlobalSettingUIHNumero di connessioni da archiviare.)Number of connections to save in history.toGlobalSettingUIVNumero di campioni da mostrare nei grafici.>Number of samples to display in line and barcharts by default.toGlobalSettingUIZNumero di campioni da conservare nei grafici.;Number of samples to keep in line and barcharts by default.toGlobalSettingUIxNumero di avvisi di stato da salvare nell'archivio messaggi.9Number of status messages to save in the message history.toGlobalSettingUIOpzioniOptionstoGlobalSettingUIPercorsiPathstoGlobalSettingUI@Ripristina la sessione all'avvioRestore session on startuptoGlobalSettingUIZMostra la griglia nella tabella dei risultati(Show grid lines in output results table.toGlobalSettingUI&Unit di dimensione Size UnittoGlobalSettingUI&&Messaggio di statoStatus &messagetoGlobalSettingUI2Delimitato da tabulazioni Tab delimitedtoGlobalSettingUI TestoTexttoGlobalSettingUIHLo stile da usare per l'interfaccia.(The style to use for the user interface.toGlobalSettingUITraduzione TranslationtoGlobalSettingUIIllimitati UnlimitedtoGlobalSettingUI0Usare la cache del discoUse Disk CachingtoGlobalSettingUIQuale lingua usare per questo programma. Dovete riavviare per renderla effettiva.NWhich translation locale to use for this program. Must restart to have effect.toGlobalSettingUITutti i manuali All manualstoHelp,Indietro di una paginaBackward one help pagetoHelpContenutiContentstoHelp(Avanti di una paginaForward one help pagetoHelp$Finestra dell'help Help windowtoHelpManualeManualtoHelpManualiManuals:toHelp~Nodo mancante, dl non bilanciato nel contenuto del file di help2Missing parent, unbalanced dl in help file contenttoHelpRisultatoResulttoHelp CercaSearchtoHelp Cerca:Search:toHelpManuale di TOra TOra manualtoHelp&Sfoglia&BrowsetoHelpAddFileUI&Ok&OktoHelpAddFileUI&File di indice&Table of contents filetoHelpAddFileUI&Titolo&TitletoHelpAddFileUI2Aggiungi cartella di helpAdd help directorytoHelpAddFileUIErrore nel file File error toHelpPrefs(&Aggiungi un Manuale &Add Manual toHelpSetupUI&Manuali Oracle&Oracle Manuals toHelpSetupUI&&Rimuovi un Manuale&Remove Manual toHelpSetupUILAggiungi manuali da una pagina Oracle.&Add manuals from an Oracle index page. toHelpSetupUIHAggiungi manuali da una pagina index Oracle. E' la pagina indice che si collega ai manuali. Non la pagina principale che si collega alle varie categorie di manuali.Add manuals from an Oracle index page. This is the index page that links to the actual manuals. Not the master index page that links to different categories of manuals. toHelpSetupUINome fileFilename toHelpSetupUI Form1Form1 toHelpSetupUI TitoloTitle toHelpSetupUILErrato superamento della fine del file!Invalidly went beyond end of filetoHtml&< isolato alla fine Lone < at endtoHtml6Lettura dell'HTML oltre EOFReading HTML after eoftoHtml0Tag non chiuso alla fineUnended tag at endtoHtml$Oggetti non validiInvalid Objects toInvalidAggiorna lista Refresh list toInvalidOggettoObjecttoInvalid:ListInvalidProprietarioOwnertoInvalid:ListInvalidTipoTypetoInvalid:ListInvalid*&Gestione grafici ...&Chart Manager... toLineChart6&Apri in una nuova finestra&Open in new window toLineChart&Stampa ... &Print... toLineChart&Propriet ...&Properties... toLineChart Vuota il grafico Clear Chart toLineChart"Grafici abilitatiEnabled charts toLineChartZoomZoom toLineChart&Ok&OktoLineChartSetupUI TuttoAlltoLineChartSetupUI,Rileva automaticamente Auto detecttoLineChartSetupUIAnnullaCanceltoLineChartSetupUI>Dividere il grafico in griglie?Divide chart in grids?toLineChartSetupUIValore massimo Max valuetoLineChartSetupUILMassimo numero di campioni da mostrare$Maximum number of samples to displaytoLineChartSetupUIValore minimo Min valuetoLineChartSetupUI:Numero di campioni da salvareNumber of samples to keeptoLineChartSetupUI.Mostra scala degli assiShow axis legendtoLineChartSetupUI4Mostra legenda del graficoShow chart legendtoLineChartSetupUI(Mostra ultimo valoreShow last valuetoLineChartSetupUIIllimitato UnlimitedtoLineChartSetupUI Asse YY-axistoLineChartSetupUI&Copia campo &Copy field toListView$Copia la selezioneCopy selection toListView,Mostra nell'editor ...Display in editor... toListView"Stampa effettuata Done printing toListView Modifica SQL ... Edit SQL... toListView&Esporta su file ...Export to file... toListViewPagina: %1Page: %1 toListView,Stampa della pagina %1Printing page %1 toListViewSeleziona tutto Select all toListViewLog4PL/SQL Log4PL/SQL toLogOutputOutput SQL SQL Output toLogOutput"Inform&azioni su &About toMain&Sovrapponi&CascadetoMain,&Chiudi la connessione&Close ConnectiontoMain&Commit&Commit ConnectiontoMain&Contenuti ... &Contents...toMain &Copia&CopytoMain&Connessione attuale&Current ConnectiontoMain&Modifica&EdittoMain &File&FiletoMain&?&HelptoMain&Licenza ... &License...toMain,&Nuova connessione ...&New Connection...toMain&No&NotoMain&Apri file ... &Open File...toMain&Incolla&PastetoMain&Preferenze&Preferences...toMain&Stampa ... &Print...toMain &Esci&QuittoMain&Ripeti&RedotoMain&Rollback&Rollback ConnectiontoMain&Salva file... &Save File...toMain2&Trova && Sostituisci ...&Search && Replace...toMain.&Affianca verticalmente&TiletoMain&Strumenti&ToolstoMain&Annulla&UndotoMain &Vista&ViewtoMainFi&nestra&WindowtoMain&Si&YestoMain,Inform&azioni su Qt... About &Qt...toMainApplicazione ApplicationtoMain&Selezione a BlocchiBlock SelectiontoMainC&hiudiC&losetoMain*Contesto Att&uale ...C&urrent Context...toMainRImpossibile trovare la connessione attivaCan't find active connectiontoMainAnnullaCanceltoMainChiudi &Tutto Close &AlltoMainChiudi sessione Close SessiontoMainColonna:Col:toMainREseguire Commit su %1 prima di chiuderlo?/Commit work in session to %1 before closing it?toMain2Salvare il lavoro nel DB? Commit work?toMainConnessioni ConnectionstoMain CopiaCopy to clipboardtoMainNImpossibile trovare la connessione (%1))Couldn't find specified connectionts (%1)toMain&TagliaCu&ttoMain TagliaCut to clipboardtoMain8Inserisci la password per %1Enter password for %1toMain*Inserisci la passwordInput passwordtoMain6File di sessione non validoInvalid session filetoMain8Nessuna query in background.No background queries.toMain(Apri la sessione ...Open Session...toMainIncollaPaste from clipboardtoMainFile r&ecenti R&ecent FilestoMain0Leggi tutti gli oggett&iRead All &ItemstoMain<Rileggi la cache degli oggettiReread Object CachetoMain8Ripristina l'ultima sessioneRestore Last SessiontoMain Riga:Row:toMain$Salv&a con nome... Save &As...toMain*Salva la sessione ...Save Session...toMain&Trova & sostituisciSearch & replacetoMain"Trova succ&essivo Search &NexttoMain Seleziona &Tutto Select &AlltoMain*Blocca tutte le queryStop All QueriestoMainlIl file di sessione non valido, impossibile leggere.-The session file is not valid, can't read it.toMainStrumentiToolstoMain &Copia&Copy toMarkedText&No&No toMarkedText&Incolla&Paste toMarkedText&Ripeti&Redo toMarkedTextAnn&ulla&Undo toMarkedText&S&Yes toMarkedTextAnnullaCancel toMarkedTextPulisciClear toMarkedText Pulisci l'editor Clear editor toMarkedText CopiaCopy to clipboard toMarkedText&TagliaCu&t toMarkedText TagliaCut to clipboard toMarkedText2File aperto correttamenteFile opened successfully toMarkedText(Ricerca incrementaleIncremental search toMarkedText*Incolla dagli appuntiPaste from clipboard toMarkedTextStampa %1Print %1 toMarkedText Stampa DocumentoPrint Document toMarkedText*Salvare le modifiche? Save changes? toMarkedText Seleziona &Tutto Select &All toMarkedTextL'editor stato cambiato, vuoi salvare le modifiche prima di aprire un nuovo file?PThe editor has been changed, do you want to save them before opening a new file? toMarkedText CopiaCopy to clipboard toMemoEditor TagliaCut to clipboard toMemoEditorPrima colonna First column toMemoEditorUltima colonna Last column toMemoEditorNULLNULL toMemoEditor$Colonna successiva Next column toMemoEditorApri file Open file toMemoEditorIncollaPaste from clipboard toMemoEditor$Colonna precedentePrevious column toMemoEditor$Salva le modifiche Save changes toMemoEditorSalva file Save file toMemoEditor AvvisoWarning message toMessageUI CopiaCopy to clipboard toModelEditor TagliaCut to clipboard toModelEditorPrima colonna First column toModelEditorUltima colonna Last column toModelEditorNULLNULL toModelEditor$Colonna successiva Next column toModelEditorApri file Open file toModelEditorIncollaPaste from clipboard toModelEditor$Colonna precedentePrevious column toModelEditor$Salva le modifiche Save changes toModelEditorSalva file Save file toModelEditor"A capo automatico Word Wrap toModelEditorElimina&DeletetoNewConnectionFImpossibile connettersi al database!Unable to connect to the databasetoNewConnectionJImpossibile connettersi al database. #Unable to connect to the database. toNewConnection&Database &DatabasetoNewConnectionUI &Host&HosttoNewConnectionUI4&Importa le connessioni...&Import Connections...toNewConnectionUI&Password &PasswordtoNewConnectionUI&Nome utente &UsernametoNewConnectionUILista di connessioni utilizzate di recente. Seleziona per attivare.BA list of previous connections. Select to bring over to the right.toNewConnectionUI(Tip&o di connessioneConnection pro&vidertoNewConnectionUI"Nuova connessioneNew connectiontoNewConnectionUIOpzioniOptionstoNewConnectionUI P&ortaP&orttoNewConnectionUIJPassword da usare per la connessione.Password to connect with.toNewConnectionUI*Archivio &connessioniPrevious &connectionstoNewConnectionUI(Schema a cui passareSchema to switch totoNewConnectionUIC&erca:Se&arch:toNewConnectionUIVSeleziona il database ID a cui connettersi.%Select the database ID to connect to.toNewConnectionUI8Username con cui connettersiUsername to connect withtoNewConnectionUI6Impossibile aprire la queryCouldn't open querytoNoBlockQueryTImpossibile avviare la query in background'Failed to start background query threadtoNoBlockQuery^Riavvio della query in una connessione separata"Restarting query in own connectiontoNoBlockQuery$Errore sconosciutoUnknown exceptiontoNoBlockQueryErrore inattesoUnexpected errortoNow6Inserisci la nuova passwordEnter new passwordtoOracleConnection>Ripeti la password per conferma%Enter password again for confirmationtoOracleConnection Password scadutaPassword expiredtoOracleConnection<Le due password non coincidonoThe two passwords doesn't matchtoOracleConnection<La Constraint %1.%2 non esisteConstraint %1.%2 doesn't existtoOracleExtractNImpossibile trovare la constraint %1.%2Couldn't find constraint %1.%2toOracleExtractDImpossibile trovare l'indice %1.%2Couldn't find index %1.%2toOracleExtract@Impossibile trovare il log %1.%2Couldn't find log %1.%2toOracleExtract^Impossibile trovare la chiave primaria di %1.%2"Couldn't find primary key of %1.%2toOracleExtractBImpossibile trovare il profilo %1Couldn't find profile %1toOracleExtract>Impossibile trovare il ruolo %1Couldn't find role %1toOracleExtractDImpossibile trovare la sequenza %1Couldn't find sequence %1toOracleExtractJImpossibile trovare il sinonimo %1.%2Couldn't find synonym %1.%2toOracleExtractHImpossibile trovare la tabella %1.%2Couldn't find table %1.%2toOracleExtractHImpossibile trovare il tablespace %1Couldn't find tablespace %1toOracleExtractHImpossibile trovare il trigger %1.%2Couldn't find trigger %1.%2toOracleExtract>Impossibile trovare l'utente %1Couldn't find user %1toOracleExtractDImpossibile trovare la vista %1.%2Couldn't find view %1.%2toOracleExtract4Il DBLink %1.%2 non esisteDBLink %1.%2 doesn't existtoOracleExtract(Nome del &Checkpoint&Checkpoint nametoOracleSettingUI,Formato &data standard&Default date formattoOracleSettingUI(Tabella per &Explain&Explain plan tabletoOracleSettingUIV&Massima lunghezza dei dati "long" e "blob"&Max long and LOB data lengthtoOracleSettingUICrea Tabella Create TabletoOracleSettingUI Form1Form1toOracleSettingUIMassima volume letto da campi LOB o LONG. I LONG non possono essere definiti come illimitati ma saranno limitati a 33000 se illimitati.Max length to read from LOB or LONG data fields. LONG:s can not be specified unlimited but will be defaulted to 33000 if unlimited.toOracleSettingUIZNumero massimo di cursori da mantenere apertiMaximum cursors to keep opentoOracleSettingUIzNome della tabella in cui mettere l'output dell'explain plan.0Name of the table to put explain plan output in.toOracleSettingUItIl formato data standard da usare nelle query al database.9The default dateformat to use when querying the database.toOracleSettingUIlIl nome del checkpoint usato per eseguire il rollback.=The name of the checkpoint used when needed to rollback work.toOracleSettingUIIllimitato UnlimitedtoOracleSettingUI&Output&OutputtoOutputElimina output Clear outputtoOutputvImpossibile abilitare/disabilitare l'output per la sessione*Couldn't enable/disable output for sessiontoOutput Output abilitatoOutput enabledtoOutputAggiornaRefreshtoOutputOutput SQL SQL OutputtoOutput0Intervall&o di controllo&Polling timeout toOutputPrefs,&Utente per Log4PL/SQLLog4PL/SQL &User toOutputPrefsOutput SQL SQL Output toOutputPrefsdIntervallo di tempo tra due verifiche dell'output.'Time between trying to poll for output. toOutputPrefs&Compila&Compile toPLSQLEditor&Nuovo foglio &New Sheet toPLSQLEditor ChiudiClose toPLSQLEditor$&Errore Successivo Next &Error toPLSQLEditor$Errore &PrecedentePre&vious Error toPLSQLEditorAggiornaRefresh toPLSQLEditorSconosciutoUnknown toPLSQLEditor8Inizio del codice non validoInvalid start of code toPLSQLTextContenutiContents toPLSQLWidgetMessaggioMessage toPLSQLWidget&Ok&Ok toParamGet,Esecuzione abbandonataAborted execution toParamGetAnnullaCancel toParamGetModificaEdit toParamGet&Nome campo mancanteMissing field name toParamGetNULLNULL toParamGet6Inserisci la nuova passwordEnter new passwordtoPasswordToolPInserisci la nuova password per conferma)Enter new password again for confirmationtoPasswordToolBLe due password non corrispondonoPasswords doesn't matchtoPasswordToolTLe due password non corrispondono, riprova8The two givens passwords doesn't match, please try againtoPasswordTool6&Apri in una nuova finestra&Open in new window toPieChart&Stampa ... &Print... toPieChartRTutti i valori sono a 0 in questo graficoAll values are 0 in this chart toPieChart2Impostazioni del databaseDatabase Settings toPreferences0Impostazioni dell'editorEditor Settings toPreferences*Impostazioni generaliGlobal Settings toPreferencesStrumentiTools toPreferences &Aiuto&HelptoPreferencesUI&Ok&OktoPreferencesUIAnnullaCanceltoPreferencesUIImpostazioni PreferencestoPreferencesUI%1 runs toProfiler&No&No toProfiler&Si&Yes toProfilerCommentoComment toProfilerPL/SQL ProfilerPL/SQL Profiler toProfilerAggiorna lista Refresh list toProfilerRisultatoResult toProfiler ScriptScript toProfilerXErrore durante la raccolta delle statistiche*Something went wrong collecting statistics toProfilerSconosciutoUnknown toProfiler2Aggiungi file al progettoAdd file to project toProject>Aggiungi un nuovo sottoprogettoAdd new subproject toProjectFileFile toProject@Genera l'SQL per questo progettoGenerate SQL for this project toProject2Rimuovi file dal progettoRemove file from project toProjectProgetto SQL SQL Project toProjectProgetto SQL SQL project toProject"Salva il progetto Save project toProjectDimensioneSize toProjectuntitled.tpr untitled.tpr toProject"Query abbandonata Query abortedtoQuery<Impossibile aprire il file %1.Couldn't open file %1. toReadFile 1 min1 mintoRefreshCreate 10 min10 mintoRefreshCreate10 secondi 10 secondstoRefreshCreate2 secondi 2 secondstoRefreshCreate30 secondi 30 secondstoRefreshCreate 5 min5 mintoRefreshCreate5 secondi 5 secondstoRefreshCreateNessunoNonetoRefreshCreate0<H1>Oggetti Globali</H1>

Global Objects

toReport<H1>Public</H1>

Public

toReport&<H1>Schema %1</H1> 

Schema %1

toReport<H4>COLONNE</H4> <TABLE WIDTH=100% BORDER=0><TR><TH ALIGN=left WIDTH=25%>Nome</TH>R

COLUMNS

toReport<HTML><HEAD><TITLE>Report sul database %7</TITLE></HEAD> <BODY><H1>Report sul database %8</H1> <TABLE BORDER=0> <TR><TD VALIGN=top>Generato da:</TD><TD VALIGN=top>TOra, Versione %1</TD></TR> <TR><TD VALIGN=top>Su:</TD><TD VALIGN=top>%2</TD></TR> <TR><TD VALIGN=top>Da:</TD><TD VALIGN=top>%3, un database %4 %5</TD></TR> <TR><TD VALIGN=top>Il:</TD><TD VALIGN=top>%6</TD></TR> </TABLE>Report on database %7

Report on database %8

Name
Generated by:TOra, Version %1
At:%2
From:%3, an %4 %5 database
On:%6
toReportR<TH ALIGN=left WIDTH=25%>Definizione</TH>(DefinitiontoReportR<TH ALIGN=left WIDTH=50%>Descrizione</TH>)DescriptiontoReport Modifica SQL ... Edit SQL... toResultBar*</B> sinonimo per <B>
synonym for  toResultColsAnnullaCanceltoResultContentFilterUI>Definizione filtri per l'editorContent editor filter settingstoResultContentFilterUIOkOktoResultContentFilterUI*&Criteri di selezioneSelection &criteriatoResultContentFilterUICriterio di selezione da usare per ottenere gli oggetti da editare. Simile a ci che segue la WHERE di una SELECT.XSelection criteria to use getting items to edit. Same as after where in a select clause.toResultContentFilterUIf&Ordinamento dati. Separare le colonne con virgole.)Sort &order. Separate columns with comma.toResultContentFilterUI,&Colonne della tabellaTable &columnstoResultContentFilterUIpL'ordinamento da usare per i dati estratti dal database.=The sort order to use when retreiving data from the database.toResultContentFilterUI0Usa per tutte le tabelleUse for all tablestoResultContentFilterUI &Tutte&All toResultData0Aggiungi un nuovo recordAdd a new record toResultData&Definisci un filtroDefine filter for editor toResultDataRCancella il record corrente dalla tabella Delete current record from table toResultData&Vai alla prima rigaGo to first row toResultData&Vai all'ultima rigaGo to last row toResultData,Vai alla prossima rigaGo to next row toResultData0Vai alla riga precedenteGo to previous row toResultData"Rimuovi il filtro Remove filter toResultData$Salva le modifiche Save changes toResultDataPVisualizzazione tabella o singolo record-Toggle between table or single record editing toResultDataModificaEdittoResultDataSingleDipendenze DependencytoResultDependNomeNametoResultDependProprietarioOwnertoResultDependTipoTypetoResultDepend&Oggetto non trovatoObject not foundtoResultExtract Modifica SQL ... Edit SQL... toResultLineCSVCSVtoResultListFormatHTMLHTMLtoResultListFormatSQLSQLtoResultListFormat2Delimitato da tabulazioni Tab delimitedtoResultListFormat TestoTexttoResultListFormatR&Scegli il formato del file da esportare. &Choose format of exported file.toResultListFormatUI&Ok&OktoResultListFormatUIAnnullaCanceltoResultListFormatUI"Scegli il formato Choose formattoResultListFormatUIDelimitatore DelimitertoResultListFormatUISeparatore SeparatortoResultListFormatUIOggettoObject toResultLock"Utente di sistemaOsuser toResultLockProgrammaProgram toResultLock SchemaSchema toResultLockSessioneSession toResultLockTipoType toResultLock&%1 righe processate%1 rows processed toResultLongQuery eseguitaQuery executed toResultLong@# Generato da TOra versione %1  # Generated by TOra version %1  toResultParamNApplica le modifiche solo alla sessioneApply changes to session toResultParam>Applica le modifiche al sistemaApply changes to system toResultParamCambiatoChanged toResultParam*Annulla i cambiamentiDrop current changes toResultParam(Editor dei parametriParameter editor toResultParamCambiatoChangedtoResultParam:ListParamDescrizione DescriptiontoResultParam:ListParamParametro ParametertoResultParam:ListParam ValoreValuetoResultParam:ListParam&No&No toResultPlan&Si&Yes toResultPlan BytesBytes toResultPlan CostoCost toResultPlanNome oggetto Object name toResultPlanOperazione Operation toResultPlanOptions toResultPlan@La tabella di explain non esistePlan table doesn't exist toResultPlanhLa tabella di explain %1 non esiste. Crearla adesso?CSpecified plan table %1 didn't exist. Should TOra try to create it? toResultPlan TempoTime toResultPlan2Data di primo caricamentoFirst Load TimetoResultResources:Information Righe ProcessateRows ProcessedtoResultResources:Information|Non possibile cambiare sessione sulle statistiche di sistema)Can't change session on system statistics toResultStats DeltaDelta toResultStatsNomeName toResultStats ValoreValue toResultStatsDisponibile AvailabletoResultStorageContenutiContentstoResultStorageLibero (%1) Free (%1)toResultStorage Frammenti liberiFree fragmentstoResultStorageInformazioni InformationtoResultStorageNomeNametoResultStorage.Nessun file selezionatoNo file selectedtoResultStorage:Nessun tablespace selezionatoNo tablespace selectedtoResultStorageDimensione (%1) Size (%1)toResultStorage StatoStatustoResultStorageTablespace TablespacetoResultStorage8Utilizzato/Libero/AutoextendUsed/Free/AutoextendtoResultStorageBStrano, nome del tablespace vuotoWeird, empty tablespace nametoResultStorage&Copia campo &Copy fieldtoResultTableView.&Mostra nell'editor ...&Display in editor...toResultTableView"&Modifica SQL ... &Edit SQL...toResultTableView:Nessun cambiamento effettuatoNo changes madetoResultTableViewEditQuesta tabella contiene sono colonne di tipo LOB/LONG e non pu essere editata?This table contains only LOB/LONG columns and can not be editedtoResultTableViewEdit&Rollback &Rollback toRollbackZSei sicuro di voler eliminare il segmento %1.-Are you sure you want to drop the segment %1. toRollbackAnnullaCancel toRollback<Crea un nuovo rollback segmentCreate new rollback segment toRollback6Elimina il rollback segmentDrop rollback segment toRollback Elimina segmento Drop segment toRollback6Nessun segmento selezionatoNo segment selected toRollbackCursori Aperti Open Cursors toRollbackAggiornaRefresh toRollback2Porta il segmento offlineTake segment offline toRollback0Porta il segmento onlineTake segment online toRollback<Aggiorna la lista dei segmentiUpdate segment list toRollback BloccoBlocktoRollback:InformationBlocchiBlockstoRollback:InformationAttualeCurrenttoRollback:InformationAttuale (MB) Current (MB)toRollback:InformationExtentsExtentstoRollback:InformationIniziale (MB) Initial (MB)toRollback:InformationProssimo (MB) Next (MB)toRollback:InformationOttimale (MB) Optimal (MB)toRollback:InformationProprietarioOwnertoRollback:Information,Incremento percentuale PCT IncreasetoRollback:InformationLettureReadstoRollback:InformationSegmentoSegmenttoRollback:Information StatoStatustoRollback:InformationTablespace TablespacetoRollback:InformationTransazioni TransactionstoRollback:InformationUsato (MB) Used (MB)toRollback:InformationUtente Oracle Oracle UsertoRollback:TransactionUsers"Utente di sistemaOs UsertoRollback:TransactionUsers Rollback Segment Rollback SegtoRollback:TransactionUsersID di sessione Session IDtoRollback:TransactionUsers:Nessun cambiamento effettuatoNo changes madetoRollbackDialogStorageStoragetoRollbackDialog &Nome&NametoRollbackDialogUI&Ok&OktoRollbackDialogUI&Pubblico&PublictoRollbackDialogUI&Tablespace &TablespacetoRollbackDialogUIAnnullaCanceltoRollbackDialogUItMostra l'SQL utilizzato per generare l'oggetto specificato5Display the SQL used to generate the specified objecttoRollbackDialogUIPDeve essere un rollback segment pubblico7If this should be a publicly available rollback segmenttoRollbackDialogUI,Modifica il tablespaceModify tablespacetoRollbackDialogUI Rollback SegmentRollback SegmenttoRollbackDialogUISQLSQLtoRollbackOpenInizia sempre dal bordo sinistro mostrando l'utilizzo degli extent.?Always start from the left border when displaying extent usage.toRollbackPrefsFImpossibile trovare l'SQL nella SGA"Couldn't find SQL statement in SGAtoSGAStatement&Piano di esecuzioneExecution plantoSGAStatementInformazioni InformationtoSGAStatementSQLSQLtoSGAStatement TuttoAll toSGATraceQualsiasiAny toSGATraceAggiornaRefresh toSGATraceSGASGA toSGATraceSGA Trace SGA trace toSGATrace SchemaSchema toSGATraceSelezione Selection toSGATraceTipoType toSGATrace2&Aggiornamento automatico &Auto updatetoSGATracePrefsSGA Trace SGA TracetoSGATracePrefstAggiorna automaticamente dopo un cambiamento dello schema.,Update automatically after change of schema.toSGATracePrefsConnesso a %1Connected to %1toSMTP"Messaggio inviato Message senttoSMTPHRisposta inattesa dal server SMTP: $Unexpected reply from SMTP server: toSMTPfErrore nel file di dizionario. Due '[' prima di '='9Malformed line in SQL dictionary file. Two '[' before '='toSQLCarattere di escape sconosciuto nella stringa (Solo \\ e \n sono accettati)>Unknown escape character in string (Only \\ and \n recognised)toSQL&No&No toSQLEdit&Ok&Ok toSQLEdit&Si&Yes toSQLEditAnnullaCancel toSQLEditDatabaseDatabase toSQLEditDescrizione Description toSQLEdit@Carica un file di dizionario SQLLoad SQL dictionary file toSQLEdit(Descrizione mancanteMissing description toSQLEditNomeName toSQLEditDescrizione Mancante. E' necessario per salvarel'SQL. Definito "non descritto".[No description filled in. This is necessary to save SQL. Adding undescribed as description. toSQLEditEditor SQL SQL editor toSQLEditLSalva i cambiamenti nel dizionario SQL$Save changes into the SQL dictionary toSQLEdit^Salva l'SQL modificato in un file di dizionario$Save modified SQL to dictionary file toSQLEditNon descritto Undescribed toSQLEdit2Formato o versione erratiWrong format of version toSQLEdit"&Modifica SQL ... &Edit SQL... toSQLEditToolFIndirizzo SQL non trovato nella SGASQL Address not found in SGA toSQLString>Query SQL non trovata nella SGASQL Query not found in SGAtoSQLToAddressrErrore interno in toSQLParse, non dovresti mai essere qui3Internal error in toSQLParse, should never get here toSQLparseJParentesi non bilanciate (Troppe '(')%Unbalanced parenthesis (Too many '(') toSQLparseJParentesi non bilanciate (Troppe ')')%Unbalanced parenthesis (Too many ')') toSQLparse&Iniziale&InitialtoScript&Prossimo&NexttoScript&Si&YestoScript CreatoCreatedtoScript,Estrazione e ConfrontoExtraction and ComparetoScript:Errore Interno, lastLevel < 0Internal error, lastLevel < 0toScriptNessunoNonetoScript8Esegui l'estrazione definitaPerform defined extractiontoScript StessoSametoScript0Selezionare una cartellaSelect a DirectorytoScript &Includi oggetti&Include objectstoScriptSchemaWidget TuttoAlltoScriptSchemaWidgetConnessione ConnectiontoScriptSchemaWidget SchemaSchematoScriptSchemaWidgetOggettiObjectstoScriptTreeModel&Aggiungi&Add toScriptUI&Opzioni&Options toScriptUI&Rimuovi&Remove toScriptUI &Cerca&Search toScriptUI8Ridimensionamento Automatico Auto resize toScriptUISfogliaBrowse toScriptUIConfrontaCompare toScriptUI>Confronta due Database o Schemi Compare two databases or schemas toScriptUIConfigurazione Configuration toScriptUI0Contiene tutte le paroleContain all words toScriptUI4Contiene almeno una parolaContain any words toScriptUICrea gli script per convertire lo schema o il database dall'origine alla destinazionePCreate database scripts to convert schema or database from source to destination toScriptUI2Ridimensionamento manuale Custom resize toScriptUIDifferenze Difference toScriptUI$Non ridimensionare Don't resize toScriptUI*Corrispondenza esatta Exact match toScriptUI EstraiExtract toScriptUInEstrai lo script per ricreare gli oggetti del database.,Extract script to recreate database objects. toScriptUI*Aggiungi intestazioneGenerate header toScriptUIZAggiungi intestazione all'inizio dello script(Generate header at the top of the script toScriptUIGenera avvisiGenerate prompts toScriptUIfGenera avvisi per mostrare l'avanzamento in SQLPlus/Generate prompts to display progress in SQLPlus toScriptUISchema generatoGenerated schema toScriptUIIncludi DDL Include DDL toScriptUI Includi commentiInclude comments toScriptUI&Includi constraintsInclude constraints toScriptUIDIncludi il contenuto delle tabelleInclude content of tables toScriptUIIncludi grantsInclude grants toScriptUIIncludi indiciInclude indexes toScriptUI:Includi dati sul parallelismoInclude parallel specification toScriptUI@Includi dati sul partizionamentoInclude partition specification toScriptUIInizialeInitial toScriptUILimite maxLimit toScriptUIProssimoNext toScriptUINessunoNone toScriptUI RegExpRegExp toScriptUIRidimensionaResize toScriptUIRisultatoResult toScriptUI StessoSame toScriptUI0Ridimensionamento Script Script Resize toScriptUI CercaSearch toScriptUI\Seleziona lo schema da riprodurre nello script'Select the schema to generate in script toScriptUI&Prossimo&NexttoSearchReplaceUI&Sostituisci&ReplacetoSearchReplaceUI$Sostituisci &Tutto Replace &AlltoSearchReplaceUIModo di ricerca Search modetoSearchReplaceUI&Generale&General toSecurity*Privilegi su &Oggetti&Object Privileges toSecurity &Quota di spazio&Quota toSecurity &Ruoli&Roles toSecurity&Sicurezza &Security toSecurity*Privilegi di &Sistema&System Privileges toSecurity(Aggiungi nuovo ruolo Add new role toSecurity*Aggiungi nuovo utente Add new user toSecuritySei sicuro? Are you sure? toSecurityAnnullaCancel toSecurityDCopia l'utente o il ruolo correnteCopy current user or role toSecurity ScartaDiscard toSecurity4Mostra l'SQL da utilizzare*Display SQL needed to make current changes toSecurity4ID di sicurezza non validoInvalid security ID toSecurityNoNo toSecurity:Nessun cambiamento effettuatoNo changes made toSecurity(Elimina utente/ruoloRemove user/role toSecurity RuoliRoles toSecurity SalvaSave toSecurity$Salva le modifiche Save changes toSecurity,Salvare i cambiamenti? Save changes? toSecurityZSalvare i cambiamenti fatti da questo utente?#Save the changes made to this user? toSecurity0Gestione della sicurezzaSecurity manager toSecurity|L'utente possiede ancora degli oggetti, eliminarli in cascata?4The user still owns objects, add the cascade option? toSecurityTAggiorna la lista degli utenti e dei ruoliUpdate user and role list toSecurityUtenti/Ruoli Users/Roles toSecuritySiYes toSecurityNessunoNonetoSecurityQuotaIllimitato UnlimitedtoSecurityQuota&Nessuno&NonetoSecurityQuotaUI&Illimitato &UnlimitedtoSecurityQuotaUI&Valore&ValuetoSecurityQuotaUIxAppartiene al gruppo Resource o non ha limiti sul tablespace?Belongs to Resource group or has unlimited tablespace privilegetoSecurityQuotaUI,Dimensione della quota Quota SizetoSecurityQuotaUITablespace TablespacetoSecurityQuotaUI*Dimensione Utilizzata Used SizetoSecurityQuotaUIAnnullaCanceltoSecurityRoleNon salvare Don't savetoSecurityRoleBLe due password non corrispondonoPasswords don't matchtoSecurityRole`Le due versioni della password non corrispondono.The two versions of the password doesn't matchtoSecurityRole AdminAdmintoSecurityRoleGrantStandardDefaulttoSecurityRoleGrantONONtoSecurityRoleGrantNome del ruolo Role nametoSecurityRoleGrantSiYEStoSecurityRoleGrant&Esterno &ExternaltoSecurityRoleUI&Globale&GlobaltoSecurityRoleUI &Nome&NametoSecurityRoleUI&Password &PasswordtoSecurityRoleUI(Conferma la passwordConfirm PasswordtoSecurityRoleUI,Inserisci una passwordEnter PasswordtoSecurityRoleUI Form2Form2toSecurityRoleUITNessuna pasword richiesta per questo ruoloNo password required for roletoSecurityRoleUINessunoNonetoSecurityRoleUINRuolo autenticato dal sistema operativo*Role authenticated by the operating systemtoSecurityRoleUI:Ruolo autenticato globalmenteRole authenticated globallytoSecurityRoleUI AdminAdmintoSecuritySystemNONOtoSecuritySystemONONtoSecuritySystem&Nome del privilegioPrivilege nametoSecuritySystemOggettiObjectstoSecurityTreeModelAnnullaCanceltoSecurityUserNon salvare Don't savetoSecurityUserBLe due password non corrispondonoPasswords don't matchtoSecurityUser`Le due versioni della password non corrispondono.The two versions of the password doesn't matchtoSecurityUser"&Account Bloccato&Account LockedtoSecurityUserUI,Tablespace di &Default&Default TablespacetoSecurityUserUI&Esterno &ExternaltoSecurityUserUI&Globale&GlobaltoSecurityUserUI &Nome&NametoSecurityUserUI&Password &PasswordtoSecurityUserUI,Tablespace &Temporaneo&Temporary TablespacetoSecurityUserUI(Conferma la passwordConfirm PasswordtoSecurityUserUI,Inserisci una passwordEnter PasswordtoSecurityUserUI<Cambia password al primo loginExpire PasswordtoSecurityUserUI Form1Form1toSecurityUserUIP&rofiloP&rofiletoSecurityUserUIPUtente autenticato dal sistema operativo*User authenticated by the operating systemtoSecurityUserUI&No&No toSession&Sessione&Session toSession&Si&Yes toSession&Oggetti interessati Accessing toSession TuttoAll toSessionAnnullaCancel toSession2Salvare il lavoro nel DB? Commit work? toSession<Informazioni sulla connessione Connect Info toSession"SQL in esecuzioneCurrent Statement toSession>Annulla la sessione selezionataDisconnect selected session toSession Oggetti BloccatiLocked Objects toSession8Nascondi sessioni background No background toSession0Nascondi sessioni system No system toSessionCursori Aperti Open Cursors toSession Query precedentePrevious Statement toSessionAggiornaRefresh toSessionI/O di sessione Session I/O toSession"Gestione sessioniSession manager toSessionStatistiche Statistics toSession@Aggiorna la lista delle sessioniUpdate sessionlist toSessionOGGETTOOBJECTtoSession:AccessedObjectsPROPRIETARIOOWNERtoSession:AccessedObjectsTIPOTYPEtoSession:AccessedObjects,Tipo di autenticazioneAuthentication TypetoSession:ConnectInfo<Messaggio del servizio di reteNetwork Service BannertoSession:ConnectInfoNome UtenteOsusertoSession:ConnectInfoNome oggetto Object NametoSession:LockedObjectTipoTypetoSession:LockedObjectSQLSQLtoSession:OpenCursor Letture su discoPhysical readstoSession:SessionIOCPUCPUtoSession:SessionWaitI/O Diretto Direct I/OtoSession:SessionWaitLog fileLog filetoSession:SessionWait AltroOthertoSession:SessionWait(Esecuzione parallelaParallel executiontoSession:SessionWaitSQL*NetSQL*NettoSession:SessionWait(Scrittura completataWrite CompletetoSession:SessionWait>Impossibile trovare lo stile %1Failed to find style %1toSetSessionType&Caricamento pluginsLoading pluginstoSplash&Storage&Storage toStorageDAggiungi un datafile al tablespaceAdd datafile to tablespace toStoragelAbilita l'accesso in lettura e scrittura al tablespace%Allow read write access to tablespace toStorageAnnullaCancel toStorage0Crea un nuovo tablespaceCreate new tablespace toStorage Modifica il file Modify file toStorage&Modifica tablespaceModify tablespace toStorageSposta datafile Move datafile toStorageNormaleNormal toStoragenSeleziona il modo per portare il tablespace %1 offline.*Select mode to take tablespace %1 offline. toStorage@Attiva logging per il tablespace!Set tablespace default to logging toStorageFDisattiva logging per il tablespace$Set tablespace default to no logging toStorageHImposta tablespace come sola letturaSet tablespace to read only toStorage4Mostra dettagli ed extent.Show extent view. toStoragePMostra i tablespaces o solo i datafiles.#Show tablespaces or just datafiles. toStorage,Gestione dello storageStorage manager toStorage$Tablespace offlineTablespace offline toStorage6Porta il tablespace offlineTake tablespace offline toStorage4Porta il tablespace onlineTake tablespace online toStorageTemporaneo Temporary toStorageAggiornaUpdate toStorage&&Dimensione massima &Maximum sizetoStorageDatafile&Prossimo&NexttoStorageDatafile&Dimensione&SizetoStorageDatafileCrea datafileCreate datafiletoStorageDatafile.Nessun nome disponibileNo name availabletoStorageDatafile,&Auto estendi datafile&Auto extend datafiletoStorageDatafileUI&Sfoglia&BrowsetoStorageDatafileUI&Nome file &FilenametoStorageDatafileUI &Nome tablespace&Tablespace nametoStorageDatafileUI<Dimensione massima &ILLIMITATA&Unlimited max sizetoStorageDatafileUIAuto estendi Auto extendtoStorageDatafileUI Form1Form1toStorageDatafileUI(&Dimensione iniziale &Initial sizetoStorageDefinition(Prossima dime&nsione &Next sizetoStorageDefinition&Dimensione&SizetoStorageDefinitionDIncremento Percentuale di &default&Default PCT increasetoStorageDefinitionUI&Extents&ExtentstoStorageDefinitionUI(&Dimensione iniziale &Initial sizetoStorageDefinitionUI2Numero &massimo di extent&Maximum extentstoStorageDefinitionUI(Dimensione &ottimale &Optimal sizetoStorageDefinitionUI&Extents &Illimitati&Unlimited extentstoStorageDefinitionUI Incremento dimensionale standard del prossimo extent allcato. Una dimensione 0 impedisce il coalesce in background dello spazio liberomDefault increase in size of next allocated extent. A size of 0 will prevent background coalesce of free spacetoStorageDefinitionUI Form1Form1toStorageDefinitionUIhMassimo numero di extents da allocare per un oggetto3Maximum number of extents to allocate for an objecttoStorageDefinitionUInNumero di extents da allocare illimitato, se necessario7No limit to the number of extents to allocate if neededtoStorageDefinitionUITNumero di extents da allocare inizialmente'Number of extents to initially allocatetoStorageDefinitionUIAllocazione ottima degli extents. Liberer gli extents non utilizzati fino al valore specificatoOOptimal allocation of extents. Will free unused extents down to specified valuetoStorageDefinitionUI"Aggiungi datafile Add datafiletoStorageDialog&Aggiungi tablespaceAdd tablespacetoStorageDialogDatafileDatafiletoStorageDialog$Storage di defaultDefault StoragetoStorageDialog>Risposta non valida dalla queryInvalid response from querytoStorageDialogRisposta non valida dalla query (Attesi 4 valori, ottenuti %1) per %2.%3@Invalid response from query (Wanted 4, got %1 entries) for %2.%3toStorageDialog"Modifica datafileModify datafiletoStorageDialog:Nessun cambiamento effettuatoNo changes madetoStorageDialogTablespace TablespacetoStorageDialog&Ok&OktoStorageDialogUIAnnullaCanceltoStorageDialogUItMostra l'SQL utilizzato per generare l'oggetto specificato5Display the SQL used to generate the specified objecttoStorageDialogUI,Modifica il tablespaceModify tablespacetoStorageDialogUI Tab 2Tab 2toStorageDialogUIBlocchi: %1 Blocks: %1toStorageExtentExtents: %1 Extents: %1toStorageExtentFiles: %1 Files: %1toStorageExtentBlocchiBlockstoStorageObjectModelExtentsExtentstoStorageObjectModelProprietarioOwnertoStorageObjectModelPartizione PartitiontoStorageObjectModelSegmentoSegmenttoStorageObjectModelMostra un grafico di informazioni sull'autoextend invece del solo spazio libero.CDisplay graph of autoextend information instead of just free space.toStoragePrefsUI>Mostra gli &extent dell'oggettoDisplay object &extentstoStoragePrefsUIpMostra una lista degli Oggetti e delle Extent all'avvio.*Display object and extent list on startup.toStoragePrefsUIPMostra i tablespaces o solo i datafiles.&Display tablespaces or just datafiles.toStoragePrefsUI Form1Form1toStoragePrefsUI,Gestione dello storageStorage ManagertoStoragePrefsUIExtent &minimo&Minimum ExtenttoStorageTablespace.Dimen&sione dell'extent Extent &SizetoStorageTablespace&&Storage di default&Default storagetoStorageTablespaceUI&Dictionary &DictionarytoStorageTablespaceUIDGestione allocazione degli &Extent&Extent allocationtoStorageTablespaceUI&Online&OnlinetoStorageTablespaceUI&Opzioni&OptionstoStorageTablespaceUI&Permanente &PermanenttoStorageTablespaceUI Form1Form1toStorageTablespaceUI$Locale &automaticaLocal &autoallocationtoStorageTablespaceUI Locale &uniformeLocal &uniformtoStorageTablespaceUIGestisce gli extent dei tablespace usando le tabelle del dizionario1Manage tablespace extents using dictionary tablestoStorageTablespaceUIvIl tablespace deve essere online al momento della creazione3Should tablespace be online at the time of creationtoStorageTablespaceUIdSpecifica come lo spazio allocato nel tablespace0Specify how space is allocated in the tablespacetoStorageTablespaceUIIl tablespace gestito localmente con extent di dimensione fissa e specificataKThe tablespace is locally managed with fixed extent sizes of specified sizetoStorageTablespaceUI Tipo sconosciuto Unknown typetoSyntaxAnalyzer4Nome colore sconosciuto %1Unknown color name %1 toSyntaxSetup*Variabile sconosciutaUnknown variable toSyntaxSetup2&Completamento del codice&Code completiontoSyntaxSetupUIB&Indenta come la linea precedente&Indent same as previous linetoSyntaxSetupUI0Parole chiave &maiuscole&Keyword uppertoSyntaxSetupUI&Seleziona&PicktoSyntaxSetupUIAttiva il completamento del codice nell'editor SQL. Sconsigliato per connessioni lente.MActivate code completion in SQL editors. Not recommended on slow connections.toSyntaxSetupUI ScegliChoosetoSyntaxSetupUI"Esempio di codice Code exampletoSyntaxSetupUIConverti tutte le parole chiave in maiuscolo usando il testo con sintassi evidenziata. Disponibile solo per fonts monospaziati.nConvert all keywords to uppercase when displayingsyntaxhighlighted text. Only available for monospaced fonts.toSyntaxSetupUIAbilita l'evidenziazione della sintassi, o usa editor di testi semplice5Enable syntax highlighting, or use simple text editortoSyntaxSetupUI&Estensioni dei fileFilename extensionstoSyntaxSetupUI Form1Form1toSyntaxSetupUIIndenta la nuva linea nell'editor alla stessa colonna della linea precedenteFIndent a new line in an editor to the same column as the previous linetoSyntaxSetupUI Esempio di lista List exampletoSyntaxSetupUIOpzioniOptionstoSyntaxSetupUI,Evidenzia la &sintassiS&yntax highlightingtoSyntaxSetupUI.Oggetti della si&ntassiSy&ntax componentstoSyntaxSetupUI Esempio di testo Text exampletoSyntaxSetupUIDatabaseDatabase toTableSelect SchemaSchema toTableSelectTabellaTable toTableSelect:Errore Interno, lastLevel < 0Internal error, lastLevel < 0 toTemplateModelloTemplate toTemplate"Barra dei ModelliTemplate Toolbar toTemplate&Sfoglia&BrowsetoTemplateAddFileUI &File&FiletoTemplateAddFileUI&Ok&OktoTemplateAddFileUIOgge&tto&RoottoTemplateAddFileUI.Aggiungi modello (file)Add template filetoTemplateAddFileUI:Errore Interno, lastLevel < 0Internal error, lastLevel < 0toTemplateEdit&Descrizione &DescriptiontoTemplateEditUI &Nome&NametoTemplateEditUI&Ok&OktoTemplateEditUI&Anteprima&PreviewtoTemplateEditUI2Aggiungi un nuovo modelloAdd new templatetoTemplateEditUIAnnullaCanceltoTemplateEditUI\Descrizione. Pu essere anche in formato HTML.(Description text. Can be in HTML format.toTemplateEditUI"Nome del modello.Name of the template.toTemplateEditUIAnteprimaPreviewtoTemplateEditUI|Anteprima della descrizione. Premere il bottone per aggiornare6Preview of the description. Press the button to updatetoTemplateEditUIRimuoviRemovetoTemplateEditUI4Rimuovi il modello attualeRemove the current templatetoTemplateEditUIModelloTemplatetoTemplateEditUI$Editor dei modelliTemplate editortoTemplateEditUI&Ok&OktoTemplatePrefsAnnullaCanceltoTemplatePrefs4Impossibile aprire il fileCouldn't open filetoTemplatePrefs6Impossibile aprire il file.Couldn't open file.toTemplatePrefslImpossibile aprire il file. Iniziare su un nuovo file?&Couldn't open file. Start on new file?toTemplatePrefs:Impossibile scrivere sul fileCouldn't write filetoTemplatePrefs&Aggiungi file &Add FiletoTemplateSetupUI&Modifica file &Edit FiletoTemplateSetupUI&Rimuovi file &Remove FiletoTemplateSetupUINome fileFilenametoTemplateSetupUI Form1Form1toTemplateSetupUIOggettoRoottoTemplateSetupUIModelloTemplatetoTemplateToolAggiorna lista Refresh list toTemporary AvvisiAlert MessengertoToolGestione backupBackup ManagertoTool"Sessione correnteCurrent SessiontoToolFEstrazione/Confronto/Ricerca nel DBDB Extraction/Compare/SearchtoTool$Oggetti non validiInvalid ObjectstoToolTag errato nel file di configurazione. Manca un = sulla riga. (%1)4Malformed tag in config file. Missing = on row. (%1)toToolPL/SQL DebuggerPL/SQL DebuggertoToolPL/SQL ProfilerPL/SQL ProfilertoToolCambio passwordPassword ChangetoTool"Rollback SegmentsRollback SegmentstoToolSGA Trace SGA TracetoToolOutput SQL SQL OutputtoTool(Foglio di lavoro SQL SQL WorksheettoToolSchema BrowserSchema BrowsertoTool0Gestione della sicurezzaSecurity ManagertoTool2Ottimizzazione del server Server TuningtoToolSessioniSessionstoTool4Gestione delle statisticheStatistics ManagertoTool,Gestione dello storageStorage ManagertoToolCarattere di escape sconosciuto nella stringa (Solo \\ e \n sono accettati)>Unknown escape character in string (Only \\ and \n recognised)toTool&&Strumento standard &Default tooltoToolSettingUI(Strumenti &abilitati&Enabled toolstoToolSettingUI Form1Form1toToolSettingUISeleziona lo strumento da avviare all'apertura di una nuova connessione.@Select the default tool to pop up when opening a new connection.toToolSettingUISeleziona quali strumenti dovrebbero apparire nel menu e nella barra.:Select which tools should show up in the menu and toolbar.toToolSettingUIStrumentoTooltoToolSettingUIblocchi blocks/stoTuningF&Cambia intervallo di Aggiornamento&Change RefreshtoTuning&File I/O &File I/OtoTuning&Indicatori &IndicatorstoTuning&No&NotoTuning&Parametri &ParameterstoTuning&Statistiche &StatisticstoTuning&Ottimizzazione&TuningtoTuning0Sei sicuro di voler abilitare tutte le capacit di ottimizzazione. Questo pu sovraccaricare il database e, se non sei un Amministratore probabilmente non ti utile. Scegliere no di consentir comunque di abilitare o disabilitare le varie opzioni singolarmente quando necessario.Are you sure you want to enable all tuning features. This can put heavy strain on a database and unless you are the DBA you probably don't want this. Selecting no here will give you the option to enable or disable tabs individually as they are needed.toTuningZAttiva tutte le statistiche di ottimizzazioneEnable all tuning statisticstoTuningRAbilita e disabilita le opzioni di tuningEnable and disable tuning tabstoTuningIndicatore IndicatortoTuningOpzio&niOptio&nstoTuningAggiornaRefreshtoTuning2Ottimizzazione del server Server TuningtoTuning ValoreValuetoTuningRFormato errato del nome nel grafico (%1).#Wrong format of name on chart (%1).toTuningSiYestoTuning AttiviActivetoTuning:Charts:4BAClientsNon attiviInactivetoTuning:Charts:4BAClientsSistemaSystemtoTuning:Charts:4BAClientsChiamateCallstoTuning:Charts:6LNExecution CommitCommittoTuning:Charts:6LNExecution EseguiExecutetoTuning:Charts:6LNExecutionAllocati AllocatedtoTuning:ControlFileRecordsDimensioneSizetoTuning:ControlFileRecordsRecord totali Total RecordstoTuning:ControlFileRecordsTipoTypetoTuning:ControlFileRecords UsatiUsedtoTuning:ControlFileRecordsRecord usati Used RecordstoTuning:ControlFileRecordsSessioni aperteSessions CurrenttoTuning:LicenseAbilitatoEnabledtoTuning:OptionsParametro ParametertoTuning:Options MediaAveragetoTuningFileIOBlocchi letti Blocks ReadtoTuningFileIOBlocchi scrittiBlocks WrittentoTuningFileIOFile I/OFile I/OtoTuningFileIO MinimoMinimumtoTuningFileIOLettureReadstoTuningFileIOTablespace I/OTablespace I/OtoTuningFileIOScrittureWritestoTuningFileIOblocchiblocks/stoTuningFileIOblocchi blocks/stoTuningOverview$< Letture su disco< Physical readtoTuningOverview(Scritture su disco >Physical write >toTuningOverviewScala temporale TimescaletoTuningOverviewblocchiblocks/stoTuningOverview AttiviActivetoTuningOverviewUIGruppo attivo Active grouptoTuningOverviewUIAttivo/Totale Active/TotaltoTuningOverviewUIArchive logs Archive logstoTuningOverviewUIBackground BackgroundtoTuningOverviewUIBuffer Cache Buffer CachetoTuningOverviewUIClientsClientstoTuningOverviewUIDatafiles DatafilestoTuningOverviewUIDedicato DedicatedtoTuningOverviewUIDispatchers DispatcherstoTuningOverviewUI FilesFilestoTuningOverviewUI Files/Dimensioni Files/SizetoTuningOverviewUI Form1Form1toTuningOverviewUIParalleloParalleltoTuningOverviewUIProcessi ProcessestoTuningOverviewUIRedo Buffer Redo BuffertoTuningOverviewUIRedo Logs Redo LogstoTuningOverviewUISGASGAtoTuningOverviewUI$Inviati dal clientSend from clienttoTuningOverviewUI"Inviati al clientSend to clienttoTuningOverviewUI ServerServertoTuningOverviewUICondivisoSharedtoTuningOverviewUIShared Pool Shared PooltoTuningOverviewUITablespaces TablespacestoTuningOverviewUITextLabel3 TextLabel3toTuningOverviewUITextLabel5 TextLabel5toTuningOverviewUI TotaleTotaltoTuningOverviewUIUsato/Totale Used/TotaltoTuningOverviewUI Tabs disponibiliAvailable tabstoTuningSettingUI Form1Form1toTuningSettingUISeleziona quali viste che raccolgono dati in background devono essere utilizzate.ESelect which views collect data in the background that should be run.toTuningSettingUI2Ottimizzazione del server Server tuningtoTuningSettingUIAggiorna lista Refresh list toUnitTest SchemaSchema toUnitTestConnessioni ConnectionstoViewConnectionsCartelle DirectorytoViewDirectoryGrafico a barre Bar chart toVisualize(Visualizzazione datiData visualization toVisualize&Mostra legenda assiDisplay axis legend toVisualizeMostra griglia Display grid toVisualizeMostra legendaDisplay legend toVisualizeGrafico a linee Line chart toVisualizeLNumero di colonne da usare come titolo!Number of columns to use as title toVisualizeGrafico a torta Pie chart toVisualizeTitoli colonne Title columns toVisualize Aggiorna grafico Update chart toVisualize ColoreColor toWaitEvents ContaCount toWaitEventsDelta (1/s) Delta (1/s) toWaitEventsDelta (ms/s) Delta (ms/s) toWaitEventsDisplayDisplay toWaitEventslErrore interno, impossibile trovare (%1) nella usedMap*Internal error, can't find (%1) in usedMap toWaitEvents2Ottimizzazione del server Server Tuning toWaitEventsWait di sistemaSystem wait events toWaitEvents2Numero di wait di sistemaSystem wait events count toWaitEvents TempoTime toWaitEvents TotaleTotal toWaitEventsTotale (ms) Total (ms) toWaitEventsTipo di wait Wait type toWaitEventsms/sms/s toWaitEventswaits/swaits/s toWaitEvents&%1 righe processate%1 rows processed toWorksheet&Informazioni &Information toWorksheet&Ok&Ok toWorksheet&Risultato&Result toWorksheet&Statistiche &Statistics toWorksheet&Visualizza &Visualize toWorksheet(Durata %1) (Duration %1) toWorksheetAbortitoAborted toWorksheetCancellaCancel toWorksheet4Vuota il log di esecuzioneClear execution log toWorksheetDDescrivi elemento sotto il cursoreDescribe under cursor toWorksheet DurataDuration toWorksheet2Tempo di esecuzione query'Duration while query has been running  toWorksheet(Piano di e&secuzioneE&xecution plan toWorksheetPEsegui l'SQL fino alla prima riga &vuotaExecute &Newline Separated toWorksheet*Esegui tutte le queryExecute all statements toWorksheet0Esegui la query correnteExecute current statement toWorksheetdRaccogli statistiche di esecuzione per la sessione%Gather session statistic of execution toWorksheetI/OI/O toWorksheet.Ignora comandi SQL*PlusIgnoring SQL*Plus command toWorksheet*Nessun SQL da salvareNo SQL to save toWorksheetVNessun piano disponibile per il salvataggioNo plan available to save toWorksheet&Query in esecuzioneProcessing query toWorksheetQuery eseguitaQuery executed toWorksheet.Riesegui l'ultima queryReexecute Last Statement toWorksheetAggiornaRefresh toWorksheetRisultatoResult toWorksheet(Esegui l'SQL salvatoRun current saved SQL toWorksheetSQLSQL toWorksheet(Foglio di lavoro SQL SQL worksheet toWorksheet$Salva l'ultimo SQL Save last SQL toWorksheet\Salva le statistiche per un analisi successiva"Save statistics for later analysis toWorksheet(Esegui il successivoStep through statements toWorksheet.Interrompi l'esecuzioneStop execution toWorksheetTimestamp Timestamp toWorksheetStati di wait Wait states toWorksheetFStatistiche per il foglio di lavoroWorksheet Statistics toWorksheetNNumero di parametri errato per describe'Wrong number of parameters for describe toWorksheetBNon hai ancora eseguito alcun SQL You haven't executed any SQL yet toWorksheetblocchiblocks/s toWorksheet&Sfoglia&BrowsetoWorksheetSetupUI:Numera i recor&d di una query&Display number columntoWorksheetSetupUI(&Abilita statistiche&Enable statisticstoWorksheetSetupUI0Linee &multiple nel log.&Multiple lines in log.toWorksheetSetupUIHAggiungi i valori di &log alla fine Add &log entries at endtoWorksheetSetupUIpAggiungi una colonna di numeri a sinistra dei risultati.1Add a numbering column to the left of the result.toWorksheetSetupUIAggiungi le query eseguite alla fine del log invece che all'inizio. Cambiare questa opzione incasiner i log nelle finestre gi aperte.{Add newly executed queries at end of log instead of top. Changing this will mess up the log in the windows that are opened.toWorksheetSetupUILChiedi il salvataggio dei &cambiamentiAsk about saving &changestoWorksheetSetupUIChiedi per salvare i cambiamenti alla chiusura del foglio di lavoro.0Ask about saving changes when closing worksheet.toWorksheetSetupUI.&Salvataggio automatico Auto &savetoWorksheetSetupUI &File di default Default &filetoWorksheetSetupUIhMostra linee multiple nella colonna SQL del logging.8Display multiple lines in the SQL column of the logging.toWorksheetSetupUIfAbilita la raccolta delle statistiche come default.(Enable statistic collection per default.toWorksheetSetupUIAbilita anche le statistiche temporali con la raccolta delle statistiche normali.BEnable timed statistics as well when collecting normal statistics.toWorksheetSetupUI Form1Form1toWorksheetSetupUI8Porta il &cursore all'erroreMove &cursor to errortoWorksheetSetupUIdSposta il cursore all'errore, se esso si presenta.0Move the cursor to an error if the error occurs.toWorksheetSetupUI8Salva i risultati precedentiSave previous resultstoWorksheetSetupUI"Mostra il graficoDisplay chartstoWorksheetStatistic8Mostra i piani di esecuzioneDisplay execution planstoWorksheetStatisticNascondiHidetoWorksheetStatistic:Carica le statistiche da fileLoad statistics from filetoWorksheetStatistic,Elimina le statisticheRemove statisticstoWorksheetStatistic8Salva le statistiche su fileSave statistics to filetoWorksheetStatistic2Ottimizzazione del server Server TuningtoWorksheetStatistic&Scarta&DiscardtoWorksheetText.&Nuovo foglio di lavoro&New worksheettoWorksheetText &Salva&SavetoWorksheetText*Salvare le modifiche? Save changes?toWorksheetTextL'editor stato cambiato. Vuoi salvare, annullare le modifiche o aprire il file in un nuovo foglio?eThe editor has been changed. Do you want to save them, discard changes or open file in new worksheet?toWorksheetTextFImpossibile scrivere i dati su fileCouldn't write data to file toWriteFileErrore di file File error toWriteFile4File salvato correttamenteFile saved successfully toWriteFiletora-2.1.3/src/i18n/tora_toad.qm0000644000175000017500000001335211353136475016145 0ustar michaelmichael toDatabaseSettingUI 0 0 792 526 toDatabaseSettingUI 11 6 Specify if changes should be automatically committed. &Autocommit changes Alt+A Start read object cache when needed Read object cache on connect Never read object cache until mandatory Never read object cache (Will leave parts of application nonfunctianal) Query settings 11 6 The largest default size of a column in query results. Maximum size &display false MaxColDisp &All Alt+A The number of rows to always fetch when executing a query. &Initial rows to fetch in query false InitialFetch Number of rows to initially start reading in content editor, use unlimited on slow connections. Initially &read in content editor false MaxContent &All 999999999 999999999 0 0 When enabled idle queries will request data at regular intervals to keep the connection alive. &Firewall Mode Amount of time (in seconds.) after which dummy queries will be sent to database Connection test interval 100000 10 Dataformat 11 6 The way numbers should be presented. Number format false false 20 2 Indicate empty values as '' instead of &NULL as {null}. Default Scientific Fixed decimal NULL background color Number of decimals for fixed decimal format. &Decimals false Decimals Qt::Vertical 20 40 AutoCommit ObjectCache ReadAll UnlimitedContent IndicateEmpty NumberFormat Decimals NumberFormat activated(QString) toDatabaseSettingUI numberFormatChange() 20 20 20 20 IndicateEmptyColor clicked() toDatabaseSettingUI IndicateEmptyColor_clicked() 20 20 20 20 tora-2.1.3/src/toresultcontentfilterui.ui0000644000175000017500000001361611270353625020431 0ustar michaelmichael toResultContentFilterUI 0 0 750 480 Content editor filter settings 11 6 Ok true 0 0 Selection criteria to use getting items to edit. Same as after where in a select clause. Selection &criteria false Criteria Qt::StrongFocus 0 0 The sort order to use when retreiving data from the database. Sort &order. Separate columns with comma. false Order Qt::Horizontal QSizePolicy::Expanding 20 20 Use for all tables 0 0 Available column names in table. Table &columns false Columns Cancel cancel Esc PushButton1 Order TextLabel1 Criteria TextLabel1_2 Columns AllTables TextLabel2 PushButton3 toHighlightedText QWidget
tohighlightedtext.h
toResultCols QWidget
toresultcols.h
Criteria Order PushButton1 PushButton1 clicked() toResultContentFilterUI accept() 20 20 20 20 PushButton3 clicked() toResultContentFilterUI reject() 20 20 20 20 actionCancel triggered() toResultContentFilterUI reject() -1 -1 374 239
tora-2.1.3/src/tobackground.h0000644000175000017500000000161411270353625015700 0ustar michaelmichael// // C++ Interface: toBackground // // Copyright: See COPYING file that comes with this distribution // #ifndef TOBACKGROUND_H #define TOBACKGROUND_H #include "config.h" #include "totimer.h" class toMain; /** * A descendant of timer which will indicate in the statusbar of the * main window when any timer is running. Can not do singleshots, only * periodic intervals. */ class toBackground : public toTimer { public: /** * Create a background timer widget. * @param parent Parent widget. * @param name Name of widget. */ toBackground(QObject* parent = 0, const char* name = 0); ~toBackground(); /** Start repeating timer with msec interval. * @param msec Millsecond repeat interval. */ void start(int msec); /** Stop timer */ void stop(void); static void init(void); private: static int Running; toMain* main; }; #endif tora-2.1.3/src/toeditablemenu.h0000644000175000017500000000443411270353625016222 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOEDITABLEMENU_H #define TOEDITABLEMENU_H #include "config.h" #include #include /** * A QMenu subclass with editable entries. * */ class toEditableMenu : public QMenu { Q_OBJECT; QMenu *Context; QAction *Remove; public: toEditableMenu(QWidget *parent = 0); virtual ~toEditableMenu() { } signals: void actionRemoved(QAction *action); protected slots: void remove(void); protected: virtual void keyPressEvent(QKeyEvent *event); virtual void contextMenuEvent(QContextMenuEvent *event); }; #endif tora-2.1.3/src/toresultdepend.cpp0000644000175000017500000001702311270353625016613 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconnection.h" #include "tonoblockquery.h" #include "toresultdepend.h" #include "tosql.h" static toSQL SQLResultDepend("toResultDepend:Depends", "SELECT DISTINCT\n" " referenced_owner \"Owner\",\n" " referenced_name \"Name\",\n" " referenced_type \"Type\",\n" " dependency_type \"Dependency Type\"\n" " FROM sys.all_dependencies\n" " WHERE owner = :owner\n" " AND name = :name\n" " ORDER BY referenced_owner,referenced_type,referenced_name", "Display dependencies on an object, must have first two " "columns same columns and same bindings", "0800"); static toSQL SQLResultDepend7("toResultDepend:Depends", "SELECT DISTINCT\n" " referenced_owner \"Owner\",\n" " referenced_name \"Name\",\n" " referenced_type \"Type\",\n" " 'N/A' \"Dependency Type\"\n" " FROM sys.all_dependencies\n" " WHERE owner = :owner\n" " AND name = :name\n" " ORDER BY referenced_owner,referenced_type,referenced_name", "", "0703"); bool toResultDepend::canHandle(toConnection &conn) { return toIsOracle(conn); } toResultDepend::toResultDepend(QWidget *parent, const char *name) : toResultView(false, false, parent, name) { addColumn(tr("Owner")); addColumn(tr("Name")); addColumn(tr("Type")); addColumn(tr("Dependency")); setRootIsDecorated(true); setReadAll(true); setSQLName(QString::fromLatin1("toResultDepend")); Query = NULL; Current = NULL; connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); } toResultDepend::~toResultDepend() { delete Query; } bool toResultDepend::exists(const QString &owner, const QString &name) { toTreeWidgetItem *item = firstChild(); while (item) { if (item->text(0) == owner && item->text(1) == name) return true; if (item->firstChild()) item = item->firstChild(); else if (item->nextSibling()) item = item->nextSibling(); else { do { item = item->parent(); } while (item && !item->nextSibling()); if (item) item = item->nextSibling(); } } return false; } void toResultDepend::query(const QString &sql, const toQList ¶m) { if (!handled()) return ; delete Query; Query = NULL; Current = NULL; if (!setSQLParams(sql, param)) return ; clear(); try { Query = new toNoBlockQuery(connection(), toQuery::Background, toSQL::string(SQLResultDepend, connection()), param); Poll.start(100); } TOCATCH } void toResultDepend::poll(void) { try { if (!toCheckModal(this)) return ; if (Query && Query->poll()) { int cols = Query->describe().size(); while (Query->poll() && !Query->eof()) { toTreeWidgetItem *item; QString owner = Query->readValue(); QString name = Query->readValue(); if (!exists(owner, name)) { if (!Current) item = new toResultViewItem(this, NULL, owner); else item = new toResultViewItem(Current, NULL, owner); item->setText(1, name); for (int i = 2;i < cols;i++) item->setText(i, Query->readValue()); } else { for (int i = 2;i < cols;i++) Query->readValue(); } } if (Query->eof()) { if (!Current) Current = firstChild(); else if (Current->firstChild()) Current = Current->firstChild(); else if (Current->nextSibling()) Current = Current->nextSibling(); else { do { Current = Current->parent(); } while (Current && !Current->nextSibling()); if (Current) Current = Current->nextSibling(); } delete Query; Query = NULL; if (Current) { toQList param; param.insert(param.end(), Current->text(0)); param.insert(param.end(), Current->text(1)); Query = new toNoBlockQuery(connection(), toQuery::Background, toSQL::string(SQLResultDepend, connection()), param); } else Poll.stop(); } } resizeColumnsToContents(); } catch (const QString &exc) { delete Query; Query = NULL; Poll.stop(); toStatusMessage(exc); } } tora-2.1.3/src/tochangeconnection.h0000644000175000017500000000446711270353625017077 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOCHANGECONNECTION_H #define TOCHANGECONNECTION_H #include "config.h" #include "utils.h" class QAction; /** * This button will allow you to change the connection for the nearest * toToolWidget parent. */ class toChangeConnection : public toPopupButton { Q_OBJECT; private slots: void changeConnection(QAction *); void popupMenu(void); public: /** Create the button, only the toolbar parent is needed. * @param parent Toolbar to put connection in. * @param name Name of widget. */ toChangeConnection(QToolBar *parent, const char *name = 0); }; #endif tora-2.1.3/src/tolistviewformattercsv.h0000644000175000017500000000425411270353625020072 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOLISTVIEWFORMATTERCSV_H #define TOLISTVIEWFORMATTERCSV_H #include "config.h" #include "tolistviewformatter.h" class toListViewFormatterCSV : public toListViewFormatter { private: QString QuoteString(const QString &str); public: toListViewFormatterCSV(); virtual ~toListViewFormatterCSV(); virtual QString getFormattedString(toExportSettings &settings, const QAbstractItemModel * model); }; #endif tora-2.1.3/src/toplsqltext.h0000644000175000017500000001343111325141217015612 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOPLSQLTEXT_H #define TOPLSQLTEXT_H #include "totool.h" #include "tohighlightedtext.h" #include "tosqlparse.h" #include "toplsqleditor.h" class toTreeWidgetItem; class toTreeWidget; class toPLSQLEditor; class toPLSQLWidget; /*! \brief An editor widget for PL/SQL Editor. */ class toPLSQLText : public toHighlightedText { Q_OBJECT QString Schema; QString Object; QString Type; static int ID; // Reimplement this in order to handle saving of // package specification and body in one file virtual bool editSave(bool askfile); // Pointer to a parent PLSQLEditor tool. // This is later used when saving one part of package (spec or body) to // find another part and save it as well (if set like that in preferences). toPLSQLEditor *Editor; // Error raised when CALLING compilation (as opposed to errors found during compilation) // Example: ORA-02303: cannot drop or replace a type with type or table dependents QString compilation_error; public: toPLSQLText(QWidget *parent = 0); toPLSQLWidget * parent_widget; void setEditor(toPLSQLEditor * pEditor) { Editor = pEditor; } enum CompilationType {Production, Warning }; void setData(const QString &schema, const QString &type, const QString &data); const QString &schema(void) const { return Schema; } const QString &object(void) const { return Object; } void setType(const QString &type) { setData(Schema, type, Object); } void setSchema(const QString &schema) { setData(schema, Type, Object); } const QString &type(void) const { return Type; } void clear(void); bool readData(toConnection &connection/*, toTreeWidget **/); bool readErrors(toConnection &connection); bool compile(CompilationType t); signals: void errorsChanged(const QString & type, const QMultiMap & values, const bool cleanup = false); void warningsChanged(const QMap values); void contentChanged(); }; /*! \brief A main widget for PL/SQL Editor. It handles all Content and Messages cooperation with Editor. */ class toPLSQLWidget : public QWidget { Q_OBJECT public slots: void applyResult(const QString &, const QMultiMap&, const bool = false); // expands or colapses results pane depending on number of errors, warnings etc. void resizeResults(void); private: toTreeWidget * m_contents; QTreeWidget * m_result; toPLSQLText * m_editor; QSplitter * m_splitter; QSplitter * m_contentSplitter; QTreeWidgetItem * m_errItem; // main branch of errors QTreeWidgetItem * m_warnItem; // main branch of warnings QTreeWidgetItem * m_staticItem; // main branch of static check observations // Count of errors, warnings and static check observations. Values are set after // compilation in function readErrors and after static check execution. // Count is used to auto-hide/display pane displaying list of errors, warnings etc. // Placed here because values are used not only after compiling, but also after // static code check and vice versa. int errorCount, warningCount, staticCount; void updateArguments(toSQLParse::statement &statements, toTreeWidgetItem *parent); void updateContent(toSQLParse::statement &statements, toTreeWidgetItem *parent, const QString &id = QString::null); void updateContent(toPLSQLText *editor); // removes all errors, warnings and static check messages from result pane void cleanupResults(const QString & type = NULL); void setCount(const QString & type, const int count); public: toPLSQLWidget(QWidget * parent = 0); ~toPLSQLWidget(); toPLSQLText * editor() { return m_editor; }; private slots: void goToError(QTreeWidgetItem *, QTreeWidgetItem *); void updateContent() { updateContent(m_editor); }; void changeContent(toTreeWidgetItem *); }; #endif tora-2.1.3/src/totextview.h0000644000175000017500000000654711270353625015452 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOTEXTVIEW_H #define TOTEXTVIEW_H #include "config.h" #include "toeditwidget.h" #include /** A tora editwidget version of the @ref QTextView widget. */ class toTextView : public QTextBrowser, public toEditWidget { public: /** See @ref QTextView */ toTextView(QWidget *parent = 0, const char *name = 0) : QTextBrowser(parent)//, name) , toEditWidget(false, true, false, false, false, false, true, false, true, true, false) { } /** See @ref QTextView */ // toTextView(const QString&text, const QString &context = QString::null, // QWidget *parent = 0, const char *name = 0) // : Q3TextView(text, context, parent, name) // , toEditWidget(false, true, false, // false, false, // false, true, false, // false, true, false) // { } /** Reimplemented for internal reasons. */ virtual void editCopy(void); /** Reimplemented for internal reasons. */ virtual void editSelectAll(void); /** Reimplemented for internal reasons. */ virtual bool editSave(bool); /** Reimplemented for internal reasons. */ virtual void focusInEvent (QFocusEvent *e); virtual bool searchNext(const QString & text); virtual bool searchPrevious(const QString & text); virtual void searchReplace(const QString &newData) {}; virtual void searchReplaceAll(const QString &newData) {}; virtual bool searchCanReplace(bool all) { return false; }; }; #endif tora-2.1.3/src/toresultstats.h0000644000175000017500000001121711270353625016156 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTSTATS_H #define TORESULTSTATS_H #include "config.h" #include "tobackground.h" #include "toresultview.h" class toNoBlockQuery; #define TO_STAT_BLOCKS 10 #define TO_STAT_MAX 500 /** This widget will displays information about statistics in either a database or a session. */ class toResultStats : public toResultView { Q_OBJECT /** Session ID to get statistics for. */ int SessionID; /** Number of rows of statistics */ int Row; /** Get information about if only changed items are to be displayed. */ bool OnlyChanged; /** Display system statistics. */ bool System; /** Last read values, used to calculate delta values. */ double LastValues[TO_STAT_MAX + TO_STAT_BLOCKS]; bool Reset; toNoBlockQuery *Query; toNoBlockQuery *SessionIO; toBackground Poll; /** Setup widget. */ void setup(); /** Add value */ void addValue(bool reset, int id, const QString &name, double value); public: /** Create statistics widget for session statistics. * @param OnlyChanged Only display changed items. * @param ses Session ID to display info about. * @param parent Parent widget. * @param name Name of widget. */ toResultStats(bool OnlyChanged, int ses, QWidget *parent, const char *name = NULL); /** Create statistics widget for the current session statistics. * @param OnlyChanged Only display changed items. * @param parent Parent widget. * @param name Name of widget. */ toResultStats(bool OnlyChanged, QWidget *parent, const char *name = NULL); /** Create statistics widget for the current database statistics. * @param parent Parent widget. * @param name Name of widget. */ toResultStats(QWidget *parent, const char *name = NULL); /** Destroy object. */ ~toResultStats(); /** * close this object */ bool close(void); /** Reset statistics. Read in last values without updating widget data. */ void resetStats(void); /** Support Oracle */ virtual bool canHandle(toConnection &conn); signals: /** Emitted when session is changed. * @param ses New session ID. */ void sessionChanged(int ses); /** Emitted when session is changed. * @param ses New session ID as string. */ void sessionChanged(const QString &); public slots: /** Change the session that the current query will run on. * @param query Query to check connection for. */ void changeSession(toQuery &conn); /** Change session to specified id. * @param ses Session ID to change to. */ void changeSession(int ses); /** Update the statistics. * @param reset Set delta to current values. This means that the next time this widget * is updated the delta will be from the new values. */ void refreshStats(bool reset = true); private slots: void poll(void); }; #endif tora-2.1.3/src/todocklet.h0000644000175000017500000001135511270353625015211 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TODOCKLET_H #define TODOCKLET_H #include "config.h" #include #include #include #include #include class toDocklet; class toDockletHolder { public: virtual ~toDockletHolder(){}; virtual toDocklet* docklet(QWidget *parent = 0, Qt::WindowFlags flags = 0) = 0; }; class toDocklet : public QDockWidget { Q_OBJECT; public: explicit toDocklet(const QString &title, QWidget *parent = 0, Qt::WindowFlags flags = 0); virtual ~toDocklet() {} /** * Get the icon for this docklet * */ virtual QIcon icon() const = 0; /** * Get the docklet's name * */ virtual QString name() const = 0; // ---------------------------------------- static /** * Used by REGISTER_VIEW to init docklets * */ static toDockletHolder* registerDocklet(QString name, toDockletHolder *holder); /** * Get a list of available docklets * */ static QList docklets(void); /** * Find the docklet for the given name * */ static toDocklet* docklet(QString name); signals: /** * Use this signal in a subclass after a child widget has been * activated. toDocklet will handle closing the popup, if any. * */ void activated(void); /** * Emitted when the popup is closed * */ void popupVisibleToggled(bool shown); /** * Emitted when docklet moves to new location * */ void dockletLocationChanged(toDocklet *let, Qt::DockWidgetArea area); public slots: /** * Show or hide popup. This is different from QDockWidget::floating * */ void showPopup(bool shown); protected: virtual bool event(QEvent *event); private slots: void childActivated(); void handleDockletLocationChanged(Qt::DockWidgetArea area); private: bool isPopup; }; /** * Registers views statically. Simply place: * * REGISTER_VIEW("some untranslated, unique name", myAwesomeView); * * call in the .cpp file of your view definition. Uses toDockletHolder * to get around limitations with static initialization and QWidgets. * */ #define REGISTER_VIEW(NAME, TYPE) \ class TYPE##Holder : public toDockletHolder \ { \ public: \ virtual toDocklet* docklet(QWidget *parent = 0, \ Qt::WindowFlags flags = 0) \ { \ static TYPE *let = new TYPE(parent, flags); \ return let; \ } \ }; \ toDockletHolder* TYPE ## _myPrototype = \ toDocklet::registerDocklet(NAME, new TYPE##Holder()); #endif tora-2.1.3/src/tolistviewformattertext.cpp0000644000175000017500000001412111270353625020610 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "tolistviewformattertext.h" #include "tolistviewformatterfactory.h" #include "tolistviewformatteridentifier.h" #include "toresultview.h" #include "toresultmodel.h" #include #include namespace { toListViewFormatter* createText() { return new toListViewFormatterText(); } const bool registered = toListViewFormatterFactory::Instance().Register(toListViewFormatterIdentifier::TEXT, createText); } toListViewFormatterText::toListViewFormatterText() : toListViewFormatter() { } toListViewFormatterText::~toListViewFormatterText() { } QString toListViewFormatterText::getFormattedString(toExportSettings &settings, //const toResultModel *model); const QAbstractItemModel * model) { int columns = model->columnCount(); int rows = model->rowCount(); QString output; QVector sizes(columns); QVector rlist = selectedRows(settings.selected); QVector clist = selectedColumns(settings.selected); // must get widest length for each column // zero array or (if writing headers, set their size) for (int i = 0; i < columns; i++) { if (settings.columnsHeader) { if (settings.columnsExport == toExportSettings::ColumnsSelected && !clist.contains(i)) continue; sizes[i] = model->headerData( i, Qt::Horizontal, Qt::DisplayRole).toString().length(); } else sizes[i] = 0; } // loop through model and get column widths QModelIndex mi; for (int row = 0; row < rows; row++) { for (int column = 0; column < columns; column++) { if (settings.columnsExport == toExportSettings::ColumnsSelected && !clist.contains(column)) continue; if (!settings.rowsHeader && column == 0) continue; mi = model->index(row, column); QVariant data = model->data(mi, Qt::EditRole); QString v; if (data.isNull()) v = "{null}"; else v = data.toString(); int len = v.length(); if (len > sizes[column]) sizes[column] = len; } } // write header data to fixed widths if (settings.columnsHeader) { for (int column = 0; column < columns; column++) { if (settings.columnsExport == toExportSettings::ColumnsSelected && !clist.contains(column)) continue; if (!settings.rowsHeader && column == 0) continue; QString value = model->headerData( column, Qt::Horizontal, Qt::DisplayRole).toString(); output += value; for (int left = value.length(); left <= sizes[column]; left++) output += ' '; } endLine(output); // write ==== border for (int column = 0; column < columns; column++) { if (settings.columnsExport == toExportSettings::ColumnsSelected && !clist.contains(column)) continue; if (!settings.rowsHeader && column == 0) continue; for (int left = 0; left < sizes[column]; left++) output += '='; output += ' '; } endLine(output); } // write data for (int row = 0; row < rows; row++) { if (settings.rowsExport == toExportSettings::RowsSelected && !rlist.contains(row)) continue; for (int column = 0; column < columns; column++) { if (settings.columnsExport == toExportSettings::ColumnsSelected && !clist.contains(column)) continue; if (!settings.rowsHeader && column == 0) continue; mi = model->index(row, column); QVariant data = model->data(mi, Qt::EditRole); QString value; if (data.isNull()) value = "{null}"; else value = data.toString(); output += value; for (int left = value.length(); left <= sizes[column]; left++) output += ' '; } endLine(output); } return output; } tora-2.1.3/src/tobackgroundlabel.h0000644000175000017500000000126211270353625016677 0ustar michaelmichael// // C++ Interface: toBackgroundLabel // // Copyright: See COPYING file that comes with this distribution // #ifndef TOBACKGROUNDLABEL_H #define TOBACKGROUNDLABEL_H #include "config.h" #include #include #include //Added by qt3to4: #include class toBackgroundLabel : public QLabel { Q_OBJECT; public: //static toBackgroundLabel createToBackgroundLabel(); virtual void mouseReleaseEvent(QMouseEvent* e); virtual void unpause(); virtual void pause(); virtual void setTip(QString tip); virtual void setSpeed(int Running); toBackgroundLabel(QWidget *parent); private: static QMovie* Animation; }; #endif tora-2.1.3/src/tomainwindow.h0000644000175000017500000000365011270353625015737 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOMAINWINDOW_H #define TOMAINWINDOW_H #include "config.h" #include #include class toMainWindow : public QMainWindow { Q_OBJECT public: toMainWindow(); }; #endif tora-2.1.3/src/tosearchreplaceui.ui0000644000175000017500000001664311270353625017116 0ustar michaelmichael Sebastian Pipping toSearchReplaceUI 0 0 698 122 0 0 6 F&ind: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter SearchText 0 0 Qt::StrongFocus Text to search for true 30 QComboBox::InsertAtTop Jump to next match &Next Jump to previous match &Previous ../../../../../../ Rep&lace: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter ReplaceText 0 0 Text to replace with true Replace next match &Replace Replace all matches Replace &All Qt::Horizontal 0 6 Qt::Horizontal 0 20 Search mode 4 true Plain Text Regular Expression Qt::Horizontal QSizePolicy::Fixed 6 20 Case-sensitive searching &Match case Whole words true Qt::Vertical 20 40 SearchText SearchNext SearchPrevious ReplaceText Replace ReplaceAll SearchMode MatchCase hideButton tora-2.1.3/src/tobrowserindex.h0000644000175000017500000000630011270353625016271 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBROWSERINDEX_H #define TOBROWSERINDEX_H #include "config.h" #include "ui_tobrowserindexui.h" #include "toextract.h" #include "totool.h" #include #include class toConnection; class toBrowserIndex : public QDialog, public Ui::toBrowserIndexUI, public toConnectionWidget { private: Q_OBJECT toExtract Extractor; std::map > OriginalDescription; std::map > NewDescription; QString Owner; QString Table; QString Current; std::map IndexType; std::map IndexCols; QString table(void); toBrowserIndex(toConnection &conn, const QString &owner, const QString &table, const QString &index, QWidget *parent, const char *name = NULL); void registerIndex(const QString &type, const QString <ype, std::list::iterator beg, std::list::iterator end); void describeTable(const QString &table); void saveChanges(); QString sql(void); private: void execute(); public: static void modifyIndex(toConnection &conn, const QString &owner, const QString &table, QWidget *parent, const QString &index = QString::null); static void addIndex(toConnection &conn, const QString &owner, const QString &table, QWidget *parent); public slots: virtual void displaySQL(); virtual void addIndex(); virtual void delIndex(); virtual void changeIndex(); virtual void changeTable(const QString &table); }; #endif tora-2.1.3/src/toglobalsettingui.ui0000644000175000017500000005267311332067047017155 0ustar michaelmichael toGlobalSettingUI 0 0 692 641 toGlobalSettingUI Paths 11 6 &Custom SQL false CustomSQL Browse Browse Directory where to find plugins when starting. &Plugin directory false PluginDirectory Browse Directory where to place cached dataaseinformation. &Cache directory false CacheDirectory Directory where to find help files. &Help directory false HelpDirectory Browse Default session to use when saving a session. Default session false DefaultSession Browse Options Change currently select connection to the connection of the new active window Change current connection with active window Number of connections to save in history. Connect history false ConnectHistory 1000 Remember the last password you used to connect. Will leave the password unencrypted in the config file. &Save passwords Alt+S The time in seconds temporary messages will be displayed in the status bar. 0 means keep. Status &message false Status seconds Include database connection in window captions Include DB in caption Number of status messages to save in the message history. Message history false HistorySize 1000 Restore session on startup Number of samples to keep in line and barcharts by default. Chart samples false HistorySize 1000 Save unlimited number of samples. Can consume large amounts of memory. Unlimited Use TOAD keybindings instead of classic TOra. Prefer TOAD key bindings Number of samples to display in line and barcharts by default. Display samples false HistorySize 1000 Display all available samples All Use Disk Caching of ObjectLists and Synonyms Use Disk Caching Define the unit sizes should be displayed. Size Unit false SizeUnit Bytes KB MB Show grid lines in output results table. Display gridlines in results Default refreshtime in tools. &Refresh false Refresh Display alerts in messagebar instead of poping up a dialog with a warning. Display alerts in statusbar only Default list format false Text Tab delimited CSV HTML Arrange Tools in Tabs The style to use for the user interface. &Style false Style Show color icons for session recognition in connection GUI widgets Use Colors in Connections Configure... 0 0 Which translation locale to use for this program. Must restart to have effect. Translation false 0 0 6 11 SMTP Server : 1 65536 CustomSQL SQLBrowse HelpDirectory HelpBrowse DefaultSession HelpBrowse_2 PluginDirectory PluginBrowse CacheDirectory CacheBrowse ChangeConnection SavePassword IncludeDB RestoreSession ToadBindings DiskCaching DisplayGrid Statusbar TabbedTools ConnectHistory Status HistorySize ChartSamples UnlimitedSamples DisplaySamples AllSamples SizeUnit Refresh DefaultFormat Style Locale SmtpServer SmtpPort PluginBrowse clicked() toGlobalSettingUI pluginBrowse() 20 20 20 20 CacheBrowse clicked() toGlobalSettingUI cacheBrowse() 666 184 20 20 SQLBrowse clicked() toGlobalSettingUI sqlBrowse() 20 20 20 20 HelpBrowse clicked() toGlobalSettingUI helpBrowse() 20 20 20 20 HelpBrowse_2 clicked() toGlobalSettingUI sessionBrowse() 20 20 20 20 UnlimitedSamples toggled(bool) ChartSamples setDisabled(bool) 20 20 20 20 AllSamples toggled(bool) DisplaySamples setDisabled(bool) 20 20 20 20 tora-2.1.3/src/toscriptschemawidgetui.ui0000644000175000017500000000676211270353625020207 0ustar michaelmichael toScriptSchemaWidget 0 0 247 558 Form 0 0 Connection false Schema false All 0 0 &Include objects false ObjectsView 0 0 0 QAbstractItemView::MultiSelection TextLabel2 TextLabel2_2 ConnectionComboBox SchemaComboBox TextLabel1 ObjectsView WorkingWidget ObjectsView toWorkingWidget QWidget
toworkingwidget.h
1
tora-2.1.3/src/tomain.cpp0000644000175000017500000016212511445353612015045 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toabout.h" #include "tobackgroundlabel.h" #include "toconf.h" #include "toconnection.h" #include "toeditwidget.h" #include "tohelp.h" #include "tomain.h" #include "tomarkedtext.h" #include "tomemoeditor.h" #include "ui_tomessageui.h" #include "tonewconnection.h" #include "topreferences.h" #include "tosearchreplace.h" #include "totemplate.h" #include "totool.h" #include "tomessage.h" #include "tothread.h" #include "todocklet.h" #include "todockbar.h" #include "toworksheet.h" #include "tohighlightedtext.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "icons/connect.xpm" #include "icons/copy.xpm" #include "icons/cut.xpm" #include "icons/disconnect.xpm" #include "icons/fileopen.xpm" #include "icons/filesave.xpm" #include "icons/paste.xpm" #include "icons/print.xpm" #include "icons/redo.xpm" #include "icons/search.xpm" #include "icons/tora.xpm" #include "icons/undo.xpm" #include "icons/up.xpm" #include "icons/commit.xpm" #include "icons/rollback.xpm" #include "icons/stop.xpm" #include "icons/refresh.xpm" #define DEFAULT_TITLE TOAPPNAME " %s" toMain::toMain() : toMainWindow(), BackgroundLabel(new toBackgroundLabel(statusBar())) { Edit = NULL; // must be set early on. this is used to make sure some gui // updates are only done from the main thread of the // application. In QT4, background threads that try to access or // create gui widgets crash. toThread::setMainThread(QThread::currentThread()); Workspace = new QMdiArea(this); LastActiveWindow = 0; Message = new toMessage(this); // it needs go first due signal/slot connection in it handleToolsDisplay(); // setup all QAction objects createActions(); // create all menus createMenus(); createToolbars(); createStatusbar(); createToolMenus(); createDocklets(); updateRecent(); char buffer[100]; sprintf(buffer, DEFAULT_TITLE, TOVERSION); setWindowTitle(tr(buffer)); setWindowIcon(QPixmap(const_cast(tora_xpm))); restoreGeometry(toConfigurationSingle::Instance().mainWindowGeometry()); restoreState(toConfigurationSingle::Instance().mainWindowState()); // disable widgets related to an editor editDisable(NULL); enableConnectionActions(false); std::map &tools = toTool::tools(); QString defName(toConfigurationSingle::Instance().defaultTool()); for (std::map::iterator k = tools.begin(); k != tools.end(); k++) { if(defName.isEmpty()) { toConfigurationSingle::Instance().setDefaultTool((*k).first); defName = (*k).first; } (*k).second->customSetup(); } Search = NULL; QString welcome; connect(&Poll, SIGNAL(timeout()), this, SLOT(checkCaching())); connect(toMainWidget()->workspace(), SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(windowActivated(QMdiSubWindow *))); connect(this, SIGNAL(messageRequested(const QString &, bool, bool)), this, SLOT(showMessageImpl(const QString &, bool, bool)), Qt::QueuedConnection); if (toConfigurationSingle::Instance().restoreSession()) { try { std::map session; toConfigurationSingle::Instance().loadMap( toConfigurationSingle::Instance().defaultSession(), session); importData(session, "TOra"); } TOCATCH; } setCentralWidget(Workspace); show(); createDockbars(); // keep after restoreState() and show() statusBar()->addPermanentWidget(BackgroundLabel, 0); BackgroundLabel->show(); BackgroundLabel->setToolTip(tr("No background queries.")); if (Connections.empty()) { try { toConnection *conn; do { toNewConnection newConnection(this); conn = NULL; if (newConnection.exec()) conn = newConnection.connection(); else break; } while (!conn); if (conn) addConnection(conn); } TOCATCH; } } void toMain::createActions() { newConnAct = new QAction(QPixmap(const_cast(connect_xpm)), tr("&New Connection..."), this); // newConnAct->setShortcut(Qt::CTRL + Qt::Key_G); newConnAct->setToolTip(tr("Create a new connection")); connect(newConnAct, SIGNAL(triggered()), this, SLOT(addConnection()), Qt::QueuedConnection); closeConn = new QAction(QPixmap(const_cast(disconnect_xpm)), tr("&Close Connection"), this); closeConn->setToolTip(tr("Disconnect")); connect(closeConn, SIGNAL(triggered()), this, SLOT(delConnection()), Qt::QueuedConnection); commitAct = new QAction(QPixmap(const_cast(commit_xpm)), tr("&Commit Connection"), this); commitAct->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_C); commitAct->setToolTip(tr("Commit transaction")); rollbackAct = new QAction(QPixmap(const_cast(rollback_xpm)), tr("&Rollback Connection"), this); rollbackAct->setShortcut(Qt::CTRL + Qt::Key_Less); rollbackAct->setToolTip(tr("Rollback transaction")); currentAct = new QAction(tr("&Current Connection"), this); currentAct->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_U); stopAct = new QAction(QPixmap(const_cast(stop_xpm)), tr("Stop All Queries"), this); stopAct->setShortcut(Qt::CTRL + Qt::Key_J); refreshAct = new QAction(QPixmap(const_cast(refresh_xpm)), tr("Reread Object Cache"), this); openAct = new QAction(QPixmap(const_cast(fileopen_xpm)), tr("&Open File..."), this); openAct->setShortcut(QKeySequence::Open); saveAct = new QAction(QPixmap(const_cast(filesave_xpm)), tr("&Save File..."), this); saveAct->setShortcut(QKeySequence::Save); saveAsAct = new QAction(tr("Save &As..."), this); saveAsAct->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_W); openSessionAct = new QAction(QPixmap(const_cast(fileopen_xpm)), tr("Open Session..."), this); saveSessionAct = new QAction(QPixmap(const_cast(filesave_xpm)), tr("Save Session..."), this); restoreSessionAct = new QAction(tr("Restore Last Session"), this); closeSessionAct = new QAction(tr("Close Session"), this); printAct = new QAction(QPixmap(const_cast(print_xpm)), tr("&Print..."), this); saveAsAct->setShortcut(QKeySequence::Print); quitAct = new QAction(tr("&Quit"), this); // ---------------------------------------- edit menu undoAct = new QAction(QPixmap(const_cast(undo_xpm)), tr("&Undo"), this); undoAct->setShortcut(QKeySequence::Undo); redoAct = new QAction(QPixmap(const_cast(redo_xpm)), tr("&Redo"), this); redoAct->setShortcut(QKeySequence::Redo); cutAct = new QAction(QPixmap(const_cast(cut_xpm)), tr("Cu&t"), this); cutAct->setShortcut(QKeySequence::Cut); cutAct->setToolTip(tr("Cut to clipboard")); copyAct = new QAction(QPixmap(const_cast(copy_xpm)), tr("&Copy"), this); copyAct->setShortcut(QKeySequence::Copy); copyAct->setToolTip(tr("Copy to clipboard")); pasteAct = new QAction(QPixmap(const_cast(paste_xpm)), tr("&Paste"), this); pasteAct->setShortcut(QKeySequence::Paste); pasteAct->setToolTip(tr("Paste from clipboard")); searchReplaceAct = new QAction(QPixmap(const_cast(search_xpm)), tr("&Search && Replace..."), this); searchReplaceAct->setShortcut(QKeySequence::Find); searchReplaceAct->setToolTip(tr("Search & replace")); searchNextAct = new QAction(tr("Search &Next"), this); searchNextAct->setShortcut(QKeySequence::FindNext); selectAllAct = new QAction(tr("Select &All"), this); selectAllAct->setShortcut(QKeySequence::SelectAll); #if 0 // TODO: this part is waiting for QScintilla backend feature (yet unimplemented). selectBlockAct = new QAction(tr("Block Selection"), this); selectBlockAct->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_B); selectBlockAct->setCheckable(true); #endif readAllAct = new QAction(tr("Read All &Items"), this); prefsAct = new QAction(tr("&Preferences..."), this); // ---------------------------------------- help menu helpCurrentAct = new QAction(tr("C&urrent Context..."), this); helpCurrentAct->setShortcut(QKeySequence::HelpContents); helpContentsAct = new QAction(tr("&Contents..."), this); aboutAct = new QAction(tr("&About " TOAPPNAME "..."), this); aboutQtAct = new QAction(tr("About &Qt..."), this); licenseAct = new QAction(tr("&License..."), this); // ---------------------------------------- windows menu windowCloseAct = new QAction(tr("C&lose"), this); windowCloseAllAct = new QAction(tr("Close &All"), this); cascadeAct = new QAction(tr("&Cascade"), this); tileAct = new QAction(tr("&Tile"), this); } void toMain::createMenus() { fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(newConnAct); fileMenu->addAction(closeConn); fileMenu->addSeparator(); fileMenu->addAction(commitAct); fileMenu->addAction(rollbackAct); fileMenu->addAction(currentAct); fileMenu->addAction(stopAct); fileMenu->addAction(refreshAct); fileMenu->addSeparator(); fileMenu->addAction(openAct); // add recentMenu after, setup later recentMenu = fileMenu->addMenu(tr("R&ecent Files")); fileMenu->addMenu(recentMenu); fileMenu->addAction(saveAct); fileMenu->addAction(saveAsAct); fileMenu->addSeparator(); fileMenu->addAction(openSessionAct); fileMenu->addAction(saveSessionAct); fileMenu->addAction(restoreSessionAct); fileMenu->addAction(closeSessionAct); fileMenu->addSeparator(); fileMenu->addAction(printAct); fileMenu->addSeparator(); fileMenu->addAction(quitAct); connect(fileMenu, SIGNAL(aboutToShow()), this, SLOT(showFileMenu())); connect(fileMenu, SIGNAL(triggered(QAction *)), this, SLOT(commandCallback(QAction *)), Qt::QueuedConnection); connect(recentMenu, SIGNAL(triggered(QAction *)), this, SLOT(recentCallback(QAction *)), Qt::QueuedConnection); editMenu = menuBar()->addMenu(tr("&Edit")); editMenu->addAction(undoAct); editMenu->addAction(redoAct); editMenu->addSeparator(); editMenu->addAction(cutAct); editMenu->addAction(copyAct); editMenu->addAction(pasteAct); editMenu->addSeparator(); editMenu->addAction(searchReplaceAct); editMenu->addAction(searchNextAct); editMenu->addAction(selectAllAct); #if 0 // TODO: this part is waiting for QScintilla backend feature (yet unimplemented). editMenu->addAction(selectBlockAct); #endif editMenu->addAction(readAllAct); editMenu->addSeparator(); editMenu->addAction(prefsAct); connect(editMenu, SIGNAL(triggered(QAction *)), this, SLOT(commandCallback(QAction *)), Qt::QueuedConnection); viewMenu = menuBar()->addMenu(tr("&View")); foreach(toDocklet *let, toDocklet::docklets()) { viewMenu->addAction(new QAction(let->icon(), let->name(), 0)); } connect(viewMenu, SIGNAL(triggered(QAction *)), this, SLOT(viewCallback(QAction *)), Qt::QueuedConnection); toolsMenu = menuBar()->addMenu(tr("&Tools")); connect(toolsMenu, SIGNAL(triggered(QAction *)), this, SLOT(commandCallback(QAction *)), Qt::QueuedConnection); // windows menu handled separately by update function windowsMenu = menuBar()->addMenu(tr("&Window")); updateWindowsMenu(); connect(windowsMenu, SIGNAL(triggered(QAction *)), this, SLOT(windowCallback(QAction *)), Qt::QueuedConnection); connect(windowsMenu, SIGNAL(aboutToShow()), this, SLOT(updateWindowsMenu())); connect(windowsMenu, SIGNAL(triggered(QAction *)), this, SLOT(commandCallback(QAction *)), Qt::QueuedConnection); helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(helpCurrentAct); helpMenu->addAction(helpContentsAct); windowsMenu->addSeparator(); helpMenu->addAction(aboutAct); helpMenu->addAction(licenseAct); helpMenu->addAction(aboutQtAct); connect(helpMenu, SIGNAL(triggered(QAction *)), this, SLOT(commandCallback(QAction *)), Qt::QueuedConnection); } void toMain::addCustomMenu(QMenu *menu) { this->menuBar()->insertMenu(windowsMenu->menuAction(), menu); } void toMain::createToolbars() { editToolbar = toAllocBar(this, tr("Application")); editToolbar->setObjectName("editToolbar"); editToolbar->addAction(openAct); editToolbar->addAction(saveAct); editToolbar->addAction(printAct); editToolbar->addSeparator(); editToolbar->addAction(undoAct); editToolbar->addAction(redoAct); editToolbar->addAction(cutAct); editToolbar->addAction(copyAct); editToolbar->addAction(pasteAct); editToolbar->addSeparator(); editToolbar->addAction(searchReplaceAct); connectionToolbar = toAllocBar(this, tr("Connections")); connectionToolbar->setObjectName("connectionToolbar"); connectionToolbar->addAction(newConnAct); connectionToolbar->addAction(closeConn); connectionToolbar->addAction(commitAct); connectionToolbar->addAction(rollbackAct); connectionToolbar->addSeparator(); connectionToolbar->addAction(stopAct); connectionToolbar->addSeparator(); ConnectionSelection = new QComboBox(connectionToolbar); ConnectionSelection->setMinimumWidth(300); ConnectionSelection->setFocusPolicy(Qt::NoFocus); connectionToolbar->addWidget(ConnectionSelection); connect(ConnectionSelection, SIGNAL(activated(int)), this, SLOT(changeConnection())); addToolBarBreak(); toolsToolbar = toAllocBar(this, tr("Tools")); toolsToolbar->setObjectName("toolsToolbar"); } //! \warning Do not use it. It screws up reloading the toolbar state void toMain::addButtonApplication(QAction *act) { editToolbar->addAction(act); } void toMain::createStatusbar() { statusBar()->showMessage(QString::null); #if 0 // TODO: this part is waiting for QScintilla backend feature (yet unimplemented). SelectionLabel = new QLabel(statusBar()); statusBar()->addPermanentWidget(SelectionLabel); SelectionLabel->setMinimumWidth(90); SelectionLabel->setText("Sel: Normal"); #endif RowLabel = new QLabel(statusBar()); statusBar()->addPermanentWidget(RowLabel, 0); RowLabel->setMinimumWidth(60); // RowLabel->hide(); ColumnLabel = new QLabel(statusBar()); statusBar()->addPermanentWidget(ColumnLabel, 0); ColumnLabel->setMinimumWidth(60); // ColumnLabel->hide(); QToolButton *dispStatus = new toPopupButton(statusBar()); dispStatus->setIcon(QPixmap(const_cast(up_xpm))); statusBar()->addPermanentWidget(dispStatus, 0); statusMenu = new QMenu(dispStatus); dispStatus->setMenu(statusMenu); dispStatus->setPopupMode(QToolButton::MenuButtonPopup); connect(statusMenu, SIGNAL(aboutToShow()), this, SLOT(updateStatusMenu())); connect(statusMenu, SIGNAL(triggered(QAction*)), this, SLOT(statusCallback(QAction*))); connect(dispStatus, SIGNAL(pressed()), dispStatus, SLOT(showMenu())); } void toMain::createToolMenus() { try { int lastPriorityPix = 0; int lastPriorityMenu = 0; std::map &tools = toTool::tools(); ToolsMap cfgTools(toConfigurationSingle::Instance().tools()); for (std::map::iterator i = tools.begin(); i != tools.end(); i++) { QAction *toolAct = (*i).second->getAction(); const QPixmap *pixmap = (*i).second->toolbarImage(); const char *menuName = (*i).second->menuItem(); // QString tmp = (*i).first; // tmp += CONF_TOOL_ENABLE; // if(toConfigurationSingle::Instance().globalConfig( // tmp, "Yes").isEmpty()) { // continue; // } // set the tools for the first run if (!cfgTools.contains((*i).first)) cfgTools[(*i).first] = true; // only enabled tools are set if (cfgTools[(*i).first] == false) continue; int priority = (*i).second->priority(); if (priority / 100 != lastPriorityPix / 100 && pixmap) { #ifndef TO_NO_ORACLE toolsToolbar->addSeparator(); #endif lastPriorityPix = priority; } if (priority / 100 != lastPriorityMenu / 100 && menuName) { #ifndef TO_NO_ORACLE toolsMenu->addSeparator(); #endif lastPriorityMenu = priority; } if (pixmap) toolsToolbar->addAction(toolAct); if (menuName) toolsMenu->addAction(toolAct); } // for tools toConfigurationSingle::Instance().setTools(cfgTools); } TOCATCH; } void toMain::createDocklets() { foreach(toDocklet *let, toDocklet::docklets()) addDockWidget(Qt::LeftDockWidgetArea, let); } // must call this after restoreState() void toMain::createDockbars() { leftDockbar = new toDockbar(Qt::LeftToolBarArea, tr("Left Dockbar"), this); addToolBar(Qt::LeftToolBarArea, leftDockbar); leftDockbar->hide(); rightDockbar = new toDockbar(Qt::RightToolBarArea, tr("Right Dockbar"), this); addToolBar(Qt::RightToolBarArea, rightDockbar); rightDockbar->hide(); // toDockbar keeps it's own settings, but just in case something // goes wrong, or a new setup, add any visible docklets to the // dockbar. foreach(toDocklet *let, toDocklet::docklets()) { if(let->isVisible()) moveDocklet(let, dockWidgetArea(let)); connect(let, SIGNAL(dockletLocationChanged(toDocklet *, Qt::DockWidgetArea)), this, SLOT(moveDocklet(toDocklet *, Qt::DockWidgetArea))); } leftDockbar->restoreState(toConfigurationSingle::Instance().leftDockbarState()); rightDockbar->restoreState(toConfigurationSingle::Instance().rightDockbarState()); } void toMain::handleToolsDisplay() { #if QT_VERSION >= 0x040400 if (toConfigurationSingle::Instance().tabbedTools()) { Workspace->setViewMode(QMdiArea::TabbedView); #if QT_VERSION >= 0x040500 // HACK: a workaround for missing QMdiArea feature. Real patch is waiting in the Qt4 bugtracker. foreach (QTabBar *b, Workspace->findChildren()) { b->setTabsClosable(true); connect(b, SIGNAL(tabCloseRequested(int)), this, SLOT(workspaceCloseWindow(int))); // we should be quite sure that the QMdiArea tab-widget // goes first (because findChildren is called recursively) break; } #endif } else Workspace->setViewMode(QMdiArea::SubWindowView); #endif } void toMain::windowActivated(QMdiSubWindow *widget) { if(widget) LastActiveWindow = widget; if (!toConfigurationSingle::Instance().changeConnection()) return ; if (!widget) return; toToolWidget *tool = dynamic_cast(widget->widget()); if (tool) { try { toConnection &conn = tool->connection(); int pos = 0; for (std::list::iterator i = Connections.begin();i != Connections.end();i++) { if (&conn == *i) { ConnectionSelection->setCurrentIndex(pos); changeConnection(); break; } pos++; } } TOCATCH } } void toMain::showFileMenu(void) { bool hascon = (ConnectionSelection->count() > 0); commitAct->setEnabled(hascon); stopAct->setEnabled(hascon); rollbackAct->setEnabled(hascon); refreshAct->setEnabled(hascon); closeConn->setEnabled(hascon); updateRecent(); } void toMain::updateRecent() { QStringList files(toConfigurationSingle::Instance().recentFiles()); recentMenu->clear(); int index = 1; QMutableListIterator i(files); i.toBack(); QString f; while (i.hasPrevious()) { f = i.previous(); QFileInfo fi(f); if (!fi.exists()) { i.remove(); continue; } // store file name in tooltip. this is used later to // open the file, and is handy to know what file tora // is opening. QString caption = fi.fileName(); if(index < 10) caption = "&" + QString::number(index++) + " " + caption; QAction *r = new QAction(caption, this); r->setToolTip(f); recentMenu->addAction(r); } toConfigurationSingle::Instance().setRecentFiles(files); } void toMain::addRecentFile(const QString &file) { QStringList files(toConfigurationSingle::Instance().recentFiles()); int maxnum = toConfigurationSingle::Instance().recentMax(); files.removeAll(file); if (files.count() >= maxnum) files.removeAt(0); files.append(file); toConfigurationSingle::Instance().setRecentFiles(files); } void toMain::updateWindowsMenu(void) { // i'm lazy and this beats the hell out of tracking all the // windowsMenu actions and adding/removing each. windowsMenu->clear(); windowCloseAct->setEnabled(LastActiveWindow != 0); windowCloseAllAct->setEnabled(LastActiveWindow != 0); cascadeAct->setEnabled(LastActiveWindow != 0); tileAct->setEnabled(LastActiveWindow != 0); windowsMenu->addAction(windowCloseAct); windowsMenu->addAction(windowCloseAllAct); windowsMenu->addSeparator(); windowsMenu->addAction(cascadeAct); windowsMenu->addAction(tileAct); windowsMenu->addSeparator(); int index = 0; QList list = workspace()->subWindowList(); for (QList::iterator it = list.begin(); it != list.end(); it++, index++) { if (!(*it)->isHidden()) { QString caption = (*it)->windowTitle().trimmed(); if (index < 9) caption = "&" + QString::number(index + 1) + " " + caption; QAction *action = new QAction(caption, (*it)); if (index < 9) action->setShortcut(Qt::CTRL + Qt::Key_1 + index); windowsMenu->addAction(action); action->setCheckable(true); if ((*it) == LastActiveWindow) action->setChecked(true); } } } void toMain::windowCallback(QAction *action) { // action's parent is the window widget. get parent and raise it. if (action == NULL || action->parentWidget() == NULL) return; if (action == windowCloseAllAct) { while (workspace()->subWindowList().count() > 0 && workspace()->subWindowList().at(0)) if (workspace()->subWindowList().at(0) && !workspace()->subWindowList().at(0)->close()) return; } else if (action == windowCloseAct) { QWidget *widget = LastActiveWindow; if (widget) widget->close(); } else { QMdiSubWindow *w = dynamic_cast(action->parentWidget()); if(w) { workspace()->setActiveSubWindow(w); w->raise(); if(w->widget()) w->widget()->setFocus(); // piece of shit mdi doesn't always send window activated // signal windowActivated(w); } } } void toMain::recentCallback(QAction *action) { if (!action) return; toEditWidget *edit = NULL; QWidget *currWidget = qApp->focusWidget(); while (currWidget && !edit) { edit = dynamic_cast(currWidget); currWidget = currWidget->parentWidget(); } if (edit) edit->editOpen(action->toolTip()); else this->editOpenFile(action->toolTip()); } void toMain::statusCallback(QAction *action) { new toMemoEditor(this, action->toolTip()); } void toMain::viewCallback(QAction *action) { toDocklet *let = toDocklet::docklet(action->text()); if(!let) return; let->close(); if(leftDockbar->contains(let)) { leftDockbar->removeDocklet(let); return; } if(rightDockbar->contains(let)) { rightDockbar->removeDocklet(let); return; } addDockWidget(Qt::LeftDockWidgetArea, let); #if QT_VERSION >= 0x040400 restoreDockWidget(let); #else let->show(); #endif } void toMain::moveDocklet(toDocklet *let, Qt::DockWidgetArea area) { if(area == Qt::RightDockWidgetArea) { leftDockbar->removeDocklet(let); rightDockbar->addDocklet(let); } if(area == Qt::LeftDockWidgetArea) { rightDockbar->removeDocklet(let); leftDockbar->addDocklet(let); } } void toMain::commandCallback(QAction *action) { QWidget *focus = qApp->focusWidget(); if (focus) { toEditWidget *edit = findEdit(focus); if (edit && edit != Edit) setEditWidget(edit); else if (focus->inherits("QLineEdit") || QString(focus->metaObject()->className()) == QString("QSpinBox")) editEnable(edit); } QWidget *currWidget = qApp->focusWidget(); toEditWidget *edit = NULL; while (currWidget && !edit) { edit = dynamic_cast(currWidget); currWidget = currWidget->parentWidget(); } if (edit) { if (action == redoAct) edit->editRedo(); else if (action == undoAct) edit->editUndo(); else if (action == copyAct) edit->editCopy(); else if (action == pasteAct) edit->editPaste(); else if (action == cutAct) edit->editCut(); else if (action == selectAllAct) edit->editSelectAll(); #if 0 // TODO: this part is waiting for QScintilla backend feature (yet unimplemented). else if (action == selectBlockAct) { // OK, this looks ugly but it's pretty functional. // Here I need to setup chosen selection type for // all QScintilla based editors. int selectionType = action->isChecked() ? QsciScintillaBase::SC_SEL_RECTANGLE : QsciScintillaBase::SC_SEL_STREAM; foreach (QWidget * i, QApplication::allWidgets()) { toMarkedText * w = qobject_cast(i); if (w) { w->setSelectionType(selectionType); qDebug() << "setting" << w << selectionType; } } SelectionLabel->setText(action->isChecked() ? "Sel: Block" : "Sel: Normal"); } #endif else if (action == refreshAct) edit->editReadAll(); else if (action == searchReplaceAct) { if (!Search) Search = new toSearchReplace(this); Search->isVisible() ? Search->hide() : Search->show(); } else if (action == searchNextAct) { if (Search) Search->searchNext(); else searchReplaceAct->activate(QAction::Trigger); } else if (action == saveAsAct) edit->editSave(true); else if (action == saveAct) edit->editSave(false); else if (action == printAct) edit->editPrint(); } // if edit if (action == openAct && !this->Connections.empty()) { if (edit) edit->editOpen(); else this->editOpenFile(QString::null); } if (action == commitAct) { try { toConnection &conn = currentConnection(); emit willCommit(conn, true); conn.commit(); setNeedCommit(conn, false); } TOCATCH; } else if (action == stopAct) { try { toConnection &conn = currentConnection(); conn.cancelAll(); } TOCATCH; } else if (action == refreshAct) { try { currentConnection().rereadCache(); } TOCATCH; toMainWidget()->checkCaching(); } else if (action == rollbackAct) { try { toConnection &conn = currentConnection(); emit willCommit(conn, false); conn.rollback(); setNeedCommit(conn, false); } TOCATCH; } else if (action == currentAct) ConnectionSelection->setFocus(); else if (action == quitAct) close(); else if (action == cascadeAct) workspace()->cascadeSubWindows(); else if (action == tileAct) workspace()->tileSubWindows(); else if (action == helpCurrentAct) toHelp::displayHelp(); else if (action == helpContentsAct) toHelp::displayHelp(QString::fromLatin1("toc.html")); else if (action == aboutAct) { toAbout about(toAbout::About, this, "About " TOAPPNAME, true); about.exec(); } else if (action == aboutQtAct) QApplication::aboutQt(); else if (action == licenseAct) { toAbout about(toAbout::License, this, "About " TOAPPNAME, true); about.exec(); } else if (action == prefsAct) { toPreferences::displayPreferences(this); handleToolsDisplay(); } else if (action == openSessionAct) loadSession(); else if (action == saveSessionAct) saveSession(); else if (action == restoreSessionAct) { try { std::map session; toConfigurationSingle::Instance().loadMap( toConfigurationSingle::Instance().defaultSession(), session); importData(session, "TOra"); } TOCATCH; } else if (action == closeSessionAct) closeSession(); } void toMain::addConnection(void) { try { toNewConnection newConnection(this); toConnection *conn = NULL; if (newConnection.exec()) conn = newConnection.connection(); if (conn) addConnection(conn); } TOCATCH } toConnection &toMain::currentConnection() { for (std::list::iterator i = Connections.begin();i != Connections.end();i++) { if (ConnectionSelection->currentText().startsWith((*i)->description())) { return *(*i); } } throw tr("Can't find active connection"); } toConnection *toMain::addConnection(toConnection *conn, bool def) { int j = 0; for (std::list::iterator i = Connections.begin();i != Connections.end();i++, j++) { if ((*i)->description() == conn->description()) { ConnectionSelection->setCurrentIndex(j); if (def) createDefault(); return *i; } } Connections.insert(Connections.end(), conn); ConnectionSelection->addItem(connectionColorPixmap(conn->color()), conn->description()); ConnectionSelection->setCurrentIndex(ConnectionSelection->count() - 1); if (ConnectionSelection->count() == 1) enableConnectionActions(true); checkCaching(); changeConnection(); emit addedConnection(conn->description()); if (def) createDefault(); return conn; } void toMain::setNeedCommit(toConnection &conn, bool needCommit) { int pos = 0; for (std::list::iterator i = Connections.begin();i != Connections.end();i++) { if (conn.description() == (*i)->description()) { QString dsc = conn.description(); if (needCommit) dsc += QString::fromLatin1(" *"); ConnectionSelection->setCurrentIndex(pos); ConnectionSelection->setItemText(pos, dsc); break; } pos++; } conn.setNeedCommit(needCommit); } bool toMain::delConnection(void) { toConnection *conn = NULL; int pos = 0; for (std::list::iterator i = Connections.begin(); i != Connections.end(); i++) { if (ConnectionSelection->currentText().startsWith((*i)->description())) { conn = (*i); if (conn->needCommit()) { QString str = tr("Commit work in session to %1 before " "closing it?").arg(conn->description()); switch (TOMessageBox::warning(this, tr("Commit work?"), str, tr("&Yes"), tr("&No"), tr("Cancel"))) { case 0: conn->commit(); break; case 1: conn->rollback(); break; case 2: return false; } } if (!conn->closeWidgets()) return false; emit removedConnection(conn->description()); Connections.erase(i); ConnectionSelection->removeItem(pos); if (ConnectionSelection->count()) ConnectionSelection->setCurrentIndex(std::max(pos - 1, 0)); delete conn; break; } pos++; } if (ConnectionSelection->count() == 0) enableConnectionActions(false); else changeConnection(); return true; } std::list toMain::connections(void) { std::list ret; for (std::list::iterator i = Connections.begin();i != Connections.end();i++) toPush(ret, (*i)->description()); return ret; } toConnection &toMain::connection(const QString &str) { for (std::list::iterator i = Connections.begin();i != Connections.end();i++) if ((*i)->description() == str) return *(*i); throw tr("Couldn't find specified connectionts (%1)").arg(str); } void toMain::setEditWidget(toEditWidget *edit) { toMain *main = toMainWidget(); if (main && edit) { if (main->Edit) main->Edit->lostFocus(); main->Edit = edit; main->RowLabel->setText(QString::null); main->ColumnLabel->setText(QString::null); main->editEnable(edit); } } void toMain::editEnable(toEditWidget *edit) { if (!edit) return; toMain *main = toMainWidget(); if (main) main->editEnable(edit, edit->openEnabled(), edit->saveEnabled(), edit->printEnabled(), edit->undoEnabled(), edit->redoEnabled(), edit->cutEnabled(), edit->copyEnabled(), edit->pasteEnabled(), edit->searchEnabled(), edit->selectAllEnabled(), edit->readAllEnabled() ); // Set Selection Mode on X11 // qt4 TODO // no idea what the docs are asking me to do here. the method was obsoleted in qt3 // QClipboard *clip = qApp->clipboard(); // if (clip->supportsSelection()) // clip->setSelectionMode(true); } void toMain::editDisable(toEditWidget *edit) { toMain *main = toMainWidget(); if (main) { main->editEnable(edit, !main->Connections.empty(), false, false, false, false, false, false, false, false, false, false); if (edit && edit == main->Edit) { main->Edit->lostFocus(); main->Edit = NULL; } } } toEditWidget *toMain::findEdit(QWidget *widget) { while (widget) { toEditWidget *edit = dynamic_cast(widget); if (edit) return edit; widget = widget->parentWidget(); } return NULL; } void toMain::editEnable(toEditWidget *edit, bool open, bool save, bool print, bool undo, bool redo, bool cut, bool copy, bool paste, bool search, bool selectAll, bool readAll) { if (!edit) { openAct->setEnabled(false); recentMenu->setEnabled(false); saveAct->setEnabled(false); saveAsAct->setEnabled(false); printAct->setEnabled(false); undoAct->setEnabled(false); redoAct->setEnabled(false); cutAct->setEnabled(false); copyAct->setEnabled(false); pasteAct->setEnabled(false); searchReplaceAct->setEnabled(false); searchNextAct->setEnabled(false); selectAllAct->setEnabled(false); readAllAct->setEnabled(false); emit editEnabled(false); } else if (edit && edit == Edit) { openAct->setEnabled(open); recentMenu->setEnabled(open); saveAct->setEnabled(save); saveAsAct->setEnabled(save); printAct->setEnabled(print); undoAct->setEnabled(undo); redoAct->setEnabled(redo); cutAct->setEnabled(cut); copyAct->setEnabled(copy); pasteAct->setEnabled(paste); searchReplaceAct->setEnabled(search); searchNextAct->setEnabled(search); selectAllAct->setEnabled(search); readAllAct->setEnabled(readAll); emit editEnabled(open); } } void toMain::enableConnectionActions(bool enabled) { commitAct->setEnabled(enabled); rollbackAct->setEnabled(enabled); stopAct->setEnabled(enabled); closeConn->setEnabled(enabled); refreshAct->setEnabled(enabled); openAct->setEnabled(enabled); recentMenu->setEnabled(enabled); // now, loop through tools and enable/disable toConnection *conn = 0; try { conn = ¤tConnection(); } catch(...) { } std::map &tools = toTool::tools(); for (std::map::iterator i = tools.begin(); i != tools.end(); i++) { if (!(*i).second) continue; #ifdef TO_NO_ORACLE // hide icon if tool doesn't support connection. this is to // hide all of the oracle tools that don't make sense if // compiled without it. if(conn) (*i).second->setActionVisible(*conn); else (*i).second->setActionVisible(false); #else if (!enabled) (*i).second->enableAction(false); else { if(conn) (*i).second->enableAction(*conn); else (*i).second->enableAction(false); } #endif } } void toMain::registerSQLEditor(const QString &name) { SQLEditor = name; } void toMain::closeEvent(QCloseEvent *event) { while (Connections.end() != Connections.begin()) { if (!delConnection()) { event->ignore(); return; } } Workspace->closeAllSubWindows(); if (Workspace->currentSubWindow() != 0) { event->ignore(); // stop widget refused return; } std::map session; exportData(session, "TOra"); try { toConfigurationSingle::Instance().saveMap( toConfigurationSingle::Instance().defaultSession(), session); } TOCATCH; toConfigurationSingle::Instance().setMainWindowGeometry(saveGeometry()); toConfigurationSingle::Instance().setMainWindowState(saveState()); toConfigurationSingle::Instance().setLeftDockbarState(leftDockbar->saveState()); toConfigurationSingle::Instance().setRightDockbarState(rightDockbar->saveState()); toConfigurationSingle::Instance().saveConfig(); event->accept(); } //bool toMain::close() //{ // return QMainWindow::close(); //} void toMain::createDefault(void) { std::map &tools = toTool::tools(); QString defName(toConfigurationSingle::Instance().defaultTool()); toTool *DefaultTool = NULL; for (std::map::iterator k = tools.begin(); k != tools.end(); k++) { if(defName.isEmpty() || defName == (*k).first) { DefaultTool = (*k).second; break; } } if (DefaultTool) DefaultTool->createWindow(); } void toMain::setCoordinates(int line, int col) { QString str = tr("Row:") + " "; str += QString::number(line); RowLabel->setText(str); str = tr("Col:") + " "; str += QString::number(col); ColumnLabel->setText(str); } void toMain::editSQL(const QString &str) { std::map &tools = toTool::tools(); if (!SQLEditor.isNull() && tools[SQLEditor]) { tools[SQLEditor]->createWindow(); emit sqlEditor(str); } } void toMain::updateStatusMenu(void) { statusMenu->clear(); for (std::list::iterator i = StatusMessages.begin(); i != StatusMessages.end(); i++) { QAction *s = new QAction(statusMenu); if ((*i).size() > 75) s->setText((*i).left(75) + "..."); else s->setText(*i); s->setToolTip(*i); statusMenu->addAction(s); } } void toMain::changeConnection(void) { enableConnectionActions(true); } void toMain::showBusy() { qApp->setOverrideCursor(Qt::WaitCursor); } void toMain::removeBusy() { qApp->restoreOverrideCursor(); } void toMain::editOpenFile(QString file) { toWorksheet *sheet = 0; if(Edit) sheet = dynamic_cast(Edit); // the only fscking way to find the tool on top, regardless of // what's got focus or whatever. this is called from docklets // which usually have focus. though, manually setting focus on // Workspace doesn't help either. if(!Workspace->subWindowList().isEmpty()) { QMdiSubWindow *sub = Workspace->subWindowList(QMdiArea::StackingOrder).last(); if(!sheet && sub) sheet = dynamic_cast(sub->widget()); } if(!sheet) { toTool *tool = toTool::tool("00010SQL Editor"); if(tool) { QWidget *win = tool->createWindow(); if(win) sheet = dynamic_cast(win); } else printf("Couldn't find sql worksheet.\n"); } if(!sheet) return; sheet->editor()->editOpen(file); sheet->setFocus(); } toDockbar* toMain::dockbar(toDocklet *let) { if(rightDockbar->contains(let)) return rightDockbar; return leftDockbar; } void toMain::showMessage(const QString &str, bool save, bool log) { // this function can be called from any thread. this tomain // instance is always in the main (gui) thread, so emitting a // signal with a queued flag will be picked up in the main // thread. otherwise tora crashes. emit messageRequested(str, save, log); } void toMain::showMessageImpl(const QString &str, bool save, bool log) { if (!str.isEmpty()) { int sec = toConfigurationSingle::Instance().statusMessage(); if (save || sec == 0) statusBar()->showMessage(str.simplified()); else statusBar()->showMessage(str.simplified(), sec * 1000); if (!save && log) { toPush(StatusMessages, str); if ((int) StatusMessages.size() > toConfigurationSingle::Instance().statusSave()) toShift(StatusMessages); statusBar()->setToolTip(str); if (!toConfigurationSingle::Instance().messageStatusbar()) displayMessage(); } } } // HACK: workaround for close button in the tabs. See HACK note near the QMdiArea construction. void toMain::workspaceCloseWindow(int ix) { QMdiSubWindow * w = Workspace->subWindowList()[ix]; assert(w); if (w != Workspace->activeSubWindow()) { Workspace->setActiveSubWindow(w); } // HACK in HACK: toWorksheet's behaviour is strange here. // it gets a QObject 0x0 pointer in this case. So this // will handle it. // Let's hope the MDI patch will be applied ASAP... if (!Workspace->activeSubWindow()) { w->close(); } Workspace->closeActiveSubWindow(); } void toMain::checkCaching(void) { int num = 0; for (std::list::iterator i = Connections.begin();i != Connections.end();i++) { if (!(*i)->cacheAvailable(true, false, false)) num++; } if (num == 0) { Poll.stop(); } else { Poll.start(100); } } void toMain::exportData(std::map &data, const QString &prefix) { try { #if 0 // No need to do it. We are storing it in QSettings now // if (isMaximized()) // data[prefix + ":State"] = QString::fromLatin1("Maximized"); // else if (isMinimized()) // data[prefix + ":State"] = QString::fromLatin1("Minimized"); // else // { // QRect rect = geometry(); // data[prefix + ":X"] = QString::number(rect.x()); // data[prefix + ":Y"] = QString::number(rect.y()); // data[prefix + ":Width"] = QString::number(rect.width()); // data[prefix + ":Height"] = QString::number(rect.height()); // } #endif int id = 1; std::map connMap; { for (std::list::iterator i = Connections.begin();i != Connections.end();i++) { QString key = prefix + ":Connection:" + QString::number(id); if (toConfigurationSingle::Instance().savePassword()) data[key + ":Password"] = toObfuscate((*i)->password()); data[key + ":User"] = (*i)->user(); data[key + ":Host"] = (*i)->host(); QString options; for (std::set ::const_iterator j = (*i)->options().begin();j != (*i)->options().end();j++) options += "," + *j; data[key + ":Options"] = options.mid(1); // Strip extra , in beginning data[key + ":Database"] = (*i)->database(); data[key + ":Provider"] = (*i)->provider(); connMap[*i] = id; id++; } } id = 1; for (int i = 0;i < workspace()->subWindowList().count();i++) { toToolWidget *tool = dynamic_cast(workspace()->subWindowList().at(i)); if (tool) { QString key = prefix + ":Tools:" + QString::number(id); tool->exportData(data, key); data[key + ":Type"] = tool->tool().key(); data[key + ":Connection"] = QString::number(connMap[&tool->connection()]); id++; } } toTemplateProvider::exportAllData(data, prefix + ":Templates"); } TOCATCH } void toMain::importData(std::map &data, const QString &prefix) { if (data[prefix + ":State"] == QString::fromLatin1("Maximized")) showMaximized(); else if (data[prefix + ":State"] == QString::fromLatin1("Minimized")) showMinimized(); else { int width = data[prefix + ":Width"].toInt(); if (width == 0) { TOMessageBox::warning(toMainWidget(), tr("Invalid session file"), tr("The session file is not valid, can't read it.")); return ; } else setGeometry(data[prefix + ":X"].toInt(), data[prefix + ":Y"].toInt(), width, data[prefix + ":Height"].toInt()); showNormal(); } std::map connMap; int id = 1; std::map::iterator i; while ((i = data.find(prefix + ":Connection:" + QString::number(id) + ":Database")) != data.end()) { QString key = prefix + ":Connection:" + QString::number(id); QString database = (*i).second; QString user = data[key + ":User"]; QString host = data[key + ":Host"]; QString schema = data[key + ":Schema"]; QStringList optionlist = data[key + ":Options"].split(","); std::set options; for (int j = 0;j < optionlist.count();j++) if (!optionlist[j].isEmpty()) options.insert(optionlist[j]); QString password = toUnobfuscate(data[key + ":Password"]); QString provider = data[key + ":Provider"]; bool ok = true; if (toConfigurationSingle::Instance().defaultPassword() == password) { password = QInputDialog::getText(this, tr("Input password"), tr("Enter password for %1").arg(database), QLineEdit::Password, "", &ok); } if (ok) { try { toConnection *conn = new toConnection(provider.toLatin1(), user, password, host, database, schema, "", options); if (conn) { conn = addConnection(conn, false); connMap[id] = conn; } } TOCATCH } id++; } id = 1; while ((i = data.find(prefix + ":Tools:" + QString::number(id).toLatin1() + ":Type")) != data.end()) { QString key = (*i).second.toLatin1(); int connid = data[prefix + ":Tools:" + QString::number(id).toLatin1() + ":Connection"].toInt(); std::map::iterator j = connMap.find(connid); if (j != connMap.end()) { toTool *tool = toTool::tool(key); if (tool) { QWidget *widget = tool->toolWindow(workspace(), *((*j).second)); const QPixmap *icon = tool->toolbarImage(); if (icon) widget->setWindowIcon(*icon); widget->show(); if (widget) { toToolWidget *tw = dynamic_cast(widget); if (tw) { toToolCaption(tw, tool->name()); tw->importData(data, prefix + ":Tools:" + QString::number(id)); toolWidgetAdded(tw); } } } } id++; } toTemplateProvider::importAllData(data, prefix + ":Templates"); updateWindowsMenu(); } void toMain::saveSession(void) { QString fn = toSaveFilename(QString::null, QString::fromLatin1("*.tse"), this); if (!fn.isEmpty()) { std::map session; exportData(session, "TOra"); try { toConfigurationSingle::Instance().saveMap(fn, session); } TOCATCH } } void toMain::loadSession(void) { QString filename = toOpenFilename(QString::null, QString::fromLatin1("*.tse"), this); if (!filename.isEmpty()) { try { std::map session; toConfigurationSingle::Instance().loadMap(filename, session); importData(session, "TOra"); } TOCATCH } } void toMain::closeSession(void) { std::map session; exportData(session, "TOra"); try { toConfigurationSingle::Instance().saveMap(toConfigurationSingle::Instance().defaultSession(), session); } TOCATCH while (workspace()->subWindowList().count() > 0 && workspace()->subWindowList().at(0)) if (workspace()->subWindowList().at(0) && !workspace()->subWindowList().at(0)->close()) return ; while (Connections.end() != Connections.begin()) { if (!delConnection()) return ; } } void toMain::addChart(toLineChart *chart) { emit chartAdded(chart); } void toMain::setupChart(toLineChart *chart) { emit chartSetup(chart); } void toMain::removeChart(toLineChart *chart) { emit chartRemoved(chart); } void toMain::displayMessage(void) { if (StatusMessages.size() < 1) return; Message->appendText(*(--StatusMessages.end())); } void toMain::toolWidgetAdded(toToolWidget *tool) { emit addedToolWidget(tool); } void toMain::toolWidgetRemoved(toToolWidget *tool) { emit removedToolWidget(tool); } toBackgroundLabel* toMain::getBackgroundLabel() { return BackgroundLabel; } toMain* getMainWidget() { QWidgetList widgets = qApp->topLevelWidgets(); for (QWidgetList::iterator it = widgets.begin(); it != widgets.end(); it++) { toMain *main = dynamic_cast((*it)); if (main) return main; } return NULL; } toMain* toMainWidget() { static toMain *main = getMainWidget(); // if there is no main widget yet, try to refresh it if (!main) main = getMainWidget(); return main; } tora-2.1.3/src/totabwidget.cpp0000644000175000017500000001035311270353625016066 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #include "totabwidget.h" #include #include #define CONNECT_CHANGED \ connect(this, \ SIGNAL(currentChanged(int)), \ this, \ SLOT(tabChanged(int))); #define DISCONNECT_CHANGED \ disconnect(this, \ SIGNAL(currentChanged(int)), \ this, \ SLOT(tabChanged(int))); toTabWidget::toTabWidget(QWidget *parent) : QTabWidget(parent) { CONNECT_CHANGED; } void toTabWidget::setTabShown(QWidget *w, bool show) { int pos; QWidget *parent = w; if (!show) { while ((pos = indexOf(parent)) < 0 && parent && parent != this) parent = parent->parentWidget(); if (pos < 0 || parent == this) return; // not found DISCONNECT_CHANGED; QTabWidget::removeTab(pos); CONNECT_CHANGED; } else { while (!tabs.contains(parent) && parent && parent != this) parent = parent->parentWidget(); if (!tabs.contains(parent) || parent == this || !parent) return; // not found struct page r = tabs[parent]; DISCONNECT_CHANGED; QTabWidget::insertTab(r.index, parent, r.label); CONNECT_CHANGED; } } int toTabWidget::addTab(QWidget *widget, const QString &label) { struct page p; p.label = label; p.index = QTabWidget::addTab(widget, label); tabs[widget] = p; return p.index; } int toTabWidget::addTab(QWidget *widget, const QIcon& icon, const QString &label) { struct page p; p.label = label; p.index = QTabWidget::addTab(widget, icon, label); tabs[widget] = p; return p.index; } void toTabWidget::tabChanged(int index) { QWidget *widget = QTabWidget::widget(index); if (widget) emit currentTabChanged(widget); } // ---------------------------------------- unused int toTabWidget::insertTab(int index, QWidget *widget, const QString &label) { return QTabWidget::insertTab(index, widget, label); } int toTabWidget::insertTab(int index, QWidget *widget, const QIcon& icon, const QString &label) { return QTabWidget::insertTab(index, widget, icon, label); } void toTabWidget::removeTab(int index) { QTabWidget::removeTab(index); } tora-2.1.3/src/tobrowserindexui.ui0000644000175000017500000003240711270353625017024 0ustar michaelmichael toBrowserIndexUI 0 0 588 628 Index name 11 6 7 5 0 0 &Name Name false image0 image1 Qt::StrongFocus image2 Display SQL to create this constraint Normal Index Unique Index &Columns Cols false Type false 5 7 0 0 Qt::StrongFocus Cancel 20 20 QSizePolicy::Expanding Qt::Horizontal &Ok true toResultCols QWidget
toresultcols.h
-1 -1 0 5 5 image3
toTableSelect QWidget
totableselect.h
-1 -1 0 5 7 image4
Name Type Cols ColList ToolButton1 PushButton1 PushButton2 789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022630543251d2e253d856405bffcbc54105b19c856360003103711c24d4b8370f5e04059591948a28925122106d40814030264b144085026a08e583b70b80f02064cacd69a0b00f9604c22 789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022630543251d2e253d856405bffcbc54105b19c856360003103711c44d4b8371f5d0001962ca30802c960801ca04d45162efc08bd55a7301005e924b74 789c6d90cf6e83300c87ef3c45446e684a13081434f51136ed3869dac11828f4cf2a6ddd619af6eeebcf848ab25921f2f7c5d88455a29e9f1e54b28a3ece741e58714fef2a693e8fc7af97d7cd7714bb426179e5e2bb28368ad5e3e9ad45ae2fb9b612c001e84a577aa96c81a94d6d4ec07d405fa44016acd2729d010f01795d037b60e6325bca692d58654c0c6c80de795b7b6027489eb901ee8039e5555700b7019b11e98a9d5c6711e2b4d666da82436e64c30a0ed9f85cdd5881983b5410d5332755dc50dbc99869aed1db7ee8696c307ddfe5d5ddfea0cdac9f48d2e6d685c1b7ce84ab2c5c908b7ff09ffbdb6f723ff7d12f66576feb 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 789c9597c972e3480e40eff5158ec2ada203cd3549c6c41cbcc9b6bccabbddd1078014bdcb9b6449ee987f9f240072caac9e4357d6c1cf5812890490f4ef3f562e8ff6577efcfeed7d4ad3bb72a5bca5b7951fd5ece969f9c79ffffeebdbf7285a69fec7f14af4fdb76fdf47d39572e5e079326e00c10304f24ff8b9c7d463ee71d9e3aac7e31ed70d67dc2ce1cb9e7cd0e3c957863eaff778d4b3bfe8c97be781a71eaff5f8e82bf37ecfff4dc314364b58fdb966096ff6ecf77af6b70d1771b3841f1b8ef366099ff7ec17bdf8faf7970847cd12f9b2e344f8b563890f5e3a96fda0ea98c45fdc71299c765c354c67c249bb1fcd3a56ff271d8b3d9d1b271a0f1d742c725874acfe9d70eef3a9f65bc2e47fa3f16a7d55411d6a3e4e1b0e03bf349e8171144a7e49ceeb295239cb79c3384ccdff76c7b23f14c269e8ccdfa9716ef6b5b18f407857d88585e57bbf65b39f18971a0fc8fd7b6fc624f723e524f9e3d2b8d4f391d49ba74ae5bed585a3c8e49b1d6b7c929f701ca5e65feac10b9dd967c2519485a9dcaf33ce952110cea3caec23e53830f9863045b5ca79ae1c8741263cec58eb59ed390ecd3e378e8d651e44651c85527f20f51cd55eae5c1b27a1f823b9bf388c0b65b831a6b090fd24be384bc24098a6d65fb5ca29ed58fd5f35eccbaf34ff320f922819ab3e487e93d4b3d6eb9b711d4abda0f44352a685d5f39d709db2ca296c380dd2c238366ee5605c1acb3c96f2d3feff148ed25aeb0d1e955d60fd22f94a63178632df79d5d8fa95971d8b9cee5b8e647ec1d038567b40e1a4d567a9d73475b1f14ecb5a7f2cf94a9d4b343eba304e357e3814ce5c6afd22f33b2d5c6ee7295bb6fc4abda4e40af3f7d972a4f52df79bb223ebff79cb2a2736e650ce470fc2652b67b9cfb4726dff5d195776bead96adbf1e3bd67a9779928ebbfdc898357f34346ee7c3a0658d07359eba5922d7fbaebd3fdd6f6e3c567d96f9e4c22cb4780a63eb7f90f7c525596cf11c1a2791ce9bd8d869bd93e4dba55eaeefc781b1dd17ee1b9b3e4b3e9dcbfcc4107f9fc671a4ef9dcc139765763fa4f6943965947a7355b3c45eceebc65965fb851deb79655e662ecfcddf93716172999759966791f67f689ceb79e9a363951f1b9b3d1e76acf36fcf98544e529fdebc954b3f67d42ce1eb86f3465df3fb2e5c14a5d53b2b53a0f316773ad6f922f32c2fa9cd9fdc6f5e79d6f8768d13ebc79d96559fe47dcd6b8a63cdcfbb71126bfcd21f45e0f5f57dbb357691c63f342e2cbea063d597f7b808c9e6151e1993c573d1b2de0fc8fd1711151a1fdf187324f393671debfe92df22a134d67e93fb2a1cd93c05630ef4fe48f25d641c683de2b171a8f399ef3a56f989b1bd273c6dd9f697f7bcc85b7dca8da348be4f41fabf2838b1f7e9cc38d5f715e4fd2888439b9f53639ba72cf55a701b3f0c8cad3ff9de38b57c4bfd15a5678d6f646cfd87857166ef95f46b51f9fdf57c609cda7b756edcbee7ceb850a671c7faf7809e7fccb9d63b6c1b93d5f7ac63d5d7fcd41c245a8fabc685e68f1f8c49ef93e5bda4c0fbd7f9b16b4c5a9ff060ccf63e4b3d52c889c6433bc685da33195bbfc2bd31dbfc947aa5982bf37fddb1c623f39c7cbbda7c94f889cac4ea4df24f55c9367fe43da47159da3c907ea39ac74ebfdfe5fe39e0dac9f71f4abed87fb02993d42b475562effb5dcb36ff243fec3f3f327d4fd1384db5ffd68c9db1bc579cb6faf8619cdafe321f39f39f33721fb46bec4cfe699c19cf3bd6f3ad1ae7c6f2de71ce2549fe71a9dcc917c685324b7eb8aac6767ff27dc763cf92afd1b4590848c8586285e3deaafc6fd94b61346df5b1c61bbcc53bbcff9bf5808ff884136ff5acfadef70dbee02bbee13b4e71861f38c7052ef1d3af555cc375dcc04d1c6069fae47dbfe2166ee30e0e7117f7701f0ff0108f7084c77882a77886e7788197a6cf3e922baf7d8d018618618c895f293acc30c702478000403831fdd247f90e8c019450610c63a8e1066efd4f15dcc13d3cc0a3d77f8256bff2fa531cc233bcc02bbcc13b4c61061f3087052ce11356c5ff1aac9bfed8ebcf701736bc741306b005dbb00343d8853def611f0ee0d0eb1fc1e827fd0f38861338f5becfe01c2ee0d26b5ec13504de4708d12ffa7388bd2481141c64907bed020f0909604944fc8bfe924a4ca8a231d5e2fb956ee896eee8deeb3fd0e32ffa0b7ac29426f041fed4f442afdee28dde694a33faa0f9aff1d0829618d327add21aadd3066dfafd06b445dbb443c3be3eedd21eed7bfd033aa4231ad1319dd0299dd1395dd0255dfd8dff6b0a28c4042af27fcc907fafc879ed73ff199053f145bfc207463c666062e6d2dfd9d2db2db9a20b1e73cd377cfbe5be4a5fb1eb7cc7f7fcc08ffcc4137ee6177ee5377ee729cff883e7bcf8a91ed8d7f7069ef1923f7995d7789d37789307bc4557bccd3b3ce45ddefba9defc4fbebecfe1fffce305eff1fe4ff50c3ea2015e00f93dd7fcb9beae35ff5bf2da5dbf788b676f71891398c03a8c7a6b1d267effcbfff5e33fe8f7fffcebdb7f01520e2ea3 toresultcols.h totableselect.h PushButton1 clicked() toBrowserIndexUI accept() PushButton2 clicked() toBrowserIndexUI reject() ToolButton1 clicked() toBrowserIndexUI displaySQL() toolButton2 clicked() toBrowserIndexUI addIndex() toolButton3 clicked() toBrowserIndexUI delIndex() Name activated(int) toBrowserIndexUI changeIndex()
tora-2.1.3/src/tohelp.cpp0000644000175000017500000005131611270353625015050 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "tohelp.h" #include "tohtml.h" #include "tomain.h" #include "toresultview.h" #include "totool.h" #include "tohelpsetup.h" #include #include toHelp *toHelp::Window; toHelpAddFile::toHelpAddFile(QWidget *parent, const char *name) : QDialog(parent) { if (name) setObjectName(name); setupUi(this); OkButton->setEnabled(false); toHelp::connectDialog(this); } void toHelpAddFile::browse() { QString filename = toOpenFilename(Filename->text(), QString::fromLatin1("toc.htm*"), this); if (!filename.isEmpty()) Filename->setText(filename); } void toHelpAddFile::valid() { if (Filename->text().isEmpty() || Root->text().isEmpty()) OkButton->setEnabled(false); else OkButton->setEnabled(true); } toHelpPrefs::toHelpPrefs(toTool *tool, QWidget *parent, const char *name) : QWidget(parent), toSettingTab("additionalhelp.html"), Tool(tool) { if (name) setObjectName(name); setupUi(this); // int tot = Tool->config("Number", "-1").toInt(); // if (tot != -1) // { // for (int i = 0;i < tot;i++) // { // QString num = QString::number(i); // QString root = Tool->config(num.toLatin1(), ""); // num += QString::fromLatin1("file"); // QString file = Tool->config(num.toLatin1(), ""); // new toTreeWidgetItem(FileList, root, file); // } // } HelpsMapIterator i(toConfigurationSingle::Instance().additionalHelp()); while (i.hasNext()) { i.next(); new toTreeWidgetItem(FileList, i.key(), i.value()); } } void toHelpPrefs::saveSetting() { // int i = 0; HelpsMap h; for (toTreeWidgetItem *item = FileList->firstChild();item;item = item->nextSibling()) { // QString nam = QString::number(i); // Tool->setConfig(nam.toLatin1(), item->text(0)); // nam += QString::fromLatin1("file"); // Tool->setConfig(nam.toLatin1(), item->text(1)); // i++; h[item->text(0)] = item->text(1); } // Tool->setConfig("Number", QString::number(i)); toConfigurationSingle::Instance().setAdditionalHelp(h); delete toHelp::Window; } void toHelpPrefs::addFile() { toHelpAddFile file(this); if (file.exec()) new toTreeWidgetItem(FileList, file.Root->text(), file.Filename->text()); } void toHelpPrefs::delFile() { delete FileList->selectedItem(); } void toHelpPrefs::oracleManuals() { QString filename = toOpenFilename(QString::null, QString::fromLatin1("*index.htm*"), this); try { toHtml file(toReadFile(filename)); QString dsc; bool inDsc = false; QRegExp isToc(QString::fromLatin1("toc\\.html?$")); while (!file.eof()) { file.nextToken(); if (file.isTag()) { if (file.open() && file.tag() == "a") { QString href = toHelp::path(filename); href += file.value("href"); if (!href.isEmpty() && !dsc.isEmpty() && href.indexOf(isToc) >= 0 && !file.value("title").isNull()) { new toTreeWidgetItem(FileList, dsc.simplified(), href); inDsc = false; dsc = QString::null; } } else if ((file.open() && file.tag() == "dd") || file.tag() == "book") { dsc = QString::null; inDsc = true; } } else if (inDsc) dsc += file.text(); } } catch (const QString &str) { TOMessageBox::warning(toMainWidget(), qApp->translate("toHelpPrefs", "File error"), str); } } QWidget *toHelpTool::configurationTab(QWidget *parent) { return new toHelpPrefs(this, parent); } void toHelpTool::displayHelp(void) { QWidget *cur = qApp->focusWidget(); while (cur) { QDialog *dlg = dynamic_cast(cur); if (dlg) { toHelp::displayHelp(dlg); return ; } cur = cur->parentWidget(); } // No dialog found toHelp::displayHelp(); } static toHelpTool HelpTool; toHelp::toHelp(QWidget *parent, QString name, bool modal) : QDialog(parent) // , // Qt::Window | // Qt::WindowTitleHint | // Qt::WindowSystemMenuHint | // Qt::WindowMinimizeButtonHint | // Qt::WindowMaximizeButtonHint | // Qt::WindowCloseButtonHint) { setupUi(this); setModal(modal); if (!modal) Window = this; connect(SearchLine, SIGNAL(returnPressed()), this, SLOT(search())); connect(Sections, SIGNAL(currentItemChanged( QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(changeContent( QTreeWidgetItem *, QTreeWidgetItem *))); connect(Result, SIGNAL(currentItemChanged( QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(changeContent( QTreeWidgetItem *, QTreeWidgetItem *))); connect(Help, SIGNAL(textChanged(void)), this, SLOT(removeSelection(void))); connect(Help, SIGNAL(backwardAvailable(bool)), backButton, SLOT(setEnabled(bool))); connect(backButton, SIGNAL(clicked(void)), Help, SLOT(backward(void))); connect(Help, SIGNAL(forwardAvailable(bool)), forwardButton, SLOT(setEnabled(bool))); connect(forwardButton, SIGNAL(clicked(void)), Help, SLOT(forward(void))); std::map Dsc; Dsc[tr(TOAPPNAME " manual")] = QString("qrc:/help/toc.html"); // int tot = HelpTool.config("Number", "-1").toInt(); // if (tot != -1) // { // for (int i = 0;i < tot;i++) // { // QString num = QString::number(i); // QString dsc = HelpTool.config(num.toLatin1(), ""); // num += QString::fromLatin1("file"); // QString file = HelpTool.config(num.toLatin1(), ""); // Dsc[dsc] = file; // } // } HelpsMapIterator i(toConfigurationSingle::Instance().additionalHelp()); while (i.hasNext()) { i.next(); Dsc[i.key()] = i.value(); } splitter->setStretchFactor(splitter->indexOf(tabs), 0); setGeometry(x(), y(), std::max(width(), 640), std::max(height(), 480)); QTreeWidgetItem * lastParent = NULL; for (std::map::iterator i = Dsc.begin();i != Dsc.end();i++) { try { QString path = toHelp::path((*i).second); QString filename = (*i).second; QTreeWidgetItem * parent; if ((*i).first == tr("TOra manual")) { parent = new QTreeWidgetItem(Sections, QStringList() << (*i).first << "" << filename); Sections->expandItem(parent); if (!lastParent) lastParent = parent; } else parent = lastParent = new QTreeWidgetItem(lastParent, QStringList() << (*i).first << "" << filename); toHtml file(toReadFile(filename)); bool inA = false; QString dsc; QString href; QTreeWidgetItem * last = NULL; while (!file.eof()) { file.nextToken(); if (!file.isTag()) { if (inA) { dsc += file.text(); dsc = dsc.simplified(); } } else { QString c = file.tag(); if (c == "a") { if (file.open()) { href = file.value("href"); if (!href.isEmpty()) inA = true; } else { if (inA && !dsc.isEmpty() && !href.isEmpty()) { if (href.indexOf("//") < 0 && href.indexOf("..") < 0) { last = new QTreeWidgetItem(parent, QStringList() << dsc); filename = path; filename += href; last->setText(2, filename); } dsc = ""; } inA = false; } } else if (c == "dl") { if (file.open()) { if (!last) last = new QTreeWidgetItem(parent, QStringList() << "--------"); parent = last; last = NULL; } else { last = parent; parent = parent->parent(); if (!parent) throw tr("Missing parent, unbalanced dl in help file content"); } } } } } TOCATCH } for (int i = 0; i < Sections->topLevelItemCount(); ++i) Manuals->addItem(Sections->topLevelItem(i)->text(0)); // Progress = new QProgressBar(tabs); Progress->setMaximum(Dsc.size()); Progress->hide(); Searching = false; QSettings s; s.beginGroup("helpdialog"); restoreGeometry(s.value("geometry").toByteArray()); splitter->restoreState(s.value("splitter").toByteArray()); } toHelp::~toHelp() { if (Window == this) Window = NULL; } void toHelp::closeEvent(QCloseEvent * e) { if (Searching) return; QSettings s; s.beginGroup("helpdialog"); s.setValue("geometry", saveGeometry()); s.setValue("splitter", splitter->saveState()); QWidget::closeEvent(e); } QString toHelp::path(const QString &path) { QString cur; if (path.isNull()) cur = "qrc:/help/toc.html"; else cur = path; cur.replace(QRegExp(QString::fromLatin1("[^/]+$")), QString::null); return cur; } void toHelp::displayHelp(const QString &context, QWidget *parent) { toHelp *window; if (!Window || parent) window = new toHelp(parent, tr("Help window"), false); else window = Window; QString file = path(); file += context; // if (context.indexOf("htm") >= 0) // window->Help->setTextFormat(Qt::RichText); // else // window->Help->setTextFormat(Qt::AutoText); window->Help->setSource(file); if (parent) { window->exec(); delete window; } else window->show(); } void toHelp::displayHelp(QWidget *parent) { QWidget *cur = qApp->focusWidget(); while (cur) { toHelpContext *ctx = dynamic_cast(cur); if (ctx && !ctx->context().isEmpty()) { toHelp::displayHelp(ctx->context(), parent); return ; } cur = cur->parentWidget(); } toHelp::displayHelp(QString::fromLatin1("toc.html"), parent); } void toHelp::connectDialog(QDialog *dialog) { QAction *a = new QAction(dialog); a->setShortcut(toKeySequence(tr("F1", "Dialog|Help"))); connect(a, SIGNAL(triggered()), &HelpTool, SLOT(displayHelp())); } void toHelp::changeContent(QTreeWidgetItem * item, QTreeWidgetItem *) { disconnect(Help, SIGNAL(textChanged(void)), this, SLOT(removeSelection(void))); // if (item->text(2).indexOf("htm") >= 0) // Help->setTextFormat(Qt::RichText); // else // Help->setTextFormat(Qt::AutoText); if (!item->text(2).isEmpty()) Help->setSource(item->text(2)); connect(Help, SIGNAL(textChanged(void)), this, SLOT(removeSelection(void))); } void toHelp::search(void) { if (Searching) return ; Searching = true; Result->clear(); QStringList words = SearchLine->text().toLower().split(QRegExp(QString::fromLatin1("\\s+"))); if (words.count() == 0) return ; QRegExp strip(QString::fromLatin1("\\d+-\\d+\\s*,\\s+")); QRegExp stripend(QString::fromLatin1(",$")); int steps = 1; Progress->setValue(0); qApp->processEvents(); QTreeWidgetItem * parent; for (int i = 0; i < Sections->topLevelItemCount(); ++i) { parent = Sections->topLevelItem(i); if (Manuals->currentIndex() == 0 || parent->text(0) == Manuals->currentText()) { QString path = toHelp::path(parent->text(2)); QString filename = path; filename.append(QString::fromLatin1("toc.html")); try { toHtml file(toReadFile(filename)); std::list Context; bool inDsc = false; bool aRestart = true; QString dsc; QString href; while (!file.eof()) { file.nextToken(); if (file.isTag()) { if (file.open()) { if (file.tag() == "a") { href = file.value("href"); if (href[0] == '#') href = ""; else if (href.indexOf("..") >= 0) href = ""; } else if (file.tag() == "dd") { inDsc = true; aRestart = false; href = dsc = ""; } else if (file.tag() == "dl") { toPush(Context, dsc.simplified()); href = dsc = ""; inDsc = true; } } else if (file.tag() == "a") { if (!dsc.isEmpty() && !href.isEmpty()) { QString tmp; for (std::list::iterator i = Context.begin();i != Context.end();i++) if (i != Context.begin() && !(*i).isEmpty()) { tmp += *i; tmp += QString::fromLatin1(", "); } tmp += dsc.simplified(); QString url = path; url += href; aRestart = true; bool incl = true; { for (int i = 0;i < words.count();i++) if (!tmp.contains(words[i], Qt::CaseInsensitive)) { incl = false; break; } } if (incl) { tmp.replace(strip, QString::fromLatin1(" ")); tmp.replace(stripend, QString::fromLatin1(" ")); QTreeWidgetItem *item = new QTreeWidgetItem( Result, QStringList() << tmp.simplified()); item->setText(1, parent->text(0)); item->setText(2, url); } href = ""; } } else if (file.tag() == "dl") { toPop(Context); } } else if (inDsc) { dsc += file.text(); } } } TOCATCH } Progress->setValue(steps); ++steps; if (steps > 10) Progress->show(); qApp->processEvents(); } Progress->hide(); Searching = false; } void toHelp::setSelection(QTreeWidget *lst, const QString &source) { /* disconnect(lst, SIGNAL(selectionChanged(toTreeWidgetItem *)), this, SLOT(changeContent(toTreeWidgetItem *))); bool any = false; QString t = source; t.replace(QRegExp(QString::fromLatin1("^file:")), QString::fromLatin1("")); toTreeWidgetItem *next = NULL; for (toTreeWidgetItem *item = lst->firstChild();item;item = next) { if ((item->text(2) == t) != bool(item->isSelected())) { if (item->text(2) == t) { any = true; lst->setSelected(item, true); lst->ensureItemVisible(item); for (toTreeWidgetItem *parent = item->parent();parent;parent = parent->parent()) lst->setOpen(parent, true); break; } else lst->setSelected(item, false); } if (item->firstChild()) next = item->firstChild(); else if (item->nextSibling()) { next = item->nextSibling(); } else { next = item; do { next = next->parent(); } while (next && !next->nextSibling()); if (next) next = next->nextSibling(); } } connect(lst, SIGNAL(selectionChanged(toTreeWidgetItem *)), this, SLOT(changeContent(toTreeWidgetItem *))); if (!any) { QString t = source; t.replace(QRegExp(QString::fromLatin1("#[^#]*$")), QString::null); if (t != source) setSelection(lst, t); }*/ } void toHelp::removeSelection(void) { setSelection(Sections, Help->source().toString()); setSelection(Result, Help->source().toString()); } tora-2.1.3/src/tosqledit.h0000644000175000017500000000727711270353625015241 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOSQLEDIT_H #define TOSQLEDIT_H #include "config.h" #include "totemplate.h" #include "totool.h" #include class QComboBox; class QLineEdit; class toTreeWidget; class QAction; class toMarkedText; class toWorksheet; class toSQLEdit : public toToolWidget { Q_OBJECT; toTreeWidget *Statements; QLineEdit *Name; toMarkedText *Description; QComboBox *Version; toWorksheet *Editor; QAction *TrashButton; QAction *CommitButton; QString LastVersion; QString Filename; bool splitVersion(const QString &split, QString &provider, QString &version); void connectList(bool connect); protected: void updateStatements(const QString &def = QString::null); bool checkStore(bool); virtual bool close(bool del); void selectionChanged(const QString &ver); void changeSQL(const QString &name, const QString &ver); public: toSQLEdit(QWidget *parent, toConnection &connection); virtual ~toSQLEdit(); void commitChanges(bool); public slots: void loadSQL(void); void saveSQL(void); void deleteVersion(void); void selectionChanged(void); void changeVersion(const QString &); void commitChanges(void) { commitChanges(true); } void editSQL(const QString &); void newSQL(); }; class toSQLTemplateItem : public toTemplateItem { QString Name; public: toSQLTemplateItem(toTreeWidget *parent); toSQLTemplateItem(toSQLTemplateItem *parent, const QString &name); virtual void expand(void); virtual void collapse(void); virtual QWidget *selectedWidget(QWidget *parent); virtual QString allText(int col) const; }; class toSQLTemplate : public toTemplateProvider { public: toSQLTemplate() : toTemplateProvider("SQL Dictionary") { } virtual void insertItems(toTreeWidget *parent, QToolBar *) { new toSQLTemplateItem(parent); } }; #endif tora-2.1.3/src/tostoragedefinition.cpp0000644000175000017500000000653111270353625017634 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "config.h" #include #include #include #include #include "tofilesize.h" #include "tostoragedefinition.h" toStorageDefinition::toStorageDefinition(QWidget* parent, const char* name, Qt::WFlags fl) : QWidget(parent) { setupUi(this); InitialSize->setTitle(tr("&Initial size")); InitialSize->setValue(50); NextSize->setTitle(tr("&Next size")); NextSize->setValue(50); OptimalSize->setTitle(tr("&Size")); OptimalSize->setEnabled(false); } std::list toStorageDefinition::sql(void) { QString str(QString::fromLatin1("STORAGE (INITIAL ")); str.append(InitialSize->sizeString()); str.append(QString::fromLatin1(" NEXT ")); str.append(NextSize->sizeString()); str.append(QString::fromLatin1(" MINEXTENTS ")); str.append(InitialExtent->text()); str.append(QString::fromLatin1(" MAXEXTENTS ")); if (UnlimitedExtent->isChecked()) str.append(QString::fromLatin1("UNLIMITED")); else str.append(MaximumExtent->text()); if (!Optimal->isEnabled()) { str.append(QString::fromLatin1(" PCTINCREASE ")); str.append(PCTIncrease->text()); } if (!OptimalNull->isChecked()) { str.append(QString::fromLatin1(" OPTIMAL ")); str.append(OptimalSize->sizeString()); } str.append(QString::fromLatin1(")")); std::list ret; ret.insert(ret.end(), str); return ret; } void toStorageDefinition::forRollback(bool val) { Optimal->setEnabled(val); PCTIncrease->setEnabled(!val); InitialExtent->setMinimum(2); InitialExtent->setValue(4); } tora-2.1.3/src/tostoragedialogui.ui0000644000175000017500000001100611270353625017125 0ustar michaelmichael toStorageDialogUI 0 0 576 480 Modify tablespace 11 6 image0 Display the SQL used to generate the specified object Tab 2 4 0 &Ok true 4 0 Cancel 71 20 QSizePolicy::Maximum Qt::Horizontal 20 20 QSizePolicy::Expanding Qt::Vertical DialogTab OkButton PushButton2 789c6d90cf6e83300c87ef3c45446e684a13081434f51136ed3869dac11828f4cf2a6ddd619af6eeebcf848ab25921f2f7c5d88455a29e9f1e54b28a3ece741e58714fef2a693e8fc7af97d7cd7714bb426179e5e2bb28368ad5e3e9ad45ae2fb9b612c001e84a577aa96c81a94d6d4ec07d405fa44016acd2729d010f01795d037b60e6325bca692d58654c0c6c80de795b7b6027489eb901ee8039e5555700b7019b11e98a9d5c6711e2b4d666da82436e64c30a0ed9f85cdd5881983b5410d5332755dc50dbc99869aed1db7ee8696c307ddfe5d5ddfea0cdac9f48d2e6d685c1b7ce84ab2c5c908b7ff09ffbdb6f723ff7d12f66576feb OkButton clicked() toStorageDialogUI accept() PushButton2 clicked() toStorageDialogUI reject() ToolButton1 clicked() toStorageDialogUI displaySQL() tora-2.1.3/src/todockbar.h0000644000175000017500000000656211270353625015175 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TODOCKBAR_H #define TODOCKBAR_H #include "config.h" #include "topushbutton.h" #include #include #include class toDocklet; class toDockbarButton : public toPushButton { Q_OBJECT; public: explicit toDockbarButton(const QIcon &icon, const QString &text, QWidget *parent = 0); }; class toDockbar : public QToolBar { Q_OBJECT; private: Qt::ToolBarArea Area; // docklets managed by this dockbar QMap Docklets; public: toDockbar(Qt::ToolBarArea area, const QString &title, QWidget *parent = 0); /** * Adds docklet to be managed by this dockbar * */ void addDocklet(toDocklet *let, bool show = true); /** * Removes a docklet managed by this dockbar * */ toDocklet* removeDocklet(QString name); /** * Removes a docklet managed by this dockbar * */ toDocklet* removeDocklet(toDocklet *let); /** * Show or hide all docklets * */ void setAllVisible(bool); /** * Returns true if this dockbar manages this docklet * */ bool contains(toDocklet *let); /** * Returns the area for the dockbar * */ inline Qt::ToolBarArea area() const { return Area; } /** * Save state to QByteArray. Necessary since main window * saveState() will only preserve docked QDockWidgets. * */ QByteArray saveState() const; /** * Restore state of hidden docklets, buttons. * */ void restoreState(QByteArray); }; #endif tora-2.1.3/src/toreport.cpp0000644000175000017500000003471211323644246015435 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "tohtml.h" #include "toextract.h" #include "toreport.h" #include #include #ifdef Q_OS_WIN32 #include #endif static bool SameContext(const QString &str, const QString &str2) { if (str.startsWith(str2)) { if (str.length() == str2.length()) return true; if (str.length() > str2.length() && str.at(str2.length()) == QChar('\001')) return true; } return false; } static bool HasChildren(std::list &desc, std::list::iterator i, const QString &context) { if ((*i).length() > context.length()) return true; i++; if (i == desc.end()) return false; return SameContext(*i, context); } static std::list::iterator FindItem(std::list &desc, std::list::iterator i, int level, const QString &context, const QString &search) { while (i != desc.end()) { if (!SameContext(*i, context) && !context.isEmpty()) return desc.end(); if (toExtract::partDescribe(*i, level) == search) return i; i++; } return desc.end(); } static QString GenerateConstraint(const QString &name, const QString &def, const QString &status) { return QString::fromLatin1("%1%2%3\n"). arg(toHtml::escape(name)). arg(toHtml::escape(def)). arg(toHtml::escape(status)); } static QString DescribeConstraints(std::list &desc, std::list::iterator i, int level, const QString &context) { QString ret = QString::fromLatin1("

CONSTRAINTS

\n" "" "\n"); QString lastName; QString status; QString definition; do { if (!SameContext(*i, context)) break; QString name = toExtract::partDescribe(*i, level); QString extra = toExtract::partDescribe(*i, level + 1); if (lastName != name) { if (!lastName.isNull()) ret += GenerateConstraint(lastName, definition, status); definition = QString::null; status = QString::null; lastName = name; } if (extra == QString::fromLatin1("DEFINITION")) definition += toExtract::partDescribe(*i, level + 2) + " "; else if (extra == QString::fromLatin1("STATUS")) { QString t = toExtract::partDescribe(*i, level + 2); if (t.startsWith(QString::fromLatin1("ENABLE")) || t.startsWith(QString::fromLatin1("DISABLE"))) status += t + QString::fromLatin1(" "); } i++; } while (i != desc.end()); ret += GenerateConstraint(lastName, definition, status); ret += QString::fromLatin1("
NameConstraintStatus
\n"); return ret; } struct toReportColumn { QString Order; QString Datatype; QString Comment; }; static QString DescribeColumns(std::list &desc, std::list::iterator i, int level, const QString &context) { bool hasComments = false; bool hasDatatype = false; int maxCol = 1; std::map cols; do { if (!SameContext(*i, context)) break; QString col = toExtract::partDescribe(*i, level + 0); QString extra = toExtract::partDescribe(*i, level + 1); if (extra == QString::fromLatin1("ORDER")) { cols[col].Order = toExtract::partDescribe(*i, level + 2); maxCol = qMax(maxCol, cols[col].Order.toInt()); } else if (extra == QString::fromLatin1("COMMENT")) { cols[col].Comment = toExtract::partDescribe(*i, level + 2); hasComments = true; } else if (!extra.isEmpty()) { cols[col].Datatype += extra + QString::fromLatin1(" "); hasDatatype = true; } i++; } while (i != desc.end()); QString ret = qApp->translate("toReport", "

COLUMNS

\n" ""); if (hasDatatype) ret += qApp->translate("toReport", ""); if (hasComments) ret += qApp->translate("toReport", ""); ret += QString::fromLatin1("\n"); for (int j = 1;j <= maxCol;j++) { for (std::map::iterator k = cols.begin();k != cols.end();k++) { if ((*k).second.Order.toInt() == j) { ret += QString::fromLatin1(""); if (hasDatatype) { ret += QString::fromLatin1(""); } if (hasComments) { ret += QString::fromLatin1(""); } ret += QString::fromLatin1("\n"); break; } } } ret += QString::fromLatin1("
NameDefinitionDescription
"); ret += toHtml::escape((*k).first); ret += QString::fromLatin1(""); if (!(*k).second.Datatype.isEmpty()) ret += toHtml::escape((*k).second.Datatype); else ret += QString::fromLatin1("
"); ret += QString::fromLatin1("
"); if (!(*k).second.Comment.isEmpty()) ret += toHtml::escape((*k).second.Comment); else ret += QString::fromLatin1(" "); ret += QString::fromLatin1("
\n"); return ret; } static QString ValidPart(std::list &desc, std::list::iterator &i, int level) { QString part = toExtract::partDescribe(*i, level); while (part.isNull() && i != desc.end()) { i++; part = toExtract::partDescribe(*i, level); } return part; } static QString DescribePart(std::list &desc, std::list::iterator &i, int level, const QString &parentContext) { QString ret; QString text; QString lastPart; std::list::iterator start = i; do { if (!SameContext(*i, parentContext)) break; QString part = ValidPart(desc, i, level); /* does it make sense to anybody? For me it doesn't. (pvanek) do { QString part = toExtract::partDescribe(*i, level); } while (part.isNull()); */ if (lastPart != part) { if (lastPart.isNull()) { i = FindItem(desc, start, level, parentContext, QString::fromLatin1("TABLE")); if (i == desc.end()) { i = start; part = ValidPart(desc, i, level); } else part = toExtract::partDescribe(*i, level); } else { while (part == QString::fromLatin1("TABLE")) { i++; if (i == desc.end()) return ret; part = toExtract::partDescribe(*i, level); } } if (lastPart == QString::fromLatin1("TABLE")) { i = start; part = ValidPart(desc, i, level); } lastPart = part; } QString child = parentContext + QString::fromLatin1("\001") + part; if (part == QString::fromLatin1("COLUMN") || part == QString::fromLatin1("COMMENT") || part == QString::fromLatin1("CONSTRAINT")) { i++; } else if (HasChildren(desc, i, child)) { ret += QString::fromLatin1("

%2

\n"). arg(level + 1). arg(toHtml::escape(part)). arg(level + 1); std::list::iterator com = FindItem(desc, i, level + 1, child, QString::fromLatin1("COMMENT")); if (com != desc.end()) ret += "

" + toHtml::escape(toExtract::partDescribe(*com, level + 2)) + "

"; std::list::iterator col = FindItem(desc, i, level + 1, child, QString::fromLatin1("COLUMN")); if (col != desc.end()) ret += DescribeColumns(desc, col, level + 2, child + QString::fromLatin1("\001COLUMN")); std::list::iterator con = FindItem(desc, i, level + 1, child, QString::fromLatin1("CONSTRAINT")); if (con != desc.end()) ret += DescribeConstraints(desc, con, level + 2, child + QString::fromLatin1("\001CONSTRAINT")); ret += DescribePart(desc, i, level + 1, child); } else { if (!part.isEmpty()) text += QString::fromLatin1("

") + toHtml::escape(part) + QString::fromLatin1("

\n"); i++; } } while (i != desc.end()); return text + ret; } QString toGenerateReport(toConnection &conn, std::list &desc) { char host[1024]; gethostname(host, 1024); QString db = conn.host(); if (db.length() && db != QString::fromLatin1("*")) db += QString::fromLatin1(":"); else db = QString::null; db += conn.database(); QString ret = qApp->translate("toReport", "Report on database %7\n" "

Report on database %8

\n" "\n" "\n" "\n" "\n" "\n" "
Generated by:TOra, Version %1
At:%2
From:%3, an %4 %5 database
On:%6
\n"). arg(QString::fromLatin1(TOVERSION)). arg(QString::fromLatin1(host)). arg(db). arg(QString(conn.provider())). arg(QString(conn.version())). arg(QDateTime::currentDateTime().toString()). arg(db). arg(db); std::list::iterator i; i = FindItem(desc, desc.begin(), 0, QString::null, QString::fromLatin1("NONE")); if (i != desc.end()) { ret += qApp->translate("toReport", "

Global Objects

\n"); ret += DescribePart(desc, i, 1, QString::fromLatin1("NONE")); } i = desc.begin(); QString lastContext; while (i != desc.end()) { QString context = toExtract::partDescribe(*i, 0); if (context != QString::fromLatin1("NONE")) { if (context != lastContext) { if (context == QString::fromLatin1("public")) ret += qApp->translate("toReport", "

Public

"); else ret += qApp->translate("toReport", "

Schema %1

\n").arg(toHtml::escape(context)); } ret += DescribePart(desc, i, 1, context); lastContext = context; } else i++; } ret += QString::fromLatin1("\n"); return ret; } tora-2.1.3/src/tobarchart.cpp0000644000175000017500000002016211270353625015701 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "config.h" #include #include #include #include "tobarchart.h" #include "tomain.h" #include "utils.h" toBarChart::toBarChart(QWidget *parent, const char *name, Qt::WFlags f) : toLineChart(parent, name, f) { setMinValue(0); } #define FONT_ALIGN Qt::AlignLeft|Qt::AlignTop|Qt::TextExpandTabs void toBarChart::paintChart(QPainter *p, QRect &rect) { QFontMetrics fm = p->fontMetrics(); if (!Zooming) { if (MinAuto) { bool first = true; std::list >::reverse_iterator i = Values.rbegin(); if (i != Values.rend()) { for (std::list::iterator j = (*i).begin();j != (*i).end();j++) { if (first) { first = false; zMinValue = *j; } else if (zMinValue > *j) zMinValue = *j; } } } if (MaxAuto) { bool first = true; std::list total; std::list::iterator e = Enabled.begin(); { for (std::list >::iterator i = Values.begin();i != Values.end();i++) { std::list::iterator k = total.begin(); if (e == Enabled.end() || *e) { for (std::list::iterator j = (*i).begin();j != (*i).end();j++) { if (k == total.end()) { total.insert(total.end(), *j); k = total.end(); } else { *k += *j; k++; } } } if (e != Enabled.end()) e++; } } for (std::list::iterator i = total.begin();i != total.end();i++) { if (first) { first = false; zMaxValue = *i; } else if (zMaxValue < *i) zMaxValue = *i; } } if (!MinAuto) zMinValue = MinValue; else { zMinValue = round(zMinValue, false); MinValue = zMinValue; } if (!MaxAuto) zMaxValue = MaxValue; else { zMaxValue = round(zMaxValue, true); MaxValue = zMaxValue; } } paintTitle(p, rect); paintLegend(p, rect); paintAxis(p, rect); std::list Points; int cp = 0; int samples = countSamples(); int zeroy = int(rect.height() - 2 - ( -zMinValue / (zMaxValue - zMinValue) * (rect.height() - 4))); if (samples > 1) { const QMatrix &mtx = p->worldMatrix(); p->setClipRect(int(mtx.dx() + 2), int(mtx.dy() + 2), rect.width() - 3, rect.height() - 3); if (Zooming) p->drawText(2, 2, rect.width() - 4, rect.height() - 4, Qt::AlignLeft | Qt::AlignTop, tr("Zoom")); std::list::reverse_iterator e = Enabled.rbegin(); for (std::list >::reverse_iterator i = Values.rbegin();i != Values.rend();i++) { if (e == Enabled.rend() || *e) { std::list &val = *i; int count = 0; int skip = SkipSamples; QPolygon a(samples + 10); int x = rect.width() - 2; for (std::list::reverse_iterator j = val.rbegin();j != val.rend() && x >= 2; j++) { if (skip > 0) skip--; else { int val = int(rect.height() - 2 - ((*j - zMinValue) / (zMaxValue - zMinValue) * (rect.height() - 4))); x = rect.width() - 2 - count * (rect.width() - 4) / (samples - 1); a.setPoint(count, x, val); count++; if (count >= samples) break; } } a.resize(count*2); Points.insert(Points.end(), a); } cp++; if (e != Enabled.rend()) e++; } } std::map Bottom; std::list::reverse_iterator e = Enabled.rbegin(); for (std::list::iterator i = Points.begin();i != Points.end();) { while (e != Enabled.rend() && !*e) { cp--; e++; } if (e != Enabled.rend()) e++; cp--; QPolygon a = *i; int lx = 0; int lb = 0; for (int j = 0;j < a.size() / 2;j++) { int x, y; a.point(j, &x, &y); if (Bottom.find(x) == Bottom.end()) Bottom[x] = 0; if (lx != x) lb = Bottom[x]; a.setPoint(a.size() - 1 - j, x, zeroy - lb); y -= lb; a.setPoint(j, x, y); Bottom[x] = zeroy - y; lx = x; } p->save(); QBrush brush(toChartBrush(cp)); p->setBrush(brush.color()); p->drawPolygon(a); if (brush.style() != Qt::SolidPattern) { p->setBrush(QBrush(Qt::white, brush.style())); p->drawPolygon(a); } p->restore(); i++; } } toBarChart::toBarChart (toBarChart *chart, QWidget *parent, const char *name, Qt::WFlags f) : toLineChart(chart, parent, name, f) {} toLineChart *toBarChart::openCopy(QWidget *parent) { toBarChart *newWin = new toBarChart(this, parent ? parent : toMainWidget()->workspace(), NULL, (Qt::WindowType) (parent ? 0 : Qt::WA_DeleteOnClose)); if (!parent) { newWin->show(); newWin->raise(); newWin->setFocus(); toMainWidget()->updateWindowsMenu(); } return newWin; } tora-2.1.3/src/tolistviewformatterfactory.h0000644000175000017500000000376111270353625020750 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOLISTVIEWFORMATTERFACTORY_H #define TOLISTVIEWFORMATTERFACTORY_H #include #include using Loki::Factory; using Loki::SingletonHolder; typedef SingletonHolder< Factory > toListViewFormatterFactory; #endif tora-2.1.3/src/toresultmodel.cpp0000644000175000017500000004760511445353612016465 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "config.h" #include "toresultmodel.h" #include "toconf.h" #include "utils.h" #include "toconfiguration.h" #include "toqvalue.h" #include "toeventquery.h" toResultModel::toResultModel(toEventQuery *query, QObject *parent, bool edit, bool read) : QAbstractTableModel(parent) { ReadableColumns = read; HeadersRead = false; First = true; Editable = edit; ReadAll = false; MaxRead = MaxNumber = toConfigurationSingle::Instance().maxNumber(); CurrentRow = 0; Query = query; Query->setParent(this); qRegisterMetaType("toConnection::exception"); connect(query, SIGNAL(descriptionAvailable()), this, SLOT(readHeaders())); connect(query, SIGNAL(dataAvailable()), this, SLOT(fetchMore())); connect(query, SIGNAL(error(const toConnection::exception &)), this, SLOT(queryError(const toConnection::exception &))); connect(query, SIGNAL(done()), this, SLOT(fetchMore())); if(Editable) setSupportedDragActions(Qt::CopyAction | Qt::MoveAction); else setSupportedDragActions(Qt::CopyAction); query->start(); } toResultModel::~toResultModel() { cleanup(); } void toResultModel::cleanup() { if (Query) { disconnect(Query, 0, this, 0); Query->stop(); delete Query; emit done(); } Query = 0; } void toResultModel::queryError(const toConnection::exception &err) { if(First) { emit firstResult(err, true); First = !First; toStatusMessage(err); cleanup(); } } void toResultModel::readAll() { ReadAll = true; if(Query) Query->readAll(); } void toResultModel::readData() { if (!Query) { cleanup(); return; } try { // must check for errors Query->eof(); int cols = Headers.size(); if(cols < 1) return; // don't actually modify any data until we can call // beginInsertRows(). but to do that, we have to know how many // records we're going to add. RowList tmp; int current = CurrentRow; while(Query->hasMore() && (MaxNumber < 0 || MaxNumber > current)) { Row row; // the number column. should never change row.append(toQValue(current + 1)); for (int j = 1; (j < cols || j == 0) && Query->hasMore(); j++) row.append(Query->readValueNull()); tmp.append(row); current++; } // if we read some data, then go ahead and insert them now. if (tmp.size() > 0) { beginInsertRows(QModelIndex(), CurrentRow, current - 1); Rows << tmp; CurrentRow = current; endInsertRows(); } // not really first, but just be sure to emit before done() // must be emitted even if there's no data.... if (First) { if (tmp.size() > 0 || !Query || Query->eof()) { First = !First; // need to reset view(s) since we have to poll for data reset(); if(Query && Query->rowsProcessed() > 0) { emit firstResult(QString::number(Query->rowsProcessed()) + (Query->rowsProcessed() == 1 ? tr(" row processed") : tr(" rows processed")), false); } else emit firstResult(tr("Statement executed"), false); } } if (!Query) return; if (!Query->hasMore() && Query->eof()) { cleanup(); return; } } catch (const toConnection::exception &str) { if (First) { First = !First; emit firstResult(str, true); } toStatusMessage(str); cleanup(); return; } catch (const QString &str) { if (First) { First = !First; emit firstResult(str, true); } toStatusMessage(str); cleanup(); return; } } int toResultModel::addRow(QModelIndex ind) { if (!Editable) return -1; beginInsertRows(QModelIndex(), CurrentRow + 1, CurrentRow + 1); int newRow = CurrentRow++; Row row; if (ind.isValid()) { row = Rows[ind.row()]; row[0] = newRow; } else { row.append(toQValue(newRow)); // null out the rest of the row int cols = Headers.size(); for (int j = 1; j < cols; j++) row.append(toQValue()); } Rows.append(row); endInsertRows(); emit rowAdded(row); return newRow; } void toResultModel::deleteRow(QModelIndex index) { if (!Editable) return; if (!index.isValid() || index.row() >= Rows.size()) return; beginRemoveRows(QModelIndex(), index.row(), index.row()); Row deleted = Rows.takeAt(index.row()); endRemoveRows(); emit rowDeleted(deleted); } QStringList toResultModel::mimeTypes() const { QStringList types; types << "text/plain"; types << "application/vnd.tomodel.list"; return types; } QMimeData* toResultModel::mimeData(const QModelIndexList &indexes) const { QMimeData *mimeData = new QMimeData(); QByteArray encodedData; QDataStream stream(&encodedData, QIODevice::WriteOnly); QByteArray stringData; QDataStream ss(&stringData, QIODevice::WriteOnly); int valid = 0; QModelIndex validIndex; QString text; // qt sends list by column (all indexes from column 1, then column // column2). Need to figure out the number of columns and // rows. It'd be awesome if we could get the selection but there's // no good way to do that from the model. int rows = 0; int columns = 0; int currentRow = -1; int currentCol = -1; foreach (QModelIndex index, indexes) { if (index.isValid()) { if(index.row() > currentRow) { currentRow = index.row(); rows++; } if(currentCol != index.column()) { currentCol = index.column(); columns++; } valid++; validIndex = index; text = data(index, Qt::DisplayRole).toString(); ss << text; } } if(valid < 1) return 0; if(valid == 1) { mimeData->setText(text); // set row and column in data so we can try to preserve the // columns, if needed QByteArray sourceData; QDataStream sourceStream(&sourceData, QIODevice::WriteOnly); sourceStream << validIndex.row(); sourceStream << validIndex.column(); mimeData->setData("application/vnd.int.list", sourceData); } else { // serialize selection shape stream << rows; stream << columns; mimeData->setData("application/vnd.tomodel.list", encodedData + stringData); } return mimeData; } bool toResultModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { if (action == Qt::IgnoreAction) return true; if (!Editable) return false; if (column == 0) return false; // can't change row number if(row < 0 || column < 0) { // friggen qt expects me to figure it out. you'd think -1 // wouldn't happen often but you'd be wrong. row = parent.row(); column = parent.column(); } if(row < 0) { row = addRow(); if(row < 0) return false; } if (data->hasText()) { // can't do anything with an item without a valid column if(column < 0) { if (data->hasFormat("application/vnd.int.list")) { QByteArray source = data->data("application/vnd.int.list"); QDataStream stream(&source, QIODevice::ReadOnly); int sourceRow = 0; int sourceCol = 0; stream >> sourceRow; stream >> sourceCol; if(sourceCol > 0) column = sourceCol; else return false; } else return false; } QModelIndex ind = index(row, column); setData(ind, QVariant(data->text())); return true; } else if (data->hasFormat("application/vnd.tomodel.list")) { QByteArray source = data->data("application/vnd.tomodel.list"); QDataStream stream(&source, QIODevice::ReadOnly); if (column < 0) column = 1; int rows; int columns; stream >> rows; stream >> columns; // count of rows down we've gone so far int counter = 0; while (!stream.atEnd() && column <= columnCount()) { QString text; stream >> text; QModelIndex ind = index(row, column); setData(ind, QVariant(text)); row++; counter++; if (counter >= rows) { row -= counter; counter = 0; column++; } if (!stream.atEnd() && row >= rowCount()) row = addRow(); if (column >= columnCount()) return true; // drop data past end of columns } return true; } return false; } Qt::DropActions toResultModel::supportedDropActions() const { if(Editable) return Qt::CopyAction | Qt::MoveAction; return Qt::IgnoreAction; } int toResultModel::rowCount(const QModelIndex &parent) const { if (parent.isValid()) return 0; return CurrentRow; } /** * Returns the data stored under the given role for the item * referred to by the index. */ QVariant toResultModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); if (index.row() > Rows.size() - 1 || index.column() > Headers.size() - 1) return QVariant(); toQValue const &data = Rows.at(index.row()).at(index.column()); switch(role) { case Qt::DisplayRole: if (data.isNull()) return toNull(data).toQVariant(); if (data.isUserType()) { toQValue::complexType *i = data.toQVariant().value(); return QVariant(QString("{%1}").arg(i->dataTypeName())); } return data.toQVariant(); case Qt::EditRole: case Qt::ToolTipRole: return data.toQVariant(); case Qt::BackgroundRole: if (data.isNull() && toConfigurationSingle::Instance().indicateEmpty()) return QVariant(QColor(toConfigurationSingle::Instance().indicateEmptyColor())); return QVariant(); case Qt::TextAlignmentRole: return (int) Headers.at(index.column()).align; case Qt::UserRole: return data.toQVariant(); default: return QVariant(); } return QVariant(); } bool toResultModel::setData(const QModelIndex &index, const QVariant &_value, int role) { if (!Editable) return false; if (role != Qt::EditRole) return false; if (index.column() == 0) return false; // can't change number column if (index.row() > Rows.size() - 1 || index.column() > Headers.size() - 1) return false; Row &row = Rows[index.row()]; Row oldRow = row; // keep old version toQValue newValue = toUnnull(toQValue::fromVariant(_value)); row[index.column()] = newValue; // for writing to the database emit columnChanged(index, newValue, oldRow); // for the view emit dataChanged(index, index); return true; } QVariant toResultModel::data(int row, int column) const { QModelIndex ind = index(row, column); return data(ind, Qt::EditRole); } QVariant toResultModel::data(int row, QString column) const { int c; for (c = 0; c < Headers.size(); c++) { if (Headers[c].name == column) break; } if (c < Headers.size()) return data(row, c); return QVariant(); } /** * Returns the data for the given role and section in the header * with the specified orientation. * */ QVariant toResultModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); if (orientation == Qt::Horizontal) { if (!HeadersRead) return QVariant(); if (section > Headers.size() - 1) return QVariant(); return Headers[section].name; } if (orientation == Qt::Vertical) return section + 1; return QVariant(); } bool toResultModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant & value, int role) { if (role != Qt::DisplayRole) return false; if (orientation != Qt::Horizontal) return false; Headers[section].name = value.toString(); return true; } void toResultModel::readHeaders() { if (HeadersRead) return; if (!Query) return; // always add the number column. this makes adjusting for it in // the row data easier. it is not always displayed. struct HeaderDesc d; d.name = "#"; d.align = Qt::AlignRight; d.datatype = "INT"; Headers.append(d); toQDescList desc = Query->describe(); for (toQDescList::iterator i = desc.begin(); i != desc.end(); i++) { struct HeaderDesc d; d.name = (*i).Name; if (ReadableColumns) toReadableColumn(d.name); d.datatype = (*i).Datatype; d.nullAllowed = (*i).Null; // AlignTop is used here to prevent Vert. centering of // data if there are more rows in the cell (CLOB etc.). // AlignVCenter makes it unreadable in this case. -- Petr Vanek if ((*i).AlignRight) d.align = Qt::AlignRight | Qt::AlignTop; //Qt::AlignVCenter; else d.align = Qt::AlignLeft | Qt::AlignTop; //Qt::AlignVCenter; Headers.append(d); } HeadersRead = true; } /** * Returns the number of columns for the children of the given * parent. When the parent is valid it means that rowCount is * returning the number of children of parent. */ int toResultModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); return Headers.size(); } bool toResultModel::canFetchMore(const QModelIndex &parent) const { Q_UNUSED(parent); // sometimes the view calls this before the query has even // run. if (First) return false; try { return Query && Query->hasMore(); } catch (...) { // will catch later ; } return false; } void toResultModel::fetchMore() { if(ReadAll) { MaxNumber = -1; readData(); } else if(CurrentRow < MaxNumber) { QModelIndex ind; fetchMore(ind); } } void toResultModel::fetchMore(const QModelIndex &parent) { Q_UNUSED(parent); // sometimes the view calls this before the query has even // run. don't actually increase max until we've hit it. if (MaxNumber < 0 || MaxNumber <= CurrentRow) MaxNumber += MaxRead; readData(); } Qt::ItemFlags toResultModel::flags(const QModelIndex &index) const { Qt::ItemFlags defaultFlags = QAbstractTableModel::flags(index); Qt::ItemFlags fl = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled; if (index.column() == 0) return fl; // row number column if (!index.isValid()) { if(Editable) return Qt::ItemIsDropEnabled | defaultFlags; else return defaultFlags; } if (Editable) return fl | defaultFlags | Qt::ItemIsEditable | Qt::ItemIsDropEnabled; return fl | defaultFlags; } void toResultModel::setAlignment(int col, Qt::AlignmentFlag fl) { Headers[col].align = fl; } void toResultModel::sort(int column, Qt::SortOrder order) { if (column > Headers.size() - 1) return; Rows = mergesort(Rows, column, order); emit dataChanged(createIndex(0, 0), createIndex(rowCount(), columnCount())); } toResultModel::RowList toResultModel::mergesort(RowList &rows, int column, Qt::SortOrder order) { if(rows.size() <= 1) return rows; RowList left, right; int middle = (int) (rows.size() / 2); left = rows.mid(0, middle); right = rows.mid(middle); left = mergesort(left, column, order); right = mergesort(right, column, order); return merge(left, right, column, order); } toResultModel::RowList toResultModel::merge(RowList &left, RowList &right, int column, Qt::SortOrder order) { RowList result; while(left.size() > 0 && right.size() > 0) { if((order == Qt::AscendingOrder && left.at(0).at(column) <= right.at(0).at(column)) || (order == Qt::DescendingOrder && left.at(0).at(column) >= right.at(0).at(column))) result.append(left.takeAt(0)); else result.append(right.takeAt(0)); } if(left.size() > 0) result << left; if(right.size() > 0) result << right; return result; } tora-2.1.3/src/tobrowserdblinkswidget.h0000644000175000017500000000444111270353625020020 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBROWSERDBLINKSWIDGET_H #define TOBROWSERDBLINKSWIDGET_H #include "tobrowserbasewidget.h" class toResultItem; class toResultTableView; /*! \brief DB Links browser for toBrowser tool. See toBrowserBaseWidget for more info. \author Petr Vanek */ class toBrowserDBLinksWidget : public toBrowserBaseWidget { Q_OBJECT toResultItem *resultDBLink; toResultTableView *synonymsView; public: toBrowserDBLinksWidget(QWidget * parent); virtual void changeConnection(); public slots: void testDBLink(); }; #endif tora-2.1.3/src/toresultschema.cpp0000644000175000017500000001045711402776023016616 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toresultschema.h" #include "toconnection.h" #include toResultSchema::toResultSchema(toConnection &conn, QWidget *parent, const char *name) : toResultCombo(parent, name) { setSQL(toSQL::sql(toSQL::TOSQL_USERLIST)); ConnectionKey = conn.provider() + "-" + conn.host() + "-" + conn.database(); QString sel = conn.schema(); if(sel.isEmpty()) { QSettings s; sel = s.value("schema/" + ConnectionKey).toString(); } if(sel.isEmpty()) { if (toIsMySQL(conn)) sel = conn.database(); else sel = conn.user(); } // Oracle usernames are always in upper case if (toIsOracle(conn) || toIsSapDB(conn)) sel = sel.toUpper(); conn.setSchema(sel); setSelected(sel); connect(this, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(updateLastSchema(const QString &))); setFocusPolicy(Qt::NoFocus); } #define CHANGE_CURRENT_SCHEMA QString("ALTER SESSION SET CURRENT_SCHEMA = \"%1\"") #define CHANGE_CURRENT_SCHEMA_PG QString("SET search_path TO %1,\"$user\",public") #define CHANGE_CURRENT_SCHEMA_TD QString("DATABASE \"%1\"") void toResultSchema::update() { update(toResultCombo::currentText()); } void toResultSchema::update(const QString &schema) { if(schema.isEmpty()) return; try { toConnection &conn = connection(); if (schema != conn.schema()) { if (toIsOracle(conn)) { /* remove current schema initstring */ conn.delInit(CHANGE_CURRENT_SCHEMA.arg(conn.user())); /* set the new one with selected schema */ QString sql = CHANGE_CURRENT_SCHEMA.arg(schema); conn.allExecute(sql); conn.addInit(sql); } else if (toIsMySQL(conn)) { conn.allExecute(QString("USE `%1`").arg(schema)); conn.setDatabase(schema); } else if (toIsPostgreSQL(conn)) conn.allExecute(CHANGE_CURRENT_SCHEMA_PG.arg(schema)); else if (toIsTeradata(conn)) conn.allExecute(CHANGE_CURRENT_SCHEMA_TD.arg(schema)); else throw QString("No support for changing schema for this database"); conn.setSchema(schema); } } TOCATCH; } void toResultSchema::updateLastSchema(const QString &schema) { QSettings s; s.setValue("schema/" + ConnectionKey, schema); } tora-2.1.3/src/toconfiguration.h0000644000175000017500000002641511363644724016444 0ustar michaelmichael#ifndef TOCONFIGURATION_H #define TOCONFIGURATION_H #include "config.h" #include #include #include #include #include "tothread.h" typedef QMap ToolsMap; typedef QMap HelpsMap; typedef QMapIterator HelpsMapIterator; typedef QMap ChartsMap; typedef QMapIterator ChartsMapIterator; typedef QMap TemplatesMap; typedef QMapIterator TemplatesMapIterator; typedef QMap EditorShortcutsMap; typedef QMapIterator EditorShortcutsMapIterator; typedef QMap ConnectionColors; typedef QMapIterator ConnectionColorsIterator; class toConfigurationPrivate; class toConfiguration { toConfigurationPrivate *p; public: toConfiguration(); ~toConfiguration(); /*! \brief Set the QSettings access strings. QSettings uses these. It's used in the main.cpp before new QApplication instance init. The 2nd usage is in the toConfiguration constructor due some strange loading -- values are ignored with empty QSettings constructor (maybe due the Loki lib?) */ static void setQSettingsEnv(); /** * Save configuration to file. */ void saveConfig(void); /** * Load a string to string map from file saved by the @ref saveMap function. * @param filename Filename to load * @param map Reference to the map to fill with the new values. */ void loadMap(const QString &filename, std::map &map); /** * A map containing the available configuration settings. By convention the * character ':' is used to separate parts of the path. * * @see globalConfig * @see globalSetConfig * @see config * @see setConfig */ bool saveMap(const QString &file, std::map &pairs); QString provider(); // void setProvider(const QString & v) { m_provider = v; }; bool savePassword(); void setSavePassword(bool v); QString defaultPassword(); void setDefaultPassword(const QString & v); QString defaultDatabase(); void setDefaultDatabase(const QString & v); QString defaultUser(); void setDefaultUser(const QString & v); QString defaultHost(); int maxNumber(); void setMaxNumber(int v); int maxColSize(); int maxColDisp(); void setMaxColDisp(int v); QString planTable(); void setPlanTable(const QString & v); QString planCheckpoint(); void setPlanCheckpoint(const QString & v); QString textFont(); void setTextFont(const QString & v); QString codeFont(); void setCodeFont(const QString & v); QString listFont(); void setListFont(const QString & v); QString dateFormat(); void setDateFormat(const QString & v); QString refresh(); void setRefresh(const QString & v); bool highlight(); void setHighlight(bool v); bool keywordUpper(); void setKeywordUpper(bool v); bool objectNamesUpper(); void setObjectNamesUpper(bool v); QString pluginDir(); void setPluginDir(const QString & v); QString cacheDir(); void setCacheDir(const QString & v); bool cacheDisk(); void setCacheDisk(bool v); QString sqlFile(); void setSqlFile(const QString & v); int statusMessage(); void setStatusMessage(int v); bool dbTitle(); void setDbTitle(bool v); QString sizeUnit(); void setSizeUnit(const QString & v); QString helpPath(); void setHelpPath(const QString & v); int statusSave(); void setStatusSave(int v); bool autoCommit(); void setAutoCommit(bool v); bool changeConnection(); void setChangeConnection(bool v); int connectSize(); void setConnectSize(int v); QString defaultTool(); void setDefaultTool(const QString & v); int chartSamples(); void setChartSamples(int v); int displaySamples(); void setDisplaySamples(int v); bool codeCompletion(); void setCodeCompletion(bool v); bool completionSort(); void setCodeCompletionSort(bool v); bool autoIndent(); void setAutoIndent(bool v); bool dontReread(); void setDontReread(bool v); int autoLong(); void setAutoLong(int v); bool messageStatusbar(); void setMessageStatusbar(bool v); bool tabbedTools(); void setTabbedTools(bool v); bool colorizedConnections(); void setColorizedConnections(bool v); ConnectionColors connectionColors(); void setConnectionColors(const ConnectionColors & v); int objectCache(); void setObjectCache(int v); bool bkgndConnect(); void setBkgndConnect(bool v); bool firewallMode(); void setFirewallMode(bool v); int connTestInterval(); void setConnTestInterval(int v); int maxContent(); void setMaxContent(int v); bool keepPlans(); void setKeepPlans(bool v); bool vsqlPlans(); void setVsqlPlans(bool v); bool restoreSession(); void setRestoreSession(bool v); QString defaultSession(); void setDefaultSession(const QString & v); int defaultFormat(); void setDefaultFormat(int v); bool autoIndentRo(); void setAutoIndentRo(bool v); bool indicateEmpty(); void setIndicateEmpty(bool v); QString indicateEmptyColor(); void setIndicateEmptyColor(const QString & v); QString extensions(); void setExtensions(const QString & v); int recentMax(); QString lastDir(); void setLastDir(const QString & v); QString locale(); void setLocale(const QString & v); int keepAlive(); void setKeepAlive(int v); int numberFormat(); void setNumberFormat(int v); int numberDecimals(); void setNumberDecimals(int v); int cacheTimeout(); int tabStop(); void setTabStop(int v); bool tabSpaces(); void setTabSpaces(bool v); bool editDragDrop(); void setEditDragDrop(bool v); bool toadBindings(); void setToadBindings(bool v); bool displayGridlines(); void setDisplayGridlines(bool v); QString smtp(); void setSmtp(const QString & v); int smtpPort(); void setSmtpPort(int v); QString style(); void setStyle(const QString & v); // tooracleconnection int openCursors(); void setOpenCursors(int v); int maxLong(); void setMaxLong(int v); // toqsqlconnection bool onlyForward(); void setOnlyForward(bool v); int createAction(); void setCreateAction(int v); // main.cpp QString lastVersion(); void setLastVersion(const QString & v); QString firstInstall(); void setFirstInstall(const QString & v); QStringList recentFiles(); void setRecentFiles(QStringList v); QByteArray mainWindowGeometry(); void setMainWindowGeometry(QByteArray v); QByteArray mainWindowState(); void setMainWindowState(QByteArray v); void setLeftDockbarState(QByteArray v); QByteArray leftDockbarState(); void setRightDockbarState(QByteArray v); QByteArray rightDockbarState(); // tools ToolsMap tools(); void setTools(ToolsMap v); // toresultlistformat QString csvSeparator(); QString csvDelimiter(); // toeditextensions bool commaBefore(); void setCommaBefore(bool v); bool blockOpenLine(); void setBlockOpenLine(bool v); bool operatorSpace(); void setOperatorSpace(bool v); bool rightSeparator(); void setRightSeparator(bool v); bool endBlockNewline(); void setEndBlockNewline(bool v); int commentColumn(); void setCommentColumn(int v); // tobrowser bool filterIgnoreCase(); void setFilterIgnoreCase(bool v); bool filterInvert(); void setFilterInvert(bool v); int filterType(); void setFilterType(int v); int filterTablespaceType(); void setFilterTablespaceType(int v); QString filterText(); void setFilterText(const QString & v); // tohelp HelpsMap additionalHelp(); void setAdditionalHelp(HelpsMap v); // tochartmanager ChartsMap chartFiles(); void setChartFiles(ChartsMap v); ChartsMap chartAlarms(); void setChartAlarms(ChartsMap v); // toooutput QString polling(); void setPolling(const QString & v ); int logType(); void setLogType(int v); QString logUser(); void setLogUser(const QString & v); // torollback bool noExec(); void setNoExec(bool v); bool needRead(); void setNeedRead(bool v); bool needTwo(); void setNeedTwo(bool v); bool alignLeft(); void setAlignLeft(bool v); bool oldEnable(); void setOldEnable(bool v); // tosgatrace bool autoUpdate(); void setAutoUpdate(bool v); // tostorage bool dispTablespaces(); void setDispTablespaces(bool v); bool dispCoalesced(); void setDispCoalesced(bool v); bool dispExtents(); void setDispExtents(bool v); bool dispAvailableGraph(); void setDispAvailableGraph(bool v); // totemplate TemplatesMap templates(); void setTemplates(TemplatesMap v); // totuning /*! True if there are no prefs for tuning. It's used when there is no m_tuningOverview defined in prefs. */ bool tuningFirstRun(); bool tuningOverview(); void setTuningOverview(bool v); bool tuningFileIO(); void setTuningFileIO(bool v); bool tuningWaits(); void setTuningWaits(bool v); bool tuningCharts(); void setTuningCharts(bool v); // toworksheet bool wsAutoSave(); void setWsAutoSave(bool v); bool wsCheckSave(); void setWsCheckSave(bool v); QString wsAutoLoad(); void setWsAutoLoad(const QString & v); bool wsLogAtEnd(); void setWsLogAtEnd(bool v); bool wsLogMulti(); void setWsLogMulti(bool v); bool wsStatistics(); void setWsStatistics(bool v); bool wsTimedStats(); void setWsTimedStats(bool v); bool wsNumber(); void setWsNumber(bool v); bool wsMoveToErr(); void setWsMoveToErr(bool v); bool wsHistory(); void setWsHistory(bool v); bool wsExecLog(); void setWsExecLog(bool v); bool wsToplevelDescribe(); void setWsToplevelDescribe(bool v); // tosyntaxsetup QColor syntaxDefault(); void setSyntaxDefault(QColor v); QColor syntaxComment(); void setSyntaxComment(QColor v); QColor syntaxNumber(); void setSyntaxNumber(QColor v); QColor syntaxKeyword(); void setSyntaxKeyword(QColor v); QColor syntaxString(); void setSyntaxString(QColor v); QColor syntaxDefaultBg(); void setSyntaxDefaultBg(QColor v); QColor syntaxDebugBg(); void setSyntaxDebugBg(QColor v); QColor syntaxErrorBg(); void setSyntaxErrorBg(QColor v); QColor syntaxCurrentLineMarker(); void setSyntaxCurrentLineMarker(QColor v); QColor syntaxStaticBg(); void setSyntaxStaticBg(QColor v); bool useMaxTextWidthMark(); void setUseMaxTextWidthMark(bool v); int maxTextWidthMark(); void setMaxTextWidthMark(int v); // shortcut editor bool useEditorShortcuts(); void setUseEditorShortcuts(bool v); EditorShortcutsMap editorShortcuts(); void setEditorShortcuts(const EditorShortcutsMap & v); // code editor QString staticChecker(); void setStaticChecker(const QString & v); }; typedef Loki::SingletonHolder toConfigurationSingle; #endif tora-2.1.3/src/tomessage.h0000644000175000017500000000544011270353625015206 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOMESSAGE_H #define TOMESSAGE_H #include "ui_tomessageui.h" /*! \brief Non-modal and non-blocking message dialog for errors/warnings reporting. It's used in toMain as a class member. This dialog is never deleted. All messages are appended into end of text-log. I've rewrote the old-modal-dialog to prevent TOra blocking (100% CPU) on huge amount of error messages - e.g. when I run the Server Tuning tool under user with only few grants on system objects I had to kill the whole desktop to recover. It takes about 4% CPU in this implementattion. TODO: IMHO is this dialog a hot candidate for "docking" window \author Petr Vanek */ class toMessage : public QDialog, public Ui::toMessageUI { Q_OBJECT public: toMessage(QWidget * parent = 0, Qt::WindowFlags f = 0); public slots: /*! \brief Appends text to the log widget. The dialog is shown too when it's hidden. */ void appendText(const QString & text); protected: //! Save the prefs void hideEvent(QHideEvent * event); }; #endif tora-2.1.3/src/toeventquerytask.cpp0000644000175000017500000001414511270353625017211 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toeventquerytask.h" #include "toresultstats.h" #include "totool.h" #include "toresultstats.h" #include "toconfiguration.h" #include #include #include static const int FIREWALL_TIMEOUT = 240000; #define CATCH_ALL \ catch(const toConnection::exception &str) { \ if(!Closed) { \ emit error(str); \ close(); \ } \ } \ catch(const QString &str) { \ if(!Closed) { \ emit error(str); \ close(); \ } \ } \ catch(...) { \ if(!Closed) { \ emit error(tr("Unknown exception")); \ close(); \ } \ } toEventQueryTask::toEventQueryTask(QObject *parent, toConnection &conn, const QString &sql, const toQList ¶m, toResultStats *stats) : toRunnable(), SQL(sql), Params(param), Statistics(stats) { Query = 0; Columns = 0; Connection = &conn; Closed = false; setObjectName("toEventQueryTask"); } void toEventQueryTask::run(void) { try { Query = new toQuery(*Connection); Query->execute(SQL, Params); connect(this, SIGNAL(readRequested(bool)), this, SLOT(pread(bool)), Qt::QueuedConnection); toQDescList desc = Query->describe(); Columns = Query->columns(); emit headers(desc, Columns); if(Query->eof()) { // emit empty result ValuesList values; emit data(values); } else { read(); if(toConfigurationSingle::Instance().firewallMode()) QTimer::singleShot(FIREWALL_TIMEOUT, this, SLOT(timeout())); // begin thread's event loop thread()->exec(); } } CATCH_ALL; close(); try { if(Statistics) Statistics->changeSession(*Query); } catch(...) { // ignored } try { QMutexLocker lock(&CloseLock); Closed = true; delete Query; Query = 0; } catch(...) { // ignored } ThreadAlive.lock(); } toEventQueryTask::~toEventQueryTask() { } void toEventQueryTask::close() { try { if(Query) { int p = Query->rowsProcessed(); if(p > 0) emit rowsProcessed(p); } emit done(); disconnect(this, 0, 0, 0); QMutexLocker lock(&CloseLock); if(Query && !Closed) Query->cancel(); } catch(...) { // noop } Closed = true; // exit thread event loop. safe to call before event loop starts. if(thread()) thread()->exit(); } void toEventQueryTask::read(bool all) { emit readRequested(all); } void toEventQueryTask::pread(bool all) { if(!Query || Columns < 1) { close(); return; } int maxRead = toConfigurationSingle::Instance().maxNumber(); try { do { ValuesList values; for(int row = 0; row < maxRead; row++) { for(int i = 0; i < Columns && !Query->eof(); i++) values.append(Query->readValueNull()); } if(values.size() > 0) emit data(values); // must not access after this line } while(all && !Query->eof()); } CATCH_ALL; try { if(!Query || Query->eof()) close(); } CATCH_ALL; } void toEventQueryTask::timeout() { if(Closed) return; pread(false); // check again in case config changes if(toConfigurationSingle::Instance().firewallMode()) QTimer::singleShot(FIREWALL_TIMEOUT, this, SLOT(timeout())); } tora-2.1.3/src/tosearchreplace.cpp0000644000175000017500000001355311270353625016722 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "tohelp.h" #include "tomain.h" #include "tomarkedtext.h" #include "tosearchreplace.h" #include "icons/close.xpm" #include #include #include #include #include #include toSearchReplace::toSearchReplace(QWidget *parent) : QDialog(parent), toHelpContext(QString::fromLatin1("searchreplace.html")) { setupUi(this); hideButton->setIcon(QPixmap(const_cast(close_xpm))); QAction *action = new QAction(this); action->setShortcut(QKeySequence::HelpContents); connect(action, SIGNAL(triggered()), this, SLOT(displayHelp())); action = new QAction(Replace); action->setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_R); Replace->addAction(action); toEditWidget::addHandler(this); receivedFocus(toMainWidget()->editWidget()); searchChanged(""); connect(SearchNext, SIGNAL(clicked()), this, SLOT(searchNext())); connect(SearchPrevious, SIGNAL(clicked()), this, SLOT(searchPrevious())); connect(Replace, SIGNAL(clicked()), this, SLOT(replace())); connect(ReplaceAll, SIGNAL(clicked()), this, SLOT(replaceAll())); connect(hideButton, SIGNAL(clicked()), this, SLOT(close())); connect(SearchText, SIGNAL(editTextChanged(const QString &)), this, SLOT(searchChanged(const QString &))); } void toSearchReplace::displayHelp(void) { toHelp::displayHelp(); } QString toSearchReplace::currentSearchText() { return SearchText->currentText(); } Search::SearchMode toSearchReplace::searchMode() { if (SearchMode->currentIndex() == 0) return Search::SearchPlaintext; else return Search::SearchRegexp; } bool toSearchReplace::wholeWords() { return WholeWords->isChecked(); } bool toSearchReplace::caseSensitive() { return MatchCase->isChecked(); } void toSearchReplace::receivedFocus(toEditWidget *widget) { #ifdef Q_WS_MAC // Dialog is not writable without this magic on macosx. // TODO/FIXME: it would be great to reqrite S&R mechanism // to include it in edit widgets instead of main window... QWidget * w = dynamic_cast(widget); if (w) setParent(w, Qt::Dialog); // else // qDebug() << widget << "not set as parent" << w; #endif Target = widget; bool anySearch = Target && Target->searchEnabled(); SearchPrevious->setEnabled(anySearch); SearchNext->setEnabled(anySearch); Replace->setEnabled(Target && Target->searchCanReplace(false)); ReplaceAll->setEnabled(Target && Target->searchCanReplace(true)); } void toSearchReplace::searchNext(void) { QString t(SearchText->currentText()); if (Target) { Target->searchNext(t); Replace->setEnabled(Target->searchCanReplace(false)); ReplaceAll->setEnabled(Target->searchCanReplace(true)); } if (t.length() > 0 && SearchText->findText(t) == -1) SearchText->addItem(t); } void toSearchReplace::searchPrevious(void) { QString t(SearchText->currentText()); if (Target) { Target->searchPrevious(t); Replace->setEnabled(Target->searchCanReplace(false)); ReplaceAll->setEnabled(Target->searchCanReplace(true)); } if (t.length() > 0 && SearchText->findText(t) == -1) SearchText->addItem(t); } void toSearchReplace::replace(void) { QString t(ReplaceText->currentText()); if (Target) Target->searchReplace(t); if (t.length() > 0 && ReplaceText->findText(t) == -1) ReplaceText->addItem(t); } void toSearchReplace::replaceAll(void) { QString t(ReplaceText->currentText()); if (Target) Target->searchReplaceAll(t); if (t.length() > 0 && ReplaceText->findText(t) == -1) ReplaceText->addItem(t); } void toSearchReplace::show() { SearchText->setFocus(); toMarkedText * w = dynamic_cast(Target); if (w && w->hasSelectedText()) SearchText->lineEdit()->setText(w->selectedText()); SearchText->lineEdit()->selectAll(); QDialog::show(); } void toSearchReplace::searchChanged(const QString & text) { bool ena = text > 0; SearchNext->setEnabled(ena); SearchPrevious->setEnabled(ena); } tora-2.1.3/src/toresultcombo.h0000644000175000017500000001253111414153116016110 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTCOMBO_H #define TORESULTCOMBO_H #include "config.h" #include #include #include #include "tobackground.h" #include "toresult.h" class toNoBlockQuery; class toSQL; using Loki::SmartPtr; /** This widget displays the result of a query where each field is added as an item * to a combobox. */ class toResultCombo : public QComboBox, public toResult { Q_OBJECT SmartPtr Query; toBackground Poll; QString Selected; QStringList Additional; public: enum selectionPolicy { LastButOne = -1, Last = 0, First = 1, None }; selectionPolicy SelectionPolicy; /** Create the widget. * @param parent Parent widget. * @param name Name of widget. */ toResultCombo(QWidget *parent, const char *name = NULL); /** Destruct object */ ~toResultCombo(); /** Reimplemented for internal reasons. */ virtual void query(const QString &sql, const toQList ¶m); /** Clear list of additional items. */ virtual void clearAdditional() { Additional.clear(); } /** Item to add before the query is read. Can be called several times. */ virtual void additionalItem(const QString &item) { Additional << item; } /** Handle any connection by default */ virtual bool canHandle(toConnection &) { return true; } /** Set selected. When the result is read and this value is encountered that item is selected. */ void setSelected(const QString &sel) { Selected = sel; } /** Get selected item value. Might not be same as currentText since that item might not have been read yet. */ QString selected(void) { return Selected; } void setSelectionPolicy(selectionPolicy pol) { SelectionPolicy = pol; } // Why are these needed? #if 1 /** Set the SQL statement of this list * @param sql String containing statement. */ void setSQL(const QString &sql) { toResult::setSQL(sql); } /** Set the SQL statement of this list. This will also affect @ref Name. * @param sql SQL containing statement. */ void setSQL(const toSQL &sql) { toResult::setSQL(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const QString &sql) { toResult::query(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql) { toResult::query(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql, toQList &par) { toResult::query(sql, par); } #endif signals: /** Done reading the query. */ void done(void); public slots: /** Reimplemented for internal reasons. */ virtual void refresh(void) { toResult::refresh(); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1) { toResult::changeParams(Param1); } /** Reimplemented For internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2) { toResult::changeParams(Param1, Param2); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3) { toResult::changeParams(Param1, Param2, Param3); } private slots: void poll(void); void changeSelected(void); }; #endif tora-2.1.3/src/toresultlong.cpp0000644000175000017500000002472611270353625016323 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toresultlong.h" #include "toconf.h" #include "totool.h" #include "tonoblockquery.h" #include #include #include #include toResultLong::toResultLong(bool readable, bool dispCol, toQuery::queryMode mode, QWidget *parent, const char *name, Qt::WFlags f) : toResultView(readable, dispCol, parent, name, f) { Query = NULL; Statistics = NULL; Mode = mode; HasHeaders = false; connect(&Timer, SIGNAL(timeout(void)), this, SLOT(addItem(void))); } toResultLong::toResultLong(QWidget *parent, const char *name, Qt::WFlags f) : toResultView(parent, name, f) { Query = NULL; Statistics = NULL; Mode = toQuery::Long; HasHeaders = false; connect(&Timer, SIGNAL(timeout(void)), this, SLOT(addItem(void))); } void toResultLong::query(const QString &sql, const toQList ¶m) { if (!setSQLParams(sql, param)) { emit firstResult(toResult::sql(), toConnection::exception(tr("Will not reexecute same query")), false); emit done(); return ; } stop(); Query = NULL; LastItem = NULL; RowNumber = 0; First = true; clear(); setSorting( -1); if (NumberColumn) { addColumn(QString::fromLatin1("#")); setColumnAlignment(0, Qt::AlignRight); } if (Filter) Filter->startingQuery(); try { Query = new toNoBlockQuery(connection(), Mode, sql, param, Statistics); if (ReadAll) MaxNumber = -1; else MaxNumber = toConfigurationSingle::Instance().maxNumber(); addItem(); } catch (const toConnection::exception &str) { First = false; emit firstResult(toResult::sql(), str, true); emit done(); if (Mode != toQuery::Long) toStatusMessage(str); } catch (const QString &str) { First = false; emit firstResult(toResult::sql(), str, true); emit done(); if (Mode != toQuery::Long) toStatusMessage(str); } updateContents(); } #define TO_POLL_CHECK 100 void toResultLong::editReadAll(void) { if (Query && !Query->eof()) { MaxNumber = -1; Timer.start(TO_POLL_CHECK); } } void toResultLong::addItem(void) { try { if (!toCheckModal(this)) return ; if (Query) { if (Query->poll()) { bool em = false; QString buffer; if (First) { QString tmp = sql().simplified().mid(0, 10).toLower(); if (tmp.startsWith(QString::fromLatin1("update")) || tmp.startsWith(QString::fromLatin1("delete")) || tmp.startsWith(QString::fromLatin1("insert"))) buffer = tr("%1 rows processed").arg(Query->rowsProcessed()); else if (tmp.startsWith(QString::fromLatin1("select"))) buffer = tr("Query executed"); else buffer = tr("Statement executed"); em = true; } if (!HasHeaders) { Description = Query->describe(); bool hidden = false; for (toQDescList::iterator i = Description.begin();i != Description.end();i++) { QString name = (*i).Name; if (ReadableColumns) toReadableColumn(name); if (name.length() > 0 && name[0].toLatin1() != ' ') { if (hidden) throw tr("Can only hide last column in query"); if (name[0].toLatin1() == '-') { addColumn(toTranslateMayby(sqlName(), name.right(name.length() - 1))); setColumnAlignment(columns() - 1, Qt::AlignRight); } else { addColumn(toTranslateMayby(sqlName(), name)); if ((*i).AlignRight) setColumnAlignment(columns() - 1, Qt::AlignRight); } } else hidden = true; } HasHeaders = true; setResizeMode(toTreeWidget::AllColumns); if (sortColumn() < 0) { if (NumberColumn) setSorting(0); else setSorting(Description.size()); } } if (!Query->eof()) { int disp = 0; unsigned int cols = Description.size(); if (NumberColumn) { disp = 1; } do { toTreeWidgetItem *last = LastItem; LastItem = createItem(LastItem, QString::null); if (NumberColumn) LastItem->setText(0, QString::number(RowNumber + 1)); else LastItem->setText(cols, QString::number(RowNumber + 1)); toResultViewItem *ri = dynamic_cast(LastItem); toResultViewCheck *ci = dynamic_cast(LastItem); for (unsigned int j = 0;(j < cols || j == 0) && !Query->eof();j++) { if (ri) ri->setText(j + disp, Query->readValue()); else if (ci) ci->setText(j + disp, Query->readValue()); else LastItem->setText(j + disp, Query->readValue()); } if (Filter && !Filter->check(LastItem)) { delete LastItem; LastItem = last; } else RowNumber++; } while (Query->poll() && !Query->eof() && (MaxNumber < 0 || MaxNumber > RowNumber)); } if (em) { First = false; emit firstResult(sql(), toConnection::exception(buffer), false); } if (Query->eof()) { cleanup(); return ; } if (MaxNumber < 0 || MaxNumber > RowNumber) { if (!Timer.isActive()) Timer.start(1); // Must use timer, would mean really long recursion otherwise else Timer.start(TO_POLL_CHECK); } else Timer.stop(); } else { if (Query->eof()) { cleanup(); return ; } else if (!Timer.isActive()) Timer.start(TO_POLL_CHECK); } } } catch (const toConnection::exception &str) { if (First) { First = false; emit firstResult(sql(), str, true); if (Mode != toQuery::Long) toStatusMessage(str); } else toStatusMessage(str); cleanup(); } catch (const QString &str) { if (First) { First = false; emit firstResult(sql(), str, true); if (Mode != toQuery::Long) toStatusMessage(str); } else toStatusMessage(str); cleanup(); } } void toResultLong::cleanup(void) { if (Query) { // delete causes crash on short running queries. // delete Query; // Query = NULL; emit done(); Timer.stop(); } } bool toResultLong::eof(void) { return !Query || Query->eof(); } void toResultLong::stop(void) { if (Query) { delete Query; Query = NULL; Timer.stop(); emit done(); } } toResultLong::~toResultLong() { if (Query) { delete Query; Query = NULL; } } tora-2.1.3/src/toprofiler.h0000644000175000017500000000516611270353625015411 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOPROFILER_H #define TOPROFILER_H #include "config.h" #include "totool.h" class QComboBox; class QLineEdit; class QSpinBox; class QSplitter; class QTabWidget; class QToolButton; class toProfilerSource; class toProfilerUnits; class toResultItem; class toResultLong; class toWorksheetWidget; class toProfiler : public toToolWidget { Q_OBJECT int CurrentRun; int LastUnit; QToolButton *Background; QSpinBox *Repeat; QLineEdit *Comment; QTabWidget *Tabs; QSplitter *Result; QComboBox *Run; toResultItem *Info; toProfilerUnits *Units; toProfilerSource *Lines; toWorksheetWidget *Script; public: toProfiler(QWidget *parent, toConnection &connection); public slots: void refresh(void); void changeRun(void); void execute(void); void changeObject(void); void calcTotals(void); void noTables(void) { close(); } }; #endif tora-2.1.3/src/tobrowserdblinkswidget.cpp0000644000175000017500000000751011351612650020347 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #include "utils.h" #include "toresultitem.h" #include "toresulttableview.h" #include "tobrowserdblinkswidget.h" static toSQL SQLDBLinkInfo("toBrowser:DBLinkInformation", "SELECT * FROM Sys.all_db_links a\n" " WHERE Owner = :f1\n" " AND DB_LINK = :f2", "Display information about database link"); static toSQL SQLDBLinkSynonyms("toBrowser:DBLinkSynonyms", "SELECT * FROM Sys.all_synonyms a\n" " WHERE Owner = :f1\n" " AND DB_LINK = :f2", "Display foreign synonyms"); toBrowserDBLinksWidget::toBrowserDBLinksWidget(QWidget * parent) : toBrowserBaseWidget(parent) { setObjectName("toBrowserDBLinksWidget"); resultDBLink = new toResultItem(this); resultDBLink->setObjectName("resultDBLink"); resultDBLink->setSQL(SQLDBLinkInfo); synonymsView = new toResultTableView(this); synonymsView->setObjectName("synonymsView"); synonymsView->setSQL(SQLDBLinkSynonyms); changeConnection(); } void toBrowserDBLinksWidget::changeConnection() { toBrowserBaseWidget::changeConnection(); toConnection & c = toCurrentConnection(this); if (toIsOracle(c)) { addTab(resultDBLink, "Info"); addTab(synonymsView, "&Synonyms"); } else { resultDBLink->setVisible(false); synonymsView->setVisible(false); } } void toBrowserDBLinksWidget::testDBLink() { if (object().isEmpty()) { TOMessageBox::information(this, "Database link", "No selected database link to test."); return; } toQList resultset; try { resultset = toQuery::readQueryNull(toCurrentConnection(this), "SELECT * FROM dual@" + object()); } TOCATCH; QString status(resultset.empty() ? tr("status: FAILED") : tr("status: OK")); TOMessageBox::information(this, "Database link", object() + " " + status); } tora-2.1.3/src/tosgastatement.h0000644000175000017500000000601111270353625016254 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOSGASTATEMENT_H #define TOSGASTATEMENT_H #include "config.h" #include class QComboBox; class QTabWidget; class toResultField; class toResultItem; class toResultPlan; class toResultView; /** This widget displays information about a statement in the Oracle SGA. To get an * address use the @ref toSQLToAddress function. */ class toSGAStatement : public QTabWidget { Q_OBJECT /** The SQL run. */ toResultField *SQLText; /** Tab widget */ QWidget *CurrentTab; /** Resources used by the statement. */ toResultItem *Resources; /** Address of the statement. */ QString Address; /** Execution plan of the statement. */ toResultPlan *Plan; /** Display resources of statement. */ void viewResources(void); private slots: /** Change the displayed tab. */ void changeTab(int); public: /** Create widget. * @param parent Parent widget. */ toSGAStatement(QWidget *parent); public slots: /** Display another statement. * @param address Address of the statement to display. */ virtual void changeAddress(const QString &address); /** Update the contents of this widget. */ void refresh(void) { changeTab(QTabWidget::indexOf(CurrentTab)); } }; #endif tora-2.1.3/src/totemporary.h0000644000175000017500000000450611270353625015606 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOTEMPORARY_H #define TOTEMPORARY_H #include "config.h" #include "totool.h" #include #include #include "totreewidget.h" class toResultView; class toTask; class toSGAStatement; class toTemporary : public toToolWidget { Q_OBJECT; toResultView *Objects; toSGAStatement *Statement; QMenu *ToolMenu; QAction *refreshAct; public: toTemporary(QWidget *parent, toConnection &connection); public slots: virtual void refresh(void); virtual void windowActivated(QMdiSubWindow *widget); virtual void changeItem(toTreeWidgetItem *item); }; #endif tora-2.1.3/src/tooraclepreload.cpp0000644000175000017500000000412011270353625016723 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOMONOLITHIC #include #include class toInit { public: toInit(void) { char *home = getenv("ORACLE_HOME"); if (!home) return ; QString dlpath = home; dlpath += "/lib/libclntsh.so"; if (!dlopen(dlpath, RTLD_NOW | RTLD_GLOBAL)) return ; } }; static toInit Init; #endif tora-2.1.3/src/toconnection.h0000644000175000017500000012675111414624421015725 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOCONNECTION_H #define TOCONNECTION_H #include "config.h" #include "toqvalue.h" #include "tothread.h" #include #include #include #include #include #include #include class QWidget; class toConnection; class toConnectionProvider; class toSQL; class toQuery; class toSyntaxAnalyzer; class toConnectionPool; /** This class is an abstract definition of an actual connection to a database. * Each @ref toConnection object can have one or more actual connections to the * database depending on long running queries. Normally you will never need to * bother with this class if you aren't creating a new database provider * (@ref toConnectionProvider). */ class toConnectionSub { toQuery *Query; public: /** Create connection to database. */ toConnectionSub() { Query = NULL; } /** Close connection. */ virtual ~toConnectionSub() { } /** Query current running on connection or NULL. */ toQuery *query() { return Query; } /** Set query currently running on connection. NULL means none. */ void setQuery(toQuery *query) { Query = query; } /** Cancel anything running on this sub. */ virtual void cancel(void) { } } ; /** This class is used to perform a query on a database connection. */ class toQuery : public QObject { Q_OBJECT; public: /** Represent different modes to run a query in. */ enum queryMode { /** Run the query normally on the main connection of the @ref toConnection object. */ Normal, /** Run the query normally on the main backgrround connection of the * @ref toConnection object. This can be the same as the main connection depending * on settings. */ Background, /** Run the query in a separate connection for long running queries. */ Long, /** Run the query on all non occupied connections of the @ref toConnection object. */ All, /** For internal use, doesn't close resources */ Test }; /** This structure is used to describe the resultset of a query. */ struct queryDescribe { /** Column name */ QString Name; /** Datatype of string. */ QString Datatype; /** If column can contain null values. */ bool Null; /** Preferred alignment of this kind of value. */ bool AlignRight; /** Comment on column (Only filled out in column cache. */ QString Comment; }; /** Abstract parent of implementations of a query for a database provider * (See @ref toConnection::connectionImpl and @ref toConnectionProvider) */ class queryImpl { toQuery *Parent; public: /** Get the parent query object. All the parameters of the query must be read from here. * nothing is passed to the functions. */ toQuery *query() { return Parent; } /** Create a query implementation. The constructor must not perform any actions with the * database that could block for a noticable time (Like execute or parse a query). The * data for the query may not be available when this object created. * @param query Parent query object. */ queryImpl(toQuery *query) : Parent(query) { } /** Destroy query implementation. */ virtual ~queryImpl() { } /** Execute a query. Parameters can be gotten from the @ref toQuery object. */ virtual void execute(void) = 0; /** Read the next value from the stream. * @return The value read from the query. */ virtual toQValue readValue(void) = 0; /** Check if the end of the query has been reached. * @return True if all values have been read. */ virtual bool eof(void) = 0; /** Get the number of rows processed in the last executed query. */ virtual int rowsProcessed(void) = 0; /** Describe the currently running query. * @return A list of column descriptions of the query. */ virtual std::list describe(void) = 0; /** Get number of columns in the resultset. * @return Column number. */ virtual int columns(void) = 0; /** Cancel the current execution of a query. This will usually be called from another * thread than is executing the query. */ virtual void cancel(void) = 0; }; private: QPointer Connection; toConnectionSub *ConnectionSub; std::list Params; QString SQL; queryMode Mode; bool showBusy; // does a "busy" indicator has to be shown while query is running (default - true) queryImpl *Query; toQuery(const toQuery &); public: /** Create a normal query. * @param conn Connection to create query on. * @param sql SQL to run. * @param params Parameters to pass to query. */ toQuery(toConnection &conn, const toSQL &sql, const std::list ¶ms); /** Create a normal query. * @param conn Connection to create query on. * @param sql SQL to run. * @param params Parameters to pass to query. */ toQuery(toConnection &conn, const QString &sql, const std::list ¶ms); /** Create a normal query. * @param conn Connection to create query on. * @param sql SQL to run. * @param arg1 Arguments to pass to query. */ toQuery(toConnection &conn, const toSQL &sql, const QString &arg1 = QString::null, const QString &arg2 = QString::null, const QString &arg3 = QString::null, const QString &arg4 = QString::null, const QString &arg5 = QString::null, const QString &arg6 = QString::null, const QString &arg7 = QString::null, const QString &arg8 = QString::null, const QString &arg9 = QString::null); /** Create a normal query. * @param conn Connection to create query on. * @param sql SQL to run. * @param arg1 Arguments to pass to query. */ toQuery(toConnection &conn, const QString &sql, const QString &arg1 = QString::null, const QString &arg2 = QString::null, const QString &arg3 = QString::null, const QString &arg4 = QString::null, const QString &arg5 = QString::null, const QString &arg6 = QString::null, const QString &arg7 = QString::null, const QString &arg8 = QString::null, const QString &arg9 = QString::null); /** Create a query. * @param conn Connection to create query on. * @param mode Mode to run query in. * @param sql SQL to run. * @param params Arguments to pass to query. */ toQuery(toConnection &conn, queryMode mode, const toSQL &sql, const std::list ¶ms); /** Internal use. Create a query object to test a * toConnectionSub. Does not close sub. * * @param conn Connection to create query on. * @param mode Mode to run query in. * @param sql SQL to run. * @param params Arguments to pass to query. */ toQuery(toConnection &conn, toConnectionSub *sub, const QString &sql, const std::list ¶ms); /** Create a query. * @param conn Connection to create query on. * @param mode Mode to run query in. * @param sql SQL to run. * @param params Arguments to pass to query. */ toQuery(toConnection &conn, queryMode mode, const QString &sql, const std::list ¶ms); /** Create a query. Don't runn any SQL using it yet. Observe though that the @ref * toConnectionSub object is assigned here so you know that all queries run using this * query object will run on the same actual connection to the database (Unless mode is All off * course). * @param conn Connection to create query for. * @param mode Mode to execute queries in. */ toQuery(toConnection &conn, queryMode mode = Normal); /** Destroy query. */ virtual ~toQuery(); /** Execute an SQL statement using this query. * @param sql SQL to run. * @param params Parameters to pass to query. */ void execute(const toSQL &sql, const std::list ¶ms); /** Execute an SQL statement using this query. * @param sql SQL to run. * @param params Parameters to pass to query. */ void execute(const QString &sql, const std::list ¶ms); /** Execute an SQL statement with no parameters using this query. * @param sql SQL to run. */ void execute(const toSQL &sql); /** Execute an SQL statement using this query with String as parameter * @param sql SQL to run. * @param param Parameter to pass to query */ void execute(const toSQL &sql, const QString ¶m); /** Execute an SQL statement using this query with 3 Strings as parameters * @param sql SQL to run. * @param param1 1st parameter * @param param2 2nd parameter * @param param3 3rd parameter */ void execute(const toSQL &sql, const QString ¶m1, const QString ¶m2, const QString ¶m3); /** Connection object of this object. */ toConnection &connection(void) { return *Connection; } /** Actual database connection that this query is currently using. */ toConnectionSub *connectionSub(void) { return ConnectionSub; } /** Parameters of the current query. */ std::list ¶ms(void) { return Params; } /** SQL to run. Observe that this string is in UTF8 format. */ QString sql(void) { return SQL; } /** Get the mode this query is executed in. */ toQuery::queryMode mode(void) const { return Mode; } /** Read a value from the query. Convert the value NULL to the string {null}. * @return Value read. */ toQValue readValue(void); /** Read a value from the query. Nulls are returned as empty @ref toQValue. * @return Value read. */ toQValue readValueNull(void); /** Check if end of query is reached. * @return True if end of query is reached. */ bool eof(void); /** Get the number of rows processed by the query. */ int rowsProcessed(void) { return Query->rowsProcessed(); } /** Get a list of descriptions for the columns. This function is relatively slow. */ std::list describe(void) { return Query->describe(); } /** Get the number of columns in the resultset of the query. */ int columns(void) { return Query->columns(); } /** Execute a query and return all the values returned by it. * @param conn Connection to run query on. * @param sql SQL to run. * @param params Parameters to pass to query. * @return A list of @ref toQValues:s read from the query. */ static std::list readQuery(toConnection &conn, const toSQL &sql, std::list ¶ms); /** Execute a query and return all the values returned by it. * @param conn Connection to run query on. * @param sql SQL to run. * @param params Parameters to pass to query. * @return A list of @ref toQValues:s read from the query. */ static std::list readQuery(toConnection &conn, const QString &sql, std::list ¶ms); /** Execute a query using this oracle session and return all values. * @param sql SQL to run. * @param params Parameters to pass to query. * @return A list of @ref toQValues:s read from query */ std::list readQuery(const QString &sql, std::list ¶ms); /** Execute a query and return all the values returned by it. * @param conn Connection to run query on. * @param sql SQL to run. * @param arg1 Parameters to pass to query. * @return A list of @ref toQValues:s read from the query. */ static std::list readQuery(toConnection &conn, const toSQL &sql, const QString &arg1 = QString::null, const QString &arg2 = QString::null, const QString &arg3 = QString::null, const QString &arg4 = QString::null, const QString &arg5 = QString::null, const QString &arg6 = QString::null, const QString &arg7 = QString::null, const QString &arg8 = QString::null, const QString &arg9 = QString::null); /** Execute a query and return all the values returned by it. * @param conn Connection to run query on. * @param sql SQL to run. * @param arg1 Parameters to pass to query. * @return A list of @ref toQValues:s read from the query. */ static std::list readQuery(toConnection &conn, const QString &sql, const QString &arg1 = QString::null, const QString &arg2 = QString::null, const QString &arg3 = QString::null, const QString &arg4 = QString::null, const QString &arg5 = QString::null, const QString &arg6 = QString::null, const QString &arg7 = QString::null, const QString &arg8 = QString::null, const QString &arg9 = QString::null); /** Execute a query and return all the values returned by it. * @param conn Connection to run query on. * @param sql SQL to run. * @param params Parameters to pass to query. * @return A list of @ref toQValues:s read from the query. */ static std::list readQueryNull(toConnection &conn, const toSQL &sql, std::list ¶ms); /** Execute a query and return all the values returned by it. * @param conn Connection to run query on. * @param sql SQL to run. * @param params Parameters to pass to query. * @return A list of @ref toQValues:s read from the query. */ static std::list readQueryNull(toConnection &conn, const QString &sql, std::list ¶ms); /** Execute a query and return all the values returned by it. * @param conn Connection to run query on. * @param sql SQL to run. * @param arg1 Parameters to pass to query. * @return A list of @ref toQValues:s read from the query. */ static std::list readQueryNull(toConnection &conn, const toSQL &sql, const QString &arg1 = QString::null, const QString &arg2 = QString::null, const QString &arg3 = QString::null, const QString &arg4 = QString::null, const QString &arg5 = QString::null, const QString &arg6 = QString::null, const QString &arg7 = QString::null, const QString &arg8 = QString::null, const QString &arg9 = QString::null); /** Execute a query and return all the values returned by it. * @param conn Connection to run query on. * @param sql SQL to run. * @param arg1 Parameters to pass to query. * @return A list of @ref toQValues:s read from the query. */ static std::list readQueryNull(toConnection &conn, const QString &sql, const QString &arg1 = QString::null, const QString &arg2 = QString::null, const QString &arg3 = QString::null, const QString &arg4 = QString::null, const QString &arg5 = QString::null, const QString &arg6 = QString::null, const QString &arg7 = QString::null, const QString &arg8 = QString::null, const QString &arg9 = QString::null); /** Cancel the current execution of a query. */ void cancel(void); /** Specify if busy cursor must be displayed while a query is running */ void setShowBusy(bool busy) { showBusy = busy; } }; /** A short representation of a @ref toQuery::queryDescribe */ typedef toQuery::queryDescribe toQDescribe; /** A short representation of list */ typedef std::list toQDescList; Q_DECLARE_METATYPE(toQDescList); /** Represent a database connection in TOra. Observe that this can mean several actual * connections to the database as queries that are expected to run a long time are sometimes * executed in their own connection to make sure the interface doesn't lock up for a long time. */ class toConnection : public QObject { Q_OBJECT; QString Provider; QString User; QString Password; QString Host; QString Database; QString Schema; QString Version; QString Color; std::list > Widgets; std::list InitStrings; std::set Options; bool NeedCommit; toLock Lock; // held while cacheObjects is running toLock CacheLock; toConnectionPool *ConnectionPool; public: /** Class that could be used to throw exceptions in connection errors. Must use if you * want to indicate error offset. */ class exception : public QString { int Offset; public: /** Create an empty exception */ exception() : QString() { Offset = -1; } /** Create an exception with a string description. */ exception(const QString &str, int offset = -1) : QString(str) { Offset = offset; } /** Get the offset of the error of the current statement. */ int offset(void) const { return Offset; } /** Set the offset of the error of the error. */ void setOffset(int offset) { Offset = offset; } }; /** Contain information about a tablename. */ struct objectName { /** The object name */ QString Name; /** The schema that owns it */ QString Owner; /** Object type */ QString Type; /** Comment about this object */ QString Comment; /** synonyms (used for faster disk caching...) */ std::list Synonyms; /** Create an object name with filled in values. */ objectName(const QString &owner, const QString &name, const QString &type = QString("TABLE"), const QString &comment = QString::null) : Name(name), Owner(owner), Type(type), Comment(comment) { } /** Create an empty object name. */ objectName() { } bool operator < (const objectName &) const; bool operator == (const objectName &) const; }; /** This class is an abstract baseclass to actually implement the communication with the * database. * (See also @ref toQuery::queryImpl and @ref toConnectionProvider) */ class connectionImpl { toConnection *Connection; public: /** Get the parent connection object of this connection. */ toConnection &connection(void) { return *Connection; } /** Create a new connection implementation for a connection. * @param conn Connection to implement. */ connectionImpl(toConnection *conn) { Connection = conn; }; /** Destructor. */ virtual ~connectionImpl() { } /** Commit the supplied actual database connection. */ virtual void commit(toConnectionSub *) = 0; /** Rollback the supplied actual database connection. */ virtual void rollback(toConnectionSub *) = 0; /** If not true can never run more than one query per connection sub and TOra will * work around this limitation by opening more connections if needed. */ virtual bool handleMultipleQueries() { return true; } /** Create a new connection to the database. */ virtual toConnectionSub *createConnection(void) = 0; /** Close a connection to the database. */ virtual void closeConnection(toConnectionSub *) = 0; /** Get the version of the database connected to. */ virtual QString version(toConnectionSub *) = 0; /** Return a string representation to address an object. * @param name The name to be quoted. * @param quoteLowercase Enclose in quotes when identifier has lowercase letters * @return String addressing table. */ virtual QString quote(const QString &name, const bool quoteLowercase = true) { return name; } /** Perform the opposite of @ref quote. * @param name The name to be un-quoted. * @return String addressing table. */ virtual QString unQuote(const QString &name) { return name; } /** * Get syntax analyzer for connection * @return A reference to the syntax analyzer to use for the connection. */ virtual toSyntaxAnalyzer &analyzer(); /** Extract available objects to query for connection. Any access to the * database should always be run using a long running query. If something * goes wrong should throw exception. * @return List of available objects. */ virtual std::list objectNames(void); /** Get synonyms available for connection. Any access to the * database should always be run using a long running query. If something * goes wrong should throw exception. * @param objects Available objects for the connection. Objects * are sorted in owner and name order. Don't modify * this list. * @return Map of synonyms to objectnames. */ virtual std::map synonymMap(std::list &objects); /* Extract available columns to query for a table. * @param table Table to get column for. * @return List of columns for table or view. */ virtual toQDescList columnDesc(const objectName &table); /** Create a new query implementation for this connection. * @return A query implementation, allocated with new. */ virtual toQuery::queryImpl *createQuery(toQuery *query, toConnectionSub *conn) = 0; /** Execute a query on an actual connection without caring about the result. * @param conn Connection to execute on. * @param sql SQL to execute. * @param params Parameters to pass to query. */ virtual void execute(toConnectionSub *conn, const QString &sql, toQList ¶ms) = 0; /** Parse a query on an actual connection and report any syntax problems encountered. * Defaults to not implemented. * @param conn Connection to execute on. * @param sql SQL to parse */ virtual void parse(toConnectionSub *conn, const QString &sql); }; private: toConnectionSub* addConnection(void); void closeConnection(toConnectionSub *sub); connectionImpl *Connection; class cacheObjects : public toTask { QPointer Connection; public: cacheObjects(toConnection *conn) : Connection(conn) { } virtual void run(void); }; friend class cacheObjects; bool ReadingCache; toSemaphore ReadingValues; bool Abort; std::map ColumnCache; std::list ObjectNames; std::map SynonymMap; toConnectionSub* pooledConnection(void); void readObjects(void); QString cacheFile(); public: /** Create a new connection. * @param provider Which database provider to use for this connection. * (See @ref to toDatabaseConnection) * @param user User to connect to the database with. * @param password Password to connect with. * @param host Host to connect to the database with. * @param database Database to connect to. * @param schema Default schema to switch to. * @param color Highlighting color for GUI widgets * @param options Options used to connect to the database with. * @param cache Enable object cache for this connection. */ toConnection(const QString &provider, const QString &user, const QString &password, const QString &host, const QString &database, const QString &schema, const QString &color, const std::set &options, bool cache = true); /** Create a copy of a connection. Will not cache objects, so objects will never be available * in a subconnection. * @param conn Connection to copy. */ explicit toConnection(const toConnection &conn); /** Destroy connection. */ virtual ~toConnection(); //* Get the options for the connection. const std::set &options() const { return Options; } /** Try to close all the widgets associated with this connection. * @return True if all widgets agreed to close. */ bool closeWidgets(void); /** Get username of connection. */ const QString &user() const { return User; } /** Get password of connection. */ const QString &password() const { return Password; } /** Change password of connection. */ void setPassword(const QString &pwd) { Password = pwd; } /** Get host of connection. */ const QString &host() const { return Host; } /** Get database of connection. */ const QString &database() const { return Database; } /** Get schema of connection. */ const QString &schema() const { return Schema; } /** * Set connection's current schema * */ inline void setSchema(const QString &schema) { Schema = schema; } /** Get version of connection. */ const QString &version() const { return Version; } /** Get provider of connection. */ const QString &provider() const; QString color() { return Color; } void setColor(const QString & c) { Color = c; } /** Change the current database. Observe that this only changes the record of what is the current database. You will still need * to change the database oppinion on what database is the current one. */ void setDatabase(const QString &database) { Database = database; } /** Get a description of this connection. * @version Include version in returned string. */ virtual QString description(bool version = true) const; /** Set if this connection needs to be committed. */ void setNeedCommit(bool needCommit = true) { NeedCommit = needCommit; } /** * Get information about if the connection has uncommitted data. * * @return Whether uncommitted data is available. */ bool needCommit(void) const { return NeedCommit; } /** * Commit connection implementation */ void commit(toConnectionSub *sub); /** * Rollback connection implementation */ void rollback(toConnectionSub *rollback); /** * Commit all connections. */ virtual void commit(void); /** * Rollback all connections. */ virtual void rollback(void); /** Parse a query on an actual connection and report any syntax problems encountered. * Defaults to not implemented. * @param conn Connection to execute on. * @param sql SQL to parse */ void parse(const QString &sql); /** Parse a query on an actual connection and report any syntax problems encountered. * Defaults to not implemented. * @param conn Connection to execute on. * @param sql SQL to parse */ void parse(const toSQL &sql); /** Execute a statement without caring about the result. * @param sql SQL to execute * @param params Parameters to pass to query. */ void execute(const toSQL &sql, toQList ¶ms); /** Execute a statement without caring about the result. * @param sql SQL to execute * @param params Parameters to pass to query. */ void execute(const QString &sql, toQList ¶ms); /** Execute a statement without caring about the result. * @param sql SQL to execute * @param arg1 Parameters to pass to query. */ void execute(const toSQL &sql, const QString &arg1 = QString::null, const QString &arg2 = QString::null, const QString &arg3 = QString::null, const QString &arg4 = QString::null, const QString &arg5 = QString::null, const QString &arg6 = QString::null, const QString &arg7 = QString::null, const QString &arg8 = QString::null, const QString &arg9 = QString::null); /** Execute a statement without caring about the result. * @param sql SQL to execute * @param arg1 Parameters to pass to query. */ void execute(const QString &sql, const QString &arg1 = QString::null, const QString &arg2 = QString::null, const QString &arg3 = QString::null, const QString &arg4 = QString::null, const QString &arg5 = QString::null, const QString &arg6 = QString::null, const QString &arg7 = QString::null, const QString &arg8 = QString::null, const QString &arg9 = QString::null); /** Execute a statement without caring about the result on all open database connections. * @param sql SQL to execute * @param params Parameters to pass to query. */ void allExecute(const toSQL &sql, toQList ¶ms); /** Execute a statement without caring about the result on all open database connections. * @param sql SQL to execute * @param params Parameters to pass to query. */ void allExecute(const QString &sql, toQList ¶ms); /** Execute a statement without caring about the result on all open database connections. * @param sql SQL to execute * @param arg1 Parameters to pass to query. */ void allExecute(const toSQL &sql, const QString &arg1 = QString::null, const QString &arg2 = QString::null, const QString &arg3 = QString::null, const QString &arg4 = QString::null, const QString &arg5 = QString::null, const QString &arg6 = QString::null, const QString &arg7 = QString::null, const QString &arg8 = QString::null, const QString &arg9 = QString::null); /** Execute a statement without caring about the result on all open database connections. * @param sql SQL to execute * @param arg1 Parameters to pass to query. */ void allExecute(const QString &sql, const QString &arg1 = QString::null, const QString &arg2 = QString::null, const QString &arg3 = QString::null, const QString &arg4 = QString::null, const QString &arg5 = QString::null, const QString &arg6 = QString::null, const QString &arg7 = QString::null, const QString &arg8 = QString::null, const QString &arg9 = QString::null); /** * Add a object that uses this connection. This is needed to ensure that all widgets * that make use of a connection are destroyed when the connection is closed. Usually * tool windows need to call this function. * * @param widget The widget to add to the connection. */ void addWidget(QWidget *widget); /** * Remove a widget from this connection. Should be called by the destructor of the * widget that has called addWidget. * * @see addWidget * @param widget Widget to remove from the widget list. */ void delWidget(QWidget *widget); /** * Add a statement to be run uppon making new connections. * @param sql Statement to run. */ void addInit(const QString &sql); /** * Remove a statement that was added using @ref addInit. */ void delInit(const QString &sql); /** * Get a list of the current init strings. */ const std::list initStrings() const; /** Return a string representation to address an object. * @param name The name to be quoted. * @param quoteLowercase Enclose in quotes when identifier has lowercase letters * @return String addressing table. */ QString quote(const QString &name, const bool quoteLowercase = true); /** Perform the opposite of @ref quote. * @param name The name to be un-quoted. * @return String addressing table. */ QString unQuote(const QString &name); /** * Get the objects available for the current user. Do not modify the returned list. * @param block Indicate wether or not to block until cached objects are available. * @return A list of object available for the current user. The list is sorted in * owner and name order. */ std::list &objects(bool block); /** Add a new object to the objectlist if it doesn't exist already. * @param object The object to add */ void addIfNotExists(objectName &object); /** * Get syntax analyzer for connection * @return A reference to the syntax analyzer to use for the connection. */ virtual toSyntaxAnalyzer &analyzer(); /** * Get the synonyms available for objects. Do not modify the returned list. * @param block Indicate wether or not to block until cached objects are available. * @return A list of synonyms to objects available for the current user. */ std::map &synonyms(bool block); /** * Get a list of the available columns for a table. This function caches the responses * and should be fairly fast after the first call. Do not modify the returned list. * @param table The table to describe. * @param nocache Don't use cached values even if they are available. * @return A list of the columns for a table. */ toQDescList &columns(const objectName &table, bool nocache = false); /** * Get a list of object names for a owner, typically this is a * list of tables for a database or schema. * */ std::list tables(const objectName &object, bool nocache = false); /** * Reread the object and column cache. */ void rereadCache(void); /** * Get the real object name of an object. * @param object Object name * @param block Block if not done caching object. */ const objectName &realName(const QString &object, bool block); /** * Get the real object name of a synonym. * @param object Object name * @param synonym Filled with the synonym used to access the object returned or empty. * @param block Block if not done caching object. */ const objectName &realName(const QString &object, QString &synonym, bool block); /** Check if cache is available or not. * @param synonyms If synonyms are needed or not. * @param block Block until cache is done. * @param true True if you need the cache, or just checking. * @return True if cache is available. */ bool cacheAvailable(bool synonyms, bool block = false, bool need = true); /** Try to stop all running queries. */ void cancelAll(void); /** load disk cache */ bool loadDiskCache(void); /** write disk cache */ void writeDiskCache(void); /** Get a list of currently running SQL. */ std::list running(void); static QString cacheDir(); friend class toQuery; friend class toConnectionPool; }; Q_DECLARE_METATYPE(toConnection::exception); /** This class is used to implement new database providers. */ class toConnectionProvider { static std::map *Providers; static std::map *Types; QString Provider; static void checkAlloc(void); /** Get the provider object for a given provider name. * @param provider Name of provider. * @return Reference to provider object. */ static toConnectionProvider &fetchProvider(const QString &provider); protected: /** Add a provider to the list that this provider can handle. */ void addProvider(const QString &provider); /** Remove a provider from the list that this provider can handle. */ void removeProvider(const QString &provider); public: /** Create a new provider with the specified name. * @param provider Name of the provider. */ toConnectionProvider(const QString &provider, bool add = true); /** Destructor. */ virtual ~toConnectionProvider(); /** Create an implementation of a connection to this database. * @param provider Provider to use for connection. * @param conn The connection object to use the created connection. * @return A connection implementation created with new. */ virtual toConnection::connectionImpl *provideConnection(const QString &provider, toConnection *conn) = 0; /** List the available hosts this database provider knows about. * @return A list of hosts. */ virtual std::list providedHosts(const QString &provider); /** List the available databases this provider knows about for a given host. * @param host Host to return connections for. * @param user That might be needed. * @param password That might be needed. * @return A list of databases available for a given host. */ virtual std::list providedDatabases(const QString &provider, const QString &host, const QString &user, const QString &pwd) = 0; /** Will be called after program has been started and before connections have been opened. * Use for initialization. */ virtual void initialize(void) { } /** Get a list of options available for the connection. An option with the name * "-" indicates a break should be made to separate the rest of the options from the previous * options. An option preceded by "*" means selected by default. The * shoul be stripped before * before passing it to the connection call. */ virtual std::list providedOptions(const QString &provider); /** * Create and return configuration tab for this connectiontype. The returned widget should also * be a childclass of @ref toSettingTab. * * @return A pointer to the widget containing the setup tab for this tool or NULL of * no settings are available. */ virtual QWidget *providerConfigurationTab(const QString &provider, QWidget *parent); /** Get a list of names for providers. */ static QWidget *configurationTab(const QString &provider, QWidget *parent); /** Get a list of names for providers. */ static std::list providers(); /** Get a list of options for a given provider. */ static std::list options(const QString &provider); /** Implement a connection for a given provider. * @param provider Provider to implement. * @param conn Connection to create implementation for. */ static toConnection::connectionImpl *connection(const QString &provider, toConnection *conn); /** Get a list of hosts this provider knows about. */ static std::list hosts(const QString &provider); /** Get a list of databases for a given provider and host. * @param provider Provider to fetch databases for. * @param host Host to fetch databases for. * @param user That might be needed. * @param password That might be needed. * @return List of known databases. */ static std::list databases(const QString &provider, const QString &host, const QString &user, const QString &pwd); /** * Get connection specific settings. * * Setting names are hierachical separated by ':' instead of '/' usually used * in filenames. As an example all settings for the tool 'Example' would be * under the 'Example:{settingname}' name. Observe that the settings are stored * under the main provider name as passed to the toConnectionProvider constructor. * * @param tag The name of the configuration setting. * @param def Contents of this setting. */ // const QString &config(const QString &tag, const QString &def); /** * Change connectionspecific setting. Depending on the implementation this can change the * contents on disk or not. * * Setting names are hierachical separated by ':' instead of '/' usually used * in filenames. As an example all settings for the tool 'Example' would be * under the 'Example:{settingname}' name. Observe that the settings are stored * under the main provider name as passed to the toConnectionProvider constructor. * * @param tag The name of the configuration setting. * @param def Default value of the setting, if it is not available. */ // void setConfig(const QString &tag, const QString &value); /** Call all initializers */ static void initializeAll(void); }; #endif tora-2.1.3/src/todefaultkeywords.h0000644000175000017500000003243211335062637017001 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ static const char *DefaultKeywords[] = { "ABORT", "ACCESS", "ACCESSED", "ACCOUNT", "ACTIVATE", "ADD", "ADMIN", "ADMINISTER", "ADMINISTRATOR", "ADVISE", "AFTER", "ALGORITHM", "ALL", "ALLOCATE", "ALLOW", "ALL_ROWS", "ALTER", "ALWAYS", "ANALYZE", "ANCILLARY", "AND", "ANY", "APPLY", "ARCHIVE", "ARCHIVELOG", "ARRAY", "AS", "ASC", "ASSOCIATE", "AT", "ATTRIBUTE", "ATTRIBUTES", "AUDIT", "AUTHENTICATED", "AUTHID", "AUTHORIZATION", "AUTO", "AUTOALLOCATE", "AUTOEXTEND", "AUTOMATIC", "BACKUP", "BECOME", "BEFORE", "BEGIN", "BEHALF", "BETWEEN", "BFILE", "BINDING", "BITMAP", "BITS", "BLOB", "BLOCK", "BLOCKSIZE", "BLOCK_RANGE", "BODY", "BOTH", "BOOLEAN", "BOUND", "BROADCAST", "BUFFER_POOL", "BUILD", "BULK", "BY", "BYTE", "CACHE", "CACHE_INSTANCES", "CALL", "CANCEL", "CASCADE", "CASE", "CAST", "CATEGORY", "CERTIFICATE", "CFILE", "CHAINED", "CHANGE", "CHAR", "CHARACTER", "CHAR_CS", "CHECK", "CHECKPOINT", "CHILD", "CHOOSE", "CHUNK", "CLEAR", "CLOB", "CLONE", "CLOSE", "CLOSE_CACHED_OPEN_CURSORS", "CLUSTER", "COALESCE", "COLLECT", "COLUMN", "COLUMNS", "COLUMN_VALUE", "COMMENT", "COMMIT", "COMMITTED", "COMPATIBILITY", "COMPILE", "COMPLETE", "COMPOSITE_LIMIT", "COMPRESS", "COMPUTE", "CONFORMING", "CONNECT", "CONNECT_TIME", "CONSIDER", "CONSISTENT", "CONSTRAINT", "CONSTRAINTS", "CONTAINER", "CONTENTS", "CONTEXT", "CONTINUE", "CONTROLFILE", "CONVERT", "CORRUPTION", "COST", "CPU_PER_CALL", "CPU_PER_SESSION", "CREATE", "CREATE_STORED_OUTLINES", "CROSS", "CUBE", "CURRENT", "CURRENT_DATE", "CURRENT_SCHEMA", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR", "CURSOR_SPECIFIC_SEGMENT", "CYCLE", "DANGLING", "DATA", "DATABASE", "DATAFILE", "DATAFILES", "DATAOBJNO", "DATE", "DATE_MODE", "DBA", "DBTIMEZONE", "DDL", "DEALLOCATE", "DEBUG", "DEC", "DECIMAL", "DECLARE", "DECODE", "DEFAULT", "DEFERRABLE", "DEFERRED", "DEFINED", "DEFINER", "DEGREE", "DELAY", "DELETE", "DEMAND", "DENSE_RANK", "DEREF", "DESC", "DETACHED", "DETERMINES", "DICTIONARY", "DIMENSION", "DIRECTORY", "DISABLE", "DISASSOCIATE", "DISCONNECT", "DISMOUNT", "DISPATCHERS", "DISTINCT", "DISTINGUISHED", "DISTRIBUTED", "DML", "DOUBLE", "DROP", "DUMP", "DYNAMIC", "EACH", "ELEMENT", "ELSE", "ELSIF", "ENABLE", "ENCRYPTED", "ENCRYPTION", "END", "ENFORCE", "ENTRY", "ERROR_ON_OVERLAP_TIME", "ESCAPE", "ESTIMATE", "EVENTS", "EXCEPT", "EXCEPTION", "EXCEPTIONS", "EXCHANGE", "EXCLUDING", "EXCLUSIVE", "EXECUTE", "EXEMPT", "EXISTS", "EXIT", "EXPIRE", "EXPLAIN", "EXPLOSION", "EXTEND", "EXTENDS", "EXTENT", "EXTENTS", "EXTERNAL", "EXTERNALLY", "EXTRACT", "FAILED_LOGIN_ATTEMPTS", "FALSE", "FAST", "FILE", "FILTER", "FINAL", "FINISH", "FIRST", "FIRST_ROWS", "FLAGGER", "FLOAT", "FLOB", "FLUSH", "FOLLOWING", "FOR", "FORCE", "FOREIGN", "FREELIST", "FREELISTS", "FRESH", "FROM", "FULL", "FUNCTION", "FUNCTIONS", "GENERATED", "GLOBAL", "GLOBALLY", "GLOBAL_NAME", "GLOBAL_TOPIC_ENABLED", "GRANT", "GROUP", "GROUPS", "GUARD", "HASH", "HASHKEYS", "HAVING", "HEADER", "HEAP", "HIERARCHY", "HOUR", "IDENTIFIED", "IDENTIFIER", "IDGENERATORS", "IDLE_TIME", "IF", "IMMEDIATE", "IN", "INCLUDING", "INCREMENT", "INCREMENTAL", "INDEX", "INDEXED", "INDEXES", "INDEXTYPE", "INDEXTYPES", "INDICATOR", "INITIAL", "INITIALIZED", "INITIALLY", "INITRANS", "INNER", "INSERT", "INSTANCE", "INSTANCES", "INSTANTIABLE", "INSTEAD", "INT", "INTEGER", "INTEGRITY", "INTERMEDIATE", "INTERNAL_CONVERT", "INTERNAL_USE", "INTERSECT", "INTERVAL", "INTO", "INVALIDATE", "IN_MEMORY_METADATA", "IS", "ISOLATION", "ISOLATION_LEVEL", "JAVA", "JOIN", "KEEP", "KERBEROS", "KEY", "KEYFILE", "KEYS", "KEYSIZE", "KILL", "LABEL", "LAST", "LATERAL", "LAYER", "LDAP_REGISTRATION", "LDAP_REGISTRATION_ENABLED", "LDAP_REG_SYNC_INTERVAL", "LEADING", "LEFT", "LESS", "LEVEL", "LEVELS", "LIBRARY", "LIKE", "LIKE2", "LIKE4", "LIKEC", "LIMIT", "LINK", "LIST", "LOB", "LOCAL", "LOCALTIME", "LOCALTIMESTAMP", "LOCATION", "LOCATOR", "LOCK", "LOCKED", "LOG", "LOGFILE", "LOGGING", "LOGICAL", "LOGICAL_READS_PER_CALL", "LOGICAL_READS_PER_SESSION", "LOGOFF", "LOGON", "LONG", "LOOP", "MANAGE", "MANAGED", "MANAGEMENT", "MANUAL", "MAPPING", "MASTER", "MATCHED", "MATERIALIZED", "MAXARCHLOGS", "MAXDATAFILES", "MAXEXTENTS", "MAXINSTANCES", "MAXLOGFILES", "MAXLOGHISTORY", "MAXLOGMEMBERS", "MAXSIZE", "MAXTRANS", "MAXVALUE", "MEMBER", "MEMORY", "MERGE", "METHOD", "MINEXTENTS", "MINIMIZE", "MINIMUM", "MINUS", "MINVALUE", "MLSLABEL", "MODE", "MODIFY", "MONITORING", "MOUNT", "MOVE", "MOVEMENT", "MTS_DISPATCHERS", "MULTISET", "NAMED", "NCHAR", "NCHAR_CS", "NCLOB", "NEEDED", "NESTED", "NESTED_TABLE_ID", "NETWORK", "NEVER", "NEXT", "NLS_CALENDAR", "NLS_CHARACTERSET", "NLS_COMP", "NLS_CURRENCY", "NLS_DATE_FORMAT", "NLS_DATE_LANGUAGE", "NLS_ISO_CURRENCY", "NLS_LANG", "NLS_LANGUAGE", "NLS_LENGTH_SEMANTICS", "NLS_NCHAR_CONV_EXCP", "NLS_NUMERIC_CHARACTERS", "NLS_SORT", "NLS_SPECIAL_CHARS", "NLS_TERRITORY", "NO", "NOARCHIVELOG", "NOAUDIT", "NOCACHE", "NOCOMPRESS", "NOCOPY", "NOCYCLE", "NODELAY", "NOFORCE", "NOLOGGING", "NOMAPPING", "NOMAXVALUE", "NOMINIMIZE", "NOMINVALUE", "NOMONITORING", "NONE", "NOORDER", "NOOVERRIDE", "NOPARALLEL", "NORELY", "NORESETLOGS", "NOREVERSE", "NORMAL", "NOROWDEPENDENCIES", "NOSEGMENT", "NOSORT", "NOSWITCH", "NOT", "NOTHING", "NOVALIDATE", "NOWAIT", "NULL", "NULLS", "NUMBER", "NUMERIC", "NVARCHAR2", "OBJECT", "OBJNO", "OBJNO_REUSE", "OF", "OFF", "OFFLINE", "OID", "OIDINDEX", "OLD", "ON", "ONLINE", "ONLY", "OPAQUE", "OPCODE", "OPEN", "OPERATOR", "OPTIMAL", "OPTIMIZER_GOAL", "OPTION", "OR", "ORDER", "ORGANIZATION", "OTHERS", "OUT", "OUTER", "OUTLINE", "OVER", "OVERFLOW", "OVERLAPS", "OWN", "PACKAGE", "PACKAGES", "PARALLEL", "PARAMETERS", "PARENT", "PARTITION", "PARTITIONS", "PARTITION_HASH", "PARTITION_LIST", "PARTITION_RANGE", "PASSWORD", "PASSWORD_GRACE_TIME", "PASSWORD_LIFE_TIME", "PASSWORD_LOCK_TIME", "PASSWORD_REUSE_MAX", "PASSWORD_REUSE_TIME", "PASSWORD_VERIFY_FUNCTION", "PCTFREE", "PCTINCREASE", "PCTTHRESHOLD", "PCTUSED", "PCTVERSION", "PERCENT", "PERMANENT", "PFILE", "PHYSICAL", "PLAN", "PLSQL_DEBUG", "POLICY", "POST_TRANSACTION", "PRAGMA", "PREBUILT", "PRECEDING", "PRECISION", "PREPARE", "PRESERVE", "PRIMARY", "PRIOR", "PRIVATE", "PRIVATE_SGA", "PRIVILEGE", "PRIVILEGES", "PROCEDURE", "PROFILE", "PROTECTED", "PUBLIC", "PURGE", "PX_GRANULE", "QUERY", "QUEUE", "QUIESCE", "QUOTA", "RANDOM", "RANGE", "RAW", "RBA", "READ", "READS", "REAL", "REBUILD", "RECORDS_PER_BLOCK", "RECOVER", "RECOVERABLE", "RECOVERY", "RECYCLE", "REDUCED", "REF", "REFERENCES", "REFERENCING", "REFRESH", "REGISTER", "REJECT", "REKEY", "RELATIONAL", "RELY", "RENAME", "REPLACE", "RESET", "RESETLOGS", "RESIZE", "RESOLVE", "RESOLVER", "RESOURCE", "RESTRICT", "RESTRICTED", "RESUMABLE", "RESUME", "RETURN", "RETURNING", "REUSE", "REVERSE", "REVOKE", "REWRITE", "RIGHT", "ROLE", "ROLES", "ROLLBACK", "ROLLUP", "ROW", "ROWDEPENDENCIES", "ROWID", "ROWNUM", "ROWS", "ROWTYPE", "RULE", "SAMPLE", "SAVEPOINT", "SB4", "SCAN", "SCAN_INSTANCES", "SCHEMA", "SCN", "SCOPE", "SD_ALL", "SD_INHIBIT", "SD_SHOW", "SECURITY", "SEGMENT", "SEG_BLOCK", "SEG_FILE", "SELECT", "SELECTIVITY", "SEQUENCE", "SEQUENCED", "SERIALIZABLE", "SERVERERROR", "SESSION", "SESSIONS_PER_USER", "SESSIONTIMEZONE", "SESSIONTZNAME", "SESSION_CACHED_CURSORS", "SET", "SETS", "SHARE", "SHARED", "SHARED_POOL", "SHRINK", "SHUTDOWN", "SIBLINGS", "SINGLE", "SINGLETASK", "SIZE", "SKIP", "SKIP_UNUSABLE_INDEXES", "SMALLINT", "SNAPSHOT", "SOME", "SORT", "SOURCE", "SPACE", "SPECIFICATION", "SPFILE", "SPLIT", "SQL_TRACE", "STANDBY", "START", "STARTUP", "STATEMENT_ID", "STATIC", "STATISTICS", "STOP", "STORAGE", "STORE", "STRUCTURE", "SUBPARTITION", "SUBPARTITIONS", "SUBPARTITION_REL", "SUBSTITUTABLE", "SUCCESSFUL", "SUMMARY", "SUPPLEMENTAL", "SUSPEND", "SWITCH", "SWITCHOVER", "SYNONYM", "SYSDATE", "SYSDBA", "SYSOPER", "SYSTEM", "SYSTIMESTAMP", "SYS_OP_BITVEC", "SYS_OP_COL_PRESENT", "SYS_OP_ENFORCE_NOT_NULL$", "SYS_OP_MINE_VALUE", "SYS_OP_NOEXPAND", "SYS_OP_NTCIMG$", "TABLE", "TABLES", "TABLESPACE", "TABLESPACE_NO", "TABNO", "TEMPFILE", "TEMPORARY", "THAN", "THEN", "THREAD", "THROUGH", "TIMEOUT", "TIMESTAMP", "TIMEZONE_ABBR", "TIMEZONE_HOUR", "TIMEZONE_MINUTE", "TIMEZONE_REGION", "TIME_ZONE", "TO", "TOPLEVEL", "TRACE", "TRACING", "TRAILING", "TRANSACTION", "TRANSITIONAL", "TREAT", "TRIGGER", "TRIGGERS", "TRUE", "TRUNCATE", "TX", "TYPE", "TYPES", "TZ_OFFSET", "UB2", "UBA", "UID", "UNARCHIVED", "UNBOUND", "UNBOUNDED", "UNDER", "UNDO", "UNIFORM", "UNION", "UNIQUE", "UNLIMITED", "UNLOCK", "UNPROTECTED", "UNQUIESCE", "UNRECOVERABLE", "UNTIL", "UNUSABLE", "UNUSED", "UPDATABLE", "UPDATE", "UPD_INDEXES", "UPD_JOININDEX", "UPGRADE", "UROWID", "USAGE", "USE", "USER", "USER_DEFINED", "USE_PRIVATE_OUTLINES", "USE_STORED_OUTLINES", "USING", "VALIDATE", "VALIDATION", "VALUES", "VARCHAR", "VARCHAR2", "VARRAY", "VARYING", "VIEW", "WAIT", "WHEN", "WHENEVER", "WHERE", "WHILE", "WITH", "WITHIN", "WITHOUT", "WORK", "WRITE", "XID", "XMLSCHEMA", "XMLTYPE", "ZONE", NULL }; tora-2.1.3/src/toresulttableviewedit.h0000644000175000017500000001320011423626034017637 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTTABLEVIEWEDIT_H #define TORESULTTABLEVIEWEDIT_H #include "config.h" #include "toresulttableview.h" #include "toqvalue.h" #include "tosql.h" #include "toresult.h" #include "toconnection.h" #include "toresultmodel.h" #include #include #include #include #include #include #include /*! \brief Displays query result as a table and provides functionality to edit it. Used in Schema browser tool. */ class toResultTableViewEdit : public toResultTableView { Q_OBJECT; enum ChangeKind { Add, Delete, Update }; struct ChangeSet { ChangeKind kind; /* sql change mode */ QString columnName; /* column name */ int column; /* the real column number * after adjusting for * numbercolumn */ toQValue newValue; /* data after the change */ toResultModel::Row row; /* data before the change */ }; // keep a history of changes to commit. // this is a fifo -- don't sort or insert. just append. QList Changes; //QString Owner; // defined in parent - toResultTableView //QString Table; // defined in parent - toResultTableView void commitDelete(ChangeSet &change, toConnection &conn); void commitAdd(ChangeSet &change, toConnection &conn); void commitUpdate(ChangeSet &change, toConnection &conn); public: /** * Creates a new tableview for editing data * * @param readable use readable headers * @param numberColumn display vertical header * @param parent qobject parent * @param name sets objectName property */ toResultTableViewEdit(bool readable, bool numberColumn, QWidget *parent, const char *name = 0); virtual ~toResultTableViewEdit(void); /** * Reimplemented to create query and new model. * */ virtual void query(const QString &, const toQList ¶ms); /** * Reimplemented to create query and new model. * */ void query(const QString &sql) { toQList p; query(sql, p); } /** * True if data has been modified. * */ bool changed(void) { return Changes.size() > 0; } signals: /** * Parameter is true after changes, false after save or load. * */ void changed(bool edit); public slots: /** * Append change to Changes * */ void recordChange(const QModelIndex &, const toQValue &, const toResultModel::Row &); /** * Append a new row to Changes * */ void recordAdd(const toResultModel::Row &); /** * Record a deletion in Changes * */ void recordDelete(const toResultModel::Row &); /** * Calls Model to add new record. * */ void addRecord(void); /** * Calls Model to add new record. * */ void duplicateRecord(void); /** * Calls Model to delete current record * */ void deleteRecord(void); /** * Writes cached changes to database. * * @param status Should display a status message. * @return success */ bool commitChanges(bool status = true); /** * Handle connection toolbar's commit and rollback. * * @param conn Connection that is committed. * @param cmt true for commit, false for rollback */ void commitChanges(toConnection &conn, bool cmt); /** * Clears Changes * */ void revertChanges(void); /** * Handle signal from model when rows are added * */ void handleNewRows(const QModelIndex &parent, int start, int end); }; #endif tora-2.1.3/src/tosession.h0000644000175000017500000001014111270353625015237 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOSESSION_H #define TOSESSION_H #include "config.h" #include "totool.h" #include "toresultlong.h" #include #include #include #include class QComboBox; class QSplitter; class QTabWidget; class toConnection; class toMain; class toResultBar; class toResultCombo; class toResultLock; class toResultStats; class toResultTableView; class toSGAStatement; class toSessionFilter; class toTreeWidgetItem; class toWaitEvents; #define TO_SESSION_WAIT "toSession:SessionWait" #define TO_SESSION_IO "toSession:SessionIO" class toSession : public toToolWidget { Q_OBJECT toResultTableView *Sessions; QTabWidget *ResultTab; QWidget *CurrentTab; toResultCombo *Select; toSGAStatement *CurrentStatement; toSGAStatement *PreviousStatement; toResultStats *SessionStatistics; toResultLong *LongOps; toResultTableView *ConnectInfo; toResultTableView *LockedObjects; toResultLock *PendingLocks; toResultTableView *AccessedObjects; toResultBar *WaitBar; toResultBar *IOBar; toWaitEvents *Waits; QSplitter *OpenSplitter; QSplitter *StatisticSplitter; toSGAStatement *OpenStatement; toResultTableView *OpenCursors; QString LastSession; QMenu *ToolMenu; QComboBox *Refresh; QLabel *Total; toSessionFilter *SessionFilter; QAction *refreshAct; QAction *enableTimedAct; QAction *disableTimedAct; QAction *disconnectAct; QString Session; QString Serial; void updateSchemas(void); void enableStatistics(bool enable); public: toSession(QWidget *parent, toConnection &connection); virtual bool canHandle(toConnection &conn); public slots: void changeTab(int); void changeItem(); void changeCursor(); void changeRefresh(const QString &str); void refresh(void); void refreshTabs(void); void enableStatistics(void) { enableStatistics(true); } void disableStatistics(void) { enableStatistics(false); } void cancelBackend(void); void disconnectSession(void); void windowActivated(QMdiSubWindow *widget); void done(void); void selectAll(void); void selectNone(void); void filterChanged(const QString &text); }; #ifdef TOEXTENDED_MYSQL #include "tosessionmysql.h" #endif #endif tora-2.1.3/src/toresultstorage.cpp0000644000175000017500000014223411411113467017016 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "tonoblockquery.h" #include "toresulttableview.h" #include "toresultstorage.h" #include "tosql.h" #include "totool.h" #include //Added by qt3to4: #include #include #include // columns count #define FILECOLUMNS 15 #define COLUMNS (FILECOLUMNS-2) // order of the result columns #define COL_NAME 0 #define COL_STATUS 1 #define COL_INFO 2 #define COL_CONTENT 3 #define COL_LOGGING 4 #define COL_SIZE 5 #define COL_FREE_UNIT 6 #define COL_FREE_PERCENT 7 #define COL_AUTOEXT 8 #define COL_USED_FREE_AUTO 9 #define COL_COALESCED 10 #define COL_MAX_FREE 11 #define COL_FREE_FRAGMENTS 12 /*! \brief Item for storage data display and sorting. */ class toResultStorageItem : public toResultViewItem { bool AvailableGraph; public: toResultStorageItem(bool available, toTreeWidget *parent, toTreeWidgetItem *after, const QString &buf = QString::null) : toResultViewItem(parent, after, buf), AvailableGraph(available) { } toResultStorageItem(bool available, toTreeWidgetItem *parent, toTreeWidgetItem *after, const QString &buf = QString::null) : toResultViewItem(parent, after, buf), AvailableGraph(available) { } //! Try to guess real type of the value taken from DB void setSortValue(int col, const QVariant & v) { bool ok; int i = v.toInt(&ok); if (ok) { m_sortValues[col] = i; return; } double d = v.toDouble(&ok); if (ok) { m_sortValues[col] = d; return; } m_sortValues[col] = v; } //! See operator< QVariant sortValue(int i) const { return m_sortValues[i]; } /*! Operator used for sorting. Original operator handles only string-based sorting. Now it supports int and double for numeric columns. */ bool operator<(const QTreeWidgetItem &other) const { int column = treeWidget()->sortColumn(); QVariant v(m_sortValues[column]); const toResultStorageItem * o = dynamic_cast(&other); Q_ASSERT_X(o, "cast", "only toResultStorageItem are supported"); switch (v.type()) { case QVariant::Int: return v.toInt() < o->sortValue(column).toInt(); case QVariant::Double: return v.toDouble() < o->sortValue(column).toDouble(); case QVariant::String: return v.toString() < o->sortValue(column).toString(); default: Q_ASSERT_X(0, "compare", "more comparation is not supported now"); }; } private: //! Store the value used for sorting for every column QHash m_sortValues; }; class toResultStorageItemDelegate: public QItemDelegate { public: toResultStorageItemDelegate() { } void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex & index ) const { if(index.column() == COL_USED_FREE_AUTO ) { int left = option.rect.left(); int top = option.rect.top(); int width = option.rect.width(); int height = option.rect.height(); QString str = index.model()->data(index, Qt::DisplayRole).toString(); QStringList pct = str.split(QRegExp("/")); if (pct.count() == 3) { int w_used = (int) (pct.at(0).toDouble() * width / 100); int w_free = (int) (pct.at(1).toDouble() * width / 100); int w_auto = width - w_used - w_free; painter->fillRect(left, top, w_used, height, QBrush(Qt::darkRed/*Qt::red*/)); painter->fillRect(left + w_used, top, w_free, height, QBrush(Qt::darkGreen/*Qt::green*/)); painter->fillRect(left + w_used + w_free, top, w_auto, height, QBrush(Qt::darkBlue/*Qt::blue*/)); painter->setPen(Qt::white); painter->drawText(option.rect,Qt::TextSingleLine,str); } else { QItemDelegate::paint(painter, option, index); } } else { QItemDelegate::paint(painter, option, index); } } }; bool toResultStorage::canHandle(toConnection &conn) { return toIsOracle(conn); } toResultStorage::toResultStorage(bool available, QWidget *parent, const char *name) : toResultView(false, false, parent, name), AvailableGraph(available) { Unit = toConfigurationSingle::Instance().sizeUnit(); setAllColumnsShowFocus(true); setSortingEnabled(false); // enable it after data fetch setRootIsDecorated(true); addColumn(tr("Name")); addColumn(tr("Status")); addColumn(tr("Information")); addColumn(tr("Contents")); addColumn(tr("Logging")); addColumn(tr("Size (%1)").arg(Unit)); addColumn(tr("Free (%1)").arg(Unit)); addColumn(tr("Free (%)")); addColumn(tr("Autoextend (%1)").arg(Unit)); if (available) addColumn(tr("Used/Free/Autoextend")); else addColumn(tr("Available")); addColumn(tr("Coalesced")); addColumn(tr("Max free (%1)").arg(Unit)); addColumn(tr("Free fragments")); setSQLName(tr("toResultStorage")); setColumnAlignment(COL_SIZE, Qt::AlignRight); setColumnAlignment(COL_FREE_UNIT, Qt::AlignRight); setColumnAlignment(COL_FREE_PERCENT, Qt::AlignRight); setColumnAlignment(COL_AUTOEXT, Qt::AlignCenter); setColumnAlignment(COL_USED_FREE_AUTO, Qt::AlignCenter); setColumnAlignment(COL_COALESCED, Qt::AlignRight); setColumnAlignment(COL_MAX_FREE, Qt::AlignRight); setColumnAlignment(COL_FREE_FRAGMENTS, Qt::AlignRight); ShowCoalesced = false; OnlyFiles = false; Tablespaces = Files = NULL; connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); setItemDelegate(new toResultStorageItemDelegate()); } toResultStorage::~toResultStorage() { delete Tablespaces; delete Files; } static toSQL SQLShowCoalesced("toResultStorage:ShowCoalesced", "SELECT d.tablespace_name,\n" " d.status,\n" " d.extent_management,\n" " d.contents,\n" " d.logging,\n" " TO_CHAR(ROUND(NVL(a.tbs_size,0) / b.unit,2)),\n" " TO_CHAR(ROUND(NVL(f.free_size,0) / b.unit,2)),\n" " TO_CHAR(ROUND(NVL(f.free_size,0)/NVL(a.tbs_size,1)*100)),\n" // free% " TO_CHAR(ROUND(NVL(a.autoextend_size,0) / b.unit,2)),\n" " '-',\n" " TO_CHAR(ROUND(f.percent_extents_coalesced,1))||'%',\n" " '-',\n" " TO_CHAR(f.free_extents)\n" " FROM (SELECT :unt unit FROM sys.dual) b,\n" " sys.dba_tablespaces d\n" " LEFT JOIN (SELECT tablespace_name,\n" " SUM(bytes) tbs_size,\n" " SUM(DECODE(autoextensible,'YES',maxbytes,bytes)) autoextend_size\n" " FROM sys.dba_data_files\n" " GROUP BY tablespace_name) a\n" " ON d.tablespace_name = a.tablespace_name\n" " LEFT JOIN (SELECT tablespace_name,\n" " total_bytes free_size,\n" " total_extents free_extents,\n" " percent_extents_coalesced\n" " FROM sys.dba_free_space_coalesced) f\n" " ON d.tablespace_name = f.tablespace_name\n" " WHERE NOT (d.extent_management like 'LOCAL' AND d.contents like 'TEMPORARY')\n" " UNION ALL\n" "SELECT d.tablespace_name,\n" " d.status,\n" " d.extent_management,\n" " d.contents,\n" " d.logging,\n" " TO_CHAR(ROUND(NVL(a.tbs_size,0) / b.unit,2)),\n" " TO_CHAR(ROUND(NVL(f.free_size,0) / b.unit,2)),\n" " TO_CHAR(ROUND(NVL(f.free_size,0)/NVL(a.tbs_size,1)*100)),\n" // free% " TO_CHAR(ROUND(NVL(a.autoextend_size,0) / b.unit,2)),\n" " '-',\n" " '-',\n" " TO_CHAR(ROUND(NVL(f.max_free,0) / b.unit,2)),\n" " TO_CHAR(f.total_extents)\n" " FROM (SELECT :unt unit FROM sys.dual) b,\n" " sys.dba_tablespaces d\n" " LEFT JOIN (SELECT tablespace_name,\n" " SUM(bytes) tbs_size,\n" " SUM(DECODE(autoextensible,'YES',maxbytes,bytes)) autoextend_size\n" " FROM sys.dba_temp_files\n" " GROUP BY tablespace_name) a\n" " ON d.tablespace_name = a.tablespace_name\n" " LEFT JOIN (SELECT tablespace_name,\n" " SUM(bytes_cached) free_size,\n" " COUNT(1) total_extents,\n" " MAX(bytes_cached) max_free\n" " FROM v$temp_extent_pool\n" " GROUP BY tablespace_name) f\n" " ON d.tablespace_name = f.tablespace_name\n" " WHERE d.extent_management = 'LOCAL' AND d.contents = 'TEMPORARY'\n", "Display storage usage of database. This includes the coalesced columns which may make the query sluggish on some DB:s. " "All columns must be present in output (Should be 12)", "0801"); static toSQL SQLShowCoalesced8("toResultStorage:ShowCoalesced", "SELECT d.tablespace_name,\n" " d.status,\n" " ' ',\n" " d.contents,\n" " d.logging,\n" " TO_CHAR(ROUND(NVL(a.bytes / b.unit, 0),2)),\n" " TO_CHAR(ROUND(NVL(f.bytes,0) / b.unit,2)),\n" " TO_CHAR(ROUND(NVL(f.bytes,0)/NVL(a.bytes,1)*100)),\n" // free% " TO_CHAR(ROUND(NVL(a.maxbytes / b.unit, 0),2)),\n" " '-',\n" " TO_CHAR(ROUND(f.percent_extents_coalesced,1))||'%',\n" " '-',\n" " TO_CHAR(f.total_extents)\n" " FROM sys.dba_tablespaces d,\n" " (select tablespace_name, sum(bytes) bytes, sum(maxbytes) maxbytes from sys.dba_data_files group by tablespace_name) a,\n" " (select tablespace_name, total_bytes bytes, total_extents, percent_extents_coalesced from sys.dba_free_space_coalesced) f,\n" " (select :unt unit from sys.dual) b\n" " WHERE d.tablespace_name = a.tablespace_name(+)\n" " AND d.tablespace_name = f.tablespace_name(+)\n" " ORDER BY d.tablespace_name", "", "0800"); static toSQL SQLShowCoalesced7("toResultStorage:ShowCoalesced", "SELECT d.tablespace_name,\n" " d.status,\n" " ' ',\n" " d.contents,\n" " 'N/A',\n" " TO_CHAR(ROUND(NVL(a.bytes / b.unit, 0),2)),\n" " TO_CHAR(ROUND(NVL(f.bytes,0) / b.unit,2)),\n" " TO_CHAR(ROUND(NVL(f.bytes,0)/NVL(a.bytes,1)*100)),\n" // free% " '-',\n" " '-',\n" " TO_CHAR(ROUND(f.percent_extents_coalesced,1))||'%',\n" " '-',\n" " TO_CHAR(f.total_extents)\n" " FROM sys.dba_tablespaces d,\n" " (select tablespace_name, sum(bytes) bytes from sys.dba_data_files group by tablespace_name) a,\n" " (select tablespace_name, total_bytes bytes, total_extents, percent_extents_coalesced from sys.dba_free_space_coalesced) f,\n" " (select :unt unit from sys.dual) b\n" " WHERE d.tablespace_name = a.tablespace_name(+)\n" " AND d.tablespace_name = f.tablespace_name(+)\n" " ORDER BY d.tablespace_name", "", "0703"); static toSQL SQLNoShowCoalesced( "toResultStorage:NoCoalesced", "SELECT d.tablespace_name,\n" " d.status,\n" " d.extent_management,\n" " d.CONTENTS,\n" " d.LOGGING,\n" " TO_CHAR ( ROUND ( NVL ( s.tbs_size,\n" " 0 ) / b.unit,\n" " 2 ) ),\n" " TO_CHAR ( ROUND ( NVL ( f.free_size,\n" " 0 ) / b.unit,\n" " 2 ) ),\n" " TO_CHAR(ROUND(NVL(f.free_size,0)/NVL(s.tbs_size,1)*100)),\n" // free% " TO_CHAR ( ROUND ( NVL ( s.autoextend_size,\n" " 0 ) / b.unit,\n" " 2 ) ),\n" " '-',\n" " '-',\n" " TO_CHAR ( ROUND ( NVL ( f.max_free,\n" " 0 ) / b.unit,\n" " 2 ) ),\n" " TO_CHAR ( f.free_extents )\n" " FROM ( SELECT :unt unit\n" " FROM sys.dual ) b,\n" " sys.dba_tablespaces d,\n" " ( SELECT tablespace_name,\n" " SUM ( bytes ) tbs_size,\n" " SUM ( DECODE ( autoextensible,\n" " 'YES',\n" " maxbytes,\n" " bytes ) ) autoextend_size\n" " FROM sys.dba_data_files\n" " GROUP BY tablespace_name\n" " UNION ALL SELECT tablespace_name,\n" " SUM ( bytes ) tbs_size,\n" " SUM ( DECODE ( autoextensible,\n" " 'YES',\n" " maxbytes,\n" " bytes ) ) autoextend_size\n" " FROM sys.dba_temp_files\n" " GROUP BY tablespace_name ) s,\n" " ( SELECT tablespace_name,\n" " SUM ( bytes ) free_size,\n" " MAX ( bytes ) max_free,\n" " COUNT ( 1 ) free_extents\n" " FROM sys.dba_free_space\n" " GROUP BY tablespace_name\n" " UNION ALL SELECT tablespace_name,\n" " SUM ( bytes_cached ) free_size,\n" " MAX ( bytes_cached ) max_free,\n" " COUNT ( 1 ) free_extents\n" " FROM v$temp_extent_pool\n" " GROUP BY tablespace_name ) f\n" " WHERE d.tablespace_name = s.tablespace_name ( + )\n" " AND d.tablespace_name = f.tablespace_name ( + )", "Display storage usage of database. This does not include the coalesced " "columns which may make the query sluggish on some DB:s. " "All columns must be present in output (Should be 12)", "0801"); static toSQL SQLNoShowCoalesced8("toResultStorage:NoCoalesced", "SELECT d.tablespace_name,\n" " d.status,\n" " ' ',\n" " d.contents,\n" " d.logging,\n" " TO_CHAR(ROUND(NVL(a.bytes,0) / b.unit,2)),\n" " TO_CHAR(ROUND(NVL(f.bytes,0) / b.unit,2)),\n" " TO_CHAR(ROUND(NVL(f.bytes,0)/NVL(a.bytes,1)*100)),\n" // free% " TO_CHAR(ROUND(NVL(a.maxbytes,0) / b.unit,2)),\n" " '-',\n" " '-',\n" " TO_CHAR(ROUND(NVL(f.maxbytes,0) / b.unit,2)),\n" " TO_CHAR(f.total_extents)\n" " FROM sys.dba_tablespaces d,\n" " (select tablespace_name, sum(bytes) bytes, sum(maxbytes) maxbytes from sys.dba_data_files group by tablespace_name) a,\n" " (select tablespace_name, NVL(sum(bytes),0) bytes, count(1) total_extents, NVL(max(bytes),0) maxbytes from sys.dba_free_space group by tablespace_name) f,\n" " (select :unt unit from sys.dual) b\n" " WHERE d.tablespace_name = a.tablespace_name(+)\n" " AND d.tablespace_name = f.tablespace_name(+)\n" " ORDER BY d.tablespace_name", "", "0800"); static toSQL SQLNoShowCoalesced7("toResultStorage:NoCoalesced", "SELECT d.tablespace_name,\n" " d.status,\n" " ' ',\n" " d.contents,\n" " 'N/A',\n" " TO_CHAR(ROUND(NVL(a.bytes,0) / b.unit,2)),\n" " TO_CHAR(ROUND(NVL(f.bytes,0) / b.unit,2)),\n" " TO_CHAR(ROUND(NVL(f.bytes,0)/NVL(a.bytes,1)*100)),\n" // free% " '-',\n" " '-',\n" " '-',\n" " TO_CHAR(ROUND(NVL(f.maxbytes,0) / b.unit,2)),\n" " TO_CHAR(f.total_extents)\n" " FROM sys.dba_tablespaces d,\n" " (select tablespace_name, sum(bytes) bytes from sys.dba_data_files group by tablespace_name) a,\n" " (select tablespace_name, NVL(sum(bytes),0) bytes, count(1) total_extents, NVL(max(bytes),0) maxbytes from sys.dba_free_space group by tablespace_name) f,\n" " (select :unt unit from sys.dual) b\n" " WHERE d.tablespace_name = a.tablespace_name(+)\n" " AND d.tablespace_name = f.tablespace_name(+)\n" " ORDER BY d.tablespace_name", "", "0703"); static toSQL SQLDatafile( "toResultStorage:Datafile", "SELECT d.tablespace_name,\n" " v.name,\n" " v.status,\n" " v.enabled,\n" " ' ',\n" " ' ',\n" " to_char ( round ( d.bytes / b.unit,\n" " 2 ) ),\n" " to_char ( round ( s.bytes / b.unit,\n" " 2 ) ),\n" " TO_CHAR(ROUND(NVL(s.bytes,0)/NVL(d.bytes,1)*100)),\n" // free% " to_char ( round ( d.maxbytes / b.unit,\n" " 2 ) ),\n" " '-',\n" " ' ',\n" " to_char ( round ( s.maxbytes / b.unit,\n" " 2 ) ),\n" " to_char ( s.num ),\n" " NULL,\n" // Used to fill in tablespace name " v.file#\n" // Needed by toStorage to work " FROM ( SELECT :unt unit\n" " FROM sys.dual ) b,\n" " sys.dba_data_files d\n" " JOIN v$datafile v\n" " ON d.file_id = v.file#\n" " LEFT JOIN\n" " ( SELECT file_id,\n" " NVL ( SUM ( bytes ),\n" " 0 ) bytes,\n" " COUNT ( 1 ) num,\n" " NVL ( MAX ( bytes ),\n" " 0 ) maxbytes\n" " FROM sys.dba_free_space\n" " GROUP BY file_id ) s\n" " ON s.file_id = d.file_id\n" " UNION ALL SELECT d.tablespace_name,\n" " v.name,\n" " v.status,\n" " v.enabled,\n" " ' ',\n" " ' ',\n" " to_char ( round ( d.bytes / b.unit,\n" " 2 ) ),\n" " to_char ( round ( ( d.user_bytes - t.bytes_cached ) / b.unit,\n" " 2 ) ),\n" " TO_CHAR(ROUND(NVL(d.user_bytes - t.bytes_cached,0)/NVL(d.bytes,1)*100)),\n" // free% " to_char ( round ( d.maxbytes / b.unit,\n" " 2 ) ),\n" " '-',\n" " ' ',\n" " ' ',\n" " '1',\n" " NULL,\n" " v.file#\n" " FROM ( SELECT :unt unit\n" " FROM sys.dual ) b,\n" " sys.dba_temp_files d\n" " JOIN v$tempfile v\n" " ON d.file_id = v.file#\n" " LEFT JOIN v$temp_extent_pool t\n" " ON t.file_id = d.file_id", "Display information about a datafile in a tablespace. " "All columns must be present in the output (Should be 14)", "0900"); static toSQL SQLDatafile8( "toResultStorage:Datafile", "SELECT d.tablespace_name,\n" " v.name,\n" " v.status,\n" " v.enabled,\n" " ' ',\n" " ' ',\n" " to_char ( round ( d.bytes / b.unit,\n" " 2 ) ),\n" " to_char ( round ( s.bytes / b.unit,\n" " 2 ) ),\n" " TO_CHAR(ROUND(NVL(s.bytes,0)/NVL(d.bytes,1)*100)),\n" // free% " to_char ( round ( d.maxbytes / b.unit,\n" " 2 ) ),\n" " '-',\n" " ' ',\n" " to_char ( round ( s.maxbytes / b.unit,\n" " 2 ) ),\n" " to_char ( s.num ),\n" " NULL,\n" // Used to fill in tablespace name " v.file#\n" // Needed by toStorage to work " FROM ( SELECT :unt unit\n" " FROM sys.dual ) b,\n" " sys.dba_data_files d,\n" " v$datafile v,\n" " ( SELECT file_id,\n" " NVL ( SUM ( bytes ),\n" " 0 ) bytes,\n" " COUNT ( 1 ) num,\n" " NVL ( MAX ( bytes ),\n" " 0 ) maxbytes\n" " FROM sys.dba_free_space\n" " GROUP BY file_id ) s\n" " WHERE d.file_id = v.file#\n" " AND d.file_id = s.file_id ( + )\n" " UNION ALL SELECT d.tablespace_name,\n" " v.name,\n" " v.status,\n" " v.enabled,\n" " ' ',\n" " ' ',\n" " to_char ( round ( d.bytes / b.unit,\n" " 2 ) ),\n" " to_char ( round ( ( d.user_bytes - t.bytes_cached ) / b.unit,\n" " 2 ) ),\n" " TO_CHAR(ROUND(NVL(d.user_bytes - t.bytes_cached,0)/NVL(d.bytes,1)*100)),\n" // free% " to_char ( round ( d.maxbytes / b.unit,\n" " 2 ) ),\n" " '-',\n" " ' ',\n" " ' ',\n" " '1',\n" " NULL,\n" " v.file#\n" " FROM ( SELECT :unt unit\n" " FROM sys.dual ) b,\n" " sys.dba_temp_files d,\n" " v$tempfile v,\n" " v$temp_extent_pool t\n" " WHERE d.file_id = v.file#\n" " AND t.file_id = d.file_id ( + )", "", "0800"); static toSQL SQLDatafile7("toResultStorage:Datafile", "SELECT d.tablespace_name,\n" " v.name,\n" " v.status,\n" " v.enabled,\n" " ' ',\n" " ' ',\n" " to_char(round(d.bytes/b.unit,2)),\n" " to_char(round(s.bytes/b.unit,2)),\n" " TO_CHAR(ROUND(NVL(s.bytes,0)/NVL(d.bytes,1)*100)),\n" // free% " '-',\n" " '-',\n" " ' ',\n" " to_char(round(s.maxbytes/b.unit,2)),\n" " to_char(s.num),\n" " NULL,\n" " v.file#\n" " FROM sys.dba_data_files d,\n" " v$datafile v,\n" " (SELECT file_id, NVL(SUM(bytes),0) bytes, COUNT(1) num,NVL(MAX(bytes),0) maxbytes FROM sys.dba_free_space GROUP BY file_id) s,\n" " (select :unt unit from sys.dual) b\n" " WHERE (s.file_id (+)= d.file_id)\n" " AND (d.file_name = v.name)", "", "0703"); void toResultStorage::saveSelected(void) { toTreeWidgetItem *item = selectedItem(); if (item) { if (item->parent() || OnlyFiles) { CurrentSpace = item->text(COLUMNS); CurrentFile = item->text(0); } else { CurrentSpace = item->text(0); CurrentFile = QString::null; } } } void toResultStorage::query(void) { if (!handled() || Tablespaces || Files) return ; try { saveSelected(); clear(); toConnection &conn = connection(); toQList args; toPush(args, toQValue(toSizeDecode(Unit))); TablespaceValues.clear(); FileValues.clear(); Tablespaces = new toNoBlockQuery(conn, toQuery::Background, toSQL::string(ShowCoalesced ? SQLShowCoalesced : SQLNoShowCoalesced, connection()), args); Files = NULL; Files = new toNoBlockQuery(conn, toQuery::Background, toSQL::string(SQLDatafile, connection()), args); Poll.start(100); } TOCATCH } void toResultStorage::updateList(void) { setSortingEnabled(false); // enable it after data fetch clear(); if (!OnlyFiles) { for (std::list::iterator j = TablespaceValues.begin();j != TablespaceValues.end();) { toResultStorageItem *tablespace = new toResultStorageItem(AvailableGraph, this, NULL); for (int i = 0;i < COLUMNS && j != TablespaceValues.end();i++, j++) { if (i == COL_USED_FREE_AUTO) continue; tablespace->setText(i, *j); tablespace->setSortValue(i, *j); } // To fill Used/Free/Autoextend column double total = tablespace->text(COL_FREE_PERCENT).toDouble(); double user = tablespace->text(COL_SIZE).toDouble(); double free = tablespace->text(COL_FREE_UNIT).toDouble(); if (total < user ) total = user; user /= total; free /= total; QString t; // t.sprintf("%05.1f / %05.1f / %05.1f%%", (user-free)*100, free*100, (1 - user)*100); // spaces seems better than 0-filling... t.sprintf("%#5.1f / %#5.1f / %#5.1f%%", (user-free)*100, free*100, (1 - user)*100); tablespace->setText(COL_USED_FREE_AUTO, t); tablespace->setSortValue(COL_USED_FREE_AUTO, (user-free)*100); // end of Used/Free/Autoextend column if (CurrentSpace == tablespace->text(0)) { if (CurrentFile.isEmpty()) tablespace->setSelected(true); } } } for (std::list::iterator k = FileValues.begin();k != FileValues.end();) { QString name = *k; k++; toTreeWidgetItem *file; toTreeWidgetItem *tablespace = NULL; if (OnlyFiles) { file = new toResultStorageItem(AvailableGraph, this, NULL); } else { for (tablespace = firstChild();tablespace && tablespace->text(0) != name;tablespace = tablespace->nextSibling()) ; if (!tablespace) { if (Files) break; } file = new toResultStorageItem(AvailableGraph, tablespace, NULL); } for (int i = 0;i < FILECOLUMNS && k != FileValues.end();i++, k++) { file->setText(i, *k); reinterpret_cast(file)->setSortValue(i, *k); } file->setText(COLUMNS, name); reinterpret_cast(file)->setSortValue(COLUMNS, name); if (CurrentSpace == file->text(COLUMNS) && CurrentFile == file->text(0)) { if (tablespace) tablespace->setOpen(true); setSelected(file, true); } } setSortingEnabled(true); } void toResultStorage::poll(void) { try { if (!toCheckModal(this)) return ; if (Tablespaces && Tablespaces->poll()) { int cols = Tablespaces->describe().size(); while (Tablespaces->poll() && !Tablespaces->eof()) { for (int i = 0;i < cols && !Tablespaces->eof();i++) toPush(TablespaceValues, QString(Tablespaces->readValue())); } updateList(); if (Tablespaces->eof()) { delete Tablespaces; Tablespaces = NULL; } } if (Files && Files->poll()) { int cols = Files->describe().size(); while (Files->poll() && !Files->eof()) { for (int i = 0;i < cols && !Files->eof();i++) toPush(FileValues, QString(Files->readValue())); } if (Files->eof()) { delete Files; Files = NULL; } } if (Tablespaces == NULL && Files == NULL) { updateList(); Poll.stop(); } } catch (const QString &exc) { delete Tablespaces; Tablespaces = NULL; delete Files; Files = NULL; Poll.stop(); toStatusMessage(exc); } } QString toResultStorage::currentTablespace(void) { toTreeWidgetItem *item = selectedItem(); if (!item) throw tr("No tablespace selected"); QString name; if (item->parent() || OnlyFiles) name = item->text(COLUMNS); else name = item->text(0); if (name.isEmpty()) throw tr("Weird, empty tablespace name"); return name; } QString toResultStorage::currentFilename(void) { toTreeWidgetItem *item = selectedItem(); if (!item || (!item->parent() && !OnlyFiles)) throw tr("No file selected"); QString name = item->text(0); return name; } void toResultStorage::setOnlyFiles(bool only) { saveSelected(); if (only && !OnlyFiles) { addColumn(tr("Tablespace")); setRootIsDecorated(false); } else if (!only && OnlyFiles) { // removing columns doesn't work with qtreewidget // removeColumn(columns() - 1); todo setRootIsDecorated(true); } OnlyFiles = only; updateList(); } toStorageExtent::extentName::extentName(const QString &owner, const QString &table, const QString &partition, int size) : Owner(owner), Table(table), Partition(partition) { Size = size; } bool toStorageExtent::extentTotal::operator < (const toStorageExtent::extentTotal &ext) const { if (fileView ) { if (LastBlock < ext.LastBlock) return true; return false; } else { if (Owner < ext.Owner) return true; if (Owner > ext.Owner) return false; if (Table < ext.Table) return true; if (Table > ext.Table) return false; if (Partition < ext.Partition) return true; return false; } } bool toStorageExtent::extentName::operator == (const toStorageExtent::extentName &ext) const { return Owner == ext.Owner && Table == ext.Table && (Partition == ext.Partition || ext.Partition.isNull()); } toStorageExtent::extent::extent(const QString &owner, const QString &table, const QString &partition, int file, int block, int size) : extentName(owner, table, partition, size) { File = file; Block = block; } bool toStorageExtent::extent::operator < (const toStorageExtent::extent &ext) const { if (File < ext.File) return true; if (File > ext.File) return false; if (Block < ext.Block) return true; return false; } bool toStorageExtent::extent::operator == (const toStorageExtent::extent &ext) const { return Owner == ext.Owner && Table == ext.Table && Partition == ext.Partition && File == ext.File && Block == ext.Block && Size == ext.Size; } toStorageExtent::toStorageExtent(QWidget *parent, const char *name) : QWidget(parent) { setObjectName(name); QPalette pal = palette(); pal.setColor(backgroundRole(), Qt::white); setPalette(pal); } void toStorageExtent::highlight(const QString &owner, const QString &table, const QString &partition) { Highlight.Owner = owner; Highlight.Table = table; Highlight.Partition = partition; update(); } static toSQL SQLObjectsFile("toStorageExtent:ObjectsFile", "SELECT owner,\n" " segment_name,\n" " partition_name,\n" " file_id,\n" " block_id,\n" " blocks\n" " FROM sys.dba_extents\n" " WHERE tablespace_name = :tab\n" " AND file_id = :fil", "Get objects in a datafile, must have same columns and binds", "0800"); static toSQL SQLObjectsFile7("toStorageExtent:ObjectsFile", "SELECT owner,\n" " segment_name,\n" " NULL,\n" " file_id,\n" " block_id,\n" " blocks\n" " FROM sys.dba_extents\n" " WHERE tablespace_name = :tab\n" " AND file_id = :fil", "", "0703"); static toSQL SQLObjectsTablespace("toStorageExtent:ObjectsTablespace", "SELECT owner,\n" " segment_name,\n" " partition_name,\n" " file_id,\n" " block_id,\n" " blocks\n" " FROM sys.dba_extents WHERE tablespace_name = :tab", "Get objects in a tablespace, must have same columns and binds", "0800"); static toSQL SQLObjectsTablespace7("toStorageExtent:ObjectsTablespace", "SELECT owner,\n" " segment_name,\n" " NULL,\n" " file_id,\n" " block_id,\n" " blocks\n" " FROM sys.dba_extents WHERE tablespace_name = :tab", "", "0703"); static toSQL SQLTableTablespace("toStorageExtent:TableTablespace", "SELECT MAX(tablespace_name)\n" " FROM (SELECT tablespace_name FROM sys.all_all_tables\n" " WHERE owner = :own AND table_name = :tab\n" " UNION\n" " SELECT i.tablespace_name\n" " FROM sys.all_indexes i,\n" " sys.all_constraints c,\n" " sys.all_all_tables t\n" " WHERE t.owner = :own AND t.table_name = :tab\n" " AND i.table_name = t.table_name AND i.owner = t.owner\n" " AND c.constraint_name = i.index_name AND c.owner = i.owner\n" " AND c.constraint_type = 'P')", "Get the tablespace of a table"); static toSQL SQLTableTablespace7("toStorageExtent:TableTablespace", "SELECT tablespace_name FROM sys.all_tables\n" " WHERE owner = :own AND table_name = :tab", "", "0703"); static toSQL SQLFileBlocks("toStorageExtent:FileSize", "SELECT file_id,blocks FROM sys.dba_data_files\n" " WHERE tablespace_name = :tab\n" " AND file_id = :fil\n" " ORDER BY file_id", "Get blocks for datafiles, must have same columns and binds"); static toSQL SQLTablespaceBlocks("toStorageExtent:TablespaceSize", "SELECT file_id,blocks FROM sys.dba_data_files\n" " WHERE tablespace_name = :tab" " ORDER BY file_id", "Get blocks for tablespace datafiles, must have same columns and binds"); void toStorageExtent::setTablespace(const QString &tablespace) { fileView = false; try { if (Tablespace == tablespace) return ; Tablespace = tablespace; toBusy busy; Extents.clear(); FileOffset.clear(); toQuery query(toCurrentConnection(this), SQLObjectsTablespace, tablespace); // It's used to keep UI "non-freezed". // OK, there are better query classes for it but it's enough for now. // TODO: rewrite data fetching for this tool int progressMax = 1000; int progressCurr = 1; QProgressDialog progress("Reading Objects...", "Abort", 0, progressMax, this); extent cur; while (!query.eof()) { if (progressCurr > (progressMax-1)) progressCurr = 0; if (progressCurr % 200 == 0) { progress.setValue(progressCurr); QCoreApplication::processEvents(); } if (progress.wasCanceled()) { Extents.clear(); break; } ++progressCurr; cur.Owner = query.readValueNull(); cur.Table = query.readValueNull(); cur.Partition = query.readValueNull(); cur.File = query.readValueNull().toInt(); cur.Block = query.readValueNull().toInt(); cur.Size = query.readValueNull().toInt(); toPush(Extents, cur); } toQuery blocks(toCurrentConnection(this), SQLTablespaceBlocks, tablespace); Total = 0; while (!blocks.eof()) { int id = blocks.readValueNull().toInt(); FileOffset[id] = Total; Total += blocks.readValueNull().toInt(); } } TOCATCH Extents.sort(); update(); } void toStorageExtent::setFile(const QString &tablespace, int file) { fileView = true; try { toBusy busy; Extents.clear(); FileOffset.clear(); toQuery query(toCurrentConnection(this), SQLObjectsFile, tablespace, QString::number(file)); extent cur; int progressMax = 1000; int progressCurr = 1; QProgressDialog progress("Reading Objects...", "Abort", 0, progressMax, this); while (!query.eof()) { if (progressCurr > (progressMax-1)) progressCurr = 0; if (progressCurr % 200 == 0) { progress.setValue(progressCurr); QCoreApplication::processEvents(); } if (progress.wasCanceled()) { Extents.clear(); break; } ++progressCurr; cur.Owner = query.readValueNull(); cur.Table = query.readValueNull(); cur.Partition = query.readValueNull(); cur.File = query.readValueNull().toInt(); cur.Block = query.readValueNull().toInt(); cur.Size = query.readValueNull().toInt(); toPush(Extents, cur); } toQuery blocks(toCurrentConnection(this), SQLFileBlocks, tablespace, QString::number(file)); Total = 0; while (!blocks.eof()) { int id = blocks.readValueNull().toInt(); FileOffset[id] = Total; Total += blocks.readValueNull().toInt(); } } TOCATCH Extents.sort(); update(); } void toStorageExtent::paintEvent(QPaintEvent *) { QPainter paint(this); if ( FileOffset.empty() ) return ; QFontMetrics fm = paint.fontMetrics(); int offset = 2 * fm.lineSpacing(); // prevent the crash when user wants it smaller (by splitter) setMinimumHeight(offset + 20); double lineblocks = Total / (height() - offset - FileOffset.size() + 1); paint.fillRect(0, 0, width(), offset, palette().window()); paint.drawText(0, 0, width(), offset, Qt::AlignLeft | Qt::AlignTop, tr("Files: %1").arg(FileOffset.size())); paint.drawText(0, 0, width(), offset, Qt::AlignRight | Qt::AlignTop, tr("Extents: %1").arg(Extents.size())); if (!Tablespace.isNull()) paint.drawText(0, 0, width(), offset, Qt::AlignCenter | Qt::AlignTop, tr("Tablespace: %1").arg(Tablespace)); paint.drawText(0, 0, width(), offset, Qt::AlignLeft | Qt::AlignBottom, tr("Blocks: %1").arg(Total)); paint.drawText(0, 0, width(), offset, Qt::AlignRight | Qt::AlignBottom, tr("Blocks/line: %1").arg(int(lineblocks))); for (std::list::iterator i = Extents.begin();i != Extents.end();i++) { QColor col("#469446"); //= Qt::darkGreen; if (extentName(*i) == Highlight) col = Qt::red; int fileo = 0; for (std::map::iterator j = FileOffset.begin();j != FileOffset.end();j++, fileo++) if ((*j).first == (*i).File) break; int block = FileOffset[(*i).File] + (*i).Block; int y1 = int(block / lineblocks); int x1 = int((block / lineblocks - y1) * width()); block += (*i).Size; int y2 = int(block / lineblocks); int x2 = int((block / lineblocks - y2) * width()); paint.setPen(col); if (y1 != y2) { paint.drawLine(x1, y1 + offset + fileo, width() - 1, y1 + offset + fileo); paint.drawLine(0, y2 + offset + fileo, x2 - 1, y2 + offset + fileo); if (y1 + 1 != y2) paint.fillRect(0, y1 + 1 + offset + fileo, width(), y2 - y1 - 1, col); } else paint.drawLine(x1, y1 + offset + fileo, x2, y2 + offset + fileo); } std::map::iterator j = FileOffset.begin(); j++; paint.setPen(Qt::black); int fileo = offset; while (j != FileOffset.end()) { int block = (*j).second; int y1 = int(block / lineblocks); int x1 = int((block / lineblocks - y1) * width()); paint.drawLine(x1, y1 + fileo, width() - 1, y1 + fileo); if (x1 != 0) paint.drawLine(0, y1 + 1 + fileo, x1 - 1, y1 + fileo + 1); j++; fileo++; } } std::list toStorageExtent::objects(void) { std::list ret; for (std::list::iterator i = Extents.begin();i != Extents.end();i++) { bool dup = false; for (std::list::iterator j = ret.begin();j != ret.end();j++) { if ((*j) == (*i)) { (*j).Size += (*i).Size; (*j).Extents++; (*j).LastBlock = ( ((*j).LastBlock > (*i).Block) ? (*j).LastBlock : (*i).Block ); dup = true; break; } } if (!dup) toPush(ret, extentTotal((*i).Owner, (*i).Table, (*i).Partition, (*i).Block, (*i).Size)); } ret.sort(); return ret; } static toSQL SQLListExtents("toResultStorage:ListExtents", "SELECT * \n" " FROM SYS.DBA_EXTENTS WHERE OWNER = :f1 AND SEGMENT_NAME = :f2\n" " ORDER BY block_id", "List the extents of a table in a schema.", "" , "Oracle"); toResultExtent::toResultExtent(QWidget *parent, const char *name) : QSplitter(Qt::Vertical, parent) { setObjectName(name); Graph = new toStorageExtent(this); List = new toResultTableView(true, false, this); List->setSQL(SQLListExtents); setChildrenCollapsible(false); } bool toResultExtent::canHandle(toConnection &conn) { return toIsOracle(conn); } void toResultExtent::query(const QString &sql, const toQList ¶ms) { try { if (!handled()) return ; if (!setSQLParams(sql, params)) return ; toQList::const_iterator i = params.begin(); if (i == params.end()) return ; QString owner = (*i); i++; if (i == params.end()) return ; QString table = (*i); List->changeParams(owner, table); toQList res = toQuery::readQueryNull(connection(), SQLTableTablespace, owner, table); Graph->setTablespace(toShift(res)); Graph->highlight(owner, table, QString::null); } TOCATCH } bool toStorageExtent::fileView; tora-2.1.3/src/tooracleextract.h0000644000175000017500000005355111275063075016432 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TO_ORACLEEXTRACT #define TO_ORACLEEXTRACT #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "toextract.h" #include "tosql.h" #include "totool.h" #include #include // Some convenient defines static const QString ORACLE_NAME("Oracle"); #define CONNECTION (ext.connection()) #define QUOTE(x) (ext.connection().quote(x)) #define PROMPT (ext.getPrompt()) #define addDescription toExtract::addDescription class toOracleExtract : public toExtract::extractor { std::list oracle_datatypes; // Misc utility functions void clearFlags(toExtract &ext) const; QString displaySource(toExtract &ext, const QString &schema, const QString &owner, const QString &name, const QString &type, bool describe) const; QString keyColumns(toExtract &ext, const QString &owner, const QString &name, const QString &type, const QString &table) const; QString partitionKeyColumns(toExtract &ext, const QString &owner, const QString &name, const QString &type) const; static QString prepareDB(const QString &data); QString segments(toExtract &ext) const; QString segments(toExtract &ext, const toSQL &sql) const; QString subPartitionKeyColumns(toExtract &ext, const QString &owner, const QString &name, const QString &type) const; // Create utility functions QString constraintColumns(toExtract &ext, const QString &owner, const QString &name) const; QString createComments(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createContextPrefs(toExtract &ext, const QString &schema, const QString &owner, const QString &name, const QString &sql) const; QString createIOT(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createMView(toExtract &ext, const QString &schema, const QString &owner, const QString &name, const QString &type) const; QString createMViewIndex(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createMViewLog(toExtract &ext, const QString &schema, const QString &owner, const QString &name, const QString &type) const; QString createMViewTable(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createPartitionedIOT(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createPartitionedIndex(toExtract &ext, const QString &schema, const QString &owner, const QString &name, const QString &sql) const; QString createPartitionedTable(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createTableText(toExtract &ext, toQList &result, const QString &schema, const QString &owner, const QString &name) const; QString grantedPrivs(toExtract &ext, const QString &dest, const QString &name, int typ) const; QString indexColumns(toExtract &ext, const QString &indent, const QString &owner, const QString &name) const; QString rangePartitions(toExtract &ext, const QString &owner, const QString &name, const QString &subPartitionType, const QString &caller) const; QString segmentAttributes(toExtract &ext, toQList &result) const; QString tableColumns(toExtract &ext, const QString &owner, const QString &name) const; // Describe utility functions void describeAttributes(toExtract &ext, std::list &dsp, std::list &ctx, toQList &result) const; void describeComments(toExtract &ext, std::list &lst, std::list &ctx, const QString &owner, const QString &name) const; void describePrivs(toExtract &ext, std::list &lst, std::list &ctx, const QString &name) const; void describeIOT(toExtract &ext, std::list &lst, std::list &ctx, const QString &schema, const QString &owner, const QString &name) const; void describeIndexColumns(toExtract &ext, std::list &lst, std::list &ctx, const QString &owner, const QString &name) const; void describeMView(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name, const QString &type) const; void describeMViewIndex(toExtract &ext, std::list &lst, std::list &ctx, const QString &schema, const QString &owner, const QString &name) const; void describeMViewLog(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name, const QString &type) const; void describeMViewTable(toExtract &ext, std::list &lst, std::list &ctx, const QString &schema, const QString &owner, const QString &name) const; void describePartitions(toExtract &ext, std::list &lst, std::list &ctx, const QString &owner, const QString &name, const QString &subPartitionType, const QString &caller) const; void describePartitionedIOT(toExtract &ext, std::list &lst, std::list &ctx, const QString &schema, const QString &owner, const QString &name) const; void describePartitionedIndex(toExtract &ext, std::list &lst, std::list &ctx, const QString &schema, const QString &owner, const QString &name) const; void describePartitionedTable(toExtract &ext, std::list &lst, std::list &ctx, const QString &schema, const QString &owner, const QString &name) const; void describeSource(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name, const QString &type) const; void describeTableColumns(toExtract &ext, std::list &lst, std::list &ctx, const QString &owner, const QString &name) const; void describeTableText(toExtract &ext, std::list &lst, std::list &ctx, toQList &result, const QString &schema, const QString &owner, const QString &name) const; // Migrate utility functions QString migrateAttributes(std::list &desc, std::list::iterator i, int level, const QString &indent) const; QString migrateIndexColumns(std::list &destin, std::list::iterator i, const QString &context) const; QString migratePartitions(std::list &desc, std::list::iterator &i, int level, const QString &indent) const; QString migratePrivs(toExtract &ext, std::list &source, std::list &destin, const QString &type) const; QString migrateSource(toExtract &ext, std::list &source, std::list &destin, const QString &type) const; QString createTable(std::list &destin) const; QString alterTable(std::list &source, std::list &destin) const; // Create functions QString createConstraint(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createDBLink(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createExchangeIndex(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createExchangeTable(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createFunction(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createIndex(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createMaterializedView(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createMaterializedViewLog(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createPackage(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createPackageBody(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createProcedure(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createProfile(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createRole(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createRollbackSegment(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createSequence(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createSnapshot(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createSnapshotLog(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createSynonym(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createTable(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createTableFamily(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; void createTableContents(toExtract &ext, QTextStream &stream, const QString &schema, const QString &owner, const QString &name) const; QString createTableReferences(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createTablespace(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createTrigger(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createType(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createUser(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; QString createView(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const; // Describe functions void describeConstraint(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeDBLink(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeExchangeIndex(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeExchangeTable(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeFunction(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeIndex(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeMaterializedView(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeMaterializedViewLog(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describePackage(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describePackageBody(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeProcedure(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeProfile(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeRole(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeRollbackSegment(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeSequence(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeSnapshot(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeSnapshotLog(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeSynonym(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeTable(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeTableFamily(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeTableReferences(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeTablespace(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeTrigger(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeType(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeUser(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; void describeView(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const; // Drop functions QString dropConstraint(toExtract &ext, const QString &schema, const QString &owner, const QString &type, const QString &name) const; QString dropDatabaseLink(toExtract &ext, const QString &schema, const QString &owner, const QString &type, const QString &name) const; QString dropMViewLog(toExtract &ext, const QString &schema, const QString &owner, const QString &type, const QString &name) const; QString dropObject(toExtract &ext, const QString &schema, const QString &owner, const QString &type, const QString &name) const; QString dropProfile(toExtract &ext, const QString &schema, const QString &owner, const QString &type, const QString &name) const; QString dropSchemaObject(toExtract &ext, const QString &schema, const QString &owner, const QString &type, const QString &name) const; QString dropSynonym(toExtract &ext, const QString &schema, const QString &owner, const QString &type, const QString &name) const; QString dropTable(toExtract &ext, const QString &schema, const QString &owner, const QString &type, const QString &name) const; QString dropTablespace(toExtract &ext, const QString &schema, const QString &owner, const QString &type, const QString &name) const; QString dropUser(toExtract &ext, const QString &schema, const QString &owner, const QString &type, const QString &name) const; // Migrate functions QString migrateConstraint(toExtract &ext, std::list &source, std::list &destin) const; QString migrateDBLink(toExtract &ext, std::list &source, std::list &destin) const; QString migrateFunction(toExtract &ext, std::list &source, std::list &destin) const; QString migrateIndex(toExtract &ext, std::list &source, std::list &destin) const; QString migratePackage(toExtract &ext, std::list &source, std::list &destin) const; QString migratePackageBody(toExtract &ext, std::list &source, std::list &destin) const; QString migrateProcedure(toExtract &ext, std::list &source, std::list &destin) const; QString migrateRole(toExtract &ext, std::list &source, std::list &destin) const; QString migrateSequence(toExtract &ext, std::list &source, std::list &destin) const; QString migrateTable(toExtract &ext, std::list &source, std::list &destin) const; public: // Public interface toOracleExtract(); virtual ~toOracleExtract(); virtual void initialize(toExtract &ext) const; virtual void create(toExtract &ext, QTextStream &stream, const QString &type, const QString &schema, const QString &owner, const QString &name) const; virtual void describe(toExtract &ext, std::list &lst, const QString &type, const QString &schema, const QString &owner, const QString &name) const; virtual void drop(toExtract &ext, QTextStream &stream, const QString &type, const QString &schema, const QString &owner, const QString &name) const; virtual void migrate(toExtract &ext, QTextStream &stream, const QString &type, std::list &src, std::list &dst) const; virtual std::list datatypes() const; }; #endif tora-2.1.3/src/tobrowserindexwidget.cpp0000644000175000017500000001763311411113467020036 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "tobrowserbasewidget.h" #include "toresultextract.h" #include "toresultitem.h" #include "toresulttableview.h" #include "tostorage.h" #include "utils.h" #include "tobrowserindexwidget.h" static toSQL SQLIndexColsMySQL3("toBrowser:IndexCols", "SHOW INDEX FROM `:f1`.`:f2`", "Display columns on which an index is built", "3.23", "MySQL"); static toSQL SQLIndexColsMySQL("toBrowser:IndexCols", "SELECT * FROM INFORMATION_SCHEMA.STATISTICS\n" " WHERE table_schema = :f1\n" " AND table_name = :f2\n", "", "5.0", "MySQL"); static toSQL SQLIndexCols("toBrowser:IndexCols", "SELECT a.Table_Name,a.Column_Name,a.Column_Length,a.Descend,b.Column_Expression \" \"\n" " FROM sys.All_Ind_Columns a,sys.All_Ind_Expressions b\n" " WHERE a.Index_Owner = :f1 AND a.Index_Name = :f2\n" " AND a.Index_Owner = b.Index_Owner(+) AND a.Index_Name = b.Index_Name(+)\n" " AND a.column_Position = b.Column_Position(+)\n" " ORDER BY a.Column_Position", "", "0801"); static toSQL SQLIndexCols8("toBrowser:IndexCols", "SELECT Table_Name,Column_Name,Column_Length,Descend\n" " FROM SYS.ALL_IND_COLUMNS\n" " WHERE Index_Owner = :f1 AND Index_Name = :f2\n" " ORDER BY Column_Position", "", "0800"); static toSQL SQLIndexCols7("toBrowser:IndexCols", "SELECT Table_Name,Column_Name,Column_Length\n" " FROM SYS.ALL_IND_COLUMNS\n" " WHERE Index_Owner = :f1 AND Index_Name = :f2\n" " ORDER BY Column_Position", "", "0703"); static toSQL SQLIndexColsPgSQL("toBrowser:IndexCols", "SELECT a.attname,\n" " format_type(a.atttypid, a.atttypmod) as FORMAT,\n" " a.attnotnull,\n" " a.atthasdef\n" " FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid,\n" " pg_attribute a\n" " WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" " AND a.attrelid = c.oid AND c.relname = :f2\n" " AND a.attnum > 0\n" " ORDER BY a.attnum\n", "", "7.1", "PostgreSQL"); static toSQL SQLIndexColsSapDb("toBrowser:IndexCols", "SELECT tablename,columnname,len \"Length\",DataType,Sort \n" " FROM indexcolumns \n" " WHERE owner = upper(:f1) and indexname = upper(:f2)\n" " ORDER BY indexname,columnno", "", "", "SapDB"); static toSQL SQLIndexInfoSapDb("toBrowser:IndexInformation", "SELECT INDEXNAME,TABLENAME, TYPE, CREATEDATE,CREATETIME,INDEX_USED, DISABLED \n" " FROM indexes\n" " WHERE owner = upper(:f1) and indexname = :f2\n", "Display information about an index", "", "SapDB"); static toSQL SQLIndexInfo("toBrowser:IndexInformation", "SELECT * FROM SYS.ALL_INDEXES\n" " WHERE Owner = :f1 AND Index_Name = :f2", ""); static toSQL SQLIndexStatistic("toBrowser:IndexStatstics", "SELECT description \"Description\", value(char_value,numeric_value) \"Value\" \n" " FROM indexstatistics \n" " WHERE owner = upper(:f1) and indexname = :f2", "Index Statistics", "", "SapDB"); toBrowserIndexWidget::toBrowserIndexWidget(QWidget * parent) : toBrowserBaseWidget(parent) { setObjectName("toBrowserIndexWidget"); columnView = new toResultTableView(this); columnView->setObjectName("columnView"); columnView->setSQL(SQLIndexCols); columnView->setReadAll(true); resultInfo = new toResultItem(this); resultInfo->setObjectName("resultInfo"); resultInfo->setSQL(SQLIndexInfo); extentsView = new toResultExtent(this); extentsView->setObjectName("extentsView"); extractView = new toResultExtract(this); extractView->setObjectName("extractView"); statisticView = new toResultTableView(this); statisticView->setObjectName("statisticView"); statisticView->setSQL(SQLIndexStatistic); statisticView->setReadAll(true); changeConnection(); } void toBrowserIndexWidget::changeConnection() { toBrowserBaseWidget::changeConnection(); toConnection & c = toCurrentConnection(this); addTab(columnView, "&Columns"); if (toIsOracle(c) || toIsSapDB(c)) addTab(resultInfo, "Information"); else resultInfo->hide(); if (toIsOracle(c)) addTab(extentsView, "Extents"); else extentsView->hide(); if (toIsSapDB(c)) addTab(statisticView, tr("&Statistic")); else statisticView->hide(); if (toIsOracle(c)) addTab(extractView, "Script"); else extractView->hide(); } tora-2.1.3/src/toscripttreeitem.cpp0000644000175000017500000000571511270353625017165 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #include "toscripttreeitem.h" toScriptTreeItem::toScriptTreeItem( toScriptTreeItem *parent, const QString &data, const QString & type, const QString & schema) { parentItem = parent; itemData = data; itemType = type; itemSchema = schema; } toScriptTreeItem::~toScriptTreeItem() { qDeleteAll(childItems); } void toScriptTreeItem::appendChild(toScriptTreeItem *item) { childItems.append(item); } toScriptTreeItem *toScriptTreeItem::child(int row) { return childItems.value(row); } int toScriptTreeItem::childCount() const { return childItems.count(); } int toScriptTreeItem::columnCount() const { return 1;//itemData.count(); } QString toScriptTreeItem::data() const { return itemData; } QString toScriptTreeItem::type() const { return itemType; } QString toScriptTreeItem::schema() const { return itemSchema; } toScriptTreeItem *toScriptTreeItem::parent() { return parentItem; } int toScriptTreeItem::row() const { if (parentItem) return parentItem->childItems.indexOf(const_cast(this)); return 0; } tora-2.1.3/src/totableselect.cpp0000644000175000017500000001057411336032004016374 0ustar michaelmichael/* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconnection.h" #include "toresultcombo.h" #include "totableselect.h" #include #include void toTableSelect::setup() { QVBoxLayout *vbox = new QVBoxLayout; vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); setLayout(vbox); setTitle(tr("Table selection")); bool mysql = false; try { mysql = toIsMySQL(toCurrentConnection(this)); } catch (...) {} QLabel *label = new QLabel(mysql ? tr("Database") : tr("Schema"), this); label->show(); vbox->addWidget(label); Schema = new toResultCombo(this); Schema->show(); Schema->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); vbox->addWidget(Schema); label = new QLabel(tr("Table"), this); label->show(); vbox->addWidget(label); Table = new toResultCombo(this); Table->show(); Table->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); vbox->addWidget(Table); Schema->additionalItem(mysql ? tr("Select database") : tr("Select schema")); Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST)); Table->additionalItem(tr("Select table")); // petr vanek 03/01/07 bug #1180847 Error when creating referential constraint Table->setSQL(toSQL::sql("toBrowser:ListTableNames")); Schema->refresh(); if (!SelectedTable.isNull()) setTable(SelectedTable); connect(Schema, SIGNAL(activated(int)), this, SLOT(changeSchema())); connect(Table, SIGNAL(activated(int)), this, SLOT(changeTable())); } toTableSelect::toTableSelect(QWidget *parent, const char *name) : QGroupBox(parent) { setObjectName(name); Schema = Table = NULL; QTimer::singleShot(1, this, SLOT(setup())); } void toTableSelect::setTable(const QString &table) { if (!Table || !Schema) SelectedTable = table; else { QStringList parts = table.split("."); toConnection &conn = toCurrentConnection(this); if (parts.size() > 1) { Schema->setSelected(conn.unQuote(parts[0])); Table->setSelected(conn.unQuote(parts[1])); } else Schema->setSelected(conn.unQuote(table)); Table->changeParams(Schema->selected()); } } void toTableSelect::changeSchema(void) { if (Schema->currentIndex() != 0) Table->changeParams(Schema->selected()); } void toTableSelect::changeTable(void) { if (Table->currentIndex() != 0) { toConnection &conn = toCurrentConnection(this); QString table = conn.quote(Schema->selected()); table += "."; table += conn.quote(Table->selected()); emit selectTable(table); } } tora-2.1.3/src/toresultcols.cpp0000644000175000017500000005276011411113467016316 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconnection.h" #include "toresultcols.h" #include "toresultcolscomment.h" #include "toresulttableview.h" #include "tosql.h" #include #include #include #include #include #include #include #include static toSQL SQLComment( "toResultCols:Comments", "SELECT Column_name,Comments FROM sys.All_Col_Comments\n" " WHERE Owner = :f1\n" " AND Table_Name = :f2", "Display column comments"); static toSQL SQLCommentPG( "toResultCols:Comments", "SELECT a.attname,\n" " pg_catalog.col_description ( a.attrelid,\n" " a.attnum )\n" " FROM pg_catalog.pg_attribute a,\n" " pg_class c,\n" " pg_namespace n\n" " WHERE n.nspname = :f1\n" " AND c.relname = :f2\n" " AND c.relkind = 'r'::\"char\"\n" " AND c.relnamespace = n.OID\n" " AND a.attrelid = c.OID\n" " AND a.attnum > 0\n" " AND NOT a.attisdropped", "", "7.1", "PostgreSQL"); static toSQL SQLCommentTD( "toResultCols:Comments", "SELECT c.columnname,\n" " c.commentstring\n" " FROM dbc.COLUMNS c\n" " WHERE trim ( databasename ) = trim ( :f1 )\n" " AND trim ( tablename ) = trim ( :f2 )", "", "", "Teradata"); static toSQL SQLTableCommentMySQL( "toResultCols:TableComment", "SHOW TABLE STATUS FROM `:f1` LIKE :f2", "Display Table comment", "4.1", "MySQL"); static toSQL SQLTableCommentTD( "toResultCols:TableComment", "SELECT c.commentstring\n" " FROM dbc.tables c\n" " WHERE trim ( databasename ) = trim ( :f1 )\n" " AND trim ( tablename ) = trim ( :f2 )", "", "", "Teradata"); static toSQL SQLTableComment( "toResultCols:TableComment", "SELECT Comments FROM sys.All_Tab_Comments\n" " WHERE Owner = :f1\n" " AND Table_Name = :f2", ""); // sql must return a row even if there's no comment for the table static toSQL SQLTableCommentPG( "toResultCols:TableComment", "SELECT d.description\n" " FROM pg_class c\n" " LEFT OUTER JOIN pg_description d\n" " ON d.objoid = c.OID,\n" " pg_namespace n\n" " WHERE n.nspname = :f1\n" " AND c.relname = :f2\n" " AND c.relkind = 'r'::\"char\"\n" " AND c.relnamespace = n.OID\n" " AND d.objsubid = 0", "", "7.1", "PostgreSQL"); static toSQL SQLTableColumns( "toResultCols:ListCols", "SELECT column_name AS \"Column Name\",\n" " RPAD ( DECODE ( data_type,\n" " 'NUMBER',\n" " DECODE ( data_precision,\n" " NULL,\n" " DECODE ( data_scale,\n" " 0,\n" " 'INTEGER',\n" " 'NUMBER ' ),\n" " 'NUMBER ' ),\n" " 'RAW',\n" " 'RAW ',\n" " 'CHAR',\n" " 'CHAR ',\n" " 'NCHAR',\n" " 'NCHAR ',\n" " 'UROWID',\n" " 'UROWID ',\n" " 'VARCHAR2',\n" " 'VARCHAR2 ',\n" " data_type ) ||\n" " DECODE ( data_type,\n" " 'DATE',\n" " NULL,\n" " 'LONG',\n" " NULL,\n" " 'NUMBER',\n" " DECODE ( data_precision,\n" " NULL,\n" " NULL,\n" " '(' ),\n" " 'RAW',\n" " '(',\n" " 'CHAR',\n" " '(',\n" " 'NCHAR',\n" " '(',\n" " 'UROWID',\n" " '(',\n" " 'VARCHAR2',\n" " '(',\n" " 'NVARCHAR2',\n" " '(',\n" " NULL ) ||\n" " DECODE ( data_type,\n" " 'RAW',\n" " data_length,\n" " 'CHAR',\n" " data_length,\n" " 'NCHAR',\n" " char_length,\n" " 'UROWID',\n" " data_length,\n" " 'VARCHAR2',\n" " data_length,\n" " 'NVARCHAR2',\n" " char_length,\n" " 'NUMBER',\n" " data_precision,\n" " NULL ) ||\n" " DECODE ( data_type,\n" " 'NUMBER',\n" " DECODE ( TO_CHAR ( data_precision ),\n" " NULL,\n" " NULL,\n" " DECODE ( TO_CHAR ( data_scale ),\n" " NULL,\n" " NULL,\n" " 0,\n" " NULL,\n" " ',' || data_scale ) ) ) ||\n" " DECODE ( data_type,\n" " 'DATE',\n" " NULL,\n" " 'LONG',\n" " NULL,\n" " 'NUMBER',\n" " DECODE ( data_precision,\n" " NULL,\n" " NULL,\n" " ')' ),\n" " 'RAW',\n" " ')',\n" " 'CHAR',\n" " ')',\n" " 'NCHAR',\n" " ')',\n" " 'UROWID',\n" " ')',\n" " 'VARCHAR2',\n" " ')',\n" " 'NVARCHAR2',\n" " ')',\n" " NULL ),\n" " 32 ) AS \"Data Type\",\n" " data_default AS \"Default\",\n" " DECODE ( nullable,\n" " 'N',\n" " 'NOT NULL',\n" " NULL ) AS \"NULL\",\n" " ( SELECT comments\n" " FROM sys.All_Col_Comments c\n" " WHERE c.owner = tc.owner\n" " AND c.table_name = tc.table_name\n" " AND c.column_name = tc.column_name ) AS \"Comment\"\n" " FROM sys.all_tab_columns tc\n" " WHERE owner = :f1\n" " AND table_name = :f2\n" " ORDER BY column_id\n", "List table columns and defaults.", "1000"); static toSQL SQLTableColumns8( "toResultCols:ListCols", "SELECT column_name AS \"Column Name\",\n" " RPAD ( DECODE ( data_type,\n" " 'NUMBER',\n" " DECODE ( data_precision,\n" " NULL,\n" " DECODE ( data_scale,\n" " 0,\n" " 'INTEGER',\n" " 'NUMBER ' ),\n" " 'NUMBER ' ),\n" " 'RAW',\n" " 'RAW ',\n" " 'CHAR',\n" " 'CHAR ',\n" " 'NCHAR',\n" " 'NCHAR ',\n" " 'UROWID',\n" " 'UROWID ',\n" " 'VARCHAR2',\n" " 'VARCHAR2 ',\n" " data_type ) ||\n" " DECODE ( data_type,\n" " 'DATE',\n" " NULL,\n" " 'LONG',\n" " NULL,\n" " 'NUMBER',\n" " DECODE ( data_precision,\n" " NULL,\n" " NULL,\n" " '(' ),\n" " 'RAW',\n" " '(',\n" " 'CHAR',\n" " '(',\n" " 'NCHAR',\n" " '(',\n" " 'UROWID',\n" " '(',\n" " 'VARCHAR2',\n" " '(',\n" " 'NVARCHAR2',\n" " '(',\n" " NULL ) ||\n" " DECODE ( data_type,\n" " 'RAW',\n" " data_length,\n" " 'CHAR',\n" " data_length,\n" " 'UROWID',\n" " data_length,\n" " 'VARCHAR2',\n" " data_length,\n" " 'NUMBER',\n" " data_precision,\n" " NULL ) ||\n" " DECODE ( data_type,\n" " 'NUMBER',\n" " DECODE ( TO_CHAR ( data_precision ),\n" " NULL,\n" " NULL,\n" " DECODE ( TO_CHAR ( data_scale ),\n" " NULL,\n" " NULL,\n" " 0,\n" " NULL,\n" " ',' || data_scale ) ) ) ||\n" " DECODE ( data_type,\n" " 'DATE',\n" " NULL,\n" " 'LONG',\n" " NULL,\n" " 'NUMBER',\n" " DECODE ( data_precision,\n" " NULL,\n" " NULL,\n" " ')' ),\n" " 'RAW',\n" " ')',\n" " 'CHAR',\n" " ')',\n" " 'NCHAR',\n" " ')',\n" " 'UROWID',\n" " ')',\n" " 'VARCHAR2',\n" " ')',\n" " 'NVARCHAR2',\n" " ')',\n" " NULL ),\n" " 32 ) AS \"Data Type\",\n" " data_default AS \"Default\",\n" " DECODE ( nullable,\n" " 'N',\n" " 'NOT NULL',\n" " NULL ) AS \"NULL\",\n" " ( SELECT comments\n" " FROM sys.All_Col_Comments c\n" " WHERE c.owner = tc.owner\n" " AND c.table_name = tc.table_name\n" " AND c.column_name = tc.column_name ) AS \"Comment\"\n" " FROM sys.all_tab_columns tc\n" " WHERE owner = :f1\n" " AND table_name = :f2\n" " ORDER BY column_id", "", "0800"); static toSQL SQLTableColumnsPG( "toResultCols:ListCols", "SELECT a.attname AS \"Column Name\",\n" " pg_catalog.format_type ( a.atttypid,\n" " a.atttypmod ) AS \"Format Type\",\n" " ( SELECT substring ( pg_catalog.pg_get_expr ( d.adbin,\n" " d.adrelid ) FOR 128 )\n" " FROM pg_catalog.pg_attrdef d\n" " WHERE d.adrelid = a.attrelid\n" " AND d.adnum = a.attnum\n" " AND a.atthasdef ) AS \"Modifiers\",\n" " a.attnotnull AS \"NULL\",\n" " pg_catalog.col_description ( a.attrelid,\n" " a.attnum ) AS \"Comment\"\n" " FROM pg_catalog.pg_attribute a,\n" " pg_class c,\n" " pg_namespace n\n" " WHERE n.nspname = :f1\n" " AND c.relname = :f2\n" " AND c.relkind = 'r'::\"char\"\n" " AND c.OID = a.attrelid\n" " AND c.relnamespace = n.OID\n" " AND a.attnum > 0\n" " AND NOT a.attisdropped\n" " ORDER BY a.attnum", "", "7.1", "PostgreSQL"); static toSQL SQLTableColumnsTD( "toResultCols:ListCols", "SELECT c.columnname AS \"Name\",\n" " c.columntitle AS \"Title\",\n" " c.columntype AS \"Type\",\n" " c.defaultvalue AS \"Default Value\",\n" " c.nullable AS \"Null\",\n" " c.createtimestamp AS \"Created\",\n" " c.lastaltertimestamp AS \"Last Modified\",\n" " c.CommentString AS \"Comment\"\n" " FROM dbc.COLUMNS c\n" " WHERE trim ( databasename ) = trim ( :f1 )\n" " AND trim ( tablename ) = trim ( :f2 )\n" " ORDER BY 1", "", "", "Teradata"); static toSQL SQLTableColumnsMySql3( "toResultCols:ListCols", "SHOW FULL COLUMNS FROM :f1", "", "3.23", "MySQL"); static toSQL SQLTableColumnsMySql( "toResultCols:ListCols", "SELECT * FROM information_schema.columns WHERE table_schema = :f1 AND table_name = :f2", "", "5.0", "MySQL"); toResultCols::toResultCols(QWidget *parent, const char *name, Qt::WFlags f) : QWidget(parent, f) { if (name) setObjectName(name); QVBoxLayout *vbox = new QVBoxLayout; QWidget *box = new QWidget(this); QHBoxLayout *hbox = new QHBoxLayout; Title = new QLabel(box); hbox->addWidget(Title); Title->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum)); Comment = new QLabel(box); Comment->setWordWrap(true); hbox->addWidget(Comment); Comment->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum)); EditComment = new toResultColsComment(box); hbox->addWidget(EditComment); EditComment->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum)); EditComment->hide(); Edit = new QCheckBox("Edit comments", box); hbox->addWidget(Edit); Edit->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Maximum)); connect(Edit, SIGNAL(toggled(bool)), this, SLOT(editComment(bool))); hbox->setContentsMargins(2, 2, 2, 2); hbox->setSpacing(5); box->setLayout(hbox); vbox->addWidget(box); Columns = new toResultTableView(true, true, this); Columns->setDisableTab(false); Columns->setReadAll(true); vbox->addWidget(Columns); ColumnComments = NULL; vbox->setContentsMargins(0, 0, 0, 0); vbox->setSpacing(0); this->setLayout(vbox); Header = true; resize(640, 300); } void toResultCols::displayHeader(bool display) { Header = display; Title->setVisible(display); Comment->setVisible(display && !Edit->isChecked()); EditComment->setVisible(display && Edit->isChecked()); Edit->setVisible(display); } void toResultCols::query(const QString &sql, const toQList ¶m) { QString Owner; QString Name; QString object; toConnection &conn = connection(); if(ColumnComments) { Edit->setChecked(false); delete ColumnComments; ColumnComments = 0; } try { toQList subp; toQList::iterator cp = ((toQList &) param).begin(); if (cp != ((toQList &) param).end()) { object = conn.quote(*cp); Owner = *cp; } cp++; if (cp != ((toQList &) param).end()) { object += QString::fromLatin1("."); object += conn.quote(*cp); Name = *cp; } else { Name = Owner; if (toIsMySQL(conn)) Owner = connection().database(); else Owner = connection().user().toUpper(); } TableName = conn.quote(Owner) + "." + conn.quote(Name); Columns->setSQL(SQLTableColumns); // MySQL is using information_schema now - so there should be always Owner defined // if (toIsMySQL(conn)) // { // if (Owner.isEmpty()) // Columns->changeParams(Name); // else // Columns->changeParams("`" + Owner + "`." + Name); // } // else // { Columns->changeParams(Owner, Name); // } } TOCATCH; try { QString synonym; const toConnection::objectName &name = conn.realName( object, synonym, false); QString label = QString::fromLatin1(""); if (!synonym.isEmpty()) { label += conn.quote(synonym); label += tr(" synonym for "); } label += conn.quote(name.Owner); if (label != QString::fromLatin1("")) label += QString::fromLatin1("."); label += conn.quote(name.Name); label += QString::fromLatin1(""); if (!name.Comment.isNull()) { Comment->setText(name.Comment); EditComment->setComment( true, conn.quote(name.Owner) + "." + conn.quote(name.Name), const_cast(name.Comment)); } else { Comment->setText(QString::null); EditComment->setComment( true, conn.quote(name.Owner) + "." + conn.quote(name.Name), const_cast(name.Comment)); } Title->setText(label); } catch (const QString &) { // expected for databases that don't support synonyms ; } try { QString label = QString::fromLatin1(""); label += object; label += QString::fromLatin1(""); if (connection().provider() == "Oracle" || connection().provider() == "MySQL" || connection().provider() == "PostgreSQL" || connection().provider() == "Teradata") { toConnection &conn = connection(); toQuery query(conn, SQLTableComment, Owner, Name); QString t; if (!query.eof()) { t = query.readValueNull(); EditComment->setComment(true, TableName, t); } Comment->setText(t); editComment(Edit->isChecked()); Edit->setEnabled(true); } else { editComment(false); Edit->setEnabled(false); } Title->setText(label); } catch (const QString &str) { Title->setText(str); toStatusMessage(str); } } void toResultCols::editComment(bool val) { setUpdatesEnabled(false); // setup the comments if (val && !ColumnComments) { QScrollArea *scroll = new QScrollArea(this); ColumnComments = scroll; ColumnComments->setVisible(true); layout()->addWidget(ColumnComments); QWidget *container = new QWidget(scroll); scroll->setWidget(container); scroll->setWidgetResizable(true); toResultTableView::iterator it(Columns); QGridLayout *grid = new QGridLayout; grid->setContentsMargins(2, 2, 2, 2); grid->setSpacing(5); int row; for (row = 0; (*it).isValid(); row++, it++) { QString column = Columns->model()->data(row, 1).toString(); QString comment = Columns->model()->data(row, "Comment").toString(); toResultColsComment *com = new toResultColsComment(container); com->setComment(false, TableName + "." + connection().quote(column), comment); grid->addWidget(new QLabel(column)); grid->addWidget(com, row, 1); } // add widget at bottom of grid that can resize grid->addWidget(new QWidget(container), row, 0); grid->setRowStretch(row, 1); container->setLayout(grid); } // copy text from on to the other so i don't have to refresh to // see my comments... i would think they were lost. if (EditComment->isVisible()) Comment->setText(EditComment->text()); if (ColumnComments) ColumnComments->setVisible(val); EditComment->setVisible(val); Comment->setVisible(!val); setUpdatesEnabled(true); } tora-2.1.3/src/topiechart.cpp0000644000175000017500000003366011270353625015721 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "tolinechart.h" #include "topiechart.h" #include "tomain.h" #include "toresult.h" #include "totool.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "icons/chart.xpm" #include "icons/print.xpm" toPieChart::toPieChart(QWidget *parent, const char *name, Qt::WFlags f) : QWidget(parent, f) { if (name) setObjectName(name); Legend = true; DisplayPercent = false; setWindowIcon(QPixmap(const_cast(chart_xpm))); setMinimumSize(60, 60); Menu = NULL; setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(createPopupMenu(const QPoint &))); setMinimumSize(60, 60); // Use list font QString str(toConfigurationSingle::Instance().listFont()); if (!str.isEmpty()) { QFont font(toStringToFont(str)); setFont(font); } } toPieChart::~toPieChart() { } #define FONT_ALIGN Qt::AlignLeft|Qt::AlignTop|Qt::TextExpandTabs void toPieChart::mouseDoubleClickEvent(QMouseEvent *e) { if (e->button() == Qt::LeftButton) openCopy(); } void toPieChart::openCopy(void) { QWidget *newWin = new toPieChart(this, toMainWidget()->workspace(), NULL, 0); newWin->setAttribute(Qt::WA_DeleteOnClose); newWin->show(); newWin->raise(); newWin->setFocus(); toMainWidget()->updateWindowsMenu(); } void toPieChart::setValues(std::list &values, std::list &labels) { Values = values; Labels = labels; emit newValues(values, labels); update(); } toPieChart::toPieChart(toPieChart *pie, QWidget *parent, const char *name, Qt::WFlags f) : QWidget(parent, f | Qt::Window), Values(pie->Values), Labels(pie->Labels), Postfix(pie->Postfix), Legend(pie->Legend), DisplayPercent(pie->DisplayPercent), Title(pie->Title) { if (name) setObjectName(name); setWindowIcon(QPixmap(const_cast(chart_xpm))); Menu = NULL; setWindowTitle(Title); setMinimumSize(60, 60); // Use list font QString str(toConfigurationSingle::Instance().listFont()); if (!str.isEmpty()) { QFont font(toStringToFont(str)); setFont(font); } } void toPieChart::createPopupMenu(const QPoint &pos) { if (!Menu) { Menu = new QMenu(this); Menu->addAction(QIcon(print_xpm), tr("&Print..."), this, SLOT(editPrint())); Menu->addAction(tr("&Open in new window"), this, SLOT(openCopy())); } Menu->exec(QCursor::pos()); } bool toPieChart::event(QEvent *event) { if (event->type() == QEvent::ToolTip) { QHelpEvent *helpEvent = static_cast(event); QString t = findLabel(helpEvent->pos()); if (!t.isEmpty()) QToolTip::showText(helpEvent->globalPos(), t); else QToolTip::hideText(); } return QWidget::event(event); } void toPieChart::paintChart(QPainter *p, QRect rect) { QFontMetrics fm = p->fontMetrics(); int right = rect.width(); int bottom = rect.height(); double tot = 0; { for (std::list::iterator i = Values.begin();i != Values.end();i++) tot += *i; } if (!Title.isEmpty()) { p->save(); QFont f = p->font(); f.setBold(true); p->setFont(f); QRect bounds = fm.boundingRect(0, 0, rect.width(), rect.height(), FONT_ALIGN, Title); p->drawText(0, 2, rect.width(), bounds.height(), Qt::AlignHCenter | Qt::AlignTop, Title); p->restore(); p->translate(0, bounds.height() + 2); bottom -= bounds.height() + 2; } if (Legend) { int lwidth = 0; int lheight = 0; toResult *Result = dynamic_cast(this); std::list::iterator j = Values.begin(); { for (std::list::iterator i = Labels.begin();i != Labels.end();i++) { QString sizstr; if (j != Values.end()) { if (DisplayPercent) sizstr.sprintf("%0.1f", 100*(*j) / tot); else sizstr = toQValue::formatNumber(*j); sizstr += Postfix; } if (!(*i).isEmpty()) { QString str = toTranslateMayby(Result ? Result->sqlName() : QString::fromLatin1("toPieChart"), *i); str += QString::fromLatin1(" ("); str += sizstr; str += QString::fromLatin1(")"); QRect bounds = fm.boundingRect(0, 0, 10000, 10000, FONT_ALIGN, str); if (lwidth < bounds.width()) lwidth = bounds.width(); lheight += bounds.height(); } } if (j != Values.end()) j++; } if (lheight > 0) { lheight += 4; lwidth += 14; } int lx = rect.width() - lwidth - 2; int ly = 2; if (lx < 50) lx = 50; right = lx; p->save(); p->setBrush(Qt::white); p->drawRect(lx, ly, lwidth, lheight); p->restore(); lx += 12; ly += 2; int cp = 0; j = Values.begin(); for (std::list::iterator i = Labels.begin();i != Labels.end();i++) { QString sizstr; if (j != Values.end()) { if (DisplayPercent) sizstr.sprintf("%0.1f", 100*(*j) / tot); else sizstr = toQValue::formatNumber(*j); sizstr += Postfix; } if (!(*i).isEmpty()) { QString str = toTranslateMayby(Result ? Result->sqlName() : QString::fromLatin1("toPieChart"), *i); str += QString::fromLatin1(" ("); str += sizstr; str += QString::fromLatin1(")"); QRect bounds = fm.boundingRect(lx, ly, 100000, 100000, FONT_ALIGN, str); p->drawText(bounds, FONT_ALIGN, str); p->save(); QBrush brush(toChartBrush(cp)); p->setBrush(brush.color()); p->drawRect(lx - 10, ly + bounds.height() / 2 - fm.ascent() / 2, 8, fm.ascent()); if (brush.style() != Qt::SolidPattern) { p->setBrush(QBrush(Qt::white, brush.style())); p->drawRect(lx - 10, ly + bounds.height() / 2 - fm.ascent() / 2, 8, fm.ascent()); } p->restore(); ly += bounds.height(); } cp++; if (j != Values.end()) j++; } } if (tot == 0) { p->drawText(QRect(2, 2, right - 4, bottom - 4), Qt::AlignCenter// | Qt::WordBreak , tr("All values are 0 in this chart")); return ; } int cp = 0; int pos = 0; unsigned int count = 0; ChartRect = p->combinedTransform().mapRect(QRect(2, 2, right - 4, bottom - 4)); Angels.clear(); for (std::list::iterator i = Values.begin();i != Values.end();i++) { count++; int size = int(*i * 5760 / tot); if (count == Values.size()) size = 5760 - pos; if (size > 0) { p->save(); QBrush brush(toChartBrush(cp)); p->setBrush(brush.color()); p->drawPie(2, 2, right - 4, bottom - 4, pos, size); if (brush.style() != Qt::SolidPattern) { p->setBrush(QBrush(Qt::white, brush.style())); p->drawPie(2, 2, right - 4, bottom - 4, pos, size); } p->restore(); pos += size; } Angels.insert(Angels.end(), pos); cp++; } } #ifndef M_PI #define M_PI 3.1415926535897932384626433832795 #endif QString toPieChart::findLabel(QPoint p) { if (ChartRect.contains(p)) { QPoint center = ChartRect.center(); p -= center; int iang; if (p.x() != 0) { double angle = atan(double( -p.y()) / p.x()); iang = int(angle * 180 * 16 / M_PI); if (p.x() < 0) iang += 180 * 16; if (iang < 0) iang += 360 * 16; } else if (p.y() <= 0) iang = 90 * 16; else iang = 270 * 16; std::list::iterator i = Angels.begin(); std::list::iterator j = Labels.begin(); while (i != Angels.end() && j != Labels.end()) { if ((*i) > iang) return *j; i++; j++; } } return QString::null; } void toPieChart::paintEvent(QPaintEvent *) { QPainter p(this); paintChart(&p, QRect(0, 0, width(), height())); } void toPieChart::editPrint(void) { TOPrinter printer; QPrintDialog dialog(&printer, this); dialog.setMinMax(1, 1); if (dialog.exec()) { printer.setCreator(tr(TOAPPNAME)); QPainter painter(&printer); QRect rect(printer.pageRect()); paintChart(&painter, rect); } } toPieConnector::toPieConnector(toPieChart *pieChart, toLineChart *lineChart) { PieChart = pieChart; LineChart = lineChart; Flow = false; LastStamp = 0; connect(PieChart, SIGNAL(destroyed()), this, SLOT(deleteLater())); connect(LineChart, SIGNAL(destroyed()), this, SLOT(deleteLater())); connect(PieChart, SIGNAL(newValues(std::list &, std::list &)), this, SLOT(newValues(std::list &, std::list &))); } void toPieConnector::newValues(std::list &values, std::list &labels) { std::map reorderMap; std::list::iterator val = values.begin(); std::list::iterator lab = labels.begin(); while (val != values.end() && lab != labels.end()) { reorderMap[*lab] = *val; val++; lab++; } std::list newlabs = LineChart->labels(); std::list reordVals; std::map::iterator rv; lab = newlabs.begin(); while (lab != newlabs.end()) { rv = reorderMap.find(*lab); if (rv != reorderMap.end()) { reordVals.insert(reordVals.end(), (*rv).second); reorderMap.erase(rv); } else reordVals.insert(reordVals.end(), 0); lab++; } if (reorderMap.begin() != reorderMap.end()) { rv = reorderMap.begin(); while (rv != reorderMap.end()) { newlabs.insert(newlabs.end(), (*rv).first); reordVals.insert(reordVals.end(), (*rv).second); rv++; } LineChart->setLabels(newlabs); } QString nowstr; try { nowstr = toNow(toCurrentConnection(PieChart)); } catch (...) {} if (Flow) { time_t now = time(NULL); if (now != LastStamp) { if (LastValues.size() > 0) { std::list dispVal; std::list::iterator i = reordVals.begin(); std::list::iterator j = LastValues.begin(); while (i != reordVals.end() && j != LastValues.end()) { dispVal.insert(dispVal.end(), (*i - *j) / (now - LastStamp)); i++; j++; } LineChart->addValues(dispVal, nowstr); } LastValues = reordVals; LastStamp = now; } } else LineChart->addValues(reordVals, nowstr); } tora-2.1.3/src/tobrowserconstraint.h0000644000175000017500000000613111270353625017350 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBROWSERCONSTRAINT_H #define TOBROWSERCONSTRAINT_H #include "config.h" #include "ui_tobrowserconstraintui.h" #include "toextract.h" #include "totool.h" #include #include class toBrowserConstraint : public QDialog, public Ui::toBrowserConstraintUI, public toConnectionWidget { private: Q_OBJECT QString Owner; QString Table; toExtract Extractor; std::map > OriginalDescription; std::map > NewDescription; QString Current; QString BeforeUnquote; // Hack for not incurring differences with weird MySQL quoting QString AfterUnquote; std::map Constraints; toBrowserConstraint(toConnection &conn, const QString &owner, const QString &table, QWidget *parent, const char *name = NULL); QString table(); void parseConstraint(const QString &definition); void saveChanges(); void describeTable(const QString &table); QString sql(void); public: static void modifyConstraint(toConnection &conn, const QString &owner, const QString &table, QWidget *parent); public slots: virtual void displaySQL(); virtual void addConstraint(); virtual void delConstraint(); virtual void changeConstraint(); virtual void changeRefered(); virtual void changeType(int type); virtual void changeTable(const QString &table); }; #endif tora-2.1.3/src/Makefile.in0000644000175000017500000233635311445450567015136 0ustar michaelmichael# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = tora$(EXEEXT) subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/m4/ax_cflags_gcc_option.m4 \ $(top_srcdir)/config/m4/cppunit.m4 \ $(top_srcdir)/config/m4/libtool.m4 \ $(top_srcdir)/config/m4/ltoptions.m4 \ $(top_srcdir)/config/m4/ltsugar.m4 \ $(top_srcdir)/config/m4/ltversion.m4 \ $(top_srcdir)/config/m4/lt~obsolete.m4 \ $(top_srcdir)/config/m4/oracle.m4 \ $(top_srcdir)/config/m4/pcre.m4 \ $(top_srcdir)/config/m4/postgresql.m4 \ $(top_srcdir)/config/m4/qtkde.m4 \ $(top_srcdir)/config/m4/teradata.m4 \ $(top_srcdir)/config/m4/tora.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__tora_SOURCES_DIST = main.cpp tomainwindow.cpp tomainwindow.h \ toabout.cpp toabout.h tobackground.cpp tobackground.h \ tobackgroundlabel.cpp tobackgroundlabel.h toconfiguration.cpp \ toconfiguration.h toconnection.cpp toconnection.h toqvalue.cpp \ toqvalue.h toconnectionimport.cpp toconnectionimport.h \ toconnectionpool.cpp toconnectionpool.h todescribe.cpp \ todescribe.h torunnable.cpp torunnable.h toeditwidget.cpp \ toeditwidget.h toglobalsetting.cpp toglobalsetting.h \ tohelp.cpp tohelp.h tohelpsetup.h tohighlightedtext.cpp \ tohighlightedtext.h tohtml.cpp tohtml.h \ tolistviewformatter.cpp tolistviewformatter.h \ tolistviewformattercsv.cpp tolistviewformattercsv.h \ tolistviewformatterfactory.h tolistviewformatterhtml.cpp \ tolistviewformatterhtml.h tolistviewformatteridentifier.h \ tolistviewformattersql.cpp tolistviewformattersql.h \ tolistviewformattertabdel.cpp tolistviewformattertabdel.h \ tolistviewformattertext.cpp tolistviewformattertext.h \ tomain.cpp tomain.h tomarkedtext.cpp tomarkedtext.h \ tomemoeditor.cpp tomemoeditor.h tomodeleditor.cpp \ tomodeleditor.h tomessage.cpp tomessage.h tonewconnection.cpp \ tonewconnection.h tonoblockquery.cpp tonoblockquery.h \ toeventquery.cpp toeventquery.h toeventquerytask.cpp \ toeventquerytask.h toparamget.cpp toparamget.h \ topreferences.cpp topreferences.h toplsqleditor.cpp \ toplsqleditor.h toplsqltext.cpp toplsqltext.h toresult.cpp \ toresult.h toresultfield.cpp toresultfield.h toresultitem.cpp \ toresultitem.h toresultstats.cpp toresultstats.h \ toresultview.cpp toresultview.h toresultlistformat.cpp \ toresultlistformat.h toresultmodel.cpp toresultmodel.h \ toresulttableview.cpp toresulttableview.h \ toresulttableviewedit.cpp toresulttableviewedit.h \ toresultdata.cpp toresultdata.h toresultdatasingle.cpp \ toresultdatasingle.h totreewidget.cpp totreewidget.h \ tosearchreplace.cpp tosearchreplace.h tosmtp.cpp tosmtp.h \ tosplash.cpp tosplash.h tosql.cpp tosql.h tosqlparse.cpp \ tosqlparse.h tosyntaxsetup.cpp tosyntaxsetup.h totabwidget.cpp \ totabwidget.h totemplateprovider.cpp totextview.cpp \ totextview.h tothread.cpp tothread.h tothread_p.h totimer.cpp \ totimer.h totool.cpp totool.h utils.cpp utils.h toalert.cpp \ toalert.h toanalyze.cpp toanalyze.h tobackup.cpp tobackup.h \ tobackuptool.cpp tobackuptool.h tobrowser.cpp tobrowser.h \ todocklet.cpp todocklet.h todockbar.cpp todockbar.h \ topushbutton.cpp topushbutton.h docklets/toviewdirectory.cpp \ docklets/toviewdirectory.h docklets/toviewconnections.cpp \ docklets/toviewconnections.h tobarchart.cpp tobarchart.h \ tocurrent.cpp tocurrent.h todebug.cpp todebug.h \ toeditextensions.cpp toeditextensions.h todatatype.cpp \ todatatype.h toinvalid.cpp toinvalid.h tooutput.cpp tooutput.h \ topassword.cpp toprofiler.cpp toprofiler.h toproject.cpp \ toproject.h toqsqlconnection.cpp torollback.cpp torollback.h \ toscript.cpp toscript.h toscriptschemawidget.cpp \ toscriptschemawidget.h toscripttreeitem.cpp toscripttreeitem.h \ tocodemodel.cpp tocodemodel.h toscripttreemodel.cpp \ toscripttreemodel.h tosecurity.cpp tosecurity.h \ tosecuritytreemodel.cpp tosecuritytreemodel.h \ tosecuritytreeitem.cpp tosecuritytreeitem.h tosession.cpp \ tosession.h tosgatrace.cpp tosgatrace.h tosqledit.cpp \ tosqledit.h tostorage.cpp tostorage.h tostoragedefinition.cpp \ tostoragedefinition.h totemplate.cpp totemplate.h \ totemporary.cpp totemporary.h totuning.cpp totuning.h \ tounittest.cpp tounittest.h tochangeconnection.cpp \ tochangeconnection.h toworkingwidget.cpp toworkingwidget.h \ toworksheet.cpp toworksheet.h toeditablemenu.cpp \ toeditablemenu.h toworksheetwidget.cpp toworksheetwidget.h \ toworksheettext.cpp toworksheettext.h toworksheetstatistic.cpp \ toworksheetstatistic.h tobrowserconstraint.cpp \ tobrowserconstraint.h tobrowserindex.cpp tobrowserindex.h \ tobrowsertable.cpp tobrowsertable.h tochartmanager.cpp \ tochartmanager.h tolegendchart.cpp tolegendchart.h \ tolinechart.cpp tolinechart.h topiechart.cpp topiechart.h \ toresultbar.cpp toresultbar.h toresultline.cpp toresultline.h \ toresultpie.cpp toresultpie.h todebugtext.cpp todebugtext.h \ toextract.cpp toextract.h toreport.cpp toreport.h \ toresultextract.cpp toresultextract.h toresultcols.cpp \ toresultcols.h toresultcolscomment.cpp toresultcolscomment.h \ toresultcombo.cpp toresultcombo.h toresultschema.cpp \ toresultschema.h toresultdepend.cpp toresultdepend.h \ toresultlabel.cpp toresultlabel.h toresultlock.cpp \ toresultlock.h toresultlong.cpp toresultlong.h \ toresultplan.cpp toresultplan.h toresultparam.cpp \ toresultparam.h toresultstorage.cpp toresultstorage.h \ tofilesize.cpp tofilesize.h tosgastatement.cpp \ tosgastatement.h totableselect.cpp totableselect.h \ tovisualize.cpp tovisualize.h towaitevents.cpp towaitevents.h \ toconnectionmodel.cpp toconnectionmodel.h \ tobrowserbasewidget.cpp tobrowserbasewidget.h \ tobrowseraccesswidget.cpp tobrowseraccesswidget.h \ tobrowsertablewidget.cpp tobrowsertablewidget.h \ tobrowserviewwidget.cpp tobrowserviewwidget.h \ tobrowserindexwidget.cpp tobrowserindexwidget.h \ tobrowserschemawidget.cpp tobrowserschemawidget.h \ tobrowsersequencewidget.cpp tobrowsersequencewidget.h \ tobrowsersynonymwidget.cpp tobrowsersynonymwidget.h \ tobrowsercodewidget.cpp tobrowsercodewidget.h \ tobrowsertriggerwidget.cpp tobrowsertriggerwidget.h \ tobrowserdblinkswidget.cpp tobrowserdblinkswidget.h \ tobrowserdirectorieswidget.cpp tobrowserdirectorieswidget.h \ toresultgrants.cpp toresultgrants.h toawr.cpp toawr.h \ precompiled.h migratetool/sqldeveloper.cpp \ migratetool/sqldeveloper.h migratetool/squirrelsql.cpp \ migratetool/squirrelsql.h migratetool/tora3.cpp \ migratetool/tora3.h shortcuteditor/shortcuteditordialog.cpp \ shortcuteditor/shortcuteditordialog.h \ shortcuteditor/shortcutmodel.cpp \ shortcuteditor/shortcutmodel.h tooracleconnection.cpp \ tooraclesetting.h tooracletable.cpp tooracleextract.cpp \ otl/otlv4.h toteradataconnection.cpp \ $(LOKIDIR_SRC)/SmallObj.cpp $(LOKIDIR_SRC)/Singleton.cpp \ moc_toabout.cpp moc_toalert.cpp moc_toanalyze.cpp \ moc_tobackup.cpp moc_tobarchart.cpp moc_tobackgroundlabel.cpp \ moc_tobrowser.cpp moc_tobrowserconstraint.cpp \ moc_tobrowserindex.cpp moc_tobrowsertable.cpp \ moc_tochangeconnection.cpp moc_tochartmanager.cpp \ moc_toconnection.cpp moc_toconnectionmodel.cpp \ moc_tocodemodel.cpp moc_toconnectionpool.cpp \ moc_toconnectionimport.cpp moc_todescribe.cpp \ moc_torunnable.cpp moc_tonoblockquery.cpp moc_toeventquery.cpp \ moc_toeventquerytask.cpp moc_tocurrent.cpp moc_todatatype.cpp \ moc_todebug.cpp moc_todebugtext.cpp moc_toeditextensions.cpp \ moc_tofilesize.cpp moc_toglobalsetting.cpp moc_tohelp.cpp \ moc_tohelpsetup.cpp moc_tohighlightedtext.cpp \ moc_toinvalid.cpp moc_tolegendchart.cpp moc_tolinechart.cpp \ moc_tomain.cpp moc_tomainwindow.cpp moc_tomarkedtext.cpp \ moc_tomemoeditor.cpp moc_tomodeleditor.cpp moc_tomessage.cpp \ moc_tonewconnection.cpp moc_tooutput.cpp moc_toparamget.cpp \ moc_topiechart.cpp moc_toplsqleditor.cpp moc_toplsqltext.cpp \ moc_topreferences.cpp moc_toprofiler.cpp moc_toproject.cpp \ moc_toresult.cpp moc_toresultbar.cpp moc_toresultcols.cpp \ moc_toresultcolscomment.cpp moc_toresultcombo.cpp \ moc_toresultschema.cpp moc_toresultdepend.cpp \ moc_toresultextract.cpp moc_toresultfield.cpp \ moc_toresultitem.cpp moc_toresultlabel.cpp \ moc_toresultline.cpp moc_toresultlock.cpp moc_toresultlong.cpp \ moc_toresultparam.cpp moc_toresultpie.cpp moc_toresultplan.cpp \ moc_toresultstats.cpp moc_toresultstorage.cpp \ moc_toresultview.cpp moc_toresultlistformat.cpp \ moc_toresultmodel.cpp moc_toresulttableview.cpp \ moc_toresulttableviewedit.cpp moc_toresultdata.cpp \ moc_toresultdatasingle.cpp moc_totreewidget.cpp \ moc_torollback.cpp moc_toscript.cpp moc_tosearchreplace.cpp \ moc_tosecurity.cpp moc_tosecuritytreemodel.cpp \ moc_tosession.cpp moc_tosgastatement.cpp moc_tosgatrace.cpp \ moc_tosmtp.cpp moc_tosqledit.cpp moc_tostorage.cpp \ moc_tosyntaxsetup.cpp moc_totableselect.cpp \ moc_totabwidget.cpp moc_totemplate.cpp moc_totemporary.cpp \ moc_tothread_p.cpp moc_totool.cpp moc_totuning.cpp \ moc_tounittest.cpp moc_tovisualize.cpp moc_towaitevents.cpp \ moc_toworksheet.cpp moc_toeditablemenu.cpp \ moc_toworksheetwidget.cpp moc_toworksheetstatistic.cpp \ moc_utils.cpp moc_toscriptschemawidget.cpp \ moc_toscripttreemodel.cpp moc_toworkingwidget.cpp \ shortcuteditor/moc_shortcuteditordialog.cpp \ shortcuteditor/moc_shortcutmodel.cpp moc_todocklet.cpp \ moc_todockbar.cpp moc_topushbutton.cpp \ moc_tobrowserbasewidget.cpp moc_tobrowseraccesswidget.cpp \ moc_tobrowsertablewidget.cpp moc_tobrowserviewwidget.cpp \ moc_tobrowserindexwidget.cpp moc_tobrowserschemawidget.cpp \ moc_tobrowsersequencewidget.cpp moc_tobrowsersynonymwidget.cpp \ moc_tobrowsercodewidget.cpp moc_tobrowsertriggerwidget.cpp \ moc_tobrowserdblinkswidget.cpp \ moc_tobrowserdirectorieswidget.cpp moc_toresultgrants.cpp \ docklets/moc_toviewdirectory.cpp \ docklets/moc_toviewconnections.cpp ui_toaboutui.h \ ui_todroptablespaceui.h ui_tobrowserconstraintui.h \ ui_tobrowserfilterui.h ui_tobrowserindexui.h ui_todescribeui.h \ ui_tobrowsertableui.h ui_toconnectionimportui.h \ ui_tochartalarmui.h ui_tochartsetupui.h \ ui_todatabasesettingui.h ui_todebugchangeui.h \ ui_todebugwatch.h ui_toeditextensiongotoui.h \ ui_toeditextensionsetupui.h ui_toglobalsettingui.h \ ui_tohelpaddfileui.h ui_tohelpsetupui.h \ ui_tolinechartsetupui.h ui_tomessageui.h \ ui_tonewconnectionui.h ui_tooraclesettingui.h \ ui_topreferencesui.h ui_toresultcontentfilterui.h \ ui_toresultlistformatui.h ui_torollbackdialogui.h \ ui_toscriptui.h ui_tosearchreplaceui.h ui_tosecurityquotaui.h \ ui_tosecurityroleui.h ui_tosecurityuserui.h \ ui_tostoragedatafileui.h ui_tostoragedefinitionui.h \ ui_tostoragedialogui.h ui_tostorageprefsui.h \ ui_tostoragetablespaceui.h ui_tosyntaxsetupui.h \ ui_totemplateaddfileui.h ui_totemplateeditui.h \ ui_totemplatesetupui.h ui_totoolsettingui.h \ ui_totuningoverviewui.h ui_totuningsettingui.h \ ui_toworksheetsetupui.h ui_tohelpui.h \ ui_toscriptschemawidgetui.h ui_connectioncolorsdialogui.h \ shortcuteditor/ui_shortcuteditordialog.h \ moc_tooraclesetting.cpp $(filter \ %.qm,$(TRANSLATIONS:%.ts=%.qm)) tora_toad.h qrc_tora.cpp @HAVE_ORACLE_TRUE@am__objects_1 = tora-tooracleconnection.$(OBJEXT) \ @HAVE_ORACLE_TRUE@ tora-tooracletable.$(OBJEXT) \ @HAVE_ORACLE_TRUE@ tora-tooracleextract.$(OBJEXT) @HAVE_TERADATA_TRUE@am__objects_2 = \ @HAVE_TERADATA_TRUE@ tora-toteradataconnection.$(OBJEXT) @HAVE_ORACLE_TRUE@am__objects_3 = tora-moc_tooraclesetting.$(OBJEXT) am__objects_4 = tora-moc_toabout.$(OBJEXT) tora-moc_toalert.$(OBJEXT) \ tora-moc_toanalyze.$(OBJEXT) tora-moc_tobackup.$(OBJEXT) \ tora-moc_tobarchart.$(OBJEXT) \ tora-moc_tobackgroundlabel.$(OBJEXT) \ tora-moc_tobrowser.$(OBJEXT) \ tora-moc_tobrowserconstraint.$(OBJEXT) \ tora-moc_tobrowserindex.$(OBJEXT) \ tora-moc_tobrowsertable.$(OBJEXT) \ tora-moc_tochangeconnection.$(OBJEXT) \ tora-moc_tochartmanager.$(OBJEXT) \ tora-moc_toconnection.$(OBJEXT) \ tora-moc_toconnectionmodel.$(OBJEXT) \ tora-moc_tocodemodel.$(OBJEXT) \ tora-moc_toconnectionpool.$(OBJEXT) \ tora-moc_toconnectionimport.$(OBJEXT) \ tora-moc_todescribe.$(OBJEXT) tora-moc_torunnable.$(OBJEXT) \ tora-moc_tonoblockquery.$(OBJEXT) \ tora-moc_toeventquery.$(OBJEXT) \ tora-moc_toeventquerytask.$(OBJEXT) \ tora-moc_tocurrent.$(OBJEXT) tora-moc_todatatype.$(OBJEXT) \ tora-moc_todebug.$(OBJEXT) tora-moc_todebugtext.$(OBJEXT) \ tora-moc_toeditextensions.$(OBJEXT) \ tora-moc_tofilesize.$(OBJEXT) \ tora-moc_toglobalsetting.$(OBJEXT) tora-moc_tohelp.$(OBJEXT) \ tora-moc_tohelpsetup.$(OBJEXT) \ tora-moc_tohighlightedtext.$(OBJEXT) \ tora-moc_toinvalid.$(OBJEXT) tora-moc_tolegendchart.$(OBJEXT) \ tora-moc_tolinechart.$(OBJEXT) tora-moc_tomain.$(OBJEXT) \ tora-moc_tomainwindow.$(OBJEXT) \ tora-moc_tomarkedtext.$(OBJEXT) \ tora-moc_tomemoeditor.$(OBJEXT) \ tora-moc_tomodeleditor.$(OBJEXT) tora-moc_tomessage.$(OBJEXT) \ tora-moc_tonewconnection.$(OBJEXT) tora-moc_tooutput.$(OBJEXT) \ tora-moc_toparamget.$(OBJEXT) tora-moc_topiechart.$(OBJEXT) \ tora-moc_toplsqleditor.$(OBJEXT) \ tora-moc_toplsqltext.$(OBJEXT) \ tora-moc_topreferences.$(OBJEXT) tora-moc_toprofiler.$(OBJEXT) \ tora-moc_toproject.$(OBJEXT) tora-moc_toresult.$(OBJEXT) \ tora-moc_toresultbar.$(OBJEXT) tora-moc_toresultcols.$(OBJEXT) \ tora-moc_toresultcolscomment.$(OBJEXT) \ tora-moc_toresultcombo.$(OBJEXT) \ tora-moc_toresultschema.$(OBJEXT) \ tora-moc_toresultdepend.$(OBJEXT) \ tora-moc_toresultextract.$(OBJEXT) \ tora-moc_toresultfield.$(OBJEXT) \ tora-moc_toresultitem.$(OBJEXT) \ tora-moc_toresultlabel.$(OBJEXT) \ tora-moc_toresultline.$(OBJEXT) \ tora-moc_toresultlock.$(OBJEXT) \ tora-moc_toresultlong.$(OBJEXT) \ tora-moc_toresultparam.$(OBJEXT) \ tora-moc_toresultpie.$(OBJEXT) tora-moc_toresultplan.$(OBJEXT) \ tora-moc_toresultstats.$(OBJEXT) \ tora-moc_toresultstorage.$(OBJEXT) \ tora-moc_toresultview.$(OBJEXT) \ tora-moc_toresultlistformat.$(OBJEXT) \ tora-moc_toresultmodel.$(OBJEXT) \ tora-moc_toresulttableview.$(OBJEXT) \ tora-moc_toresulttableviewedit.$(OBJEXT) \ tora-moc_toresultdata.$(OBJEXT) \ tora-moc_toresultdatasingle.$(OBJEXT) \ tora-moc_totreewidget.$(OBJEXT) tora-moc_torollback.$(OBJEXT) \ tora-moc_toscript.$(OBJEXT) tora-moc_tosearchreplace.$(OBJEXT) \ tora-moc_tosecurity.$(OBJEXT) \ tora-moc_tosecuritytreemodel.$(OBJEXT) \ tora-moc_tosession.$(OBJEXT) tora-moc_tosgastatement.$(OBJEXT) \ tora-moc_tosgatrace.$(OBJEXT) tora-moc_tosmtp.$(OBJEXT) \ tora-moc_tosqledit.$(OBJEXT) tora-moc_tostorage.$(OBJEXT) \ tora-moc_tosyntaxsetup.$(OBJEXT) \ tora-moc_totableselect.$(OBJEXT) \ tora-moc_totabwidget.$(OBJEXT) tora-moc_totemplate.$(OBJEXT) \ tora-moc_totemporary.$(OBJEXT) tora-moc_tothread_p.$(OBJEXT) \ tora-moc_totool.$(OBJEXT) tora-moc_totuning.$(OBJEXT) \ tora-moc_tounittest.$(OBJEXT) tora-moc_tovisualize.$(OBJEXT) \ tora-moc_towaitevents.$(OBJEXT) tora-moc_toworksheet.$(OBJEXT) \ tora-moc_toeditablemenu.$(OBJEXT) \ tora-moc_toworksheetwidget.$(OBJEXT) \ tora-moc_toworksheetstatistic.$(OBJEXT) \ tora-moc_utils.$(OBJEXT) \ tora-moc_toscriptschemawidget.$(OBJEXT) \ tora-moc_toscripttreemodel.$(OBJEXT) \ tora-moc_toworkingwidget.$(OBJEXT) \ tora-moc_shortcuteditordialog.$(OBJEXT) \ tora-moc_shortcutmodel.$(OBJEXT) tora-moc_todocklet.$(OBJEXT) \ tora-moc_todockbar.$(OBJEXT) tora-moc_topushbutton.$(OBJEXT) \ tora-moc_tobrowserbasewidget.$(OBJEXT) \ tora-moc_tobrowseraccesswidget.$(OBJEXT) \ tora-moc_tobrowsertablewidget.$(OBJEXT) \ tora-moc_tobrowserviewwidget.$(OBJEXT) \ tora-moc_tobrowserindexwidget.$(OBJEXT) \ tora-moc_tobrowserschemawidget.$(OBJEXT) \ tora-moc_tobrowsersequencewidget.$(OBJEXT) \ tora-moc_tobrowsersynonymwidget.$(OBJEXT) \ tora-moc_tobrowsercodewidget.$(OBJEXT) \ tora-moc_tobrowsertriggerwidget.$(OBJEXT) \ tora-moc_tobrowserdblinkswidget.$(OBJEXT) \ tora-moc_tobrowserdirectorieswidget.$(OBJEXT) \ tora-moc_toresultgrants.$(OBJEXT) \ tora-moc_toviewdirectory.$(OBJEXT) \ tora-moc_toviewconnections.$(OBJEXT) $(am__objects_3) \ tora-qrc_tora.$(OBJEXT) am_tora_OBJECTS = tora-main.$(OBJEXT) tora-tomainwindow.$(OBJEXT) \ tora-toabout.$(OBJEXT) tora-tobackground.$(OBJEXT) \ tora-tobackgroundlabel.$(OBJEXT) \ tora-toconfiguration.$(OBJEXT) tora-toconnection.$(OBJEXT) \ tora-toqvalue.$(OBJEXT) tora-toconnectionimport.$(OBJEXT) \ tora-toconnectionpool.$(OBJEXT) tora-todescribe.$(OBJEXT) \ tora-torunnable.$(OBJEXT) tora-toeditwidget.$(OBJEXT) \ tora-toglobalsetting.$(OBJEXT) tora-tohelp.$(OBJEXT) \ tora-tohighlightedtext.$(OBJEXT) tora-tohtml.$(OBJEXT) \ tora-tolistviewformatter.$(OBJEXT) \ tora-tolistviewformattercsv.$(OBJEXT) \ tora-tolistviewformatterhtml.$(OBJEXT) \ tora-tolistviewformattersql.$(OBJEXT) \ tora-tolistviewformattertabdel.$(OBJEXT) \ tora-tolistviewformattertext.$(OBJEXT) tora-tomain.$(OBJEXT) \ tora-tomarkedtext.$(OBJEXT) tora-tomemoeditor.$(OBJEXT) \ tora-tomodeleditor.$(OBJEXT) tora-tomessage.$(OBJEXT) \ tora-tonewconnection.$(OBJEXT) tora-tonoblockquery.$(OBJEXT) \ tora-toeventquery.$(OBJEXT) tora-toeventquerytask.$(OBJEXT) \ tora-toparamget.$(OBJEXT) tora-topreferences.$(OBJEXT) \ tora-toplsqleditor.$(OBJEXT) tora-toplsqltext.$(OBJEXT) \ tora-toresult.$(OBJEXT) tora-toresultfield.$(OBJEXT) \ tora-toresultitem.$(OBJEXT) tora-toresultstats.$(OBJEXT) \ tora-toresultview.$(OBJEXT) tora-toresultlistformat.$(OBJEXT) \ tora-toresultmodel.$(OBJEXT) tora-toresulttableview.$(OBJEXT) \ tora-toresulttableviewedit.$(OBJEXT) \ tora-toresultdata.$(OBJEXT) tora-toresultdatasingle.$(OBJEXT) \ tora-totreewidget.$(OBJEXT) tora-tosearchreplace.$(OBJEXT) \ tora-tosmtp.$(OBJEXT) tora-tosplash.$(OBJEXT) \ tora-tosql.$(OBJEXT) tora-tosqlparse.$(OBJEXT) \ tora-tosyntaxsetup.$(OBJEXT) tora-totabwidget.$(OBJEXT) \ tora-totemplateprovider.$(OBJEXT) tora-totextview.$(OBJEXT) \ tora-tothread.$(OBJEXT) tora-totimer.$(OBJEXT) \ tora-totool.$(OBJEXT) tora-utils.$(OBJEXT) \ tora-toalert.$(OBJEXT) tora-toanalyze.$(OBJEXT) \ tora-tobackup.$(OBJEXT) tora-tobackuptool.$(OBJEXT) \ tora-tobrowser.$(OBJEXT) tora-todocklet.$(OBJEXT) \ tora-todockbar.$(OBJEXT) tora-topushbutton.$(OBJEXT) \ tora-toviewdirectory.$(OBJEXT) \ tora-toviewconnections.$(OBJEXT) tora-tobarchart.$(OBJEXT) \ tora-tocurrent.$(OBJEXT) tora-todebug.$(OBJEXT) \ tora-toeditextensions.$(OBJEXT) tora-todatatype.$(OBJEXT) \ tora-toinvalid.$(OBJEXT) tora-tooutput.$(OBJEXT) \ tora-topassword.$(OBJEXT) tora-toprofiler.$(OBJEXT) \ tora-toproject.$(OBJEXT) tora-toqsqlconnection.$(OBJEXT) \ tora-torollback.$(OBJEXT) tora-toscript.$(OBJEXT) \ tora-toscriptschemawidget.$(OBJEXT) \ tora-toscripttreeitem.$(OBJEXT) tora-tocodemodel.$(OBJEXT) \ tora-toscripttreemodel.$(OBJEXT) tora-tosecurity.$(OBJEXT) \ tora-tosecuritytreemodel.$(OBJEXT) \ tora-tosecuritytreeitem.$(OBJEXT) tora-tosession.$(OBJEXT) \ tora-tosgatrace.$(OBJEXT) tora-tosqledit.$(OBJEXT) \ tora-tostorage.$(OBJEXT) tora-tostoragedefinition.$(OBJEXT) \ tora-totemplate.$(OBJEXT) tora-totemporary.$(OBJEXT) \ tora-totuning.$(OBJEXT) tora-tounittest.$(OBJEXT) \ tora-tochangeconnection.$(OBJEXT) \ tora-toworkingwidget.$(OBJEXT) tora-toworksheet.$(OBJEXT) \ tora-toeditablemenu.$(OBJEXT) tora-toworksheetwidget.$(OBJEXT) \ tora-toworksheettext.$(OBJEXT) \ tora-toworksheetstatistic.$(OBJEXT) \ tora-tobrowserconstraint.$(OBJEXT) \ tora-tobrowserindex.$(OBJEXT) tora-tobrowsertable.$(OBJEXT) \ tora-tochartmanager.$(OBJEXT) tora-tolegendchart.$(OBJEXT) \ tora-tolinechart.$(OBJEXT) tora-topiechart.$(OBJEXT) \ tora-toresultbar.$(OBJEXT) tora-toresultline.$(OBJEXT) \ tora-toresultpie.$(OBJEXT) tora-todebugtext.$(OBJEXT) \ tora-toextract.$(OBJEXT) tora-toreport.$(OBJEXT) \ tora-toresultextract.$(OBJEXT) tora-toresultcols.$(OBJEXT) \ tora-toresultcolscomment.$(OBJEXT) \ tora-toresultcombo.$(OBJEXT) tora-toresultschema.$(OBJEXT) \ tora-toresultdepend.$(OBJEXT) tora-toresultlabel.$(OBJEXT) \ tora-toresultlock.$(OBJEXT) tora-toresultlong.$(OBJEXT) \ tora-toresultplan.$(OBJEXT) tora-toresultparam.$(OBJEXT) \ tora-toresultstorage.$(OBJEXT) tora-tofilesize.$(OBJEXT) \ tora-tosgastatement.$(OBJEXT) tora-totableselect.$(OBJEXT) \ tora-tovisualize.$(OBJEXT) tora-towaitevents.$(OBJEXT) \ tora-toconnectionmodel.$(OBJEXT) \ tora-tobrowserbasewidget.$(OBJEXT) \ tora-tobrowseraccesswidget.$(OBJEXT) \ tora-tobrowsertablewidget.$(OBJEXT) \ tora-tobrowserviewwidget.$(OBJEXT) \ tora-tobrowserindexwidget.$(OBJEXT) \ tora-tobrowserschemawidget.$(OBJEXT) \ tora-tobrowsersequencewidget.$(OBJEXT) \ tora-tobrowsersynonymwidget.$(OBJEXT) \ tora-tobrowsercodewidget.$(OBJEXT) \ tora-tobrowsertriggerwidget.$(OBJEXT) \ tora-tobrowserdblinkswidget.$(OBJEXT) \ tora-tobrowserdirectorieswidget.$(OBJEXT) \ tora-toresultgrants.$(OBJEXT) tora-toawr.$(OBJEXT) \ tora-sqldeveloper.$(OBJEXT) tora-squirrelsql.$(OBJEXT) \ tora-tora3.$(OBJEXT) tora-shortcuteditordialog.$(OBJEXT) \ tora-shortcutmodel.$(OBJEXT) $(am__objects_1) $(am__objects_2) \ tora-SmallObj.$(OBJEXT) tora-Singleton.$(OBJEXT) \ $(am__objects_4) tora_OBJECTS = $(am_tora_OBJECTS) am__DEPENDENCIES_1 = tora_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) tora_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(tora_CXXFLAGS) $(CXXFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(tora_SOURCES) DIST_SOURCES = $(am__tora_SOURCES_DIST) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ CPPUNIT_CONFIG = @CPPUNIT_CONFIG@ CPPUNIT_LIBS = @CPPUNIT_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ISODATE = @ISODATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIPO = @LIPO@ LN_S = @LN_S@ LRELEASE = @LRELEASE@ LTLIBOBJS = @LTLIBOBJS@ LUPDATE = @LUPDATE@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MOC = @MOC@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORACLE_CXXFLAGS = @ORACLE_CXXFLAGS@ ORACLE_LDFLAGS = @ORACLE_LDFLAGS@ ORACLE_LIBS = @ORACLE_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCRE_CFLAGS = @PCRE_CFLAGS@ PCRE_LIBS = @PCRE_LIBS@ PQ_LIBS = @PQ_LIBS@ QSCINTILLA_CXXFLAGS = @QSCINTILLA_CXXFLAGS@ QSCINTILLA_LDFLAGS = @QSCINTILLA_LDFLAGS@ QTDIR = @QTDIR@ QT_DEFINES = @QT_DEFINES@ QT_INCLUDES = @QT_INCLUDES@ QT_LDFLAGS = @QT_LDFLAGS@ RANLIB = @RANLIB@ RCC = @RCC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TERADATA_CXXFLAGS = @TERADATA_CXXFLAGS@ TERADATA_LDFLAGS = @TERADATA_LDFLAGS@ TERADATA_LIBS = @TERADATA_LIBS@ UIC = @UIC@ VERSION = @VERSION@ WIN_CXXFLAGS = @WIN_CXXFLAGS@ WIN_LDFLAGS = @WIN_LDFLAGS@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_path_moc = @ac_path_moc@ ac_path_rcc = @ac_path_rcc@ ac_path_uic = @ac_path_uic@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ qt_includes = @qt_includes@ qt_libraries = @qt_libraries@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # require version or better AUTOMAKE_OPTIONS = 1.7 METASOURCES = AUTO TRANSLATIONS = \ i18n/tora_se.ts \ i18n/tora_fr.ts \ i18n/tora_it.ts \ i18n/tora_toad.ts LOKIDIR_INC = $(top_srcdir)/src/loki/include LOKIDIR_SRC = $(top_srcdir)/src/loki/src AM_CPPFLAGS = -I./otl -I$(LOKIDIR_INC) $(QT_INCLUDES) $(LTDLINCL) \ $(PCRE_CFLAGS) -DDEFAULT_PLUGIN_DIR=\"$(libdir)\" \ -DTOVERSION=\"$(PACKAGE_VERSION)\" $(ORACLE_CXXFLAGS) \ $(TERADATA_CXXFLAGS) $(QT_DEFINES) $(WIN_CXXFLAGS) \ $(QSCINTILLA_CXXFLAGS) AM_LDFLAGS = $(PCRE_LIBS) \ $(QT_LDFLAGS) \ $(LIB_DCOP) \ -lstdc++ \ $(LIBPTHREAD) \ $(ORACLE_LDFLAGS) \ $(TERADATA_LDFLAGS) \ $(WIN_LDFLAGS) \ $(QSCINTILLA_LDFLAGS) # fix for annoying automake naming problems. tora_CXXFLAGS = $(AM_CXXFLAGS) tora_LDADD = $(ORACLE_LIBS) $(PQ_LIBS) $(TERADATA_LIBS) $(@TORA_LINK_OTHERS@) @HAVE_ORACLE_TRUE@EXTRA_ORACLE_MONO_SOURCE = tooracleconnection.cpp tooraclesetting.h \ @HAVE_ORACLE_TRUE@ tooracletable.cpp \ @HAVE_ORACLE_TRUE@ tooracleextract.cpp otl/otlv4.h @HAVE_ORACLE_TRUE@EXTRA_ORACLE_MONO_SOURCE_MOC = moc_tooraclesetting.cpp @HAVE_TERADATA_TRUE@EXTRA_TERADATE_SOURCE = toteradataconnection.cpp tora_SOURCES = main.cpp \ tomainwindow.cpp tomainwindow.h \ toabout.cpp toabout.h \ tobackground.cpp tobackground.h \ tobackgroundlabel.cpp tobackgroundlabel.h \ toconfiguration.cpp toconfiguration.h \ toconnection.cpp toconnection.h \ toqvalue.cpp toqvalue.h \ toconnectionimport.cpp toconnectionimport.h \ toconnectionpool.cpp toconnectionpool.h \ todescribe.cpp todescribe.h \ torunnable.cpp torunnable.h \ toeditwidget.cpp toeditwidget.h \ toglobalsetting.cpp toglobalsetting.h \ tohelp.cpp tohelp.h tohelpsetup.h \ tohighlightedtext.cpp tohighlightedtext.h \ tohtml.cpp tohtml.h \ tolistviewformatter.cpp tolistviewformatter.h \ tolistviewformattercsv.cpp tolistviewformattercsv.h \ tolistviewformatterfactory.h \ tolistviewformatterhtml.cpp tolistviewformatterhtml.h \ tolistviewformatteridentifier.h \ tolistviewformattersql.cpp tolistviewformattersql.h \ tolistviewformattertabdel.cpp tolistviewformattertabdel.h \ tolistviewformattertext.cpp tolistviewformattertext.h \ tomain.cpp tomain.h \ tomarkedtext.cpp tomarkedtext.h \ tomemoeditor.cpp tomemoeditor.h \ tomodeleditor.cpp tomodeleditor.h \ tomessage.cpp tomessage.h \ tonewconnection.cpp tonewconnection.h \ tonoblockquery.cpp tonoblockquery.h \ toeventquery.cpp toeventquery.h \ toeventquerytask.cpp toeventquerytask.h \ toparamget.cpp toparamget.h \ topreferences.cpp topreferences.h \ toplsqleditor.cpp toplsqleditor.h \ toplsqltext.cpp toplsqltext.h \ toresult.cpp toresult.h \ toresultfield.cpp toresultfield.h \ toresultitem.cpp toresultitem.h \ toresultstats.cpp toresultstats.h \ toresultview.cpp toresultview.h \ toresultlistformat.cpp toresultlistformat.h \ toresultmodel.cpp toresultmodel.h \ toresulttableview.cpp toresulttableview.h \ toresulttableviewedit.cpp toresulttableviewedit.h \ toresultdata.cpp toresultdata.h \ toresultdatasingle.cpp toresultdatasingle.h \ totreewidget.cpp totreewidget.h \ tosearchreplace.cpp tosearchreplace.h \ tosmtp.cpp tosmtp.h \ tosplash.cpp tosplash.h \ tosql.cpp tosql.h \ tosqlparse.cpp tosqlparse.h \ tosyntaxsetup.cpp tosyntaxsetup.h \ totabwidget.cpp totabwidget.h \ totemplateprovider.cpp \ totextview.cpp totextview.h \ tothread.cpp tothread.h tothread_p.h \ totimer.cpp totimer.h \ totool.cpp totool.h \ utils.cpp utils.h \ toalert.cpp toalert.h \ toanalyze.cpp toanalyze.h \ tobackup.cpp tobackup.h \ tobackuptool.cpp tobackuptool.h \ tobrowser.cpp tobrowser.h \ todocklet.cpp todocklet.h \ todockbar.cpp todockbar.h \ topushbutton.cpp topushbutton.h \ docklets/toviewdirectory.cpp docklets/toviewdirectory.h \ docklets/toviewconnections.cpp docklets/toviewconnections.h \ tobarchart.cpp tobarchart.h \ tocurrent.cpp tocurrent.h \ todebug.cpp todebug.h \ toeditextensions.cpp toeditextensions.h \ todatatype.cpp todatatype.h \ toinvalid.cpp toinvalid.h \ tooutput.cpp tooutput.h \ topassword.cpp \ toprofiler.cpp toprofiler.h \ toproject.cpp toproject.h \ toqsqlconnection.cpp \ torollback.cpp torollback.h \ toscript.cpp toscript.h \ toscriptschemawidget.cpp toscriptschemawidget.h \ toscripttreeitem.cpp toscripttreeitem.h \ tocodemodel.cpp tocodemodel.h \ toscripttreemodel.cpp toscripttreemodel.h \ tosecurity.cpp tosecurity.h \ tosecuritytreemodel.cpp tosecuritytreemodel.h \ tosecuritytreeitem.cpp tosecuritytreeitem.h \ tosession.cpp tosession.h \ tosgatrace.cpp tosgatrace.h \ tosqledit.cpp tosqledit.h \ tostorage.cpp tostorage.h \ tostoragedefinition.cpp tostoragedefinition.h \ totemplate.cpp totemplate.h \ totemporary.cpp totemporary.h \ totuning.cpp totuning.h \ tounittest.cpp tounittest.h \ tochangeconnection.cpp tochangeconnection.h \ toworkingwidget.cpp toworkingwidget.h \ toworksheet.cpp toworksheet.h \ toeditablemenu.cpp toeditablemenu.h \ toworksheetwidget.cpp toworksheetwidget.h \ toworksheettext.cpp toworksheettext.h \ toworksheetstatistic.cpp toworksheetstatistic.h \ tobrowserconstraint.cpp tobrowserconstraint.h \ tobrowserindex.cpp tobrowserindex.h \ tobrowsertable.cpp tobrowsertable.h \ tochartmanager.cpp tochartmanager.h \ tolegendchart.cpp tolegendchart.h \ tolinechart.cpp tolinechart.h \ topiechart.cpp topiechart.h \ toresultbar.cpp toresultbar.h \ toresultline.cpp toresultline.h \ toresultpie.cpp toresultpie.h \ todebugtext.cpp todebugtext.h \ toextract.cpp toextract.h \ toreport.cpp toreport.h \ toresultextract.cpp toresultextract.h \ toresultcols.cpp toresultcols.h \ toresultcolscomment.cpp toresultcolscomment.h \ toresultcombo.cpp toresultcombo.h \ toresultschema.cpp toresultschema.h \ toresultdepend.cpp toresultdepend.h \ toresultlabel.cpp toresultlabel.h \ toresultlock.cpp toresultlock.h \ toresultlong.cpp toresultlong.h \ toresultplan.cpp toresultplan.h \ toresultparam.cpp toresultparam.h \ toresultstorage.cpp toresultstorage.h \ tofilesize.cpp tofilesize.h \ tosgastatement.cpp tosgastatement.h \ totableselect.cpp totableselect.h \ tovisualize.cpp tovisualize.h \ towaitevents.cpp towaitevents.h \ toconnectionmodel.cpp toconnectionmodel.h \ tobrowserbasewidget.cpp tobrowserbasewidget.h \ tobrowseraccesswidget.cpp tobrowseraccesswidget.h \ tobrowsertablewidget.cpp tobrowsertablewidget.h \ tobrowserviewwidget.cpp tobrowserviewwidget.h \ tobrowserindexwidget.cpp tobrowserindexwidget.h \ tobrowserschemawidget.cpp tobrowserschemawidget.h \ tobrowsersequencewidget.cpp tobrowsersequencewidget.h \ tobrowsersynonymwidget.cpp tobrowsersynonymwidget.h \ tobrowsercodewidget.cpp tobrowsercodewidget.h \ tobrowsertriggerwidget.cpp tobrowsertriggerwidget.h \ tobrowserdblinkswidget.cpp tobrowserdblinkswidget.h \ tobrowserdirectorieswidget.cpp tobrowserdirectorieswidget.h \ toresultgrants.cpp toresultgrants.h \ toawr.cpp toawr.h \ precompiled.h \ migratetool/sqldeveloper.cpp migratetool/sqldeveloper.h \ migratetool/squirrelsql.cpp migratetool/squirrelsql.h \ migratetool/tora3.cpp migratetool/tora3.h \ shortcuteditor/shortcuteditordialog.cpp shortcuteditor/shortcuteditordialog.h \ shortcuteditor/shortcutmodel.cpp shortcuteditor/shortcutmodel.h \ $(EXTRA_ORACLE_MONO_SOURCE) \ $(EXTRA_TERADATE_SOURCE) \ $(LOKIDIR_SRC)/SmallObj.cpp \ $(LOKIDIR_SRC)/Singleton.cpp \ $(EXTRA_tora_SOURCES) \ $(BUILT_SOURCES) UI_FILES = toaboutui.ui \ tobrowserconstraintui.ui \ tobrowserfilterui.ui \ tobrowserindexui.ui \ tobrowsertableui.ui \ toconnectionimportui.ui \ todescribeui.ui \ tooraclesettingui.ui \ tostoragetablespaceui.ui \ tochartalarmui.ui \ topreferencesui.ui \ tosyntaxsetupui.ui \ tochartsetupui.ui \ toresultcontentfilterui.ui \ totemplateaddfileui.ui \ todatabasesettingui.ui \ toresultlistformatui.ui \ totemplateeditui.ui \ todebugchangeui.ui \ torollbackdialogui.ui \ totemplatesetupui.ui \ todebugwatch.ui \ toscriptui.ui \ toscriptschemawidgetui.ui \ totoolsettingui.ui \ toeditextensiongotoui.ui \ tosearchreplaceui.ui \ totuningoverviewui.ui \ toeditextensionsetupui.ui \ tosecurityquotaui.ui \ totuningsettingui.ui \ toglobalsettingui.ui \ tosecurityroleui.ui \ toworksheetsetupui.ui \ tohelpui.ui \ tohelpaddfileui.ui \ tosecurityuserui.ui \ tohelpsetupui.ui \ tostoragedatafileui.ui \ tolinechartsetupui.ui \ tostoragedefinitionui.ui \ tomessageui.ui \ tostoragedialogui.ui \ tonewconnectionui.ui \ tostorageprefsui.ui \ todroptablespaceui.ui \ toscriptschemawidgetui.ui \ shortcuteditor/shortcuteditordialog.ui \ connectioncolorsdialogui.ui EXTRA_DIST = icons \ templates \ windows \ qscintilla2 \ COPYRIGHT.h \ help \ $(LOKIDIR_INC) \ $(UI_FILES) \ CMakeLists.txt \ loki/CMakeLists.txt \ Makefile.am \ toconf.h \ todefaultkeywords.h \ toextratranslations.cpp \ tomysqlkeywords.h \ toocistub.cpp \ tooraclepreload.cpp \ toresultresources.h \ tooracleextract.h \ tologger.h \ ts_log/critical_section.h \ ts_log/decorator.h \ ts_log/message_handler_log.h \ ts_log/thread_safe_log.h \ ts_log/ts_log_utils.h \ $(TRANSLATIONS) \ LICENSE.h \ tora.qrc \ tora.rc # mrj: this sorta sucks. there's a lot of generated source files... # the old build system distributed the .depends folder in the source # tarball, which is the old way of handling the dependencies. that's # not fully portable. using BUILT_SOURCES is the (relatively speaking) # new work around. this is mainly why i've required automake >= 1.6. # files listed in BUILT_SOURCES are built before anything else. BUILT_SOURCES = \ moc_toabout.cpp \ moc_toalert.cpp \ moc_toanalyze.cpp \ moc_tobackup.cpp \ moc_tobarchart.cpp \ moc_tobackgroundlabel.cpp \ moc_tobrowser.cpp \ moc_tobrowserconstraint.cpp \ moc_tobrowserindex.cpp \ moc_tobrowsertable.cpp \ moc_tochangeconnection.cpp \ moc_tochartmanager.cpp \ moc_toconnection.cpp \ moc_toconnectionmodel.cpp \ moc_tocodemodel.cpp \ moc_toconnectionpool.cpp \ moc_toconnectionimport.cpp \ moc_todescribe.cpp \ moc_torunnable.cpp \ moc_tonoblockquery.cpp \ moc_toeventquery.cpp \ moc_toeventquerytask.cpp \ moc_tocurrent.cpp \ moc_todatatype.cpp \ moc_todebug.cpp \ moc_todebugtext.cpp \ moc_toeditextensions.cpp \ moc_tofilesize.cpp \ moc_toglobalsetting.cpp \ moc_tohelp.cpp \ moc_tohelpsetup.cpp \ moc_tohighlightedtext.cpp \ moc_toinvalid.cpp \ moc_tolegendchart.cpp \ moc_tolinechart.cpp \ moc_tomain.cpp \ moc_tomainwindow.cpp \ moc_tomarkedtext.cpp \ moc_tomemoeditor.cpp \ moc_tomodeleditor.cpp \ moc_tomessage.cpp \ moc_tonewconnection.cpp \ moc_tooutput.cpp \ moc_toparamget.cpp \ moc_topiechart.cpp \ moc_toplsqleditor.cpp \ moc_toplsqltext.cpp \ moc_topreferences.cpp \ moc_toprofiler.cpp \ moc_toproject.cpp \ moc_toresult.cpp \ moc_toresultbar.cpp \ moc_toresultcols.cpp \ moc_toresultcolscomment.cpp \ moc_toresultcombo.cpp \ moc_toresultschema.cpp \ moc_toresultdepend.cpp \ moc_toresultextract.cpp \ moc_toresultfield.cpp \ moc_toresultitem.cpp \ moc_toresultlabel.cpp \ moc_toresultline.cpp \ moc_toresultlock.cpp \ moc_toresultlong.cpp \ moc_toresultparam.cpp \ moc_toresultpie.cpp \ moc_toresultplan.cpp \ moc_toresultstats.cpp \ moc_toresultstorage.cpp \ moc_toresultview.cpp \ moc_toresultlistformat.cpp \ moc_toresultmodel.cpp \ moc_toresulttableview.cpp \ moc_toresulttableviewedit.cpp \ moc_toresultdata.cpp \ moc_toresultdatasingle.cpp \ moc_totreewidget.cpp \ moc_torollback.cpp \ moc_toscript.cpp \ moc_tosearchreplace.cpp \ moc_tosecurity.cpp \ moc_tosecuritytreemodel.cpp \ moc_tosession.cpp \ moc_tosgastatement.cpp \ moc_tosgatrace.cpp \ moc_tosmtp.cpp \ moc_tosqledit.cpp \ moc_tostorage.cpp \ moc_tosyntaxsetup.cpp \ moc_totableselect.cpp \ moc_totabwidget.cpp \ moc_totemplate.cpp \ moc_totemporary.cpp \ moc_tothread_p.cpp \ moc_totool.cpp \ moc_totuning.cpp \ moc_tounittest.cpp \ moc_tovisualize.cpp \ moc_towaitevents.cpp \ moc_toworksheet.cpp \ moc_toeditablemenu.cpp \ moc_toworksheetwidget.cpp \ moc_toworksheetstatistic.cpp \ moc_utils.cpp \ moc_toscriptschemawidget.cpp \ moc_toscripttreemodel.cpp \ moc_toworkingwidget.cpp \ shortcuteditor/moc_shortcuteditordialog.cpp \ shortcuteditor/moc_shortcutmodel.cpp \ moc_todocklet.cpp \ moc_todockbar.cpp \ moc_topushbutton.cpp \ moc_tobrowserbasewidget.cpp \ moc_tobrowseraccesswidget.cpp \ moc_tobrowsertablewidget.cpp \ moc_tobrowserviewwidget.cpp \ moc_tobrowserindexwidget.cpp \ moc_tobrowserschemawidget.cpp \ moc_tobrowsersequencewidget.cpp \ moc_tobrowsersynonymwidget.cpp \ moc_tobrowsercodewidget.cpp \ moc_tobrowsertriggerwidget.cpp \ moc_tobrowserdblinkswidget.cpp \ moc_tobrowserdirectorieswidget.cpp \ moc_toresultgrants.cpp \ docklets/moc_toviewdirectory.cpp \ docklets/moc_toviewconnections.cpp \ ui_toaboutui.h \ ui_todroptablespaceui.h \ ui_tobrowserconstraintui.h \ ui_tobrowserfilterui.h \ ui_tobrowserindexui.h \ ui_todescribeui.h \ ui_tobrowsertableui.h \ ui_toconnectionimportui.h \ ui_tochartalarmui.h \ ui_tochartsetupui.h \ ui_todatabasesettingui.h \ ui_todebugchangeui.h \ ui_todebugwatch.h \ ui_toeditextensiongotoui.h \ ui_toeditextensionsetupui.h \ ui_toglobalsettingui.h \ ui_tohelpaddfileui.h \ ui_tohelpsetupui.h \ ui_tolinechartsetupui.h \ ui_tomessageui.h \ ui_tonewconnectionui.h \ ui_tooraclesettingui.h \ ui_topreferencesui.h \ ui_toresultcontentfilterui.h \ ui_toresultlistformatui.h \ ui_torollbackdialogui.h \ ui_toscriptui.h \ ui_tosearchreplaceui.h \ ui_tosecurityquotaui.h \ ui_tosecurityroleui.h \ ui_tosecurityuserui.h \ ui_tostoragedatafileui.h \ ui_tostoragedefinitionui.h \ ui_tostoragedialogui.h \ ui_tostorageprefsui.h \ ui_tostoragetablespaceui.h \ ui_tosyntaxsetupui.h \ ui_totemplateaddfileui.h \ ui_totemplateeditui.h \ ui_totemplatesetupui.h \ ui_totoolsettingui.h \ ui_totuningoverviewui.h \ ui_totuningsettingui.h \ ui_toworksheetsetupui.h \ ui_tohelpui.h \ ui_toscriptschemawidgetui.h \ ui_connectioncolorsdialogui.h \ shortcuteditor/ui_shortcuteditordialog.h \ $(EXTRA_ORACLE_MONO_SOURCE_MOC) \ $(filter %.qm,$(TRANSLATIONS:%.ts=%.qm)) \ tora_toad.h \ qrc_tora.cpp all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj .qm .ts $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list tora$(EXEEXT): $(tora_OBJECTS) $(tora_DEPENDENCIES) @rm -f tora$(EXEEXT) $(tora_LINK) $(tora_OBJECTS) $(tora_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-Singleton.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-SmallObj.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_shortcuteditordialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_shortcutmodel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toabout.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toalert.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toanalyze.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobackgroundlabel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobackup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobarchart.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowseraccesswidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowserbasewidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowsercodewidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowserconstraint.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowserdblinkswidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowserdirectorieswidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowserindex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowserindexwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowserschemawidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowsersequencewidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowsersynonymwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowsertable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowsertablewidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowsertriggerwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tobrowserviewwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tochangeconnection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tochartmanager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tocodemodel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toconnection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toconnectionimport.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toconnectionmodel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toconnectionpool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tocurrent.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_todatatype.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_todebug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_todebugtext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_todescribe.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_todockbar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_todocklet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toeditablemenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toeditextensions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toeventquery.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toeventquerytask.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tofilesize.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toglobalsetting.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tohelp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tohelpsetup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tohighlightedtext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toinvalid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tolegendchart.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tolinechart.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tomain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tomainwindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tomarkedtext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tomemoeditor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tomessage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tomodeleditor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tonewconnection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tonoblockquery.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tooraclesetting.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tooutput.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toparamget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_topiechart.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toplsqleditor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toplsqltext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_topreferences.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toprofiler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toproject.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_topushbutton.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresult.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultbar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultcols.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultcolscomment.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultcombo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultdata.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultdatasingle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultdepend.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultextract.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultfield.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultgrants.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultitem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultlabel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultlistformat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultlock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultlong.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultmodel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultparam.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultpie.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultplan.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultschema.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultstats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultstorage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresulttableview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresulttableviewedit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toresultview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_torollback.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_torunnable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toscript.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toscriptschemawidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toscripttreemodel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tosearchreplace.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tosecurity.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tosecuritytreemodel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tosession.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tosgastatement.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tosgatrace.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tosmtp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tosqledit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tostorage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tosyntaxsetup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_totableselect.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_totabwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_totemplate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_totemporary.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tothread_p.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_totool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_totreewidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_totuning.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tounittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toviewconnections.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toviewdirectory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_tovisualize.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_towaitevents.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toworkingwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toworksheet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toworksheetstatistic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_toworksheetwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-moc_utils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-qrc_tora.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-shortcuteditordialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-shortcutmodel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-sqldeveloper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-squirrelsql.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toabout.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toalert.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toanalyze.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toawr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobackground.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobackgroundlabel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobackup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobackuptool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobarchart.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowseraccesswidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowserbasewidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowsercodewidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowserconstraint.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowserdblinkswidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowserdirectorieswidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowserindex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowserindexwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowserschemawidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowsersequencewidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowsersynonymwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowsertable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowsertablewidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowsertriggerwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tobrowserviewwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tochangeconnection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tochartmanager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tocodemodel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toconfiguration.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toconnection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toconnectionimport.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toconnectionmodel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toconnectionpool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tocurrent.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-todatatype.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-todebug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-todebugtext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-todescribe.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-todockbar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-todocklet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toeditablemenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toeditextensions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toeditwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toeventquery.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toeventquerytask.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toextract.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tofilesize.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toglobalsetting.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tohelp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tohighlightedtext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tohtml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toinvalid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tolegendchart.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tolinechart.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tolistviewformatter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tolistviewformattercsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tolistviewformatterhtml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tolistviewformattersql.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tolistviewformattertabdel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tolistviewformattertext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tomain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tomainwindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tomarkedtext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tomemoeditor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tomessage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tomodeleditor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tonewconnection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tonoblockquery.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tooracleconnection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tooracleextract.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tooracletable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tooutput.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toparamget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-topassword.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-topiechart.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toplsqleditor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toplsqltext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-topreferences.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toprofiler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toproject.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-topushbutton.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toqsqlconnection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toqvalue.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tora3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toreport.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresult.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultbar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultcols.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultcolscomment.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultcombo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultdata.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultdatasingle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultdepend.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultextract.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultfield.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultgrants.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultitem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultlabel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultlistformat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultlock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultlong.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultmodel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultparam.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultpie.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultplan.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultschema.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultstats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultstorage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresulttableview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresulttableviewedit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toresultview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-torollback.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-torunnable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toscript.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toscriptschemawidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toscripttreeitem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toscripttreemodel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tosearchreplace.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tosecurity.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tosecuritytreeitem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tosecuritytreemodel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tosession.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tosgastatement.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tosgatrace.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tosmtp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tosplash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tosql.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tosqledit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tosqlparse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tostorage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tostoragedefinition.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tosyntaxsetup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-totableselect.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-totabwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-totemplate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-totemplateprovider.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-totemporary.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toteradataconnection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-totextview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tothread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-totimer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-totool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-totreewidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-totuning.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tounittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toviewconnections.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toviewdirectory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-tovisualize.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-towaitevents.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toworkingwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toworksheet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toworksheetstatistic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toworksheettext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-toworksheetwidget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tora-utils.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< tora-main.o: main.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-main.o -MD -MP -MF $(DEPDIR)/tora-main.Tpo -c -o tora-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-main.Tpo $(DEPDIR)/tora-main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='main.cpp' object='tora-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp tora-main.obj: main.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-main.obj -MD -MP -MF $(DEPDIR)/tora-main.Tpo -c -o tora-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-main.Tpo $(DEPDIR)/tora-main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='main.cpp' object='tora-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi` tora-tomainwindow.o: tomainwindow.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tomainwindow.o -MD -MP -MF $(DEPDIR)/tora-tomainwindow.Tpo -c -o tora-tomainwindow.o `test -f 'tomainwindow.cpp' || echo '$(srcdir)/'`tomainwindow.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tomainwindow.Tpo $(DEPDIR)/tora-tomainwindow.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tomainwindow.cpp' object='tora-tomainwindow.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tomainwindow.o `test -f 'tomainwindow.cpp' || echo '$(srcdir)/'`tomainwindow.cpp tora-tomainwindow.obj: tomainwindow.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tomainwindow.obj -MD -MP -MF $(DEPDIR)/tora-tomainwindow.Tpo -c -o tora-tomainwindow.obj `if test -f 'tomainwindow.cpp'; then $(CYGPATH_W) 'tomainwindow.cpp'; else $(CYGPATH_W) '$(srcdir)/tomainwindow.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tomainwindow.Tpo $(DEPDIR)/tora-tomainwindow.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tomainwindow.cpp' object='tora-tomainwindow.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tomainwindow.obj `if test -f 'tomainwindow.cpp'; then $(CYGPATH_W) 'tomainwindow.cpp'; else $(CYGPATH_W) '$(srcdir)/tomainwindow.cpp'; fi` tora-toabout.o: toabout.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toabout.o -MD -MP -MF $(DEPDIR)/tora-toabout.Tpo -c -o tora-toabout.o `test -f 'toabout.cpp' || echo '$(srcdir)/'`toabout.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toabout.Tpo $(DEPDIR)/tora-toabout.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toabout.cpp' object='tora-toabout.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toabout.o `test -f 'toabout.cpp' || echo '$(srcdir)/'`toabout.cpp tora-toabout.obj: toabout.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toabout.obj -MD -MP -MF $(DEPDIR)/tora-toabout.Tpo -c -o tora-toabout.obj `if test -f 'toabout.cpp'; then $(CYGPATH_W) 'toabout.cpp'; else $(CYGPATH_W) '$(srcdir)/toabout.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toabout.Tpo $(DEPDIR)/tora-toabout.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toabout.cpp' object='tora-toabout.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toabout.obj `if test -f 'toabout.cpp'; then $(CYGPATH_W) 'toabout.cpp'; else $(CYGPATH_W) '$(srcdir)/toabout.cpp'; fi` tora-tobackground.o: tobackground.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobackground.o -MD -MP -MF $(DEPDIR)/tora-tobackground.Tpo -c -o tora-tobackground.o `test -f 'tobackground.cpp' || echo '$(srcdir)/'`tobackground.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobackground.Tpo $(DEPDIR)/tora-tobackground.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobackground.cpp' object='tora-tobackground.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobackground.o `test -f 'tobackground.cpp' || echo '$(srcdir)/'`tobackground.cpp tora-tobackground.obj: tobackground.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobackground.obj -MD -MP -MF $(DEPDIR)/tora-tobackground.Tpo -c -o tora-tobackground.obj `if test -f 'tobackground.cpp'; then $(CYGPATH_W) 'tobackground.cpp'; else $(CYGPATH_W) '$(srcdir)/tobackground.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobackground.Tpo $(DEPDIR)/tora-tobackground.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobackground.cpp' object='tora-tobackground.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobackground.obj `if test -f 'tobackground.cpp'; then $(CYGPATH_W) 'tobackground.cpp'; else $(CYGPATH_W) '$(srcdir)/tobackground.cpp'; fi` tora-tobackgroundlabel.o: tobackgroundlabel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobackgroundlabel.o -MD -MP -MF $(DEPDIR)/tora-tobackgroundlabel.Tpo -c -o tora-tobackgroundlabel.o `test -f 'tobackgroundlabel.cpp' || echo '$(srcdir)/'`tobackgroundlabel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobackgroundlabel.Tpo $(DEPDIR)/tora-tobackgroundlabel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobackgroundlabel.cpp' object='tora-tobackgroundlabel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobackgroundlabel.o `test -f 'tobackgroundlabel.cpp' || echo '$(srcdir)/'`tobackgroundlabel.cpp tora-tobackgroundlabel.obj: tobackgroundlabel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobackgroundlabel.obj -MD -MP -MF $(DEPDIR)/tora-tobackgroundlabel.Tpo -c -o tora-tobackgroundlabel.obj `if test -f 'tobackgroundlabel.cpp'; then $(CYGPATH_W) 'tobackgroundlabel.cpp'; else $(CYGPATH_W) '$(srcdir)/tobackgroundlabel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobackgroundlabel.Tpo $(DEPDIR)/tora-tobackgroundlabel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobackgroundlabel.cpp' object='tora-tobackgroundlabel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobackgroundlabel.obj `if test -f 'tobackgroundlabel.cpp'; then $(CYGPATH_W) 'tobackgroundlabel.cpp'; else $(CYGPATH_W) '$(srcdir)/tobackgroundlabel.cpp'; fi` tora-toconfiguration.o: toconfiguration.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toconfiguration.o -MD -MP -MF $(DEPDIR)/tora-toconfiguration.Tpo -c -o tora-toconfiguration.o `test -f 'toconfiguration.cpp' || echo '$(srcdir)/'`toconfiguration.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toconfiguration.Tpo $(DEPDIR)/tora-toconfiguration.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toconfiguration.cpp' object='tora-toconfiguration.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toconfiguration.o `test -f 'toconfiguration.cpp' || echo '$(srcdir)/'`toconfiguration.cpp tora-toconfiguration.obj: toconfiguration.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toconfiguration.obj -MD -MP -MF $(DEPDIR)/tora-toconfiguration.Tpo -c -o tora-toconfiguration.obj `if test -f 'toconfiguration.cpp'; then $(CYGPATH_W) 'toconfiguration.cpp'; else $(CYGPATH_W) '$(srcdir)/toconfiguration.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toconfiguration.Tpo $(DEPDIR)/tora-toconfiguration.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toconfiguration.cpp' object='tora-toconfiguration.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toconfiguration.obj `if test -f 'toconfiguration.cpp'; then $(CYGPATH_W) 'toconfiguration.cpp'; else $(CYGPATH_W) '$(srcdir)/toconfiguration.cpp'; fi` tora-toconnection.o: toconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toconnection.o -MD -MP -MF $(DEPDIR)/tora-toconnection.Tpo -c -o tora-toconnection.o `test -f 'toconnection.cpp' || echo '$(srcdir)/'`toconnection.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toconnection.Tpo $(DEPDIR)/tora-toconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toconnection.cpp' object='tora-toconnection.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toconnection.o `test -f 'toconnection.cpp' || echo '$(srcdir)/'`toconnection.cpp tora-toconnection.obj: toconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toconnection.obj -MD -MP -MF $(DEPDIR)/tora-toconnection.Tpo -c -o tora-toconnection.obj `if test -f 'toconnection.cpp'; then $(CYGPATH_W) 'toconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/toconnection.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toconnection.Tpo $(DEPDIR)/tora-toconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toconnection.cpp' object='tora-toconnection.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toconnection.obj `if test -f 'toconnection.cpp'; then $(CYGPATH_W) 'toconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/toconnection.cpp'; fi` tora-toqvalue.o: toqvalue.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toqvalue.o -MD -MP -MF $(DEPDIR)/tora-toqvalue.Tpo -c -o tora-toqvalue.o `test -f 'toqvalue.cpp' || echo '$(srcdir)/'`toqvalue.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toqvalue.Tpo $(DEPDIR)/tora-toqvalue.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toqvalue.cpp' object='tora-toqvalue.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toqvalue.o `test -f 'toqvalue.cpp' || echo '$(srcdir)/'`toqvalue.cpp tora-toqvalue.obj: toqvalue.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toqvalue.obj -MD -MP -MF $(DEPDIR)/tora-toqvalue.Tpo -c -o tora-toqvalue.obj `if test -f 'toqvalue.cpp'; then $(CYGPATH_W) 'toqvalue.cpp'; else $(CYGPATH_W) '$(srcdir)/toqvalue.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toqvalue.Tpo $(DEPDIR)/tora-toqvalue.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toqvalue.cpp' object='tora-toqvalue.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toqvalue.obj `if test -f 'toqvalue.cpp'; then $(CYGPATH_W) 'toqvalue.cpp'; else $(CYGPATH_W) '$(srcdir)/toqvalue.cpp'; fi` tora-toconnectionimport.o: toconnectionimport.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toconnectionimport.o -MD -MP -MF $(DEPDIR)/tora-toconnectionimport.Tpo -c -o tora-toconnectionimport.o `test -f 'toconnectionimport.cpp' || echo '$(srcdir)/'`toconnectionimport.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toconnectionimport.Tpo $(DEPDIR)/tora-toconnectionimport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toconnectionimport.cpp' object='tora-toconnectionimport.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toconnectionimport.o `test -f 'toconnectionimport.cpp' || echo '$(srcdir)/'`toconnectionimport.cpp tora-toconnectionimport.obj: toconnectionimport.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toconnectionimport.obj -MD -MP -MF $(DEPDIR)/tora-toconnectionimport.Tpo -c -o tora-toconnectionimport.obj `if test -f 'toconnectionimport.cpp'; then $(CYGPATH_W) 'toconnectionimport.cpp'; else $(CYGPATH_W) '$(srcdir)/toconnectionimport.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toconnectionimport.Tpo $(DEPDIR)/tora-toconnectionimport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toconnectionimport.cpp' object='tora-toconnectionimport.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toconnectionimport.obj `if test -f 'toconnectionimport.cpp'; then $(CYGPATH_W) 'toconnectionimport.cpp'; else $(CYGPATH_W) '$(srcdir)/toconnectionimport.cpp'; fi` tora-toconnectionpool.o: toconnectionpool.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toconnectionpool.o -MD -MP -MF $(DEPDIR)/tora-toconnectionpool.Tpo -c -o tora-toconnectionpool.o `test -f 'toconnectionpool.cpp' || echo '$(srcdir)/'`toconnectionpool.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toconnectionpool.Tpo $(DEPDIR)/tora-toconnectionpool.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toconnectionpool.cpp' object='tora-toconnectionpool.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toconnectionpool.o `test -f 'toconnectionpool.cpp' || echo '$(srcdir)/'`toconnectionpool.cpp tora-toconnectionpool.obj: toconnectionpool.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toconnectionpool.obj -MD -MP -MF $(DEPDIR)/tora-toconnectionpool.Tpo -c -o tora-toconnectionpool.obj `if test -f 'toconnectionpool.cpp'; then $(CYGPATH_W) 'toconnectionpool.cpp'; else $(CYGPATH_W) '$(srcdir)/toconnectionpool.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toconnectionpool.Tpo $(DEPDIR)/tora-toconnectionpool.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toconnectionpool.cpp' object='tora-toconnectionpool.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toconnectionpool.obj `if test -f 'toconnectionpool.cpp'; then $(CYGPATH_W) 'toconnectionpool.cpp'; else $(CYGPATH_W) '$(srcdir)/toconnectionpool.cpp'; fi` tora-todescribe.o: todescribe.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-todescribe.o -MD -MP -MF $(DEPDIR)/tora-todescribe.Tpo -c -o tora-todescribe.o `test -f 'todescribe.cpp' || echo '$(srcdir)/'`todescribe.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-todescribe.Tpo $(DEPDIR)/tora-todescribe.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='todescribe.cpp' object='tora-todescribe.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-todescribe.o `test -f 'todescribe.cpp' || echo '$(srcdir)/'`todescribe.cpp tora-todescribe.obj: todescribe.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-todescribe.obj -MD -MP -MF $(DEPDIR)/tora-todescribe.Tpo -c -o tora-todescribe.obj `if test -f 'todescribe.cpp'; then $(CYGPATH_W) 'todescribe.cpp'; else $(CYGPATH_W) '$(srcdir)/todescribe.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-todescribe.Tpo $(DEPDIR)/tora-todescribe.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='todescribe.cpp' object='tora-todescribe.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-todescribe.obj `if test -f 'todescribe.cpp'; then $(CYGPATH_W) 'todescribe.cpp'; else $(CYGPATH_W) '$(srcdir)/todescribe.cpp'; fi` tora-torunnable.o: torunnable.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-torunnable.o -MD -MP -MF $(DEPDIR)/tora-torunnable.Tpo -c -o tora-torunnable.o `test -f 'torunnable.cpp' || echo '$(srcdir)/'`torunnable.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-torunnable.Tpo $(DEPDIR)/tora-torunnable.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='torunnable.cpp' object='tora-torunnable.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-torunnable.o `test -f 'torunnable.cpp' || echo '$(srcdir)/'`torunnable.cpp tora-torunnable.obj: torunnable.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-torunnable.obj -MD -MP -MF $(DEPDIR)/tora-torunnable.Tpo -c -o tora-torunnable.obj `if test -f 'torunnable.cpp'; then $(CYGPATH_W) 'torunnable.cpp'; else $(CYGPATH_W) '$(srcdir)/torunnable.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-torunnable.Tpo $(DEPDIR)/tora-torunnable.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='torunnable.cpp' object='tora-torunnable.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-torunnable.obj `if test -f 'torunnable.cpp'; then $(CYGPATH_W) 'torunnable.cpp'; else $(CYGPATH_W) '$(srcdir)/torunnable.cpp'; fi` tora-toeditwidget.o: toeditwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toeditwidget.o -MD -MP -MF $(DEPDIR)/tora-toeditwidget.Tpo -c -o tora-toeditwidget.o `test -f 'toeditwidget.cpp' || echo '$(srcdir)/'`toeditwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toeditwidget.Tpo $(DEPDIR)/tora-toeditwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toeditwidget.cpp' object='tora-toeditwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toeditwidget.o `test -f 'toeditwidget.cpp' || echo '$(srcdir)/'`toeditwidget.cpp tora-toeditwidget.obj: toeditwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toeditwidget.obj -MD -MP -MF $(DEPDIR)/tora-toeditwidget.Tpo -c -o tora-toeditwidget.obj `if test -f 'toeditwidget.cpp'; then $(CYGPATH_W) 'toeditwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/toeditwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toeditwidget.Tpo $(DEPDIR)/tora-toeditwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toeditwidget.cpp' object='tora-toeditwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toeditwidget.obj `if test -f 'toeditwidget.cpp'; then $(CYGPATH_W) 'toeditwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/toeditwidget.cpp'; fi` tora-toglobalsetting.o: toglobalsetting.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toglobalsetting.o -MD -MP -MF $(DEPDIR)/tora-toglobalsetting.Tpo -c -o tora-toglobalsetting.o `test -f 'toglobalsetting.cpp' || echo '$(srcdir)/'`toglobalsetting.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toglobalsetting.Tpo $(DEPDIR)/tora-toglobalsetting.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toglobalsetting.cpp' object='tora-toglobalsetting.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toglobalsetting.o `test -f 'toglobalsetting.cpp' || echo '$(srcdir)/'`toglobalsetting.cpp tora-toglobalsetting.obj: toglobalsetting.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toglobalsetting.obj -MD -MP -MF $(DEPDIR)/tora-toglobalsetting.Tpo -c -o tora-toglobalsetting.obj `if test -f 'toglobalsetting.cpp'; then $(CYGPATH_W) 'toglobalsetting.cpp'; else $(CYGPATH_W) '$(srcdir)/toglobalsetting.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toglobalsetting.Tpo $(DEPDIR)/tora-toglobalsetting.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toglobalsetting.cpp' object='tora-toglobalsetting.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toglobalsetting.obj `if test -f 'toglobalsetting.cpp'; then $(CYGPATH_W) 'toglobalsetting.cpp'; else $(CYGPATH_W) '$(srcdir)/toglobalsetting.cpp'; fi` tora-tohelp.o: tohelp.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tohelp.o -MD -MP -MF $(DEPDIR)/tora-tohelp.Tpo -c -o tora-tohelp.o `test -f 'tohelp.cpp' || echo '$(srcdir)/'`tohelp.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tohelp.Tpo $(DEPDIR)/tora-tohelp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tohelp.cpp' object='tora-tohelp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tohelp.o `test -f 'tohelp.cpp' || echo '$(srcdir)/'`tohelp.cpp tora-tohelp.obj: tohelp.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tohelp.obj -MD -MP -MF $(DEPDIR)/tora-tohelp.Tpo -c -o tora-tohelp.obj `if test -f 'tohelp.cpp'; then $(CYGPATH_W) 'tohelp.cpp'; else $(CYGPATH_W) '$(srcdir)/tohelp.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tohelp.Tpo $(DEPDIR)/tora-tohelp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tohelp.cpp' object='tora-tohelp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tohelp.obj `if test -f 'tohelp.cpp'; then $(CYGPATH_W) 'tohelp.cpp'; else $(CYGPATH_W) '$(srcdir)/tohelp.cpp'; fi` tora-tohighlightedtext.o: tohighlightedtext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tohighlightedtext.o -MD -MP -MF $(DEPDIR)/tora-tohighlightedtext.Tpo -c -o tora-tohighlightedtext.o `test -f 'tohighlightedtext.cpp' || echo '$(srcdir)/'`tohighlightedtext.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tohighlightedtext.Tpo $(DEPDIR)/tora-tohighlightedtext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tohighlightedtext.cpp' object='tora-tohighlightedtext.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tohighlightedtext.o `test -f 'tohighlightedtext.cpp' || echo '$(srcdir)/'`tohighlightedtext.cpp tora-tohighlightedtext.obj: tohighlightedtext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tohighlightedtext.obj -MD -MP -MF $(DEPDIR)/tora-tohighlightedtext.Tpo -c -o tora-tohighlightedtext.obj `if test -f 'tohighlightedtext.cpp'; then $(CYGPATH_W) 'tohighlightedtext.cpp'; else $(CYGPATH_W) '$(srcdir)/tohighlightedtext.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tohighlightedtext.Tpo $(DEPDIR)/tora-tohighlightedtext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tohighlightedtext.cpp' object='tora-tohighlightedtext.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tohighlightedtext.obj `if test -f 'tohighlightedtext.cpp'; then $(CYGPATH_W) 'tohighlightedtext.cpp'; else $(CYGPATH_W) '$(srcdir)/tohighlightedtext.cpp'; fi` tora-tohtml.o: tohtml.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tohtml.o -MD -MP -MF $(DEPDIR)/tora-tohtml.Tpo -c -o tora-tohtml.o `test -f 'tohtml.cpp' || echo '$(srcdir)/'`tohtml.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tohtml.Tpo $(DEPDIR)/tora-tohtml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tohtml.cpp' object='tora-tohtml.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tohtml.o `test -f 'tohtml.cpp' || echo '$(srcdir)/'`tohtml.cpp tora-tohtml.obj: tohtml.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tohtml.obj -MD -MP -MF $(DEPDIR)/tora-tohtml.Tpo -c -o tora-tohtml.obj `if test -f 'tohtml.cpp'; then $(CYGPATH_W) 'tohtml.cpp'; else $(CYGPATH_W) '$(srcdir)/tohtml.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tohtml.Tpo $(DEPDIR)/tora-tohtml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tohtml.cpp' object='tora-tohtml.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tohtml.obj `if test -f 'tohtml.cpp'; then $(CYGPATH_W) 'tohtml.cpp'; else $(CYGPATH_W) '$(srcdir)/tohtml.cpp'; fi` tora-tolistviewformatter.o: tolistviewformatter.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolistviewformatter.o -MD -MP -MF $(DEPDIR)/tora-tolistviewformatter.Tpo -c -o tora-tolistviewformatter.o `test -f 'tolistviewformatter.cpp' || echo '$(srcdir)/'`tolistviewformatter.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolistviewformatter.Tpo $(DEPDIR)/tora-tolistviewformatter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolistviewformatter.cpp' object='tora-tolistviewformatter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolistviewformatter.o `test -f 'tolistviewformatter.cpp' || echo '$(srcdir)/'`tolistviewformatter.cpp tora-tolistviewformatter.obj: tolistviewformatter.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolistviewformatter.obj -MD -MP -MF $(DEPDIR)/tora-tolistviewformatter.Tpo -c -o tora-tolistviewformatter.obj `if test -f 'tolistviewformatter.cpp'; then $(CYGPATH_W) 'tolistviewformatter.cpp'; else $(CYGPATH_W) '$(srcdir)/tolistviewformatter.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolistviewformatter.Tpo $(DEPDIR)/tora-tolistviewformatter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolistviewformatter.cpp' object='tora-tolistviewformatter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolistviewformatter.obj `if test -f 'tolistviewformatter.cpp'; then $(CYGPATH_W) 'tolistviewformatter.cpp'; else $(CYGPATH_W) '$(srcdir)/tolistviewformatter.cpp'; fi` tora-tolistviewformattercsv.o: tolistviewformattercsv.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolistviewformattercsv.o -MD -MP -MF $(DEPDIR)/tora-tolistviewformattercsv.Tpo -c -o tora-tolistviewformattercsv.o `test -f 'tolistviewformattercsv.cpp' || echo '$(srcdir)/'`tolistviewformattercsv.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolistviewformattercsv.Tpo $(DEPDIR)/tora-tolistviewformattercsv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolistviewformattercsv.cpp' object='tora-tolistviewformattercsv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolistviewformattercsv.o `test -f 'tolistviewformattercsv.cpp' || echo '$(srcdir)/'`tolistviewformattercsv.cpp tora-tolistviewformattercsv.obj: tolistviewformattercsv.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolistviewformattercsv.obj -MD -MP -MF $(DEPDIR)/tora-tolistviewformattercsv.Tpo -c -o tora-tolistviewformattercsv.obj `if test -f 'tolistviewformattercsv.cpp'; then $(CYGPATH_W) 'tolistviewformattercsv.cpp'; else $(CYGPATH_W) '$(srcdir)/tolistviewformattercsv.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolistviewformattercsv.Tpo $(DEPDIR)/tora-tolistviewformattercsv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolistviewformattercsv.cpp' object='tora-tolistviewformattercsv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolistviewformattercsv.obj `if test -f 'tolistviewformattercsv.cpp'; then $(CYGPATH_W) 'tolistviewformattercsv.cpp'; else $(CYGPATH_W) '$(srcdir)/tolistviewformattercsv.cpp'; fi` tora-tolistviewformatterhtml.o: tolistviewformatterhtml.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolistviewformatterhtml.o -MD -MP -MF $(DEPDIR)/tora-tolistviewformatterhtml.Tpo -c -o tora-tolistviewformatterhtml.o `test -f 'tolistviewformatterhtml.cpp' || echo '$(srcdir)/'`tolistviewformatterhtml.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolistviewformatterhtml.Tpo $(DEPDIR)/tora-tolistviewformatterhtml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolistviewformatterhtml.cpp' object='tora-tolistviewformatterhtml.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolistviewformatterhtml.o `test -f 'tolistviewformatterhtml.cpp' || echo '$(srcdir)/'`tolistviewformatterhtml.cpp tora-tolistviewformatterhtml.obj: tolistviewformatterhtml.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolistviewformatterhtml.obj -MD -MP -MF $(DEPDIR)/tora-tolistviewformatterhtml.Tpo -c -o tora-tolistviewformatterhtml.obj `if test -f 'tolistviewformatterhtml.cpp'; then $(CYGPATH_W) 'tolistviewformatterhtml.cpp'; else $(CYGPATH_W) '$(srcdir)/tolistviewformatterhtml.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolistviewformatterhtml.Tpo $(DEPDIR)/tora-tolistviewformatterhtml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolistviewformatterhtml.cpp' object='tora-tolistviewformatterhtml.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolistviewformatterhtml.obj `if test -f 'tolistviewformatterhtml.cpp'; then $(CYGPATH_W) 'tolistviewformatterhtml.cpp'; else $(CYGPATH_W) '$(srcdir)/tolistviewformatterhtml.cpp'; fi` tora-tolistviewformattersql.o: tolistviewformattersql.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolistviewformattersql.o -MD -MP -MF $(DEPDIR)/tora-tolistviewformattersql.Tpo -c -o tora-tolistviewformattersql.o `test -f 'tolistviewformattersql.cpp' || echo '$(srcdir)/'`tolistviewformattersql.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolistviewformattersql.Tpo $(DEPDIR)/tora-tolistviewformattersql.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolistviewformattersql.cpp' object='tora-tolistviewformattersql.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolistviewformattersql.o `test -f 'tolistviewformattersql.cpp' || echo '$(srcdir)/'`tolistviewformattersql.cpp tora-tolistviewformattersql.obj: tolistviewformattersql.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolistviewformattersql.obj -MD -MP -MF $(DEPDIR)/tora-tolistviewformattersql.Tpo -c -o tora-tolistviewformattersql.obj `if test -f 'tolistviewformattersql.cpp'; then $(CYGPATH_W) 'tolistviewformattersql.cpp'; else $(CYGPATH_W) '$(srcdir)/tolistviewformattersql.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolistviewformattersql.Tpo $(DEPDIR)/tora-tolistviewformattersql.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolistviewformattersql.cpp' object='tora-tolistviewformattersql.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolistviewformattersql.obj `if test -f 'tolistviewformattersql.cpp'; then $(CYGPATH_W) 'tolistviewformattersql.cpp'; else $(CYGPATH_W) '$(srcdir)/tolistviewformattersql.cpp'; fi` tora-tolistviewformattertabdel.o: tolistviewformattertabdel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolistviewformattertabdel.o -MD -MP -MF $(DEPDIR)/tora-tolistviewformattertabdel.Tpo -c -o tora-tolistviewformattertabdel.o `test -f 'tolistviewformattertabdel.cpp' || echo '$(srcdir)/'`tolistviewformattertabdel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolistviewformattertabdel.Tpo $(DEPDIR)/tora-tolistviewformattertabdel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolistviewformattertabdel.cpp' object='tora-tolistviewformattertabdel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolistviewformattertabdel.o `test -f 'tolistviewformattertabdel.cpp' || echo '$(srcdir)/'`tolistviewformattertabdel.cpp tora-tolistviewformattertabdel.obj: tolistviewformattertabdel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolistviewformattertabdel.obj -MD -MP -MF $(DEPDIR)/tora-tolistviewformattertabdel.Tpo -c -o tora-tolistviewformattertabdel.obj `if test -f 'tolistviewformattertabdel.cpp'; then $(CYGPATH_W) 'tolistviewformattertabdel.cpp'; else $(CYGPATH_W) '$(srcdir)/tolistviewformattertabdel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolistviewformattertabdel.Tpo $(DEPDIR)/tora-tolistviewformattertabdel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolistviewformattertabdel.cpp' object='tora-tolistviewformattertabdel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolistviewformattertabdel.obj `if test -f 'tolistviewformattertabdel.cpp'; then $(CYGPATH_W) 'tolistviewformattertabdel.cpp'; else $(CYGPATH_W) '$(srcdir)/tolistviewformattertabdel.cpp'; fi` tora-tolistviewformattertext.o: tolistviewformattertext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolistviewformattertext.o -MD -MP -MF $(DEPDIR)/tora-tolistviewformattertext.Tpo -c -o tora-tolistviewformattertext.o `test -f 'tolistviewformattertext.cpp' || echo '$(srcdir)/'`tolistviewformattertext.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolistviewformattertext.Tpo $(DEPDIR)/tora-tolistviewformattertext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolistviewformattertext.cpp' object='tora-tolistviewformattertext.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolistviewformattertext.o `test -f 'tolistviewformattertext.cpp' || echo '$(srcdir)/'`tolistviewformattertext.cpp tora-tolistviewformattertext.obj: tolistviewformattertext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolistviewformattertext.obj -MD -MP -MF $(DEPDIR)/tora-tolistviewformattertext.Tpo -c -o tora-tolistviewformattertext.obj `if test -f 'tolistviewformattertext.cpp'; then $(CYGPATH_W) 'tolistviewformattertext.cpp'; else $(CYGPATH_W) '$(srcdir)/tolistviewformattertext.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolistviewformattertext.Tpo $(DEPDIR)/tora-tolistviewformattertext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolistviewformattertext.cpp' object='tora-tolistviewformattertext.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolistviewformattertext.obj `if test -f 'tolistviewformattertext.cpp'; then $(CYGPATH_W) 'tolistviewformattertext.cpp'; else $(CYGPATH_W) '$(srcdir)/tolistviewformattertext.cpp'; fi` tora-tomain.o: tomain.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tomain.o -MD -MP -MF $(DEPDIR)/tora-tomain.Tpo -c -o tora-tomain.o `test -f 'tomain.cpp' || echo '$(srcdir)/'`tomain.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tomain.Tpo $(DEPDIR)/tora-tomain.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tomain.cpp' object='tora-tomain.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tomain.o `test -f 'tomain.cpp' || echo '$(srcdir)/'`tomain.cpp tora-tomain.obj: tomain.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tomain.obj -MD -MP -MF $(DEPDIR)/tora-tomain.Tpo -c -o tora-tomain.obj `if test -f 'tomain.cpp'; then $(CYGPATH_W) 'tomain.cpp'; else $(CYGPATH_W) '$(srcdir)/tomain.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tomain.Tpo $(DEPDIR)/tora-tomain.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tomain.cpp' object='tora-tomain.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tomain.obj `if test -f 'tomain.cpp'; then $(CYGPATH_W) 'tomain.cpp'; else $(CYGPATH_W) '$(srcdir)/tomain.cpp'; fi` tora-tomarkedtext.o: tomarkedtext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tomarkedtext.o -MD -MP -MF $(DEPDIR)/tora-tomarkedtext.Tpo -c -o tora-tomarkedtext.o `test -f 'tomarkedtext.cpp' || echo '$(srcdir)/'`tomarkedtext.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tomarkedtext.Tpo $(DEPDIR)/tora-tomarkedtext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tomarkedtext.cpp' object='tora-tomarkedtext.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tomarkedtext.o `test -f 'tomarkedtext.cpp' || echo '$(srcdir)/'`tomarkedtext.cpp tora-tomarkedtext.obj: tomarkedtext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tomarkedtext.obj -MD -MP -MF $(DEPDIR)/tora-tomarkedtext.Tpo -c -o tora-tomarkedtext.obj `if test -f 'tomarkedtext.cpp'; then $(CYGPATH_W) 'tomarkedtext.cpp'; else $(CYGPATH_W) '$(srcdir)/tomarkedtext.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tomarkedtext.Tpo $(DEPDIR)/tora-tomarkedtext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tomarkedtext.cpp' object='tora-tomarkedtext.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tomarkedtext.obj `if test -f 'tomarkedtext.cpp'; then $(CYGPATH_W) 'tomarkedtext.cpp'; else $(CYGPATH_W) '$(srcdir)/tomarkedtext.cpp'; fi` tora-tomemoeditor.o: tomemoeditor.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tomemoeditor.o -MD -MP -MF $(DEPDIR)/tora-tomemoeditor.Tpo -c -o tora-tomemoeditor.o `test -f 'tomemoeditor.cpp' || echo '$(srcdir)/'`tomemoeditor.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tomemoeditor.Tpo $(DEPDIR)/tora-tomemoeditor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tomemoeditor.cpp' object='tora-tomemoeditor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tomemoeditor.o `test -f 'tomemoeditor.cpp' || echo '$(srcdir)/'`tomemoeditor.cpp tora-tomemoeditor.obj: tomemoeditor.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tomemoeditor.obj -MD -MP -MF $(DEPDIR)/tora-tomemoeditor.Tpo -c -o tora-tomemoeditor.obj `if test -f 'tomemoeditor.cpp'; then $(CYGPATH_W) 'tomemoeditor.cpp'; else $(CYGPATH_W) '$(srcdir)/tomemoeditor.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tomemoeditor.Tpo $(DEPDIR)/tora-tomemoeditor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tomemoeditor.cpp' object='tora-tomemoeditor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tomemoeditor.obj `if test -f 'tomemoeditor.cpp'; then $(CYGPATH_W) 'tomemoeditor.cpp'; else $(CYGPATH_W) '$(srcdir)/tomemoeditor.cpp'; fi` tora-tomodeleditor.o: tomodeleditor.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tomodeleditor.o -MD -MP -MF $(DEPDIR)/tora-tomodeleditor.Tpo -c -o tora-tomodeleditor.o `test -f 'tomodeleditor.cpp' || echo '$(srcdir)/'`tomodeleditor.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tomodeleditor.Tpo $(DEPDIR)/tora-tomodeleditor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tomodeleditor.cpp' object='tora-tomodeleditor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tomodeleditor.o `test -f 'tomodeleditor.cpp' || echo '$(srcdir)/'`tomodeleditor.cpp tora-tomodeleditor.obj: tomodeleditor.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tomodeleditor.obj -MD -MP -MF $(DEPDIR)/tora-tomodeleditor.Tpo -c -o tora-tomodeleditor.obj `if test -f 'tomodeleditor.cpp'; then $(CYGPATH_W) 'tomodeleditor.cpp'; else $(CYGPATH_W) '$(srcdir)/tomodeleditor.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tomodeleditor.Tpo $(DEPDIR)/tora-tomodeleditor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tomodeleditor.cpp' object='tora-tomodeleditor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tomodeleditor.obj `if test -f 'tomodeleditor.cpp'; then $(CYGPATH_W) 'tomodeleditor.cpp'; else $(CYGPATH_W) '$(srcdir)/tomodeleditor.cpp'; fi` tora-tomessage.o: tomessage.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tomessage.o -MD -MP -MF $(DEPDIR)/tora-tomessage.Tpo -c -o tora-tomessage.o `test -f 'tomessage.cpp' || echo '$(srcdir)/'`tomessage.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tomessage.Tpo $(DEPDIR)/tora-tomessage.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tomessage.cpp' object='tora-tomessage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tomessage.o `test -f 'tomessage.cpp' || echo '$(srcdir)/'`tomessage.cpp tora-tomessage.obj: tomessage.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tomessage.obj -MD -MP -MF $(DEPDIR)/tora-tomessage.Tpo -c -o tora-tomessage.obj `if test -f 'tomessage.cpp'; then $(CYGPATH_W) 'tomessage.cpp'; else $(CYGPATH_W) '$(srcdir)/tomessage.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tomessage.Tpo $(DEPDIR)/tora-tomessage.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tomessage.cpp' object='tora-tomessage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tomessage.obj `if test -f 'tomessage.cpp'; then $(CYGPATH_W) 'tomessage.cpp'; else $(CYGPATH_W) '$(srcdir)/tomessage.cpp'; fi` tora-tonewconnection.o: tonewconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tonewconnection.o -MD -MP -MF $(DEPDIR)/tora-tonewconnection.Tpo -c -o tora-tonewconnection.o `test -f 'tonewconnection.cpp' || echo '$(srcdir)/'`tonewconnection.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tonewconnection.Tpo $(DEPDIR)/tora-tonewconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tonewconnection.cpp' object='tora-tonewconnection.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tonewconnection.o `test -f 'tonewconnection.cpp' || echo '$(srcdir)/'`tonewconnection.cpp tora-tonewconnection.obj: tonewconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tonewconnection.obj -MD -MP -MF $(DEPDIR)/tora-tonewconnection.Tpo -c -o tora-tonewconnection.obj `if test -f 'tonewconnection.cpp'; then $(CYGPATH_W) 'tonewconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/tonewconnection.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tonewconnection.Tpo $(DEPDIR)/tora-tonewconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tonewconnection.cpp' object='tora-tonewconnection.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tonewconnection.obj `if test -f 'tonewconnection.cpp'; then $(CYGPATH_W) 'tonewconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/tonewconnection.cpp'; fi` tora-tonoblockquery.o: tonoblockquery.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tonoblockquery.o -MD -MP -MF $(DEPDIR)/tora-tonoblockquery.Tpo -c -o tora-tonoblockquery.o `test -f 'tonoblockquery.cpp' || echo '$(srcdir)/'`tonoblockquery.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tonoblockquery.Tpo $(DEPDIR)/tora-tonoblockquery.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tonoblockquery.cpp' object='tora-tonoblockquery.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tonoblockquery.o `test -f 'tonoblockquery.cpp' || echo '$(srcdir)/'`tonoblockquery.cpp tora-tonoblockquery.obj: tonoblockquery.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tonoblockquery.obj -MD -MP -MF $(DEPDIR)/tora-tonoblockquery.Tpo -c -o tora-tonoblockquery.obj `if test -f 'tonoblockquery.cpp'; then $(CYGPATH_W) 'tonoblockquery.cpp'; else $(CYGPATH_W) '$(srcdir)/tonoblockquery.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tonoblockquery.Tpo $(DEPDIR)/tora-tonoblockquery.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tonoblockquery.cpp' object='tora-tonoblockquery.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tonoblockquery.obj `if test -f 'tonoblockquery.cpp'; then $(CYGPATH_W) 'tonoblockquery.cpp'; else $(CYGPATH_W) '$(srcdir)/tonoblockquery.cpp'; fi` tora-toeventquery.o: toeventquery.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toeventquery.o -MD -MP -MF $(DEPDIR)/tora-toeventquery.Tpo -c -o tora-toeventquery.o `test -f 'toeventquery.cpp' || echo '$(srcdir)/'`toeventquery.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toeventquery.Tpo $(DEPDIR)/tora-toeventquery.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toeventquery.cpp' object='tora-toeventquery.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toeventquery.o `test -f 'toeventquery.cpp' || echo '$(srcdir)/'`toeventquery.cpp tora-toeventquery.obj: toeventquery.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toeventquery.obj -MD -MP -MF $(DEPDIR)/tora-toeventquery.Tpo -c -o tora-toeventquery.obj `if test -f 'toeventquery.cpp'; then $(CYGPATH_W) 'toeventquery.cpp'; else $(CYGPATH_W) '$(srcdir)/toeventquery.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toeventquery.Tpo $(DEPDIR)/tora-toeventquery.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toeventquery.cpp' object='tora-toeventquery.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toeventquery.obj `if test -f 'toeventquery.cpp'; then $(CYGPATH_W) 'toeventquery.cpp'; else $(CYGPATH_W) '$(srcdir)/toeventquery.cpp'; fi` tora-toeventquerytask.o: toeventquerytask.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toeventquerytask.o -MD -MP -MF $(DEPDIR)/tora-toeventquerytask.Tpo -c -o tora-toeventquerytask.o `test -f 'toeventquerytask.cpp' || echo '$(srcdir)/'`toeventquerytask.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toeventquerytask.Tpo $(DEPDIR)/tora-toeventquerytask.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toeventquerytask.cpp' object='tora-toeventquerytask.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toeventquerytask.o `test -f 'toeventquerytask.cpp' || echo '$(srcdir)/'`toeventquerytask.cpp tora-toeventquerytask.obj: toeventquerytask.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toeventquerytask.obj -MD -MP -MF $(DEPDIR)/tora-toeventquerytask.Tpo -c -o tora-toeventquerytask.obj `if test -f 'toeventquerytask.cpp'; then $(CYGPATH_W) 'toeventquerytask.cpp'; else $(CYGPATH_W) '$(srcdir)/toeventquerytask.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toeventquerytask.Tpo $(DEPDIR)/tora-toeventquerytask.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toeventquerytask.cpp' object='tora-toeventquerytask.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toeventquerytask.obj `if test -f 'toeventquerytask.cpp'; then $(CYGPATH_W) 'toeventquerytask.cpp'; else $(CYGPATH_W) '$(srcdir)/toeventquerytask.cpp'; fi` tora-toparamget.o: toparamget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toparamget.o -MD -MP -MF $(DEPDIR)/tora-toparamget.Tpo -c -o tora-toparamget.o `test -f 'toparamget.cpp' || echo '$(srcdir)/'`toparamget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toparamget.Tpo $(DEPDIR)/tora-toparamget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toparamget.cpp' object='tora-toparamget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toparamget.o `test -f 'toparamget.cpp' || echo '$(srcdir)/'`toparamget.cpp tora-toparamget.obj: toparamget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toparamget.obj -MD -MP -MF $(DEPDIR)/tora-toparamget.Tpo -c -o tora-toparamget.obj `if test -f 'toparamget.cpp'; then $(CYGPATH_W) 'toparamget.cpp'; else $(CYGPATH_W) '$(srcdir)/toparamget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toparamget.Tpo $(DEPDIR)/tora-toparamget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toparamget.cpp' object='tora-toparamget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toparamget.obj `if test -f 'toparamget.cpp'; then $(CYGPATH_W) 'toparamget.cpp'; else $(CYGPATH_W) '$(srcdir)/toparamget.cpp'; fi` tora-topreferences.o: topreferences.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-topreferences.o -MD -MP -MF $(DEPDIR)/tora-topreferences.Tpo -c -o tora-topreferences.o `test -f 'topreferences.cpp' || echo '$(srcdir)/'`topreferences.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-topreferences.Tpo $(DEPDIR)/tora-topreferences.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='topreferences.cpp' object='tora-topreferences.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-topreferences.o `test -f 'topreferences.cpp' || echo '$(srcdir)/'`topreferences.cpp tora-topreferences.obj: topreferences.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-topreferences.obj -MD -MP -MF $(DEPDIR)/tora-topreferences.Tpo -c -o tora-topreferences.obj `if test -f 'topreferences.cpp'; then $(CYGPATH_W) 'topreferences.cpp'; else $(CYGPATH_W) '$(srcdir)/topreferences.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-topreferences.Tpo $(DEPDIR)/tora-topreferences.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='topreferences.cpp' object='tora-topreferences.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-topreferences.obj `if test -f 'topreferences.cpp'; then $(CYGPATH_W) 'topreferences.cpp'; else $(CYGPATH_W) '$(srcdir)/topreferences.cpp'; fi` tora-toplsqleditor.o: toplsqleditor.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toplsqleditor.o -MD -MP -MF $(DEPDIR)/tora-toplsqleditor.Tpo -c -o tora-toplsqleditor.o `test -f 'toplsqleditor.cpp' || echo '$(srcdir)/'`toplsqleditor.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toplsqleditor.Tpo $(DEPDIR)/tora-toplsqleditor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toplsqleditor.cpp' object='tora-toplsqleditor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toplsqleditor.o `test -f 'toplsqleditor.cpp' || echo '$(srcdir)/'`toplsqleditor.cpp tora-toplsqleditor.obj: toplsqleditor.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toplsqleditor.obj -MD -MP -MF $(DEPDIR)/tora-toplsqleditor.Tpo -c -o tora-toplsqleditor.obj `if test -f 'toplsqleditor.cpp'; then $(CYGPATH_W) 'toplsqleditor.cpp'; else $(CYGPATH_W) '$(srcdir)/toplsqleditor.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toplsqleditor.Tpo $(DEPDIR)/tora-toplsqleditor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toplsqleditor.cpp' object='tora-toplsqleditor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toplsqleditor.obj `if test -f 'toplsqleditor.cpp'; then $(CYGPATH_W) 'toplsqleditor.cpp'; else $(CYGPATH_W) '$(srcdir)/toplsqleditor.cpp'; fi` tora-toplsqltext.o: toplsqltext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toplsqltext.o -MD -MP -MF $(DEPDIR)/tora-toplsqltext.Tpo -c -o tora-toplsqltext.o `test -f 'toplsqltext.cpp' || echo '$(srcdir)/'`toplsqltext.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toplsqltext.Tpo $(DEPDIR)/tora-toplsqltext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toplsqltext.cpp' object='tora-toplsqltext.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toplsqltext.o `test -f 'toplsqltext.cpp' || echo '$(srcdir)/'`toplsqltext.cpp tora-toplsqltext.obj: toplsqltext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toplsqltext.obj -MD -MP -MF $(DEPDIR)/tora-toplsqltext.Tpo -c -o tora-toplsqltext.obj `if test -f 'toplsqltext.cpp'; then $(CYGPATH_W) 'toplsqltext.cpp'; else $(CYGPATH_W) '$(srcdir)/toplsqltext.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toplsqltext.Tpo $(DEPDIR)/tora-toplsqltext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toplsqltext.cpp' object='tora-toplsqltext.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toplsqltext.obj `if test -f 'toplsqltext.cpp'; then $(CYGPATH_W) 'toplsqltext.cpp'; else $(CYGPATH_W) '$(srcdir)/toplsqltext.cpp'; fi` tora-toresult.o: toresult.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresult.o -MD -MP -MF $(DEPDIR)/tora-toresult.Tpo -c -o tora-toresult.o `test -f 'toresult.cpp' || echo '$(srcdir)/'`toresult.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresult.Tpo $(DEPDIR)/tora-toresult.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresult.cpp' object='tora-toresult.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresult.o `test -f 'toresult.cpp' || echo '$(srcdir)/'`toresult.cpp tora-toresult.obj: toresult.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresult.obj -MD -MP -MF $(DEPDIR)/tora-toresult.Tpo -c -o tora-toresult.obj `if test -f 'toresult.cpp'; then $(CYGPATH_W) 'toresult.cpp'; else $(CYGPATH_W) '$(srcdir)/toresult.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresult.Tpo $(DEPDIR)/tora-toresult.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresult.cpp' object='tora-toresult.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresult.obj `if test -f 'toresult.cpp'; then $(CYGPATH_W) 'toresult.cpp'; else $(CYGPATH_W) '$(srcdir)/toresult.cpp'; fi` tora-toresultfield.o: toresultfield.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultfield.o -MD -MP -MF $(DEPDIR)/tora-toresultfield.Tpo -c -o tora-toresultfield.o `test -f 'toresultfield.cpp' || echo '$(srcdir)/'`toresultfield.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultfield.Tpo $(DEPDIR)/tora-toresultfield.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultfield.cpp' object='tora-toresultfield.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultfield.o `test -f 'toresultfield.cpp' || echo '$(srcdir)/'`toresultfield.cpp tora-toresultfield.obj: toresultfield.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultfield.obj -MD -MP -MF $(DEPDIR)/tora-toresultfield.Tpo -c -o tora-toresultfield.obj `if test -f 'toresultfield.cpp'; then $(CYGPATH_W) 'toresultfield.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultfield.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultfield.Tpo $(DEPDIR)/tora-toresultfield.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultfield.cpp' object='tora-toresultfield.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultfield.obj `if test -f 'toresultfield.cpp'; then $(CYGPATH_W) 'toresultfield.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultfield.cpp'; fi` tora-toresultitem.o: toresultitem.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultitem.o -MD -MP -MF $(DEPDIR)/tora-toresultitem.Tpo -c -o tora-toresultitem.o `test -f 'toresultitem.cpp' || echo '$(srcdir)/'`toresultitem.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultitem.Tpo $(DEPDIR)/tora-toresultitem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultitem.cpp' object='tora-toresultitem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultitem.o `test -f 'toresultitem.cpp' || echo '$(srcdir)/'`toresultitem.cpp tora-toresultitem.obj: toresultitem.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultitem.obj -MD -MP -MF $(DEPDIR)/tora-toresultitem.Tpo -c -o tora-toresultitem.obj `if test -f 'toresultitem.cpp'; then $(CYGPATH_W) 'toresultitem.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultitem.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultitem.Tpo $(DEPDIR)/tora-toresultitem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultitem.cpp' object='tora-toresultitem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultitem.obj `if test -f 'toresultitem.cpp'; then $(CYGPATH_W) 'toresultitem.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultitem.cpp'; fi` tora-toresultstats.o: toresultstats.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultstats.o -MD -MP -MF $(DEPDIR)/tora-toresultstats.Tpo -c -o tora-toresultstats.o `test -f 'toresultstats.cpp' || echo '$(srcdir)/'`toresultstats.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultstats.Tpo $(DEPDIR)/tora-toresultstats.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultstats.cpp' object='tora-toresultstats.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultstats.o `test -f 'toresultstats.cpp' || echo '$(srcdir)/'`toresultstats.cpp tora-toresultstats.obj: toresultstats.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultstats.obj -MD -MP -MF $(DEPDIR)/tora-toresultstats.Tpo -c -o tora-toresultstats.obj `if test -f 'toresultstats.cpp'; then $(CYGPATH_W) 'toresultstats.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultstats.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultstats.Tpo $(DEPDIR)/tora-toresultstats.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultstats.cpp' object='tora-toresultstats.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultstats.obj `if test -f 'toresultstats.cpp'; then $(CYGPATH_W) 'toresultstats.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultstats.cpp'; fi` tora-toresultview.o: toresultview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultview.o -MD -MP -MF $(DEPDIR)/tora-toresultview.Tpo -c -o tora-toresultview.o `test -f 'toresultview.cpp' || echo '$(srcdir)/'`toresultview.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultview.Tpo $(DEPDIR)/tora-toresultview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultview.cpp' object='tora-toresultview.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultview.o `test -f 'toresultview.cpp' || echo '$(srcdir)/'`toresultview.cpp tora-toresultview.obj: toresultview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultview.obj -MD -MP -MF $(DEPDIR)/tora-toresultview.Tpo -c -o tora-toresultview.obj `if test -f 'toresultview.cpp'; then $(CYGPATH_W) 'toresultview.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultview.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultview.Tpo $(DEPDIR)/tora-toresultview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultview.cpp' object='tora-toresultview.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultview.obj `if test -f 'toresultview.cpp'; then $(CYGPATH_W) 'toresultview.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultview.cpp'; fi` tora-toresultlistformat.o: toresultlistformat.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultlistformat.o -MD -MP -MF $(DEPDIR)/tora-toresultlistformat.Tpo -c -o tora-toresultlistformat.o `test -f 'toresultlistformat.cpp' || echo '$(srcdir)/'`toresultlistformat.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultlistformat.Tpo $(DEPDIR)/tora-toresultlistformat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultlistformat.cpp' object='tora-toresultlistformat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultlistformat.o `test -f 'toresultlistformat.cpp' || echo '$(srcdir)/'`toresultlistformat.cpp tora-toresultlistformat.obj: toresultlistformat.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultlistformat.obj -MD -MP -MF $(DEPDIR)/tora-toresultlistformat.Tpo -c -o tora-toresultlistformat.obj `if test -f 'toresultlistformat.cpp'; then $(CYGPATH_W) 'toresultlistformat.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultlistformat.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultlistformat.Tpo $(DEPDIR)/tora-toresultlistformat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultlistformat.cpp' object='tora-toresultlistformat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultlistformat.obj `if test -f 'toresultlistformat.cpp'; then $(CYGPATH_W) 'toresultlistformat.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultlistformat.cpp'; fi` tora-toresultmodel.o: toresultmodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultmodel.o -MD -MP -MF $(DEPDIR)/tora-toresultmodel.Tpo -c -o tora-toresultmodel.o `test -f 'toresultmodel.cpp' || echo '$(srcdir)/'`toresultmodel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultmodel.Tpo $(DEPDIR)/tora-toresultmodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultmodel.cpp' object='tora-toresultmodel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultmodel.o `test -f 'toresultmodel.cpp' || echo '$(srcdir)/'`toresultmodel.cpp tora-toresultmodel.obj: toresultmodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultmodel.obj -MD -MP -MF $(DEPDIR)/tora-toresultmodel.Tpo -c -o tora-toresultmodel.obj `if test -f 'toresultmodel.cpp'; then $(CYGPATH_W) 'toresultmodel.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultmodel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultmodel.Tpo $(DEPDIR)/tora-toresultmodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultmodel.cpp' object='tora-toresultmodel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultmodel.obj `if test -f 'toresultmodel.cpp'; then $(CYGPATH_W) 'toresultmodel.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultmodel.cpp'; fi` tora-toresulttableview.o: toresulttableview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresulttableview.o -MD -MP -MF $(DEPDIR)/tora-toresulttableview.Tpo -c -o tora-toresulttableview.o `test -f 'toresulttableview.cpp' || echo '$(srcdir)/'`toresulttableview.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresulttableview.Tpo $(DEPDIR)/tora-toresulttableview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresulttableview.cpp' object='tora-toresulttableview.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresulttableview.o `test -f 'toresulttableview.cpp' || echo '$(srcdir)/'`toresulttableview.cpp tora-toresulttableview.obj: toresulttableview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresulttableview.obj -MD -MP -MF $(DEPDIR)/tora-toresulttableview.Tpo -c -o tora-toresulttableview.obj `if test -f 'toresulttableview.cpp'; then $(CYGPATH_W) 'toresulttableview.cpp'; else $(CYGPATH_W) '$(srcdir)/toresulttableview.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresulttableview.Tpo $(DEPDIR)/tora-toresulttableview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresulttableview.cpp' object='tora-toresulttableview.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresulttableview.obj `if test -f 'toresulttableview.cpp'; then $(CYGPATH_W) 'toresulttableview.cpp'; else $(CYGPATH_W) '$(srcdir)/toresulttableview.cpp'; fi` tora-toresulttableviewedit.o: toresulttableviewedit.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresulttableviewedit.o -MD -MP -MF $(DEPDIR)/tora-toresulttableviewedit.Tpo -c -o tora-toresulttableviewedit.o `test -f 'toresulttableviewedit.cpp' || echo '$(srcdir)/'`toresulttableviewedit.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresulttableviewedit.Tpo $(DEPDIR)/tora-toresulttableviewedit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresulttableviewedit.cpp' object='tora-toresulttableviewedit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresulttableviewedit.o `test -f 'toresulttableviewedit.cpp' || echo '$(srcdir)/'`toresulttableviewedit.cpp tora-toresulttableviewedit.obj: toresulttableviewedit.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresulttableviewedit.obj -MD -MP -MF $(DEPDIR)/tora-toresulttableviewedit.Tpo -c -o tora-toresulttableviewedit.obj `if test -f 'toresulttableviewedit.cpp'; then $(CYGPATH_W) 'toresulttableviewedit.cpp'; else $(CYGPATH_W) '$(srcdir)/toresulttableviewedit.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresulttableviewedit.Tpo $(DEPDIR)/tora-toresulttableviewedit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresulttableviewedit.cpp' object='tora-toresulttableviewedit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresulttableviewedit.obj `if test -f 'toresulttableviewedit.cpp'; then $(CYGPATH_W) 'toresulttableviewedit.cpp'; else $(CYGPATH_W) '$(srcdir)/toresulttableviewedit.cpp'; fi` tora-toresultdata.o: toresultdata.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultdata.o -MD -MP -MF $(DEPDIR)/tora-toresultdata.Tpo -c -o tora-toresultdata.o `test -f 'toresultdata.cpp' || echo '$(srcdir)/'`toresultdata.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultdata.Tpo $(DEPDIR)/tora-toresultdata.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultdata.cpp' object='tora-toresultdata.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultdata.o `test -f 'toresultdata.cpp' || echo '$(srcdir)/'`toresultdata.cpp tora-toresultdata.obj: toresultdata.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultdata.obj -MD -MP -MF $(DEPDIR)/tora-toresultdata.Tpo -c -o tora-toresultdata.obj `if test -f 'toresultdata.cpp'; then $(CYGPATH_W) 'toresultdata.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultdata.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultdata.Tpo $(DEPDIR)/tora-toresultdata.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultdata.cpp' object='tora-toresultdata.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultdata.obj `if test -f 'toresultdata.cpp'; then $(CYGPATH_W) 'toresultdata.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultdata.cpp'; fi` tora-toresultdatasingle.o: toresultdatasingle.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultdatasingle.o -MD -MP -MF $(DEPDIR)/tora-toresultdatasingle.Tpo -c -o tora-toresultdatasingle.o `test -f 'toresultdatasingle.cpp' || echo '$(srcdir)/'`toresultdatasingle.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultdatasingle.Tpo $(DEPDIR)/tora-toresultdatasingle.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultdatasingle.cpp' object='tora-toresultdatasingle.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultdatasingle.o `test -f 'toresultdatasingle.cpp' || echo '$(srcdir)/'`toresultdatasingle.cpp tora-toresultdatasingle.obj: toresultdatasingle.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultdatasingle.obj -MD -MP -MF $(DEPDIR)/tora-toresultdatasingle.Tpo -c -o tora-toresultdatasingle.obj `if test -f 'toresultdatasingle.cpp'; then $(CYGPATH_W) 'toresultdatasingle.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultdatasingle.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultdatasingle.Tpo $(DEPDIR)/tora-toresultdatasingle.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultdatasingle.cpp' object='tora-toresultdatasingle.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultdatasingle.obj `if test -f 'toresultdatasingle.cpp'; then $(CYGPATH_W) 'toresultdatasingle.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultdatasingle.cpp'; fi` tora-totreewidget.o: totreewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totreewidget.o -MD -MP -MF $(DEPDIR)/tora-totreewidget.Tpo -c -o tora-totreewidget.o `test -f 'totreewidget.cpp' || echo '$(srcdir)/'`totreewidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totreewidget.Tpo $(DEPDIR)/tora-totreewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totreewidget.cpp' object='tora-totreewidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totreewidget.o `test -f 'totreewidget.cpp' || echo '$(srcdir)/'`totreewidget.cpp tora-totreewidget.obj: totreewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totreewidget.obj -MD -MP -MF $(DEPDIR)/tora-totreewidget.Tpo -c -o tora-totreewidget.obj `if test -f 'totreewidget.cpp'; then $(CYGPATH_W) 'totreewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/totreewidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totreewidget.Tpo $(DEPDIR)/tora-totreewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totreewidget.cpp' object='tora-totreewidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totreewidget.obj `if test -f 'totreewidget.cpp'; then $(CYGPATH_W) 'totreewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/totreewidget.cpp'; fi` tora-tosearchreplace.o: tosearchreplace.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosearchreplace.o -MD -MP -MF $(DEPDIR)/tora-tosearchreplace.Tpo -c -o tora-tosearchreplace.o `test -f 'tosearchreplace.cpp' || echo '$(srcdir)/'`tosearchreplace.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosearchreplace.Tpo $(DEPDIR)/tora-tosearchreplace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosearchreplace.cpp' object='tora-tosearchreplace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosearchreplace.o `test -f 'tosearchreplace.cpp' || echo '$(srcdir)/'`tosearchreplace.cpp tora-tosearchreplace.obj: tosearchreplace.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosearchreplace.obj -MD -MP -MF $(DEPDIR)/tora-tosearchreplace.Tpo -c -o tora-tosearchreplace.obj `if test -f 'tosearchreplace.cpp'; then $(CYGPATH_W) 'tosearchreplace.cpp'; else $(CYGPATH_W) '$(srcdir)/tosearchreplace.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosearchreplace.Tpo $(DEPDIR)/tora-tosearchreplace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosearchreplace.cpp' object='tora-tosearchreplace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosearchreplace.obj `if test -f 'tosearchreplace.cpp'; then $(CYGPATH_W) 'tosearchreplace.cpp'; else $(CYGPATH_W) '$(srcdir)/tosearchreplace.cpp'; fi` tora-tosmtp.o: tosmtp.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosmtp.o -MD -MP -MF $(DEPDIR)/tora-tosmtp.Tpo -c -o tora-tosmtp.o `test -f 'tosmtp.cpp' || echo '$(srcdir)/'`tosmtp.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosmtp.Tpo $(DEPDIR)/tora-tosmtp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosmtp.cpp' object='tora-tosmtp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosmtp.o `test -f 'tosmtp.cpp' || echo '$(srcdir)/'`tosmtp.cpp tora-tosmtp.obj: tosmtp.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosmtp.obj -MD -MP -MF $(DEPDIR)/tora-tosmtp.Tpo -c -o tora-tosmtp.obj `if test -f 'tosmtp.cpp'; then $(CYGPATH_W) 'tosmtp.cpp'; else $(CYGPATH_W) '$(srcdir)/tosmtp.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosmtp.Tpo $(DEPDIR)/tora-tosmtp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosmtp.cpp' object='tora-tosmtp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosmtp.obj `if test -f 'tosmtp.cpp'; then $(CYGPATH_W) 'tosmtp.cpp'; else $(CYGPATH_W) '$(srcdir)/tosmtp.cpp'; fi` tora-tosplash.o: tosplash.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosplash.o -MD -MP -MF $(DEPDIR)/tora-tosplash.Tpo -c -o tora-tosplash.o `test -f 'tosplash.cpp' || echo '$(srcdir)/'`tosplash.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosplash.Tpo $(DEPDIR)/tora-tosplash.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosplash.cpp' object='tora-tosplash.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosplash.o `test -f 'tosplash.cpp' || echo '$(srcdir)/'`tosplash.cpp tora-tosplash.obj: tosplash.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosplash.obj -MD -MP -MF $(DEPDIR)/tora-tosplash.Tpo -c -o tora-tosplash.obj `if test -f 'tosplash.cpp'; then $(CYGPATH_W) 'tosplash.cpp'; else $(CYGPATH_W) '$(srcdir)/tosplash.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosplash.Tpo $(DEPDIR)/tora-tosplash.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosplash.cpp' object='tora-tosplash.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosplash.obj `if test -f 'tosplash.cpp'; then $(CYGPATH_W) 'tosplash.cpp'; else $(CYGPATH_W) '$(srcdir)/tosplash.cpp'; fi` tora-tosql.o: tosql.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosql.o -MD -MP -MF $(DEPDIR)/tora-tosql.Tpo -c -o tora-tosql.o `test -f 'tosql.cpp' || echo '$(srcdir)/'`tosql.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosql.Tpo $(DEPDIR)/tora-tosql.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosql.cpp' object='tora-tosql.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosql.o `test -f 'tosql.cpp' || echo '$(srcdir)/'`tosql.cpp tora-tosql.obj: tosql.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosql.obj -MD -MP -MF $(DEPDIR)/tora-tosql.Tpo -c -o tora-tosql.obj `if test -f 'tosql.cpp'; then $(CYGPATH_W) 'tosql.cpp'; else $(CYGPATH_W) '$(srcdir)/tosql.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosql.Tpo $(DEPDIR)/tora-tosql.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosql.cpp' object='tora-tosql.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosql.obj `if test -f 'tosql.cpp'; then $(CYGPATH_W) 'tosql.cpp'; else $(CYGPATH_W) '$(srcdir)/tosql.cpp'; fi` tora-tosqlparse.o: tosqlparse.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosqlparse.o -MD -MP -MF $(DEPDIR)/tora-tosqlparse.Tpo -c -o tora-tosqlparse.o `test -f 'tosqlparse.cpp' || echo '$(srcdir)/'`tosqlparse.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosqlparse.Tpo $(DEPDIR)/tora-tosqlparse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosqlparse.cpp' object='tora-tosqlparse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosqlparse.o `test -f 'tosqlparse.cpp' || echo '$(srcdir)/'`tosqlparse.cpp tora-tosqlparse.obj: tosqlparse.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosqlparse.obj -MD -MP -MF $(DEPDIR)/tora-tosqlparse.Tpo -c -o tora-tosqlparse.obj `if test -f 'tosqlparse.cpp'; then $(CYGPATH_W) 'tosqlparse.cpp'; else $(CYGPATH_W) '$(srcdir)/tosqlparse.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosqlparse.Tpo $(DEPDIR)/tora-tosqlparse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosqlparse.cpp' object='tora-tosqlparse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosqlparse.obj `if test -f 'tosqlparse.cpp'; then $(CYGPATH_W) 'tosqlparse.cpp'; else $(CYGPATH_W) '$(srcdir)/tosqlparse.cpp'; fi` tora-tosyntaxsetup.o: tosyntaxsetup.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosyntaxsetup.o -MD -MP -MF $(DEPDIR)/tora-tosyntaxsetup.Tpo -c -o tora-tosyntaxsetup.o `test -f 'tosyntaxsetup.cpp' || echo '$(srcdir)/'`tosyntaxsetup.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosyntaxsetup.Tpo $(DEPDIR)/tora-tosyntaxsetup.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosyntaxsetup.cpp' object='tora-tosyntaxsetup.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosyntaxsetup.o `test -f 'tosyntaxsetup.cpp' || echo '$(srcdir)/'`tosyntaxsetup.cpp tora-tosyntaxsetup.obj: tosyntaxsetup.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosyntaxsetup.obj -MD -MP -MF $(DEPDIR)/tora-tosyntaxsetup.Tpo -c -o tora-tosyntaxsetup.obj `if test -f 'tosyntaxsetup.cpp'; then $(CYGPATH_W) 'tosyntaxsetup.cpp'; else $(CYGPATH_W) '$(srcdir)/tosyntaxsetup.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosyntaxsetup.Tpo $(DEPDIR)/tora-tosyntaxsetup.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosyntaxsetup.cpp' object='tora-tosyntaxsetup.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosyntaxsetup.obj `if test -f 'tosyntaxsetup.cpp'; then $(CYGPATH_W) 'tosyntaxsetup.cpp'; else $(CYGPATH_W) '$(srcdir)/tosyntaxsetup.cpp'; fi` tora-totabwidget.o: totabwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totabwidget.o -MD -MP -MF $(DEPDIR)/tora-totabwidget.Tpo -c -o tora-totabwidget.o `test -f 'totabwidget.cpp' || echo '$(srcdir)/'`totabwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totabwidget.Tpo $(DEPDIR)/tora-totabwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totabwidget.cpp' object='tora-totabwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totabwidget.o `test -f 'totabwidget.cpp' || echo '$(srcdir)/'`totabwidget.cpp tora-totabwidget.obj: totabwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totabwidget.obj -MD -MP -MF $(DEPDIR)/tora-totabwidget.Tpo -c -o tora-totabwidget.obj `if test -f 'totabwidget.cpp'; then $(CYGPATH_W) 'totabwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/totabwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totabwidget.Tpo $(DEPDIR)/tora-totabwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totabwidget.cpp' object='tora-totabwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totabwidget.obj `if test -f 'totabwidget.cpp'; then $(CYGPATH_W) 'totabwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/totabwidget.cpp'; fi` tora-totemplateprovider.o: totemplateprovider.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totemplateprovider.o -MD -MP -MF $(DEPDIR)/tora-totemplateprovider.Tpo -c -o tora-totemplateprovider.o `test -f 'totemplateprovider.cpp' || echo '$(srcdir)/'`totemplateprovider.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totemplateprovider.Tpo $(DEPDIR)/tora-totemplateprovider.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totemplateprovider.cpp' object='tora-totemplateprovider.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totemplateprovider.o `test -f 'totemplateprovider.cpp' || echo '$(srcdir)/'`totemplateprovider.cpp tora-totemplateprovider.obj: totemplateprovider.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totemplateprovider.obj -MD -MP -MF $(DEPDIR)/tora-totemplateprovider.Tpo -c -o tora-totemplateprovider.obj `if test -f 'totemplateprovider.cpp'; then $(CYGPATH_W) 'totemplateprovider.cpp'; else $(CYGPATH_W) '$(srcdir)/totemplateprovider.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totemplateprovider.Tpo $(DEPDIR)/tora-totemplateprovider.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totemplateprovider.cpp' object='tora-totemplateprovider.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totemplateprovider.obj `if test -f 'totemplateprovider.cpp'; then $(CYGPATH_W) 'totemplateprovider.cpp'; else $(CYGPATH_W) '$(srcdir)/totemplateprovider.cpp'; fi` tora-totextview.o: totextview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totextview.o -MD -MP -MF $(DEPDIR)/tora-totextview.Tpo -c -o tora-totextview.o `test -f 'totextview.cpp' || echo '$(srcdir)/'`totextview.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totextview.Tpo $(DEPDIR)/tora-totextview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totextview.cpp' object='tora-totextview.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totextview.o `test -f 'totextview.cpp' || echo '$(srcdir)/'`totextview.cpp tora-totextview.obj: totextview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totextview.obj -MD -MP -MF $(DEPDIR)/tora-totextview.Tpo -c -o tora-totextview.obj `if test -f 'totextview.cpp'; then $(CYGPATH_W) 'totextview.cpp'; else $(CYGPATH_W) '$(srcdir)/totextview.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totextview.Tpo $(DEPDIR)/tora-totextview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totextview.cpp' object='tora-totextview.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totextview.obj `if test -f 'totextview.cpp'; then $(CYGPATH_W) 'totextview.cpp'; else $(CYGPATH_W) '$(srcdir)/totextview.cpp'; fi` tora-tothread.o: tothread.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tothread.o -MD -MP -MF $(DEPDIR)/tora-tothread.Tpo -c -o tora-tothread.o `test -f 'tothread.cpp' || echo '$(srcdir)/'`tothread.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tothread.Tpo $(DEPDIR)/tora-tothread.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tothread.cpp' object='tora-tothread.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tothread.o `test -f 'tothread.cpp' || echo '$(srcdir)/'`tothread.cpp tora-tothread.obj: tothread.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tothread.obj -MD -MP -MF $(DEPDIR)/tora-tothread.Tpo -c -o tora-tothread.obj `if test -f 'tothread.cpp'; then $(CYGPATH_W) 'tothread.cpp'; else $(CYGPATH_W) '$(srcdir)/tothread.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tothread.Tpo $(DEPDIR)/tora-tothread.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tothread.cpp' object='tora-tothread.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tothread.obj `if test -f 'tothread.cpp'; then $(CYGPATH_W) 'tothread.cpp'; else $(CYGPATH_W) '$(srcdir)/tothread.cpp'; fi` tora-totimer.o: totimer.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totimer.o -MD -MP -MF $(DEPDIR)/tora-totimer.Tpo -c -o tora-totimer.o `test -f 'totimer.cpp' || echo '$(srcdir)/'`totimer.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totimer.Tpo $(DEPDIR)/tora-totimer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totimer.cpp' object='tora-totimer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totimer.o `test -f 'totimer.cpp' || echo '$(srcdir)/'`totimer.cpp tora-totimer.obj: totimer.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totimer.obj -MD -MP -MF $(DEPDIR)/tora-totimer.Tpo -c -o tora-totimer.obj `if test -f 'totimer.cpp'; then $(CYGPATH_W) 'totimer.cpp'; else $(CYGPATH_W) '$(srcdir)/totimer.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totimer.Tpo $(DEPDIR)/tora-totimer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totimer.cpp' object='tora-totimer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totimer.obj `if test -f 'totimer.cpp'; then $(CYGPATH_W) 'totimer.cpp'; else $(CYGPATH_W) '$(srcdir)/totimer.cpp'; fi` tora-totool.o: totool.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totool.o -MD -MP -MF $(DEPDIR)/tora-totool.Tpo -c -o tora-totool.o `test -f 'totool.cpp' || echo '$(srcdir)/'`totool.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totool.Tpo $(DEPDIR)/tora-totool.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totool.cpp' object='tora-totool.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totool.o `test -f 'totool.cpp' || echo '$(srcdir)/'`totool.cpp tora-totool.obj: totool.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totool.obj -MD -MP -MF $(DEPDIR)/tora-totool.Tpo -c -o tora-totool.obj `if test -f 'totool.cpp'; then $(CYGPATH_W) 'totool.cpp'; else $(CYGPATH_W) '$(srcdir)/totool.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totool.Tpo $(DEPDIR)/tora-totool.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totool.cpp' object='tora-totool.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totool.obj `if test -f 'totool.cpp'; then $(CYGPATH_W) 'totool.cpp'; else $(CYGPATH_W) '$(srcdir)/totool.cpp'; fi` tora-utils.o: utils.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-utils.o -MD -MP -MF $(DEPDIR)/tora-utils.Tpo -c -o tora-utils.o `test -f 'utils.cpp' || echo '$(srcdir)/'`utils.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-utils.Tpo $(DEPDIR)/tora-utils.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils.cpp' object='tora-utils.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-utils.o `test -f 'utils.cpp' || echo '$(srcdir)/'`utils.cpp tora-utils.obj: utils.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-utils.obj -MD -MP -MF $(DEPDIR)/tora-utils.Tpo -c -o tora-utils.obj `if test -f 'utils.cpp'; then $(CYGPATH_W) 'utils.cpp'; else $(CYGPATH_W) '$(srcdir)/utils.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-utils.Tpo $(DEPDIR)/tora-utils.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils.cpp' object='tora-utils.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-utils.obj `if test -f 'utils.cpp'; then $(CYGPATH_W) 'utils.cpp'; else $(CYGPATH_W) '$(srcdir)/utils.cpp'; fi` tora-toalert.o: toalert.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toalert.o -MD -MP -MF $(DEPDIR)/tora-toalert.Tpo -c -o tora-toalert.o `test -f 'toalert.cpp' || echo '$(srcdir)/'`toalert.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toalert.Tpo $(DEPDIR)/tora-toalert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toalert.cpp' object='tora-toalert.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toalert.o `test -f 'toalert.cpp' || echo '$(srcdir)/'`toalert.cpp tora-toalert.obj: toalert.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toalert.obj -MD -MP -MF $(DEPDIR)/tora-toalert.Tpo -c -o tora-toalert.obj `if test -f 'toalert.cpp'; then $(CYGPATH_W) 'toalert.cpp'; else $(CYGPATH_W) '$(srcdir)/toalert.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toalert.Tpo $(DEPDIR)/tora-toalert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toalert.cpp' object='tora-toalert.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toalert.obj `if test -f 'toalert.cpp'; then $(CYGPATH_W) 'toalert.cpp'; else $(CYGPATH_W) '$(srcdir)/toalert.cpp'; fi` tora-toanalyze.o: toanalyze.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toanalyze.o -MD -MP -MF $(DEPDIR)/tora-toanalyze.Tpo -c -o tora-toanalyze.o `test -f 'toanalyze.cpp' || echo '$(srcdir)/'`toanalyze.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toanalyze.Tpo $(DEPDIR)/tora-toanalyze.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toanalyze.cpp' object='tora-toanalyze.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toanalyze.o `test -f 'toanalyze.cpp' || echo '$(srcdir)/'`toanalyze.cpp tora-toanalyze.obj: toanalyze.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toanalyze.obj -MD -MP -MF $(DEPDIR)/tora-toanalyze.Tpo -c -o tora-toanalyze.obj `if test -f 'toanalyze.cpp'; then $(CYGPATH_W) 'toanalyze.cpp'; else $(CYGPATH_W) '$(srcdir)/toanalyze.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toanalyze.Tpo $(DEPDIR)/tora-toanalyze.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toanalyze.cpp' object='tora-toanalyze.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toanalyze.obj `if test -f 'toanalyze.cpp'; then $(CYGPATH_W) 'toanalyze.cpp'; else $(CYGPATH_W) '$(srcdir)/toanalyze.cpp'; fi` tora-tobackup.o: tobackup.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobackup.o -MD -MP -MF $(DEPDIR)/tora-tobackup.Tpo -c -o tora-tobackup.o `test -f 'tobackup.cpp' || echo '$(srcdir)/'`tobackup.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobackup.Tpo $(DEPDIR)/tora-tobackup.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobackup.cpp' object='tora-tobackup.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobackup.o `test -f 'tobackup.cpp' || echo '$(srcdir)/'`tobackup.cpp tora-tobackup.obj: tobackup.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobackup.obj -MD -MP -MF $(DEPDIR)/tora-tobackup.Tpo -c -o tora-tobackup.obj `if test -f 'tobackup.cpp'; then $(CYGPATH_W) 'tobackup.cpp'; else $(CYGPATH_W) '$(srcdir)/tobackup.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobackup.Tpo $(DEPDIR)/tora-tobackup.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobackup.cpp' object='tora-tobackup.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobackup.obj `if test -f 'tobackup.cpp'; then $(CYGPATH_W) 'tobackup.cpp'; else $(CYGPATH_W) '$(srcdir)/tobackup.cpp'; fi` tora-tobackuptool.o: tobackuptool.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobackuptool.o -MD -MP -MF $(DEPDIR)/tora-tobackuptool.Tpo -c -o tora-tobackuptool.o `test -f 'tobackuptool.cpp' || echo '$(srcdir)/'`tobackuptool.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobackuptool.Tpo $(DEPDIR)/tora-tobackuptool.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobackuptool.cpp' object='tora-tobackuptool.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobackuptool.o `test -f 'tobackuptool.cpp' || echo '$(srcdir)/'`tobackuptool.cpp tora-tobackuptool.obj: tobackuptool.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobackuptool.obj -MD -MP -MF $(DEPDIR)/tora-tobackuptool.Tpo -c -o tora-tobackuptool.obj `if test -f 'tobackuptool.cpp'; then $(CYGPATH_W) 'tobackuptool.cpp'; else $(CYGPATH_W) '$(srcdir)/tobackuptool.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobackuptool.Tpo $(DEPDIR)/tora-tobackuptool.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobackuptool.cpp' object='tora-tobackuptool.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobackuptool.obj `if test -f 'tobackuptool.cpp'; then $(CYGPATH_W) 'tobackuptool.cpp'; else $(CYGPATH_W) '$(srcdir)/tobackuptool.cpp'; fi` tora-tobrowser.o: tobrowser.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowser.o -MD -MP -MF $(DEPDIR)/tora-tobrowser.Tpo -c -o tora-tobrowser.o `test -f 'tobrowser.cpp' || echo '$(srcdir)/'`tobrowser.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowser.Tpo $(DEPDIR)/tora-tobrowser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowser.cpp' object='tora-tobrowser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowser.o `test -f 'tobrowser.cpp' || echo '$(srcdir)/'`tobrowser.cpp tora-tobrowser.obj: tobrowser.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowser.obj -MD -MP -MF $(DEPDIR)/tora-tobrowser.Tpo -c -o tora-tobrowser.obj `if test -f 'tobrowser.cpp'; then $(CYGPATH_W) 'tobrowser.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowser.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowser.Tpo $(DEPDIR)/tora-tobrowser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowser.cpp' object='tora-tobrowser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowser.obj `if test -f 'tobrowser.cpp'; then $(CYGPATH_W) 'tobrowser.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowser.cpp'; fi` tora-todocklet.o: todocklet.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-todocklet.o -MD -MP -MF $(DEPDIR)/tora-todocklet.Tpo -c -o tora-todocklet.o `test -f 'todocklet.cpp' || echo '$(srcdir)/'`todocklet.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-todocklet.Tpo $(DEPDIR)/tora-todocklet.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='todocklet.cpp' object='tora-todocklet.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-todocklet.o `test -f 'todocklet.cpp' || echo '$(srcdir)/'`todocklet.cpp tora-todocklet.obj: todocklet.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-todocklet.obj -MD -MP -MF $(DEPDIR)/tora-todocklet.Tpo -c -o tora-todocklet.obj `if test -f 'todocklet.cpp'; then $(CYGPATH_W) 'todocklet.cpp'; else $(CYGPATH_W) '$(srcdir)/todocklet.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-todocklet.Tpo $(DEPDIR)/tora-todocklet.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='todocklet.cpp' object='tora-todocklet.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-todocklet.obj `if test -f 'todocklet.cpp'; then $(CYGPATH_W) 'todocklet.cpp'; else $(CYGPATH_W) '$(srcdir)/todocklet.cpp'; fi` tora-todockbar.o: todockbar.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-todockbar.o -MD -MP -MF $(DEPDIR)/tora-todockbar.Tpo -c -o tora-todockbar.o `test -f 'todockbar.cpp' || echo '$(srcdir)/'`todockbar.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-todockbar.Tpo $(DEPDIR)/tora-todockbar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='todockbar.cpp' object='tora-todockbar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-todockbar.o `test -f 'todockbar.cpp' || echo '$(srcdir)/'`todockbar.cpp tora-todockbar.obj: todockbar.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-todockbar.obj -MD -MP -MF $(DEPDIR)/tora-todockbar.Tpo -c -o tora-todockbar.obj `if test -f 'todockbar.cpp'; then $(CYGPATH_W) 'todockbar.cpp'; else $(CYGPATH_W) '$(srcdir)/todockbar.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-todockbar.Tpo $(DEPDIR)/tora-todockbar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='todockbar.cpp' object='tora-todockbar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-todockbar.obj `if test -f 'todockbar.cpp'; then $(CYGPATH_W) 'todockbar.cpp'; else $(CYGPATH_W) '$(srcdir)/todockbar.cpp'; fi` tora-topushbutton.o: topushbutton.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-topushbutton.o -MD -MP -MF $(DEPDIR)/tora-topushbutton.Tpo -c -o tora-topushbutton.o `test -f 'topushbutton.cpp' || echo '$(srcdir)/'`topushbutton.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-topushbutton.Tpo $(DEPDIR)/tora-topushbutton.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='topushbutton.cpp' object='tora-topushbutton.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-topushbutton.o `test -f 'topushbutton.cpp' || echo '$(srcdir)/'`topushbutton.cpp tora-topushbutton.obj: topushbutton.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-topushbutton.obj -MD -MP -MF $(DEPDIR)/tora-topushbutton.Tpo -c -o tora-topushbutton.obj `if test -f 'topushbutton.cpp'; then $(CYGPATH_W) 'topushbutton.cpp'; else $(CYGPATH_W) '$(srcdir)/topushbutton.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-topushbutton.Tpo $(DEPDIR)/tora-topushbutton.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='topushbutton.cpp' object='tora-topushbutton.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-topushbutton.obj `if test -f 'topushbutton.cpp'; then $(CYGPATH_W) 'topushbutton.cpp'; else $(CYGPATH_W) '$(srcdir)/topushbutton.cpp'; fi` tora-toviewdirectory.o: docklets/toviewdirectory.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toviewdirectory.o -MD -MP -MF $(DEPDIR)/tora-toviewdirectory.Tpo -c -o tora-toviewdirectory.o `test -f 'docklets/toviewdirectory.cpp' || echo '$(srcdir)/'`docklets/toviewdirectory.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toviewdirectory.Tpo $(DEPDIR)/tora-toviewdirectory.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='docklets/toviewdirectory.cpp' object='tora-toviewdirectory.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toviewdirectory.o `test -f 'docklets/toviewdirectory.cpp' || echo '$(srcdir)/'`docklets/toviewdirectory.cpp tora-toviewdirectory.obj: docklets/toviewdirectory.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toviewdirectory.obj -MD -MP -MF $(DEPDIR)/tora-toviewdirectory.Tpo -c -o tora-toviewdirectory.obj `if test -f 'docklets/toviewdirectory.cpp'; then $(CYGPATH_W) 'docklets/toviewdirectory.cpp'; else $(CYGPATH_W) '$(srcdir)/docklets/toviewdirectory.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toviewdirectory.Tpo $(DEPDIR)/tora-toviewdirectory.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='docklets/toviewdirectory.cpp' object='tora-toviewdirectory.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toviewdirectory.obj `if test -f 'docklets/toviewdirectory.cpp'; then $(CYGPATH_W) 'docklets/toviewdirectory.cpp'; else $(CYGPATH_W) '$(srcdir)/docklets/toviewdirectory.cpp'; fi` tora-toviewconnections.o: docklets/toviewconnections.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toviewconnections.o -MD -MP -MF $(DEPDIR)/tora-toviewconnections.Tpo -c -o tora-toviewconnections.o `test -f 'docklets/toviewconnections.cpp' || echo '$(srcdir)/'`docklets/toviewconnections.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toviewconnections.Tpo $(DEPDIR)/tora-toviewconnections.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='docklets/toviewconnections.cpp' object='tora-toviewconnections.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toviewconnections.o `test -f 'docklets/toviewconnections.cpp' || echo '$(srcdir)/'`docklets/toviewconnections.cpp tora-toviewconnections.obj: docklets/toviewconnections.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toviewconnections.obj -MD -MP -MF $(DEPDIR)/tora-toviewconnections.Tpo -c -o tora-toviewconnections.obj `if test -f 'docklets/toviewconnections.cpp'; then $(CYGPATH_W) 'docklets/toviewconnections.cpp'; else $(CYGPATH_W) '$(srcdir)/docklets/toviewconnections.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toviewconnections.Tpo $(DEPDIR)/tora-toviewconnections.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='docklets/toviewconnections.cpp' object='tora-toviewconnections.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toviewconnections.obj `if test -f 'docklets/toviewconnections.cpp'; then $(CYGPATH_W) 'docklets/toviewconnections.cpp'; else $(CYGPATH_W) '$(srcdir)/docklets/toviewconnections.cpp'; fi` tora-tobarchart.o: tobarchart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobarchart.o -MD -MP -MF $(DEPDIR)/tora-tobarchart.Tpo -c -o tora-tobarchart.o `test -f 'tobarchart.cpp' || echo '$(srcdir)/'`tobarchart.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobarchart.Tpo $(DEPDIR)/tora-tobarchart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobarchart.cpp' object='tora-tobarchart.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobarchart.o `test -f 'tobarchart.cpp' || echo '$(srcdir)/'`tobarchart.cpp tora-tobarchart.obj: tobarchart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobarchart.obj -MD -MP -MF $(DEPDIR)/tora-tobarchart.Tpo -c -o tora-tobarchart.obj `if test -f 'tobarchart.cpp'; then $(CYGPATH_W) 'tobarchart.cpp'; else $(CYGPATH_W) '$(srcdir)/tobarchart.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobarchart.Tpo $(DEPDIR)/tora-tobarchart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobarchart.cpp' object='tora-tobarchart.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobarchart.obj `if test -f 'tobarchart.cpp'; then $(CYGPATH_W) 'tobarchart.cpp'; else $(CYGPATH_W) '$(srcdir)/tobarchart.cpp'; fi` tora-tocurrent.o: tocurrent.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tocurrent.o -MD -MP -MF $(DEPDIR)/tora-tocurrent.Tpo -c -o tora-tocurrent.o `test -f 'tocurrent.cpp' || echo '$(srcdir)/'`tocurrent.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tocurrent.Tpo $(DEPDIR)/tora-tocurrent.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tocurrent.cpp' object='tora-tocurrent.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tocurrent.o `test -f 'tocurrent.cpp' || echo '$(srcdir)/'`tocurrent.cpp tora-tocurrent.obj: tocurrent.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tocurrent.obj -MD -MP -MF $(DEPDIR)/tora-tocurrent.Tpo -c -o tora-tocurrent.obj `if test -f 'tocurrent.cpp'; then $(CYGPATH_W) 'tocurrent.cpp'; else $(CYGPATH_W) '$(srcdir)/tocurrent.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tocurrent.Tpo $(DEPDIR)/tora-tocurrent.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tocurrent.cpp' object='tora-tocurrent.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tocurrent.obj `if test -f 'tocurrent.cpp'; then $(CYGPATH_W) 'tocurrent.cpp'; else $(CYGPATH_W) '$(srcdir)/tocurrent.cpp'; fi` tora-todebug.o: todebug.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-todebug.o -MD -MP -MF $(DEPDIR)/tora-todebug.Tpo -c -o tora-todebug.o `test -f 'todebug.cpp' || echo '$(srcdir)/'`todebug.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-todebug.Tpo $(DEPDIR)/tora-todebug.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='todebug.cpp' object='tora-todebug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-todebug.o `test -f 'todebug.cpp' || echo '$(srcdir)/'`todebug.cpp tora-todebug.obj: todebug.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-todebug.obj -MD -MP -MF $(DEPDIR)/tora-todebug.Tpo -c -o tora-todebug.obj `if test -f 'todebug.cpp'; then $(CYGPATH_W) 'todebug.cpp'; else $(CYGPATH_W) '$(srcdir)/todebug.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-todebug.Tpo $(DEPDIR)/tora-todebug.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='todebug.cpp' object='tora-todebug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-todebug.obj `if test -f 'todebug.cpp'; then $(CYGPATH_W) 'todebug.cpp'; else $(CYGPATH_W) '$(srcdir)/todebug.cpp'; fi` tora-toeditextensions.o: toeditextensions.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toeditextensions.o -MD -MP -MF $(DEPDIR)/tora-toeditextensions.Tpo -c -o tora-toeditextensions.o `test -f 'toeditextensions.cpp' || echo '$(srcdir)/'`toeditextensions.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toeditextensions.Tpo $(DEPDIR)/tora-toeditextensions.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toeditextensions.cpp' object='tora-toeditextensions.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toeditextensions.o `test -f 'toeditextensions.cpp' || echo '$(srcdir)/'`toeditextensions.cpp tora-toeditextensions.obj: toeditextensions.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toeditextensions.obj -MD -MP -MF $(DEPDIR)/tora-toeditextensions.Tpo -c -o tora-toeditextensions.obj `if test -f 'toeditextensions.cpp'; then $(CYGPATH_W) 'toeditextensions.cpp'; else $(CYGPATH_W) '$(srcdir)/toeditextensions.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toeditextensions.Tpo $(DEPDIR)/tora-toeditextensions.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toeditextensions.cpp' object='tora-toeditextensions.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toeditextensions.obj `if test -f 'toeditextensions.cpp'; then $(CYGPATH_W) 'toeditextensions.cpp'; else $(CYGPATH_W) '$(srcdir)/toeditextensions.cpp'; fi` tora-todatatype.o: todatatype.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-todatatype.o -MD -MP -MF $(DEPDIR)/tora-todatatype.Tpo -c -o tora-todatatype.o `test -f 'todatatype.cpp' || echo '$(srcdir)/'`todatatype.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-todatatype.Tpo $(DEPDIR)/tora-todatatype.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='todatatype.cpp' object='tora-todatatype.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-todatatype.o `test -f 'todatatype.cpp' || echo '$(srcdir)/'`todatatype.cpp tora-todatatype.obj: todatatype.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-todatatype.obj -MD -MP -MF $(DEPDIR)/tora-todatatype.Tpo -c -o tora-todatatype.obj `if test -f 'todatatype.cpp'; then $(CYGPATH_W) 'todatatype.cpp'; else $(CYGPATH_W) '$(srcdir)/todatatype.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-todatatype.Tpo $(DEPDIR)/tora-todatatype.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='todatatype.cpp' object='tora-todatatype.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-todatatype.obj `if test -f 'todatatype.cpp'; then $(CYGPATH_W) 'todatatype.cpp'; else $(CYGPATH_W) '$(srcdir)/todatatype.cpp'; fi` tora-toinvalid.o: toinvalid.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toinvalid.o -MD -MP -MF $(DEPDIR)/tora-toinvalid.Tpo -c -o tora-toinvalid.o `test -f 'toinvalid.cpp' || echo '$(srcdir)/'`toinvalid.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toinvalid.Tpo $(DEPDIR)/tora-toinvalid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toinvalid.cpp' object='tora-toinvalid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toinvalid.o `test -f 'toinvalid.cpp' || echo '$(srcdir)/'`toinvalid.cpp tora-toinvalid.obj: toinvalid.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toinvalid.obj -MD -MP -MF $(DEPDIR)/tora-toinvalid.Tpo -c -o tora-toinvalid.obj `if test -f 'toinvalid.cpp'; then $(CYGPATH_W) 'toinvalid.cpp'; else $(CYGPATH_W) '$(srcdir)/toinvalid.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toinvalid.Tpo $(DEPDIR)/tora-toinvalid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toinvalid.cpp' object='tora-toinvalid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toinvalid.obj `if test -f 'toinvalid.cpp'; then $(CYGPATH_W) 'toinvalid.cpp'; else $(CYGPATH_W) '$(srcdir)/toinvalid.cpp'; fi` tora-tooutput.o: tooutput.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tooutput.o -MD -MP -MF $(DEPDIR)/tora-tooutput.Tpo -c -o tora-tooutput.o `test -f 'tooutput.cpp' || echo '$(srcdir)/'`tooutput.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tooutput.Tpo $(DEPDIR)/tora-tooutput.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tooutput.cpp' object='tora-tooutput.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tooutput.o `test -f 'tooutput.cpp' || echo '$(srcdir)/'`tooutput.cpp tora-tooutput.obj: tooutput.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tooutput.obj -MD -MP -MF $(DEPDIR)/tora-tooutput.Tpo -c -o tora-tooutput.obj `if test -f 'tooutput.cpp'; then $(CYGPATH_W) 'tooutput.cpp'; else $(CYGPATH_W) '$(srcdir)/tooutput.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tooutput.Tpo $(DEPDIR)/tora-tooutput.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tooutput.cpp' object='tora-tooutput.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tooutput.obj `if test -f 'tooutput.cpp'; then $(CYGPATH_W) 'tooutput.cpp'; else $(CYGPATH_W) '$(srcdir)/tooutput.cpp'; fi` tora-topassword.o: topassword.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-topassword.o -MD -MP -MF $(DEPDIR)/tora-topassword.Tpo -c -o tora-topassword.o `test -f 'topassword.cpp' || echo '$(srcdir)/'`topassword.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-topassword.Tpo $(DEPDIR)/tora-topassword.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='topassword.cpp' object='tora-topassword.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-topassword.o `test -f 'topassword.cpp' || echo '$(srcdir)/'`topassword.cpp tora-topassword.obj: topassword.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-topassword.obj -MD -MP -MF $(DEPDIR)/tora-topassword.Tpo -c -o tora-topassword.obj `if test -f 'topassword.cpp'; then $(CYGPATH_W) 'topassword.cpp'; else $(CYGPATH_W) '$(srcdir)/topassword.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-topassword.Tpo $(DEPDIR)/tora-topassword.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='topassword.cpp' object='tora-topassword.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-topassword.obj `if test -f 'topassword.cpp'; then $(CYGPATH_W) 'topassword.cpp'; else $(CYGPATH_W) '$(srcdir)/topassword.cpp'; fi` tora-toprofiler.o: toprofiler.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toprofiler.o -MD -MP -MF $(DEPDIR)/tora-toprofiler.Tpo -c -o tora-toprofiler.o `test -f 'toprofiler.cpp' || echo '$(srcdir)/'`toprofiler.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toprofiler.Tpo $(DEPDIR)/tora-toprofiler.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toprofiler.cpp' object='tora-toprofiler.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toprofiler.o `test -f 'toprofiler.cpp' || echo '$(srcdir)/'`toprofiler.cpp tora-toprofiler.obj: toprofiler.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toprofiler.obj -MD -MP -MF $(DEPDIR)/tora-toprofiler.Tpo -c -o tora-toprofiler.obj `if test -f 'toprofiler.cpp'; then $(CYGPATH_W) 'toprofiler.cpp'; else $(CYGPATH_W) '$(srcdir)/toprofiler.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toprofiler.Tpo $(DEPDIR)/tora-toprofiler.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toprofiler.cpp' object='tora-toprofiler.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toprofiler.obj `if test -f 'toprofiler.cpp'; then $(CYGPATH_W) 'toprofiler.cpp'; else $(CYGPATH_W) '$(srcdir)/toprofiler.cpp'; fi` tora-toproject.o: toproject.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toproject.o -MD -MP -MF $(DEPDIR)/tora-toproject.Tpo -c -o tora-toproject.o `test -f 'toproject.cpp' || echo '$(srcdir)/'`toproject.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toproject.Tpo $(DEPDIR)/tora-toproject.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toproject.cpp' object='tora-toproject.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toproject.o `test -f 'toproject.cpp' || echo '$(srcdir)/'`toproject.cpp tora-toproject.obj: toproject.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toproject.obj -MD -MP -MF $(DEPDIR)/tora-toproject.Tpo -c -o tora-toproject.obj `if test -f 'toproject.cpp'; then $(CYGPATH_W) 'toproject.cpp'; else $(CYGPATH_W) '$(srcdir)/toproject.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toproject.Tpo $(DEPDIR)/tora-toproject.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toproject.cpp' object='tora-toproject.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toproject.obj `if test -f 'toproject.cpp'; then $(CYGPATH_W) 'toproject.cpp'; else $(CYGPATH_W) '$(srcdir)/toproject.cpp'; fi` tora-toqsqlconnection.o: toqsqlconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toqsqlconnection.o -MD -MP -MF $(DEPDIR)/tora-toqsqlconnection.Tpo -c -o tora-toqsqlconnection.o `test -f 'toqsqlconnection.cpp' || echo '$(srcdir)/'`toqsqlconnection.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toqsqlconnection.Tpo $(DEPDIR)/tora-toqsqlconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toqsqlconnection.cpp' object='tora-toqsqlconnection.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toqsqlconnection.o `test -f 'toqsqlconnection.cpp' || echo '$(srcdir)/'`toqsqlconnection.cpp tora-toqsqlconnection.obj: toqsqlconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toqsqlconnection.obj -MD -MP -MF $(DEPDIR)/tora-toqsqlconnection.Tpo -c -o tora-toqsqlconnection.obj `if test -f 'toqsqlconnection.cpp'; then $(CYGPATH_W) 'toqsqlconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/toqsqlconnection.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toqsqlconnection.Tpo $(DEPDIR)/tora-toqsqlconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toqsqlconnection.cpp' object='tora-toqsqlconnection.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toqsqlconnection.obj `if test -f 'toqsqlconnection.cpp'; then $(CYGPATH_W) 'toqsqlconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/toqsqlconnection.cpp'; fi` tora-torollback.o: torollback.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-torollback.o -MD -MP -MF $(DEPDIR)/tora-torollback.Tpo -c -o tora-torollback.o `test -f 'torollback.cpp' || echo '$(srcdir)/'`torollback.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-torollback.Tpo $(DEPDIR)/tora-torollback.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='torollback.cpp' object='tora-torollback.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-torollback.o `test -f 'torollback.cpp' || echo '$(srcdir)/'`torollback.cpp tora-torollback.obj: torollback.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-torollback.obj -MD -MP -MF $(DEPDIR)/tora-torollback.Tpo -c -o tora-torollback.obj `if test -f 'torollback.cpp'; then $(CYGPATH_W) 'torollback.cpp'; else $(CYGPATH_W) '$(srcdir)/torollback.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-torollback.Tpo $(DEPDIR)/tora-torollback.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='torollback.cpp' object='tora-torollback.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-torollback.obj `if test -f 'torollback.cpp'; then $(CYGPATH_W) 'torollback.cpp'; else $(CYGPATH_W) '$(srcdir)/torollback.cpp'; fi` tora-toscript.o: toscript.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toscript.o -MD -MP -MF $(DEPDIR)/tora-toscript.Tpo -c -o tora-toscript.o `test -f 'toscript.cpp' || echo '$(srcdir)/'`toscript.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toscript.Tpo $(DEPDIR)/tora-toscript.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toscript.cpp' object='tora-toscript.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toscript.o `test -f 'toscript.cpp' || echo '$(srcdir)/'`toscript.cpp tora-toscript.obj: toscript.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toscript.obj -MD -MP -MF $(DEPDIR)/tora-toscript.Tpo -c -o tora-toscript.obj `if test -f 'toscript.cpp'; then $(CYGPATH_W) 'toscript.cpp'; else $(CYGPATH_W) '$(srcdir)/toscript.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toscript.Tpo $(DEPDIR)/tora-toscript.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toscript.cpp' object='tora-toscript.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toscript.obj `if test -f 'toscript.cpp'; then $(CYGPATH_W) 'toscript.cpp'; else $(CYGPATH_W) '$(srcdir)/toscript.cpp'; fi` tora-toscriptschemawidget.o: toscriptschemawidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toscriptschemawidget.o -MD -MP -MF $(DEPDIR)/tora-toscriptschemawidget.Tpo -c -o tora-toscriptschemawidget.o `test -f 'toscriptschemawidget.cpp' || echo '$(srcdir)/'`toscriptschemawidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toscriptschemawidget.Tpo $(DEPDIR)/tora-toscriptschemawidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toscriptschemawidget.cpp' object='tora-toscriptschemawidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toscriptschemawidget.o `test -f 'toscriptschemawidget.cpp' || echo '$(srcdir)/'`toscriptschemawidget.cpp tora-toscriptschemawidget.obj: toscriptschemawidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toscriptschemawidget.obj -MD -MP -MF $(DEPDIR)/tora-toscriptschemawidget.Tpo -c -o tora-toscriptschemawidget.obj `if test -f 'toscriptschemawidget.cpp'; then $(CYGPATH_W) 'toscriptschemawidget.cpp'; else $(CYGPATH_W) '$(srcdir)/toscriptschemawidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toscriptschemawidget.Tpo $(DEPDIR)/tora-toscriptschemawidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toscriptschemawidget.cpp' object='tora-toscriptschemawidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toscriptschemawidget.obj `if test -f 'toscriptschemawidget.cpp'; then $(CYGPATH_W) 'toscriptschemawidget.cpp'; else $(CYGPATH_W) '$(srcdir)/toscriptschemawidget.cpp'; fi` tora-toscripttreeitem.o: toscripttreeitem.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toscripttreeitem.o -MD -MP -MF $(DEPDIR)/tora-toscripttreeitem.Tpo -c -o tora-toscripttreeitem.o `test -f 'toscripttreeitem.cpp' || echo '$(srcdir)/'`toscripttreeitem.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toscripttreeitem.Tpo $(DEPDIR)/tora-toscripttreeitem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toscripttreeitem.cpp' object='tora-toscripttreeitem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toscripttreeitem.o `test -f 'toscripttreeitem.cpp' || echo '$(srcdir)/'`toscripttreeitem.cpp tora-toscripttreeitem.obj: toscripttreeitem.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toscripttreeitem.obj -MD -MP -MF $(DEPDIR)/tora-toscripttreeitem.Tpo -c -o tora-toscripttreeitem.obj `if test -f 'toscripttreeitem.cpp'; then $(CYGPATH_W) 'toscripttreeitem.cpp'; else $(CYGPATH_W) '$(srcdir)/toscripttreeitem.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toscripttreeitem.Tpo $(DEPDIR)/tora-toscripttreeitem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toscripttreeitem.cpp' object='tora-toscripttreeitem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toscripttreeitem.obj `if test -f 'toscripttreeitem.cpp'; then $(CYGPATH_W) 'toscripttreeitem.cpp'; else $(CYGPATH_W) '$(srcdir)/toscripttreeitem.cpp'; fi` tora-tocodemodel.o: tocodemodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tocodemodel.o -MD -MP -MF $(DEPDIR)/tora-tocodemodel.Tpo -c -o tora-tocodemodel.o `test -f 'tocodemodel.cpp' || echo '$(srcdir)/'`tocodemodel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tocodemodel.Tpo $(DEPDIR)/tora-tocodemodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tocodemodel.cpp' object='tora-tocodemodel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tocodemodel.o `test -f 'tocodemodel.cpp' || echo '$(srcdir)/'`tocodemodel.cpp tora-tocodemodel.obj: tocodemodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tocodemodel.obj -MD -MP -MF $(DEPDIR)/tora-tocodemodel.Tpo -c -o tora-tocodemodel.obj `if test -f 'tocodemodel.cpp'; then $(CYGPATH_W) 'tocodemodel.cpp'; else $(CYGPATH_W) '$(srcdir)/tocodemodel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tocodemodel.Tpo $(DEPDIR)/tora-tocodemodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tocodemodel.cpp' object='tora-tocodemodel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tocodemodel.obj `if test -f 'tocodemodel.cpp'; then $(CYGPATH_W) 'tocodemodel.cpp'; else $(CYGPATH_W) '$(srcdir)/tocodemodel.cpp'; fi` tora-toscripttreemodel.o: toscripttreemodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toscripttreemodel.o -MD -MP -MF $(DEPDIR)/tora-toscripttreemodel.Tpo -c -o tora-toscripttreemodel.o `test -f 'toscripttreemodel.cpp' || echo '$(srcdir)/'`toscripttreemodel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toscripttreemodel.Tpo $(DEPDIR)/tora-toscripttreemodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toscripttreemodel.cpp' object='tora-toscripttreemodel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toscripttreemodel.o `test -f 'toscripttreemodel.cpp' || echo '$(srcdir)/'`toscripttreemodel.cpp tora-toscripttreemodel.obj: toscripttreemodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toscripttreemodel.obj -MD -MP -MF $(DEPDIR)/tora-toscripttreemodel.Tpo -c -o tora-toscripttreemodel.obj `if test -f 'toscripttreemodel.cpp'; then $(CYGPATH_W) 'toscripttreemodel.cpp'; else $(CYGPATH_W) '$(srcdir)/toscripttreemodel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toscripttreemodel.Tpo $(DEPDIR)/tora-toscripttreemodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toscripttreemodel.cpp' object='tora-toscripttreemodel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toscripttreemodel.obj `if test -f 'toscripttreemodel.cpp'; then $(CYGPATH_W) 'toscripttreemodel.cpp'; else $(CYGPATH_W) '$(srcdir)/toscripttreemodel.cpp'; fi` tora-tosecurity.o: tosecurity.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosecurity.o -MD -MP -MF $(DEPDIR)/tora-tosecurity.Tpo -c -o tora-tosecurity.o `test -f 'tosecurity.cpp' || echo '$(srcdir)/'`tosecurity.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosecurity.Tpo $(DEPDIR)/tora-tosecurity.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosecurity.cpp' object='tora-tosecurity.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosecurity.o `test -f 'tosecurity.cpp' || echo '$(srcdir)/'`tosecurity.cpp tora-tosecurity.obj: tosecurity.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosecurity.obj -MD -MP -MF $(DEPDIR)/tora-tosecurity.Tpo -c -o tora-tosecurity.obj `if test -f 'tosecurity.cpp'; then $(CYGPATH_W) 'tosecurity.cpp'; else $(CYGPATH_W) '$(srcdir)/tosecurity.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosecurity.Tpo $(DEPDIR)/tora-tosecurity.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosecurity.cpp' object='tora-tosecurity.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosecurity.obj `if test -f 'tosecurity.cpp'; then $(CYGPATH_W) 'tosecurity.cpp'; else $(CYGPATH_W) '$(srcdir)/tosecurity.cpp'; fi` tora-tosecuritytreemodel.o: tosecuritytreemodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosecuritytreemodel.o -MD -MP -MF $(DEPDIR)/tora-tosecuritytreemodel.Tpo -c -o tora-tosecuritytreemodel.o `test -f 'tosecuritytreemodel.cpp' || echo '$(srcdir)/'`tosecuritytreemodel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosecuritytreemodel.Tpo $(DEPDIR)/tora-tosecuritytreemodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosecuritytreemodel.cpp' object='tora-tosecuritytreemodel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosecuritytreemodel.o `test -f 'tosecuritytreemodel.cpp' || echo '$(srcdir)/'`tosecuritytreemodel.cpp tora-tosecuritytreemodel.obj: tosecuritytreemodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosecuritytreemodel.obj -MD -MP -MF $(DEPDIR)/tora-tosecuritytreemodel.Tpo -c -o tora-tosecuritytreemodel.obj `if test -f 'tosecuritytreemodel.cpp'; then $(CYGPATH_W) 'tosecuritytreemodel.cpp'; else $(CYGPATH_W) '$(srcdir)/tosecuritytreemodel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosecuritytreemodel.Tpo $(DEPDIR)/tora-tosecuritytreemodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosecuritytreemodel.cpp' object='tora-tosecuritytreemodel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosecuritytreemodel.obj `if test -f 'tosecuritytreemodel.cpp'; then $(CYGPATH_W) 'tosecuritytreemodel.cpp'; else $(CYGPATH_W) '$(srcdir)/tosecuritytreemodel.cpp'; fi` tora-tosecuritytreeitem.o: tosecuritytreeitem.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosecuritytreeitem.o -MD -MP -MF $(DEPDIR)/tora-tosecuritytreeitem.Tpo -c -o tora-tosecuritytreeitem.o `test -f 'tosecuritytreeitem.cpp' || echo '$(srcdir)/'`tosecuritytreeitem.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosecuritytreeitem.Tpo $(DEPDIR)/tora-tosecuritytreeitem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosecuritytreeitem.cpp' object='tora-tosecuritytreeitem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosecuritytreeitem.o `test -f 'tosecuritytreeitem.cpp' || echo '$(srcdir)/'`tosecuritytreeitem.cpp tora-tosecuritytreeitem.obj: tosecuritytreeitem.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosecuritytreeitem.obj -MD -MP -MF $(DEPDIR)/tora-tosecuritytreeitem.Tpo -c -o tora-tosecuritytreeitem.obj `if test -f 'tosecuritytreeitem.cpp'; then $(CYGPATH_W) 'tosecuritytreeitem.cpp'; else $(CYGPATH_W) '$(srcdir)/tosecuritytreeitem.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosecuritytreeitem.Tpo $(DEPDIR)/tora-tosecuritytreeitem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosecuritytreeitem.cpp' object='tora-tosecuritytreeitem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosecuritytreeitem.obj `if test -f 'tosecuritytreeitem.cpp'; then $(CYGPATH_W) 'tosecuritytreeitem.cpp'; else $(CYGPATH_W) '$(srcdir)/tosecuritytreeitem.cpp'; fi` tora-tosession.o: tosession.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosession.o -MD -MP -MF $(DEPDIR)/tora-tosession.Tpo -c -o tora-tosession.o `test -f 'tosession.cpp' || echo '$(srcdir)/'`tosession.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosession.Tpo $(DEPDIR)/tora-tosession.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosession.cpp' object='tora-tosession.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosession.o `test -f 'tosession.cpp' || echo '$(srcdir)/'`tosession.cpp tora-tosession.obj: tosession.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosession.obj -MD -MP -MF $(DEPDIR)/tora-tosession.Tpo -c -o tora-tosession.obj `if test -f 'tosession.cpp'; then $(CYGPATH_W) 'tosession.cpp'; else $(CYGPATH_W) '$(srcdir)/tosession.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosession.Tpo $(DEPDIR)/tora-tosession.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosession.cpp' object='tora-tosession.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosession.obj `if test -f 'tosession.cpp'; then $(CYGPATH_W) 'tosession.cpp'; else $(CYGPATH_W) '$(srcdir)/tosession.cpp'; fi` tora-tosgatrace.o: tosgatrace.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosgatrace.o -MD -MP -MF $(DEPDIR)/tora-tosgatrace.Tpo -c -o tora-tosgatrace.o `test -f 'tosgatrace.cpp' || echo '$(srcdir)/'`tosgatrace.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosgatrace.Tpo $(DEPDIR)/tora-tosgatrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosgatrace.cpp' object='tora-tosgatrace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosgatrace.o `test -f 'tosgatrace.cpp' || echo '$(srcdir)/'`tosgatrace.cpp tora-tosgatrace.obj: tosgatrace.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosgatrace.obj -MD -MP -MF $(DEPDIR)/tora-tosgatrace.Tpo -c -o tora-tosgatrace.obj `if test -f 'tosgatrace.cpp'; then $(CYGPATH_W) 'tosgatrace.cpp'; else $(CYGPATH_W) '$(srcdir)/tosgatrace.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosgatrace.Tpo $(DEPDIR)/tora-tosgatrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosgatrace.cpp' object='tora-tosgatrace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosgatrace.obj `if test -f 'tosgatrace.cpp'; then $(CYGPATH_W) 'tosgatrace.cpp'; else $(CYGPATH_W) '$(srcdir)/tosgatrace.cpp'; fi` tora-tosqledit.o: tosqledit.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosqledit.o -MD -MP -MF $(DEPDIR)/tora-tosqledit.Tpo -c -o tora-tosqledit.o `test -f 'tosqledit.cpp' || echo '$(srcdir)/'`tosqledit.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosqledit.Tpo $(DEPDIR)/tora-tosqledit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosqledit.cpp' object='tora-tosqledit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosqledit.o `test -f 'tosqledit.cpp' || echo '$(srcdir)/'`tosqledit.cpp tora-tosqledit.obj: tosqledit.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosqledit.obj -MD -MP -MF $(DEPDIR)/tora-tosqledit.Tpo -c -o tora-tosqledit.obj `if test -f 'tosqledit.cpp'; then $(CYGPATH_W) 'tosqledit.cpp'; else $(CYGPATH_W) '$(srcdir)/tosqledit.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosqledit.Tpo $(DEPDIR)/tora-tosqledit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosqledit.cpp' object='tora-tosqledit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosqledit.obj `if test -f 'tosqledit.cpp'; then $(CYGPATH_W) 'tosqledit.cpp'; else $(CYGPATH_W) '$(srcdir)/tosqledit.cpp'; fi` tora-tostorage.o: tostorage.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tostorage.o -MD -MP -MF $(DEPDIR)/tora-tostorage.Tpo -c -o tora-tostorage.o `test -f 'tostorage.cpp' || echo '$(srcdir)/'`tostorage.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tostorage.Tpo $(DEPDIR)/tora-tostorage.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tostorage.cpp' object='tora-tostorage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tostorage.o `test -f 'tostorage.cpp' || echo '$(srcdir)/'`tostorage.cpp tora-tostorage.obj: tostorage.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tostorage.obj -MD -MP -MF $(DEPDIR)/tora-tostorage.Tpo -c -o tora-tostorage.obj `if test -f 'tostorage.cpp'; then $(CYGPATH_W) 'tostorage.cpp'; else $(CYGPATH_W) '$(srcdir)/tostorage.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tostorage.Tpo $(DEPDIR)/tora-tostorage.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tostorage.cpp' object='tora-tostorage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tostorage.obj `if test -f 'tostorage.cpp'; then $(CYGPATH_W) 'tostorage.cpp'; else $(CYGPATH_W) '$(srcdir)/tostorage.cpp'; fi` tora-tostoragedefinition.o: tostoragedefinition.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tostoragedefinition.o -MD -MP -MF $(DEPDIR)/tora-tostoragedefinition.Tpo -c -o tora-tostoragedefinition.o `test -f 'tostoragedefinition.cpp' || echo '$(srcdir)/'`tostoragedefinition.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tostoragedefinition.Tpo $(DEPDIR)/tora-tostoragedefinition.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tostoragedefinition.cpp' object='tora-tostoragedefinition.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tostoragedefinition.o `test -f 'tostoragedefinition.cpp' || echo '$(srcdir)/'`tostoragedefinition.cpp tora-tostoragedefinition.obj: tostoragedefinition.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tostoragedefinition.obj -MD -MP -MF $(DEPDIR)/tora-tostoragedefinition.Tpo -c -o tora-tostoragedefinition.obj `if test -f 'tostoragedefinition.cpp'; then $(CYGPATH_W) 'tostoragedefinition.cpp'; else $(CYGPATH_W) '$(srcdir)/tostoragedefinition.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tostoragedefinition.Tpo $(DEPDIR)/tora-tostoragedefinition.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tostoragedefinition.cpp' object='tora-tostoragedefinition.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tostoragedefinition.obj `if test -f 'tostoragedefinition.cpp'; then $(CYGPATH_W) 'tostoragedefinition.cpp'; else $(CYGPATH_W) '$(srcdir)/tostoragedefinition.cpp'; fi` tora-totemplate.o: totemplate.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totemplate.o -MD -MP -MF $(DEPDIR)/tora-totemplate.Tpo -c -o tora-totemplate.o `test -f 'totemplate.cpp' || echo '$(srcdir)/'`totemplate.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totemplate.Tpo $(DEPDIR)/tora-totemplate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totemplate.cpp' object='tora-totemplate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totemplate.o `test -f 'totemplate.cpp' || echo '$(srcdir)/'`totemplate.cpp tora-totemplate.obj: totemplate.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totemplate.obj -MD -MP -MF $(DEPDIR)/tora-totemplate.Tpo -c -o tora-totemplate.obj `if test -f 'totemplate.cpp'; then $(CYGPATH_W) 'totemplate.cpp'; else $(CYGPATH_W) '$(srcdir)/totemplate.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totemplate.Tpo $(DEPDIR)/tora-totemplate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totemplate.cpp' object='tora-totemplate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totemplate.obj `if test -f 'totemplate.cpp'; then $(CYGPATH_W) 'totemplate.cpp'; else $(CYGPATH_W) '$(srcdir)/totemplate.cpp'; fi` tora-totemporary.o: totemporary.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totemporary.o -MD -MP -MF $(DEPDIR)/tora-totemporary.Tpo -c -o tora-totemporary.o `test -f 'totemporary.cpp' || echo '$(srcdir)/'`totemporary.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totemporary.Tpo $(DEPDIR)/tora-totemporary.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totemporary.cpp' object='tora-totemporary.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totemporary.o `test -f 'totemporary.cpp' || echo '$(srcdir)/'`totemporary.cpp tora-totemporary.obj: totemporary.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totemporary.obj -MD -MP -MF $(DEPDIR)/tora-totemporary.Tpo -c -o tora-totemporary.obj `if test -f 'totemporary.cpp'; then $(CYGPATH_W) 'totemporary.cpp'; else $(CYGPATH_W) '$(srcdir)/totemporary.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totemporary.Tpo $(DEPDIR)/tora-totemporary.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totemporary.cpp' object='tora-totemporary.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totemporary.obj `if test -f 'totemporary.cpp'; then $(CYGPATH_W) 'totemporary.cpp'; else $(CYGPATH_W) '$(srcdir)/totemporary.cpp'; fi` tora-totuning.o: totuning.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totuning.o -MD -MP -MF $(DEPDIR)/tora-totuning.Tpo -c -o tora-totuning.o `test -f 'totuning.cpp' || echo '$(srcdir)/'`totuning.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totuning.Tpo $(DEPDIR)/tora-totuning.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totuning.cpp' object='tora-totuning.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totuning.o `test -f 'totuning.cpp' || echo '$(srcdir)/'`totuning.cpp tora-totuning.obj: totuning.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totuning.obj -MD -MP -MF $(DEPDIR)/tora-totuning.Tpo -c -o tora-totuning.obj `if test -f 'totuning.cpp'; then $(CYGPATH_W) 'totuning.cpp'; else $(CYGPATH_W) '$(srcdir)/totuning.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totuning.Tpo $(DEPDIR)/tora-totuning.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totuning.cpp' object='tora-totuning.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totuning.obj `if test -f 'totuning.cpp'; then $(CYGPATH_W) 'totuning.cpp'; else $(CYGPATH_W) '$(srcdir)/totuning.cpp'; fi` tora-tounittest.o: tounittest.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tounittest.o -MD -MP -MF $(DEPDIR)/tora-tounittest.Tpo -c -o tora-tounittest.o `test -f 'tounittest.cpp' || echo '$(srcdir)/'`tounittest.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tounittest.Tpo $(DEPDIR)/tora-tounittest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tounittest.cpp' object='tora-tounittest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tounittest.o `test -f 'tounittest.cpp' || echo '$(srcdir)/'`tounittest.cpp tora-tounittest.obj: tounittest.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tounittest.obj -MD -MP -MF $(DEPDIR)/tora-tounittest.Tpo -c -o tora-tounittest.obj `if test -f 'tounittest.cpp'; then $(CYGPATH_W) 'tounittest.cpp'; else $(CYGPATH_W) '$(srcdir)/tounittest.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tounittest.Tpo $(DEPDIR)/tora-tounittest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tounittest.cpp' object='tora-tounittest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tounittest.obj `if test -f 'tounittest.cpp'; then $(CYGPATH_W) 'tounittest.cpp'; else $(CYGPATH_W) '$(srcdir)/tounittest.cpp'; fi` tora-tochangeconnection.o: tochangeconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tochangeconnection.o -MD -MP -MF $(DEPDIR)/tora-tochangeconnection.Tpo -c -o tora-tochangeconnection.o `test -f 'tochangeconnection.cpp' || echo '$(srcdir)/'`tochangeconnection.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tochangeconnection.Tpo $(DEPDIR)/tora-tochangeconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tochangeconnection.cpp' object='tora-tochangeconnection.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tochangeconnection.o `test -f 'tochangeconnection.cpp' || echo '$(srcdir)/'`tochangeconnection.cpp tora-tochangeconnection.obj: tochangeconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tochangeconnection.obj -MD -MP -MF $(DEPDIR)/tora-tochangeconnection.Tpo -c -o tora-tochangeconnection.obj `if test -f 'tochangeconnection.cpp'; then $(CYGPATH_W) 'tochangeconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/tochangeconnection.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tochangeconnection.Tpo $(DEPDIR)/tora-tochangeconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tochangeconnection.cpp' object='tora-tochangeconnection.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tochangeconnection.obj `if test -f 'tochangeconnection.cpp'; then $(CYGPATH_W) 'tochangeconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/tochangeconnection.cpp'; fi` tora-toworkingwidget.o: toworkingwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toworkingwidget.o -MD -MP -MF $(DEPDIR)/tora-toworkingwidget.Tpo -c -o tora-toworkingwidget.o `test -f 'toworkingwidget.cpp' || echo '$(srcdir)/'`toworkingwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toworkingwidget.Tpo $(DEPDIR)/tora-toworkingwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toworkingwidget.cpp' object='tora-toworkingwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toworkingwidget.o `test -f 'toworkingwidget.cpp' || echo '$(srcdir)/'`toworkingwidget.cpp tora-toworkingwidget.obj: toworkingwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toworkingwidget.obj -MD -MP -MF $(DEPDIR)/tora-toworkingwidget.Tpo -c -o tora-toworkingwidget.obj `if test -f 'toworkingwidget.cpp'; then $(CYGPATH_W) 'toworkingwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/toworkingwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toworkingwidget.Tpo $(DEPDIR)/tora-toworkingwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toworkingwidget.cpp' object='tora-toworkingwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toworkingwidget.obj `if test -f 'toworkingwidget.cpp'; then $(CYGPATH_W) 'toworkingwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/toworkingwidget.cpp'; fi` tora-toworksheet.o: toworksheet.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toworksheet.o -MD -MP -MF $(DEPDIR)/tora-toworksheet.Tpo -c -o tora-toworksheet.o `test -f 'toworksheet.cpp' || echo '$(srcdir)/'`toworksheet.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toworksheet.Tpo $(DEPDIR)/tora-toworksheet.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toworksheet.cpp' object='tora-toworksheet.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toworksheet.o `test -f 'toworksheet.cpp' || echo '$(srcdir)/'`toworksheet.cpp tora-toworksheet.obj: toworksheet.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toworksheet.obj -MD -MP -MF $(DEPDIR)/tora-toworksheet.Tpo -c -o tora-toworksheet.obj `if test -f 'toworksheet.cpp'; then $(CYGPATH_W) 'toworksheet.cpp'; else $(CYGPATH_W) '$(srcdir)/toworksheet.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toworksheet.Tpo $(DEPDIR)/tora-toworksheet.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toworksheet.cpp' object='tora-toworksheet.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toworksheet.obj `if test -f 'toworksheet.cpp'; then $(CYGPATH_W) 'toworksheet.cpp'; else $(CYGPATH_W) '$(srcdir)/toworksheet.cpp'; fi` tora-toeditablemenu.o: toeditablemenu.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toeditablemenu.o -MD -MP -MF $(DEPDIR)/tora-toeditablemenu.Tpo -c -o tora-toeditablemenu.o `test -f 'toeditablemenu.cpp' || echo '$(srcdir)/'`toeditablemenu.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toeditablemenu.Tpo $(DEPDIR)/tora-toeditablemenu.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toeditablemenu.cpp' object='tora-toeditablemenu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toeditablemenu.o `test -f 'toeditablemenu.cpp' || echo '$(srcdir)/'`toeditablemenu.cpp tora-toeditablemenu.obj: toeditablemenu.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toeditablemenu.obj -MD -MP -MF $(DEPDIR)/tora-toeditablemenu.Tpo -c -o tora-toeditablemenu.obj `if test -f 'toeditablemenu.cpp'; then $(CYGPATH_W) 'toeditablemenu.cpp'; else $(CYGPATH_W) '$(srcdir)/toeditablemenu.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toeditablemenu.Tpo $(DEPDIR)/tora-toeditablemenu.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toeditablemenu.cpp' object='tora-toeditablemenu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toeditablemenu.obj `if test -f 'toeditablemenu.cpp'; then $(CYGPATH_W) 'toeditablemenu.cpp'; else $(CYGPATH_W) '$(srcdir)/toeditablemenu.cpp'; fi` tora-toworksheetwidget.o: toworksheetwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toworksheetwidget.o -MD -MP -MF $(DEPDIR)/tora-toworksheetwidget.Tpo -c -o tora-toworksheetwidget.o `test -f 'toworksheetwidget.cpp' || echo '$(srcdir)/'`toworksheetwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toworksheetwidget.Tpo $(DEPDIR)/tora-toworksheetwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toworksheetwidget.cpp' object='tora-toworksheetwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toworksheetwidget.o `test -f 'toworksheetwidget.cpp' || echo '$(srcdir)/'`toworksheetwidget.cpp tora-toworksheetwidget.obj: toworksheetwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toworksheetwidget.obj -MD -MP -MF $(DEPDIR)/tora-toworksheetwidget.Tpo -c -o tora-toworksheetwidget.obj `if test -f 'toworksheetwidget.cpp'; then $(CYGPATH_W) 'toworksheetwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/toworksheetwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toworksheetwidget.Tpo $(DEPDIR)/tora-toworksheetwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toworksheetwidget.cpp' object='tora-toworksheetwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toworksheetwidget.obj `if test -f 'toworksheetwidget.cpp'; then $(CYGPATH_W) 'toworksheetwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/toworksheetwidget.cpp'; fi` tora-toworksheettext.o: toworksheettext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toworksheettext.o -MD -MP -MF $(DEPDIR)/tora-toworksheettext.Tpo -c -o tora-toworksheettext.o `test -f 'toworksheettext.cpp' || echo '$(srcdir)/'`toworksheettext.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toworksheettext.Tpo $(DEPDIR)/tora-toworksheettext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toworksheettext.cpp' object='tora-toworksheettext.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toworksheettext.o `test -f 'toworksheettext.cpp' || echo '$(srcdir)/'`toworksheettext.cpp tora-toworksheettext.obj: toworksheettext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toworksheettext.obj -MD -MP -MF $(DEPDIR)/tora-toworksheettext.Tpo -c -o tora-toworksheettext.obj `if test -f 'toworksheettext.cpp'; then $(CYGPATH_W) 'toworksheettext.cpp'; else $(CYGPATH_W) '$(srcdir)/toworksheettext.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toworksheettext.Tpo $(DEPDIR)/tora-toworksheettext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toworksheettext.cpp' object='tora-toworksheettext.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toworksheettext.obj `if test -f 'toworksheettext.cpp'; then $(CYGPATH_W) 'toworksheettext.cpp'; else $(CYGPATH_W) '$(srcdir)/toworksheettext.cpp'; fi` tora-toworksheetstatistic.o: toworksheetstatistic.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toworksheetstatistic.o -MD -MP -MF $(DEPDIR)/tora-toworksheetstatistic.Tpo -c -o tora-toworksheetstatistic.o `test -f 'toworksheetstatistic.cpp' || echo '$(srcdir)/'`toworksheetstatistic.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toworksheetstatistic.Tpo $(DEPDIR)/tora-toworksheetstatistic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toworksheetstatistic.cpp' object='tora-toworksheetstatistic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toworksheetstatistic.o `test -f 'toworksheetstatistic.cpp' || echo '$(srcdir)/'`toworksheetstatistic.cpp tora-toworksheetstatistic.obj: toworksheetstatistic.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toworksheetstatistic.obj -MD -MP -MF $(DEPDIR)/tora-toworksheetstatistic.Tpo -c -o tora-toworksheetstatistic.obj `if test -f 'toworksheetstatistic.cpp'; then $(CYGPATH_W) 'toworksheetstatistic.cpp'; else $(CYGPATH_W) '$(srcdir)/toworksheetstatistic.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toworksheetstatistic.Tpo $(DEPDIR)/tora-toworksheetstatistic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toworksheetstatistic.cpp' object='tora-toworksheetstatistic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toworksheetstatistic.obj `if test -f 'toworksheetstatistic.cpp'; then $(CYGPATH_W) 'toworksheetstatistic.cpp'; else $(CYGPATH_W) '$(srcdir)/toworksheetstatistic.cpp'; fi` tora-tobrowserconstraint.o: tobrowserconstraint.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserconstraint.o -MD -MP -MF $(DEPDIR)/tora-tobrowserconstraint.Tpo -c -o tora-tobrowserconstraint.o `test -f 'tobrowserconstraint.cpp' || echo '$(srcdir)/'`tobrowserconstraint.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserconstraint.Tpo $(DEPDIR)/tora-tobrowserconstraint.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserconstraint.cpp' object='tora-tobrowserconstraint.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserconstraint.o `test -f 'tobrowserconstraint.cpp' || echo '$(srcdir)/'`tobrowserconstraint.cpp tora-tobrowserconstraint.obj: tobrowserconstraint.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserconstraint.obj -MD -MP -MF $(DEPDIR)/tora-tobrowserconstraint.Tpo -c -o tora-tobrowserconstraint.obj `if test -f 'tobrowserconstraint.cpp'; then $(CYGPATH_W) 'tobrowserconstraint.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserconstraint.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserconstraint.Tpo $(DEPDIR)/tora-tobrowserconstraint.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserconstraint.cpp' object='tora-tobrowserconstraint.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserconstraint.obj `if test -f 'tobrowserconstraint.cpp'; then $(CYGPATH_W) 'tobrowserconstraint.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserconstraint.cpp'; fi` tora-tobrowserindex.o: tobrowserindex.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserindex.o -MD -MP -MF $(DEPDIR)/tora-tobrowserindex.Tpo -c -o tora-tobrowserindex.o `test -f 'tobrowserindex.cpp' || echo '$(srcdir)/'`tobrowserindex.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserindex.Tpo $(DEPDIR)/tora-tobrowserindex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserindex.cpp' object='tora-tobrowserindex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserindex.o `test -f 'tobrowserindex.cpp' || echo '$(srcdir)/'`tobrowserindex.cpp tora-tobrowserindex.obj: tobrowserindex.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserindex.obj -MD -MP -MF $(DEPDIR)/tora-tobrowserindex.Tpo -c -o tora-tobrowserindex.obj `if test -f 'tobrowserindex.cpp'; then $(CYGPATH_W) 'tobrowserindex.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserindex.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserindex.Tpo $(DEPDIR)/tora-tobrowserindex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserindex.cpp' object='tora-tobrowserindex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserindex.obj `if test -f 'tobrowserindex.cpp'; then $(CYGPATH_W) 'tobrowserindex.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserindex.cpp'; fi` tora-tobrowsertable.o: tobrowsertable.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowsertable.o -MD -MP -MF $(DEPDIR)/tora-tobrowsertable.Tpo -c -o tora-tobrowsertable.o `test -f 'tobrowsertable.cpp' || echo '$(srcdir)/'`tobrowsertable.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowsertable.Tpo $(DEPDIR)/tora-tobrowsertable.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowsertable.cpp' object='tora-tobrowsertable.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowsertable.o `test -f 'tobrowsertable.cpp' || echo '$(srcdir)/'`tobrowsertable.cpp tora-tobrowsertable.obj: tobrowsertable.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowsertable.obj -MD -MP -MF $(DEPDIR)/tora-tobrowsertable.Tpo -c -o tora-tobrowsertable.obj `if test -f 'tobrowsertable.cpp'; then $(CYGPATH_W) 'tobrowsertable.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowsertable.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowsertable.Tpo $(DEPDIR)/tora-tobrowsertable.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowsertable.cpp' object='tora-tobrowsertable.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowsertable.obj `if test -f 'tobrowsertable.cpp'; then $(CYGPATH_W) 'tobrowsertable.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowsertable.cpp'; fi` tora-tochartmanager.o: tochartmanager.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tochartmanager.o -MD -MP -MF $(DEPDIR)/tora-tochartmanager.Tpo -c -o tora-tochartmanager.o `test -f 'tochartmanager.cpp' || echo '$(srcdir)/'`tochartmanager.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tochartmanager.Tpo $(DEPDIR)/tora-tochartmanager.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tochartmanager.cpp' object='tora-tochartmanager.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tochartmanager.o `test -f 'tochartmanager.cpp' || echo '$(srcdir)/'`tochartmanager.cpp tora-tochartmanager.obj: tochartmanager.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tochartmanager.obj -MD -MP -MF $(DEPDIR)/tora-tochartmanager.Tpo -c -o tora-tochartmanager.obj `if test -f 'tochartmanager.cpp'; then $(CYGPATH_W) 'tochartmanager.cpp'; else $(CYGPATH_W) '$(srcdir)/tochartmanager.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tochartmanager.Tpo $(DEPDIR)/tora-tochartmanager.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tochartmanager.cpp' object='tora-tochartmanager.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tochartmanager.obj `if test -f 'tochartmanager.cpp'; then $(CYGPATH_W) 'tochartmanager.cpp'; else $(CYGPATH_W) '$(srcdir)/tochartmanager.cpp'; fi` tora-tolegendchart.o: tolegendchart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolegendchart.o -MD -MP -MF $(DEPDIR)/tora-tolegendchart.Tpo -c -o tora-tolegendchart.o `test -f 'tolegendchart.cpp' || echo '$(srcdir)/'`tolegendchart.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolegendchart.Tpo $(DEPDIR)/tora-tolegendchart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolegendchart.cpp' object='tora-tolegendchart.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolegendchart.o `test -f 'tolegendchart.cpp' || echo '$(srcdir)/'`tolegendchart.cpp tora-tolegendchart.obj: tolegendchart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolegendchart.obj -MD -MP -MF $(DEPDIR)/tora-tolegendchart.Tpo -c -o tora-tolegendchart.obj `if test -f 'tolegendchart.cpp'; then $(CYGPATH_W) 'tolegendchart.cpp'; else $(CYGPATH_W) '$(srcdir)/tolegendchart.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolegendchart.Tpo $(DEPDIR)/tora-tolegendchart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolegendchart.cpp' object='tora-tolegendchart.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolegendchart.obj `if test -f 'tolegendchart.cpp'; then $(CYGPATH_W) 'tolegendchart.cpp'; else $(CYGPATH_W) '$(srcdir)/tolegendchart.cpp'; fi` tora-tolinechart.o: tolinechart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolinechart.o -MD -MP -MF $(DEPDIR)/tora-tolinechart.Tpo -c -o tora-tolinechart.o `test -f 'tolinechart.cpp' || echo '$(srcdir)/'`tolinechart.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolinechart.Tpo $(DEPDIR)/tora-tolinechart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolinechart.cpp' object='tora-tolinechart.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolinechart.o `test -f 'tolinechart.cpp' || echo '$(srcdir)/'`tolinechart.cpp tora-tolinechart.obj: tolinechart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tolinechart.obj -MD -MP -MF $(DEPDIR)/tora-tolinechart.Tpo -c -o tora-tolinechart.obj `if test -f 'tolinechart.cpp'; then $(CYGPATH_W) 'tolinechart.cpp'; else $(CYGPATH_W) '$(srcdir)/tolinechart.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tolinechart.Tpo $(DEPDIR)/tora-tolinechart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tolinechart.cpp' object='tora-tolinechart.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tolinechart.obj `if test -f 'tolinechart.cpp'; then $(CYGPATH_W) 'tolinechart.cpp'; else $(CYGPATH_W) '$(srcdir)/tolinechart.cpp'; fi` tora-topiechart.o: topiechart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-topiechart.o -MD -MP -MF $(DEPDIR)/tora-topiechart.Tpo -c -o tora-topiechart.o `test -f 'topiechart.cpp' || echo '$(srcdir)/'`topiechart.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-topiechart.Tpo $(DEPDIR)/tora-topiechart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='topiechart.cpp' object='tora-topiechart.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-topiechart.o `test -f 'topiechart.cpp' || echo '$(srcdir)/'`topiechart.cpp tora-topiechart.obj: topiechart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-topiechart.obj -MD -MP -MF $(DEPDIR)/tora-topiechart.Tpo -c -o tora-topiechart.obj `if test -f 'topiechart.cpp'; then $(CYGPATH_W) 'topiechart.cpp'; else $(CYGPATH_W) '$(srcdir)/topiechart.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-topiechart.Tpo $(DEPDIR)/tora-topiechart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='topiechart.cpp' object='tora-topiechart.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-topiechart.obj `if test -f 'topiechart.cpp'; then $(CYGPATH_W) 'topiechart.cpp'; else $(CYGPATH_W) '$(srcdir)/topiechart.cpp'; fi` tora-toresultbar.o: toresultbar.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultbar.o -MD -MP -MF $(DEPDIR)/tora-toresultbar.Tpo -c -o tora-toresultbar.o `test -f 'toresultbar.cpp' || echo '$(srcdir)/'`toresultbar.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultbar.Tpo $(DEPDIR)/tora-toresultbar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultbar.cpp' object='tora-toresultbar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultbar.o `test -f 'toresultbar.cpp' || echo '$(srcdir)/'`toresultbar.cpp tora-toresultbar.obj: toresultbar.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultbar.obj -MD -MP -MF $(DEPDIR)/tora-toresultbar.Tpo -c -o tora-toresultbar.obj `if test -f 'toresultbar.cpp'; then $(CYGPATH_W) 'toresultbar.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultbar.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultbar.Tpo $(DEPDIR)/tora-toresultbar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultbar.cpp' object='tora-toresultbar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultbar.obj `if test -f 'toresultbar.cpp'; then $(CYGPATH_W) 'toresultbar.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultbar.cpp'; fi` tora-toresultline.o: toresultline.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultline.o -MD -MP -MF $(DEPDIR)/tora-toresultline.Tpo -c -o tora-toresultline.o `test -f 'toresultline.cpp' || echo '$(srcdir)/'`toresultline.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultline.Tpo $(DEPDIR)/tora-toresultline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultline.cpp' object='tora-toresultline.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultline.o `test -f 'toresultline.cpp' || echo '$(srcdir)/'`toresultline.cpp tora-toresultline.obj: toresultline.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultline.obj -MD -MP -MF $(DEPDIR)/tora-toresultline.Tpo -c -o tora-toresultline.obj `if test -f 'toresultline.cpp'; then $(CYGPATH_W) 'toresultline.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultline.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultline.Tpo $(DEPDIR)/tora-toresultline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultline.cpp' object='tora-toresultline.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultline.obj `if test -f 'toresultline.cpp'; then $(CYGPATH_W) 'toresultline.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultline.cpp'; fi` tora-toresultpie.o: toresultpie.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultpie.o -MD -MP -MF $(DEPDIR)/tora-toresultpie.Tpo -c -o tora-toresultpie.o `test -f 'toresultpie.cpp' || echo '$(srcdir)/'`toresultpie.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultpie.Tpo $(DEPDIR)/tora-toresultpie.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultpie.cpp' object='tora-toresultpie.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultpie.o `test -f 'toresultpie.cpp' || echo '$(srcdir)/'`toresultpie.cpp tora-toresultpie.obj: toresultpie.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultpie.obj -MD -MP -MF $(DEPDIR)/tora-toresultpie.Tpo -c -o tora-toresultpie.obj `if test -f 'toresultpie.cpp'; then $(CYGPATH_W) 'toresultpie.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultpie.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultpie.Tpo $(DEPDIR)/tora-toresultpie.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultpie.cpp' object='tora-toresultpie.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultpie.obj `if test -f 'toresultpie.cpp'; then $(CYGPATH_W) 'toresultpie.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultpie.cpp'; fi` tora-todebugtext.o: todebugtext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-todebugtext.o -MD -MP -MF $(DEPDIR)/tora-todebugtext.Tpo -c -o tora-todebugtext.o `test -f 'todebugtext.cpp' || echo '$(srcdir)/'`todebugtext.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-todebugtext.Tpo $(DEPDIR)/tora-todebugtext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='todebugtext.cpp' object='tora-todebugtext.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-todebugtext.o `test -f 'todebugtext.cpp' || echo '$(srcdir)/'`todebugtext.cpp tora-todebugtext.obj: todebugtext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-todebugtext.obj -MD -MP -MF $(DEPDIR)/tora-todebugtext.Tpo -c -o tora-todebugtext.obj `if test -f 'todebugtext.cpp'; then $(CYGPATH_W) 'todebugtext.cpp'; else $(CYGPATH_W) '$(srcdir)/todebugtext.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-todebugtext.Tpo $(DEPDIR)/tora-todebugtext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='todebugtext.cpp' object='tora-todebugtext.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-todebugtext.obj `if test -f 'todebugtext.cpp'; then $(CYGPATH_W) 'todebugtext.cpp'; else $(CYGPATH_W) '$(srcdir)/todebugtext.cpp'; fi` tora-toextract.o: toextract.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toextract.o -MD -MP -MF $(DEPDIR)/tora-toextract.Tpo -c -o tora-toextract.o `test -f 'toextract.cpp' || echo '$(srcdir)/'`toextract.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toextract.Tpo $(DEPDIR)/tora-toextract.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toextract.cpp' object='tora-toextract.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toextract.o `test -f 'toextract.cpp' || echo '$(srcdir)/'`toextract.cpp tora-toextract.obj: toextract.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toextract.obj -MD -MP -MF $(DEPDIR)/tora-toextract.Tpo -c -o tora-toextract.obj `if test -f 'toextract.cpp'; then $(CYGPATH_W) 'toextract.cpp'; else $(CYGPATH_W) '$(srcdir)/toextract.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toextract.Tpo $(DEPDIR)/tora-toextract.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toextract.cpp' object='tora-toextract.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toextract.obj `if test -f 'toextract.cpp'; then $(CYGPATH_W) 'toextract.cpp'; else $(CYGPATH_W) '$(srcdir)/toextract.cpp'; fi` tora-toreport.o: toreport.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toreport.o -MD -MP -MF $(DEPDIR)/tora-toreport.Tpo -c -o tora-toreport.o `test -f 'toreport.cpp' || echo '$(srcdir)/'`toreport.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toreport.Tpo $(DEPDIR)/tora-toreport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toreport.cpp' object='tora-toreport.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toreport.o `test -f 'toreport.cpp' || echo '$(srcdir)/'`toreport.cpp tora-toreport.obj: toreport.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toreport.obj -MD -MP -MF $(DEPDIR)/tora-toreport.Tpo -c -o tora-toreport.obj `if test -f 'toreport.cpp'; then $(CYGPATH_W) 'toreport.cpp'; else $(CYGPATH_W) '$(srcdir)/toreport.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toreport.Tpo $(DEPDIR)/tora-toreport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toreport.cpp' object='tora-toreport.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toreport.obj `if test -f 'toreport.cpp'; then $(CYGPATH_W) 'toreport.cpp'; else $(CYGPATH_W) '$(srcdir)/toreport.cpp'; fi` tora-toresultextract.o: toresultextract.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultextract.o -MD -MP -MF $(DEPDIR)/tora-toresultextract.Tpo -c -o tora-toresultextract.o `test -f 'toresultextract.cpp' || echo '$(srcdir)/'`toresultextract.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultextract.Tpo $(DEPDIR)/tora-toresultextract.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultextract.cpp' object='tora-toresultextract.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultextract.o `test -f 'toresultextract.cpp' || echo '$(srcdir)/'`toresultextract.cpp tora-toresultextract.obj: toresultextract.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultextract.obj -MD -MP -MF $(DEPDIR)/tora-toresultextract.Tpo -c -o tora-toresultextract.obj `if test -f 'toresultextract.cpp'; then $(CYGPATH_W) 'toresultextract.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultextract.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultextract.Tpo $(DEPDIR)/tora-toresultextract.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultextract.cpp' object='tora-toresultextract.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultextract.obj `if test -f 'toresultextract.cpp'; then $(CYGPATH_W) 'toresultextract.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultextract.cpp'; fi` tora-toresultcols.o: toresultcols.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultcols.o -MD -MP -MF $(DEPDIR)/tora-toresultcols.Tpo -c -o tora-toresultcols.o `test -f 'toresultcols.cpp' || echo '$(srcdir)/'`toresultcols.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultcols.Tpo $(DEPDIR)/tora-toresultcols.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultcols.cpp' object='tora-toresultcols.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultcols.o `test -f 'toresultcols.cpp' || echo '$(srcdir)/'`toresultcols.cpp tora-toresultcols.obj: toresultcols.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultcols.obj -MD -MP -MF $(DEPDIR)/tora-toresultcols.Tpo -c -o tora-toresultcols.obj `if test -f 'toresultcols.cpp'; then $(CYGPATH_W) 'toresultcols.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultcols.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultcols.Tpo $(DEPDIR)/tora-toresultcols.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultcols.cpp' object='tora-toresultcols.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultcols.obj `if test -f 'toresultcols.cpp'; then $(CYGPATH_W) 'toresultcols.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultcols.cpp'; fi` tora-toresultcolscomment.o: toresultcolscomment.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultcolscomment.o -MD -MP -MF $(DEPDIR)/tora-toresultcolscomment.Tpo -c -o tora-toresultcolscomment.o `test -f 'toresultcolscomment.cpp' || echo '$(srcdir)/'`toresultcolscomment.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultcolscomment.Tpo $(DEPDIR)/tora-toresultcolscomment.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultcolscomment.cpp' object='tora-toresultcolscomment.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultcolscomment.o `test -f 'toresultcolscomment.cpp' || echo '$(srcdir)/'`toresultcolscomment.cpp tora-toresultcolscomment.obj: toresultcolscomment.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultcolscomment.obj -MD -MP -MF $(DEPDIR)/tora-toresultcolscomment.Tpo -c -o tora-toresultcolscomment.obj `if test -f 'toresultcolscomment.cpp'; then $(CYGPATH_W) 'toresultcolscomment.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultcolscomment.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultcolscomment.Tpo $(DEPDIR)/tora-toresultcolscomment.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultcolscomment.cpp' object='tora-toresultcolscomment.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultcolscomment.obj `if test -f 'toresultcolscomment.cpp'; then $(CYGPATH_W) 'toresultcolscomment.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultcolscomment.cpp'; fi` tora-toresultcombo.o: toresultcombo.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultcombo.o -MD -MP -MF $(DEPDIR)/tora-toresultcombo.Tpo -c -o tora-toresultcombo.o `test -f 'toresultcombo.cpp' || echo '$(srcdir)/'`toresultcombo.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultcombo.Tpo $(DEPDIR)/tora-toresultcombo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultcombo.cpp' object='tora-toresultcombo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultcombo.o `test -f 'toresultcombo.cpp' || echo '$(srcdir)/'`toresultcombo.cpp tora-toresultcombo.obj: toresultcombo.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultcombo.obj -MD -MP -MF $(DEPDIR)/tora-toresultcombo.Tpo -c -o tora-toresultcombo.obj `if test -f 'toresultcombo.cpp'; then $(CYGPATH_W) 'toresultcombo.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultcombo.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultcombo.Tpo $(DEPDIR)/tora-toresultcombo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultcombo.cpp' object='tora-toresultcombo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultcombo.obj `if test -f 'toresultcombo.cpp'; then $(CYGPATH_W) 'toresultcombo.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultcombo.cpp'; fi` tora-toresultschema.o: toresultschema.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultschema.o -MD -MP -MF $(DEPDIR)/tora-toresultschema.Tpo -c -o tora-toresultschema.o `test -f 'toresultschema.cpp' || echo '$(srcdir)/'`toresultschema.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultschema.Tpo $(DEPDIR)/tora-toresultschema.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultschema.cpp' object='tora-toresultschema.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultschema.o `test -f 'toresultschema.cpp' || echo '$(srcdir)/'`toresultschema.cpp tora-toresultschema.obj: toresultschema.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultschema.obj -MD -MP -MF $(DEPDIR)/tora-toresultschema.Tpo -c -o tora-toresultschema.obj `if test -f 'toresultschema.cpp'; then $(CYGPATH_W) 'toresultschema.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultschema.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultschema.Tpo $(DEPDIR)/tora-toresultschema.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultschema.cpp' object='tora-toresultschema.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultschema.obj `if test -f 'toresultschema.cpp'; then $(CYGPATH_W) 'toresultschema.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultschema.cpp'; fi` tora-toresultdepend.o: toresultdepend.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultdepend.o -MD -MP -MF $(DEPDIR)/tora-toresultdepend.Tpo -c -o tora-toresultdepend.o `test -f 'toresultdepend.cpp' || echo '$(srcdir)/'`toresultdepend.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultdepend.Tpo $(DEPDIR)/tora-toresultdepend.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultdepend.cpp' object='tora-toresultdepend.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultdepend.o `test -f 'toresultdepend.cpp' || echo '$(srcdir)/'`toresultdepend.cpp tora-toresultdepend.obj: toresultdepend.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultdepend.obj -MD -MP -MF $(DEPDIR)/tora-toresultdepend.Tpo -c -o tora-toresultdepend.obj `if test -f 'toresultdepend.cpp'; then $(CYGPATH_W) 'toresultdepend.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultdepend.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultdepend.Tpo $(DEPDIR)/tora-toresultdepend.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultdepend.cpp' object='tora-toresultdepend.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultdepend.obj `if test -f 'toresultdepend.cpp'; then $(CYGPATH_W) 'toresultdepend.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultdepend.cpp'; fi` tora-toresultlabel.o: toresultlabel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultlabel.o -MD -MP -MF $(DEPDIR)/tora-toresultlabel.Tpo -c -o tora-toresultlabel.o `test -f 'toresultlabel.cpp' || echo '$(srcdir)/'`toresultlabel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultlabel.Tpo $(DEPDIR)/tora-toresultlabel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultlabel.cpp' object='tora-toresultlabel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultlabel.o `test -f 'toresultlabel.cpp' || echo '$(srcdir)/'`toresultlabel.cpp tora-toresultlabel.obj: toresultlabel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultlabel.obj -MD -MP -MF $(DEPDIR)/tora-toresultlabel.Tpo -c -o tora-toresultlabel.obj `if test -f 'toresultlabel.cpp'; then $(CYGPATH_W) 'toresultlabel.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultlabel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultlabel.Tpo $(DEPDIR)/tora-toresultlabel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultlabel.cpp' object='tora-toresultlabel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultlabel.obj `if test -f 'toresultlabel.cpp'; then $(CYGPATH_W) 'toresultlabel.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultlabel.cpp'; fi` tora-toresultlock.o: toresultlock.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultlock.o -MD -MP -MF $(DEPDIR)/tora-toresultlock.Tpo -c -o tora-toresultlock.o `test -f 'toresultlock.cpp' || echo '$(srcdir)/'`toresultlock.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultlock.Tpo $(DEPDIR)/tora-toresultlock.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultlock.cpp' object='tora-toresultlock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultlock.o `test -f 'toresultlock.cpp' || echo '$(srcdir)/'`toresultlock.cpp tora-toresultlock.obj: toresultlock.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultlock.obj -MD -MP -MF $(DEPDIR)/tora-toresultlock.Tpo -c -o tora-toresultlock.obj `if test -f 'toresultlock.cpp'; then $(CYGPATH_W) 'toresultlock.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultlock.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultlock.Tpo $(DEPDIR)/tora-toresultlock.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultlock.cpp' object='tora-toresultlock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultlock.obj `if test -f 'toresultlock.cpp'; then $(CYGPATH_W) 'toresultlock.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultlock.cpp'; fi` tora-toresultlong.o: toresultlong.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultlong.o -MD -MP -MF $(DEPDIR)/tora-toresultlong.Tpo -c -o tora-toresultlong.o `test -f 'toresultlong.cpp' || echo '$(srcdir)/'`toresultlong.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultlong.Tpo $(DEPDIR)/tora-toresultlong.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultlong.cpp' object='tora-toresultlong.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultlong.o `test -f 'toresultlong.cpp' || echo '$(srcdir)/'`toresultlong.cpp tora-toresultlong.obj: toresultlong.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultlong.obj -MD -MP -MF $(DEPDIR)/tora-toresultlong.Tpo -c -o tora-toresultlong.obj `if test -f 'toresultlong.cpp'; then $(CYGPATH_W) 'toresultlong.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultlong.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultlong.Tpo $(DEPDIR)/tora-toresultlong.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultlong.cpp' object='tora-toresultlong.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultlong.obj `if test -f 'toresultlong.cpp'; then $(CYGPATH_W) 'toresultlong.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultlong.cpp'; fi` tora-toresultplan.o: toresultplan.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultplan.o -MD -MP -MF $(DEPDIR)/tora-toresultplan.Tpo -c -o tora-toresultplan.o `test -f 'toresultplan.cpp' || echo '$(srcdir)/'`toresultplan.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultplan.Tpo $(DEPDIR)/tora-toresultplan.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultplan.cpp' object='tora-toresultplan.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultplan.o `test -f 'toresultplan.cpp' || echo '$(srcdir)/'`toresultplan.cpp tora-toresultplan.obj: toresultplan.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultplan.obj -MD -MP -MF $(DEPDIR)/tora-toresultplan.Tpo -c -o tora-toresultplan.obj `if test -f 'toresultplan.cpp'; then $(CYGPATH_W) 'toresultplan.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultplan.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultplan.Tpo $(DEPDIR)/tora-toresultplan.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultplan.cpp' object='tora-toresultplan.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultplan.obj `if test -f 'toresultplan.cpp'; then $(CYGPATH_W) 'toresultplan.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultplan.cpp'; fi` tora-toresultparam.o: toresultparam.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultparam.o -MD -MP -MF $(DEPDIR)/tora-toresultparam.Tpo -c -o tora-toresultparam.o `test -f 'toresultparam.cpp' || echo '$(srcdir)/'`toresultparam.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultparam.Tpo $(DEPDIR)/tora-toresultparam.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultparam.cpp' object='tora-toresultparam.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultparam.o `test -f 'toresultparam.cpp' || echo '$(srcdir)/'`toresultparam.cpp tora-toresultparam.obj: toresultparam.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultparam.obj -MD -MP -MF $(DEPDIR)/tora-toresultparam.Tpo -c -o tora-toresultparam.obj `if test -f 'toresultparam.cpp'; then $(CYGPATH_W) 'toresultparam.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultparam.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultparam.Tpo $(DEPDIR)/tora-toresultparam.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultparam.cpp' object='tora-toresultparam.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultparam.obj `if test -f 'toresultparam.cpp'; then $(CYGPATH_W) 'toresultparam.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultparam.cpp'; fi` tora-toresultstorage.o: toresultstorage.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultstorage.o -MD -MP -MF $(DEPDIR)/tora-toresultstorage.Tpo -c -o tora-toresultstorage.o `test -f 'toresultstorage.cpp' || echo '$(srcdir)/'`toresultstorage.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultstorage.Tpo $(DEPDIR)/tora-toresultstorage.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultstorage.cpp' object='tora-toresultstorage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultstorage.o `test -f 'toresultstorage.cpp' || echo '$(srcdir)/'`toresultstorage.cpp tora-toresultstorage.obj: toresultstorage.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultstorage.obj -MD -MP -MF $(DEPDIR)/tora-toresultstorage.Tpo -c -o tora-toresultstorage.obj `if test -f 'toresultstorage.cpp'; then $(CYGPATH_W) 'toresultstorage.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultstorage.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultstorage.Tpo $(DEPDIR)/tora-toresultstorage.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultstorage.cpp' object='tora-toresultstorage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultstorage.obj `if test -f 'toresultstorage.cpp'; then $(CYGPATH_W) 'toresultstorage.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultstorage.cpp'; fi` tora-tofilesize.o: tofilesize.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tofilesize.o -MD -MP -MF $(DEPDIR)/tora-tofilesize.Tpo -c -o tora-tofilesize.o `test -f 'tofilesize.cpp' || echo '$(srcdir)/'`tofilesize.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tofilesize.Tpo $(DEPDIR)/tora-tofilesize.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tofilesize.cpp' object='tora-tofilesize.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tofilesize.o `test -f 'tofilesize.cpp' || echo '$(srcdir)/'`tofilesize.cpp tora-tofilesize.obj: tofilesize.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tofilesize.obj -MD -MP -MF $(DEPDIR)/tora-tofilesize.Tpo -c -o tora-tofilesize.obj `if test -f 'tofilesize.cpp'; then $(CYGPATH_W) 'tofilesize.cpp'; else $(CYGPATH_W) '$(srcdir)/tofilesize.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tofilesize.Tpo $(DEPDIR)/tora-tofilesize.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tofilesize.cpp' object='tora-tofilesize.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tofilesize.obj `if test -f 'tofilesize.cpp'; then $(CYGPATH_W) 'tofilesize.cpp'; else $(CYGPATH_W) '$(srcdir)/tofilesize.cpp'; fi` tora-tosgastatement.o: tosgastatement.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosgastatement.o -MD -MP -MF $(DEPDIR)/tora-tosgastatement.Tpo -c -o tora-tosgastatement.o `test -f 'tosgastatement.cpp' || echo '$(srcdir)/'`tosgastatement.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosgastatement.Tpo $(DEPDIR)/tora-tosgastatement.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosgastatement.cpp' object='tora-tosgastatement.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosgastatement.o `test -f 'tosgastatement.cpp' || echo '$(srcdir)/'`tosgastatement.cpp tora-tosgastatement.obj: tosgastatement.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tosgastatement.obj -MD -MP -MF $(DEPDIR)/tora-tosgastatement.Tpo -c -o tora-tosgastatement.obj `if test -f 'tosgastatement.cpp'; then $(CYGPATH_W) 'tosgastatement.cpp'; else $(CYGPATH_W) '$(srcdir)/tosgastatement.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tosgastatement.Tpo $(DEPDIR)/tora-tosgastatement.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tosgastatement.cpp' object='tora-tosgastatement.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tosgastatement.obj `if test -f 'tosgastatement.cpp'; then $(CYGPATH_W) 'tosgastatement.cpp'; else $(CYGPATH_W) '$(srcdir)/tosgastatement.cpp'; fi` tora-totableselect.o: totableselect.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totableselect.o -MD -MP -MF $(DEPDIR)/tora-totableselect.Tpo -c -o tora-totableselect.o `test -f 'totableselect.cpp' || echo '$(srcdir)/'`totableselect.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totableselect.Tpo $(DEPDIR)/tora-totableselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totableselect.cpp' object='tora-totableselect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totableselect.o `test -f 'totableselect.cpp' || echo '$(srcdir)/'`totableselect.cpp tora-totableselect.obj: totableselect.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-totableselect.obj -MD -MP -MF $(DEPDIR)/tora-totableselect.Tpo -c -o tora-totableselect.obj `if test -f 'totableselect.cpp'; then $(CYGPATH_W) 'totableselect.cpp'; else $(CYGPATH_W) '$(srcdir)/totableselect.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-totableselect.Tpo $(DEPDIR)/tora-totableselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='totableselect.cpp' object='tora-totableselect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-totableselect.obj `if test -f 'totableselect.cpp'; then $(CYGPATH_W) 'totableselect.cpp'; else $(CYGPATH_W) '$(srcdir)/totableselect.cpp'; fi` tora-tovisualize.o: tovisualize.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tovisualize.o -MD -MP -MF $(DEPDIR)/tora-tovisualize.Tpo -c -o tora-tovisualize.o `test -f 'tovisualize.cpp' || echo '$(srcdir)/'`tovisualize.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tovisualize.Tpo $(DEPDIR)/tora-tovisualize.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tovisualize.cpp' object='tora-tovisualize.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tovisualize.o `test -f 'tovisualize.cpp' || echo '$(srcdir)/'`tovisualize.cpp tora-tovisualize.obj: tovisualize.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tovisualize.obj -MD -MP -MF $(DEPDIR)/tora-tovisualize.Tpo -c -o tora-tovisualize.obj `if test -f 'tovisualize.cpp'; then $(CYGPATH_W) 'tovisualize.cpp'; else $(CYGPATH_W) '$(srcdir)/tovisualize.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tovisualize.Tpo $(DEPDIR)/tora-tovisualize.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tovisualize.cpp' object='tora-tovisualize.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tovisualize.obj `if test -f 'tovisualize.cpp'; then $(CYGPATH_W) 'tovisualize.cpp'; else $(CYGPATH_W) '$(srcdir)/tovisualize.cpp'; fi` tora-towaitevents.o: towaitevents.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-towaitevents.o -MD -MP -MF $(DEPDIR)/tora-towaitevents.Tpo -c -o tora-towaitevents.o `test -f 'towaitevents.cpp' || echo '$(srcdir)/'`towaitevents.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-towaitevents.Tpo $(DEPDIR)/tora-towaitevents.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='towaitevents.cpp' object='tora-towaitevents.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-towaitevents.o `test -f 'towaitevents.cpp' || echo '$(srcdir)/'`towaitevents.cpp tora-towaitevents.obj: towaitevents.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-towaitevents.obj -MD -MP -MF $(DEPDIR)/tora-towaitevents.Tpo -c -o tora-towaitevents.obj `if test -f 'towaitevents.cpp'; then $(CYGPATH_W) 'towaitevents.cpp'; else $(CYGPATH_W) '$(srcdir)/towaitevents.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-towaitevents.Tpo $(DEPDIR)/tora-towaitevents.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='towaitevents.cpp' object='tora-towaitevents.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-towaitevents.obj `if test -f 'towaitevents.cpp'; then $(CYGPATH_W) 'towaitevents.cpp'; else $(CYGPATH_W) '$(srcdir)/towaitevents.cpp'; fi` tora-toconnectionmodel.o: toconnectionmodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toconnectionmodel.o -MD -MP -MF $(DEPDIR)/tora-toconnectionmodel.Tpo -c -o tora-toconnectionmodel.o `test -f 'toconnectionmodel.cpp' || echo '$(srcdir)/'`toconnectionmodel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toconnectionmodel.Tpo $(DEPDIR)/tora-toconnectionmodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toconnectionmodel.cpp' object='tora-toconnectionmodel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toconnectionmodel.o `test -f 'toconnectionmodel.cpp' || echo '$(srcdir)/'`toconnectionmodel.cpp tora-toconnectionmodel.obj: toconnectionmodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toconnectionmodel.obj -MD -MP -MF $(DEPDIR)/tora-toconnectionmodel.Tpo -c -o tora-toconnectionmodel.obj `if test -f 'toconnectionmodel.cpp'; then $(CYGPATH_W) 'toconnectionmodel.cpp'; else $(CYGPATH_W) '$(srcdir)/toconnectionmodel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toconnectionmodel.Tpo $(DEPDIR)/tora-toconnectionmodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toconnectionmodel.cpp' object='tora-toconnectionmodel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toconnectionmodel.obj `if test -f 'toconnectionmodel.cpp'; then $(CYGPATH_W) 'toconnectionmodel.cpp'; else $(CYGPATH_W) '$(srcdir)/toconnectionmodel.cpp'; fi` tora-tobrowserbasewidget.o: tobrowserbasewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserbasewidget.o -MD -MP -MF $(DEPDIR)/tora-tobrowserbasewidget.Tpo -c -o tora-tobrowserbasewidget.o `test -f 'tobrowserbasewidget.cpp' || echo '$(srcdir)/'`tobrowserbasewidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserbasewidget.Tpo $(DEPDIR)/tora-tobrowserbasewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserbasewidget.cpp' object='tora-tobrowserbasewidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserbasewidget.o `test -f 'tobrowserbasewidget.cpp' || echo '$(srcdir)/'`tobrowserbasewidget.cpp tora-tobrowserbasewidget.obj: tobrowserbasewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserbasewidget.obj -MD -MP -MF $(DEPDIR)/tora-tobrowserbasewidget.Tpo -c -o tora-tobrowserbasewidget.obj `if test -f 'tobrowserbasewidget.cpp'; then $(CYGPATH_W) 'tobrowserbasewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserbasewidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserbasewidget.Tpo $(DEPDIR)/tora-tobrowserbasewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserbasewidget.cpp' object='tora-tobrowserbasewidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserbasewidget.obj `if test -f 'tobrowserbasewidget.cpp'; then $(CYGPATH_W) 'tobrowserbasewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserbasewidget.cpp'; fi` tora-tobrowseraccesswidget.o: tobrowseraccesswidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowseraccesswidget.o -MD -MP -MF $(DEPDIR)/tora-tobrowseraccesswidget.Tpo -c -o tora-tobrowseraccesswidget.o `test -f 'tobrowseraccesswidget.cpp' || echo '$(srcdir)/'`tobrowseraccesswidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowseraccesswidget.Tpo $(DEPDIR)/tora-tobrowseraccesswidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowseraccesswidget.cpp' object='tora-tobrowseraccesswidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowseraccesswidget.o `test -f 'tobrowseraccesswidget.cpp' || echo '$(srcdir)/'`tobrowseraccesswidget.cpp tora-tobrowseraccesswidget.obj: tobrowseraccesswidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowseraccesswidget.obj -MD -MP -MF $(DEPDIR)/tora-tobrowseraccesswidget.Tpo -c -o tora-tobrowseraccesswidget.obj `if test -f 'tobrowseraccesswidget.cpp'; then $(CYGPATH_W) 'tobrowseraccesswidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowseraccesswidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowseraccesswidget.Tpo $(DEPDIR)/tora-tobrowseraccesswidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowseraccesswidget.cpp' object='tora-tobrowseraccesswidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowseraccesswidget.obj `if test -f 'tobrowseraccesswidget.cpp'; then $(CYGPATH_W) 'tobrowseraccesswidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowseraccesswidget.cpp'; fi` tora-tobrowsertablewidget.o: tobrowsertablewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowsertablewidget.o -MD -MP -MF $(DEPDIR)/tora-tobrowsertablewidget.Tpo -c -o tora-tobrowsertablewidget.o `test -f 'tobrowsertablewidget.cpp' || echo '$(srcdir)/'`tobrowsertablewidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowsertablewidget.Tpo $(DEPDIR)/tora-tobrowsertablewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowsertablewidget.cpp' object='tora-tobrowsertablewidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowsertablewidget.o `test -f 'tobrowsertablewidget.cpp' || echo '$(srcdir)/'`tobrowsertablewidget.cpp tora-tobrowsertablewidget.obj: tobrowsertablewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowsertablewidget.obj -MD -MP -MF $(DEPDIR)/tora-tobrowsertablewidget.Tpo -c -o tora-tobrowsertablewidget.obj `if test -f 'tobrowsertablewidget.cpp'; then $(CYGPATH_W) 'tobrowsertablewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowsertablewidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowsertablewidget.Tpo $(DEPDIR)/tora-tobrowsertablewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowsertablewidget.cpp' object='tora-tobrowsertablewidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowsertablewidget.obj `if test -f 'tobrowsertablewidget.cpp'; then $(CYGPATH_W) 'tobrowsertablewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowsertablewidget.cpp'; fi` tora-tobrowserviewwidget.o: tobrowserviewwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserviewwidget.o -MD -MP -MF $(DEPDIR)/tora-tobrowserviewwidget.Tpo -c -o tora-tobrowserviewwidget.o `test -f 'tobrowserviewwidget.cpp' || echo '$(srcdir)/'`tobrowserviewwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserviewwidget.Tpo $(DEPDIR)/tora-tobrowserviewwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserviewwidget.cpp' object='tora-tobrowserviewwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserviewwidget.o `test -f 'tobrowserviewwidget.cpp' || echo '$(srcdir)/'`tobrowserviewwidget.cpp tora-tobrowserviewwidget.obj: tobrowserviewwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserviewwidget.obj -MD -MP -MF $(DEPDIR)/tora-tobrowserviewwidget.Tpo -c -o tora-tobrowserviewwidget.obj `if test -f 'tobrowserviewwidget.cpp'; then $(CYGPATH_W) 'tobrowserviewwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserviewwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserviewwidget.Tpo $(DEPDIR)/tora-tobrowserviewwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserviewwidget.cpp' object='tora-tobrowserviewwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserviewwidget.obj `if test -f 'tobrowserviewwidget.cpp'; then $(CYGPATH_W) 'tobrowserviewwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserviewwidget.cpp'; fi` tora-tobrowserindexwidget.o: tobrowserindexwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserindexwidget.o -MD -MP -MF $(DEPDIR)/tora-tobrowserindexwidget.Tpo -c -o tora-tobrowserindexwidget.o `test -f 'tobrowserindexwidget.cpp' || echo '$(srcdir)/'`tobrowserindexwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserindexwidget.Tpo $(DEPDIR)/tora-tobrowserindexwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserindexwidget.cpp' object='tora-tobrowserindexwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserindexwidget.o `test -f 'tobrowserindexwidget.cpp' || echo '$(srcdir)/'`tobrowserindexwidget.cpp tora-tobrowserindexwidget.obj: tobrowserindexwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserindexwidget.obj -MD -MP -MF $(DEPDIR)/tora-tobrowserindexwidget.Tpo -c -o tora-tobrowserindexwidget.obj `if test -f 'tobrowserindexwidget.cpp'; then $(CYGPATH_W) 'tobrowserindexwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserindexwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserindexwidget.Tpo $(DEPDIR)/tora-tobrowserindexwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserindexwidget.cpp' object='tora-tobrowserindexwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserindexwidget.obj `if test -f 'tobrowserindexwidget.cpp'; then $(CYGPATH_W) 'tobrowserindexwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserindexwidget.cpp'; fi` tora-tobrowserschemawidget.o: tobrowserschemawidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserschemawidget.o -MD -MP -MF $(DEPDIR)/tora-tobrowserschemawidget.Tpo -c -o tora-tobrowserschemawidget.o `test -f 'tobrowserschemawidget.cpp' || echo '$(srcdir)/'`tobrowserschemawidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserschemawidget.Tpo $(DEPDIR)/tora-tobrowserschemawidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserschemawidget.cpp' object='tora-tobrowserschemawidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserschemawidget.o `test -f 'tobrowserschemawidget.cpp' || echo '$(srcdir)/'`tobrowserschemawidget.cpp tora-tobrowserschemawidget.obj: tobrowserschemawidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserschemawidget.obj -MD -MP -MF $(DEPDIR)/tora-tobrowserschemawidget.Tpo -c -o tora-tobrowserschemawidget.obj `if test -f 'tobrowserschemawidget.cpp'; then $(CYGPATH_W) 'tobrowserschemawidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserschemawidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserschemawidget.Tpo $(DEPDIR)/tora-tobrowserschemawidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserschemawidget.cpp' object='tora-tobrowserschemawidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserschemawidget.obj `if test -f 'tobrowserschemawidget.cpp'; then $(CYGPATH_W) 'tobrowserschemawidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserschemawidget.cpp'; fi` tora-tobrowsersequencewidget.o: tobrowsersequencewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowsersequencewidget.o -MD -MP -MF $(DEPDIR)/tora-tobrowsersequencewidget.Tpo -c -o tora-tobrowsersequencewidget.o `test -f 'tobrowsersequencewidget.cpp' || echo '$(srcdir)/'`tobrowsersequencewidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowsersequencewidget.Tpo $(DEPDIR)/tora-tobrowsersequencewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowsersequencewidget.cpp' object='tora-tobrowsersequencewidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowsersequencewidget.o `test -f 'tobrowsersequencewidget.cpp' || echo '$(srcdir)/'`tobrowsersequencewidget.cpp tora-tobrowsersequencewidget.obj: tobrowsersequencewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowsersequencewidget.obj -MD -MP -MF $(DEPDIR)/tora-tobrowsersequencewidget.Tpo -c -o tora-tobrowsersequencewidget.obj `if test -f 'tobrowsersequencewidget.cpp'; then $(CYGPATH_W) 'tobrowsersequencewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowsersequencewidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowsersequencewidget.Tpo $(DEPDIR)/tora-tobrowsersequencewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowsersequencewidget.cpp' object='tora-tobrowsersequencewidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowsersequencewidget.obj `if test -f 'tobrowsersequencewidget.cpp'; then $(CYGPATH_W) 'tobrowsersequencewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowsersequencewidget.cpp'; fi` tora-tobrowsersynonymwidget.o: tobrowsersynonymwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowsersynonymwidget.o -MD -MP -MF $(DEPDIR)/tora-tobrowsersynonymwidget.Tpo -c -o tora-tobrowsersynonymwidget.o `test -f 'tobrowsersynonymwidget.cpp' || echo '$(srcdir)/'`tobrowsersynonymwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowsersynonymwidget.Tpo $(DEPDIR)/tora-tobrowsersynonymwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowsersynonymwidget.cpp' object='tora-tobrowsersynonymwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowsersynonymwidget.o `test -f 'tobrowsersynonymwidget.cpp' || echo '$(srcdir)/'`tobrowsersynonymwidget.cpp tora-tobrowsersynonymwidget.obj: tobrowsersynonymwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowsersynonymwidget.obj -MD -MP -MF $(DEPDIR)/tora-tobrowsersynonymwidget.Tpo -c -o tora-tobrowsersynonymwidget.obj `if test -f 'tobrowsersynonymwidget.cpp'; then $(CYGPATH_W) 'tobrowsersynonymwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowsersynonymwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowsersynonymwidget.Tpo $(DEPDIR)/tora-tobrowsersynonymwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowsersynonymwidget.cpp' object='tora-tobrowsersynonymwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowsersynonymwidget.obj `if test -f 'tobrowsersynonymwidget.cpp'; then $(CYGPATH_W) 'tobrowsersynonymwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowsersynonymwidget.cpp'; fi` tora-tobrowsercodewidget.o: tobrowsercodewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowsercodewidget.o -MD -MP -MF $(DEPDIR)/tora-tobrowsercodewidget.Tpo -c -o tora-tobrowsercodewidget.o `test -f 'tobrowsercodewidget.cpp' || echo '$(srcdir)/'`tobrowsercodewidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowsercodewidget.Tpo $(DEPDIR)/tora-tobrowsercodewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowsercodewidget.cpp' object='tora-tobrowsercodewidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowsercodewidget.o `test -f 'tobrowsercodewidget.cpp' || echo '$(srcdir)/'`tobrowsercodewidget.cpp tora-tobrowsercodewidget.obj: tobrowsercodewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowsercodewidget.obj -MD -MP -MF $(DEPDIR)/tora-tobrowsercodewidget.Tpo -c -o tora-tobrowsercodewidget.obj `if test -f 'tobrowsercodewidget.cpp'; then $(CYGPATH_W) 'tobrowsercodewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowsercodewidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowsercodewidget.Tpo $(DEPDIR)/tora-tobrowsercodewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowsercodewidget.cpp' object='tora-tobrowsercodewidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowsercodewidget.obj `if test -f 'tobrowsercodewidget.cpp'; then $(CYGPATH_W) 'tobrowsercodewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowsercodewidget.cpp'; fi` tora-tobrowsertriggerwidget.o: tobrowsertriggerwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowsertriggerwidget.o -MD -MP -MF $(DEPDIR)/tora-tobrowsertriggerwidget.Tpo -c -o tora-tobrowsertriggerwidget.o `test -f 'tobrowsertriggerwidget.cpp' || echo '$(srcdir)/'`tobrowsertriggerwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowsertriggerwidget.Tpo $(DEPDIR)/tora-tobrowsertriggerwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowsertriggerwidget.cpp' object='tora-tobrowsertriggerwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowsertriggerwidget.o `test -f 'tobrowsertriggerwidget.cpp' || echo '$(srcdir)/'`tobrowsertriggerwidget.cpp tora-tobrowsertriggerwidget.obj: tobrowsertriggerwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowsertriggerwidget.obj -MD -MP -MF $(DEPDIR)/tora-tobrowsertriggerwidget.Tpo -c -o tora-tobrowsertriggerwidget.obj `if test -f 'tobrowsertriggerwidget.cpp'; then $(CYGPATH_W) 'tobrowsertriggerwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowsertriggerwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowsertriggerwidget.Tpo $(DEPDIR)/tora-tobrowsertriggerwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowsertriggerwidget.cpp' object='tora-tobrowsertriggerwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowsertriggerwidget.obj `if test -f 'tobrowsertriggerwidget.cpp'; then $(CYGPATH_W) 'tobrowsertriggerwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowsertriggerwidget.cpp'; fi` tora-tobrowserdblinkswidget.o: tobrowserdblinkswidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserdblinkswidget.o -MD -MP -MF $(DEPDIR)/tora-tobrowserdblinkswidget.Tpo -c -o tora-tobrowserdblinkswidget.o `test -f 'tobrowserdblinkswidget.cpp' || echo '$(srcdir)/'`tobrowserdblinkswidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserdblinkswidget.Tpo $(DEPDIR)/tora-tobrowserdblinkswidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserdblinkswidget.cpp' object='tora-tobrowserdblinkswidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserdblinkswidget.o `test -f 'tobrowserdblinkswidget.cpp' || echo '$(srcdir)/'`tobrowserdblinkswidget.cpp tora-tobrowserdblinkswidget.obj: tobrowserdblinkswidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserdblinkswidget.obj -MD -MP -MF $(DEPDIR)/tora-tobrowserdblinkswidget.Tpo -c -o tora-tobrowserdblinkswidget.obj `if test -f 'tobrowserdblinkswidget.cpp'; then $(CYGPATH_W) 'tobrowserdblinkswidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserdblinkswidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserdblinkswidget.Tpo $(DEPDIR)/tora-tobrowserdblinkswidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserdblinkswidget.cpp' object='tora-tobrowserdblinkswidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserdblinkswidget.obj `if test -f 'tobrowserdblinkswidget.cpp'; then $(CYGPATH_W) 'tobrowserdblinkswidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserdblinkswidget.cpp'; fi` tora-tobrowserdirectorieswidget.o: tobrowserdirectorieswidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserdirectorieswidget.o -MD -MP -MF $(DEPDIR)/tora-tobrowserdirectorieswidget.Tpo -c -o tora-tobrowserdirectorieswidget.o `test -f 'tobrowserdirectorieswidget.cpp' || echo '$(srcdir)/'`tobrowserdirectorieswidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserdirectorieswidget.Tpo $(DEPDIR)/tora-tobrowserdirectorieswidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserdirectorieswidget.cpp' object='tora-tobrowserdirectorieswidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserdirectorieswidget.o `test -f 'tobrowserdirectorieswidget.cpp' || echo '$(srcdir)/'`tobrowserdirectorieswidget.cpp tora-tobrowserdirectorieswidget.obj: tobrowserdirectorieswidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tobrowserdirectorieswidget.obj -MD -MP -MF $(DEPDIR)/tora-tobrowserdirectorieswidget.Tpo -c -o tora-tobrowserdirectorieswidget.obj `if test -f 'tobrowserdirectorieswidget.cpp'; then $(CYGPATH_W) 'tobrowserdirectorieswidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserdirectorieswidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tobrowserdirectorieswidget.Tpo $(DEPDIR)/tora-tobrowserdirectorieswidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tobrowserdirectorieswidget.cpp' object='tora-tobrowserdirectorieswidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tobrowserdirectorieswidget.obj `if test -f 'tobrowserdirectorieswidget.cpp'; then $(CYGPATH_W) 'tobrowserdirectorieswidget.cpp'; else $(CYGPATH_W) '$(srcdir)/tobrowserdirectorieswidget.cpp'; fi` tora-toresultgrants.o: toresultgrants.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultgrants.o -MD -MP -MF $(DEPDIR)/tora-toresultgrants.Tpo -c -o tora-toresultgrants.o `test -f 'toresultgrants.cpp' || echo '$(srcdir)/'`toresultgrants.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultgrants.Tpo $(DEPDIR)/tora-toresultgrants.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultgrants.cpp' object='tora-toresultgrants.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultgrants.o `test -f 'toresultgrants.cpp' || echo '$(srcdir)/'`toresultgrants.cpp tora-toresultgrants.obj: toresultgrants.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toresultgrants.obj -MD -MP -MF $(DEPDIR)/tora-toresultgrants.Tpo -c -o tora-toresultgrants.obj `if test -f 'toresultgrants.cpp'; then $(CYGPATH_W) 'toresultgrants.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultgrants.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toresultgrants.Tpo $(DEPDIR)/tora-toresultgrants.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toresultgrants.cpp' object='tora-toresultgrants.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toresultgrants.obj `if test -f 'toresultgrants.cpp'; then $(CYGPATH_W) 'toresultgrants.cpp'; else $(CYGPATH_W) '$(srcdir)/toresultgrants.cpp'; fi` tora-toawr.o: toawr.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toawr.o -MD -MP -MF $(DEPDIR)/tora-toawr.Tpo -c -o tora-toawr.o `test -f 'toawr.cpp' || echo '$(srcdir)/'`toawr.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toawr.Tpo $(DEPDIR)/tora-toawr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toawr.cpp' object='tora-toawr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toawr.o `test -f 'toawr.cpp' || echo '$(srcdir)/'`toawr.cpp tora-toawr.obj: toawr.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toawr.obj -MD -MP -MF $(DEPDIR)/tora-toawr.Tpo -c -o tora-toawr.obj `if test -f 'toawr.cpp'; then $(CYGPATH_W) 'toawr.cpp'; else $(CYGPATH_W) '$(srcdir)/toawr.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toawr.Tpo $(DEPDIR)/tora-toawr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toawr.cpp' object='tora-toawr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toawr.obj `if test -f 'toawr.cpp'; then $(CYGPATH_W) 'toawr.cpp'; else $(CYGPATH_W) '$(srcdir)/toawr.cpp'; fi` tora-sqldeveloper.o: migratetool/sqldeveloper.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-sqldeveloper.o -MD -MP -MF $(DEPDIR)/tora-sqldeveloper.Tpo -c -o tora-sqldeveloper.o `test -f 'migratetool/sqldeveloper.cpp' || echo '$(srcdir)/'`migratetool/sqldeveloper.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-sqldeveloper.Tpo $(DEPDIR)/tora-sqldeveloper.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='migratetool/sqldeveloper.cpp' object='tora-sqldeveloper.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-sqldeveloper.o `test -f 'migratetool/sqldeveloper.cpp' || echo '$(srcdir)/'`migratetool/sqldeveloper.cpp tora-sqldeveloper.obj: migratetool/sqldeveloper.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-sqldeveloper.obj -MD -MP -MF $(DEPDIR)/tora-sqldeveloper.Tpo -c -o tora-sqldeveloper.obj `if test -f 'migratetool/sqldeveloper.cpp'; then $(CYGPATH_W) 'migratetool/sqldeveloper.cpp'; else $(CYGPATH_W) '$(srcdir)/migratetool/sqldeveloper.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-sqldeveloper.Tpo $(DEPDIR)/tora-sqldeveloper.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='migratetool/sqldeveloper.cpp' object='tora-sqldeveloper.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-sqldeveloper.obj `if test -f 'migratetool/sqldeveloper.cpp'; then $(CYGPATH_W) 'migratetool/sqldeveloper.cpp'; else $(CYGPATH_W) '$(srcdir)/migratetool/sqldeveloper.cpp'; fi` tora-squirrelsql.o: migratetool/squirrelsql.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-squirrelsql.o -MD -MP -MF $(DEPDIR)/tora-squirrelsql.Tpo -c -o tora-squirrelsql.o `test -f 'migratetool/squirrelsql.cpp' || echo '$(srcdir)/'`migratetool/squirrelsql.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-squirrelsql.Tpo $(DEPDIR)/tora-squirrelsql.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='migratetool/squirrelsql.cpp' object='tora-squirrelsql.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-squirrelsql.o `test -f 'migratetool/squirrelsql.cpp' || echo '$(srcdir)/'`migratetool/squirrelsql.cpp tora-squirrelsql.obj: migratetool/squirrelsql.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-squirrelsql.obj -MD -MP -MF $(DEPDIR)/tora-squirrelsql.Tpo -c -o tora-squirrelsql.obj `if test -f 'migratetool/squirrelsql.cpp'; then $(CYGPATH_W) 'migratetool/squirrelsql.cpp'; else $(CYGPATH_W) '$(srcdir)/migratetool/squirrelsql.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-squirrelsql.Tpo $(DEPDIR)/tora-squirrelsql.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='migratetool/squirrelsql.cpp' object='tora-squirrelsql.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-squirrelsql.obj `if test -f 'migratetool/squirrelsql.cpp'; then $(CYGPATH_W) 'migratetool/squirrelsql.cpp'; else $(CYGPATH_W) '$(srcdir)/migratetool/squirrelsql.cpp'; fi` tora-tora3.o: migratetool/tora3.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tora3.o -MD -MP -MF $(DEPDIR)/tora-tora3.Tpo -c -o tora-tora3.o `test -f 'migratetool/tora3.cpp' || echo '$(srcdir)/'`migratetool/tora3.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tora3.Tpo $(DEPDIR)/tora-tora3.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='migratetool/tora3.cpp' object='tora-tora3.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tora3.o `test -f 'migratetool/tora3.cpp' || echo '$(srcdir)/'`migratetool/tora3.cpp tora-tora3.obj: migratetool/tora3.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tora3.obj -MD -MP -MF $(DEPDIR)/tora-tora3.Tpo -c -o tora-tora3.obj `if test -f 'migratetool/tora3.cpp'; then $(CYGPATH_W) 'migratetool/tora3.cpp'; else $(CYGPATH_W) '$(srcdir)/migratetool/tora3.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tora3.Tpo $(DEPDIR)/tora-tora3.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='migratetool/tora3.cpp' object='tora-tora3.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tora3.obj `if test -f 'migratetool/tora3.cpp'; then $(CYGPATH_W) 'migratetool/tora3.cpp'; else $(CYGPATH_W) '$(srcdir)/migratetool/tora3.cpp'; fi` tora-shortcuteditordialog.o: shortcuteditor/shortcuteditordialog.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-shortcuteditordialog.o -MD -MP -MF $(DEPDIR)/tora-shortcuteditordialog.Tpo -c -o tora-shortcuteditordialog.o `test -f 'shortcuteditor/shortcuteditordialog.cpp' || echo '$(srcdir)/'`shortcuteditor/shortcuteditordialog.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-shortcuteditordialog.Tpo $(DEPDIR)/tora-shortcuteditordialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='shortcuteditor/shortcuteditordialog.cpp' object='tora-shortcuteditordialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-shortcuteditordialog.o `test -f 'shortcuteditor/shortcuteditordialog.cpp' || echo '$(srcdir)/'`shortcuteditor/shortcuteditordialog.cpp tora-shortcuteditordialog.obj: shortcuteditor/shortcuteditordialog.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-shortcuteditordialog.obj -MD -MP -MF $(DEPDIR)/tora-shortcuteditordialog.Tpo -c -o tora-shortcuteditordialog.obj `if test -f 'shortcuteditor/shortcuteditordialog.cpp'; then $(CYGPATH_W) 'shortcuteditor/shortcuteditordialog.cpp'; else $(CYGPATH_W) '$(srcdir)/shortcuteditor/shortcuteditordialog.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-shortcuteditordialog.Tpo $(DEPDIR)/tora-shortcuteditordialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='shortcuteditor/shortcuteditordialog.cpp' object='tora-shortcuteditordialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-shortcuteditordialog.obj `if test -f 'shortcuteditor/shortcuteditordialog.cpp'; then $(CYGPATH_W) 'shortcuteditor/shortcuteditordialog.cpp'; else $(CYGPATH_W) '$(srcdir)/shortcuteditor/shortcuteditordialog.cpp'; fi` tora-shortcutmodel.o: shortcuteditor/shortcutmodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-shortcutmodel.o -MD -MP -MF $(DEPDIR)/tora-shortcutmodel.Tpo -c -o tora-shortcutmodel.o `test -f 'shortcuteditor/shortcutmodel.cpp' || echo '$(srcdir)/'`shortcuteditor/shortcutmodel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-shortcutmodel.Tpo $(DEPDIR)/tora-shortcutmodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='shortcuteditor/shortcutmodel.cpp' object='tora-shortcutmodel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-shortcutmodel.o `test -f 'shortcuteditor/shortcutmodel.cpp' || echo '$(srcdir)/'`shortcuteditor/shortcutmodel.cpp tora-shortcutmodel.obj: shortcuteditor/shortcutmodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-shortcutmodel.obj -MD -MP -MF $(DEPDIR)/tora-shortcutmodel.Tpo -c -o tora-shortcutmodel.obj `if test -f 'shortcuteditor/shortcutmodel.cpp'; then $(CYGPATH_W) 'shortcuteditor/shortcutmodel.cpp'; else $(CYGPATH_W) '$(srcdir)/shortcuteditor/shortcutmodel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-shortcutmodel.Tpo $(DEPDIR)/tora-shortcutmodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='shortcuteditor/shortcutmodel.cpp' object='tora-shortcutmodel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-shortcutmodel.obj `if test -f 'shortcuteditor/shortcutmodel.cpp'; then $(CYGPATH_W) 'shortcuteditor/shortcutmodel.cpp'; else $(CYGPATH_W) '$(srcdir)/shortcuteditor/shortcutmodel.cpp'; fi` tora-tooracleconnection.o: tooracleconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tooracleconnection.o -MD -MP -MF $(DEPDIR)/tora-tooracleconnection.Tpo -c -o tora-tooracleconnection.o `test -f 'tooracleconnection.cpp' || echo '$(srcdir)/'`tooracleconnection.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tooracleconnection.Tpo $(DEPDIR)/tora-tooracleconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tooracleconnection.cpp' object='tora-tooracleconnection.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tooracleconnection.o `test -f 'tooracleconnection.cpp' || echo '$(srcdir)/'`tooracleconnection.cpp tora-tooracleconnection.obj: tooracleconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tooracleconnection.obj -MD -MP -MF $(DEPDIR)/tora-tooracleconnection.Tpo -c -o tora-tooracleconnection.obj `if test -f 'tooracleconnection.cpp'; then $(CYGPATH_W) 'tooracleconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/tooracleconnection.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tooracleconnection.Tpo $(DEPDIR)/tora-tooracleconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tooracleconnection.cpp' object='tora-tooracleconnection.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tooracleconnection.obj `if test -f 'tooracleconnection.cpp'; then $(CYGPATH_W) 'tooracleconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/tooracleconnection.cpp'; fi` tora-tooracletable.o: tooracletable.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tooracletable.o -MD -MP -MF $(DEPDIR)/tora-tooracletable.Tpo -c -o tora-tooracletable.o `test -f 'tooracletable.cpp' || echo '$(srcdir)/'`tooracletable.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tooracletable.Tpo $(DEPDIR)/tora-tooracletable.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tooracletable.cpp' object='tora-tooracletable.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tooracletable.o `test -f 'tooracletable.cpp' || echo '$(srcdir)/'`tooracletable.cpp tora-tooracletable.obj: tooracletable.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tooracletable.obj -MD -MP -MF $(DEPDIR)/tora-tooracletable.Tpo -c -o tora-tooracletable.obj `if test -f 'tooracletable.cpp'; then $(CYGPATH_W) 'tooracletable.cpp'; else $(CYGPATH_W) '$(srcdir)/tooracletable.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tooracletable.Tpo $(DEPDIR)/tora-tooracletable.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tooracletable.cpp' object='tora-tooracletable.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tooracletable.obj `if test -f 'tooracletable.cpp'; then $(CYGPATH_W) 'tooracletable.cpp'; else $(CYGPATH_W) '$(srcdir)/tooracletable.cpp'; fi` tora-tooracleextract.o: tooracleextract.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tooracleextract.o -MD -MP -MF $(DEPDIR)/tora-tooracleextract.Tpo -c -o tora-tooracleextract.o `test -f 'tooracleextract.cpp' || echo '$(srcdir)/'`tooracleextract.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tooracleextract.Tpo $(DEPDIR)/tora-tooracleextract.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tooracleextract.cpp' object='tora-tooracleextract.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tooracleextract.o `test -f 'tooracleextract.cpp' || echo '$(srcdir)/'`tooracleextract.cpp tora-tooracleextract.obj: tooracleextract.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-tooracleextract.obj -MD -MP -MF $(DEPDIR)/tora-tooracleextract.Tpo -c -o tora-tooracleextract.obj `if test -f 'tooracleextract.cpp'; then $(CYGPATH_W) 'tooracleextract.cpp'; else $(CYGPATH_W) '$(srcdir)/tooracleextract.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-tooracleextract.Tpo $(DEPDIR)/tora-tooracleextract.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tooracleextract.cpp' object='tora-tooracleextract.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-tooracleextract.obj `if test -f 'tooracleextract.cpp'; then $(CYGPATH_W) 'tooracleextract.cpp'; else $(CYGPATH_W) '$(srcdir)/tooracleextract.cpp'; fi` tora-toteradataconnection.o: toteradataconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toteradataconnection.o -MD -MP -MF $(DEPDIR)/tora-toteradataconnection.Tpo -c -o tora-toteradataconnection.o `test -f 'toteradataconnection.cpp' || echo '$(srcdir)/'`toteradataconnection.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toteradataconnection.Tpo $(DEPDIR)/tora-toteradataconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toteradataconnection.cpp' object='tora-toteradataconnection.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toteradataconnection.o `test -f 'toteradataconnection.cpp' || echo '$(srcdir)/'`toteradataconnection.cpp tora-toteradataconnection.obj: toteradataconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-toteradataconnection.obj -MD -MP -MF $(DEPDIR)/tora-toteradataconnection.Tpo -c -o tora-toteradataconnection.obj `if test -f 'toteradataconnection.cpp'; then $(CYGPATH_W) 'toteradataconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/toteradataconnection.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-toteradataconnection.Tpo $(DEPDIR)/tora-toteradataconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='toteradataconnection.cpp' object='tora-toteradataconnection.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-toteradataconnection.obj `if test -f 'toteradataconnection.cpp'; then $(CYGPATH_W) 'toteradataconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/toteradataconnection.cpp'; fi` tora-SmallObj.o: $(LOKIDIR_SRC)/SmallObj.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-SmallObj.o -MD -MP -MF $(DEPDIR)/tora-SmallObj.Tpo -c -o tora-SmallObj.o `test -f '$(LOKIDIR_SRC)/SmallObj.cpp' || echo '$(srcdir)/'`$(LOKIDIR_SRC)/SmallObj.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-SmallObj.Tpo $(DEPDIR)/tora-SmallObj.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(LOKIDIR_SRC)/SmallObj.cpp' object='tora-SmallObj.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-SmallObj.o `test -f '$(LOKIDIR_SRC)/SmallObj.cpp' || echo '$(srcdir)/'`$(LOKIDIR_SRC)/SmallObj.cpp tora-SmallObj.obj: $(LOKIDIR_SRC)/SmallObj.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-SmallObj.obj -MD -MP -MF $(DEPDIR)/tora-SmallObj.Tpo -c -o tora-SmallObj.obj `if test -f '$(LOKIDIR_SRC)/SmallObj.cpp'; then $(CYGPATH_W) '$(LOKIDIR_SRC)/SmallObj.cpp'; else $(CYGPATH_W) '$(srcdir)/$(LOKIDIR_SRC)/SmallObj.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-SmallObj.Tpo $(DEPDIR)/tora-SmallObj.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(LOKIDIR_SRC)/SmallObj.cpp' object='tora-SmallObj.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-SmallObj.obj `if test -f '$(LOKIDIR_SRC)/SmallObj.cpp'; then $(CYGPATH_W) '$(LOKIDIR_SRC)/SmallObj.cpp'; else $(CYGPATH_W) '$(srcdir)/$(LOKIDIR_SRC)/SmallObj.cpp'; fi` tora-Singleton.o: $(LOKIDIR_SRC)/Singleton.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-Singleton.o -MD -MP -MF $(DEPDIR)/tora-Singleton.Tpo -c -o tora-Singleton.o `test -f '$(LOKIDIR_SRC)/Singleton.cpp' || echo '$(srcdir)/'`$(LOKIDIR_SRC)/Singleton.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-Singleton.Tpo $(DEPDIR)/tora-Singleton.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(LOKIDIR_SRC)/Singleton.cpp' object='tora-Singleton.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-Singleton.o `test -f '$(LOKIDIR_SRC)/Singleton.cpp' || echo '$(srcdir)/'`$(LOKIDIR_SRC)/Singleton.cpp tora-Singleton.obj: $(LOKIDIR_SRC)/Singleton.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-Singleton.obj -MD -MP -MF $(DEPDIR)/tora-Singleton.Tpo -c -o tora-Singleton.obj `if test -f '$(LOKIDIR_SRC)/Singleton.cpp'; then $(CYGPATH_W) '$(LOKIDIR_SRC)/Singleton.cpp'; else $(CYGPATH_W) '$(srcdir)/$(LOKIDIR_SRC)/Singleton.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-Singleton.Tpo $(DEPDIR)/tora-Singleton.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(LOKIDIR_SRC)/Singleton.cpp' object='tora-Singleton.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-Singleton.obj `if test -f '$(LOKIDIR_SRC)/Singleton.cpp'; then $(CYGPATH_W) '$(LOKIDIR_SRC)/Singleton.cpp'; else $(CYGPATH_W) '$(srcdir)/$(LOKIDIR_SRC)/Singleton.cpp'; fi` tora-moc_toabout.o: moc_toabout.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toabout.o -MD -MP -MF $(DEPDIR)/tora-moc_toabout.Tpo -c -o tora-moc_toabout.o `test -f 'moc_toabout.cpp' || echo '$(srcdir)/'`moc_toabout.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toabout.Tpo $(DEPDIR)/tora-moc_toabout.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toabout.cpp' object='tora-moc_toabout.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toabout.o `test -f 'moc_toabout.cpp' || echo '$(srcdir)/'`moc_toabout.cpp tora-moc_toabout.obj: moc_toabout.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toabout.obj -MD -MP -MF $(DEPDIR)/tora-moc_toabout.Tpo -c -o tora-moc_toabout.obj `if test -f 'moc_toabout.cpp'; then $(CYGPATH_W) 'moc_toabout.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toabout.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toabout.Tpo $(DEPDIR)/tora-moc_toabout.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toabout.cpp' object='tora-moc_toabout.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toabout.obj `if test -f 'moc_toabout.cpp'; then $(CYGPATH_W) 'moc_toabout.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toabout.cpp'; fi` tora-moc_toalert.o: moc_toalert.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toalert.o -MD -MP -MF $(DEPDIR)/tora-moc_toalert.Tpo -c -o tora-moc_toalert.o `test -f 'moc_toalert.cpp' || echo '$(srcdir)/'`moc_toalert.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toalert.Tpo $(DEPDIR)/tora-moc_toalert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toalert.cpp' object='tora-moc_toalert.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toalert.o `test -f 'moc_toalert.cpp' || echo '$(srcdir)/'`moc_toalert.cpp tora-moc_toalert.obj: moc_toalert.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toalert.obj -MD -MP -MF $(DEPDIR)/tora-moc_toalert.Tpo -c -o tora-moc_toalert.obj `if test -f 'moc_toalert.cpp'; then $(CYGPATH_W) 'moc_toalert.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toalert.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toalert.Tpo $(DEPDIR)/tora-moc_toalert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toalert.cpp' object='tora-moc_toalert.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toalert.obj `if test -f 'moc_toalert.cpp'; then $(CYGPATH_W) 'moc_toalert.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toalert.cpp'; fi` tora-moc_toanalyze.o: moc_toanalyze.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toanalyze.o -MD -MP -MF $(DEPDIR)/tora-moc_toanalyze.Tpo -c -o tora-moc_toanalyze.o `test -f 'moc_toanalyze.cpp' || echo '$(srcdir)/'`moc_toanalyze.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toanalyze.Tpo $(DEPDIR)/tora-moc_toanalyze.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toanalyze.cpp' object='tora-moc_toanalyze.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toanalyze.o `test -f 'moc_toanalyze.cpp' || echo '$(srcdir)/'`moc_toanalyze.cpp tora-moc_toanalyze.obj: moc_toanalyze.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toanalyze.obj -MD -MP -MF $(DEPDIR)/tora-moc_toanalyze.Tpo -c -o tora-moc_toanalyze.obj `if test -f 'moc_toanalyze.cpp'; then $(CYGPATH_W) 'moc_toanalyze.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toanalyze.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toanalyze.Tpo $(DEPDIR)/tora-moc_toanalyze.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toanalyze.cpp' object='tora-moc_toanalyze.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toanalyze.obj `if test -f 'moc_toanalyze.cpp'; then $(CYGPATH_W) 'moc_toanalyze.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toanalyze.cpp'; fi` tora-moc_tobackup.o: moc_tobackup.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobackup.o -MD -MP -MF $(DEPDIR)/tora-moc_tobackup.Tpo -c -o tora-moc_tobackup.o `test -f 'moc_tobackup.cpp' || echo '$(srcdir)/'`moc_tobackup.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobackup.Tpo $(DEPDIR)/tora-moc_tobackup.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobackup.cpp' object='tora-moc_tobackup.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobackup.o `test -f 'moc_tobackup.cpp' || echo '$(srcdir)/'`moc_tobackup.cpp tora-moc_tobackup.obj: moc_tobackup.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobackup.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobackup.Tpo -c -o tora-moc_tobackup.obj `if test -f 'moc_tobackup.cpp'; then $(CYGPATH_W) 'moc_tobackup.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobackup.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobackup.Tpo $(DEPDIR)/tora-moc_tobackup.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobackup.cpp' object='tora-moc_tobackup.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobackup.obj `if test -f 'moc_tobackup.cpp'; then $(CYGPATH_W) 'moc_tobackup.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobackup.cpp'; fi` tora-moc_tobarchart.o: moc_tobarchart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobarchart.o -MD -MP -MF $(DEPDIR)/tora-moc_tobarchart.Tpo -c -o tora-moc_tobarchart.o `test -f 'moc_tobarchart.cpp' || echo '$(srcdir)/'`moc_tobarchart.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobarchart.Tpo $(DEPDIR)/tora-moc_tobarchart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobarchart.cpp' object='tora-moc_tobarchart.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobarchart.o `test -f 'moc_tobarchart.cpp' || echo '$(srcdir)/'`moc_tobarchart.cpp tora-moc_tobarchart.obj: moc_tobarchart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobarchart.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobarchart.Tpo -c -o tora-moc_tobarchart.obj `if test -f 'moc_tobarchart.cpp'; then $(CYGPATH_W) 'moc_tobarchart.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobarchart.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobarchart.Tpo $(DEPDIR)/tora-moc_tobarchart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobarchart.cpp' object='tora-moc_tobarchart.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobarchart.obj `if test -f 'moc_tobarchart.cpp'; then $(CYGPATH_W) 'moc_tobarchart.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobarchart.cpp'; fi` tora-moc_tobackgroundlabel.o: moc_tobackgroundlabel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobackgroundlabel.o -MD -MP -MF $(DEPDIR)/tora-moc_tobackgroundlabel.Tpo -c -o tora-moc_tobackgroundlabel.o `test -f 'moc_tobackgroundlabel.cpp' || echo '$(srcdir)/'`moc_tobackgroundlabel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobackgroundlabel.Tpo $(DEPDIR)/tora-moc_tobackgroundlabel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobackgroundlabel.cpp' object='tora-moc_tobackgroundlabel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobackgroundlabel.o `test -f 'moc_tobackgroundlabel.cpp' || echo '$(srcdir)/'`moc_tobackgroundlabel.cpp tora-moc_tobackgroundlabel.obj: moc_tobackgroundlabel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobackgroundlabel.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobackgroundlabel.Tpo -c -o tora-moc_tobackgroundlabel.obj `if test -f 'moc_tobackgroundlabel.cpp'; then $(CYGPATH_W) 'moc_tobackgroundlabel.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobackgroundlabel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobackgroundlabel.Tpo $(DEPDIR)/tora-moc_tobackgroundlabel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobackgroundlabel.cpp' object='tora-moc_tobackgroundlabel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobackgroundlabel.obj `if test -f 'moc_tobackgroundlabel.cpp'; then $(CYGPATH_W) 'moc_tobackgroundlabel.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobackgroundlabel.cpp'; fi` tora-moc_tobrowser.o: moc_tobrowser.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowser.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowser.Tpo -c -o tora-moc_tobrowser.o `test -f 'moc_tobrowser.cpp' || echo '$(srcdir)/'`moc_tobrowser.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowser.Tpo $(DEPDIR)/tora-moc_tobrowser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowser.cpp' object='tora-moc_tobrowser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowser.o `test -f 'moc_tobrowser.cpp' || echo '$(srcdir)/'`moc_tobrowser.cpp tora-moc_tobrowser.obj: moc_tobrowser.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowser.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowser.Tpo -c -o tora-moc_tobrowser.obj `if test -f 'moc_tobrowser.cpp'; then $(CYGPATH_W) 'moc_tobrowser.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowser.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowser.Tpo $(DEPDIR)/tora-moc_tobrowser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowser.cpp' object='tora-moc_tobrowser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowser.obj `if test -f 'moc_tobrowser.cpp'; then $(CYGPATH_W) 'moc_tobrowser.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowser.cpp'; fi` tora-moc_tobrowserconstraint.o: moc_tobrowserconstraint.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserconstraint.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserconstraint.Tpo -c -o tora-moc_tobrowserconstraint.o `test -f 'moc_tobrowserconstraint.cpp' || echo '$(srcdir)/'`moc_tobrowserconstraint.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserconstraint.Tpo $(DEPDIR)/tora-moc_tobrowserconstraint.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserconstraint.cpp' object='tora-moc_tobrowserconstraint.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserconstraint.o `test -f 'moc_tobrowserconstraint.cpp' || echo '$(srcdir)/'`moc_tobrowserconstraint.cpp tora-moc_tobrowserconstraint.obj: moc_tobrowserconstraint.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserconstraint.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserconstraint.Tpo -c -o tora-moc_tobrowserconstraint.obj `if test -f 'moc_tobrowserconstraint.cpp'; then $(CYGPATH_W) 'moc_tobrowserconstraint.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserconstraint.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserconstraint.Tpo $(DEPDIR)/tora-moc_tobrowserconstraint.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserconstraint.cpp' object='tora-moc_tobrowserconstraint.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserconstraint.obj `if test -f 'moc_tobrowserconstraint.cpp'; then $(CYGPATH_W) 'moc_tobrowserconstraint.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserconstraint.cpp'; fi` tora-moc_tobrowserindex.o: moc_tobrowserindex.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserindex.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserindex.Tpo -c -o tora-moc_tobrowserindex.o `test -f 'moc_tobrowserindex.cpp' || echo '$(srcdir)/'`moc_tobrowserindex.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserindex.Tpo $(DEPDIR)/tora-moc_tobrowserindex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserindex.cpp' object='tora-moc_tobrowserindex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserindex.o `test -f 'moc_tobrowserindex.cpp' || echo '$(srcdir)/'`moc_tobrowserindex.cpp tora-moc_tobrowserindex.obj: moc_tobrowserindex.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserindex.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserindex.Tpo -c -o tora-moc_tobrowserindex.obj `if test -f 'moc_tobrowserindex.cpp'; then $(CYGPATH_W) 'moc_tobrowserindex.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserindex.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserindex.Tpo $(DEPDIR)/tora-moc_tobrowserindex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserindex.cpp' object='tora-moc_tobrowserindex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserindex.obj `if test -f 'moc_tobrowserindex.cpp'; then $(CYGPATH_W) 'moc_tobrowserindex.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserindex.cpp'; fi` tora-moc_tobrowsertable.o: moc_tobrowsertable.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowsertable.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowsertable.Tpo -c -o tora-moc_tobrowsertable.o `test -f 'moc_tobrowsertable.cpp' || echo '$(srcdir)/'`moc_tobrowsertable.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowsertable.Tpo $(DEPDIR)/tora-moc_tobrowsertable.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowsertable.cpp' object='tora-moc_tobrowsertable.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowsertable.o `test -f 'moc_tobrowsertable.cpp' || echo '$(srcdir)/'`moc_tobrowsertable.cpp tora-moc_tobrowsertable.obj: moc_tobrowsertable.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowsertable.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowsertable.Tpo -c -o tora-moc_tobrowsertable.obj `if test -f 'moc_tobrowsertable.cpp'; then $(CYGPATH_W) 'moc_tobrowsertable.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowsertable.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowsertable.Tpo $(DEPDIR)/tora-moc_tobrowsertable.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowsertable.cpp' object='tora-moc_tobrowsertable.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowsertable.obj `if test -f 'moc_tobrowsertable.cpp'; then $(CYGPATH_W) 'moc_tobrowsertable.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowsertable.cpp'; fi` tora-moc_tochangeconnection.o: moc_tochangeconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tochangeconnection.o -MD -MP -MF $(DEPDIR)/tora-moc_tochangeconnection.Tpo -c -o tora-moc_tochangeconnection.o `test -f 'moc_tochangeconnection.cpp' || echo '$(srcdir)/'`moc_tochangeconnection.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tochangeconnection.Tpo $(DEPDIR)/tora-moc_tochangeconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tochangeconnection.cpp' object='tora-moc_tochangeconnection.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tochangeconnection.o `test -f 'moc_tochangeconnection.cpp' || echo '$(srcdir)/'`moc_tochangeconnection.cpp tora-moc_tochangeconnection.obj: moc_tochangeconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tochangeconnection.obj -MD -MP -MF $(DEPDIR)/tora-moc_tochangeconnection.Tpo -c -o tora-moc_tochangeconnection.obj `if test -f 'moc_tochangeconnection.cpp'; then $(CYGPATH_W) 'moc_tochangeconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tochangeconnection.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tochangeconnection.Tpo $(DEPDIR)/tora-moc_tochangeconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tochangeconnection.cpp' object='tora-moc_tochangeconnection.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tochangeconnection.obj `if test -f 'moc_tochangeconnection.cpp'; then $(CYGPATH_W) 'moc_tochangeconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tochangeconnection.cpp'; fi` tora-moc_tochartmanager.o: moc_tochartmanager.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tochartmanager.o -MD -MP -MF $(DEPDIR)/tora-moc_tochartmanager.Tpo -c -o tora-moc_tochartmanager.o `test -f 'moc_tochartmanager.cpp' || echo '$(srcdir)/'`moc_tochartmanager.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tochartmanager.Tpo $(DEPDIR)/tora-moc_tochartmanager.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tochartmanager.cpp' object='tora-moc_tochartmanager.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tochartmanager.o `test -f 'moc_tochartmanager.cpp' || echo '$(srcdir)/'`moc_tochartmanager.cpp tora-moc_tochartmanager.obj: moc_tochartmanager.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tochartmanager.obj -MD -MP -MF $(DEPDIR)/tora-moc_tochartmanager.Tpo -c -o tora-moc_tochartmanager.obj `if test -f 'moc_tochartmanager.cpp'; then $(CYGPATH_W) 'moc_tochartmanager.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tochartmanager.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tochartmanager.Tpo $(DEPDIR)/tora-moc_tochartmanager.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tochartmanager.cpp' object='tora-moc_tochartmanager.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tochartmanager.obj `if test -f 'moc_tochartmanager.cpp'; then $(CYGPATH_W) 'moc_tochartmanager.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tochartmanager.cpp'; fi` tora-moc_toconnection.o: moc_toconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toconnection.o -MD -MP -MF $(DEPDIR)/tora-moc_toconnection.Tpo -c -o tora-moc_toconnection.o `test -f 'moc_toconnection.cpp' || echo '$(srcdir)/'`moc_toconnection.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toconnection.Tpo $(DEPDIR)/tora-moc_toconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toconnection.cpp' object='tora-moc_toconnection.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toconnection.o `test -f 'moc_toconnection.cpp' || echo '$(srcdir)/'`moc_toconnection.cpp tora-moc_toconnection.obj: moc_toconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toconnection.obj -MD -MP -MF $(DEPDIR)/tora-moc_toconnection.Tpo -c -o tora-moc_toconnection.obj `if test -f 'moc_toconnection.cpp'; then $(CYGPATH_W) 'moc_toconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toconnection.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toconnection.Tpo $(DEPDIR)/tora-moc_toconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toconnection.cpp' object='tora-moc_toconnection.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toconnection.obj `if test -f 'moc_toconnection.cpp'; then $(CYGPATH_W) 'moc_toconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toconnection.cpp'; fi` tora-moc_toconnectionmodel.o: moc_toconnectionmodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toconnectionmodel.o -MD -MP -MF $(DEPDIR)/tora-moc_toconnectionmodel.Tpo -c -o tora-moc_toconnectionmodel.o `test -f 'moc_toconnectionmodel.cpp' || echo '$(srcdir)/'`moc_toconnectionmodel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toconnectionmodel.Tpo $(DEPDIR)/tora-moc_toconnectionmodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toconnectionmodel.cpp' object='tora-moc_toconnectionmodel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toconnectionmodel.o `test -f 'moc_toconnectionmodel.cpp' || echo '$(srcdir)/'`moc_toconnectionmodel.cpp tora-moc_toconnectionmodel.obj: moc_toconnectionmodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toconnectionmodel.obj -MD -MP -MF $(DEPDIR)/tora-moc_toconnectionmodel.Tpo -c -o tora-moc_toconnectionmodel.obj `if test -f 'moc_toconnectionmodel.cpp'; then $(CYGPATH_W) 'moc_toconnectionmodel.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toconnectionmodel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toconnectionmodel.Tpo $(DEPDIR)/tora-moc_toconnectionmodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toconnectionmodel.cpp' object='tora-moc_toconnectionmodel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toconnectionmodel.obj `if test -f 'moc_toconnectionmodel.cpp'; then $(CYGPATH_W) 'moc_toconnectionmodel.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toconnectionmodel.cpp'; fi` tora-moc_tocodemodel.o: moc_tocodemodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tocodemodel.o -MD -MP -MF $(DEPDIR)/tora-moc_tocodemodel.Tpo -c -o tora-moc_tocodemodel.o `test -f 'moc_tocodemodel.cpp' || echo '$(srcdir)/'`moc_tocodemodel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tocodemodel.Tpo $(DEPDIR)/tora-moc_tocodemodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tocodemodel.cpp' object='tora-moc_tocodemodel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tocodemodel.o `test -f 'moc_tocodemodel.cpp' || echo '$(srcdir)/'`moc_tocodemodel.cpp tora-moc_tocodemodel.obj: moc_tocodemodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tocodemodel.obj -MD -MP -MF $(DEPDIR)/tora-moc_tocodemodel.Tpo -c -o tora-moc_tocodemodel.obj `if test -f 'moc_tocodemodel.cpp'; then $(CYGPATH_W) 'moc_tocodemodel.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tocodemodel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tocodemodel.Tpo $(DEPDIR)/tora-moc_tocodemodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tocodemodel.cpp' object='tora-moc_tocodemodel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tocodemodel.obj `if test -f 'moc_tocodemodel.cpp'; then $(CYGPATH_W) 'moc_tocodemodel.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tocodemodel.cpp'; fi` tora-moc_toconnectionpool.o: moc_toconnectionpool.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toconnectionpool.o -MD -MP -MF $(DEPDIR)/tora-moc_toconnectionpool.Tpo -c -o tora-moc_toconnectionpool.o `test -f 'moc_toconnectionpool.cpp' || echo '$(srcdir)/'`moc_toconnectionpool.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toconnectionpool.Tpo $(DEPDIR)/tora-moc_toconnectionpool.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toconnectionpool.cpp' object='tora-moc_toconnectionpool.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toconnectionpool.o `test -f 'moc_toconnectionpool.cpp' || echo '$(srcdir)/'`moc_toconnectionpool.cpp tora-moc_toconnectionpool.obj: moc_toconnectionpool.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toconnectionpool.obj -MD -MP -MF $(DEPDIR)/tora-moc_toconnectionpool.Tpo -c -o tora-moc_toconnectionpool.obj `if test -f 'moc_toconnectionpool.cpp'; then $(CYGPATH_W) 'moc_toconnectionpool.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toconnectionpool.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toconnectionpool.Tpo $(DEPDIR)/tora-moc_toconnectionpool.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toconnectionpool.cpp' object='tora-moc_toconnectionpool.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toconnectionpool.obj `if test -f 'moc_toconnectionpool.cpp'; then $(CYGPATH_W) 'moc_toconnectionpool.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toconnectionpool.cpp'; fi` tora-moc_toconnectionimport.o: moc_toconnectionimport.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toconnectionimport.o -MD -MP -MF $(DEPDIR)/tora-moc_toconnectionimport.Tpo -c -o tora-moc_toconnectionimport.o `test -f 'moc_toconnectionimport.cpp' || echo '$(srcdir)/'`moc_toconnectionimport.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toconnectionimport.Tpo $(DEPDIR)/tora-moc_toconnectionimport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toconnectionimport.cpp' object='tora-moc_toconnectionimport.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toconnectionimport.o `test -f 'moc_toconnectionimport.cpp' || echo '$(srcdir)/'`moc_toconnectionimport.cpp tora-moc_toconnectionimport.obj: moc_toconnectionimport.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toconnectionimport.obj -MD -MP -MF $(DEPDIR)/tora-moc_toconnectionimport.Tpo -c -o tora-moc_toconnectionimport.obj `if test -f 'moc_toconnectionimport.cpp'; then $(CYGPATH_W) 'moc_toconnectionimport.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toconnectionimport.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toconnectionimport.Tpo $(DEPDIR)/tora-moc_toconnectionimport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toconnectionimport.cpp' object='tora-moc_toconnectionimport.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toconnectionimport.obj `if test -f 'moc_toconnectionimport.cpp'; then $(CYGPATH_W) 'moc_toconnectionimport.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toconnectionimport.cpp'; fi` tora-moc_todescribe.o: moc_todescribe.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_todescribe.o -MD -MP -MF $(DEPDIR)/tora-moc_todescribe.Tpo -c -o tora-moc_todescribe.o `test -f 'moc_todescribe.cpp' || echo '$(srcdir)/'`moc_todescribe.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_todescribe.Tpo $(DEPDIR)/tora-moc_todescribe.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_todescribe.cpp' object='tora-moc_todescribe.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_todescribe.o `test -f 'moc_todescribe.cpp' || echo '$(srcdir)/'`moc_todescribe.cpp tora-moc_todescribe.obj: moc_todescribe.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_todescribe.obj -MD -MP -MF $(DEPDIR)/tora-moc_todescribe.Tpo -c -o tora-moc_todescribe.obj `if test -f 'moc_todescribe.cpp'; then $(CYGPATH_W) 'moc_todescribe.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_todescribe.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_todescribe.Tpo $(DEPDIR)/tora-moc_todescribe.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_todescribe.cpp' object='tora-moc_todescribe.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_todescribe.obj `if test -f 'moc_todescribe.cpp'; then $(CYGPATH_W) 'moc_todescribe.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_todescribe.cpp'; fi` tora-moc_torunnable.o: moc_torunnable.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_torunnable.o -MD -MP -MF $(DEPDIR)/tora-moc_torunnable.Tpo -c -o tora-moc_torunnable.o `test -f 'moc_torunnable.cpp' || echo '$(srcdir)/'`moc_torunnable.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_torunnable.Tpo $(DEPDIR)/tora-moc_torunnable.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_torunnable.cpp' object='tora-moc_torunnable.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_torunnable.o `test -f 'moc_torunnable.cpp' || echo '$(srcdir)/'`moc_torunnable.cpp tora-moc_torunnable.obj: moc_torunnable.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_torunnable.obj -MD -MP -MF $(DEPDIR)/tora-moc_torunnable.Tpo -c -o tora-moc_torunnable.obj `if test -f 'moc_torunnable.cpp'; then $(CYGPATH_W) 'moc_torunnable.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_torunnable.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_torunnable.Tpo $(DEPDIR)/tora-moc_torunnable.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_torunnable.cpp' object='tora-moc_torunnable.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_torunnable.obj `if test -f 'moc_torunnable.cpp'; then $(CYGPATH_W) 'moc_torunnable.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_torunnable.cpp'; fi` tora-moc_tonoblockquery.o: moc_tonoblockquery.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tonoblockquery.o -MD -MP -MF $(DEPDIR)/tora-moc_tonoblockquery.Tpo -c -o tora-moc_tonoblockquery.o `test -f 'moc_tonoblockquery.cpp' || echo '$(srcdir)/'`moc_tonoblockquery.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tonoblockquery.Tpo $(DEPDIR)/tora-moc_tonoblockquery.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tonoblockquery.cpp' object='tora-moc_tonoblockquery.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tonoblockquery.o `test -f 'moc_tonoblockquery.cpp' || echo '$(srcdir)/'`moc_tonoblockquery.cpp tora-moc_tonoblockquery.obj: moc_tonoblockquery.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tonoblockquery.obj -MD -MP -MF $(DEPDIR)/tora-moc_tonoblockquery.Tpo -c -o tora-moc_tonoblockquery.obj `if test -f 'moc_tonoblockquery.cpp'; then $(CYGPATH_W) 'moc_tonoblockquery.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tonoblockquery.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tonoblockquery.Tpo $(DEPDIR)/tora-moc_tonoblockquery.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tonoblockquery.cpp' object='tora-moc_tonoblockquery.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tonoblockquery.obj `if test -f 'moc_tonoblockquery.cpp'; then $(CYGPATH_W) 'moc_tonoblockquery.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tonoblockquery.cpp'; fi` tora-moc_toeventquery.o: moc_toeventquery.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toeventquery.o -MD -MP -MF $(DEPDIR)/tora-moc_toeventquery.Tpo -c -o tora-moc_toeventquery.o `test -f 'moc_toeventquery.cpp' || echo '$(srcdir)/'`moc_toeventquery.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toeventquery.Tpo $(DEPDIR)/tora-moc_toeventquery.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toeventquery.cpp' object='tora-moc_toeventquery.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toeventquery.o `test -f 'moc_toeventquery.cpp' || echo '$(srcdir)/'`moc_toeventquery.cpp tora-moc_toeventquery.obj: moc_toeventquery.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toeventquery.obj -MD -MP -MF $(DEPDIR)/tora-moc_toeventquery.Tpo -c -o tora-moc_toeventquery.obj `if test -f 'moc_toeventquery.cpp'; then $(CYGPATH_W) 'moc_toeventquery.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toeventquery.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toeventquery.Tpo $(DEPDIR)/tora-moc_toeventquery.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toeventquery.cpp' object='tora-moc_toeventquery.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toeventquery.obj `if test -f 'moc_toeventquery.cpp'; then $(CYGPATH_W) 'moc_toeventquery.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toeventquery.cpp'; fi` tora-moc_toeventquerytask.o: moc_toeventquerytask.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toeventquerytask.o -MD -MP -MF $(DEPDIR)/tora-moc_toeventquerytask.Tpo -c -o tora-moc_toeventquerytask.o `test -f 'moc_toeventquerytask.cpp' || echo '$(srcdir)/'`moc_toeventquerytask.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toeventquerytask.Tpo $(DEPDIR)/tora-moc_toeventquerytask.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toeventquerytask.cpp' object='tora-moc_toeventquerytask.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toeventquerytask.o `test -f 'moc_toeventquerytask.cpp' || echo '$(srcdir)/'`moc_toeventquerytask.cpp tora-moc_toeventquerytask.obj: moc_toeventquerytask.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toeventquerytask.obj -MD -MP -MF $(DEPDIR)/tora-moc_toeventquerytask.Tpo -c -o tora-moc_toeventquerytask.obj `if test -f 'moc_toeventquerytask.cpp'; then $(CYGPATH_W) 'moc_toeventquerytask.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toeventquerytask.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toeventquerytask.Tpo $(DEPDIR)/tora-moc_toeventquerytask.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toeventquerytask.cpp' object='tora-moc_toeventquerytask.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toeventquerytask.obj `if test -f 'moc_toeventquerytask.cpp'; then $(CYGPATH_W) 'moc_toeventquerytask.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toeventquerytask.cpp'; fi` tora-moc_tocurrent.o: moc_tocurrent.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tocurrent.o -MD -MP -MF $(DEPDIR)/tora-moc_tocurrent.Tpo -c -o tora-moc_tocurrent.o `test -f 'moc_tocurrent.cpp' || echo '$(srcdir)/'`moc_tocurrent.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tocurrent.Tpo $(DEPDIR)/tora-moc_tocurrent.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tocurrent.cpp' object='tora-moc_tocurrent.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tocurrent.o `test -f 'moc_tocurrent.cpp' || echo '$(srcdir)/'`moc_tocurrent.cpp tora-moc_tocurrent.obj: moc_tocurrent.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tocurrent.obj -MD -MP -MF $(DEPDIR)/tora-moc_tocurrent.Tpo -c -o tora-moc_tocurrent.obj `if test -f 'moc_tocurrent.cpp'; then $(CYGPATH_W) 'moc_tocurrent.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tocurrent.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tocurrent.Tpo $(DEPDIR)/tora-moc_tocurrent.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tocurrent.cpp' object='tora-moc_tocurrent.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tocurrent.obj `if test -f 'moc_tocurrent.cpp'; then $(CYGPATH_W) 'moc_tocurrent.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tocurrent.cpp'; fi` tora-moc_todatatype.o: moc_todatatype.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_todatatype.o -MD -MP -MF $(DEPDIR)/tora-moc_todatatype.Tpo -c -o tora-moc_todatatype.o `test -f 'moc_todatatype.cpp' || echo '$(srcdir)/'`moc_todatatype.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_todatatype.Tpo $(DEPDIR)/tora-moc_todatatype.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_todatatype.cpp' object='tora-moc_todatatype.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_todatatype.o `test -f 'moc_todatatype.cpp' || echo '$(srcdir)/'`moc_todatatype.cpp tora-moc_todatatype.obj: moc_todatatype.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_todatatype.obj -MD -MP -MF $(DEPDIR)/tora-moc_todatatype.Tpo -c -o tora-moc_todatatype.obj `if test -f 'moc_todatatype.cpp'; then $(CYGPATH_W) 'moc_todatatype.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_todatatype.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_todatatype.Tpo $(DEPDIR)/tora-moc_todatatype.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_todatatype.cpp' object='tora-moc_todatatype.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_todatatype.obj `if test -f 'moc_todatatype.cpp'; then $(CYGPATH_W) 'moc_todatatype.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_todatatype.cpp'; fi` tora-moc_todebug.o: moc_todebug.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_todebug.o -MD -MP -MF $(DEPDIR)/tora-moc_todebug.Tpo -c -o tora-moc_todebug.o `test -f 'moc_todebug.cpp' || echo '$(srcdir)/'`moc_todebug.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_todebug.Tpo $(DEPDIR)/tora-moc_todebug.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_todebug.cpp' object='tora-moc_todebug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_todebug.o `test -f 'moc_todebug.cpp' || echo '$(srcdir)/'`moc_todebug.cpp tora-moc_todebug.obj: moc_todebug.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_todebug.obj -MD -MP -MF $(DEPDIR)/tora-moc_todebug.Tpo -c -o tora-moc_todebug.obj `if test -f 'moc_todebug.cpp'; then $(CYGPATH_W) 'moc_todebug.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_todebug.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_todebug.Tpo $(DEPDIR)/tora-moc_todebug.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_todebug.cpp' object='tora-moc_todebug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_todebug.obj `if test -f 'moc_todebug.cpp'; then $(CYGPATH_W) 'moc_todebug.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_todebug.cpp'; fi` tora-moc_todebugtext.o: moc_todebugtext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_todebugtext.o -MD -MP -MF $(DEPDIR)/tora-moc_todebugtext.Tpo -c -o tora-moc_todebugtext.o `test -f 'moc_todebugtext.cpp' || echo '$(srcdir)/'`moc_todebugtext.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_todebugtext.Tpo $(DEPDIR)/tora-moc_todebugtext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_todebugtext.cpp' object='tora-moc_todebugtext.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_todebugtext.o `test -f 'moc_todebugtext.cpp' || echo '$(srcdir)/'`moc_todebugtext.cpp tora-moc_todebugtext.obj: moc_todebugtext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_todebugtext.obj -MD -MP -MF $(DEPDIR)/tora-moc_todebugtext.Tpo -c -o tora-moc_todebugtext.obj `if test -f 'moc_todebugtext.cpp'; then $(CYGPATH_W) 'moc_todebugtext.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_todebugtext.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_todebugtext.Tpo $(DEPDIR)/tora-moc_todebugtext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_todebugtext.cpp' object='tora-moc_todebugtext.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_todebugtext.obj `if test -f 'moc_todebugtext.cpp'; then $(CYGPATH_W) 'moc_todebugtext.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_todebugtext.cpp'; fi` tora-moc_toeditextensions.o: moc_toeditextensions.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toeditextensions.o -MD -MP -MF $(DEPDIR)/tora-moc_toeditextensions.Tpo -c -o tora-moc_toeditextensions.o `test -f 'moc_toeditextensions.cpp' || echo '$(srcdir)/'`moc_toeditextensions.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toeditextensions.Tpo $(DEPDIR)/tora-moc_toeditextensions.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toeditextensions.cpp' object='tora-moc_toeditextensions.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toeditextensions.o `test -f 'moc_toeditextensions.cpp' || echo '$(srcdir)/'`moc_toeditextensions.cpp tora-moc_toeditextensions.obj: moc_toeditextensions.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toeditextensions.obj -MD -MP -MF $(DEPDIR)/tora-moc_toeditextensions.Tpo -c -o tora-moc_toeditextensions.obj `if test -f 'moc_toeditextensions.cpp'; then $(CYGPATH_W) 'moc_toeditextensions.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toeditextensions.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toeditextensions.Tpo $(DEPDIR)/tora-moc_toeditextensions.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toeditextensions.cpp' object='tora-moc_toeditextensions.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toeditextensions.obj `if test -f 'moc_toeditextensions.cpp'; then $(CYGPATH_W) 'moc_toeditextensions.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toeditextensions.cpp'; fi` tora-moc_tofilesize.o: moc_tofilesize.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tofilesize.o -MD -MP -MF $(DEPDIR)/tora-moc_tofilesize.Tpo -c -o tora-moc_tofilesize.o `test -f 'moc_tofilesize.cpp' || echo '$(srcdir)/'`moc_tofilesize.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tofilesize.Tpo $(DEPDIR)/tora-moc_tofilesize.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tofilesize.cpp' object='tora-moc_tofilesize.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tofilesize.o `test -f 'moc_tofilesize.cpp' || echo '$(srcdir)/'`moc_tofilesize.cpp tora-moc_tofilesize.obj: moc_tofilesize.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tofilesize.obj -MD -MP -MF $(DEPDIR)/tora-moc_tofilesize.Tpo -c -o tora-moc_tofilesize.obj `if test -f 'moc_tofilesize.cpp'; then $(CYGPATH_W) 'moc_tofilesize.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tofilesize.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tofilesize.Tpo $(DEPDIR)/tora-moc_tofilesize.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tofilesize.cpp' object='tora-moc_tofilesize.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tofilesize.obj `if test -f 'moc_tofilesize.cpp'; then $(CYGPATH_W) 'moc_tofilesize.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tofilesize.cpp'; fi` tora-moc_toglobalsetting.o: moc_toglobalsetting.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toglobalsetting.o -MD -MP -MF $(DEPDIR)/tora-moc_toglobalsetting.Tpo -c -o tora-moc_toglobalsetting.o `test -f 'moc_toglobalsetting.cpp' || echo '$(srcdir)/'`moc_toglobalsetting.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toglobalsetting.Tpo $(DEPDIR)/tora-moc_toglobalsetting.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toglobalsetting.cpp' object='tora-moc_toglobalsetting.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toglobalsetting.o `test -f 'moc_toglobalsetting.cpp' || echo '$(srcdir)/'`moc_toglobalsetting.cpp tora-moc_toglobalsetting.obj: moc_toglobalsetting.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toglobalsetting.obj -MD -MP -MF $(DEPDIR)/tora-moc_toglobalsetting.Tpo -c -o tora-moc_toglobalsetting.obj `if test -f 'moc_toglobalsetting.cpp'; then $(CYGPATH_W) 'moc_toglobalsetting.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toglobalsetting.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toglobalsetting.Tpo $(DEPDIR)/tora-moc_toglobalsetting.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toglobalsetting.cpp' object='tora-moc_toglobalsetting.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toglobalsetting.obj `if test -f 'moc_toglobalsetting.cpp'; then $(CYGPATH_W) 'moc_toglobalsetting.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toglobalsetting.cpp'; fi` tora-moc_tohelp.o: moc_tohelp.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tohelp.o -MD -MP -MF $(DEPDIR)/tora-moc_tohelp.Tpo -c -o tora-moc_tohelp.o `test -f 'moc_tohelp.cpp' || echo '$(srcdir)/'`moc_tohelp.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tohelp.Tpo $(DEPDIR)/tora-moc_tohelp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tohelp.cpp' object='tora-moc_tohelp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tohelp.o `test -f 'moc_tohelp.cpp' || echo '$(srcdir)/'`moc_tohelp.cpp tora-moc_tohelp.obj: moc_tohelp.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tohelp.obj -MD -MP -MF $(DEPDIR)/tora-moc_tohelp.Tpo -c -o tora-moc_tohelp.obj `if test -f 'moc_tohelp.cpp'; then $(CYGPATH_W) 'moc_tohelp.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tohelp.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tohelp.Tpo $(DEPDIR)/tora-moc_tohelp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tohelp.cpp' object='tora-moc_tohelp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tohelp.obj `if test -f 'moc_tohelp.cpp'; then $(CYGPATH_W) 'moc_tohelp.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tohelp.cpp'; fi` tora-moc_tohelpsetup.o: moc_tohelpsetup.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tohelpsetup.o -MD -MP -MF $(DEPDIR)/tora-moc_tohelpsetup.Tpo -c -o tora-moc_tohelpsetup.o `test -f 'moc_tohelpsetup.cpp' || echo '$(srcdir)/'`moc_tohelpsetup.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tohelpsetup.Tpo $(DEPDIR)/tora-moc_tohelpsetup.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tohelpsetup.cpp' object='tora-moc_tohelpsetup.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tohelpsetup.o `test -f 'moc_tohelpsetup.cpp' || echo '$(srcdir)/'`moc_tohelpsetup.cpp tora-moc_tohelpsetup.obj: moc_tohelpsetup.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tohelpsetup.obj -MD -MP -MF $(DEPDIR)/tora-moc_tohelpsetup.Tpo -c -o tora-moc_tohelpsetup.obj `if test -f 'moc_tohelpsetup.cpp'; then $(CYGPATH_W) 'moc_tohelpsetup.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tohelpsetup.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tohelpsetup.Tpo $(DEPDIR)/tora-moc_tohelpsetup.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tohelpsetup.cpp' object='tora-moc_tohelpsetup.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tohelpsetup.obj `if test -f 'moc_tohelpsetup.cpp'; then $(CYGPATH_W) 'moc_tohelpsetup.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tohelpsetup.cpp'; fi` tora-moc_tohighlightedtext.o: moc_tohighlightedtext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tohighlightedtext.o -MD -MP -MF $(DEPDIR)/tora-moc_tohighlightedtext.Tpo -c -o tora-moc_tohighlightedtext.o `test -f 'moc_tohighlightedtext.cpp' || echo '$(srcdir)/'`moc_tohighlightedtext.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tohighlightedtext.Tpo $(DEPDIR)/tora-moc_tohighlightedtext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tohighlightedtext.cpp' object='tora-moc_tohighlightedtext.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tohighlightedtext.o `test -f 'moc_tohighlightedtext.cpp' || echo '$(srcdir)/'`moc_tohighlightedtext.cpp tora-moc_tohighlightedtext.obj: moc_tohighlightedtext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tohighlightedtext.obj -MD -MP -MF $(DEPDIR)/tora-moc_tohighlightedtext.Tpo -c -o tora-moc_tohighlightedtext.obj `if test -f 'moc_tohighlightedtext.cpp'; then $(CYGPATH_W) 'moc_tohighlightedtext.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tohighlightedtext.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tohighlightedtext.Tpo $(DEPDIR)/tora-moc_tohighlightedtext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tohighlightedtext.cpp' object='tora-moc_tohighlightedtext.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tohighlightedtext.obj `if test -f 'moc_tohighlightedtext.cpp'; then $(CYGPATH_W) 'moc_tohighlightedtext.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tohighlightedtext.cpp'; fi` tora-moc_toinvalid.o: moc_toinvalid.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toinvalid.o -MD -MP -MF $(DEPDIR)/tora-moc_toinvalid.Tpo -c -o tora-moc_toinvalid.o `test -f 'moc_toinvalid.cpp' || echo '$(srcdir)/'`moc_toinvalid.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toinvalid.Tpo $(DEPDIR)/tora-moc_toinvalid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toinvalid.cpp' object='tora-moc_toinvalid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toinvalid.o `test -f 'moc_toinvalid.cpp' || echo '$(srcdir)/'`moc_toinvalid.cpp tora-moc_toinvalid.obj: moc_toinvalid.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toinvalid.obj -MD -MP -MF $(DEPDIR)/tora-moc_toinvalid.Tpo -c -o tora-moc_toinvalid.obj `if test -f 'moc_toinvalid.cpp'; then $(CYGPATH_W) 'moc_toinvalid.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toinvalid.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toinvalid.Tpo $(DEPDIR)/tora-moc_toinvalid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toinvalid.cpp' object='tora-moc_toinvalid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toinvalid.obj `if test -f 'moc_toinvalid.cpp'; then $(CYGPATH_W) 'moc_toinvalid.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toinvalid.cpp'; fi` tora-moc_tolegendchart.o: moc_tolegendchart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tolegendchart.o -MD -MP -MF $(DEPDIR)/tora-moc_tolegendchart.Tpo -c -o tora-moc_tolegendchart.o `test -f 'moc_tolegendchart.cpp' || echo '$(srcdir)/'`moc_tolegendchart.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tolegendchart.Tpo $(DEPDIR)/tora-moc_tolegendchart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tolegendchart.cpp' object='tora-moc_tolegendchart.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tolegendchart.o `test -f 'moc_tolegendchart.cpp' || echo '$(srcdir)/'`moc_tolegendchart.cpp tora-moc_tolegendchart.obj: moc_tolegendchart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tolegendchart.obj -MD -MP -MF $(DEPDIR)/tora-moc_tolegendchart.Tpo -c -o tora-moc_tolegendchart.obj `if test -f 'moc_tolegendchart.cpp'; then $(CYGPATH_W) 'moc_tolegendchart.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tolegendchart.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tolegendchart.Tpo $(DEPDIR)/tora-moc_tolegendchart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tolegendchart.cpp' object='tora-moc_tolegendchart.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tolegendchart.obj `if test -f 'moc_tolegendchart.cpp'; then $(CYGPATH_W) 'moc_tolegendchart.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tolegendchart.cpp'; fi` tora-moc_tolinechart.o: moc_tolinechart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tolinechart.o -MD -MP -MF $(DEPDIR)/tora-moc_tolinechart.Tpo -c -o tora-moc_tolinechart.o `test -f 'moc_tolinechart.cpp' || echo '$(srcdir)/'`moc_tolinechart.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tolinechart.Tpo $(DEPDIR)/tora-moc_tolinechart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tolinechart.cpp' object='tora-moc_tolinechart.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tolinechart.o `test -f 'moc_tolinechart.cpp' || echo '$(srcdir)/'`moc_tolinechart.cpp tora-moc_tolinechart.obj: moc_tolinechart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tolinechart.obj -MD -MP -MF $(DEPDIR)/tora-moc_tolinechart.Tpo -c -o tora-moc_tolinechart.obj `if test -f 'moc_tolinechart.cpp'; then $(CYGPATH_W) 'moc_tolinechart.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tolinechart.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tolinechart.Tpo $(DEPDIR)/tora-moc_tolinechart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tolinechart.cpp' object='tora-moc_tolinechart.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tolinechart.obj `if test -f 'moc_tolinechart.cpp'; then $(CYGPATH_W) 'moc_tolinechart.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tolinechart.cpp'; fi` tora-moc_tomain.o: moc_tomain.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tomain.o -MD -MP -MF $(DEPDIR)/tora-moc_tomain.Tpo -c -o tora-moc_tomain.o `test -f 'moc_tomain.cpp' || echo '$(srcdir)/'`moc_tomain.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tomain.Tpo $(DEPDIR)/tora-moc_tomain.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tomain.cpp' object='tora-moc_tomain.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tomain.o `test -f 'moc_tomain.cpp' || echo '$(srcdir)/'`moc_tomain.cpp tora-moc_tomain.obj: moc_tomain.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tomain.obj -MD -MP -MF $(DEPDIR)/tora-moc_tomain.Tpo -c -o tora-moc_tomain.obj `if test -f 'moc_tomain.cpp'; then $(CYGPATH_W) 'moc_tomain.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tomain.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tomain.Tpo $(DEPDIR)/tora-moc_tomain.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tomain.cpp' object='tora-moc_tomain.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tomain.obj `if test -f 'moc_tomain.cpp'; then $(CYGPATH_W) 'moc_tomain.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tomain.cpp'; fi` tora-moc_tomainwindow.o: moc_tomainwindow.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tomainwindow.o -MD -MP -MF $(DEPDIR)/tora-moc_tomainwindow.Tpo -c -o tora-moc_tomainwindow.o `test -f 'moc_tomainwindow.cpp' || echo '$(srcdir)/'`moc_tomainwindow.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tomainwindow.Tpo $(DEPDIR)/tora-moc_tomainwindow.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tomainwindow.cpp' object='tora-moc_tomainwindow.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tomainwindow.o `test -f 'moc_tomainwindow.cpp' || echo '$(srcdir)/'`moc_tomainwindow.cpp tora-moc_tomainwindow.obj: moc_tomainwindow.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tomainwindow.obj -MD -MP -MF $(DEPDIR)/tora-moc_tomainwindow.Tpo -c -o tora-moc_tomainwindow.obj `if test -f 'moc_tomainwindow.cpp'; then $(CYGPATH_W) 'moc_tomainwindow.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tomainwindow.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tomainwindow.Tpo $(DEPDIR)/tora-moc_tomainwindow.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tomainwindow.cpp' object='tora-moc_tomainwindow.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tomainwindow.obj `if test -f 'moc_tomainwindow.cpp'; then $(CYGPATH_W) 'moc_tomainwindow.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tomainwindow.cpp'; fi` tora-moc_tomarkedtext.o: moc_tomarkedtext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tomarkedtext.o -MD -MP -MF $(DEPDIR)/tora-moc_tomarkedtext.Tpo -c -o tora-moc_tomarkedtext.o `test -f 'moc_tomarkedtext.cpp' || echo '$(srcdir)/'`moc_tomarkedtext.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tomarkedtext.Tpo $(DEPDIR)/tora-moc_tomarkedtext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tomarkedtext.cpp' object='tora-moc_tomarkedtext.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tomarkedtext.o `test -f 'moc_tomarkedtext.cpp' || echo '$(srcdir)/'`moc_tomarkedtext.cpp tora-moc_tomarkedtext.obj: moc_tomarkedtext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tomarkedtext.obj -MD -MP -MF $(DEPDIR)/tora-moc_tomarkedtext.Tpo -c -o tora-moc_tomarkedtext.obj `if test -f 'moc_tomarkedtext.cpp'; then $(CYGPATH_W) 'moc_tomarkedtext.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tomarkedtext.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tomarkedtext.Tpo $(DEPDIR)/tora-moc_tomarkedtext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tomarkedtext.cpp' object='tora-moc_tomarkedtext.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tomarkedtext.obj `if test -f 'moc_tomarkedtext.cpp'; then $(CYGPATH_W) 'moc_tomarkedtext.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tomarkedtext.cpp'; fi` tora-moc_tomemoeditor.o: moc_tomemoeditor.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tomemoeditor.o -MD -MP -MF $(DEPDIR)/tora-moc_tomemoeditor.Tpo -c -o tora-moc_tomemoeditor.o `test -f 'moc_tomemoeditor.cpp' || echo '$(srcdir)/'`moc_tomemoeditor.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tomemoeditor.Tpo $(DEPDIR)/tora-moc_tomemoeditor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tomemoeditor.cpp' object='tora-moc_tomemoeditor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tomemoeditor.o `test -f 'moc_tomemoeditor.cpp' || echo '$(srcdir)/'`moc_tomemoeditor.cpp tora-moc_tomemoeditor.obj: moc_tomemoeditor.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tomemoeditor.obj -MD -MP -MF $(DEPDIR)/tora-moc_tomemoeditor.Tpo -c -o tora-moc_tomemoeditor.obj `if test -f 'moc_tomemoeditor.cpp'; then $(CYGPATH_W) 'moc_tomemoeditor.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tomemoeditor.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tomemoeditor.Tpo $(DEPDIR)/tora-moc_tomemoeditor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tomemoeditor.cpp' object='tora-moc_tomemoeditor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tomemoeditor.obj `if test -f 'moc_tomemoeditor.cpp'; then $(CYGPATH_W) 'moc_tomemoeditor.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tomemoeditor.cpp'; fi` tora-moc_tomodeleditor.o: moc_tomodeleditor.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tomodeleditor.o -MD -MP -MF $(DEPDIR)/tora-moc_tomodeleditor.Tpo -c -o tora-moc_tomodeleditor.o `test -f 'moc_tomodeleditor.cpp' || echo '$(srcdir)/'`moc_tomodeleditor.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tomodeleditor.Tpo $(DEPDIR)/tora-moc_tomodeleditor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tomodeleditor.cpp' object='tora-moc_tomodeleditor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tomodeleditor.o `test -f 'moc_tomodeleditor.cpp' || echo '$(srcdir)/'`moc_tomodeleditor.cpp tora-moc_tomodeleditor.obj: moc_tomodeleditor.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tomodeleditor.obj -MD -MP -MF $(DEPDIR)/tora-moc_tomodeleditor.Tpo -c -o tora-moc_tomodeleditor.obj `if test -f 'moc_tomodeleditor.cpp'; then $(CYGPATH_W) 'moc_tomodeleditor.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tomodeleditor.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tomodeleditor.Tpo $(DEPDIR)/tora-moc_tomodeleditor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tomodeleditor.cpp' object='tora-moc_tomodeleditor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tomodeleditor.obj `if test -f 'moc_tomodeleditor.cpp'; then $(CYGPATH_W) 'moc_tomodeleditor.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tomodeleditor.cpp'; fi` tora-moc_tomessage.o: moc_tomessage.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tomessage.o -MD -MP -MF $(DEPDIR)/tora-moc_tomessage.Tpo -c -o tora-moc_tomessage.o `test -f 'moc_tomessage.cpp' || echo '$(srcdir)/'`moc_tomessage.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tomessage.Tpo $(DEPDIR)/tora-moc_tomessage.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tomessage.cpp' object='tora-moc_tomessage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tomessage.o `test -f 'moc_tomessage.cpp' || echo '$(srcdir)/'`moc_tomessage.cpp tora-moc_tomessage.obj: moc_tomessage.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tomessage.obj -MD -MP -MF $(DEPDIR)/tora-moc_tomessage.Tpo -c -o tora-moc_tomessage.obj `if test -f 'moc_tomessage.cpp'; then $(CYGPATH_W) 'moc_tomessage.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tomessage.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tomessage.Tpo $(DEPDIR)/tora-moc_tomessage.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tomessage.cpp' object='tora-moc_tomessage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tomessage.obj `if test -f 'moc_tomessage.cpp'; then $(CYGPATH_W) 'moc_tomessage.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tomessage.cpp'; fi` tora-moc_tonewconnection.o: moc_tonewconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tonewconnection.o -MD -MP -MF $(DEPDIR)/tora-moc_tonewconnection.Tpo -c -o tora-moc_tonewconnection.o `test -f 'moc_tonewconnection.cpp' || echo '$(srcdir)/'`moc_tonewconnection.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tonewconnection.Tpo $(DEPDIR)/tora-moc_tonewconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tonewconnection.cpp' object='tora-moc_tonewconnection.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tonewconnection.o `test -f 'moc_tonewconnection.cpp' || echo '$(srcdir)/'`moc_tonewconnection.cpp tora-moc_tonewconnection.obj: moc_tonewconnection.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tonewconnection.obj -MD -MP -MF $(DEPDIR)/tora-moc_tonewconnection.Tpo -c -o tora-moc_tonewconnection.obj `if test -f 'moc_tonewconnection.cpp'; then $(CYGPATH_W) 'moc_tonewconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tonewconnection.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tonewconnection.Tpo $(DEPDIR)/tora-moc_tonewconnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tonewconnection.cpp' object='tora-moc_tonewconnection.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tonewconnection.obj `if test -f 'moc_tonewconnection.cpp'; then $(CYGPATH_W) 'moc_tonewconnection.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tonewconnection.cpp'; fi` tora-moc_tooutput.o: moc_tooutput.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tooutput.o -MD -MP -MF $(DEPDIR)/tora-moc_tooutput.Tpo -c -o tora-moc_tooutput.o `test -f 'moc_tooutput.cpp' || echo '$(srcdir)/'`moc_tooutput.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tooutput.Tpo $(DEPDIR)/tora-moc_tooutput.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tooutput.cpp' object='tora-moc_tooutput.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tooutput.o `test -f 'moc_tooutput.cpp' || echo '$(srcdir)/'`moc_tooutput.cpp tora-moc_tooutput.obj: moc_tooutput.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tooutput.obj -MD -MP -MF $(DEPDIR)/tora-moc_tooutput.Tpo -c -o tora-moc_tooutput.obj `if test -f 'moc_tooutput.cpp'; then $(CYGPATH_W) 'moc_tooutput.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tooutput.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tooutput.Tpo $(DEPDIR)/tora-moc_tooutput.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tooutput.cpp' object='tora-moc_tooutput.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tooutput.obj `if test -f 'moc_tooutput.cpp'; then $(CYGPATH_W) 'moc_tooutput.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tooutput.cpp'; fi` tora-moc_toparamget.o: moc_toparamget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toparamget.o -MD -MP -MF $(DEPDIR)/tora-moc_toparamget.Tpo -c -o tora-moc_toparamget.o `test -f 'moc_toparamget.cpp' || echo '$(srcdir)/'`moc_toparamget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toparamget.Tpo $(DEPDIR)/tora-moc_toparamget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toparamget.cpp' object='tora-moc_toparamget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toparamget.o `test -f 'moc_toparamget.cpp' || echo '$(srcdir)/'`moc_toparamget.cpp tora-moc_toparamget.obj: moc_toparamget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toparamget.obj -MD -MP -MF $(DEPDIR)/tora-moc_toparamget.Tpo -c -o tora-moc_toparamget.obj `if test -f 'moc_toparamget.cpp'; then $(CYGPATH_W) 'moc_toparamget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toparamget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toparamget.Tpo $(DEPDIR)/tora-moc_toparamget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toparamget.cpp' object='tora-moc_toparamget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toparamget.obj `if test -f 'moc_toparamget.cpp'; then $(CYGPATH_W) 'moc_toparamget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toparamget.cpp'; fi` tora-moc_topiechart.o: moc_topiechart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_topiechart.o -MD -MP -MF $(DEPDIR)/tora-moc_topiechart.Tpo -c -o tora-moc_topiechart.o `test -f 'moc_topiechart.cpp' || echo '$(srcdir)/'`moc_topiechart.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_topiechart.Tpo $(DEPDIR)/tora-moc_topiechart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_topiechart.cpp' object='tora-moc_topiechart.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_topiechart.o `test -f 'moc_topiechart.cpp' || echo '$(srcdir)/'`moc_topiechart.cpp tora-moc_topiechart.obj: moc_topiechart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_topiechart.obj -MD -MP -MF $(DEPDIR)/tora-moc_topiechart.Tpo -c -o tora-moc_topiechart.obj `if test -f 'moc_topiechart.cpp'; then $(CYGPATH_W) 'moc_topiechart.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_topiechart.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_topiechart.Tpo $(DEPDIR)/tora-moc_topiechart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_topiechart.cpp' object='tora-moc_topiechart.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_topiechart.obj `if test -f 'moc_topiechart.cpp'; then $(CYGPATH_W) 'moc_topiechart.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_topiechart.cpp'; fi` tora-moc_toplsqleditor.o: moc_toplsqleditor.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toplsqleditor.o -MD -MP -MF $(DEPDIR)/tora-moc_toplsqleditor.Tpo -c -o tora-moc_toplsqleditor.o `test -f 'moc_toplsqleditor.cpp' || echo '$(srcdir)/'`moc_toplsqleditor.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toplsqleditor.Tpo $(DEPDIR)/tora-moc_toplsqleditor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toplsqleditor.cpp' object='tora-moc_toplsqleditor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toplsqleditor.o `test -f 'moc_toplsqleditor.cpp' || echo '$(srcdir)/'`moc_toplsqleditor.cpp tora-moc_toplsqleditor.obj: moc_toplsqleditor.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toplsqleditor.obj -MD -MP -MF $(DEPDIR)/tora-moc_toplsqleditor.Tpo -c -o tora-moc_toplsqleditor.obj `if test -f 'moc_toplsqleditor.cpp'; then $(CYGPATH_W) 'moc_toplsqleditor.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toplsqleditor.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toplsqleditor.Tpo $(DEPDIR)/tora-moc_toplsqleditor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toplsqleditor.cpp' object='tora-moc_toplsqleditor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toplsqleditor.obj `if test -f 'moc_toplsqleditor.cpp'; then $(CYGPATH_W) 'moc_toplsqleditor.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toplsqleditor.cpp'; fi` tora-moc_toplsqltext.o: moc_toplsqltext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toplsqltext.o -MD -MP -MF $(DEPDIR)/tora-moc_toplsqltext.Tpo -c -o tora-moc_toplsqltext.o `test -f 'moc_toplsqltext.cpp' || echo '$(srcdir)/'`moc_toplsqltext.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toplsqltext.Tpo $(DEPDIR)/tora-moc_toplsqltext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toplsqltext.cpp' object='tora-moc_toplsqltext.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toplsqltext.o `test -f 'moc_toplsqltext.cpp' || echo '$(srcdir)/'`moc_toplsqltext.cpp tora-moc_toplsqltext.obj: moc_toplsqltext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toplsqltext.obj -MD -MP -MF $(DEPDIR)/tora-moc_toplsqltext.Tpo -c -o tora-moc_toplsqltext.obj `if test -f 'moc_toplsqltext.cpp'; then $(CYGPATH_W) 'moc_toplsqltext.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toplsqltext.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toplsqltext.Tpo $(DEPDIR)/tora-moc_toplsqltext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toplsqltext.cpp' object='tora-moc_toplsqltext.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toplsqltext.obj `if test -f 'moc_toplsqltext.cpp'; then $(CYGPATH_W) 'moc_toplsqltext.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toplsqltext.cpp'; fi` tora-moc_topreferences.o: moc_topreferences.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_topreferences.o -MD -MP -MF $(DEPDIR)/tora-moc_topreferences.Tpo -c -o tora-moc_topreferences.o `test -f 'moc_topreferences.cpp' || echo '$(srcdir)/'`moc_topreferences.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_topreferences.Tpo $(DEPDIR)/tora-moc_topreferences.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_topreferences.cpp' object='tora-moc_topreferences.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_topreferences.o `test -f 'moc_topreferences.cpp' || echo '$(srcdir)/'`moc_topreferences.cpp tora-moc_topreferences.obj: moc_topreferences.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_topreferences.obj -MD -MP -MF $(DEPDIR)/tora-moc_topreferences.Tpo -c -o tora-moc_topreferences.obj `if test -f 'moc_topreferences.cpp'; then $(CYGPATH_W) 'moc_topreferences.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_topreferences.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_topreferences.Tpo $(DEPDIR)/tora-moc_topreferences.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_topreferences.cpp' object='tora-moc_topreferences.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_topreferences.obj `if test -f 'moc_topreferences.cpp'; then $(CYGPATH_W) 'moc_topreferences.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_topreferences.cpp'; fi` tora-moc_toprofiler.o: moc_toprofiler.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toprofiler.o -MD -MP -MF $(DEPDIR)/tora-moc_toprofiler.Tpo -c -o tora-moc_toprofiler.o `test -f 'moc_toprofiler.cpp' || echo '$(srcdir)/'`moc_toprofiler.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toprofiler.Tpo $(DEPDIR)/tora-moc_toprofiler.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toprofiler.cpp' object='tora-moc_toprofiler.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toprofiler.o `test -f 'moc_toprofiler.cpp' || echo '$(srcdir)/'`moc_toprofiler.cpp tora-moc_toprofiler.obj: moc_toprofiler.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toprofiler.obj -MD -MP -MF $(DEPDIR)/tora-moc_toprofiler.Tpo -c -o tora-moc_toprofiler.obj `if test -f 'moc_toprofiler.cpp'; then $(CYGPATH_W) 'moc_toprofiler.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toprofiler.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toprofiler.Tpo $(DEPDIR)/tora-moc_toprofiler.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toprofiler.cpp' object='tora-moc_toprofiler.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toprofiler.obj `if test -f 'moc_toprofiler.cpp'; then $(CYGPATH_W) 'moc_toprofiler.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toprofiler.cpp'; fi` tora-moc_toproject.o: moc_toproject.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toproject.o -MD -MP -MF $(DEPDIR)/tora-moc_toproject.Tpo -c -o tora-moc_toproject.o `test -f 'moc_toproject.cpp' || echo '$(srcdir)/'`moc_toproject.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toproject.Tpo $(DEPDIR)/tora-moc_toproject.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toproject.cpp' object='tora-moc_toproject.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toproject.o `test -f 'moc_toproject.cpp' || echo '$(srcdir)/'`moc_toproject.cpp tora-moc_toproject.obj: moc_toproject.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toproject.obj -MD -MP -MF $(DEPDIR)/tora-moc_toproject.Tpo -c -o tora-moc_toproject.obj `if test -f 'moc_toproject.cpp'; then $(CYGPATH_W) 'moc_toproject.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toproject.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toproject.Tpo $(DEPDIR)/tora-moc_toproject.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toproject.cpp' object='tora-moc_toproject.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toproject.obj `if test -f 'moc_toproject.cpp'; then $(CYGPATH_W) 'moc_toproject.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toproject.cpp'; fi` tora-moc_toresult.o: moc_toresult.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresult.o -MD -MP -MF $(DEPDIR)/tora-moc_toresult.Tpo -c -o tora-moc_toresult.o `test -f 'moc_toresult.cpp' || echo '$(srcdir)/'`moc_toresult.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresult.Tpo $(DEPDIR)/tora-moc_toresult.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresult.cpp' object='tora-moc_toresult.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresult.o `test -f 'moc_toresult.cpp' || echo '$(srcdir)/'`moc_toresult.cpp tora-moc_toresult.obj: moc_toresult.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresult.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresult.Tpo -c -o tora-moc_toresult.obj `if test -f 'moc_toresult.cpp'; then $(CYGPATH_W) 'moc_toresult.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresult.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresult.Tpo $(DEPDIR)/tora-moc_toresult.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresult.cpp' object='tora-moc_toresult.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresult.obj `if test -f 'moc_toresult.cpp'; then $(CYGPATH_W) 'moc_toresult.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresult.cpp'; fi` tora-moc_toresultbar.o: moc_toresultbar.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultbar.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultbar.Tpo -c -o tora-moc_toresultbar.o `test -f 'moc_toresultbar.cpp' || echo '$(srcdir)/'`moc_toresultbar.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultbar.Tpo $(DEPDIR)/tora-moc_toresultbar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultbar.cpp' object='tora-moc_toresultbar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultbar.o `test -f 'moc_toresultbar.cpp' || echo '$(srcdir)/'`moc_toresultbar.cpp tora-moc_toresultbar.obj: moc_toresultbar.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultbar.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultbar.Tpo -c -o tora-moc_toresultbar.obj `if test -f 'moc_toresultbar.cpp'; then $(CYGPATH_W) 'moc_toresultbar.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultbar.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultbar.Tpo $(DEPDIR)/tora-moc_toresultbar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultbar.cpp' object='tora-moc_toresultbar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultbar.obj `if test -f 'moc_toresultbar.cpp'; then $(CYGPATH_W) 'moc_toresultbar.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultbar.cpp'; fi` tora-moc_toresultcols.o: moc_toresultcols.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultcols.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultcols.Tpo -c -o tora-moc_toresultcols.o `test -f 'moc_toresultcols.cpp' || echo '$(srcdir)/'`moc_toresultcols.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultcols.Tpo $(DEPDIR)/tora-moc_toresultcols.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultcols.cpp' object='tora-moc_toresultcols.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultcols.o `test -f 'moc_toresultcols.cpp' || echo '$(srcdir)/'`moc_toresultcols.cpp tora-moc_toresultcols.obj: moc_toresultcols.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultcols.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultcols.Tpo -c -o tora-moc_toresultcols.obj `if test -f 'moc_toresultcols.cpp'; then $(CYGPATH_W) 'moc_toresultcols.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultcols.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultcols.Tpo $(DEPDIR)/tora-moc_toresultcols.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultcols.cpp' object='tora-moc_toresultcols.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultcols.obj `if test -f 'moc_toresultcols.cpp'; then $(CYGPATH_W) 'moc_toresultcols.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultcols.cpp'; fi` tora-moc_toresultcolscomment.o: moc_toresultcolscomment.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultcolscomment.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultcolscomment.Tpo -c -o tora-moc_toresultcolscomment.o `test -f 'moc_toresultcolscomment.cpp' || echo '$(srcdir)/'`moc_toresultcolscomment.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultcolscomment.Tpo $(DEPDIR)/tora-moc_toresultcolscomment.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultcolscomment.cpp' object='tora-moc_toresultcolscomment.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultcolscomment.o `test -f 'moc_toresultcolscomment.cpp' || echo '$(srcdir)/'`moc_toresultcolscomment.cpp tora-moc_toresultcolscomment.obj: moc_toresultcolscomment.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultcolscomment.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultcolscomment.Tpo -c -o tora-moc_toresultcolscomment.obj `if test -f 'moc_toresultcolscomment.cpp'; then $(CYGPATH_W) 'moc_toresultcolscomment.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultcolscomment.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultcolscomment.Tpo $(DEPDIR)/tora-moc_toresultcolscomment.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultcolscomment.cpp' object='tora-moc_toresultcolscomment.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultcolscomment.obj `if test -f 'moc_toresultcolscomment.cpp'; then $(CYGPATH_W) 'moc_toresultcolscomment.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultcolscomment.cpp'; fi` tora-moc_toresultcombo.o: moc_toresultcombo.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultcombo.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultcombo.Tpo -c -o tora-moc_toresultcombo.o `test -f 'moc_toresultcombo.cpp' || echo '$(srcdir)/'`moc_toresultcombo.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultcombo.Tpo $(DEPDIR)/tora-moc_toresultcombo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultcombo.cpp' object='tora-moc_toresultcombo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultcombo.o `test -f 'moc_toresultcombo.cpp' || echo '$(srcdir)/'`moc_toresultcombo.cpp tora-moc_toresultcombo.obj: moc_toresultcombo.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultcombo.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultcombo.Tpo -c -o tora-moc_toresultcombo.obj `if test -f 'moc_toresultcombo.cpp'; then $(CYGPATH_W) 'moc_toresultcombo.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultcombo.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultcombo.Tpo $(DEPDIR)/tora-moc_toresultcombo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultcombo.cpp' object='tora-moc_toresultcombo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultcombo.obj `if test -f 'moc_toresultcombo.cpp'; then $(CYGPATH_W) 'moc_toresultcombo.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultcombo.cpp'; fi` tora-moc_toresultschema.o: moc_toresultschema.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultschema.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultschema.Tpo -c -o tora-moc_toresultschema.o `test -f 'moc_toresultschema.cpp' || echo '$(srcdir)/'`moc_toresultschema.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultschema.Tpo $(DEPDIR)/tora-moc_toresultschema.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultschema.cpp' object='tora-moc_toresultschema.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultschema.o `test -f 'moc_toresultschema.cpp' || echo '$(srcdir)/'`moc_toresultschema.cpp tora-moc_toresultschema.obj: moc_toresultschema.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultschema.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultschema.Tpo -c -o tora-moc_toresultschema.obj `if test -f 'moc_toresultschema.cpp'; then $(CYGPATH_W) 'moc_toresultschema.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultschema.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultschema.Tpo $(DEPDIR)/tora-moc_toresultschema.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultschema.cpp' object='tora-moc_toresultschema.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultschema.obj `if test -f 'moc_toresultschema.cpp'; then $(CYGPATH_W) 'moc_toresultschema.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultschema.cpp'; fi` tora-moc_toresultdepend.o: moc_toresultdepend.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultdepend.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultdepend.Tpo -c -o tora-moc_toresultdepend.o `test -f 'moc_toresultdepend.cpp' || echo '$(srcdir)/'`moc_toresultdepend.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultdepend.Tpo $(DEPDIR)/tora-moc_toresultdepend.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultdepend.cpp' object='tora-moc_toresultdepend.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultdepend.o `test -f 'moc_toresultdepend.cpp' || echo '$(srcdir)/'`moc_toresultdepend.cpp tora-moc_toresultdepend.obj: moc_toresultdepend.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultdepend.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultdepend.Tpo -c -o tora-moc_toresultdepend.obj `if test -f 'moc_toresultdepend.cpp'; then $(CYGPATH_W) 'moc_toresultdepend.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultdepend.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultdepend.Tpo $(DEPDIR)/tora-moc_toresultdepend.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultdepend.cpp' object='tora-moc_toresultdepend.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultdepend.obj `if test -f 'moc_toresultdepend.cpp'; then $(CYGPATH_W) 'moc_toresultdepend.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultdepend.cpp'; fi` tora-moc_toresultextract.o: moc_toresultextract.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultextract.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultextract.Tpo -c -o tora-moc_toresultextract.o `test -f 'moc_toresultextract.cpp' || echo '$(srcdir)/'`moc_toresultextract.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultextract.Tpo $(DEPDIR)/tora-moc_toresultextract.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultextract.cpp' object='tora-moc_toresultextract.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultextract.o `test -f 'moc_toresultextract.cpp' || echo '$(srcdir)/'`moc_toresultextract.cpp tora-moc_toresultextract.obj: moc_toresultextract.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultextract.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultextract.Tpo -c -o tora-moc_toresultextract.obj `if test -f 'moc_toresultextract.cpp'; then $(CYGPATH_W) 'moc_toresultextract.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultextract.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultextract.Tpo $(DEPDIR)/tora-moc_toresultextract.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultextract.cpp' object='tora-moc_toresultextract.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultextract.obj `if test -f 'moc_toresultextract.cpp'; then $(CYGPATH_W) 'moc_toresultextract.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultextract.cpp'; fi` tora-moc_toresultfield.o: moc_toresultfield.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultfield.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultfield.Tpo -c -o tora-moc_toresultfield.o `test -f 'moc_toresultfield.cpp' || echo '$(srcdir)/'`moc_toresultfield.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultfield.Tpo $(DEPDIR)/tora-moc_toresultfield.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultfield.cpp' object='tora-moc_toresultfield.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultfield.o `test -f 'moc_toresultfield.cpp' || echo '$(srcdir)/'`moc_toresultfield.cpp tora-moc_toresultfield.obj: moc_toresultfield.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultfield.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultfield.Tpo -c -o tora-moc_toresultfield.obj `if test -f 'moc_toresultfield.cpp'; then $(CYGPATH_W) 'moc_toresultfield.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultfield.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultfield.Tpo $(DEPDIR)/tora-moc_toresultfield.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultfield.cpp' object='tora-moc_toresultfield.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultfield.obj `if test -f 'moc_toresultfield.cpp'; then $(CYGPATH_W) 'moc_toresultfield.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultfield.cpp'; fi` tora-moc_toresultitem.o: moc_toresultitem.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultitem.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultitem.Tpo -c -o tora-moc_toresultitem.o `test -f 'moc_toresultitem.cpp' || echo '$(srcdir)/'`moc_toresultitem.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultitem.Tpo $(DEPDIR)/tora-moc_toresultitem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultitem.cpp' object='tora-moc_toresultitem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultitem.o `test -f 'moc_toresultitem.cpp' || echo '$(srcdir)/'`moc_toresultitem.cpp tora-moc_toresultitem.obj: moc_toresultitem.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultitem.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultitem.Tpo -c -o tora-moc_toresultitem.obj `if test -f 'moc_toresultitem.cpp'; then $(CYGPATH_W) 'moc_toresultitem.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultitem.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultitem.Tpo $(DEPDIR)/tora-moc_toresultitem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultitem.cpp' object='tora-moc_toresultitem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultitem.obj `if test -f 'moc_toresultitem.cpp'; then $(CYGPATH_W) 'moc_toresultitem.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultitem.cpp'; fi` tora-moc_toresultlabel.o: moc_toresultlabel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultlabel.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultlabel.Tpo -c -o tora-moc_toresultlabel.o `test -f 'moc_toresultlabel.cpp' || echo '$(srcdir)/'`moc_toresultlabel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultlabel.Tpo $(DEPDIR)/tora-moc_toresultlabel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultlabel.cpp' object='tora-moc_toresultlabel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultlabel.o `test -f 'moc_toresultlabel.cpp' || echo '$(srcdir)/'`moc_toresultlabel.cpp tora-moc_toresultlabel.obj: moc_toresultlabel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultlabel.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultlabel.Tpo -c -o tora-moc_toresultlabel.obj `if test -f 'moc_toresultlabel.cpp'; then $(CYGPATH_W) 'moc_toresultlabel.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultlabel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultlabel.Tpo $(DEPDIR)/tora-moc_toresultlabel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultlabel.cpp' object='tora-moc_toresultlabel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultlabel.obj `if test -f 'moc_toresultlabel.cpp'; then $(CYGPATH_W) 'moc_toresultlabel.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultlabel.cpp'; fi` tora-moc_toresultline.o: moc_toresultline.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultline.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultline.Tpo -c -o tora-moc_toresultline.o `test -f 'moc_toresultline.cpp' || echo '$(srcdir)/'`moc_toresultline.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultline.Tpo $(DEPDIR)/tora-moc_toresultline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultline.cpp' object='tora-moc_toresultline.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultline.o `test -f 'moc_toresultline.cpp' || echo '$(srcdir)/'`moc_toresultline.cpp tora-moc_toresultline.obj: moc_toresultline.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultline.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultline.Tpo -c -o tora-moc_toresultline.obj `if test -f 'moc_toresultline.cpp'; then $(CYGPATH_W) 'moc_toresultline.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultline.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultline.Tpo $(DEPDIR)/tora-moc_toresultline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultline.cpp' object='tora-moc_toresultline.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultline.obj `if test -f 'moc_toresultline.cpp'; then $(CYGPATH_W) 'moc_toresultline.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultline.cpp'; fi` tora-moc_toresultlock.o: moc_toresultlock.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultlock.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultlock.Tpo -c -o tora-moc_toresultlock.o `test -f 'moc_toresultlock.cpp' || echo '$(srcdir)/'`moc_toresultlock.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultlock.Tpo $(DEPDIR)/tora-moc_toresultlock.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultlock.cpp' object='tora-moc_toresultlock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultlock.o `test -f 'moc_toresultlock.cpp' || echo '$(srcdir)/'`moc_toresultlock.cpp tora-moc_toresultlock.obj: moc_toresultlock.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultlock.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultlock.Tpo -c -o tora-moc_toresultlock.obj `if test -f 'moc_toresultlock.cpp'; then $(CYGPATH_W) 'moc_toresultlock.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultlock.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultlock.Tpo $(DEPDIR)/tora-moc_toresultlock.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultlock.cpp' object='tora-moc_toresultlock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultlock.obj `if test -f 'moc_toresultlock.cpp'; then $(CYGPATH_W) 'moc_toresultlock.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultlock.cpp'; fi` tora-moc_toresultlong.o: moc_toresultlong.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultlong.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultlong.Tpo -c -o tora-moc_toresultlong.o `test -f 'moc_toresultlong.cpp' || echo '$(srcdir)/'`moc_toresultlong.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultlong.Tpo $(DEPDIR)/tora-moc_toresultlong.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultlong.cpp' object='tora-moc_toresultlong.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultlong.o `test -f 'moc_toresultlong.cpp' || echo '$(srcdir)/'`moc_toresultlong.cpp tora-moc_toresultlong.obj: moc_toresultlong.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultlong.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultlong.Tpo -c -o tora-moc_toresultlong.obj `if test -f 'moc_toresultlong.cpp'; then $(CYGPATH_W) 'moc_toresultlong.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultlong.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultlong.Tpo $(DEPDIR)/tora-moc_toresultlong.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultlong.cpp' object='tora-moc_toresultlong.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultlong.obj `if test -f 'moc_toresultlong.cpp'; then $(CYGPATH_W) 'moc_toresultlong.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultlong.cpp'; fi` tora-moc_toresultparam.o: moc_toresultparam.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultparam.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultparam.Tpo -c -o tora-moc_toresultparam.o `test -f 'moc_toresultparam.cpp' || echo '$(srcdir)/'`moc_toresultparam.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultparam.Tpo $(DEPDIR)/tora-moc_toresultparam.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultparam.cpp' object='tora-moc_toresultparam.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultparam.o `test -f 'moc_toresultparam.cpp' || echo '$(srcdir)/'`moc_toresultparam.cpp tora-moc_toresultparam.obj: moc_toresultparam.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultparam.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultparam.Tpo -c -o tora-moc_toresultparam.obj `if test -f 'moc_toresultparam.cpp'; then $(CYGPATH_W) 'moc_toresultparam.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultparam.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultparam.Tpo $(DEPDIR)/tora-moc_toresultparam.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultparam.cpp' object='tora-moc_toresultparam.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultparam.obj `if test -f 'moc_toresultparam.cpp'; then $(CYGPATH_W) 'moc_toresultparam.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultparam.cpp'; fi` tora-moc_toresultpie.o: moc_toresultpie.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultpie.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultpie.Tpo -c -o tora-moc_toresultpie.o `test -f 'moc_toresultpie.cpp' || echo '$(srcdir)/'`moc_toresultpie.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultpie.Tpo $(DEPDIR)/tora-moc_toresultpie.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultpie.cpp' object='tora-moc_toresultpie.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultpie.o `test -f 'moc_toresultpie.cpp' || echo '$(srcdir)/'`moc_toresultpie.cpp tora-moc_toresultpie.obj: moc_toresultpie.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultpie.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultpie.Tpo -c -o tora-moc_toresultpie.obj `if test -f 'moc_toresultpie.cpp'; then $(CYGPATH_W) 'moc_toresultpie.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultpie.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultpie.Tpo $(DEPDIR)/tora-moc_toresultpie.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultpie.cpp' object='tora-moc_toresultpie.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultpie.obj `if test -f 'moc_toresultpie.cpp'; then $(CYGPATH_W) 'moc_toresultpie.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultpie.cpp'; fi` tora-moc_toresultplan.o: moc_toresultplan.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultplan.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultplan.Tpo -c -o tora-moc_toresultplan.o `test -f 'moc_toresultplan.cpp' || echo '$(srcdir)/'`moc_toresultplan.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultplan.Tpo $(DEPDIR)/tora-moc_toresultplan.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultplan.cpp' object='tora-moc_toresultplan.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultplan.o `test -f 'moc_toresultplan.cpp' || echo '$(srcdir)/'`moc_toresultplan.cpp tora-moc_toresultplan.obj: moc_toresultplan.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultplan.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultplan.Tpo -c -o tora-moc_toresultplan.obj `if test -f 'moc_toresultplan.cpp'; then $(CYGPATH_W) 'moc_toresultplan.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultplan.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultplan.Tpo $(DEPDIR)/tora-moc_toresultplan.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultplan.cpp' object='tora-moc_toresultplan.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultplan.obj `if test -f 'moc_toresultplan.cpp'; then $(CYGPATH_W) 'moc_toresultplan.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultplan.cpp'; fi` tora-moc_toresultstats.o: moc_toresultstats.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultstats.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultstats.Tpo -c -o tora-moc_toresultstats.o `test -f 'moc_toresultstats.cpp' || echo '$(srcdir)/'`moc_toresultstats.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultstats.Tpo $(DEPDIR)/tora-moc_toresultstats.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultstats.cpp' object='tora-moc_toresultstats.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultstats.o `test -f 'moc_toresultstats.cpp' || echo '$(srcdir)/'`moc_toresultstats.cpp tora-moc_toresultstats.obj: moc_toresultstats.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultstats.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultstats.Tpo -c -o tora-moc_toresultstats.obj `if test -f 'moc_toresultstats.cpp'; then $(CYGPATH_W) 'moc_toresultstats.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultstats.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultstats.Tpo $(DEPDIR)/tora-moc_toresultstats.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultstats.cpp' object='tora-moc_toresultstats.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultstats.obj `if test -f 'moc_toresultstats.cpp'; then $(CYGPATH_W) 'moc_toresultstats.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultstats.cpp'; fi` tora-moc_toresultstorage.o: moc_toresultstorage.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultstorage.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultstorage.Tpo -c -o tora-moc_toresultstorage.o `test -f 'moc_toresultstorage.cpp' || echo '$(srcdir)/'`moc_toresultstorage.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultstorage.Tpo $(DEPDIR)/tora-moc_toresultstorage.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultstorage.cpp' object='tora-moc_toresultstorage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultstorage.o `test -f 'moc_toresultstorage.cpp' || echo '$(srcdir)/'`moc_toresultstorage.cpp tora-moc_toresultstorage.obj: moc_toresultstorage.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultstorage.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultstorage.Tpo -c -o tora-moc_toresultstorage.obj `if test -f 'moc_toresultstorage.cpp'; then $(CYGPATH_W) 'moc_toresultstorage.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultstorage.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultstorage.Tpo $(DEPDIR)/tora-moc_toresultstorage.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultstorage.cpp' object='tora-moc_toresultstorage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultstorage.obj `if test -f 'moc_toresultstorage.cpp'; then $(CYGPATH_W) 'moc_toresultstorage.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultstorage.cpp'; fi` tora-moc_toresultview.o: moc_toresultview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultview.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultview.Tpo -c -o tora-moc_toresultview.o `test -f 'moc_toresultview.cpp' || echo '$(srcdir)/'`moc_toresultview.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultview.Tpo $(DEPDIR)/tora-moc_toresultview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultview.cpp' object='tora-moc_toresultview.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultview.o `test -f 'moc_toresultview.cpp' || echo '$(srcdir)/'`moc_toresultview.cpp tora-moc_toresultview.obj: moc_toresultview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultview.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultview.Tpo -c -o tora-moc_toresultview.obj `if test -f 'moc_toresultview.cpp'; then $(CYGPATH_W) 'moc_toresultview.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultview.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultview.Tpo $(DEPDIR)/tora-moc_toresultview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultview.cpp' object='tora-moc_toresultview.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultview.obj `if test -f 'moc_toresultview.cpp'; then $(CYGPATH_W) 'moc_toresultview.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultview.cpp'; fi` tora-moc_toresultlistformat.o: moc_toresultlistformat.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultlistformat.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultlistformat.Tpo -c -o tora-moc_toresultlistformat.o `test -f 'moc_toresultlistformat.cpp' || echo '$(srcdir)/'`moc_toresultlistformat.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultlistformat.Tpo $(DEPDIR)/tora-moc_toresultlistformat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultlistformat.cpp' object='tora-moc_toresultlistformat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultlistformat.o `test -f 'moc_toresultlistformat.cpp' || echo '$(srcdir)/'`moc_toresultlistformat.cpp tora-moc_toresultlistformat.obj: moc_toresultlistformat.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultlistformat.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultlistformat.Tpo -c -o tora-moc_toresultlistformat.obj `if test -f 'moc_toresultlistformat.cpp'; then $(CYGPATH_W) 'moc_toresultlistformat.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultlistformat.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultlistformat.Tpo $(DEPDIR)/tora-moc_toresultlistformat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultlistformat.cpp' object='tora-moc_toresultlistformat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultlistformat.obj `if test -f 'moc_toresultlistformat.cpp'; then $(CYGPATH_W) 'moc_toresultlistformat.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultlistformat.cpp'; fi` tora-moc_toresultmodel.o: moc_toresultmodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultmodel.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultmodel.Tpo -c -o tora-moc_toresultmodel.o `test -f 'moc_toresultmodel.cpp' || echo '$(srcdir)/'`moc_toresultmodel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultmodel.Tpo $(DEPDIR)/tora-moc_toresultmodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultmodel.cpp' object='tora-moc_toresultmodel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultmodel.o `test -f 'moc_toresultmodel.cpp' || echo '$(srcdir)/'`moc_toresultmodel.cpp tora-moc_toresultmodel.obj: moc_toresultmodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultmodel.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultmodel.Tpo -c -o tora-moc_toresultmodel.obj `if test -f 'moc_toresultmodel.cpp'; then $(CYGPATH_W) 'moc_toresultmodel.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultmodel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultmodel.Tpo $(DEPDIR)/tora-moc_toresultmodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultmodel.cpp' object='tora-moc_toresultmodel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultmodel.obj `if test -f 'moc_toresultmodel.cpp'; then $(CYGPATH_W) 'moc_toresultmodel.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultmodel.cpp'; fi` tora-moc_toresulttableview.o: moc_toresulttableview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresulttableview.o -MD -MP -MF $(DEPDIR)/tora-moc_toresulttableview.Tpo -c -o tora-moc_toresulttableview.o `test -f 'moc_toresulttableview.cpp' || echo '$(srcdir)/'`moc_toresulttableview.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresulttableview.Tpo $(DEPDIR)/tora-moc_toresulttableview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresulttableview.cpp' object='tora-moc_toresulttableview.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresulttableview.o `test -f 'moc_toresulttableview.cpp' || echo '$(srcdir)/'`moc_toresulttableview.cpp tora-moc_toresulttableview.obj: moc_toresulttableview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresulttableview.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresulttableview.Tpo -c -o tora-moc_toresulttableview.obj `if test -f 'moc_toresulttableview.cpp'; then $(CYGPATH_W) 'moc_toresulttableview.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresulttableview.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresulttableview.Tpo $(DEPDIR)/tora-moc_toresulttableview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresulttableview.cpp' object='tora-moc_toresulttableview.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresulttableview.obj `if test -f 'moc_toresulttableview.cpp'; then $(CYGPATH_W) 'moc_toresulttableview.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresulttableview.cpp'; fi` tora-moc_toresulttableviewedit.o: moc_toresulttableviewedit.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresulttableviewedit.o -MD -MP -MF $(DEPDIR)/tora-moc_toresulttableviewedit.Tpo -c -o tora-moc_toresulttableviewedit.o `test -f 'moc_toresulttableviewedit.cpp' || echo '$(srcdir)/'`moc_toresulttableviewedit.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresulttableviewedit.Tpo $(DEPDIR)/tora-moc_toresulttableviewedit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresulttableviewedit.cpp' object='tora-moc_toresulttableviewedit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresulttableviewedit.o `test -f 'moc_toresulttableviewedit.cpp' || echo '$(srcdir)/'`moc_toresulttableviewedit.cpp tora-moc_toresulttableviewedit.obj: moc_toresulttableviewedit.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresulttableviewedit.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresulttableviewedit.Tpo -c -o tora-moc_toresulttableviewedit.obj `if test -f 'moc_toresulttableviewedit.cpp'; then $(CYGPATH_W) 'moc_toresulttableviewedit.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresulttableviewedit.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresulttableviewedit.Tpo $(DEPDIR)/tora-moc_toresulttableviewedit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresulttableviewedit.cpp' object='tora-moc_toresulttableviewedit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresulttableviewedit.obj `if test -f 'moc_toresulttableviewedit.cpp'; then $(CYGPATH_W) 'moc_toresulttableviewedit.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresulttableviewedit.cpp'; fi` tora-moc_toresultdata.o: moc_toresultdata.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultdata.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultdata.Tpo -c -o tora-moc_toresultdata.o `test -f 'moc_toresultdata.cpp' || echo '$(srcdir)/'`moc_toresultdata.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultdata.Tpo $(DEPDIR)/tora-moc_toresultdata.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultdata.cpp' object='tora-moc_toresultdata.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultdata.o `test -f 'moc_toresultdata.cpp' || echo '$(srcdir)/'`moc_toresultdata.cpp tora-moc_toresultdata.obj: moc_toresultdata.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultdata.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultdata.Tpo -c -o tora-moc_toresultdata.obj `if test -f 'moc_toresultdata.cpp'; then $(CYGPATH_W) 'moc_toresultdata.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultdata.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultdata.Tpo $(DEPDIR)/tora-moc_toresultdata.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultdata.cpp' object='tora-moc_toresultdata.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultdata.obj `if test -f 'moc_toresultdata.cpp'; then $(CYGPATH_W) 'moc_toresultdata.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultdata.cpp'; fi` tora-moc_toresultdatasingle.o: moc_toresultdatasingle.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultdatasingle.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultdatasingle.Tpo -c -o tora-moc_toresultdatasingle.o `test -f 'moc_toresultdatasingle.cpp' || echo '$(srcdir)/'`moc_toresultdatasingle.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultdatasingle.Tpo $(DEPDIR)/tora-moc_toresultdatasingle.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultdatasingle.cpp' object='tora-moc_toresultdatasingle.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultdatasingle.o `test -f 'moc_toresultdatasingle.cpp' || echo '$(srcdir)/'`moc_toresultdatasingle.cpp tora-moc_toresultdatasingle.obj: moc_toresultdatasingle.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultdatasingle.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultdatasingle.Tpo -c -o tora-moc_toresultdatasingle.obj `if test -f 'moc_toresultdatasingle.cpp'; then $(CYGPATH_W) 'moc_toresultdatasingle.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultdatasingle.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultdatasingle.Tpo $(DEPDIR)/tora-moc_toresultdatasingle.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultdatasingle.cpp' object='tora-moc_toresultdatasingle.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultdatasingle.obj `if test -f 'moc_toresultdatasingle.cpp'; then $(CYGPATH_W) 'moc_toresultdatasingle.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultdatasingle.cpp'; fi` tora-moc_totreewidget.o: moc_totreewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_totreewidget.o -MD -MP -MF $(DEPDIR)/tora-moc_totreewidget.Tpo -c -o tora-moc_totreewidget.o `test -f 'moc_totreewidget.cpp' || echo '$(srcdir)/'`moc_totreewidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_totreewidget.Tpo $(DEPDIR)/tora-moc_totreewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_totreewidget.cpp' object='tora-moc_totreewidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_totreewidget.o `test -f 'moc_totreewidget.cpp' || echo '$(srcdir)/'`moc_totreewidget.cpp tora-moc_totreewidget.obj: moc_totreewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_totreewidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_totreewidget.Tpo -c -o tora-moc_totreewidget.obj `if test -f 'moc_totreewidget.cpp'; then $(CYGPATH_W) 'moc_totreewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_totreewidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_totreewidget.Tpo $(DEPDIR)/tora-moc_totreewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_totreewidget.cpp' object='tora-moc_totreewidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_totreewidget.obj `if test -f 'moc_totreewidget.cpp'; then $(CYGPATH_W) 'moc_totreewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_totreewidget.cpp'; fi` tora-moc_torollback.o: moc_torollback.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_torollback.o -MD -MP -MF $(DEPDIR)/tora-moc_torollback.Tpo -c -o tora-moc_torollback.o `test -f 'moc_torollback.cpp' || echo '$(srcdir)/'`moc_torollback.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_torollback.Tpo $(DEPDIR)/tora-moc_torollback.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_torollback.cpp' object='tora-moc_torollback.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_torollback.o `test -f 'moc_torollback.cpp' || echo '$(srcdir)/'`moc_torollback.cpp tora-moc_torollback.obj: moc_torollback.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_torollback.obj -MD -MP -MF $(DEPDIR)/tora-moc_torollback.Tpo -c -o tora-moc_torollback.obj `if test -f 'moc_torollback.cpp'; then $(CYGPATH_W) 'moc_torollback.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_torollback.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_torollback.Tpo $(DEPDIR)/tora-moc_torollback.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_torollback.cpp' object='tora-moc_torollback.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_torollback.obj `if test -f 'moc_torollback.cpp'; then $(CYGPATH_W) 'moc_torollback.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_torollback.cpp'; fi` tora-moc_toscript.o: moc_toscript.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toscript.o -MD -MP -MF $(DEPDIR)/tora-moc_toscript.Tpo -c -o tora-moc_toscript.o `test -f 'moc_toscript.cpp' || echo '$(srcdir)/'`moc_toscript.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toscript.Tpo $(DEPDIR)/tora-moc_toscript.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toscript.cpp' object='tora-moc_toscript.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toscript.o `test -f 'moc_toscript.cpp' || echo '$(srcdir)/'`moc_toscript.cpp tora-moc_toscript.obj: moc_toscript.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toscript.obj -MD -MP -MF $(DEPDIR)/tora-moc_toscript.Tpo -c -o tora-moc_toscript.obj `if test -f 'moc_toscript.cpp'; then $(CYGPATH_W) 'moc_toscript.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toscript.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toscript.Tpo $(DEPDIR)/tora-moc_toscript.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toscript.cpp' object='tora-moc_toscript.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toscript.obj `if test -f 'moc_toscript.cpp'; then $(CYGPATH_W) 'moc_toscript.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toscript.cpp'; fi` tora-moc_tosearchreplace.o: moc_tosearchreplace.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosearchreplace.o -MD -MP -MF $(DEPDIR)/tora-moc_tosearchreplace.Tpo -c -o tora-moc_tosearchreplace.o `test -f 'moc_tosearchreplace.cpp' || echo '$(srcdir)/'`moc_tosearchreplace.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosearchreplace.Tpo $(DEPDIR)/tora-moc_tosearchreplace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosearchreplace.cpp' object='tora-moc_tosearchreplace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosearchreplace.o `test -f 'moc_tosearchreplace.cpp' || echo '$(srcdir)/'`moc_tosearchreplace.cpp tora-moc_tosearchreplace.obj: moc_tosearchreplace.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosearchreplace.obj -MD -MP -MF $(DEPDIR)/tora-moc_tosearchreplace.Tpo -c -o tora-moc_tosearchreplace.obj `if test -f 'moc_tosearchreplace.cpp'; then $(CYGPATH_W) 'moc_tosearchreplace.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosearchreplace.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosearchreplace.Tpo $(DEPDIR)/tora-moc_tosearchreplace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosearchreplace.cpp' object='tora-moc_tosearchreplace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosearchreplace.obj `if test -f 'moc_tosearchreplace.cpp'; then $(CYGPATH_W) 'moc_tosearchreplace.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosearchreplace.cpp'; fi` tora-moc_tosecurity.o: moc_tosecurity.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosecurity.o -MD -MP -MF $(DEPDIR)/tora-moc_tosecurity.Tpo -c -o tora-moc_tosecurity.o `test -f 'moc_tosecurity.cpp' || echo '$(srcdir)/'`moc_tosecurity.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosecurity.Tpo $(DEPDIR)/tora-moc_tosecurity.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosecurity.cpp' object='tora-moc_tosecurity.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosecurity.o `test -f 'moc_tosecurity.cpp' || echo '$(srcdir)/'`moc_tosecurity.cpp tora-moc_tosecurity.obj: moc_tosecurity.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosecurity.obj -MD -MP -MF $(DEPDIR)/tora-moc_tosecurity.Tpo -c -o tora-moc_tosecurity.obj `if test -f 'moc_tosecurity.cpp'; then $(CYGPATH_W) 'moc_tosecurity.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosecurity.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosecurity.Tpo $(DEPDIR)/tora-moc_tosecurity.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosecurity.cpp' object='tora-moc_tosecurity.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosecurity.obj `if test -f 'moc_tosecurity.cpp'; then $(CYGPATH_W) 'moc_tosecurity.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosecurity.cpp'; fi` tora-moc_tosecuritytreemodel.o: moc_tosecuritytreemodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosecuritytreemodel.o -MD -MP -MF $(DEPDIR)/tora-moc_tosecuritytreemodel.Tpo -c -o tora-moc_tosecuritytreemodel.o `test -f 'moc_tosecuritytreemodel.cpp' || echo '$(srcdir)/'`moc_tosecuritytreemodel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosecuritytreemodel.Tpo $(DEPDIR)/tora-moc_tosecuritytreemodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosecuritytreemodel.cpp' object='tora-moc_tosecuritytreemodel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosecuritytreemodel.o `test -f 'moc_tosecuritytreemodel.cpp' || echo '$(srcdir)/'`moc_tosecuritytreemodel.cpp tora-moc_tosecuritytreemodel.obj: moc_tosecuritytreemodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosecuritytreemodel.obj -MD -MP -MF $(DEPDIR)/tora-moc_tosecuritytreemodel.Tpo -c -o tora-moc_tosecuritytreemodel.obj `if test -f 'moc_tosecuritytreemodel.cpp'; then $(CYGPATH_W) 'moc_tosecuritytreemodel.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosecuritytreemodel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosecuritytreemodel.Tpo $(DEPDIR)/tora-moc_tosecuritytreemodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosecuritytreemodel.cpp' object='tora-moc_tosecuritytreemodel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosecuritytreemodel.obj `if test -f 'moc_tosecuritytreemodel.cpp'; then $(CYGPATH_W) 'moc_tosecuritytreemodel.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosecuritytreemodel.cpp'; fi` tora-moc_tosession.o: moc_tosession.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosession.o -MD -MP -MF $(DEPDIR)/tora-moc_tosession.Tpo -c -o tora-moc_tosession.o `test -f 'moc_tosession.cpp' || echo '$(srcdir)/'`moc_tosession.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosession.Tpo $(DEPDIR)/tora-moc_tosession.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosession.cpp' object='tora-moc_tosession.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosession.o `test -f 'moc_tosession.cpp' || echo '$(srcdir)/'`moc_tosession.cpp tora-moc_tosession.obj: moc_tosession.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosession.obj -MD -MP -MF $(DEPDIR)/tora-moc_tosession.Tpo -c -o tora-moc_tosession.obj `if test -f 'moc_tosession.cpp'; then $(CYGPATH_W) 'moc_tosession.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosession.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosession.Tpo $(DEPDIR)/tora-moc_tosession.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosession.cpp' object='tora-moc_tosession.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosession.obj `if test -f 'moc_tosession.cpp'; then $(CYGPATH_W) 'moc_tosession.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosession.cpp'; fi` tora-moc_tosgastatement.o: moc_tosgastatement.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosgastatement.o -MD -MP -MF $(DEPDIR)/tora-moc_tosgastatement.Tpo -c -o tora-moc_tosgastatement.o `test -f 'moc_tosgastatement.cpp' || echo '$(srcdir)/'`moc_tosgastatement.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosgastatement.Tpo $(DEPDIR)/tora-moc_tosgastatement.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosgastatement.cpp' object='tora-moc_tosgastatement.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosgastatement.o `test -f 'moc_tosgastatement.cpp' || echo '$(srcdir)/'`moc_tosgastatement.cpp tora-moc_tosgastatement.obj: moc_tosgastatement.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosgastatement.obj -MD -MP -MF $(DEPDIR)/tora-moc_tosgastatement.Tpo -c -o tora-moc_tosgastatement.obj `if test -f 'moc_tosgastatement.cpp'; then $(CYGPATH_W) 'moc_tosgastatement.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosgastatement.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosgastatement.Tpo $(DEPDIR)/tora-moc_tosgastatement.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosgastatement.cpp' object='tora-moc_tosgastatement.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosgastatement.obj `if test -f 'moc_tosgastatement.cpp'; then $(CYGPATH_W) 'moc_tosgastatement.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosgastatement.cpp'; fi` tora-moc_tosgatrace.o: moc_tosgatrace.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosgatrace.o -MD -MP -MF $(DEPDIR)/tora-moc_tosgatrace.Tpo -c -o tora-moc_tosgatrace.o `test -f 'moc_tosgatrace.cpp' || echo '$(srcdir)/'`moc_tosgatrace.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosgatrace.Tpo $(DEPDIR)/tora-moc_tosgatrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosgatrace.cpp' object='tora-moc_tosgatrace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosgatrace.o `test -f 'moc_tosgatrace.cpp' || echo '$(srcdir)/'`moc_tosgatrace.cpp tora-moc_tosgatrace.obj: moc_tosgatrace.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosgatrace.obj -MD -MP -MF $(DEPDIR)/tora-moc_tosgatrace.Tpo -c -o tora-moc_tosgatrace.obj `if test -f 'moc_tosgatrace.cpp'; then $(CYGPATH_W) 'moc_tosgatrace.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosgatrace.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosgatrace.Tpo $(DEPDIR)/tora-moc_tosgatrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosgatrace.cpp' object='tora-moc_tosgatrace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosgatrace.obj `if test -f 'moc_tosgatrace.cpp'; then $(CYGPATH_W) 'moc_tosgatrace.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosgatrace.cpp'; fi` tora-moc_tosmtp.o: moc_tosmtp.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosmtp.o -MD -MP -MF $(DEPDIR)/tora-moc_tosmtp.Tpo -c -o tora-moc_tosmtp.o `test -f 'moc_tosmtp.cpp' || echo '$(srcdir)/'`moc_tosmtp.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosmtp.Tpo $(DEPDIR)/tora-moc_tosmtp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosmtp.cpp' object='tora-moc_tosmtp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosmtp.o `test -f 'moc_tosmtp.cpp' || echo '$(srcdir)/'`moc_tosmtp.cpp tora-moc_tosmtp.obj: moc_tosmtp.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosmtp.obj -MD -MP -MF $(DEPDIR)/tora-moc_tosmtp.Tpo -c -o tora-moc_tosmtp.obj `if test -f 'moc_tosmtp.cpp'; then $(CYGPATH_W) 'moc_tosmtp.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosmtp.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosmtp.Tpo $(DEPDIR)/tora-moc_tosmtp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosmtp.cpp' object='tora-moc_tosmtp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosmtp.obj `if test -f 'moc_tosmtp.cpp'; then $(CYGPATH_W) 'moc_tosmtp.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosmtp.cpp'; fi` tora-moc_tosqledit.o: moc_tosqledit.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosqledit.o -MD -MP -MF $(DEPDIR)/tora-moc_tosqledit.Tpo -c -o tora-moc_tosqledit.o `test -f 'moc_tosqledit.cpp' || echo '$(srcdir)/'`moc_tosqledit.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosqledit.Tpo $(DEPDIR)/tora-moc_tosqledit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosqledit.cpp' object='tora-moc_tosqledit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosqledit.o `test -f 'moc_tosqledit.cpp' || echo '$(srcdir)/'`moc_tosqledit.cpp tora-moc_tosqledit.obj: moc_tosqledit.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosqledit.obj -MD -MP -MF $(DEPDIR)/tora-moc_tosqledit.Tpo -c -o tora-moc_tosqledit.obj `if test -f 'moc_tosqledit.cpp'; then $(CYGPATH_W) 'moc_tosqledit.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosqledit.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosqledit.Tpo $(DEPDIR)/tora-moc_tosqledit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosqledit.cpp' object='tora-moc_tosqledit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosqledit.obj `if test -f 'moc_tosqledit.cpp'; then $(CYGPATH_W) 'moc_tosqledit.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosqledit.cpp'; fi` tora-moc_tostorage.o: moc_tostorage.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tostorage.o -MD -MP -MF $(DEPDIR)/tora-moc_tostorage.Tpo -c -o tora-moc_tostorage.o `test -f 'moc_tostorage.cpp' || echo '$(srcdir)/'`moc_tostorage.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tostorage.Tpo $(DEPDIR)/tora-moc_tostorage.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tostorage.cpp' object='tora-moc_tostorage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tostorage.o `test -f 'moc_tostorage.cpp' || echo '$(srcdir)/'`moc_tostorage.cpp tora-moc_tostorage.obj: moc_tostorage.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tostorage.obj -MD -MP -MF $(DEPDIR)/tora-moc_tostorage.Tpo -c -o tora-moc_tostorage.obj `if test -f 'moc_tostorage.cpp'; then $(CYGPATH_W) 'moc_tostorage.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tostorage.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tostorage.Tpo $(DEPDIR)/tora-moc_tostorage.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tostorage.cpp' object='tora-moc_tostorage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tostorage.obj `if test -f 'moc_tostorage.cpp'; then $(CYGPATH_W) 'moc_tostorage.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tostorage.cpp'; fi` tora-moc_tosyntaxsetup.o: moc_tosyntaxsetup.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosyntaxsetup.o -MD -MP -MF $(DEPDIR)/tora-moc_tosyntaxsetup.Tpo -c -o tora-moc_tosyntaxsetup.o `test -f 'moc_tosyntaxsetup.cpp' || echo '$(srcdir)/'`moc_tosyntaxsetup.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosyntaxsetup.Tpo $(DEPDIR)/tora-moc_tosyntaxsetup.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosyntaxsetup.cpp' object='tora-moc_tosyntaxsetup.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosyntaxsetup.o `test -f 'moc_tosyntaxsetup.cpp' || echo '$(srcdir)/'`moc_tosyntaxsetup.cpp tora-moc_tosyntaxsetup.obj: moc_tosyntaxsetup.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tosyntaxsetup.obj -MD -MP -MF $(DEPDIR)/tora-moc_tosyntaxsetup.Tpo -c -o tora-moc_tosyntaxsetup.obj `if test -f 'moc_tosyntaxsetup.cpp'; then $(CYGPATH_W) 'moc_tosyntaxsetup.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosyntaxsetup.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tosyntaxsetup.Tpo $(DEPDIR)/tora-moc_tosyntaxsetup.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tosyntaxsetup.cpp' object='tora-moc_tosyntaxsetup.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tosyntaxsetup.obj `if test -f 'moc_tosyntaxsetup.cpp'; then $(CYGPATH_W) 'moc_tosyntaxsetup.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tosyntaxsetup.cpp'; fi` tora-moc_totableselect.o: moc_totableselect.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_totableselect.o -MD -MP -MF $(DEPDIR)/tora-moc_totableselect.Tpo -c -o tora-moc_totableselect.o `test -f 'moc_totableselect.cpp' || echo '$(srcdir)/'`moc_totableselect.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_totableselect.Tpo $(DEPDIR)/tora-moc_totableselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_totableselect.cpp' object='tora-moc_totableselect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_totableselect.o `test -f 'moc_totableselect.cpp' || echo '$(srcdir)/'`moc_totableselect.cpp tora-moc_totableselect.obj: moc_totableselect.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_totableselect.obj -MD -MP -MF $(DEPDIR)/tora-moc_totableselect.Tpo -c -o tora-moc_totableselect.obj `if test -f 'moc_totableselect.cpp'; then $(CYGPATH_W) 'moc_totableselect.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_totableselect.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_totableselect.Tpo $(DEPDIR)/tora-moc_totableselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_totableselect.cpp' object='tora-moc_totableselect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_totableselect.obj `if test -f 'moc_totableselect.cpp'; then $(CYGPATH_W) 'moc_totableselect.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_totableselect.cpp'; fi` tora-moc_totabwidget.o: moc_totabwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_totabwidget.o -MD -MP -MF $(DEPDIR)/tora-moc_totabwidget.Tpo -c -o tora-moc_totabwidget.o `test -f 'moc_totabwidget.cpp' || echo '$(srcdir)/'`moc_totabwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_totabwidget.Tpo $(DEPDIR)/tora-moc_totabwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_totabwidget.cpp' object='tora-moc_totabwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_totabwidget.o `test -f 'moc_totabwidget.cpp' || echo '$(srcdir)/'`moc_totabwidget.cpp tora-moc_totabwidget.obj: moc_totabwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_totabwidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_totabwidget.Tpo -c -o tora-moc_totabwidget.obj `if test -f 'moc_totabwidget.cpp'; then $(CYGPATH_W) 'moc_totabwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_totabwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_totabwidget.Tpo $(DEPDIR)/tora-moc_totabwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_totabwidget.cpp' object='tora-moc_totabwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_totabwidget.obj `if test -f 'moc_totabwidget.cpp'; then $(CYGPATH_W) 'moc_totabwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_totabwidget.cpp'; fi` tora-moc_totemplate.o: moc_totemplate.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_totemplate.o -MD -MP -MF $(DEPDIR)/tora-moc_totemplate.Tpo -c -o tora-moc_totemplate.o `test -f 'moc_totemplate.cpp' || echo '$(srcdir)/'`moc_totemplate.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_totemplate.Tpo $(DEPDIR)/tora-moc_totemplate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_totemplate.cpp' object='tora-moc_totemplate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_totemplate.o `test -f 'moc_totemplate.cpp' || echo '$(srcdir)/'`moc_totemplate.cpp tora-moc_totemplate.obj: moc_totemplate.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_totemplate.obj -MD -MP -MF $(DEPDIR)/tora-moc_totemplate.Tpo -c -o tora-moc_totemplate.obj `if test -f 'moc_totemplate.cpp'; then $(CYGPATH_W) 'moc_totemplate.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_totemplate.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_totemplate.Tpo $(DEPDIR)/tora-moc_totemplate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_totemplate.cpp' object='tora-moc_totemplate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_totemplate.obj `if test -f 'moc_totemplate.cpp'; then $(CYGPATH_W) 'moc_totemplate.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_totemplate.cpp'; fi` tora-moc_totemporary.o: moc_totemporary.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_totemporary.o -MD -MP -MF $(DEPDIR)/tora-moc_totemporary.Tpo -c -o tora-moc_totemporary.o `test -f 'moc_totemporary.cpp' || echo '$(srcdir)/'`moc_totemporary.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_totemporary.Tpo $(DEPDIR)/tora-moc_totemporary.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_totemporary.cpp' object='tora-moc_totemporary.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_totemporary.o `test -f 'moc_totemporary.cpp' || echo '$(srcdir)/'`moc_totemporary.cpp tora-moc_totemporary.obj: moc_totemporary.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_totemporary.obj -MD -MP -MF $(DEPDIR)/tora-moc_totemporary.Tpo -c -o tora-moc_totemporary.obj `if test -f 'moc_totemporary.cpp'; then $(CYGPATH_W) 'moc_totemporary.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_totemporary.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_totemporary.Tpo $(DEPDIR)/tora-moc_totemporary.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_totemporary.cpp' object='tora-moc_totemporary.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_totemporary.obj `if test -f 'moc_totemporary.cpp'; then $(CYGPATH_W) 'moc_totemporary.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_totemporary.cpp'; fi` tora-moc_tothread_p.o: moc_tothread_p.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tothread_p.o -MD -MP -MF $(DEPDIR)/tora-moc_tothread_p.Tpo -c -o tora-moc_tothread_p.o `test -f 'moc_tothread_p.cpp' || echo '$(srcdir)/'`moc_tothread_p.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tothread_p.Tpo $(DEPDIR)/tora-moc_tothread_p.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tothread_p.cpp' object='tora-moc_tothread_p.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tothread_p.o `test -f 'moc_tothread_p.cpp' || echo '$(srcdir)/'`moc_tothread_p.cpp tora-moc_tothread_p.obj: moc_tothread_p.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tothread_p.obj -MD -MP -MF $(DEPDIR)/tora-moc_tothread_p.Tpo -c -o tora-moc_tothread_p.obj `if test -f 'moc_tothread_p.cpp'; then $(CYGPATH_W) 'moc_tothread_p.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tothread_p.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tothread_p.Tpo $(DEPDIR)/tora-moc_tothread_p.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tothread_p.cpp' object='tora-moc_tothread_p.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tothread_p.obj `if test -f 'moc_tothread_p.cpp'; then $(CYGPATH_W) 'moc_tothread_p.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tothread_p.cpp'; fi` tora-moc_totool.o: moc_totool.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_totool.o -MD -MP -MF $(DEPDIR)/tora-moc_totool.Tpo -c -o tora-moc_totool.o `test -f 'moc_totool.cpp' || echo '$(srcdir)/'`moc_totool.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_totool.Tpo $(DEPDIR)/tora-moc_totool.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_totool.cpp' object='tora-moc_totool.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_totool.o `test -f 'moc_totool.cpp' || echo '$(srcdir)/'`moc_totool.cpp tora-moc_totool.obj: moc_totool.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_totool.obj -MD -MP -MF $(DEPDIR)/tora-moc_totool.Tpo -c -o tora-moc_totool.obj `if test -f 'moc_totool.cpp'; then $(CYGPATH_W) 'moc_totool.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_totool.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_totool.Tpo $(DEPDIR)/tora-moc_totool.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_totool.cpp' object='tora-moc_totool.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_totool.obj `if test -f 'moc_totool.cpp'; then $(CYGPATH_W) 'moc_totool.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_totool.cpp'; fi` tora-moc_totuning.o: moc_totuning.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_totuning.o -MD -MP -MF $(DEPDIR)/tora-moc_totuning.Tpo -c -o tora-moc_totuning.o `test -f 'moc_totuning.cpp' || echo '$(srcdir)/'`moc_totuning.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_totuning.Tpo $(DEPDIR)/tora-moc_totuning.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_totuning.cpp' object='tora-moc_totuning.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_totuning.o `test -f 'moc_totuning.cpp' || echo '$(srcdir)/'`moc_totuning.cpp tora-moc_totuning.obj: moc_totuning.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_totuning.obj -MD -MP -MF $(DEPDIR)/tora-moc_totuning.Tpo -c -o tora-moc_totuning.obj `if test -f 'moc_totuning.cpp'; then $(CYGPATH_W) 'moc_totuning.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_totuning.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_totuning.Tpo $(DEPDIR)/tora-moc_totuning.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_totuning.cpp' object='tora-moc_totuning.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_totuning.obj `if test -f 'moc_totuning.cpp'; then $(CYGPATH_W) 'moc_totuning.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_totuning.cpp'; fi` tora-moc_tounittest.o: moc_tounittest.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tounittest.o -MD -MP -MF $(DEPDIR)/tora-moc_tounittest.Tpo -c -o tora-moc_tounittest.o `test -f 'moc_tounittest.cpp' || echo '$(srcdir)/'`moc_tounittest.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tounittest.Tpo $(DEPDIR)/tora-moc_tounittest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tounittest.cpp' object='tora-moc_tounittest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tounittest.o `test -f 'moc_tounittest.cpp' || echo '$(srcdir)/'`moc_tounittest.cpp tora-moc_tounittest.obj: moc_tounittest.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tounittest.obj -MD -MP -MF $(DEPDIR)/tora-moc_tounittest.Tpo -c -o tora-moc_tounittest.obj `if test -f 'moc_tounittest.cpp'; then $(CYGPATH_W) 'moc_tounittest.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tounittest.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tounittest.Tpo $(DEPDIR)/tora-moc_tounittest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tounittest.cpp' object='tora-moc_tounittest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tounittest.obj `if test -f 'moc_tounittest.cpp'; then $(CYGPATH_W) 'moc_tounittest.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tounittest.cpp'; fi` tora-moc_tovisualize.o: moc_tovisualize.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tovisualize.o -MD -MP -MF $(DEPDIR)/tora-moc_tovisualize.Tpo -c -o tora-moc_tovisualize.o `test -f 'moc_tovisualize.cpp' || echo '$(srcdir)/'`moc_tovisualize.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tovisualize.Tpo $(DEPDIR)/tora-moc_tovisualize.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tovisualize.cpp' object='tora-moc_tovisualize.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tovisualize.o `test -f 'moc_tovisualize.cpp' || echo '$(srcdir)/'`moc_tovisualize.cpp tora-moc_tovisualize.obj: moc_tovisualize.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tovisualize.obj -MD -MP -MF $(DEPDIR)/tora-moc_tovisualize.Tpo -c -o tora-moc_tovisualize.obj `if test -f 'moc_tovisualize.cpp'; then $(CYGPATH_W) 'moc_tovisualize.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tovisualize.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tovisualize.Tpo $(DEPDIR)/tora-moc_tovisualize.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tovisualize.cpp' object='tora-moc_tovisualize.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tovisualize.obj `if test -f 'moc_tovisualize.cpp'; then $(CYGPATH_W) 'moc_tovisualize.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tovisualize.cpp'; fi` tora-moc_towaitevents.o: moc_towaitevents.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_towaitevents.o -MD -MP -MF $(DEPDIR)/tora-moc_towaitevents.Tpo -c -o tora-moc_towaitevents.o `test -f 'moc_towaitevents.cpp' || echo '$(srcdir)/'`moc_towaitevents.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_towaitevents.Tpo $(DEPDIR)/tora-moc_towaitevents.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_towaitevents.cpp' object='tora-moc_towaitevents.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_towaitevents.o `test -f 'moc_towaitevents.cpp' || echo '$(srcdir)/'`moc_towaitevents.cpp tora-moc_towaitevents.obj: moc_towaitevents.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_towaitevents.obj -MD -MP -MF $(DEPDIR)/tora-moc_towaitevents.Tpo -c -o tora-moc_towaitevents.obj `if test -f 'moc_towaitevents.cpp'; then $(CYGPATH_W) 'moc_towaitevents.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_towaitevents.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_towaitevents.Tpo $(DEPDIR)/tora-moc_towaitevents.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_towaitevents.cpp' object='tora-moc_towaitevents.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_towaitevents.obj `if test -f 'moc_towaitevents.cpp'; then $(CYGPATH_W) 'moc_towaitevents.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_towaitevents.cpp'; fi` tora-moc_toworksheet.o: moc_toworksheet.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toworksheet.o -MD -MP -MF $(DEPDIR)/tora-moc_toworksheet.Tpo -c -o tora-moc_toworksheet.o `test -f 'moc_toworksheet.cpp' || echo '$(srcdir)/'`moc_toworksheet.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toworksheet.Tpo $(DEPDIR)/tora-moc_toworksheet.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toworksheet.cpp' object='tora-moc_toworksheet.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toworksheet.o `test -f 'moc_toworksheet.cpp' || echo '$(srcdir)/'`moc_toworksheet.cpp tora-moc_toworksheet.obj: moc_toworksheet.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toworksheet.obj -MD -MP -MF $(DEPDIR)/tora-moc_toworksheet.Tpo -c -o tora-moc_toworksheet.obj `if test -f 'moc_toworksheet.cpp'; then $(CYGPATH_W) 'moc_toworksheet.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toworksheet.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toworksheet.Tpo $(DEPDIR)/tora-moc_toworksheet.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toworksheet.cpp' object='tora-moc_toworksheet.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toworksheet.obj `if test -f 'moc_toworksheet.cpp'; then $(CYGPATH_W) 'moc_toworksheet.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toworksheet.cpp'; fi` tora-moc_toeditablemenu.o: moc_toeditablemenu.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toeditablemenu.o -MD -MP -MF $(DEPDIR)/tora-moc_toeditablemenu.Tpo -c -o tora-moc_toeditablemenu.o `test -f 'moc_toeditablemenu.cpp' || echo '$(srcdir)/'`moc_toeditablemenu.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toeditablemenu.Tpo $(DEPDIR)/tora-moc_toeditablemenu.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toeditablemenu.cpp' object='tora-moc_toeditablemenu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toeditablemenu.o `test -f 'moc_toeditablemenu.cpp' || echo '$(srcdir)/'`moc_toeditablemenu.cpp tora-moc_toeditablemenu.obj: moc_toeditablemenu.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toeditablemenu.obj -MD -MP -MF $(DEPDIR)/tora-moc_toeditablemenu.Tpo -c -o tora-moc_toeditablemenu.obj `if test -f 'moc_toeditablemenu.cpp'; then $(CYGPATH_W) 'moc_toeditablemenu.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toeditablemenu.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toeditablemenu.Tpo $(DEPDIR)/tora-moc_toeditablemenu.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toeditablemenu.cpp' object='tora-moc_toeditablemenu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toeditablemenu.obj `if test -f 'moc_toeditablemenu.cpp'; then $(CYGPATH_W) 'moc_toeditablemenu.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toeditablemenu.cpp'; fi` tora-moc_toworksheetwidget.o: moc_toworksheetwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toworksheetwidget.o -MD -MP -MF $(DEPDIR)/tora-moc_toworksheetwidget.Tpo -c -o tora-moc_toworksheetwidget.o `test -f 'moc_toworksheetwidget.cpp' || echo '$(srcdir)/'`moc_toworksheetwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toworksheetwidget.Tpo $(DEPDIR)/tora-moc_toworksheetwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toworksheetwidget.cpp' object='tora-moc_toworksheetwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toworksheetwidget.o `test -f 'moc_toworksheetwidget.cpp' || echo '$(srcdir)/'`moc_toworksheetwidget.cpp tora-moc_toworksheetwidget.obj: moc_toworksheetwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toworksheetwidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_toworksheetwidget.Tpo -c -o tora-moc_toworksheetwidget.obj `if test -f 'moc_toworksheetwidget.cpp'; then $(CYGPATH_W) 'moc_toworksheetwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toworksheetwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toworksheetwidget.Tpo $(DEPDIR)/tora-moc_toworksheetwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toworksheetwidget.cpp' object='tora-moc_toworksheetwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toworksheetwidget.obj `if test -f 'moc_toworksheetwidget.cpp'; then $(CYGPATH_W) 'moc_toworksheetwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toworksheetwidget.cpp'; fi` tora-moc_toworksheetstatistic.o: moc_toworksheetstatistic.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toworksheetstatistic.o -MD -MP -MF $(DEPDIR)/tora-moc_toworksheetstatistic.Tpo -c -o tora-moc_toworksheetstatistic.o `test -f 'moc_toworksheetstatistic.cpp' || echo '$(srcdir)/'`moc_toworksheetstatistic.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toworksheetstatistic.Tpo $(DEPDIR)/tora-moc_toworksheetstatistic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toworksheetstatistic.cpp' object='tora-moc_toworksheetstatistic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toworksheetstatistic.o `test -f 'moc_toworksheetstatistic.cpp' || echo '$(srcdir)/'`moc_toworksheetstatistic.cpp tora-moc_toworksheetstatistic.obj: moc_toworksheetstatistic.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toworksheetstatistic.obj -MD -MP -MF $(DEPDIR)/tora-moc_toworksheetstatistic.Tpo -c -o tora-moc_toworksheetstatistic.obj `if test -f 'moc_toworksheetstatistic.cpp'; then $(CYGPATH_W) 'moc_toworksheetstatistic.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toworksheetstatistic.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toworksheetstatistic.Tpo $(DEPDIR)/tora-moc_toworksheetstatistic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toworksheetstatistic.cpp' object='tora-moc_toworksheetstatistic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toworksheetstatistic.obj `if test -f 'moc_toworksheetstatistic.cpp'; then $(CYGPATH_W) 'moc_toworksheetstatistic.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toworksheetstatistic.cpp'; fi` tora-moc_utils.o: moc_utils.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_utils.o -MD -MP -MF $(DEPDIR)/tora-moc_utils.Tpo -c -o tora-moc_utils.o `test -f 'moc_utils.cpp' || echo '$(srcdir)/'`moc_utils.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_utils.Tpo $(DEPDIR)/tora-moc_utils.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_utils.cpp' object='tora-moc_utils.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_utils.o `test -f 'moc_utils.cpp' || echo '$(srcdir)/'`moc_utils.cpp tora-moc_utils.obj: moc_utils.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_utils.obj -MD -MP -MF $(DEPDIR)/tora-moc_utils.Tpo -c -o tora-moc_utils.obj `if test -f 'moc_utils.cpp'; then $(CYGPATH_W) 'moc_utils.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_utils.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_utils.Tpo $(DEPDIR)/tora-moc_utils.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_utils.cpp' object='tora-moc_utils.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_utils.obj `if test -f 'moc_utils.cpp'; then $(CYGPATH_W) 'moc_utils.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_utils.cpp'; fi` tora-moc_toscriptschemawidget.o: moc_toscriptschemawidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toscriptschemawidget.o -MD -MP -MF $(DEPDIR)/tora-moc_toscriptschemawidget.Tpo -c -o tora-moc_toscriptschemawidget.o `test -f 'moc_toscriptschemawidget.cpp' || echo '$(srcdir)/'`moc_toscriptschemawidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toscriptschemawidget.Tpo $(DEPDIR)/tora-moc_toscriptschemawidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toscriptschemawidget.cpp' object='tora-moc_toscriptschemawidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toscriptschemawidget.o `test -f 'moc_toscriptschemawidget.cpp' || echo '$(srcdir)/'`moc_toscriptschemawidget.cpp tora-moc_toscriptschemawidget.obj: moc_toscriptschemawidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toscriptschemawidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_toscriptschemawidget.Tpo -c -o tora-moc_toscriptschemawidget.obj `if test -f 'moc_toscriptschemawidget.cpp'; then $(CYGPATH_W) 'moc_toscriptschemawidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toscriptschemawidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toscriptschemawidget.Tpo $(DEPDIR)/tora-moc_toscriptschemawidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toscriptschemawidget.cpp' object='tora-moc_toscriptschemawidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toscriptschemawidget.obj `if test -f 'moc_toscriptschemawidget.cpp'; then $(CYGPATH_W) 'moc_toscriptschemawidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toscriptschemawidget.cpp'; fi` tora-moc_toscripttreemodel.o: moc_toscripttreemodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toscripttreemodel.o -MD -MP -MF $(DEPDIR)/tora-moc_toscripttreemodel.Tpo -c -o tora-moc_toscripttreemodel.o `test -f 'moc_toscripttreemodel.cpp' || echo '$(srcdir)/'`moc_toscripttreemodel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toscripttreemodel.Tpo $(DEPDIR)/tora-moc_toscripttreemodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toscripttreemodel.cpp' object='tora-moc_toscripttreemodel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toscripttreemodel.o `test -f 'moc_toscripttreemodel.cpp' || echo '$(srcdir)/'`moc_toscripttreemodel.cpp tora-moc_toscripttreemodel.obj: moc_toscripttreemodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toscripttreemodel.obj -MD -MP -MF $(DEPDIR)/tora-moc_toscripttreemodel.Tpo -c -o tora-moc_toscripttreemodel.obj `if test -f 'moc_toscripttreemodel.cpp'; then $(CYGPATH_W) 'moc_toscripttreemodel.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toscripttreemodel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toscripttreemodel.Tpo $(DEPDIR)/tora-moc_toscripttreemodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toscripttreemodel.cpp' object='tora-moc_toscripttreemodel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toscripttreemodel.obj `if test -f 'moc_toscripttreemodel.cpp'; then $(CYGPATH_W) 'moc_toscripttreemodel.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toscripttreemodel.cpp'; fi` tora-moc_toworkingwidget.o: moc_toworkingwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toworkingwidget.o -MD -MP -MF $(DEPDIR)/tora-moc_toworkingwidget.Tpo -c -o tora-moc_toworkingwidget.o `test -f 'moc_toworkingwidget.cpp' || echo '$(srcdir)/'`moc_toworkingwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toworkingwidget.Tpo $(DEPDIR)/tora-moc_toworkingwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toworkingwidget.cpp' object='tora-moc_toworkingwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toworkingwidget.o `test -f 'moc_toworkingwidget.cpp' || echo '$(srcdir)/'`moc_toworkingwidget.cpp tora-moc_toworkingwidget.obj: moc_toworkingwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toworkingwidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_toworkingwidget.Tpo -c -o tora-moc_toworkingwidget.obj `if test -f 'moc_toworkingwidget.cpp'; then $(CYGPATH_W) 'moc_toworkingwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toworkingwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toworkingwidget.Tpo $(DEPDIR)/tora-moc_toworkingwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toworkingwidget.cpp' object='tora-moc_toworkingwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toworkingwidget.obj `if test -f 'moc_toworkingwidget.cpp'; then $(CYGPATH_W) 'moc_toworkingwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toworkingwidget.cpp'; fi` tora-moc_shortcuteditordialog.o: shortcuteditor/moc_shortcuteditordialog.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_shortcuteditordialog.o -MD -MP -MF $(DEPDIR)/tora-moc_shortcuteditordialog.Tpo -c -o tora-moc_shortcuteditordialog.o `test -f 'shortcuteditor/moc_shortcuteditordialog.cpp' || echo '$(srcdir)/'`shortcuteditor/moc_shortcuteditordialog.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_shortcuteditordialog.Tpo $(DEPDIR)/tora-moc_shortcuteditordialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='shortcuteditor/moc_shortcuteditordialog.cpp' object='tora-moc_shortcuteditordialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_shortcuteditordialog.o `test -f 'shortcuteditor/moc_shortcuteditordialog.cpp' || echo '$(srcdir)/'`shortcuteditor/moc_shortcuteditordialog.cpp tora-moc_shortcuteditordialog.obj: shortcuteditor/moc_shortcuteditordialog.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_shortcuteditordialog.obj -MD -MP -MF $(DEPDIR)/tora-moc_shortcuteditordialog.Tpo -c -o tora-moc_shortcuteditordialog.obj `if test -f 'shortcuteditor/moc_shortcuteditordialog.cpp'; then $(CYGPATH_W) 'shortcuteditor/moc_shortcuteditordialog.cpp'; else $(CYGPATH_W) '$(srcdir)/shortcuteditor/moc_shortcuteditordialog.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_shortcuteditordialog.Tpo $(DEPDIR)/tora-moc_shortcuteditordialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='shortcuteditor/moc_shortcuteditordialog.cpp' object='tora-moc_shortcuteditordialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_shortcuteditordialog.obj `if test -f 'shortcuteditor/moc_shortcuteditordialog.cpp'; then $(CYGPATH_W) 'shortcuteditor/moc_shortcuteditordialog.cpp'; else $(CYGPATH_W) '$(srcdir)/shortcuteditor/moc_shortcuteditordialog.cpp'; fi` tora-moc_shortcutmodel.o: shortcuteditor/moc_shortcutmodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_shortcutmodel.o -MD -MP -MF $(DEPDIR)/tora-moc_shortcutmodel.Tpo -c -o tora-moc_shortcutmodel.o `test -f 'shortcuteditor/moc_shortcutmodel.cpp' || echo '$(srcdir)/'`shortcuteditor/moc_shortcutmodel.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_shortcutmodel.Tpo $(DEPDIR)/tora-moc_shortcutmodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='shortcuteditor/moc_shortcutmodel.cpp' object='tora-moc_shortcutmodel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_shortcutmodel.o `test -f 'shortcuteditor/moc_shortcutmodel.cpp' || echo '$(srcdir)/'`shortcuteditor/moc_shortcutmodel.cpp tora-moc_shortcutmodel.obj: shortcuteditor/moc_shortcutmodel.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_shortcutmodel.obj -MD -MP -MF $(DEPDIR)/tora-moc_shortcutmodel.Tpo -c -o tora-moc_shortcutmodel.obj `if test -f 'shortcuteditor/moc_shortcutmodel.cpp'; then $(CYGPATH_W) 'shortcuteditor/moc_shortcutmodel.cpp'; else $(CYGPATH_W) '$(srcdir)/shortcuteditor/moc_shortcutmodel.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_shortcutmodel.Tpo $(DEPDIR)/tora-moc_shortcutmodel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='shortcuteditor/moc_shortcutmodel.cpp' object='tora-moc_shortcutmodel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_shortcutmodel.obj `if test -f 'shortcuteditor/moc_shortcutmodel.cpp'; then $(CYGPATH_W) 'shortcuteditor/moc_shortcutmodel.cpp'; else $(CYGPATH_W) '$(srcdir)/shortcuteditor/moc_shortcutmodel.cpp'; fi` tora-moc_todocklet.o: moc_todocklet.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_todocklet.o -MD -MP -MF $(DEPDIR)/tora-moc_todocklet.Tpo -c -o tora-moc_todocklet.o `test -f 'moc_todocklet.cpp' || echo '$(srcdir)/'`moc_todocklet.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_todocklet.Tpo $(DEPDIR)/tora-moc_todocklet.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_todocklet.cpp' object='tora-moc_todocklet.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_todocklet.o `test -f 'moc_todocklet.cpp' || echo '$(srcdir)/'`moc_todocklet.cpp tora-moc_todocklet.obj: moc_todocklet.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_todocklet.obj -MD -MP -MF $(DEPDIR)/tora-moc_todocklet.Tpo -c -o tora-moc_todocklet.obj `if test -f 'moc_todocklet.cpp'; then $(CYGPATH_W) 'moc_todocklet.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_todocklet.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_todocklet.Tpo $(DEPDIR)/tora-moc_todocklet.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_todocklet.cpp' object='tora-moc_todocklet.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_todocklet.obj `if test -f 'moc_todocklet.cpp'; then $(CYGPATH_W) 'moc_todocklet.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_todocklet.cpp'; fi` tora-moc_todockbar.o: moc_todockbar.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_todockbar.o -MD -MP -MF $(DEPDIR)/tora-moc_todockbar.Tpo -c -o tora-moc_todockbar.o `test -f 'moc_todockbar.cpp' || echo '$(srcdir)/'`moc_todockbar.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_todockbar.Tpo $(DEPDIR)/tora-moc_todockbar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_todockbar.cpp' object='tora-moc_todockbar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_todockbar.o `test -f 'moc_todockbar.cpp' || echo '$(srcdir)/'`moc_todockbar.cpp tora-moc_todockbar.obj: moc_todockbar.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_todockbar.obj -MD -MP -MF $(DEPDIR)/tora-moc_todockbar.Tpo -c -o tora-moc_todockbar.obj `if test -f 'moc_todockbar.cpp'; then $(CYGPATH_W) 'moc_todockbar.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_todockbar.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_todockbar.Tpo $(DEPDIR)/tora-moc_todockbar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_todockbar.cpp' object='tora-moc_todockbar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_todockbar.obj `if test -f 'moc_todockbar.cpp'; then $(CYGPATH_W) 'moc_todockbar.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_todockbar.cpp'; fi` tora-moc_topushbutton.o: moc_topushbutton.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_topushbutton.o -MD -MP -MF $(DEPDIR)/tora-moc_topushbutton.Tpo -c -o tora-moc_topushbutton.o `test -f 'moc_topushbutton.cpp' || echo '$(srcdir)/'`moc_topushbutton.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_topushbutton.Tpo $(DEPDIR)/tora-moc_topushbutton.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_topushbutton.cpp' object='tora-moc_topushbutton.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_topushbutton.o `test -f 'moc_topushbutton.cpp' || echo '$(srcdir)/'`moc_topushbutton.cpp tora-moc_topushbutton.obj: moc_topushbutton.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_topushbutton.obj -MD -MP -MF $(DEPDIR)/tora-moc_topushbutton.Tpo -c -o tora-moc_topushbutton.obj `if test -f 'moc_topushbutton.cpp'; then $(CYGPATH_W) 'moc_topushbutton.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_topushbutton.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_topushbutton.Tpo $(DEPDIR)/tora-moc_topushbutton.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_topushbutton.cpp' object='tora-moc_topushbutton.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_topushbutton.obj `if test -f 'moc_topushbutton.cpp'; then $(CYGPATH_W) 'moc_topushbutton.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_topushbutton.cpp'; fi` tora-moc_tobrowserbasewidget.o: moc_tobrowserbasewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserbasewidget.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserbasewidget.Tpo -c -o tora-moc_tobrowserbasewidget.o `test -f 'moc_tobrowserbasewidget.cpp' || echo '$(srcdir)/'`moc_tobrowserbasewidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserbasewidget.Tpo $(DEPDIR)/tora-moc_tobrowserbasewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserbasewidget.cpp' object='tora-moc_tobrowserbasewidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserbasewidget.o `test -f 'moc_tobrowserbasewidget.cpp' || echo '$(srcdir)/'`moc_tobrowserbasewidget.cpp tora-moc_tobrowserbasewidget.obj: moc_tobrowserbasewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserbasewidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserbasewidget.Tpo -c -o tora-moc_tobrowserbasewidget.obj `if test -f 'moc_tobrowserbasewidget.cpp'; then $(CYGPATH_W) 'moc_tobrowserbasewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserbasewidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserbasewidget.Tpo $(DEPDIR)/tora-moc_tobrowserbasewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserbasewidget.cpp' object='tora-moc_tobrowserbasewidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserbasewidget.obj `if test -f 'moc_tobrowserbasewidget.cpp'; then $(CYGPATH_W) 'moc_tobrowserbasewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserbasewidget.cpp'; fi` tora-moc_tobrowseraccesswidget.o: moc_tobrowseraccesswidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowseraccesswidget.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowseraccesswidget.Tpo -c -o tora-moc_tobrowseraccesswidget.o `test -f 'moc_tobrowseraccesswidget.cpp' || echo '$(srcdir)/'`moc_tobrowseraccesswidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowseraccesswidget.Tpo $(DEPDIR)/tora-moc_tobrowseraccesswidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowseraccesswidget.cpp' object='tora-moc_tobrowseraccesswidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowseraccesswidget.o `test -f 'moc_tobrowseraccesswidget.cpp' || echo '$(srcdir)/'`moc_tobrowseraccesswidget.cpp tora-moc_tobrowseraccesswidget.obj: moc_tobrowseraccesswidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowseraccesswidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowseraccesswidget.Tpo -c -o tora-moc_tobrowseraccesswidget.obj `if test -f 'moc_tobrowseraccesswidget.cpp'; then $(CYGPATH_W) 'moc_tobrowseraccesswidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowseraccesswidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowseraccesswidget.Tpo $(DEPDIR)/tora-moc_tobrowseraccesswidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowseraccesswidget.cpp' object='tora-moc_tobrowseraccesswidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowseraccesswidget.obj `if test -f 'moc_tobrowseraccesswidget.cpp'; then $(CYGPATH_W) 'moc_tobrowseraccesswidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowseraccesswidget.cpp'; fi` tora-moc_tobrowsertablewidget.o: moc_tobrowsertablewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowsertablewidget.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowsertablewidget.Tpo -c -o tora-moc_tobrowsertablewidget.o `test -f 'moc_tobrowsertablewidget.cpp' || echo '$(srcdir)/'`moc_tobrowsertablewidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowsertablewidget.Tpo $(DEPDIR)/tora-moc_tobrowsertablewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowsertablewidget.cpp' object='tora-moc_tobrowsertablewidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowsertablewidget.o `test -f 'moc_tobrowsertablewidget.cpp' || echo '$(srcdir)/'`moc_tobrowsertablewidget.cpp tora-moc_tobrowsertablewidget.obj: moc_tobrowsertablewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowsertablewidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowsertablewidget.Tpo -c -o tora-moc_tobrowsertablewidget.obj `if test -f 'moc_tobrowsertablewidget.cpp'; then $(CYGPATH_W) 'moc_tobrowsertablewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowsertablewidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowsertablewidget.Tpo $(DEPDIR)/tora-moc_tobrowsertablewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowsertablewidget.cpp' object='tora-moc_tobrowsertablewidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowsertablewidget.obj `if test -f 'moc_tobrowsertablewidget.cpp'; then $(CYGPATH_W) 'moc_tobrowsertablewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowsertablewidget.cpp'; fi` tora-moc_tobrowserviewwidget.o: moc_tobrowserviewwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserviewwidget.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserviewwidget.Tpo -c -o tora-moc_tobrowserviewwidget.o `test -f 'moc_tobrowserviewwidget.cpp' || echo '$(srcdir)/'`moc_tobrowserviewwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserviewwidget.Tpo $(DEPDIR)/tora-moc_tobrowserviewwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserviewwidget.cpp' object='tora-moc_tobrowserviewwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserviewwidget.o `test -f 'moc_tobrowserviewwidget.cpp' || echo '$(srcdir)/'`moc_tobrowserviewwidget.cpp tora-moc_tobrowserviewwidget.obj: moc_tobrowserviewwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserviewwidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserviewwidget.Tpo -c -o tora-moc_tobrowserviewwidget.obj `if test -f 'moc_tobrowserviewwidget.cpp'; then $(CYGPATH_W) 'moc_tobrowserviewwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserviewwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserviewwidget.Tpo $(DEPDIR)/tora-moc_tobrowserviewwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserviewwidget.cpp' object='tora-moc_tobrowserviewwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserviewwidget.obj `if test -f 'moc_tobrowserviewwidget.cpp'; then $(CYGPATH_W) 'moc_tobrowserviewwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserviewwidget.cpp'; fi` tora-moc_tobrowserindexwidget.o: moc_tobrowserindexwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserindexwidget.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserindexwidget.Tpo -c -o tora-moc_tobrowserindexwidget.o `test -f 'moc_tobrowserindexwidget.cpp' || echo '$(srcdir)/'`moc_tobrowserindexwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserindexwidget.Tpo $(DEPDIR)/tora-moc_tobrowserindexwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserindexwidget.cpp' object='tora-moc_tobrowserindexwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserindexwidget.o `test -f 'moc_tobrowserindexwidget.cpp' || echo '$(srcdir)/'`moc_tobrowserindexwidget.cpp tora-moc_tobrowserindexwidget.obj: moc_tobrowserindexwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserindexwidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserindexwidget.Tpo -c -o tora-moc_tobrowserindexwidget.obj `if test -f 'moc_tobrowserindexwidget.cpp'; then $(CYGPATH_W) 'moc_tobrowserindexwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserindexwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserindexwidget.Tpo $(DEPDIR)/tora-moc_tobrowserindexwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserindexwidget.cpp' object='tora-moc_tobrowserindexwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserindexwidget.obj `if test -f 'moc_tobrowserindexwidget.cpp'; then $(CYGPATH_W) 'moc_tobrowserindexwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserindexwidget.cpp'; fi` tora-moc_tobrowserschemawidget.o: moc_tobrowserschemawidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserschemawidget.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserschemawidget.Tpo -c -o tora-moc_tobrowserschemawidget.o `test -f 'moc_tobrowserschemawidget.cpp' || echo '$(srcdir)/'`moc_tobrowserschemawidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserschemawidget.Tpo $(DEPDIR)/tora-moc_tobrowserschemawidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserschemawidget.cpp' object='tora-moc_tobrowserschemawidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserschemawidget.o `test -f 'moc_tobrowserschemawidget.cpp' || echo '$(srcdir)/'`moc_tobrowserschemawidget.cpp tora-moc_tobrowserschemawidget.obj: moc_tobrowserschemawidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserschemawidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserschemawidget.Tpo -c -o tora-moc_tobrowserschemawidget.obj `if test -f 'moc_tobrowserschemawidget.cpp'; then $(CYGPATH_W) 'moc_tobrowserschemawidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserschemawidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserschemawidget.Tpo $(DEPDIR)/tora-moc_tobrowserschemawidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserschemawidget.cpp' object='tora-moc_tobrowserschemawidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserschemawidget.obj `if test -f 'moc_tobrowserschemawidget.cpp'; then $(CYGPATH_W) 'moc_tobrowserschemawidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserschemawidget.cpp'; fi` tora-moc_tobrowsersequencewidget.o: moc_tobrowsersequencewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowsersequencewidget.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowsersequencewidget.Tpo -c -o tora-moc_tobrowsersequencewidget.o `test -f 'moc_tobrowsersequencewidget.cpp' || echo '$(srcdir)/'`moc_tobrowsersequencewidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowsersequencewidget.Tpo $(DEPDIR)/tora-moc_tobrowsersequencewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowsersequencewidget.cpp' object='tora-moc_tobrowsersequencewidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowsersequencewidget.o `test -f 'moc_tobrowsersequencewidget.cpp' || echo '$(srcdir)/'`moc_tobrowsersequencewidget.cpp tora-moc_tobrowsersequencewidget.obj: moc_tobrowsersequencewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowsersequencewidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowsersequencewidget.Tpo -c -o tora-moc_tobrowsersequencewidget.obj `if test -f 'moc_tobrowsersequencewidget.cpp'; then $(CYGPATH_W) 'moc_tobrowsersequencewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowsersequencewidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowsersequencewidget.Tpo $(DEPDIR)/tora-moc_tobrowsersequencewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowsersequencewidget.cpp' object='tora-moc_tobrowsersequencewidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowsersequencewidget.obj `if test -f 'moc_tobrowsersequencewidget.cpp'; then $(CYGPATH_W) 'moc_tobrowsersequencewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowsersequencewidget.cpp'; fi` tora-moc_tobrowsersynonymwidget.o: moc_tobrowsersynonymwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowsersynonymwidget.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowsersynonymwidget.Tpo -c -o tora-moc_tobrowsersynonymwidget.o `test -f 'moc_tobrowsersynonymwidget.cpp' || echo '$(srcdir)/'`moc_tobrowsersynonymwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowsersynonymwidget.Tpo $(DEPDIR)/tora-moc_tobrowsersynonymwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowsersynonymwidget.cpp' object='tora-moc_tobrowsersynonymwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowsersynonymwidget.o `test -f 'moc_tobrowsersynonymwidget.cpp' || echo '$(srcdir)/'`moc_tobrowsersynonymwidget.cpp tora-moc_tobrowsersynonymwidget.obj: moc_tobrowsersynonymwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowsersynonymwidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowsersynonymwidget.Tpo -c -o tora-moc_tobrowsersynonymwidget.obj `if test -f 'moc_tobrowsersynonymwidget.cpp'; then $(CYGPATH_W) 'moc_tobrowsersynonymwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowsersynonymwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowsersynonymwidget.Tpo $(DEPDIR)/tora-moc_tobrowsersynonymwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowsersynonymwidget.cpp' object='tora-moc_tobrowsersynonymwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowsersynonymwidget.obj `if test -f 'moc_tobrowsersynonymwidget.cpp'; then $(CYGPATH_W) 'moc_tobrowsersynonymwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowsersynonymwidget.cpp'; fi` tora-moc_tobrowsercodewidget.o: moc_tobrowsercodewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowsercodewidget.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowsercodewidget.Tpo -c -o tora-moc_tobrowsercodewidget.o `test -f 'moc_tobrowsercodewidget.cpp' || echo '$(srcdir)/'`moc_tobrowsercodewidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowsercodewidget.Tpo $(DEPDIR)/tora-moc_tobrowsercodewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowsercodewidget.cpp' object='tora-moc_tobrowsercodewidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowsercodewidget.o `test -f 'moc_tobrowsercodewidget.cpp' || echo '$(srcdir)/'`moc_tobrowsercodewidget.cpp tora-moc_tobrowsercodewidget.obj: moc_tobrowsercodewidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowsercodewidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowsercodewidget.Tpo -c -o tora-moc_tobrowsercodewidget.obj `if test -f 'moc_tobrowsercodewidget.cpp'; then $(CYGPATH_W) 'moc_tobrowsercodewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowsercodewidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowsercodewidget.Tpo $(DEPDIR)/tora-moc_tobrowsercodewidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowsercodewidget.cpp' object='tora-moc_tobrowsercodewidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowsercodewidget.obj `if test -f 'moc_tobrowsercodewidget.cpp'; then $(CYGPATH_W) 'moc_tobrowsercodewidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowsercodewidget.cpp'; fi` tora-moc_tobrowsertriggerwidget.o: moc_tobrowsertriggerwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowsertriggerwidget.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowsertriggerwidget.Tpo -c -o tora-moc_tobrowsertriggerwidget.o `test -f 'moc_tobrowsertriggerwidget.cpp' || echo '$(srcdir)/'`moc_tobrowsertriggerwidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowsertriggerwidget.Tpo $(DEPDIR)/tora-moc_tobrowsertriggerwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowsertriggerwidget.cpp' object='tora-moc_tobrowsertriggerwidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowsertriggerwidget.o `test -f 'moc_tobrowsertriggerwidget.cpp' || echo '$(srcdir)/'`moc_tobrowsertriggerwidget.cpp tora-moc_tobrowsertriggerwidget.obj: moc_tobrowsertriggerwidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowsertriggerwidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowsertriggerwidget.Tpo -c -o tora-moc_tobrowsertriggerwidget.obj `if test -f 'moc_tobrowsertriggerwidget.cpp'; then $(CYGPATH_W) 'moc_tobrowsertriggerwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowsertriggerwidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowsertriggerwidget.Tpo $(DEPDIR)/tora-moc_tobrowsertriggerwidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowsertriggerwidget.cpp' object='tora-moc_tobrowsertriggerwidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowsertriggerwidget.obj `if test -f 'moc_tobrowsertriggerwidget.cpp'; then $(CYGPATH_W) 'moc_tobrowsertriggerwidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowsertriggerwidget.cpp'; fi` tora-moc_tobrowserdblinkswidget.o: moc_tobrowserdblinkswidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserdblinkswidget.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserdblinkswidget.Tpo -c -o tora-moc_tobrowserdblinkswidget.o `test -f 'moc_tobrowserdblinkswidget.cpp' || echo '$(srcdir)/'`moc_tobrowserdblinkswidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserdblinkswidget.Tpo $(DEPDIR)/tora-moc_tobrowserdblinkswidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserdblinkswidget.cpp' object='tora-moc_tobrowserdblinkswidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserdblinkswidget.o `test -f 'moc_tobrowserdblinkswidget.cpp' || echo '$(srcdir)/'`moc_tobrowserdblinkswidget.cpp tora-moc_tobrowserdblinkswidget.obj: moc_tobrowserdblinkswidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserdblinkswidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserdblinkswidget.Tpo -c -o tora-moc_tobrowserdblinkswidget.obj `if test -f 'moc_tobrowserdblinkswidget.cpp'; then $(CYGPATH_W) 'moc_tobrowserdblinkswidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserdblinkswidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserdblinkswidget.Tpo $(DEPDIR)/tora-moc_tobrowserdblinkswidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserdblinkswidget.cpp' object='tora-moc_tobrowserdblinkswidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserdblinkswidget.obj `if test -f 'moc_tobrowserdblinkswidget.cpp'; then $(CYGPATH_W) 'moc_tobrowserdblinkswidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserdblinkswidget.cpp'; fi` tora-moc_tobrowserdirectorieswidget.o: moc_tobrowserdirectorieswidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserdirectorieswidget.o -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserdirectorieswidget.Tpo -c -o tora-moc_tobrowserdirectorieswidget.o `test -f 'moc_tobrowserdirectorieswidget.cpp' || echo '$(srcdir)/'`moc_tobrowserdirectorieswidget.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserdirectorieswidget.Tpo $(DEPDIR)/tora-moc_tobrowserdirectorieswidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserdirectorieswidget.cpp' object='tora-moc_tobrowserdirectorieswidget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserdirectorieswidget.o `test -f 'moc_tobrowserdirectorieswidget.cpp' || echo '$(srcdir)/'`moc_tobrowserdirectorieswidget.cpp tora-moc_tobrowserdirectorieswidget.obj: moc_tobrowserdirectorieswidget.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tobrowserdirectorieswidget.obj -MD -MP -MF $(DEPDIR)/tora-moc_tobrowserdirectorieswidget.Tpo -c -o tora-moc_tobrowserdirectorieswidget.obj `if test -f 'moc_tobrowserdirectorieswidget.cpp'; then $(CYGPATH_W) 'moc_tobrowserdirectorieswidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserdirectorieswidget.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tobrowserdirectorieswidget.Tpo $(DEPDIR)/tora-moc_tobrowserdirectorieswidget.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tobrowserdirectorieswidget.cpp' object='tora-moc_tobrowserdirectorieswidget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tobrowserdirectorieswidget.obj `if test -f 'moc_tobrowserdirectorieswidget.cpp'; then $(CYGPATH_W) 'moc_tobrowserdirectorieswidget.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tobrowserdirectorieswidget.cpp'; fi` tora-moc_toresultgrants.o: moc_toresultgrants.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultgrants.o -MD -MP -MF $(DEPDIR)/tora-moc_toresultgrants.Tpo -c -o tora-moc_toresultgrants.o `test -f 'moc_toresultgrants.cpp' || echo '$(srcdir)/'`moc_toresultgrants.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultgrants.Tpo $(DEPDIR)/tora-moc_toresultgrants.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultgrants.cpp' object='tora-moc_toresultgrants.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultgrants.o `test -f 'moc_toresultgrants.cpp' || echo '$(srcdir)/'`moc_toresultgrants.cpp tora-moc_toresultgrants.obj: moc_toresultgrants.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toresultgrants.obj -MD -MP -MF $(DEPDIR)/tora-moc_toresultgrants.Tpo -c -o tora-moc_toresultgrants.obj `if test -f 'moc_toresultgrants.cpp'; then $(CYGPATH_W) 'moc_toresultgrants.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultgrants.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toresultgrants.Tpo $(DEPDIR)/tora-moc_toresultgrants.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_toresultgrants.cpp' object='tora-moc_toresultgrants.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toresultgrants.obj `if test -f 'moc_toresultgrants.cpp'; then $(CYGPATH_W) 'moc_toresultgrants.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_toresultgrants.cpp'; fi` tora-moc_toviewdirectory.o: docklets/moc_toviewdirectory.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toviewdirectory.o -MD -MP -MF $(DEPDIR)/tora-moc_toviewdirectory.Tpo -c -o tora-moc_toviewdirectory.o `test -f 'docklets/moc_toviewdirectory.cpp' || echo '$(srcdir)/'`docklets/moc_toviewdirectory.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toviewdirectory.Tpo $(DEPDIR)/tora-moc_toviewdirectory.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='docklets/moc_toviewdirectory.cpp' object='tora-moc_toviewdirectory.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toviewdirectory.o `test -f 'docklets/moc_toviewdirectory.cpp' || echo '$(srcdir)/'`docklets/moc_toviewdirectory.cpp tora-moc_toviewdirectory.obj: docklets/moc_toviewdirectory.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toviewdirectory.obj -MD -MP -MF $(DEPDIR)/tora-moc_toviewdirectory.Tpo -c -o tora-moc_toviewdirectory.obj `if test -f 'docklets/moc_toviewdirectory.cpp'; then $(CYGPATH_W) 'docklets/moc_toviewdirectory.cpp'; else $(CYGPATH_W) '$(srcdir)/docklets/moc_toviewdirectory.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toviewdirectory.Tpo $(DEPDIR)/tora-moc_toviewdirectory.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='docklets/moc_toviewdirectory.cpp' object='tora-moc_toviewdirectory.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toviewdirectory.obj `if test -f 'docklets/moc_toviewdirectory.cpp'; then $(CYGPATH_W) 'docklets/moc_toviewdirectory.cpp'; else $(CYGPATH_W) '$(srcdir)/docklets/moc_toviewdirectory.cpp'; fi` tora-moc_toviewconnections.o: docklets/moc_toviewconnections.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toviewconnections.o -MD -MP -MF $(DEPDIR)/tora-moc_toviewconnections.Tpo -c -o tora-moc_toviewconnections.o `test -f 'docklets/moc_toviewconnections.cpp' || echo '$(srcdir)/'`docklets/moc_toviewconnections.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toviewconnections.Tpo $(DEPDIR)/tora-moc_toviewconnections.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='docklets/moc_toviewconnections.cpp' object='tora-moc_toviewconnections.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toviewconnections.o `test -f 'docklets/moc_toviewconnections.cpp' || echo '$(srcdir)/'`docklets/moc_toviewconnections.cpp tora-moc_toviewconnections.obj: docklets/moc_toviewconnections.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_toviewconnections.obj -MD -MP -MF $(DEPDIR)/tora-moc_toviewconnections.Tpo -c -o tora-moc_toviewconnections.obj `if test -f 'docklets/moc_toviewconnections.cpp'; then $(CYGPATH_W) 'docklets/moc_toviewconnections.cpp'; else $(CYGPATH_W) '$(srcdir)/docklets/moc_toviewconnections.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_toviewconnections.Tpo $(DEPDIR)/tora-moc_toviewconnections.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='docklets/moc_toviewconnections.cpp' object='tora-moc_toviewconnections.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_toviewconnections.obj `if test -f 'docklets/moc_toviewconnections.cpp'; then $(CYGPATH_W) 'docklets/moc_toviewconnections.cpp'; else $(CYGPATH_W) '$(srcdir)/docklets/moc_toviewconnections.cpp'; fi` tora-moc_tooraclesetting.o: moc_tooraclesetting.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tooraclesetting.o -MD -MP -MF $(DEPDIR)/tora-moc_tooraclesetting.Tpo -c -o tora-moc_tooraclesetting.o `test -f 'moc_tooraclesetting.cpp' || echo '$(srcdir)/'`moc_tooraclesetting.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tooraclesetting.Tpo $(DEPDIR)/tora-moc_tooraclesetting.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tooraclesetting.cpp' object='tora-moc_tooraclesetting.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tooraclesetting.o `test -f 'moc_tooraclesetting.cpp' || echo '$(srcdir)/'`moc_tooraclesetting.cpp tora-moc_tooraclesetting.obj: moc_tooraclesetting.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-moc_tooraclesetting.obj -MD -MP -MF $(DEPDIR)/tora-moc_tooraclesetting.Tpo -c -o tora-moc_tooraclesetting.obj `if test -f 'moc_tooraclesetting.cpp'; then $(CYGPATH_W) 'moc_tooraclesetting.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tooraclesetting.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-moc_tooraclesetting.Tpo $(DEPDIR)/tora-moc_tooraclesetting.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='moc_tooraclesetting.cpp' object='tora-moc_tooraclesetting.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-moc_tooraclesetting.obj `if test -f 'moc_tooraclesetting.cpp'; then $(CYGPATH_W) 'moc_tooraclesetting.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_tooraclesetting.cpp'; fi` tora-qrc_tora.o: qrc_tora.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-qrc_tora.o -MD -MP -MF $(DEPDIR)/tora-qrc_tora.Tpo -c -o tora-qrc_tora.o `test -f 'qrc_tora.cpp' || echo '$(srcdir)/'`qrc_tora.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-qrc_tora.Tpo $(DEPDIR)/tora-qrc_tora.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='qrc_tora.cpp' object='tora-qrc_tora.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-qrc_tora.o `test -f 'qrc_tora.cpp' || echo '$(srcdir)/'`qrc_tora.cpp tora-qrc_tora.obj: qrc_tora.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -MT tora-qrc_tora.obj -MD -MP -MF $(DEPDIR)/tora-qrc_tora.Tpo -c -o tora-qrc_tora.obj `if test -f 'qrc_tora.cpp'; then $(CYGPATH_W) 'qrc_tora.cpp'; else $(CYGPATH_W) '$(srcdir)/qrc_tora.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tora-qrc_tora.Tpo $(DEPDIR)/tora-qrc_tora.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='qrc_tora.cpp' object='tora-qrc_tora.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tora_CXXFLAGS) $(CXXFLAGS) -c -o tora-qrc_tora.obj `if test -f 'qrc_tora.cpp'; then $(CYGPATH_W) 'qrc_tora.cpp'; else $(CYGPATH_W) '$(srcdir)/qrc_tora.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool clean-local \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: all check install install-am install-data-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool clean-local ctags dist-hook \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-data-hook install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-binPROGRAMS # this is a hack (but it *is* mentioned in the automake manual, of all # places). EXTRA_DIST includes all files, even things like CVS # folders. so we delete them here. but specifying all the files in # those subdirs would suck more because many of them are generated # (help api for one). dist-hook: rm -rf `find $(distdir) -name .svn` #.ui.h: # $(UIC) -o $@ $< ui_%.h: %.ui $(UIC) -o $@ $< %.cpp: %.h %.ui $(UIC) -o $@ $< moc_%.cpp: %.h $(MOC) $< -o $@ qrc_%.cpp: %.qrc $(RCC) $< -o $@ #make resource file depend on resources qrc_tora.cpp: help/*.html help/images/*.png icons/*.xpm #.h.moc: # $(MOC) $(AM_CPPFLAGS) -o $@ $< .ts.qm: @if ! test -d i18n; then mkdir i18n; echo "create i18n"; fi $(LRELEASE) $< -qm $@ clean-local: rm -f moc_* for file in `ls *.ui`; do \ rm -f `echo $$file | sed 's/\.ui/\.cpp/g'`; \ rm -f `echo $$file | sed 's/\.ui/\.h/g'`; \ done tora_toad.h: i18n/tora_toad.qm $(top_builddir)/utils/chex/chex $< > $@ tora.pro: Makefile.am echo "# Not indended to be used for anything except lupdate" > tora.pro echo 'SOURCES= \ ' >> tora.pro echo ' main.cpp \ ' >> tora.pro echo ' toextratranslations.cpp \ ' >> tora.pro echo " $(tora_SOURCES)" >> tora.pro echo 'TRANSLATIONS=$(TRANSLATIONS)' >> tora.pro lupdate: tora.pro $(LUPDATE) tora.pro lrelease: tora.pro $(TRANSLATIONS) $(LRELEASE) tora.pro install-data-hook: mkdir -p $(DESTDIR)$(libdir) cp -f $(top_builddir)/src/i18n/*.qm $(DESTDIR)$(libdir) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tora-2.1.3/src/ts_log/0000755000175000017500000000000011445450571014334 5ustar michaelmichaeltora-2.1.3/src/ts_log/ts_log_utils.h0000644000175000017500000000073411415711656017221 0ustar michaelmichael#ifndef __TS_LOG_UTILS__ #define __TS_LOG_UTILS__ #ifndef __HERE__ #ifdef DEBUG #ifdef __GNUC__ #define __HERE__ std::string(((strrchr(__FILE__, '/') ?: __FILE__ - 1) + 1)) + ":"__HERE1__(__LINE__) #define __HERE1__(x) STR(x)"\t" + __PRETTY_FUNCTION__ #define STR(a) #a #else #define __HERE__ std::string(__FILE__) + ":"__HERE1__(__LINE__) #define __HERE1__(x) STR(x)"\t" + __FUNCSIG__ #define STR(a) #a #endif #else #define __HERE__ "" #endif #endif #endif tora-2.1.3/src/ts_log/decorator.h0000644000175000017500000001500111354412713016457 0ustar michaelmichael// // thread safe logger // // This code is based on article by John Torjo // published on: // http://articles.techrepublic.com.com/5100-10878_11-5072104.html# // #ifndef __TS_DECORATOR__ #define __TS_DECORATOR__ #include #include #include /******************************************************************************** * * * Small excerpt from LOKI * * Typelist * ********************************************************************************/ #define TSLOG_TYPELIST_1(a) Typelist< a, NullType> #define TSLOG_TYPELIST_2(a, b) Typelist< a, TSLOG_TYPELIST_1(b)> #define TSLOG_TYPELIST_3(a, b, c) Typelist< a, TSLOG_TYPELIST_2(b,c)> #define TSLOG_TYPELIST_4(a, b, c, d) Typelist< a, TSLOG_TYPELIST_3(b,c,d)> #define TSLOG_TYPELIST_5(a, b, c, d, e) Typelist< a, TSLOG_TYPELIST_4(b,c,d,e)> #define TSLOG_TYPELIST_6(a, b, c, d, e, f) Typelist< a, TSLOG_TYPELIST_5(b,c,d,e,f)> #define TSLOG_TYPELIST_7(a, b, c, d, e, f, g) Typelist< a, TSLOG_TYPELIST_6(b,c,d,e,f,g)> #define TSLOG_TYPELIST_8(a, b, c, d, e, f, g, h) Typelist< a, TSLOG_TYPELIST_7(b,c,d,e,f,g,h)> class NullType {}; template struct Typelist { typedef T Head; typedef U Tail; }; //////////////////////////////////////////////////////////////////////////////// // class template IsSameType // Return true iff two given types are the same // Invocation: SameType::value // where: // T and U are types // Result evaluates to true iff U == T (types equal) //////////////////////////////////////////////////////////////////////////////// template struct IsSameType { enum { value = false }; }; template struct IsSameType { enum { value = true }; }; //////////////////////////////////////////////////////////////////////////////// // class template IndexOf // Finds the index of a type in a typelist // Invocation (TList is a typelist and T is a type): // IndexOf::value // returns the position of T in TList, or NullType if T is not found in TList //////////////////////////////////////////////////////////////////////////////// template struct IndexOf; template struct IndexOf { enum { value = -1 }; }; template struct IndexOf, T> { enum { value = 0 }; }; template struct IndexOf, T> { private: enum { temp = IndexOf::value }; public: enum { value = (temp == -1 ? -1 : 1 + temp) }; }; template< int i> struct int_to_type { int_to_type() { } }; /******************************************************************************** * * * Log header decorator inrerface * * * ********************************************************************************/ class decoratorInterface { public: static inline void decorate(std::ostream &s) {}; static inline void decorate(std::ostream &s, const std::string & here) {}; }; class null_decorator : public decoratorInterface {}; class hereDecorator; template // Typelist class Tdecorator: public decoratorInterface { public: enum { needs_here = IndexOf::value >=0 }; static inline void decorate(std::ostream &s) { typedef typename X::Head Head; typedef typename X::Tail Tail; Head::decorate(s); Tdecorator::decorate(s); } static inline void decorate(std::ostream &s, const std::string & here) { typedef typename X::Head Head; typedef typename X::Tail Tail; if( IsSameType::value) // do use SuperSubclass instead of IsSameType { Head::decorate(s, here); } else { Head::decorate(s); } if( IndexOf::value >= 0 ) { Tdecorator::decorate(s, here); } else { Tdecorator::decorate(s); } } }; template<> class Tdecorator: public decoratorInterface { public: static inline void decorate(std::ostream &s) {}; static inline void decorate(std::ostream &s, const std::string & here) {}; }; /******************************************************************************** * * Some useful decorators * ********************************************************************************/ template class dashDecorator : public decoratorInterface { public: static inline void decorate(std::ostream &s) { #ifndef min #define min(a,b) ((a < b) ? (a) : (b)) #endif static char c[] = "--------------------------------------------------------------------------------"; s << (c + sizeof(c) - 1 - min(sizeof(c)-1, cnt)); #undef min }; static inline void decorate(std::ostream &s, const std::string & here) {}; }; template class wordDecorator : public decoratorInterface { public: static inline void decorate(std::ostream &s) { s << c; }; static inline void decorate(std::ostream &s, const std::string & here) {}; }; template class charDecorator : public decoratorInterface { public: static inline void decorate(std::ostream &s) { s << c; }; static inline void decorate(std::ostream &s, const std::string & here) {}; }; // The only decorator that uses second argument - __LINE__ class hereDecorator : public decoratorInterface { public: static inline void decorate(std::ostream &s) { s << "Internal error: " << __HERE__; } static inline void decorate(std::ostream &s, const std::string & here) { s << here; } }; template class tidDecorator : public decoratorInterface { public: static inline void decorate(std::ostream &s) { const std::string &tid = thread_manager::tid(); #ifdef __linux__ unsigned int color; { const unsigned int fnv_prime = 31; unsigned int hash = 0; unsigned int i = 0; color = 31; for(i = 0; i < tid.length(); i++) { hash *= fnv_prime; hash ^= tid.at(i) - '0'; } hash &= 7; color += hash; } /* End Of FNV Hash Function */ #endif s #ifdef __linux__ << "\x1B" "[" << color << ";1m" #endif << tid #ifdef __linux__ << "\x1B" "[0m" #endif ; } static inline void decorate(std::ostream &s, const std::string & here) {}; }; #endif tora-2.1.3/src/ts_log/thread_safe_log.h0000644000175000017500000004762011445353612017622 0ustar michaelmichael#ifndef __THREAD_SAFE_LOG__ #define __THREAD_SAFE_LOG__ //// excerpt from Listing J // Solution 4 (final solution) // note: compiles with gcc 3.2, VC6 and // Comeau++ (http://www.comeaucomputing.com/tryitout/) #include #include #include #include #include #include //////////////////////////////////////////////////////////////////// // forward declaration template< class char_type, class traits_type = std::char_traits< char_type> > class basic_thread_safe_log; // base class for our internal thread_safe_log object template< class char_type, class traits_type> class basic_internal_thread_safe_log_base { typedef basic_internal_thread_safe_log_base< char_type, traits_type> this_class; typedef typename std::basic_ostream< char_type, traits_type> ostream_type; friend class basic_thread_safe_log< char_type, traits_type>; // non-copyiable basic_internal_thread_safe_log_base( const this_class &); this_class & operator=( this_class &); public: virtual void write_message( const std::basic_string< char_type, traits_type> & str) = 0; virtual void copy_state_to( ostream_type & dest) const = 0; virtual void copy_state_from( const ostream_type & src) = 0; protected: basic_internal_thread_safe_log_base() {} virtual ~basic_internal_thread_safe_log_base() {}; }; // class basic_internal_thread_safe_log_base //////////////////////////////////////////////////////////////////// // internal_thread_safe_log for SharedThread // (multiple logs share the same thread for writing to them) // forward declaration template< class char_type, class traits_type = std::char_traits< char_type>, class thread_manager = DEFAULT_THREAD_MANAGER > class basic_internal_thread_safe_log_sharethread; // allows thread-safe writing for multiple logs template< class char_type, class traits_type = std::char_traits< char_type>, class thread_manager = DEFAULT_THREAD_MANAGER > class basic_thread_safe_log_writer_sharethread { typedef basic_thread_safe_log_writer_sharethread< char_type, traits_type> this_class; typedef std::basic_ostream< char_type, traits_type> ostream_type; typedef std::basic_string< char_type, traits_type> string_type; friend class basic_internal_thread_safe_log_sharethread< char_type, traits_type, thread_manager>; // copying not allowed basic_thread_safe_log_writer_sharethread( const this_class &); this_class & operator=( const this_class &); // forward declaration struct thread_info; friend struct thread_info; // thread-related definitions typedef typename thread_manager::thread_obj_base thread_obj_base; typedef typename thread_manager::critical_section critical_section; typedef typename thread_manager::auto_lock_unlock auto_lock_unlock; // so that from our thread we know the object we're manipulating struct thread_info : public thread_obj_base { thread_info() : m_bHasFinished( false), m_pThis( NULL) {} /* virtual */ void operator()() { while ( true) { // ... we might be writing multiple messages at once! std::vector< std::string *> astrMsgs; ostream_type * pLog = NULL; bool bDoFlush = false; { // begin locked block auto_lock_unlock locker( m_pThis->m_cs); if ( m_pThis->m_nSumOfPriorities <= 0) { // we don't have any logs yet... ////thread_manager::sleep( 1); ////continue; goto unlock_and_sleep; } // find a log that has messages to be written to it for ( int idx = 0; idx < m_pThis->m_nSumOfPriorities; ++idx) { LogWrites & writes = *( m_pThis->m_aWritesTo[ m_pThis->m_idxWrite]); if (!writes.m_astr.empty()) // we found a log that we should write to break; ++m_pThis->m_idxWrite; m_pThis->m_idxWrite %= m_pThis->m_nSumOfPriorities; } // did we find a log with messages that should be written to it? LogWrites & writes = *( m_pThis->m_aWritesTo[ m_pThis->m_idxWrite]); if ( !writes.m_astr.empty()) { // we get the string(s) to write to this log pLog = writes.m_pDestLog; // optimization - if too many messages, write // multiple messages at once int nMessages = 1; if ( writes.m_astr.size() > 100) nMessages = writes.m_astr.size() / 10; while ( nMessages > 0) { astrMsgs.push_back( writes.m_astr.front()); writes.m_astr.pop(); --nMessages; } // we flush only when there are no more messages to write // (flushing could be time-consuming) bDoFlush = writes.m_astr.empty(); } // ... only when there are no more messages, // will we ask if we should be destructed else if ( m_pThis->m_bShouldBeDestructed) { // signal to the other thread we've finished m_bHasFinished = true; return; } } // end locked block // write the string(s) if ( !astrMsgs.empty()) { std::vector< std::string *>::iterator first = astrMsgs.begin(), last = astrMsgs.end(); while ( first != last) { std::string *pstr = *first; *pLog << *pstr; delete pstr; ++first; } if ( bDoFlush) pLog->flush(); } else // nothing to write - wait thread_manager::sleep( 100); continue; unlock_and_sleep: thread_manager::sleep( 100); continue; } // while(true) } // virtual operator()() this_class * m_pThis; volatile bool m_bHasFinished; }; public: basic_thread_safe_log_writer_sharethread() : m_bShouldBeDestructed( false) { m_info.m_pThis = this; thread_manager::create_thread( m_info); m_nSumOfPriorities = 0; m_idxWrite = 0; } ~basic_thread_safe_log_writer_sharethread() { // signal to the other thread we're about to be // destructed { auto_lock_unlock locker( m_cs); m_bShouldBeDestructed = true; } // wait while the other thread writes all messages while ( !thread_manager::join_thread( m_info)) { auto_lock_unlock locker( m_cs); assert( m_info.m_bHasFinished); // the other thread has finished break; } } private: // note: only basic_internal_thread_safe_log can // call these functions // adds a message to be written to a given log void add_message( const string_type & str, ostream_type & log) { auto_lock_unlock locker( m_cs); ostream_type * pLog = &log; m_collLogWrites[ pLog].m_astr.push( new string_type( str)); } // adds a log we can write to, with a given priority void add_log( ostream_type & log, int nPriority) { // priority should be at least one assert( nPriority > 0); auto_lock_unlock locker( m_cs); ostream_type * pLog = &log; m_collLogWrites[ pLog].m_nLogPriority = nPriority; m_collLogWrites[ pLog].m_pDestLog = pLog; m_nSumOfPriorities += nPriority; m_idxWrite = 0; m_aWritesTo.resize( m_nSumOfPriorities); std::fill( m_aWritesTo.begin(), m_aWritesTo.end(), ( LogWrites *)0); typename LogWritesCollection::iterator first = m_collLogWrites.begin(), last = m_collLogWrites.end(); while ( first != last) { LogWrites & writes = first->second; for( int idx = 0; idx < writes.m_nLogPriority; ++idx) { int idxWrite = (int)((double)( idx * m_nSumOfPriorities) / writes.m_nLogPriority); // ... find an empty spot while ( m_aWritesTo[ idxWrite] != 0) { ++idxWrite; idxWrite = idxWrite % m_nSumOfPriorities; } m_aWritesTo[ idxWrite] = &writes; } ++first; } } critical_section & cs() const { return m_cs; } private: // the critical section used for thread-safe locking mutable critical_section m_cs; // needed to create the other thread thread_info m_info; volatile bool m_bShouldBeDestructed; typedef std::queue< string_type* > StringsQueue; // forward declaration; struct LogWrites; friend struct LogWrites; struct LogWrites { LogWrites() : m_nLogPriority( 0), m_pDestLog( NULL) {} // the priority of this log int m_nLogPriority; // the strings to write to this log StringsQueue m_astr; // the log we should write to ostream_type * m_pDestLog; }; // at each step, from which log should we write to? std::vector< LogWrites* > m_aWritesTo; // for each log, what should we write to it? typedef std::map< ostream_type*, LogWrites> LogWritesCollection; LogWritesCollection m_collLogWrites; // the sum of all log' priorities int m_nSumOfPriorities; // the index of the current write // ( always less than m_nSumOfPriorities) int m_idxWrite; }; typedef basic_thread_safe_log_writer_sharethread< char> thread_safe_log_writer_sharethread; typedef basic_thread_safe_log_writer_sharethread< wchar_t> wthread_safe_log_writer_sharethread; // multiple basic_internal_thread_safe logs share the same thread, // which writes to them template< class char_type, class traits_type, class thread_manager> class basic_internal_thread_safe_log_sharethread : public basic_internal_thread_safe_log_base< char_type, traits_type> { typedef basic_internal_thread_safe_log_sharethread< char_type, traits_type, thread_manager> this_class; typedef typename std::basic_ostream< char_type, traits_type> ostream_type; typedef class basic_thread_safe_log_writer_sharethread< char_type, traits_type, thread_manager> multiple_log_writer; // non-copyiable basic_internal_thread_safe_log_sharethread( const this_class &); this_class & operator=( this_class &); // thread-related definitions typedef typename thread_manager::auto_lock_unlock auto_lock_unlock; public: basic_internal_thread_safe_log_sharethread( ostream_type & underlyingLog, multiple_log_writer & writer, int nPriority) : m_underlyingLog( underlyingLog), m_writer( writer) { writer.add_log( m_underlyingLog, nPriority); } ~basic_internal_thread_safe_log_sharethread() {} void write_message( const std::basic_string< char_type, traits_type> & str) { m_writer.add_message( str, m_underlyingLog); } void copy_state_to( ostream_type & dest) const { auto_lock_unlock locker( m_writer.cs()); dest.copyfmt( m_underlyingLog); dest.setstate( m_underlyingLog.rdstate()); } void copy_state_from( const ostream_type & src) { auto_lock_unlock locker( m_writer.cs()); m_underlyingLog.copyfmt( src); m_underlyingLog.setstate( m_underlyingLog.rdstate()); } private: ostream_type & m_underlyingLog; // IMPORTANT: keep it by reference! multiple_log_writer & m_writer; }; typedef basic_internal_thread_safe_log_sharethread< char> internal_thread_safe_log_sharethread; typedef basic_internal_thread_safe_log_sharethread< wchar_t> winternal_thread_safe_log_sharethread; // END OF internal_thread_safe_log for SharedThread // (multiple logs share the same thread for writing to them) //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // internal_thread_safe_log for OwnThread // (each log has its own thread for writing messages to it) // allows thread-safe writing template< class char_type, class traits_type = std::char_traits< char_type>, class thread_manager = DEFAULT_THREAD_MANAGER > class thread_safe_log_writer_ownthread { typedef thread_safe_log_writer_ownthread< char_type, traits_type> this_class; typedef std::basic_ostream< char_type, traits_type> ostream_type; typedef std::basic_string< char_type, traits_type> string_type; // forward declaration struct thread_info; friend struct thread_info; // thread-related definitions typedef typename thread_manager::thread_obj_base thread_obj_base; typedef typename thread_manager::critical_section critical_section; typedef typename thread_manager::auto_lock_unlock auto_lock_unlock; // non-copyiable thread_safe_log_writer_ownthread( const this_class &); // copied from thread_safe_log_writer this_class & operator=( this_class &); // so that from our thread we know the object we're manipulating struct thread_info : public thread_obj_base { thread_info() : m_pThis( NULL), m_bHasFinished( false) {} /* virtual */ void operator()() { while ( true) { std::string * pstr = NULL; bool bDoFlush = false; { auto_lock_unlock locker( m_pThis->m_cs); // get the string if ( !m_pThis->m_astrMessages.empty()) { pstr = m_pThis->m_astrMessages.front(); m_pThis->m_astrMessages.pop(); // we flush only when there are no more messages to write // (flushing could be time-consuming) bDoFlush = m_pThis->m_astrMessages.empty(); } // ... only when there are no more messages, // will we ask if we should be destructed else if ( m_pThis->m_bShouldBeDestructed) { // signal to the other thread we've finished m_pThis->m_underlyingLog << "Log writter thread finished." << std::endl; m_pThis->m_underlyingLog.flush(); m_bHasFinished = true; return; } } // write the string if ( pstr) { m_pThis->m_underlyingLog << *pstr; if ( bDoFlush) m_pThis->m_underlyingLog.flush(); delete pstr; } else // nothing to write - wait thread_manager::sleep( 100); } } this_class * m_pThis; volatile bool m_bHasFinished; }; public: void add_message( const string_type & str) { auto_lock_unlock locker( m_cs); m_astrMessages.push( new string_type( str)); } thread_safe_log_writer_ownthread( ostream_type & underlyingLog) : m_bShouldBeDestructed( false), m_underlyingLog( underlyingLog) { m_info.m_pThis = this; thread_manager::create_thread( m_info); } ~thread_safe_log_writer_ownthread() { // signal to the other thread we're about to be // destructed { auto_lock_unlock locker( m_cs); m_bShouldBeDestructed = true; } // wait while the other thread writes all messages while ( !thread_manager::join_thread( m_info)) { auto_lock_unlock locker( m_cs); assert ( m_info.m_bHasFinished); // the other thread has finished break; } } critical_section & cs() const { return m_cs; } private: // the critical section used for thread-safe locking mutable critical_section m_cs; // needed to create the other thread thread_info m_info; volatile bool m_bShouldBeDestructed; ostream_type & m_underlyingLog; std::queue< string_type*> m_astrMessages; }; //class thread_safe_log_writer template< class char_type, class traits_type = std::char_traits< char_type>, class thread_manager = DEFAULT_THREAD_MANAGER > class basic_internal_thread_safe_log_ownthread : public basic_internal_thread_safe_log_base< char_type, traits_type> { typedef std::basic_ostream< char_type, traits_type> ostream_type; friend class basic_thread_safe_log< char_type, traits_type>; typedef thread_safe_log_writer_ownthread< char_type, traits_type, thread_manager> log_writer_ownthread; // non-copyiable typedef basic_internal_thread_safe_log_ownthread< char_type, traits_type> this_class; basic_internal_thread_safe_log_ownthread( const this_class &); this_class & operator=( this_class &); // thread-related definitions typedef typename thread_manager::auto_lock_unlock auto_lock_unlock; public: basic_internal_thread_safe_log_ownthread( ostream_type & underlyingLog) : m_underlyingLog( underlyingLog), m_writer( underlyingLog) {} ~basic_internal_thread_safe_log_ownthread() {} void write_message( const std::basic_string< char_type, traits_type> & str) { m_writer.add_message( str); } void copy_state_to( ostream_type & dest) const { auto_lock_unlock locker( m_writer.cs()); dest.copyfmt( m_underlyingLog); dest.setstate( m_underlyingLog.rdstate()); } void copy_state_from( const ostream_type & src) { auto_lock_unlock locker( m_writer.cs()); m_underlyingLog.copyfmt( src); m_underlyingLog.setstate( m_underlyingLog.rdstate()); } private: ostream_type & m_underlyingLog; log_writer_ownthread m_writer; }; // template class basic_internal_thread_safe_log_ownthread typedef basic_internal_thread_safe_log_ownthread< char> internal_thread_safe_log_ownthread; typedef basic_internal_thread_safe_log_ownthread< wchar_t> winternal_thread_safe_log_ownthread; // END OF internal_thread_safe_log for OwnThread // (each log has its own thread for writing messages to it) //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // thread_safe_log class; // the class we should return from our get_log() functions. // helper used on debug mode - to allow catching mistakes: // using temporaries after they've been destructed template< class char_type, class traits_type> class invalid_streambuf : public std::basic_streambuf< char_type, traits_type> { #ifndef __GNUC__ typedef std::basic_streambuf< char_type, traits_type> base_class; using typename base_class::int_type; #else typedef typename std::basic_streambuf< char_type, traits_type>::int_type int_type; #endif protected: void bad_call() { /* Mistake: most likely, you've done something like: std::ostream & out = get_log().ts(); // note: here, the temporary returned by get_log().ts() has // been destructed !!! out << "bla bla" << std::endl; Use the following instead: thread_safe_log out = get_log(); out.ts() << "bla bla" << std::endl; */ assert( false); } // ... called on flush() virtual int sync() { bad_call(); return 0; } virtual int_type overflow(int_type nChar) { bad_call(); return 0; } virtual std::streamsize xsputn(const char_type *S, std::streamsize N) { bad_call(); return 0; } public: static invalid_streambuf< char_type, traits_type> s_instance; }; // initialize the one and only instance template< class char_type, class traits_type> invalid_streambuf< char_type, traits_type> invalid_streambuf< char_type, traits_type>::s_instance; template< class char_type, class traits_type> class basic_thread_safe_log // *** protected, not public !!! : protected basic_message_handler_log< char_type, traits_type> { typedef std::basic_ostream< char_type, traits_type> ostream_type; // hold reference to base basic_internal_thread_safe_log; // it could be basic_internal_thread_safe_log_sharethread, // basic_internal_thread_safe_log_ownthread, etc. typedef basic_internal_thread_safe_log_base< char_type, traits_type> internal_type; #ifndef __GNUC__ typedef basic_message_handler_log< char_type, traits_type> base_class; using typename base_class::string_type; #else typedef typename basic_message_handler_log< char_type, traits_type>::string_type string_type; #endif public: basic_thread_safe_log( internal_type & tsLog) : m_tsLog( tsLog) { // get underlying stream state tsLog.copy_state_to( ts() ); } basic_thread_safe_log( const basic_thread_safe_log< char_type, traits_type> & from) // ... on some platforms, a std::ostream base copy-constructor // might be defined as private... : basic_message_handler_log< char_type, traits_type>(), m_tsLog( from.m_tsLog) { // get underlying stream state m_tsLog.copy_state_to( ts() ); } ~basic_thread_safe_log() { // copy state to underlying stream m_tsLog.copy_state_from( ts() ); this->write_last_message( *this); #ifndef NDEBUG // debug-mode this->rdbuf( &(invalid_streambuf< char_type, traits_type>::s_instance)); #endif } // get base class - to which we can write std::basic_ostream< char_type, traits_type> & ts() { return *this; } template std::basic_ostream< char_type, traits_type> & ts( const string_type & /* std::string */ where) { if( decorator::needs_here) decorator::decorate( *this, where); else decorator::decorate( *this); //std::stringstream s; // TODO //s << where; // TODO decorator here //return ( *this) << s.str(); return ( *this); } void on_last_message( const string_type & str) { // don't forget to flush the stream before it's destructed!!! // (the easiest way is to append 'std::endl' to it assert ( str.empty()); } protected: virtual void on_new_message( const string_type & str) { if ( str.empty()) return; m_tsLog.write_message( str); } private: internal_type & m_tsLog; }; // template class basic_thread_safe_log typedef basic_thread_safe_log< char> thread_safe_log; typedef basic_thread_safe_log< wchar_t> wthread_safe_log; // END OF thread_safe_log class; // the class we should return from our get_log() functions. //////////////////////////////////////////////////////////////////// #endif tora-2.1.3/src/ts_log/critical_section.h0000644000175000017500000001342511445353612020026 0ustar michaelmichael#ifndef __TSLOG_CRITICAL_SECTION__ #define __TSLOG_CRITICAL_SECTION__ #include // // thread safe logger // // This code is based on article by John Torjo // published on: // http://articles.techrepublic.com.com/5100-10878_11-5072104.html# // // comment this line and uncomment the following one, // in order to use BOOST //#define USE_WIN32_THREAD_MANAGER //#define USE_BOOST_THREAD_MANAGER //#define USE_QT_THREAD_MANAGER //////////////////////////////////////////////////////////////////// // thread managers #ifdef USE_WIN32_THREAD_MANAGER #include // the object to be started - on a given thread struct win32_thread_obj { virtual ~win32_thread_obj() {} virtual void operator()() = 0; }; struct win32_thread_manager { typedef win32_thread_obj thread_obj_base; static void sleep( int nMillisecs) { Sleep( nMillisecs); } static void create_thread( win32_thread_obj & obj) { DWORD dwThreadID; CreateThread( 0, 0, win32_thread_manager::ThreadProc, &obj, 0, &dwThreadID); } // critical section for Win32 class critical_section { critical_section & operator = ( const critical_section & Not_Implemented); critical_section( const critical_section & From); public: critical_section() { InitializeCriticalSection( GetCsPtr() ); } ~critical_section() { DeleteCriticalSection( GetCsPtr() ); } void Lock() { EnterCriticalSection( GetCsPtr()); } void Unlock() { LeaveCriticalSection( GetCsPtr()); } operator LPCRITICAL_SECTION() const { return GetCsPtr(); } private: LPCRITICAL_SECTION GetCsPtr() const { return &m_cs; } private: // the critical section itself mutable CRITICAL_SECTION m_cs; }; // automatic locking/unlocking of a resource class auto_lock_unlock { auto_lock_unlock operator=( auto_lock_unlock & Not_Implemented); auto_lock_unlock( const auto_lock_unlock & Not_Implemented); public: auto_lock_unlock( critical_section & cs) : m_cs( cs) { m_cs.Lock(); } ~auto_lock_unlock() { m_cs.Unlock(); } private: critical_section & m_cs; }; private: static DWORD WINAPI ThreadProc( LPVOID lpData) { win32_thread_obj * pThread = ( win32_thread_obj *)lpData; ( *pThread)(); return 0; } }; #endif // ifdef USE_WIN32_THREAD_MANAGER #ifdef USE_BOOST_THREAD_MANAGER #include "boost/thread/mutex.hpp" #include "boost/thread/thread.hpp" #include "boost/function.hpp" #include "boost/thread/xtime.hpp" class boost_thread_manager { public: struct thread_obj_base { virtual void operator()() = 0; ~thread_obj_base() { if(_me) { delete _me; _me = NULL; } } boost::thread *_me; }; private: struct function_wrapper { function_wrapper( thread_obj_base & base) : m_base( base) {} void operator()() const { m_base(); } private: mutable thread_obj_base & m_base; }; public: static void sleep( int nMillisecs) { boost::xtime xt; boost::xtime_get(&xt, boost::TIME_UTC); // Sleep for n Millisecs xt.nsec += 1000000 * nMillisecs + 100000 /* just in case*/; boost::thread::sleep( xt); } static void create_thread( thread_obj_base & obj) { boost::function0< void> f = function_wrapper( obj); // creates the thread // boost::thread t( f); obj._me = new boost::thread ( f); } static bool join_thread( thread_obj_base & obj) { obj._me->join(); delete obj._me; obj._me = NULL; return true; } static std::string tid(void) { ::std::stringstream s; s << ::boost::this_thread::get_id(); return s.str(); } typedef boost::mutex critical_section; typedef boost::mutex::scoped_lock auto_lock_unlock; }; #endif // #ifdef USE_BOOST_THREAD_MANAGER #ifdef USE_QT_THREAD_MANAGER #include #include class qt_thread_manager { public: struct thread_obj_base : public QThread { virtual void operator()() = 0; private: virtual void run() { (*this)(); } bool join() { while(isRunning()) { if(!QThread::wait(50)) QThread::yieldCurrentThread(); } return isFinished(); } friend class qt_thread_manager; }; public: static void sleep( int nMillisecs) { thread_obj_base::msleep( nMillisecs); } static void create_thread( thread_obj_base & obj) { obj.start(); } static bool join_thread( thread_obj_base & obj) { return obj.join(); } static std::string tid(void) { //char buffer[24]; //int len = snprintf(buffer, sizeof(buffer), "%#lx", pthread_self()); ::std::stringstream s; s << QThread::currentThreadId(); return s.str(); } class critical_section : public QMutex { critical_section(const critical_section &); public: critical_section(void): QMutex(QMutex::NonRecursive) {}; }; // automatic locking/unlocking of a resource class auto_lock_unlock { auto_lock_unlock operator=( auto_lock_unlock & Not_Implemented); auto_lock_unlock( const auto_lock_unlock & Not_Implemented); public: auto_lock_unlock( critical_section & cs) : m_cs( cs) { m_cs.lock(); } ~auto_lock_unlock() { m_cs.unlock(); } private: critical_section & m_cs; }; }; #endif // #ifdef USE_QT_THREAD_MANAGER // if you want a custom default manager, // create your custom thread_manager class, like // the ones shown in win32_thread_manager or // boost_thread_manager, and // #define DEFAULT_THREAD_MANAGER // #ifdef OCI_THREAD_MANAGER #endif // OCI_THREAD_MANAGER #if defined( DEFAULT_THREAD_MANAGER) // custom thread manager #elif defined( USE_WIN32_THREAD_MANAGER) #define DEFAULT_THREAD_MANAGER win32_thread_manager #elif defined( USE_BOOST_THREAD_MANAGER) #define DEFAULT_THREAD_MANAGER boost_thread_manager #elif defined( USE_QT_THREAD_MANAGER) #define DEFAULT_THREAD_MANAGER qt_thread_manager #else #error "No thread manager. #define either of USE_WIN32_THREAD_MANAGER, USE_BOOST_THREAD_MANAGER, QT_THREAD_MANAGER" #endif // END OF thread managers //////////////////////////////////////////////////////////////////// #endif tora-2.1.3/src/ts_log/message_handler_log.h0000644000175000017500000001550311336031776020474 0ustar michaelmichael//// Listing K // message_handler_log.h // // thread safe logger // // This code is based on article by John Torjo // published on: // http://articles.techrepublic.com.com/5100-10878_11-5072104.html# // #ifndef __MESSAGE_HANDLER_LOG_H__ #define __MESSAGE_HANDLER_LOG_H__ #include #include #include #include /******************************************************************************** * * * Message string stream * * * ********************************************************************************/ // forward declaration(s) template< class char_type, class traits_type = std::char_traits< char_type> > class basic_message_handler_log; // represents the stream buffer for a message_handler_log (see below) // Note: NOT thread-safe template< class char_type , class traits_type = std::char_traits< char_type> > class basic_message_handler_log_streambuf : public std::basic_streambuf< char_type, traits_type> { private: typedef basic_message_handler_log_streambuf< char_type, traits_type> this_class; friend class basic_message_handler_log< char_type, traits_type>; typedef std::basic_streambuf< char_type, traits_type> streambuf_type; typedef basic_message_handler_log< char_type, traits_type> ostream_type; // base class typedef std::basic_streambuf< char_type, traits_type> base_class; enum { _BADOFF = -1 /* bad offset - for positioning functions */ }; #ifndef __GNUC__ using typename base_class::int_type; using typename base_class::pos_type; using typename base_class::off_type; #else typedef typename std::basic_streambuf< char_type, traits_type>::int_type int_type; typedef typename std::basic_streambuf< char_type, traits_type>::pos_type pos_type; typedef typename std::basic_streambuf< char_type, traits_type>::off_type off_type; #endif protected: // input, not allowed virtual int_type pbackfail(int_type = traits_type::eof()) { // only for output, not for input assert( false); return (traits_type::eof()); } virtual std::streamsize showmanyc() { // only for output, not for input assert( false); return 0; } virtual int_type underflow() { // only for output, not for input assert( false); return (traits_type::eof()); } virtual int_type uflow() { // only for output, not for input assert( false); return (traits_type::eof()); } virtual std::streamsize xsgetn(char_type *, std::streamsize) { // only for output, not for input assert( false); return 0; } // positioning, not allowed - we're a log virtual pos_type seekoff(off_type, std::ios_base::seekdir, std::ios_base::openmode = std::ios_base::in | std::ios_base::out) { // we don't allow positioning assert( false); return (std::streampos( _BADOFF)); } virtual pos_type seekpos(pos_type, std::ios_base::openmode = std::ios_base::in | std::ios_base::out) { // we don't allow positioning assert( false); return (std::streampos( _BADOFF)); } // output functions // called to write out from the internal // buffer, into the external buffer virtual int sync() { m_pOwnerStream->on_new_message( get_stream_buffer().str() ); m_pStreamBuffer = std::auto_ptr< string_stream_type>( new string_stream_type); return 0; } virtual streambuf_type *setbuf( char_type * buffer, std::streamsize n) { // ... note: this function MUST be called // before working with this stream buffer // we don't use a buffer - we forward everything assert( buffer == NULL && n == 0); this->setp( NULL, NULL); return this; } // write the characters from the buffer // to their real destination virtual int_type overflow(int_type nChar = traits_type::eof()) { if ( traits_type::not_eof( nChar)) get_stream_buffer() << ( char_type)nChar; return traits_type::not_eof( nChar); } virtual std::streamsize xsputn(const char_type *S, std::streamsize N) { get_stream_buffer().write( S, N); return N; } public: basic_message_handler_log_streambuf() : m_pStreamBuffer( new string_stream_type), m_bLastMessageWritten( false) {} basic_message_handler_log_streambuf( const this_class & ) : m_pStreamBuffer( new string_stream_type), m_bLastMessageWritten( false) {} ~basic_message_handler_log_streambuf() { // from your basic_message_handler_log' // derived class' destructor, make sure you call // 'write_last_message( *this);' !!! assert( m_bLastMessageWritten); } private: typedef std::basic_ostringstream< char_type> string_stream_type; string_stream_type & get_stream_buffer() { return *m_pStreamBuffer; } template< class type> void process_last_message( type & val) { if ( m_bLastMessageWritten) return; m_bLastMessageWritten = true; val.on_last_message( get_stream_buffer().str()); } private: // holds the Message, until it's flushed std::auto_ptr< string_stream_type> m_pStreamBuffer; // the Message Handler Log - where we write into ostream_type * m_pOwnerStream; // has the last message been written? // if this is false, the last sync() has not been done. bool m_bLastMessageWritten; }; // class basic_message_handler_log_streambuf // derive your class from this, and implement the PROTECTED on_new_message function template< class char_type, class traits_type > class basic_message_handler_log : public std::basic_ostream< char_type, traits_type> { typedef basic_message_handler_log_streambuf< char_type, traits_type> handler_streambuf_type; friend class basic_message_handler_log_streambuf< char_type, traits_type>; typedef std::basic_ostream< char_type, traits_type> base_class; typedef std::basic_ostringstream< char_type> string_stream_type; protected: typedef std::basic_string< char_type> string_type; basic_message_handler_log() : base_class( NULL), m_StreamBuf() { m_StreamBuf.m_pOwnerStream = this; this->init( &m_StreamBuf); m_StreamBuf.pubsetbuf( NULL, 0); } basic_message_handler_log( const basic_message_handler_log< char_type, traits_type> & from) : base_class( NULL), m_StreamBuf() { m_StreamBuf.m_pOwnerStream = this; this->init( &m_StreamBuf); m_StreamBuf.pubsetbuf( NULL, 0); } // from your derived class' destructor, make sure you call // 'write_last_message( *this);' !!! virtual ~basic_message_handler_log() {} protected: virtual void on_new_message( const string_type & str) = 0; void on_last_message( const string_type & str) { // default behavior on_new_message( str); } template< class type> void write_last_message( type & val) { m_StreamBuf.process_last_message( val); } public: // our stream buffer handler_streambuf_type m_StreamBuf; }; //class basic_message_handler_log typedef basic_message_handler_log< char> message_handler_log; typedef basic_message_handler_log< wchar_t> wmessage_handler_log; #endif tora-2.1.3/src/toeditextensiongotoui.ui0000644000175000017500000000607711270353625020070 0ustar michaelmichael toEditExtensionGotoUI 0 0 224 117 Go to line 80 20 QSizePolicy::Expanding Qt::Horizontal &Ok true &Cancel 20 21 QSizePolicy::Expanding Qt::Vertical Line Number false Line pushButton1 pushButton2 pushButton1 clicked() todebuggotolineUI accept() pushButton2 clicked() todebuggotolineUI reject() tora-2.1.3/src/toalert.cpp0000644000175000017500000003666011270353625015234 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "toalert.h" #include "utils.h" #include "toconf.h" #include "tomain.h" #include "tomemoeditor.h" #include "toresultview.h" #include "toconnection.h" #ifndef Q_OS_WIN32 #include #else #include #endif #include #include #include #include #include #include #include #include #include #include "icons/commit.xpm" #include "icons/return.xpm" #include "icons/toalert.xpm" #include "icons/toworksheet.xpm" #include "icons/trash.xpm" class toAlertTool : public toTool { protected: std::map Windows; virtual const char **pictureXPM(void) { return const_cast(toalert_xpm); } public: toAlertTool() : toTool(330, "Alert Messenger") { } virtual const char *menuItem() { return "Alert Messenger"; } virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) { std::map::iterator i = Windows.find(&connection); if (i != Windows.end()) { (*i).second->setFocus(); return NULL; } else { QWidget *window = new toAlert(parent, connection); Windows[&connection] = window; return window; } } void closeWindow(toConnection &connection) { std::map::iterator i = Windows.find(&connection); if (i != Windows.end()) Windows.erase(i); } }; static toAlertTool AlertTool; #define TIMEOUT 1 static toSQL SQLHost("toAlert:Hostname", "SELECT machine\n" " FROM v$session\n" " WHERE sid=(SELECT MIN(sid)\n" " FROM v$mystat)", "Get hostname of current connection"); toAlert::toAlert(QWidget *main, toConnection &connection) : toToolWidget(AlertTool, "alert.html", main, connection, "toAlert") , Connection(connection) { QToolBar *toolbar = toAllocBar(this, tr("Alert Messenger")); layout()->addWidget(toolbar); QString def; try { toQList lst = toQuery::readQuery(connection, SQLHost); def += toShift(lst); if (!def.isEmpty()) def += QString::fromLatin1(":"); } catch (...) {} def += connection.user(); toolbar->addWidget( new QLabel(tr("Registered") + " ", toolbar)); Registered = new QComboBox(toolbar); Registered->addItem(def); Registered->setEditable(true); Registered->setDuplicatesEnabled(false); Registered->setCurrentIndex(0); connect(Registered, SIGNAL(activated(int)), this, SLOT(add())); toolbar->addWidget(Registered); AddNames.insert(AddNames.end(), def); addAct = toolbar->addAction(QIcon(QPixmap(const_cast(commit_xpm))), tr("Register current"), this, SLOT(add())); addAct->setShortcut(Qt::ALT + Qt::Key_R); removeAct = toolbar->addAction(QIcon(QPixmap(const_cast(trash_xpm))), tr("Remove registered"), this, SLOT(remove())); removeAct->setShortcut(Qt::CTRL + Qt::Key_Backspace); toolbar->addSeparator(); toolbar->addWidget( new QLabel(tr("Name") + " ", toolbar)); toolbar->addWidget( Name = new QLineEdit(toolbar)); Name->setText(def); connect(Name, SIGNAL(returnPressed()), this, SLOT(send())); toolbar->addWidget( new QLabel(tr("Message") + " ", toolbar)); Message = new QLineEdit(toolbar); connect(Message, SIGNAL(returnPressed()), this, SLOT(send())); Message->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum)); toolbar->addWidget(Message); memoEditAct = toolbar->addAction(QIcon(QPixmap(const_cast(toworksheet_xpm))), tr("Edit message in memo"), this, SLOT(memo())); memoEditAct->setShortcut(Qt::CTRL + Qt::Key_M); sendAct = toolbar->addAction(QIcon(QPixmap(const_cast(return_xpm))), tr("Send alert"), this, SLOT(send())); sendAct->setShortcut(Qt::CTRL + Qt::Key_Return); connect(&Timer, SIGNAL(timeout()), this, SLOT(poll())); Timer.start(TIMEOUT*1000); Alerts = new toListView(this); Alerts->addColumn(tr("Time")); Alerts->addColumn(tr("Name")); Alerts->addColumn(tr("Message")); layout()->addWidget(Alerts); ToolMenu = NULL; connect(toMainWidget()->workspace(), SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(windowActivated(QMdiSubWindow *))); State = Started; try { toThread *thread = new toThread(new pollTask(*this)); thread->start(); } catch (...) { toStatusMessage(tr("Failed to start polling thread, try closing " "some other tools and restart Alert Messenger")); } setFocusProxy(Message); } void toAlert::windowActivated(QMdiSubWindow *widget) { if (!widget) return; if (widget->widget() == this) { if (!ToolMenu) { ToolMenu = new QMenu(tr("&Alert"), this); ToolMenu->addAction(addAct); ToolMenu->addAction(removeAct); ToolMenu->addSeparator(); ToolMenu->addAction(memoEditAct); ToolMenu->addAction(sendAct); toMainWidget()->addCustomMenu(ToolMenu); } } else { delete ToolMenu; ToolMenu = NULL; } } toAlert::~toAlert() { } void toAlert::closeEvent(QCloseEvent *event) { try { Lock.lock(); State = Quit; while (State != Done) { Lock.unlock(); Semaphore.down(); Lock.lock(); } Lock.unlock(); AlertTool.closeWindow(connection()); } TOCATCH; } static toSQL SQLRegister("toAlert:Register", "BEGIN SYS.DBMS_ALERT.REGISTER(:name); END;", "Register an alert name, must have same binds"); static toSQL SQLRemove("toAlert:Remove", "BEGIN SYS.DBMS_ALERT.REMOVE(:name); END;", "Remove a registered an alert name, must have same binds"); static toSQL SQLRemoveAll("toAlert:RemoveAll", "BEGIN SYS.DBMS_ALERT.REMOVEALL; END;", "Remove all registered alerts"); static toSQL SQLPoll("toAlert:PollAlert", "BEGIN\n" " SYS.DBMS_ALERT.WAITANY(:name,:msg,\n" " :stat,:tim);\n" "END;", "Poll for alert, must have same binds"); static toSQL SQLSignal("toAlert:Signal", "BEGIN\n" " SYS.DBMS_ALERT.SIGNAL(:name,:msg);\n" "END;", "Signal alert, must have same binds"); void toAlert::pollTask::run(void) { Parent.Lock.lock(); bool fatal = false; while (Parent.State != Quit && !fatal) { Parent.Lock.unlock(); try { { toLocker lock (Parent.Lock) ; fatal = true; { for (std::list::iterator i = Parent.AddNames.begin(); i != Parent.AddNames.end(); i++) { Parent.Names.insert(Parent.Names.end(), *i); Parent.Connection.execute(SQLRegister, *i); } } Parent.AddNames.clear(); for (std::list::iterator i = Parent.DelNames.begin(); i != Parent.DelNames.end(); i++) { std::list::iterator j = std::find(Parent.Names.begin(), Parent.Names.end(), *i); if (j != Parent.Names.end()) { Parent.Names.erase(j); Parent.Connection.execute(SQLRemove, *i); } } Parent.DelNames.clear(); fatal = false; } { toLocker lock (Parent.Lock) ; std::list::iterator i = Parent.SendAlerts.begin(); std::list::iterator j = Parent.SendMessages.begin(); while (i != Parent.SendAlerts.end() && j != Parent.SendMessages.end()) { Parent.Connection.execute(SQLSignal, *i, *j); i++; j++; } Parent.SendAlerts.clear(); Parent.SendMessages.clear(); Parent.Connection.commit(); } Parent.Lock.lock(); if (Parent.Names.size()) { Parent.Lock.unlock(); toQuery query(Parent.Connection, SQLPoll, QString::number(TIMEOUT)); QString name = query.readValue(); QString msg = query.readValue(); if (query.readValue().toInt() == 0) { toLocker lock (Parent.Lock) ; Parent.NewAlerts.insert(Parent.NewAlerts.end(), name); Parent.NewMessages.insert(Parent.NewMessages.end(), msg); } } else { Parent.Lock.unlock(); #ifndef Q_OS_WIN32 sleep(TIMEOUT); #else Sleep(TIMEOUT*1000); #endif } } catch (const QString &str) { Parent.Lock.lock(); Parent.Error.sprintf("Exception in alert polling:\n%s", (const char *)str.toLatin1()); fprintf(stderr, "%s\n", Parent.Error.toAscii().constData()); Parent.Lock.unlock(); } catch (...) { Parent.Lock.lock(); Parent.Error.sprintf("Unexpected exception in alert in polling."); fprintf(stderr, "%s\n", Parent.Error.toAscii().constData()); Parent.Lock.unlock(); } Parent.Lock.lock(); } if (Parent.Names.size() > 0) try { Parent.Connection.execute(SQLRemoveAll); } catch (...) {} Parent.State = Done; Parent.Semaphore.up(); Parent.Lock.unlock(); } void toAlert::poll(void) { try { toLocker lock (Lock) ; if (!Error.isNull()) { toStatusMessage(Error); Error = QString::null; } std::list::iterator i = NewAlerts.begin(); std::list::iterator j = NewMessages.begin(); while (i != NewAlerts.end() && j != NewMessages.end()) { toTreeWidgetItem *item = new toResultViewMLine(Alerts, NULL, toNow(connection())); item->setText(1, *i); item->setText(2, *j); i++; j++; } NewAlerts.clear(); NewMessages.clear(); } TOCATCH } void toAlert::send(void) { if (!Name->text().isEmpty() && !Message->text().isEmpty()) { toLocker lock (Lock) ; SendAlerts.insert(SendAlerts.end(), Name->text()); SendMessages.insert(SendMessages.end(), Message->text()); Message->clear(); } } void toAlert::memo(void) { toMemoEditor *memo = new toMemoEditor(this, Message->text(), 0, 0); connect(memo, SIGNAL(changeData(int, int, const QString &)), this, SLOT(changeMessage(int, int, const QString &))); } void toAlert::changeMessage(int, int, const QString &str) { Message->setText(str); } void toAlert::remove (void) { toLocker lock (Lock) ; QString name = Registered->currentText(); if (!name.isEmpty()) { std::list::iterator i = std::find(AddNames.begin(), AddNames.end(), name); if (i != AddNames.end()) AddNames.erase(i); i = std::find(Names.begin(), Names.end(), name); if (i != Names.end()) { if (std::find(DelNames.begin(), DelNames.end(), name) == DelNames.end()) DelNames.insert(DelNames.end(), name); } } if (Registered->count() > 0) Registered->removeItem(Registered->currentIndex()); if (Registered->count() > 0) Registered->setCurrentIndex(0); } void toAlert::add (void) { Registered->lineEdit()->selectAll(); QString name = Registered->currentText(); if (!name.isEmpty()) { std::list::iterator i = std::find(DelNames.begin(), DelNames.end(), name); if (i == DelNames.end()) { i = std::find(Names.begin(), Names.end(), name); if (i == Names.end()) { i = std::find(AddNames.begin(), AddNames.end(), name); if (i == AddNames.end()) { AddNames.insert(AddNames.end(), name); } } } else { DelNames.erase(i); } } for (int i = 0;i < Registered->count();i++) if (Registered->itemText(i) == name) return ; Registered->addItem(name); Name->setText(name); } tora-2.1.3/src/tostorageprefsui.ui0000644000175000017500000000622411270353625017013 0ustar michaelmichael toStoragePrefsUI 0 0 588 480 Form1 11 11 11 11 6 6 Storage Manager 11 11 11 11 6 6 &Display coalesced column Display object and extent list on startup. Display object &extents Display tablespaces or just datafiles. Display tablespaces or just datafiles. Qt::Vertical QSizePolicy::Expanding 20 20 Display graph of autoextend information instead of just free space. tora-2.1.3/src/toeditextensions.cpp0000644000175000017500000006557611336031775017204 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "toeditextensions.h" #include "tohighlightedtext.h" #include "tomain.h" #include "tosqlparse.h" #include "totool.h" #include #include #include #include #include #include #include #include #include "icons/deindent.xpm" #include "icons/indent.xpm" // #define CONF_COMMA_BEFORE "CommaBefore" // #define CONF_BLOCK_OPEN_LINE "BlockOpenLine" // #define CONF_OPERATOR_SPACE "OperatorSpace" // #define CONF_KEYWORD_UPPER "KeywordUpper" // #define CONF_RIGHT_SEPARATOR "RightSeparator" // #define CONF_END_BLOCK_NEWLINE "EndBlockNewline" // #define CONF_COMMENT_COLUMN "CommentColumn" // #define DEFAULT_COMMENT_COLUMN "60" QMenu *IncMenu = NULL; QAction *IncrementalSearch = NULL; QAction *ReverseSearch = NULL; QMenu *IndentMenu = NULL; QAction *IndentBlock = NULL; QAction *IndentBuffer = NULL; QAction *ObsBlock = NULL; QAction *ObsBuffer = NULL; QMenu *CaseMenu = NULL; QAction *UpperCase = NULL; QAction *LowerCase = NULL; QMenu * BookmarkMenu = NULL; QAction * BookmarkSwitchAct = NULL; QAction * BookmarkPrevAct = NULL; QAction * BookmarkNextAct = NULL; QMenu * EolMenu = NULL; QAction * EolUnixAct = NULL; QAction * EolMacAct = NULL; QAction * EolWindowsAct = NULL; QAction *Indent = NULL; QAction *Deindent = NULL; QAction *Quote = NULL; QAction *UnQuote = NULL; QAction *Comment = NULL; QAction *GotoLine = NULL; QAction *AutoComplete = NULL; toEditExtensions::toEditExtensions() : toEditWidget::editHandler() { } void toEditExtensions::receivedFocus(toEditWidget *widget) { if (widget) Current = dynamic_cast(widget); else Current = NULL; bool enable = Current && !Current->isReadOnly(); IncMenu->setEnabled(enable); IndentMenu->setEnabled(enable); CaseMenu->setEnabled(enable); Indent->setEnabled(enable); Deindent->setEnabled(enable); Quote->setEnabled(enable); UnQuote->setEnabled(enable); GotoLine->setEnabled(enable); toHighlightedText * cur = dynamic_cast(widget); AutoComplete->setEnabled(cur); } void toEditExtensions::autoComplete() { toHighlightedText *cur = dynamic_cast(Current); if (cur) cur->autoCompleteFromAPIs(); } void toEditExtensions::lostFocus(toEditWidget *widget) { if (widget) { toMarkedText *current = dynamic_cast(widget); if (current && Current == current) receivedFocus(NULL); } } void toEditExtensions::editEnabled(bool enable) { IncMenu->setEnabled(enable); IndentMenu->setEnabled(enable); CaseMenu->setEnabled(enable); BookmarkMenu->setEnabled(enable); EolMenu->setEnabled(enable); Indent->setEnabled(enable); Deindent->setEnabled(enable); Quote->setEnabled(enable); UnQuote->setEnabled(enable); GotoLine->setEnabled(enable); AutoComplete->setEnabled(enable); } void toEditExtensions::bookmarkSwitch() { toHighlightedText * t = qobject_cast(Current); if (t) t->handleBookmark(); } void toEditExtensions::bookmarkPrev() { toHighlightedText * t = qobject_cast(Current); if (t) t->gotoPrevBookmark(); } void toEditExtensions::bookmarkNext() { toHighlightedText * t = qobject_cast(Current); if (t) t->gotoNextBookmark(); } void toEditExtensions::convertEol() { QAction * snd = reinterpret_cast(sender()); toHighlightedText * t = qobject_cast(Current); if (!t) return; QsciScintilla::EolMode em; if (snd == EolUnixAct) em = QsciScintilla::EolUnix; else if (snd == EolMacAct) em = QsciScintilla::EolMac; else if (snd == EolWindowsAct) em = QsciScintilla::EolWindows; else assert(0); t->convertEols(em); t->setEolMode(em); } void toEditExtensions::gotoLine() { if (Current) { // toEditExtensionGoto dialog(Current); // if (dialog.exec()) // dialog.gotoLine(); bool ok; int curline, curcol; Current->getCursorPosition(&curline, &curcol); int line = QInputDialog::getInteger( Current, tr("Go to line"), tr("Line Number"), curline, 1, Current->lines(), 1, &ok); if (ok) Current->setCursorPosition(line-1, 0); } } void toEditExtensions::intIndent(int delta) { int line1, col1, line2, col2; if (Current) { if (!Current->getSelection(&line1, &col1, &line2, &col2)) { Current->getCursorPosition(&line1, &col1); line2 = line1; } else if (col2 == 0) { line2--; } QString res; for (int i = line1;i <= line2;i++) { QString t = Current->text(i); int chars = 0; int level = toSQLParse::countIndent(t, chars); // trim newline, if present. we have to do this because // qscintilla returns newlines, the old code didn't. t.remove('\n'); res += toSQLParse::indentString(std::max(0, level + delta)); if (i < line2) res += t.mid(chars) + "\n"; else res += t.mid(chars); } Current->setSelection(line1, 0, line2, Current->text(line2).length() - 1); Current->insert(res, true); } } void toEditExtensions::deindentBlock(void) { intIndent(-toSQLParse::getSetting().IndentLevel); } void toEditExtensions::indentBlock(void) { intIndent(toSQLParse::getSetting().IndentLevel); } void toEditExtensions::autoIndentBlock(void) { if (Current) { try { int line1, col1, line2, col2; if (Current->getSelection(&line1, &col1, &line2, &col2)) { QString t = Current->text(line1).mid(0, col1); t += QString::fromLatin1("a"); int chars = 0; QString ind = toSQLParse::indentString(toSQLParse::countIndent(t, chars)); QString mrk = Current->selectedText(); QString res; try { res = toSQLParse::indent(ind + mrk, toCurrentConnection(Current)); } catch (...) { res = toSQLParse::indent(ind + mrk); } t = Current->text(line2); unsigned int l = res.length() - ind.length(); if (col2 == int(t.length()) && t.length() > 0) // Strip last newline if on last col of line l--; res = res.mid(ind.length(), l); // Strip indent. Current->insert(res, true); } } TOCATCH; } } void toEditExtensions::autoIndentBuffer(void) { if (Current) { QString text = Current->text(); int pos = 0; while (pos < text.length() && text.at(pos).isSpace()) { pos++; } Current->selectAll(); try { try { Current->insert(toSQLParse::indent(text.mid(pos), toCurrentConnection(Current))); } catch (...) { Current->insert(toSQLParse::indent(text.mid(pos))); } } TOCATCH; } } void toEditExtensions::quoteBlock(void) { if (!Current) return; QString text = Current->selectedText(); if (!text.isEmpty()) { bool ends = text.right(1) == "\n"; text = text.replace("\"", "\\\""); text = text.replace("\n", "\\n\"\n\""); if (ends) text = text.left(text.length() - 5) + "\"\n"; else text += "\""; Current->insert("\"" + text, true); } } void toEditExtensions::unquoteBlock(void) { if (!Current) return; QString text = Current->selectedText(); if (!text.isEmpty()) { // this is to replace quoting at the end of the line text = text.replace("\\n\"\n", "\n"); // er... text could start with whitespace. a regex would be good here. text = text.replace("\n\"", "\n"); text = text.replace("\\\"", "\""); if (text.left(1) == "\"") text = text.right(text.length() - 1); if (text.right(1) == "\"") text = text.left(text.length() - 1); else if (text.right(1) == "\"\n") text = text.left(text.length() - 2) + "\n"; Current->insert(text, true); } } void toEditExtensions::handleCommentLine(int line) { QString t(Current->text(line)); if (t.startsWith("--")) { Current->setSelection(line, 0, line, 2); Current->removeSelectedText(); } else Current->insertAt("--", line, 0); } void toEditExtensions::handleComment() { if (!Current) return; if (Current->hasSelectedText()) { int l, c, l1, c1; Current->getSelection(&l, &c, &l1, &c1); for (int i = l; i <= l1; ++i) { handleCommentLine(i); } Current->setSelection(l, c, l1, c1); } else { int l, c; Current->getCursorPosition(&l, &c); handleCommentLine(l); } } void toEditExtensions::upperCase(void) { if (Current) { QString text = Current->selectedText().toUpper(); if (!text.isEmpty()) Current->insert(text, true); } } void toEditExtensions::lowerCase(void) { if (Current) { QString text = Current->selectedText().toLower(); if (!text.isEmpty()) Current->insert(text, true); } } static int CountLine(const QString &str) { int found = str.lastIndexOf(QString::fromLatin1("\n")); if (found < 0) return str.length(); else return str.length() - found + 1; } static void ObfuscateStat(toSQLParse::statement &stat, QString &ret) { if (ret.length() > 0 && stat.String.length() > 0 && toIsIdent(ret.at(ret.length() - 1)) && toIsIdent(stat.String.at(0))) { if (CountLine(ret) < 60) ret += QString::fromLatin1(" "); else ret += QString::fromLatin1("\n"); } ret += stat.String; if (!stat.Comment.isEmpty()) { ret += stat.Comment; ret += QString::fromLatin1("\n"); } for (std::list::iterator i = stat.subTokens().begin(); i != stat.subTokens().end(); i++) { ObfuscateStat(*i, ret); } } void toEditExtensions::obfuscateBlock(void) { if (Current) { QString str = Current->selectedText(); if (!str.isEmpty()) { toSQLParse::statement stat; stat.subTokens() = toSQLParse::parse(str); QString res; ObfuscateStat(stat, res); Current->insert(res, true); } } } void toEditExtensions::obfuscateBuffer(void) { if (Current) { QString str = Current->text(); if (!str.isEmpty()) { toSQLParse::statement stat; stat.subTokens() = toSQLParse::parse(str); Current->selectAll(); QString res; ObfuscateStat(stat, res); Current->insert(res); } } } static toEditExtensions EditExtensions; toEditExtensionSetup::toEditExtensionSetup( toEditExtensionTool *tool, QWidget *parent, const char *name) : QWidget(parent), toSettingTab("editextension.html"), Tool(tool) { setupUi(this); Current = toSQLParse::getSetting(); Started = false; CommaBefore->setChecked(Current.CommaBefore); BlockOpenLine->setChecked(Current.BlockOpenLine); OperatorSpace->setChecked(Current.OperatorSpace); KeywordUpper->setChecked(Current.KeywordUpper); RightSeparator->setChecked(Current.RightSeparator); EndBlockNewline->setChecked(Current.EndBlockNewline); CommentColumn->setValue(Current.CommentColumn); AutoIndent->setChecked(toConfigurationSingle::Instance().autoIndentRo()); DragDrop->setChecked(toConfigurationSingle::Instance().editDragDrop()); Ok = false; try { Example->setAnalyzer(toMainWidget()->currentConnection().analyzer()); } TOCATCH; try { #ifdef TO_NO_ORACLE Example->setText(toSQLParse::indent( "CREATE PROCEDURE COUNT_EMPS_IN_DEPTS (OUT V_TOTAL INT)\n" "BEGIN\n" " DECLARE V_DEPTNO INT DEFAULT 10;\n" " DECLARE V_COUNT INT DEFAULT 0;\n" " SET V_TOTAL = 0;\n" " WHILE V_DEPTNO < 100 DO\n" " SELECT COUNT(*)\n" " INTO V_COUNT\n" " FROM TEST.EMP\n" " WHERE DEPTNO = V_DEPTNO;\n" " SET V_TOTAL = V_TOTAL + V_COUNT;\n" " SET V_DEPTNO = V_DEPTNO + 10;\n" " END WHILE;\n" "END", Example->analyzer())); #else Example->setText(toSQLParse::indent( "CREATE OR REPLACE procedure spTuxGetAccData (oRet OUT NUMBER)\n" "AS\n" " vYear CHAR(4);\n" "BEGIN\n" "select a.TskCod TskCod, -- A Comment\n" " count(1) Tot\n" " from (select * from EssTsk where PrsID >= '1940');\n" "having count(a.TspActOprID) > 0;\n" " DECLARE\n" " oTrdStt NUMBER;\n" " BEGIN\n" " oTrdStt := 0;\n" " END;\n" " EXCEPTION\n" " WHEN VALUE_ERROR THEN\n" " oRet := 3;\n" "END;", Example->analyzer())); #endif } TOCATCH; Started = true; } toEditExtensionSetup::~toEditExtensionSetup() { if (!Ok) toSQLParse::setSetting(Current); } void toEditExtensionSetup::saveCurrent(void) { Current.ExpandSpaces = toConfigurationSingle::Instance().tabSpaces(); Current.CommaBefore = CommaBefore->isChecked(); Current.BlockOpenLine = BlockOpenLine->isChecked(); Current.OperatorSpace = OperatorSpace->isChecked(); Current.KeywordUpper = KeywordUpper->isChecked(); Current.RightSeparator = RightSeparator->isChecked(); Current.EndBlockNewline = EndBlockNewline->isChecked(); Current.IndentLevel = toConfigurationSingle::Instance().tabStop(); Current.CommentColumn = CommentColumn->value(); toSQLParse::setSetting(Current); } void toEditExtensionSetup::changed(void) { if (Started) { saveCurrent(); try { Example->setText(toSQLParse::indent(Example->text(), Example->analyzer())); } TOCATCH; } } void toEditExtensions::searchForward(void) { if (Current) Current->incrementalSearch(true); } void toEditExtensions::searchBackward(void) { if (Current) Current->incrementalSearch(false); } class toEditExtensionTool : public toTool { public: toEditExtensionTool() : toTool(910, "Editor Extensions") { toSQLParse::settings cur; cur.ExpandSpaces = toConfigurationSingle::Instance().tabSpaces(); cur.CommaBefore = toConfigurationSingle::Instance().commaBefore(); cur.BlockOpenLine = toConfigurationSingle::Instance().blockOpenLine(); cur.OperatorSpace = toConfigurationSingle::Instance().operatorSpace(); cur.KeywordUpper = toConfigurationSingle::Instance().keywordUpper(); cur.RightSeparator = toConfigurationSingle::Instance().rightSeparator(); cur.EndBlockNewline = toConfigurationSingle::Instance().endBlockNewline(); cur.IndentLevel = toConfigurationSingle::Instance().tabStop(); cur.CommentColumn = toConfigurationSingle::Instance().commentColumn(); toSQLParse::setSetting(cur); } virtual QWidget *toolWindow(QWidget *, toConnection &) { return NULL; // Has no tool window } virtual void closeWindow(toConnection &connection) {}; virtual void customSetup(void) { QMenu *edit = toMainWidget()->getEditMenu(); edit->addSeparator(); IncMenu = edit->addMenu( qApp->translate("toEditExtensionTool", "Incremental Search")); IncrementalSearch = IncMenu->addAction(qApp->translate("toEditExtensionTool", "Forward"), &EditExtensions, SLOT(searchForward())); IncrementalSearch->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_S); ReverseSearch = IncMenu->addAction(qApp->translate("toEditExtensionTool", "Backward"), &EditExtensions, SLOT(searchBackward())); ReverseSearch->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_R); // ------------------------------ indentation menu IndentMenu = edit->addMenu( qApp->translate("toEditExtensionTool", "Auto Indent")); IndentBlock = IndentMenu->addAction(qApp->translate( "toEditExtensionTool", "Selection"), &EditExtensions, SLOT(autoIndentBlock())); IndentBlock->setShortcut(Qt::CTRL + + Qt::ALT + Qt::Key_I); IndentBuffer = IndentMenu->addAction(qApp->translate( "toEditExtensionTool", "Editor"), &EditExtensions, SLOT(autoIndentBuffer())); IndentBuffer->setShortcut(Qt::CTRL + Qt::ALT + Qt::SHIFT + Qt::Key_I); IndentMenu->addSeparator(); ObsBlock = IndentMenu->addAction(qApp->translate( "toEditExtensionTool", "Obfuscate Selection"), &EditExtensions, SLOT(obfuscateBlock())); ObsBuffer = IndentMenu->addAction(qApp->translate("toEditExtensionTool", "Obfuscate Editor"), &EditExtensions, SLOT(obfuscateBuffer())); // ------------------------------ case menu CaseMenu = edit->addMenu( qApp->translate("toEditExtensionTool", "Modify Case")); UpperCase = CaseMenu->addAction(qApp->translate("toEditExtensionTool", "Upper"), &EditExtensions, SLOT(upperCase())); UpperCase->setShortcut(Qt::CTRL + Qt::Key_U); LowerCase = CaseMenu->addAction(qApp->translate("toEditExtensionTool", "Lower"), &EditExtensions, SLOT(lowerCase())); LowerCase->setShortcut(Qt::CTRL + Qt::Key_L); // bookmark menu BookmarkMenu = edit->addMenu(qApp->translate("toEditExtensionTool", "Bookmarks")); BookmarkSwitchAct = BookmarkMenu->addAction("Add/Remove Bookmark", &EditExtensions, SLOT(bookmarkSwitch())); BookmarkSwitchAct->setShortcut(Qt::CTRL + Qt::Key_B); BookmarkPrevAct = BookmarkMenu->addAction("Go to previous Bookmark", &EditExtensions, SLOT(bookmarkPrev())); BookmarkPrevAct->setShortcut(Qt::ALT + Qt::Key_PageUp); BookmarkNextAct = BookmarkMenu->addAction("Go to next Bookmark", &EditExtensions, SLOT(bookmarkNext())); BookmarkNextAct->setShortcut(Qt::ALT + Qt::Key_PageDown); // EOL menu EolMenu = edit->addMenu(qApp->translate("toEditExtensionTool", "Convert End of Lines to")); EolUnixAct = EolMenu->addAction("UNIX", &EditExtensions, SLOT(convertEol())); EolMacAct = EolMenu->addAction("Mac OS X", &EditExtensions, SLOT(convertEol())); EolWindowsAct = EolMenu->addAction("MS Windows", &EditExtensions, SLOT(convertEol())); // ------------------------------ etc Indent = edit->addAction( QIcon(QPixmap(const_cast(indent_xpm))), qApp->translate("toEditExtensionTool", "Indent Block"), &EditExtensions, SLOT(indentBlock())); Indent->setShortcut(Qt::ALT + Qt::Key_Right); Deindent = edit->addAction( QIcon(QPixmap(const_cast(deindent_xpm))), qApp->translate("toEditExtensionTool", "De-indent Block"), &EditExtensions, SLOT(deindentBlock())); Deindent->setShortcut(Qt::ALT + Qt::Key_Left); Quote = edit->addAction(qApp->translate("toEditExtensionTool", "Quote Selection"), &EditExtensions, SLOT(quoteBlock())); UnQuote = edit->addAction(qApp->translate("toEditExtensionTool", "UnQuote Selection"), &EditExtensions, SLOT(unquoteBlock())); Comment = edit->addAction(qApp->translate("toEditExtensionTool", "Comment or Uncomment"), &EditExtensions, SLOT(handleComment()), Qt::CTRL + Qt::Key_D); GotoLine = edit->addAction(qApp->translate("toEditExtensionTool", "Goto Line"), &EditExtensions, SLOT(gotoLine())); GotoLine->setShortcut(Qt::CTRL + Qt::Key_G); AutoComplete = edit->addAction( qApp->translate("toEditExtensionTool", "Complete"), &EditExtensions, SLOT(autoComplete())); AutoComplete->setShortcut(Qt::CTRL + Qt::Key_Space); // add buttons to main window // disabled due the problems in the state of toolbars // toMainWidget()->addButtonApplication(Deindent); // toMainWidget()->addButtonApplication(Indent); EditExtensions.receivedFocus(NULL); connect(toMainWidget(), SIGNAL(editEnabled(bool)), &EditExtensions, SLOT(editEnabled(bool))); } virtual QWidget *configurationTab(QWidget *parent) { return new toEditExtensionSetup(this, parent); } }; void toEditExtensionSetup::saveSetting(void) { Ok = true; toConfigurationSingle::Instance().setCommaBefore(CommaBefore->isChecked()); toConfigurationSingle::Instance().setBlockOpenLine(BlockOpenLine->isChecked()); toConfigurationSingle::Instance().setOperatorSpace(OperatorSpace->isChecked()); toConfigurationSingle::Instance().setKeywordUpper(KeywordUpper->isChecked()); toConfigurationSingle::Instance().setRightSeparator(RightSeparator->isChecked()); toConfigurationSingle::Instance().setEndBlockNewline(EndBlockNewline->isChecked()); toConfigurationSingle::Instance().setCommentColumn(CommentColumn->value()); toConfigurationSingle::Instance().setAutoIndentRo(AutoIndent->isChecked()); toConfigurationSingle::Instance().setEditDragDrop(DragDrop->isChecked()); saveCurrent(); } static toEditExtensionTool EditExtensionTool; // toEditExtensionGoto::toEditExtensionGoto(toMarkedText *editor) // : QDialog(editor), // Editor(editor) // { // // setupUi(this); // // toHelp::connectDialog(this); // Line->setMaximum(Editor->lines()); // Line->setMinimum(1); // { // int curline, curcol; // Editor->getCursorPosition(&curline, &curcol); // Line->setValue(curline); // } // } // void toEditExtensionGoto::gotoLine() // { // Editor->setCursorPosition(Line->value() - 1, 0); // } tora-2.1.3/src/tomarkedtext.h0000644000175000017500000002356011445353612015735 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOMARKEDTEXT_H #define TOMARKEDTEXT_H #include "config.h" #include "toeditwidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tosearchreplace.h" class QMenu; class QsciPrinter; class QFileSystemWatcher; /** * This is the enhanced editor used in TOra. It mainly offers integration in the TOra * menues and print support. It is based on QsciScintilla which is API compatible * with QTextEdit class. */ class toMarkedText : public QsciScintilla, public toEditWidget { Q_OBJECT /** Filename of the file in this buffer. */ QString Filename; bool Search; bool SearchFailed; bool SearchForward; QString SearchString; QString LastSearch; int CursorTimerID; QPoint DragStart; Search::SearchDirection m_searchDirection; //! Text to search QString m_searchText; //! Highligh all occurrences of m_searchText QScintilla indicator int m_searchIndicator; //! Original content of the editor for XML format functionality. See setXMLWrap() QString m_origContent; //! Watch for file (if any) changes from external apps QFileSystemWatcher * m_fsWatcher; bool findText(Search::SearchDirection direction); void searchFound(int line, int col); void incrementalSearch(bool forward, bool next); void fsWatcherClear(); protected: /** Reimplemented for internal reasons. */ virtual void mousePressEvent(QMouseEvent *e); /** Reimplemented for internal reasons. */ virtual void keyPressEvent(QKeyEvent *e); public: /** Create an editor. * @param parent Parent of this widget. * @param name Name of this widget. */ toMarkedText(QWidget *parent, const char *name = NULL); virtual ~toMarkedText(); /** * Returns the default tab width. */ static int defaultTabWidth(); /** * Sets the default tab width. * @param width the new default tab width; */ static void setDefaultTabWidth(int width); /** * Returns default setting for tabs. * */ static bool defaultTabSpaces(void); /** * If true, editor will use spaces not tabs. * */ static void setDefaultTabSpaces(bool on); /** Insert text and optionallly mark inserted text. * @param str String to insert. * @param mark True if mark inserted as selected. */ virtual void insert(const QString &str, bool select = false); /** Erase the contents of the editor. */ virtual void clear(void); /** Get location of the current selection. This function is now public. See the * Qt documentation for more information. */ bool getSelection (int * line1, int * col1, int * line2, int * col2) { QsciScintilla::getSelection(line1, col1, line2, col2); return hasSelectedText(); } #if 0 // TODO: this part is waiting for QScintilla backend feature (yet unimplemented). /*! \brief Set the selection mode for editor. \param aType SC_SEL_STREAM = 0, SC_SEL_RECTANGLE = 1, SC_SEL_LINES = 2 */ void setSelectionType(int aType=SC_SEL_STREAM); #endif /** Get filename of current file in editor. * @return Filename of editor. */ virtual QString filename(void) const { return Filename; } /** Open a file for editing. * @param file File to open for editing. */ virtual void openFilename(const QString &file); /** Set the current filename of the file in editor. * @param str String containing filename. */ virtual void setFilename(const QString &str) { Filename = str; } /** Update user interface with availability of copy/paste etc. */ virtual void setEdit(void); /** Reimplemented for internal reasons. */ virtual void focusInEvent (QFocusEvent *e); /** Reimplemented for internal reasons. */ virtual void focusOutEvent (QFocusEvent *e); /** Print this editor. */ virtual void editPrint(void); /** Reimplemented for internal reasons. */ virtual bool editOpen(QString suggestedFile = QString::null); /** Reimplemented for internal reasons. */ virtual bool editSave(bool askfile); virtual bool searchNext(const QString & text); virtual bool searchPrevious(const QString & text); /** Replace entry with new data */ virtual void searchReplace(const QString &newData); virtual void searchReplaceAll(const QString &newData); /** Check if data can be modified by search * @param all If true can replace all, otherwise can replace right now. */ virtual bool searchCanReplace(bool all); /** Start incremental search mode, or search next if started. */ void incrementalSearch(bool forward); /** Export data to a map. * @param data A map that can be used to recreate the data of a chart. * @param prefix Prefix to add to the map. */ virtual void exportData(std::map &data, const QString &prefix); /** Import data * @param data Data to read from a map. * @param prefix Prefix to read data from. */ virtual void importData(std::map &data, const QString &prefix); /** Find the line and column of an index into the string of the entire editor. * @param index Index to get line and col from. * @param line Will be filled out with the line. * @param col Will be filled out with the col. */ void findPosition(int index, int &line, int &col); signals: void displayMenu(QMenu *); // emitted when a new file is opened void fileOpened(void); void fileOpened(QString file); void fileSaved(QString file); protected: virtual void newLine(void); virtual void dropEvent(QDropEvent *); virtual void timerEvent(QTimerEvent *); void contextMenuEvent(QContextMenuEvent *); /** * This function is called to create a right mouse button popup menu * at the specified position. If you want to create a custom popup menu, * reimplement this function and return the created popup menu. Ownership * of the popup menu is transferred to the caller. */ virtual QMenu *createPopupMenu(const QPoint& pos); private slots: void setTextChanged(); void setCopyAvailable(bool yes); //! \brief Handle line numbers in the editor on text change void linesChanged(); //! \brief Handle file external changes (3rd party modifications) void m_fsWatcher_fileChanged(const QString & filename); public slots: /** * Reimplemented for internal reasons. */ virtual void editUndo(void) { undo(); } /** * Reimplemented for internal reasons. */ virtual void editRedo(void) { redo(); } /** * Reimplemented for internal reasons. */ virtual void editCut(void) { cut(); } /** * Reimplemented for internal reasons. */ virtual void editCopy(void) { copy(); } /** * Reimplemented for internal reasons. */ virtual void editPaste(void) { paste(); } /** * Reimplemented for internal reasons. */ virtual void editSelectAll(void) { selectAll(); } /** * QsciScintilla's selectAll doesn't always work like we want. * */ virtual void selectAll(bool select = TRUE) { // selectAll(true) doesn't work if there's a selection already. if (QsciScintilla::hasSelectedText()) QsciScintilla::selectAll(false); QsciScintilla::selectAll(); } void setWordWrap(bool); /*! \brief Tries to format XML content of the editor. It's using "brute force" = expecting it's a xml string. If the QDomDocument fails with parsing, nothing is changed. The original content of the editor is stored in QString m_origContent. This attribute is cleared if it's not needed \param wrap true for use formatting, false for use original text */ void setXMLWrap(bool wrap); }; #endif tora-2.1.3/src/toresultbar.h0000644000175000017500000001376711270353625015600 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTBAR_H #define TORESULTBAR_H #include "config.h" #include "tobackground.h" #include "tobarchart.h" #include "toresult.h" #include #include #include class toNoBlockQuery; class toSQL; /** Display the result of a query in a piechart. The first column of the query should * contain the x value and the rest of the columns should be values of the diagram. The * legend is the column name. Connects to the tool timer for updates automatically. */ class toResultBar : public toBarChart, public toResult { Q_OBJECT /** Display flow in change per second instead of actual values. */ bool Flow; bool Started; /** Timestamp of last fetch. */ time_t LastStamp; /** Last read values. */ std::list LastValues; bool First; toNoBlockQuery *Query; toBackground Poll; unsigned int Columns; void query(const QString &sql, const toQList ¶m, bool first); public: /** Create widget. * @param parent Parent of list. * @param name Name of widget. */ toResultBar(QWidget *parent, const char *name = NULL); /** Destroy chart */ ~toResultBar(); /** Stop automatic updating from tool timer. */ void stop(); /** Start automatic updating from tool timer. */ void start(); /** Display actual values or flow/s. * @param on Display flow or absolute values. */ void setFlow(bool on) { Flow = on; } /** Return if flow is displayed. * @return If flow is used. */ bool flow(void) { return Flow; } /** Reimplemented for internal reasons. */ virtual void query(const QString &sql, const toQList ¶m) { query(sql, param, true); } /** Reimplemented for internal reasons. */ virtual void clear(void) { LastStamp = 0; LastValues.clear(); toBarChart::clear(); } /** Transform valueset. Make it possible to perform more complex transformation. * called directly before adding the valueset to the chart. After flow transformation. * Default is passthrough. * @param input The untransformed valueset. * @return The valueset actually added to the chart. */ virtual std::list transform(std::list &input); /** Handle any connection */ virtual bool canHandle(toConnection &) { return true; } // Why are these needed? #if 1 /** Set the SQL statement of this list * @param sql String containing statement. */ void setSQL(const QString &sql) { toResult::setSQL(sql); } /** Set the SQL statement of this list. This will also affect @ref Name. * @param sql SQL containing statement. */ void setSQL(const toSQL &sql) { toResult::setSQL(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const QString &sql) { toResult::query(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql) { toResult::query(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql, toQList &par) { toResult::query(sql, par); } #endif public slots: /** Reimplemented for internal reasons. */ virtual void refresh(void) { query(sql(), params(), false); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1) { toResult::changeParams(Param1); } /** Reimplemented For internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2) { toResult::changeParams(Param1, Param2); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3) { toResult::changeParams(Param1, Param2, Param3); } protected slots: /** Reimplemented for internal reasons. */ virtual void connectionChanged(void); /** Reimplemented for internal reasons. */ virtual void addMenues(QMenu *); private slots: void poll(void); void editSQL(void); }; #endif tora-2.1.3/src/tolistviewformattertext.h0000644000175000017500000000417211270353625020262 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOLISTVIEWFORMATTERTEXT_H #define TOLISTVIEWFORMATTERTEXT_H #include "config.h" #include "tolistviewformatter.h" class toListViewFormatterText : public toListViewFormatter { public: toListViewFormatterText(); virtual ~toListViewFormatterText(); virtual QString getFormattedString(toExportSettings &settings, const QAbstractItemModel * model); }; #endif tora-2.1.3/src/tofilesize.h0000644000175000017500000000665211270353625015402 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOFILESIZE_H #define TOFILESIZE_H #include "config.h" #include class QRadioButton; class QSpinBox; /** * A widget to get a size value for Oracle objects. */ class toFilesize : public QGroupBox { Q_OBJECT /** * @internal * Value of widget */ QSpinBox *Value; /** * @internal * MB unit indicator button */ QRadioButton *MBSize; /** * @internal * KB unit indicator button */ QRadioButton *KBSize; /** * Setup this widget */ void setup(void); private slots: /** * @internal * Change the unit type callback. */ void changeType(bool); /** * @internal * Size value changed callback. */ void changedSize(void) { emit valueChanged(); } signals: /** * Emitted when value was changed in the widget. */ void valueChanged(void); public: /** * Create a filesize widget. * @param parent Parent widget. * @param name Name of widget. */ toFilesize(QWidget* parent = 0, const char* name = 0); /** * Create a filesize widget. * @param title Title of size selection frame. * @param parent Parent widget. * @param name Name of widget. */ toFilesize(const QString &title, QWidget* parent = 0, const char* name = 0); /** * Set the value of the widget in KB. * @param sizeInKB Size in KB. */ void setValue(int sizeInKB); /** * Get value in KB. * @return Size selected in KB. */ int value(void); /** * Get an oracle size specification string. * @return String describing size in valid Oracle format. */ QString sizeString(void); }; #endif tora-2.1.3/src/tocurrent.cpp0000644000175000017500000002267311270353625015606 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "tochangeconnection.h" #include "toconnection.h" #include "toconf.h" #include "tocurrent.h" #include "tomain.h" #include "tonoblockquery.h" #include "toresulttableview.h" #include "toresultparam.h" #include "toresultstats.h" #include "toresultview.h" #include "tosql.h" #include "totool.h" #include #include #include #include #include #include "icons/refresh.xpm" #include "icons/tocurrent.xpm" class toCurrentInfoTool : public toTool { protected: std::map Windows; virtual const char **pictureXPM(void) { return const_cast(tocurrent_xpm); } public: toCurrentInfoTool() : toTool(240, "Current Session") { } virtual const char *menuItem() { return "Current Session"; } virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) { std::map::iterator i = Windows.find(&connection); if (i != Windows.end()) { (*i).second->raise(); (*i).second->setFocus(); return NULL; } else { QWidget *window = new toCurrent(parent, connection); Windows[&connection] = window; return window; } } void closeWindow(toConnection &connection) { std::map::iterator i = Windows.find(&connection); if (i != Windows.end()) Windows.erase(i); } }; static toCurrentInfoTool CurrentTool; static toSQL SQLVersion("toCurrent:Version", "select banner \"Version\" from v$version", "Display version of Oracle"); static toSQL SQLResourceLimit("toCurrent:ResourceLimit", "SELECT * FROM v$resource_limit ORDER BY resource_name", "List resource limits"); toCurrent::toCurrent(QWidget *main, toConnection &connection) : toToolWidget(CurrentTool, "current.html", main, connection, "toCurrent") { QToolBar *toolbar = toAllocBar(this, tr("Current Session")); layout()->addWidget(toolbar); toolbar->addAction(QIcon(QPixmap(const_cast(refresh_xpm))), tr("Update"), this, SLOT(refresh(void))); toolbar->addWidget(new toSpacer()); new toChangeConnection(toolbar, TO_TOOLBAR_WIDGET_NAME); Tabs = new QTabWidget(this); layout()->addWidget(Tabs); Grants = new toListView(Tabs); Grants->setSortingEnabled(false); Grants->addColumn(tr("Privilege")); Grants->addColumn(tr("Type")); Grants->addColumn(tr("Grantable")); Grants->setRootIsDecorated(true); Tabs->addTab(Grants, tr("Privileges")); Version = new toResultTableView(true, false, Tabs); Version->setSQL(SQLVersion); Tabs->addTab(Version, tr("Version")); Parameters = new toResultParam(Tabs); Tabs->addTab(Parameters, tr("Parameters")); Statistics = new toResultStats(false, Tabs); Tabs->addTab(Statistics, tr("Statistics")); ResourceLimit = new toResultTableView(true, false, Tabs, "resource"); ResourceLimit->setSQL(SQLResourceLimit); Tabs->addTab(ResourceLimit, tr("Resource Limits")); connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); Query = NULL; refresh(); setFocusProxy(Tabs); } toCurrent::~toCurrent() { } void toCurrent::closeEvent(QCloseEvent *event) { try { CurrentTool.closeWindow(connection()); } TOCATCH; event->accept(); } static toSQL SQLRoleTabPrivs("toCurrent:RoleTabPrivs", "select privilege||' on '||owner||'.'||table_name,grantable from role_tab_privs where role = :role", "Get information about privileges granted on objects to a role, must have same binds and columns"); static toSQL SQLRoleSysPrivs("toCurrent:RoleSysPrivs", "select privilege,admin_option from role_sys_privs where role = :role", "Get information about system privileges granted to role, must have same binds and columns"); static toSQL SQLRoleRolePrivs("toCurrent:RoleRolePrivs", "select granted_role,admin_option from role_role_privs where role = :role", "Get information about roles granted to a role, must have same binds and columns"); static toSQL SQLUserTabPrivs("toCurrent:UserTabPrivs", "select privilege || ' on ' || owner||'.'||table_name,grantable from user_tab_privs", "Get information about privileges granted on objects to a user, must have same columns"); static toSQL SQLUserSysPrivs("toCurrent:UserSysPrivs", "select privilege,admin_option from user_sys_privs", "Get information about system privileges granted to user, must have same columns"); static toSQL SQLUserRolePrivs("toCurrent:UserRolePrivs", "select granted_role,admin_option from user_role_privs", "Get information about roles granted to a user, must have same columns"); void toCurrent::addList(bool isrole, toTreeWidgetItem *parent, const QString &type, const toSQL &sql, const QString &role) { Updates.insert(Updates.end(), update(isrole, parent, type, sql(connection()), role)); } void toCurrent::poll() { try { if (Query) { while (Query && Query->poll()) { if (Query->eof()) { delete Query; Query = NULL; } else { toTreeWidgetItem *item; if (CurrentUpdate.Parent) item = new toResultViewItem(CurrentUpdate.Parent, NULL); else item = new toResultViewItem(Grants, NULL); item->setText(0, Query->readValue()); item->setText(1, CurrentUpdate.Type); item->setText(2, Query->readValue()); if (CurrentUpdate.IsRole) { addList(false, item, tr("System"), SQLRoleSysPrivs, item->text(0)); addList(false, item, tr("Object"), SQLRoleTabPrivs, item->text(0)); addList(true, item, tr("Role"), SQLRoleRolePrivs, item->text(0)); } } } } if (!Query) { if ( Updates.empty() ) { Poll.stop(); return ; } CurrentUpdate = toShift(Updates); toQList param; if (!CurrentUpdate.Role.isEmpty()) toPush(param, toQValue(CurrentUpdate.Role)); Query = new toNoBlockQuery(connection(), toQuery::Background, CurrentUpdate.SQL, param); } } catch (const QString &exc) { toStatusMessage(exc); delete Query; Query = NULL; } } void toCurrent::refresh() { try { Parameters->refresh(); Version->refresh(); Statistics->refreshStats(); Grants->clear(); ResourceLimit->refresh(); Updates.clear(); delete Query; Query = NULL; addList(false, NULL, tr("System"), SQLUserSysPrivs); addList(false, NULL, tr("Object"), SQLUserTabPrivs); addList(true, NULL, tr("Role"), SQLUserRolePrivs); poll(); Poll.start(100); } TOCATCH } tora-2.1.3/src/tobrowsertablewidget.h0000644000175000017500000000553011270353625017461 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBROWSERTABLEWIDGET_H #define TOBROWSERTABLEWIDGET_H #include "tobrowserbasewidget.h" class toResultCols; class toResultTableView; class toResultData; class toResultItem; class toResultExtent; class toResultExtract; class toResultGrants; /*! \brief Table browser for toBrowser tool. See toBrowserBaseWidget for more info. \author Petr Vanek */ class toBrowserTableWidget : public toBrowserBaseWidget { Q_OBJECT toResultCols *columnsWidget; toResultTableView *indexView; toResultTableView *constraintsView; toResultTableView *referencesView; toResultGrants *grantsView; toResultTableView *triggersView; toResultData *resultData; toResultItem *resultInfo; toResultTableView *statisticsView; toResultTableView *partitionsView; toResultExtent *extentsView; toResultExtract *extractView; public: toBrowserTableWidget(QWidget * parent); void changeConnection(); /*! \brief Enable or disable chosen constraints. Affected sub-tabs are: Constraints and Dependencies */ void enableConstraints(bool enable); }; #endif tora-2.1.3/src/toresultlock.cpp0000644000175000017500000003261611270353625016311 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "tonoblockquery.h" #include "toresultlock.h" #include "tosql.h" #include "totool.h" #include bool toResultLock::canHandle(toConnection &conn) { return toIsOracle(conn); } toResultLock::toResultLock(QWidget *parent, const char *name) : toResultView(false, false, parent, name) { setAllColumnsShowFocus(true); setSorting( -1); setRootIsDecorated(true); addColumn(tr("Session")); addColumn(tr("Schema")); addColumn(tr("Osuser")); addColumn(tr("Program")); addColumn(tr("Type")); addColumn(tr("Mode")); addColumn(tr("Request")); addColumn(tr("Object")); addColumn(tr("Grabbed")); addColumn(tr("Requested")); setSQLName(QString::fromLatin1("toResultLock")); Query = NULL; connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); } toResultLock::~toResultLock() { delete Query; } static toSQL SQLBlockingLock("toResultLock:BlockingLocks", "select b.sid,b.schemaname,b.osuser,b.program,\n" " decode(a.type,\n" " 'MR', 'Media Recovery',\n" " 'RT', 'Redo Thread',\n" " 'UN', 'User Name',\n" " 'TX', 'Transaction',\n" " 'TM', 'DML',\n" " 'UL', 'PL/SQL User Lock',\n" " 'DX', 'Distributed Xaction',\n" " 'CF', 'Control File',\n" " 'IS', 'Instance State',\n" " 'FS', 'File Set',\n" " 'IR', 'Instance Recovery',\n" " 'ST', 'Disk Space Transaction',\n" " 'TS', 'Temp Segment',\n" " 'IV', 'Library Cache Invalidation',\n" " 'LS', 'Log Start or Switch',\n" " 'RW', 'Row Wait',\n" " 'SQ', 'Sequence Number',\n" " 'TE', 'Extend Table',\n" " 'TT', 'Temp Table',\n" " 'Internal ('||a.type||')'),\n" " DECODE(a.lmode,0,'None',1,'Null',2,'Row-S',3,'Row-X',4,'Share',5,'S/Row-X',6,'Exclusive',TO_CHAR(a.lmode)),\n" " DECODE(a.request,0,'None',1,'Null',2,'Row-S',3,'Row-X',4,'Share',5,'S/Row-X',6,'Exclusive',TO_CHAR(a.request)),\n" " d.object_name,\n" " ' ',\n" " TO_CHAR(SYSDATE-a.CTIME/3600/24)\n" " from v$lock a,v$session b,v$locked_object c,sys.all_objects d\n" " where a.sid = b.sid\n" " and c.session_id = a.sid\n" " and exists (select 'X'\n" " from v$locked_object bb,\n" " v$lock cc\n" " where bb.session_id = cc.sid\n" " and cc.sid != a.sid\n" " and cc.id1 = a.id1\n" " and cc.id2 = a.id2\n" " and bb.object_id = c.object_id)\n" " and d.object_id = c.object_id\n" " and a.request != 0", "List session blocked by a lock"); static toSQL SQLLock("toResultLock:Locks", "select b.sid,\n" " b.schemaname,\n" " b.osuser,\n" " b.program,\n" " decode(a.type,\n" " 'MR', 'Media Recovery',\n" " 'RT', 'Redo Thread',\n" " 'UN', 'User Name',\n" " 'TX', 'Transaction',\n" " 'TM', 'DML',\n" " 'UL', 'PL/SQL User Lock',\n" " 'DX', 'Distributed Xaction',\n" " 'CF', 'Control File',\n" " 'IS', 'Instance State',\n" " 'FS', 'File Set',\n" " 'IR', 'Instance Recovery',\n" " 'ST', 'Disk Space Transaction',\n" " 'TS', 'Temp Segment',\n" " 'IV', 'Library Cache Invalidation',\n" " 'LS', 'Log Start or Switch',\n" " 'RW', 'Row Wait',\n" " 'SQ', 'Sequence Number',\n" " 'TE', 'Extend Table',\n" " 'TT', 'Temp Table',\n" " 'Internal ('||a.type||')'),\n" " DECODE(a.lmode,0,'None',1,'Null',2,'Row-S',3,'Row-X',4,'Share',5,'S/Row-X',6,'Exclusive',TO_CHAR(a.lmode)),\n" " DECODE(e.request,0,'None',1,'Null',2,'Row-S',3,'Row-X',4,'Share',5,'S/Row-X',6,'Exclusive',TO_CHAR(e.request)),\n" " d.object_name,\n" " TO_CHAR(SYSDATE-a.CTIME/3600/24),\n" " TO_CHAR(SYSDATE-e.CTIME/3600/24)\n" " from v$lock a, v$session b,v$locked_object c,sys.all_objects d,v$lock e\n" " where a.sid = b.sid\n" " and a.lmode != 0\n" " and c.session_id = a.sid\n" " and c.object_id = d.object_id\n" " and exists (select 'X'\n" " from v$locked_object bb,\n" " v$lock cc\n" " where bb.session_id = cc.sid\n" " and cc.sid != a.sid\n" " and cc.id1 = a.id1\n" " and cc.id2 = a.id2\n" " and bb.object_id = c.object_id)\n" " and a.id1 = e.id1\n" " and a.id2 = e.id2\n" " and e.sid = :f1\n" " and e.lmode != e.request\n" " and e.request != 0", "List locks in a session"); void toResultLock::query(const QString &sql, const toQList ¶m) { if (!handled()) return ; if (!setSQLParams(sql, param)) return ; if (Query) { delete Query; Query = NULL; } clear(); Checked.clear(); try { LastItem = NULL; toQList par; if (!sql.isEmpty()) { par.insert(par.end(), sql); Query = new toNoBlockQuery(connection(), toQuery::Background, toSQL::string(SQLLock, connection()), par); } else { Query = new toNoBlockQuery(connection(), toQuery::Background, toSQL::string(SQLBlockingLock, connection()), par); } Poll.start(100); } TOCATCH } #define MARK_COL 20 void toResultLock::poll(void) { try { if (!toCheckModal(this)) return ; if (Query && Query->poll()) { if (!Query->eof()) { do { toTreeWidgetItem *item; if (!LastItem) item = new toResultViewItem(this, NULL); else item = new toResultViewItem(LastItem, NULL); toQDescList desc = Query->describe(); for (unsigned int pos = 0;pos < desc.size();pos++) item->setText(int(pos), Query->readValue()); } while (!Query->eof()); } delete Query; Query = NULL; LastItem = NULL; toTreeWidgetItem *next = NULL; for (toTreeWidgetItem *item = firstChild();item;item = next) { int sid = item->text(0).toInt(); if (item->text(MARK_COL).isEmpty()) { item->setText(MARK_COL, QString::fromLatin1("Yes")); item->setOpen(true); if (!Checked[sid]) { Checked[sid] = true; LastItem = item; toQList par; par.insert(par.end(), LastItem->text(0)); Query = new toNoBlockQuery(connection(), toQuery::Background, toSQL::string(SQLLock, connection()), par); } else { toTreeWidgetItem *cn = NULL; for (toTreeWidgetItem *ci = firstChild();ci;ci = cn) { if (ci != item && ci->text(0) == item->text(0)) { if (ci->firstChild()) { ci = ci->firstChild(); cn = new toResultViewItem(item, NULL); for (int i = 0;i < columns();i++) cn->setText(i, ci->text(i)); } break; } if (ci->firstChild()) { cn = ci->firstChild(); } else if (ci->nextSibling()) cn = ci->nextSibling(); else { cn = ci; do { cn = cn->parent(); } while (cn && !cn->nextSibling()); if (cn) cn = cn->nextSibling(); } } } break; } if (item->firstChild()) { next = item->firstChild(); } else if (item->nextSibling()) next = item->nextSibling(); else { next = item; do { next = next->parent(); } while (next && !next->nextSibling()); if (next) next = next->nextSibling(); } } if (!LastItem) Poll.stop(); } } catch (const QString &exc) { delete Query; Query = NULL; Poll.stop(); toStatusMessage(exc); } } tora-2.1.3/src/todebugwatch.ui0000644000175000017500000001346711270353625016075 0ustar michaelmichael toDebugWatchUI 0 0 188 264 Add variable watch 11 11 11 11 6 6 Cancel &Ok true true false 0 0 Variable name to watch. &Variable name false Name 0 0 &Scope 11 11 11 11 6 6 Global scope of variable. &Global 4 Currently running scope. &Local false 1 Currently running scope. &Autodetect true 5 The scope of the file in the body editor. &Package 3 LocalScope_2 Name PushButton1 PushButton1_2 LocalScope Package GlobalScope PushButton1 clicked() toDebugWatchUI accept() 20 20 20 20 PushButton1_2 clicked() toDebugWatchUI reject() 20 20 20 20 tora-2.1.3/src/torollback.cpp0000644000175000017500000007446111402451646015716 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "tochangeconnection.h" #include "toconf.h" #include "toconnection.h" #include "tohelp.h" #include "tomain.h" #include "tomemoeditor.h" #include "toresultitem.h" #include "toresulttableview.h" #include "toresultview.h" #include "torollback.h" #include "tosgastatement.h" #include "tosql.h" #include "tostoragedefinition.h" #include "totool.h" #include #include #include #include #include #include #include #include "totreewidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "icons/addrollback.xpm" #include "icons/offline.xpm" #include "icons/online.xpm" #include "icons/refresh.xpm" #include "icons/torollback.xpm" #include "icons/trash.xpm" // #define CONF_NO_EXEC "NoExec" // #define CONF_NEED_READ "NeedRead" // #define CONF_NEED_TWO "NeedTwo" // #define CONF_ALIGN_LEFT "AlignLeft" // #define CONF_OLD_ENABLE "OldEnable" class toRollbackPrefs : public QGroupBox, public toSettingTab { QCheckBox *OldEnable; QCheckBox *NoExec; QCheckBox *NeedRead; QCheckBox *NeedTwo; QCheckBox *AlignLeft; toTool *Tool; public: toRollbackPrefs(toTool *tool, QWidget* parent = 0, const char* name = 0); virtual void saveSetting(void); }; toRollbackPrefs::toRollbackPrefs(toTool *tool, QWidget* parent, const char* name) : QGroupBox(parent), toSettingTab("rollback.html#options"), Tool(tool) { if (name) setObjectName(name); QVBoxLayout *vbox = new QVBoxLayout; vbox->setSpacing(6); vbox->setContentsMargins(11, 11, 11, 11); setLayout(vbox); setTitle(qApp->translate("toRollbackPrefs", "Rollback Tool" )); OldEnable = new QCheckBox(this); OldEnable->setText(qApp->translate("toRollbackPrefs", "&Enable snapshot too old detection." )); OldEnable->setToolTip(qApp->translate( "toRollbackPrefs", "Enable snapshot too old detection, will put load on large databases.")); vbox->addWidget(OldEnable); AlignLeft = new QCheckBox(this); AlignLeft->setText(qApp->translate("toRollbackPrefs", "&Disregard start extent." )); AlignLeft->setEnabled(false); connect(OldEnable, SIGNAL(toggled(bool)), AlignLeft, SLOT(setEnabled(bool))); AlignLeft->setToolTip(qApp->translate( "toRollbackPrefs", "Always start from the left border when displaying extent usage.")); vbox->addWidget(AlignLeft); NoExec = new QCheckBox(this); NoExec->setText(qApp->translate("toRollbackPrefs", "&Restart reexecuted statements" )); NoExec->setEnabled(false); connect(OldEnable, SIGNAL(toggled(bool)), NoExec, SLOT(setEnabled(bool))); NoExec->setToolTip(qApp->translate( "toRollbackPrefs", "Start statements again that have been reexecuted.")); vbox->addWidget(NoExec); NeedRead = new QCheckBox(this); NeedRead->setText(qApp->translate("toRollbackPrefs", "&Must read buffers" )); NeedRead->setEnabled(false); connect(OldEnable, SIGNAL(toggled(bool)), NeedRead, SLOT(setEnabled(bool))); NeedRead->setToolTip(qApp->translate( "toRollbackPrefs", "Don't display statements that have not read buffers.")); vbox->addWidget(NeedRead); NeedTwo = new QCheckBox(this); NeedTwo->setText(qApp->translate("toRollbackPrefs", "&Exclude first appearance" )); NeedTwo->setEnabled(false); connect(OldEnable, SIGNAL(toggled(bool)), NeedTwo, SLOT(setEnabled(bool))); NeedTwo->setToolTip(qApp->translate( "toRollbackPrefs", "A statement must be visible at least two consecutive polls to be displayed.")); vbox->addWidget(NeedTwo); QSpacerItem *spacer = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding); vbox->addItem(spacer); // if (!tool->config(CONF_OLD_ENABLE, "").isEmpty()) // OldEnable->setChecked(true); // if (!tool->config(CONF_NO_EXEC, "Yes").isEmpty()) // NoExec->setChecked(true); // if (!tool->config(CONF_NEED_READ, "Yes").isEmpty()) // NeedRead->setChecked(true); // if (!tool->config(CONF_NEED_TWO, "Yes").isEmpty()) // NeedTwo->setChecked(true); // if (!tool->config(CONF_ALIGN_LEFT, "Yes").isEmpty()) // AlignLeft->setChecked(true); OldEnable->setChecked(toConfigurationSingle::Instance().oldEnable()); NoExec->setChecked(toConfigurationSingle::Instance().noExec()); NeedRead->setChecked(toConfigurationSingle::Instance().needRead()); NeedTwo->setChecked(toConfigurationSingle::Instance().needTwo()); AlignLeft->setChecked(toConfigurationSingle::Instance().alignLeft()); } void toRollbackPrefs::saveSetting(void) { toConfigurationSingle::Instance().setNoExec(NoExec->isChecked()); toConfigurationSingle::Instance().setNeedRead(NeedRead->isChecked()); toConfigurationSingle::Instance().setNeedTwo(NeedTwo->isChecked()); toConfigurationSingle::Instance().setAlignLeft(AlignLeft->isChecked()); toConfigurationSingle::Instance().setOldEnable(OldEnable->isChecked()); } class toRollbackTool : public toTool { protected: virtual const char **pictureXPM(void) { return const_cast(torollback_xpm); } public: toRollbackTool() : toTool(220, "Rollback Segments") { } virtual const char *menuItem() { return "Rollback Segments"; } virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) { return new toRollback(parent, connection); } virtual QWidget *configurationTab(QWidget *parent) { return new toRollbackPrefs(this, parent); } virtual void closeWindow(toConnection &connection){}; }; static toRollbackTool RollbackTool; static toSQL SQLTablespace("toRollbackDialog:TablespaceName", "select tablespace_name from sys.dba_tablespaces order by tablespace_name", "Get a list of tablespace names, should only have one column and same binds"); toRollbackDialog::toRollbackDialog(toConnection &Connection, QWidget* parent, const char* name) : QDialog(parent)//, name, true) { setupUi(this); toHelp::connectDialog(this); try { toQuery q(Connection, SQLTablespace); while (!q.eof()) Tablespace->addItem(q.readValue()); } catch (...) {} connect(Tablespace, SIGNAL(textChanged(const QString &)), this, SLOT(valueChanged(const QString &))); Storage = new toStorageDefinition(DialogTabs); Storage->forRollback(true); DialogTabs->addTab(Storage, tr("Storage")); OkButton->setEnabled(false); } std::list toRollbackDialog::sql(void) { QString str(QString::fromLatin1("CREATE ")); if (Public->isChecked()) str.append(QString::fromLatin1("PUBLIC ")); str.append(QString::fromLatin1("ROLLBACK SEGMENT \"")); str.append(Name->text()); str.append(QString::fromLatin1("\" TABLESPACE \"")); str.append(Tablespace->currentText()); str.append(QString::fromLatin1("\"")); std::list lst = Storage->sql(); for (std::list::iterator i = lst.begin();i != lst.end();i++) { str += QString::fromLatin1(" "); str += *i; } std::list ret; toPush(ret, str); return ret; } void toRollbackDialog::displaySQL(void) { std::list lines = sql(); QString res; for (std::list::iterator i = lines.begin();i != lines.end();i++) { res += *i; res += QString::fromLatin1(";\n"); } if (res.length() > 0) { toMemoEditor memo(this, res, -1, -1, true, true); memo.exec(); } else toStatusMessage(tr("No changes made"), false, false); } void toRollbackDialog::valueChanged(const QString &) { if (Name->text().isEmpty() || Tablespace->currentText().isEmpty()) OkButton->setEnabled(false); else OkButton->setEnabled(true); } #define MIN_HEIGHT 4 #define TRANSCOL 17 static bool BarsAlignLeft = true; static void PaintBars(toTreeWidgetItem *item, QPainter *p, const QColorGroup & cg, int width, std::list &val, std::list &maxExt, std::list &curExt) { #if 0 // disabled, wrong override if ( val.empty() ) { p->fillRect(0, 0, width, item->height(), QBrush(item->isSelected() ? cg.highlight() : cg.base())); } else { int num = 0; int lastHeight = 0; std::list::iterator j = curExt.begin(); std::list::iterator k = maxExt.begin(); for (std::list::iterator i = val.begin(); i != val.end() && j != curExt.end() && k != maxExt.end(); i++, j++, k++) { num++; QBrush bg(item->isSelected() ? cg.highlight() : cg.base()); QBrush fg(num % 2 ? Qt::blue : Qt::red); double start = (*i); double end = (*j); if (BarsAlignLeft) { end -= start; start = 0; if (end < 0) end += (*k); } int height = item->height() * num / val.size(); int pos = int(start * width / (*k)); int posEnd = int(end * width / (*k)); if (start > end) { p->fillRect(0, lastHeight, posEnd, height, fg); p->fillRect(posEnd, lastHeight, pos, height, bg); p->fillRect(pos, lastHeight, width, height, fg); } else { p->fillRect(0, lastHeight, pos, height, bg); p->fillRect(pos, lastHeight, posEnd, height, fg); p->fillRect(posEnd, lastHeight, width, height, bg); } lastHeight = height; } } #endif } static toSQL SQLRollback("toRollback:Information", "SELECT a.segment_name \"Segment\",\n" " a.owner \"Owner\",\n" " a.tablespace_name \"Tablespace\",\n" " a.status \"Status\",\n" " b.xacts \"Transactions\",\n" " ROUND ( a.initial_extent / u.unit,\n" " 3 ) \"Initial (UNIT)\",\n" " ROUND ( a.next_extent / u.unit,\n" " 3 ) \"Next (UNIT)\",\n" " a.pct_increase \"PCT Increase\",\n" " ROUND ( b.rssize / u.unit,\n" " 3 ) \"Current (UNIT)\",\n" " ROUND ( b.optsize / u.unit,\n" " 3 ) \"Optimal (UNIT)\",\n" " ROUND ( b.aveactive / u.unit,\n" " 3 ) \"Used (UNIT)\",\n" " b.EXTENTS \"Extents\",\n" " b.CurExt \"Curr. Extent\",\n" " b.CurBlk \"Curr. Block\",\n" " b.gets \"Reads\",\n" " ROUND ( ( b.gets - b.waits ) * 100 / b.gets,\n" " 2 ) || '%' \"Hitrate\",\n" " a.segment_id \"USN\"\n" " FROM sys.dba_rollback_segs a,\n" " v$rollstat b,\n" " (select :unit as unit from dual) u\n" " WHERE a.segment_id = b.usn ( + )\n" " ORDER BY a.segment_name", "Get information about rollback segments."); static toSQL SQLStartExt("toRollback:StartExtent", "select to_char(b.start_uext)\n" " from v$transaction b\n" " where b.xidusn = :f1", "Get information about current extent in rollback of transactions"); static toSQL SQLStatementInfo("toRollback:StatementInfo", "SELECT TO_CHAR(SYSDATE),\n" " a.User_Name,\n" " a.SQL_Text,\n" " a.Address||':'||a.Hash_Value,\n" " TO_CHAR(SUM(b.Executions)),\n" " TO_CHAR(SUM(b.Buffer_Gets))\n" " FROM v$open_cursor a,v$sql b\n" " WHERE a.Address = b.Address AND a.Hash_Value = b.Hash_Value\n" " GROUP BY TO_CHAR(SYSDATE),a.user_name,a.sql_text,a.address||':'||a.hash_value", "Get information about statements in SGA. All columns must " "be in exactly the same order."); static toSQL SQLCurrentExtent("toRollback:CurrentExtent", "select b.Extents,\n" " b.CurExt+b.CurBlk/c.Blocks\n" " from sys.dba_rollback_segs a,v$rollstat b,sys.dba_extents c\n" " where a.segment_id = b.usn\n" " and a.owner = c.owner\n" " and a.segment_name = c.segment_name\n" " and c.segment_type = 'ROLLBACK'\n" " and b.curext = c.extent_id\n" " order by a.segment_name", "Get current extent (And fraction of) of rollback segments, " "columns must be in exactly the same order"); class toRollbackOpen : public toResultView { struct statementData { std::list OpenExt; QString Opened; int Executed; int BufferGets; int Shown; }; typedef std::map statements; statements Statements; int NumExtents; std::list CurExt; std::list MaxExt; public: class openItem : public toResultViewItem { toRollbackOpen *parent(void) { return (toRollbackOpen *)listView(); } public: openItem(toTreeWidget *parent, toTreeWidgetItem *after, const QString &buf = QString::null) : toResultViewItem(parent, after, buf) { } virtual void paintCell (QPainter *pnt, const QColorGroup & cg, int column, int width, int alignment) { if (column == 2) { QString address = text(4); std::list &StartExt = parent()->Statements[address].OpenExt; PaintBars(this, pnt, cg, width, StartExt, parent()->MaxExt, parent()->CurExt); } else toResultViewItem::paintCell(pnt, cg, column, width, alignment); } virtual int width(const QFontMetrics &fm, const toTreeWidget *top, int column) const { if (column == 2) return 100; else return toResultViewItem::width(fm, top, column); } virtual void setup(void) { QString address = text(3); statementData &data = parent()->Statements[address]; toResultViewItem::setup(); setHeight(std::max(toResultViewItem::height(), int(MIN_HEIGHT*data.OpenExt.size()))); } }; friend class openItem; virtual toTreeWidgetItem *createItem(toTreeWidgetItem *last, const QString &str) { return new openItem(this, last, str); } toRollbackOpen(QWidget *parent) : toResultView(false, false, parent) { addColumn(qApp->translate("toRollbackOpen", "Started")); addColumn(qApp->translate("toRollbackOpen", "User")); addColumn(qApp->translate("toRollbackOpen", "Snapshot")); addColumn(qApp->translate("toRollbackOpen", "SQL")); setSorting(0); NumExtents = 0; setSQLName(QString::fromLatin1("toRollbackOpen")); } virtual void query(const QString &, const toQList &) { try { clear(); toConnection &conn = connection(); toBusy busy; toQuery sql(conn, SQLStatementInfo); toTreeWidgetItem *last = NULL; while (!sql.eof()) { toTreeWidgetItem *item = createItem(last, QString::null); last = item; item->setText(0, sql.readValue()); item->setText(1, sql.readValue()); item->setText(3, sql.readValue()); item->setText(4, sql.readValue()); item->setText(5, sql.readValue()); item->setText(6, sql.readValue()); } toQuery rlb(conn, SQLCurrentExtent); CurExt.clear(); MaxExt.clear(); int num = 0; while (!rlb.eof()) { MaxExt.insert(MaxExt.end(), rlb.readValue().toDouble()); CurExt.insert(CurExt.end(), rlb.readValue().toDouble()); num++; } statementData data; data.Shown = 0; data.OpenExt = CurExt; if (num != NumExtents) { Statements.clear(); NumExtents = num; } bool noExec = toConfigurationSingle::Instance().noExec(); bool needRead = toConfigurationSingle::Instance().needRead(); bool needTwo = toConfigurationSingle::Instance().needTwo(); // if (RollbackTool.config(CONF_NO_EXEC, "Yes").isEmpty()) // noExec = false; // if (RollbackTool.config(CONF_NEED_READ, "Yes").isEmpty()) // needRead = false; // if (RollbackTool.config(CONF_NEED_TWO, "Yes").isEmpty()) // needTwo = false; std::map Exists; for (toTreeWidgetItem *i = firstChild();i;) { QString address = i->text(4); Exists[address] = 1; statements::iterator j = Statements.find(address); int exec = i->text(5).toInt(); int bufget = i->text(6).toInt(); if (j == Statements.end() || ((*j).second.Executed != exec && noExec)) { data.Opened = i->text(0); data.Executed = exec; data.BufferGets = bufget; Statements[address] = data; toTreeWidgetItem *next = i->nextSibling(); if (needTwo) delete i; i = next; } else if ((*j).second.BufferGets == bufget && needRead) { // Don't reset, just don't show toTreeWidgetItem *next = i->nextSibling(); delete i; i = next; } else { i->setText(0, (*j).second.Opened); i = i->nextSibling(); (*j).second.BufferGets = bufget; } } sort(); // Erase unused for (statements::iterator j = Statements.begin();j != Statements.end();j++) { if (Exists.find((*j).first) == Exists.end()) { Statements.erase((*j).first); j = Statements.begin(); } } } TOCATCH } }; toSQL SQLTransactionUsers("toRollback:TransactionUsers", "select r.name \"Rollback Seg\",\n" " s.sid \"Session ID\",\n" " s.osuser \"Os User\",\n" " s.username \"Oracle User\"\n" "from v$rollname r, v$session s, v$lock l\n" "where l.type = 'TX'\n" "and s.sid = l.sid\n" "and r.usn = trunc(l.id1/65536)", "Get users currently having open transactions"); toRollback::toRollback(QWidget *main, toConnection &connection) : toToolWidget(RollbackTool, "rollback.html", main, connection, "toRollback") { QToolBar *toolbar = toAllocBar(this, tr("Rollback analyzer")); layout()->addWidget(toolbar); UpdateSegmentsAct = new QAction(QPixmap(const_cast(refresh_xpm)), tr("Update segment list"), this); UpdateSegmentsAct->setShortcut(QKeySequence::Refresh); connect(UpdateSegmentsAct, SIGNAL(triggered()), this, SLOT(refresh(void))); toolbar->addAction(UpdateSegmentsAct); toolbar->addSeparator(); enableOldAct = new QAction(QPixmap(const_cast(torollback_xpm)), tr("Enable snapshot too old detection."), this); enableOldAct->setCheckable(true); connect(enableOldAct, SIGNAL(toggled(bool)), this, SLOT(enableOld(bool))); toolbar->addAction(enableOldAct); toolbar->addSeparator(); OnlineAct = new QAction(QPixmap(const_cast(online_xpm)), tr("Take segment online"), this); connect(OnlineAct, SIGNAL(triggered()), this, SLOT(online(void))); toolbar->addAction(OnlineAct); OnlineAct->setEnabled(false); OfflineAct = new QAction(QPixmap(const_cast(offline_xpm)), tr("Take segment offline"), this); connect(OfflineAct, SIGNAL(triggered()), this, SLOT(offline(void))); toolbar->addAction(OfflineAct); OfflineAct->setEnabled(false); toolbar->addSeparator(); NewAct = new QAction(QPixmap(const_cast(addrollback_xpm)), tr("Create new rollback segment"), this); connect(NewAct, SIGNAL(triggered()), this, SLOT(addSegment(void))); toolbar->addAction(NewAct); DropAct = new QAction(QPixmap(const_cast(trash_xpm)), tr("Drop segment"), this); connect(DropAct, SIGNAL(triggered()), this, SLOT(dropSegment(void))); toolbar->addAction(DropAct); DropAct->setEnabled(false); toolbar->addSeparator(); QLabel * lab1 = new QLabel(tr("Refresh") + " ", toolbar); toolbar->addWidget(lab1); connect(Refresh = toRefreshCreate(toolbar, TO_TOOLBAR_WIDGET_NAME), SIGNAL(activated(const QString &)), this, SLOT(changeRefresh(const QString &))); toolbar->addWidget(Refresh); toolbar->addWidget(new toSpacer()); new toChangeConnection(toolbar, TO_TOOLBAR_WIDGET_NAME); QSplitter *splitter = new QSplitter(Qt::Vertical, this); layout()->addWidget(splitter); Segments = new toResultTableView(true, false, splitter, "Segments"); Segments->setSQL(SQLRollback); Segments->setSelectionBehavior(QAbstractItemView::SelectRows); connect(Segments, SIGNAL(selectionChanged()), this, SLOT(changeItem())); connect(Segments, SIGNAL(firstResult(const QString &, const toConnection::exception &, bool)), this, SLOT(updateHeaders(const QString &, const toConnection::exception &, bool))); QTabWidget *tab = new QTabWidget(splitter); TransactionUsers = new toResultTableView(false, false, tab); tab->addTab(TransactionUsers, tr("Transaction Users")); TransactionUsers->setSQL(SQLTransactionUsers); QSplitter *horsplit = new QSplitter(Qt::Horizontal, splitter); tab->addTab(horsplit, tr("Open Cursors")); Statements = new toRollbackOpen(horsplit); Statements->setSelectionMode(toTreeWidget::Single); connect(Statements, SIGNAL(selectionChanged(toTreeWidgetItem *)), this, SLOT(changeStatement(toTreeWidgetItem *))); CurrentStatement = new toSGAStatement(horsplit); try { connect(timer(), SIGNAL(timeout(void)), this, SLOT(refresh(void))); toRefreshParse(timer(), toConfigurationSingle::Instance().refresh()); } TOCATCH ToolMenu = NULL; connect(toMainWidget()->workspace(), SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(windowActivated(QMdiSubWindow *))); if (toConfigurationSingle::Instance().oldEnable()) enableOldAct->setChecked(true); else Statements->setEnabled(false); refresh(); setFocusProxy(Segments); } void toRollback::windowActivated(QMdiSubWindow *widget) { if (!widget) return; if (widget->widget() == this) { if (!ToolMenu) { ToolMenu = new QMenu(tr("&Rollback"), this); ToolMenu->addAction(UpdateSegmentsAct); ToolMenu->addSeparator(); ToolMenu->addAction(OnlineAct); ToolMenu->addAction(OfflineAct); ToolMenu->addSeparator(); ToolMenu->addAction(NewAct); ToolMenu->addAction(DropAct); ToolMenu->addSeparator(); toMainWidget()->addCustomMenu(ToolMenu); } } else { delete ToolMenu; ToolMenu = NULL; } } void toRollback::refresh(void) { QString unit(toConfigurationSingle::Instance().sizeUnit()); Segments->changeParams(QString::number(toSizeDecode(unit))); Segments->refresh(); TransactionUsers->refresh(); } void toRollback::updateHeaders(const QString &sql, const toConnection::exception &res, bool error) { QString d; QString unit("(" + toConfigurationSingle::Instance().sizeUnit() + ")"); for (int i = 0; i < Segments->model()->columnCount(); ++i) { d = Segments->model()->headerData(i, Qt::Horizontal).toString(); if (d.indexOf("(UNIT)", 0, Qt::CaseInsensitive) != -1) { d.replace("(UNIT)", unit, Qt::CaseInsensitive); Segments->model()->setHeaderData(i, Qt::Horizontal, d, Qt::DisplayRole); } } } void toRollback::changeStatement(toTreeWidgetItem *item) { if (item) CurrentStatement->changeAddress(item->text(4)); } void toRollback::changeItem() { QString stat(Segments->selectedIndex(4).data().toString()); OfflineAct->setEnabled(stat != "OFFLINE"); OnlineAct->setEnabled(stat != "ONLINE"); DropAct->setEnabled(true); } void toRollback::changeRefresh(const QString &str) { try { toRefreshParse(timer(), str); } TOCATCH } QString toRollback::currentSegment(void) { return Segments->selectedIndex(1).data().toString(); } void toRollback::addSegment(void) { try { toRollbackDialog newSegment(connection(), this); if (newSegment.exec()) { std::list sql = newSegment.sql(); for (std::list::iterator i = sql.begin();i != sql.end();i++) connection().execute(*i); refresh(); } } TOCATCH } void toRollback::offline(void) { try { QString str; str = QString::fromLatin1("ALTER ROLLBACK SEGMENT \""); str.append(currentSegment()); str.append(QString::fromLatin1("\" OFFLINE")); connection().execute(str); refresh(); } TOCATCH } void toRollback::dropSegment(void) { try { if (TOMessageBox::warning(this, tr("Drop rollback segment"), tr("Are you sure you want to drop the segment %1.").arg(currentSegment()), tr("&Drop"), tr("Cancel")) == 0) { QString str; str = QString::fromLatin1("DROP ROLLBACK SEGMENT \""); str.append(currentSegment()); str.append(QString::fromLatin1("\"")); connection().execute(str); refresh(); } } TOCATCH } void toRollback::online(void) { try { QString str; str = QString::fromLatin1("ALTER ROLLBACK SEGMENT \""); str.append(currentSegment()); str.append(QString::fromLatin1("\" ONLINE")); connection().execute(str); refresh(); } TOCATCH } void toRollback::enableOld(bool ena) { Statements->setEnabled(ena); } tora-2.1.3/src/tolistviewformattercsv.cpp0000644000175000017500000001141011415711657020421 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "tolistviewformattercsv.h" #include "tolistviewformatterfactory.h" #include "tolistviewformatteridentifier.h" #include "toresultview.h" #include "toresultmodel.h" #include #include #include namespace { toListViewFormatter* createCSV() { return new toListViewFormatterCSV(); } const bool registered = toListViewFormatterFactory::Instance().Register( toListViewFormatterIdentifier::CSV, createCSV); } toListViewFormatterCSV::toListViewFormatterCSV() : toListViewFormatter() { } toListViewFormatterCSV::~toListViewFormatterCSV() { } QString toListViewFormatterCSV::QuoteString(const QString &str) { static QRegExp quote(QString::fromLatin1("\"")); QString t = str; t.replace(quote, QString::fromLatin1("\"\"")); return t; } QString toListViewFormatterCSV::getFormattedString(toExportSettings &settings, //const toResultModel *model); const QAbstractItemModel * model) { int columns = model->columnCount(); int rows = model->rowCount(); QString separator = settings.separator; QString delimiter = settings.delimiter; QString output; QString indent; QVector rlist = selectedRows(settings.selected); QVector clist = selectedColumns(settings.selected); if (settings.columnsHeader) { for (int j = (settings.rowsHeader ? 0 : 1); j < columns; j++) { if (settings.columnsExport == toExportSettings::ColumnsSelected && !clist.contains(j)) continue; output += QString::fromLatin1("%1%2%3%4"). arg(delimiter). arg(QuoteString(model->headerData( j, Qt::Horizontal, Qt::DisplayRole).toString())). arg(delimiter). arg(separator); } if (output.length() > 0) output = output.left(output.length() - separator.length()); endLine(output); } QModelIndex mi; for (int row = 0; row < rows; row++) { if (settings.rowsExport == toExportSettings::RowsSelected && !rlist.contains(row)) continue; QString line; for (int i = 0; i < columns; i++) { if (settings.columnsExport == toExportSettings::ColumnsSelected && !clist.contains(i)) continue; if (!settings.rowsHeader && i == 0) continue; mi = model->index(row, i); QString text = model->data(mi, Qt::EditRole).toString(); line += indent; line += QString::fromLatin1("%1%2%3%4"). arg(delimiter, QuoteString(text), delimiter, separator); } line = line.left(line.length() - separator.length()); output += line; endLine(output); } return output; } tora-2.1.3/src/todebugchangeui.ui0000644000175000017500000001104311270353625016536 0ustar michaelmichael toDebugChangeUI 0 0 396 180 Change value of watch 11 6 NULL Cancel &Ok true 1 1 false &Index Qt::AlignVCenter|Qt::AlignRight Index false 5 7 2147483647 -2147483647 1 toMarkedText QWidget
tomarkedtext.h
-1 -1 0 5 5 image0
PushButton1 PushButton1_2 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 PushButton1 clicked() toDebugChangeUI accept() PushButton1_2 clicked() toDebugChangeUI reject() NullValue toggled(bool) Value setDisabled(bool)
tora-2.1.3/src/tosecurity.h0000644000175000017500000001165711270353625015440 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOSECURITY_H #define TOSECURITY_H #include "config.h" #include "totool.h" // due the toListView #include "toresultview.h" #include "ui_tosecurityquotaui.h" #include "tosecuritytreemodel.h" #include class QMenu; class QTabWidget; class QToolButton; class toConnection; // class toListView; class toSecurityPage; class toSecurityQuota; class toSecuritySystem : public toListView { Q_OBJECT public: toSecuritySystem(QWidget *parent); void changeUser(const QString &); void eraseUser(bool all = true); void sql(const QString &user, std::list &sql); void update(void); public slots: virtual void changed(toTreeWidgetItem *item); }; class toSecurityRoleGrant : public toListView { Q_OBJECT toTreeWidgetCheck *findChild(toTreeWidgetItem *parent, const QString &name); public: toSecurityRoleGrant(QWidget *parent); void changeUser(bool user, const QString &); void sql(const QString &user, std::list &sql); void eraseUser(bool user, bool all = true); void update(void); public slots: virtual void changed(toTreeWidgetItem *item); }; class toSecurityObject : public QTreeView { Q_OBJECT public: toSecurityObject(QWidget *parent); void changeUser(const QString &); void sql(const QString &user, std::list &sql); void eraseUser(bool all = true); void update(void); private: toSecurityTreeModel * m_model; }; class toSecurity : public toToolWidget { Q_OBJECT struct privilege { QString Owner; QString Object; QString Access; QString Value; bool Admin; privilege(const QString &owner, const QString &object, const QString &access, const QString &value, bool admin) : Owner(owner), Object(object), Access(access), Value(value), Admin(admin) { } }; QString UserID; QMenu *ToolMenu; toListView *UserList; toSecuritySystem *SystemGrant; toSecurityRoleGrant *RoleGrant; toSecurityObject *ObjectGrant; toSecurityPage *General; toSecurityQuota *Quota; QAction *DropAct; QAction *CopyAct; QAction *UpdateListAct; QAction *SaveAct; QAction *AddUserAct; QAction *AddRoleAct; QAction *DisplaySQLAct; QTabWidget *Tabs; std::list sql(void); public: toSecurity(QWidget *parent, toConnection &connection); virtual void changeUser(bool); public slots: virtual void refresh(void); virtual void changeUser(toTreeWidgetItem *) { changeUser(true); } virtual void saveChanges(void); virtual void addUser(void); virtual void addRole(void); virtual void drop(void); virtual void copy(void); virtual void displaySQL(void); virtual void windowActivated(QMdiSubWindow *widget); }; class toSecurityQuota : public QWidget, public Ui::toSecurityQuotaUI { Q_OBJECT private: toTreeWidgetItem *CurrentItem; void clearItem(toTreeWidgetItem *item); public: toSecurityQuota(QWidget *parent); void changeUser(const QString &); QString sql(void); void clear(void); void update(void); private slots: void changeTablespace(void); void changeSize(void); }; #endif tora-2.1.3/src/todatatype.cpp0000644000175000017500000003302611323644246015732 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconnection.h" #include "todatatype.h" #include "toextract.h" #include #include #include #include #include static QString noValue = QString("-"); // this value indicates that size is NOT specified (use db default) toDatatype::toDatatype(toConnection &conn, const QString &def, QWidget *parent, const char *name) : QWidget(parent) { if (name) setObjectName(name); setup(conn); setType(def); } toDatatype::toDatatype(toConnection &conn, QWidget *parent, const char *name) : QWidget(parent) { if (name) setObjectName(name); setup(conn); setType("VARCHAR2(32)"); } void toDatatype::setup(toConnection &conn) { toExtract extractor(conn, this); Datatypes = extractor.datatypes(); QHBoxLayout *hbox = new QHBoxLayout; hbox->setSpacing(0); hbox->setContentsMargins(0, 0, 0, 0); Type = new QComboBox(this); hbox->addWidget(Type); for (std::list::iterator i = Datatypes.begin(); i != Datatypes.end(); i++) Type->addItem((*i).name()); LeftParenthesis = new QLabel(tr("("), this); LeftParenthesis->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred)); hbox->addWidget(LeftParenthesis); Size = new QSpinBox(this); Size->setMinimum(0); Size->setSpecialValueText(noValue); // size can be NOT specified (use db default) bSizeVisible = true; hbox->addWidget(Size); Comma = new QLabel(tr(","), this); Comma->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred)); hbox->addWidget(Comma); Precision = new QSpinBox(this); Precision->setMinimum(0); Precision->setSpecialValueText(noValue); // precision can be NOT specified (use db default) bPrecVisible = true; hbox->addWidget(Precision); RightParenthesis = new QLabel(tr(")"), this); RightParenthesis->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred)); hbox->addWidget(RightParenthesis); Custom = new QLineEdit(this); hbox->addWidget(Custom); Custom->hide(); PreferCustom = false; connect(Type, SIGNAL(activated(int)), this, SLOT(changeType(int))); setLayout(hbox); bCustomVisible = false; bSizeVisible = true; bPrecVisible = true; } QString toDatatype::type() const { QString type; if (bCustomVisible) { type = Custom->text(); } else { type = Type->currentText(); bool par = false; if (bSizeVisible && (Size->text() != noValue)) { type += "("; par = true; type += Size->text(); } if (bPrecVisible && (Precision->text() != noValue)) { if (!par) { type += "("; par = true; } else type += ","; type += Precision->text(); } if (par) type += ")"; } return type; } // Function tries to split given datatype (type) into a number of // ui widgets (type, scale and precision). If it is unable to do // that - custom style (pure edit text widget) is used void toDatatype::setType(const QString &type) { try { // Intentionally not using the SQL parser for this enum { Initial, AtType, AtSize, AtPrecision, AtEnd } state = Initial; int startType = -1; int endType = -1; int size = -1; int precision = -1; bool valid = !PreferCustom; bool endoftoken = false; if (valid) { for (int pos = 0; pos < type.length(); pos++) { QChar c = type.at(pos); if (c.isSpace()) { endoftoken = true; continue; } switch (state) { case Initial: state = AtType; startType = pos; endoftoken = false; break; case AtType: if (c == '(') { state = AtSize; endoftoken = false; } else if (endoftoken) { valid = false; } else endType = pos; break; case AtSize: if (c.isDigit() && (!endoftoken || size == -1)) { if (size == -1) size = (c.toAscii()) - '0'; else size = size * 10 + (c.toAscii()) - '0'; endoftoken = false; } else if (size == -1) valid = false; else if (c == ')') { endoftoken = false; state = AtEnd; } else if (c == ',') { endoftoken = false; state = AtPrecision; } else valid = false; break; case AtPrecision: if (c.isDigit() && (!endoftoken || precision == -1)) { if (precision == -1) precision = (c.toAscii()) - '0'; else precision = precision * 10 + (c.toAscii()) - '0'; endoftoken = false; } else if (precision == -1) valid = false; else if (c == ')') { endoftoken = false; state = AtEnd; } else valid = false; break; case AtEnd: valid = false; break; } if (!valid) break; } } if (valid) { if (endType == -1) endType = type.length(); if (startType >= 0) { QString actualtype = type.mid(startType, endType - startType + 1).toUpper(); valid = false; for (int i = 0; i < Type->count(); i++) { if (actualtype == Type->itemText(i)) { Type->show(); bCustomVisible = false; Type->setCurrentIndex(i); valid = true; break; } } if (valid) { valid = false; for (std::list::iterator i = Datatypes.begin(); i != Datatypes.end(); i++) { if ((*i).name() == actualtype) { valid = true; if ((*i).hasLength()) { if (size > (*i).maxLength()) valid = false; else { Size->show(); bSizeVisible = true; Size->setMaximum((*i).maxLength()); if (size != -1) Size->setValue(size); else //Size->setValue((*i).maxLength()); Size->setValue(0); // set value "not specified" } } else if (size != -1) valid = false; else { Size->hide(); bSizeVisible = false; } if ((*i).hasPrecision()) { if (precision > (*i).maxPrecision()) valid = false; else { Precision->show(); bPrecVisible = true; Precision->setMaximum((*i).maxPrecision()); if (precision != -1) Precision->setValue(precision); else // Set precision to 0 (meaning "precision not specified"). // If precision 0 can actually be used -1 should be used // here and minimum value on precision spinner should be // changed to -1 so that spinner would allow choosing 0 Precision->setValue(0); } } else if (precision != -1) valid = false; else { Precision->hide(); bPrecVisible = false; } break; } } } } } if (!valid) { Custom->setText(type); Custom->show(); bCustomVisible = true; Precision->hide(); bPrecVisible = false; Size->hide(); bSizeVisible = false; Type->hide(); } else { Custom->hide(); bCustomVisible = false; // probably set already above but just for clarity... } setupLabels(); } TOCATCH } void toDatatype::setupLabels() { bool show = Size->isVisible() || Precision->isVisible(); RightParenthesis->setShown(show); LeftParenthesis->setShown(show); Comma->setShown(Size->isVisible() && Precision->isVisible()); } void toDatatype::setCustom(bool prefer) { PreferCustom = prefer; setType(type()); } void toDatatype::changeType(int id) { QString type = Type->itemText(id); for (std::list::iterator i = Datatypes.begin(); i != Datatypes.end(); i++) { if ((*i).name() == type) { if ((*i).hasLength()) { Size->show(); bSizeVisible = true; Size->setMaximum((*i).maxLength()); } else { Size->hide(); bSizeVisible = false; } if ((*i).hasPrecision()) { Precision->show(); bPrecVisible = true; Precision->setMaximum((*i).maxPrecision()); } else { Precision->hide(); bPrecVisible = false; } break; } } setupLabels(); } tora-2.1.3/src/toresultcolscomment.h0000644000175000017500000000451211270353625017343 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTCOLSCOMMENT_H #define TORESULTCOLSCOMMENT_H #include "config.h" #include #include #include class QWidget; /** This widget is used for single record view in the content * editor. Only for internal use. * * @internal */ class toResultColsComment : public QLineEdit { Q_OBJECT; bool Changed; bool Table; QString Name; private slots: void saveUnchanged(); public: toResultColsComment(QWidget *parent); void setComment(bool table, const QString &name, const QString &comment); public slots: void commentChanged(); }; #endif tora-2.1.3/src/toresultparam.cpp0000644000175000017500000003505511270353625016461 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toresultparam.h" #include "tosql.h" #include "toresultview.h" #include "tomemoeditor.h" #include "toconnection.h" #include "toresultlong.h" #include #include #include #include #include #include #include #include #include "icons/database.xpm" #include "icons/filesave.xpm" #include "icons/scansource.xpm" #include "icons/tocurrent.xpm" #include "icons/trash.xpm" #include "icons/commit.xpm" static toSQL SQLParamsMySQL("toResultParam:ListParam", "show variables", "List parameters available in the session", "4.0", "MySQL"); static toSQL SQLParamsGlobal("toResultParam:ListGlobal", "show global variables", "List parameters available in the database", "4.0", "MySQL"); static toSQL SQLParams("toResultParam:ListParam", "select name \"Parameter\",value \"Value\",' ' \"Changed\",\n" " description \"Description\", num \" Number\",\n" " type \" Type\",isdefault \" Default\",\n" " isses_modifiable \" Sesmod\",issys_modifiable \" Sysmod\"\n" " from v$parameter order by name", ""); static toSQL SQLHiddenParams("toResultParam:ListHidden", "SELECT KSPPINM \"Parameter\",\n" " KSPFTCTXVL \"Value\",\n" " ' ' \"Changed\",\n" " KSPPDESC \"Description\",\n" " KSPFTCTXPN \" Num\",\n" " ksppity \" Type\",\n" " KSPFTCTXDF \" Default\",\n" " DECODE(MOD(TRUNC(KSPPIFLG/256),2),0,'FALSE','TRUE') \" Sesmod\",\n" " DECODE(MOD(TRUNC(KSPPIFLG/65536),8),0,'FALSE','TRUE') \" Sysmod\"\n" " FROM X$KSPPI x,\n" " X$KSPPCV2 y\n" " WHERE x.INDX+1=y.KSPFTCTXPN ORDER BY KSPPINM", "List parameters available in the database including hidden parameters"); bool toResultParam::canHandle(toConnection &conn) { return toIsOracle(conn) || toIsMySQL(conn); } toResultParam::toResultParam(QWidget *parent, const char *name) : QWidget(parent) { if (name) setObjectName(name); QVBoxLayout *vbox = new QVBoxLayout; vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); setLayout(vbox); QToolBar *toolbar = toAllocBar(this, tr("Parameter editor")); vbox->addWidget(toolbar); Toggle = new QToolButton(toolbar); Toggle->setCheckable(true); if (toIsOracle(connection())) { Toggle->setIcon(QIcon(QPixmap(const_cast(scansource_xpm)))); connect(Toggle, SIGNAL(toggled(bool)), this, SLOT(showHidden(bool))); Toggle->setToolTip( tr("Display hidden parameters. This will only work if you are " "logged in as the sys user.")); } else { QIcon iconset(QPixmap(const_cast(tocurrent_xpm))); iconset.addPixmap(QPixmap(const_cast(database_xpm)), QIcon::Normal, QIcon::On); Toggle->setIcon(iconset); connect(Toggle, SIGNAL(toggled(bool)), this, SLOT(showGlobal(bool))); Toggle->setToolTip( tr("Switch between global and session variables to show.")); } toolbar->addWidget(Toggle); toolbar->addSeparator(); toolbar->addAction(QIcon(QPixmap(const_cast(filesave_xpm))), tr("Generate configuration file"), this, SLOT(generateFile())); toolbar->addSeparator(); if (toIsOracle(connection())) { toolbar->addAction(QIcon(QPixmap(const_cast(database_xpm))), tr("Apply changes to system"), this, SLOT(applySystem())); toolbar->addAction(QIcon(QPixmap(const_cast(tocurrent_xpm))), tr("Apply changes to session"), this, SLOT(applySession())); } else { toolbar->addAction(QIcon(QPixmap(const_cast(commit_xpm))), tr("Apply changes"), this, SLOT(applyChanges())); } if (toIsOracle(connection())) { toolbar->addSeparator(); toolbar->addAction(QIcon(QPixmap(const_cast(trash_xpm))), tr("Drop current changes"), this, SLOT(dropChanges())); } toolbar->addWidget(new toSpacer()); Params = new toResultLong(false, false, toQuery::Background, this); vbox->addWidget(Params); Params->setSQL(SQLParams); Params->setReadAll(true); Params->setSelectionMode(toTreeWidget::Single); connect(Params, SIGNAL(selectionChanged()), this, SLOT(changeItem())); connect(Params, SIGNAL(done()), this, SLOT(done())); Value = new QLineEdit(this); Value->setEnabled(false); vbox->addWidget(Value); refresh(); } void toResultParam::showHidden(bool hid) { if (hid) Params->setSQL(SQLHiddenParams); else Params->setSQL(SQLParams); refresh(); } void toResultParam::showGlobal(bool glb) { if (glb) Params->setSQL(SQLParamsGlobal); else Params->setSQL(SQLParams); refresh(); } void toResultParam::query(const QString &, const toQList &) { saveChange(); LastItem = QString::null; Params->refresh(); } void toResultParam::dropChanges(void) { NewValues.clear(); refresh(); } void toResultParam::done() { for (toTreeWidgetItem *item = Params->firstChild();item;item = item->nextSibling()) { std::map::iterator i = NewValues.find(item->text(0)); if (i != NewValues.end()) { item->setText(1, (*i).second); item->setText(6, QString::fromLatin1("FALSE")); item->setText(2, tr("Changed")); } } } void toResultParam::saveChange() { if (!LastItem.isEmpty() && LastValue != Value->text()) { NewValues[LastItem] = Value->text(); LastValue = Value->text(); for (toTreeWidgetItem *item = Params->firstChild();item;item = item->nextSibling()) { if (item->text(0) == LastItem) { item->setText(1, LastValue); item->setText(6, QString::fromLatin1("FALSE")); item->setText(2, tr("Changed")); break; } } } } void toResultParam::generateFile(void) { saveChange(); QString str = tr("# Generated by TOra version %1\n\n").arg(QString::fromLatin1(TOVERSION)); QRegExp comma(QString::fromLatin1("\\s*,\\s+")); for (toTreeWidgetItem *item = Params->firstChild();item;item = item->nextSibling()) { if (toIsOracle(connection())) { if (item->text(6) == QString::fromLatin1("FALSE")) { str += item->text(0); str += QString::fromLatin1(" = "); if (item->text(5) == QString::fromLatin1("2")) { QStringList lst = item->text(1).split(comma); if (lst.count() > 1) str += QString::fromLatin1("( "); for (int i = 0;i < lst.count();i++) { if (i > 0) str += QString::fromLatin1(", "); str += QString::fromLatin1("\"") + lst[i] + QString::fromLatin1("\""); } if (lst.count() > 1) str += QString::fromLatin1(" )"); } else str += item->text(1); str += QString::fromLatin1("\n"); } } else { str += item->text(0) + " = '" + item->text(1) + "'\n"; } } connect(new toMemoEditor(this, str, 0, 0), SIGNAL(changeData(int, int, const QString &)), this, SLOT(changedData(int, int, const QString &))); } void toResultParam::applySession(void) { try { saveChange(); toConnection &conn = connection(); for (toTreeWidgetItem *item = Params->firstChild();item;item = item->nextSibling()) { if (item->text(2) == tr("Changed")) { try { if (item->text(7) != QString::fromLatin1("FALSE")) { QString str = QString::fromLatin1("ALTER SESSION SET "); str += item->text(0); str += QString::fromLatin1(" = "); if (item->text(5) == QString::fromLatin1("2")) { str += QString::fromLatin1("'"); str += item->text(1); str += QString::fromLatin1("'"); } else str += item->text(1); conn.allExecute(str); std::map::iterator i = NewValues.find(item->text(0)); if (i != NewValues.end()) NewValues.erase(i); } } TOCATCH } } } TOCATCH refresh(); } void toResultParam::applySystem(void) { try { saveChange(); toConnection &conn = connection(); for (toTreeWidgetItem *item = Params->firstChild();item;item = item->nextSibling()) { if (item->text(2) == tr("Changed")) { try { if (item->text(8) != QString::fromLatin1("FALSE")) { QString str = QString::fromLatin1("ALTER SYSTEM SET "); str += item->text(0); str += QString::fromLatin1(" = "); if (item->text(5) == QString::fromLatin1("2")) { str += QString::fromLatin1("'"); str += item->text(1); str += QString::fromLatin1("'"); } else str += item->text(1); conn.execute(str); std::map::iterator i = NewValues.find(item->text(0)); if (i != NewValues.end()) NewValues.erase(i); } } TOCATCH } } } TOCATCH refresh(); } // Only used by MySQL void toResultParam::applyChanges(void) { try { saveChange(); toConnection &conn = connection(); for (toTreeWidgetItem *item = Params->firstChild();item;item = item->nextSibling()) { if (item->text(2) == tr("Changed")) { try { QString str = "SET "; if (!Toggle->isChecked()) str += "GLOBAL "; else str += "SESSION "; str += item->text(0); str += " = "; str += QString::fromLatin1("'"); str += item->text(1); str += QString::fromLatin1("'"); conn.execute(str); std::map::iterator i = NewValues.find(item->text(0)); if (i != NewValues.end()) NewValues.erase(i); } TOCATCH } } } TOCATCH refresh(); } void toResultParam::changeItem(void) { saveChange(); toTreeWidgetItem *item = Params->selectedItem(); if (item) { LastItem = item->text(0); LastValue = item->text(1); Value->setText(LastValue); Value->setEnabled(true); } else { LastItem = QString::null; Value->setEnabled(false); } } void toResultParam::changedData(int, int, const QString &data) { QString file = toSaveFilename(QString::null, toIsOracle(connection()) ? "*.pfile" : "*.conf", this); if (!file.isEmpty()) toWriteFile(file, data); } tora-2.1.3/src/tothread.h0000644000175000017500000001530311336032004015014 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOTHREAD_H #define TOTHREAD_H #include "config.h" #include #include #include #include /** This is an abstract class that defines something that is to be performed by a * thread. */ class toTask { public: virtual ~toTask() { } /** This member is called when the class is started. */ virtual void run(void) = 0; }; /** Encapsulation of pthread semaphores. A semaphore can be raise to any value * but will wait till raised above zero when lowered below 0. Can also be implemented * without pthreads using Qt multithreaded primitives. Observe that these function * different than Qt semaphores. */ class toSemaphore { private: QMutex Mutex; QWaitCondition Condition; int Value; public: /** Create semaphore */ toSemaphore() : Condition() { Value = 0; } /** Unimplemented copy constructor. */ toSemaphore(const toSemaphore &); /** Create semaphore * @param val Value of new semaphore. */ toSemaphore(int val) : Condition() { Value = val; } /** Increase semaphore value by 1. */ void up(); /** Decrease semaphore value by 1, wait for it to never go below 0. */ void down(); /** Get current semaphore value. */ int getValue(); }; #include class toLock { private: QMutex Mutex; public: toLock(void) : Mutex(QMutex::NonRecursive) { } toLock(const toLock &); void lock (void) { Mutex.lock(); } void unlock(void) { Mutex.unlock(); } }; void *toThreadStartWrapper(void*); class taskRunner; class toThreadInfo; class toThread { private: /** Not part of the API. */ static QThreadStorage toThreadInfoStorage; volatile static unsigned lastThreadNumber; taskRunner *Thread; static std::list *Threads; static toLock *Lock; static QThread *MainThread; toThread(const toThread &); public: toThread(toTask *); ~toThread(); void start(void); void startAsync(void); static void msleep(int msec); static bool mainThread(void); /** * called from tomain.cpp to set the main thread. no more * guessing which thread is main! * */ static void setMainThread(QThread *main); friend class taskRunner; friend class toThreadInfo; friend class toConnectionPoolTest; friend class toConnectionPoolExec; }; /** This class is used for debugging purposes only * Holds thread specific data */ class toThreadInfo { public: unsigned threadNumber; QString threadTask; toThreadInfo(unsigned number); static unsigned getThreadNumber() { if(toThread::toThreadInfoStorage.hasLocalData()) { toThreadInfo *i = toThread::toThreadInfoStorage.localData(); return i->threadNumber; } else { throw QString("This thread has no in information associated"); } } virtual ~toThreadInfo(); }; /** This is a convenience class that holds a lock for the duration of the scope * of the object. It is very convenient to use if exceptions can be thrown, simply * declare an auto @ref toLocker to hold the lock. If any exception is thrown the * locker will be deallocated and the lock released. */ class toLocker { private: /** Lock held. */ toLock &Lock; toLocker(const toLocker &); public: /** Create locker. * @param lock Lock to hold. */ toLocker(toLock &lock ) : Lock(lock ) { Lock.lock(); } ~toLocker() { Lock.unlock(); } }; // much thanks to: // http://www.ddj.com/cpp/184403766 // i added lock and unlock template class LockingPtr { public: // Constructors/destructors LockingPtr(volatile T& obj, QMutex& mtx) : pObj_(const_cast(&obj)), pMtx_(&mtx) { mtx.lock(); locked = true; } /** * Overloaded contructor that attempts lock rather than blocking. * * Will throw an instance of QString if class failed to obtain * lock and tryLock is true. * */ LockingPtr(volatile T& obj, QMutex& mtx, bool tryLock) : pObj_(const_cast(&obj)), pMtx_(&mtx) { if(tryLock) { locked = mtx.tryLock(); if(!locked) throw QString::fromLatin1("Busy"); } else { mtx.lock(); locked = true; } } ~LockingPtr() { if(locked) pMtx_->unlock(); } void lock() { pMtx_->lock(); locked = true; } void unlock() { locked = false; pMtx_->unlock(); } // Pointer behavior T& operator*() { return *pObj_; } T* operator->() { return pObj_; } private: bool locked; T* pObj_; QMutex* pMtx_; LockingPtr(const LockingPtr&); LockingPtr& operator=(const LockingPtr&); }; #endif tora-2.1.3/src/totableselect.h0000644000175000017500000000112211270353625016042 0ustar michaelmichael#ifndef TOTABLESELECT_H #define TOTABLESELECT_H #include "config.h" #include "totool.h" #include class toConnection; class toResultCombo; class toTableSelect : public QGroupBox { Q_OBJECT toResultCombo *Schema; toResultCombo *Table; QString SelectedTable; public: toTableSelect(QWidget *parent, const char *name = 0); virtual ~toTableSelect() { } void setTable(const QString &table); signals: void selectTable(const QString &table); private slots: void setup(void); void changeSchema(void); void changeTable(void); }; #endif tora-2.1.3/src/tochartsetupui.ui0000644000175000017500000002263511270353625016475 0ustar michaelmichael toChartSetupUI 0 0 588 480 Chart manager setup 11 11 11 11 6 6 6 0 0 0 0 0 0 Track chart to file 11 11 11 11 6 6 false false Browse false Remember to track this chart to this file always when starting. Persistent Enable tracking Filename false 0 0 0 0 Alarms 11 11 11 11 6 6 &Add 0 0 Qt::StrongFocus Qt::Vertical QSizePolicy::Expanding 20 20 Remove Modify Cancel &Ok true Qt::Horizontal QSizePolicy::Expanding 20 20 toListView QWidget
toresultview.h
Filename BrowseButton Persistent Alarms AddButton RemoveButton OkButton CancelButton OkButton clicked() toChartSetupUI accept() 20 20 20 20 CancelButton clicked() toChartSetupUI reject() 20 20 20 20 Enabled toggled(bool) Filename setEnabled(bool) 20 20 20 20 Enabled toggled(bool) BrowseButton setEnabled(bool) 20 20 20 20 Enabled toggled(bool) Persistent setEnabled(bool) 20 20 20 20
tora-2.1.3/src/tomarkedtext.cpp0000644000175000017500000006471611445353612016300 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "tohighlightedtext.h" #include "tomain.h" #include "tomarkedtext.h" #include "tosearchreplace.h" #include "totool.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "icons/undo.xpm" #include "icons/redo.xpm" #include "icons/copy.xpm" #include "icons/cut.xpm" #include "icons/paste.xpm" #define ACCEL_KEY(k) "\t" + QString("Ctrl+" #k) toMarkedText::toMarkedText(QWidget *parent, const char *name) : QsciScintilla(parent), toEditWidget(), m_searchDirection(Search::SearchUndefined), m_searchText(""), m_searchIndicator(9) // see QsciScintilla docs { if (name) setObjectName(name); setEdit(); Search = false; setFont(toStringToFont(toConfigurationSingle::Instance().textFont())); setMarginLineNumbers(0, true); setCallTipsStyle(CallTipsNone); // WARNING: it looks like this hack is mandatory for macosx. Oracle simly // doesn't understand mac's eols, so force to UNIX is a functional workaround #ifdef Q_WS_MAC setEolMode(QsciScintilla::EolUnix); #endif // search all occurrences // allow indicator painting *under* the text (but it makes editor slower a bit...) // It paints a colored box under the text for all occurrences of m_searchText. SendScintilla(QsciScintilla::SCI_SETTWOPHASEDRAW, 1); SendScintilla(QsciScintilla::SCI_INDICSETSTYLE, m_searchIndicator, QsciScintilla::INDIC_ROUNDBOX); // TODO/FIXME: make it configurable SendScintilla(QsciScintilla::SCI_INDICSETFORE, m_searchIndicator, QColor(255, 230, 90, 100)); SendScintilla(QsciScintilla::SCI_INDICSETUNDER, m_searchIndicator, 1); // end of search all occurrences connect(this, SIGNAL(textChanged()), this, SLOT(setTextChanged())); connect(this, SIGNAL(copyAvailable(bool)), this, SLOT(setCopyAvailable(bool))); connect(this, SIGNAL(linesChanged()), this, SLOT(linesChanged())); m_fsWatcher = new QFileSystemWatcher(this); connect(m_fsWatcher, SIGNAL(fileChanged(const QString&)), this, SLOT(m_fsWatcher_fileChanged(const QString &))); CursorTimerID = -1; // sets default tab width setTabWidth(defaultTabWidth()); setIndentationsUseTabs(!defaultTabSpaces()); this->setUtf8(true); setAcceptDrops(true); } toMarkedText::~toMarkedText() { } int toMarkedText::defaultTabWidth() { return toConfigurationSingle::Instance().tabStop(); } void toMarkedText::setDefaultTabWidth(int width) { toConfigurationSingle::Instance().setTabStop(width); toConfigurationSingle::Instance().saveConfig(); } bool toMarkedText::defaultTabSpaces(void) { return toConfigurationSingle::Instance().tabSpaces(); } void toMarkedText::setDefaultTabSpaces(bool on) { toConfigurationSingle::Instance().setTabSpaces(on); toConfigurationSingle::Instance().saveConfig(); } void toMarkedText::setCopyAvailable(bool yes) { setEdit(); } void toMarkedText::linesChanged() { int x = QString::number(lines()).length() + 1; setMarginWidth(0, QString().fill('0', x)); } void toMarkedText::m_fsWatcher_fileChanged(const QString & filename) { m_fsWatcher->blockSignals(true); setFocus(Qt::OtherFocusReason); if (QMessageBox::question(this, tr("External File Modification"), tr("File %1 was modified by an external application. Reload (your changes will be lost)?").arg(filename), QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) { return; } openFilename(filename); m_fsWatcher->blockSignals(false); } void toMarkedText::setWordWrap(bool enable) { if (enable) { setWrapMode(QsciScintilla::WrapWord); setWrapVisualFlags(QsciScintilla::WrapFlagByBorder, QsciScintilla::WrapFlagByBorder); } else { setWrapMode(QsciScintilla::WrapNone); setWrapVisualFlags(QsciScintilla::WrapFlagNone, QsciScintilla::WrapFlagNone); } } void toMarkedText::setXMLWrap(bool wrap) { if (wrap) { QDomDocument d; if (m_origContent.isEmpty()) m_origContent = text(); if (d.setContent(m_origContent)) setText(d.toString(2)); else m_origContent.clear(); } else { if (!m_origContent.isEmpty()) { setText(m_origContent); m_origContent.clear(); } } } void toMarkedText::setEdit(void) { if (isReadOnly()) { toEditWidget::setEdit(false, true, true, false, false, false, hasSelectedText(), false, true, true, false); } else { toEditWidget::setEdit(true, true, true, undoEnabled(), redoEnabled(), hasSelectedText(), hasSelectedText(), true, true, true, false); } toMain::editEnable(this); } void toMarkedText::focusInEvent (QFocusEvent *e) { receivedFocus(); int curline, curcol; getCursorPosition (&curline, &curcol); toMainWidget()->setCoordinates(curline + 1, curcol + 1); QsciScintilla::focusInEvent(e); if (CursorTimerID < 0) CursorTimerID = startTimer(500); } void toMarkedText::timerEvent(QTimerEvent *e) { if (CursorTimerID == e->timerId()) { int curline, curcol; getCursorPosition (&curline, &curcol); toMainWidget()->setCoordinates(curline + 1, curcol + 1); } else QsciScintilla::timerEvent(e); } void toMarkedText::focusOutEvent (QFocusEvent *e) { if (Search) { Search = false; LastSearch = SearchString; toStatusMessage(QString::null); } if (CursorTimerID >= 0) { killTimer(CursorTimerID); CursorTimerID = -1; } QsciScintilla::focusOutEvent(e); } void toMarkedText::editPrint(void) { QsciPrinter printer; QPrintDialog dialog(&printer, this); dialog.setMinMax(1, 1000); dialog.setFromTo(1, 1000); if(!Filename.isEmpty()) { QFileInfo info(Filename); dialog.setWindowTitle(tr("Print %1").arg(info.fileName())); printer.setOutputFileName(info.path() + QString("/") + info.baseName() + ".pdf"); } else dialog.setWindowTitle(tr("Print Document")); // printRange() not handling this and not sure what to do about it // if(hasSelectedText()) // dialog.addEnabledOption(QAbstractPrintDialog::PrintSelection); if(!dialog.exec()) return; printer.setCreator(tr(TOAPPNAME)); // they show up in the print setMarginLineNumbers(0, false); printer.printRange(this); setMarginLineNumbers(0, true); } void toMarkedText::openFilename(const QString &file) { fsWatcherClear(); QString data = toReadFile(file); setText(data); setFilename(file); setModified(false); toMainWidget()->addRecentFile(file); m_fsWatcher->addPath(file); toStatusMessage(tr("File opened successfully"), false, false); } bool toMarkedText::editOpen(QString suggestedFile) { if (isModified()) { int ret = TOMessageBox::information(this, tr("Save changes?"), tr("The editor has been changed, do you want to save them\n" "before opening a new file?"), tr("&Yes"), tr("&No"), tr("Cancel"), 0, 2); if (ret == 2) return false; else if (ret == 0) if (!editSave(false)) return false; } QString fname; if (!suggestedFile.isEmpty()) fname = suggestedFile; else fname = toOpenFilename(QDir::currentPath(), QString::null, this); if (!fname.isEmpty()) { try { openFilename(fname); emit fileOpened(); emit fileOpened(fname); printf("emit file opened\n"); return true; } TOCATCH } return false; } bool toMarkedText::editSave(bool askfile) { fsWatcherClear(); bool ret = false; QFileInfo file(filename()); QString fn = filename(); if (askfile || fn.isEmpty()) fn = toSaveFilename(file.dir().path(), QString::null, this); if (!fn.isEmpty() && toWriteFile(fn, text())) { toMainWidget()->addRecentFile(fn); setFilename(fn); setModified(false); emit fileSaved(fn); ret = true; } m_fsWatcher->addPath(fn); return ret; } void toMarkedText::newLine(void) { // new line switch (eolMode()) { case EolWindows: insert ("\n\r"); break; case EolMac: insert ("\n"); break; default: // Unix is default one insert ("\r"); break; } if (toConfigurationSingle::Instance().autoIndent()) { int curline, curcol; getCursorPosition (&curline, &curcol); if (curline > 0) { QString str = text(curline - 1); QString ind; for (int i = 0;i < str.length() && str.at(i).isSpace();i++) ind += str.at(i); if (ind.length()) insert(ind, false); } } } void toMarkedText::searchFound(int line, int col) { setSelection (line, col + SearchString.length(), line, col); ensureCursorVisible(); toStatusMessage(tr("Incremental search") + QString::fromLatin1(":") + SearchString, false, false); } void toMarkedText::incrementalSearch(bool forward, bool next) { int curline, curcol; getCursorPosition (&curline, &curcol); QString line; if (SearchFailed && next) { if (forward) { curline = 0; curcol = 0; next = false; line = text(curline); } else { curline = lines() - 1; line = text(curline); curcol = line.length(); next = false; } SearchFailed = false; } else line = text(curline); if (forward) { if (next) curcol++; if (curcol + SearchString.length() <= line.length()) { int pos = line.indexOf(SearchString, curcol, Qt::CaseInsensitive); if (pos >= 0) { searchFound(curline, pos); return ; } } for (curline++;curline < lines();curline++) { int pos = text(curline).indexOf(SearchString, 0, Qt::CaseInsensitive); if (pos >= 0) { searchFound(curline, pos); return ; } } } else { if (next) curcol--; if (curcol >= 0) { int pos = line.lastIndexOf(SearchString, curcol, Qt::CaseInsensitive); if (pos >= 0) { searchFound(curline, pos); return ; } } for (curline--;curline >= 0;curline--) { int pos = text(curline).lastIndexOf(SearchString, -1, Qt::CaseInsensitive); if (pos >= 0) { searchFound(curline, pos); return ; } } } toStatusMessage(tr("Incremental search") + QString::fromLatin1(":") + SearchString + QString::fromLatin1(" (failed)"), false, false); SearchFailed = true; } void toMarkedText::fsWatcherClear() { QStringList l(m_fsWatcher->files()); if (!l.empty()) m_fsWatcher->removePaths(l); } void toMarkedText::dropEvent(QDropEvent *e) { if(e->source() == this || e->source() == viewport()) { QPoint point = e->pos() - DragStart; // forces a reasonable drag distance if (point.manhattanLength() < QApplication::startDragDistance()) { e->ignore(); return; } e->acceptProposedAction(); beginUndoAction(); QString selection = selectedText(); removeSelectedText(); long position = SendScintilla(SCI_POSITIONFROMPOINT, e->pos().x(), e->pos().y()); SendScintilla(SCI_SETCURRENTPOS, position); int line, index; getCursorPosition(&line, &index); insertAt(selection, line, index); setSelection(line, index, line, index + selection.length()); endUndoAction(); } else QsciScintilla::dropEvent(e); setFocus(); } void toMarkedText::mousePressEvent(QMouseEvent *e) { if (Search) { Search = false; LastSearch = SearchString; toStatusMessage(QString::null); } DragStart = QPoint(); if(e->button() == Qt::LeftButton && geometry().contains(e->pos())) { if(!toConfigurationSingle::Instance().editDragDrop()) { // would normally be a drag request. clear selection. if(QsciScintilla::hasSelectedText()) QsciScintilla::selectAll(false); } else if(QsciScintilla::hasSelectedText()) DragStart = e->pos(); } QsciScintilla::mousePressEvent(e); } void toMarkedText::incrementalSearch(bool forward) { SearchForward = forward; if (!Search) { Search = true; SearchFailed = false; SearchString = QString::null; toStatusMessage(tr("Incremental search") + QString::fromLatin1(":"), false, false); } else if (Search) { if (!SearchString.length()) SearchString = LastSearch; if (SearchString.length()) incrementalSearch(SearchForward, true); } } void toMarkedText::keyPressEvent(QKeyEvent *e) { if (Search) { bool ok = false; if (e->modifiers() == Qt::NoModifier && e->key() == Qt::Key_Backspace) { int len = SearchString.length(); if (len > 0) SearchString.truncate(len - 1); ok = true; } else if (e->key() != Qt::Key_Escape) { QString t = e->text(); if (t.length()) { SearchString += t; ok = true; } else if (e->key() == Qt::Key_Shift || e->key() == Qt::Key_Control || e->key() == Qt::Key_Meta || e->key() == Qt::Key_Alt) { ok = true; } } if (ok) { incrementalSearch(SearchForward, false); e->accept(); return ; } else { Search = false; LastSearch = SearchString; toStatusMessage(QString::null); } } QsciScintilla::keyPressEvent(e); } void toMarkedText::exportData(std::map &data, const QString &prefix) { data[prefix + ":Filename"] = Filename; data[prefix + ":Text"] = text(); int curline, curcol; getCursorPosition (&curline, &curcol); data[prefix + ":Column"] = QString::number(curcol); data[prefix + ":Line"] = QString::number(curline); if (isModified()) data[prefix + ":Edited"] = "Yes"; } void toMarkedText::importData(std::map &data, const QString &prefix) { QString txt = data[prefix + ":Text"]; if (txt != text()) setText(txt); Filename = data[prefix + ":Filename"]; setCursorPosition(data[prefix + ":Line"].toInt(), data[prefix + ":Column"].toInt()); if (data[prefix + ":Edited"].isEmpty()) setModified(false); } /* static int FindIndex(const QString &str, int line, int col) { int pos = 0; for (int i = 0;i < line;i++) { pos = str.indexOf('\n', pos); if (pos < 0) return pos; pos++; } return pos + col; }*/ void toMarkedText::findPosition(int index, int &line, int &col) { int pos = 0; for (int i = 0;i < lines();i++) { QString str = text(i); if (str.length() + pos >= index) { line = i; col = index - pos; return ; } pos += str.length(); } col = -1; line = -1; return ; } bool toMarkedText::searchNext(const QString & text) { return findText(Search::SearchForward); } bool toMarkedText::searchPrevious(const QString & text) { return findText(Search::SearchBackward); } bool toMarkedText::findText(Search::SearchDirection direction) { bool r = false; int line, index; Search::SearchDirection state = m_searchDirection; getCursorPosition(&line, &index); if (m_searchText != toMainWidget()->searchDialog()->currentSearchText()) { m_searchText = toMainWidget()->searchDialog()->currentSearchText(); state = Search::SearchUndefined; // to reset the findFirst() condition } if (m_searchDirection != direction) m_searchDirection = direction; if (m_searchDirection != state) { r = findFirst(m_searchText, toMainWidget()->searchDialog()->searchMode() == Search::SearchRegexp, toMainWidget()->searchDialog()->caseSensitive(), toMainWidget()->searchDialog()->wholeWords(), true, //bool wrap, (m_searchDirection == Search::SearchForward), line, index, true //bool show = true ); // find and highlight all occurrences of m_searchText // from the beginning to the end int from = 0; int to = text().length(); SendScintilla(QsciScintilla::SCI_SETINDICATORCURRENT, m_searchIndicator); // clear previously used marked text SendScintilla(QsciScintilla::SCI_INDICATORCLEARRANGE, 0, to); // set searching flags int searchFlags = 0; //QsciScintilla::SCFIND_WORDSTART; if (toMainWidget()->searchDialog()->searchMode() == Search::SearchRegexp) searchFlags |= QsciScintilla::SCFIND_REGEXP; if (toMainWidget()->searchDialog()->caseSensitive()) searchFlags |= QsciScintilla::SCFIND_MATCHCASE; if (toMainWidget()->searchDialog()->wholeWords()) searchFlags |= QsciScintilla::SCFIND_WHOLEWORD; while (from < to) { // set searching range SendScintilla(QsciScintilla::SCI_SETTARGETSTART, from); SendScintilla(QsciScintilla::SCI_SETTARGETEND, to); SendScintilla(QsciScintilla::SCI_SETSEARCHFLAGS, searchFlags); from = SendScintilla(QsciScintilla::SCI_SEARCHINTARGET, m_searchText.length(), m_searchText.toUtf8().data()); // SCI_SEARCHINTARGET returns -1 when it doesn't find anything if (from == -1) break; int end = SendScintilla(QsciScintilla::SCI_GETTARGETEND); // mark current occurrence of searchText SendScintilla(QsciScintilla::SCI_INDICATORFILLRANGE, from, end - from); from = end; } } else findNext(); return r; } void toMarkedText::searchReplace(const QString &newData) { if (searchCanReplace(false)) // insert(newData); replace(newData); } void toMarkedText::searchReplaceAll(const QString & newData) { if (!searchCanReplace(true)) return; QsciScintilla::beginUndoAction(); while (findNext()) replace(newData); QsciScintilla::endUndoAction(); } bool toMarkedText::searchCanReplace(bool all) { if (isReadOnly()) return false; if (all || hasSelectedText()) return true; return false; } void toMarkedText::insert(const QString &str, bool select) { int lineFrom; int indexFrom; // Make this work as one undo so user doesn't see his code disappear first. QsciScintilla::beginUndoAction(); QsciScintilla::removeSelectedText(); if (select) getCursorPosition(&lineFrom, &indexFrom); // insert() doesn't work as advertised. // docs say: "The new current position if after the inserted text." // I thought it would mean that the cursor would be at the end of // the inserted text. Now I'm not really sure what the heck that // means. QsciScintilla::insert(str); // get new position and select if requested if (select) setSelection(lineFrom, indexFrom, lineFrom, indexFrom + str.length()); QsciScintilla::endUndoAction(); } void toMarkedText::clear(void) { Filename = ""; fsWatcherClear(); redoEnabled(false); undoEnabled(false); setEdit(); QsciScintilla::clear(); setModified(false); } #if 0 // TODO: this part is waiting for QScintilla backend feature (yet unimplemented). void toMarkedText::setSelectionType(int aType) { qDebug() << "setSelectionType" << SendScintilla(SCI_GETSELECTIONMODE) << aType; qDebug() << SendScintilla(SCI_SETSELECTIONMODE, aType); qDebug() << "setSelectionType" << SendScintilla(SCI_GETSELECTIONMODE) << aType; } #endif void toMarkedText::setTextChanged() { redoEnabled(isRedoAvailable()); undoEnabled(isUndoAvailable()); if (hasSelectedText()) { setEdit(); } } void toMarkedText::contextMenuEvent(QContextMenuEvent *e) { QPointer that = this; QPointer popup = createPopupMenu( e->pos() ); if (!popup) return; e->accept(); // NOTE: this emit exist for compatibility with older // version of TOra. It will have to be removed // once the way around it will be figured out emit displayMenu(popup); popup->exec(e->globalPos()); delete popup; } /** * This function is called to create a right mouse button popup menu * at the specified position. If you want to create a custom popup menu, * reimplement this function and return the created popup menu. Ownership * of the popup menu is transferred to the caller. */ QMenu *toMarkedText::createPopupMenu(const QPoint& pos) { Q_UNUSED(pos); const bool isEmptyDocument = (lines() == 0); // create menu QMenu *popup = new QMenu(this); QAction *action; if (!isReadOnly()) { action = popup->addAction(QIcon(undo_xpm), tr("&Undo"), this, SLOT(undo())); action->setShortcut(QKeySequence::Undo); action->setEnabled(isUndoAvailable()); action = popup->addAction(QIcon(redo_xpm), tr("&Redo"), this, SLOT(redo())); action->setShortcut(QKeySequence::Redo); action->setEnabled(isRedoAvailable()); popup->addSeparator(); action = popup->addAction(QIcon(cut_xpm), tr("Cu&t"), this, SLOT(cut())); action->setShortcut(QKeySequence::Cut); action->setToolTip(tr("Cut to clipboard")); action->setEnabled(hasSelectedText()); action = popup->addAction(QIcon(copy_xpm), tr("&Copy"), this, SLOT(copy())); action->setShortcut(QKeySequence::Copy); action->setToolTip(tr("Copy to clipboard")); action->setEnabled(hasSelectedText()); action = popup->addAction(QIcon(paste_xpm), tr("&Paste"), this, SLOT(paste())); action->setShortcut(QKeySequence::Paste); action->setToolTip(tr("Paste from clipboard")); action->setEnabled(!QApplication::clipboard()->text( QClipboard::Clipboard).isEmpty()); action = popup->addAction(tr("Clear"), this, SLOT(clear())); action->setToolTip(tr("Clear editor")); action->setEnabled(!isEmptyDocument); popup->addSeparator(); } action = popup->addAction(tr("Select &All"), this, SLOT(selectAll())); action->setShortcut(QKeySequence::SelectAll); action->setEnabled(!isEmptyDocument); return popup; } tora-2.1.3/src/totimer.h0000644000175000017500000000142311270353625014677 0ustar michaelmichael// // C++ Interface: toTimer // // Description: // A timer descendant which also keep track of the last timer setting sent to it. // // Copyright: See COPYING file that comes with this distribution // #ifndef TOTIMER_H #define TOTIMER_H #include class toTimer : public QTimer { int LastTimer; public: /** Create timer. * @param parent Parent object of timer. * @param name Name of timer. */ toTimer(QObject *parent = 0, const char * name = 0); /** Start timer. * @param msec Milliseconds to timeout. * @param sshot Set to true if only timeout once. */ int start(int msec, bool sshot = false); /** Get last timer start timeout. * @return Last timeout in millisecond. */ int lastTimer(void); }; #endif tora-2.1.3/src/utils.h0000644000175000017500000004247311402776023014364 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef UTILS_H #define UTILS_H #include "config.h" #include #include #include #include #include #include #include #include #define TOPrinter QPrinter #define TOFileDialog QFileDialog #define TOMessageBox QMessageBox #define TODock QWidget class QComboBox; class toTreeWidget; class toTreeWidgetItem; class QToolBar; class QWidget; class toConnection; class toMain; class toQValue; class toTimer; class toToolWidget; /** Display a message in the statusbar of the main window. * @param str Message to display * @param save If true don't remove the message after a specified interval. * @param log Log message. Will never log saved messages. */ void toStatusMessage(const QString &str, bool save = false, bool log = true); /** Get an address to a SQL statement in the SGA. The address has the form * 'address:hash_value' which are resolved from the v$sqltext_with_newlines * view in Oracle. * @param conn Connection to get address from * @param sql Statement to get address for. * @return String with address in. * @exception QString if address not found. */ QString toSQLToAddress(toConnection &conn, const QString &sql); /** Get the full SQL of an address (See @ref toSQLToAddress) from the * SGA. * @param conn Connection to get address from * @param sql Address of SQL. * @return String with SQL of statement. * @exception QString if address not found. */ QString toSQLString(toConnection &conn, const QString &address); /** Make a column name more readable. * @param col Name of column name, will be modified. */ void toReadableColumn(QString &col); /** Get the current database time in the current sessions dateformat. * @param conn Connection to get address from. * @return String with the current date and time. */ QString toNow(toConnection &conn); /** Set the current session type (Style) * @param str Session to set, can be any of Motif, Motif Plus, SGI, CDE, Windows and Platinum * @exception QString if style not available. */ void toSetSessionType(const QString &str); /** Get current session type (Style) * @return A string describing the current style. * @see toSetSessionType */ QString toGetSessionType(void); /** Get the available styles. */ QStringList toGetSessionTypes(void); /** Create or fill a combobox with refresh intervals. * @param parent Parent of created combobox. * @param name Name of created combobox. * @param def Default value of the combobox. * @param item Combo box to fill. If not specified a new combobox is created. */ QComboBox *toRefreshCreate(QWidget *parent, const char *name = NULL, const QString & def = QString::null, QComboBox * item = NULL); /** Set a timer with the value from a refresh combobox (See @ref toRefreshCreate). * @param timer Timer to set timeout in. * @param str String from currentText of combobox. If empty, set to default. */ void toRefreshParse(toTimer *timer, const QString &str = QString::null); /** Get information about wether this TOra has plugin support or not. * @return True if plugin support is enabled. */ bool toMonolithic(void); /** Make a deep copy of a string. Usefull when sharing copying strings between threads. * @param str String to copy * @return Copied string. */ QString toDeepCopy(const QString &str); /** Allocate a toolbar. This is needed since Qt and KDE use different toolbars. * @param parent Parent of toolbar. * @param name Name of toolbar. * @return A newly created toolbar. */ QToolBar *toAllocBar(QWidget *parent, const QString &name); /** Allocate a new docked window. This is needed since Qt and KDE docks windows differently * (Qt 2.x doesn't even have support for docked windows). Observe that you must attach a * dock using @ref toAttachDock after allocating it. * @param name Name of window. * @param db Database name or empty if N/A. * @param icon Icon of new dock. * @return A newly allocated fock. */ TODock *toAllocDock(const QString &name, const QString &db, const QPixmap &icon); /** Attach a dock to a specified position. * @param dock Dock to attach * @param container Whatever container is supposed to be in the dock window. * @param place Where to place the dock. */ void toAttachDock(TODock *, QWidget *, Qt::DockWidgetArea); /** Decode a size string this basically converts "KB" to 1024, "MB" to 1024KB and * everything else to 1. * @return Multiplier specified by string. */ int toSizeDecode(const QString &str); /** * Check that a key sequence is valid and return same sequence */ QKeySequence toKeySequence(const QString &keysequence); /** * Check if a key sequence and a key event represent the same key and return if that is the case. * Only support single key keysequences. * @param event Key event. * @param key Key sequence. */ bool toCheckKeyEvent(QKeyEvent *event, const QKeySequence &key); /** Shift the first value out of a list. * @param lst List to shift value from (Also modified). * @return The first value in the list. */ template T toShift(std::list &lst) { if (lst.begin() == lst.end()) { T ret; return ret; } T ret = (*lst.begin()); lst.erase(lst.begin()); return ret; } /** Push an object to the beginning of a list. * @param lst List to push value in from of. * @param str Object to push. */ template void toUnShift(std::list &lst, const T &str) { lst.insert(lst.begin(), str); } /** Pop the last value out of a list. * @param lst List to pop value from (Also modified). * @return The value in the list of objects. */ template T toPop(std::list &lst) { if (lst.begin() == lst.end()) { T ret; return ret; } T ret = (*lst.rbegin()); lst.pop_back(); return ret; } /** Push an object to the end of a list. * @param lst List to push value in from of. * @param str Object to push. */ template void toPush(std::list &lst, const T &str) { lst.push_back(str); } /** Convert a string representation to a font structure. * @param str String representing the font. * @return Font structure represented by the string. * @see toFontToString */ QFont toStringToFont(const QString &str); /** Convert a font to a string representation. * @param fnt Font to convert. * @return String representation of font. */ QString toFontToString(const QFont &fnt); /** Get the path to the help directory. * @return Path to the help directory. */ // QString toHelpPath(void); /** Read file from filename and return it as binary data (no decoding). * @param filename Filename to read file from. * @return Contents of file. * @exception QString describing I/O problem. */ QByteArray toReadFileB(const QString &filename); /** Read file from filename and decode it according to current locale settings. * @param filename Filename to read file from. * @return Contents of file. * @exception QString describing I/O problem. */ QString toReadFile(const QString &filename); /** Write file to filename. (binary data, no encoding is performed) * @param filename Filename to write file to. * @param data Data to write to file. */ bool toWriteFile(const QString &filename, const QByteArray &data); /** Write file to filename, encoded according to current locale settings. * @param filename Filename to write file to. * @param data Data to write to file. */ bool toWriteFile(const QString &filename, const QString &data); /** Compare two string lists. * @param l1 First list to compare. * @param l2 Second list to compare. * @param len Length of lists to compare. * @return True if all first len elements match. */ bool toCompareLists(QStringList &l1, QStringList &l2, int len); /** Set environment variable. * @param var Variable name to set. * @param val Value to set variable to. */ void toSetEnv(const QString &var, const QString &val); /** Delete an environment variable. * @param var Environment variable to delete. */ void toUnSetEnv(const QString &var); /** Pop up a dialog and choose a file to open. * @param filename Default filename to open. * @param filter Filter of filenames (See @ref QFileDialog) * @param parent Parent of dialog. * @return Selected filename. */ QString toOpenFilename(const QString &filename, const QString &filter, QWidget *parent); /** Pop up a dialog and choose a file to save to. * @param filename Default filename to open. * @param filter Filter of filenames (See @ref QFileDialog) * @param parent Parent of dialog. * @return Selected filename. */ QString toSaveFilename(const QString &filename, const QString &filter, QWidget *parent); /** Check if a character is valid for an identifier in Oracle. * @param c Character to check * @return True if it is a valid Oracle identifier. */ inline bool toIsIdent(QChar c) { return c.isLetterOrNumber() || c == '_' || c == '%' || c == '$' || c == '#'; } /** Get installation directory of application (Plugin directory on unix, installation * target on windows). * @return String containing directory */ // QString toPluginPath(void); /** Get a brush for a chart item. * @param index Indicating which chart item to get color for. */ QBrush toChartBrush(int index); /** Return the connection most closely associated with a widget. Currently connections are * only stored in toToolWidgets. * @return Reference toConnection object closest to the current. */ toConnection &toCurrentConnection(QObject *widget); /** Return the tool widget most closely associated with a widget. * @return Pointer to tool widget. */ toToolWidget *toCurrentTool(QObject *widget); /** Check if this connection is an oracle connection. */ bool toIsOracle(const toConnection &); /** Check if this connection is an sapdb connection. */ bool toIsSapDB(const toConnection &); /** Check if this connection is an MySQL connection. */ bool toIsMySQL(const toConnection &); /** Check if this connection is an PostgreSQL connection. */ bool toIsPostgreSQL(const toConnection &); /** Check if this connection is a Teradata connection. */ bool toIsTeradata(const toConnection &); /** Strip extra bind specifier from an SQL statement. (That means the extra <***> part after * the bind variable. * @param sql The sql to strip. * @return Return a string containing the same statement without qualifiers, which means the * sql sent to Oracle and available in the SGA. */ QString toSQLStripSpecifier(const QString &sql); /** Strip extra binds and replace with empty strings. * @param sql The sql to strip. * @return Return a string containing the same statement without binds. */ QString toSQLStripBind(const QString &sql); /** Expand filename with $HOME to be replaced with home directory or my documents. */ QString toExpandFile(const QString &file); /** Convert string read by readValue to value read by readValueNull */ toQValue toUnnull(const toQValue &str); /** Convert string read by readValueNull to value to be read by readValue. */ toQValue toNull(const toQValue &str); /** Take a string and make it illegible. Some security through obscurity here so you will * need to check the source to see what is actually done. * @param str String to be made unreadable. * @return Obfuscated string. */ QString toObfuscate(const QString &str); /** Unmake the actions of @ref toObfuscate. * @param Obfuscated string. * @return Original string. */ QString toUnobfuscate(const QString &str); /** Check if the current widget is within the active modal widget (Or no modal widget exists) */ bool toCheckModal(QWidget *widget); /** Export the contents of a map into another map. * @param data The destination map. * @param prefix Prefix to save map using. * @param src The map to save. */ void toMapExport(std::map &data, const QString &prefix, std::map &src); /** Import the contents of a map from another map. * @param data The source map. * @param prefix Prefix to use for restoring from map. * @param dst The map to save into. */ void toMapImport(std::map &data, const QString &prefix, std::map &dst); /** Find an item in a listview. * @param list The list to search for the item. * @param str The string to search for. You can specify parent/child with : in the string. */ toTreeWidgetItem *toFindItem(toTreeWidget *list, const QString &str); /** Whenever this class is instantiated the window will display a busy cursor. You * can instantiate this function as many times as you want, only when all of them are * destructed the curser will revert back to normal. * If you want to control if busy cursor is actually shown for a particular case, you * can use a boolean parameter in constructor. For example debugger is setting this as * false in order for cursor NOT to be busy until program unit being debugged finishes. */ class toBusy { private: bool Busy; public: toBusy(bool busy = true); ~toBusy(); }; /** * Set or change title of a tool window. * @param tool Widget of tool. * @param caption Caption to set to the tool. */ void toToolCaption(toToolWidget *tool, const QString &caption); /** * Translate string if the context and text is strictly ASCII7 and the context doesn't * contain any spaces. Otherwise just return the text. * @param context The context of the text. * @param text The text to translate. * @return Translated text if appropriate, or original text otherwise. */ QString toTranslateMayby(const QString &context, const QString &text); /** * Count occurrences of char in source. * * @param source The string to search. * @param find The char to find in string * @return Occurrences. */ int countChars(const QString &source, const char find); /** * Get extensions for file save dialog from editor configuration * * @return Extensions. */ QString GetExtensions(void); QPixmap connectionColorPixmap(const QString & name); /** Popup toolbutton that works like I think they should under Qt 3.0 as well. * this means they will pop up a tool menu when you click on the button as well. */ class toPopupButton : public QToolButton { Q_OBJECT public: /** Create button, same constructor as toolbutton except no slots */ toPopupButton(const QIcon &iconSet, const QString &textLabel, const QString &grouptext, QToolBar *parent, const char *name = 0); /** Create button somewhere else than in a toolbar. */ toPopupButton(QWidget *parent, const char *name = 0); }; /** * functor for cleanup containers of pointers */ struct DeleteObject { template void operator()(const T* ptr) const { delete ptr; } }; /* This can't be documented in KDoc, anyway it is an easy way to catch any exception that * might be sent by TOra or OTL and display the message in the statusbar of the main window. */ #define TOCATCH \ catch (const QString &str) { \ toStatusMessage(str); \ } /* This can't be documented in KDoc, anyway it is an easy way to catch any exception that * might be sent by TOra or OTL and display the message in the statusbar of the main window. */ #define TOROLLBACK(x) \ catch (const QString &str) { \ toStatusMessage(str); \ try { \ x.rollback(); \ } catch(...) { } \ } /** * std::min name collisions on windows/cygwin * */ #define TO_MIN qMin #define QTRANS(x,y) (qApp?qApp->translate(x,y):QString::fromLatin1(y)) /** * simple class to provide an empty widget that will resize horizontally */ class toSpacer : public QWidget { Q_OBJECT; public: toSpacer(QWidget *parent = NULL); ~toSpacer(void) { } }; #endif tora-2.1.3/src/tobrowsersequencewidget.h0000644000175000017500000000444611270353625020207 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBROWSERSEQUENCEWIDGET_H #define TOBROWSERSEQUENCEWIDGET_H #include "tobrowserbasewidget.h" class toResultItem; class toResultGrants; class toResultExtract; /*! \brief Sequence browser for toBrowser tool. See toBrowserBaseWidget for more info. \author Petr Vanek */ class toBrowserSequenceWidget : public toBrowserBaseWidget { Q_OBJECT toResultItem *resultInfo; toResultGrants *grantsView; toResultExtract *extractView; public: toBrowserSequenceWidget(QWidget * parent); virtual void changeConnection(); }; #endif tora-2.1.3/src/tochangeconnection.cpp0000644000175000017500000001065311270353625017424 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "tochangeconnection.h" #include "toconnection.h" #include "tomain.h" #include "totool.h" #include #include #include #include #include "icons/changeconnect.xpm" toChangeConnection::toChangeConnection(QToolBar *parent, const char *name) : toPopupButton(QPixmap(const_cast(changeconnect_xpm)), tr("Change the connection of the tool."), tr("Change the connection of the tool."), parent, name) { setMenu(new QMenu(this)); setPopupMode(QToolButton::MenuButtonPopup); connect(menu(), SIGNAL(aboutToShow()), this, SLOT(popupMenu())); connect(menu(), SIGNAL(triggered(QAction *)), this, SLOT(changeConnection(QAction *))); // addWidget manually or the layout gets weird. parent->addWidget(this); setFocusPolicy(Qt::NoFocus); } void toChangeConnection::popupMenu(void) { try { menu()->clear(); toConnection &conn = toCurrentConnection(this); std::list cons = toMainWidget()->connections(); for (std::list::iterator i = cons.begin(); i != cons.end(); i++) { if (toCurrentTool(this)->canHandle(toMainWidget()->connection(*i))) { QAction *act = menu()->addAction(*i); act->setCheckable(true); if (conn.description() == *i) act->setChecked(true); else act->setChecked(false); } } } TOCATCH; } void toChangeConnection::changeConnection(QAction *act) { // the act of clicking the menu will invert the checked flag if (!act->isChecked()) return; std::list cons = toMainWidget()->connections(); try { for (std::list::iterator i = cons.begin(); i != cons.end(); i++) { if (act->text() == (*i)) { QWidget *cur = parentWidget(); while (cur) { toToolWidget *tool = dynamic_cast(cur); if (tool) { tool->setConnection(toMainWidget()->connection(*i)); toMainWidget()->windowActivated(qobject_cast(tool->parent())); toMainWidget()->changeConnection(); return; } cur = cur->parentWidget(); } throw tr("Couldn't find parent connection. Internal error."); } } } TOCATCH; toStatusMessage("Couldn't find selected connection"); } tora-2.1.3/src/tobrowsersynonymwidget.h0000644000175000017500000000467711270353625020121 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBROWSERSYNONYMWIDGET_H #define TOBROWSERSYNONYMWIDGET_H #include "tobrowserbasewidget.h" class toResultItem; class toResultExtract; class toResultGrants; /*! \brief Synonym browser for toBrowser tool. See toBrowserBaseWidget for more info. \author Petr Vanek */ class toBrowserSynonymWidget : public toBrowserBaseWidget { Q_OBJECT toResultItem *resultInfo; toResultGrants *grantsView; toResultExtract *extractView; public: toBrowserSynonymWidget(QWidget * parent); /*! Reimplemented due names given in the SCHEMA.SYNONYMNAME structure. */ void changeParams(const QString & schema, const QString & object); void changeConnection(); }; #endif tora-2.1.3/src/tobrowserbasewidget.h0000644000175000017500000001246511363356720017313 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBROWSERBASEWIDGET_H #define TOBROWSERBASEWIDGET_H #include #include class toResult; /*! \brief Base class for all toBrowser data viewers. All "browsers" (the tabs with data, columns, scripts etc.) are inherited from QTabWidget. Tab's widgets are TOra objects only inherited from toResult class. This base class provides common handling of the tab-switching and view-updating. The updating is cached - see m_cache. See e.g. toBrowserTableWidget etc. as references. \author Petr Vanek */ class toBrowserBaseWidget : public QTabWidget { Q_OBJECT public: //! \param parent Parent cannot be NULL/0 to handle toSQL correctly! toBrowserBaseWidget(QWidget * parent); /*! \brief Update internal schema and object name. Update data if it's different from previously used schema/object. See updateData(). */ virtual void changeParams(const QString & schema, const QString & object, const QString & type = ""); /*! \brief Change connection for widget. It has to handle visibility of tabs depending on DB features. This method should be reimplemented in all child classes to customize its impact on child's tab members. All reimplementations should call parent's changeConnection() to clear the cache; \warning If you don't call toBrowserBaseWidget::changeConnection(), the m_tabs cleaning, before new addTab() you can get assertions. */ virtual void changeConnection(); //! Returns currently used schema. QString schema() { return m_schema; }; //! Returns type of currently used object. QString type() { return m_type; }; //! Returns currently used object name. QString object() { return m_object; }; /*! \brief Check all editable subwidgets for editation in progress. \retval bool true on "all is save". See toResultData::maybeSave(). */ bool maybeSave(); /*! \brief Add given widget/page as a new tab with label. It adds page into m_tabs structure as well. \param page a toResult and QWidget inherited object. \param label a text label for tab caption. */ virtual void addTab(QWidget * page, const QString & label); private: QString m_schema; QString m_type; QString m_object; /*! Some kind of cache to save some fetching from DB. Content of this map is checked everytime user changes current tab (see tabWidget_currentChanged()). The updateData(), the real updating routine, is called only when there is no index-reference or the m_schema or m_object have been changed from outside. Structure: - QString is the currentTab's widget objectName for QTabWidget access. - QPair's string1 cached schema name - QPair's string2 cached object name */ QMap > m_cache; /*! Keep pages in this map. It's used in updateData() as a quick access shorcut. */ QMap m_tabs; /*! \brief Performs data refresh. Call toResult child its changeParams() if it's really needed. \param ix index of the required tab/widget. See m_tabs. */ void updateData(const QString & ix); protected slots: /*! \brief Handle current tab change. It updates the m_cache cache structure too. It calls updateData() if it's required */ virtual void tabWidget_currentChanged(int ix); }; #endif tora-2.1.3/src/tosqlparse.h0000644000175000017500000003341511353655532015423 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOSQLPARSE_H #define TOSQLPARSE_H #include "config.h" #include #include #include class toConnection; class toMarkedText; class toSyntaxAnalyzer; /** A bunch of functions to parse and indent SQL text. */ class toSQLParse { public: /** Settings for indentation (code formatter) */ struct settings { bool ExpandSpaces; bool CommaBefore; // should comma on lists be placed on start of new line bool BlockOpenLine; bool OperatorSpace; bool KeywordUpper; bool RightSeparator; bool EndBlockNewline; int IndentLevel; int CommentColumn; }; /** Structure the statement is parsed into. */ class statement { /** Subtokens to this token. */ std::list *SubTokens; public: /** Type of this token. */ enum type { /** Start of block. */ Block, /** Start of statement. */ Statement, /** Sub list */ List, /** Parameter of statement. */ Keyword, /** Another token of whatever it is detected in. */ Token, /** End of statement marker */ EndOfStatement, /** Unparsed data */ Raw /** Type of token. */ } Type; /** Indicates type of statement - DDL/DML or PLSQL block This is later used when deciding if trailing semicolon should be removed or not before executing. */ enum statementClass { unknown, ddldml, // DML's, create object statements, environment settings etc. plsqlblock // PLSQL blocks (named and anonymous) } StatementClass; /** Was there a comment attached to this token */ QString Comment; /** The actual token. */ QString String; /** The original line of the token (0 is first line) */ int Line; /** Create statement */ statement(type ntype = Token, const QString &token = QString::null, int cline = -1); /** Allocate subtokens if not available and return reference to subtokens */ std::list &subTokens(); /** Copy constructor */ statement(const statement &); /** Copy operator */ const statement &operator = (const statement &); /** Equality operator. Does not include the line for comparison. */ bool operator == (const statement &) const; /** Non rquality operator. Does not include the line for comparison. */ bool operator != (const statement &stat) const { return !((*this) == stat); } /** Destroy statement */ ~statement(); }; /** Abstract class to define a source of tokens for the parser. */ class tokenizer { private: toSyntaxAnalyzer *Analyzer; protected: int Offset; int Line; public: /** Create a tokenizer. Optionally specify which line and offset to start at. */ tokenizer(int offset = 0, int line = 0) { Line = line; Offset = offset; Analyzer = NULL; } /** Create a tokenizer. Optionally specify which line and offset to start at. */ tokenizer(toSyntaxAnalyzer &analyzer, int offset = 0, int line = 0) { Line = line; Offset = offset; Analyzer = &analyzer; } virtual ~tokenizer() { } /** Get a token from the string. * @param forward Go forward or backwards to get next token. * @param comment Include comments as tokens. */ virtual QString getToken(bool forward = true, bool comment = false) = 0; /** Specify the syntax analyzer to use for the tokanizer * @param analyzer */ virtual void setAnalyzer(toSyntaxAnalyzer &analyzer) { Analyzer = &analyzer; } virtual toSyntaxAnalyzer &analyzer(); /** Get the current line of the tokenizer. A line is defined by a \n character */ virtual int line(void) { return Line; } /** Current offset of the tokenizer (Should point to the character after the last token in the specified direction) */ virtual int offset(void) { return Offset; } /** Set a new offset of tokenzer. */ virtual void setOffset(int offset) { Offset = offset; } /** Set new current line of tokenizer. * This will not affect the current position of the tokenizer. */ virtual void setLine(int line) { Line = line; } /** Get the data remaining after the current position. * @param eol If true end of line, otherwise end of tokenizer. */ virtual QString remaining(bool eol) = 0; }; /** Tokenizer class which gets tokens from a string. */ class stringTokenizer : public tokenizer { QString String; public: stringTokenizer(const QString &str, int offset = 0, int line = 0) : tokenizer(offset, line) { String = str; } stringTokenizer(const QString &str, toSyntaxAnalyzer &analyzer, int offset = 0, int line = 0) : tokenizer(analyzer, offset, line) { String = str; } /** Get a token from the string. * @param forward Go forward or backwards to get next token. * @param comment Include comments as tokens. */ virtual QString getToken(bool forward = true, bool comment = false); /** Get the data remaining after the current position. * @param eol If true end of line, otherwise end of tokenizer. */ virtual QString remaining(bool eol); }; /** Tokenizer class which gets tokens from an editor. */ class editorTokenizer : public tokenizer { toMarkedText *Editor; public: /** Create a tokenizer which takes its input from an editor. * @param editor The editor to read from. Observe that if this * is a syntax highlighted editor the syntax analyzer is used * that is used for the editor. */ editorTokenizer(toMarkedText *editor, int offset = 0, int line = 0); /** Get a token from the string. * @param forward Go forward or backwards to get next token. * @param comment Include comments as tokens. */ virtual QString getToken(bool forward = true, bool comment = false); /** Get the data remaining after the current position. * @param eol If true end of line, otherwise end of tokenizer. */ virtual QString remaining(bool eol); }; /** Parse a string. * @param tokens Tokenizer provider to generate parsed tree from. * @return Parsed statement tree. */ static std::list parse(tokenizer &tokens); /** Parse a string. * @param str String to parse. * @return Parsed statement tree. */ static std::list parse(const QString &str) { stringTokenizer tokens(str); return parse(tokens); } /** Parse a string. * @param str String to parse. * @param conn Connection to determine SQL dialect. (For future use) * @return Parsed statement tree. */ static std::list parse(const QString &str, toConnection &conn); /** Get one statement (or block) from the root of an editor or string. * @param tokens Tokenizer to get tokens from. * @param conn Connection to determine SQL dialog. (For future use) */ static statement parseStatement(tokenizer &tokens); /** Get one statement (or block) from the root of an editor or string. * @param str Tokenizer to get tokens from. * @param conn Connection to determine SQL dialog. (For future use) */ static statement parseStatement(const QString &str) { stringTokenizer tokens(str); return parseStatement(tokens); } /** Get one statement (or block) from the root of an editor or string. * @param tokens Tokenizer to get tokens from. * @param conn Connection to determine SQL dialog. (For future use) */ static statement parseStatement(tokenizer &tokens, toConnection &conn); /** Get one statement (or block) from the root of an editor or string. * @param str Tokenizer to get tokens from. * @param conn Connection to determine SQL dialog. (For future use) */ static statement parseStatement(const QString &str, toConnection &conn) { stringTokenizer tokens(str); return parseStatement(tokens, conn); } /** Indent a string. * @param str String to indent. * @return An indented string. */ static QString indent(const QString &str); /** Indent a parse statement structure into a string. * @param stat Statement to indent. * @param level Initial indentation level to use. * @param syntax The syntax analyzer to use. * @return A string with the indented statement. */ static QString indentStatement(statement &stat, toConnection &conn, int level = 0); /** Indent a parse statement structure into a string. * @param stat Statement to indent. * @param level Initial indentation level to use. * @return A string with the indented statement. */ static QString indentStatement(statement &stat, int level = 0); /** Indent a string. * @param str String to indent. * @param conn Connection to determine SQL dialect. (For future use) * @return An indented string. */ static QString indent(const QString &str, toConnection &conn); /** Create an indentation string. * @param level Number of characters to indent. */ static QString indentString(int level); /** Indent a string. * @param str List of statements * @param conn Connection to determine SQL dialect. (For future use) * @return An indented string. */ static QString indent(std::list &stat, toConnection &conn); /** Indent a string. * @param stat List of statements * @return An indented string. */ static QString indent(std::list &stat); /** Count indentation level of a string. * @param str String to check. * @param chars Position in string. */ static int countIndent(const QString &str, int &chars); /** Indent a string. * @param str String to indent. * @param syntax Syntax analyzer to determine SQL dialect. (For future use) * @return An indented string. */ static QString indent(const QString &str, toSyntaxAnalyzer &syntax); /** Indent a string. * @param stat List of statements * @param syntax Syntax analyzer to determine SQL dialect. (For future use) * @return An indented string. */ static QString indent(std::list &stat, toSyntaxAnalyzer &syntax); private: static settings Settings; static statement parseStatement(tokenizer &tokens, bool declare, bool lst); /** Indent a parse statement structure into a string. * @param stat Statement to indent. * @param level Initial indentation level to use. * @param syntax The syntax analyzer to use. * @return A string with the indented statement. */ static QString indentStatement(statement &stat, int level, toSyntaxAnalyzer &conn); /** * Test if string is a known SQL operator. */ static bool isOperator(QString); public: /** Get current settings. */ static settings getSetting(void) { return Settings; } /** Get current settings. */ static void setSetting(const settings &setting) { Settings = setting; } }; #endif tora-2.1.3/src/tounittest.cpp0000644000175000017500000003466011270353625016002 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #include "tounittest.h" #include "utils.h" #include "tohighlightedtext.h" #include "toworksheetwidget.h" #include "toeventquery.h" #include "toresultcombo.h" #include "toresultschema.h" #include "tochangeconnection.h" #include "tocodemodel.h" #include "icons/unittest.xpm" #include "icons/refresh.xpm" // helper definitons for SQLPackageParams and SQLUnitParams columns #define ARGUMENT_NAME 1 #define DATA_TYPE 2 #define DATA_LENGTH 3 #define IN_OUT 4 #define DATA_LEVEL 5 #define POSITION 6 //#define DEFAULT_VALUE 7 static toSQL SQLPackageParams("toUnitTest:PackageParams", "select distinct argument_name, data_type, data_length,\n" " in_out, data_level, position --, default_value\n" " from all_arguments\n" " where owner = upper(:f1)\n" " and object_name = upper(:f2)\n" " and package_name = upper(:f3)\n" " and data_level = 0\n" " order by position\n", "List PL/SQL package unit parameters.", "0800"); static toSQL SQLUnitParams("toUnitTest:UnitParams", "select distinct argument_name, data_type, data_length,\n" " in_out, data_level, position --, default_value\n" " from all_arguments\n" " where owner = upper(:f1)\n" " and object_name = upper(:f2)\n" " and data_level = 0\n" " order by position\n", "List PL/SQL function or procedure unit parameters.", "0800"); static toSQL SQLListPackage("toUnitTest:ListPackageMethods", "select distinct object_name as \"Package Members\"\n" " from all_arguments\n" " where owner = upper(:f1)\n" " and package_name = upper(:f2)" "order by 1", "List package procedures and functions", "0800"); class toUnitTestTool : public toTool { protected: virtual const char **pictureXPM(void) { return const_cast(unittest_xpm); } public: toUnitTestTool() : toTool(120, "PL/SQL Unit Tester") { } virtual const char *menuItem() { return "PL/SQL Unit Tester"; } virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) { return new toUnitTest(parent, connection); } // virtual QWidget *configurationTab(QWidget *parent) // { // return new toSGATracePrefs(this, parent); // } virtual bool canHandle(toConnection &conn) { return toIsOracle(conn); } virtual void closeWindow(toConnection &connection) {}; }; static toUnitTestTool UnitTestTool; toUnitTest::toUnitTest(QWidget * parent, toConnection &connection) : toToolWidget(UnitTestTool, "unittest.html", parent, connection, "toUnitTest"), m_model(0) { setObjectName("unitTest"); m_owner = connection.user(); QToolBar *toolbar = toAllocBar(this, tr("UTbrowser")); layout()->addWidget(toolbar); QAction *refreshAct = toolbar->addAction(QIcon(QPixmap(const_cast(refresh_xpm))), tr("Refresh list"), this, SLOT(refreshCodeList())); refreshAct->setShortcut(QKeySequence::Refresh); toolbar->addWidget(new toSpacer()); QLabel * labSchema = new QLabel(tr("Schema") + " ", toolbar); toolbar->addWidget(labSchema); Schema = new toResultSchema(connection, toolbar, "UTresultSchema"); try { Schema->refresh(); } catch (...) {} connect(Schema, SIGNAL(activated(const QString &)), this, SLOT(changeSchema(const QString &))); toolbar->addWidget(Schema); new toChangeConnection(toolbar, "UTchangeConnection"); splitter = new QSplitter(this); splitter->setOrientation(Qt::Horizontal); codeSplitter = new QSplitter(this); codeSplitter->setOrientation(Qt::Horizontal); codeList = new QTreeView(splitter); codeModel = new toCodeModel(codeList); codeList->setModel(codeModel); connect(codeList, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(changePackage(const QModelIndex &))); packageList = new toResultTableView(true, false, codeSplitter, "packageList"); packageList->setSQL(SQLListPackage); packageList->setVisible(false); codeSplitter->addWidget(codeList); codeSplitter->addWidget(packageList); worksheet = new toWorksheetWidget(splitter, "UTworksheet", connection); splitter->addWidget(codeSplitter); splitter->addWidget(worksheet); layout()->addWidget(splitter); splitter->setChildrenCollapsible(false); codeSplitter->setChildrenCollapsible(false); codeList->setMinimumWidth(200); packageList->setMinimumWidth(200); QSettings s; s.beginGroup("toUnitTest"); splitter->restoreState(s.value("splitter", QByteArray()).toByteArray()); codeSplitter->restoreState(s.value("codeSplitter", QByteArray()).toByteArray()); s.endGroup(); connect(packageList, SIGNAL(selectionChanged()), this, SLOT(packageList_selectionChanged())); refreshCodeList(); } toUnitTest::~toUnitTest() { QSettings s; s.beginGroup("toUnitTest"); s.setValue("splitter", splitter->saveState()); s.setValue("codeSplitter", codeSplitter->saveState()); s.endGroup(); } bool toUnitTest::canHandle(toConnection &conn) { try { return toIsOracle(conn); } TOCATCH return false; } void toUnitTest::refreshCodeList() { if (!Schema->currentText().isEmpty()) m_owner = Schema->currentText(); else m_owner = connection().user().toUpper(); codeModel->refresh(connection(), m_owner); } void toUnitTest::changeSchema(const QString & name) { m_owner = name; refreshCodeList(); } void toUnitTest::changePackage(const QModelIndex ¤t) { toBusy busy; worksheet->editor()->setText("-- select PL/SQL unit, please."); toCodeModelItem *item = static_cast(current.internalPointer()); if (item && item->parent()) { m_type = item->parent()->display(); if(m_type.isEmpty() || m_type == "Code") return; m_type = m_type.toUpper(); m_name = item->display(); } if (m_type == "PACKAGE") { packageList->setVisible(true); packageList->clearParams(); packageList->changeParams(m_owner, m_name); packageList->setReadAll(true); } else { packageList->setVisible(false); packageList_selectionChanged(); } } void toUnitTest::packageList_selectionChanged() { toQList p; if (m_type == "PACKAGE") { p.push_back(m_owner); p.push_back(packageList->selectedIndex(1).data(Qt::EditRole).toString()); p.push_back(m_name); } else { p.push_back(m_owner); p.push_back(m_name); } worksheet->editor()->setText("-- getting the script..."); try { toQuery q(worksheet->toToolWidget::connection(), (m_type == "PACKAGE" ? SQLPackageParams : SQLUnitParams), p ); toEventQuery * query = new toEventQuery(worksheet->toToolWidget::connection(), q.sql(), p); if (m_model) { delete m_model; m_model = 0; } m_model = new toResultModel(query, this); m_model->readAll(); connect(m_model, SIGNAL(done()), this, SLOT(handleDone())); } TOCATCH } void toUnitTest::handleDone() { QString returnClause; QStringList res; m_model->readAll(); res.append("DECLARE\n"); // params declarations for (int i = 0; i < m_model->rowCount(); ++i) { // res.append("\n"); // res.append(QString("-- %1").arg(i) + QString(" arg ") + m_model->data(i, ARGUMENT_NAME).toString()); // res.append(QString("-- %1").arg(i) + QString(" lev ") + m_model->data(i, DATA_LEVEL).toString()); // res.append(QString("-- %1").arg(i) + QString(" pos ") + m_model->data(i, POSITION).toString()); // res.append(QString("-- %1").arg(i) + QString(" typ ") + m_model->data(i, DATA_TYPE).toString()); // res.append(QString("-- %1").arg(i) + QString(" len ") + m_model->data(i, DATA_LENGTH).toString()); // res.append(QString("-- %1").arg(i) + QString(" i/o ") + m_model->data(i, IN_OUT).toString()); QString t("\t%1 %2(%3); -- %4"); if (m_model->data(i, ARGUMENT_NAME).isNull() && m_model->data(i, DATA_LEVEL).toInt() == 0 && m_model->data(i, POSITION).toInt() == 0) { returnClause = t.arg("ret ") .arg(m_model->data(i, DATA_TYPE).toString().replace("PL/SQL", "")) .arg(m_model->data(i, DATA_LENGTH).toString()) .arg("function return value").replace("()", "(22)"); continue; } if (m_model->data(i, ARGUMENT_NAME).isNull() && m_model->data(i, DATA_LEVEL).toInt() == 0 && m_model->data(i, POSITION).toInt() != 0) { // res.append("-- DEBUG " + m_model->data(i, POSITION).toString() + " skipped"); continue; } QString item(t.arg(m_model->data(i, ARGUMENT_NAME).toString()) .arg(m_model->data(i, DATA_TYPE).toString().replace("PL/SQL", "")) .arg(m_model->data(i, DATA_LENGTH).toString()) .arg(m_model->data(i, IN_OUT).toString())); // 1) fixed-length chars should be handled from all_arguments // 2) all other "numeric" and/or pl/sql types should use () // or length from all_arguments if (m_model->data(i, DATA_TYPE) == "VARCHAR2" || m_model->data(i, DATA_TYPE) == "VARCHAR" || m_model->data(i, DATA_TYPE) == "NVARCHAR2") { res.append(item.replace("()", "(3000)") + "; 3000 is the dummy size for testing"); } else res.append(item.replace("()", "")); } if (!returnClause.isNull()) res.append(returnClause); if (res.count() == 1) res.clear(); res.append("\nBEGIN\n"); // inputs for (int i = 0; i < m_model->rowCount(); ++i) { QString t("\t%1 := %2; -- %3"); QString def("NULL"); if (m_model->data(i, ARGUMENT_NAME).isNull()) continue; /* if (!m_model->data(i, DEFAULT_VALUE).isNull()) def = m_model->data(i, DEFAULT_VALUE).toString();*/ // skip OUT params if (m_model->data(i, IN_OUT).toString().startsWith("IN")) { res.append(t.arg(m_model->data(i, ARGUMENT_NAME).toString()) .arg(def) .arg(m_model->data(i, DATA_TYPE).toString())); } } if (!returnClause.isNull()) res.append("\n\tret :="); else res.append("\n"); if (m_type == "PACKAGE") res.append("\t" + m_owner + "." + m_name + "." + packageList->currentIndex().data(Qt::EditRole).toString()); else res.append("\t" + m_owner + "." + m_name); res.append("\t\t("); // params for (int i = 0; i < m_model->rowCount(); ++i) { QString t("\t\t%1 => %2%3"); if (m_model->data(i, ARGUMENT_NAME).isNull()) continue; res.append(t.arg(m_model->data(i, ARGUMENT_NAME).toString()) .arg(m_model->data(i, ARGUMENT_NAME).toString()) .arg((i+1)==m_model->rowCount()? "" : ",")); } res.append("\t\t);\n"); // outputs for (int i = 0; i < m_model->rowCount(); ++i) { QString t("\tsys.dbms_output.put_line('%1 => ' || %2);"); if (m_model->data(i, ARGUMENT_NAME).isNull()) continue; res.append(t.arg(m_model->data(i, ARGUMENT_NAME).toString()) .arg(m_model->data(i, ARGUMENT_NAME).toString())); } if (!returnClause.isNull()) { res.append("\tsys.dbms_output.put_line('ret => ' || ret);"); } res.append("\nEND;\n"); worksheet->editor()->setText(res.join("\n").replace("\t", " ")); } tora-2.1.3/src/totemplateaddfileui.ui0000644000175000017500000001122111270353625017424 0ustar michaelmichael toTemplateAddFileUI 0 0 438 164 Add template file 11 11 11 11 6 6 &Browse Cancel &Ok true &File false Root &Root false Root Qt::Horizontal QSizePolicy::Expanding 20 20 Root Filename Browse OkButton PushButton2_2 OkButton clicked() toTemplateAddFileUI accept() 20 20 20 20 PushButton2_2 clicked() toTemplateAddFileUI reject() 20 20 20 20 Browse clicked() toTemplateAddFileUI browse() 20 20 20 20 Root textChanged(QString) toTemplateAddFileUI valid() 20 20 20 20 Filename textChanged(QString) toTemplateAddFileUI valid() 20 20 20 20 tora-2.1.3/src/toresultfield.h0000644000175000017500000001075011363356720016106 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTFIELD_H #define TORESULTFIELD_H #include "config.h" #include "tobackground.h" #include "tohighlightedtext.h" #include "toresult.h" class toNoBlockQuery; class toSQL; /** This widget displays the result of a query where each item in the stream * is added as a line in a text editer. */ class toResultField : public toHighlightedText, public toResult { Q_OBJECT QString Unapplied; toNoBlockQuery *Query; toBackground Poll; int whichResultField; // Shows which field from result should be used (for MySQL only), used for calls to "show create ..." public: void setWhichResultField(int i) { whichResultField = i; } /** Create the widget. * @param parent Parent widget. * @param name Name of widget. */ toResultField(QWidget *parent, const char *name = NULL); /** Destruct object */ ~toResultField(); /** Reimplemented for internal reasons. */ virtual void query(const QString &sql, const toQList ¶m); /** Handle any connection by default */ virtual bool canHandle(toConnection &) { return true; } // Why are these needed? #if 1 /** Set the SQL statement of this list * @param sql String containing statement. */ void setSQL(const QString &sql) { toResult::setSQL(sql); } /** Set the SQL statement of this list. This will also affect @ref Name. * @param sql SQL containing statement. */ void setSQL(const toSQL &sql) { toResult::setSQL(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const QString &sql) { toResult::query(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql) { toResult::query(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql, toQList &par) { toResult::query(sql, par); } #endif public slots: /** Reimplemented for internal reasons. */ virtual void refresh(void) { toResult::refresh(); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1) { toResult::changeParams(Param1); } /** Reimplemented For internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2) { toResult::changeParams(Param1, Param2); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3) { toResult::changeParams(Param1, Param2, Param3); } private slots: void poll(void); }; #endif tora-2.1.3/src/connectioncolorsdialogui.ui0000644000175000017500000000622611332067047020506 0ustar michaelmichael ConnectionColorsDialog 0 0 400 300 Connection Colors Add new color identifier + Delete currently selected color - Qt::Horizontal 324 20 true false false true true Color Description Value Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() ConnectionColorsDialog accept() 248 254 157 274 buttonBox rejected() ConnectionColorsDialog reject() 316 260 286 274 tora-2.1.3/src/toteradataconnection.cpp0000644000175000017500000016073111445353612017767 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ /* * Some parts: COPYRIGHT AND LICENSE This module is placed in the public domain. It can be freely copied and redistributed under the same terms as Perl itself. Copyright © 2005 Geoffrey Rommel * */ #ifdef Q_OS_WIN32 # include "windows/cregistry.h" #include #endif #include "toconf.h" #include "toconfiguration.h" #include "toconnection.h" #include "tomain.h" #include "tosql.h" #include "totool.h" #include "todefaultkeywords.h" #include "utils.h" #include #include #include #include #include #include // teradata defines #undef VERSION extern "C" { #include /* Teradata include files */ #include #include #include #include } // from http://cpansearch.perl.org/src/GROMMEL/Teradata-SQL-0.09/tdsql.c /* coptypes really should have this typedef, but it doesn't. WGR, 2008-03-19. */ typedef signed char ByteInt; /* Data types */ #define BIGINT_NN 600 #define BIGINT_N 601 #define BLOB 400 #define BLOB_DEFERRED 404 #define BLOB_LOCATOR 408 #define BYTEINT_NN 756 #define BYTEINT_N 757 #define BYTE_NN 692 #define BYTE_N 693 /* CHAR, TIME, and TIMESTAMP are the same */ #define CHAR_NN 452 #define CHAR_N 453 #define CLOB 416 #define CLOB_DEFERRED 420 #define CLOB_LOCATOR 424 #define DATE_NN 752 #define DATE_N 753 #define DECIMAL_NN 484 #define DECIMAL_N 485 #define FLOAT_NN 480 #define FLOAT_N 481 #define GRAPHIC_NN 468 #define GRAPHIC_N 469 #define INTEGER_NN 496 #define INTEGER_N 497 #define LONG_VARBYTE_NN 696 #define LONG_VARBYTE_N 697 #define LONG_VARCHAR_NN 456 #define LONG_VARCHAR_N 457 #define LONG_VARGRAPHIC_NN 472 #define LONG_VARGRAPHIC_N 473 #define SMALLINT_NN 500 #define SMALLINT_N 501 #define VARBYTE_NN 688 #define VARBYTE_N 689 #define VARCHAR_NN 448 #define VARCHAR_N 449 #define VARGRAPHIC_NN 464 #define VARGRAPHIC_N 465 /* Maximum number of fields per request */ #define MAX_FIELDS 520 /* Maximum length of returned data */ #define MAX_RDA_LEN 65400 typedef struct { UInt16 FieldCount; UInt16 Datatype; UInt16 Length; } DATAINFO; /* The following is the entire structure needed for the IRQ extension (passing values to parameterized SQL). We use two parcels: DataInfo and IndicData. Header: IRX8. Level: 1. Element Type: 0 (pointers). */ struct irq_ext { struct D8CAIRX irqx_header; struct D8XIELEM irqx_DataInfo_elem; struct D8XIEP irqx_DataInfo_body; struct D8XIELEM irqx_IndicData_elem; struct D8XIEP irqx_IndicData_body; }; static double powers10[19] = { 1.0, 10.0, 100.0, 1000.0, 10000.0, 1.0E5, 1.0E6, 1.0E7, 1.0E8, 1.0E9, 1.0E10, 1.0E11, 1.0E12, 1.0E13, 1.0E14, 1.0E15, 1.0E16, 1.0E17, 1.0E18 }; static toSQL SQLListDatabases( "toTeradataConnection:ListDatabases", "SELECT DISTINCT ( trim ( db.databasename ) )\n" " FROM dbc.AccessRights ar,\n" " dbc.dbase db\n" " WHERE ar.userid IN ( SELECT userid\n" " FROM dbc.sessiontbl\n" " WHERE sessionno = SESSION )\n" " AND ar.databaseid = db.databaseid", "List all databases with access rights (used for object cache)", "", "Teradata"); static toSQL SQLListTablesDatabases( "toTeradataConnection:ListTablesDatabase", "SELECT trim ( tablename ),\n" " commentstring\n" " FROM dbc.tables\n" " WHERE trim ( databasename ) = trim ( :f1 )", "List tables for a database (used for the object cache)", "", "Teradata"); static toSQL SQLListColumns( "toTeradataConnection:ListColumns", "SELECT trim ( columnname ),\n" " columntype,\n" " commentstring\n" " FROM dbc.columns\n" " WHERE trim ( databasename ) = trim ( :f1 )\n" " AND trim ( tablename ) = trim ( :f2 )", "List columns for a table (used for the object cache)", "", "Teradata"); /*-------------------------------------------------------------------- * Insert a decimal point into a "decimal" field. *------------------------------------------------------------------*/ void _insert_dp (char *target, char *source, int ndec) { int i, j, workstart; char work[25]; if (ndec <= 0) { strcpy(target, source); return; } work[24] = '\0'; /* End of string */ /* Build the string in the work area from right to left. */ i = strlen(source) - 1; for (j = 23; j > 23 - ndec; j--) { if (i < 0 || source[i] == '-' ) { work[j] = '0'; continue; } /* Otherwise, it should be a digit. */ work[j] = source[i]; i--; } work[j] = '.'; j--; for (; j >= 0; j--) { if (i < 0) { workstart = j+1; break; } if ( source[i] == '-' ) { work[j] = '-'; workstart = j; break; } /* Otherwise, it should be a digit. */ work[j] = source[i]; i--; } strcpy(target, work+workstart); return; } /*-------------------------------------------------------------------- ** Convert a decimal field to a double. This works only on ** fields of 9 digits or less. **------------------------------------------------------------------*/ double _dec_to_double (Byte *dec_data, int decp, // precision int decs ) // scale { long wlong; double wdouble; if (decp >= 5) wlong = *((long *) dec_data); else if (decp >= 3) wlong = *((short *) dec_data) + 0; else wlong = *((ByteInt *) dec_data) + 0; /* Precision is less than 3. */ wdouble = (double) wlong; if (decs > 0) wdouble /= powers10[decs]; return wdouble; } /*-------------------------------------------------------------------- ** Convert a decimal field (10 or more digits) to a string. **------------------------------------------------------------------*/ #ifdef _MSC_VER /*---------------------- Microsoft Visual C++ */ void _dec_to_string (char *res_string, Byte *dec_data, int decs ) { __int64 wlonglong; char wstring[24]; wlonglong = *((_int64 *) dec_data); sprintf(wstring, "%I64d", wlonglong); _insert_dp(res_string, wstring, decs); } #else /*---------------------- Others */ void _dec_to_string ( char * res_string, Byte * dec_data, int decs ) { long long int wlonglong; char wstring[24]; wlonglong = *((long long *) dec_data); sprintf(wstring, "%lld", wlonglong); _insert_dp(res_string, wstring, decs); } #endif static QString QueryParam(const QString &in, toQList ¶ms); // private type for describing columns struct _columnDesc { QString name; QString typeName; int tdType; unsigned short dataLen; // decimal only int scale; unsigned short dlb; }; typedef struct _columnDesc columnDesc; /* used for tracking query state across a shared DBCAREA */ class tdRequest { public: unsigned int activityCount; Int32 requestId; Int32 result; // used for creating exceptions, execution QString message; QString sql; QList columns; // if empty you might just need to fetch more QList data; bool eof; struct DBCAREA *dbcp; tdRequest() : activityCount(0), requestId(0), result(0), message(), eof(false), dbcp(0) { dbcp = (DBCAREA *) malloc(sizeof(struct DBCAREA)); if(dbcp == 0) throw QString::fromLatin1("Error allocating memory"); } ~tdRequest() { qDebug() << "delete request" << ((long) this); if(!dbcp) return; free(dbcp); dbcp = 0; } private: tdRequest(const tdRequest &other); }; class toTeradataProvider : public toConnectionProvider { public: class teradataSub : public toConnectionSub { Int32 SessionId; char *Cnta; public: QString Version; teradataSub(toConnection &conn) : SessionId(0) { QString user = conn.user(); QString pass = conn.password(); QString host = conn.host(); int port = 1025; int pos = host.indexOf(QString(":")); if (pos > 0) { host = host.mid(0, pos); port = host.mid(pos + 1).toInt(); if(port < 1) port = 1025; // for some reason this is 0 } // library doesn't work with names, for some reason QString ip = host; QList addresses = QHostInfo::fromName(host).addresses(); if(addresses.isEmpty()) fprintf(stderr, "toTeradataConnection WARNING: no addresses found for hostname\n"); else { if(addresses.length() > 1) fprintf(stderr, "toTeradataConnection WARNING: found multiple addresses, using first\n"); ip = addresses.at(0).toString(); } // build standard TD logon string // [host[:port]]/user[,pass] [charset] [transaction mode] QString logon = QString("%0:%1/%3,%4 UTF-8") .arg(ip) .arg(port) .arg(user) .arg(pass); qDebug() << "logon" << logon; // this must be set for threading to work with cli toSetEnv(QString::fromLatin1("THREADONOFF"), QString::fromLatin1("1")); tdRequest request; request.message = "Login"; initialize(&request); request.dbcp->logon_ptr = logon.toUtf8().data(); // is qstring length equivalent to strlen for utf? request.dbcp->logon_len = strlen(logon.toUtf8().constData()); if(callServer(&request, DBFCON) != 0) throw QString::fromLatin1("Unknown login error."); // login successful, set sessionid SessionId = request.dbcp->o_sess_id; fetchAllParcels(&request); Version = getVersion(&request, ip); } ~teradataSub() { } void close() { try { tdRequest request; request.message = "DISCONNECT"; request.dbcp->extension_pointer = 0; request.dbcp->change_opts = 'Y'; request.dbcp->i_req_id = 0; request.dbcp->o_req_id = 0; request.columns.clear(); request.data.clear(); initialize(&request); callServer(&request, DBFDSC); } catch(...) { qDebug() << "unhandled exception caught in teradataSub::close()"; } } void execute(tdRequest *request, QString sql, toQList ¶ms) { qDebug() << "execute! session: " << SessionId << "request id" << (long) request << request->message; qDebug() << "sql" << sql; // clean up from previous dbcarea uses request->dbcp->extension_pointer = 0; request->dbcp->change_opts = 'Y'; request->dbcp->i_req_id = 0; request->dbcp->o_req_id = 0; request->columns.clear(); request->data.clear(); request->sql = sql; // cli will crash the app if(sql.isEmpty()) return; initialize(request); if(params.size() > 0) { // prepare(request, params); sql = QueryParam(sql, params); } // td barfs on newlines sql = sql.replace('\n', ' '); sql = sql.replace('\r', ' '); sql = sql.trimmed(); qDebug() << "stripped sql" << sql; // set sql statement QByteArray buf = sql.toUtf8(); char *str = buf.data(); request->dbcp->req_ptr = str; request->dbcp->req_len = strlen(str); if(callServer(request, DBFIRQ) != 0) throw QString::fromLatin1("Failed to initiate request"); // fetch up to first column (or until eof) while(fetchParcel(request) && request->data.size() < 1) ; if(request->data.size() < 1) request->eof = true; } virtual void cancel(void) { // todo this is supposed to cancel anything running on // this session but i don't know if cli can. } void abort(tdRequest *request) { // abort a request if(!request->dbcp || request->dbcp->i_req_id == 0) return; try { if(callServer(request, DBFABT) != EM_OK) throw QString::fromLatin1("Error aborting request"); } catch(QString err) { qDebug() << "Expected error in abort" << err; } } void endRequest(tdRequest *request) { if(request->dbcp->i_req_id == 0) return; qDebug() << "End request" << (long) request; if(callServer(request, DBFERQ) != EM_OK) throw QString::fromLatin1("Error in end request"); request->dbcp->i_req_id = 0; } toQValue readValue(tdRequest *request) { if(request->eof) throw QString::fromLatin1("Internal error: exhausted results"); toQValue ret = request->data.takeFirst(); // check eof for next readValue() if(request->data.size() < 1) { if(!fetchParcel(request) || request->data.size() < 1) request->eof = true; } return ret; } private: QString getVersion(tdRequest *request, QString host) { Int32 result; DBCHQEP QEPParms; char release[63]; const char *hostdata = host.toUtf8().data(); memset(&QEPParms, 0, sizeof(QEPParms)); QEPParms.qepLevel = QEPLEVEL; QEPParms.qepItem = QEPIDBR; QEPParms.qepRALen = sizeof(release); QEPParms.qepRArea = &release; #ifdef CLI_64BIT QEPParms.qepTDP = (char *) hostdata; #else QEPParms.qepTDP = (Int32) hostdata; #endif QEPParms.qepTLen = strlen(hostdata); DBCHQE(&result, Cnta, &QEPParms); if(result != EM_OK) { fprintf(stderr, "toTeradataConnection WARNING: getVersion failed\n"); return QString(""); } release[62] = 0; QString ret(release); QStringList split = ret.split(" ", QString::SkipEmptyParts); if(split.size() == 2) ret = split[1].trimmed(); qDebug() << "version" << ret; return ret; } // initialize a new tdRequest (dbcarea) object void initialize(tdRequest *request) { qDebug() << "initialize"; request->dbcp->total_len = sizeof(struct DBCAREA); DBCHINI(&(request->result), Cnta, request->dbcp); checkError(request); request->dbcp->change_opts = 'Y'; request->dbcp->resp_mode = 'I'; /* Field mode */ request->dbcp->use_presence_bits = 'Y'; /* Indicator bits on USING parcels */ request->dbcp->req_proc_opt = 'B'; /* Include Info parcels */ request->dbcp->keep_resp = 'N'; request->dbcp->wait_across_crash = 'N'; request->dbcp->tell_about_crash = 'Y'; request->dbcp->loc_mode = 'Y'; request->dbcp->var_len_req = 'N'; request->dbcp->var_len_fetch = 'N'; request->dbcp->save_resp_buf = 'N'; request->dbcp->two_resp_bufs = 'N'; request->dbcp->ret_time = 'N'; request->dbcp->parcel_mode = 'Y'; request->dbcp->wait_for_resp = 'Y'; request->dbcp->maximum_parcel = 'H'; /* Allow large parcels */ request->dbcp->req_buf_len = 65536; request->dbcp->resp_buf_len = 65473; request->dbcp->max_decimal_returned = 18; request->dbcp->token = 0; request->dbcp->req_ptr = 0; request->dbcp->req_len = 0; request->dbcp->i_sess_id = SessionId; } void checkError(tdRequest *request) { if(request->result == EM_OK || request->result == REQEXHAUST) return; if(request->dbcp->msg_len > 0) { QString err(QByteArray(request->dbcp->msg_text, request->dbcp->msg_len)); qDebug() << "Request failed: " << request->message << err; throw request->message + QString::fromLatin1(" ") + err; } else throw QString::fromLatin1("Request failed: ") + request->message; } Int32 callServer(tdRequest *request, Int32 func) { // set the connection sessionid. see the docs on // multi-threaded cli. it's not super clear, but the // dbcarea struct is not thread safe. every query instance // must have it's own, they just pass the session value. request->dbcp->i_sess_id = SessionId; // set the function we're calling request->dbcp->func = func; Int32 ret = DBCHCL(&(request->result), Cnta, request->dbcp); if(func != DBFDSC) // logoff function checkError(request); return ret; } void fetchRecord(tdRequest *request) { struct CliDataInfoType *data = (struct CliDataInfoType *) request->dbcp->fet_data_ptr; if(!data) return; Byte *indic_ptr = (Byte *) data; Byte indic_mask = 0x80; Byte *data_ptr = ((Byte *) request->dbcp->fet_data_ptr) + ((request->columns.size() + 7) / 8); Q_FOREACH(columnDesc desc, request->columns) { switch (desc.tdType) { case SMALLINT_NN: case SMALLINT_N: if((*indic_ptr & indic_mask) > 0) { // add null value request->data.append(toQValue()); } else { short val = *((short *) data_ptr); request->data.append(val); } data_ptr += 2; break; case VARBYTE_NN: case VARBYTE_N: case LONG_VARBYTE_NN: case LONG_VARBYTE_N: { // var gets a length short short len = *((short *) data_ptr); if((*indic_ptr & indic_mask) > 0) { // add null value request->data.append(toQValue()); } else { char *sptr = (char *) (data_ptr + 2); request->data.append( QString("0x") + QString( QByteArray::fromRawData(sptr, len).toHex())); } data_ptr += len + 2; break; } case VARCHAR_NN: case VARCHAR_N: case VARGRAPHIC_NN: case VARGRAPHIC_N: case LONG_VARCHAR_NN: case LONG_VARCHAR_N: case LONG_VARGRAPHIC_NN: case LONG_VARGRAPHIC_N: { // var gets a length short short len = *((short *) data_ptr); if((*indic_ptr & indic_mask) > 0) { // add null value request->data.append(toQValue()); } else { char *sptr = (char *) (data_ptr + 2); request->data.append( QString::fromUtf8(sptr, len)); } data_ptr += len + 2; break; } case BYTE_NN: case BYTE_N: if((*indic_ptr & indic_mask) > 0) { // add null value request->data.append(toQValue()); } else { char *sptr = (char *) (data_ptr); request->data.append( QString("0x") + QString( QByteArray::fromRawData(sptr, desc.dataLen).toHex())); } data_ptr += desc.dataLen; break; break; case CHAR_NN: case CHAR_N: case GRAPHIC_NN: case GRAPHIC_N: if((*indic_ptr & indic_mask) > 0) { // add null value request->data.append(toQValue()); } else { char *sptr = (char *) (data_ptr); request->data.append( QString::fromUtf8(sptr, desc.dataLen)); } data_ptr += desc.dataLen; break; case DATE_NN: case DATE_N: case INTEGER_NN: case INTEGER_N: if((*indic_ptr & indic_mask) > 0) { // add null value request->data.append(toQValue()); } else { int val = *((int *) data_ptr) + 0; request->data.append((int) val); } data_ptr += 4; break; case DECIMAL_NN: case DECIMAL_N: if((*indic_ptr & indic_mask) > 0) { // add null value request->data.append(toQValue()); data_ptr += desc.dlb; } else if(desc.dataLen <= 9) { double wdouble = _dec_to_double(data_ptr, desc.dataLen, desc.scale); request->data.append(toQValue(wdouble)); data_ptr += desc.dlb; } else if(desc.dataLen <= 18) { char wstring[24]; _dec_to_string(wstring, data_ptr, desc.scale); int slen = strlen(wstring); wstring[slen] = 0; request->data.append(toQValue(wstring)); data_ptr += 8; } else { fprintf(stderr, "Warning: decimal value is too large.\n"); request->data.append(toQValue(0.0)); data_ptr += 16; } break; case BIGINT_NN: case BIGINT_N: if((*indic_ptr & indic_mask) > 0) { // add null value request->data.append(toQValue()); } else { long val = *((long *) data_ptr) + 0; request->data.append((qlonglong) val); } data_ptr += 8; break; case BYTEINT_NN: case BYTEINT_N: if((*indic_ptr & indic_mask) > 0) { // add null value request->data.append(toQValue()); } else { ByteInt val = *((ByteInt *) data_ptr) + 0; request->data.append(val); } data_ptr++; break; case FLOAT_NN: case FLOAT_N: if((*indic_ptr & indic_mask) > 0) { // add null value request->data.append(toQValue()); } else { double val = *((double *) data_ptr) + 0; request->data.append(val); } data_ptr += 8; break; case BLOB: // shouldn't happen, anyhow case BLOB_DEFERRED: case BLOB_LOCATOR: case CLOB: case CLOB_DEFERRED: case CLOB_LOCATOR: default: fprintf(stderr, "Unsupported type\n"); request->data.append(toQValue()); } /* Point to the next indicator bit. */ if(indic_mask != 0x01) indic_mask >>= 1; else { indic_mask = 0x80; indic_ptr++; } } // all columns } void fetchColumns(tdRequest *request) { char colident[32]; qDebug() << "fetchColumns"; request->columns.clear(); struct CliPrepInfoType *parsel = (struct CliPrepInfoType *) request->dbcp->fet_data_ptr; char *col_byte_ptr = ((char *) request->dbcp->fet_data_ptr) + sizeof(struct CliPrepInfoType); struct CliPrepColInfoType *col_info = (struct CliPrepColInfoType *) col_byte_ptr; // setup request->columns int count = parsel->ColumnCount; qDebug() << "column count" << count; for(int current = 0; current < count; current++) { columnDesc desc; desc.tdType = col_info->DataType; switch (col_info->DataType) { case SMALLINT_NN: case SMALLINT_N: desc.typeName = "SMALLINT"; break; case LONG_VARBYTE_NN: case LONG_VARBYTE_N: case VARBYTE_NN: case VARBYTE_N: desc.dataLen = col_info->DataLen; desc.typeName = QString::fromLatin1("VARBYTE (") + QString::number(col_info->DataLen) + QString::fromLatin1(")"); break; case VARCHAR_NN: case VARCHAR_N: case VARGRAPHIC_NN: case VARGRAPHIC_N: case LONG_VARCHAR_NN: case LONG_VARCHAR_N: case LONG_VARGRAPHIC_NN: case LONG_VARGRAPHIC_N: desc.dataLen = col_info->DataLen; desc.typeName = QString::fromLatin1("VARCHAR (") + QString::number(col_info->DataLen) + QString::fromLatin1(")"); break; case BYTE_NN: case BYTE_N: desc.dataLen = col_info->DataLen; desc.typeName = QString::fromLatin1("BYTE (") + QString::number(col_info->DataLen) + QString::fromLatin1(")"); break; case CHAR_NN: case CHAR_N: case GRAPHIC_NN: case GRAPHIC_N: desc.dataLen = col_info->DataLen; desc.typeName = QString::fromLatin1("CHAR (") + QString::number(col_info->DataLen) + QString::fromLatin1(")"); break; case DATE_NN: case DATE_N: case INTEGER_NN: case INTEGER_N: desc.typeName = "INTEGER"; break; case DECIMAL_NN: case DECIMAL_N: // first byte is len, second byte is scale? desc.dataLen = col_info->DataLen / 256; if (desc.dataLen >= 19) desc.dlb = 16; else if (desc.dataLen >= 10) desc.dlb = 8; else if (desc.dataLen >= 5) desc.dlb = 4; else if (desc.dataLen >= 3) desc.dlb = 2; else desc.dlb = 1; desc.scale = col_info->DataLen % 256; desc.typeName = QString::fromLatin1("DECIMAL (") + QString::number(col_info->DataLen / 256) + QString::fromLatin1(", ") + QString::number(col_info->DataLen % 256) + QString::fromLatin1(")"); break; case BIGINT_NN: case BIGINT_N: desc.typeName = "BIGINT"; break; case BLOB: case BLOB_DEFERRED: case BLOB_LOCATOR: case CLOB: case CLOB_DEFERRED: case CLOB_LOCATOR: desc.typeName = "BLOB"; break; case BYTEINT_NN: case BYTEINT_N: desc.typeName = "BYTEINT"; break; case FLOAT_NN: case FLOAT_N: desc.typeName = "FLOAT"; break; default: desc.typeName = QString::fromLatin1("Unknown (") + QString::number(col_info->DataType) + QString::fromLatin1(")"); } /* Get the name of the column (not the title). */ memcpy(colident, col_info->Name, col_info->NameLen); colident[col_info->NameLen] = '\0'; desc.name = colident; qDebug() << "name: " << desc.name << ", type: " << desc.typeName << ", id: " << desc.tdType; /* Point to the next set of column info. This is a pain. */ col_byte_ptr += 4; col_byte_ptr += *((short *)col_byte_ptr) + 2; /* Name */ col_byte_ptr += *((short *)col_byte_ptr) + 2; /* Format */ col_byte_ptr += *((short *)col_byte_ptr) + 2; /* Title */ col_info = (struct CliPrepColInfoType *) col_byte_ptr; request->columns.append(desc); } } void prepare(tdRequest *request, toQList ¶ms) { // mrj: // doesn't freaking work. i tried everything. i followed // the manual. i did what the perl module did. i thought // to try running the sample from the manual and guess // what, that doesn't work, either. // plus, teradata's site is a ghost town. no docs. few // users. nothing on google. // damn it, teradata connections will have to rely on // tora's option parsing. if you care, complain to // teradata about their crappy documentation. i've got the // express database 13 and the most recent manual i could // find on cliv2 is 04.08.02 from September 2006. // at the time of writing, that's 4 years old. // all attempts at the below are rewarded with: // CLI2: BADELMTYPE(328): DBCAREA extension element must be 1 to 4096. // most documentation referencing this error simply says: // BADELMTYPE(328): DBCAREA extension element must be 1 to 4096. // one place (after much searching) finally mentioned to // check the parcel flavor. i was doing the indicator // mode, ostensibly what was working for the perl guy, but // i switched to the datainfo method used in the // manual. still no joy. // so yeah, no parametrized queries for teradata. #if 0 qDebug() << "prepare"; // see example in: /* Teradata Call-Level Interface Version 2 Reference for Network-Attached Systems Release 04.08.02 B035-2418-096A September 2006 better: http://cpansearch.perl.org/src/GROMMEL/Teradata-SQL-0.09/SQL.xs */ struct irq_ext ExtArea; struct irq_ext *pExtArea; int status = 0; int Elen = 0; /* Set up the Extension area. */ request->dbcp->extension_pointer = &ExtArea; pExtArea = (struct irq_ext *) request->dbcp->extension_pointer; Elen = sizeof(struct irq_ext); memset(pExtArea, 0x00, Elen); memcpy(pExtArea->irqx_header.d8xiId, "IRX8", 4); pExtArea->irqx_header.d8xiSize = Elen; pExtArea->irqx_header.d8xiLvl = 1; /* Store the Perl variables in an IndicData array. */ /* First, reserve the indicator bytes. */ Byte hv_data[MAX_RDA_LEN]; /* "host variables" */ Byte *hvdata_ptr; struct CliDataInfoType hv_datainfo; struct CliDInfoType *hv_datainfo_ptr; int idlen = 0; hvdata_ptr = hv_data; hv_datainfo.FieldCount = params.size(); hv_datainfo_ptr = &(hv_datainfo.InfoVar[0]); // set the argument parcels Q_FOREACH(toQValue qvalue, params) { if(qvalue.isNull()) { hv_datainfo_ptr->SQLType = INTEGER_N; hv_datainfo_ptr->SQLLen = 4; hvdata_ptr = 0; hvdata_ptr += 4; idlen += 4; } else { // todo, uses strings for everything const char *temp = qvalue.toQVariant().toString().toUtf8().constData(); qDebug() << "temp" << temp; qDebug() << qvalue; temp = "asdf"; int slen = strlen(temp); hv_datainfo_ptr->SQLType = CHAR_N; hv_datainfo_ptr->SQLLen = slen; memcpy(hvdata_ptr, temp, slen); hvdata_ptr += slen; idlen += slen; } /* Point to the next DataInfo field. */ hv_datainfo_ptr++; } /* DataInfo parcel */ pExtArea->irqx_DataInfo_elem.d8xieLen = sizeof(D8XIELEM) + sizeof(D8XIEP); /* The manual says that Element Type 0 = Inline and 1 = Pointer, but that seems to be incorrect. We are using pointers and 0. */ pExtArea->irqx_DataInfo_elem.d8xieTyp = 0; /* Pointer method */ pExtArea->irqx_DataInfo_body.d8xiepF = PclDATAINFO; /* Flavor */ pExtArea->irqx_DataInfo_body.d8xiepLn = sizeof(struct CliDataInfoType); pExtArea->irqx_DataInfo_body.d8xiepPt = (char *) &(hv_datainfo); /* IndicData parcel */ pExtArea->irqx_IndicData_elem.d8xieLen = sizeof(D8XIELEM) + sizeof(D8XIEP); pExtArea->irqx_IndicData_elem.d8xieTyp = 0; pExtArea->irqx_IndicData_body.d8xiepF = PclDATA; /* Flavor */ pExtArea->irqx_IndicData_body.d8xiepLn = idlen; pExtArea->irqx_IndicData_body.d8xiepPt = (char *) &(hv_data); // request->dbcp->extension_pointer = &ExtArea; qDebug() << "pointer" << (long) request->dbcp->extension_pointer; qDebug() << "area" << (long) pExtArea; request->dbcp->dbriSeg = 'N'; callServer(request, DBFIRQ); request->dbcp->i_req_id = request->dbcp->o_req_id; fetchAllParcels(request); request->dbcp->i_req_id = 0; #endif } bool fetchParcel(tdRequest *request) { // qDebug() << "fetchParcel"; request->dbcp->i_req_id = request->dbcp->o_req_id; callServer(request, DBFFET); if(request->result == REQEXHAUST) return false; checkError(request); // qDebug() << "parcel flavor" << request->dbcp->fet_parcel_flavor; switch (request->dbcp->fet_parcel_flavor) { case PclFAILURE: /* fallthrough */ case PclERROR: { request->eof = true; struct CliFailureType *err_ptr; err_ptr = (struct CliFailureType *) request->dbcp->fet_data_ptr; if(err_ptr) { QString msg(QByteArray(err_ptr->Msg, err_ptr->Length)); throw QString("Error %0 Info %1 in:\n%2\nError Message: %3\n\n%4") .arg(err_ptr->Code) .arg(err_ptr->Info) .arg(request->message) .arg(msg) .arg(request->sql); } break; } case PclSUCCESS: { struct CliSuccessType *pcl_success_ptr; pcl_success_ptr = (struct CliSuccessType *) request->dbcp->fet_data_ptr; /* Store the ActivityCount in a double. Unfortunately, this is defined as char[4] rather than unsigned int. */ unsigned int active; memcpy(&active, pcl_success_ptr->ActivityCount, 4); request->activityCount = (unsigned int) active; break; } case PclPREPINFO: fetchColumns(request); break; case PclRECORD: fetchRecord(request); break; default: ; } /* end switch */ return true; } /*-------------------------------------------------------------------- * Fetch all parcels after a query *------------------------------------------------------------------*/ void fetchAllParcels(tdRequest *request) { qDebug() << "fetch"; while(fetchParcel(request)) ; } void close(tdRequest *request) { qDebug() << "close"; if(!request->dbcp) return; // should be set during execute // if(!request->dbcp->i_req_id) // the input request id? there's also o_req_id // return; request->dbcp->change_opts = 'N'; // should be set during open // request->dbcp->i_req_id = /*req*/; request->dbcp->func = DBFERQ; request->dbcp->func = DBFERQ; DBCHCL(&(request->result), Cnta, request->dbcp); } }; class teradataQuery : public toQuery::queryImpl { bool Cancel; bool Running; teradataSub *Connection; tdRequest *request; public: teradataQuery(toQuery *query, teradataSub *conn) : toQuery::queryImpl(query), Connection(conn), request(0) { Running = Cancel = false; request = new tdRequest; } virtual ~teradataQuery() { if(request) { Connection->endRequest(request); delete request; request = 0; } } virtual void execute(void) { request->activityCount = 0; request->message = "Execute"; Connection->execute(request, query()->sql(), query()->params()); } virtual toQValue readValue(void) { return Connection->readValue(request); } virtual void cancel(void) { Connection->abort(request); } virtual bool eof(void) { return request->eof; } virtual int rowsProcessed() { return request->activityCount; } virtual int columns() { return request->columns.size(); } virtual std::list describe() { std::list ret; Q_FOREACH(columnDesc desc, request->columns) { toQuery::queryDescribe qd; qd.Name = desc.name; qd.Datatype = desc.typeName; qd.AlignRight = false; ret.push_back(qd); } return ret; } }; class teradataConnection : public toConnection::connectionImpl { teradataSub *teradataConv(toConnectionSub *sub) { teradataSub *conn = dynamic_cast(sub); if (!conn) throw QString::fromLatin1("Internal error, not Teradata sub connection"); return conn; } public: teradataConnection(toConnection *conn) : toConnection::connectionImpl(conn) { } /** Return a string representation to address an object. * * mrj: todo copied from tooracleconnection * * * Checks if identifier has illegal characters, starts with digit, is a reserved * word etc. - if so - returns it enclosed with quotes (otherwise returns the same string). * Note that when identifier name returned from oracle data dictionary is in lowercase * - it MUST be enclosed with quotes (case insensitive "normal" identifiers are always * returned in uppercase). * @param name The name to be quoted. * @param quoteLowercase Enclose in quotes when identifier has lowercase letters. * When processing data returned by dada dictionary quoteLowercase should be true * When processing data entered by user quoteLowercase should be false * @return String addressing table. */ virtual QString quote(const QString &name, const bool quoteLowercase) { bool ok = true; // Identifiers starting with digit should be quoted if (name.at(0).isDigit()) ok = false; else { for (int i = 0; i < name.length(); i++) { if ((name.at(i).toUpper() != name.at(i) && quoteLowercase) || !toIsIdent(name.at(i))) ok = false; } } // Check if given identified is a reserved word int i = 0; while (ok && (DefaultKeywords[i] != NULL)) { if (name.compare(DefaultKeywords[i], Qt::CaseInsensitive) == 0) ok = false; i++; } if (ok) { if (toConfigurationSingle::Instance().objectNamesUpper()) return name.toUpper(); else return name.toLower(); } else return QString::fromLatin1("\"") + name + QString::fromLatin1("\""); } virtual QString unQuote(const QString &str) { if (str.at(0).toLatin1() == '\"' && str.at(str.length() - 1).toLatin1() == '\"') return str.left(str.length() - 1).right(str.length() - 2); return str.toUpper(); } virtual void commit(toConnectionSub *sub) { // todo } virtual void rollback(toConnectionSub *sub) { // todo } virtual toConnectionSub *createConnection(void) { toConnection &conn = connection(); return new teradataSub(conn); } void closeConnection(toConnectionSub *conn) { qDebug() << "close connection"; teradataSub *sub = static_cast(conn); if(sub) sub->close(); delete conn; } virtual QString version(toConnectionSub *sub) { teradataSub *conn = teradataConv(sub); try { QString version = conn->Version; QStringList vl = version.split('.'); QString ve; QString verrj; for(QStringList::iterator vi = vl.begin(); vi != vl.end(); ++vi ) { ve = *vi; verrj += ve.rightJustified(2, '0'); } qDebug() << "returning version verrj" << verrj; return verrj; } catch (...) { // Ignore any errors here } return QString(); } virtual toQuery::queryImpl *createQuery(toQuery *query, toConnectionSub *sub) { return new teradataQuery(query, teradataConv(sub)); } virtual void execute(toConnectionSub *sub, const QString &sql, toQList ¶ms) { toQuery query(connection(), sql, params); } /** Extract available objects to query for connection. Any access to the * database should always be run using a long running query. If something * goes wrong should throw exception. * @return List of available objects. */ virtual std::list objectNames(void) { qDebug() << "objectNames"; std::list ret; try { toQuery databases(connection(), SQLListDatabases); while(!databases.eof()) { QString db = databases.readValueNull(); qDebug() << "got db" << db; toConnection::objectName cur; cur.Owner = db; cur.Type = "DATABASE"; cur.Name = db; ret.insert(ret.end(), cur); try { toQuery tables(connection(), SQLListTablesDatabases, db); while(!tables.eof()) { toConnection::objectName table; table.Name = tables.readValueNull(); table.Owner = db; table.Type = "TABLE"; table.Comment = tables.readValueNull(); ret.insert(ret.end(), table); } } catch(...) { qDebug() << "table failed"; } } } catch(...) { qDebug() << "databases failed"; } return ret; } /** Get synonyms available for connection. Any access to the * database should always be run using a long running query. If something * goes wrong should throw exception. * @param objects Available objects for the connection. Objects * are sorted in owner and name order. Don't modify * this list. * @return Map of synonyms to objectnames. */ virtual std::map synonymMap( std::list &objects) { qDebug() << "synonymMap"; std::map ret; return ret; } /* Extract available columns to query for a table. * @param table Table to get column for. * @return List of columns for table or view. */ virtual toQDescList columnDesc(const toConnection::objectName &table) { qDebug() << "columnDesc, table:" << table.Name << ", db:" << table.Owner; toQDescList ret; try { toQuery desc(connection(), SQLListColumns, table.Owner, table.Name); while(!desc.eof()) { toQDescribe d; d.Name = desc.readValueNull(); d.Datatype = desc.readValueNull(); d.Comment = desc.readValueNull(); ret.insert(ret.end(), d); } } catch(...) { qDebug() << "columnDesc failed"; } return ret; } }; toTeradataProvider(void) : toConnectionProvider("Teradata", false) {} virtual void initialize(void) { addProvider("Teradata"); } virtual toConnection::connectionImpl *provideConnection(const QString &, toConnection *conn) { return new teradataConnection(conn); } virtual std::list providedOptions(const QString &) { std::list ret; // todo // ret.insert(ret.end(), "*SQL*Net"); // ret.insert(ret.end(), "-"); // ret.insert(ret.end(), "SYS_OPER"); // ret.insert(ret.end(), "SYS_DBA"); return ret; } virtual std::list providedHosts(const QString &) { std::list ret; // default port ret.insert(ret.end(), ":1025"); return ret; } virtual std::list providedDatabases(const QString &, const QString &host, const QString &, const QString &) { std::list ret; // todo return ret; } virtual QWidget *providerConfigurationTab(const QString &provider, QWidget *parent) { return 0; } }; static toTeradataProvider TeradataProvider; static QString QueryParam(const QString &in, toQList ¶ms) { QString ret; bool inString = false; toQList::iterator cpar = params.begin(); QString query = QString(in); std::map binds; for (int i = 0;i < query.length();i++) { QChar rc = query.at(i); char c = rc.toLatin1(); char nc = 0; if (i + 1 < query.length()) nc = query.at(i + 1).toLatin1(); switch (c) { case '\\': ret += rc; ret += query.at(++i); break; case '\'': inString = !inString; ret += rc; break; case ':': // mostly for postgres-style casts, ignore :: if (nc == ':') { ret += rc; ret += nc; i++; break; } if (!inString) { QString nam; for (i++;i < query.length();i++) { rc = query.at(i); if (!rc.isLetterOrNumber()) break; nam += rc; } c = rc.toLatin1(); QString in; if (c == '<') { for (i++;i < query.length();i++) { rc = query.at(i); c = rc.toLatin1(); if (c == '>') { i++; break; } in += rc; } } i--; QString str; QString tmp; if (nam.isEmpty()) break; if (binds.find(nam) != binds.end()) { ret += binds[nam]; break; } if (cpar == params.end()) throw toConnection::exception(QString::fromLatin1("Not all bind variables supplied"), i); if ((*cpar).isNull()) { str = QString::fromLatin1("NULL"); } else if ((*cpar).isInt() || (*cpar).isDouble()) { str = QString(*cpar); } tmp = (*cpar); cpar++; if (str.isNull()) { if (in != QString::fromLatin1("noquote")) str += QString::fromLatin1("'"); for (int j = 0;j < tmp.length();j++) { QChar d = tmp.at(j); switch (d.toLatin1()) { case 0: str += QString::fromLatin1("\\0"); break; case '\n': str += QString::fromLatin1("\\n"); break; case '\t': str += QString::fromLatin1("\\t"); break; case '\r': str += QString::fromLatin1("\\r"); break; case '\'': str += QString::fromLatin1("\\\'"); break; case '\"': str += QString::fromLatin1("\\\""); break; case '\\': str += QString::fromLatin1("\\\\"); break; default: str += d; } } str += QString::fromLatin1("'"); } binds[nam] = str; ret += str; break; } default: ret += rc; } } return ret; } tora-2.1.3/src/toscripttreemodel.cpp0000644000175000017500000003065111270353625017324 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "tosql.h" #include "toconnection.h" #include "tomain.h" #include "toqvalue.h" #include "utils.h" #include "toscripttreeitem.h" #include "toscripttreemodel.h" toScriptTreeModel::toScriptTreeModel(QObject *parent) : QAbstractItemModel(parent) { rootItem = new toScriptTreeItem(); } toScriptTreeModel::~toScriptTreeModel() { if (rootItem) delete rootItem; } int toScriptTreeModel::columnCount(const QModelIndex &parent) const { if (parent.isValid()) return static_cast(parent.internalPointer())->columnCount(); else return rootItem->columnCount(); } QVariant toScriptTreeModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); if (role != Qt::DisplayRole) return QVariant(); toScriptTreeItem *item = static_cast(index.internalPointer()); if (!item) return QVariant(); return item->data(/*index.column()*/); } Qt::ItemFlags toScriptTreeModel::flags(const QModelIndex &index) const { if (!index.isValid()) return 0; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } QVariant toScriptTreeModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) return tr("Objects");//rootItem->data(/*section*/); return QVariant(); } QModelIndex toScriptTreeModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); toScriptTreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); toScriptTreeItem *childItem = parentItem->child(row); if (childItem) return createIndex(row, column, childItem); else return QModelIndex(); } QModelIndex toScriptTreeModel::parent(const QModelIndex &index) const { if (!index.isValid()) return QModelIndex(); toScriptTreeItem *childItem = static_cast(index.internalPointer()); toScriptTreeItem *parentItem = childItem->parent(); if (parentItem == rootItem) return QModelIndex(); return createIndex(parentItem->row(), 0, parentItem); } int toScriptTreeModel::rowCount(const QModelIndex &parent) const { toScriptTreeItem *parentItem; if (parent.column() > 0) return 0; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); return parentItem->childCount(); } // static toSQL SQLObjectListMySQL("toScriptTreeModel:ExtractObject", // "TOAD 1,0,0 SHOW DATABASES", // "Extract objects available to extract from the database, " // "should have same columns", // "3.23", // "MySQL"); static toSQL SQLObjectList("toScriptTreeModel:ExtractObject", "SELECT *\n" " FROM (SELECT 'system environment', 'TABLESPACE', tablespace_name\n" " FROM sys.dba_tablespaces\n" " UNION\n" " SELECT 'system environment', 'ROLE', role\n" " FROM sys.dba_roles\n" " UNION\n" // public is handled inside the statement now the //" SELECT 'PUBLIC',NULL,NULL\n" //" FROM dual\n" // synonyms are handled in SQLUserObjectList finally // " SELECT 'PUBLIC', 'SYNONYM', synonym_name\n" // " FROM sys.all_synonyms WHERE owner = 'PUBLIC'\n" // " UNION\n" " SELECT 'system environment', 'USER', username\n" " FROM sys.all_users)\n" " ORDER BY 1,2,3", "Objects for user with sys privs.", "0801"); static toSQL SQLUserObjectList("toScriptTreeModel:UserExtractObject", "SELECT owner,object_type,object_name\n" " FROM sys.all_objects\n" " WHERE object_type IN ('VIEW','TABLE','TYPE','SEQUENCE','PACKAGE',\n" " 'PACKAGE BODY','FUNCTION','PROCEDURE', 'SYNONYM')\n" " ORDER BY 1,2,3", "Extract objects available to extract from the database if you " "don't have admin access, should have same columns"); // static toSQL SQLPublicSynonymList("toScriptTreeModel:PublicSynonyms", // "SELECT owner, 'SYNONYM', synonym_name\n" // " FROM sys.all_synonyms WHERE owner = 'PUBLIC'\n" // " ORDER BY 1, 2, 3", // "Extract all public synonyms from database"); // static toSQL SQLUserObjectsMySQL("toScriptTreeModel:UserObjects", // "SHOW TABLES FROM :own", // "Get the objects available for a user, must have same columns and binds", // "3.23", // "MySQL"); static toSQL SQLUserObjects("toScriptTreeModel:UserObjects", "SELECT *\n" " FROM (SELECT owner, 'DATABASE LINK',db_link\n" " FROM sys.all_db_links\n" " WHERE owner = :own\n" " UNION\n" " SELECT owner, object_type,object_name\n" " FROM sys.all_objects\n" " WHERE object_type IN ('VIEW','TYPE','SEQUENCE','PACKAGE',\n" " 'PACKAGE BODY','FUNCTION','PROCEDURE',\n" " 'TRIGGER', 'SYNONYM')\n" " AND owner = :own\n" " UNION\n" " SELECT owner, 'TABLE',table_name\n" " FROM sys.all_tables\n" " WHERE temporary != 'Y' AND secondary = 'N' AND iot_name IS NULL\n" " AND owner = :own\n" " UNION\n" " SELECT owner, 'MATERIALIZED TABLE',mview_name AS object\n" " FROM sys.all_mviews\n" " WHERE owner = :own)\n" " ORDER BY 1, 2, 3", "List objects for common user."); static toSQL SQLUserObjects7("toScriptTreeModel:UserObjects", "SELECT *\n" " FROM (SELECT owner, 'DATABASE LINK',db_link\n" " FROM sys.all_db_links\n" " WHERE owner = :own\n" " UNION\n" " SELECT owner, object_type,object_name\n" " FROM sys.all_objects\n" " WHERE object_type IN ('VIEW','TYPE','SEQUENCE','PACKAGE',\n" " 'PACKAGE BODY','FUNCTION','PROCEDURE','TRIGGER')\n" " AND owner = :own\n" " UNION\n" " SELECT owner, 'TABLE',table_name\n" " FROM sys.all_tables\n" " WHERE temporary != 'Y' AND secondary = 'N'\n" " AND owner = :own\n" " UNION\n" " SELECT owner, 'MATERIALIZED TABLE', mview_name AS object\n" " FROM sys.all_mviews\n" " WHERE owner = :own)\n" " ORDER BY 1, 2, 3", "", "0703"); void toScriptTreeModel::setupModelData(const QString & connId, const QString & schema) { // qDebug() << "void toScriptTreeModel::setupModelData(const QString & schema)" << schema; // clear old contents delete rootItem; rootItem = new toScriptTreeItem(); QString topLevel(""); QString secondLevel(""); toScriptTreeItem * currentSchemaItem = 0; toScriptTreeItem * currentTypeItem = 0; toConnection &conn = toMainWidget()->connection(connId); toQList object; if (schema.isNull()) { try { object = toQuery::readQueryNull(conn, SQLObjectList); } catch (...) { // qDebug() << "SQLObjectList call failed. Running 'common user' stmt."; qDebug("SQLObjectList call failed. Running 'common user' stmt."); } toQList object1 = toQuery::readQueryNull(conn, SQLUserObjectList); object.splice(object.end(), object1); } else { object = toQuery::readQueryNull(conn, SQLUserObjects, schema); } QString c1; QString c2; QString c3; while (object.size() > 0) { c1 = toShift(object); c2 = toShift(object); c3 = toShift(object); // qDebug() << c1 << c2 << c3; // new schema in hierarchy if (c1 != topLevel) { // qDebug() << "SCHEMA switch " << topLevel << c1; currentSchemaItem = new toScriptTreeItem(rootItem, c1); rootItem->appendChild(currentSchemaItem); secondLevel = ""; // reset it } // new type in hierarchy if (c2 != secondLevel) { // qDebug() << "TYPE switch " << secondLevel << c2; currentTypeItem = new toScriptTreeItem(currentSchemaItem, c2); currentSchemaItem->appendChild(currentTypeItem); } // real objects { toScriptTreeItem * item = new toScriptTreeItem(currentTypeItem, c3, c2, c1); currentTypeItem->appendChild(item); } topLevel = c1; secondLevel = c2; } reset(); // qDebug() << "void toScriptTreeModel::setupModelData(const QString & schema)" << "end"; } tora-2.1.3/src/toinvalid.h0000644000175000017500000000424111270353625015206 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOINVALID_H #define TOINVALID_H #include "config.h" #include "totool.h" class toResultExtract; class toResultTableView; class toInvalid : public toToolWidget { Q_OBJECT; toResultTableView *Objects; toResultExtract *Source; public: toInvalid(QWidget *parent, toConnection &connection); public slots: virtual void changeSelection(void); virtual void refresh(void); virtual void recompileSelected(void); }; #endif tora-2.1.3/src/toeditextensionsetupui.ui0000644000175000017500000001467211270353625020260 0ustar michaelmichael toEditExtensionSetupUI 0 0 527 421 Form1 &Same line comment column false CommentColumn Place &comma on new line before item instead of after on same line Place THEN, LOOP, AS and IS on new line at b&eginning of new block Insert extra spaces between operators. Put spaces around operators Transform keywords to &uppercase &Right align keywords in each statement. Insert a &newline after each block Auto indent read only SQL text editors Allow Drag and Drop Example false 0 0 toHighlightedText QWidget
tohighlightedtext.h
CommentColumn CommaBefore BlockOpenLine OperatorSpace KeywordUpper RightSeparator EndBlockNewline CommaBefore toggled(bool) toEditExtensionSetupUI changed() 20 20 20 20 BlockOpenLine toggled(bool) toEditExtensionSetupUI changed() 20 20 20 20 KeywordUpper toggled(bool) toEditExtensionSetupUI changed() 20 20 20 20 RightSeparator toggled(bool) toEditExtensionSetupUI changed() 20 20 20 20 EndBlockNewline toggled(bool) toEditExtensionSetupUI changed() 20 20 20 20 OperatorSpace toggled(bool) toEditExtensionSetupUI changed() 20 20 20 20 CommentColumn valueChanged(int) toEditExtensionSetupUI changed() 20 20 20 20
tora-2.1.3/src/toabout.h0000644000175000017500000000410211270353625014666 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOABOUT_H #define TOABOUT_H #include "config.h" #include "ui_toaboutui.h" class toAbout : public QDialog, public Ui::toAboutUI { Q_OBJECT public: enum AboutType { About, License }; toAbout(AboutType, QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WFlags fl = 0); ~toAbout(); }; #endif tora-2.1.3/src/tobrowser.cpp0000644000175000017500000037436011417643467015623 0ustar michaelmichael#include /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "tobrowser.h" #include "tobrowsertable.h" #include "tobrowserconstraint.h" #include "ui_tobrowserfilterui.h" #include "tobrowserindex.h" #include "tochangeconnection.h" #include "toconf.h" #include "toconnection.h" #include "toextract.h" #include "tohelp.h" #include "tomain.h" #include "toresultcols.h" #include "toresultschema.h" #include "toresultdata.h" #include "toresultdepend.h" #include "toresultextract.h" #include "toresultfield.h" #include "toresultitem.h" #include "toresultstorage.h" #include "toresultview.h" #include "toresulttableview.h" #include "tosql.h" #include "totabwidget.h" #include "totool.h" #ifdef TOEXTENDED_MYSQL # include "tomysqluser.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "icons/addindex.xpm" #include "icons/addtable.xpm" #include "icons/filter.xpm" #include "icons/function.xpm" #include "icons/index.xpm" #include "icons/modconstraint.xpm" #include "icons/modindex.xpm" #include "icons/modtable.xpm" #include "icons/nofilter.xpm" #include "icons/refresh.xpm" #include "icons/schema.xpm" #include "icons/sequence.xpm" #include "icons/synonym.xpm" #include "icons/table.xpm" #include "icons/tobrowser.xpm" #include "icons/view.xpm" #include "icons/trash.xpm" //#ifndef TO_NO_ORACLE #include "icons/offline.xpm" #include "icons/online.xpm" //#endif #ifdef TOEXTENDED_MYSQL #include "icons/new.xpm" #endif #include "tobrowsertablewidget.h" #include "tobrowserviewwidget.h" #include "tobrowserindexwidget.h" #include "tobrowsersequencewidget.h" #include "tobrowsersynonymwidget.h" #include "tobrowsercodewidget.h" #include "tobrowsertriggerwidget.h" #include "tobrowserdblinkswidget.h" #include "tobrowserdirectorieswidget.h" #include "tobrowseraccesswidget.h" #include "tobrowserschemawidget.h" const char **toBrowserTool::pictureXPM(void) { return const_cast(tobrowser_xpm); } toBrowserTool::toBrowserTool() : toTool(20, "Schema Browser") { } const char *toBrowserTool::menuItem() { return "Schema Browser"; } QWidget *toBrowserTool::toolWindow(QWidget *parent, toConnection &connection) { return new toBrowser(parent, connection); } bool toBrowserTool::canHandle(toConnection &conn) { return toIsOracle(conn) || toIsMySQL(conn) || toIsPostgreSQL(conn) || toIsSapDB(conn) || toIsTeradata(conn); } void toBrowserTool::customSetup() { #if 0 // todo QMenu *createMenu = new QMenu(toMainWidget()); createMenu->insertItem(QPixmap(const_cast(modtable_xpm)), tr("&Table"), this, SLOT(addTable())); createMenu->insertItem(QPixmap(const_cast(modindex_xpm)), tr("&Index"), this, SLOT(addIndex())); createMenu->insertItem(QPixmap(const_cast(modconstraint_xpm)), tr("&Constraint"), this, SLOT(addConstraint())); toMainWidget()->menuBar()->insertItem(tr("&Create"), createMenu, -1, toToolMenuIndex()); #endif } void toBrowserTool::addTable(void) { try { toConnection &conn = toMainWidget()->currentConnection(); toBrowserTable::newTable(conn, toIsMySQL(conn) ? conn.database() : conn.user(), toMainWidget()); } TOCATCH } void toBrowserTool::addIndex(void) { try { toConnection &conn = toMainWidget()->currentConnection(); toBrowserIndex::modifyIndex(conn, toIsMySQL(conn) ? conn.database() : conn.user(), QString::null, toMainWidget()); } TOCATCH } void toBrowserTool::addConstraint(void) { try { toConnection &conn = toMainWidget()->currentConnection(); toBrowserConstraint::modifyConstraint(conn, toIsMySQL(conn) ? conn.database() : conn.user(), QString::null, toMainWidget()); } TOCATCH } static toBrowserTool BrowserTool; static toSQL SQLListTablespaces("toBrowser:ListTablespaces", "SELECT Tablespace_Name FROM sys.DBA_TABLESPACES\n" " ORDER BY Tablespace_Name", "List the available tablespaces in a database."); class toBrowserFilter : public toViewFilter { int Type; bool IgnoreCase; bool Invert; QString Text; int TablespaceType; std::list Tablespaces; QRegExp Match; bool OnlyOwnSchema; bool Empty; std::map RemoveDuplicates; public: toBrowserFilter(int type, bool cas, bool invert, const QString &str, int tablespace, const std::list &tablespaces, bool onlyOwnSchema = false) : Type(type), IgnoreCase(cas), Invert(invert), Text(cas ? str.toUpper() : str), TablespaceType(tablespace), Tablespaces(tablespaces), OnlyOwnSchema(onlyOwnSchema), Empty(false) { if (!str.isEmpty()) { Match.setPattern(str); Match.setCaseSensitivity(cas ? Qt::CaseSensitive : Qt::CaseInsensitive); } storeFilterSettings(); } toBrowserFilter(bool empty = true) : Type(0), IgnoreCase(true), Invert(false), TablespaceType(0) { Empty = empty; if (!empty) readFilterSettings(); else toConfigurationSingle::Instance().setFilterType(0); // No filter type } virtual bool isEmpty(void) { return Empty; } virtual void storeFilterSettings(void) { toConfigurationSingle::Instance().setFilterIgnoreCase(IgnoreCase); toConfigurationSingle::Instance().setFilterInvert(Invert); toConfigurationSingle::Instance().setFilterType(Type); toConfigurationSingle::Instance().setFilterTablespaceType(TablespaceType); toConfigurationSingle::Instance().setFilterText(Text); toConfigurationSingle::Instance().saveConfig(); } virtual void readFilterSettings(void) { QString t; Text = toConfigurationSingle::Instance().filterText(); IgnoreCase = toConfigurationSingle::Instance().filterIgnoreCase(); Invert = toConfigurationSingle::Instance().filterInvert(); OnlyOwnSchema = false; Type = toConfigurationSingle::Instance().filterType(); TablespaceType = toConfigurationSingle::Instance().filterTablespaceType(); } virtual void exportData(std::map &data, const QString &prefix) { data[prefix + ":Type"] = QString::number(Type); if (IgnoreCase) data[prefix + ":Ignore"] = "Yes"; if (Invert) data[prefix + ":Invert"] = "Yes"; data[prefix + ":SpaceType"] = QString::number(TablespaceType); data[prefix + ":Text"] = Text; int id = 1; for (std::list::iterator i = Tablespaces.begin(); i != Tablespaces.end(); i++, id++) data[prefix + ":Space:" + QString::number(id).toLatin1()] = *i; if (OnlyOwnSchema) data[prefix + ":OwnlyOwnSchema"] = "Yes"; } virtual void importData(std::map &data, const QString &prefix) { Type = data[prefix + ":Type"].toInt(); OnlyOwnSchema = !data[prefix + ":OnlyOwnSchema"].isEmpty(); TablespaceType = data[prefix + ":SpaceType"].toInt(); IgnoreCase = !data[prefix + ":Ignore"].isEmpty(); Invert = !data[prefix + ":Invert"].isEmpty(); Text = data[prefix + ":Text"]; if (!Text.isEmpty()) { Match.setPattern(Text); Match.setCaseSensitivity(IgnoreCase ? Qt::CaseSensitive : Qt::CaseInsensitive); } int id = 1; std::map::iterator i; Tablespaces.clear(); while ((i = data.find(prefix + ":Space:" + QString::number(id).toLatin1())) != data.end()) { Tablespaces.insert(Tablespaces.end(), (*i).second); i++; id++; } } bool onlyOwnSchema(void) { return OnlyOwnSchema; } virtual QString wildCard(void) { switch (Type) { default: return QString::fromLatin1("%"); case 1: return Text.toUpper() + QString::fromLatin1("%"); case 2: return QString::fromLatin1("%") + Text.toUpper(); case 3: return QString::fromLatin1("%") + Text.toUpper() + QString::fromLatin1("%"); } } virtual void startingQuery() { RemoveDuplicates.clear(); } virtual bool check(const toTreeWidgetItem *item) { return check(item->text(0), item->text(1), item->text(2)); } virtual bool check(const toResultModel *model, const int row) { return check(model->data(row, 1).toString(), model->data(row, 2).toString(), model->data(row, 3).toString()); } virtual bool check(QString one, QString two, QString three) { QString key = one + "." + two; if (RemoveDuplicates.find(key) != RemoveDuplicates.end()) return false; else RemoveDuplicates[key] = true; QString str = one; QString tablespace = three; if (!tablespace.isEmpty()) { switch (TablespaceType) { default: break; case 1: { bool ok = false; for (std::list::iterator i = Tablespaces.begin(); i != Tablespaces.end(); i++) { if (*i == tablespace) { ok = true; break; } } if (!ok) return false; } break; case 2: for (std::list::iterator i = Tablespaces.begin(); i != Tablespaces.end(); i++) if (*i == tablespace) return false; break; } } switch (Type) { default: return true; case 1: if (IgnoreCase) { if (str.toUpper().startsWith(Text)) return !Invert; } else if (str.startsWith(Text)) return !Invert; break; case 2: if (IgnoreCase) { if (str.right(Text.length()).toUpper() == Text) return !Invert; } else if (str.right(Text.length()) == Text) return !Invert; break; case 3: if (str.contains(Text, IgnoreCase ? Qt::CaseSensitive : Qt::CaseInsensitive)) return !Invert; break; case 4: { QStringList lst = Text.split(QRegExp(QString("\\s*,\\s*"))); for (int i = 0; i < lst.count(); i++) if (IgnoreCase) { if (str.toUpper() == lst[i]) return !Invert; } else if (str == lst[i]) return !Invert; } break; case 5: // qt4 if (Match.match(str) >= 0) if (Match.indexIn(str) >= 0) return !Invert; break; } return Invert; } virtual toViewFilter *clone(void) { return new toBrowserFilter(*this); } friend class toBrowserFilterSetup; }; class toBrowserFilterSetup : public QDialog, public Ui::toBrowserFilterUI { private: QButtonGroup *ButtonsGroup; QButtonGroup *TypeGroup; public: void setup(bool temp) { toHelp::connectDialog(this); // qbuttongroup is not a widget. awesome. guess they'll fix // that in qt5. ButtonsGroup = new QButtonGroup(ButtonsBox); ButtonsGroup->addButton(None, 0); ButtonsGroup->addButton(StartWith, 1); ButtonsGroup->addButton(EndWith, 2); ButtonsGroup->addButton(Contains, 3); ButtonsGroup->addButton(CommaSeparate, 4); ButtonsGroup->addButton(RegExp, 5); TypeGroup = new QButtonGroup(TablespaceType); TypeGroup->addButton(IncludeAll, 0); TypeGroup->addButton(Include, 1); TypeGroup->addButton(Exclude, 2); if (!temp) { OnlyOwnSchema->hide(); Tablespaces->setNumberColumn(false); Tablespaces->setReadableColumns(true); try { toConnection &conn = toCurrentConnection(this); toQuery query(conn, toSQL::string(SQLListTablespaces, conn)); Tablespaces->query(SQLListTablespaces); } catch (...) {} Tablespaces->setSelectionMode(toTreeWidget::Multi); } else { TablespaceType->hide(); } } toBrowserFilterSetup(bool temp, QWidget *parent) : QDialog(parent) { setupUi(this); setup(temp); } toBrowserFilterSetup(bool temp, toBrowserFilter &cur, QWidget *parent) : QDialog(parent) { setupUi(this); setup(temp); QAbstractButton *b = ButtonsGroup->button(cur.Type); if (b) b->setChecked(true); if (!TablespaceType->isHidden()) { b = TypeGroup->button(cur.TablespaceType); if (b) b->setChecked(true); for (std::list::iterator i = cur.Tablespaces.begin(); i != cur.Tablespaces.end(); i++) { for (toTreeWidgetItemIterator it(Tablespaces); (*it); it++) { if ((*it)->text(0) == *i) { (*it)->setSelected(true); break; } } } String->setText(cur.Text); Invert->setChecked(cur.Invert); IgnoreCase->setChecked(cur.IgnoreCase); OnlyOwnSchema->setChecked(cur.OnlyOwnSchema); } } toBrowserFilter *getSetting(void) { std::list tablespaces; for (toTreeWidgetItemIterator it(Tablespaces); (*it); it++) { if ((*it)->isSelected()) tablespaces.insert(tablespaces.end(), (*it)->text(0)); } return new toBrowserFilter(ButtonsGroup->id(ButtonsGroup->checkedButton()), IgnoreCase->isChecked(), Invert->isChecked(), String->text(), TypeGroup->id(TypeGroup->checkedButton()), tablespaces, OnlyOwnSchema->isChecked()); } }; // toBrowseButton::toBrowseButton(const QIcon &iconSet, // const QString &textLabel, // const QString & grouptext, // QObject * receiver, // const char * slot, // QToolBar * parent, // const char * name) // : QToolButton(parent) // { // // setIcon(iconSet); // setText(textLabel); // connect(this, SIGNAL(triggered(QAction *)), receiver, slot); // setObjectName(name); // setToolTip(grouptext); // // try // { // connect(toCurrentTool(this), SIGNAL(connectionChange()), this, SLOT(connectionChanged())); // } // TOCATCH // connectionChanged(); // } // // void toBrowseButton::connectionChanged() // { // try // { // setEnabled(toExtract::canHandle(toCurrentConnection(this))); // } // TOCATCH // } #define FIRST_WIDTH 180 #define TAB_TABLES "Tables" #define TAB_TABLE_COLUMNS "TablesColumns" #define TAB_TABLE_CONS "TablesConstraint" #define TAB_TABLE_DEPEND "TablesDepend" #define TAB_TABLE_INDEXES "TablesIndexes" #define TAB_TABLE_DATA "TablesData" #define TAB_TABLE_GRANTS "TablesGrants" #define TAB_TABLE_TRIGGERS "TablesTriggers" #define TAB_TABLE_INFO "TablesInfo" #define TAB_TABLE_PARTITION "TablesPartition" #define TAB_TABLE_STATISTIC "TablesStatistic" #define TAB_TABLE_EXTENT "TablesExtent" #define TAB_TABLE_EXTRACT "TablesExtract" #define TAB_VIEWS "Views" #define TAB_VIEW_COLUMNS "ViewColumns" #define TAB_VIEW_SQL "ViewSQL" #define TAB_VIEW_DATA "ViewData" #define TAB_VIEW_GRANTS "ViewGrants" #define TAB_VIEW_DEPEND "ViewDepend" #define TAB_VIEW_EXTRACT "ViewExtract" #define TAB_SEQUENCES "Sequences" #define TAB_SEQUENCES_GRANTS "SequencesGrants" #define TAB_SEQUENCES_INFO "SequencesInfo" #define TAB_SEQUENCES_EXTRACT "SequencesExtract" #define TAB_INDEX "Index" #define TAB_INDEX_COLS "IndexCols" #define TAB_INDEX_INFO "IndexInfo" #define TAB_INDEX_EXTENT "IndexesExtent" #define TAB_INDEX_EXTRACT "IndexExtract" #define TAB_INDEX_STATISTIC "IndexStatistic" #define TAB_SYNONYM "Synonym" #define TAB_SYNONYM_GRANTS "SynonymGrants" #define TAB_SYNONYM_INFO "SynonymInfo" #define TAB_SYNONYM_EXTRACT "SynonymExtract" #define TAB_PLSQL "PLSQL" #define TAB_PLSQL_SOURCE "PLSQLSource" #define TAB_PLSQL_BODY "PLSQLBody" #define TAB_PLSQL_GRANTS "PLSQLGrants" #define TAB_PLSQL_DEPEND "PLSQLDepend" #define TAB_PLSQL_EXTRACT "PLSQLExtract" #define TAB_TRIGGER "Trigger" #define TAB_TRIGGER_INFO "TriggerInfo" #define TAB_TRIGGER_SOURCE "TriggerSource" #define TAB_TRIGGER_GRANTS "TriggerGrants" #define TAB_TRIGGER_COLS "TriggerCols" #define TAB_TRIGGER_DEPEND "TriggerDepend" #define TAB_TRIGGER_EXTRACT "TriggerExtract" #define TAB_DBLINK "DBLink" #define TAB_DBLINK_INFO "DBLinkInfo" #define TAB_DBLINK_SYNONYMS "DBLinkSynonyms" #define TAB_DIRECTORIES "Directories" #define TAB_ACCESS "Access" #define TAB_ACCESS_CONTENT "AccessContent" #define TAB_ACCESS_USER "AccessUser" #define TAB_ACCESS_OBJECTS "AccessObjects" static toSQL SQLListTablesMysql3("toBrowser:ListTables", "SHOW TABLES FROM :f1", "List the available tables in a schema.", "3.0", "MySQL"); static toSQL SQLListTablesMysql("toBrowser:ListTables", "SELECT TABLE_NAME TABLES\n" " FROM information_schema.tables\n" " WHERE table_schema = :f1", "", "5.0", "MySQL"); static toSQL SQLListTables("toBrowser:ListTables", "SELECT Table_Name,NULL \" Ignore\",NULL \" Ignore2\",Tablespace_name \" Ignore2\"\n" " FROM SYS.ALL_ALL_TABLES WHERE OWNER = :f1 AND IOT_Name IS NULL\n" " AND UPPER(TABLE_NAME) LIKE :f2\n" " ORDER BY Table_Name", "", "0800"); // petr vanek 03/01/07 bug #1180847 Error when creating referential constraint static toSQL SQLListTableNames("toBrowser:ListTableNames", "SELECT Table_Name\n" " FROM SYS.ALL_ALL_TABLES WHERE OWNER = :f1 AND IOT_Name IS NULL\n" " ORDER BY Table_Name", "simplified version of the toBrowser:ListTables", "0800"); static toSQL SQLListTables7("toBrowser:ListTables", "SELECT Table_Name,NULL \" Ignore\",NULL \" Ignore2\",Tablespace_name \" Ignore2\"\n" " FROM SYS.ALL_TABLES WHERE OWNER = :f1\n" " AND UPPER(TABLE_NAME) LIKE :f2\n" " ORDER BY Table_Name", "", "0703"); static toSQL SQLListTablesPgSQL("toBrowser:ListTables", "SELECT c.relname AS \"Table Name\"\n" " FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid\n" " WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" " AND c.relkind = 'r'" " ORDER BY \"Table Name\"", "", "7.1", "PostgreSQL"); static toSQL SQLListTablesSapDB("toBrowser:ListTables", "SELECT tablename \"Table Name\"\n" " FROM tables \n" " WHERE tabletype = 'TABLE' and owner = upper(:f1) \n" " ORDER by tablename", "", "", "SapDB"); static toSQL SQLListTablesTD("toBrowser:ListTables", "SELECT trim ( tablename ) AS \"Table Name\"\n" " FROM dbc.TABLES\n" " WHERE databasename = trim ( upper ( :f1 ) )\n" " AND tablekind = 'T'\n" " ORDER BY 1", "", "", "Teradata"); // static toSQL SQLTableIndex("toBrowser:TableIndex", // "SELECT IND.index_name AS \"Index Name\",\n" // " ind.column_name AS \"Column Name\",\n" // " al.uniqueness AS \"Unique\",\n" // " AL.index_type AS \"Type\",\n" // " EX.column_expression AS \"Column Expression\"\n" // " FROM SYS.ALL_IND_COLUMNS IND,\n" // " SYS.ALL_IND_EXPRESSIONS EX,\n" // " sys.All_Indexes AL\n" // " WHERE IND.INDEX_OWNER = :own\n" // " AND IND.TABLE_NAME = :nam\n" // " AND EX.index_owner ( + ) = IND.index_owner\n" // " AND EX.index_name ( + ) = IND.index_name\n" // " AND IND.index_name = AL.index_name ( + )\n" // " AND IND.index_owner = AL.owner ( + )", // "List the indexes on a table", // ""); // static toSQL SQLTableIndexSapDB("toBrowser:TableIndex", // "SELECT owner,\n" // " indexname \"Index_Name\",\n" // " 'NORMAL',\n" // " type\n" // " FROM indexes \n" // " WHERE owner = :f1 and tablename = :f2 \n" // " ORDER by indexname", // "", // "", // "SapDB"); // // static toSQL SQLTableIndexPG("toBrowser:TableIndex", // "SELECT u.usename AS \"Owner\",\n" // " c2.relname AS \"Index Name\",\n" // " pg_get_indexdef(i.indexrelid) as \"Definition\"\n" // " FROM pg_class c,\n" // " pg_class c2,\n" // " pg_index i,\n" // " pg_user u,\n" // " pg_namespace n\n" // " WHERE c.relowner = u.usesysid\n" // " AND n.nspname = :f1\n" // " AND c.relname = :f2\n" // " AND c.relowner = u.usesysid\n" // " AND n.OID = c.relnamespace\n" // " AND c.OID = i.indrelid\n" // " AND i.indexrelid = c2.OID", // "", // "", // "PostgreSQL"); // // static toSQL SQLTableIndexMySQL3("toBrowser:TableIndex", // "SHOW INDEX FROM `:f1`.`:tab`", // "", // "3.0", // "MySQL"); // static toSQL SQLTableConstraint( // "toBrowser:TableConstraint", // // "SELECT sub.constraint_name AS \"Constraint Name\",\n" // // " srch.search_condition AS \"Search Condition\",\n" // // " sub.condition AS \"Condition\",\n" // // " sub.status AS \"Status\",\n" // // " sub.constraint_type AS \"Type\",\n" // // " sub.delete_rule AS \"Delete Rule\",\n" // // " sub.GENERATED AS \"Generated\"\n" // // " FROM ( SELECT c.Constraint_Name,\n" // // " DECODE ( constraint_type,\n" // // " 'R',\n" // // " 'foreign key (' || a.column_name || ') references ' " // // "|| a2.owner || '.' || a2.table_name || '(' || a2.column_name || ')',\n" // // " 'P',\n" // // " 'primary key (' || a.column_name || ')',\n" // // " 'U',\n" // // " 'unique (' || a.column_name || ')',\n" // // " NULL ) AS condition,\n" // // " c.Status,\n" // // " c.Constraint_Type,\n" // // " c.Delete_Rule,\n" // // " c.GENERATED\n" // // " FROM sys.All_Constraints c,\n" // // " sys.all_cons_columns a,\n" // // " sys.all_cons_columns a2\n" // // " WHERE c.constraint_name = a.constraint_name\n" // // " AND c.Owner = :f1\n" // // " AND c.Table_Name = :f2\n" // // " AND c.r_constraint_name = a2.constraint_name ( + ) ) sub,\n" // // " sys.all_constraints srch\n" // // " WHERE sub.constraint_name = srch.constraint_name", // "SELECT main.constraint_name AS \"Constraint Name\",\n" // " main.column_name AS \"Column Name\",\n" // " main.search_condition AS \"Search Condition\",\n" // " main.status AS \"Status\",\n" // " main.constraint_type AS \"Type\",\n" // " main.delete_rule AS \"Delete Rule\",\n" // " main.generated AS \"Generated\",\n" // " DECODE ( main.constraint_type,\n" // " 'R',\n" // " 'FK (' || main.column_name || ') ref. ' || refs.owner || '.'\n" // " || refs.table_name || '(' || refs.column_name || ')',\n" // " 'P',\n" // " 'PK (' || main.column_name || ')',\n" // " 'U',\n" // " 'unique (' || main.column_name || ')',\n" // " NULL ) AS \"Condition\"\n" // " FROM\n" // " (\n" // " SELECT\n" // " c.constraint_name,\n" // " a.column_name,\n" // " c.constraint_type,\n" // " c.r_constraint_name,\n" // " c.search_condition,\n" // " c.status,\n" // " c.delete_rule,\n" // " c.generated\n" // " FROM\n" // " sys.All_Constraints c,\n" // " sys.all_cons_columns a\n" // " WHERE\n" // " c.constraint_name = a.constraint_name\n" // " AND c.Owner = :f1\n" // " AND c.Table_Name = :f2\n" // " ORDER BY\n" // " c.constraint_name, a.constraint_name, a.position\n" // " ) main,\n" // " sys.all_cons_columns refs\n" // " WHERE\n" // " main.r_constraint_name = refs.constraint_name (+)\n" // " AND main.column_name = refs.column_name (+)", // "List the constraints on a table", // ""); // // static toSQL SQLTableConstraintPG( // "toBrowser:TableConstraint", // "SELECT conname as \"Constraint Name\",\n" // " pg_catalog.pg_get_constraintdef ( r.OID,\n" // " TRUE ) AS \"Description\"\n" // " FROM pg_catalog.pg_constraint r,\n" // " pg_catalog.pg_class c,\n" // " pg_catalog.pg_namespace n\n" // " WHERE n.nspname = :f1\n" // " AND c.relname = :f2\n" // " AND c.relnamespace = n.OID\n" // " AND c.OID = r.conrelid\n" // " ORDER BY 1", // "", // "", // "PostgreSQL"); // static toSQL SQLTableReferences( // "toBrowser:TableReferences", // "SELECT a.Owner AS \"Owner\",\n" // " a.Table_Name AS \"Object\",\n" // " a.Constraint_Name AS \"Constraint\",\n" // " 'foreign key (' || c.column_name || ') references ' || r.owner || " // "'.' || r.table_name || '(' || r.column_name || ')' AS \"Condition\",\n" // " a.Status AS \"Status\",\n" // " a.Delete_Rule AS \"Delete Rule\"\n" // " FROM sys.all_constraints a,\n" // " sys.all_cons_columns r,\n" // " sys.all_cons_columns c\n" // " WHERE a.constraint_type = 'R'\n" // " AND a.r_constraint_name IN ( SELECT b.constraint_name\n" // " FROM sys.all_constraints b\n" // " WHERE b.OWNER = :owner\n" // " AND b.TABLE_NAME = :tab )\n" // " AND a.r_constraint_name = r.constraint_name\n" // " AND a.constraint_name = c.constraint_name\n" // " UNION SELECT owner,\n" // " name,\n" // " NULL,\n" // " TYPE || ' ' || dependency_type,\n" // " 'DEPENDENCY',\n" // " NULL\n" // " FROM sys.all_dependencies\n" // " WHERE referenced_owner = :owner\n" // " AND referenced_name = :tab", // "List the references on a table", // ""); /*static toSQL SQLTableTriggerSapDB("toBrowser:TableTrigger", "SELECT TriggerName,'UPDATE' \"Event\",''\"Column\",'ENABLED' \"Status\",''\"Description\"\n" " FROM triggers \n" " WHERE owner = upper(:f1) and tablename = :f2\n" " and update='YES'\n" "UNION\n" "SELECT TriggerName,'INSERT','','ENABLED',''\n" " FROM triggers \n" " WHERE owner = upper(:f1) and tablename = :f2\n" " and insert='YES'\n" "UNION\n" "SELECT TriggerName,'DELETE','','ENABLED',''\n" " FROM triggers \n" " WHERE owner = upper(:f1) and tablename = :f2\n" " and delete='YES'\n" " ORDER by 1 ", "Display the triggers operating on a table", "", "SapDB"); static toSQL SQLTableTrigger("toBrowser:TableTrigger", "SELECT Trigger_Name,Triggering_Event,Column_Name,Status,Description \n" " FROM SYS.ALL_TRIGGERS\n" " WHERE Table_Owner = :f1 AND Table_Name = :f2", "", "0801"); static toSQL SQLTableTrigger8("toBrowser:TableTrigger", "SELECT Trigger_Name,Triggering_Event,Status,Description \n" " FROM SYS.ALL_TRIGGERS\n" " WHERE Table_Owner = :f1 AND Table_Name = :f2"); static toSQL SQLTableTriggerPG("toBrowser:TableTrigger", " SELECT t.tgname AS \"Trigger Name\",\n" " pg_catalog.pg_get_triggerdef ( t.OID ) AS \"Condition\"\n" " FROM pg_catalog.pg_trigger t,\n" " pg_class c,\n" " pg_tables tab\n" " WHERE lower ( tab.schemaname ) = lower ( :f1 )\n" " AND c.relname = tab.tablename\n" " AND lower ( c.relname ) = lower ( :f2 )\n" " AND c.OID = t.tgrelid\n" " AND ( NOT tgisconstraint OR NOT EXISTS ( SELECT 1\n" " FROM pg_catalog.pg_depend d\n" " JOIN pg_catalog.pg_constraint c\n" " ON ( d.refclassid = c.tableoid AND d.refobjid = c.OID )\n" " WHERE d.classid = t.tableoid\n" " AND d.objid = t.OID\n" " AND d.deptype = 'i'\n" " AND c.contype = 'f' ) )\n" " ORDER BY 1\n", "", "", "PostgreSQL");*/ /*static toSQL SQLTableInfoMysql("toBrowser:TableInformation", "show table status from `:own` like :tab", "Display information about a table", "3.0", "MySQL"); static toSQL SQLTableInfo("toBrowser:TableInformation", "SELECT *\n" " FROM SYS.ALL_TABLES\n" " WHERE OWNER = :f1 AND Table_Name = :f2", ""); static toSQL SQLTableInfoPgSQL("toBrowser:TableInformation", "SELECT c.*\n" " FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid\n" " WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" " AND c.relkind = 'r'\n" " AND c.relname = :f2", "", "7.1", "PostgreSQL"); static toSQL SQLTableInfoSapDB("toBrowser:TableInformation", "SELECT TABLENAME,PRIVILEGES,CREATEDATE,CREATETIME,UPDSTATDATE,UPDSTATTIME,ALTERDATE,ALTERTIME,TABLEID \n" " FROM tables \n" " WHERE tabletype = 'TABLE' and owner = upper(:f1) and tablename = :f2", "", "", "SapDB");*/ /*static toSQL SQLTableStatistic("toBrowser:TableStatstics", "SELECT description \"Description\", value(char_value,numeric_value) \"Value\" \n" " FROM tablestatistics \n" " WHERE owner = upper(:f1) and tablename = :f2", "Table Statistics", "", "SapDB");*/ // static toSQL SQLTablePartition("toBrowser:TablePartitions", // "select p.partition_name \"Partition\"\n" // " , p.composite \"Composite\"\n" // " , p.num_rows \"Partition rows\"\n" // " , p.high_value \"High value\"\n" // " , p.subpartition_count \"Subpartitions\"\n" // " , p.partition_position \"Position\"\n" // " , s.subpartition_name \"Subpartition\"\n" // " , s.num_rows \"Subpartition rows\"\n" // " , s.subpartition_position \"Subpartition position\"\n" // " from all_tab_partitions p,\n" // " all_tab_subpartitions s\n" // " where p.table_owner = s.table_owner(+)\n" // " and p.table_name = s.table_name(+)\n" // " and p.partition_name = s.partition_name(+)\n" // " and p.table_owner like upper(:table_owner)\n" // " and p.table_name like upper(:table_name)\n" // " order by p.partition_name\n" // " , s.subpartition_name\n", // "Table partitions", // "0801"); static toSQL SQLListViewPgSQL("toBrowser:ListView", "SELECT c.relname as View_Name\n" " FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid\n" " WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" " AND c.relkind = 'v'" " ORDER BY View_Name", "List the available views in a schema", "7.1", "PostgreSQL"); static toSQL SQLListView("toBrowser:ListView", "SELECT View_Name FROM SYS.ALL_VIEWS WHERE OWNER = :f1\n" " AND UPPER(VIEW_NAME) LIKE :f2\n" " ORDER BY View_Name", ""); static toSQL SQLListViewSapDb("toBrowser:ListView", "SELECT tablename \"View_Name\"\n" " FROM tables \n" " WHERE tabletype = 'VIEW' and owner = upper(:f1)\n" " ORDER by tablename", "", "", "SapDB"); static toSQL SQLListViewTD("toBrowser:ListView", "SELECT trim ( tablename ) AS \"View_Name\"\n" " FROM dbc.TABLES\n" " WHERE databasename = trim ( upper ( :f1 ) )\n" " AND tablekind = 'V'\n" " ORDER BY 1", "", "", "Teradata"); // static toSQL SQLViewSQLPgSQL("toBrowser:ViewSQL", // "SELECT pg_get_viewdef(c.relname)\n" // " FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid\n" // " WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" // " AND c.relkind = 'v' AND c.relname = :f2", // "Display SQL of a specified view", // "7.1", // "PostgreSQL"); // static toSQL SQLViewSQL("toBrowser:ViewSQL", // "SELECT Text SQL\n" // " FROM SYS.ALL_Views\n" // " WHERE Owner = :f1 AND View_Name = :f2", // ""); // static toSQL SQLViewSQLSapDb("toBrowser:ViewSQL", // "SELECT definition \"SQL\"\n" // " FROM viewdefs \n" // " WHERE viewname = :f2 and owner = upper(:f1)\n", // "", // "", // "SapDB"); static toSQL SQLListIndexMySQL3("toBrowser:ListIndex", "SHOW INDEX FROM :f1", "List the available indexes in a schema", "3.23", "MySQL"); static toSQL SQLListIndexMySQL("toBrowser:ListIndex", "select distinct table_name \"Tables with Indexes\"\n" " from information_schema.statistics\n" " where index_schema = :f1\n" " order by 1\n", "", "5.0", "MySQL"); static toSQL SQLListIndex("toBrowser:ListIndex", "SELECT Index_Name,NULL \" Ignore\",NULL \" Ignore2\",Tablespace_name \" Ignore2\"\n" " FROM SYS.ALL_INDEXES\n" " WHERE OWNER = :f1\n" " AND UPPER(INDEX_NAME) LIKE :f2\n" " ORDER BY Index_Name\n", ""); static toSQL SQLListIndexPgSQL("toBrowser:ListIndex", "SELECT c.relname AS \"Index Name\"\n" "FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid\n" "WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" " AND c.relkind = 'i'\n" "ORDER BY \"Index Name\"", "", "7.1", "PostgreSQL"); static toSQL SQLListIndexSapDb("toBrowser:ListIndex", "SELECT IndexName \"Index Name\"\n" " FROM indexes \n" " WHERE owner = upper(:f1)", "", "", "SapDB"); // static toSQL SQLIndexColsMySQL("toBrowser:IndexCols", // "SHOW INDEX FROM `:f1`.`:f2`", // "Display columns on which an index is built", // "3.23", // "MySQL"); // static toSQL SQLIndexCols("toBrowser:IndexCols", // "SELECT a.Table_Name,a.Column_Name,a.Column_Length,a.Descend,b.Column_Expression \" \"\n" // " FROM sys.All_Ind_Columns a,sys.All_Ind_Expressions b\n" // " WHERE a.Index_Owner = :f1 AND a.Index_Name = :f2\n" // " AND a.Index_Owner = b.Index_Owner(+) AND a.Index_Name = b.Index_Name(+)\n" // " AND a.column_Position = b.Column_Position(+)\n" // " ORDER BY a.Column_Position", // "", // "0801"); // static toSQL SQLIndexCols8("toBrowser:IndexCols", // "SELECT Table_Name,Column_Name,Column_Length,Descend\n" // " FROM SYS.ALL_IND_COLUMNS\n" // " WHERE Index_Owner = :f1 AND Index_Name = :f2\n" // " ORDER BY Column_Position", // "", // "0800"); // static toSQL SQLIndexCols7("toBrowser:IndexCols", // "SELECT Table_Name,Column_Name,Column_Length\n" // " FROM SYS.ALL_IND_COLUMNS\n" // " WHERE Index_Owner = :f1 AND Index_Name = :f2\n" // " ORDER BY Column_Position", // "", // "0703"); // static toSQL SQLIndexColsPgSQL("toBrowser:IndexCols", // "SELECT a.attname,\n" // " format_type(a.atttypid, a.atttypmod) as FORMAT,\n" // " a.attnotnull,\n" // " a.atthasdef\n" // " FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid,\n" // " pg_attribute a\n" // " WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" // " AND a.attrelid = c.oid AND c.relname = :f2\n" // " AND a.attnum > 0\n" // " ORDER BY a.attnum\n", // "", // "7.1", // "PostgreSQL"); // static toSQL SQLIndexColsSapDb("toBrowser:IndexCols", // "SELECT tablename,columnname,len \"Length\",DataType,Sort \n" // " FROM indexcolumns \n" // " WHERE owner = upper(:f1) and indexname = upper(:f2)\n" // " ORDER BY indexname,columnno", // "", // "", // "SapDB"); // static toSQL SQLIndexInfoSapDb("toBrowser:IndexInformation", // "SELECT INDEXNAME,TABLENAME, TYPE, CREATEDATE,CREATETIME,INDEX_USED, DISABLED \n" // " FROM indexes\n" // " WHERE owner = upper(:f1) and indexname = :f2\n", // "Display information about an index", // "", // "SapDB"); // static toSQL SQLIndexInfo("toBrowser:IndexInformation", // "SELECT * FROM SYS.ALL_INDEXES\n" // " WHERE Owner = :f1 AND Index_Name = :f2", // ""); // static toSQL SQLIndexStatistic("toBrowser:IndexStatstics", // "SELECT description \"Description\", value(char_value,numeric_value) \"Value\" \n" // " FROM indexstatistics \n" // " WHERE owner = upper(:f1) and indexname = :f2", // "Index Statistics", // "", // "SapDB"); static toSQL SQLListSequencePgSQL("toBrowser:ListSequence", "SELECT c.relname AS \"Sequence Name\"\n" " FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid\n" " WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" " AND c.relkind = 'S'\n" " ORDER BY \"Sequence Name\"", "List the available sequences in a schema", "7.1", "PostgreSQL"); static toSQL SQLListSequence("toBrowser:ListSequence", "SELECT Sequence_Name FROM SYS.ALL_SEQUENCES\n" " WHERE SEQUENCE_OWNER = :f1\n" " AND UPPER(SEQUENCE_NAME) LIKE :f2\n" " ORDER BY Sequence_Name", ""); // static toSQL SQLSequenceInfoPgSQL("toBrowser:SequenceInformation", // "SELECT *, substr(:f1,1) as \"Owner\" FROM :f2", // "Display information about a sequence", // "7.1", // "PostgreSQL"); // static toSQL SQLSequenceInfo("toBrowser:SequenceInformation", // "SELECT * FROM SYS.ALL_SEQUENCES\n" // " WHERE Sequence_Owner = :f1\n" // " AND Sequence_Name = :f2", // ""); static toSQL SQLListSynonym("toBrowser:ListSynonym", "SELECT DECODE(Owner,'PUBLIC','',Owner||'.')||Synonym_Name \"Synonym Name\"\n" " FROM Sys.All_Synonyms\n" " WHERE Table_Owner = :f1\n" " OR Owner = :f1\n" " AND UPPER(Synonym_Name) LIKE :f2\n" " ORDER BY Synonym_Name", "List the available synonyms in a schema"); // static toSQL SQLSynonymInfo("toBrowser:SynonymInformation", // "SELECT * FROM Sys.All_Synonyms a\n" // " WHERE Owner = :f1\n" // " AND Synonym_Name = :f2", // "Display information about a synonym"); // static toSQL SQLListSQLPgSQL("toBrowser:ListCode", // "SELECT p.proname AS Object_Name,\n" // " CASE WHEN p.prorettype = 0 THEN 'PROCEDURE'\n" // " ELSE 'FUNCTION'\n" // " END AS Object_Type\n" // "FROM pg_proc p LEFT OUTER JOIN pg_namespace n ON p.pronamespace=n.oid\n" // "WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" // "ORDER BY Object_Name", // "List the available Code objects in a schema", // "7.1", // "PostgreSQL"); // static toSQL SQLListSQL("toBrowser:ListCode", // "SELECT Object_Name,Object_Type,Status Type FROM SYS.ALL_OBJECTS\n" // " WHERE OWNER = :f1\n" // " AND Object_Type IN ('FUNCTION','PACKAGE',\n" // " 'PROCEDURE','TYPE')\n" // " AND UPPER(OBJECT_NAME) LIKE :f2\n" // " ORDER BY Object_Name", // ""); // static toSQL SQLListSQLShortPgSQL("toBrowser:ListCodeShort", // "SELECT p.proname AS Object_Name\n" // "FROM pg_proc p LEFT OUTER JOIN pg_namespace n ON p.pronamespace=n.oid\n" // "WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" // "ORDER BY Object_Name", // "List the available Code objects in a schema, one column version", // "7.1", // "PostgreSQL"); // static toSQL SQLListSQLShort("toBrowser:ListCodeShort", // "SELECT Object_Name Type FROM SYS.ALL_OBJECTS\n" // " WHERE OWNER = :f1\n" // " AND Object_Type IN ('FUNCTION','PACKAGE',\n" // " 'PROCEDURE','TYPE')\n" // " AND UPPER(OBJECT_NAME) LIKE :f2\n" // " ORDER BY Object_Name", // ""); // static toSQL SQLSQLTemplate("toBrowser:CodeTemplate", // "SELECT Text FROM SYS.ALL_SOURCE\n" // " WHERE Owner = :f1 AND Name = :f2\n" // " AND Type IN ('PACKAGE','PROCEDURE','FUNCTION','PACKAGE','TYPE')", // "Declaration of object displayed in template window"); // PostgreSQL does not distinguish between Head and Body for Stored SQL // package code will be returnd for both Head and Body // static toSQL SQLSQLHeadPgSQL("toBrowser:CodeHead", // "SELECT p.prosrc\n" // "FROM pg_proc p LEFT OUTER JOIN pg_namespace n ON p.pronamespace=n.oid\n" // "WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" // " AND p.proname = :f2\n", // "Declaration of object", // "7.1", // "PostgreSQL"); // static toSQL SQLSQLHead("toBrowser:CodeHead", // "SELECT Text FROM SYS.ALL_SOURCE\n" // " WHERE Owner = :f1 AND Name = :f2\n" // " AND Type IN ('PACKAGE','TYPE')", // ""); // // static toSQL SQLSQLBodyPgSQL("toBrowser:CodeBody", // "SELECT 'CREATE OR REPLACE FUNCTION ' || p.proname || ' ( ' ||\n" // "( SELECT array_to_string ( ARRAY ( SELECT t.typname\n" // " FROM pg_type t\n" // " WHERE t.OID = ANY ( p.proargtypes ) ),\n" // " ', ' ) ) || ' ) RETURNS ' || ( SELECT t.typname\n" // " from pg_type t\n" // " where p.prorettype = t.oid) ||\n" // " ' AS ' || quote_literal ( p.prosrc ) || ' language plpgsql;'\n" // " FROM pg_proc p\n" // " LEFT OUTER JOIN pg_namespace n\n" // " ON p.pronamespace = n.OID\n" // " WHERE ( n.nspname = :f1 OR n.OID IS NULL )\n" // " AND p.proname = :f2", // "Implementation of object", // "7.1", // "PostgreSQL"); // static toSQL SQLSQLBody("toBrowser:CodeBody", // "SELECT Text FROM SYS.ALL_SOURCE\n" // " WHERE Owner = :f1 AND Name = :f2\n" // " AND Type IN ('PROCEDURE','FUNCTION','PACKAGE BODY','TYPE BODY')", // ""); static toSQL SQLListTrigger("toBrowser:ListTrigger", "SELECT Trigger_Name FROM SYS.ALL_TRIGGERS\n" " WHERE OWNER = :f1\n" " AND UPPER(TRIGGER_NAME) LIKE :f2\n" " ORDER BY Trigger_Name", "List the available triggers in a schema"); // static toSQL SQLTriggerInfo("toBrowser:TriggerInfo", // "SELECT Owner,Trigger_Name,\n" // " Trigger_Type,Triggering_Event,\n" // " Table_Owner,Base_Object_Type,Table_Name,Column_Name,\n" // " Referencing_Names,When_Clause,Status,\n" // " Description,Action_Type\n" // " FROM SYS.ALL_TRIGGERS\n" // "WHERE Owner = :f1 AND Trigger_Name = :f2", // "Display information about a trigger", // "0801"); // static toSQL SQLTriggerInfo8("toBrowser:TriggerInfo", // "SELECT Owner,Trigger_Name,\n" // " Trigger_Type,Triggering_Event,\n" // " Table_Owner,Table_Name,\n" // " Referencing_Names,When_Clause,Status,\n" // " Description\n" // " FROM SYS.ALL_TRIGGERS\n" // "WHERE Owner = :f1 AND Trigger_Name = :f2", // "", // "0800"); // static toSQL SQLTriggerBody("toBrowser:TriggerBody", // "SELECT Trigger_Body FROM SYS.ALL_TRIGGERS\n" // " WHERE Owner = :f1 AND Trigger_Name = :f2", // "Implementation of trigger"); // static toSQL SQLTriggerCols("toBrowser:TriggerCols", // "SELECT Column_Name,Column_List \"In Update\",Column_Usage Usage\n" // " FROM SYS.ALL_TRIGGER_COLS\n" // " WHERE Trigger_Owner = :f1 AND Trigger_Name = :f2", // "Columns used by trigger"); // #if DBLINK static toSQL SQLListDBLink("toBrowser:ListDBLink", "SELECT Db_Link, Owner FROM SYS.ALL_DB_LINKS\n" " WHERE (Owner = :f1 or Owner='PUBLIC') and\n" " UPPER(DB_Link) like :f2", "List database links"); static toSQL SQLListDBLinkDBA("toBrowser:ListDBLinkDBA", "SELECT Owner, Db_Link, Username, Host, Created\n" " FROM SYS.DBA_DB_LINK\n", "List database links as DBA"); // static toSQL SQLDBLinkInfo("toBrowser:DBLinkInformation", // "SELECT * FROM Sys.all_db_links a\n" // " WHERE Owner = :f1\n" // " AND DB_LINK = :f2", // "Display information about database link"); // static toSQL SQLDBLinkSynonyms("toBrowser:DBLinkSynonyms", // "SELECT * FROM Sys.all_synonyms a\n" // " WHERE Owner = :f1\n" // " AND DB_LINK = :f2", // "Display foreign synonyms"); // #endif static toSQL SQLListDirectories("toBrowser:ListDirectories", "SELECT DISTINCT directory_name FROM SYS.ALL_DIRECTORIES\n" " WHERE (owner = 'SYS' or owner=:f1) and\n" " UPPER(directory_name) like :f2", " ORDER BY directory_name", "List database external directories"); static toSQL SQLMySQLAccess("toBrowser:MySQLAcess", "SHOW TABLES FROM mysql", "Show access tables for MySQL databases", "3.23", "MySQL"); static toSQL SQLMySQLUsers("toBrowser:MySQLUsers", "SELECT concat(user,'@',host) Users FROM mysql.user", "Show users for MySQL databases", "3.23", "MySQL"); static toSQL SQLTruncateTable("toBrowser:TruncateTable", "TRUNCATE TABLE %1.%2", "Truncate a table", "", "Any"); static toSQL SQLDropUser("toBrowser:DropUser", "DELETE FROM mysql.user WHERE concat(user,'@',host) = :f1", "Drop MYSQL user", "3.23", "MySQL"); toBrowser::toBrowser(QWidget *parent, toConnection &connection) : toToolWidget(BrowserTool, "browser.html", parent, connection, "toBrowser") { Filter = new toBrowserFilter(false); // man toolbar of the tool QToolBar *toolbar = toAllocBar(this, tr("DB Browser")); layout()->addWidget(toolbar); refreshAct = new QAction(QPixmap(const_cast(refresh_xpm)), tr("Update from DB"), this); refreshAct->setShortcut(QKeySequence::Refresh); connect(refreshAct, SIGNAL(triggered()), this, SLOT(refresh(void))); toolbar->addAction(refreshAct); toolbar->addSeparator(); FilterButton = new QAction(tr("&Define filter..."), toolbar); FilterButton->setCheckable(true); FilterButton->setIcon(QIcon(QPixmap(const_cast(filter_xpm)))); FilterButton->setToolTip(tr("Define the object filter")); connect(FilterButton, SIGNAL(triggered(bool)), this, SLOT(defineFilter())); FilterButton->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_G); toolbar->addAction(FilterButton); clearFilterAct = new QAction(QPixmap(const_cast(nofilter_xpm)), tr("Remove any object filter"), this); connect(clearFilterAct, SIGNAL(triggered()), this, SLOT(clearFilter(void))); clearFilterAct->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_H); toolbar->addAction(clearFilterAct); QLabel *strech; toolbar->addWidget(strech = new QLabel(toolbar)); strech->setAlignment(Qt::AlignRight | Qt::AlignVCenter); strech->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum)); Schema = new toResultSchema(connection, toolbar, TO_TOOLBAR_WIDGET_NAME); connect(Schema, SIGNAL(activated(int)), this, SLOT(changeSchema(int))); toolbar->addWidget(Schema); toolbar->addWidget(new QLabel(toolbar)); new toChangeConnection(toolbar, TO_TOOLBAR_WIDGET_NAME); // Main tab widget m_mainTab = new QTabWidget(this); layout()->addWidget(m_mainTab); // Tables tableSplitter = new QSplitter(Qt::Horizontal, m_mainTab); tableSplitter->setObjectName(TAB_TABLES); // m_mainTab->addTab(tableSplitter, tr("T&ables")); QWidget *tableWidget = new QWidget(tableSplitter); QVBoxLayout *tableLayout = new QVBoxLayout; tableLayout->setSpacing(0); tableLayout->setContentsMargins(0, 0, 0, 0); tableWidget->setLayout(tableLayout); QToolBar *tableToolbar = toAllocBar(tableWidget, tr("Database browser")); tableLayout->addWidget(tableToolbar); addTableAct = new QAction(QPixmap(const_cast(addtable_xpm)), tr("Create new table"), this); connect(addTableAct, SIGNAL(triggered()), this, SLOT(addTable(void))); tableToolbar->addAction(addTableAct); tableToolbar->addSeparator(); modTableAct = new QAction(QPixmap(const_cast(modtable_xpm)), tr("Modify table columns"), this); connect(modTableAct, SIGNAL(triggered()), this, SLOT(modifyTable(void))); tableToolbar->addAction(modTableAct); modConstraintAct = new QAction(QPixmap(const_cast(modconstraint_xpm)), tr("Modify constraints"), this); connect(modConstraintAct, SIGNAL(triggered()), this, SLOT(modifyConstraint(void))); tableToolbar->addAction(modConstraintAct); modIndexAct = new QAction(QPixmap(const_cast(modindex_xpm)), tr("Modify indexes"), this); connect(modIndexAct, SIGNAL(triggered()), this, SLOT(modifyIndex(void))); tableToolbar->addAction(modIndexAct); tableToolbar->addSeparator(); dropTableAct = new QAction(QPixmap(const_cast(trash_xpm)), tr("Drop table"), this); connect(dropTableAct, SIGNAL(triggered()), this, SLOT(dropTable(void))); tableToolbar->addAction(dropTableAct); tableToolbar->addSeparator(); enableConstraintAct = new QAction(QPixmap(const_cast(online_xpm)), tr("Enable constraint or trigger"), this); connect(enableConstraintAct, SIGNAL(triggered()), this, SLOT(enableConstraints(void))); tableToolbar->addAction(enableConstraintAct); disableConstraintAct = new QAction(QPixmap(const_cast(offline_xpm)), tr("Disable constraint or trigger"), this); connect(disableConstraintAct, SIGNAL(triggered()), this, SLOT(disableConstraints(void))); tableToolbar->addAction(disableConstraintAct); tableView = new toBrowserSchemaTableView(tableWidget); tableLayout->addWidget(tableView); tableView->setReadAll(true); tableView->setSQL(SQLListTables); setFocusProxy(tableView); tableWidget->resize(FIRST_WIDTH, tableView->height()); tableSplitter->setStretchFactor(tableSplitter->indexOf(tableWidget), 0); tableBrowserWidget = new toBrowserTableWidget(tableSplitter); tableSplitter->setStretchFactor(tableSplitter->indexOf(tableBrowserWidget), 1); connect(tableView, SIGNAL(selectionChanged()), this, SLOT(changeItem())); connect(tableView, SIGNAL(displayMenu(QMenu *)), this, SLOT(displayTableMenu(QMenu *))); m_objectsMap[tableSplitter] = tableView; m_browsersMap[tableSplitter] = tableBrowserWidget; // Views viewSplitter = new QSplitter(Qt::Horizontal, m_mainTab); viewSplitter->setObjectName(TAB_VIEWS); // m_mainTab->addTab(viewSplitter, tr("&Views")); viewView = new toBrowserSchemaTableView(viewSplitter); viewView->setReadAll(true); viewView->setSQL(SQLListView); viewView->resize(FIRST_WIDTH, viewView->height()); connect(viewView, SIGNAL(selectionChanged()), this, SLOT(changeItem())); // connect context menu for views connect(viewView, SIGNAL(displayMenu(QMenu *)), this, SLOT(displayViewMenu(QMenu *))); viewSplitter->setStretchFactor(viewSplitter->indexOf(viewView), 0); viewBrowserWidget = new toBrowserViewWidget(viewSplitter); viewSplitter->setStretchFactor(viewSplitter->indexOf(viewBrowserWidget), 1); m_objectsMap[viewSplitter] = viewView; m_browsersMap[viewSplitter] = viewBrowserWidget; dropViewAct = new QAction(QPixmap(const_cast(trash_xpm)), tr("Drop view"), this); connect(dropViewAct, SIGNAL(triggered()), this, SLOT(dropView(void))); // Indexes indexSplitter = new QSplitter(Qt::Horizontal, m_mainTab); indexSplitter->setObjectName(TAB_INDEX); // m_mainTab->addTab(indexSplitter, tr("Inde&xes")); QWidget * indexWidget = new QWidget(indexSplitter); QVBoxLayout * indexLayout = new QVBoxLayout; indexLayout->setSpacing(0); indexLayout->setContentsMargins(0, 0, 0, 0); indexWidget->setLayout(indexLayout); QToolBar * indexToolbar = toAllocBar(indexWidget, tr("Database browser")); indexLayout->addWidget(indexToolbar); addIndexesAct = new QAction(QPixmap(const_cast(addindex_xpm)), tr("Add indexes"), this); connect(addIndexesAct, SIGNAL(triggered()), this, SLOT(addIndex())); indexToolbar->addAction(addIndexesAct); indexToolbar->addSeparator(); indexToolbar->addAction(modIndexAct); indexToolbar->addSeparator(); dropIndexesAct = new QAction(QPixmap(const_cast(trash_xpm)), tr("Drop index"), this); connect(dropIndexesAct, SIGNAL(triggered()), this, SLOT(dropIndex())); indexToolbar->addAction(dropIndexesAct); indexView = new toBrowserSchemaTableView(indexWidget); indexLayout->addWidget(indexView); indexView->setReadAll(true); indexView->setTabWidget(m_mainTab); indexView->setSQL(SQLListIndex); connect(indexView, SIGNAL(selectionChanged()), this, SLOT(changeItem())); connect(indexView, SIGNAL(displayMenu(QMenu *)), this, SLOT(displayIndexMenu(QMenu *))); indexWidget->resize(FIRST_WIDTH, indexView->height()); indexSplitter->setStretchFactor(indexSplitter->indexOf(indexWidget), 0); indexBrowserWidget = new toBrowserIndexWidget(indexSplitter); indexSplitter->setStretchFactor(indexSplitter->indexOf(indexBrowserWidget), 1); m_objectsMap[indexSplitter] = indexView; m_browsersMap[indexSplitter] = indexBrowserWidget; // Sequences sequenceSplitter = new QSplitter(Qt::Horizontal, m_mainTab); sequenceSplitter->setObjectName(TAB_SEQUENCES); // m_mainTab->addTab(sequenceSplitter, tr("Se&quences")); sequenceView = new toBrowserSchemaTableView(sequenceSplitter); sequenceView->setReadAll(true); sequenceView->setSQL(SQLListSequence); sequenceView->resize(FIRST_WIDTH, sequenceView->height()); connect(sequenceView, SIGNAL(selectionChanged()), this, SLOT(changeItem())); sequenceSplitter->setStretchFactor(sequenceSplitter->indexOf(sequenceView), 0); sequenceBrowserWidget = new toBrowserSequenceWidget(sequenceSplitter); sequenceSplitter->setStretchFactor(sequenceSplitter->indexOf(sequenceBrowserWidget), 1); m_objectsMap[sequenceSplitter] = sequenceView; m_browsersMap[sequenceSplitter] = sequenceBrowserWidget; // Synonyms synonymSplitter = new QSplitter(Qt::Horizontal, m_mainTab); synonymSplitter->setObjectName(TAB_SYNONYM); // m_mainTab->addTab(synonymSplitter, tr("S&ynonyms")); synonymView = new toBrowserSchemaTableView(synonymSplitter); synonymView->setReadAll(true); synonymView->setSQL(SQLListSynonym); synonymView->resize(FIRST_WIDTH, synonymView->height()); connect(synonymView, SIGNAL(selectionChanged()), this, SLOT(changeItem())); synonymSplitter->setStretchFactor(synonymSplitter->indexOf(synonymView), 0); synonymBrowserWidget = new toBrowserSynonymWidget(synonymSplitter); synonymSplitter->setStretchFactor(synonymSplitter->indexOf(synonymBrowserWidget), 1); m_objectsMap[synonymSplitter] = synonymView; m_browsersMap[synonymSplitter] = synonymBrowserWidget; // Codes codeSplitter = new QSplitter(Qt::Horizontal, m_mainTab); codeSplitter->setObjectName(TAB_PLSQL); // m_mainTab->addTab(codeSplitter, tr("Cod&e")); codeView = new toBrowserSchemaCodeBrowser(codeSplitter); // codeView->setReadAll(true); // codeView->setSQL(SQLListSQL); codeView->resize(FIRST_WIDTH*2, codeView->height()); connect(codeView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(changeItem(const QModelIndex &))); codeSplitter->setStretchFactor(codeSplitter->indexOf(codeView), 0); codeBrowserWidget = new toBrowserCodeWidget(codeSplitter); codeSplitter->setStretchFactor(codeSplitter->indexOf(codeBrowserWidget), 1); m_objectsMap[codeSplitter] = codeView; m_browsersMap[codeSplitter] = codeBrowserWidget; // Triggers triggerSplitter = new QSplitter(Qt::Horizontal, m_mainTab); triggerSplitter->setObjectName(TAB_TRIGGER); // m_mainTab->addTab(triggerSplitter, tr("Tri&ggers")); triggerView = new toBrowserSchemaTableView(triggerSplitter); triggerView->setReadAll(true); triggerView->setSQL(SQLListTrigger); triggerView->resize(FIRST_WIDTH, triggerView->height()); connect(triggerView, SIGNAL(selectionChanged()), this, SLOT(changeItem())); triggerSplitter->setStretchFactor(triggerSplitter->indexOf(triggerView), 0); triggerBrowserWidget = new toBrowserTriggerWidget(triggerSplitter); triggerSplitter->setStretchFactor(triggerSplitter->indexOf(triggerBrowserWidget), 1); m_objectsMap[triggerSplitter] = triggerView; m_browsersMap[triggerSplitter] = triggerBrowserWidget; // #ifdef DBLINK dblinkSplitter = new QSplitter(Qt::Horizontal, m_mainTab); dblinkSplitter->setObjectName(TAB_DBLINK); // m_mainTab->addTab(dblinkSplitter, tr("DBLinks")); QWidget * dblinkWidget = new QWidget(dblinkSplitter); QVBoxLayout * dblinkLayout = new QVBoxLayout; dblinkLayout->setSpacing(0); dblinkLayout->setContentsMargins(0, 0, 0, 0); dblinkWidget->setLayout(dblinkLayout); QToolBar * dblinkToolbar = toAllocBar(dblinkWidget, tr("Database browser")); dblinkLayout->addWidget(dblinkToolbar); dblinkView = new toBrowserSchemaTableView(dblinkWidget); dblinkBrowserWidget = new toBrowserDBLinksWidget(dblinkSplitter); testDBLinkAct = new QAction(QPixmap(const_cast(modconstraint_xpm)), tr("Test DBLink"), this); connect(testDBLinkAct, SIGNAL(triggered()), dblinkBrowserWidget, SLOT(testDBLink())); dblinkToolbar->addAction(testDBLinkAct); dblinkLayout->addWidget(dblinkView); dblinkView->setReadAll(true); dblinkView->setSQL(SQLListDBLink); dblinkView->resize(FIRST_WIDTH, dblinkView->height()); connect(dblinkView, SIGNAL(selectionChanged()), this, SLOT(changeItem())); // connect(dblinkView, // SIGNAL(displayMenu(QMenu *)), // this, // SLOT(displayIndexMenu(QMenu *))); dblinkWidget->resize(FIRST_WIDTH, dblinkView->height()); dblinkSplitter->setStretchFactor(dblinkSplitter->indexOf(dblinkView), 0); dblinkSplitter->setStretchFactor(dblinkSplitter->indexOf(dblinkBrowserWidget), 1); m_objectsMap[dblinkSplitter] = dblinkView; m_browsersMap[dblinkSplitter] = dblinkBrowserWidget; // #endif // dblink directoriesSplitter = new QSplitter(Qt::Horizontal, m_mainTab); directoriesSplitter->setObjectName(TAB_DIRECTORIES); QWidget * directoriesWidget = new QWidget(directoriesSplitter); QVBoxLayout * directoriesLayout = new QVBoxLayout; directoriesLayout->setSpacing(0); directoriesLayout->setContentsMargins(0, 0, 0, 0); directoriesWidget->setLayout(directoriesLayout); directoriesView = new toBrowserSchemaTableView(directoriesWidget); directoriesBrowserWidget = new toBrowserDirectoriesWidget(directoriesSplitter); directoriesLayout->addWidget(directoriesView); directoriesView->setReadAll(true); directoriesView->setSQL(SQLListDirectories); directoriesView->resize(FIRST_WIDTH, directoriesView->height()); connect(directoriesView, SIGNAL(selectionChanged()), this, SLOT(changeItem())); // connect(directoriesView, // SIGNAL(displayMenu(QMenu *)), // this, // SLOT(displayIndexMenu(QMenu *))); directoriesWidget->resize(FIRST_WIDTH, directoriesView->height()); directoriesSplitter->setStretchFactor(directoriesSplitter->indexOf(directoriesView), 0); directoriesSplitter->setStretchFactor(directoriesSplitter->indexOf(directoriesBrowserWidget), 1); m_objectsMap[directoriesSplitter] = directoriesView; m_browsersMap[directoriesSplitter] = directoriesBrowserWidget; accessSplitter = new QSplitter(Qt::Horizontal, m_mainTab); accessSplitter->setObjectName(TAB_ACCESS); // m_mainTab->addTab(accessSplitter, tr("Access")); #ifdef TOEXTENDED_MYSQL // This is propably never compiled... and never worked... QWidget * accessWidget = new QWidget(accessSplitter); QVBoxLayout *accessLayout = new QVBoxLayout; accessLayout->setSpacing(0); accessLayout->setContentsMargins(0, 0, 0, 0); accessWidget->setLayout(accessLayout); QToolBar * accessToolBar = toAllocBar(box, tr("Database browser")); accessLayout->addWidget(accessToolBar); QAction * addUserAct = accessToolBar->addAction(QPixmap(const_cast(new_xpm)), tr("Add user"), this, SLOT(addUser())); QAction * dropUserAct = accessToolBar->addAction(QPixmap(const_cast(trash_xpm)), tr("Drop user"), this, SLOT(dropUser())); accessView = new toBrowserSchemaTableView(accessWidget); accessView->setSQL(SQLMySQLUsers); accessView->setReadAll(true); AccessContent = NULL; accessLayout->addWidget(accessView); accessWidget->resize(FIRST_WIDTH, accessView->height()); #else accessView = new toBrowserSchemaTableView(accessSplitter); accessView->resize(FIRST_WIDTH, accessView->height()); accessView->setSQL(SQLMySQLAccess); accessView->setReadAll(true); #endif accessBrowserWidget = new toBrowserAccessWidget(accessSplitter); accessSplitter->setStretchFactor(accessSplitter->indexOf(accessView), 0); accessSplitter->setStretchFactor(accessSplitter->indexOf(accessBrowserWidget), 1); m_objectsMap[accessSplitter] = accessView; m_browsersMap[accessSplitter] = accessBrowserWidget; connect(accessView, SIGNAL(selectionChanged()), this, SLOT(changeItem())); // End of tabs. Now the common things are comming... ToolMenu = NULL; connect(toMainWidget()->workspace(), SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(windowActivated(QMdiSubWindow *))); Schema->setFocus(); changeConnection(); connect(this, SIGNAL(connectionChange()), this, SLOT(changeConnection())); connect(m_mainTab, SIGNAL(currentChanged(int)), this, SLOT(mainTab_currentChanged(int))); } void toBrowser::mainTab_currentChanged(int /*ix*/) { if (Schema->selected().isEmpty()) return; // It can be called when there is no widget at all // e.g. from refresh(). Exit silently in this case. if (!m_mainTab->currentWidget()) return; QSplitter * ix = qobject_cast(m_mainTab->currentWidget()); Q_ASSERT_X(ix, "toBrowser::mainTab_currentChanged", "main widget of the tab is not QSplitter as is mandatory!"); if (m_objectsMap.contains(ix)) { m_objectsMap[ix]->changeParams(schema(), Filter ? Filter->wildCard() : "%"); changeItem(); } else qDebug() << "mainTab_currentChanged unhandled index:" << ix; } void toBrowser::windowActivated(QMdiSubWindow *widget) { if (!widget) return; if (widget->widget() == this) { if (!ToolMenu) { ToolMenu = new QMenu(tr("&Browser"), this); ToolMenu->addAction(refreshAct); ToolMenu->addSeparator(); ToolMenu->addAction(FilterButton); ToolMenu->addAction(clearFilterAct); toMainWidget()->addCustomMenu(ToolMenu); } } else { delete ToolMenu; ToolMenu = NULL; } } QString toBrowser::schema(void) { try { QString ret = Schema->selected(); if (ret == tr("No schemas")) return connection().database(); return ret; } catch (...) { return QString::null; } } void toBrowser::setNewFilter(toBrowserFilter *filter) { if (Filter) { delete Filter; Filter = NULL; } if (filter) Filter = filter; else Filter = new toBrowserFilter(); FilterButton->setChecked(filter); refresh(); } void toBrowser::addUser() { #ifdef TOEXTENDED_MYSQL UserPanel->changeParams(QString::null, QString::null); #endif } void toBrowser::dropUser() { #ifdef TOEXTENDED_MYSQL // This propably never woked... try { AccessPanel->dropCurrentAccess(); connection().execute(SQLDropUser, selectedItem()->text(0)); flushPrivs(); refresh(); } TOCATCH #endif } void toBrowser::changeSchema(int) { refresh(); } toBrowser::~toBrowser() { if (Filter) delete Filter; } void toBrowser::refresh(void) { try { Schema->refresh(); mainTab_currentChanged(m_mainTab->currentIndex()); } TOCATCH } void toBrowser::changeConnection(void) { m_mainTab->blockSignals(true); Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST)); if ( ! connection().schema().isEmpty() ) { // No need to upperize the string. Oracle has it uppercased already, // mysql nad pgsql require it as lowercase. Schema->setSelected(connection().schema());//.toUpper()); } else if (toIsMySQL(connection())) { Schema->setSelected(connection().database()); } else if (toIsOracle(connection()) || toIsSapDB(connection())) { Schema->setSelected(connection().user().toUpper()); } else { Schema->setSelected(connection().user()); } // enable/disable main tabs depending on DB m_mainTab->clear(); addTab(tableSplitter, tr("T&ables"), true); addTab(viewSplitter, tr("&Views"), !toIsMySQL(connection())); addTab(indexSplitter, tr("Inde&xes"), true); addTab(sequenceSplitter, tr("Se&quences"), toIsOracle(connection()) || toIsPostgreSQL(connection())); addTab(synonymSplitter, tr("S&ynonyms"), toIsOracle(connection())); // 2010-03-31 // Starting with version 5.0 MySQL supports stored functions/procedures // If TOra is used a lot with older versions of MySQL the "true" parameter // should be enhanced with a check for MySQL version addTab(codeSplitter, tr("Cod&e"), true); addTab(triggerSplitter, tr("Tri&ggers"), !toIsMySQL(connection()) && !toIsPostgreSQL(connection())); addTab(dblinkSplitter, tr("DBLinks"), toIsOracle(connection())); addTab(directoriesSplitter, tr("Directories"), toIsOracle(connection())); addTab(accessSplitter, tr("Access"), toIsMySQL(connection())); foreach (toBrowserBaseWidget * w, m_browsersMap.values()) w->changeConnection(); m_mainTab->setCurrentIndex(0); m_mainTab->blockSignals(false); refresh(); } void toBrowser::addTab(QSplitter * page, const QString & label, bool enable) { page->setVisible(enable); if (!enable) return; m_mainTab->addTab(page, label); } QString toBrowser::currentItemText(int col) { QSplitter * ix = qobject_cast(m_mainTab->currentWidget()); Q_ASSERT_X(ix, "toBrowser::currentItemText", "main widget of the tab is not QSplitter as is mandatory!"); if (m_objectsMap.contains(ix)) { // return m_objectsMap[ix]->selectedIndex(1).data(Qt::EditRole).toString(); return m_objectsMap[ix]->objectName(); } return ""; } void toBrowser::changeItem() { QSplitter * ix = qobject_cast(m_mainTab->currentWidget()); Q_ASSERT_X(ix, "toBrowser::changeItem", "main widget of the tab is not QSplitter as is mandatory!"); if (m_browsersMap.contains(ix)) { if (ix != codeSplitter) m_browsersMap[ix]->changeParams(schema(), currentItemText()); else { // If code browser has been clicked we need to know type of code (function, procedure...) too // as it is not possible to identify code by just schema and object (in MySQL there can be // a function and procedure with the same name in the same schema) toBrowserSchemaCodeBrowser * browser = dynamic_cast(m_objectsMap[ix]); if (!browser) { qDebug("Only for code - toBrowserSchemaCodeBrowser cast!"); return; } m_browsersMap[ix]->changeParams(schema(), currentItemText(), browser->objectType()); } } else qDebug() << "changeItem() unhandled index" << ix; } void toBrowser::changeItem(const QModelIndex &) { // It's called only from the code view QSplitter * ix = qobject_cast(m_mainTab->currentWidget()); if (ix != codeSplitter) { qDebug("Only for code - QSplitter cast!"); return; } changeItem(); toBrowserSchemaCodeBrowser * browser = dynamic_cast(m_objectsMap[ix]); if (!browser) { qDebug("Only for code - toBrowserSchemaCodeBrowser cast!"); return; } if (browser->objectType() == "SPEC") m_browsersMap[ix]->setCurrentIndex(toBrowserCodeWidget::SpecTab); else if (browser->objectType() == "BODY") m_browsersMap[ix]->setCurrentIndex(toBrowserCodeWidget::BodyTab); else if (browser->objectType() == "TYPE") m_browsersMap[ix]->setCurrentIndex(toBrowserCodeWidget::SpecTab); else if (browser->objectType() == "PROCEDURE" || browser->objectType() == "FUNCTION") m_browsersMap[ix]->setCurrentIndex(toBrowserCodeWidget::BodyTab); } void toBrowser::clearFilter(void) { setNewFilter(NULL); } void toBrowser::defineFilter(void) { if (Filter) { toBrowserFilterSetup filt(false, *Filter, this); if (filt.exec()) setNewFilter(filt.getSetting()); } else { toBrowserFilterSetup filt(false, this); if (filt.exec()) setNewFilter(filt.getSetting()); } if (!Filter) FilterButton->setChecked(false); else FilterButton->setChecked(!Filter->isEmpty()); } bool toBrowser::canHandle(toConnection &conn) { return toIsOracle(conn) || toIsPostgreSQL(conn) || toIsMySQL(conn) || toIsSapDB(conn); } void toBrowser::modifyTable(void) { if (m_mainTab->currentWidget() != tableSplitter) return; // only tabs allowed toBrowserTable::editTable(connection(), schema(), currentItemText(), this); refresh(); } void toBrowser::addTable(void) { toBrowserTable::newTable(connection(), Schema->selected(), this); refresh(); } void toBrowser::modifyConstraint(void) { if (m_mainTab->currentWidget() != tableSplitter) return; toBrowserConstraint::modifyConstraint(connection(), schema(), tableBrowserWidget->object(), this); refresh(); } void toBrowser::modifyIndex(void) { toBrowserIndex::modifyIndex(connection(), schema(), tableBrowserWidget->object(), this, currentItemText()); refresh(); } void toBrowser::addIndex(void) { toBrowserIndex::addIndex(connection(), schema(), tableBrowserWidget->object(), this); refresh(); } void toBrowser::displayTableMenu(QMenu *menu) { menu->addSeparator(); menu->addAction(dropTableAct); menu->addAction(tr("Truncate table"), this, SLOT(truncateTable())); menu->addSeparator(); if (toIsMySQL(connection())) { menu->addAction(tr("Check table"), this, SLOT(checkTable())); menu->addAction(tr("Optimize table"), this, SLOT(optimizeTable())); menu->addAction(tr("Analyze table"), this, SLOT(analyzeTable())); menu->addAction(tr("Change type"), this, SLOT(changeType())); menu->addSeparator(); } menu->addAction(modConstraintAct); menu->addAction(modIndexAct); menu->addAction(addTableAct); menu->addSeparator(); menu->addAction(refreshAct); } void toBrowser::displayViewMenu(QMenu *menu) { menu->addSeparator(); menu->addAction(dropViewAct); } // displayViewMenu void toBrowser::displayIndexMenu(QMenu *menu) { menu->addSeparator(); menu->addAction(QIcon(trash_xpm), tr("Drop index"), this, SLOT(dropIndex())); menu->addAction(QIcon(modindex_xpm), tr("Modify index"), this, SLOT(modifyIndex())); menu->addAction(QIcon(addindex_xpm), tr("Create index"), this, SLOT(addIndex())); menu->addSeparator(); menu->addAction(QIcon(refresh_xpm), tr("Refresh"), this, SLOT(refresh())); } void toBrowser::dropSomething(const QString &type, const QString &what) { if (what.isEmpty()) return ; if (TOMessageBox::warning(this, tr("Dropping %1?").arg(tr(type.toAscii().constData())), tr("Are you sure you want to drop the %1 %2.%3?\n" "This action can not be undone!").arg(tr(type.toAscii().constData())).arg( Schema->selected()).arg(what), tr("&Yes"), tr("&Cancel"), QString::null, 0) == 0) { std::list ctx; toPush(ctx, Schema->selected()); toPush(ctx, type.toUpper()); QStringList parts = what.split("."); if (parts.count() > 1) { toPush(ctx, parts[1]); toPush(ctx, QString("ON")); toPush(ctx, parts[0]); } else { toPush(ctx, what); } std::list drop; toExtract::addDescription(drop, ctx); std::list empty; try { toExtract extractor(connection(), NULL); extractor.setIndexes(false); extractor.setConstraints(false); extractor.setPrompt(false); extractor.setHeading(false); std::list objToDrop; QString o = type.toUpper() + ":" + Schema->selected() + "." + what; objToDrop.push_back(o); QString sql = extractor.drop(objToDrop); std::list statements = toSQLParse::parse(sql, connection()); QProgressDialog prog(tr("Executing %1 change script").arg(tr(type.toAscii().constData())), tr("Stop"), 0, statements.size(), this); prog.setWindowTitle(tr("Performing %1 changes").arg(tr(type.toAscii().constData()))); for (std::list::iterator j = statements.begin(); j != statements.end(); j++) { QString sql = toSQLParse::indentStatement(*j, connection()); int i = sql.length() - 1; while (i >= 0 && (sql.at(i) == ';' || sql.at(i).isSpace())) i--; if (i >= 0) connection().execute(sql.mid(0, i + 1)); qApp->processEvents(); if (prog.wasCanceled()) throw tr("Canceled ongoing %1 modification, %2 might be corrupt").arg(tr(type.toAscii().constData())).arg(tr(type.toAscii().constData())); } } TOCATCH } // refresh(); no refresh goes here as it can be called from loop } void toBrowser::dropTable(void) { if (m_mainTab->currentWidget() != tableSplitter) return; // only tabs allowed for (toResultTableView::iterator it(tableView); (*it).isValid(); it++) { if (tableView->isRowSelected(*it)) dropSomething("TABLE", (*it).data(Qt::EditRole).toString()); } refresh(); } void toBrowser::dropView(void) { if (m_mainTab->currentWidget() != viewSplitter) return; // only views allowed for (toResultTableView::iterator it(viewView); (*it).isValid(); it++) { if (viewView->isRowSelected(*it)) dropSomething("VIEW", (*it).data(Qt::EditRole).toString()); } refresh(); } // dropView void toBrowser::truncateTable(void) { if (m_mainTab->currentWidget() != tableSplitter) return; // only tabs allowed bool force = false; for (toResultTableView::iterator it(tableView); (*it).isValid(); it++) { if (tableView->isRowSelected(*it)) { switch (force ? 0 : TOMessageBox::warning(this, tr("Truncate table?"), tr("Are you sure you want to truncate the table %2.%3,\n" "this action can not be undone?").arg( schema()).arg((*it).data(Qt::EditRole).toString()), tr("&Yes"), tr("Yes to &all"), tr("&Cancel"), 0)) { case 1 : force = true; // Intentionally no break here. case 0: connection().execute( toSQL::string(SQLTruncateTable, connection()). arg(connection().quote(schema())). arg(connection().quote((*it).data(Qt::EditRole).toString()))); break; case 2: return; } } } refresh(); } void toBrowser::checkTable(void) { QString sql; if (m_mainTab->currentWidget() != tableSplitter) return; // only tabs allowed for (toResultTableView::iterator it(tableView); (*it).isValid(); it++) { if (tableView->isRowSelected(*it)) { if (sql.isEmpty()) sql = "CHECK TABLE "; else sql += ", "; sql += connection().quote(schema()) + "." + connection().quote((*it).data(Qt::EditRole).toString()); } } if (!sql.isEmpty()) { toResultTableView *result = new toResultTableView(true, false, this); result->setWindowFlags(Qt::Window); result->setAttribute(Qt::WA_DeleteOnClose); result->query(sql); result->show(); } } void toBrowser::optimizeTable(void) { QString sql; if (m_mainTab->currentWidget() != tableSplitter) return; // only tabs allowed for (toResultTableView::iterator it(tableView); (*it).isValid(); it++) { if (tableView->isRowSelected(*it)) { if (sql.isEmpty()) sql = "OPTIMIZE TABLE "; else sql += ", "; sql += connection().quote(Schema->selected()) + "." + connection().quote((*it).data(Qt::EditRole).toString()); } } if (!sql.isEmpty()) { toResultTableView *result = new toResultTableView(true, false, this); result->setWindowFlags(Qt::Window); result->setAttribute(Qt::WA_DeleteOnClose); result->query(sql); result->show(); } } void toBrowser::changeType(void) { if (m_mainTab->currentWidget() != tableSplitter) return; // only tabs allowed bool ok; QString text = QInputDialog::getText(this, "Change table type", "Enter new table type", QLineEdit::Normal, "MyISAM", &ok); if (ok && !text.isEmpty()) { for (toResultTableView::iterator it(tableView); (*it).isValid(); it++) { if (tableView->isRowSelected(*it)) { QString sql = "ALTER TABLE "; sql += connection().quote(schema()) + "." + connection().quote((*it).data(Qt::EditRole).toString()); sql += " TYPE = " + text; try { connection().execute(sql); } TOCATCH } } } } void toBrowser::analyzeTable(void) { if (m_mainTab->currentWidget() != tableSplitter) return; // only tabs allowed QString sql; for (toResultTableView::iterator it(tableView); (*it).isValid(); it++) { if (tableView->isRowSelected(*it)) { if (sql.isEmpty()) sql = "ANALYZE TABLE "; else sql += ", "; sql += connection().quote(schema()) + "." + connection().quote((*it).data(Qt::EditRole).toString()); } } if (!sql.isEmpty()) { toResultTableView *result = new toResultTableView(true, false, this); result->setWindowFlags(Qt::Window); result->setAttribute(Qt::WA_DeleteOnClose); result->query(sql); result->show(); } } void toBrowser::dropIndex(void) { if (m_mainTab->currentWidget() == indexSplitter) { for (toResultTableView::iterator it(indexView); (*it).isValid(); it++) { if (indexView->isRowSelected(*it)) { dropSomething("INDEX", (*it).data(Qt::EditRole).toString()); } } return; } // TODO/FIXME: implement deleting from table tab qDebug() << "toBrowser::dropIndex()" << "indexes can be dropped only directly from indexes tab"; // for (toResultTableView::iterator it(FirstTab); (*it).isValid(); it++) // { // if (FirstTab->isRowSelected(*it)) // { // QModelIndex sec = FirstTab->model()->index((*it).row(), 2); // QString index = sec.data(Qt::EditRole).toString(); // if (index != "PRIMARY" && !(*it).data(Qt::EditRole).toString().isEmpty()) // dropSomething("INDEX", (*it).data(Qt::EditRole).toString() + "." + index); // else // dropSomething("INDEX", (*it).data(Qt::EditRole).toString()); // } // } } void toBrowser::closeEvent(QCloseEvent *event) { bool acceptEvent = true; foreach (toBrowserBaseWidget * w, m_browsersMap.values()) acceptEvent &= w->maybeSave(); if (acceptEvent) event->accept(); else event->ignore(); } bool toBrowser::close() { #ifdef TOEXTENDED_MYSQL UserPanel->saveChanges(); #endif return toToolWidget::close(); } void toBrowser::exportData(std::map &data, const QString &prefix) { // TODO/FIXME qDebug() << "void toBrowser::exportData(std::map &data, const QString &prefix)"; /* data[prefix + ":Schema"] = Schema->selected(); data[prefix + ":FirstTab"] = TopTab->currentWidget()->objectName(); data[prefix + ":SecondText"] = SecondText; for (std::map::iterator i = SecondMap.begin();i != SecondMap.end();i++) { if ((*i).second == SecondTab && Map.find((*i).first) == Map.end()) { data[prefix + ":SecondTab"] = (*i).first; break; } } ViewContent->exportData(data, prefix + ":View"); TableContent->exportData(data, prefix + ":Table"); if (AccessContent) AccessContent->exportData(data, prefix + ":Hosts"); toToolWidget::exportData(data, prefix); if (Filter) Filter->exportData(data, prefix + ":Filter");*/ } void toBrowser::importData(std::map &data, const QString &prefix) { // TODO/FIXME qDebug() << "void toBrowser::importData(std::map &data, const QString &prefix)"; /* disconnect(Schema, SIGNAL(activated(int)), this, SLOT(changeSchema(int))); disconnect(TopTab, SIGNAL(currentTabChanged(QWidget *)), this, SLOT(changeTab(QWidget *))); ViewContent->importData(data, prefix + ":View"); TableContent->importData(data, prefix + ":Table"); if (AccessContent) AccessContent->importData(data, prefix + ":Hosts"); if (data.find(prefix + ":Filter:Type") != data.end()) { toBrowserFilter *filter = new toBrowserFilter; filter->importData(data, prefix + ":Filter"); setNewFilter(filter); } else setNewFilter(NULL); toToolWidget::importData(data, prefix); QString str = data[prefix + ":Schema"]; Schema->setSelected(str); for (int i = 0;i < Schema->count();i++) if (Schema->itemText(i) == str) Schema->setCurrentIndex(i); str = data[prefix + ":FirstTab"]; QWidget *chld = findChild(str); if (chld && str.length()) { SecondText = QString::null; TopTab->setCurrentIndex(TopTab->indexOf(chld)); toResultTableView *newtab = Map[chld->objectName()]; if (newtab != FirstTab && newtab) { CurrentTop = chld; setFocusProxy(newtab); FirstTab = newtab; } str = data[prefix + ":SecondTab"]; chld = findChild(str); if (chld && str.length()) { QWidget *par = chld->parentWidget(); while (par && !par->inherits("toTabWidget")) par = par->parentWidget(); if (par) { toTabWidget *tab = dynamic_cast(par); if (tab) tab->setCurrentIndex(tab->indexOf(chld)); } changeSecondTab(chld); } SecondText = data[prefix + ":SecondText"]; } connect(Schema, SIGNAL(activated(int)), this, SLOT(changeSchema(int))); connect(TopTab, SIGNAL(currentTabChanged(QWidget *)), this, SLOT(changeTab(QWidget *))); refresh();*/ } #if 0 void toBrowser::fixIndexCols(void) { if (toIsOracle(connection())) { toResultTableView *tmp = dynamic_cast(SecondMap[TAB_INDEX_COLS]); if (tmp) for (toTreeWidgetItem *item = tmp->firstChild(); item; item = item->nextSibling()) { if (!toUnnull(item->text(4)).isNull()) { toResultViewItem * resItem = dynamic_cast(item); if (resItem) resItem->setText(1, resItem->allText(4)); } } } else if (toIsMySQL(connection())) { toResultTableView *second = dynamic_cast(SecondMap[TAB_INDEX_COLS]); if (FirstTab && second) { QModelIndex item = selectedItem(1); if (item.isValid()) { QString index = item.data(Qt::EditRole).toString(); for (toTreeWidgetItem *item = second->firstChild(); item;) { toTreeWidgetItem *t = item->nextSibling(); if (item->text(2) != index) { delete item; second->clearParams(); // Make sure it is reexecuted even if same table. } item = t; } } } } } #endif // static toBrowseTemplate BrowseTemplate; // void toBrowseTemplate::removeDatabase(const QString &name) // { // for (std::list::iterator i = Parents.begin();i != Parents.end();i++) // { // for (toTreeWidgetItem *item = (*i)->firstChild();item;item = item->nextSibling()) // if (item->text(0) == name) // { // delete item; // break; // } // } // } // // void toBrowseTemplate::defineFilter(void) // { // if (Filter) // { // toBrowserFilterSetup filt(true, *Filter, toMainWidget()); // if (filt.exec()) // { // delete Filter; // Filter = filt.getSetting(); // } // } // else // { // toBrowserFilterSetup filt(true, toMainWidget()); // if (filt.exec()) // Filter = filt.getSetting(); // } // if (Filter) // { // disconnect(FilterButton, SIGNAL(toggled(bool)), this, SLOT(defineFilter())); // FilterButton->setChecked(true); // connect(FilterButton, SIGNAL(toggled(bool)), this, SLOT(defineFilter())); // } // } // // void toBrowseTemplate::clearFilter(void) // { // delete Filter; // Filter = new toBrowserFilter; // disconnect(FilterButton, SIGNAL(toggled(bool)), this, SLOT(defineFilter())); // FilterButton->setChecked(false); // connect(FilterButton, SIGNAL(toggled(bool)), this, SLOT(defineFilter())); // } // // void toBrowseTemplate::removeItem(toTreeWidgetItem *item) // { // for (std::list::iterator i = Parents.begin();i != Parents.end();i++) // if ((*i) == item) // { // Parents.erase(i); // break; // } // } // // class toTemplateTableItem : public toTemplateItem // { // toConnection &Connection; // public: // toTemplateTableItem(toConnection &conn, toTemplateItem *parent, // const QString &name) // : toTemplateItem(parent, name), Connection(conn) {} // virtual QWidget *selectedWidget(QWidget *par) // { // QString ptyp = parent()->parent()->text(0); // QString object = parent()->text(0); // QString typ = text(0); // QString schema = parent()->parent()->parent()->text(0); // if (ptyp == "Synonyms") // { // int pos = object.indexOf(QString::fromLatin1(".")); // if (pos >= 0) // { // schema = object.mid(0, pos); // object = object.mid(pos + 1); // } // else // { // schema = QString::fromLatin1("PUBLIC"); // } // } // // if (schema == qApp->translate("toBrowser", "No schemas")) // schema = Connection.database(); // // toResult *res; // // toToolWidget *tool = new toToolWidget(BrowserTool, // "", // par, // Connection); // if (typ == qApp->translate("toBrowser", "Data")) // { // toResultData *cnt = new toResultData(tool); // cnt->changeParams(schema, object); // return tool; // } // else if (typ == qApp->translate("toBrowser", "Indexes")) // { // toResultTableView *tv = new toResultTableView(true, false, tool); // tv->setReadAll(true); // tv->setSQL(SQLTableIndex); // res = tv; // } // else if (typ == qApp->translate("toBrowser", "Extents")) // { // new toResultExtent(tool); // return tool; // } // else if (typ == qApp->translate("toBrowser", "Constraints")) // { // toResultTableView *tv = new toResultTableView(true, false, tool); // tv->setSQL(SQLTableConstraint); // res = tv; // } // else if (typ == qApp->translate("toBrowser", "Triggers")) // { // toResultTableView *tv = new toResultTableView(true, false, tool); // tv->setReadAll(true); // tv->setSQL(SQLTableTrigger); // res = tv; // } // else if (typ == qApp->translate("toBrowser", "SQL")) // { // toResultField *sql = new toResultField(tool); // sql->setSQL(SQLViewSQL); // sql->changeParams(schema, object); // return tool; // } // else if (typ == qApp->translate("toBrowser", "Script")) // { // toResultExtract *ext = new toResultExtract(true, tool); // ext->changeParams(schema, object); // return tool; // } // else if (typ == qApp->translate("toBrowser", "Information")) // { // toResultItem *inf = new toResultItem(2, true, tool); // if (ptyp == qApp->translate("toBrowser", "Tables")) // { // inf->setSQL(SQLTableInfo); // } // else if (ptyp == qApp->translate("toBrowser", "Triggers")) // { // inf->setSQL(SQLTriggerInfo); // } // else if (ptyp == qApp->translate("toBrowser", "Indexes")) // { // inf->setSQL(SQLIndexInfo); // } // inf->changeParams(schema, object); // return tool; // } // else if (typ == qApp->translate("toBrowser", "Columns")) // { // res = new toResultTableView(true, false, tool); // res->setSQL(SQLTriggerCols); // } // else if (typ == qApp->translate("toBrowser", "References")) // { // res = new toResultTableView(true, false, tool); // res->setSQL(SQLTableReferences); // } // else if (typ == qApp->translate("toBrowser", "Grants")) // { // res = new toResultTableView(true, false, tool); // res->setSQL(SQLAnyGrants); // } // else if (typ == qApp->translate("toBrowser", "Dependencies")) // { // res = new toResultDepend(tool); // } // else // { // delete tool; // return NULL; // } // res->changeParams(schema, object); // return tool; // } // }; // // class toTemplateSchemaItem : public toTemplateItem // { // toConnection &Connection; // public: // toTemplateSchemaItem(toConnection &conn, toTemplateItem *parent, // const QString &name) // : toTemplateItem(parent, name), Connection(conn) // { // QString typ = parent->text(0); // if (typ == qApp->translate("toBrowser", "Tables")) // { // QPixmap image(const_cast(table_xpm)); // setPixmap(0, image); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Indexes")); // if (toIsOracle(conn)) // { // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Constraints")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "References")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Grants")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Triggers")); // } // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Data")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Information")); // if (toIsOracle(conn)) // { // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Extents")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Script")); // } // } // else if (typ == qApp->translate("toBrowser", "Views")) // { // QPixmap image(const_cast(view_xpm)); // setPixmap(0, image); // if (toIsOracle(conn)) // { // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "SQL")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Grants")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Data")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Dependencies")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Script")); // } // } // else if (typ == qApp->translate("toBrowser", "Sequences")) // { // QPixmap image(const_cast(sequence_xpm)); // setPixmap(0, image); // if (toIsOracle(conn)) // { // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Grants")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Script")); // } // } // else if (typ == qApp->translate("toBrowser", "Code")) // { // QPixmap image(const_cast(function_xpm)); // setPixmap(0, image); // if (toIsOracle(conn)) // { // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Grants")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Dependencies")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Script")); // } // } // else if (typ == qApp->translate("toBrowser", "Triggers")) // { // QPixmap image(const_cast(function_xpm)); // setPixmap(0, image); // if (toIsOracle(conn)) // { // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Information")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Columns")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Grants")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Dependencies")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Script")); // } // } // else if (typ == qApp->translate("toBrowser", "Indexes")) // { // QPixmap image(const_cast(index_xpm)); // setPixmap(0, image); // if (toIsOracle(conn) || toIsSapDB(conn)) // { // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Information")); // } // if (toIsOracle(conn)) // { // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Information")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Extents")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Script")); // } // } // else if (typ == qApp->translate("toBrowser", "Synonyms")) // { // QPixmap image(const_cast(synonym_xpm)); // setPixmap(0, image); // if (toIsOracle(conn)) // { // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Grants")); // new toTemplateTableItem(conn, this, qApp->translate("toBrowser", "Script")); // } // } // } // // virtual QString allText(int col) const // { // QString txt = parent()->parent()->text(0); // txt += QString::fromLatin1("."); // txt += text(col); // return txt; // } // // virtual QWidget *selectedWidget(QWidget *par) // { // QString object = text(0); // QString typ = parent()->text(0); // QString schema = parent()->parent()->text(0); // if (schema == qApp->translate("toBrowser", "No schemas")) // schema = Connection.database(); // // toToolWidget *tool = new toToolWidget(BrowserTool, // "", // par, // Connection); // if (typ == qApp->translate("toBrowser", "Code") || typ == qApp->translate("toBrowser", "Triggers")) // { // toResultField *fld = new toResultField(tool); // if (typ == qApp->translate("toBrowser", "Code")) // fld->setSQL(SQLSQLTemplate); // else // fld->setSQL(SQLTriggerBody); // fld->changeParams(schema, object); // return tool; // } // else if (typ == qApp->translate("toBrowser", "Tables") || typ == qApp->translate("toBrowser", "Views")) // { // toResultCols *cols = new toResultCols(tool); // cols->changeParams(schema, object); // return tool; // } // else if (typ == qApp->translate("toBrowser", "Indexes")) // { // toResultTableView *tv = new toResultTableView(true, false, tool); // tv->setSQL(SQLIndexCols); // tv->changeParams(schema, object); // return tool; // } // else if (typ == qApp->translate("toBrowser", "Synonyms") || typ == qApp->translate("toBrowser", "Sequences")) // { // toResultItem *resultItem = new toResultItem(2, true, tool); // if (typ == qApp->translate("toBrowser", "Synonyms")) // { // resultItem->setSQL(SQLSynonymInfo); // int pos = object.indexOf(QString::fromLatin1(".")); // if (pos >= 0) // { // schema = object.mid(0, pos); // object = object.mid(pos + 1); // } // else // { // schema = QString::fromLatin1("PUBLIC"); // } // } // else // resultItem->setSQL(SQLSequenceInfo); // resultItem->changeParams(schema, object); // return tool; // } // else // { // delete tool; // return NULL; // } // } // }; // class toTemplateSchemaList : public toTemplateSQL // { // public: // toTemplateSchemaList(toConnection &conn, toTemplateItem *parent, // const QString &name, const QString &sql) // : toTemplateSQL(conn, parent, name, sql) { } // virtual toTemplateItem *createChild(const QString &name) // { // try // { // toBrowserFilter *filter = BrowseTemplate.filter(); // toTemplateItem *item = new toTemplateSchemaItem(connection(), this, name); // if (filter && !filter->check(item)) // { // delete item; // return NULL; // } // return item; // } // catch (...) // { // return NULL; // } // } // virtual toQList parameters(void) // { // toQList ret; // ret.insert(ret.end(), parent()->text(0)); // toBrowserFilter *filter = BrowseTemplate.filter(); // if (filter) // ret.insert(ret.end(), filter->wildCard()); // else // ret.insert(ret.end(), toQValue(QString::fromLatin1("%"))); // return ret; // } // }; // // class toTemplateDBItem : public toTemplateSQL // { // public: // toTemplateDBItem(toConnection &conn, toTemplateItem *parent, // const QString &name) // : toTemplateSQL(conn, parent, name, toSQL::string(toSQL::TOSQL_USERLIST, conn)) {} // virtual ~toTemplateDBItem() // { // toBrowseTemplate *prov = dynamic_cast(&provider()); // if (prov) // prov->removeItem(this); // } // virtual toTemplateItem *createChild(const QString &name) // { // try // { // toTemplateItem *item = new toTemplateItem(this, name); // QPixmap image(const_cast(schema_xpm)); // item->setPixmap(0, image); // QPixmap table(const_cast(table_xpm)); // QPixmap view(const_cast(view_xpm)); // QPixmap sequence(const_cast(sequence_xpm)); // QPixmap function(const_cast(function_xpm)); // QPixmap index(const_cast(index_xpm)); // QPixmap synonym(const_cast(synonym_xpm)); // // toBrowserFilter *filter = BrowseTemplate.filter(); // if (filter && filter->onlyOwnSchema() && // name.toUpper() != connection().user().toUpper()) // { // delete item; // return NULL; // } // // (new toTemplateSchemaList(connection(), // item, // qApp->translate("toBrowser", "Tables"), // toSQL::string(SQLListTables, connection())))->setPixmap(0, table); // // if (toIsOracle(connection()) || // toIsSapDB(connection()) || // toIsPostgreSQL(connection())) // { // (new toTemplateSchemaList(connection(), // item, // qApp->translate("toBrowser", "Views"), // toSQL::string(SQLListView, connection())))->setPixmap(0, view); // (new toTemplateSchemaList(connection(), // item, // qApp->translate("toBrowser", "Indexes"), // toSQL::string(SQLListIndex, connection())))->setPixmap(0, index); // } // // if (toIsOracle(connection()) || toIsPostgreSQL(connection())) // { // (new toTemplateSchemaList(connection(), // item, // qApp->translate("toBrowser", "Sequences"), // toSQL::string(SQLListSequence, connection())))->setPixmap(0, sequence); // (new toTemplateSchemaList(connection(), // item, // qApp->translate("toBrowser", "Code"), // toSQL::string(SQLListSQLShort, connection())))->setPixmap(0, function); // (new toTemplateSchemaList(connection(), // item, // qApp->translate("toBrowser", "Triggers"), // toSQL::string(SQLListTrigger, connection())))->setPixmap(0, function); // } // // if (toIsOracle(connection())) // { // (new toTemplateSchemaList(connection(), // item, // qApp->translate("toBrowser", "Synonyms"), // toSQL::string(SQLListSynonym, connection())))->setPixmap(0, synonym); // } // return item; // } // catch (...) // { // return NULL; // } // } // }; // // class toBrowseTemplateItem : public toTemplateItem // { // public: // toBrowseTemplateItem(toTemplateProvider &prov, toTreeWidget *parent, const QString &name) // : toTemplateItem(prov, parent, name) { } // virtual ~toBrowseTemplateItem() // { // dynamic_cast(provider()).removeItem(this); // } // }; // // void toBrowseTemplate::insertItems(toTreeWidget *parent, QToolBar *toolbar) // { // if (!Registered) // { // connect(toMainWidget(), // SIGNAL(addedConnection(const QString &)), // this, // SLOT(addDatabase(const QString &))); // connect(toMainWidget(), // SIGNAL(removedConnection(const QString &)), // this, // SLOT(removeDatabase(const QString &))); // } // // toTemplateItem *dbitem = new toBrowseTemplateItem( // *this, // parent, // qApp->translate("toBrowser", "DB Browser")); // // std::list conn = toMainWidget()->connections(); // for (std::list::iterator i = conn.begin();i != conn.end();i++) // { // toConnection &conn = toMainWidget()->connection(*i); // new toTemplateDBItem(conn, dbitem, *i); // } // Parents.insert(Parents.end(), dbitem); // // FilterButton = new QToolButton(toolbar); // FilterButton->setCheckable(true); // FilterButton->setIcon(QIcon(QPixmap(const_cast(filter_xpm)))); // FilterButton->setToolTip(tr("Define the object filter for database browser")); // toolbar->addWidget(FilterButton); // connect(FilterButton, SIGNAL(toggled(bool)), this, SLOT(defineFilter())); // // toolbar->addAction(QIcon(QPixmap(const_cast(nofilter_xpm))), // qApp->translate( // "toBrowser", // "Remove any object filter for database browser"), // this, // SLOT(clearFilter(void))); // } // // void toBrowseTemplate::addDatabase(const QString &name) // { // try // { // for (std::list::iterator i = Parents.begin();i != Parents.end();i++) // new toTemplateDBItem(toMainWidget()->connection(name), *i, name); // } // TOCATCH // } // // void toBrowseTemplate::importData(std::map &data, const QString &prefix) // { // if (data.find(prefix + ":Filter:Type") != data.end()) // { // Filter = new toBrowserFilter; // Filter->importData(data, prefix + ":Filter"); // } // } // // void toBrowseTemplate::exportData(std::map &data, const QString &prefix) // { // if (Filter) // Filter->exportData(data, prefix + ":Filter"); // } void toBrowser::enableConstraints(void) { if (m_mainTab->currentWidget() == tableSplitter) tableBrowserWidget->enableConstraints(true); } void toBrowser::disableConstraints(void) { if (m_mainTab->currentWidget() == tableSplitter) tableBrowserWidget->enableConstraints(false); } tora-2.1.3/src/totextview.cpp0000644000175000017500000000467711270353625016007 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #include "utils.h" #include "totextview.h" bool toTextView::editSave(bool) { QString fn = toSaveFilename(QString::null, QString::fromLatin1("*.html"), this); if (!fn.isEmpty()) { if (!toWriteFile(fn, toPlainText())) return false; return true; } return false; } void toTextView::editCopy(void) { copy(); } void toTextView::editSelectAll(void) { selectAll(); } void toTextView::focusInEvent (QFocusEvent *e) { receivedFocus(); QTextBrowser::focusInEvent(e); } bool toTextView::searchNext(const QString & text) { return find(text); } bool toTextView::searchPrevious(const QString & text) { return find(text, QTextDocument::FindBackward); } tora-2.1.3/src/toresultgrants.h0000644000175000017500000000434611270353625016323 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTGRANTS_H #define TORESULTGRANTS_H #include "toresulttableview.h" /*! \brief Standalone widget for GRANTS display. This simple class is created only to save toSQL reuse in various widgets to avoid toSQL error or warning messages caused by copypasted toSQL grants structures everywhere. See e.g. toDescribe, toBrowser widgets etc. \author Petr Vanek */ class toResultGrants : public toResultTableView { Q_OBJECT public: toResultGrants(QWidget * parent = 0); }; #endif tora-2.1.3/src/toresulttableviewedit.cpp0000644000175000017500000003625511424102444020204 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "config.h" #include "toresulttableviewedit.h" #include "toresultmodel.h" #include "toconf.h" #include "utils.h" #include "toqvalue.h" #include "toconfiguration.h" #include "toconnection.h" #include "tomemoeditor.h" #include "tomain.h" #include #include #include #include #include #include #include toResultTableViewEdit::toResultTableViewEdit(bool readable, bool numberColumn, QWidget *parent, const char *name) : toResultTableView(readable, numberColumn, parent, name, true) { setSelectionBehavior(QAbstractItemView::SelectItems); setSelectionMode(QAbstractItemView::ContiguousSelection); } toResultTableViewEdit::~toResultTableViewEdit() { } void toResultTableViewEdit::query(const QString &SQL, const toQList ¶ms) { revertChanges(); if (params.size() != 2) ; // assume it's a refresh else { toQList::const_iterator par = params.begin(); Owner = *par; par++; Table = *par; } toQList empty; toResultTableView::query(SQL, empty); emit changed(false); if (!Model) return; // error // must be reconnected after every query connect(Model, SIGNAL(columnChanged(const QModelIndex &, const toQValue &, const toResultModel::Row &)), this, SLOT(recordChange(const QModelIndex &, const toQValue &, const toResultModel::Row &))); connect(Model, SIGNAL(rowAdded(const toResultModel::Row &)), this, SLOT(recordAdd(const toResultModel::Row &))); connect(Model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(handleNewRows(const QModelIndex &, int, int))); connect(Model, SIGNAL(modelReset()), this, SLOT(revertChanges())); connect(Model, SIGNAL(rowDeleted(const toResultModel::Row &)), this, SLOT(recordDelete(const toResultModel::Row &))); connect(toMainWidget(), SIGNAL(willCommit(toConnection &, bool)), this, SLOT(commitChanges(toConnection &, bool))); verticalHeader()->setVisible(true); // <-- shouldn't this be set according to constructor data? } void toResultTableViewEdit::recordChange(const QModelIndex &index, const toQValue &newValue, const toResultModel::Row &row) { // first, if it was an added row, find and update the ChangeSet so // they all get inserted as one. toQValue rowid = row[0]; for (int changeIndex = 0; changeIndex < Changes.size(); changeIndex++) { if (Changes[changeIndex].kind == Add && Changes[changeIndex].row[0] == rowid) { Changes[changeIndex].row[index.column()] = newValue; return; } } // don't record if not changed if (newValue == row[index.column()]) return; struct ChangeSet change; change.columnName = model()->headerData(index.column(), Qt::Horizontal, Qt::DisplayRole).toString(); change.newValue = newValue; change.row = row; change.column = index.column(); change.kind = Update; Changes.append(change); emit changed(changed()); } void toResultTableViewEdit::recordAdd(const toResultModel::Row &row) { struct ChangeSet change; change.row = row; change.kind = Add; Changes.append(change); emit changed(changed()); } void toResultTableViewEdit::recordDelete(const toResultModel::Row &row) { struct ChangeSet change; change.row = row; change.kind = Delete; Changes.append(change); emit changed(changed()); } void toResultTableViewEdit::commitDelete(ChangeSet &change, toConnection &conn) { const toResultModel::HeaderList Headers = Model->headers(); bool oracle = toIsOracle(conn); QString sql = QString("DELETE FROM %1.%2 ").arg(conn.quote(Owner)).arg(conn.quote(Table)); sql += (" WHERE "); bool where = false; for (int i = 1; i < change.row.size(); i++) { if (!oracle || (!Headers[i].datatype.toUpper().startsWith(("LONG")) && !Headers[i].datatype.toUpper().contains(("LOB")))) { if (where) sql += " AND "; else where = true; sql += conn.quote(Headers[i].name); if (change.row[i].isNull()) sql += " IS NULL"; else { sql += "= :c"; sql += QString::number(i); if (change.row[i].isBinary()) sql += ""; else sql += ""; } } } if (!where) { toStatusMessage(tr("This table contains only LOB/LONG columns and can not be edited")); return; } toQList args; for (int i = 1; i < change.row.size(); i++) { if (!change.row[i].isNull() && (!oracle || (!Headers[i].datatype.startsWith(("LONG")) && !Headers[i].datatype.toUpper().contains(("LOB"))))) { toPush(args, change.row[i]); } } conn.execute(sql, args); if (toConfigurationSingle::Instance().autoCommit()) conn.commit(); else toMainWidget()->setNeedCommit(conn); } void toResultTableViewEdit::commitAdd(ChangeSet &change, toConnection &conn) { const toResultModel::HeaderList Headers = Model->headers(); QString sql = QString("INSERT INTO %1.%2 (").arg(conn.quote(Owner)).arg(conn.quote(Table)); int num = 0; for (int i = 1; i < change.row.size(); i++) { if (num > 0) sql += ","; sql += conn.quote(Model->headerData( i, Qt::Horizontal, Qt::DisplayRole).toString()); num++; } sql += ") VALUES ("; num = 0; for (int i = 1; i < change.row.size(); i++, num++) { if (num > 0) sql += (","); sql += (":f"); sql += QString::number(num + 1); if (change.row[i].isBinary()) { if (Headers[i].datatype.toUpper().contains("LOB")) sql += (""); else sql += (""); } else { if (Headers[i].datatype.toUpper().contains("LOB")) sql += (""); else sql += (""); } } sql += (")"); toQList args; for (int i = 1; i < change.row.size(); i++) toPush(args, change.row[i]); toQuery q(conn, sql, args); if (toConfigurationSingle::Instance().autoCommit()) conn.commit(); else toMainWidget()->setNeedCommit(conn); } void toResultTableViewEdit::commitUpdate(ChangeSet &change, toConnection &conn) { const toResultModel::HeaderList Headers = Model->headers(); bool oracle = toIsOracle(conn); QString sql = QString("UPDATE %1.%2 SET ").arg(conn.quote(Owner)).arg(conn.quote(Table)); sql += conn.quote(change.columnName); if (change.newValue.isNull()) sql += (" = NULL"); else { sql += ("= :f0"); if (change.row[change.column].isBinary()) { if (Headers[change.column].datatype.toUpper().contains("LOB")) sql += (""); else sql += (""); } else { if (Headers[change.column].datatype.toUpper().contains("LOB")) sql += (""); else sql += (""); } } sql += (" WHERE ("); int col = 1; bool where = false; for (toResultModel::Row::iterator j = change.row.begin() + 1; j != change.row.end(); j++, col++) { QString columnName = conn.quote(Model->headerData( col, Qt::Horizontal, Qt::DisplayRole).toString()); if (!oracle || (!Headers[col].datatype.toUpper().startsWith(("LONG")) && !Headers[col].datatype.toUpper().contains(("LOB")))) { if (where) sql += (" AND ("); else where = true; sql += columnName; if ((*j).isNull()) { sql += " IS NULL "; if ((*j).isNumber()) sql += ")"; else { sql += " OR " + columnName + " = :c"; sql += QString::number(col); if ((*j).isBinary()) sql += (")"); else sql += (")"); } } else { sql += " = :c"; sql += QString::number(col); if ((*j).isBinary()) sql += (")"); else sql += (")"); } } } if (!where) { toStatusMessage(tr("This table contains only LOB/LONG " "columns and can not be edited")); return; } toQList args; // the "SET = " value if (!change.newValue.isNull()) toPush(args, change.newValue); col = 1; for (toResultModel::Row::iterator j = change.row.begin() + 1; j != change.row.end(); j++, col++) { if (!oracle || (!Headers[col].datatype.toUpper().startsWith(("LONG")) && !Headers[col].datatype.toUpper().contains(("LOB")))) { if ((*j).isNull()) { if (!(*j).isNumber()) toPush(args, toQValue(QString(""))); // else don't push null for numbers } else toPush(args, (*j)); } } toQuery q(conn, sql, args); if (toConfigurationSingle::Instance().autoCommit()) conn.commit(); else toMainWidget()->setNeedCommit(conn); } bool toResultTableViewEdit::commitChanges(bool status) { // Check to make sure some changes were actually made if (Changes.size() < 1) { if (status) toStatusMessage(tr("No changes made"), false, false); return false; } toConnection &conn = connection(); QProgressDialog progress(tr("Performing changes"), tr("Cancel"), 0, Changes.size(), this); bool error = false; for (int changeIndex = 0; changeIndex < Changes.size(); changeIndex++) { progress.setValue(changeIndex); qApp->processEvents(); if (progress.wasCanceled()) break; try { struct ChangeSet &change = Changes[changeIndex]; switch (change.kind) { case Delete: commitDelete(change, conn); break; case Add: commitAdd(change, conn); break; case Update: commitUpdate(change, conn); break; default: toStatusMessage(tr("Internal error.")); } } catch (const QString &str) { toStatusMessage(str); error = true; break; } } toStatusMessage(tr("Saved %1 changes").arg(Changes.size(), 0, 10), false, false); if (error) refresh(); else Changes.clear(); emit changed(changed()); return !error; } void toResultTableViewEdit::commitChanges(toConnection &conn, bool cmt) { // make sure this is the same connection, we don't want to commit // this connection when somebody clicked 'commit' when in another // tool and another database. if (&conn != &connection()) return; if (cmt) { commitChanges(false); connection().commit(); // make sure to commit connection // where our changes are. } else refresh(); } void toResultTableViewEdit::revertChanges() { Changes.clear(); emit changed(changed()); } void toResultTableViewEdit::handleNewRows(const QModelIndex &parent, int start, int end) { // mrj: this was a work around for a scrolling bug. Don't think we // need this anymore. // int col = selectionModel()->currentIndex().column(); // if (col < 1) // col = 1; // QModelIndex index = Model->index(start - 1, col); // selectionModel()->select(QItemSelection(index, index), // QItemSelectionModel::ClearAndSelect); // setCurrentIndex(index); } void toResultTableViewEdit::addRecord(void) { Model->addRow(); } void toResultTableViewEdit::duplicateRecord(void) { Model->addRow(selectionModel()->currentIndex()); } void toResultTableViewEdit::deleteRecord(void) { if (!selectionModel()) return; QModelIndex ind = selectionModel()->currentIndex(); if (ind.isValid()) Model->deleteRow(ind); } tora-2.1.3/src/toresultlock.h0000644000175000017500000000464311270353625015755 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTLOCK_H #define TORESULTLOCK_H #include "config.h" #include #include "tobackground.h" #include "toresultview.h" class toNoBlockQuery; class toResultLock : public toResultView { Q_OBJECT toBackground Poll; toNoBlockQuery *Query; toTreeWidgetItem *LastItem; std::map Checked; public: toResultLock(QWidget *parent, const char *name = NULL); ~toResultLock(); virtual void query(const QString &sql, const toQList ¶m); virtual void query(const QString &sql) { toQList p; query(sql, p); } /** Support Oracle */ virtual bool canHandle(toConnection &conn); private slots: void poll(void); }; #endif tora-2.1.3/src/toresultitem.cpp0000644000175000017500000002525711270353625016322 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "tonoblockquery.h" #include "toresultitem.h" #include "toresultresources.h" #include "tosql.h" #include "totool.h" #include #include #include #include static toSQL SQLResource( "toResultResources:Information", "SELECT 'Total' AS \"-\", " " 'per Execution' AS \"-\", " " 'per Row processed' AS \"-\", " " Sorts, " " DECODE ( Executions, " " 0, " " 'N/A', " " ROUND ( Sorts / Executions, " " 3 ) ) AS \" \", " " DECODE ( Rows_Processed, " " 0, " " 'N/A', " " ROUND ( Sorts / Rows_Processed, " " 3 ) ) AS \" \", " " Parse_Calls AS \"Parse\", " " DECODE ( Executions, " " 0, " " 'N/A', " " ROUND ( Parse_Calls / Executions, " " 3 ) ) AS \" \", " " DECODE ( Rows_Processed, " " 0, " " 'N/A', " " ROUND ( Parse_Calls / Rows_Processed, " " 3 ) ) AS \" \", " " Disk_Reads, " " DECODE ( Executions, " " 0, " " 'N/A', " " ROUND ( Disk_Reads / Executions, " " 3 ) ) AS \" \", " " DECODE ( Rows_Processed, " " 0, " " 'N/A', " " ROUND ( Disk_Reads / Rows_Processed, " " 3 ) ) AS \" \", " " Buffer_Gets, " " DECODE ( Executions, " " 0, " " 'N/A', " " ROUND ( Buffer_Gets / Executions, " " 3 ) ) AS \" \", " " DECODE ( Rows_Processed, " " 0, " " 'N/A', " " ROUND ( Buffer_Gets / Rows_Processed, " " 3 ) ) AS \" \", " " Rows_Processed, " " DECODE ( Executions, " " 0, " " 'N/A', " " ROUND ( Rows_Processed / Executions, " " 3 ) ) AS \" \", " " ' ' AS \"-\", " " Executions, " " ' ' AS \"-\", " " ' ' AS \"-\", " " ' ' AS \"-\", " " ' ' AS \"-\", " " ' ' AS \"-\", " " Loads, " " First_Load_Time, " " Parsing_User_Id, " " Parsing_Schema_Id, " " Users_Executing, " " Users_Opening, " " Open_Versions, " " Sharable_Mem, " " Kept_Versions, " " Persistent_Mem, " " Optimizer_Mode, " " Loaded_Versions, " " Runtime_Mem, " " Serializable_Aborts, " " Invalidations " " FROM v$sqlarea " " WHERE Address || ':' || Hash_Value = :f1 ", "Display information about an SQL statement"); toResultResources::toResultResources(QWidget *parent, const char *name) : toResultItem(3, true, parent, name) { setSQL(SQLResource); } void toResultItem::setup(int num, bool readable) { ReadableColumns = readable; NumWidgets = 0; WidgetPos = 0; Columns = num; ShowTitle = true; Right = true; Query = NULL; DataFont.setBold(true); // qscrollarea needs a central widget for it's resizing policies. QWidget *w = new QWidget(this); setWidget(w); setWidgetResizable(true); Result = new QGridLayout; Result->setSpacing(3); w->setLayout(Result); connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); } toResultItem::toResultItem(int num, bool readable, QWidget *parent, const char *name) : QScrollArea(parent), DataFont(QFont()) { setObjectName(name); setup(num, readable); } toResultItem::toResultItem(int num, QWidget *parent, const char *name) : QScrollArea(parent), DataFont(QFont()) { setObjectName(name); setup(num, false); } toResultItem::toResultItem(QWidget *parent) : QScrollArea(parent), DataFont(QFont()) { setObjectName("toResultItem"); setup(2, false); } toResultItem::~toResultItem() { delete Query; } void toResultItem::start(void) { WidgetPos = 0; } // Must be alloced in multiples of 2 #define ALLOC_SIZE 1000 QWidget *toResultItem::createTitle(QWidget *parent) { QLabel *widget = new QLabel(parent); widget->setAlignment(Qt::AlignRight | Qt::AlignVCenter); widget->setWordWrap(true); return widget; } QWidget *toResultItem::createValue(QWidget *parent) { QLabel *widget = new QLabel(parent); return widget; } void toResultItem::setTitle(QWidget *widget, const QString &title, const QString &) { QLabel *label = dynamic_cast(widget); if (label) label->setText(title); Result->addWidget(widget, (int) WidgetPos / (Columns * 2), // row WidgetPos % (Columns * 2)); // column } void toResultItem::setValue(QWidget *widget, const QString &title, const QString &value) { QLabel *label = dynamic_cast(widget); if (label) { if (title != "-") { label->setFrameStyle(StyledPanel | Sunken); label->setFont(DataFont); } else { label->setFrameStyle(NoFrame); label->setFont(qApp->font()); } label->setText(value); if (Right) { label->setAlignment(Qt::AlignRight | Qt::AlignVCenter); label->setWordWrap(true); } else { label->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); label->setWordWrap(true); } } Result->addWidget(widget, (int) WidgetPos / (Columns * 2), // row WidgetPos % (Columns * 2)); // column } void toResultItem::addItem(const QString &title, const QString &value) { if (WidgetPos >= NumWidgets) { NumWidgets += ALLOC_SIZE; Widgets.resize(NumWidgets, 0); } QString t; if (title != "-") t = toTranslateMayby(sqlName(), title); QWidget *widget; if (!Widgets[WidgetPos]) { widget = createTitle(this); Widgets[WidgetPos] = widget; } else widget = ((QLabel *)Widgets[WidgetPos]); setTitle(widget, t, value); if (ShowTitle) widget->show(); else widget->hide(); WidgetPos++; if (!Widgets[WidgetPos]) { widget = createValue(this); Widgets[WidgetPos] = widget; } else widget = Widgets[WidgetPos]; setValue(widget, title, value); widget->show(); WidgetPos++; } void toResultItem::done(void) { for (int i = WidgetPos; i < NumWidgets; i++) { if (Widgets[i]) Widgets[i]->hide(); } int rows = WidgetPos / (Columns * 2); // by default, no rows my stretch except when none can. then they // will all resize regardless of what flags you pass to the // layout. // add a label past the data to stretch. Result->addWidget(new QLabel(this), rows + 1, 0); Result->setRowStretch(rows + 1, 1); Result->layout(); } void toResultItem::query(const QString &sql, const toQList ¶m) { if (!setSQLParams(sql, param)) return ; start(); if (!handled() || Query) { if (!Query) done(); return ; } try { if (Query) { delete Query; Query = NULL; } Query = new toNoBlockQuery(connection(), toQuery::Background, sql, param); Poll.start(100); } catch (const QString &str) { done(); toStatusMessage(str); } } void toResultItem::poll(void) { try { if (!toCheckModal(this)) return ; if (Query && Query->poll()) { toQDescList desc = Query->describe(); if (!Query->eof()) { for (toQDescList::iterator i = desc.begin(); i != desc.end(); i++) { QString name = (*i).Name; if (ReadableColumns) toReadableColumn(name); addItem(name, Query->readValue()); } } done(); delete Query; Query = NULL; Poll.stop(); } } catch (const QString &str) { delete Query; Query = NULL; done(); toStatusMessage(str); Poll.stop(); } } tora-2.1.3/src/toresultstats.cpp0000644000175000017500000002461711270353625016521 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconnection.h" #include "tonoblockquery.h" #include "toresultstats.h" #include "tosql.h" toResultStats::toResultStats(bool onlyChanged, int ses, QWidget *parent, const char *name) : toResultView(false, false, parent, name), OnlyChanged(onlyChanged) { if (!handled()) return ; SessionID = ses; setSQLName(QString::fromLatin1("toResultStats")); System = false; setup(); } bool toResultStats::canHandle(toConnection &conn) { return toIsOracle(conn); } bool toResultStats::close() { delete Query; delete SessionIO; return true; } toResultStats::~toResultStats() { close(); } static toSQL SQLSession("toResultStats:Session", "SELECT MIN(SID) FROM V$MYSTAT", "Get session id of current session"); toResultStats::toResultStats(bool onlyChanged, QWidget *parent, const char *name) : toResultView(false, false, parent, name), OnlyChanged(onlyChanged) { if (!handled()) return ; try { toQList params; toQuery query(connection(), toQuery::Background, SQLSession, params); SessionID = query.readValue().toInt(); } catch (...) { SessionID = -1; } System = false; setup(); } toResultStats::toResultStats(QWidget *parent, const char *name) : toResultView(false, false, parent, name), OnlyChanged(false) { if (!handled()) return ; System = true; setup(); } void toResultStats::setup(void) { for (int i = 0;i < TO_STAT_MAX;i++) LastValues[i] = 0; addColumn(tr("Name")); if (!OnlyChanged) addColumn(tr("Value")); addColumn(tr("Delta")); setSorting(0); setColumnAlignment(1, Qt::AlignRight); setColumnAlignment(2, Qt::AlignRight); Query = SessionIO = NULL; connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); connect(this, SIGNAL(sessionChanged(int)), this, SLOT(refreshStats()), Qt::QueuedConnection); } static toSQL SQLStatistics("toResultStats:Statistics", "SELECT Statistic#,Value FROM V$SesStat WHERE SID = :f1", "Get statistics for session, must have same number of columns"); static toSQL SQLSessionIO("toResultStats:SessionIO", "SELECT Block_Gets \"block gets\",\n" " Block_Changes \"block changes\",\n" " Consistent_Changes \"consistent changes\"\n" " FROM v$sess_io\n" " WHERE SID = :f1", "Get session IO, must have same binds"); static toSQL SQLSystemStatistics("toResultStats:SystemStatistics", "SELECT Statistic#,Value FROM v$sysstat", "Get system statistics, must have same number of columns"); void toResultStats::resetStats(void) { if (!handled()) return ; toBusy busy; try { toConnection &conn = connection(); toQList args; if (!System) args.insert(args.end(), SessionID); toQuery query(conn, System ? SQLSystemStatistics : SQLStatistics, args); while (!query.eof()) { int id; double value; id = query.readValue().toInt(); value = query.readValue().toDouble(); id += TO_STAT_BLOCKS; if (id < TO_STAT_MAX + TO_STAT_BLOCKS) LastValues[id] = value; } if (!System) { toQuery queryio(conn, SQLSessionIO, args); int id = 0; while (!queryio.eof()) { double value; value = queryio.readValue().toDouble(); LastValues[id] = value; id++; } } } TOCATCH } void toResultStats::changeSession(toQuery &query) { if (!handled()) return ; if (System) throw tr("Can't change session on system statistics"); try { toQList args; query.execute(SQLSession, args); SessionID = query.readValue().toInt(); emit sessionChanged(SessionID); emit sessionChanged(QString::number(SessionID)); resetStats(); } TOCATCH } void toResultStats::changeSession(int ses) { if (!handled()) return ; if (System) throw tr("Can't change session on system statistics"); if (SessionID != ses) { SessionID = ses; emit sessionChanged(SessionID); emit sessionChanged(QString::number(SessionID)); resetStats(); } } static toSQL SQLStatisticName("toResultStats:StatisticName", "SELECT b.Name,a.Statistic#,a.Value\n" " FROM V$SesStat a,V$StatName b\n" " WHERE a.SID = :f1 AND a.statistic# = b.statistic#\n", "Get statistics and their names for session, must have same number of columns"); static toSQL SQLSystemStatisticName("toResultStats:SystemStatisticName", "SELECT Name,Statistic#,Value\n" " FROM v$sysstat\n", "Get statistics and their names for system statistics, must have same number of columns"); void toResultStats::addValue(bool reset, int id, const QString &name, double value) { QString delta; QString absVal; if (value != 0) { absVal.sprintf("%.15g", value); if (id < TO_STAT_MAX + TO_STAT_BLOCKS) { delta.sprintf("%.15g", value - LastValues[id]); if (value != LastValues[id] || !OnlyChanged) { toResultViewItem *item = new toResultViewItem(this, NULL); if (reset) LastValues[id] = value; item->setText(0, name); if (OnlyChanged) item->setText(1, delta); else { item->setText(1, absVal); item->setText(2, delta); } item->setText(3, QString::number(++Row)); } } } } void toResultStats::refreshStats(bool reset) { if (!handled() || Query || SessionIO) return ; try { clear(); Row = 0; toConnection &conn = connection(); toQList args; if (!System) args.insert(args.end(), SessionID); Query = new toNoBlockQuery(conn, toQuery::Background, toSQL::string(System ? SQLSystemStatisticName : SQLStatisticName, connection()), args); if (!System) SessionIO = new toNoBlockQuery(conn, toQuery::Background, toSQL::string(SQLSessionIO, connection()), args); Poll.start(100); Reset = reset; } TOCATCH } void toResultStats::poll(void) { try { if (!toCheckModal(this)) return ; bool done = true; if (Query && Query->poll()) { while (Query->poll() && !Query->eof()) { QString name = Query->readValue(); int id = Query->readValue().toInt(); double value = Query->readValue().toDouble(); addValue(Reset, id, name, value); } if (Query->eof()) { delete Query; Query = NULL; } else done = false; } else if (Query) done = false; if (SessionIO && SessionIO->poll()) { int id = 0; toQDescList description = SessionIO->describe(); toQDescList::iterator i = description.begin(); while (!SessionIO->eof()) { addValue(Reset, id, (*i).Name, SessionIO->readValue().toDouble()); id++; if (i == description.end()) i = description.begin(); else i++; } delete SessionIO; SessionIO = NULL; } else if (SessionIO) done = false; if (done) Poll.stop(); resizeColumnsToContents(); } catch (const QString &exc) { delete Query; Query = NULL; delete SessionIO; SessionIO = NULL; Poll.stop(); toStatusMessage(exc); } } tora-2.1.3/src/tosecuritytreeitem.cpp0000644000175000017500000000632711270353625017530 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #include "tosecuritytreeitem.h" toSecurityTreeItem::toSecurityTreeItem( toSecurityTreeItem *parent, const QString & data, const QString & name, const QString & type, const QString & schema) : m_changed(false), m_checkable(false), m_checked(Qt::Unchecked) { parentItem = parent; itemData = data; itemName = name; itemType = type; itemSchema = schema; } toSecurityTreeItem::~toSecurityTreeItem() { qDeleteAll(childItems); } void toSecurityTreeItem::appendChild(toSecurityTreeItem *item) { childItems.append(item); } toSecurityTreeItem *toSecurityTreeItem::child(int row) { return childItems.value(row); } int toSecurityTreeItem::childCount() const { return childItems.count(); } int toSecurityTreeItem::columnCount() const { return 1;//itemData.count(); } QString toSecurityTreeItem::data() const { return itemData; } QString toSecurityTreeItem::name() const { return itemName; } QString toSecurityTreeItem::type() const { return itemType; } QString toSecurityTreeItem::schema() const { return itemSchema; } toSecurityTreeItem *toSecurityTreeItem::parent() { return parentItem; } int toSecurityTreeItem::row() const { if (parentItem) return parentItem->childItems.indexOf(const_cast(this)); return 0; } tora-2.1.3/src/tocodemodel.h0000644000175000017500000001133111270353625015511 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOCODEMODEL_H #define TOCODEMODEL_H #include #include #include #include "config.h" #include "toconnection.h" class toEventQuery; /*! \brief A leaf item for toCodeModel. It displays one item in the tree structure of the code model. */ class toCodeModelItem { public: /*! \param parent a parent item. When it's 0, it's a root one. \param display a text to display - item caption or object name \param type item type. "NULL" for headers and non-db items. and e.g. "PROCEDURE" for procedures. See its toSQL. \param status a (in)valid state of the DB object. Use "VALID" for non-db items. */ toCodeModelItem( toCodeModelItem *parent = 0, const QString & display = 0, const QString & type = "NULL", const QString & status = "VALID" ); ~toCodeModelItem(); /*! \brief It appends a child to the tree for this item. \warning Do not call this method if you provide a parent in constructor! */ void appendChild(toCodeModelItem *child); toCodeModelItem *child(int row); int childCount() const; int columnCount() const; int row() const; toCodeModelItem *parent(); //! Object name QString display() const; //! Object type QString type() const; //! Object status (validity) QString status() const; void setStatus(const QString & s); private: QList childItems; QString itemDisplay; QString itemType; QString itemStatus; toCodeModelItem *parentItem; }; /*! \brief A tree model for QTreeView used in the sql editor and sql * debugger tools and toBrowser as well. */ class toCodeModel : public QAbstractItemModel { Q_OBJECT public: toCodeModel(QObject *parent = 0); ~toCodeModel(); QVariant data(const QModelIndex &index, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; /** * Run query for model * */ void refresh(toConnection &conn, const QString &owner); public slots: void addChildContent(const QModelIndex & index); signals: void dataReady(); private slots: void cleanup(void); void readData(void); void queryError(const toConnection::exception &); private: //! An universal root item. It's deleted and recreated in setupModelData() toCodeModelItem *rootItem; toCodeModelItem *packageItem; toCodeModelItem *procItem; toCodeModelItem *funcItem; toCodeModelItem *typeItem; toEventQuery *query; QString m_owner; }; #endif tora-2.1.3/src/tolistviewformatterhtml.cpp0000644000175000017500000001105311270353625020571 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #include "tolistviewformatterhtml.h" #include "tolistviewformatterfactory.h" #include "tolistviewformatteridentifier.h" #include "toresultview.h" #include "toresultmodel.h" #include namespace { toListViewFormatter* createHTML() { return new toListViewFormatterHTML(); } const bool registered = toListViewFormatterFactory::Instance().Register( toListViewFormatterIdentifier::HTML, createHTML); } toListViewFormatterHTML::toListViewFormatterHTML() : toListViewFormatter() { } toListViewFormatterHTML::~toListViewFormatterHTML() { } QString toListViewFormatterHTML::getFormattedString(toExportSettings &settings, //const toResultModel *model); const QAbstractItemModel * model) { int columns = model->columnCount(); int rows = model->rowCount(); QString output; QString indent; QVector rlist = selectedRows(settings.selected); QVector clist = selectedColumns(settings.selected); output = QString("Export"); endLine(output); QString bgcolor; if (settings.columnsHeader) { output += QString(""); endLine(output); for (int j = 0; j < columns; j++) { if (settings.columnsExport == toExportSettings::ColumnsSelected && !clist.contains(j)) continue; output += QString("\t"); endLine(output); } output += ""; endLine(output); } QModelIndex mi; for (int row = 0; row < rows; row++) { if (settings.rowsExport == toExportSettings::RowsSelected && !rlist.contains(row)) continue; output += ""; endLine(output); for (int i = 0; i < columns; i++) { if (settings.columnsExport == toExportSettings::ColumnsSelected && !clist.contains(i)) continue; if (!settings.rowsHeader && i == 0) continue; output += QString("\t"); endLine(output); } output += ""; endLine(output); } output += "
"); endLine(output); QString text(Qt::escape(model->headerData(j, Qt::Horizontal, Qt::DisplayRole).toString())); output += "\t\t" + text; endLine(output); output += QString("\t
"); endLine(output); mi = model->index(row, i); QString text(Qt::escape(model->data(mi, Qt::EditRole).toString())); output += "\t\t" + text; endLine(output); output += QString("\t
"; return output; } tora-2.1.3/src/tobackuptool.h0000644000175000017500000000122111270353625015716 0ustar michaelmichael#ifndef TOBACKUPTOOL_H #define TOBACKUPTOOL_H #include #include "totool.h" class QWidget; class toConnection; // // C++ Interface: tobackuptool // // Description: // // // Author: Thomas Porschberg, core , (C) 2006 // // Copyright: See COPYING file that comes with this distribution // // class toBackupTool : public toTool { protected: std::map Windows; virtual const char **pictureXPM(void); public: toBackupTool(); virtual const char *menuItem(); virtual QWidget *toolWindow(QWidget *parent, toConnection &connection); void closeWindow(toConnection &connection); }; #endif tora-2.1.3/src/toresultlistformatui.ui0000644000175000017500000001471711270353625017740 0ustar michaelmichael toResultListFormatUI 0 0 401 293 Choose format 0 0 &Format of Data: false formatCombo Rows All (Full Fetch) Displayed Only Selected Only Qt::Vertical 20 40 Include &Row Numbers Columns All in Row Selected Only Qt::Vertical 182 31 &Include Column Headers &Separator (CSV): false separatorEdit &Delimiter (CSV): false delimiterEdit Qt::Vertical QSizePolicy::Expanding 20 20 QDialogButtonBox::Cancel|QDialogButtonBox::Ok formatCombo separatorEdit delimiterEdit formatCombo activated(int) toResultListFormatUI formatChanged(int) 134 24 20 20 buttonBox accepted() toResultListFormatUI accept() 136 176 44 123 buttonBox rejected() toResultListFormatUI reject() 235 178 62 95 tora-2.1.3/src/todatatype.h0000644000175000017500000000724611271405634015402 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TO_DATATYPE #define TO_DATATYPE #include "config.h" #include #include #include "toextract.h" class QComboBox; class QLabel; class QLineEdit; class QSpinBox; class toConnection; /** * Widget used to represent a datatype selection for a column. * */ class toDatatype : public QWidget { Q_OBJECT; std::list Datatypes; QComboBox *Type; QLabel *LeftParenthesis; QSpinBox *Size; QLabel *Comma; QSpinBox *Precision; QLabel *RightParenthesis; QLineEdit *Custom; bool PreferCustom; bool bCustomVisible; bool bSizeVisible; bool bPrecVisible; void setupLabels(); void setup(toConnection &conn); public: /** * Create the widget and specify connection and the datatype. * * @param conn Connection to specify datatype for. * @param def Initial datatype to use. * @param parent The parent widget. * @param name Name of widget. */ toDatatype(toConnection &conn, const QString &def, QWidget *parent, const char *name = NULL); /** * Create the widget and specify connection. * * @param conn Connection to specify datatype for. * @param parent The parent widget. * @param name Name of widget. */ toDatatype(toConnection &conn, QWidget *parent, const char *name = NULL); /** * Get a string representation of the type. */ QString type() const; public slots: /** * Change the type. * * @param type The entire type specification (Including posible * size and precision) */ void setType(const QString &type); /** * Indicate if you would prefer to enter a custom datatype or if * posible use the simpler controls. * * @param prefer If true always use custom controls. */ void setCustom(bool prefer); private slots: void changeType(int); }; #endif tora-2.1.3/src/tooutput.cpp0000644000175000017500000003215111270353625015454 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "tomain.h" #include "tomarkedtext.h" #include "toresultview.h" #include "tosql.h" #include "totool.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tooutput.h" #include "icons/eraselog.xpm" #include "icons/offline.xpm" #include "icons/online.xpm" #include "icons/refresh.xpm" #include "icons/tooutput.xpm" // #define CONF_POLLING "Refresh" // #define DEFAULT_POLLING "10 seconds" // // #define CONF_LOG_TYPE "Type" // #define DEFAULT_LOG_TYPE "0" // // #define CONF_LOG_USER "LogUser" // #define DEFAULT_LOG_USER "ULOG" class toOutputPrefs : public QGroupBox, public toSettingTab { QComboBox *AutoPolling; QComboBox *Type; QLineEdit *User; toTool *Tool; public: toOutputPrefs(toTool *tool, QWidget* parent = 0, const char* name = 0) : QGroupBox(parent), toSettingTab("output.html"), Tool(tool) { if (name) setObjectName(name); QVBoxLayout *vbox = new QVBoxLayout; setLayout(vbox); setTitle(qApp->translate("toOutputPrefs", "SQL Output")); QLabel *label = new QLabel(qApp->translate("toOutputPrefs", "&Polling timeout"), this); label->setGeometry(QRect(20, 30, 100, 20)); label->setToolTip(qApp->translate("toOutputPrefs", "Time between trying to poll for output.")); vbox->addWidget(label); AutoPolling = toRefreshCreate( this, TO_TOOLBAR_WIDGET_NAME, toConfigurationSingle::Instance().polling()); label->setBuddy(AutoPolling); vbox->addWidget(AutoPolling); label = new QLabel(qApp->translate("toOutputPrefs", "Default &source"), this); vbox->addWidget(label); Type = new QComboBox(this); Type->addItem(qApp->translate("toLogOutput", "SQL Output")); Type->addItem(qApp->translate("toLogOutput", "Log4PL/SQL")); Type->setCurrentIndex(toConfigurationSingle::Instance().logType()); label->setBuddy(Type); vbox->addWidget(Type); label = new QLabel(qApp->translate("toOutputPrefs", "Log4PL/SQL &User"), this); vbox->addWidget(label); User = new QLineEdit(toConfigurationSingle::Instance().logUser(), this); label->setBuddy(User); vbox->addWidget(User); vbox->addStretch(); } virtual void saveSetting(void) { toConfigurationSingle::Instance().setPolling(AutoPolling->currentText()); toConfigurationSingle::Instance().setLogType(Type->currentIndex()); toConfigurationSingle::Instance().setLogUser(User->text()); } }; class toOutputTool : public toTool { protected: std::map Windows; virtual const char **pictureXPM(void) { return const_cast(tooutput_xpm); } public: toOutputTool() : toTool(340, "SQL Output") { } virtual const char *menuItem() { return "SQL Output"; } virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) { std::map::iterator i = Windows.find(&connection); if (i != Windows.end()) { (*i).second->raise(); (*i).second->setFocus(); return NULL; } else { QWidget *window = new toLogOutput(parent, connection); Windows[&connection] = window; return window; } } void closeWindow(toConnection &connection) { std::map::iterator i = Windows.find(&connection); if (i != Windows.end()) Windows.erase(i); } virtual QWidget *configurationTab(QWidget *parent) { return new toOutputPrefs(this, parent); } }; static toOutputTool OutputTool; toOutput::toOutput(QWidget *main, toConnection &connection, bool enabled) : toToolWidget(OutputTool, "output.html", main, connection, "toOutput") { Toolbar = toAllocBar(this, tr("SQL Output")); layout()->addWidget(Toolbar); refreshAct = new QAction(QPixmap(const_cast(refresh_xpm)), tr("Poll for output now"), this); refreshAct->setShortcut(QKeySequence::Refresh); connect(refreshAct, SIGNAL(triggered()), this, SLOT(refresh(void))); Toolbar->addAction(refreshAct); Toolbar->addSeparator(); enableAct = new QAction(tr("Output enabled"), this); enableAct->setShortcut(Qt::Key_F4); enableAct->setCheckable(true); QIcon iconset; iconset.addPixmap(QPixmap(const_cast(online_xpm)), QIcon::Normal, QIcon::Off); iconset.addPixmap(QPixmap(const_cast(offline_xpm)), QIcon::Normal, QIcon::On); enableAct->setIcon(iconset); connect(enableAct, SIGNAL(triggered()), this, SLOT(toggleMenu(void))); clearAct = new QAction(QIcon(QPixmap(const_cast(eraselog_xpm))), tr("Clear output"), this); clearAct->setShortcut(Qt::CTRL + Qt::Key_Backspace); connect(clearAct, SIGNAL(triggered()), this, SLOT(clear(void))); Toolbar->addAction(clearAct); Toolbar->addSeparator(); Toolbar->addWidget( new QLabel(tr("Refresh") + " ", Toolbar)); Refresh = toRefreshCreate(Toolbar, TO_TOOLBAR_WIDGET_NAME, toConfigurationSingle::Instance().polling()); Toolbar->addWidget(Refresh); connect(Refresh, SIGNAL(activated(const QString &)), this, SLOT(changeRefresh(const QString &))); Toolbar->addWidget(new toSpacer()); Output = new toMarkedText(this); layout()->addWidget(Output); ToolMenu = NULL; connect(toMainWidget()->workspace(), SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(windowActivated(QMdiSubWindow *))); try { connect(timer(), SIGNAL(timeout(void)), this, SLOT(refresh(void))); toRefreshParse(timer(), toConfigurationSingle::Instance().polling()); } TOCATCH; if (enabled) disable(false); setFocusProxy(Output); } void toOutput::windowActivated(QMdiSubWindow *widget) { if (!widget) return; if (widget->widget() == this) { if (!ToolMenu) { ToolMenu = new QMenu(tr("&Output"), this); ToolMenu->addAction(refreshAct); ToolMenu->addSeparator(); ToolMenu->addAction(enableAct); ToolMenu->addAction(clearAct); toMainWidget()->addCustomMenu(ToolMenu); } } else { delete ToolMenu; ToolMenu = NULL; } } static toSQL SQLEnable("toOutput:Enable", "BEGIN\n" " SYS.DBMS_OUTPUT.ENABLE;\n" "END;", "Enable output collection"); static toSQL SQLDisable("toOutput:Disable", "BEGIN\n" " SYS.DBMS_OUTPUT.DISABLE;\n" "END;", "Disable output collection"); void toOutput::toggleMenu() { enableAct->setChecked(!enableAct->isChecked()); } void toOutput::disable(bool dis) { try { if (dis) connection().allExecute(SQLDisable); else connection().allExecute(SQLEnable); QString str = toSQL::string(SQLEnable, connection()); if (dis) connection().delInit(str); else connection().addInit(str); } catch (...) { toStatusMessage(tr("Couldn't enable/disable output for session")); } } toOutput::~toOutput() { } void toOutput::closeEvent(QCloseEvent *event) { try { disable(true); OutputTool.closeWindow(connection()); } TOCATCH; event->accept(); } static toSQL SQLLines("toOutput:Poll", "BEGIN\n" " SYS.DBMS_OUTPUT.GET_LINE(:lines,\n" " :stat);\n" " :lines := :lines || chr(10);\n" "END;", "Get lines from SQL Output, must use same bindings"); void toOutput::poll() { try { bool any; do { toQList params; toQuery query(connection(), toQuery::All, SQLLines, params); any = false; while (!query.eof()) { QString line = query.readValueNull(); int status = query.readValueNull().toInt(); if (status == 0) { any = true; if (!line.isNull()) insertLine(line); } } } while (any); } TOCATCH; } void toOutput::refresh(void) { poll(); } void toOutput::clear(void) { Output->clear(); } void toOutput::changeRefresh(const QString &str) { try { toRefreshParse(timer(), str); } TOCATCH; } bool toOutput::enabled(void) { return !enableAct->isChecked(); } static toSQL SQLLog("toLogOutput:Poll", "SELECT LDATE||'.'||to_char(mod(LHSECS,100),'09') \"Timestamp\",\n" " decode(llevel,1,'OFF',\n" " 2,'FATAL',\n" " 3,'ERROR',\n" " 4,'WARNING',\n" " 5,'INFO',\n" " 6,'DEBUG',\n" " 7,'ALL' ,\n" " 'UNDEFINED') \"Level\",\n" " LUSER \"User\",\n" " LSECTION \"Section\",\n" " LTEXTE \"Text\"\n" " from %1.tlog order by id desc\n", "Poll data from PL/SQL log table"); toLogOutput::toLogOutput(QWidget *parent, toConnection &connection) : toOutput(parent, connection) { Type = new QComboBox(toolBar()); Type->addItem(tr("SQL Output")); Type->addItem(tr("Log4PL/SQL")); Type->setCurrentIndex(toConfigurationSingle::Instance().logType()); toolBar()->addWidget(Type); connect(Type, SIGNAL(activated(int)), this, SLOT(changeType())); Log = new toResultView(false, false, this); changeType(); } void toLogOutput::refresh(void) { if (Type->currentIndex() == 1) { Log->setSQL(QString::null); Log->query(SQLLog(connection()).arg(toConfigurationSingle::Instance().logUser())); } toOutput::refresh(); } void toLogOutput::changeType(void) { if (Type->currentIndex() == 1) { output()->hide(); Log->show(); refresh(); } else { output()->show(); Log->hide(); } } tora-2.1.3/src/toresultschema.h0000644000175000017500000000505511270353625016263 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTSCHEMA_H #define TORESULTSCHEMA_H #include "config.h" #include "toresultcombo.h" class toConnection; /** * This widget displays a list of schemas * */ class toResultSchema : public toResultCombo { Q_OBJECT; QString ConnectionKey; public: /** * Create the widget. * * @param parent Parent widget. * @param name Name of widget. */ toResultSchema(toConnection &conn, QWidget *parent, const char *name = NULL); private slots: // stores last schema selected in qsettings void updateLastSchema(const QString &schema); public slots: /** * Updates connections to use schema * */ void update(const QString &schema); /** * Update to currently selected schema * */ void update(void); }; #endif tora-2.1.3/src/tolistviewformatterhtml.h0000644000175000017500000000417211270353625020242 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOLISTVIEWFORMATTERHTML_H #define TOLISTVIEWFORMATTERHTML_H #include "config.h" #include "tolistviewformatter.h" class toListViewFormatterHTML : public toListViewFormatter { public: toListViewFormatterHTML(); virtual ~toListViewFormatterHTML(); virtual QString getFormattedString(toExportSettings &settings, const QAbstractItemModel * model); }; #endif tora-2.1.3/src/tonewconnection.cpp0000644000175000017500000004564711402451646017002 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "tonewconnection.h" #include "toconnectionimport.h" #include "tomain.h" #include "totool.h" #include "toconnectionmodel.h" #include "icons/trash.xpm" #include #include #include #include #include #include // #define MAX_HISTORY 50 const QString toNewConnection::ORACLE_INSTANT = "Oracle (Instant Client)"; const QString toNewConnection::ORACLE_TNS = "Oracle (TNS)"; static toConnectionModel *m_connectionModel = 0; static QSortFilterProxyModel *m_proxyModel = 0; toNewConnection::toNewConnection(QWidget* parent, Qt::WFlags fl) : QDialog(parent, fl), toHelpContext(QString::fromLatin1("newconnection.html")) { setupUi(this); colorComboBox->addItem("None", ""); ConnectionColorsIterator it(toConfigurationSingle::Instance().connectionColors()); while (it.hasNext()) { it.next(); colorComboBox->addItem(connectionColorPixmap(it.key()), it.value(), it.key()); } toHelp::connectDialog(this); Previous->setModel(proxyModel()); proxyModel()->setFilterWildcard("*"); std::list lst = toConnectionProvider::providers(); Q_FOREACH(QString s, lst) { if (s == "Oracle") { Provider->addItem(ORACLE_INSTANT); Provider->addItem(ORACLE_TNS); } else Provider->addItem(s); } if (Provider->count() < 1) { TOMessageBox::information( this, tr("No connection provider"), tr("No available connection provider")); reject(); return; } NewConnection = 0; Previous->setContextMenuPolicy(Qt::CustomContextMenu); PreviousContext = new QMenu(this); QAction *delact = PreviousContext->addAction( QIcon(trash_xpm), tr("&Delete")); connect(delact, SIGNAL(triggered()), this, SLOT(historyDelete())); connect(Previous, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(previousMenu(const QPoint &))); Settings.beginGroup("connections"); readSettings(); Previous->horizontalHeader()->setStretchLastSection(true); Previous->horizontalHeader()->setHighlightSections(false); Previous->verticalHeader()->setVisible(false); connect(Previous->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &,const QModelIndex &)), this, SLOT(previousCellChanged(const QModelIndex &))); connect(Provider, SIGNAL(currentIndexChanged(int)), this, SLOT(changeProvider(int))); connect(Previous, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(accept())); connect(Host, SIGNAL(editTextChanged(QString)), this, SLOT(changeHost())); connect(ImportButton, SIGNAL(clicked()), this, SLOT(importButton_clicked())); connect(searchEdit, SIGNAL(textEdited(const QString &)), this, SLOT(searchEdit_textEdited(const QString &))); connect(testConnectionButton, SIGNAL(clicked()), this, SLOT(testConnectionButton_clicked())); // must make sure this gets called manually. changeProvider(Provider->currentIndex()); Previous->setFocus(Qt::OtherFocusReason); } QString toNewConnection::realProvider() { QString p = Provider->currentText(); if (p.startsWith("Oracle")) return "Oracle"; return p; } void toNewConnection::readSettings() { restoreGeometry(Settings.value("geometry").toByteArray()); connectionModel()->readConfig(); Previous->setSortingEnabled(false); Previous->resizeColumnsToContents(); Previous->setSortingEnabled(true); int sortList = Settings.value(CONF_PROVIDER_LIST_SORT_OFFSET,DEFAULT_PROVIDER_LIST_SORT_OFFSET).toInt(); Previous->sortByColumn(abs(sortList), (sortList>=0 ? Qt::AscendingOrder : Qt::DescendingOrder)); Previous->hideColumn(0); } void toNewConnection::writeSettings(bool checkHistory) { int r = 0; Settings.setValue("geometry", saveGeometry()); Settings.setValue(CONF_PROVIDER_LIST_SORT_OFFSET, (Previous->horizontalHeader()->sortIndicatorOrder() == Qt:: AscendingOrder? 1:-1)* Previous->horizontalHeader()->sortIndicatorSection()); Settings.remove("history"); if (!Provider->currentText().isEmpty() && checkHistory) { Settings.beginGroup("history/0"); Settings.setValue("provider", Provider->currentText()); Settings.setValue("username", Username->text()); if (toConfigurationSingle::Instance().savePassword()) { Settings.setValue("password", toObfuscate(Password->text())); } Settings.setValue("host", Host->currentText()); Settings.setValue("port", Port->value()); Settings.setValue("database", Database->currentText()); Settings.setValue("schema", Schema->text()); Settings.setValue("color", colorComboBox->itemData(colorComboBox->currentIndex())); Settings.beginGroup("options"); QList widgets = OptionGroup->findChildren(); Q_FOREACH(QCheckBox *box, widgets) Settings.setValue(box->text(), box->isChecked()); Settings.endGroup(); // options Settings.endGroup(); // history/0 ++r; } // find history item with same options. will skip later. int skip = -1; if (checkHistory) { skip = findHistory(Provider->currentText(), Username->text(), Host->currentText(), Database->currentText(), Schema->text(), colorComboBox->itemData(colorComboBox->currentIndex()).toString(), Port->value() ); } QMap c = connectionModel()->availableConnections(); foreach(int row, c.keys()) { if (row == skip)// && ++skipped) continue; toConnectionOptions &opt = c[row]; Settings.beginGroup("history/" + QString::number(r/*row*/));// + 1 - skipped)); Settings.setValue("provider", opt.provider); Settings.setValue("username", opt.username); Settings.setValue("host", opt.host); Settings.setValue("database", opt.database); Settings.setValue("schema", opt.schema); Settings.setValue("color", opt.color); Settings.setValue("port", opt.port); if (toConfigurationSingle::Instance().savePassword()) { Settings.setValue("password", toObfuscate(opt.password)); } Settings.beginGroup("options"); Q_FOREACH(QString s, opt.options) Settings.setValue(s, true); Settings.endGroup(); Settings.endGroup(); ++r; } connectionModel()->readConfig(); } int toNewConnection::findHistory(const QString &provider, const QString &username, const QString &host, const QString &database, const QString &schema, const QString &color, int port) { QMapIterator i(connectionModel()->availableConnections()); while (i.hasNext()) { i.next(); toConnectionOptions opt = i.value(); if (provider == opt.provider && username == opt.username && host == opt.host && database == opt.database && schema == opt.schema && color == opt.color && port == opt.port) return i.key(); } return -1; } void toNewConnection::loadPrevious(const QModelIndex & current) { if (!current.isValid()) return; QModelIndex baseIndex = proxyModel()->index(current.row(), 0); int index = proxyModel()->data(baseIndex, Qt::DisplayRole).toInt(); toConnectionOptions opt = connectionModel()->availableConnection(index); Provider->setCurrentIndex(Provider->findText(opt.provider)); Host->lineEdit()->setText(opt.host); Database->lineEdit()->setText(opt.database); Username->setText(opt.username); Password->setText(opt.password); Port->setValue(opt.port); Schema->setText(opt.schema); int ix = colorComboBox->findData(opt.color); // safe fallback routine for undefined colors... if (ix == -1) { colorComboBox->addItem(connectionColorPixmap(opt.color), opt.color, opt.color); ix = colorComboBox->count() - 1; } colorComboBox->setCurrentIndex(ix); QList widgets = OptionGroup->findChildren(); Q_FOREACH(QCheckBox *box, widgets) box->setChecked(opt.options.find(box->text()) != opt.options.end()); } void toNewConnection::done(int r) { writeSettings(); if (!r) { QDialog::done(r); return; } NewConnection = makeConnection(true); if (!NewConnection) return; QDialog::done(r); } void toNewConnection::previousCellChanged(const QModelIndex & current) { loadPrevious(current); } void toNewConnection::changeProvider(int current) { try { QString provider = realProvider(); if (provider.isNull() || provider.isEmpty()) return; std::list hosts = toConnectionProvider::hosts(provider); DefaultPort = 0; for (std::list::iterator i = hosts.begin(); i != hosts.end(); i++) { if ((*i).isEmpty()) continue; else if ((*i).startsWith(":")) DefaultPort = (*i).mid(1).toInt(); else Host->addItem(*i); } // seems i broke this for oracle if (!DefaultPort) { if (provider.startsWith("Oracle")) DefaultPort = 1521; } if (Provider->currentText() == ORACLE_TNS || Provider->currentText() == ORACLE_INSTANT ) { SchemaLabel->show(); Schema->show(); } else { SchemaLabel->hide(); Schema->hide(); } Port->setValue(DefaultPort); if (Provider->currentText() == ORACLE_TNS) { HostLabel->hide(); Host->hide(); PortLabel->hide(); Port->hide(); } else { HostLabel->show(); Host->show(); PortLabel->show(); Port->show(); } QList widgets = OptionGroup->findChildren(); Q_FOREACH(QWidget *w, widgets) delete w; std::list options = toConnectionProvider::options(provider); for (std::list::iterator j = options.begin(); j != options.end(); j++) { if (*j == "-") continue; QString option = *j; bool defOn = false; if (option.startsWith("*")) { defOn = true; option = option.mid(1); } QCheckBox *ow = new QCheckBox(OptionGroup); ow->setText(option); ow->setChecked(defOn); OptionGroup->layout()->addWidget(ow); ow->show(); } if (options.empty()) OptionGroup->hide(); else OptionGroup->show(); changeHost(); } catch (const QString &str) { toStatusMessage(str); } } void toNewConnection::changeHost(void) { QString prov = realProvider(); try { if(Host->isVisible() || (prov == "Oracle")) { QString host = Host->currentText(); if (Provider->currentText() == ORACLE_TNS) host = "SQL*Net"; std::list databases = toConnectionProvider::databases( prov, host, Username->text(), Password->text()); QString current = Database->currentText(); Database->clear(); Q_FOREACH(QString s, databases) Database->addItem(s); Database->lineEdit()->setText(current); } } catch(const QString &str) { Database->clear(); toStatusMessage(str); } } void toNewConnection::importButton_clicked() { toConnectionImport dia; if (!dia.exec()) return; Previous->setSortingEnabled(false); // find latest id (max+1) QList keys = connectionModel()->availableConnections().keys(); qSort(keys); int max = 0; if (keys.count() > 0) max = keys.at(keys.count()-1) + 1; foreach (toConnectionOptions opt, dia.availableConnections().values()) { if (findHistory(opt.provider, opt.username, opt.host, opt.database, opt.schema, opt.color, opt.port) != -1) continue; connectionModel()->append(max, opt); ++max; } writeSettings(); Previous->setSortingEnabled(true); } void toNewConnection::searchEdit_textEdited(const QString & text) { proxyModel()->setFilterWildcard(QString("*%1*").arg(text)); } void toNewConnection::testConnectionButton_clicked() { toConnection * c = makeConnection(false); if (c) { QMessageBox::information(this->parentWidget(), tr("Connection succeeded"), tr("Connection succeeded") ); delete c; } } toConnection* toNewConnection::makeConnection(bool savePrefs) { try { QString pass; QString host; if (!Host->isHidden()) host = Host->currentText(); QString schema; if (!Schema->isHidden()) schema = Schema->text(); QString optionstring; std::set options; QList widgets = OptionGroup->findChildren(); Q_FOREACH(QCheckBox *box, widgets) { if (!optionstring.isEmpty()) optionstring += ","; if (box->isChecked()) { optionstring += "*"; // ug. this is awesome. i broke it when i added // accelerators. options.insert(box->text().replace("&", "")); } optionstring += box->text(); } QString provider = realProvider(); if (Port->value() != 0 && Port->value()) host += ":" + QString::number(Port->value()); QString database = Database->currentText(); if (Provider->currentText() == ORACLE_INSTANT) { // create the rest of the connect string. this will work // without an ORACLE_HOME. int port = Port->value(); database = "//" + Host->currentText() + ":" + QString::number(port) + "/" + database; host = ""; } // checks for existing connection std::list con = toMainWidget()->connections(); for (std::list::iterator i = con.begin();i != con.end();i++) { try { toConnection &conn = toMainWidget()->connection(*i); if (conn.user() == Username->text() && conn.provider() == realProvider() && conn.host() == host && conn.database() == database && conn.schema() == schema) return &conn; } catch (...) {} } toConnection *retCon = new toConnection( provider, Username->text(), Password->text(), host, database, schema, colorComboBox->itemData(colorComboBox->currentIndex()).toString(), options); if (savePrefs) writeSettings(true); return retCon; } catch (const QString &exc) { QString str = tr("Unable to connect to the database.\n"); str.append(exc); TOMessageBox::information(this->parentWidget(), tr("Unable to connect to the database"), str); return NULL; } } void toNewConnection::previousMenu(const QPoint &pos) { Q_UNUSED(pos); PreviousContext->exec(QCursor::pos()); } void toNewConnection::historyDelete() { QModelIndex index = proxyModel()->mapToSource(Previous->currentIndex()); connectionModel()->removeRow(index.row(), QModelIndex()); writeSettings(false); readSettings(); } toConnectionModel* toNewConnection::connectionModel() { if(!m_connectionModel) m_connectionModel = new toConnectionModel; return m_connectionModel; } QSortFilterProxyModel* toNewConnection::proxyModel() { if(!m_proxyModel) { m_proxyModel = new QSortFilterProxyModel; m_proxyModel->setSourceModel(connectionModel()); m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); m_proxyModel->setFilterKeyColumn(-1); } return m_proxyModel; } tora-2.1.3/src/tosecurityquotaui.ui0000644000175000017500000000757311270353625017240 0ustar michaelmichael toSecurityQuotaUI 0 0 682 596 0 0 0 0 0 0 true Tablespace Quota Size Used Size false 0 0 0 0 0 6 6 Qt::TabFocus &Unlimited &None &Value true Belongs to Resource group or has unlimited tablespace privilege Qt::AlignCenter false toTreeWidget QTreeWidget
totreewidget.h
toFilesize QWidget
tofilesize.h
Tablespaces Value None Unlimited Size
tora-2.1.3/src/toscriptui.ui0000644000175000017500000010100511270353625015604 0ustar michaelmichael toScriptUI 0 0 918 881 0 0 0 0 918 881 0 0 0 906 837 0 0 Configuration 0 0 453 827 &Options 11 6 Compare two databases or schemas Compare true 0 Extract script to recreate database objects. Extract false 1 Include code specification true 10 Include storage specification true 10 Include parallel specification true 10 Include partition specification true 10 Include indexes true 10 true Include comments true 10 Include grants true 10 Include constraints true 10 false Include DDL true 10 Search 3 Qt::Vertical QSizePolicy::Expanding 20 20 true Create database scripts to convert schema or database from source to destination Migrate false 2 true Create database scripts to convert schema or database from source to destination Report false 4 false Qt::NoFocus Generate prompts to display progress in SQLPlus Generate prompts false 10 Qt::Vertical QSizePolicy::Expanding 20 20 false Generate header at the top of the script Generate header true 10 true false Same None Select the schema to generate in script Generated schema false false Qt::NoFocus Include content of tables false 10 The number of insertstatements to make between each commit (0 means whole table) Commit distance false false 1000000 false Output 11 6 Output tab true 1 Qt::NoFocus Output to directory so that each object is placed in a different file. Output dir 3 Qt::NoFocus Output file 6 0 false false Browse false &Search 11 6 Contain any words true 2 Qt::NoFocus Contain all words false 1 Qt::NoFocus RegExp false 3 Qt::NoFocus Exact match 4 0 0 906 837 Resize 11 6 0 0 Script Resize 11 6 Don't resize true Auto resize Custom resize false QFrame::NoFrame QFrame::Plain 11 6 Qt::Vertical QSizePolicy::Expanding 20 20 true Limit Initial Next Qt::TabFocus Qt::TabFocus Qt::TabFocus 0 0 &Add true 0 0 &Remove Qt::Horizontal QSizePolicy::Minimum 20 20 Qt::Horizontal QSizePolicy::Expanding 20 20 0 0 906 837 Result 0 0 906 837 Difference toTreeWidget QTreeWidget
totreewidget.h
toFilesize QWidget
tofilesize.h
toScriptSchemaWidget QWidget
toscriptschemawidget.h
1
Tabs Compare IncludeDDL IncludeConstraints IncludeIndexes IncludeGrants IncludeStorage IncludeParallell IncludePartition IncludeCode IncludeComment IncludeContent IncludePrompt IncludeHeader Schema OutputTab Filename Browse AnyWords SearchWord OutputFile DontResize AutoResize CustomResize Limit Initial Next Sizes AddButton Remove ExactMatch RegExp Extract Migrate AllWords OutputDir CustomResize toggled(bool) Frame4 setEnabled(bool) 20 20 20 20 Search toggled(bool) Schema setDisabled(bool) 20 20 20 20 IncludeDDL toggled(bool) IncludeConstraints setEnabled(bool) 20 20 20 20 IncludeDDL toggled(bool) IncludeIndexes setEnabled(bool) 20 20 20 20 IncludeDDL toggled(bool) IncludeGrants setEnabled(bool) 20 20 20 20 IncludeDDL toggled(bool) IncludeStorage setEnabled(bool) 20 20 20 20 IncludeDDL toggled(bool) IncludeParallell setEnabled(bool) 20 20 20 20 IncludeDDL toggled(bool) IncludeComment setEnabled(bool) 20 20 20 20 IncludeDDL toggled(bool) IncludeCode setEnabled(bool) 20 20 20 20 IncludeDDL toggled(bool) IncludePartition setEnabled(bool) 20 20 20 20 Search toggled(bool) SearchGroup setEnabled(bool) 20 20 20 20 OutputTab toggled(bool) Filename setDisabled(bool) 20 20 20 20 OutputTab toggled(bool) Browse setDisabled(bool) 20 20 20 20 Extract toggled(bool) OutputDir setEnabled(bool) 20 20 20 20 IncludeContent toggled(bool) CommitDistance setEnabled(bool) 20 20 20 20
tora-2.1.3/src/tosyntaxsetupui.ui0000644000175000017500000003520511351477200016713 0ustar michaelmichael toSyntaxSetupUI 0 0 528 557 Form1 6 0 0 Options Enable syntax highlighting, or use simple text editor S&yntax highlighting Display the line/column marker at the specified position Use &maximum text width mark Specify the column (text width) where to show marker 1 999999 Convert all keywords to uppercase when displayingsyntaxhighlighted text. Only available for monospaced fonts. &Keyword upper Table, view, column names etc. are extracted in upper-case Object names upper true Activate code completion in SQL editors. Not recommended on slow connections. &Code completion &Editor shortcuts (TAB replacement) E&dit... false Sort the available completion rows alphabetically or in the order the are. &Sort completion rows true Indent a new line in an editor to the same column as the previous line &Indent same as previous line Text example false Choose Code example false Choose List example false Choose Filename extensions false Number of character width of tabstops Number of character width of tabstops Tab stop width false TabStop 1 If set the editor will insert spaces rather than tabs Use only spaces when indenting Static checker: Qt::Vertical 20 40 Syntax Sy&ntax components 11 6 false 0 0 &Pick 200 0 toHighlightedText QWidget
tohighlightedtext.h
SyntaxComponent PushButton3 PushButton1 clicked() toSyntaxSetupUI selectResultFont() 20 20 20 20 PushButton1_2 clicked() toSyntaxSetupUI selectFont() 20 20 20 20 SyntaxHighlighting toggled(bool) toSyntaxSetupUI changeHighlight(bool) 20 20 20 20 KeywordUpper toggled(bool) toSyntaxSetupUI changeUpper(bool) 20 20 20 20 PushButton3 clicked() toSyntaxSetupUI selectColor() 20 20 20 20 SyntaxComponent itemClicked(QListWidgetItem*) toSyntaxSetupUI changeLine(QListWidgetItem*) 20 20 20 20 CodeCompletion toggled(bool) CompletionSort setEnabled(bool) 20 20 20 20 SyntaxHighlighting toggled(bool) CodeCompletion setEnabled(bool) 20 20 20 20 PushButton1_2_2 clicked() toSyntaxSetupUI selectText() 20 20 20 20
tora-2.1.3/src/tostoragedatafileui.ui0000644000175000017500000001307211270353625017444 0ustar michaelmichael toStorageDatafileUI 0 0 580 480 Form1 11 11 11 11 6 6 &Tablespace name false Name &Filename false Name &Browse Qt::Vertical QSizePolicy::Expanding 20 20 Auto extend 11 11 11 11 6 6 &Auto extend datafile false &Unlimited max size false false toFilesize QWidget
tofilesize.h
AutoExtend toggled(bool) toStorageDatafileUI autoExtend(bool) 20 20 20 20 UnlimitedMax toggled(bool) toStorageDatafileUI maximumSize(bool) 20 20 20 20 PushButton1 clicked() toStorageDatafileUI browseFile() 20 20 20 20 Filename textChanged(QString) toStorageDatafileUI valueChanged(QString) 20 20 20 20
tora-2.1.3/src/tochartmanager.h0000644000175000017500000001544711270353625016226 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOCHARTMANAGER_H #define TOCHARTMANAGER_H #include "config.h" #include "tohelp.h" #include "ui_tochartsetupui.h" #include "ui_tochartalarmui.h" #include #include #include #include #include class toChartManager; class toLineChart; class toListView; class toResult; class toChartSetup; class toChartAlarm; class toChartHandler; class toChartReceiver : public QObject { Q_OBJECT QString LastName; toChartHandler *Parent; toLineChart *Chart; toResult *Result; public: toChartReceiver(toChartHandler *parent, toLineChart *chart); toLineChart *chart(void) { return Chart; } toResult *result(void); QString name(void); public slots: void valueAdded(std::list &value, const QString &xValues); }; class toChartManager : public QWidget, public toHelpContext { Q_OBJECT struct alarmSignal; struct chartAlarm; friend struct chartAlarm; friend struct alarmSignal; enum action { StatusMessage = 0, Email = 1, Ignore = 2 }; struct alarmSignal { action Action; QString xValue; QString Chart; QString Alarm; QString Extra; alarmSignal(); alarmSignal(action act, const QString &xvalue, const QString &chart, const QString &alarm, const QString &extra) : Action(act), xValue(xvalue), Chart(chart), Alarm(alarm), Extra(extra) { } } ; struct chartTrack { QFile File; bool Persistent; chartTrack() { Persistent = true; } chartTrack(const QString &file, bool pers) : File(file) { Persistent = pers; } chartTrack(const chartTrack &fil) : File(fil.File.fileName()) { Persistent = fil.Persistent; } const chartTrack &operator =(const chartTrack &fil) { if (fil.File.fileName() != File.fileName()) { File.close(); File.setFileName(fil.File.fileName()); } Persistent = fil.Persistent; return *this; } }; struct chartAlarm { enum operation { Any, All, Sum, Average, Max, Min }; enum comparison { Equal, NotEqual, Less, Greater, LessEqual, GreaterEqual }; operation Operation; comparison Comparison; action Action; double Value; std::list Columns; bool Persistent; bool Signal; QString Extra; chartAlarm(); chartAlarm(const QString &, bool persistent); chartAlarm(operation oper, comparison comp, action act, double value, std::list &cols, const QString &extra, bool persistent); QString toString(void); bool checkValue(double value); void valueAdded(toChartHandler *handler, const QString &str, std::list &value, const QString &xValue); }; QTimer Refresh; toListView *List; toChartReceiver *selectedChart(void); public: toChartManager(QWidget *parent); ~toChartManager(); friend class toChartSetup; friend class toChartAlarm; friend class toChartHandler; public slots: void refresh(void); void setupChart(void); void openChart(void); }; class toChartHandler : public QObject { Q_OBJECT QTimer Timer; std::map > Alarms; std::map Files; std::list Charts; std::list SignalAlarms; void loadSettings(void); void saveSettings(void); public: toChartHandler(); ~toChartHandler(); void valueAdded(toLineChart *chart, const QString &chartName, std::list &vale, const QString &xValue); friend class toChartManager; friend struct toChartManager::alarmSignal; friend struct toChartManager::chartAlarm; public slots: void alarm(void); void addChart(toLineChart *chart); void setupChart(toLineChart *chart); void removeChart(toLineChart *chart); }; class toChartSetup : public QDialog, public Ui::toChartSetupUI { Q_OBJECT; toLineChart *Chart; public: toChartSetup(toLineChart *chart, QWidget* parent, const char* name, bool modal); public slots: virtual void browseFile(); virtual QString modifyAlarm(const QString &str, bool &persistent); virtual void addAlarm(); virtual void modifyAlarm(); virtual void removeAlarm(); }; class toChartAlarm : public QDialog, public Ui::toChartAlarmUI { Q_OBJECT; public: toChartAlarm(QWidget *parent = 0, const char *name = 0, bool modal = FALSE, Qt::WFlags fl = 0); public slots: virtual void changeValue(int val); }; #endif tora-2.1.3/src/toresultline.h0000644000175000017500000001377311270353625015760 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTLINE_H #define TORESULTLINE_H #include "config.h" #include "tobackground.h" #include "tolinechart.h" #include "toresult.h" #include #include class QMenu; class toNoBlockQuery; class toSQL; /** Display the result of a query in a piechart. The first column of the query should * contain the x value and the rest of the columns should be values of the diagram. The * legend is the column name. Connects to the tool timer for updates automatically. */ class toResultLine : public toLineChart, public toResult { Q_OBJECT /** Display flow in change per second instead of actual values. */ bool Flow; bool Started; /** Timestamp of last fetch. */ time_t LastStamp; /** Last read values. */ std::list LastValues; bool First; toNoBlockQuery *Query; toBackground Poll; unsigned int Columns; void query(const QString &sql, const toQList ¶m, bool first); public: /** Create widget. * @param parent Parent of list. * @param name Name of widget. */ toResultLine(QWidget *parent, const char *name = NULL); /** Destroy chart */ ~toResultLine(); /** Stop automatic updating from tool timer. */ void stop(); /** Start automatic updating from tool timer. */ void start(); /** Display actual values or flow/s. * @param on Display flow or absolute values. */ void setFlow(bool on) { Flow = on; } /** Return if flow is displayed. * @return If flow is used. */ bool flow(void) { return Flow; } /** Reimplemented for internal reasons. */ virtual void query(const QString &sql, const toQList ¶m) { query(sql, param, true); } /** Reimplemented for internal reasons. */ virtual void clear(void) { LastStamp = 0; LastValues.clear(); toLineChart::clear(); } /** Transform valueset. Make it possible to perform more complex transformation. * called directly before adding the valueset to the chart. After flow transformation. * Default is passthrough. * @param input The untransformed valueset. * @return The valueset actually added to the chart. */ virtual std::list transform(std::list &input); /** Handle any connection */ virtual bool canHandle(toConnection &) { return true; } // Why are these needed? #if 1 /** Set the SQL statement of this list * @param sql String containing statement. */ void setSQL(const QString &sql) { toResult::setSQL(sql); } /** Set the SQL statement of this list. This will also affect @ref Name. * @param sql SQL containing statement. */ void setSQL(const toSQL &sql) { toResult::setSQL(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const QString &sql) { toResult::query(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql) { toResult::query(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql, toQList &par) { toResult::query(sql, par); } #endif public slots: /** Reimplemented for internal reasons. */ virtual void refresh(void) { query(sql(), params(), false); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1) { toResult::changeParams(Param1); } /** Reimplemented For internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2) { toResult::changeParams(Param1, Param2); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3) { toResult::changeParams(Param1, Param2, Param3); } protected slots: /** Reimplemented for internal reasons. */ virtual void connectionChanged(void); /** Reimplemented for internal reasons. */ virtual void addMenues(QMenu *); private slots: void poll(void); void editSQL(void); }; #endif tora-2.1.3/src/tobrowserschemawidget.h0000644000175000017500000000754011270353625017635 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBROWSERSCHEMAWIDGET_H #define TOBROWSERSCHEMAWIDGET_H #include #include "toresulttableview.h" class toCodeModel; /*! \brief A base class for "object schema browsers" used in toBrowser m_objectsMap. It's inherited in toBrowserSchemaTableView and toBrowserSchemaCodeBrowser. toBrowser is using toBrowserSchemaTableView as a wrapper for toResultTableView and toBrowserSchemaCodeBrowser as a common widget with QTreeView with its toCodeModel. All inherited classes *must* implement pure virtual method to behave correctly in the toBrowser. \author Petr Vanek */ class toBrowserSchemaBase { public: toBrowserSchemaBase(){}; virtual ~toBrowserSchemaBase(){}; //! \brief Return currently selected object name. virtual QString objectName() = 0; //! \brief Reset widget data depending on new schema and/or filter. virtual void changeParams(const QString & schema, const QString & filter) = 0; }; /*! \brief Wrapper for toResultTableView to display plain SQL results in the toBrowser as a table. \author Petr Vanek */ class toBrowserSchemaTableView : public toResultTableView, public toBrowserSchemaBase { Q_OBJECT public: toBrowserSchemaTableView(QWidget * parent = 0); QString objectName(); void changeParams(const QString & schema, const QString & filter); }; /*! \brief This widget implements DB Code Objects tree structure for toBrowser. All Code objects are displayed as a tree items with improved functionality of its leafs (e.g. for packages etc.). QTreeView is joined with toCodeModel for display. \author Petr Vanek */ class toBrowserSchemaCodeBrowser : public QTreeView, public toBrowserSchemaBase { Q_OBJECT public: toBrowserSchemaCodeBrowser(QWidget * parent = 0); QString objectName(); //! \brief Returns uppercased item's db object type. QString objectType(); void changeParams(const QString & schema, const QString & filter); private: toCodeModel * m_model; }; #endif tora-2.1.3/src/tohelpui.ui0000644000175000017500000001127011270353625015234 0ustar michaelmichael toHelp 0 0 678 452 Help Browser false Backward one help page Qt::LeftArrow false Forward one help page Qt::RightArrow Qt::Horizontal 271 20 Qt::Horizontal 0 0 0 332 375 Contents true Contents 0 0 332 375 Search Search: Manuals: All manuals 24 true Result Manual backButton forwardButton splitter tabs backButton forwardButton Sections SearchLine Manuals Result Help tora-2.1.3/src/tomessage.cpp0000644000175000017500000000557411270353625015551 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include #include "tomessage.h" toMessage::toMessage(QWidget * parent, Qt::WindowFlags f) : QDialog(parent, f) { setupUi(this); setModal(false); Message->setReadOnly(true); buttonBox->button(QDialogButtonBox::Close)->setFocus(Qt::OtherFocusReason); QSettings s; s.beginGroup("toMessage"); restoreGeometry(s.value("geometry", QByteArray()).toByteArray()); s.endGroup(); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(hide())); connect(buttonBox->button(QDialogButtonBox::Reset), SIGNAL(clicked()), Message, SLOT(clear())); } void toMessage::appendText(const QString & text) { if (!isVisible()) show(); if (Message->lines() != 1) Message->append("\n\n"); Message->append(QDateTime::currentDateTime().toString(Qt::TextDate) + "\n"); Message->append(text); Message->ensureLineVisible(Message->lines()); } void toMessage::hideEvent(QHideEvent * event) { QSettings s; s.beginGroup("toMessage"); s.setValue("geometry", saveGeometry()); s.endGroup(); event->accept(); } tora-2.1.3/src/totreewidget.cpp0000644000175000017500000004442211270353625016263 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "config.h" #include "totreewidget.h" #include #include toTreeWidget::toTreeWidget(QWidget *parent, const char *name, Qt::WFlags f) : QTreeWidget(parent) { if (name) setObjectName(name); connect(this, SIGNAL(itemSelectionChanged()), this, SLOT(handleSelectionChange())); connect(this, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(handleDoubleClick(QTreeWidgetItem *, int))); connect(this, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(handleClick(QTreeWidgetItem *, int))); connect(this, SIGNAL(itemExpanded(QTreeWidgetItem *)), this, SLOT(handleExpanded(QTreeWidgetItem *))); connect(this, SIGNAL(itemCollapsed(QTreeWidgetItem *)), this, SLOT(handleCollapsed(QTreeWidgetItem *))); connect(this, SIGNAL(itemActivated(QTreeWidgetItem *, int)), this, SLOT(handleActivated(QTreeWidgetItem *, int))); columnResize = NoColumn; // q3listview default } toTreeWidgetItem* toTreeWidget::firstChild(void) const { QTreeWidgetItem *it = QTreeWidget::topLevelItem(0); if (it) return dynamic_cast(it); return NULL; } toTreeWidgetItem* toTreeWidget::currentItem(void) const { QTreeWidgetItem *it = QTreeWidget::currentItem(); if (it) return dynamic_cast(it); return NULL; } toTreeWidgetItem* toTreeWidget::selectedItem(void) const { QList items = QTreeWidget::selectedItems(); // just return the first item. widgets requiring multiple // selection support should be modified to use selectedItems() if (items.size() > 0) return dynamic_cast(items.at(0)); return NULL; } toTreeWidgetItem* toTreeWidget::itemAt(const QPoint &viewPos) const { QTreeWidgetItem *it = QTreeWidget::itemAt(viewPos); if (it) return dynamic_cast(it); return NULL; } void toTreeWidget::setSorting(int column, bool ascending) { if (column < 0) { QTreeWidget::setSortingEnabled(false); return; } QTreeWidget::setSortingEnabled(true); QTreeWidget::sortByColumn(column, ascending ? Qt::AscendingOrder : Qt::DescendingOrder); } const int toTreeWidget::columns(void) { return QTreeWidget::columnCount(); } int toTreeWidget::addColumn(const QString &label, int width) { QTreeWidgetItem *head = QTreeWidget::headerItem(); if (!head) return -1; int index = head->columnCount(); // dirty, dirty hack. // QTreeWidget appears to always have at least one column. you're // meant to add columns by using setHeaderLabels() but this is a // lot of porting. // check if we have just 1 column and it's name is "1" and then // change the name. if (index == 1 && head->text(0) == "1") index = 0; // don't add head->setText(index, label); return index; } void toTreeWidget::setSelectionMode(SelectionMode mode) { switch (mode) { case Multi: QTreeWidget::setSelectionMode(QAbstractItemView::MultiSelection); break; case Extended: QTreeWidget::setSelectionMode(QAbstractItemView::ExtendedSelection); break; case NoSelection: QTreeWidget::setSelectionMode(QAbstractItemView::NoSelection); break; default: QTreeWidget::setSelectionMode(QAbstractItemView::SingleSelection); } } int toTreeWidget::selectionMode() const { switch (QTreeWidget::selectionMode()) { case QAbstractItemView::MultiSelection: return Multi; case QAbstractItemView::ExtendedSelection: return Extended; case QAbstractItemView::NoSelection: return NoSelection; case QAbstractItemView::SingleSelection: return Single; case QAbstractItemView::ContiguousSelection: return Extended; default: return Single; } } void toTreeWidget::takeItem(toTreeWidgetItem *it) { int pos = QTreeWidget::indexOfTopLevelItem(it); if (pos < 0) return; // not found QTreeWidget::takeTopLevelItem(pos); } void toTreeWidget::setColumnAlignment(int column, int align) { ; // stub } int toTreeWidget::itemMargin() const { return 1; // stub } void toTreeWidget::setTreeStepSize(int i) { ; // stub } int toTreeWidget::childCount(void) const { return QTreeWidget::topLevelItemCount(); } void toTreeWidget::resizeColumnsToContents(void) { for (int col = 0; col < QTreeWidget::columnCount(); col++) QTreeWidget::resizeColumnToContents(col); } void toTreeWidget::setResizeMode(ResizeMode m) { columnResize = m; if (columnResize == NoColumn) return; if (columnResize == AllColumns) resizeColumnsToContents(); // qtreewidget will by default allow the last column the most // space. if (columnResize == LastColumn) resizeColumnsToContents(); } toTreeWidget::ResizeMode toTreeWidget::resizeMode() const { return columnResize; } void toTreeWidget::setColumnWidthMode(int column, toTreeWidget::WidthMode) { ; // stub } void toTreeWidget::sort(void) { return; // stub } int toTreeWidget::visibleHeight(void) { return 300; // stub } void toTreeWidget::setSelected(toTreeWidgetItem* item, bool selected) { item->setSelected(selected); } void toTreeWidget::ensureItemVisible(const toTreeWidgetItem *tree) { QTreeWidget::scrollToItem(tree); } void toTreeWidget::setOpen(bool o) { int count = toTreeWidget::topLevelItemCount(); for (int i = 0; i < count; i++) QTreeWidget::topLevelItem(i)->setExpanded(o); } void toTreeWidget::setOpen(toTreeWidgetItem *item, bool o) { item->setExpanded(o); } void toTreeWidget::repaintItem(const QTreeWidgetItem *it) const { return; // stub } void toTreeWidget::setShowSortIndicator(bool show) { return; // stub } QString toTreeWidget::columnText(int column) const { return QTreeWidget::headerItem()->text(column); } QModelIndex toTreeWidget::indexFromItem(QTreeWidgetItem *item, int column) const { return QTreeWidget::indexFromItem(item, column); } QTreeWidgetItem* toTreeWidget::itemFromIndex(const QModelIndex &index) const { return QTreeWidget::itemFromIndex(index); } void toTreeWidget::selectAll(bool s) { if (!s) QTreeWidget::clearSelection(); else QTreeWidget::selectAll(); } void toTreeWidget::updateContents() { return; // stub } void toTreeWidget::handleSelectionChange() { QList s = QTreeWidget::selectedItems(); if (s.size() > 0) emit selectionChanged(dynamic_cast(s.at(0))); emit selectionChanged(); } void toTreeWidget::handleDoubleClick(QTreeWidgetItem *item, int column) { if (!item || column < 0) return; emit doubleClicked(dynamic_cast(item)); } void toTreeWidget::handleClick(QTreeWidgetItem *item, int column) { if (!item || column < 0) return; emit clicked(dynamic_cast(item)); } void toTreeWidget::handleExpanded(QTreeWidgetItem *item) { if (item) emit(expanded(dynamic_cast(item))); } void toTreeWidget::handleCollapsed(QTreeWidgetItem *item) { if (item) emit(collapsed(dynamic_cast(item))); } void toTreeWidget::handleActivated(QTreeWidgetItem *item, int column) { if (item) emit(returnPressed(dynamic_cast(item))); } void toTreeWidget::clear(void) { QTreeWidget::clear(); } // -------------------------------------------------- item toTreeWidgetItem::toTreeWidgetItem(QTreeWidget *parent) : QTreeWidgetItem(parent, QTreeWidgetItem::Type) { } toTreeWidgetItem::toTreeWidgetItem(QTreeWidget *parent, toTreeWidgetItem *after) : QTreeWidgetItem(parent, after, QTreeWidgetItem::Type) { } toTreeWidgetItem::toTreeWidgetItem(toTreeWidget *parent, const QString &label0, const QString &label1, const QString &label2, const QString &label3, const QString &label4, const QString &label5, const QString &label6, const QString &label7) : QTreeWidgetItem(parent, QTreeWidgetItem::Type) { if (!label0.isNull()) setText(0, label0); if (!label1.isNull()) setText(1, label1); if (!label2.isNull()) setText(2, label2); if (!label3.isNull()) setText(3, label3); if (!label4.isNull()) setText(4, label4); if (!label5.isNull()) setText(5, label5); if (!label6.isNull()) setText(6, label6); if (!label7.isNull()) setText(7, label7); } toTreeWidgetItem::toTreeWidgetItem(toTreeWidget *parent, toTreeWidgetItem *after, const QString &label0, const QString &label1, const QString &label2, const QString &label3, const QString &label4, const QString &label5, const QString &label6, const QString &label7) : QTreeWidgetItem(parent, after, QTreeWidgetItem::Type) { if (!label0.isNull()) setText(0, label0); if (!label1.isNull()) setText(1, label1); if (!label2.isNull()) setText(2, label2); if (!label3.isNull()) setText(3, label3); if (!label4.isNull()) setText(4, label4); if (!label5.isNull()) setText(5, label5); if (!label6.isNull()) setText(6, label6); if (!label7.isNull()) setText(7, label7); } toTreeWidgetItem::toTreeWidgetItem(toTreeWidgetItem *parent, toTreeWidgetItem *after, const QString &label0, const QString &label1, const QString &label2, const QString &label3, const QString &label4, const QString &label5, const QString &label6, const QString &label7) : QTreeWidgetItem(parent, after, QTreeWidgetItem::Type) { if (!label0.isNull()) setText(0, label0); if (!label1.isNull()) setText(1, label1); if (!label2.isNull()) setText(2, label2); if (!label3.isNull()) setText(3, label3); if (!label4.isNull()) setText(4, label4); if (!label5.isNull()) setText(5, label5); if (!label6.isNull()) setText(6, label6); if (!label7.isNull()) setText(7, label7); } toTreeWidgetItem::toTreeWidgetItem(toTreeWidgetItem *parent, const QString &label0, const QString &label1, const QString &label2, const QString &label3, const QString &label4, const QString &label5, const QString &label6, const QString &label7) : QTreeWidgetItem(parent, QTreeWidgetItem::Type) { if (!label0.isNull()) setText(0, label0); if (!label1.isNull()) setText(1, label1); if (!label2.isNull()) setText(2, label2); if (!label3.isNull()) setText(3, label3); if (!label4.isNull()) setText(4, label4); if (!label5.isNull()) setText(5, label5); if (!label6.isNull()) setText(6, label6); if (!label7.isNull()) setText(7, label7); } toTreeWidgetItem* toTreeWidgetItem::nextSibling() const { toTreeWidget *tree = dynamic_cast( QTreeWidgetItem::treeWidget()); if (!tree) return 0; QModelIndex index = tree->indexFromItem(const_cast(this)); QModelIndex sibling = index.sibling(index.row() + 1, index.column()); if (sibling.isValid()) return dynamic_cast(tree->itemFromIndex(sibling)); return 0; } toTreeWidgetItem* toTreeWidgetItem::firstChild() const { if (QTreeWidgetItem::childCount() > 0) return dynamic_cast(QTreeWidgetItem::child(0)); return 0; } toTreeWidgetItem* toTreeWidgetItem::parent() const { QTreeWidgetItem *p = QTreeWidgetItem::parent(); if (p) return dynamic_cast(p); return 0; } toTreeWidget* toTreeWidgetItem::listView() const { return dynamic_cast(QTreeWidgetItem::treeWidget()); } toTreeWidgetItem* toTreeWidgetItem::itemAbove() const { return parent(); } toTreeWidgetItem* toTreeWidgetItem::itemBelow() const { return firstChild(); } int toTreeWidgetItem::width(const QFontMetrics &fm, const toTreeWidget *lv, int c) const { return 10; // stub } int toTreeWidgetItem::height() { return 10; // stub } bool toTreeWidgetItem::isOpen(void) const { return QTreeWidgetItem::isExpanded(); } void toTreeWidgetItem::setOpen(bool o) { return QTreeWidgetItem::setExpanded(o); } void toTreeWidgetItem::setPixmap(int col, const QPixmap &pix) { QTreeWidgetItem::setIcon(col, QIcon(pix)); } void toTreeWidgetItem::setSelectable(bool enable) { // xor out the selectable flag Qt::ItemFlags fl = QTreeWidgetItem::flags() ^ Qt::ItemIsSelectable; QTreeWidgetItem::setFlags(fl); } void toTreeWidgetItem::moveItem(toTreeWidgetItem *after) { return; // todo } void toTreeWidgetItem::setEnabled(bool b) { Qt::ItemFlags fl = QTreeWidgetItem::flags(); if (!b) { // xor out the enabled flag fl = fl ^ Qt::ItemIsEnabled; } else { // add enabled fl = fl | Qt::ItemIsEnabled; } QTreeWidgetItem::setFlags(fl); } bool toTreeWidgetItem::isEnabled() const { return QTreeWidgetItem::flags() & Qt::ItemIsEnabled; } void toTreeWidgetItem::setExpandable(bool o) { if (!o) { toTreeWidgetItem::setChildIndicatorPolicy( QTreeWidgetItem::DontShowIndicator); } else { toTreeWidgetItem::setChildIndicatorPolicy( QTreeWidgetItem::ShowIndicator); } } int toTreeWidgetItem::depth() const { QTreeWidgetItem *parent; int d = 0; while ((parent = QTreeWidgetItem::parent()) != NULL) d++; return d; } // -------------------------------------------------- check item toTreeWidgetCheck::toTreeWidgetCheck(toTreeWidget *parent, const QString &text, Type) : toTreeWidgetItem(parent, text) { setOn(false); } toTreeWidgetCheck::toTreeWidgetCheck(toTreeWidgetItem *parent, const QString &text, Type) : toTreeWidgetItem(parent, text) { setOn(false); } toTreeWidgetCheck::toTreeWidgetCheck(toTreeWidget *parent, toTreeWidgetItem *after, const QString &text, Type) : toTreeWidgetItem(parent, after, text) { setOn(false); } toTreeWidgetCheck::toTreeWidgetCheck(toTreeWidgetItem *parent, toTreeWidgetItem *after, const QString &text, Type) : toTreeWidgetItem(parent, after, text) { setOn(false); } bool toTreeWidgetCheck::isOn() const { return checkState(0) == Qt::Checked; } void toTreeWidgetCheck::setOn(bool b) { setCheckState(0, b ? Qt::Checked : Qt::Unchecked); } tora-2.1.3/src/tosecurity.cpp0000644000175000017500000014543611270353625015776 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "tochangeconnection.h" #include "toconf.h" #include "toconnection.h" #include "tofilesize.h" #include "tomain.h" #include "tomemoeditor.h" #include "toresultview.h" #include "tosecurity.h" #include "tosql.h" #include "totool.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ui_tosecurityuserui.h" #include "ui_tosecurityroleui.h" #include "icons/addrole.xpm" #include "icons/adduser.xpm" #include "icons/commit.xpm" #include "icons/copyuser.xpm" #include "icons/refresh.xpm" #include "icons/sql.xpm" #include "icons/tosecurity.xpm" #include "icons/trash.xpm" static toSQL SQLUserInfo("toSecurity:UserInfo", "SELECT Account_Status,\n" " Password,\n" " External_Name,\n" " Profile,\n" " Default_Tablespace,\n" " Temporary_Tablespace\n" " FROM sys.DBA_Users\n" " WHERE UserName = :f1", "Get information about a user, must have same columns and same binds."); static toSQL SQLUserInfo7("toSecurity:UserInfo", "SELECT 'OPEN',\n" " Password,\n" " NULL,\n" " Profile,\n" " Default_Tablespace,\n" " Temporary_Tablespace\n" " FROM sys.DBA_Users\n" " WHERE UserName = :f1", "", "0703"); static toSQL SQLRoleInfo("toSecurity:RoleInfo", "SELECT Role,Password_required FROM sys.DBA_Roles WHERE Role = :f1", "Get information about a role, must have same columns and same binds."); static toSQL SQLProfiles("toSecurity:Profiles", "SELECT DISTINCT Profile FROM sys.DBA_Profiles ORDER BY Profile", "Get profiles available."); static toSQL SQLTablespace("toSecurity:Tablespaces", "SELECT DISTINCT Tablespace_Name FROM sys.DBA_Tablespaces" " ORDER BY Tablespace_Name", "Get tablespaces available."); static toSQL SQLRoles("toSecurity:Roles", "SELECT Role FROM sys.Dba_Roles ORDER BY Role", "Get roles available in DB, should return one entry"); static toSQL SQLListSystem("toSecurity:ListSystemPrivs", "SELECT a.name\n" " FROM system_privilege_map a,\n" " v$enabledprivs b\n" " WHERE b.priv_number = a.privilege\n" " ORDER BY a.name", "Get name of available system privileges"); static toSQL SQLQuota("toSecurity:Quota", "SELECT Tablespace_name,\n" " Bytes,\n" " Max_bytes\n" " FROM sys.DBA_TS_Quotas\n" " WHERE Username = :f1\n" " ORDER BY Tablespace_name", "Get information about what quotas the user has, " "must have same columns and same binds."); static toSQL SQLSystemGrant("toSecurity:SystemGrant", "SELECT privilege, NVL(admin_option,'NO') FROM sys.dba_sys_privs WHERE grantee = :f1", "Get information about the system privileges a user has, should have same bindings and columns"); static toSQL SQLRoleGrant("toSecurity:RoleGrant", "SELECT granted_role,\n" " admin_option,\n" " default_role\n" " FROM sys.dba_role_privs\n" " WHERE grantee = :f1", "Get the roles granted to a user or role, " "must have same columns and binds"); class toSecurityTool : public toTool { protected: virtual const char **pictureXPM(void) { return const_cast(tosecurity_xpm); } public: toSecurityTool() : toTool(40, "Security Manager") { } virtual const char *menuItem() { return "Security Manager"; } virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) { return new toSecurity(parent, connection); } virtual void closeWindow(toConnection &connection){}; }; static toSecurityTool SecurityTool; void toSecurityQuota::changeSize(void) { if (CurrentItem) { if (Value->isChecked()) { QString siz; siz.sprintf("%.0f KB", double(Size->value())); CurrentItem->setText(1, siz); } else if (None->isChecked()) { CurrentItem->setText(1, qApp->translate("toSecurityQuota", "None")); } else if (Unlimited->isChecked()) { CurrentItem->setText(1, qApp->translate("toSecurityQuota", "Unlimited")); } } else SizeGroup->setEnabled(false); } toSecurityQuota::toSecurityQuota(QWidget *parent) : QWidget(parent) { setupUi(this); CurrentItem = NULL; update(); QButtonGroup *group = new QButtonGroup(SizeGroup); group->addButton(Value, 1); group->addButton(None, 2); group->addButton(Unlimited, 3); connect(Tablespaces, SIGNAL(selectionChanged()), this, SLOT(changeTablespace())); connect(group, SIGNAL(buttonClicked(int)), this, SLOT(changeSize())); connect(Size, SIGNAL(valueChanged()), this, SLOT(changeSize())); connect(Value, SIGNAL(toggled(bool)), Size, SLOT(setEnabled(bool))); } void toSecurityQuota::update(void) { Tablespaces->clear(); try { toQuery tablespaces(toCurrentConnection(this), SQLTablespace); toTreeWidgetItem *item = NULL; while (!tablespaces.eof()) { item = new toResultViewItem(Tablespaces, item, tablespaces.readValue()); item->setText(1, qApp->translate("toSecurityQuota", "None")); item->setText(3, qApp->translate("toSecurityQuota", "None")); } } TOCATCH } void toSecurityQuota::clearItem(toTreeWidgetItem *item) { item->setText(1, qApp->translate("toSecurityQuota", "None")); item->setText(2, QString::null); item->setText(3, qApp->translate("toSecurityQuota", "None")); } void toSecurityQuota::clear(void) { for (toTreeWidgetItem *item = Tablespaces->firstChild();item;item = item->nextSibling()) item->setText(3, qApp->translate("toSecurityQuota", "None")); } void toSecurityQuota::changeUser(const QString &user) { Tablespaces->show(); SizeGroup->show(); Disabled->hide(); // Do we really have to bother about this? Tablespaces->clearSelection(); toTreeWidgetItem *item = Tablespaces->firstChild(); if (!user.isEmpty()) { try { toQuery quota(toCurrentConnection(this), SQLQuota, user); while (!quota.eof()) { double maxQuota; double usedQuota; QString tbl(quota.readValue()); while (item && item->text(0) != tbl) { clearItem(item); item = item->nextSibling(); } usedQuota = quota.readValue().toDouble(); maxQuota = quota.readValue().toDouble(); if (item) { QString usedStr; QString maxStr; usedStr.sprintf("%.0f KB", usedQuota / 1024); if (maxQuota < 0) maxStr = qApp->translate("toSecurityQuota", "Unlimited"); else if (maxQuota == 0) maxStr = qApp->translate("toSecurityQuota", "None"); else { maxStr.sprintf("%.0f KB", maxQuota / 1024); } item->setText(1, maxStr); item->setText(2, usedStr); item->setText(3, maxStr); item = item->nextSibling(); } } } TOCATCH } while (item) { clearItem(item); item = item->nextSibling(); } SizeGroup->setEnabled(false); CurrentItem = NULL; } void toSecurityQuota::changeTablespace(void) { CurrentItem = Tablespaces->selectedItem(); if (CurrentItem) { QString siz = CurrentItem->text(1); if (siz == qApp->translate("toSecurityQuota", "None")) None->setChecked(true); else if (siz == qApp->translate("toSecurityQuota", "Unlimited")) Unlimited->setChecked(true); else { Value->setChecked(true); Size->setValue(siz.toInt()); } } SizeGroup->setEnabled(true); } QString toSecurityQuota::sql(void) { QString ret; for (toTreeWidgetItem *item = Tablespaces->firstChild();item;item = item->nextSibling()) { if (item->text(1) != item->text(3)) { QString siz = item->text(1); if (siz.right(2) == QString::fromLatin1("KB")) siz.truncate(siz.length() - 1); else if (siz == qApp->translate("toSecurityQuota", "None")) siz = QString::fromLatin1("0 K"); else if (siz == qApp->translate("toSecurityQuota", "Unlimited")) siz = QString::fromLatin1("UNLIMITED"); ret += QString::fromLatin1(" QUOTA "); ret += siz; ret += QString::fromLatin1(" ON "); ret += item->text(0); } } return ret; } class toSecurityUpper : public QValidator { public: toSecurityUpper(QWidget *parent) : QValidator(parent) { } virtual State validate(QString &str, int &) const { str = str.toUpper(); return Acceptable; } }; class toSecurityUser : public QWidget, public Ui::toSecurityUserUI { toConnection &Connection; toSecurityQuota *Quota; enum { password, global, external } AuthType; QString OrgProfile; QString OrgDefault; QString OrgTemp; QString OrgGlobal; QString OrgPassword; bool OrgLocked; bool OrgExpired; public: toSecurityUser(toSecurityQuota *quota, toConnection &conn, QWidget *parent); void clear(bool all = true); void changeUser(const QString &); QString name(void) { return Name->text(); } QString sql(void); }; QString toSecurityUser::sql(void) { QString extra; if (Authentication->currentWidget() == PasswordTab) { if (Password->text() != Password2->text()) { switch (TOMessageBox::warning(this, qApp->translate("toSecurityUser", "Passwords don't match"), qApp->translate("toSecurityUser", "The two versions of the password doesn't match"), qApp->translate("toSecurityUser", "Don't save"), qApp->translate("toSecurityUser", "Cancel"))) { case 0: return QString::null; case 1: throw qApp->translate("toSecurityUser", "Passwords don't match"); } } if (Password->text() != OrgPassword) { extra = QString::fromLatin1(" IDENTIFIED BY \""); extra += Password->text(); extra += QString::fromLatin1("\""); } if (OrgExpired != ExpirePassword->isChecked()) { if (ExpirePassword->isChecked()) extra += QString::fromLatin1(" PASSWORD EXPIRE"); } } else if (Authentication->currentWidget() == GlobalTab) { if (OrgGlobal != GlobalName->text()) { extra = QString::fromLatin1(" IDENTIFIED GLOBALLY AS '"); extra += GlobalName->text(); extra += QString::fromLatin1("'"); } } else if ((AuthType != external) && (Authentication->currentWidget() == ExternalTab)) extra = QString::fromLatin1(" IDENTIFIED EXTERNALLY"); if (OrgProfile != Profile->currentText()) { extra += QString::fromLatin1(" PROFILE \""); extra += Profile->currentText(); extra += QString::fromLatin1("\""); } if (OrgDefault != DefaultSpace->currentText()) { extra += QString::fromLatin1(" DEFAULT TABLESPACE \""); extra += DefaultSpace->currentText(); extra += QString::fromLatin1("\""); } if (OrgTemp != TempSpace->currentText()) { extra += QString::fromLatin1(" TEMPORARY TABLESPACE \""); extra += TempSpace->currentText(); extra += QString::fromLatin1("\""); } if (OrgLocked != Locked->isChecked()) { extra += QString::fromLatin1(" ACCOUNT "); if (Locked->isChecked()) extra += QString::fromLatin1("LOCK"); else extra += QString::fromLatin1("UNLOCK"); } extra += Quota->sql(); QString sql; if (Name->isEnabled()) { if (Name->text().isEmpty()) return QString::null; sql = QString::fromLatin1("CREATE "); } else { if (extra.isEmpty()) return QString::null; sql = QString::fromLatin1("ALTER "); } sql += QString::fromLatin1("USER \""); sql += Name->text(); sql += QString::fromLatin1("\""); sql += extra; return sql; } toSecurityUser::toSecurityUser(toSecurityQuota *quota, toConnection &conn, QWidget *parent) : QWidget(parent), Connection(conn), Quota(quota) { setupUi(this); Name->setValidator(new toSecurityUpper(Name)); setFocusProxy(Name); try { toQuery profiles(Connection, SQLProfiles); while (!profiles.eof()) Profile->addItem(profiles.readValue()); toQuery tablespaces(Connection, SQLTablespace); while (!tablespaces.eof()) { QString buf = tablespaces.readValue(); DefaultSpace->addItem(buf); TempSpace->addItem(buf); } } TOCATCH } void toSecurityUser::clear(bool all) { Name->setText(QString::null); Password->setText(QString::null); Password2->setText(QString::null); GlobalName->setText(QString::null); if (all) { Profile->setCurrentIndex(0); Authentication->setCurrentIndex(Authentication->indexOf(PasswordTab)); ExpirePassword->setChecked(false); ExpirePassword->setEnabled(true); TempSpace->setCurrentIndex(0); DefaultSpace->setCurrentIndex(0); Locked->setChecked(false); } OrgProfile = OrgDefault = OrgTemp = OrgGlobal = QString::null; AuthType = password; Name->setEnabled(true); OrgLocked = OrgExpired = false; } void toSecurityUser::changeUser(const QString &user) { clear(); try { toQuery query(Connection, SQLUserInfo, user); if (!query.eof()) { Name->setEnabled(false); Name->setText(user); QString str(query.readValue()); if (str.startsWith(QString::fromLatin1("EXPIRED"))) { ExpirePassword->setChecked(true); ExpirePassword->setEnabled(false); OrgExpired = true; } else if (str.startsWith(QString::fromLatin1("LOCKED"))) { Locked->setChecked(true); OrgLocked = true; } OrgPassword = query.readValue(); QString pass = query.readValue(); if (OrgPassword == QString::fromLatin1("GLOBAL")) { OrgPassword = QString::null; Authentication->setCurrentIndex(Authentication->indexOf(GlobalTab)); OrgGlobal = pass; GlobalName->setText(OrgGlobal); AuthType = global; } else if (OrgPassword == QString::fromLatin1("EXTERNAL")) { OrgPassword = QString::null; Authentication->setCurrentIndex(Authentication->indexOf(ExternalTab)); AuthType = external; } else { Password->setText(OrgPassword); Password2->setText(OrgPassword); AuthType = password; } { str = query.readValue(); for (int i = 0;i < Profile->count();i++) { if (Profile->itemText(i) == str) { Profile->setCurrentIndex(i); OrgProfile = str; break; } } } { str = query.readValue(); for (int i = 0;i < DefaultSpace->count();i++) { if (DefaultSpace->itemText(i) == str) { DefaultSpace->setCurrentIndex(i); OrgDefault = str; break; } } } { str = query.readValue(); for (int i = 0;i < TempSpace->count();i++) { if (TempSpace->itemText(i) == str) { TempSpace->setCurrentIndex(i); OrgTemp = str; break; } } } } } TOCATCH } class toSecurityRole : public QWidget, public Ui::toSecurityRoleUI { toConnection &Connection; toSecurityQuota *Quota; enum { password, global, external, none } AuthType; public: toSecurityRole(toSecurityQuota *quota, toConnection &conn, QWidget *parent) : QWidget(parent), Connection(conn), Quota(quota) { setupUi(this); Name->setValidator(new toSecurityUpper(Name)); setFocusProxy(Name); } void clear(void); void changeRole(const QString &); QString sql(void); QString name(void) { return Name->text(); } }; QString toSecurityRole::sql(void) { QString extra; if (Authentication->currentWidget() == PasswordTab) { if (Password->text() != Password2->text()) { switch (TOMessageBox::warning(this, qApp->translate("toSecurityRole", "Passwords don't match"), qApp->translate("toSecurityRole", "The two versions of the password doesn't match"), qApp->translate("toSecurityRole", "Don't save"), qApp->translate("toSecurityRole", "Cancel"))) { case 0: return QString::null; case 1: throw qApp->translate("toSecurityRole", "Passwords don't match"); } } if (Password->text().length() > 0) { extra = QString::fromLatin1(" IDENTIFIED BY \""); extra += Password->text(); extra += QString::fromLatin1("\""); } } else if ((AuthType != global) && (Authentication->currentWidget() == GlobalTab)) extra = QString::fromLatin1(" IDENTIFIED GLOBALLY"); else if ((AuthType != external) && (Authentication->currentWidget() == ExternalTab)) extra = QString::fromLatin1(" IDENTIFIED EXTERNALLY"); else if ((AuthType != none) && (Authentication->currentWidget() == NoneTab)) extra = QString::fromLatin1(" NOT IDENTIFIED"); extra += Quota->sql(); QString sql; if (Name->isEnabled()) { if (Name->text().isEmpty()) return QString::null; sql = QString::fromLatin1("CREATE "); } else { if (extra.isEmpty()) return QString::null; sql = QString::fromLatin1("ALTER "); } sql += QString::fromLatin1("ROLE \""); sql += Name->text(); sql += QString::fromLatin1("\""); sql += extra; return sql; } void toSecurityRole::clear(void) { Name->setText(QString::null); Name->setEnabled(true); } void toSecurityRole::changeRole(const QString &role) { try { toQuery query(Connection, SQLRoleInfo, role); Password->setText(QString::null); Password2->setText(QString::null); if (!query.eof()) { Name->setText(role); Name->setEnabled(false); QString str(query.readValue()); if (str == QString::fromLatin1("YES")) { AuthType = password; Authentication->setCurrentIndex(Authentication->indexOf(PasswordTab)); } else if (str == QString::fromLatin1("GLOBAL")) { AuthType = global; Authentication->setCurrentIndex(Authentication->indexOf(GlobalTab)); } else if (str == QString::fromLatin1("EXTERNAL")) { AuthType = external; Authentication->setCurrentIndex(Authentication->indexOf(ExternalTab)); } else { AuthType = none; Authentication->setCurrentIndex(Authentication->indexOf(NoneTab)); } } else { Name->setText(QString::null); Name->setEnabled(true); AuthType = none; Authentication->setCurrentIndex(Authentication->indexOf(NoneTab)); } } TOCATCH } class toSecurityPage : public QWidget { toSecurityRole *Role; toSecurityUser *User; public: toSecurityPage(toSecurityQuota *quota, toConnection &conn, QWidget *parent) : QWidget(parent) { QVBoxLayout *vbox = new QVBoxLayout; vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); setLayout(vbox); Role = new toSecurityRole(quota, conn, this); vbox->addWidget(Role); Role->hide(); User = new toSecurityUser(quota, conn, this); vbox->addWidget(User); setFocusProxy(User); } void changePage(const QString &nam, bool user) { if (user) { Role->hide(); User->show(); User->changeUser(nam); setFocusProxy(User); } else { User->hide(); Role->show(); Role->changeRole(nam); setFocusProxy(Role); } } QString name(void) { if (User->isHidden()) return Role->name(); else return User->name(); } void clear(void) { if (User->isHidden()) Role->clear(); else User->clear(false); } bool user(void) { if (User->isHidden()) return false; return true; } QString sql(void) { if (User->isHidden()) return Role->sql(); else return User->sql(); } }; toSecurityObject::toSecurityObject(QWidget *parent) : QTreeView(parent) { setObjectName("toSecurityObject"); m_model = new toSecurityTreeModel(this); setModel(m_model); // update(); } void toSecurityObject::update(void) { m_model->setupModelData(toCurrentConnection(this).user()); } void toSecurityObject::eraseUser(bool all) { m_model->setupModelData(toCurrentConnection(this).user()); } void toSecurityObject::changeUser(const QString &user) { m_model->setupModelData(user); } void toSecurityObject::sql(const QString &user, std::list &sqlLst) { m_model->sql(user, sqlLst); } toSecuritySystem::toSecuritySystem(QWidget *parent) : toListView(parent) { addColumn(tr("Privilege name")); setRootIsDecorated(true); update(); setSorting(0); connect(this, SIGNAL(clicked(toTreeWidgetItem *)), this, SLOT(changed(toTreeWidgetItem *))); } void toSecuritySystem::update(void) { clear(); try { toQuery priv(toCurrentConnection(this), SQLListSystem); while (!priv.eof()) { toResultViewCheck *item = new toResultViewCheck(this, priv.readValue(), toTreeWidgetCheck::CheckBox); new toResultViewCheck(item, tr("Admin"), toTreeWidgetCheck::CheckBox); } } TOCATCH } void toSecuritySystem::sql(const QString &user, std::list &sqlLst) { for (toTreeWidgetItem *item = firstChild();item;item = item->nextSibling()) { QString sql; toResultViewCheck *check = dynamic_cast(item); toResultViewCheck *chld = dynamic_cast(item->firstChild()); if (chld && chld->isOn() && chld->text(1).isEmpty()) { sql = QString::fromLatin1("GRANT "); sql += item->text(0); sql += QString::fromLatin1(" TO \""); sql += user; sql += QString::fromLatin1("\" WITH ADMIN OPTION"); sqlLst.insert(sqlLst.end(), sql); } else if (check->isOn() && !item->text(1).isEmpty()) { if (chld && !chld->isOn() && !chld->text(1).isEmpty()) { sql = QString::fromLatin1("REVOKE "); sql += item->text(0); sql += QString::fromLatin1(" FROM \""); sql += user; sql += QString::fromLatin1("\""); sqlLst.insert(sqlLst.end(), sql); sql = QString::fromLatin1("GRANT "); sql += item->text(0); sql += QString::fromLatin1(" TO \""); sql += user; sql += QString::fromLatin1("\""); sqlLst.insert(sqlLst.end(), sql); } } else if (check->isOn() && item->text(1).isEmpty()) { sql = QString::fromLatin1("GRANT "); sql += item->text(0); sql += QString::fromLatin1(" TO \""); sql += user; sql += QString::fromLatin1("\""); sqlLst.insert(sqlLst.end(), sql); } else if (!check->isOn() && !item->text(1).isEmpty()) { sql = QString::fromLatin1("REVOKE "); sql += item->text(0); sql += QString::fromLatin1(" FROM \""); sql += user; sql += QString::fromLatin1("\""); sqlLst.insert(sqlLst.end(), sql); } } } void toSecuritySystem::changed(toTreeWidgetItem *org) { toResultViewCheck *item = dynamic_cast(org); if (item) { if (item->isOn()) { item = dynamic_cast(item->parent()); if (item) item->setOn(true); } else { item = dynamic_cast(item->firstChild()); if (item) item->setOn(false); } } } void toSecuritySystem::eraseUser(bool all) { for (toTreeWidgetItem *item = firstChild();item;item = item->nextSibling()) { toResultViewCheck * chk = dynamic_cast(item); if (chk && all) chk->setOn(false); item->setText(1, QString::null); for (toTreeWidgetItem *chld = item->firstChild();chld;chld = chld->nextSibling()) { chld->setText(1, QString::null); toResultViewCheck *chk = dynamic_cast(chld); if (chk && all) chk->setOn(false); } } } void toSecuritySystem::changeUser(const QString &user) { eraseUser(); try { toQuery query(toCurrentConnection(this), SQLSystemGrant, user); while (!query.eof()) { QString str = query.readValue(); QString admin = query.readValue(); for (toTreeWidgetItem *item = firstChild();item;item = item->nextSibling()) { if (item->text(0) == str) { toResultViewCheck * chk = dynamic_cast(item); if (chk) chk->setOn(true); item->setText(1, tr("ON")); if (admin != tr("NO") && item->firstChild()) { chk = dynamic_cast(item->firstChild()); if (chk) chk->setOn(true); if (chk->parent()) chk->parent()->setOpen(true); item->firstChild()->setText(1, tr("ON")); } break; } } } } TOCATCH } toSecurityRoleGrant::toSecurityRoleGrant(QWidget *parent) : toListView(parent) { addColumn(tr("Role name")); setRootIsDecorated(true); update(); setSorting(0); connect(this, SIGNAL(clicked(toTreeWidgetItem *)), this, SLOT(changed(toTreeWidgetItem *))); } void toSecurityRoleGrant::update(void) { clear(); try { toQuery priv(toCurrentConnection(this), SQLRoles); while (!priv.eof()) { toResultViewCheck *item = new toResultViewCheck(this, priv.readValue(), toTreeWidgetCheck::CheckBox); new toResultViewCheck(item, tr("Admin"), toTreeWidgetCheck::CheckBox); new toResultViewCheck(item, tr("Default"), toTreeWidgetCheck::CheckBox); } } TOCATCH } toTreeWidgetCheck *toSecurityRoleGrant::findChild(toTreeWidgetItem *parent, const QString &name) { for (toTreeWidgetItem *item = parent->firstChild();item;item = item->nextSibling()) { if (item->text(0) == name) { toResultViewCheck * ret = dynamic_cast(item); if (ret->isEnabled()) return ret; else return NULL; } } return NULL; } void toSecurityRoleGrant::sql(const QString &user, std::list &sqlLst) { bool any = false; bool chg = false; QString except; QString sql; for (toTreeWidgetItem *item = firstChild();item;item = item->nextSibling()) { toResultViewCheck * check = dynamic_cast(item); toTreeWidgetCheck *chld = findChild(item, tr("Admin")); toTreeWidgetCheck *def = findChild(item, tr("Default")); if (def && check) { if (!def->isOn() && check->isOn()) { if (!except.isEmpty()) except += QString::fromLatin1(",\""); else except += QString::fromLatin1(" EXCEPT \""); except += item->text(0); except += QString::fromLatin1("\""); } else if (check->isOn() && def->isOn()) any = true; if (def->isOn() == def->text(1).isEmpty()) chg = true; } if (chld && chld->isOn() && chld->text(1).isEmpty()) { if (check->isOn() && !item->text(1).isEmpty()) { sql = QString::fromLatin1("REVOKE \""); sql += item->text(0); sql += QString::fromLatin1("\" FROM \""); sql += user; sql += QString::fromLatin1("\""); sqlLst.insert(sqlLst.end(), sql); } sql = QString::fromLatin1("GRANT \""); sql += item->text(0); sql += QString::fromLatin1("\" TO \""); sql += user; sql += QString::fromLatin1("\" WITH ADMIN OPTION"); sqlLst.insert(sqlLst.end(), sql); chg = true; } else if (check->isOn() && !item->text(1).isEmpty()) { if (chld && !chld->isOn() && !chld->text(1).isEmpty()) { sql = QString::fromLatin1("REVOKE \""); sql += item->text(0); sql += QString::fromLatin1("\" FROM \""); sql += user; sql += QString::fromLatin1("\""); sqlLst.insert(sqlLst.end(), sql); sql = QString::fromLatin1("GRANT \""); sql += item->text(0); sql += QString::fromLatin1("\" TO \""); sql += user; sql += QString::fromLatin1("\""); sqlLst.insert(sqlLst.end(), sql); chg = true; } } else if (check->isOn() && item->text(1).isEmpty()) { sql = QString::fromLatin1("GRANT \""); sql += item->text(0); sql += QString::fromLatin1("\" TO \""); sql += user; sql += QString::fromLatin1("\""); sqlLst.insert(sqlLst.end(), sql); chg = true; } else if (!check->isOn() && !item->text(1).isEmpty()) { sql = QString::fromLatin1("REVOKE \""); sql += item->text(0); sql += QString::fromLatin1("\" FROM \""); sql += user; sql += QString::fromLatin1("\""); sqlLst.insert(sqlLst.end(), sql); chg = true; } } if (chg) { sql = QString::fromLatin1("ALTER USER \""); sql += user; sql += QString::fromLatin1("\" DEFAULT ROLE "); if (any) { sql += QString::fromLatin1("ALL"); sql += except; } else sql += QString::fromLatin1("NONE"); sqlLst.insert(sqlLst.end(), sql); } } void toSecurityRoleGrant::changed(toTreeWidgetItem *org) { toResultViewCheck *item = dynamic_cast(org); if (item) { if (item->isOn()) { toTreeWidgetCheck *chld = findChild(item, tr("Default")); if (chld) chld->setOn(true); item = dynamic_cast(item->parent()); if (item) item->setOn(true); } else { for (toTreeWidgetItem *item = firstChild();item;item = item->nextSibling()) { toResultViewCheck * chk = dynamic_cast(item->firstChild()); if (chk) chk->setOn(false); } } } } void toSecurityRoleGrant::eraseUser(bool user, bool all) { for (toTreeWidgetItem *item = firstChild();item;item = item->nextSibling()) { toResultViewCheck * chk = dynamic_cast(item); if (chk && all) chk->setOn(false); item->setText(1, QString::null); for (toTreeWidgetItem *chld = item->firstChild();chld;chld = chld->nextSibling()) { chld->setText(1, QString::null); toResultViewCheck *chk = dynamic_cast(chld); if (chk) { if (all) { chk->setOn(false); if (chk->text(0) == tr("Default")) chk->setEnabled(user); } } } } } void toSecurityRoleGrant::changeUser(bool user, const QString &username) { eraseUser(user); try { toQuery query(toCurrentConnection(this), SQLRoleGrant, username); while (!query.eof()) { QString str = query.readValue(); QString admin = query.readValue(); QString def = query.readValue(); for (toTreeWidgetItem *item = firstChild();item;item = item->nextSibling()) { if (item->text(0) == str) { toTreeWidgetCheck * chk = dynamic_cast(item); if (chk) chk->setOn(true); item->setText(1, tr("ON")); chk = findChild(item, tr("Admin")); if (admin == tr("YES") && chk) { chk->setOn(true); chk->setText(1, tr("ON")); if (chk->parent()) chk->parent()->setOpen(true); } chk = findChild(item, tr("Default")); if (def == tr("YES") && chk) { chk->setOn(true); chk->setText(1, tr("ON")); if (chk->parent()) chk->parent()->setOpen(true); } break; } } } } TOCATCH } toSecurity::toSecurity(QWidget *main, toConnection &connection) : toToolWidget(SecurityTool, "security.html", main, connection, "toSecurity") { toBusy busy; QToolBar *toolbar = toAllocBar(this, tr("Security manager")); toolbar->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); layout()->addWidget(toolbar); UpdateListAct = new QAction(QPixmap(const_cast(refresh_xpm)), tr("Update user and role list"), this); connect(UpdateListAct, SIGNAL(triggered()), this, SLOT(refresh(void))); UpdateListAct->setShortcut(QKeySequence::Refresh); toolbar->addAction(UpdateListAct); toolbar->addSeparator(); SaveAct = new QAction(QPixmap(const_cast(commit_xpm)), tr("Save changes"), this); connect(SaveAct, SIGNAL(triggered()), this, SLOT(saveChanges(void))); SaveAct->setShortcut(Qt::CTRL | Qt::Key_Return); toolbar->addAction(SaveAct); DropAct = new QAction(QPixmap(const_cast(trash_xpm)), tr("Remove user/role"), this); connect(DropAct, SIGNAL(triggered()), this, SLOT(drop(void))); toolbar->addAction(DropAct); DropAct->setEnabled(false); toolbar->addSeparator(); AddUserAct = new QAction(QPixmap(const_cast(adduser_xpm)), tr("Add new user"), this); connect(AddUserAct, SIGNAL(triggered()), this, SLOT(addUser(void))); AddUserAct->setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_U); toolbar->addAction(AddUserAct); AddRoleAct = new QAction(QPixmap(const_cast(addrole_xpm)), tr("Add new role"), this); connect(AddRoleAct, SIGNAL(triggered()), this, SLOT(addRole(void))); AddRoleAct->setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_R); toolbar->addAction(AddRoleAct); CopyAct = new QAction(QPixmap(const_cast(copyuser_xpm)), tr("Copy current user or role"), this); connect(CopyAct, SIGNAL(triggered()), this, SLOT(copy(void))); CopyAct->setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_O); toolbar->addAction(CopyAct); CopyAct->setEnabled(false); toolbar->addSeparator(); DisplaySQLAct = new QAction(QPixmap(const_cast(sql_xpm)), tr("Display SQL needed to make current changes"), this); connect(DisplaySQLAct, SIGNAL(triggered()), this, SLOT(displaySQL(void))); DisplaySQLAct->setShortcut(Qt::Key_F4); toolbar->addAction(DisplaySQLAct); toolbar->addWidget(new toSpacer()); new toChangeConnection(toolbar, TO_TOOLBAR_WIDGET_NAME); QSplitter *splitter = new QSplitter(Qt::Horizontal, this); layout()->addWidget(splitter); UserList = new toListView(splitter); UserList->addColumn(tr("Users/Roles")); UserList->setSQLName(QString::fromLatin1("toSecurity:Users/Roles")); UserList->setRootIsDecorated(true); UserList->setSelectionMode(toTreeWidget::Single); Tabs = new QTabWidget(splitter); Quota = new toSecurityQuota(Tabs); General = new toSecurityPage(Quota, connection, Tabs); Tabs->addTab(General, tr("&General")); RoleGrant = new toSecurityRoleGrant(Tabs); Tabs->addTab(RoleGrant, tr("&Roles")); SystemGrant = new toSecuritySystem(Tabs); Tabs->addTab(SystemGrant, tr("&System Privileges")); ObjectGrant = new toSecurityObject(Tabs); Tabs->addTab(ObjectGrant, tr("&Object Privileges")); Tabs->addTab(Quota, tr("&Quota")); UserList->setSelectionMode(toTreeWidget::Single); connect(UserList, SIGNAL(selectionChanged(toTreeWidgetItem *)), this, SLOT(changeUser(toTreeWidgetItem *))); ToolMenu = NULL; connect(toMainWidget()->workspace(), SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(windowActivated(QMdiSubWindow *))); refresh(); connect(this, SIGNAL(connectionChange()), this, SLOT(refresh())); setFocusProxy(Tabs); } void toSecurity::windowActivated(QMdiSubWindow *widget) { if (!widget) return; if (widget->widget() == this) { if (!ToolMenu) { ToolMenu = new QMenu(tr("&Security"), this); ToolMenu->addAction(UpdateListAct); ToolMenu->addSeparator(); ToolMenu->addAction(SaveAct); ToolMenu->addAction(DropAct); ToolMenu->addSeparator(); ToolMenu->addAction(AddUserAct); ToolMenu->addAction(AddRoleAct); ToolMenu->addAction(CopyAct); ToolMenu->addSeparator(); ToolMenu->addAction(DisplaySQLAct); toMainWidget()->addCustomMenu(ToolMenu); } } else { delete ToolMenu; ToolMenu = NULL; } } void toSecurity::displaySQL(void) { std::list lines = sql(); QString res; for (std::list::iterator i = lines.begin();i != lines.end();i++) { res += *i; res += QString::fromLatin1(";\n"); } if (res.length() > 0) new toMemoEditor(this, res, -1, -1, true); else toStatusMessage(tr("No changes made")); } std::list toSecurity::sql(void) { std::list ret; try { QString tmp = General->sql(); if (!tmp.isEmpty()) ret.insert(ret.end(), tmp); QString name = General->name(); if (!name.isEmpty()) { SystemGrant->sql(name, ret); ObjectGrant->sql(name, ret); RoleGrant->sql(name, ret); } } catch (const QString &str) { toStatusMessage(str); std::list empty; return empty; } return ret; } void toSecurity::changeUser(bool ask) { if (ask) { try { std::list sqlList = sql(); if (sqlList.size() != 0) { switch (TOMessageBox::warning(this, tr("Save changes?"), tr("Save the changes made to this user?"), tr("Save"), tr("Discard"), tr("Cancel"))) { case 0: saveChanges(); return ; case 1: break; case 2: return ; } } } catch (const QString &str) { toStatusMessage(str); return ; } } try { QString sel; toTreeWidgetItem *item = UserList->selectedItem(); if (item) { toBusy busy; UserID = item->text(1); DropAct->setEnabled(item->parent()); CopyAct->setEnabled(item->parent()); if (UserID[4].toLatin1() != ':') throw tr("Invalid security ID"); bool user = false; if (UserID.startsWith(QString::fromLatin1("USER"))) user = true; QString username = UserID.right(UserID.length() - 5); General->changePage(username, user); Quota->changeUser(username); Tabs->setTabEnabled(Tabs->indexOf(Quota), user); RoleGrant->changeUser(user, username); SystemGrant->changeUser(username); ObjectGrant->changeUser(username); } } TOCATCH } void toSecurity::refresh(void) { toBusy busy; disconnect(UserList, SIGNAL(selectionChanged(toTreeWidgetItem *)), this, SLOT(changeUser(toTreeWidgetItem *))); SystemGrant->update(); RoleGrant->update(); ObjectGrant->update(); Quota->update(); UserList->clear(); try { toTreeWidgetItem *parent = new toResultViewItem(UserList, NULL, QString::fromLatin1("Users")); parent->setText(1, QString::fromLatin1("USER:")); parent->setOpen(true); toQuery user(connection(), toSQL::string(toSQL::TOSQL_USERLIST, connection())); toTreeWidgetItem *item = NULL; while (!user.eof()) { QString tmp = user.readValue(); QString id = QString::fromLatin1("USER:"); id += tmp; item = new toResultViewItem(parent, item, tmp); item->setText(1, id); if (id == UserID) UserList->setSelected(item, true); } parent = new toResultViewItem(UserList, parent, tr("Roles")); parent->setText(1, QString::fromLatin1("ROLE:")); parent->setOpen(true); toQuery roles(connection(), SQLRoles); item = NULL; while (!roles.eof()) { QString tmp = roles.readValue(); QString id = QString::fromLatin1("ROLE:"); id += tmp; item = new toResultViewItem(parent, item, tmp); item->setText(1, id); if (id == UserID) UserList->setSelected(item, true); } } TOCATCH connect(UserList, SIGNAL(selectionChanged(toTreeWidgetItem *)), this, SLOT(changeUser(toTreeWidgetItem *))); } void toSecurity::saveChanges() { std::list sqlList = sql(); for (std::list::iterator i = sqlList.begin();i != sqlList.end();i++) { try { connection().execute(*i); } TOCATCH } if (General->user()) UserID = QString::fromLatin1("USER:"); else UserID = QString::fromLatin1("ROLE:"); UserID += General->name(); refresh(); changeUser(false); } void toSecurity::drop() { if (UserID.length() > 5) { QString str = QString::fromLatin1("DROP "); if (General->user()) str += QString::fromLatin1("USER"); else str += QString::fromLatin1("ROLE"); str += QString::fromLatin1(" \""); str += UserID.right(UserID.length() - 5); str += QString::fromLatin1("\""); try { connection().execute(str); refresh(); changeUser(false); } catch (...) { switch (TOMessageBox::warning(this, tr("Are you sure?"), tr("The user still owns objects, add the cascade option?"), tr("Yes"), tr("No"))) { case 0: str += QString::fromLatin1(" CASCADE"); try { connection().execute(str); refresh(); changeUser(false); } TOCATCH return ; case 1: break; } } } } void toSecurity::addUser(void) { for (toTreeWidgetItem *item = UserList->firstChild();item;item = item->nextSibling()) if (item->text(1) == QString::fromLatin1("USER:")) { UserList->clearSelection(); UserList->setCurrentItem(item); Tabs->setCurrentIndex(Tabs->indexOf(General)); General->setFocus(); break; } } void toSecurity::addRole(void) { for (toTreeWidgetItem *item = UserList->firstChild();item;item = item->nextSibling()) if (item->text(1) == QString::fromLatin1("ROLE:")) { UserList->clearSelection(); UserList->setCurrentItem(item); Tabs->setCurrentIndex(Tabs->indexOf(General)); General->setFocus(); break; } } void toSecurity::copy(void) { General->clear(); SystemGrant->eraseUser(false); RoleGrant->eraseUser(General->user(), false); ObjectGrant->eraseUser(false); Quota->clear(); if (General->user()) UserID = QString::fromLatin1("USER:"); else UserID = QString::fromLatin1("ROLE:"); for (toTreeWidgetItem *item = UserList->firstChild();item;item = item->nextSibling()) if (item->text(1) == UserID) { disconnect(UserList, SIGNAL(selectionChanged(toTreeWidgetItem *)), this, SLOT(changeUser(toTreeWidgetItem *))); UserList->clearSelection(); UserList->setCurrentItem(item); connect(UserList, SIGNAL(selectionChanged(toTreeWidgetItem *)), this, SLOT(changeUser(toTreeWidgetItem *))); break; } } tora-2.1.3/src/torunnable.h0000644000175000017500000000737211270353625015376 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORUNNABLE_H #define TORUNNABLE_H #include #include #include class toRunnableThread; /** * Custom event class for deleting thread * */ class FinishedEvent : public QEvent { toRunnableThread *Thread; public: FinishedEvent(toRunnableThread *t) : QEvent(QEvent::User) { Thread = t; } toRunnableThread* thread() const { return Thread; } }; /** * An abstract class designed to be run from a toRunnableThread. This * allows you to send signals and use slots from a thread in an * intuitive fashion. * */ class toRunnable : public QObject { Q_OBJECT; toRunnableThread *Thread; public: /** * Create new runnable object. Does not accept a QObject parent as * this class will be deleted by toRunnableThread. * */ toRunnable() : QObject(0), Thread(0) { } virtual ~toRunnable() { } /** * Override to provide executable. Thread will exit when run does. * */ virtual void run(void) = 0; /** * Set by toRunnableThread before run() * */ void setThread(toRunnableThread *thread) { Thread = thread; } toRunnableThread* thread(void) const { return Thread; } }; /** * A QThread subclass that uses toRunnable * */ class toRunnableThread : public QThread { Q_OBJECT; toRunnable *Runner; virtual void run(void); public: /** * Creates new thread. Call start to begin. * */ toRunnableThread(toRunnable *runner) : QThread(0) { Runner = runner; Runner->moveToThread(this); } /** * Redeclares public * */ int exec() { return QThread::exec(); } }; /** * Can't delete thread from event handler * */ class toRunnableDeleter : public QObject { Q_OBJECT; public: toRunnableDeleter() { } protected: /** * Overrides qobject and redeclares non-virtual. It's not a good * idea to override this. * */ void customEvent(QEvent *event); }; #endif tora-2.1.3/src/totemplateeditui.ui0000644000175000017500000002304611270353625016771 0ustar michaelmichael toTemplateEditUI 0 0 659 547 Template editor 11 11 11 11 6 6 0 0 true true Template 0 0 QFrame::NoFrame QFrame::Plain 11 11 11 11 6 6 0 0 Description text. Can be in HTML format. &Description false Description 0 0 true &Preview 0 0 Name of the template. &Name false Name 0 0 Remove the current template Remove 0 0 Add new template Add 0 0 Preview of the description. Press the button to update Preview false Preview Qt::Horizontal QSizePolicy::Expanding 20 20 Cancel &Ok true toTreeWidget QTreeWidget
totreewidget.h
toMarkedText QWidget
tomarkedtext.h
PushButton1 clicked() toTemplateEditUI accept() 20 20 20 20 PushButton2 clicked() toTemplateEditUI reject() 20 20 20 20 PreviewButton clicked() toTemplateEditUI preview() 20 20 20 20 TrashButton clicked() toTemplateEditUI remove() 20 20 20 20 NewButton clicked() toTemplateEditUI newTemplate() 20 20 20 20 Templates selectionChanged() toTemplateEditUI changeSelection() 20 20 20 20
tora-2.1.3/src/toresultitem.h0000644000175000017500000001651011270353625015757 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTITEM_H #define TORESULTITEM_H #include "config.h" #include "tobackground.h" #include "toresult.h" #include #include /* #include */ #include #include class toSQL; class toNoBlockQuery; /** Display the first row of a query with each column with a separate label. * If the label of the item is a single '-' character the data is treated as * a horizontal label (Not bold or sunken), and the label is not printed. */ class toResultItem : public QScrollArea, public toResult { Q_OBJECT /** Result widget. */ QGridLayout *Result; /** Number of created widgets. */ int NumWidgets; /** Last widget used. */ int WidgetPos; /** number of columns */ int Columns; /** List of allocated widgets. */ std::vector Widgets; /** If title names are to be made more readable. */ bool ReadableColumns; /** If title names are to be displayed. */ bool ShowTitle; /** Align widgets to the right. */ bool Right; /** Font to display data with. */ QFont DataFont; toNoBlockQuery *Query; toBackground Poll; /** Setup widget. * @param num Number of columns. * @param readable Make columns more readable. */ void setup(int num, bool readable); protected: /** Start new query, hide all widgets. */ void start(void); /** Add a new widget. * @param title Title of this value. * @param value Value. */ void addItem(const QString &title, const QString &value); /** Done with adding queries. */ void done(void); public: /** Create widget. * @param num Number of columns to arrange data in. * @param readable Indicate if columns are to be made more readable. This means that the * descriptions are capitalised and '_' are converted to ' '. * @param parent Parent of list. * @param name Name of widget. */ toResultItem(int num, bool readable, QWidget *parent, const char *name = NULL); /** Create widget. Readable columns by default. * @param num Number of columns to arrange data in. * @param parent Parent of list. * @param name Name of widget. */ toResultItem(int num, QWidget *parent, const char *name = NULL); //! Dummy constructor for qt Designer toResultItem(QWidget *parent = 0); /** Destroy object */ ~toResultItem(void); /** Set if titles are to be shown. * @param val If titles are to be shown. */ void showTitle(bool val) { ShowTitle = val; } /** Set if labels are to be aligned right. * @param val If labels are to be aligned right. */ void alignRight(bool val) { Right = val; } /** Set the font to display data with. */ void dataFont(const QFont &val) { DataFont = val; } /** Create title widget. * @param parent Parent of widget. * @return Title widget created. */ virtual QWidget *createTitle(QWidget *parent); /** Create value widget. * @param parent Parent of widget. * @return Title widget created. */ virtual QWidget *createValue(QWidget *parent); /** Set value of title widget. * @param widget Widget to use for title. * @param title The title of the new widget pair. * @param value Vaue of new title widget. */ virtual void setTitle(QWidget *widget, const QString &title, const QString &value); /** Set value of value widget. * @param widget Widget to use for value. * @param title The title of the new widget pair. * @param value Vaue of new title widget. */ virtual void setValue(QWidget *widget, const QString &title, const QString &value); /** Reimplemented for internal reasons. */ virtual void query(const QString &sql, const toQList ¶m); /** Handle any connection */ virtual bool canHandle(toConnection &) { return true; } // Why are these needed? #if 1 /** Set the SQL statement of this list * @param sql String containing statement. */ void setSQL(const QString &sql) { toResult::setSQL(sql); } /** Set the SQL statement of this list. This will also affect @ref Name. * @param sql SQL containing statement. */ void setSQL(const toSQL &sql) { toResult::setSQL(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const QString &sql) { toResult::query(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql) { toResult::query(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql, toQList &par) { toResult::query(sql, par); } #endif public slots: /** Reimplemented for internal reasons. */ virtual void refresh(void) { toResult::refresh(); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1) { toResult::changeParams(Param1); } /** Reimplemented For internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2) { toResult::changeParams(Param1, Param2); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3) { toResult::changeParams(Param1, Param2, Param3); } private slots: void poll(void); }; #endif tora-2.1.3/src/toworksheet.h0000644000175000017500000001706011363651124015574 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOWORKSHEET_H #define TOWORKSHEET_H #include "config.h" #include #include #include #include #include #include #include #include "toconnection.h" #include "tosqlparse.h" #include "totool.h" #include "totreewidget.h" #include "toresulttableview.h" #include "ui_toworksheetsetupui.h" class QComboBox; class QLabel; class QSplitter; class QMdiSubWindow; class toHighlightedText; class toListView; class toResultBar; class toResultCols; class toResultCombo; class toResultSchema; class toResultItem; class toResultPlan; class toResultStats; class toVisualize; class toTabWidget; class toWorksheetWidget; class toEditableMenu; class toWorksheet : public toToolWidget { Q_OBJECT; friend class toWorksheetWidget; toHighlightedText *Editor; toTabWidget *ResultTab; toResultTableView *Result; toResultPlan *Plan; QWidget *CurrentTab; QString QueryString; // query is saved in order to reexecute it periodically ("refresh") toSQLParse::statement::statementClass QueryStatementClass; // statement class has to be saved as well toResultItem *Resources; toResultStats *Statistics; toResultBar *WaitChart; toResultBar *IOChart; toListView *Logging; //! Re-set EditSplitter sizes with settings. QList EditSplitterSizes; QSplitter *EditSplitter; QSplitter *ResourceSplitter; toResultTableView *LongOps; QWidget *Visualize; toTreeWidgetItem *LastLogItem; QWidget *StatTab; bool TryStrip; //! Used only for DESC/DESCRIBE sql statements toResultCols *Columns; QComboBox *Refresh; QLabel *Started; toResultSchema *Schema; int RefreshSeconds; QTimer RefreshTimer; //! Flag to handle continue-on-error for executeAllAct bool m_batchContinue; toEditableMenu *SavedMenu; toEditableMenu *InsertSavedMenu; bool First; QTime Timer; QTimer Poll; QWidget *Current; std::map History; int LastID; int LastLine; int LastOffset; enum execType { //! Display results in result tab Normal, //! Don't display results, just send statements to the DB Direct, //! Don't run query, just parse it. (Check syntax etc.) Parse, //! Call explain plan OnlyPlan }; QMenu *ToolMenu; QMenu *context; QAction *executeNewlineAct; QAction *parseAct; QAction *executeAct; QAction *executeStepAct; QAction *executeAllAct; QAction *refreshAct; QAction *describeAct; QAction *explainAct; QAction *stopAct; QAction *eraseAct; QAction *statisticAct; QAction *previousAct; QAction *nextAct; QAction *saveLastAct; QString duration(int, bool hundreds = true); void saveHistory(void); void viewResources(void); void query(const QString &str, execType type, toSQLParse::statement::statementClass sc); virtual bool checkSave(bool input); void saveDefaults(void); void setup(bool autoLoad); void execute(toSQLParse::tokenizer &tokens, int line, int pos, execType typeto, toSQLParse::statement::statementClass sc); void insertStatement(const QString &); void createActions(); // private for toworksheetwidget toWorksheet(QWidget *parent, const char *name, toConnection &connection); // Imitate something like "create or replace" syntax for MySQL void mySQLBeforeCreate(QString &chk); protected: void closeEvent(QCloseEvent *event); public: toWorksheet(QWidget *parent, toConnection &connection, bool autoLoad = true); virtual ~toWorksheet(); toHighlightedText *editor(void) { return Editor; } virtual bool describe(const QString &query); virtual bool canHandle(toConnection &) { return true; } virtual void exportData(std::map &data, const QString &prefix); virtual void importData(std::map &data, const QString &prefix); static toWorksheet *fileWorksheet(const QString &file); signals: void executed(void); public slots: bool close(); void connectionChanged(void); void refresh(); void execute(); void parseAll(); void executeAll(); void executeStep(); void executeNewline(); void describe(); void eraseLogButton(); void changeResult(int); void windowActivated(QMdiSubWindow *w); void queryDone(void); void enableStatistic(bool); void explainPlan(void); void toggleStatistic(void) { statisticAct->toggle(); } void showInsertSaved(void); void showSaved(void); void insertSaved(QAction *); void executeSaved(QAction *); void removeSaved(QAction *); void executePreviousLog(void); void executeNextLog(void); void executeLog(void); void addLog(const QString &sql, const toConnection::exception &result, bool error); void changeRefresh(const QString &); void saveLast(void); void saveStatistics(void); void refreshSetup(void); void stop(void); /** * create context menus * */ void createPopupMenu(const QPoint &pos); /** * Updates tool caption. * */ void setCaption(void); private slots: void poll(void); void changeConnection(void); void unhideResults(const QString &, const toConnection::exception &, bool); void unhideResults(void); }; class toWorksheetSetup : public QWidget, public Ui::toWorksheetSetupUI, public toSettingTab { Q_OBJECT; toTool *Tool; public: toWorksheetSetup(toTool *tool, QWidget* parent = 0, const char* name = 0); virtual void saveSetting(void); public slots: void chooseFile(void); }; #endif tora-2.1.3/src/qscintilla2/0000755000175000017500000000000011445450571015272 5ustar michaelmichaeltora-2.1.3/src/qscintilla2/src/0000755000175000017500000000000011445450571016061 5ustar michaelmichaeltora-2.1.3/src/qscintilla2/src/LexConf.cpp0000644000175000017500000001257211213435521020121 0ustar michaelmichael// Scintilla source code edit control /** @file LexConf.cxx ** Lexer for Apache Configuration Files. ** ** First working version contributed by Ahmad Zawawi on October 28, 2000. ** i created this lexer because i needed something pretty when dealing ** when Apache Configuration files... **/ // Copyright 1998-2001 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static void ColouriseConfDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) { int state = SCE_CONF_DEFAULT; char chNext = styler[startPos]; int lengthDoc = startPos + length; // create a buffer large enough to take the largest chunk... char *buffer = new char[length]; int bufferCount = 0; // this assumes that we have 2 keyword list in conf.properties WordList &directives = *keywordLists[0]; WordList ¶ms = *keywordLists[1]; // go through all provided text segment // using the hand-written state machine shown below styler.StartAt(startPos); styler.StartSegment(startPos); for (int i = startPos; i < lengthDoc; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); if (styler.IsLeadByte(ch)) { chNext = styler.SafeGetCharAt(i + 2); i++; continue; } switch(state) { case SCE_CONF_DEFAULT: if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') { // whitespace is simply ignored here... styler.ColourTo(i,SCE_CONF_DEFAULT); break; } else if( ch == '#' ) { // signals the start of a comment... state = SCE_CONF_COMMENT; styler.ColourTo(i,SCE_CONF_COMMENT); } else if( ch == '.' /*|| ch == '/'*/) { // signals the start of a file... state = SCE_CONF_EXTENSION; styler.ColourTo(i,SCE_CONF_EXTENSION); } else if( ch == '"') { state = SCE_CONF_STRING; styler.ColourTo(i,SCE_CONF_STRING); } else if( ispunct(ch) ) { // signals an operator... // no state jump necessary for this // simple case... styler.ColourTo(i,SCE_CONF_OPERATOR); } else if( isalpha(ch) ) { // signals the start of an identifier bufferCount = 0; buffer[bufferCount++] = static_cast(tolower(ch)); state = SCE_CONF_IDENTIFIER; } else if( isdigit(ch) ) { // signals the start of a number bufferCount = 0; buffer[bufferCount++] = ch; //styler.ColourTo(i,SCE_CONF_NUMBER); state = SCE_CONF_NUMBER; } else { // style it the default style.. styler.ColourTo(i,SCE_CONF_DEFAULT); } break; case SCE_CONF_COMMENT: // if we find a newline here, // we simply go to default state // else continue to work on it... if( ch == '\n' || ch == '\r' ) { state = SCE_CONF_DEFAULT; } else { styler.ColourTo(i,SCE_CONF_COMMENT); } break; case SCE_CONF_EXTENSION: // if we find a non-alphanumeric char, // we simply go to default state // else we're still dealing with an extension... if( isalnum(ch) || (ch == '_') || (ch == '-') || (ch == '$') || (ch == '/') || (ch == '.') || (ch == '*') ) { styler.ColourTo(i,SCE_CONF_EXTENSION); } else { state = SCE_CONF_DEFAULT; chNext = styler[i--]; } break; case SCE_CONF_STRING: // if we find the end of a string char, we simply go to default state // else we're still dealing with an string... if( (ch == '"' && styler.SafeGetCharAt(i-1)!='\\') || (ch == '\n') || (ch == '\r') ) { state = SCE_CONF_DEFAULT; } styler.ColourTo(i,SCE_CONF_STRING); break; case SCE_CONF_IDENTIFIER: // stay in CONF_IDENTIFIER state until we find a non-alphanumeric if( isalnum(ch) || (ch == '_') || (ch == '-') || (ch == '/') || (ch == '$') || (ch == '.') || (ch == '*')) { buffer[bufferCount++] = static_cast(tolower(ch)); } else { state = SCE_CONF_DEFAULT; buffer[bufferCount] = '\0'; // check if the buffer contains a keyword, and highlight it if it is a keyword... if(directives.InList(buffer)) { styler.ColourTo(i-1,SCE_CONF_DIRECTIVE ); } else if(params.InList(buffer)) { styler.ColourTo(i-1,SCE_CONF_PARAMETER ); } else if(strchr(buffer,'/') || strchr(buffer,'.')) { styler.ColourTo(i-1,SCE_CONF_EXTENSION); } else { styler.ColourTo(i-1,SCE_CONF_DEFAULT); } // push back the faulty character chNext = styler[i--]; } break; case SCE_CONF_NUMBER: // stay in CONF_NUMBER state until we find a non-numeric if( isdigit(ch) || ch == '.') { buffer[bufferCount++] = ch; } else { state = SCE_CONF_DEFAULT; buffer[bufferCount] = '\0'; // Colourize here... if( strchr(buffer,'.') ) { // it is an IP address... styler.ColourTo(i-1,SCE_CONF_IP); } else { // normal number styler.ColourTo(i-1,SCE_CONF_NUMBER); } // push back a character chNext = styler[i--]; } break; } } delete []buffer; } static const char * const confWordListDesc[] = { "Directives", "Parameters", 0 }; LexerModule lmConf(SCLEX_CONF, ColouriseConfDoc, "conf", 0, confWordListDesc); tora-2.1.3/src/qscintilla2/src/LexScriptol.cpp0000644000175000017500000003057511213435521021036 0ustar michaelmichael// Scintilla source code edit control /** @file LexScriptol.cxx ** Lexer for Scriptol. **/ #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static void ClassifyWordSol(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) { char s[100]; bool wordIsNumber = isdigit(styler[start]) != 0; for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { s[i] = styler[start + i]; s[i + 1] = '\0'; } char chAttr = SCE_SCRIPTOL_IDENTIFIER; if (0 == strcmp(prevWord, "class")) chAttr = SCE_SCRIPTOL_CLASSNAME; else if (wordIsNumber) chAttr = SCE_SCRIPTOL_NUMBER; else if (keywords.InList(s)) chAttr = SCE_SCRIPTOL_KEYWORD; else for (unsigned int i = 0; i < end - start + 1; i++) // test dotted idents { if (styler[start + i] == '.') { styler.ColourTo(start + i - 1, chAttr); styler.ColourTo(start + i, SCE_SCRIPTOL_OPERATOR); } } styler.ColourTo(end, chAttr); strcpy(prevWord, s); } static bool IsSolComment(Accessor &styler, int pos, int len) { char c; if(len > 0) { c = styler[pos]; if(c == '`') return true; if(len > 1) { if(c == '/') { c = styler[pos + 1]; if(c == '/') return true; if(c == '*') return true; } } } return false; } static bool IsSolStringStart(char ch) { if (ch == '\'' || ch == '"') return true; return false; } static bool IsSolWordStart(char ch) { return (iswordchar(ch) && !IsSolStringStart(ch)); } static int GetSolStringState(Accessor &styler, int i, int *nextIndex) { char ch = styler.SafeGetCharAt(i); char chNext = styler.SafeGetCharAt(i + 1); if (ch != '\"' && ch != '\'') { *nextIndex = i + 1; return SCE_SCRIPTOL_DEFAULT; } // ch is either single or double quotes in string // code below seem non-sense but is here for future extensions if (ch == chNext && ch == styler.SafeGetCharAt(i + 2)) { *nextIndex = i + 3; if(ch == '\"') return SCE_SCRIPTOL_TRIPLE; if(ch == '\'') return SCE_SCRIPTOL_TRIPLE; return SCE_SCRIPTOL_STRING; } else { *nextIndex = i + 1; if (ch == '"') return SCE_SCRIPTOL_STRING; else return SCE_SCRIPTOL_STRING; } } static void ColouriseSolDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { int lengthDoc = startPos + length; char stringType = '\"'; if (startPos > 0) { int lineCurrent = styler.GetLine(startPos); if (lineCurrent > 0) { startPos = styler.LineStart(lineCurrent-1); if (startPos == 0) initStyle = SCE_SCRIPTOL_DEFAULT; else initStyle = styler.StyleAt(startPos-1); } } styler.StartAt(startPos, 127); WordList &keywords = *keywordlists[0]; int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level"); char prevWord[200]; prevWord[0] = '\0'; if (length == 0) return; int state = initStyle & 31; int nextIndex = 0; char chPrev = ' '; char chPrev2 = ' '; char chNext = styler[startPos]; styler.StartSegment(startPos); bool atStartLine = true; int spaceFlags = 0; for (int i = startPos; i < lengthDoc; i++) { if (atStartLine) { char chBad = static_cast(64); char chGood = static_cast(0); char chFlags = chGood; if (whingeLevel == 1) { chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood; } else if (whingeLevel == 2) { chFlags = (spaceFlags & wsSpaceTab) ? chBad : chGood; } else if (whingeLevel == 3) { chFlags = (spaceFlags & wsSpace) ? chBad : chGood; } else if (whingeLevel == 4) { chFlags = (spaceFlags & wsTab) ? chBad : chGood; } styler.SetFlags(chFlags, static_cast(state)); atStartLine = false; } char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) { if ((state == SCE_SCRIPTOL_DEFAULT) || (state == SCE_SCRIPTOL_TRIPLE) || (state == SCE_SCRIPTOL_COMMENTBLOCK)) { styler.ColourTo(i, state); } atStartLine = true; } if (styler.IsLeadByte(ch)) { chNext = styler.SafeGetCharAt(i + 2); chPrev = ' '; chPrev2 = ' '; i += 1; continue; } if (state == SCE_SCRIPTOL_STRINGEOL) { if (ch != '\r' && ch != '\n') { styler.ColourTo(i - 1, state); state = SCE_SCRIPTOL_DEFAULT; } } if (state == SCE_SCRIPTOL_DEFAULT) { if (IsSolWordStart(ch)) { styler.ColourTo(i - 1, state); state = SCE_SCRIPTOL_KEYWORD; } else if (ch == '`') { styler.ColourTo(i - 1, state); state = SCE_SCRIPTOL_COMMENTLINE; } else if (ch == '/') { styler.ColourTo(i - 1, state); if(chNext == '/') state = SCE_SCRIPTOL_CSTYLE; if(chNext == '*') state = SCE_SCRIPTOL_COMMENTBLOCK; } else if (IsSolStringStart(ch)) { styler.ColourTo(i - 1, state); state = GetSolStringState(styler, i, &nextIndex); if(state == SCE_SCRIPTOL_STRING) { stringType = ch; } if (nextIndex != i + 1) { i = nextIndex - 1; ch = ' '; chPrev = ' '; chNext = styler.SafeGetCharAt(i + 1); } } else if (isoperator(ch)) { styler.ColourTo(i - 1, state); styler.ColourTo(i, SCE_SCRIPTOL_OPERATOR); } } else if (state == SCE_SCRIPTOL_KEYWORD) { if (!iswordchar(ch)) { ClassifyWordSol(styler.GetStartSegment(), i - 1, keywords, styler, prevWord); state = SCE_SCRIPTOL_DEFAULT; if (ch == '`') { state = chNext == '`' ? SCE_SCRIPTOL_PERSISTENT : SCE_SCRIPTOL_COMMENTLINE; } else if (IsSolStringStart(ch)) { styler.ColourTo(i - 1, state); state = GetSolStringState(styler, i, &nextIndex); if (nextIndex != i + 1) { i = nextIndex - 1; ch = ' '; chPrev = ' '; chNext = styler.SafeGetCharAt(i + 1); } } else if (isoperator(ch)) { styler.ColourTo(i, SCE_SCRIPTOL_OPERATOR); } } } else { if (state == SCE_SCRIPTOL_COMMENTLINE || state == SCE_SCRIPTOL_PERSISTENT || state == SCE_SCRIPTOL_CSTYLE) { if (ch == '\r' || ch == '\n') { styler.ColourTo(i - 1, state); state = SCE_SCRIPTOL_DEFAULT; } } else if(state == SCE_SCRIPTOL_COMMENTBLOCK) { if(chPrev == '*' && ch == '/') { styler.ColourTo(i, state); state = SCE_SCRIPTOL_DEFAULT; } } else if ((state == SCE_SCRIPTOL_STRING) || (state == SCE_SCRIPTOL_CHARACTER)) { if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) { styler.ColourTo(i - 1, state); state = SCE_SCRIPTOL_STRINGEOL; } else if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { i++; ch = chNext; chNext = styler.SafeGetCharAt(i + 1); } } else if ((ch == '\"') || (ch == '\'')) { // must match the entered quote type if(ch == stringType) { styler.ColourTo(i, state); state = SCE_SCRIPTOL_DEFAULT; } } } else if (state == SCE_SCRIPTOL_TRIPLE) { if ((ch == '\'' && chPrev == '\'' && chPrev2 == '\'') || (ch == '\"' && chPrev == '\"' && chPrev2 == '\"')) { styler.ColourTo(i, state); state = SCE_SCRIPTOL_DEFAULT; } } } chPrev2 = chPrev; chPrev = ch; } if (state == SCE_SCRIPTOL_KEYWORD) { ClassifyWordSol(styler.GetStartSegment(), lengthDoc-1, keywords, styler, prevWord); } else { styler.ColourTo(lengthDoc-1, state); } } static void FoldSolDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) { int lengthDoc = startPos + length; int lineCurrent = styler.GetLine(startPos); if (startPos > 0) { if (lineCurrent > 0) { lineCurrent--; startPos = styler.LineStart(lineCurrent); if (startPos == 0) initStyle = SCE_SCRIPTOL_DEFAULT; else initStyle = styler.StyleAt(startPos-1); } } int state = initStyle & 31; int spaceFlags = 0; int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsSolComment); if ((state == SCE_SCRIPTOL_TRIPLE)) indentCurrent |= SC_FOLDLEVELWHITEFLAG; char chNext = styler[startPos]; for (int i = startPos; i < lengthDoc; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); int style = styler.StyleAt(i) & 31; if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) { int lev = indentCurrent; int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsSolComment); if (style == SCE_SCRIPTOL_TRIPLE) indentNext |= SC_FOLDLEVELWHITEFLAG; if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) { // Only non whitespace lines can be headers if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) { lev |= SC_FOLDLEVELHEADERFLAG; } else if (indentNext & SC_FOLDLEVELWHITEFLAG) { // Line after is blank so check the next - maybe should continue further? int spaceFlags2 = 0; int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsSolComment); if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) { lev |= SC_FOLDLEVELHEADERFLAG; } } } indentCurrent = indentNext; styler.SetLevel(lineCurrent, lev); lineCurrent++; } } } LexerModule lmScriptol(SCLEX_SCRIPTOL, ColouriseSolDoc, "scriptol", FoldSolDoc); tora-2.1.3/src/qscintilla2/src/LexAVE.cpp0000644000175000017500000001500111213435521017635 0ustar michaelmichael// SciTE - Scintilla based Text Editor /** @file LexAVE.cxx ** Lexer for Avenue. ** ** Written by Alexey Yutkin . **/ // Copyright 1998-2002 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsAWordChar(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); } static inline bool IsEnumChar(const int ch) { return (ch < 0x80) && (isalnum(ch)|| ch == '_'); } static inline bool IsANumberChar(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '.' ); } inline bool IsAWordStart(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_'); } inline bool isAveOperator(char ch) { if (isalnum(ch)) return false; // '.' left out as it is used to make up numbers if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || ch == '(' || ch == ')' || ch == '=' || ch == '{' || ch == '}' || ch == '[' || ch == ']' || ch == ';' || ch == '<' || ch == '>' || ch == ',' || ch == '.' ) return true; return false; } static void ColouriseAveDoc( unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; WordList &keywords3 = *keywordlists[2]; WordList &keywords4 = *keywordlists[3]; WordList &keywords5 = *keywordlists[4]; WordList &keywords6 = *keywordlists[5]; // Do not leak onto next line if (initStyle == SCE_AVE_STRINGEOL) { initStyle = SCE_AVE_DEFAULT; } StyleContext sc(startPos, length, initStyle, styler); for (; sc.More(); sc.Forward()) { if (sc.atLineEnd) { // Update the line state, so it can be seen by next line int currentLine = styler.GetLine(sc.currentPos); styler.SetLineState(currentLine, 0); } if (sc.atLineStart && (sc.state == SCE_AVE_STRING)) { // Prevent SCE_AVE_STRINGEOL from leaking back to previous line sc.SetState(SCE_AVE_STRING); } // Determine if the current state should terminate. if (sc.state == SCE_AVE_OPERATOR) { sc.SetState(SCE_AVE_DEFAULT); } else if (sc.state == SCE_AVE_NUMBER) { if (!IsANumberChar(sc.ch)) { sc.SetState(SCE_AVE_DEFAULT); } } else if (sc.state == SCE_AVE_ENUM) { if (!IsEnumChar(sc.ch)) { sc.SetState(SCE_AVE_DEFAULT); } } else if (sc.state == SCE_AVE_IDENTIFIER) { if (!IsAWordChar(sc.ch) || (sc.ch == '.')) { char s[100]; //sc.GetCurrent(s, sizeof(s)); sc.GetCurrentLowered(s, sizeof(s)); if (keywords.InList(s)) { sc.ChangeState(SCE_AVE_WORD); } else if (keywords2.InList(s)) { sc.ChangeState(SCE_AVE_WORD2); } else if (keywords3.InList(s)) { sc.ChangeState(SCE_AVE_WORD3); } else if (keywords4.InList(s)) { sc.ChangeState(SCE_AVE_WORD4); } else if (keywords5.InList(s)) { sc.ChangeState(SCE_AVE_WORD5); } else if (keywords6.InList(s)) { sc.ChangeState(SCE_AVE_WORD6); } sc.SetState(SCE_AVE_DEFAULT); } } else if (sc.state == SCE_AVE_COMMENT) { if (sc.atLineEnd) { sc.SetState(SCE_AVE_DEFAULT); } } else if (sc.state == SCE_AVE_STRING) { if (sc.ch == '\"') { sc.ForwardSetState(SCE_AVE_DEFAULT); } else if (sc.atLineEnd) { sc.ChangeState(SCE_AVE_STRINGEOL); sc.ForwardSetState(SCE_AVE_DEFAULT); } } // Determine if a new state should be entered. if (sc.state == SCE_AVE_DEFAULT) { if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { sc.SetState(SCE_AVE_NUMBER); } else if (IsAWordStart(sc.ch)) { sc.SetState(SCE_AVE_IDENTIFIER); } else if (sc.Match('\"')) { sc.SetState(SCE_AVE_STRING); } else if (sc.Match('\'')) { sc.SetState(SCE_AVE_COMMENT); sc.Forward(); } else if (isAveOperator(static_cast(sc.ch))) { sc.SetState(SCE_AVE_OPERATOR); } else if (sc.Match('#')) { sc.SetState(SCE_AVE_ENUM); sc.Forward(); } } } sc.Complete(); } static void FoldAveDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[], Accessor &styler) { unsigned int lengthDoc = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; int levelCurrent = levelPrev; char chNext = static_cast(tolower(styler[startPos])); bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; int styleNext = styler.StyleAt(startPos); char s[10]; for (unsigned int i = startPos; i < lengthDoc; i++) { char ch = static_cast(tolower(chNext)); chNext = static_cast(tolower(styler.SafeGetCharAt(i + 1))); int style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if (style == SCE_AVE_WORD) { if (ch == 't' || ch == 'f' || ch == 'w' || ch == 'e') { for (unsigned int j = 0; j < 6; j++) { if (!iswordchar(styler[i + j])) { break; } s[j] = static_cast(tolower(styler[i + j])); s[j + 1] = '\0'; } if ((strcmp(s, "then") == 0) || (strcmp(s, "for") == 0) || (strcmp(s, "while") == 0)) { levelCurrent++; } if ((strcmp(s, "end") == 0) || (strcmp(s, "elseif") == 0)) { // Normally "elseif" and "then" will be on the same line and will cancel // each other out. // As implemented, this does not support fold.at.else. levelCurrent--; } } } else if (style == SCE_AVE_OPERATOR) { if (ch == '{' || ch == '(') { levelCurrent++; } else if (ch == '}' || ch == ')') { levelCurrent--; } } if (atEOL) { int lev = levelPrev; if (visibleChars == 0 && foldCompact) { lev |= SC_FOLDLEVELWHITEFLAG; } if ((levelCurrent > levelPrev) && (visibleChars > 0)) { lev |= SC_FOLDLEVELHEADERFLAG; } if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } lineCurrent++; levelPrev = levelCurrent; visibleChars = 0; } if (!isspacechar(ch)) { visibleChars++; } } // Fill in the real level of the next line, keeping the current flags as they will be filled in later int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; styler.SetLevel(lineCurrent, levelPrev | flagsNext); } LexerModule lmAVE(SCLEX_AVE, ColouriseAveDoc, "ave", FoldAveDoc); tora-2.1.3/src/qscintilla2/src/LexAU3.cpp0000644000175000017500000007130311213435521017621 0ustar michaelmichael// Scintilla source code edit control // @file LexAU3.cxx // Lexer for AutoIt3 http://www.hiddensoft.com/autoit3 // by Jos van der Zande, jvdzande@yahoo.com // // Changes: // March 28, 2004 - Added the standard Folding code // April 21, 2004 - Added Preprosessor Table + Syntax Highlighting // Fixed Number highlighting // Changed default isoperator to IsAOperator to have a better match to AutoIt3 // Fixed "#comments_start" -> "#comments-start" // Fixed "#comments_end" -> "#comments-end" // Fixed Sendkeys in Strings when not terminated with } // Added support for Sendkey strings that have second parameter e.g. {UP 5} or {a down} // April 26, 2004 - Fixed # pre-processor statement inside of comment block would invalidly change the color. // Added logic for #include to treat the <> as string // Added underscore to IsAOperator. // May 17, 2004 - Changed the folding logic from indent to keyword folding. // Added Folding logic for blocks of single-commentlines or commentblock. // triggered by: fold.comment=1 // Added Folding logic for preprocessor blocks triggered by fold.preprocessor=1 // Added Special for #region - #endregion syntax highlight and folding. // May 30, 2004 - Fixed issue with continuation lines on If statements. // June 5, 2004 - Added comma to Operators for better readability. // Added fold.compact support set with fold.compact=1 // Changed folding inside of #cs-#ce. Default is no keyword folding inside comment blocks when fold.comment=1 // it will now only happen when fold.comment=2. // Sep 5, 2004 - Added logic to handle colourizing words on the last line. // Typed Characters now show as "default" till they match any table. // Oct 10, 2004 - Added logic to show Comments in "Special" directives. // Nov 1, 2004 - Added better testing for Numbers supporting x and e notation. // Nov 28, 2004 - Added logic to handle continuation lines for syntax highlighting. // Jan 10, 2005 - Added Abbreviations Keyword used for expansion // Mar 24, 2005 - Updated Abbreviations Keywords to fix when followed by Operator. // Apr 18, 2005 - Updated #CE/#Comment-End logic to take a linecomment ";" into account // - Added folding support for With...EndWith // - Added support for a DOT in variable names // - Fixed Underscore in CommentBlock // May 23, 2005 - Fixed the SentKey lexing in case of a missing } // Aug 11, 2005 - Fixed possible bug with s_save length > 100. // Aug 23, 2005 - Added Switch/endswitch support to the folding logic. // Sep 27, 2005 - Fixed the SentKey lexing logic in case of multiple sentkeys. // Mar 12, 2006 - Fixed issue with <> coloring as String in stead of Operator in rare occasions. // Apr 8, 2006 - Added support for AutoIt3 Standard UDF library (SCE_AU3_UDF) // Mar 9, 2007 - Fixed bug with + following a String getting the wrong Color. // Jun 20, 2007 - Fixed Commentblock issue when LF's are used as EOL. // Jul 26, 2007 - Fixed #endregion undetected bug. // // Copyright for Scintilla: 1998-2001 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. // Scintilla source code edit control #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsTypeCharacter(const int ch) { return ch == '$'; } static inline bool IsAWordChar(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_'); } static inline bool IsAWordStart(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '@' || ch == '#' || ch == '$' || ch == '.'); } static inline bool IsAOperator(char ch) { if (isascii(ch) && isalnum(ch)) return false; if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '&' || ch == '^' || ch == '=' || ch == '<' || ch == '>' || ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == ',' ) return true; return false; } /////////////////////////////////////////////////////////////////////////////// // GetSendKey() filters the portion before and after a/multiple space(s) // and return the first portion to be looked-up in the table // also check if the second portion is valid... (up,down.on.off,toggle or a number) /////////////////////////////////////////////////////////////////////////////// static int GetSendKey(const char *szLine, char *szKey) { int nFlag = 0; int nStartFound = 0; int nKeyPos = 0; int nSpecPos= 0; int nSpecNum= 1; int nPos = 0; char cTemp; char szSpecial[100]; // split the portion of the sendkey in the part before and after the spaces while ( ( (cTemp = szLine[nPos]) != '\0')) { // skip leading Ctrl/Shift/Alt state if (cTemp == '{') { nStartFound = 1; } // if (nStartFound == 1) { if ((cTemp == ' ') && (nFlag == 0) ) // get the stuff till first space { nFlag = 1; // Add } to the end of the first bit for table lookup later. szKey[nKeyPos++] = '}'; } else if (cTemp == ' ') { // skip other spaces } else if (nFlag == 0) { // save first portion into var till space or } is hit szKey[nKeyPos++] = cTemp; } else if ((nFlag == 1) && (cTemp != '}')) { // Save second portion into var... szSpecial[nSpecPos++] = cTemp; // check if Second portion is all numbers for repeat fuction if (isdigit(cTemp) == false) {nSpecNum = 0;} } } nPos++; // skip to next char } // End While // Check if the second portion is either a number or one of these keywords szKey[nKeyPos] = '\0'; szSpecial[nSpecPos] = '\0'; if (strcmp(szSpecial,"down")== 0 || strcmp(szSpecial,"up")== 0 || strcmp(szSpecial,"on")== 0 || strcmp(szSpecial,"off")== 0 || strcmp(szSpecial,"toggle")== 0 || nSpecNum == 1 ) { nFlag = 0; } else { nFlag = 1; } return nFlag; // 1 is bad, 0 is good } // GetSendKey() // // Routine to check the last "none comment" character on a line to see if its a continuation // static bool IsContinuationLine(unsigned int szLine, Accessor &styler) { int nsPos = styler.LineStart(szLine); int nePos = styler.LineStart(szLine+1) - 2; //int stylech = styler.StyleAt(nsPos); while (nsPos < nePos) { //stylech = styler.StyleAt(nePos); int stylech = styler.StyleAt(nsPos); if (!(stylech == SCE_AU3_COMMENT)) { char ch = styler.SafeGetCharAt(nePos); if (!isspacechar(ch)) { if (ch == '_') return true; else return false; } } nePos--; // skip to next char } // End While return false; } // IsContinuationLine() // // syntax highlighting logic static void ColouriseAU3Doc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; WordList &keywords3 = *keywordlists[2]; WordList &keywords4 = *keywordlists[3]; WordList &keywords5 = *keywordlists[4]; WordList &keywords6 = *keywordlists[5]; WordList &keywords7 = *keywordlists[6]; WordList &keywords8 = *keywordlists[7]; // find the first previous line without continuation character at the end int lineCurrent = styler.GetLine(startPos); int s_startPos = startPos; // When not inside a Block comment: find First line without _ if (!(initStyle==SCE_AU3_COMMENTBLOCK)) { while ((lineCurrent > 0 && IsContinuationLine(lineCurrent,styler)) || (lineCurrent > 1 && IsContinuationLine(lineCurrent-1,styler))) { lineCurrent--; startPos = styler.LineStart(lineCurrent); // get start position initStyle = 0; // reset the start style to 0 } } // Set the new length to include it from the start and set the start position length = length + s_startPos - startPos; // correct the total length to process styler.StartAt(startPos); StyleContext sc(startPos, length, initStyle, styler); char si; // string indicator "=1 '=2 char ni; // Numeric indicator error=9 normal=0 normal+dec=1 hex=2 Enot=3 char ci; // comment indicator 0=not linecomment(;) char s_save[100]; si=0; ni=0; ci=0; //$$$ for (; sc.More(); sc.Forward()) { char s[100]; sc.GetCurrentLowered(s, sizeof(s)); // ********************************************** // save the total current word for eof processing if (IsAWordChar(sc.ch) || sc.ch == '}') { strcpy(s_save,s); int tp = strlen(s_save); if (tp < 99) { s_save[tp] = static_cast(tolower(sc.ch)); s_save[tp+1] = '\0'; } } // ********************************************** // switch (sc.state) { case SCE_AU3_COMMENTBLOCK: { //Reset at line end if (sc.atLineEnd) { ci=0; if (strcmp(s, "#ce")== 0 || strcmp(s, "#comments-end")== 0) { if (sc.atLineEnd) sc.SetState(SCE_AU3_DEFAULT); else sc.SetState(SCE_AU3_COMMENTBLOCK); } break; } //skip rest of line when a ; is encountered if (sc.chPrev == ';') { ci=2; sc.SetState(SCE_AU3_COMMENTBLOCK); } // skip rest of the line if (ci==2) break; // check when first character is detected on the line if (ci==0) { if (IsAWordStart(static_cast(sc.ch)) || IsAOperator(static_cast(sc.ch))) { ci=1; sc.SetState(SCE_AU3_COMMENTBLOCK); } break; } if (!(IsAWordChar(sc.ch) || (sc.ch == '-' && strcmp(s, "#comments") == 0))) { if ((strcmp(s, "#ce")== 0 || strcmp(s, "#comments-end")== 0)) sc.SetState(SCE_AU3_COMMENT); // set to comment line for the rest of the line else ci=2; // line doesn't begin with #CE so skip the rest of the line } break; } case SCE_AU3_COMMENT: { if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);} break; } case SCE_AU3_OPERATOR: { // check if its a COMobject if (sc.chPrev == '.' && IsAWordChar(sc.ch)) { sc.SetState(SCE_AU3_COMOBJ); } else { sc.SetState(SCE_AU3_DEFAULT); } break; } case SCE_AU3_SPECIAL: { if (sc.ch == ';') {sc.SetState(SCE_AU3_COMMENT);} if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);} break; } case SCE_AU3_KEYWORD: { if (!(IsAWordChar(sc.ch) || (sc.ch == '-' && (strcmp(s, "#comments") == 0 || strcmp(s, "#include") == 0)))) { if (!IsTypeCharacter(sc.ch)) { if (strcmp(s, "#cs")== 0 || strcmp(s, "#comments-start")== 0 ) { sc.ChangeState(SCE_AU3_COMMENTBLOCK); sc.SetState(SCE_AU3_COMMENTBLOCK); break; } else if (keywords.InList(s)) { sc.ChangeState(SCE_AU3_KEYWORD); sc.SetState(SCE_AU3_DEFAULT); } else if (keywords2.InList(s)) { sc.ChangeState(SCE_AU3_FUNCTION); sc.SetState(SCE_AU3_DEFAULT); } else if (keywords3.InList(s)) { sc.ChangeState(SCE_AU3_MACRO); sc.SetState(SCE_AU3_DEFAULT); } else if (keywords5.InList(s)) { sc.ChangeState(SCE_AU3_PREPROCESSOR); sc.SetState(SCE_AU3_DEFAULT); if (strcmp(s, "#include")== 0) { si = 3; // use to determine string start for #inlude <> } } else if (keywords6.InList(s)) { sc.ChangeState(SCE_AU3_SPECIAL); sc.SetState(SCE_AU3_SPECIAL); } else if ((keywords7.InList(s)) && (!IsAOperator(static_cast(sc.ch)))) { sc.ChangeState(SCE_AU3_EXPAND); sc.SetState(SCE_AU3_DEFAULT); } else if (keywords8.InList(s)) { sc.ChangeState(SCE_AU3_UDF); sc.SetState(SCE_AU3_DEFAULT); } else if (strcmp(s, "_") == 0) { sc.ChangeState(SCE_AU3_OPERATOR); sc.SetState(SCE_AU3_DEFAULT); } else if (!IsAWordChar(sc.ch)) { sc.ChangeState(SCE_AU3_DEFAULT); sc.SetState(SCE_AU3_DEFAULT); } } } if (sc.atLineEnd) { sc.SetState(SCE_AU3_DEFAULT);} break; } case SCE_AU3_NUMBER: { // Numeric indicator error=9 normal=0 normal+dec=1 hex=2 E-not=3 // // test for Hex notation if (strcmp(s, "0") == 0 && (sc.ch == 'x' || sc.ch == 'X') && ni == 0) { ni = 2; break; } // test for E notation if (IsADigit(sc.chPrev) && (sc.ch == 'e' || sc.ch == 'E') && ni <= 1) { ni = 3; break; } // Allow Hex characters inside hex numeric strings if ((ni == 2) && (sc.ch == 'a' || sc.ch == 'b' || sc.ch == 'c' || sc.ch == 'd' || sc.ch == 'e' || sc.ch == 'f' || sc.ch == 'A' || sc.ch == 'B' || sc.ch == 'C' || sc.ch == 'D' || sc.ch == 'E' || sc.ch == 'F' )) { break; } // test for 1 dec point only if (sc.ch == '.') { if (ni==0) { ni=1; } else { ni=9; } break; } // end of numeric string ? if (!(IsADigit(sc.ch))) { if (ni==9) { sc.ChangeState(SCE_AU3_DEFAULT); } sc.SetState(SCE_AU3_DEFAULT); } break; } case SCE_AU3_VARIABLE: { // Check if its a COMObject if (sc.ch == '.' && !IsADigit(sc.chNext)) { sc.SetState(SCE_AU3_OPERATOR); } else if (!IsAWordChar(sc.ch)) { sc.SetState(SCE_AU3_DEFAULT); } break; } case SCE_AU3_COMOBJ: { if (!(IsAWordChar(sc.ch))) { sc.SetState(SCE_AU3_DEFAULT); } break; } case SCE_AU3_STRING: { // check for " to end a double qouted string or // check for ' to end a single qouted string if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\'') || (si == 3 && sc.ch == '>')) { sc.ForwardSetState(SCE_AU3_DEFAULT); si=0; break; } if (sc.atLineEnd) { si=0; // at line end and not found a continuation char then reset to default int lineCurrent = styler.GetLine(sc.currentPos); if (!IsContinuationLine(lineCurrent,styler)) { sc.SetState(SCE_AU3_DEFAULT); break; } } // find Sendkeys in a STRING if (sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' ) { sc.SetState(SCE_AU3_SENT);} break; } case SCE_AU3_SENT: { // Send key string ended if (sc.chPrev == '}' && sc.ch != '}') { // set color to SENDKEY when valid sendkey .. else set back to regular string char sk[100]; // split {111 222} and return {111} and check if 222 is valid. // if return code = 1 then invalid 222 so must be string if (GetSendKey(s,sk)) { sc.ChangeState(SCE_AU3_STRING); } // if single char between {?} then its ok as sendkey for a single character else if (strlen(sk) == 3) { sc.ChangeState(SCE_AU3_SENT); } // if sendkey {111} is in table then ok as sendkey else if (keywords4.InList(sk)) { sc.ChangeState(SCE_AU3_SENT); } else { sc.ChangeState(SCE_AU3_STRING); } sc.SetState(SCE_AU3_STRING); } else { // check if the start is a valid SendKey start int nPos = 0; int nState = 1; char cTemp; while (!(nState == 2) && ((cTemp = s[nPos]) != '\0')) { if (cTemp == '{' && nState == 1) { nState = 2; } if (nState == 1 && !(cTemp == '+' || cTemp == '!' || cTemp == '^' || cTemp == '#' )) { nState = 0; } nPos++; } //Verify characters infront of { ... if not assume regular string if (nState == 1 && (!(sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' ))) { sc.ChangeState(SCE_AU3_STRING); sc.SetState(SCE_AU3_STRING); } // If invalid character found then assume its a regular string if (nState == 0) { sc.ChangeState(SCE_AU3_STRING); sc.SetState(SCE_AU3_STRING); } } // check if next portion is again a sendkey if (sc.atLineEnd) { sc.ChangeState(SCE_AU3_STRING); sc.SetState(SCE_AU3_DEFAULT); si = 0; // reset string indicator } //* check in next characters following a sentkey are again a sent key // Need this test incase of 2 sentkeys like {F1}{ENTER} but not detect {{} if (sc.state == SCE_AU3_STRING && (sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' )) { sc.SetState(SCE_AU3_SENT);} // check to see if the string ended... // Sendkey string isn't complete but the string ended.... if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\'')) { sc.ChangeState(SCE_AU3_STRING); sc.ForwardSetState(SCE_AU3_DEFAULT); } break; } } //switch (sc.state) // Determine if a new state should be entered: if (sc.state == SCE_AU3_DEFAULT) { if (sc.ch == ';') {sc.SetState(SCE_AU3_COMMENT);} else if (sc.ch == '#') {sc.SetState(SCE_AU3_KEYWORD);} else if (sc.ch == '$') {sc.SetState(SCE_AU3_VARIABLE);} else if (sc.ch == '.' && !IsADigit(sc.chNext)) {sc.SetState(SCE_AU3_OPERATOR);} else if (sc.ch == '@') {sc.SetState(SCE_AU3_KEYWORD);} //else if (sc.ch == '_') {sc.SetState(SCE_AU3_KEYWORD);} else if (sc.ch == '<' && si==3) {sc.SetState(SCE_AU3_STRING);} // string after #include else if (sc.ch == '\"') { sc.SetState(SCE_AU3_STRING); si = 1; } else if (sc.ch == '\'') { sc.SetState(SCE_AU3_STRING); si = 2; } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { sc.SetState(SCE_AU3_NUMBER); ni = 0; } else if (IsAWordStart(sc.ch)) {sc.SetState(SCE_AU3_KEYWORD);} else if (IsAOperator(static_cast(sc.ch))) {sc.SetState(SCE_AU3_OPERATOR);} else if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);} } } //for (; sc.More(); sc.Forward()) //************************************* // Colourize the last word correctly //************************************* if (sc.state == SCE_AU3_KEYWORD) { if (strcmp(s_save, "#cs")== 0 || strcmp(s_save, "#comments-start")== 0 ) { sc.ChangeState(SCE_AU3_COMMENTBLOCK); sc.SetState(SCE_AU3_COMMENTBLOCK); } else if (keywords.InList(s_save)) { sc.ChangeState(SCE_AU3_KEYWORD); sc.SetState(SCE_AU3_KEYWORD); } else if (keywords2.InList(s_save)) { sc.ChangeState(SCE_AU3_FUNCTION); sc.SetState(SCE_AU3_FUNCTION); } else if (keywords3.InList(s_save)) { sc.ChangeState(SCE_AU3_MACRO); sc.SetState(SCE_AU3_MACRO); } else if (keywords5.InList(s_save)) { sc.ChangeState(SCE_AU3_PREPROCESSOR); sc.SetState(SCE_AU3_PREPROCESSOR); } else if (keywords6.InList(s_save)) { sc.ChangeState(SCE_AU3_SPECIAL); sc.SetState(SCE_AU3_SPECIAL); } else if (keywords7.InList(s_save) && sc.atLineEnd) { sc.ChangeState(SCE_AU3_EXPAND); sc.SetState(SCE_AU3_EXPAND); } else if (keywords8.InList(s_save)) { sc.ChangeState(SCE_AU3_UDF); sc.SetState(SCE_AU3_UDF); } else { sc.ChangeState(SCE_AU3_DEFAULT); sc.SetState(SCE_AU3_DEFAULT); } } if (sc.state == SCE_AU3_SENT) { // Send key string ended if (sc.chPrev == '}' && sc.ch != '}') { // set color to SENDKEY when valid sendkey .. else set back to regular string char sk[100]; // split {111 222} and return {111} and check if 222 is valid. // if return code = 1 then invalid 222 so must be string if (GetSendKey(s_save,sk)) { sc.ChangeState(SCE_AU3_STRING); } // if single char between {?} then its ok as sendkey for a single character else if (strlen(sk) == 3) { sc.ChangeState(SCE_AU3_SENT); } // if sendkey {111} is in table then ok as sendkey else if (keywords4.InList(sk)) { sc.ChangeState(SCE_AU3_SENT); } else { sc.ChangeState(SCE_AU3_STRING); } sc.SetState(SCE_AU3_STRING); } // check if next portion is again a sendkey if (sc.atLineEnd) { sc.ChangeState(SCE_AU3_STRING); sc.SetState(SCE_AU3_DEFAULT); } } //************************************* sc.Complete(); } // static bool IsStreamCommentStyle(int style) { return style == SCE_AU3_COMMENT || style == SCE_AU3_COMMENTBLOCK; } // // Routine to find first none space on the current line and return its Style // needed for comment lines not starting on pos 1 static int GetStyleFirstWord(unsigned int szLine, Accessor &styler) { int nsPos = styler.LineStart(szLine); int nePos = styler.LineStart(szLine+1) - 1; while (isspacechar(styler.SafeGetCharAt(nsPos)) && nsPos < nePos) { nsPos++; // skip to next char } // End While return styler.StyleAt(nsPos); } // GetStyleFirstWord() // static void FoldAU3Doc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { int endPos = startPos + length; // get settings from the config files for folding comments and preprocessor lines bool foldComment = styler.GetPropertyInt("fold.comment") != 0; bool foldInComment = styler.GetPropertyInt("fold.comment") == 2; bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; bool foldpreprocessor = styler.GetPropertyInt("fold.preprocessor") != 0; // Backtrack to previous line in case need to fix its fold status int lineCurrent = styler.GetLine(startPos); if (startPos > 0) { if (lineCurrent > 0) { lineCurrent--; startPos = styler.LineStart(lineCurrent); } } // vars for style of previous/current/next lines int style = GetStyleFirstWord(lineCurrent,styler); int stylePrev = 0; // find the first previous line without continuation character at the end while ((lineCurrent > 0 && IsContinuationLine(lineCurrent,styler)) || (lineCurrent > 1 && IsContinuationLine(lineCurrent-1,styler))) { lineCurrent--; startPos = styler.LineStart(lineCurrent); } if (lineCurrent > 0) { stylePrev = GetStyleFirstWord(lineCurrent-1,styler); } // vars for getting first word to check for keywords bool FirstWordStart = false; bool FirstWordEnd = false; char szKeyword[11]=""; int szKeywordlen = 0; char szThen[5]=""; int szThenlen = 0; bool ThenFoundLast = false; // var for indentlevel int levelCurrent = SC_FOLDLEVELBASE; if (lineCurrent > 0) levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; int levelNext = levelCurrent; // int visibleChars = 0; char chNext = styler.SafeGetCharAt(startPos); char chPrev = ' '; // for (int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); if (IsAWordChar(ch)) { visibleChars++; } // get the syle for the current character neede to check in comment int stylech = styler.StyleAt(i); // get first word for the line for indent check max 9 characters if (FirstWordStart && (!(FirstWordEnd))) { if (!IsAWordChar(ch)) { FirstWordEnd = true; szKeyword[szKeywordlen] = '\0'; } else { if (szKeywordlen < 10) { szKeyword[szKeywordlen++] = static_cast(tolower(ch)); } } } // start the capture of the first word if (!(FirstWordStart)) { if (IsAWordChar(ch) || IsAWordStart(ch) || ch == ';') { FirstWordStart = true; szKeyword[szKeywordlen++] = static_cast(tolower(ch)); } } // only process this logic when not in comment section if (!(stylech == SCE_AU3_COMMENT)) { if (ThenFoundLast) { if (IsAWordChar(ch)) { ThenFoundLast = false; } } // find out if the word "then" is the last on a "if" line if (FirstWordEnd && strcmp(szKeyword,"if") == 0) { if (szThenlen == 4) { szThen[0] = szThen[1]; szThen[1] = szThen[2]; szThen[2] = szThen[3]; szThen[3] = static_cast(tolower(ch)); if (strcmp(szThen,"then") == 0 ) { ThenFoundLast = true; } } else { szThen[szThenlen++] = static_cast(tolower(ch)); if (szThenlen == 5) { szThen[4] = '\0'; } } } } // End of Line found so process the information if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos)) { // ************************** // Folding logic for Keywords // ************************** // if a keyword is found on the current line and the line doesn't end with _ (continuation) // and we are not inside a commentblock. if (szKeywordlen > 0 && (!(chPrev == '_')) && ((!(IsStreamCommentStyle(style)) || foldInComment)) ) { szKeyword[szKeywordlen] = '\0'; // only fold "if" last keyword is "then" (else its a one line if) if (strcmp(szKeyword,"if") == 0 && ThenFoundLast) { levelNext++; } // create new fold for these words if (strcmp(szKeyword,"do") == 0 || strcmp(szKeyword,"for") == 0 || strcmp(szKeyword,"func") == 0 || strcmp(szKeyword,"while") == 0|| strcmp(szKeyword,"with") == 0 || strcmp(szKeyword,"#region") == 0 ) { levelNext++; } // create double Fold for select&switch because Case will subtract one of the current level if (strcmp(szKeyword,"select") == 0 || strcmp(szKeyword,"switch") == 0) { levelNext++; levelNext++; } // end the fold for these words before the current line if (strcmp(szKeyword,"endfunc") == 0 || strcmp(szKeyword,"endif") == 0 || strcmp(szKeyword,"next") == 0 || strcmp(szKeyword,"until") == 0 || strcmp(szKeyword,"endwith") == 0 ||strcmp(szKeyword,"wend") == 0){ levelNext--; levelCurrent--; } // end the fold for these words before the current line and Start new fold if (strcmp(szKeyword,"case") == 0 || strcmp(szKeyword,"else") == 0 || strcmp(szKeyword,"elseif") == 0 ) { levelCurrent--; } // end the double fold for this word before the current line if (strcmp(szKeyword,"endselect") == 0 || strcmp(szKeyword,"endswitch") == 0 ) { levelNext--; levelNext--; levelCurrent--; levelCurrent--; } // end the fold for these words on the current line if (strcmp(szKeyword,"#endregion") == 0 ) { levelNext--; } } // Preprocessor and Comment folding int styleNext = GetStyleFirstWord(lineCurrent + 1,styler); // ************************************* // Folding logic for preprocessor blocks // ************************************* // process preprosessor line if (foldpreprocessor && style == SCE_AU3_PREPROCESSOR) { if (!(stylePrev == SCE_AU3_PREPROCESSOR) && (styleNext == SCE_AU3_PREPROCESSOR)) { levelNext++; } // fold till the last line for normal comment lines else if (stylePrev == SCE_AU3_PREPROCESSOR && !(styleNext == SCE_AU3_PREPROCESSOR)) { levelNext--; } } // ********************************* // Folding logic for Comment blocks // ********************************* if (foldComment && IsStreamCommentStyle(style)) { // Start of a comment block if (!(stylePrev==style) && IsStreamCommentStyle(styleNext) && styleNext==style) { levelNext++; } // fold till the last line for normal comment lines else if (IsStreamCommentStyle(stylePrev) && !(styleNext == SCE_AU3_COMMENT) && stylePrev == SCE_AU3_COMMENT && style == SCE_AU3_COMMENT) { levelNext--; } // fold till the one but last line for Blockcomment lines else if (IsStreamCommentStyle(stylePrev) && !(styleNext == SCE_AU3_COMMENTBLOCK) && style == SCE_AU3_COMMENTBLOCK) { levelNext--; levelCurrent--; } } int levelUse = levelCurrent; int lev = levelUse | levelNext << 16; if (visibleChars == 0 && foldCompact) lev |= SC_FOLDLEVELWHITEFLAG; if (levelUse < levelNext) { lev |= SC_FOLDLEVELHEADERFLAG; } if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } // reset values for the next line lineCurrent++; stylePrev = style; style = styleNext; levelCurrent = levelNext; visibleChars = 0; // if the last character is an Underscore then don't reset since the line continues on the next line. if (!(chPrev == '_')) { szKeywordlen = 0; szThenlen = 0; FirstWordStart = false; FirstWordEnd = false; ThenFoundLast = false; } } // save the last processed character if (!isspacechar(ch)) { chPrev = ch; visibleChars++; } } } // static const char * const AU3WordLists[] = { "#autoit keywords", "#autoit functions", "#autoit macros", "#autoit Sent keys", "#autoit Pre-processors", "#autoit Special", "#autoit Expand", "#autoit UDF", 0 }; LexerModule lmAU3(SCLEX_AU3, ColouriseAU3Doc, "au3", FoldAU3Doc , AU3WordLists); tora-2.1.3/src/qscintilla2/src/LexYAML.cpp0000644000175000017500000002473611213435521020003 0ustar michaelmichael// Scintilla source code edit control /** @file LexYAML.cxx ** Lexer for YAML. **/ // Copyright 2003- by Sean O'Dell // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static const char * const yamlWordListDesc[] = { "Keywords", 0 }; static inline bool AtEOL(Accessor &styler, unsigned int i) { return (styler[i] == '\n') || ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')); } static unsigned int SpaceCount(char* lineBuffer) { if (lineBuffer == NULL) return 0; char* headBuffer = lineBuffer; while (*headBuffer == ' ') headBuffer++; return headBuffer - lineBuffer; } #define YAML_STATE_BITSIZE 16 #define YAML_STATE_MASK (0xFFFF0000) #define YAML_STATE_DOCUMENT (1 << YAML_STATE_BITSIZE) #define YAML_STATE_VALUE (2 << YAML_STATE_BITSIZE) #define YAML_STATE_COMMENT (3 << YAML_STATE_BITSIZE) #define YAML_STATE_TEXT_PARENT (4 << YAML_STATE_BITSIZE) #define YAML_STATE_TEXT (5 << YAML_STATE_BITSIZE) static void ColouriseYAMLLine( char *lineBuffer, unsigned int currentLine, unsigned int lengthLine, unsigned int startLine, unsigned int endPos, WordList &keywords, Accessor &styler) { unsigned int i = 0; bool bInQuotes = false; unsigned int indentAmount = SpaceCount(lineBuffer); if (currentLine > 0) { int parentLineState = styler.GetLineState(currentLine - 1); if ((parentLineState&YAML_STATE_MASK) == YAML_STATE_TEXT || (parentLineState&YAML_STATE_MASK) == YAML_STATE_TEXT_PARENT) { unsigned int parentIndentAmount = parentLineState&(~YAML_STATE_MASK); if (indentAmount > parentIndentAmount) { styler.SetLineState(currentLine, YAML_STATE_TEXT | parentIndentAmount); styler.ColourTo(endPos, SCE_YAML_TEXT); return; } } } styler.SetLineState(currentLine, 0); if (strncmp(lineBuffer, "---", 3) == 0) { // Document marker styler.SetLineState(currentLine, YAML_STATE_DOCUMENT); styler.ColourTo(endPos, SCE_YAML_DOCUMENT); return; } // Skip initial spaces while ((i < lengthLine) && lineBuffer[i] == ' ') { // YAML always uses space, never TABS or anything else i++; } if (lineBuffer[i] == '\t') { // if we skipped all spaces, and we are NOT inside a text block, this is wrong styler.ColourTo(endPos, SCE_YAML_ERROR); return; } if (lineBuffer[i] == '#') { // Comment styler.SetLineState(currentLine, YAML_STATE_COMMENT); styler.ColourTo(endPos, SCE_YAML_COMMENT); return; } while (i < lengthLine) { if (lineBuffer[i] == '\'' || lineBuffer[i] == '\"') { bInQuotes = !bInQuotes; } else if (lineBuffer[i] == ':' && !bInQuotes) { styler.ColourTo(startLine + i - 1, SCE_YAML_IDENTIFIER); styler.ColourTo(startLine + i, SCE_YAML_OPERATOR); // Non-folding scalar i++; while ((i < lengthLine) && isspacechar(lineBuffer[i])) i++; unsigned int endValue = lengthLine - 1; while ((endValue >= i) && isspacechar(lineBuffer[endValue])) endValue--; lineBuffer[endValue + 1] = '\0'; if (lineBuffer[i] == '|' || lineBuffer[i] == '>') { i++; if (lineBuffer[i] == '+' || lineBuffer[i] == '-') i++; while ((i < lengthLine) && isspacechar(lineBuffer[i])) i++; if (lineBuffer[i] == '\0') { styler.SetLineState(currentLine, YAML_STATE_TEXT_PARENT | indentAmount); styler.ColourTo(endPos, SCE_YAML_DEFAULT); return; } else if (lineBuffer[i] == '#') { styler.SetLineState(currentLine, YAML_STATE_TEXT_PARENT | indentAmount); styler.ColourTo(startLine + i - 1, SCE_YAML_DEFAULT); styler.ColourTo(endPos, SCE_YAML_COMMENT); return; } else { styler.ColourTo(endPos, SCE_YAML_ERROR); return; } } else if (lineBuffer[i] == '#') { styler.ColourTo(startLine + i - 1, SCE_YAML_DEFAULT); styler.ColourTo(endPos, SCE_YAML_COMMENT); return; } styler.SetLineState(currentLine, YAML_STATE_VALUE); if (lineBuffer[i] == '&' || lineBuffer[i] == '*') { styler.ColourTo(endPos, SCE_YAML_REFERENCE); return; } if (keywords.InList(&lineBuffer[i])) { // Convertible value (true/false, etc.) styler.ColourTo(endPos, SCE_YAML_KEYWORD); return; } else { unsigned int i2 = i; while ((i < lengthLine) && lineBuffer[i]) { if (!(isascii(lineBuffer[i]) && isdigit(lineBuffer[i])) && lineBuffer[i] != '-' && lineBuffer[i] != '.' && lineBuffer[i] != ',') { styler.ColourTo(endPos, SCE_YAML_DEFAULT); return; } i++; } if (i > i2) { styler.ColourTo(endPos, SCE_YAML_NUMBER); return; } } break; // shouldn't get here, but just in case, the rest of the line is coloured the default } i++; } styler.ColourTo(endPos, SCE_YAML_DEFAULT); } static void ColouriseYAMLDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) { char lineBuffer[1024]; styler.StartAt(startPos); styler.StartSegment(startPos); unsigned int linePos = 0; unsigned int startLine = startPos; unsigned int endPos = startPos + length; unsigned int maxPos = styler.Length(); unsigned int lineCurrent = styler.GetLine(startPos); for (unsigned int i = startPos; i < maxPos && i < endPos; i++) { lineBuffer[linePos++] = styler[i]; if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) { // End of line (or of line buffer) met, colourise it lineBuffer[linePos] = '\0'; ColouriseYAMLLine(lineBuffer, lineCurrent, linePos, startLine, i, *keywordLists[0], styler); linePos = 0; startLine = i + 1; lineCurrent++; } } if (linePos > 0) { // Last line does not have ending characters ColouriseYAMLLine(lineBuffer, lineCurrent, linePos, startLine, startPos + length - 1, *keywordLists[0], styler); } } static bool IsCommentLine(int line, Accessor &styler) { int pos = styler.LineStart(line); if (styler[pos] == '#') return true; return false; } static void FoldYAMLDoc(unsigned int startPos, int length, int /*initStyle - unused*/, WordList *[], Accessor &styler) { const int maxPos = startPos + length; const int maxLines = styler.GetLine(maxPos - 1); // Requested last line const int docLines = styler.GetLine(styler.Length() - 1); // Available last line const bool foldComment = styler.GetPropertyInt("fold.comment.yaml") != 0; // Backtrack to previous non-blank line so we can determine indent level // for any white space lines // and so we can fix any preceding fold level (which is why we go back // at least one line in all cases) int spaceFlags = 0; int lineCurrent = styler.GetLine(startPos); int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL); while (lineCurrent > 0) { lineCurrent--; indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL); if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG) && (!IsCommentLine(lineCurrent, styler))) break; } int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK; // Set up initial loop state int prevComment = 0; if (lineCurrent >= 1) prevComment = foldComment && IsCommentLine(lineCurrent - 1, styler); // Process all characters to end of requested range // or comment that hangs over the end of the range. Cap processing in all cases // to end of document (in case of unclosed comment at end). while ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) || prevComment)) { // Gather info int lev = indentCurrent; int lineNext = lineCurrent + 1; int indentNext = indentCurrent; if (lineNext <= docLines) { // Information about next line is only available if not at end of document indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL); } const int comment = foldComment && IsCommentLine(lineCurrent, styler); const int comment_start = (comment && !prevComment && (lineNext <= docLines) && IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE)); const int comment_continue = (comment && prevComment); if (!comment) indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK; if (indentNext & SC_FOLDLEVELWHITEFLAG) indentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel; if (comment_start) { // Place fold point at start of a block of comments lev |= SC_FOLDLEVELHEADERFLAG; } else if (comment_continue) { // Add level to rest of lines in the block lev = lev + 1; } // Skip past any blank lines for next indent level info; we skip also // comments (all comments, not just those starting in column 0) // which effectively folds them into surrounding code rather // than screwing up folding. while ((lineNext < docLines) && ((indentNext & SC_FOLDLEVELWHITEFLAG) || (lineNext <= docLines && IsCommentLine(lineNext, styler)))) { lineNext++; indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL); } const int levelAfterComments = indentNext & SC_FOLDLEVELNUMBERMASK; const int levelBeforeComments = Platform::Maximum(indentCurrentLevel,levelAfterComments); // Now set all the indent levels on the lines we skipped // Do this from end to start. Once we encounter one line // which is indented more than the line after the end of // the comment-block, use the level of the block before int skipLine = lineNext; int skipLevel = levelAfterComments; while (--skipLine > lineCurrent) { int skipLineIndent = styler.IndentAmount(skipLine, &spaceFlags, NULL); if ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > levelAfterComments) skipLevel = levelBeforeComments; int whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG; styler.SetLevel(skipLine, skipLevel | whiteFlag); } // Set fold header on non-comment line if (!comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) { if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) lev |= SC_FOLDLEVELHEADERFLAG; } // Keep track of block comment state of previous line prevComment = comment_start || comment_continue; // Set fold level for this line and move to next line styler.SetLevel(lineCurrent, lev); indentCurrent = indentNext; lineCurrent = lineNext; } // NOTE: Cannot set level of last line here because indentCurrent doesn't have // header flag set; the loop above is crafted to take care of this case! //styler.SetLevel(lineCurrent, indentCurrent); } LexerModule lmYAML(SCLEX_YAML, ColouriseYAMLDoc, "yaml", FoldYAMLDoc, yamlWordListDesc); tora-2.1.3/src/qscintilla2/src/ContractionState.h0000644000175000017500000000272411213435521021512 0ustar michaelmichael// Scintilla source code edit control /** @file ContractionState.h ** Manages visibility of lines for folding and wrapping. **/ // Copyright 1998-2007 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #ifndef CONTRACTIONSTATE_H #define CONTRACTIONSTATE_H #ifdef SCI_NAMESPACE namespace Scintilla { #endif /** */ class ContractionState { // These contain 1 element for every document line. RunStyles *visible; RunStyles *expanded; RunStyles *heights; Partitioning *displayLines; int linesInDocument; void EnsureData(); bool OneToOne() const { // True when each document line is exactly one display line so need for // complex data structures. return visible == 0; } public: ContractionState(); virtual ~ContractionState(); void Clear(); int LinesInDoc() const; int LinesDisplayed() const; int DisplayFromDoc(int lineDoc) const; int DocFromDisplay(int lineDisplay) const; void InsertLine(int lineDoc); void InsertLines(int lineDoc, int lineCount); void DeleteLine(int lineDoc); void DeleteLines(int lineDoc, int lineCount); bool GetVisible(int lineDoc) const; bool SetVisible(int lineDocStart, int lineDocEnd, bool visible); bool GetExpanded(int lineDoc) const; bool SetExpanded(int lineDoc, bool expanded); int GetHeight(int lineDoc) const; bool SetHeight(int lineDoc, int height); void ShowAll(); void Check() const; }; #ifdef SCI_NAMESPACE } #endif #endif tora-2.1.3/src/qscintilla2/src/LexEScript.cpp0000644000175000017500000001766211213435521020612 0ustar michaelmichael// Scintilla source code edit control /** @file LexESCRIPT.cxx ** Lexer for ESCRIPT **/ // Copyright 2003 by Patrizio Bekerle (patrizio@bekerle.com) #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsAWordChar(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); } static inline bool IsAWordStart(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_'); } static void ColouriseESCRIPTDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; WordList &keywords3 = *keywordlists[2]; // Do not leak onto next line /*if (initStyle == SCE_ESCRIPT_STRINGEOL) initStyle = SCE_ESCRIPT_DEFAULT;*/ StyleContext sc(startPos, length, initStyle, styler); bool caseSensitive = styler.GetPropertyInt("escript.case.sensitive", 0) != 0; for (; sc.More(); sc.Forward()) { /*if (sc.atLineStart && (sc.state == SCE_ESCRIPT_STRING)) { // Prevent SCE_ESCRIPT_STRINGEOL from leaking back to previous line sc.SetState(SCE_ESCRIPT_STRING); }*/ // Handle line continuation generically. if (sc.ch == '\\') { if (sc.chNext == '\n' || sc.chNext == '\r') { sc.Forward(); if (sc.ch == '\r' && sc.chNext == '\n') { sc.Forward(); } continue; } } // Determine if the current state should terminate. if (sc.state == SCE_ESCRIPT_OPERATOR || sc.state == SCE_ESCRIPT_BRACE) { sc.SetState(SCE_ESCRIPT_DEFAULT); } else if (sc.state == SCE_ESCRIPT_NUMBER) { if (!IsADigit(sc.ch) || sc.ch != '.') { sc.SetState(SCE_ESCRIPT_DEFAULT); } } else if (sc.state == SCE_ESCRIPT_IDENTIFIER) { if (!IsAWordChar(sc.ch) || (sc.ch == '.')) { char s[100]; if (caseSensitive) { sc.GetCurrent(s, sizeof(s)); } else { sc.GetCurrentLowered(s, sizeof(s)); } // sc.GetCurrentLowered(s, sizeof(s)); if (keywords.InList(s)) { sc.ChangeState(SCE_ESCRIPT_WORD); } else if (keywords2.InList(s)) { sc.ChangeState(SCE_ESCRIPT_WORD2); } else if (keywords3.InList(s)) { sc.ChangeState(SCE_ESCRIPT_WORD3); // sc.state = SCE_ESCRIPT_IDENTIFIER; } sc.SetState(SCE_ESCRIPT_DEFAULT); } } else if (sc.state == SCE_ESCRIPT_COMMENT) { if (sc.Match('*', '/')) { sc.Forward(); sc.ForwardSetState(SCE_ESCRIPT_DEFAULT); } } else if (sc.state == SCE_ESCRIPT_COMMENTDOC) { if (sc.Match('*', '/')) { sc.Forward(); sc.ForwardSetState(SCE_ESCRIPT_DEFAULT); } } else if (sc.state == SCE_ESCRIPT_COMMENTLINE) { if (sc.atLineEnd) { sc.SetState(SCE_ESCRIPT_DEFAULT); } } else if (sc.state == SCE_ESCRIPT_STRING) { if (sc.ch == '\\') { if (sc.chNext == '\"' || sc.chNext == '\\') { sc.Forward(); } } else if (sc.ch == '\"') { sc.ForwardSetState(SCE_ESCRIPT_DEFAULT); } } // Determine if a new state should be entered. if (sc.state == SCE_ESCRIPT_DEFAULT) { if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { sc.SetState(SCE_ESCRIPT_NUMBER); } else if (IsAWordStart(sc.ch) || (sc.ch == '#')) { sc.SetState(SCE_ESCRIPT_IDENTIFIER); } else if (sc.Match('/', '*')) { sc.SetState(SCE_ESCRIPT_COMMENT); sc.Forward(); // Eat the * so it isn't used for the end of the comment } else if (sc.Match('/', '/')) { sc.SetState(SCE_ESCRIPT_COMMENTLINE); } else if (sc.ch == '\"') { sc.SetState(SCE_ESCRIPT_STRING); //} else if (isoperator(static_cast(sc.ch))) { } else if (sc.ch == '+' || sc.ch == '-' || sc.ch == '*' || sc.ch == '/' || sc.ch == '=' || sc.ch == '<' || sc.ch == '>' || sc.ch == '&' || sc.ch == '|' || sc.ch == '!' || sc.ch == '?' || sc.ch == ':') { sc.SetState(SCE_ESCRIPT_OPERATOR); } else if (sc.ch == '{' || sc.ch == '}') { sc.SetState(SCE_ESCRIPT_BRACE); } } } sc.Complete(); } static int classifyFoldPointESCRIPT(const char* s, const char* prevWord) { int lev = 0; if (strcmp(prevWord, "end") == 0) return lev; if ((strcmp(prevWord, "else") == 0 && strcmp(s, "if") == 0) || strcmp(s, "elseif") == 0) return -1; if (strcmp(s, "for") == 0 || strcmp(s, "foreach") == 0 || strcmp(s, "program") == 0 || strcmp(s, "function") == 0 || strcmp(s, "while") == 0 || strcmp(s, "case") == 0 || strcmp(s, "if") == 0 ) { lev = 1; } else if ( strcmp(s, "endfor") == 0 || strcmp(s, "endforeach") == 0 || strcmp(s, "endprogram") == 0 || strcmp(s, "endfunction") == 0 || strcmp(s, "endwhile") == 0 || strcmp(s, "endcase") == 0 || strcmp(s, "endif") == 0 ) { lev = -1; } return lev; } static bool IsStreamCommentStyle(int style) { return style == SCE_ESCRIPT_COMMENT || style == SCE_ESCRIPT_COMMENTDOC || style == SCE_ESCRIPT_COMMENTLINE; } static void FoldESCRIPTDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) { //~ bool foldComment = styler.GetPropertyInt("fold.comment") != 0; // Do not know how to fold the comment at the moment. bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; bool foldComment = true; unsigned int endPos = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; int levelCurrent = levelPrev; char chNext = styler[startPos]; int styleNext = styler.StyleAt(startPos); int style = initStyle; int lastStart = 0; char prevWord[32] = ""; for (unsigned int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); int stylePrev = style; style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if (foldComment && IsStreamCommentStyle(style)) { if (!IsStreamCommentStyle(stylePrev)) { levelCurrent++; } else if (!IsStreamCommentStyle(styleNext) && !atEOL) { // Comments don't end at end of line and the next character may be unstyled. levelCurrent--; } } if (foldComment && (style == SCE_ESCRIPT_COMMENTLINE)) { if ((ch == '/') && (chNext == '/')) { char chNext2 = styler.SafeGetCharAt(i + 2); if (chNext2 == '{') { levelCurrent++; } else if (chNext2 == '}') { levelCurrent--; } } } if (stylePrev == SCE_ESCRIPT_DEFAULT && style == SCE_ESCRIPT_WORD3) { // Store last word start point. lastStart = i; } if (style == SCE_ESCRIPT_WORD3) { if(iswordchar(ch) && !iswordchar(chNext)) { char s[32]; unsigned int j; for(j = 0; ( j < 31 ) && ( j < i-lastStart+1 ); j++) { s[j] = static_cast(tolower(styler[lastStart + j])); } s[j] = '\0'; levelCurrent += classifyFoldPointESCRIPT(s, prevWord); strcpy(prevWord, s); } } if (atEOL) { int lev = levelPrev; if (visibleChars == 0 && foldCompact) lev |= SC_FOLDLEVELWHITEFLAG; if ((levelCurrent > levelPrev) && (visibleChars > 0)) lev |= SC_FOLDLEVELHEADERFLAG; if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } lineCurrent++; levelPrev = levelCurrent; visibleChars = 0; strcpy(prevWord, ""); } if (!isspacechar(ch)) visibleChars++; } // Fill in the real level of the next line, keeping the current flags as they will be filled in later int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; styler.SetLevel(lineCurrent, levelPrev | flagsNext); } static const char * const ESCRIPTWordLists[] = { "Primary keywords and identifiers", "Intrinsic functions", "Extended and user defined functions", 0, }; LexerModule lmESCRIPT(SCLEX_ESCRIPT, ColouriseESCRIPTDoc, "escript", FoldESCRIPTDoc, ESCRIPTWordLists); tora-2.1.3/src/qscintilla2/src/LexOthers.cpp0000644000175000017500000012474611213435521020507 0ustar michaelmichael// Scintilla source code edit control /** @file LexOthers.cxx ** Lexers for batch files, diff results, properties files, make files and error lists. ** Also lexer for LaTeX documents. **/ // Copyright 1998-2001 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static bool strstart(const char *haystack, const char *needle) { return strncmp(haystack, needle, strlen(needle)) == 0; } static bool Is0To9(char ch) { return (ch >= '0') && (ch <= '9'); } static bool Is1To9(char ch) { return (ch >= '1') && (ch <= '9'); } static inline bool AtEOL(Accessor &styler, unsigned int i) { return (styler[i] == '\n') || ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')); } // Tests for BATCH Operators static bool IsBOperator(char ch) { return (ch == '=') || (ch == '+') || (ch == '>') || (ch == '<') || (ch == '|') || (ch == '?') || (ch == '*'); } // Tests for BATCH Separators static bool IsBSeparator(char ch) { return (ch == '\\') || (ch == '.') || (ch == ';') || (ch == '\"') || (ch == '\'') || (ch == '/') || (ch == ')'); } static void ColouriseBatchLine( char *lineBuffer, unsigned int lengthLine, unsigned int startLine, unsigned int endPos, WordList *keywordlists[], Accessor &styler) { unsigned int offset = 0; // Line Buffer Offset unsigned int cmdLoc; // External Command / Program Location char wordBuffer[81]; // Word Buffer - large to catch long paths unsigned int wbl; // Word Buffer Length unsigned int wbo; // Word Buffer Offset - also Special Keyword Buffer Length WordList &keywords = *keywordlists[0]; // Internal Commands WordList &keywords2 = *keywordlists[1]; // External Commands (optional) // CHOICE, ECHO, GOTO, PROMPT and SET have Default Text that may contain Regular Keywords // Toggling Regular Keyword Checking off improves readability // Other Regular Keywords and External Commands / Programs might also benefit from toggling // Need a more robust algorithm to properly toggle Regular Keyword Checking bool continueProcessing = true; // Used to toggle Regular Keyword Checking // Special Keywords are those that allow certain characters without whitespace after the command // Examples are: cd. cd\ md. rd. dir| dir> echo: echo. path= // Special Keyword Buffer used to determine if the first n characters is a Keyword char sKeywordBuffer[10]; // Special Keyword Buffer bool sKeywordFound; // Exit Special Keyword for-loop if found // Skip initial spaces while ((offset < lengthLine) && (isspacechar(lineBuffer[offset]))) { offset++; } // Colorize Default Text styler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT); // Set External Command / Program Location cmdLoc = offset; // Check for Fake Label (Comment) or Real Label - return if found if (lineBuffer[offset] == ':') { if (lineBuffer[offset + 1] == ':') { // Colorize Fake Label (Comment) - :: is similar to REM, see http://content.techweb.com/winmag/columns/explorer/2000/21.htm styler.ColourTo(endPos, SCE_BAT_COMMENT); } else { // Colorize Real Label styler.ColourTo(endPos, SCE_BAT_LABEL); } return; // Check for Drive Change (Drive Change is internal command) - return if found } else if ((isalpha(lineBuffer[offset])) && (lineBuffer[offset + 1] == ':') && ((isspacechar(lineBuffer[offset + 2])) || (((lineBuffer[offset + 2] == '\\')) && (isspacechar(lineBuffer[offset + 3]))))) { // Colorize Regular Keyword styler.ColourTo(endPos, SCE_BAT_WORD); return; } // Check for Hide Command (@ECHO OFF/ON) if (lineBuffer[offset] == '@') { styler.ColourTo(startLine + offset, SCE_BAT_HIDE); offset++; } // Skip next spaces while ((offset < lengthLine) && (isspacechar(lineBuffer[offset]))) { offset++; } // Read remainder of line word-at-a-time or remainder-of-word-at-a-time while (offset < lengthLine) { if (offset > startLine) { // Colorize Default Text styler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT); } // Copy word from Line Buffer into Word Buffer wbl = 0; for (; offset < lengthLine && wbl < 80 && !isspacechar(lineBuffer[offset]); wbl++, offset++) { wordBuffer[wbl] = static_cast(tolower(lineBuffer[offset])); } wordBuffer[wbl] = '\0'; wbo = 0; // Check for Comment - return if found if (CompareCaseInsensitive(wordBuffer, "rem") == 0) { styler.ColourTo(endPos, SCE_BAT_COMMENT); return; } // Check for Separator if (IsBSeparator(wordBuffer[0])) { // Check for External Command / Program if ((cmdLoc == offset - wbl) && ((wordBuffer[0] == ':') || (wordBuffer[0] == '\\') || (wordBuffer[0] == '.'))) { // Reset Offset to re-process remainder of word offset -= (wbl - 1); // Colorize External Command / Program if (!keywords2) { styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND); } else if (keywords2.InList(wordBuffer)) { styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND); } else { styler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT); } // Reset External Command / Program Location cmdLoc = offset; } else { // Reset Offset to re-process remainder of word offset -= (wbl - 1); // Colorize Default Text styler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT); } // Check for Regular Keyword in list } else if ((keywords.InList(wordBuffer)) && (continueProcessing)) { // ECHO, GOTO, PROMPT and SET require no further Regular Keyword Checking if ((CompareCaseInsensitive(wordBuffer, "echo") == 0) || (CompareCaseInsensitive(wordBuffer, "goto") == 0) || (CompareCaseInsensitive(wordBuffer, "prompt") == 0) || (CompareCaseInsensitive(wordBuffer, "set") == 0)) { continueProcessing = false; } // Identify External Command / Program Location for ERRORLEVEL, and EXIST if ((CompareCaseInsensitive(wordBuffer, "errorlevel") == 0) || (CompareCaseInsensitive(wordBuffer, "exist") == 0)) { // Reset External Command / Program Location cmdLoc = offset; // Skip next spaces while ((cmdLoc < lengthLine) && (isspacechar(lineBuffer[cmdLoc]))) { cmdLoc++; } // Skip comparison while ((cmdLoc < lengthLine) && (!isspacechar(lineBuffer[cmdLoc]))) { cmdLoc++; } // Skip next spaces while ((cmdLoc < lengthLine) && (isspacechar(lineBuffer[cmdLoc]))) { cmdLoc++; } // Identify External Command / Program Location for CALL, DO, LOADHIGH and LH } else if ((CompareCaseInsensitive(wordBuffer, "call") == 0) || (CompareCaseInsensitive(wordBuffer, "do") == 0) || (CompareCaseInsensitive(wordBuffer, "loadhigh") == 0) || (CompareCaseInsensitive(wordBuffer, "lh") == 0)) { // Reset External Command / Program Location cmdLoc = offset; // Skip next spaces while ((cmdLoc < lengthLine) && (isspacechar(lineBuffer[cmdLoc]))) { cmdLoc++; } } // Colorize Regular keyword styler.ColourTo(startLine + offset - 1, SCE_BAT_WORD); // No need to Reset Offset // Check for Special Keyword in list, External Command / Program, or Default Text } else if ((wordBuffer[0] != '%') && (!IsBOperator(wordBuffer[0])) && (continueProcessing)) { // Check for Special Keyword // Affected Commands are in Length range 2-6 // Good that ERRORLEVEL, EXIST, CALL, DO, LOADHIGH, and LH are unaffected sKeywordFound = false; for (unsigned int keywordLength = 2; keywordLength < wbl && keywordLength < 7 && !sKeywordFound; keywordLength++) { wbo = 0; // Copy Keyword Length from Word Buffer into Special Keyword Buffer for (; wbo < keywordLength; wbo++) { sKeywordBuffer[wbo] = static_cast(wordBuffer[wbo]); } sKeywordBuffer[wbo] = '\0'; // Check for Special Keyword in list if ((keywords.InList(sKeywordBuffer)) && ((IsBOperator(wordBuffer[wbo])) || (IsBSeparator(wordBuffer[wbo])))) { sKeywordFound = true; // ECHO requires no further Regular Keyword Checking if (CompareCaseInsensitive(sKeywordBuffer, "echo") == 0) { continueProcessing = false; } // Colorize Special Keyword as Regular Keyword styler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_WORD); // Reset Offset to re-process remainder of word offset -= (wbl - wbo); } } // Check for External Command / Program or Default Text if (!sKeywordFound) { wbo = 0; // Check for External Command / Program if (cmdLoc == offset - wbl) { // Read up to %, Operator or Separator while ((wbo < wbl) && (wordBuffer[wbo] != '%') && (!IsBOperator(wordBuffer[wbo])) && (!IsBSeparator(wordBuffer[wbo]))) { wbo++; } // Reset External Command / Program Location cmdLoc = offset - (wbl - wbo); // Reset Offset to re-process remainder of word offset -= (wbl - wbo); // CHOICE requires no further Regular Keyword Checking if (CompareCaseInsensitive(wordBuffer, "choice") == 0) { continueProcessing = false; } // Check for START (and its switches) - What follows is External Command \ Program if (CompareCaseInsensitive(wordBuffer, "start") == 0) { // Reset External Command / Program Location cmdLoc = offset; // Skip next spaces while ((cmdLoc < lengthLine) && (isspacechar(lineBuffer[cmdLoc]))) { cmdLoc++; } // Reset External Command / Program Location if command switch detected if (lineBuffer[cmdLoc] == '/') { // Skip command switch while ((cmdLoc < lengthLine) && (!isspacechar(lineBuffer[cmdLoc]))) { cmdLoc++; } // Skip next spaces while ((cmdLoc < lengthLine) && (isspacechar(lineBuffer[cmdLoc]))) { cmdLoc++; } } } // Colorize External Command / Program if (!keywords2) { styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND); } else if (keywords2.InList(wordBuffer)) { styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND); } else { styler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT); } // No need to Reset Offset // Check for Default Text } else { // Read up to %, Operator or Separator while ((wbo < wbl) && (wordBuffer[wbo] != '%') && (!IsBOperator(wordBuffer[wbo])) && (!IsBSeparator(wordBuffer[wbo]))) { wbo++; } // Colorize Default Text styler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_DEFAULT); // Reset Offset to re-process remainder of word offset -= (wbl - wbo); } } // Check for Argument (%n), Environment Variable (%x...%) or Local Variable (%%a) } else if (wordBuffer[0] == '%') { // Colorize Default Text styler.ColourTo(startLine + offset - 1 - wbl, SCE_BAT_DEFAULT); wbo++; // Search to end of word for second % (can be a long path) while ((wbo < wbl) && (wordBuffer[wbo] != '%') && (!IsBOperator(wordBuffer[wbo])) && (!IsBSeparator(wordBuffer[wbo]))) { wbo++; } // Check for Argument (%n) or (%*) if (((Is0To9(wordBuffer[1])) || (wordBuffer[1] == '*')) && (wordBuffer[wbo] != '%')) { // Check for External Command / Program if (cmdLoc == offset - wbl) { cmdLoc = offset - (wbl - 2); } // Colorize Argument styler.ColourTo(startLine + offset - 1 - (wbl - 2), SCE_BAT_IDENTIFIER); // Reset Offset to re-process remainder of word offset -= (wbl - 2); // Check for Expanded Argument (%~...) / Variable (%%~...) } else if (((wbl > 1) && (wordBuffer[1] == '~')) || ((wbl > 2) && (wordBuffer[1] == '%') && (wordBuffer[2] == '~'))) { // Check for External Command / Program if (cmdLoc == offset - wbl) { cmdLoc = offset - (wbl - wbo); } // Colorize Expanded Argument / Variable styler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_IDENTIFIER); // Reset Offset to re-process remainder of word offset -= (wbl - wbo); // Check for Environment Variable (%x...%) } else if ((wordBuffer[1] != '%') && (wordBuffer[wbo] == '%')) { wbo++; // Check for External Command / Program if (cmdLoc == offset - wbl) { cmdLoc = offset - (wbl - wbo); } // Colorize Environment Variable styler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_IDENTIFIER); // Reset Offset to re-process remainder of word offset -= (wbl - wbo); // Check for Local Variable (%%a) } else if ( (wbl > 2) && (wordBuffer[1] == '%') && (wordBuffer[2] != '%') && (!IsBOperator(wordBuffer[2])) && (!IsBSeparator(wordBuffer[2]))) { // Check for External Command / Program if (cmdLoc == offset - wbl) { cmdLoc = offset - (wbl - 3); } // Colorize Local Variable styler.ColourTo(startLine + offset - 1 - (wbl - 3), SCE_BAT_IDENTIFIER); // Reset Offset to re-process remainder of word offset -= (wbl - 3); } // Check for Operator } else if (IsBOperator(wordBuffer[0])) { // Colorize Default Text styler.ColourTo(startLine + offset - 1 - wbl, SCE_BAT_DEFAULT); // Check for Comparison Operator if ((wordBuffer[0] == '=') && (wordBuffer[1] == '=')) { // Identify External Command / Program Location for IF cmdLoc = offset; // Skip next spaces while ((cmdLoc < lengthLine) && (isspacechar(lineBuffer[cmdLoc]))) { cmdLoc++; } // Colorize Comparison Operator styler.ColourTo(startLine + offset - 1 - (wbl - 2), SCE_BAT_OPERATOR); // Reset Offset to re-process remainder of word offset -= (wbl - 2); // Check for Pipe Operator } else if (wordBuffer[0] == '|') { // Reset External Command / Program Location cmdLoc = offset - wbl + 1; // Skip next spaces while ((cmdLoc < lengthLine) && (isspacechar(lineBuffer[cmdLoc]))) { cmdLoc++; } // Colorize Pipe Operator styler.ColourTo(startLine + offset - 1 - (wbl - 1), SCE_BAT_OPERATOR); // Reset Offset to re-process remainder of word offset -= (wbl - 1); // Check for Other Operator } else { // Check for > Operator if (wordBuffer[0] == '>') { // Turn Keyword and External Command / Program checking back on continueProcessing = true; } // Colorize Other Operator styler.ColourTo(startLine + offset - 1 - (wbl - 1), SCE_BAT_OPERATOR); // Reset Offset to re-process remainder of word offset -= (wbl - 1); } // Check for Default Text } else { // Read up to %, Operator or Separator while ((wbo < wbl) && (wordBuffer[wbo] != '%') && (!IsBOperator(wordBuffer[wbo])) && (!IsBSeparator(wordBuffer[wbo]))) { wbo++; } // Colorize Default Text styler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_DEFAULT); // Reset Offset to re-process remainder of word offset -= (wbl - wbo); } // Skip next spaces - nothing happens if Offset was Reset while ((offset < lengthLine) && (isspacechar(lineBuffer[offset]))) { offset++; } } // Colorize Default Text for remainder of line - currently not lexed styler.ColourTo(endPos, SCE_BAT_DEFAULT); } static void ColouriseBatchDoc( unsigned int startPos, int length, int /*initStyle*/, WordList *keywordlists[], Accessor &styler) { char lineBuffer[1024]; styler.StartAt(startPos); styler.StartSegment(startPos); unsigned int linePos = 0; unsigned int startLine = startPos; for (unsigned int i = startPos; i < startPos + length; i++) { lineBuffer[linePos++] = styler[i]; if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) { // End of line (or of line buffer) met, colourise it lineBuffer[linePos] = '\0'; ColouriseBatchLine(lineBuffer, linePos, startLine, i, keywordlists, styler); linePos = 0; startLine = i + 1; } } if (linePos > 0) { // Last line does not have ending characters lineBuffer[linePos] = '\0'; ColouriseBatchLine(lineBuffer, linePos, startLine, startPos + length - 1, keywordlists, styler); } } static void ColouriseDiffLine(char *lineBuffer, int endLine, Accessor &styler) { // It is needed to remember the current state to recognize starting // comment lines before the first "diff " or "--- ". If a real // difference starts then each line starting with ' ' is a whitespace // otherwise it is considered a comment (Only in..., Binary file...) if (0 == strncmp(lineBuffer, "diff ", 5)) { styler.ColourTo(endLine, SCE_DIFF_COMMAND); } else if (0 == strncmp(lineBuffer, "Index: ", 7)) { // For subversion's diff styler.ColourTo(endLine, SCE_DIFF_COMMAND); } else if (0 == strncmp(lineBuffer, "---", 3)) { // In a context diff, --- appears in both the header and the position markers if (lineBuffer[3] == ' ' && atoi(lineBuffer + 4) && !strchr(lineBuffer, '/')) styler.ColourTo(endLine, SCE_DIFF_POSITION); else if (lineBuffer[3] == '\r' || lineBuffer[3] == '\n') styler.ColourTo(endLine, SCE_DIFF_POSITION); else styler.ColourTo(endLine, SCE_DIFF_HEADER); } else if (0 == strncmp(lineBuffer, "+++ ", 4)) { // I don't know of any diff where "+++ " is a position marker, but for // consistency, do the same as with "--- " and "*** ". if (atoi(lineBuffer+4) && !strchr(lineBuffer, '/')) styler.ColourTo(endLine, SCE_DIFF_POSITION); else styler.ColourTo(endLine, SCE_DIFF_HEADER); } else if (0 == strncmp(lineBuffer, "====", 4)) { // For p4's diff styler.ColourTo(endLine, SCE_DIFF_HEADER); } else if (0 == strncmp(lineBuffer, "***", 3)) { // In a context diff, *** appears in both the header and the position markers. // Also ******** is a chunk header, but here it's treated as part of the // position marker since there is no separate style for a chunk header. if (lineBuffer[3] == ' ' && atoi(lineBuffer+4) && !strchr(lineBuffer, '/')) styler.ColourTo(endLine, SCE_DIFF_POSITION); else if (lineBuffer[3] == '*') styler.ColourTo(endLine, SCE_DIFF_POSITION); else styler.ColourTo(endLine, SCE_DIFF_HEADER); } else if (0 == strncmp(lineBuffer, "? ", 2)) { // For difflib styler.ColourTo(endLine, SCE_DIFF_HEADER); } else if (lineBuffer[0] == '@') { styler.ColourTo(endLine, SCE_DIFF_POSITION); } else if (lineBuffer[0] >= '0' && lineBuffer[0] <= '9') { styler.ColourTo(endLine, SCE_DIFF_POSITION); } else if (lineBuffer[0] == '-' || lineBuffer[0] == '<') { styler.ColourTo(endLine, SCE_DIFF_DELETED); } else if (lineBuffer[0] == '+' || lineBuffer[0] == '>') { styler.ColourTo(endLine, SCE_DIFF_ADDED); } else if (lineBuffer[0] == '!') { styler.ColourTo(endLine, SCE_DIFF_CHANGED); } else if (lineBuffer[0] != ' ') { styler.ColourTo(endLine, SCE_DIFF_COMMENT); } else { styler.ColourTo(endLine, SCE_DIFF_DEFAULT); } } static void ColouriseDiffDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { char lineBuffer[1024]; styler.StartAt(startPos); styler.StartSegment(startPos); unsigned int linePos = 0; for (unsigned int i = startPos; i < startPos + length; i++) { lineBuffer[linePos++] = styler[i]; if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) { // End of line (or of line buffer) met, colourise it lineBuffer[linePos] = '\0'; ColouriseDiffLine(lineBuffer, i, styler); linePos = 0; } } if (linePos > 0) { // Last line does not have ending characters ColouriseDiffLine(lineBuffer, startPos + length - 1, styler); } } static void FoldDiffDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { int curLine = styler.GetLine(startPos); int curLineStart = styler.LineStart(curLine); int prevLevel = curLine > 0 ? styler.LevelAt(curLine - 1) : SC_FOLDLEVELBASE; int nextLevel; do { int lineType = styler.StyleAt(curLineStart); if (lineType == SCE_DIFF_COMMAND) nextLevel = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG; else if (lineType == SCE_DIFF_HEADER) nextLevel = (SC_FOLDLEVELBASE + 1) | SC_FOLDLEVELHEADERFLAG; else if (lineType == SCE_DIFF_POSITION && styler[curLineStart] != '-') nextLevel = (SC_FOLDLEVELBASE + 2) | SC_FOLDLEVELHEADERFLAG; else if (prevLevel & SC_FOLDLEVELHEADERFLAG) nextLevel = (prevLevel & SC_FOLDLEVELNUMBERMASK) + 1; else nextLevel = prevLevel; if ((nextLevel & SC_FOLDLEVELHEADERFLAG) && (nextLevel == prevLevel)) styler.SetLevel(curLine-1, prevLevel & ~SC_FOLDLEVELHEADERFLAG); styler.SetLevel(curLine, nextLevel); prevLevel = nextLevel; curLineStart = styler.LineStart(++curLine); } while (static_cast(startPos) + length > curLineStart); } static void ColourisePoLine( char *lineBuffer, unsigned int lengthLine, unsigned int startLine, unsigned int endPos, Accessor &styler) { unsigned int i = 0; static unsigned int state = SCE_PO_DEFAULT; unsigned int state_start = SCE_PO_DEFAULT; while ((i < lengthLine) && isspacechar(lineBuffer[i])) // Skip initial spaces i++; if (i < lengthLine) { if (lineBuffer[i] == '#') { // check if the comment contains any flags ("#, ") and // then whether the flags contain "fuzzy" if (strstart(lineBuffer, "#, ") && strstr(lineBuffer, "fuzzy")) styler.ColourTo(endPos, SCE_PO_FUZZY); else styler.ColourTo(endPos, SCE_PO_COMMENT); } else { if (lineBuffer[0] == '"') { // line continuation, use previous style styler.ColourTo(endPos, state); return; // this implicitly also matches "msgid_plural" } else if (strstart(lineBuffer, "msgid")) { state_start = SCE_PO_MSGID; state = SCE_PO_MSGID_TEXT; } else if (strstart(lineBuffer, "msgstr")) { state_start = SCE_PO_MSGSTR; state = SCE_PO_MSGSTR_TEXT; } else if (strstart(lineBuffer, "msgctxt")) { state_start = SCE_PO_MSGCTXT; state = SCE_PO_MSGCTXT_TEXT; } if (state_start != SCE_PO_DEFAULT) { // find the next space while ((i < lengthLine) && ! isspacechar(lineBuffer[i])) i++; styler.ColourTo(startLine + i - 1, state_start); styler.ColourTo(startLine + i, SCE_PO_DEFAULT); styler.ColourTo(endPos, state); } } } else { styler.ColourTo(endPos, SCE_PO_DEFAULT); } } static void ColourisePoDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { char lineBuffer[1024]; styler.StartAt(startPos); styler.StartSegment(startPos); unsigned int linePos = 0; unsigned int startLine = startPos; for (unsigned int i = startPos; i < startPos + length; i++) { lineBuffer[linePos++] = styler[i]; if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) { // End of line (or of line buffer) met, colourise it lineBuffer[linePos] = '\0'; ColourisePoLine(lineBuffer, linePos, startLine, i, styler); linePos = 0; startLine = i + 1; } } if (linePos > 0) { // Last line does not have ending characters ColourisePoLine(lineBuffer, linePos, startLine, startPos + length - 1, styler); } } static inline bool isassignchar(unsigned char ch) { return (ch == '=') || (ch == ':'); } static void ColourisePropsLine( char *lineBuffer, unsigned int lengthLine, unsigned int startLine, unsigned int endPos, Accessor &styler, bool allowInitialSpaces) { unsigned int i = 0; if (allowInitialSpaces) { while ((i < lengthLine) && isspacechar(lineBuffer[i])) // Skip initial spaces i++; } else { if (isspacechar(lineBuffer[i])) // don't allow initial spaces i = lengthLine; } if (i < lengthLine) { if (lineBuffer[i] == '#' || lineBuffer[i] == '!' || lineBuffer[i] == ';') { styler.ColourTo(endPos, SCE_PROPS_COMMENT); } else if (lineBuffer[i] == '[') { styler.ColourTo(endPos, SCE_PROPS_SECTION); } else if (lineBuffer[i] == '@') { styler.ColourTo(startLine + i, SCE_PROPS_DEFVAL); if (isassignchar(lineBuffer[i++])) styler.ColourTo(startLine + i, SCE_PROPS_ASSIGNMENT); styler.ColourTo(endPos, SCE_PROPS_DEFAULT); } else { // Search for the '=' character while ((i < lengthLine) && !isassignchar(lineBuffer[i])) i++; if ((i < lengthLine) && isassignchar(lineBuffer[i])) { styler.ColourTo(startLine + i - 1, SCE_PROPS_KEY); styler.ColourTo(startLine + i, SCE_PROPS_ASSIGNMENT); styler.ColourTo(endPos, SCE_PROPS_DEFAULT); } else { styler.ColourTo(endPos, SCE_PROPS_DEFAULT); } } } else { styler.ColourTo(endPos, SCE_PROPS_DEFAULT); } } static void ColourisePropsDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { char lineBuffer[1024]; styler.StartAt(startPos); styler.StartSegment(startPos); unsigned int linePos = 0; unsigned int startLine = startPos; // property lexer.props.allow.initial.spaces // For properties files, set to 0 to style all lines that start with whitespace in the default style. // This is not suitable for SciTE .properties files which use indentation for flow control but // can be used for RFC2822 text where indentation is used for continuation lines. bool allowInitialSpaces = styler.GetPropertyInt("lexer.props.allow.initial.spaces", 1) != 0; for (unsigned int i = startPos; i < startPos + length; i++) { lineBuffer[linePos++] = styler[i]; if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) { // End of line (or of line buffer) met, colourise it lineBuffer[linePos] = '\0'; ColourisePropsLine(lineBuffer, linePos, startLine, i, styler, allowInitialSpaces); linePos = 0; startLine = i + 1; } } if (linePos > 0) { // Last line does not have ending characters ColourisePropsLine(lineBuffer, linePos, startLine, startPos + length - 1, styler, allowInitialSpaces); } } // adaption by ksc, using the "} else {" trick of 1.53 // 030721 static void FoldPropsDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; unsigned int endPos = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); char chNext = styler[startPos]; int styleNext = styler.StyleAt(startPos); bool headerPoint = false; int lev; for (unsigned int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler[i+1]; int style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if (style == SCE_PROPS_SECTION) { headerPoint = true; } if (atEOL) { lev = SC_FOLDLEVELBASE; if (lineCurrent > 0) { int levelPrevious = styler.LevelAt(lineCurrent - 1); if (levelPrevious & SC_FOLDLEVELHEADERFLAG) { lev = SC_FOLDLEVELBASE + 1; } else { lev = levelPrevious & SC_FOLDLEVELNUMBERMASK; } } if (headerPoint) { lev = SC_FOLDLEVELBASE; } if (visibleChars == 0 && foldCompact) lev |= SC_FOLDLEVELWHITEFLAG; if (headerPoint) { lev |= SC_FOLDLEVELHEADERFLAG; } if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } lineCurrent++; visibleChars = 0; headerPoint = false; } if (!isspacechar(ch)) visibleChars++; } if (lineCurrent > 0) { int levelPrevious = styler.LevelAt(lineCurrent - 1); if (levelPrevious & SC_FOLDLEVELHEADERFLAG) { lev = SC_FOLDLEVELBASE + 1; } else { lev = levelPrevious & SC_FOLDLEVELNUMBERMASK; } } else { lev = SC_FOLDLEVELBASE; } int flagsNext = styler.LevelAt(lineCurrent); styler.SetLevel(lineCurrent, lev | (flagsNext & ~SC_FOLDLEVELNUMBERMASK)); } static void ColouriseMakeLine( char *lineBuffer, unsigned int lengthLine, unsigned int startLine, unsigned int endPos, Accessor &styler) { unsigned int i = 0; int lastNonSpace = -1; unsigned int state = SCE_MAKE_DEFAULT; bool bSpecial = false; // check for a tab character in column 0 indicating a command bool bCommand = false; if ((lengthLine > 0) && (lineBuffer[0] == '\t')) bCommand = true; // Skip initial spaces while ((i < lengthLine) && isspacechar(lineBuffer[i])) { i++; } if (lineBuffer[i] == '#') { // Comment styler.ColourTo(endPos, SCE_MAKE_COMMENT); return; } if (lineBuffer[i] == '!') { // Special directive styler.ColourTo(endPos, SCE_MAKE_PREPROCESSOR); return; } while (i < lengthLine) { if (lineBuffer[i] == '$' && lineBuffer[i + 1] == '(') { styler.ColourTo(startLine + i - 1, state); state = SCE_MAKE_IDENTIFIER; } else if (state == SCE_MAKE_IDENTIFIER && lineBuffer[i] == ')') { styler.ColourTo(startLine + i, state); state = SCE_MAKE_DEFAULT; } // skip identifier and target styling if this is a command line if (!bSpecial && !bCommand) { if (lineBuffer[i] == ':') { if (((i + 1) < lengthLine) && (lineBuffer[i + 1] == '=')) { // it's a ':=', so style as an identifier if (lastNonSpace >= 0) styler.ColourTo(startLine + lastNonSpace, SCE_MAKE_IDENTIFIER); styler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT); styler.ColourTo(startLine + i + 1, SCE_MAKE_OPERATOR); } else { // We should check that no colouring was made since the beginning of the line, // to avoid colouring stuff like /OUT:file if (lastNonSpace >= 0) styler.ColourTo(startLine + lastNonSpace, SCE_MAKE_TARGET); styler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT); styler.ColourTo(startLine + i, SCE_MAKE_OPERATOR); } bSpecial = true; // Only react to the first ':' of the line state = SCE_MAKE_DEFAULT; } else if (lineBuffer[i] == '=') { if (lastNonSpace >= 0) styler.ColourTo(startLine + lastNonSpace, SCE_MAKE_IDENTIFIER); styler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT); styler.ColourTo(startLine + i, SCE_MAKE_OPERATOR); bSpecial = true; // Only react to the first '=' of the line state = SCE_MAKE_DEFAULT; } } if (!isspacechar(lineBuffer[i])) { lastNonSpace = i; } i++; } if (state == SCE_MAKE_IDENTIFIER) { styler.ColourTo(endPos, SCE_MAKE_IDEOL); // Error, variable reference not ended } else { styler.ColourTo(endPos, SCE_MAKE_DEFAULT); } } static void ColouriseMakeDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { char lineBuffer[1024]; styler.StartAt(startPos); styler.StartSegment(startPos); unsigned int linePos = 0; unsigned int startLine = startPos; for (unsigned int i = startPos; i < startPos + length; i++) { lineBuffer[linePos++] = styler[i]; if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) { // End of line (or of line buffer) met, colourise it lineBuffer[linePos] = '\0'; ColouriseMakeLine(lineBuffer, linePos, startLine, i, styler); linePos = 0; startLine = i + 1; } } if (linePos > 0) { // Last line does not have ending characters ColouriseMakeLine(lineBuffer, linePos, startLine, startPos + length - 1, styler); } } static int RecogniseErrorListLine(const char *lineBuffer, unsigned int lengthLine, int &startValue) { if (lineBuffer[0] == '>') { // Command or return status return SCE_ERR_CMD; } else if (lineBuffer[0] == '<') { // Diff removal, but not interested. Trapped to avoid hitting CTAG cases. return SCE_ERR_DEFAULT; } else if (lineBuffer[0] == '!') { return SCE_ERR_DIFF_CHANGED; } else if (lineBuffer[0] == '+') { if (strstart(lineBuffer, "+++ ")) { return SCE_ERR_DIFF_MESSAGE; } else { return SCE_ERR_DIFF_ADDITION; } } else if (lineBuffer[0] == '-') { if (strstart(lineBuffer, "--- ")) { return SCE_ERR_DIFF_MESSAGE; } else { return SCE_ERR_DIFF_DELETION; } } else if (strstart(lineBuffer, "cf90-")) { // Absoft Pro Fortran 90/95 v8.2 error and/or warning message return SCE_ERR_ABSF; } else if (strstart(lineBuffer, "fortcom:")) { // Intel Fortran Compiler v8.0 error/warning message return SCE_ERR_IFORT; } else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) { return SCE_ERR_PYTHON; } else if (strstr(lineBuffer, " in ") && strstr(lineBuffer, " on line ")) { return SCE_ERR_PHP; } else if ((strstart(lineBuffer, "Error ") || strstart(lineBuffer, "Warning ")) && strstr(lineBuffer, " at (") && strstr(lineBuffer, ") : ") && (strstr(lineBuffer, " at (") < strstr(lineBuffer, ") : "))) { // Intel Fortran Compiler error/warning message return SCE_ERR_IFC; } else if (strstart(lineBuffer, "Error ")) { // Borland error message return SCE_ERR_BORLAND; } else if (strstart(lineBuffer, "Warning ")) { // Borland warning message return SCE_ERR_BORLAND; } else if (strstr(lineBuffer, "at line " ) && (strstr(lineBuffer, "at line " ) < (lineBuffer + lengthLine)) && strstr(lineBuffer, "file ") && (strstr(lineBuffer, "file ") < (lineBuffer + lengthLine))) { // Lua 4 error message return SCE_ERR_LUA; } else if (strstr(lineBuffer, " at " ) && (strstr(lineBuffer, " at " ) < (lineBuffer + lengthLine)) && strstr(lineBuffer, " line ") && (strstr(lineBuffer, " line ") < (lineBuffer + lengthLine)) && (strstr(lineBuffer, " at " ) < (strstr(lineBuffer, " line ")))) { // perl error message return SCE_ERR_PERL; } else if ((memcmp(lineBuffer, " at ", 6) == 0) && strstr(lineBuffer, ":line ")) { // A .NET traceback return SCE_ERR_NET; } else if (strstart(lineBuffer, "Line ") && strstr(lineBuffer, ", file ")) { // Essential Lahey Fortran error message return SCE_ERR_ELF; } else if (strstart(lineBuffer, "line ") && strstr(lineBuffer, " column ")) { // HTML tidy style: line 42 column 1 return SCE_ERR_TIDY; } else if (strstart(lineBuffer, "\tat ") && strstr(lineBuffer, "(") && strstr(lineBuffer, ".java:")) { // Java stack back trace return SCE_ERR_JAVA_STACK; } else { // Look for one of the following formats: // GCC: :: // Microsoft: () : // Common: (): warning|error|note|remark|catastrophic|fatal // Common: () warning|error|note|remark|catastrophic|fatal // Microsoft: (,) // CTags: \t // Lua 5 traceback: \t:: // Lua 5.1: : :: bool initialTab = (lineBuffer[0] == '\t'); bool initialColonPart = false; enum { stInitial, stGccStart, stGccDigit, stGcc, stMsStart, stMsDigit, stMsBracket, stMsVc, stMsDigitComma, stMsDotNet, stCtagsStart, stCtagsStartString, stCtagsStringDollar, stCtags, stUnrecognized } state = stInitial; for (unsigned int i = 0; i < lengthLine; i++) { char ch = lineBuffer[i]; char chNext = ' '; if ((i + 1) < lengthLine) chNext = lineBuffer[i + 1]; if (state == stInitial) { if (ch == ':') { // May be GCC, or might be Lua 5 (Lua traceback same but with tab prefix) if ((chNext != '\\') && (chNext != '/') && (chNext != ' ')) { // This check is not completely accurate as may be on // GTK+ with a file name that includes ':'. state = stGccStart; } else if (chNext == ' ') { // indicates a Lua 5.1 error message initialColonPart = true; } } else if ((ch == '(') && Is1To9(chNext) && (!initialTab)) { // May be Microsoft // Check against '0' often removes phone numbers state = stMsStart; } else if ((ch == '\t') && (!initialTab)) { // May be CTags state = stCtagsStart; } } else if (state == stGccStart) { // : state = Is1To9(ch) ? stGccDigit : stUnrecognized; } else if (state == stGccDigit) { // : if (ch == ':') { state = stGcc; // :9.*: is GCC startValue = i + 1; break; } else if (!Is0To9(ch)) { state = stUnrecognized; } } else if (state == stMsStart) { // ( state = Is0To9(ch) ? stMsDigit : stUnrecognized; } else if (state == stMsDigit) { // ( if (ch == ',') { state = stMsDigitComma; } else if (ch == ')') { state = stMsBracket; } else if ((ch != ' ') && !Is0To9(ch)) { state = stUnrecognized; } } else if (state == stMsBracket) { // () if ((ch == ' ') && (chNext == ':')) { state = stMsVc; } else if ((ch == ':' && chNext == ' ') || (ch == ' ')) { // Possibly Delphi.. don't test against chNext as it's one of the strings below. char word[512]; unsigned int j, chPos; unsigned numstep; chPos = 0; if (ch == ' ') numstep = 1; // ch was ' ', handle as if it's a delphi errorline, only add 1 to i. else numstep = 2; // otherwise add 2. for (j = i + numstep; j < lengthLine && isalpha(lineBuffer[j]) && chPos < sizeof(word) - 1; j++) word[chPos++] = lineBuffer[j]; word[chPos] = 0; if (!CompareCaseInsensitive(word, "error") || !CompareCaseInsensitive(word, "warning") || !CompareCaseInsensitive(word, "fatal") || !CompareCaseInsensitive(word, "catastrophic") || !CompareCaseInsensitive(word, "note") || !CompareCaseInsensitive(word, "remark")) { state = stMsVc; } else state = stUnrecognized; } else { state = stUnrecognized; } } else if (state == stMsDigitComma) { // (, if (ch == ')') { state = stMsDotNet; break; } else if ((ch != ' ') && !Is0To9(ch)) { state = stUnrecognized; } } else if (state == stCtagsStart) { if ((lineBuffer[i - 1] == '\t') && ((ch == '/' && lineBuffer[i + 1] == '^') || Is0To9(ch))) { state = stCtags; break; } else if ((ch == '/') && (lineBuffer[i + 1] == '^')) { state = stCtagsStartString; } } else if ((state == stCtagsStartString) && ((lineBuffer[i] == '$') && (lineBuffer[i + 1] == '/'))) { state = stCtagsStringDollar; break; } } if (state == stGcc) { return initialColonPart ? SCE_ERR_LUA : SCE_ERR_GCC; } else if ((state == stMsVc) || (state == stMsDotNet)) { return SCE_ERR_MS; } else if ((state == stCtagsStringDollar) || (state == stCtags)) { return SCE_ERR_CTAG; } else { return SCE_ERR_DEFAULT; } } } static void ColouriseErrorListLine( char *lineBuffer, unsigned int lengthLine, unsigned int endPos, Accessor &styler, bool valueSeparate) { int startValue = -1; int style = RecogniseErrorListLine(lineBuffer, lengthLine, startValue); if (valueSeparate && (startValue >= 0)) { styler.ColourTo(endPos - (lengthLine - startValue), style); styler.ColourTo(endPos, SCE_ERR_VALUE); } else { styler.ColourTo(endPos, style); } } static void ColouriseErrorListDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { char lineBuffer[10000]; styler.StartAt(startPos); styler.StartSegment(startPos); unsigned int linePos = 0; // property lexer.errorlist.value.separate // For lines in the output pane that are matches from Find in Files or GCC-style // diagnostics, style the path and line number separately from the rest of the // line with style 21 used for the rest of the line. // This allows matched text to be more easily distinguished from its location. bool valueSeparate = styler.GetPropertyInt("lexer.errorlist.value.separate", 0) != 0; for (unsigned int i = startPos; i < startPos + length; i++) { lineBuffer[linePos++] = styler[i]; if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) { // End of line (or of line buffer) met, colourise it lineBuffer[linePos] = '\0'; ColouriseErrorListLine(lineBuffer, linePos, i, styler, valueSeparate); linePos = 0; } } if (linePos > 0) { // Last line does not have ending characters ColouriseErrorListLine(lineBuffer, linePos, startPos + length - 1, styler, valueSeparate); } } static int isSpecial(char s) { return (s == '\\') || (s == ',') || (s == ';') || (s == '\'') || (s == ' ') || (s == '\"') || (s == '`') || (s == '^') || (s == '~'); } static int isTag(int start, Accessor &styler) { char s[6]; unsigned int i = 0, e = 1; while (i < 5 && e) { s[i] = styler[start + i]; i++; e = styler[start + i] != '{'; } s[i] = '\0'; return (strcmp(s, "begin") == 0) || (strcmp(s, "end") == 0); } static void ColouriseLatexDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) { styler.StartAt(startPos); int state = initStyle; char chNext = styler[startPos]; styler.StartSegment(startPos); int lengthDoc = startPos + length; for (int i = startPos; i < lengthDoc; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); if (styler.IsLeadByte(ch)) { chNext = styler.SafeGetCharAt(i + 2); i++; continue; } switch (state) { case SCE_L_DEFAULT : switch (ch) { case '\\' : styler.ColourTo(i - 1, state); if (isSpecial(styler[i + 1])) { styler.ColourTo(i + 1, SCE_L_COMMAND); i++; chNext = styler.SafeGetCharAt(i + 1); } else { if (isTag(i + 1, styler)) state = SCE_L_TAG; else state = SCE_L_COMMAND; } break; case '$' : styler.ColourTo(i - 1, state); state = SCE_L_MATH; if (chNext == '$') { i++; chNext = styler.SafeGetCharAt(i + 1); } break; case '%' : styler.ColourTo(i - 1, state); state = SCE_L_COMMENT; break; } break; case SCE_L_COMMAND : if (chNext == '[' || chNext == '{' || chNext == '}' || chNext == ' ' || chNext == '\r' || chNext == '\n') { styler.ColourTo(i, state); state = SCE_L_DEFAULT; i++; chNext = styler.SafeGetCharAt(i + 1); } break; case SCE_L_TAG : if (ch == '}') { styler.ColourTo(i, state); state = SCE_L_DEFAULT; } break; case SCE_L_MATH : if (ch == '$') { if (chNext == '$') { i++; chNext = styler.SafeGetCharAt(i + 1); } styler.ColourTo(i, state); state = SCE_L_DEFAULT; } break; case SCE_L_COMMENT : if (ch == '\r' || ch == '\n') { styler.ColourTo(i - 1, state); state = SCE_L_DEFAULT; } } } styler.ColourTo(lengthDoc-1, state); } static const char * const batchWordListDesc[] = { "Internal Commands", "External Commands", 0 }; static const char * const emptyWordListDesc[] = { 0 }; static void ColouriseNullDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { // Null language means all style bytes are 0 so just mark the end - no need to fill in. if (length > 0) { styler.StartAt(startPos + length - 1); styler.StartSegment(startPos + length - 1); styler.ColourTo(startPos + length - 1, 0); } } LexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc, "batch", 0, batchWordListDesc); LexerModule lmDiff(SCLEX_DIFF, ColouriseDiffDoc, "diff", FoldDiffDoc, emptyWordListDesc); LexerModule lmPo(SCLEX_PO, ColourisePoDoc, "po", 0, emptyWordListDesc); LexerModule lmProps(SCLEX_PROPERTIES, ColourisePropsDoc, "props", FoldPropsDoc, emptyWordListDesc); LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc, "makefile", 0, emptyWordListDesc); LexerModule lmErrorList(SCLEX_ERRORLIST, ColouriseErrorListDoc, "errorlist", 0, emptyWordListDesc); LexerModule lmLatex(SCLEX_LATEX, ColouriseLatexDoc, "latex", 0, emptyWordListDesc); LexerModule lmNull(SCLEX_NULL, ColouriseNullDoc, "null"); tora-2.1.3/src/qscintilla2/src/LexMagik.cpp0000644000175000017500000003227711213435521020270 0ustar michaelmichael// Scintilla source code edit control /** * @file LexMagik.cxx * Lexer for GE(r) Smallworld(tm) MagikSF */ // Copyright 1998-2005 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif /** * Is it a core character (C isalpha(), exclamation and question mark) * * \param ch The character * \return True if ch is a character, False otherwise */ static inline bool IsAlphaCore(int ch) { return (isalpha(ch) || ch == '!' || ch == '?'); } /** * Is it a character (IsAlphaCore() and underscore) * * \param ch The character * \return True if ch is a character, False otherwise */ static inline bool IsAlpha(int ch) { return (IsAlphaCore(ch) || ch == '_'); } /** * Is it a symbolic character (IsAlpha() and colon) * * \param ch The character * \return True if ch is a character, False otherwise */ static inline bool IsAlphaSym(int ch) { return (IsAlpha(ch) || ch == ':'); } /** * Is it a numerical character (IsAlpha() and 0 - 9) * * \param ch The character * \return True if ch is a character, False otherwise */ static inline bool IsAlNum(int ch) { return ((ch > '0' && ch < '9') || IsAlpha(ch)); } /** * Is it a symbolic numerical character (IsAlNum() and colon) * * \param ch The character * \return True if ch is a character, False otherwise */ static inline bool IsAlNumSym(int ch) { return (IsAlNum(ch) || ch == ':'); } /** * The lexer function * * \param startPos Where to start scanning * \param length Where to scan to * \param initStyle The style at the initial point, not used in this folder * \param keywordslists The keywordslists, currently, number 5 is used * \param styler The styler */ static void ColouriseMagikDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { styler.StartAt(startPos); WordList &keywords = *keywordlists[0]; WordList &pragmatics = *keywordlists[1]; WordList &containers = *keywordlists[2]; WordList &flow = *keywordlists[3]; WordList &characters = *keywordlists[4]; StyleContext sc(startPos, length, initStyle, styler); for (; sc.More(); sc.Forward()) { repeat: if(sc.ch == '#') { if (sc.chNext == '#') sc.SetState(SCE_MAGIK_HYPER_COMMENT); else sc.SetState(SCE_MAGIK_COMMENT); for(; sc.More() && !(sc.atLineEnd); sc.Forward()); sc.SetState(SCE_MAGIK_DEFAULT); goto repeat; } if(sc.ch == '"') { sc.SetState(SCE_MAGIK_STRING); if(sc.More()) { sc.Forward(); for(; sc.More() && sc.ch != '"'; sc.Forward()); } sc.ForwardSetState(SCE_MAGIK_DEFAULT); goto repeat; } // The default state if(sc.state == SCE_MAGIK_DEFAULT) { // A certain keyword has been detected if (sc.ch == '_' && ( sc.currentPos == 0 || !IsAlNum(sc.chPrev))) { char keyword[50]; memset(keyword, '\0', 50); for( int scanPosition = 0; scanPosition < 50; scanPosition++) { char keywordChar = static_cast( tolower(styler.SafeGetCharAt( scanPosition + static_cast(sc.currentPos+1), ' '))); if(IsAlpha(keywordChar)) { keyword[scanPosition] = keywordChar; } else { break; } } // It is a pragma if(pragmatics.InList(keyword)) { sc.SetState(SCE_MAGIK_PRAGMA); } // it is a normal keyword like _local, _self, etc. else if(keywords.InList(keyword)) { sc.SetState(SCE_MAGIK_KEYWORD); } // It is a container keyword, such as _method, _proc, etc. else if(containers.InList(keyword)) { sc.SetState(SCE_MAGIK_CONTAINER); } // It is a flow keyword, such as _for, _if, _try, etc. else if(flow.InList(keyword)) { sc.SetState(SCE_MAGIK_FLOW); } // Interpret as unknown keyword else { sc.SetState(SCE_MAGIK_UNKNOWN_KEYWORD); } } // Symbolic expression else if(sc.ch == ':' && !IsAlNum(sc.chPrev)) { sc.SetState(SCE_MAGIK_SYMBOL); bool firstTrip = true; for(sc.Forward(); sc.More(); sc.Forward()) { if(firstTrip && IsAlphaSym(sc.ch)); else if(!firstTrip && IsAlNumSym(sc.ch)); else if(sc.ch == '|') { for(sc.Forward(); sc.More() && sc.ch != '|'; sc.Forward()); } else break; firstTrip = false; } sc.SetState(SCE_MAGIK_DEFAULT); goto repeat; } // Identifier (label) expression else if(sc.ch == '@') { sc.SetState(SCE_MAGIK_IDENTIFIER); bool firstTrip = true; for(sc.Forward(); sc.More(); sc.Forward()) { if(firstTrip && IsAlphaCore(sc.ch)) { firstTrip = false; } else if(!firstTrip && IsAlpha(sc.ch)); else break; } sc.SetState(SCE_MAGIK_DEFAULT); goto repeat; } // Start of a character else if(sc.ch == '%') { sc.SetState(SCE_MAGIK_CHARACTER); sc.Forward(); char keyword[50]; memset(keyword, '\0', 50); for( int scanPosition = 0; scanPosition < 50; scanPosition++) { char keywordChar = static_cast( tolower(styler.SafeGetCharAt( scanPosition + static_cast(sc.currentPos), ' '))); if(IsAlpha(keywordChar)) { keyword[scanPosition] = keywordChar; } else { break; } } if(characters.InList(keyword)) { sc.Forward(strlen(keyword)); } else { sc.Forward(); } sc.SetState(SCE_MAGIK_DEFAULT); goto repeat; } // Operators else if( sc.ch == '>' || sc.ch == '<' || sc.ch == '.' || sc.ch == ',' || sc.ch == '+' || sc.ch == '-' || sc.ch == '/' || sc.ch == '*' || sc.ch == '~' || sc.ch == '$' || sc.ch == '=') { sc.SetState(SCE_MAGIK_OPERATOR); } // Braces else if(sc.ch == '(' || sc.ch == ')') { sc.SetState(SCE_MAGIK_BRACE_BLOCK); } // Brackets else if(sc.ch == '{' || sc.ch == '}') { sc.SetState(SCE_MAGIK_BRACKET_BLOCK); } // Square Brackets else if(sc.ch == '[' || sc.ch == ']') { sc.SetState(SCE_MAGIK_SQBRACKET_BLOCK); } } // It is an operator else if( sc.state == SCE_MAGIK_OPERATOR || sc.state == SCE_MAGIK_BRACE_BLOCK || sc.state == SCE_MAGIK_BRACKET_BLOCK || sc.state == SCE_MAGIK_SQBRACKET_BLOCK) { sc.SetState(SCE_MAGIK_DEFAULT); goto repeat; } // It is the pragma state else if(sc.state == SCE_MAGIK_PRAGMA) { if(!IsAlpha(sc.ch)) { sc.SetState(SCE_MAGIK_DEFAULT); goto repeat; } } // It is the keyword state else if( sc.state == SCE_MAGIK_KEYWORD || sc.state == SCE_MAGIK_CONTAINER || sc.state == SCE_MAGIK_FLOW || sc.state == SCE_MAGIK_UNKNOWN_KEYWORD) { if(!IsAlpha(sc.ch)) { sc.SetState(SCE_MAGIK_DEFAULT); goto repeat; } } } sc.Complete(); } /** * The word list description */ static const char * const magikWordListDesc[] = { "Accessors (local, global, self, super, thisthread)", "Pragmatic (pragma, private)", "Containers (method, block, proc)", "Flow (if, then, elif, else)", "Characters (space, tab, newline, return)", "Fold Containers (method, proc, block, if, loop)", 0}; /** * This function detects keywords which are able to have a body. Note that it * uses the Fold Containers word description, not the containers description. It * only works when the style at that particular position is set on Containers * or Flow (number 3 or 4). * * \param keywordslist The list of keywords that are scanned, they should only * contain the start keywords, not the end keywords * \param The actual keyword * \return 1 if it is a folding start-keyword, -1 if it is a folding end-keyword * 0 otherwise */ static inline int IsFoldingContainer(WordList &keywordslist, char * keyword) { if( strlen(keyword) > 3 && keyword[0] == 'e' && keyword[1] == 'n' && keyword[2] == 'd') { if (keywordslist.InList(keyword + 3)) { return -1; } } else { if(keywordslist.InList(keyword)) { return 1; } } return 0; } /** * The folding function * * \param startPos Where to start scanning * \param length Where to scan to * \param keywordslists The keywordslists, currently, number 5 is used * \param styler The styler */ static void FoldMagikDoc(unsigned int startPos, int length, int, WordList *keywordslists[], Accessor &styler) { bool compact = styler.GetPropertyInt("fold.compact") != 0; WordList &foldingElements = *keywordslists[5]; int endPos = startPos + length; int line = styler.GetLine(startPos); int level = styler.LevelAt(line) & SC_FOLDLEVELNUMBERMASK; int flags = styler.LevelAt(line) & ~SC_FOLDLEVELNUMBERMASK; for( int currentPos = startPos; currentPos < endPos; currentPos++) { char currentState = styler.StyleAt(currentPos); char c = styler.SafeGetCharAt(currentPos, ' '); int prevLine = styler.GetLine(currentPos - 1); line = styler.GetLine(currentPos); // Default situation if(prevLine < line) { styler.SetLevel(line, (level|flags) & ~SC_FOLDLEVELHEADERFLAG); flags = styler.LevelAt(line) & ~SC_FOLDLEVELNUMBERMASK; } if( ( currentState == SCE_MAGIK_CONTAINER || currentState == SCE_MAGIK_FLOW ) && c == '_') { char keyword[50]; memset(keyword, '\0', 50); for( int scanPosition = 0; scanPosition < 50; scanPosition++) { char keywordChar = static_cast( tolower(styler.SafeGetCharAt( scanPosition + currentPos + 1, ' '))); if(IsAlpha(keywordChar)) { keyword[scanPosition] = keywordChar; } else { break; } } if(IsFoldingContainer(foldingElements, keyword) > 0) { styler.SetLevel( line, styler.LevelAt(line) | SC_FOLDLEVELHEADERFLAG); level++; } else if(IsFoldingContainer(foldingElements, keyword) < 0) { styler.SetLevel(line, styler.LevelAt(line)); level--; } } if( compact && ( currentState == SCE_MAGIK_BRACE_BLOCK || currentState == SCE_MAGIK_BRACKET_BLOCK || currentState == SCE_MAGIK_SQBRACKET_BLOCK)) { if(c == '{' || c == '[' || c == '(') { styler.SetLevel( line, styler.LevelAt(line) | SC_FOLDLEVELHEADERFLAG); level++; } else if(c == '}' || c == ']' || c == ')') { styler.SetLevel(line, styler.LevelAt(line)); level--; } } } } /** * Injecting the module */ LexerModule lmMagikSF( SCLEX_MAGIK, ColouriseMagikDoc, "magiksf", FoldMagikDoc, magikWordListDesc); tora-2.1.3/src/qscintilla2/src/UniConversion.h0000644000175000017500000000111111213435521021014 0ustar michaelmichael// Scintilla source code edit control /** @file UniConversion.h ** Functions to handle UFT-8 and UCS-2 strings. **/ // Copyright 1998-2001 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. unsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen); void UTF8FromUTF16(const wchar_t *uptr, unsigned int tlen, char *putf, unsigned int len); unsigned int UTF16Length(const char *s, unsigned int len); unsigned int UTF16FromUTF8(const char *s, unsigned int len, wchar_t *tbuf, unsigned int tlen); tora-2.1.3/src/qscintilla2/src/LexBaan.cpp0000644000175000017500000001333111213435521020067 0ustar michaelmichael// Scintilla source code edit control /** @file LexBaan.cxx ** Lexer for Baan. ** Based heavily on LexCPP.cxx **/ // Copyright 2001- by Vamsi Potluru & Praveen Ambekar // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsAWordChar(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '$' || ch == ':'); } static inline bool IsAWordStart(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_'); } static void ColouriseBaanDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor") != 0; if (initStyle == SCE_BAAN_STRINGEOL) // Does not leak onto next line initStyle = SCE_BAAN_DEFAULT; int visibleChars = 0; StyleContext sc(startPos, length, initStyle, styler); for (; sc.More(); sc.Forward()) { if (sc.state == SCE_BAAN_OPERATOR) { sc.SetState(SCE_BAAN_DEFAULT); } else if (sc.state == SCE_BAAN_NUMBER) { if (!IsAWordChar(sc.ch)) { sc.SetState(SCE_BAAN_DEFAULT); } } else if (sc.state == SCE_BAAN_IDENTIFIER) { if (!IsAWordChar(sc.ch)) { char s[100]; sc.GetCurrentLowered(s, sizeof(s)); if (keywords.InList(s)) { sc.ChangeState(SCE_BAAN_WORD); } else if (keywords2.InList(s)) { sc.ChangeState(SCE_BAAN_WORD2); } sc.SetState(SCE_BAAN_DEFAULT); } } else if (sc.state == SCE_BAAN_PREPROCESSOR) { if (stylingWithinPreprocessor) { if (IsASpace(sc.ch)) { sc.SetState(SCE_BAAN_DEFAULT); } } else { if (sc.atLineEnd && (sc.chNext != '^')) { sc.SetState(SCE_BAAN_DEFAULT); } } } else if (sc.state == SCE_BAAN_COMMENT) { if (sc.atLineEnd) { sc.SetState(SCE_BAAN_DEFAULT); } } else if (sc.state == SCE_BAAN_COMMENTDOC) { if (sc.MatchIgnoreCase("enddllusage")) { for (unsigned int i = 0; i < 10; i++){ sc.Forward(); } sc.ForwardSetState(SCE_BAAN_DEFAULT); } } else if (sc.state == SCE_BAAN_STRING) { if (sc.ch == '\"') { sc.ForwardSetState(SCE_BAAN_DEFAULT); } else if ((sc.atLineEnd) && (sc.chNext != '^')) { sc.ChangeState(SCE_BAAN_STRINGEOL); sc.ForwardSetState(SCE_C_DEFAULT); visibleChars = 0; } } if (sc.state == SCE_BAAN_DEFAULT) { if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { sc.SetState(SCE_BAAN_NUMBER); } else if (sc.MatchIgnoreCase("dllusage")){ sc.SetState(SCE_BAAN_COMMENTDOC); do { sc.Forward(); } while ((!sc.atLineEnd) && sc.More()); } else if (IsAWordStart(sc.ch)) { sc.SetState(SCE_BAAN_IDENTIFIER); } else if (sc.Match('|')){ sc.SetState(SCE_BAAN_COMMENT); } else if (sc.ch == '\"') { sc.SetState(SCE_BAAN_STRING); } else if (sc.ch == '#' && visibleChars == 0) { // Preprocessor commands are alone on their line sc.SetState(SCE_BAAN_PREPROCESSOR); // Skip whitespace between # and preprocessor word do { sc.Forward(); } while (IsASpace(sc.ch) && sc.More()); } else if (isoperator(static_cast(sc.ch))) { sc.SetState(SCE_BAAN_OPERATOR); } } if (sc.atLineEnd) { // Reset states to begining of colourise so no surprises // if different sets of lines lexed. visibleChars = 0; } if (!IsASpace(sc.ch)) { visibleChars++; } } sc.Complete(); } static void FoldBaanDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) { bool foldComment = styler.GetPropertyInt("fold.comment") != 0; bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; unsigned int endPos = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; int levelCurrent = levelPrev; char chNext = styler[startPos]; int styleNext = styler.StyleAt(startPos); int style = initStyle; for (unsigned int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); int stylePrev = style; style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if (foldComment && (style == SCE_BAAN_COMMENT || style == SCE_BAAN_COMMENTDOC)) { if (style != stylePrev) { levelCurrent++; } else if ((style != styleNext) && !atEOL) { // Comments don't end at end of line and the next character may be unstyled. levelCurrent--; } } if (style == SCE_BAAN_OPERATOR) { if (ch == '{') { levelCurrent++; } else if (ch == '}') { levelCurrent--; } } if (atEOL) { int lev = levelPrev; if (visibleChars == 0 && foldCompact) lev |= SC_FOLDLEVELWHITEFLAG; if ((levelCurrent > levelPrev) && (visibleChars > 0)) lev |= SC_FOLDLEVELHEADERFLAG; if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } lineCurrent++; levelPrev = levelCurrent; visibleChars = 0; } if (!isspacechar(ch)) visibleChars++; } // Fill in the real level of the next line, keeping the current flags as they will be filled in later int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; styler.SetLevel(lineCurrent, levelPrev | flagsNext); } LexerModule lmBaan(SCLEX_BAAN, ColouriseBaanDoc, "baan", FoldBaanDoc); tora-2.1.3/src/qscintilla2/src/LexD.cpp0000644000175000017500000003264011213435521017415 0ustar michaelmichael/** @file LexD.cxx ** Lexer for D. ** ** Copyright (c) 2006 by Waldemar Augustyn **/ // Copyright 1998-2005 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif /*/ Nested comments require keeping the value of the nesting level for every position in the document. But since scintilla always styles line by line, we only need to store one value per line. The non-negative number indicates nesting level at the end of the line. /*/ // We use custom qualifiers since it is not clear what D allows. static bool IsWordStart(int ch) { return isascii(ch) && (isalpha(ch) || ch == '_'); } static bool IsWord(int ch) { return isascii(ch) && (isalnum(ch) || ch == '_'); } static bool IsDoxygen(int ch) { if (isascii(ch) && islower(ch)) return true; if (ch == '$' || ch == '@' || ch == '\\' || ch == '&' || ch == '#' || ch == '<' || ch == '>' || ch == '{' || ch == '}' || ch == '[' || ch == ']') return true; return false; } static void ColouriseDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler, bool caseSensitive) { WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; WordList &keywords3 = *keywordlists[2]; WordList &keywords4 = *keywordlists[3]; int styleBeforeDCKeyword = SCE_D_DEFAULT; StyleContext sc(startPos, length, initStyle, styler); int curLine = styler.GetLine(startPos); int curNcLevel = curLine > 0? styler.GetLineState(curLine-1): 0; for (; sc.More(); sc.Forward()) { if (sc.atLineStart) { if (sc.state == SCE_D_STRING) { // Prevent SCE_D_STRINGEOL from leaking back to previous line which // ends with a line continuation by locking in the state upto this position. sc.SetState(SCE_D_STRING); } curLine = styler.GetLine(sc.currentPos); styler.SetLineState(curLine, curNcLevel); } // Handle line continuation generically. if (sc.ch == '\\') { if (sc.chNext == '\n' || sc.chNext == '\r') { sc.Forward(); if (sc.ch == '\r' && sc.chNext == '\n') { sc.Forward(); } continue; } } // Determine if the current state should terminate. switch (sc.state) { case SCE_D_OPERATOR: sc.SetState(SCE_D_DEFAULT); break; case SCE_D_NUMBER: // We accept almost anything because of hex. and number suffixes if (!IsWord(sc.ch) && sc.ch != '.') { sc.SetState(SCE_D_DEFAULT); } break; case SCE_D_IDENTIFIER: if (!IsWord(sc.ch)) { char s[1000]; if (caseSensitive) { sc.GetCurrent(s, sizeof(s)); } else { sc.GetCurrentLowered(s, sizeof(s)); } if (keywords.InList(s)) { sc.ChangeState(SCE_D_WORD); } else if (keywords2.InList(s)) { sc.ChangeState(SCE_D_WORD2); } else if (keywords4.InList(s)) { sc.ChangeState(SCE_D_TYPEDEF); } sc.SetState(SCE_D_DEFAULT); } break; case SCE_D_COMMENT: if (sc.Match('*', '/')) { sc.Forward(); sc.ForwardSetState(SCE_D_DEFAULT); } break; case SCE_D_COMMENTDOC: if (sc.Match('*', '/')) { sc.Forward(); sc.ForwardSetState(SCE_D_DEFAULT); } else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support // Verify that we have the conditions to mark a comment-doc-keyword if ((IsASpace(sc.chPrev) || sc.chPrev == '*') && (!IsASpace(sc.chNext))) { styleBeforeDCKeyword = SCE_D_COMMENTDOC; sc.SetState(SCE_D_COMMENTDOCKEYWORD); } } break; case SCE_D_COMMENTLINE: if (sc.atLineStart) { sc.SetState(SCE_D_DEFAULT); } break; case SCE_D_COMMENTLINEDOC: if (sc.atLineStart) { sc.SetState(SCE_D_DEFAULT); } else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support // Verify that we have the conditions to mark a comment-doc-keyword if ((IsASpace(sc.chPrev) || sc.chPrev == '/' || sc.chPrev == '!') && (!IsASpace(sc.chNext))) { styleBeforeDCKeyword = SCE_D_COMMENTLINEDOC; sc.SetState(SCE_D_COMMENTDOCKEYWORD); } } break; case SCE_D_COMMENTDOCKEYWORD: if ((styleBeforeDCKeyword == SCE_D_COMMENTDOC) && sc.Match('*', '/')) { sc.ChangeState(SCE_D_COMMENTDOCKEYWORDERROR); sc.Forward(); sc.ForwardSetState(SCE_D_DEFAULT); } else if (!IsDoxygen(sc.ch)) { char s[100]; if (caseSensitive) { sc.GetCurrent(s, sizeof(s)); } else { sc.GetCurrentLowered(s, sizeof(s)); } if (!IsASpace(sc.ch) || !keywords3.InList(s + 1)) { sc.ChangeState(SCE_D_COMMENTDOCKEYWORDERROR); } sc.SetState(styleBeforeDCKeyword); } break; case SCE_D_COMMENTNESTED: if (sc.Match('+', '/')) { if (curNcLevel > 0) curNcLevel -= 1; curLine = styler.GetLine(sc.currentPos); styler.SetLineState(curLine, curNcLevel); sc.Forward(); if (curNcLevel == 0) { sc.ForwardSetState(SCE_D_DEFAULT); } } else if (sc.Match('/','+')) { curNcLevel += 1; curLine = styler.GetLine(sc.currentPos); styler.SetLineState(curLine, curNcLevel); sc.Forward(); } break; case SCE_D_STRING: if (sc.atLineEnd) { sc.ChangeState(SCE_D_STRINGEOL); } else if (sc.ch == '\\') { if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { sc.Forward(); } } else if (sc.ch == '\"') { sc.ForwardSetState(SCE_D_DEFAULT); } break; case SCE_D_CHARACTER: if (sc.atLineEnd) { sc.ChangeState(SCE_D_STRINGEOL); } else if (sc.ch == '\\') { if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { sc.Forward(); } } else if (sc.ch == '\'') { sc.ForwardSetState(SCE_D_DEFAULT); } break; case SCE_D_STRINGEOL: if (sc.atLineStart) { sc.SetState(SCE_D_DEFAULT); } break; } // Determine if a new state should be entered. if (sc.state == SCE_D_DEFAULT) { if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { sc.SetState(SCE_D_NUMBER); } else if (IsWordStart(sc.ch)) { sc.SetState(SCE_D_IDENTIFIER); } else if (sc.Match('/','+')) { curNcLevel += 1; curLine = styler.GetLine(sc.currentPos); styler.SetLineState(curLine, curNcLevel); sc.SetState(SCE_D_COMMENTNESTED); sc.Forward(); } else if (sc.Match('/', '*')) { if (sc.Match("/**") || sc.Match("/*!")) { // Support of Qt/Doxygen doc. style sc.SetState(SCE_D_COMMENTDOC); } else { sc.SetState(SCE_D_COMMENT); } sc.Forward(); // Eat the * so it isn't used for the end of the comment } else if (sc.Match('/', '/')) { if ((sc.Match("///") && !sc.Match("////")) || sc.Match("//!")) // Support of Qt/Doxygen doc. style sc.SetState(SCE_D_COMMENTLINEDOC); else sc.SetState(SCE_D_COMMENTLINE); } else if (sc.ch == '\"') { sc.SetState(SCE_D_STRING); } else if (sc.ch == '\'') { sc.SetState(SCE_D_CHARACTER); } else if (isoperator(static_cast(sc.ch))) { sc.SetState(SCE_D_OPERATOR); } } } sc.Complete(); } static bool IsStreamCommentStyle(int style) { return style == SCE_D_COMMENT || style == SCE_D_COMMENTDOC || style == SCE_D_COMMENTDOCKEYWORD || style == SCE_D_COMMENTDOCKEYWORDERROR; } // Store both the current line's fold level and the next lines in the // level store to make it easy to pick up with each increment // and to make it possible to fiddle the current level for "} else {". static void FoldDoc(unsigned int startPos, int length, int initStyle, Accessor &styler) { bool foldComment = styler.GetPropertyInt("fold.comment") != 0; bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; // property lexer.d.fold.at.else // This option enables D folding on a "} else {" line of an if statement. bool foldAtElse = styler.GetPropertyInt("lexer.d.fold.at.else", styler.GetPropertyInt("fold.at.else", 0)) != 0; unsigned int endPos = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); int levelCurrent = SC_FOLDLEVELBASE; if (lineCurrent > 0) levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; int levelMinCurrent = levelCurrent; int levelNext = levelCurrent; char chNext = styler[startPos]; int styleNext = styler.StyleAt(startPos); int style = initStyle; for (unsigned int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); int stylePrev = style; style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if (foldComment && IsStreamCommentStyle(style)) { if (!IsStreamCommentStyle(stylePrev)) { levelNext++; } else if (!IsStreamCommentStyle(styleNext) && !atEOL) { // Comments don't end at end of line and the next character may be unstyled. levelNext--; } } if (style == SCE_D_OPERATOR) { if (ch == '{') { // Measure the minimum before a '{' to allow // folding on "} else {" if (levelMinCurrent > levelNext) { levelMinCurrent = levelNext; } levelNext++; } else if (ch == '}') { levelNext--; } } if (atEOL) { if (foldComment) { // Handle nested comments int nc; nc = styler.GetLineState(lineCurrent); nc -= lineCurrent>0? styler.GetLineState(lineCurrent-1): 0; levelNext += nc; } int levelUse = levelCurrent; if (foldAtElse) { levelUse = levelMinCurrent; } int lev = levelUse | levelNext << 16; if (visibleChars == 0 && foldCompact) lev |= SC_FOLDLEVELWHITEFLAG; if (levelUse < levelNext) lev |= SC_FOLDLEVELHEADERFLAG; if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } lineCurrent++; levelCurrent = levelNext; levelMinCurrent = levelCurrent; visibleChars = 0; } if (!IsASpace(ch)) visibleChars++; } } static void FoldDDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) { FoldDoc(startPos, length, initStyle, styler); } static const char * const dWordLists[] = { "Primary keywords and identifiers", "Secondary keywords and identifiers", "Documentation comment keywords", "Type definitions and aliases", 0, }; static void ColouriseDDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { ColouriseDoc(startPos, length, initStyle, keywordlists, styler, true); } LexerModule lmD(SCLEX_D, ColouriseDDoc, "d", FoldDDoc, dWordLists); tora-2.1.3/src/qscintilla2/src/LexR.cpp0000644000175000017500000001410511213435521017427 0ustar michaelmichael// Scintilla source code edit control /** @file Lexr.cxx ** Lexer for R, S, SPlus Statistics Program (Heavily derived from CPP Lexer). ** **/ // Copyright 1998-2002 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsAWordChar(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); } static inline bool IsAWordStart(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_'); } static inline bool IsAnOperator(const int ch) { if (isascii(ch) && isalnum(ch)) return false; // '.' left out as it is used to make up numbers if (ch == '-' || ch == '+' || ch == '!' || ch == '~' || ch == '?' || ch == ':' || ch == '*' || ch == '/' || ch == '^' || ch == '<' || ch == '>' || ch == '=' || ch == '&' || ch == '|' || ch == '$' || ch == '(' || ch == ')' || ch == '}' || ch == '{' || ch == '[' || ch == ']') return true; return false; } static void ColouriseRDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; WordList &keywords3 = *keywordlists[2]; // Do not leak onto next line if (initStyle == SCE_R_INFIXEOL) initStyle = SCE_R_DEFAULT; StyleContext sc(startPos, length, initStyle, styler); for (; sc.More(); sc.Forward()) { if (sc.atLineStart && (sc.state == SCE_R_STRING)) { // Prevent SCE_R_STRINGEOL from leaking back to previous line sc.SetState(SCE_R_STRING); } // Determine if the current state should terminate. if (sc.state == SCE_R_OPERATOR) { sc.SetState(SCE_R_DEFAULT); } else if (sc.state == SCE_R_NUMBER) { if (!IsADigit(sc.ch) && !(sc.ch == '.' && IsADigit(sc.chNext))) { sc.SetState(SCE_R_DEFAULT); } } else if (sc.state == SCE_R_IDENTIFIER) { if (!IsAWordChar(sc.ch) || (sc.ch == '.')) { char s[100]; sc.GetCurrentLowered(s, sizeof(s)); if (keywords.InList(s)) { sc.ChangeState(SCE_R_KWORD); } else if (keywords2.InList(s)) { sc.ChangeState(SCE_R_BASEKWORD); } else if (keywords3.InList(s)) { sc.ChangeState(SCE_R_OTHERKWORD); } sc.SetState(SCE_R_DEFAULT); } } else if (sc.state == SCE_R_COMMENT) { if (sc.ch == '\r' || sc.ch == '\n') { sc.SetState(SCE_R_DEFAULT); } } else if (sc.state == SCE_R_STRING) { if (sc.ch == '\\') { if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { sc.Forward(); } } else if (sc.ch == '\"') { sc.ForwardSetState(SCE_R_DEFAULT); } } else if (sc.state == SCE_R_INFIX) { if (sc.ch == '%') { sc.ForwardSetState(SCE_R_DEFAULT); } else if (sc.atLineEnd) { sc.ChangeState(SCE_R_INFIXEOL); sc.ForwardSetState(SCE_R_DEFAULT); } }else if (sc.state == SCE_R_STRING2) { if (sc.ch == '\\') { if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { sc.Forward(); } } else if (sc.ch == '\'') { sc.ForwardSetState(SCE_R_DEFAULT); } } // Determine if a new state should be entered. if (sc.state == SCE_R_DEFAULT) { if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { sc.SetState(SCE_R_NUMBER); } else if (IsAWordStart(sc.ch) ) { sc.SetState(SCE_R_IDENTIFIER); } else if (sc.Match('#')) { sc.SetState(SCE_R_COMMENT); } else if (sc.ch == '\"') { sc.SetState(SCE_R_STRING); } else if (sc.ch == '%') { sc.SetState(SCE_R_INFIX); } else if (sc.ch == '\'') { sc.SetState(SCE_R_STRING2); } else if (IsAnOperator(sc.ch)) { sc.SetState(SCE_R_OPERATOR); } } } sc.Complete(); } // Store both the current line's fold level and the next lines in the // level store to make it easy to pick up with each increment // and to make it possible to fiddle the current level for "} else {". static void FoldRDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) != 0; unsigned int endPos = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); int levelCurrent = SC_FOLDLEVELBASE; if (lineCurrent > 0) levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; int levelMinCurrent = levelCurrent; int levelNext = levelCurrent; char chNext = styler[startPos]; int styleNext = styler.StyleAt(startPos); for (unsigned int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); int style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if (style == SCE_R_OPERATOR) { if (ch == '{') { // Measure the minimum before a '{' to allow // folding on "} else {" if (levelMinCurrent > levelNext) { levelMinCurrent = levelNext; } levelNext++; } else if (ch == '}') { levelNext--; } } if (atEOL) { int levelUse = levelCurrent; if (foldAtElse) { levelUse = levelMinCurrent; } int lev = levelUse | levelNext << 16; if (visibleChars == 0 && foldCompact) lev |= SC_FOLDLEVELWHITEFLAG; if (levelUse < levelNext) lev |= SC_FOLDLEVELHEADERFLAG; if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } lineCurrent++; levelCurrent = levelNext; levelMinCurrent = levelCurrent; visibleChars = 0; } if (!isspacechar(ch)) visibleChars++; } } static const char * const RWordLists[] = { "Language Keywords", "Base / Default package function", "Other Package Functions", "Unused", "Unused", 0, }; LexerModule lmR(SCLEX_R, ColouriseRDoc, "r", FoldRDoc, RWordLists); tora-2.1.3/src/qscintilla2/src/AutoComplete.cpp0000644000175000017500000000735511213435521021167 0ustar michaelmichael// Scintilla source code edit control /** @file AutoComplete.cxx ** Defines the auto completion list box. **/ // Copyright 1998-2003 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include "Platform.h" #include "PropSet.h" #include "AutoComplete.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif AutoComplete::AutoComplete() : active(false), separator(' '), typesep('?'), ignoreCase(false), chooseSingle(false), lb(0), posStart(0), startLen(0), cancelAtStartPos(true), autoHide(true), dropRestOfWord(false) { lb = ListBox::Allocate(); stopChars[0] = '\0'; fillUpChars[0] = '\0'; } AutoComplete::~AutoComplete() { if (lb) { lb->Destroy(); delete lb; lb = 0; } } bool AutoComplete::Active() { return active; } void AutoComplete::Start(Window &parent, int ctrlID, int position, Point location, int startLen_, int lineHeight, bool unicodeMode) { if (active) { Cancel(); } lb->Create(parent, ctrlID, location, lineHeight, unicodeMode); lb->Clear(); active = true; startLen = startLen_; posStart = position; } void AutoComplete::SetStopChars(const char *stopChars_) { strncpy(stopChars, stopChars_, sizeof(stopChars)); stopChars[sizeof(stopChars) - 1] = '\0'; } bool AutoComplete::IsStopChar(char ch) { return ch && strchr(stopChars, ch); } void AutoComplete::SetFillUpChars(const char *fillUpChars_) { strncpy(fillUpChars, fillUpChars_, sizeof(fillUpChars)); fillUpChars[sizeof(fillUpChars) - 1] = '\0'; } bool AutoComplete::IsFillUpChar(char ch) { return ch && strchr(fillUpChars, ch); } void AutoComplete::SetSeparator(char separator_) { separator = separator_; } char AutoComplete::GetSeparator() { return separator; } void AutoComplete::SetTypesep(char separator_) { typesep = separator_; } char AutoComplete::GetTypesep() { return typesep; } void AutoComplete::SetList(const char *list) { lb->SetList(list, separator, typesep); } void AutoComplete::Show(bool show) { lb->Show(show); if (show) lb->Select(0); } void AutoComplete::Cancel() { if (lb->Created()) { lb->Clear(); lb->Destroy(); active = false; } } void AutoComplete::Move(int delta) { int count = lb->Length(); int current = lb->GetSelection(); current += delta; if (current >= count) current = count - 1; if (current < 0) current = 0; lb->Select(current); } void AutoComplete::Select(const char *word) { size_t lenWord = strlen(word); int location = -1; const int maxItemLen=1000; char item[maxItemLen]; int start = 0; // lower bound of the api array block to search int end = lb->Length() - 1; // upper bound of the api array block to search while ((start <= end) && (location == -1)) { // Binary searching loop int pivot = (start + end) / 2; lb->GetValue(pivot, item, maxItemLen); int cond; if (ignoreCase) cond = CompareNCaseInsensitive(word, item, lenWord); else cond = strncmp(word, item, lenWord); if (!cond) { // Find first match while (pivot > start) { lb->GetValue(pivot-1, item, maxItemLen); if (ignoreCase) cond = CompareNCaseInsensitive(word, item, lenWord); else cond = strncmp(word, item, lenWord); if (0 != cond) break; --pivot; } location = pivot; if (ignoreCase) { // Check for exact-case match for (; pivot <= end; pivot++) { lb->GetValue(pivot, item, maxItemLen); if (!strncmp(word, item, lenWord)) { location = pivot; break; } if (CompareNCaseInsensitive(word, item, lenWord)) break; } } } else if (cond < 0) { end = pivot - 1; } else if (cond > 0) { start = pivot + 1; } } if (location == -1 && autoHide) Cancel(); else lb->Select(location); } tora-2.1.3/src/qscintilla2/src/Decoration.cpp0000644000175000017500000001013011213435521020636 0ustar michaelmichael/** @file Decoration.cxx ** Visual elements added over text. **/ // Copyright 1998-2007 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include "Platform.h" #include "Scintilla.h" #include "SplitVector.h" #include "Partitioning.h" #include "RunStyles.h" #include "Decoration.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif Decoration::Decoration(int indicator_) : next(0), indicator(indicator_) { } Decoration::~Decoration() { } bool Decoration::Empty() { return rs.starts->Partitions() == 1; } DecorationList::DecorationList() : currentIndicator(0), currentValue(1), current(0), lengthDocument(0), root(0), clickNotified(false) { } DecorationList::~DecorationList() { Decoration *deco = root; while (deco) { Decoration *decoNext = deco->next; delete deco; deco = decoNext; } root = 0; current = 0; } Decoration *DecorationList::DecorationFromIndicator(int indicator) { for (Decoration *deco=root; deco; deco = deco->next) { if (deco->indicator == indicator) { return deco; } } return 0; } Decoration *DecorationList::Create(int indicator, int length) { currentIndicator = indicator; Decoration *decoNew = new Decoration(indicator); decoNew->rs.InsertSpace(0, length); Decoration *decoPrev = 0; Decoration *deco = root; while (deco && (deco->indicator < indicator)) { decoPrev = deco; deco = deco->next; } if (decoPrev == 0) { decoNew->next = root; root = decoNew; } else { decoNew->next = deco; decoPrev->next = decoNew; } return decoNew; } void DecorationList::Delete(int indicator) { Decoration *decoToDelete = 0; if (root) { if (root->indicator == indicator) { decoToDelete = root; root = root->next; } else { Decoration *deco=root; while (deco->next && !decoToDelete) { if (deco->next && deco->next->indicator == indicator) { decoToDelete = deco->next; deco->next = decoToDelete->next; } else { deco = deco->next; } } } } if (decoToDelete) { delete decoToDelete; current = 0; } } void DecorationList::SetCurrentIndicator(int indicator) { currentIndicator = indicator; current = DecorationFromIndicator(indicator); currentValue = 1; } void DecorationList::SetCurrentValue(int value) { currentValue = value ? value : 1; } bool DecorationList::FillRange(int &position, int value, int &fillLength) { if (!current) { current = DecorationFromIndicator(currentIndicator); if (!current) { current = Create(currentIndicator, lengthDocument); } } bool changed = current->rs.FillRange(position, value, fillLength); if (current->Empty()) { Delete(currentIndicator); } return changed; } void DecorationList::InsertSpace(int position, int insertLength) { lengthDocument += insertLength; for (Decoration *deco=root; deco; deco = deco->next) { deco->rs.InsertSpace(position, insertLength); } } void DecorationList::DeleteRange(int position, int deleteLength) { lengthDocument -= deleteLength; Decoration *deco; for (deco=root; deco; deco = deco->next) { deco->rs.DeleteRange(position, deleteLength); } DeleteAnyEmpty(); } void DecorationList::DeleteAnyEmpty() { Decoration *deco = root; while (deco) { if (deco->Empty()) { Delete(deco->indicator); deco = root; } else { deco = deco->next; } } } int DecorationList::AllOnFor(int position) { int mask = 0; for (Decoration *deco=root; deco; deco = deco->next) { if (deco->rs.ValueAt(position)) { mask |= 1 << deco->indicator; } } return mask; } int DecorationList::ValueAt(int indicator, int position) { Decoration *deco = DecorationFromIndicator(indicator); if (deco) { return deco->rs.ValueAt(position); } return 0; } int DecorationList::Start(int indicator, int position) { Decoration *deco = DecorationFromIndicator(indicator); if (deco) { return deco->rs.StartRun(position); } return 0; } int DecorationList::End(int indicator, int position) { Decoration *deco = DecorationFromIndicator(indicator); if (deco) { return deco->rs.EndRun(position); } return 0; } tora-2.1.3/src/qscintilla2/src/LexRuby.cpp0000644000175000017500000017060211213435521020154 0ustar michaelmichael// Scintilla source code edit control /** @file LexRuby.cxx ** Lexer for Ruby. **/ // Copyright 2001- by Clemens Wyss // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif //XXX Identical to Perl, put in common area static inline bool isEOLChar(char ch) { return (ch == '\r') || (ch == '\n'); } #define isSafeASCII(ch) ((unsigned int)(ch) <= 127) // This one's redundant, but makes for more readable code #define isHighBitChar(ch) ((unsigned int)(ch) > 127) static inline bool isSafeAlpha(char ch) { return (isSafeASCII(ch) && isalpha(ch)) || ch == '_'; } static inline bool isSafeAlnum(char ch) { return (isSafeASCII(ch) && isalnum(ch)) || ch == '_'; } static inline bool isSafeAlnumOrHigh(char ch) { return isHighBitChar(ch) || isalnum(ch) || ch == '_'; } static inline bool isSafeDigit(char ch) { return isSafeASCII(ch) && isdigit(ch); } static inline bool isSafeWordcharOrHigh(char ch) { // Error: scintilla's KeyWords.h includes '.' as a word-char // we want to separate things that can take methods from the // methods. return isHighBitChar(ch) || isalnum(ch) || ch == '_'; } static bool inline iswhitespace(char ch) { return ch == ' ' || ch == '\t'; } #define MAX_KEYWORD_LENGTH 200 #define STYLE_MASK 63 #define actual_style(style) (style & STYLE_MASK) static bool followsDot(unsigned int pos, Accessor &styler) { styler.Flush(); for (; pos >= 1; --pos) { int style = actual_style(styler.StyleAt(pos)); char ch; switch (style) { case SCE_RB_DEFAULT: ch = styler[pos]; if (ch == ' ' || ch == '\t') { //continue } else { return false; } break; case SCE_RB_OPERATOR: return styler[pos] == '.'; default: return false; } } return false; } // Forward declarations static bool keywordIsAmbiguous(const char *prevWord); static bool keywordDoStartsLoop(int pos, Accessor &styler); static bool keywordIsModifier(const char *word, int pos, Accessor &styler); static int ClassifyWordRb(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) { char s[MAX_KEYWORD_LENGTH]; unsigned int i, j; unsigned int lim = end - start + 1; // num chars to copy if (lim >= MAX_KEYWORD_LENGTH) { lim = MAX_KEYWORD_LENGTH - 1; } for (i = start, j = 0; j < lim; i++, j++) { s[j] = styler[i]; } s[j] = '\0'; int chAttr; if (0 == strcmp(prevWord, "class")) chAttr = SCE_RB_CLASSNAME; else if (0 == strcmp(prevWord, "module")) chAttr = SCE_RB_MODULE_NAME; else if (0 == strcmp(prevWord, "def")) chAttr = SCE_RB_DEFNAME; else if (keywords.InList(s) && !followsDot(start - 1, styler)) { if (keywordIsAmbiguous(s) && keywordIsModifier(s, start, styler)) { // Demoted keywords are colored as keywords, // but do not affect changes in indentation. // // Consider the word 'if': // 1. <> : normal // 2. <> : demoted // 3. <> : normal: start a new indent level // 4. <> : color as identifer, since it follows '.' chAttr = SCE_RB_WORD_DEMOTED; } else { chAttr = SCE_RB_WORD; } } else chAttr = SCE_RB_IDENTIFIER; styler.ColourTo(end, chAttr); if (chAttr == SCE_RB_WORD) { strcpy(prevWord, s); } else { prevWord[0] = 0; } return chAttr; } //XXX Identical to Perl, put in common area static bool isMatch(Accessor &styler, int lengthDoc, int pos, const char *val) { if ((pos + static_cast(strlen(val))) >= lengthDoc) { return false; } while (*val) { if (*val != styler[pos++]) { return false; } val++; } return true; } // Do Ruby better -- find the end of the line, work back, // and then check for leading white space // Precondition: the here-doc target can be indented static bool lookingAtHereDocDelim(Accessor &styler, int pos, int lengthDoc, const char *HereDocDelim) { if (!isMatch(styler, lengthDoc, pos, HereDocDelim)) { return false; } while (--pos > 0) { char ch = styler[pos]; if (isEOLChar(ch)) { return true; } else if (ch != ' ' && ch != '\t') { return false; } } return false; } //XXX Identical to Perl, put in common area static char opposite(char ch) { if (ch == '(') return ')'; if (ch == '[') return ']'; if (ch == '{') return '}'; if (ch == '<') return '>'; return ch; } // Null transitions when we see we've reached the end // and need to relex the curr char. static void redo_char(int &i, char &ch, char &chNext, char &chNext2, int &state) { i--; chNext2 = chNext; chNext = ch; state = SCE_RB_DEFAULT; } static void advance_char(int &i, char &ch, char &chNext, char &chNext2) { i++; ch = chNext; chNext = chNext2; } // precondition: startPos points to one after the EOL char static bool currLineContainsHereDelims(int& startPos, Accessor &styler) { if (startPos <= 1) return false; int pos; for (pos = startPos - 1; pos > 0; pos--) { char ch = styler.SafeGetCharAt(pos); if (isEOLChar(ch)) { // Leave the pointers where they are -- there are no // here doc delims on the current line, even if // the EOL isn't default style return false; } else { styler.Flush(); if (actual_style(styler.StyleAt(pos)) == SCE_RB_HERE_DELIM) { break; } } } if (pos == 0) { return false; } // Update the pointers so we don't have to re-analyze the string startPos = pos; return true; } // This class is used by the enter and exit methods, so it needs // to be hoisted out of the function. class QuoteCls { public: int Count; char Up; char Down; QuoteCls() { this->New(); } void New() { Count = 0; Up = '\0'; Down = '\0'; } void Open(char u) { Count++; Up = u; Down = opposite(Up); } QuoteCls(const QuoteCls& q) { // copy constructor -- use this for copying in Count = q.Count; Up = q.Up; Down = q.Down; } QuoteCls& operator=(const QuoteCls& q) { // assignment constructor if (this != &q) { Count = q.Count; Up = q.Up; Down = q.Down; } return *this; } }; static void enterInnerExpression(int *p_inner_string_types, int *p_inner_expn_brace_counts, QuoteCls *p_inner_quotes, int& inner_string_count, int& state, int& brace_counts, QuoteCls curr_quote ) { p_inner_string_types[inner_string_count] = state; state = SCE_RB_DEFAULT; p_inner_expn_brace_counts[inner_string_count] = brace_counts; brace_counts = 0; p_inner_quotes[inner_string_count] = curr_quote; ++inner_string_count; } static void exitInnerExpression(int *p_inner_string_types, int *p_inner_expn_brace_counts, QuoteCls *p_inner_quotes, int& inner_string_count, int& state, int& brace_counts, QuoteCls& curr_quote ) { --inner_string_count; state = p_inner_string_types[inner_string_count]; brace_counts = p_inner_expn_brace_counts[inner_string_count]; curr_quote = p_inner_quotes[inner_string_count]; } static bool isEmptyLine(int pos, Accessor &styler) { int spaceFlags = 0; int lineCurrent = styler.GetLine(pos); int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL); return (indentCurrent & SC_FOLDLEVELWHITEFLAG) != 0; } static bool RE_CanFollowKeyword(const char *keyword) { if (!strcmp(keyword, "and") || !strcmp(keyword, "begin") || !strcmp(keyword, "break") || !strcmp(keyword, "case") || !strcmp(keyword, "do") || !strcmp(keyword, "else") || !strcmp(keyword, "elsif") || !strcmp(keyword, "if") || !strcmp(keyword, "next") || !strcmp(keyword, "return") || !strcmp(keyword, "when") || !strcmp(keyword, "unless") || !strcmp(keyword, "until") || !strcmp(keyword, "not") || !strcmp(keyword, "or")) { return true; } return false; } // Look at chars up to but not including endPos // Don't look at styles in case we're looking forward static int skipWhitespace(int startPos, int endPos, Accessor &styler) { for (int i = startPos; i < endPos; i++) { if (!iswhitespace(styler[i])) { return i; } } return endPos; } // This routine looks for false positives like // undef foo, << // There aren't too many. // // iPrev points to the start of << static bool sureThisIsHeredoc(int iPrev, Accessor &styler, char *prevWord) { // Not so fast, since Ruby's so dynamic. Check the context // to make sure we're OK. int prevStyle; int lineStart = styler.GetLine(iPrev); int lineStartPosn = styler.LineStart(lineStart); styler.Flush(); // Find the first word after some whitespace int firstWordPosn = skipWhitespace(lineStartPosn, iPrev, styler); if (firstWordPosn >= iPrev) { // Have something like {^ <<} //XXX Look at the first previous non-comment non-white line // to establish the context. Not too likely though. return true; } else { switch (prevStyle = styler.StyleAt(firstWordPosn)) { case SCE_RB_WORD: case SCE_RB_WORD_DEMOTED: case SCE_RB_IDENTIFIER: break; default: return true; } } int firstWordEndPosn = firstWordPosn; char *dst = prevWord; for (;;) { if (firstWordEndPosn >= iPrev || styler.StyleAt(firstWordEndPosn) != prevStyle) { *dst = 0; break; } *dst++ = styler[firstWordEndPosn]; firstWordEndPosn += 1; } //XXX Write a style-aware thing to regex scintilla buffer objects if (!strcmp(prevWord, "undef") || !strcmp(prevWord, "def") || !strcmp(prevWord, "alias")) { // These keywords are what we were looking for return false; } return true; } // Routine that saves us from allocating a buffer for the here-doc target // targetEndPos points one past the end of the current target static bool haveTargetMatch(int currPos, int lengthDoc, int targetStartPos, int targetEndPos, Accessor &styler) { if (lengthDoc - currPos < targetEndPos - targetStartPos) { return false; } int i, j; for (i = targetStartPos, j = currPos; i < targetEndPos && j < lengthDoc; i++, j++) { if (styler[i] != styler[j]) { return false; } } return true; } // We need a check because the form // [identifier] <<[target] // is ambiguous. The Ruby lexer/parser resolves it by // looking to see if [identifier] names a variable or a // function. If it's the first, it's the start of a here-doc. // If it's a var, it's an operator. This lexer doesn't // maintain a symbol table, so it looks ahead to see what's // going on, in cases where we have // ^[white-space]*[identifier([.|::]identifier)*][white-space]*<<[target] // // If there's no occurrence of [target] on a line, assume we don't. // return true == yes, we have no heredocs static bool sureThisIsNotHeredoc(int lt2StartPos, Accessor &styler) { int prevStyle; // Use full document, not just part we're styling int lengthDoc = styler.Length(); int lineStart = styler.GetLine(lt2StartPos); int lineStartPosn = styler.LineStart(lineStart); styler.Flush(); const bool definitely_not_a_here_doc = true; const bool looks_like_a_here_doc = false; // Find the first word after some whitespace int firstWordPosn = skipWhitespace(lineStartPosn, lt2StartPos, styler); if (firstWordPosn >= lt2StartPos) { return definitely_not_a_here_doc; } prevStyle = styler.StyleAt(firstWordPosn); // If we have '<<' following a keyword, it's not a heredoc if (prevStyle != SCE_RB_IDENTIFIER) { return definitely_not_a_here_doc; } int newStyle = prevStyle; // Some compilers incorrectly warn about uninit newStyle for (firstWordPosn += 1; firstWordPosn <= lt2StartPos; firstWordPosn += 1) { // Inner loop looks at the name for (; firstWordPosn <= lt2StartPos; firstWordPosn += 1) { newStyle = styler.StyleAt(firstWordPosn); if (newStyle != prevStyle) { break; } } // Do we have '::' or '.'? if (firstWordPosn < lt2StartPos && newStyle == SCE_RB_OPERATOR) { char ch = styler[firstWordPosn]; if (ch == '.') { // yes } else if (ch == ':') { if (styler.StyleAt(++firstWordPosn) != SCE_RB_OPERATOR) { return definitely_not_a_here_doc; } else if (styler[firstWordPosn] != ':') { return definitely_not_a_here_doc; } } else { break; } } else { break; } } // Skip next batch of white-space firstWordPosn = skipWhitespace(firstWordPosn, lt2StartPos, styler); if (firstWordPosn != lt2StartPos) { // Have [[^ws[identifier]ws[*something_else*]ws<< return definitely_not_a_here_doc; } // OK, now 'j' will point to the current spot moving ahead int j = firstWordPosn + 1; if (styler.StyleAt(j) != SCE_RB_OPERATOR || styler[j] != '<') { // This shouldn't happen return definitely_not_a_here_doc; } int nextLineStartPosn = styler.LineStart(lineStart + 1); if (nextLineStartPosn >= lengthDoc) { return definitely_not_a_here_doc; } j = skipWhitespace(j + 1, nextLineStartPosn, styler); if (j >= lengthDoc) { return definitely_not_a_here_doc; } bool allow_indent; int target_start, target_end; // From this point on no more styling, since we're looking ahead if (styler[j] == '-') { allow_indent = true; j++; } else { allow_indent = false; } // Allow for quoted targets. char target_quote = 0; switch (styler[j]) { case '\'': case '"': case '`': target_quote = styler[j]; j += 1; } if (isSafeAlnum(styler[j])) { // Init target_end because some compilers think it won't // be initialized by the time it's used target_start = target_end = j; j++; } else { return definitely_not_a_here_doc; } for (; j < lengthDoc; j++) { if (!isSafeAlnum(styler[j])) { if (target_quote && styler[j] != target_quote) { // unquoted end return definitely_not_a_here_doc; } // And for now make sure that it's a newline // don't handle arbitrary expressions yet target_end = j; if (target_quote) { // Now we can move to the character after the string delimiter. j += 1; } j = skipWhitespace(j, lengthDoc, styler); if (j >= lengthDoc) { return definitely_not_a_here_doc; } else { char ch = styler[j]; if (ch == '#' || isEOLChar(ch)) { // This is OK, so break and continue; break; } else { return definitely_not_a_here_doc; } } } } // Just look at the start of each line int last_line = styler.GetLine(lengthDoc - 1); // But don't go too far if (last_line > lineStart + 50) { last_line = lineStart + 50; } for (int line_num = lineStart + 1; line_num <= last_line; line_num++) { if (allow_indent) { j = skipWhitespace(styler.LineStart(line_num), lengthDoc, styler); } else { j = styler.LineStart(line_num); } // target_end is one past the end if (haveTargetMatch(j, lengthDoc, target_start, target_end, styler)) { // We got it return looks_like_a_here_doc; } } return definitely_not_a_here_doc; } //todo: if we aren't looking at a stdio character, // move to the start of the first line that is not in a // multi-line construct static void synchronizeDocStart(unsigned int& startPos, int &length, int &initStyle, Accessor &styler, bool skipWhiteSpace=false) { styler.Flush(); int style = actual_style(styler.StyleAt(startPos)); switch (style) { case SCE_RB_STDIN: case SCE_RB_STDOUT: case SCE_RB_STDERR: // Don't do anything else with these. return; } int pos = startPos; // Quick way to characterize each line int lineStart; for (lineStart = styler.GetLine(pos); lineStart > 0; lineStart--) { // Now look at the style before the previous line's EOL pos = styler.LineStart(lineStart) - 1; if (pos <= 10) { lineStart = 0; break; } char ch = styler.SafeGetCharAt(pos); char chPrev = styler.SafeGetCharAt(pos - 1); if (ch == '\n' && chPrev == '\r') { pos--; } if (styler.SafeGetCharAt(pos - 1) == '\\') { // Continuation line -- keep going } else if (actual_style(styler.StyleAt(pos)) != SCE_RB_DEFAULT) { // Part of multi-line construct -- keep going } else if (currLineContainsHereDelims(pos, styler)) { // Keep going, with pos and length now pointing // at the end of the here-doc delimiter } else if (skipWhiteSpace && isEmptyLine(pos, styler)) { // Keep going } else { break; } } pos = styler.LineStart(lineStart); length += (startPos - pos); startPos = pos; initStyle = SCE_RB_DEFAULT; } static void ColouriseRbDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { // Lexer for Ruby often has to backtrack to start of current style to determine // which characters are being used as quotes, how deeply nested is the // start position and what the termination string is for here documents WordList &keywords = *keywordlists[0]; class HereDocCls { public: int State; // States // 0: '<<' encountered // 1: collect the delimiter // 1b: text between the end of the delimiter and the EOL // 2: here doc text (lines after the delimiter) char Quote; // the char after '<<' bool Quoted; // true if Quote in ('\'','"','`') int DelimiterLength; // strlen(Delimiter) char Delimiter[256]; // the Delimiter, limit of 256: from Perl bool CanBeIndented; HereDocCls() { State = 0; DelimiterLength = 0; Delimiter[0] = '\0'; CanBeIndented = false; } }; HereDocCls HereDoc; QuoteCls Quote; int numDots = 0; // For numbers -- // Don't start lexing in the middle of a num synchronizeDocStart(startPos, length, initStyle, styler, // ref args false); bool preferRE = true; int state = initStyle; int lengthDoc = startPos + length; char prevWord[MAX_KEYWORD_LENGTH + 1]; // 1 byte for zero prevWord[0] = '\0'; if (length == 0) return; char chPrev = styler.SafeGetCharAt(startPos - 1); char chNext = styler.SafeGetCharAt(startPos); bool is_real_number = true; // Differentiate between constants and ?-sequences. // Ruby uses a different mask because bad indentation is marked by oring with 32 styler.StartAt(startPos, 127); styler.StartSegment(startPos); static int q_states[] = {SCE_RB_STRING_Q, SCE_RB_STRING_QQ, SCE_RB_STRING_QR, SCE_RB_STRING_QW, SCE_RB_STRING_QW, SCE_RB_STRING_QX}; static const char* q_chars = "qQrwWx"; // In most cases a value of 2 should be ample for the code in the // Ruby library, and the code the user is likely to enter. // For example, // fu_output_message "mkdir #{options[:mode] ? ('-m %03o ' % options[:mode]) : ''}#{list.join ' '}" // if options[:verbose] // from fileutils.rb nests to a level of 2 // If the user actually hits a 6th occurrence of '#{' in a double-quoted // string (including regex'es, %Q, %, %w, and other strings // that interpolate), it will stay as a string. The problem with this // is that quotes might flip, a 7th '#{' will look like a comment, // and code-folding might be wrong. // If anyone runs into this problem, I recommend raising this // value slightly higher to replacing the fixed array with a linked // list. Keep in mind this code will be called everytime the lexer // is invoked. #define INNER_STRINGS_MAX_COUNT 5 // These vars track our instances of "...#{,,,%Q<..#{,,,}...>,,,}..." int inner_string_types[INNER_STRINGS_MAX_COUNT]; // Track # braces when we push a new #{ thing int inner_expn_brace_counts[INNER_STRINGS_MAX_COUNT]; QuoteCls inner_quotes[INNER_STRINGS_MAX_COUNT]; int inner_string_count = 0; int brace_counts = 0; // Number of #{ ... } things within an expression int i; for (i = 0; i < INNER_STRINGS_MAX_COUNT; i++) { inner_string_types[i] = 0; inner_expn_brace_counts[i] = 0; } for (i = startPos; i < lengthDoc; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); char chNext2 = styler.SafeGetCharAt(i + 2); if (styler.IsLeadByte(ch)) { chNext = chNext2; chPrev = ' '; i += 1; continue; } // skip on DOS/Windows //No, don't, because some things will get tagged on, // so we won't recognize keywords, for example #if 0 if (ch == '\r' && chNext == '\n') { continue; } #endif if (HereDoc.State == 1 && isEOLChar(ch)) { // Begin of here-doc (the line after the here-doc delimiter): HereDoc.State = 2; styler.ColourTo(i-1, state); // Don't check for a missing quote, just jump into // the here-doc state state = SCE_RB_HERE_Q; } // Regular transitions if (state == SCE_RB_DEFAULT) { if (isSafeDigit(ch)) { styler.ColourTo(i - 1, state); state = SCE_RB_NUMBER; is_real_number = true; numDots = 0; } else if (isHighBitChar(ch) || iswordstart(ch)) { styler.ColourTo(i - 1, state); state = SCE_RB_WORD; } else if (ch == '#') { styler.ColourTo(i - 1, state); state = SCE_RB_COMMENTLINE; } else if (ch == '=') { // =begin indicates the start of a comment (doc) block if (i == 0 || (isEOLChar(chPrev) && chNext == 'b' && styler.SafeGetCharAt(i + 2) == 'e' && styler.SafeGetCharAt(i + 3) == 'g' && styler.SafeGetCharAt(i + 4) == 'i' && styler.SafeGetCharAt(i + 5) == 'n' && !isSafeWordcharOrHigh(styler.SafeGetCharAt(i + 6)))) { styler.ColourTo(i - 1, state); state = SCE_RB_POD; } else { styler.ColourTo(i - 1, state); styler.ColourTo(i, SCE_RB_OPERATOR); preferRE = true; } } else if (ch == '"') { styler.ColourTo(i - 1, state); state = SCE_RB_STRING; Quote.New(); Quote.Open(ch); } else if (ch == '\'') { styler.ColourTo(i - 1, state); state = SCE_RB_CHARACTER; Quote.New(); Quote.Open(ch); } else if (ch == '`') { styler.ColourTo(i - 1, state); state = SCE_RB_BACKTICKS; Quote.New(); Quote.Open(ch); } else if (ch == '@') { // Instance or class var styler.ColourTo(i - 1, state); if (chNext == '@') { state = SCE_RB_CLASS_VAR; advance_char(i, ch, chNext, chNext2); // pass by ref } else { state = SCE_RB_INSTANCE_VAR; } } else if (ch == '$') { // Check for a builtin global styler.ColourTo(i - 1, state); // Recognize it bit by bit state = SCE_RB_GLOBAL; } else if (ch == '/' && preferRE) { // Ambigous operator styler.ColourTo(i - 1, state); state = SCE_RB_REGEX; Quote.New(); Quote.Open(ch); } else if (ch == '<' && chNext == '<' && chNext2 != '=') { // Recognise the '<<' symbol - either a here document or a binary op styler.ColourTo(i - 1, state); i++; chNext = chNext2; styler.ColourTo(i, SCE_RB_OPERATOR); if (! (strchr("\"\'`_-", chNext2) || isSafeAlpha(chNext2))) { // It's definitely not a here-doc, // based on Ruby's lexer/parser in the // heredoc_identifier routine. // Nothing else to do. } else if (preferRE) { if (sureThisIsHeredoc(i - 1, styler, prevWord)) { state = SCE_RB_HERE_DELIM; HereDoc.State = 0; } // else leave it in default state } else { if (sureThisIsNotHeredoc(i - 1, styler)) { // leave state as default // We don't have all the heuristics Perl has for indications // of a here-doc, because '<<' is overloadable and used // for so many other classes. } else { state = SCE_RB_HERE_DELIM; HereDoc.State = 0; } } preferRE = (state != SCE_RB_HERE_DELIM); } else if (ch == ':') { styler.ColourTo(i - 1, state); if (chNext == ':') { // Mark "::" as an operator, not symbol start styler.ColourTo(i + 1, SCE_RB_OPERATOR); advance_char(i, ch, chNext, chNext2); // pass by ref state = SCE_RB_DEFAULT; preferRE = false; } else if (isSafeWordcharOrHigh(chNext)) { state = SCE_RB_SYMBOL; } else if (strchr("[*!~+-*/%=<>&^|", chNext)) { // Do the operator analysis in-line, looking ahead // Based on the table in pickaxe 2nd ed., page 339 bool doColoring = true; switch (chNext) { case '[': if (chNext2 == ']' ) { char ch_tmp = styler.SafeGetCharAt(i + 3); if (ch_tmp == '=') { i += 3; ch = ch_tmp; chNext = styler.SafeGetCharAt(i + 1); } else { i += 2; ch = chNext2; chNext = ch_tmp; } } else { doColoring = false; } break; case '*': if (chNext2 == '*') { i += 2; ch = chNext2; chNext = styler.SafeGetCharAt(i + 1); } else { advance_char(i, ch, chNext, chNext2); } break; case '!': if (chNext2 == '=' || chNext2 == '~') { i += 2; ch = chNext2; chNext = styler.SafeGetCharAt(i + 1); } else { advance_char(i, ch, chNext, chNext2); } break; case '<': if (chNext2 == '<') { i += 2; ch = chNext2; chNext = styler.SafeGetCharAt(i + 1); } else if (chNext2 == '=') { char ch_tmp = styler.SafeGetCharAt(i + 3); if (ch_tmp == '>') { // <=> operator i += 3; ch = ch_tmp; chNext = styler.SafeGetCharAt(i + 1); } else { i += 2; ch = chNext2; chNext = ch_tmp; } } else { advance_char(i, ch, chNext, chNext2); } break; default: // Simple one-character operators advance_char(i, ch, chNext, chNext2); break; } if (doColoring) { styler.ColourTo(i, SCE_RB_SYMBOL); state = SCE_RB_DEFAULT; } } else if (!preferRE) { // Don't color symbol strings (yet) // Just color the ":" and color rest as string styler.ColourTo(i, SCE_RB_SYMBOL); state = SCE_RB_DEFAULT; } else { styler.ColourTo(i, SCE_RB_OPERATOR); state = SCE_RB_DEFAULT; preferRE = true; } } else if (ch == '%') { styler.ColourTo(i - 1, state); bool have_string = false; if (strchr(q_chars, chNext) && !isSafeWordcharOrHigh(chNext2)) { Quote.New(); const char *hit = strchr(q_chars, chNext); if (hit != NULL) { state = q_states[hit - q_chars]; Quote.Open(chNext2); i += 2; ch = chNext2; chNext = styler.SafeGetCharAt(i + 1); have_string = true; } } else if (preferRE && !isSafeWordcharOrHigh(chNext)) { // Ruby doesn't allow high bit chars here, // but the editor host might state = SCE_RB_STRING_QQ; Quote.Open(chNext); advance_char(i, ch, chNext, chNext2); // pass by ref have_string = true; } if (!have_string) { styler.ColourTo(i, SCE_RB_OPERATOR); // stay in default preferRE = true; } } else if (ch == '?') { styler.ColourTo(i - 1, state); if (iswhitespace(chNext) || chNext == '\n' || chNext == '\r') { styler.ColourTo(i, SCE_RB_OPERATOR); } else { // It's the start of a character code escape sequence // Color it as a number. state = SCE_RB_NUMBER; is_real_number = false; } } else if (isoperator(ch) || ch == '.') { styler.ColourTo(i - 1, state); styler.ColourTo(i, SCE_RB_OPERATOR); // If we're ending an expression or block, // assume it ends an object, and the ambivalent // constructs are binary operators // // So if we don't have one of these chars, // we aren't ending an object exp'n, and ops // like : << / are unary operators. if (ch == '{') { ++brace_counts; preferRE = true; } else if (ch == '}' && --brace_counts < 0 && inner_string_count > 0) { styler.ColourTo(i, SCE_RB_OPERATOR); exitInnerExpression(inner_string_types, inner_expn_brace_counts, inner_quotes, inner_string_count, state, brace_counts, Quote); } else { preferRE = (strchr(")}].", ch) == NULL); } // Stay in default state } else if (isEOLChar(ch)) { // Make sure it's a true line-end, with no backslash if ((ch == '\r' || (ch == '\n' && chPrev != '\r')) && chPrev != '\\') { // Assume we've hit the end of the statement. preferRE = true; } } } else if (state == SCE_RB_WORD) { if (ch == '.' || !isSafeWordcharOrHigh(ch)) { // Words include x? in all contexts, // and = after either 'def' or a dot // Move along until a complete word is on our left // Default accessor treats '.' as word-chars, // but we don't for now. if (ch == '=' && isSafeWordcharOrHigh(chPrev) && (chNext == '(' || strchr(" \t\n\r", chNext) != NULL) && (!strcmp(prevWord, "def") || followsDot(styler.GetStartSegment(), styler))) { // = is a name only when being def'd -- Get it the next time // This means that = is always lexed as // , (op, =), } else if ((ch == '?' || ch == '!') && isSafeWordcharOrHigh(chPrev) && !isSafeWordcharOrHigh(chNext)) { // ? is a name -- Get it the next time // But ? is always lexed as // , (op, ?), // Same with ! to indicate a method that // modifies its target } else if (isEOLChar(ch) && isMatch(styler, lengthDoc, i - 7, "__END__")) { styler.ColourTo(i, SCE_RB_DATASECTION); state = SCE_RB_DATASECTION; // No need to handle this state -- we'll just move to the end preferRE = false; } else { int wordStartPos = styler.GetStartSegment(); int word_style = ClassifyWordRb(wordStartPos, i - 1, keywords, styler, prevWord); switch (word_style) { case SCE_RB_WORD: preferRE = RE_CanFollowKeyword(prevWord); break; case SCE_RB_WORD_DEMOTED: preferRE = true; break; case SCE_RB_IDENTIFIER: if (isMatch(styler, lengthDoc, wordStartPos, "print")) { preferRE = true; } else if (isEOLChar(ch)) { preferRE = true; } else { preferRE = false; } break; default: preferRE = false; } if (ch == '.') { // We might be redefining an operator-method preferRE = false; } // And if it's the first redo_char(i, ch, chNext, chNext2, state); // pass by ref } } } else if (state == SCE_RB_NUMBER) { if (!is_real_number) { if (ch != '\\') { styler.ColourTo(i, state); state = SCE_RB_DEFAULT; preferRE = false; } else if (strchr("\\ntrfvaebs", chNext)) { // Terminal escape sequence -- handle it next time // Nothing more to do this time through the loop } else if (chNext == 'C' || chNext == 'M') { if (chNext2 != '-') { // \C or \M ends the sequence -- handle it next time } else { // Move from abc?\C-x // ^ // to // ^ i += 2; ch = chNext2; chNext = styler.SafeGetCharAt(i + 1); } } else if (chNext == 'c') { // Stay here, \c is a combining sequence advance_char(i, ch, chNext, chNext2); // pass by ref } else { // ?\x, including ?\\ is final. styler.ColourTo(i + 1, state); state = SCE_RB_DEFAULT; preferRE = false; advance_char(i, ch, chNext, chNext2); } } else if (isSafeAlnumOrHigh(ch) || ch == '_') { // Keep going } else if (ch == '.' && ++numDots == 1) { // Keep going } else { styler.ColourTo(i - 1, state); redo_char(i, ch, chNext, chNext2, state); // pass by ref preferRE = false; } } else if (state == SCE_RB_COMMENTLINE) { if (isEOLChar(ch)) { styler.ColourTo(i - 1, state); state = SCE_RB_DEFAULT; // Use whatever setting we had going into the comment } } else if (state == SCE_RB_HERE_DELIM) { // See the comment for SCE_RB_HERE_DELIM in LexPerl.cxx // Slightly different: if we find an immediate '-', // the target can appear indented. if (HereDoc.State == 0) { // '<<' encountered HereDoc.State = 1; HereDoc.DelimiterLength = 0; if (ch == '-') { HereDoc.CanBeIndented = true; advance_char(i, ch, chNext, chNext2); // pass by ref } else { HereDoc.CanBeIndented = false; } if (isEOLChar(ch)) { // Bail out of doing a here doc if there's no target state = SCE_RB_DEFAULT; preferRE = false; } else { HereDoc.Quote = ch; if (ch == '\'' || ch == '"' || ch == '`') { HereDoc.Quoted = true; HereDoc.Delimiter[0] = '\0'; } else { HereDoc.Quoted = false; HereDoc.Delimiter[0] = ch; HereDoc.Delimiter[1] = '\0'; HereDoc.DelimiterLength = 1; } } } else if (HereDoc.State == 1) { // collect the delimiter if (isEOLChar(ch)) { // End the quote now, and go back for more styler.ColourTo(i - 1, state); state = SCE_RB_DEFAULT; i--; chNext = ch; chNext2 = chNext; preferRE = false; } else if (HereDoc.Quoted) { if (ch == HereDoc.Quote) { // closing quote => end of delimiter styler.ColourTo(i, state); state = SCE_RB_DEFAULT; preferRE = false; } else { if (ch == '\\' && !isEOLChar(chNext)) { advance_char(i, ch, chNext, chNext2); } HereDoc.Delimiter[HereDoc.DelimiterLength++] = ch; HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0'; } } else { // an unquoted here-doc delimiter if (isSafeAlnumOrHigh(ch) || ch == '_') { HereDoc.Delimiter[HereDoc.DelimiterLength++] = ch; HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0'; } else { styler.ColourTo(i - 1, state); redo_char(i, ch, chNext, chNext2, state); preferRE = false; } } if (HereDoc.DelimiterLength >= static_cast(sizeof(HereDoc.Delimiter)) - 1) { styler.ColourTo(i - 1, state); state = SCE_RB_ERROR; preferRE = false; } } } else if (state == SCE_RB_HERE_Q) { // Not needed: HereDoc.State == 2 // Indentable here docs: look backwards // Non-indentable: look forwards, like in Perl // // Why: so we can quickly resolve things like <<-" abc" if (!HereDoc.CanBeIndented) { if (isEOLChar(chPrev) && isMatch(styler, lengthDoc, i, HereDoc.Delimiter)) { styler.ColourTo(i - 1, state); i += HereDoc.DelimiterLength - 1; chNext = styler.SafeGetCharAt(i + 1); if (isEOLChar(chNext)) { styler.ColourTo(i, SCE_RB_HERE_DELIM); state = SCE_RB_DEFAULT; HereDoc.State = 0; preferRE = false; } // Otherwise we skipped through the here doc faster. } } else if (isEOLChar(chNext) && lookingAtHereDocDelim(styler, i - HereDoc.DelimiterLength + 1, lengthDoc, HereDoc.Delimiter)) { styler.ColourTo(i - 1 - HereDoc.DelimiterLength, state); styler.ColourTo(i, SCE_RB_HERE_DELIM); state = SCE_RB_DEFAULT; preferRE = false; HereDoc.State = 0; } } else if (state == SCE_RB_CLASS_VAR || state == SCE_RB_INSTANCE_VAR || state == SCE_RB_SYMBOL) { if (!isSafeWordcharOrHigh(ch)) { styler.ColourTo(i - 1, state); redo_char(i, ch, chNext, chNext2, state); // pass by ref preferRE = false; } } else if (state == SCE_RB_GLOBAL) { if (!isSafeWordcharOrHigh(ch)) { // handle special globals here as well if (chPrev == '$') { if (ch == '-') { // Include the next char, like $-a advance_char(i, ch, chNext, chNext2); } styler.ColourTo(i, state); state = SCE_RB_DEFAULT; } else { styler.ColourTo(i - 1, state); redo_char(i, ch, chNext, chNext2, state); // pass by ref } preferRE = false; } } else if (state == SCE_RB_POD) { // PODs end with ^=end\s, -- any whitespace can follow =end if (strchr(" \t\n\r", ch) != NULL && i > 5 && isEOLChar(styler[i - 5]) && isMatch(styler, lengthDoc, i - 4, "=end")) { styler.ColourTo(i - 1, state); state = SCE_RB_DEFAULT; preferRE = false; } } else if (state == SCE_RB_REGEX || state == SCE_RB_STRING_QR) { if (ch == '\\' && Quote.Up != '\\') { // Skip one advance_char(i, ch, chNext, chNext2); } else if (ch == Quote.Down) { Quote.Count--; if (Quote.Count == 0) { // Include the options while (isSafeAlpha(chNext)) { i++; ch = chNext; chNext = styler.SafeGetCharAt(i + 1); } styler.ColourTo(i, state); state = SCE_RB_DEFAULT; preferRE = false; } } else if (ch == Quote.Up) { // Only if close quoter != open quoter Quote.Count++; } else if (ch == '#' ) { if (chNext == '{' && inner_string_count < INNER_STRINGS_MAX_COUNT) { // process #{ ... } styler.ColourTo(i - 1, state); styler.ColourTo(i + 1, SCE_RB_OPERATOR); enterInnerExpression(inner_string_types, inner_expn_brace_counts, inner_quotes, inner_string_count, state, brace_counts, Quote); preferRE = true; // Skip one advance_char(i, ch, chNext, chNext2); } else { //todo: distinguish comments from pound chars // for now, handle as comment styler.ColourTo(i - 1, state); bool inEscape = false; while (++i < lengthDoc) { ch = styler.SafeGetCharAt(i); if (ch == '\\') { inEscape = true; } else if (isEOLChar(ch)) { // Comment inside a regex styler.ColourTo(i - 1, SCE_RB_COMMENTLINE); break; } else if (inEscape) { inEscape = false; // don't look at char } else if (ch == Quote.Down) { // Have the regular handler deal with this // to get trailing modifiers. i--; ch = styler[i]; break; } } chNext = styler.SafeGetCharAt(i + 1); chNext2 = styler.SafeGetCharAt(i + 2); } } // Quotes of all kinds... } else if (state == SCE_RB_STRING_Q || state == SCE_RB_STRING_QQ || state == SCE_RB_STRING_QX || state == SCE_RB_STRING_QW || state == SCE_RB_STRING || state == SCE_RB_CHARACTER || state == SCE_RB_BACKTICKS) { if (!Quote.Down && !isspacechar(ch)) { Quote.Open(ch); } else if (ch == '\\' && Quote.Up != '\\') { //Riddle me this: Is it safe to skip *every* escaped char? advance_char(i, ch, chNext, chNext2); } else if (ch == Quote.Down) { Quote.Count--; if (Quote.Count == 0) { styler.ColourTo(i, state); state = SCE_RB_DEFAULT; preferRE = false; } } else if (ch == Quote.Up) { Quote.Count++; } else if (ch == '#' && chNext == '{' && inner_string_count < INNER_STRINGS_MAX_COUNT && state != SCE_RB_CHARACTER && state != SCE_RB_STRING_Q) { // process #{ ... } styler.ColourTo(i - 1, state); styler.ColourTo(i + 1, SCE_RB_OPERATOR); enterInnerExpression(inner_string_types, inner_expn_brace_counts, inner_quotes, inner_string_count, state, brace_counts, Quote); preferRE = true; // Skip one advance_char(i, ch, chNext, chNext2); } } if (state == SCE_RB_ERROR) { break; } chPrev = ch; } if (state == SCE_RB_WORD) { // We've ended on a word, possibly at EOF, and need to // classify it. (void) ClassifyWordRb(styler.GetStartSegment(), lengthDoc - 1, keywords, styler, prevWord); } else { styler.ColourTo(lengthDoc - 1, state); } } // Helper functions for folding, disambiguation keywords // Assert that there are no high-bit chars static void getPrevWord(int pos, char *prevWord, Accessor &styler, int word_state) { int i; styler.Flush(); for (i = pos - 1; i > 0; i--) { if (actual_style(styler.StyleAt(i)) != word_state) { i++; break; } } if (i < pos - MAX_KEYWORD_LENGTH) // overflow i = pos - MAX_KEYWORD_LENGTH; char *dst = prevWord; for (; i <= pos; i++) { *dst++ = styler[i]; } *dst = 0; } static bool keywordIsAmbiguous(const char *prevWord) { // Order from most likely used to least likely // Lots of ways to do a loop in Ruby besides 'while/until' if (!strcmp(prevWord, "if") || !strcmp(prevWord, "do") || !strcmp(prevWord, "while") || !strcmp(prevWord, "unless") || !strcmp(prevWord, "until")) { return true; } else { return false; } } // Demote keywords in the following conditions: // if, while, unless, until modify a statement // do after a while or until, as a noise word (like then after if) static bool keywordIsModifier(const char *word, int pos, Accessor &styler) { if (word[0] == 'd' && word[1] == 'o' && !word[2]) { return keywordDoStartsLoop(pos, styler); } char ch; int style = SCE_RB_DEFAULT; int lineStart = styler.GetLine(pos); int lineStartPosn = styler.LineStart(lineStart); styler.Flush(); while (--pos >= lineStartPosn) { style = actual_style(styler.StyleAt(pos)); if (style == SCE_RB_DEFAULT) { if (iswhitespace(ch = styler[pos])) { //continue } else if (ch == '\r' || ch == '\n') { // Scintilla's LineStart() and GetLine() routines aren't // platform-independent, so if we have text prepared with // a different system we can't rely on it. return false; } } else { break; } } if (pos < lineStartPosn) { return false; //XXX not quite right if the prev line is a continuation } // First things where the action is unambiguous switch (style) { case SCE_RB_DEFAULT: case SCE_RB_COMMENTLINE: case SCE_RB_POD: case SCE_RB_CLASSNAME: case SCE_RB_DEFNAME: case SCE_RB_MODULE_NAME: return false; case SCE_RB_OPERATOR: break; case SCE_RB_WORD: // Watch out for uses of 'else if' //XXX: Make a list of other keywords where 'if' isn't a modifier // and can appear legitimately // Formulate this to avoid warnings from most compilers if (strcmp(word, "if") == 0) { char prevWord[MAX_KEYWORD_LENGTH + 1]; getPrevWord(pos, prevWord, styler, SCE_RB_WORD); return strcmp(prevWord, "else") != 0; } return true; default: return true; } // Assume that if the keyword follows an operator, // usually it's a block assignment, like // a << if x then y else z ch = styler[pos]; switch (ch) { case ')': case ']': case '}': return true; default: return false; } } #define WHILE_BACKWARDS "elihw" #define UNTIL_BACKWARDS "litnu" // Nothing fancy -- look to see if we follow a while/until somewhere // on the current line static bool keywordDoStartsLoop(int pos, Accessor &styler) { char ch; int style; int lineStart = styler.GetLine(pos); int lineStartPosn = styler.LineStart(lineStart); styler.Flush(); while (--pos >= lineStartPosn) { style = actual_style(styler.StyleAt(pos)); if (style == SCE_RB_DEFAULT) { if ((ch = styler[pos]) == '\r' || ch == '\n') { // Scintilla's LineStart() and GetLine() routines aren't // platform-independent, so if we have text prepared with // a different system we can't rely on it. return false; } } else if (style == SCE_RB_WORD) { // Check for while or until, but write the word in backwards char prevWord[MAX_KEYWORD_LENGTH + 1]; // 1 byte for zero char *dst = prevWord; int wordLen = 0; int start_word; for (start_word = pos; start_word >= lineStartPosn && actual_style(styler.StyleAt(start_word)) == SCE_RB_WORD; start_word--) { if (++wordLen < MAX_KEYWORD_LENGTH) { *dst++ = styler[start_word]; } } *dst = 0; // Did we see our keyword? if (!strcmp(prevWord, WHILE_BACKWARDS) || !strcmp(prevWord, UNTIL_BACKWARDS)) { return true; } // We can move pos to the beginning of the keyword, and then // accept another decrement, as we can never have two contiguous // keywords: // word1 word2 // ^ // <- move to start_word // ^ // <- loop decrement // ^ # pointing to end of word1 is fine pos = start_word; } } return false; } /* * Folding Ruby * * The language is quite complex to analyze without a full parse. * For example, this line shouldn't affect fold level: * * print "hello" if feeling_friendly? * * Neither should this: * * print "hello" \ * if feeling_friendly? * * * But this should: * * if feeling_friendly? #++ * print "hello" \ * print "goodbye" * end #-- * * So we cheat, by actually looking at the existing indentation * levels for each line, and just echoing it back. Like Python. * Then if we get better at it, we'll take braces into consideration, * which always affect folding levels. * How the keywords should work: * No effect: * __FILE__ __LINE__ BEGIN END alias and * defined? false in nil not or self super then * true undef * Always increment: * begin class def do for module when { * * Always decrement: * end } * * Increment if these start a statement * if unless until while -- do nothing if they're modifiers * These end a block if there's no modifier, but don't bother * break next redo retry return yield * * These temporarily de-indent, but re-indent * case else elsif ensure rescue * * This means that the folder reflects indentation rather * than setting it. The language-service updates indentation * when users type return and finishes entering de-denters. * * Later offer to fold POD, here-docs, strings, and blocks of comments */ static void FoldRbDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) { const bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; bool foldComment = styler.GetPropertyInt("fold.comment") != 0; synchronizeDocStart(startPos, length, initStyle, styler, // ref args false); unsigned int endPos = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); int levelPrev = startPos == 0 ? 0 : (styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK & ~SC_FOLDLEVELBASE); int levelCurrent = levelPrev; char chNext = styler[startPos]; int styleNext = styler.StyleAt(startPos); int stylePrev = startPos <= 1 ? SCE_RB_DEFAULT : styler.StyleAt(startPos - 1); bool buffer_ends_with_eol = false; for (unsigned int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); int style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if (style == SCE_RB_COMMENTLINE) { if (foldComment && stylePrev != SCE_RB_COMMENTLINE) { if (chNext == '{') { levelCurrent++; } else if (chNext == '}' && levelCurrent > 0) { levelCurrent--; } } } else if (style == SCE_RB_OPERATOR) { if (strchr("[{(", ch)) { levelCurrent++; } else if (strchr(")}]", ch)) { // Don't decrement below 0 if (levelCurrent > 0) levelCurrent--; } } else if (style == SCE_RB_WORD && styleNext != SCE_RB_WORD) { // Look at the keyword on the left and decide what to do char prevWord[MAX_KEYWORD_LENGTH + 1]; // 1 byte for zero prevWord[0] = 0; getPrevWord(i, prevWord, styler, SCE_RB_WORD); if (!strcmp(prevWord, "end")) { // Don't decrement below 0 if (levelCurrent > 0) levelCurrent--; } else if ( !strcmp(prevWord, "if") || !strcmp(prevWord, "def") || !strcmp(prevWord, "class") || !strcmp(prevWord, "module") || !strcmp(prevWord, "begin") || !strcmp(prevWord, "case") || !strcmp(prevWord, "do") || !strcmp(prevWord, "while") || !strcmp(prevWord, "unless") || !strcmp(prevWord, "until") || !strcmp(prevWord, "for") ) { levelCurrent++; } } if (atEOL) { int lev = levelPrev; if (visibleChars == 0 && foldCompact) lev |= SC_FOLDLEVELWHITEFLAG; if ((levelCurrent > levelPrev) && (visibleChars > 0)) lev |= SC_FOLDLEVELHEADERFLAG; styler.SetLevel(lineCurrent, lev|SC_FOLDLEVELBASE); lineCurrent++; levelPrev = levelCurrent; visibleChars = 0; buffer_ends_with_eol = true; } else if (!isspacechar(ch)) { visibleChars++; buffer_ends_with_eol = false; } stylePrev = style; } // Fill in the real level of the next line, keeping the current flags as they will be filled in later if (!buffer_ends_with_eol) { lineCurrent++; int new_lev = levelCurrent; if (visibleChars == 0 && foldCompact) new_lev |= SC_FOLDLEVELWHITEFLAG; if ((levelCurrent > levelPrev) && (visibleChars > 0)) new_lev |= SC_FOLDLEVELHEADERFLAG; levelCurrent = new_lev; } styler.SetLevel(lineCurrent, levelCurrent|SC_FOLDLEVELBASE); } static const char * const rubyWordListDesc[] = { "Keywords", 0 }; LexerModule lmRuby(SCLEX_RUBY, ColouriseRbDoc, "ruby", FoldRbDoc, rubyWordListDesc); tora-2.1.3/src/qscintilla2/src/ExternalLexer.cpp0000644000175000017500000001363611213435521021347 0ustar michaelmichael// Scintilla source code edit control /** @file ExternalLexer.cxx ** Support external lexers in DLLs. **/ // Copyright 2001 Simon Steele , portions copyright Neil Hodgson. // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include "Platform.h" #include "Scintilla.h" #include "SciLexer.h" #include "PropSet.h" #include "Accessor.h" #include "DocumentAccessor.h" #include "KeyWords.h" #include "ExternalLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif LexerManager *LexerManager::theInstance = NULL; //------------------------------------------ // // ExternalLexerModule // //------------------------------------------ char **WordListsToStrings(WordList *val[]) { int dim = 0; while (val[dim]) dim++; char **wls = new char * [dim + 1]; for (int i = 0;i < dim;i++) { SString words; words = ""; for (int n = 0; n < val[i]->len; n++) { words += val[i]->words[n]; if (n != val[i]->len - 1) words += " "; } wls[i] = new char[words.length() + 1]; strcpy(wls[i], words.c_str()); } wls[dim] = 0; return wls; } void DeleteWLStrings(char *strs[]) { int dim = 0; while (strs[dim]) { delete strs[dim]; dim++; } delete [] strs; } void ExternalLexerModule::Lex(unsigned int startPos, int lengthDoc, int initStyle, WordList *keywordlists[], Accessor &styler) const { if (!fneLexer) return ; char **kwds = WordListsToStrings(keywordlists); char *ps = styler.GetProperties(); // The accessor passed in is always a DocumentAccessor so this cast and the subsequent // access will work. Can not use the stricter dynamic_cast as that requires RTTI. DocumentAccessor &da = static_cast(styler); WindowID wID = da.GetWindow(); fneLexer(externalLanguage, startPos, lengthDoc, initStyle, kwds, wID, ps); delete ps; DeleteWLStrings(kwds); } void ExternalLexerModule::Fold(unsigned int startPos, int lengthDoc, int initStyle, WordList *keywordlists[], Accessor &styler) const { if (!fneFolder) return ; char **kwds = WordListsToStrings(keywordlists); char *ps = styler.GetProperties(); // The accessor passed in is always a DocumentAccessor so this cast and the subsequent // access will work. Can not use the stricter dynamic_cast as that requires RTTI. DocumentAccessor &da = static_cast(styler); WindowID wID = da.GetWindow(); fneFolder(externalLanguage, startPos, lengthDoc, initStyle, kwds, wID, ps); delete ps; DeleteWLStrings(kwds); } void ExternalLexerModule::SetExternal(ExtLexerFunction fLexer, ExtFoldFunction fFolder, int index) { fneLexer = fLexer; fneFolder = fFolder; externalLanguage = index; } //------------------------------------------ // // LexerLibrary // //------------------------------------------ LexerLibrary::LexerLibrary(const char* ModuleName) { // Initialise some members... first = NULL; last = NULL; // Load the DLL lib = DynamicLibrary::Load(ModuleName); if (lib->IsValid()) { m_sModuleName = ModuleName; //Cannot use reinterpret_cast because: ANSI C++ forbids casting between pointers to functions and objects GetLexerCountFn GetLexerCount = (GetLexerCountFn)(sptr_t)lib->FindFunction("GetLexerCount"); if (GetLexerCount) { ExternalLexerModule *lex; LexerMinder *lm; // Find functions in the DLL GetLexerNameFn GetLexerName = (GetLexerNameFn)(sptr_t)lib->FindFunction("GetLexerName"); ExtLexerFunction Lexer = (ExtLexerFunction)(sptr_t)lib->FindFunction("Lex"); ExtFoldFunction Folder = (ExtFoldFunction)(sptr_t)lib->FindFunction("Fold"); // Assign a buffer for the lexer name. char lexname[100]; strcpy(lexname, ""); int nl = GetLexerCount(); for (int i = 0; i < nl; i++) { GetLexerName(i, lexname, 100); lex = new ExternalLexerModule(SCLEX_AUTOMATIC, NULL, lexname, NULL); // Create a LexerMinder so we don't leak the ExternalLexerModule... lm = new LexerMinder; lm->self = lex; lm->next = NULL; if (first != NULL) { last->next = lm; last = lm; } else { first = lm; last = lm; } // The external lexer needs to know how to call into its DLL to // do its lexing and folding, we tell it here. Folder may be null. lex->SetExternal(Lexer, Folder, i); } } } next = NULL; } LexerLibrary::~LexerLibrary() { Release(); delete lib; } void LexerLibrary::Release() { //TODO maintain a list of lexers created, and delete them! LexerMinder *lm; LexerMinder *lmNext; lm = first; while (NULL != lm) { lmNext = lm->next; delete lm->self; delete lm; lm = lmNext; } first = NULL; last = NULL; } //------------------------------------------ // // LexerManager // //------------------------------------------ /// Return the single LexerManager instance... LexerManager *LexerManager::GetInstance() { if(!theInstance) theInstance = new LexerManager; return theInstance; } /// Delete any LexerManager instance... void LexerManager::DeleteInstance() { if(theInstance) { delete theInstance; theInstance = NULL; } } /// protected constructor - this is a singleton... LexerManager::LexerManager() { first = NULL; last = NULL; } LexerManager::~LexerManager() { Clear(); } void LexerManager::Load(const char* path) { LoadLexerLibrary(path); } void LexerManager::LoadLexerLibrary(const char* module) { LexerLibrary *lib = new LexerLibrary(module); if (NULL != first) { last->next = lib; last = lib; } else { first = lib; last = lib; } } void LexerManager::Clear() { if (NULL != first) { LexerLibrary *cur = first; LexerLibrary *next; while (cur) { next = cur->next; delete cur; cur = next; } first = NULL; last = NULL; } } //------------------------------------------ // // LexerManager // //------------------------------------------ LMMinder::~LMMinder() { LexerManager::DeleteInstance(); } LMMinder minder; tora-2.1.3/src/qscintilla2/src/LexFortran.cpp0000644000175000017500000003754311213435521020654 0ustar michaelmichael// Scintilla source code edit control /** @file LexFortran.cxx ** Lexer for Fortran. ** Writen by Chuan-jian Shen, Last changed Sep. 2003 **/ // Copyright 1998-2001 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. /***************************************/ #include #include #include #include #include /***************************************/ #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif /***********************************************/ static inline bool IsAWordChar(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '%'); } /**********************************************/ static inline bool IsAWordStart(const int ch) { return (ch < 0x80) && (isalnum(ch)); } /***************************************/ inline bool IsABlank(unsigned int ch) { return (ch == ' ') || (ch == 0x09) || (ch == 0x0b) ; } /***************************************/ inline bool IsALineEnd(char ch) { return ((ch == '\n') || (ch == '\r')) ; } /***************************************/ unsigned int GetContinuedPos(unsigned int pos, Accessor &styler) { while (!IsALineEnd(styler.SafeGetCharAt(pos++))) continue; if (styler.SafeGetCharAt(pos) == '\n') pos++; while (IsABlank(styler.SafeGetCharAt(pos++))) continue; char chCur = styler.SafeGetCharAt(pos); if (chCur == '&') { while (IsABlank(styler.SafeGetCharAt(++pos))) continue; return pos; } else { return pos; } } /***************************************/ static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler, bool isFixFormat) { WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; WordList &keywords3 = *keywordlists[2]; /***************************************/ int posLineStart = 0, numNonBlank = 0, prevState = 0; int endPos = startPos + length; /***************************************/ // backtrack to the nearest keyword while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_F_WORD)) { startPos--; } startPos = styler.LineStart(styler.GetLine(startPos)); initStyle = styler.StyleAt(startPos - 1); StyleContext sc(startPos, endPos-startPos, initStyle, styler); /***************************************/ for (; sc.More(); sc.Forward()) { // remember the start position of the line if (sc.atLineStart) { posLineStart = sc.currentPos; numNonBlank = 0; sc.SetState(SCE_F_DEFAULT); } if (!IsASpaceOrTab(sc.ch)) numNonBlank ++; /***********************************************/ // Handle the fix format generically int toLineStart = sc.currentPos - posLineStart; if (isFixFormat && (toLineStart < 6 || toLineStart > 72)) { if ((toLineStart == 0 && (tolower(sc.ch) == 'c' || sc.ch == '*')) || sc.ch == '!') { if (sc.MatchIgnoreCase("cdec$") || sc.MatchIgnoreCase("*dec$") || sc.MatchIgnoreCase("!dec$") || sc.MatchIgnoreCase("cdir$") || sc.MatchIgnoreCase("*dir$") || sc.MatchIgnoreCase("!dir$") || sc.MatchIgnoreCase("cms$") || sc.MatchIgnoreCase("*ms$") || sc.MatchIgnoreCase("!ms$") || sc.chNext == '$') { sc.SetState(SCE_F_PREPROCESSOR); } else { sc.SetState(SCE_F_COMMENT); } while (!sc.atLineEnd && sc.More()) sc.Forward(); // Until line end } else if (toLineStart > 72) { sc.SetState(SCE_F_COMMENT); while (!sc.atLineEnd && sc.More()) sc.Forward(); // Until line end } else if (toLineStart < 5) { if (IsADigit(sc.ch)) sc.SetState(SCE_F_LABEL); else sc.SetState(SCE_F_DEFAULT); } else if (toLineStart == 5) { if (!IsASpace(sc.ch) && sc.ch != '0') { sc.SetState(SCE_F_CONTINUATION); sc.ForwardSetState(prevState); } else sc.SetState(SCE_F_DEFAULT); } continue; } /***************************************/ // Handle line continuation generically. if (!isFixFormat && sc.ch == '&') { char chTemp = ' '; int j = 1; while (IsABlank(chTemp) && j<132) { chTemp = static_cast(sc.GetRelative(j)); j++; } if (chTemp == '!') { sc.SetState(SCE_F_CONTINUATION); if (sc.chNext == '!') sc.ForwardSetState(SCE_F_COMMENT); } else if (chTemp == '\r' || chTemp == '\n') { int currentState = sc.state; sc.SetState(SCE_F_CONTINUATION); sc.ForwardSetState(SCE_F_DEFAULT); while (IsASpace(sc.ch) && sc.More()) sc.Forward(); if (sc.ch == '&') { sc.SetState(SCE_F_CONTINUATION); sc.Forward(); } sc.SetState(currentState); } } /***************************************/ // Determine if the current state should terminate. if (sc.state == SCE_F_OPERATOR) { sc.SetState(SCE_F_DEFAULT); } else if (sc.state == SCE_F_NUMBER) { if (!(IsAWordChar(sc.ch) || sc.ch=='\'' || sc.ch=='\"' || sc.ch=='.')) { sc.SetState(SCE_F_DEFAULT); } } else if (sc.state == SCE_F_IDENTIFIER) { if (!IsAWordChar(sc.ch) || (sc.ch == '%')) { char s[100]; sc.GetCurrentLowered(s, sizeof(s)); if (keywords.InList(s)) { sc.ChangeState(SCE_F_WORD); } else if (keywords2.InList(s)) { sc.ChangeState(SCE_F_WORD2); } else if (keywords3.InList(s)) { sc.ChangeState(SCE_F_WORD3); } sc.SetState(SCE_F_DEFAULT); } } else if (sc.state == SCE_F_COMMENT || sc.state == SCE_F_PREPROCESSOR) { if (sc.ch == '\r' || sc.ch == '\n') { sc.SetState(SCE_F_DEFAULT); } } else if (sc.state == SCE_F_STRING1) { prevState = sc.state; if (sc.ch == '\'') { if (sc.chNext == '\'') { sc.Forward(); } else { sc.ForwardSetState(SCE_F_DEFAULT); prevState = SCE_F_DEFAULT; } } else if (sc.atLineEnd) { sc.ChangeState(SCE_F_STRINGEOL); sc.ForwardSetState(SCE_F_DEFAULT); } } else if (sc.state == SCE_F_STRING2) { prevState = sc.state; if (sc.atLineEnd) { sc.ChangeState(SCE_F_STRINGEOL); sc.ForwardSetState(SCE_F_DEFAULT); } else if (sc.ch == '\"') { if (sc.chNext == '\"') { sc.Forward(); } else { sc.ForwardSetState(SCE_F_DEFAULT); prevState = SCE_F_DEFAULT; } } } else if (sc.state == SCE_F_OPERATOR2) { if (sc.ch == '.') { sc.ForwardSetState(SCE_F_DEFAULT); } } else if (sc.state == SCE_F_CONTINUATION) { sc.SetState(SCE_F_DEFAULT); } else if (sc.state == SCE_F_LABEL) { if (!IsADigit(sc.ch)) { sc.SetState(SCE_F_DEFAULT); } else { if (isFixFormat && sc.currentPos-posLineStart > 4) sc.SetState(SCE_F_DEFAULT); else if (numNonBlank > 5) sc.SetState(SCE_F_DEFAULT); } } /***************************************/ // Determine if a new state should be entered. if (sc.state == SCE_F_DEFAULT) { if (sc.ch == '!') { if (sc.MatchIgnoreCase("!dec$") || sc.MatchIgnoreCase("!dir$") || sc.MatchIgnoreCase("!ms$") || sc.chNext == '$') { sc.SetState(SCE_F_PREPROCESSOR); } else { sc.SetState(SCE_F_COMMENT); } } else if ((!isFixFormat) && IsADigit(sc.ch) && numNonBlank == 1) { sc.SetState(SCE_F_LABEL); } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { sc.SetState(SCE_F_NUMBER); } else if ((tolower(sc.ch) == 'b' || tolower(sc.ch) == 'o' || tolower(sc.ch) == 'z') && (sc.chNext == '\"' || sc.chNext == '\'')) { sc.SetState(SCE_F_NUMBER); sc.Forward(); } else if (sc.ch == '.' && isalpha(sc.chNext)) { sc.SetState(SCE_F_OPERATOR2); } else if (IsAWordStart(sc.ch)) { sc.SetState(SCE_F_IDENTIFIER); } else if (sc.ch == '\"') { sc.SetState(SCE_F_STRING2); } else if (sc.ch == '\'') { sc.SetState(SCE_F_STRING1); } else if (isoperator(static_cast(sc.ch))) { sc.SetState(SCE_F_OPERATOR); } } } sc.Complete(); } /***************************************/ // To determine the folding level depending on keywords static int classifyFoldPointFortran(const char* s, const char* prevWord, const char chNextNonBlank) { int lev = 0; if ((strcmp(prevWord, "else") == 0 && strcmp(s, "if") == 0) || strcmp(s, "elseif") == 0) return -1; if (strcmp(s, "associate") == 0 || strcmp(s, "block") == 0 || strcmp(s, "blockdata") == 0 || strcmp(s, "select") == 0 || strcmp(s, "do") == 0 || strcmp(s, "enum") ==0 || strcmp(s, "function") == 0 || strcmp(s, "interface") == 0 || strcmp(s, "module") == 0 || strcmp(s, "program") == 0 || strcmp(s, "subroutine") == 0 || strcmp(s, "then") == 0 || (strcmp(s, "type") == 0 && chNextNonBlank != '(') ){ if (strcmp(prevWord, "end") == 0) lev = 0; else lev = 1; } else if ((strcmp(s, "end") == 0 && chNextNonBlank != '=') || strcmp(s, "endassociate") == 0 || strcmp(s, "endblock") == 0 || strcmp(s, "endblockdata") == 0 || strcmp(s, "endselect") == 0 || strcmp(s, "enddo") == 0 || strcmp(s, "endenum") ==0 || strcmp(s, "endif") == 0 || strcmp(s, "endforall") == 0 || strcmp(s, "endfunction") == 0 || strcmp(s, "endinterface") == 0 || strcmp(s, "endmodule") == 0 || strcmp(s, "endprogram") == 0 || strcmp(s, "endsubroutine") == 0 || strcmp(s, "endtype") == 0 || strcmp(s, "endwhere") == 0 || strcmp(s, "procedure") == 0 ) { // Take care of the module procedure statement lev = -1; } else if (strcmp(prevWord, "end") == 0 && strcmp(s, "if") == 0){ // end if lev = 0; } return lev; } // Folding the code static void FoldFortranDoc(unsigned int startPos, int length, int initStyle, Accessor &styler, bool isFixFormat) { // // bool foldComment = styler.GetPropertyInt("fold.comment") != 0; // Do not know how to fold the comment at the moment. // bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; unsigned int endPos = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; int levelCurrent = levelPrev; char chNext = styler[startPos]; char chNextNonBlank; int styleNext = styler.StyleAt(startPos); int style = initStyle; /***************************************/ int lastStart = 0; char prevWord[32] = ""; char Label[6] = ""; // Variables for do label folding. static int doLabels[100]; static int posLabel=-1; /***************************************/ for (unsigned int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); chNextNonBlank = chNext; unsigned int j=i+1; while(IsABlank(chNextNonBlank) && j(tolower(styler[lastStart+k])); } s[k] = '\0'; // Handle the forall and where statement and structure. if (strcmp(s, "forall") == 0 || strcmp(s, "where") == 0) { if (strcmp(prevWord, "end") != 0) { j = i + 1; char chBrace = '(', chSeek = ')', ch1 = styler.SafeGetCharAt(j); // Find the position of the first ( while (ch1 != chBrace && j -1) { levelCurrent--; posLabel--; } } } if (atEOL) { int lev = levelPrev; if (visibleChars == 0 && foldCompact) lev |= SC_FOLDLEVELWHITEFLAG; if ((levelCurrent > levelPrev) && (visibleChars > 0)) lev |= SC_FOLDLEVELHEADERFLAG; if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } lineCurrent++; levelPrev = levelCurrent; visibleChars = 0; strcpy(prevWord, ""); } /***************************************/ if (!isspacechar(ch)) visibleChars++; } /***************************************/ // Fill in the real level of the next line, keeping the current flags as they will be filled in later int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; styler.SetLevel(lineCurrent, levelPrev | flagsNext); } /***************************************/ static const char * const FortranWordLists[] = { "Primary keywords and identifiers", "Intrinsic functions", "Extended and user defined functions", 0, }; /***************************************/ static void ColouriseFortranDocFreeFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, false); } /***************************************/ static void ColouriseFortranDocFixFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, true); } /***************************************/ static void FoldFortranDocFreeFormat(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) { FoldFortranDoc(startPos, length, initStyle,styler, false); } /***************************************/ static void FoldFortranDocFixFormat(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) { FoldFortranDoc(startPos, length, initStyle,styler, true); } /***************************************/ LexerModule lmFortran(SCLEX_FORTRAN, ColouriseFortranDocFreeFormat, "fortran", FoldFortranDocFreeFormat, FortranWordLists); LexerModule lmF77(SCLEX_F77, ColouriseFortranDocFixFormat, "f77", FoldFortranDocFixFormat, FortranWordLists); tora-2.1.3/src/qscintilla2/src/LexRebol.cpp0000644000175000017500000002462411213435521020300 0ustar michaelmichael// Scintilla source code edit control /** @file LexRebol.cxx ** Lexer for REBOL. ** Written by Pascal Hurni, inspired from LexLua by Paul Winwood & Marcos E. Wurzius & Philippe Lhoste ** ** History: ** 2005-04-07 First release. ** 2005-04-10 Closing parens and brackets go now in default style ** String and comment nesting should be more safe **/ // Copyright 2005 by Pascal Hurni // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #include "StyleContext.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsAWordChar(const int ch) { return (isalnum(ch) || ch == '?' || ch == '!' || ch == '.' || ch == '\'' || ch == '+' || ch == '-' || ch == '*' || ch == '&' || ch == '|' || ch == '=' || ch == '_' || ch == '~'); } static inline bool IsAWordStart(const int ch, const int ch2) { return ((ch == '+' || ch == '-' || ch == '.') && !isdigit(ch2)) || (isalpha(ch) || ch == '?' || ch == '!' || ch == '\'' || ch == '*' || ch == '&' || ch == '|' || ch == '=' || ch == '_' || ch == '~'); } static inline bool IsAnOperator(const int ch, const int ch2, const int ch3) { // One char operators if (IsASpaceOrTab(ch2)) { return ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '<' || ch == '>' || ch == '=' || ch == '?'; } // Two char operators if (IsASpaceOrTab(ch3)) { return (ch == '*' && ch2 == '*') || (ch == '/' && ch2 == '/') || (ch == '<' && (ch2 == '=' || ch2 == '>')) || (ch == '>' && ch2 == '=') || (ch == '=' && (ch2 == '=' || ch2 == '?')) || (ch == '?' && ch2 == '?'); } return false; } static inline bool IsBinaryStart(const int ch, const int ch2, const int ch3, const int ch4) { return (ch == '#' && ch2 == '{') || (IsADigit(ch) && ch2 == '#' && ch3 == '{' ) || (IsADigit(ch) && IsADigit(ch2) && ch3 == '#' && ch4 == '{' ); } static void ColouriseRebolDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; WordList &keywords3 = *keywordlists[2]; WordList &keywords4 = *keywordlists[3]; WordList &keywords5 = *keywordlists[4]; WordList &keywords6 = *keywordlists[5]; WordList &keywords7 = *keywordlists[6]; WordList &keywords8 = *keywordlists[7]; int currentLine = styler.GetLine(startPos); // Initialize the braced string {.. { ... } ..} nesting level, if we are inside such a string. int stringLevel = 0; if (initStyle == SCE_REBOL_BRACEDSTRING || initStyle == SCE_REBOL_COMMENTBLOCK) { stringLevel = styler.GetLineState(currentLine - 1); } bool blockComment = initStyle == SCE_REBOL_COMMENTBLOCK; int dotCount = 0; // Do not leak onto next line if (initStyle == SCE_REBOL_COMMENTLINE) { initStyle = SCE_REBOL_DEFAULT; } StyleContext sc(startPos, length, initStyle, styler); if (startPos == 0) { sc.SetState(SCE_REBOL_PREFACE); } for (; sc.More(); sc.Forward()) { //--- What to do at line end ? if (sc.atLineEnd) { // Can be either inside a {} string or simply at eol if (sc.state != SCE_REBOL_BRACEDSTRING && sc.state != SCE_REBOL_COMMENTBLOCK && sc.state != SCE_REBOL_BINARY && sc.state != SCE_REBOL_PREFACE) sc.SetState(SCE_REBOL_DEFAULT); // Update the line state, so it can be seen by next line currentLine = styler.GetLine(sc.currentPos); switch (sc.state) { case SCE_REBOL_BRACEDSTRING: case SCE_REBOL_COMMENTBLOCK: // Inside a braced string, we set the line state styler.SetLineState(currentLine, stringLevel); break; default: // Reset the line state styler.SetLineState(currentLine, 0); break; } // continue with next char continue; } //--- What to do on white-space ? if (IsASpaceOrTab(sc.ch)) { // Return to default if any of these states if (sc.state == SCE_REBOL_OPERATOR || sc.state == SCE_REBOL_CHARACTER || sc.state == SCE_REBOL_NUMBER || sc.state == SCE_REBOL_PAIR || sc.state == SCE_REBOL_TUPLE || sc.state == SCE_REBOL_FILE || sc.state == SCE_REBOL_DATE || sc.state == SCE_REBOL_TIME || sc.state == SCE_REBOL_MONEY || sc.state == SCE_REBOL_ISSUE || sc.state == SCE_REBOL_URL || sc.state == SCE_REBOL_EMAIL) { sc.SetState(SCE_REBOL_DEFAULT); } } //--- Specialize state ? // URL, Email look like identifier if (sc.state == SCE_REBOL_IDENTIFIER) { if (sc.ch == ':' && !IsASpace(sc.chNext)) { sc.ChangeState(SCE_REBOL_URL); } else if (sc.ch == '@') { sc.ChangeState(SCE_REBOL_EMAIL); } else if (sc.ch == '$') { sc.ChangeState(SCE_REBOL_MONEY); } } // Words look like identifiers if (sc.state == SCE_REBOL_IDENTIFIER || (sc.state >= SCE_REBOL_WORD && sc.state <= SCE_REBOL_WORD8)) { // Keywords ? if (!IsAWordChar(sc.ch) || sc.Match('/')) { char s[100]; sc.GetCurrentLowered(s, sizeof(s)); blockComment = strcmp(s, "comment") == 0; if (keywords8.InList(s)) { sc.ChangeState(SCE_REBOL_WORD8); } else if (keywords7.InList(s)) { sc.ChangeState(SCE_REBOL_WORD7); } else if (keywords6.InList(s)) { sc.ChangeState(SCE_REBOL_WORD6); } else if (keywords5.InList(s)) { sc.ChangeState(SCE_REBOL_WORD5); } else if (keywords4.InList(s)) { sc.ChangeState(SCE_REBOL_WORD4); } else if (keywords3.InList(s)) { sc.ChangeState(SCE_REBOL_WORD3); } else if (keywords2.InList(s)) { sc.ChangeState(SCE_REBOL_WORD2); } else if (keywords.InList(s)) { sc.ChangeState(SCE_REBOL_WORD); } // Keep same style if there are refinements if (!sc.Match('/')) { sc.SetState(SCE_REBOL_DEFAULT); } } // special numbers } else if (sc.state == SCE_REBOL_NUMBER) { switch (sc.ch) { case 'x': sc.ChangeState(SCE_REBOL_PAIR); break; case ':': sc.ChangeState(SCE_REBOL_TIME); break; case '-': case '/': sc.ChangeState(SCE_REBOL_DATE); break; case '.': if (++dotCount >= 2) sc.ChangeState(SCE_REBOL_TUPLE); break; } } //--- Determine if the current state should terminate if (sc.state == SCE_REBOL_QUOTEDSTRING || sc.state == SCE_REBOL_CHARACTER) { if (sc.ch == '^' && sc.chNext == '\"') { sc.Forward(); } else if (sc.ch == '\"') { sc.ForwardSetState(SCE_REBOL_DEFAULT); } } else if (sc.state == SCE_REBOL_BRACEDSTRING || sc.state == SCE_REBOL_COMMENTBLOCK) { if (sc.ch == '}') { if (--stringLevel == 0) { sc.ForwardSetState(SCE_REBOL_DEFAULT); } } else if (sc.ch == '{') { stringLevel++; } } else if (sc.state == SCE_REBOL_BINARY) { if (sc.ch == '}') { sc.ForwardSetState(SCE_REBOL_DEFAULT); } } else if (sc.state == SCE_REBOL_TAG) { if (sc.ch == '>') { sc.ForwardSetState(SCE_REBOL_DEFAULT); } } else if (sc.state == SCE_REBOL_PREFACE) { if (sc.MatchIgnoreCase("rebol")) { int i; for (i=5; IsASpaceOrTab(styler.SafeGetCharAt(sc.currentPos+i, 0)); i++); if (sc.GetRelative(i) == '[') sc.SetState(SCE_REBOL_DEFAULT); } } //--- Parens and bracket changes to default style when the current is a number if (sc.state == SCE_REBOL_NUMBER || sc.state == SCE_REBOL_PAIR || sc.state == SCE_REBOL_TUPLE || sc.state == SCE_REBOL_MONEY || sc.state == SCE_REBOL_ISSUE || sc.state == SCE_REBOL_EMAIL || sc.state == SCE_REBOL_URL || sc.state == SCE_REBOL_DATE || sc.state == SCE_REBOL_TIME) { if (sc.ch == '(' || sc.ch == '[' || sc.ch == ')' || sc.ch == ']') { sc.SetState(SCE_REBOL_DEFAULT); } } //--- Determine if a new state should be entered. if (sc.state == SCE_REBOL_DEFAULT) { if (IsAnOperator(sc.ch, sc.chNext, sc.GetRelative(2))) { sc.SetState(SCE_REBOL_OPERATOR); } else if (IsBinaryStart(sc.ch, sc.chNext, sc.GetRelative(2), sc.GetRelative(3))) { sc.SetState(SCE_REBOL_BINARY); } else if (IsAWordStart(sc.ch, sc.chNext)) { sc.SetState(SCE_REBOL_IDENTIFIER); } else if (IsADigit(sc.ch) || sc.ch == '+' || sc.ch == '-' || /*Decimal*/ sc.ch == '.' || sc.ch == ',') { dotCount = 0; sc.SetState(SCE_REBOL_NUMBER); } else if (sc.ch == '\"') { sc.SetState(SCE_REBOL_QUOTEDSTRING); } else if (sc.ch == '{') { sc.SetState(blockComment ? SCE_REBOL_COMMENTBLOCK : SCE_REBOL_BRACEDSTRING); ++stringLevel; } else if (sc.ch == ';') { sc.SetState(SCE_REBOL_COMMENTLINE); } else if (sc.ch == '$') { sc.SetState(SCE_REBOL_MONEY); } else if (sc.ch == '%') { sc.SetState(SCE_REBOL_FILE); } else if (sc.ch == '<') { sc.SetState(SCE_REBOL_TAG); } else if (sc.ch == '#' && sc.chNext == '"') { sc.SetState(SCE_REBOL_CHARACTER); sc.Forward(); } else if (sc.ch == '#' && sc.chNext != '"' && sc.chNext != '{' ) { sc.SetState(SCE_REBOL_ISSUE); } } } sc.Complete(); } static void FoldRebolDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[], Accessor &styler) { unsigned int lengthDoc = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; int levelCurrent = levelPrev; char chNext = styler[startPos]; int styleNext = styler.StyleAt(startPos); for (unsigned int i = startPos; i < lengthDoc; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); int style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if (style == SCE_REBOL_DEFAULT) { if (ch == '[') { levelCurrent++; } else if (ch == ']') { levelCurrent--; } } if (atEOL) { int lev = levelPrev; if (visibleChars == 0) lev |= SC_FOLDLEVELWHITEFLAG; if ((levelCurrent > levelPrev) && (visibleChars > 0)) lev |= SC_FOLDLEVELHEADERFLAG; if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } lineCurrent++; levelPrev = levelCurrent; visibleChars = 0; } if (!isspacechar(ch)) visibleChars++; } // Fill in the real level of the next line, keeping the current flags as they will be filled in later int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; styler.SetLevel(lineCurrent, levelPrev | flagsNext); } static const char * const rebolWordListDesc[] = { "Keywords", 0 }; LexerModule lmREBOL(SCLEX_REBOL, ColouriseRebolDoc, "rebol", FoldRebolDoc, rebolWordListDesc); tora-2.1.3/src/qscintilla2/src/CharacterSet.h0000644000175000017500000000267511213435521020603 0ustar michaelmichael// Scintilla source code edit control /** @file CharacterSet.h ** Encapsulates a set of characters. Used to test if a character is within a set. **/ // Copyright 2007 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. class CharacterSet { int size; bool valueAfter; bool *bset; public: enum setBase { setNone=0, setLower=1, setUpper=2, setDigits=4, setAlpha=setLower|setUpper, setAlphaNum=setAlpha|setDigits }; CharacterSet(setBase base=setNone, const char *initialSet="", int size_=0x80, bool valueAfter_=false) { size = size_; valueAfter = valueAfter_; bset = new bool[size]; for (int i=0; i < size; i++) { bset[i] = false; } AddString(initialSet); if (base & setLower) AddString("abcdefghijklmnopqrstuvwxyz"); if (base & setUpper) AddString("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); if (base & setDigits) AddString("0123456789"); } ~CharacterSet() { delete []bset; bset = 0; size = 0; } void Add(int val) { PLATFORM_ASSERT(val >= 0); PLATFORM_ASSERT(val < size); bset[val] = true; } void AddString(const char *CharacterSet) { for (const char *cp=CharacterSet; *cp; cp++) { int val = static_cast(*cp); PLATFORM_ASSERT(val >= 0); PLATFORM_ASSERT(val < size); bset[val] = true; } } bool Contains(int val) const { PLATFORM_ASSERT(val >= 0); return (val < size) ? bset[val] : valueAfter; } }; tora-2.1.3/src/qscintilla2/src/Document.cpp0000644000175000017500000014030211213435521020332 0ustar michaelmichael// Scintilla source code edit control /** @file Document.cxx ** Text document that handles notifications, DBCS, styling, words and end of line. **/ // Copyright 1998-2003 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include "Platform.h" #include "Scintilla.h" #include "SplitVector.h" #include "Partitioning.h" #include "RunStyles.h" #include "CellBuffer.h" #include "PerLine.h" #include "CharClassify.h" #include "Decoration.h" #include "Document.h" #include "RESearch.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif // This is ASCII specific but is safe with chars >= 0x80 static inline bool isspacechar(unsigned char ch) { return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); } static inline bool IsPunctuation(char ch) { return isascii(ch) && ispunct(ch); } static inline bool IsADigit(char ch) { return isascii(ch) && isdigit(ch); } static inline bool IsLowerCase(char ch) { return isascii(ch) && islower(ch); } static inline bool IsUpperCase(char ch) { return isascii(ch) && isupper(ch); } Document::Document() { refCount = 0; #ifdef unix eolMode = SC_EOL_LF; #else eolMode = SC_EOL_CRLF; #endif dbcsCodePage = 0; stylingBits = 5; stylingBitsMask = 0x1F; stylingMask = 0; endStyled = 0; styleClock = 0; enteredModification = 0; enteredStyling = 0; enteredReadOnlyCount = 0; tabInChars = 8; indentInChars = 0; actualIndentInChars = 8; useTabs = true; tabIndents = true; backspaceUnindents = false; watchers = 0; lenWatchers = 0; matchesValid = false; regex = 0; perLineData[ldMarkers] = new LineMarkers(); perLineData[ldLevels] = new LineLevels(); perLineData[ldState] = new LineState(); perLineData[ldMargin] = new LineAnnotation(); perLineData[ldAnnotation] = new LineAnnotation(); cb.SetPerLine(this); } Document::~Document() { for (int i = 0; i < lenWatchers; i++) { watchers[i].watcher->NotifyDeleted(this, watchers[i].userData); } delete []watchers; for (int j=0; jInsertLine(line); } } void Document::RemoveLine(int line) { for (int j=0; jRemoveLine(line); } } // Increase reference count and return its previous value. int Document::AddRef() { return refCount++; } // Decrease reference count and return its previous value. // Delete the document if reference count reaches zero. int Document::Release() { int curRefCount = --refCount; if (curRefCount == 0) delete this; return curRefCount; } void Document::SetSavePoint() { cb.SetSavePoint(); NotifySavePoint(true); } int Document::GetMark(int line) { return static_cast(perLineData[ldMarkers])->MarkValue(line); } int Document::AddMark(int line, int markerNum) { if (line <= LinesTotal()) { int prev = static_cast(perLineData[ldMarkers])-> AddMark(line, markerNum, LinesTotal()); DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); NotifyModified(mh); return prev; } else { return 0; } } void Document::AddMarkSet(int line, int valueSet) { unsigned int m = valueSet; for (int i = 0; m; i++, m >>= 1) if (m & 1) static_cast(perLineData[ldMarkers])-> AddMark(line, i, LinesTotal()); DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); NotifyModified(mh); } void Document::DeleteMark(int line, int markerNum) { static_cast(perLineData[ldMarkers])->DeleteMark(line, markerNum, false); DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); NotifyModified(mh); } void Document::DeleteMarkFromHandle(int markerHandle) { static_cast(perLineData[ldMarkers])->DeleteMarkFromHandle(markerHandle); DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); mh.line = -1; NotifyModified(mh); } void Document::DeleteAllMarks(int markerNum) { for (int line = 0; line < LinesTotal(); line++) { static_cast(perLineData[ldMarkers])->DeleteMark(line, markerNum, true); } DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); mh.line = -1; NotifyModified(mh); } int Document::LineFromHandle(int markerHandle) { return static_cast(perLineData[ldMarkers])->LineFromHandle(markerHandle); } int Document::LineStart(int line) const { return cb.LineStart(line); } int Document::LineEnd(int line) const { if (line == LinesTotal() - 1) { return LineStart(line + 1); } else { int position = LineStart(line + 1) - 1; // When line terminator is CR+LF, may need to go back one more if ((position > LineStart(line)) && (cb.CharAt(position - 1) == '\r')) { position--; } return position; } } int Document::LineFromPosition(int pos) { return cb.LineFromPosition(pos); } int Document::LineEndPosition(int position) { return LineEnd(LineFromPosition(position)); } int Document::VCHomePosition(int position) { int line = LineFromPosition(position); int startPosition = LineStart(line); int endLine = LineEnd(line); int startText = startPosition; while (startText < endLine && (cb.CharAt(startText) == ' ' || cb.CharAt(startText) == '\t' ) ) startText++; if (position == startText) return startPosition; else return startText; } int Document::SetLevel(int line, int level) { int prev = static_cast(perLineData[ldLevels])->SetLevel(line, level, LinesTotal()); if (prev != level) { DocModification mh(SC_MOD_CHANGEFOLD | SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); mh.foldLevelNow = level; mh.foldLevelPrev = prev; NotifyModified(mh); } return prev; } int Document::GetLevel(int line) { return static_cast(perLineData[ldLevels])->GetLevel(line); } void Document::ClearLevels() { static_cast(perLineData[ldLevels])->ClearLevels(); } static bool IsSubordinate(int levelStart, int levelTry) { if (levelTry & SC_FOLDLEVELWHITEFLAG) return true; else return (levelStart & SC_FOLDLEVELNUMBERMASK) < (levelTry & SC_FOLDLEVELNUMBERMASK); } int Document::GetLastChild(int lineParent, int level) { if (level == -1) level = GetLevel(lineParent) & SC_FOLDLEVELNUMBERMASK; int maxLine = LinesTotal(); int lineMaxSubord = lineParent; while (lineMaxSubord < maxLine - 1) { EnsureStyledTo(LineStart(lineMaxSubord + 2)); if (!IsSubordinate(level, GetLevel(lineMaxSubord + 1))) break; lineMaxSubord++; } if (lineMaxSubord > lineParent) { if (level > (GetLevel(lineMaxSubord + 1) & SC_FOLDLEVELNUMBERMASK)) { // Have chewed up some whitespace that belongs to a parent so seek back if (GetLevel(lineMaxSubord) & SC_FOLDLEVELWHITEFLAG) { lineMaxSubord--; } } } return lineMaxSubord; } int Document::GetFoldParent(int line) { int level = GetLevel(line) & SC_FOLDLEVELNUMBERMASK; int lineLook = line - 1; while ((lineLook > 0) && ( (!(GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG)) || ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) >= level)) ) { lineLook--; } if ((GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG) && ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) < level)) { return lineLook; } else { return -1; } } int Document::ClampPositionIntoDocument(int pos) { return Platform::Clamp(pos, 0, Length()); } bool Document::IsCrLf(int pos) { if (pos < 0) return false; if (pos >= (Length() - 1)) return false; return (cb.CharAt(pos) == '\r') && (cb.CharAt(pos + 1) == '\n'); } static const int maxBytesInDBCSCharacter=5; int Document::LenChar(int pos) { if (pos < 0) { return 1; } else if (IsCrLf(pos)) { return 2; } else if (SC_CP_UTF8 == dbcsCodePage) { unsigned char ch = static_cast(cb.CharAt(pos)); if (ch < 0x80) return 1; int len = 2; if (ch >= (0x80 + 0x40 + 0x20 + 0x10)) len = 4; else if (ch >= (0x80 + 0x40 + 0x20)) len = 3; int lengthDoc = Length(); if ((pos + len) > lengthDoc) return lengthDoc -pos; else return len; } else if (dbcsCodePage) { char mbstr[maxBytesInDBCSCharacter+1]; int i; for (i=0; i= 0x80) && (ch < (0x80 + 0x40)); } static int BytesFromLead(int leadByte) { if (leadByte > 0xF4) { // Characters longer than 4 bytes not possible in current UTF-8 return 0; } else if (leadByte >= 0xF0) { return 4; } else if (leadByte >= 0xE0) { return 3; } else if (leadByte >= 0xC2) { return 2; } return 0; } bool Document::InGoodUTF8(int pos, int &start, int &end) { int lead = pos; while ((lead>0) && (pos-lead < 4) && IsTrailByte(static_cast(cb.CharAt(lead-1)))) lead--; start = 0; if (lead > 0) { start = lead-1; } int leadByte = static_cast(cb.CharAt(start)); int bytes = BytesFromLead(leadByte); if (bytes == 0) { return false; } else { int trailBytes = bytes - 1; int len = pos - lead + 1; if (len > trailBytes) // pos too far from lead return false; // Check that there are enough trails for this lead int trail = pos + 1; while ((trail-lead(cb.CharAt(trail)))) { return false; } trail++; } end = start + bytes; return true; } } // Normalise a position so that it is not halfway through a two byte character. // This can occur in two situations - // When lines are terminated with \r\n pairs which should be treated as one character. // When displaying DBCS text such as Japanese. // If moving, move the position in the indicated direction. int Document::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) { //Platform::DebugPrintf("NoCRLF %d %d\n", pos, moveDir); // If out of range, just return minimum/maximum value. if (pos <= 0) return 0; if (pos >= Length()) return Length(); // PLATFORM_ASSERT(pos > 0 && pos < Length()); if (checkLineEnd && IsCrLf(pos - 1)) { if (moveDir > 0) return pos + 1; else return pos - 1; } // Not between CR and LF if (dbcsCodePage) { if (SC_CP_UTF8 == dbcsCodePage) { unsigned char ch = static_cast(cb.CharAt(pos)); int startUTF = pos; int endUTF = pos; if (IsTrailByte(ch) && InGoodUTF8(pos, startUTF, endUTF)) { // ch is a trail byte within a UTF-8 character if (moveDir > 0) pos = endUTF; else pos = startUTF; } } else { // Anchor DBCS calculations at start of line because start of line can // not be a DBCS trail byte. int posCheck = LineStart(LineFromPosition(pos)); while (posCheck < pos) { char mbstr[maxBytesInDBCSCharacter+1]; int i; for(i=0;i pos) { if (moveDir > 0) { return posCheck + mbsize; } else { return posCheck; } } posCheck += mbsize; } } } return pos; } void Document::ModifiedAt(int pos) { if (endStyled > pos) endStyled = pos; } void Document::CheckReadOnly() { if (cb.IsReadOnly() && enteredReadOnlyCount == 0) { enteredReadOnlyCount++; NotifyModifyAttempt(); enteredReadOnlyCount--; } } // Document only modified by gateways DeleteChars, InsertString, Undo, Redo, and SetStyleAt. // SetStyleAt does not change the persistent state of a document bool Document::DeleteChars(int pos, int len) { if (len == 0) return false; if ((pos + len) > Length()) return false; CheckReadOnly(); if (enteredModification != 0) { return false; } else { enteredModification++; if (!cb.IsReadOnly()) { NotifyModified( DocModification( SC_MOD_BEFOREDELETE | SC_PERFORMED_USER, pos, len, 0, 0)); int prevLinesTotal = LinesTotal(); bool startSavePoint = cb.IsSavePoint(); bool startSequence = false; const char *text = cb.DeleteChars(pos, len, startSequence); if (startSavePoint && cb.IsCollectingUndo()) NotifySavePoint(!startSavePoint); if ((pos < Length()) || (pos == 0)) ModifiedAt(pos); else ModifiedAt(pos-1); NotifyModified( DocModification( SC_MOD_DELETETEXT | SC_PERFORMED_USER | (startSequence?SC_STARTACTION:0), pos, len, LinesTotal() - prevLinesTotal, text)); } enteredModification--; } return !cb.IsReadOnly(); } /** * Insert a string with a length. */ bool Document::InsertString(int position, const char *s, int insertLength) { if (insertLength <= 0) { return false; } CheckReadOnly(); if (enteredModification != 0) { return false; } else { enteredModification++; if (!cb.IsReadOnly()) { NotifyModified( DocModification( SC_MOD_BEFOREINSERT | SC_PERFORMED_USER, position, insertLength, 0, s)); int prevLinesTotal = LinesTotal(); bool startSavePoint = cb.IsSavePoint(); bool startSequence = false; const char *text = cb.InsertString(position, s, insertLength, startSequence); if (startSavePoint && cb.IsCollectingUndo()) NotifySavePoint(!startSavePoint); ModifiedAt(position); NotifyModified( DocModification( SC_MOD_INSERTTEXT | SC_PERFORMED_USER | (startSequence?SC_STARTACTION:0), position, insertLength, LinesTotal() - prevLinesTotal, text)); } enteredModification--; } return !cb.IsReadOnly(); } int Document::Undo() { int newPos = -1; CheckReadOnly(); if (enteredModification == 0) { enteredModification++; if (!cb.IsReadOnly()) { bool startSavePoint = cb.IsSavePoint(); bool multiLine = false; int steps = cb.StartUndo(); //Platform::DebugPrintf("Steps=%d\n", steps); for (int step = 0; step < steps; step++) { const int prevLinesTotal = LinesTotal(); const Action &action = cb.GetUndoStep(); if (action.at == removeAction) { NotifyModified(DocModification( SC_MOD_BEFOREINSERT | SC_PERFORMED_UNDO, action)); } else if (action.at == containerAction) { DocModification dm(SC_MOD_CONTAINER | SC_PERFORMED_UNDO); dm.token = action.position; NotifyModified(dm); } else { NotifyModified(DocModification( SC_MOD_BEFOREDELETE | SC_PERFORMED_UNDO, action)); } cb.PerformUndoStep(); int cellPosition = action.position; if (action.at != containerAction) { ModifiedAt(cellPosition); newPos = cellPosition; } int modFlags = SC_PERFORMED_UNDO; // With undo, an insertion action becomes a deletion notification if (action.at == removeAction) { newPos += action.lenData; modFlags |= SC_MOD_INSERTTEXT; } else if (action.at == insertAction) { modFlags |= SC_MOD_DELETETEXT; } if (steps > 1) modFlags |= SC_MULTISTEPUNDOREDO; const int linesAdded = LinesTotal() - prevLinesTotal; if (linesAdded != 0) multiLine = true; if (step == steps - 1) { modFlags |= SC_LASTSTEPINUNDOREDO; if (multiLine) modFlags |= SC_MULTILINEUNDOREDO; } NotifyModified(DocModification(modFlags, cellPosition, action.lenData, linesAdded, action.data)); } bool endSavePoint = cb.IsSavePoint(); if (startSavePoint != endSavePoint) NotifySavePoint(endSavePoint); } enteredModification--; } return newPos; } int Document::Redo() { int newPos = -1; CheckReadOnly(); if (enteredModification == 0) { enteredModification++; if (!cb.IsReadOnly()) { bool startSavePoint = cb.IsSavePoint(); bool multiLine = false; int steps = cb.StartRedo(); for (int step = 0; step < steps; step++) { const int prevLinesTotal = LinesTotal(); const Action &action = cb.GetRedoStep(); if (action.at == insertAction) { NotifyModified(DocModification( SC_MOD_BEFOREINSERT | SC_PERFORMED_REDO, action)); } else if (action.at == containerAction) { DocModification dm(SC_MOD_CONTAINER | SC_PERFORMED_REDO); dm.token = action.position; NotifyModified(dm); } else { NotifyModified(DocModification( SC_MOD_BEFOREDELETE | SC_PERFORMED_REDO, action)); } cb.PerformRedoStep(); if (action.at != containerAction) { ModifiedAt(action.position); newPos = action.position; } int modFlags = SC_PERFORMED_REDO; if (action.at == insertAction) { newPos += action.lenData; modFlags |= SC_MOD_INSERTTEXT; } else if (action.at == removeAction) { modFlags |= SC_MOD_DELETETEXT; } if (steps > 1) modFlags |= SC_MULTISTEPUNDOREDO; const int linesAdded = LinesTotal() - prevLinesTotal; if (linesAdded != 0) multiLine = true; if (step == steps - 1) { modFlags |= SC_LASTSTEPINUNDOREDO; if (multiLine) modFlags |= SC_MULTILINEUNDOREDO; } NotifyModified( DocModification(modFlags, action.position, action.lenData, linesAdded, action.data)); } bool endSavePoint = cb.IsSavePoint(); if (startSavePoint != endSavePoint) NotifySavePoint(endSavePoint); } enteredModification--; } return newPos; } /** * Insert a single character. */ bool Document::InsertChar(int pos, char ch) { char chs[1]; chs[0] = ch; return InsertString(pos, chs, 1); } /** * Insert a null terminated string. */ bool Document::InsertCString(int position, const char *s) { return InsertString(position, s, strlen(s)); } void Document::ChangeChar(int pos, char ch) { DeleteChars(pos, 1); InsertChar(pos, ch); } void Document::DelChar(int pos) { DeleteChars(pos, LenChar(pos)); } void Document::DelCharBack(int pos) { if (pos <= 0) { return; } else if (IsCrLf(pos - 2)) { DeleteChars(pos - 2, 2); } else if (dbcsCodePage) { int startChar = MovePositionOutsideChar(pos - 1, -1, false); DeleteChars(startChar, pos - startChar); } else { DeleteChars(pos - 1, 1); } } static bool isindentchar(char ch) { return (ch == ' ') || (ch == '\t'); } static int NextTab(int pos, int tabSize) { return ((pos / tabSize) + 1) * tabSize; } static void CreateIndentation(char *linebuf, int length, int indent, int tabSize, bool insertSpaces) { length--; // ensure space for \0 if (!insertSpaces) { while ((indent >= tabSize) && (length > 0)) { *linebuf++ = '\t'; indent -= tabSize; length--; } } while ((indent > 0) && (length > 0)) { *linebuf++ = ' '; indent--; length--; } *linebuf = '\0'; } int Document::GetLineIndentation(int line) { int indent = 0; if ((line >= 0) && (line < LinesTotal())) { int lineStart = LineStart(line); int length = Length(); for (int i = lineStart;i < length;i++) { char ch = cb.CharAt(i); if (ch == ' ') indent++; else if (ch == '\t') indent = NextTab(indent, tabInChars); else return indent; } } return indent; } void Document::SetLineIndentation(int line, int indent) { int indentOfLine = GetLineIndentation(line); if (indent < 0) indent = 0; if (indent != indentOfLine) { char linebuf[1000]; CreateIndentation(linebuf, sizeof(linebuf), indent, tabInChars, !useTabs); int thisLineStart = LineStart(line); int indentPos = GetLineIndentPosition(line); BeginUndoAction(); DeleteChars(thisLineStart, indentPos - thisLineStart); InsertCString(thisLineStart, linebuf); EndUndoAction(); } } int Document::GetLineIndentPosition(int line) const { if (line < 0) return 0; int pos = LineStart(line); int length = Length(); while ((pos < length) && isindentchar(cb.CharAt(pos))) { pos++; } return pos; } int Document::GetColumn(int pos) { int column = 0; int line = LineFromPosition(pos); if ((line >= 0) && (line < LinesTotal())) { for (int i = LineStart(line);i < pos;) { char ch = cb.CharAt(i); if (ch == '\t') { column = NextTab(column, tabInChars); i++; } else if (ch == '\r') { return column; } else if (ch == '\n') { return column; } else if (i >= Length()) { return column; } else { column++; i = MovePositionOutsideChar(i + 1, 1, false); } } } return column; } int Document::FindColumn(int line, int column) { int position = LineStart(line); int columnCurrent = 0; if ((line >= 0) && (line < LinesTotal())) { while ((columnCurrent < column) && (position < Length())) { char ch = cb.CharAt(position); if (ch == '\t') { columnCurrent = NextTab(columnCurrent, tabInChars); position++; } else if (ch == '\r') { return position; } else if (ch == '\n') { return position; } else { columnCurrent++; position = MovePositionOutsideChar(position + 1, 1, false); } } } return position; } void Document::Indent(bool forwards, int lineBottom, int lineTop) { // Dedent - suck white space off the front of the line to dedent by equivalent of a tab for (int line = lineBottom; line >= lineTop; line--) { int indentOfLine = GetLineIndentation(line); if (forwards) { if (LineStart(line) < LineEnd(line)) { SetLineIndentation(line, indentOfLine + IndentSize()); } } else { SetLineIndentation(line, indentOfLine - IndentSize()); } } } // Convert line endings for a piece of text to a particular mode. // Stop at len or when a NUL is found. // Caller must delete the returned pointer. char *Document::TransformLineEnds(int *pLenOut, const char *s, size_t len, int eolMode) { char *dest = new char[2 * len + 1]; const char *sptr = s; char *dptr = dest; for (size_t i = 0; (i < len) && (*sptr != '\0'); i++) { if (*sptr == '\n' || *sptr == '\r') { if (eolMode == SC_EOL_CR) { *dptr++ = '\r'; } else if (eolMode == SC_EOL_LF) { *dptr++ = '\n'; } else { // eolMode == SC_EOL_CRLF *dptr++ = '\r'; *dptr++ = '\n'; } if ((*sptr == '\r') && (i+1 < len) && (*(sptr+1) == '\n')) { i++; sptr++; } sptr++; } else { *dptr++ = *sptr++; } } *dptr++ = '\0'; *pLenOut = (dptr - dest) - 1; return dest; } void Document::ConvertLineEnds(int eolModeSet) { BeginUndoAction(); for (int pos = 0; pos < Length(); pos++) { if (cb.CharAt(pos) == '\r') { if (cb.CharAt(pos + 1) == '\n') { // CRLF if (eolModeSet == SC_EOL_CR) { DeleteChars(pos + 1, 1); // Delete the LF } else if (eolModeSet == SC_EOL_LF) { DeleteChars(pos, 1); // Delete the CR } else { pos++; } } else { // CR if (eolModeSet == SC_EOL_CRLF) { InsertString(pos + 1, "\n", 1); // Insert LF pos++; } else if (eolModeSet == SC_EOL_LF) { InsertString(pos, "\n", 1); // Insert LF DeleteChars(pos + 1, 1); // Delete CR } } } else if (cb.CharAt(pos) == '\n') { // LF if (eolModeSet == SC_EOL_CRLF) { InsertString(pos, "\r", 1); // Insert CR pos++; } else if (eolModeSet == SC_EOL_CR) { InsertString(pos, "\r", 1); // Insert CR DeleteChars(pos + 1, 1); // Delete LF } } } EndUndoAction(); } bool Document::IsWhiteLine(int line) const { int currentChar = LineStart(line); int endLine = LineEnd(line); while (currentChar < endLine) { if (cb.CharAt(currentChar) != ' ' && cb.CharAt(currentChar) != '\t') { return false; } ++currentChar; } return true; } int Document::ParaUp(int pos) { int line = LineFromPosition(pos); line--; while (line >= 0 && IsWhiteLine(line)) { // skip empty lines line--; } while (line >= 0 && !IsWhiteLine(line)) { // skip non-empty lines line--; } line++; return LineStart(line); } int Document::ParaDown(int pos) { int line = LineFromPosition(pos); while (line < LinesTotal() && !IsWhiteLine(line)) { // skip non-empty lines line++; } while (line < LinesTotal() && IsWhiteLine(line)) { // skip empty lines line++; } if (line < LinesTotal()) return LineStart(line); else // end of a document return LineEnd(line-1); } CharClassify::cc Document::WordCharClass(unsigned char ch) { if ((SC_CP_UTF8 == dbcsCodePage) && (ch >= 0x80)) return CharClassify::ccWord; return charClass.GetClass(ch); } /** * Used by commmands that want to select whole words. * Finds the start of word at pos when delta < 0 or the end of the word when delta >= 0. */ int Document::ExtendWordSelect(int pos, int delta, bool onlyWordCharacters) { CharClassify::cc ccStart = CharClassify::ccWord; if (delta < 0) { if (!onlyWordCharacters) ccStart = WordCharClass(cb.CharAt(pos-1)); while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart)) pos--; } else { if (!onlyWordCharacters && pos < Length()) ccStart = WordCharClass(cb.CharAt(pos)); while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart)) pos++; } return MovePositionOutsideChar(pos, delta); } /** * Find the start of the next word in either a forward (delta >= 0) or backwards direction * (delta < 0). * This is looking for a transition between character classes although there is also some * additional movement to transit white space. * Used by cursor movement by word commands. */ int Document::NextWordStart(int pos, int delta) { if (delta < 0) { while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace)) pos--; if (pos > 0) { CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1)); while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart)) { pos--; } } } else { CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos)); while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart)) pos++; while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace)) pos++; } return pos; } /** * Find the end of the next word in either a forward (delta >= 0) or backwards direction * (delta < 0). * This is looking for a transition between character classes although there is also some * additional movement to transit white space. * Used by cursor movement by word commands. */ int Document::NextWordEnd(int pos, int delta) { if (delta < 0) { if (pos > 0) { CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1)); if (ccStart != CharClassify::ccSpace) { while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccStart) { pos--; } } while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace) { pos--; } } } else { while (pos < Length() && WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace) { pos++; } if (pos < Length()) { CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos)); while (pos < Length() && WordCharClass(cb.CharAt(pos)) == ccStart) { pos++; } } } return pos; } /** * Check that the character at the given position is a word or punctuation character and that * the previous character is of a different character class. */ bool Document::IsWordStartAt(int pos) { if (pos > 0) { CharClassify::cc ccPos = WordCharClass(CharAt(pos)); return (ccPos == CharClassify::ccWord || ccPos == CharClassify::ccPunctuation) && (ccPos != WordCharClass(CharAt(pos - 1))); } return true; } /** * Check that the character at the given position is a word or punctuation character and that * the next character is of a different character class. */ bool Document::IsWordEndAt(int pos) { if (pos < Length()) { CharClassify::cc ccPrev = WordCharClass(CharAt(pos-1)); return (ccPrev == CharClassify::ccWord || ccPrev == CharClassify::ccPunctuation) && (ccPrev != WordCharClass(CharAt(pos))); } return true; } /** * Check that the given range is has transitions between character classes at both * ends and where the characters on the inside are word or punctuation characters. */ bool Document::IsWordAt(int start, int end) { return IsWordStartAt(start) && IsWordEndAt(end); } // The comparison and case changing functions here assume ASCII // or extended ASCII such as the normal Windows code page. static inline char MakeUpperCase(char ch) { if (ch < 'a' || ch > 'z') return ch; else return static_cast(ch - 'a' + 'A'); } static inline char MakeLowerCase(char ch) { if (ch < 'A' || ch > 'Z') return ch; else return static_cast(ch - 'A' + 'a'); } /** * Find text in document, supporting both forward and backward * searches (just pass minPos > maxPos to do a backward search) * Has not been tested with backwards DBCS searches yet. */ long Document::FindText(int minPos, int maxPos, const char *s, bool caseSensitive, bool word, bool wordStart, bool regExp, int flags, int *length) { if (regExp) { if (!regex) regex = CreateRegexSearch(&charClass); return regex->FindText(this, minPos, maxPos, s, caseSensitive, word, wordStart, flags, length); } else { bool forward = minPos <= maxPos; int increment = forward ? 1 : -1; // Range endpoints should not be inside DBCS characters, but just in case, move them. int startPos = MovePositionOutsideChar(minPos, increment, false); int endPos = MovePositionOutsideChar(maxPos, increment, false); // Compute actual search ranges needed int lengthFind = *length; if (lengthFind == -1) lengthFind = static_cast(strlen(s)); int endSearch = endPos; if (startPos <= endPos) { endSearch = endPos - lengthFind + 1; } //Platform::DebugPrintf("Find %d %d %s %d\n", startPos, endPos, ft->lpstrText, lengthFind); char firstChar = s[0]; if (!caseSensitive) firstChar = static_cast(MakeUpperCase(firstChar)); int pos = forward ? startPos : (startPos - 1); while (forward ? (pos < endSearch) : (pos >= endSearch)) { char ch = CharAt(pos); if (caseSensitive) { if (ch == firstChar) { bool found = true; if (pos + lengthFind > Platform::Maximum(startPos, endPos)) found = false; for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) { ch = CharAt(pos + posMatch); if (ch != s[posMatch]) found = false; } if (found) { if ((!word && !wordStart) || (word && IsWordAt(pos, pos + lengthFind)) || (wordStart && IsWordStartAt(pos))) return pos; } } } else { if (MakeUpperCase(ch) == firstChar) { bool found = true; if (pos + lengthFind > Platform::Maximum(startPos, endPos)) found = false; for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) { ch = CharAt(pos + posMatch); if (MakeUpperCase(ch) != MakeUpperCase(s[posMatch])) found = false; } if (found) { if ((!word && !wordStart) || (word && IsWordAt(pos, pos + lengthFind)) || (wordStart && IsWordStartAt(pos))) return pos; } } } pos += increment; if (dbcsCodePage && (pos >= 0)) { // Ensure trying to match from start of character pos = MovePositionOutsideChar(pos, increment, false); } } } //Platform::DebugPrintf("Not found\n"); return -1; } const char *Document::SubstituteByPosition(const char *text, int *length) { return regex->SubstituteByPosition(this, text, length); } int Document::LinesTotal() const { return cb.Lines(); } void Document::ChangeCase(Range r, bool makeUpperCase) { for (int pos = r.start; pos < r.end;) { int len = LenChar(pos); if (len == 1) { char ch = CharAt(pos); if (makeUpperCase) { if (IsLowerCase(ch)) { ChangeChar(pos, static_cast(MakeUpperCase(ch))); } } else { if (IsUpperCase(ch)) { ChangeChar(pos, static_cast(MakeLowerCase(ch))); } } } pos += len; } } void Document::SetDefaultCharClasses(bool includeWordClass) { charClass.SetDefaultCharClasses(includeWordClass); } void Document::SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass) { charClass.SetCharClasses(chars, newCharClass); } void Document::SetStylingBits(int bits) { stylingBits = bits; stylingBitsMask = (1 << stylingBits) - 1; } void Document::StartStyling(int position, char mask) { stylingMask = mask; endStyled = position; } bool Document::SetStyleFor(int length, char style) { if (enteredStyling != 0) { return false; } else { enteredStyling++; style &= stylingMask; int prevEndStyled = endStyled; if (cb.SetStyleFor(endStyled, length, style, stylingMask)) { DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER, prevEndStyled, length); NotifyModified(mh); } endStyled += length; enteredStyling--; return true; } } bool Document::SetStyles(int length, const char *styles) { if (enteredStyling != 0) { return false; } else { enteredStyling++; bool didChange = false; int startMod = 0; int endMod = 0; for (int iPos = 0; iPos < length; iPos++, endStyled++) { PLATFORM_ASSERT(endStyled < Length()); if (cb.SetStyleAt(endStyled, styles[iPos], stylingMask)) { if (!didChange) { startMod = endStyled; } didChange = true; endMod = endStyled; } } if (didChange) { DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER, startMod, endMod - startMod + 1); NotifyModified(mh); } enteredStyling--; return true; } } void Document::EnsureStyledTo(int pos) { if ((enteredStyling == 0) && (pos > GetEndStyled())) { IncrementStyleClock(); // Ask the watchers to style, and stop as soon as one responds. for (int i = 0; pos > GetEndStyled() && i < lenWatchers; i++) { watchers[i].watcher->NotifyStyleNeeded(this, watchers[i].userData, pos); } } } int Document::SetLineState(int line, int state) { int statePrevious = static_cast(perLineData[ldState])->SetLineState(line, state); if (state != statePrevious) { DocModification mh(SC_MOD_CHANGELINESTATE, 0, 0, 0, 0, line); NotifyModified(mh); } return statePrevious; } int Document::GetLineState(int line) { return static_cast(perLineData[ldState])->GetLineState(line); } int Document::GetMaxLineState() { return static_cast(perLineData[ldState])->GetMaxLineState(); } StyledText Document::MarginStyledText(int line) { LineAnnotation *pla = static_cast(perLineData[ldMargin]); return StyledText(pla->Length(line), pla->Text(line), pla->MultipleStyles(line), pla->Style(line), pla->Styles(line)); } void Document::MarginSetText(int line, const char *text) { static_cast(perLineData[ldMargin])->SetText(line, text); DocModification mh(SC_MOD_CHANGEMARGIN, LineStart(line), 0, 0, 0, line); NotifyModified(mh); } void Document::MarginSetStyle(int line, int style) { static_cast(perLineData[ldMargin])->SetStyle(line, style); } void Document::MarginSetStyles(int line, const unsigned char *styles) { static_cast(perLineData[ldMargin])->SetStyles(line, styles); } int Document::MarginLength(int line) const { return static_cast(perLineData[ldMargin])->Length(line); } void Document::MarginClearAll() { int maxEditorLine = LinesTotal(); for (int l=0;l(perLineData[ldMargin])->ClearAll(); } bool Document::AnnotationAny() const { return static_cast(perLineData[ldAnnotation])->AnySet(); } StyledText Document::AnnotationStyledText(int line) { LineAnnotation *pla = static_cast(perLineData[ldAnnotation]); return StyledText(pla->Length(line), pla->Text(line), pla->MultipleStyles(line), pla->Style(line), pla->Styles(line)); } void Document::AnnotationSetText(int line, const char *text) { const int linesBefore = AnnotationLines(line); static_cast(perLineData[ldAnnotation])->SetText(line, text); const int linesAfter = AnnotationLines(line); DocModification mh(SC_MOD_CHANGEANNOTATION, LineStart(line), 0, 0, 0, line); mh.annotationLinesAdded = linesAfter - linesBefore; NotifyModified(mh); } void Document::AnnotationSetStyle(int line, int style) { static_cast(perLineData[ldAnnotation])->SetStyle(line, style); } void Document::AnnotationSetStyles(int line, const unsigned char *styles) { static_cast(perLineData[ldAnnotation])->SetStyles(line, styles); } int Document::AnnotationLength(int line) const { return static_cast(perLineData[ldAnnotation])->Length(line); } int Document::AnnotationLines(int line) const { return static_cast(perLineData[ldAnnotation])->Lines(line); } void Document::AnnotationClearAll() { int maxEditorLine = LinesTotal(); for (int l=0;l(perLineData[ldAnnotation])->ClearAll(); } void Document::IncrementStyleClock() { styleClock = (styleClock + 1) % 0x100000; } void Document::DecorationFillRange(int position, int value, int fillLength) { if (decorations.FillRange(position, value, fillLength)) { DocModification mh(SC_MOD_CHANGEINDICATOR | SC_PERFORMED_USER, position, fillLength); NotifyModified(mh); } } bool Document::AddWatcher(DocWatcher *watcher, void *userData) { for (int i = 0; i < lenWatchers; i++) { if ((watchers[i].watcher == watcher) && (watchers[i].userData == userData)) return false; } WatcherWithUserData *pwNew = new WatcherWithUserData[lenWatchers + 1]; if (!pwNew) return false; for (int j = 0; j < lenWatchers; j++) pwNew[j] = watchers[j]; pwNew[lenWatchers].watcher = watcher; pwNew[lenWatchers].userData = userData; delete []watchers; watchers = pwNew; lenWatchers++; return true; } bool Document::RemoveWatcher(DocWatcher *watcher, void *userData) { for (int i = 0; i < lenWatchers; i++) { if ((watchers[i].watcher == watcher) && (watchers[i].userData == userData)) { if (lenWatchers == 1) { delete []watchers; watchers = 0; lenWatchers = 0; } else { WatcherWithUserData *pwNew = new WatcherWithUserData[lenWatchers]; if (!pwNew) return false; for (int j = 0; j < lenWatchers - 1; j++) { pwNew[j] = (j < i) ? watchers[j] : watchers[j + 1]; } delete []watchers; watchers = pwNew; lenWatchers--; } return true; } } return false; } void Document::NotifyModifyAttempt() { for (int i = 0; i < lenWatchers; i++) { watchers[i].watcher->NotifyModifyAttempt(this, watchers[i].userData); } } void Document::NotifySavePoint(bool atSavePoint) { for (int i = 0; i < lenWatchers; i++) { watchers[i].watcher->NotifySavePoint(this, watchers[i].userData, atSavePoint); } } void Document::NotifyModified(DocModification mh) { if (mh.modificationType & SC_MOD_INSERTTEXT) { decorations.InsertSpace(mh.position, mh.length); } else if (mh.modificationType & SC_MOD_DELETETEXT) { decorations.DeleteRange(mh.position, mh.length); } for (int i = 0; i < lenWatchers; i++) { watchers[i].watcher->NotifyModified(this, mh, watchers[i].userData); } } bool Document::IsWordPartSeparator(char ch) { return (WordCharClass(ch) == CharClassify::ccWord) && IsPunctuation(ch); } int Document::WordPartLeft(int pos) { if (pos > 0) { --pos; char startChar = cb.CharAt(pos); if (IsWordPartSeparator(startChar)) { while (pos > 0 && IsWordPartSeparator(cb.CharAt(pos))) { --pos; } } if (pos > 0) { startChar = cb.CharAt(pos); --pos; if (IsLowerCase(startChar)) { while (pos > 0 && IsLowerCase(cb.CharAt(pos))) --pos; if (!IsUpperCase(cb.CharAt(pos)) && !IsLowerCase(cb.CharAt(pos))) ++pos; } else if (IsUpperCase(startChar)) { while (pos > 0 && IsUpperCase(cb.CharAt(pos))) --pos; if (!IsUpperCase(cb.CharAt(pos))) ++pos; } else if (IsADigit(startChar)) { while (pos > 0 && IsADigit(cb.CharAt(pos))) --pos; if (!IsADigit(cb.CharAt(pos))) ++pos; } else if (IsPunctuation(startChar)) { while (pos > 0 && IsPunctuation(cb.CharAt(pos))) --pos; if (!IsPunctuation(cb.CharAt(pos))) ++pos; } else if (isspacechar(startChar)) { while (pos > 0 && isspacechar(cb.CharAt(pos))) --pos; if (!isspacechar(cb.CharAt(pos))) ++pos; } else if (!isascii(startChar)) { while (pos > 0 && !isascii(cb.CharAt(pos))) --pos; if (isascii(cb.CharAt(pos))) ++pos; } else { ++pos; } } } return pos; } int Document::WordPartRight(int pos) { char startChar = cb.CharAt(pos); int length = Length(); if (IsWordPartSeparator(startChar)) { while (pos < length && IsWordPartSeparator(cb.CharAt(pos))) ++pos; startChar = cb.CharAt(pos); } if (!isascii(startChar)) { while (pos < length && !isascii(cb.CharAt(pos))) ++pos; } else if (IsLowerCase(startChar)) { while (pos < length && IsLowerCase(cb.CharAt(pos))) ++pos; } else if (IsUpperCase(startChar)) { if (IsLowerCase(cb.CharAt(pos + 1))) { ++pos; while (pos < length && IsLowerCase(cb.CharAt(pos))) ++pos; } else { while (pos < length && IsUpperCase(cb.CharAt(pos))) ++pos; } if (IsLowerCase(cb.CharAt(pos)) && IsUpperCase(cb.CharAt(pos - 1))) --pos; } else if (IsADigit(startChar)) { while (pos < length && IsADigit(cb.CharAt(pos))) ++pos; } else if (IsPunctuation(startChar)) { while (pos < length && IsPunctuation(cb.CharAt(pos))) ++pos; } else if (isspacechar(startChar)) { while (pos < length && isspacechar(cb.CharAt(pos))) ++pos; } else { ++pos; } return pos; } bool IsLineEndChar(char c) { return (c == '\n' || c == '\r'); } int Document::ExtendStyleRange(int pos, int delta, bool singleLine) { int sStart = cb.StyleAt(pos); if (delta < 0) { while (pos > 0 && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))) ) pos--; pos++; } else { while (pos < (Length()) && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))) ) pos++; } return pos; } static char BraceOpposite(char ch) { switch (ch) { case '(': return ')'; case ')': return '('; case '[': return ']'; case ']': return '['; case '{': return '}'; case '}': return '{'; case '<': return '>'; case '>': return '<'; default: return '\0'; } } // TODO: should be able to extend styled region to find matching brace int Document::BraceMatch(int position, int /*maxReStyle*/) { char chBrace = CharAt(position); char chSeek = BraceOpposite(chBrace); if (chSeek == '\0') return - 1; char styBrace = static_cast(StyleAt(position) & stylingBitsMask); int direction = -1; if (chBrace == '(' || chBrace == '[' || chBrace == '{' || chBrace == '<') direction = 1; int depth = 1; position = position + direction; while ((position >= 0) && (position < Length())) { position = MovePositionOutsideChar(position, direction); char chAtPos = CharAt(position); char styAtPos = static_cast(StyleAt(position) & stylingBitsMask); if ((position > GetEndStyled()) || (styAtPos == styBrace)) { if (chAtPos == chBrace) depth++; if (chAtPos == chSeek) depth--; if (depth == 0) return position; } position = position + direction; } return - 1; } /** * Implementation of RegexSearchBase for the default built-in regular expression engine */ class BuiltinRegex : public RegexSearchBase { public: BuiltinRegex(CharClassify *charClassTable) : search(charClassTable), substituted(NULL) {} virtual ~BuiltinRegex() { delete substituted; } virtual long FindText(Document *doc, int minPos, int maxPos, const char *s, bool caseSensitive, bool word, bool wordStart, int flags, int *length); virtual const char *SubstituteByPosition(Document* doc, const char *text, int *length); private: RESearch search; char *substituted; }; // Define a way for the Regular Expression code to access the document class DocumentIndexer : public CharacterIndexer { Document *pdoc; int end; public: DocumentIndexer(Document *pdoc_, int end_) : pdoc(pdoc_), end(end_) { } virtual ~DocumentIndexer() { } virtual char CharAt(int index) { if (index < 0 || index >= end) return 0; else return pdoc->CharAt(index); } }; long BuiltinRegex::FindText(Document *doc, int minPos, int maxPos, const char *s, bool caseSensitive, bool, bool, int flags, int *length) { bool posix = (flags & SCFIND_POSIX) != 0; int increment = (minPos <= maxPos) ? 1 : -1; int startPos = minPos; int endPos = maxPos; // Range endpoints should not be inside DBCS characters, but just in case, move them. startPos = doc->MovePositionOutsideChar(startPos, 1, false); endPos = doc->MovePositionOutsideChar(endPos, 1, false); const char *errmsg = search.Compile(s, *length, caseSensitive, posix); if (errmsg) { return -1; } // Find a variable in a property file: \$(\([A-Za-z0-9_.]+\)) // Replace first '.' with '-' in each property file variable reference: // Search: \$(\([A-Za-z0-9_-]+\)\.\([A-Za-z0-9_.]+\)) // Replace: $(\1-\2) int lineRangeStart = doc->LineFromPosition(startPos); int lineRangeEnd = doc->LineFromPosition(endPos); if ((increment == 1) && (startPos >= doc->LineEnd(lineRangeStart)) && (lineRangeStart < lineRangeEnd)) { // the start position is at end of line or between line end characters. lineRangeStart++; startPos = doc->LineStart(lineRangeStart); } int pos = -1; int lenRet = 0; char searchEnd = s[*length - 1]; int lineRangeBreak = lineRangeEnd + increment; for (int line = lineRangeStart; line != lineRangeBreak; line += increment) { int startOfLine = doc->LineStart(line); int endOfLine = doc->LineEnd(line); if (increment == 1) { if (line == lineRangeStart) { if ((startPos != startOfLine) && (s[0] == '^')) continue; // Can't match start of line if start position after start of line startOfLine = startPos; } if (line == lineRangeEnd) { if ((endPos != endOfLine) && (searchEnd == '$')) continue; // Can't match end of line if end position before end of line endOfLine = endPos; } } else { if (line == lineRangeEnd) { if ((endPos != startOfLine) && (s[0] == '^')) continue; // Can't match start of line if end position after start of line startOfLine = endPos; } if (line == lineRangeStart) { if ((startPos != endOfLine) && (searchEnd == '$')) continue; // Can't match end of line if start position before end of line endOfLine = startPos; } } DocumentIndexer di(doc, endOfLine); int success = search.Execute(di, startOfLine, endOfLine); if (success) { pos = search.bopat[0]; lenRet = search.eopat[0] - search.bopat[0]; if (increment == -1) { // Check for the last match on this line. int repetitions = 1000; // Break out of infinite loop while (success && (search.eopat[0] <= endOfLine) && (repetitions--)) { success = search.Execute(di, pos+1, endOfLine); if (success) { if (search.eopat[0] <= minPos) { pos = search.bopat[0]; lenRet = search.eopat[0] - search.bopat[0]; } else { success = 0; } } } } break; } } *length = lenRet; return pos; } const char *BuiltinRegex::SubstituteByPosition(Document* doc, const char *text, int *length) { delete []substituted; substituted = 0; DocumentIndexer di(doc, doc->Length()); if (!search.GrabMatches(di)) return 0; unsigned int lenResult = 0; for (int i = 0; i < *length; i++) { if (text[i] == '\\') { if (text[i + 1] >= '1' && text[i + 1] <= '9') { unsigned int patNum = text[i + 1] - '0'; lenResult += search.eopat[patNum] - search.bopat[patNum]; i++; } else { switch (text[i + 1]) { case 'a': case 'b': case 'f': case 'n': case 'r': case 't': case 'v': i++; } lenResult++; } } else { lenResult++; } } substituted = new char[lenResult + 1]; if (!substituted) return 0; char *o = substituted; for (int j = 0; j < *length; j++) { if (text[j] == '\\') { if (text[j + 1] >= '1' && text[j + 1] <= '9') { unsigned int patNum = text[j + 1] - '0'; unsigned int len = search.eopat[patNum] - search.bopat[patNum]; if (search.pat[patNum]) // Will be null if try for a match that did not occur memcpy(o, search.pat[patNum], len); o += len; j++; } else { j++; switch (text[j]) { case 'a': *o++ = '\a'; break; case 'b': *o++ = '\b'; break; case 'f': *o++ = '\f'; break; case 'n': *o++ = '\n'; break; case 'r': *o++ = '\r'; break; case 't': *o++ = '\t'; break; case 'v': *o++ = '\v'; break; default: *o++ = '\\'; j--; } } } else { *o++ = text[j]; } } *o = '\0'; *length = lenResult; return substituted; } #ifndef SCI_OWNREGEX #ifdef SCI_NAMESPACE RegexSearchBase *Scintilla::CreateRegexSearch(CharClassify *charClassTable) { return new BuiltinRegex(charClassTable); } #else RegexSearchBase *CreateRegexSearch(CharClassify *charClassTable) { return new BuiltinRegex(charClassTable); } #endif #endif tora-2.1.3/src/qscintilla2/src/LexAbaqus.cpp0000644000175000017500000004657411213435521020461 0ustar michaelmichael// Scintilla source code edit control /** @file LexABAQUS.cxx ** Lexer for ABAQUS. Based on the lexer for APDL by Hadar Raz. ** By Sergio Lucato. ** Sort of completely rewritten by Gertjan Kloosterman **/ // The License.txt file describes the conditions under which this software may be distributed. // Code folding copyied and modified from LexBasic.cxx #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsAWordChar(const int ch) { return (ch < 0x80 && (isalnum(ch) || (ch == '_'))); } static inline bool IsAKeywordChar(const int ch) { return (ch < 0x80 && (isalnum(ch) || (ch == '_') || (ch == ' '))); } static inline bool IsASetChar(const int ch) { return (ch < 0x80 && (isalnum(ch) || (ch == '_') || (ch == '.') || (ch == '-'))); } static inline bool IsAnOperator(char ch) { // '.' left out as it is used to make up numbers if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || ch == '(' || ch == ')' || ch == '=' || ch == '^' || ch == '[' || ch == ']' || ch == '<' || ch == '&' || ch == '>' || ch == ',' || ch == '|' || ch == '~' || ch == '$' || ch == ':' || ch == '%') return true; return false; } static void ColouriseABAQUSDoc(unsigned int startPos, int length, int initStyle, WordList*[] /* *keywordlists[] */, Accessor &styler) { enum localState { KW_LINE_KW, KW_LINE_COMMA, KW_LINE_PAR, KW_LINE_EQ, KW_LINE_VAL, \ DAT_LINE_VAL, DAT_LINE_COMMA,\ COMMENT_LINE,\ ST_ERROR, LINE_END } state ; // Do not leak onto next line state = LINE_END ; initStyle = SCE_ABAQUS_DEFAULT; StyleContext sc(startPos, length, initStyle, styler); // Things are actually quite simple // we have commentlines // keywordlines and datalines // On a data line there will only be colouring of numbers // a keyword line is constructed as // *word,[ paramname[=paramvalue]]* // if the line ends with a , the keyword line continues onto the new line for (; sc.More(); sc.Forward()) { switch ( state ) { case KW_LINE_KW : if ( sc.atLineEnd ) { // finished the line in keyword state, switch to LINE_END sc.SetState(SCE_ABAQUS_DEFAULT) ; state = LINE_END ; } else if ( IsAKeywordChar(sc.ch) ) { // nothing changes state = KW_LINE_KW ; } else if ( sc.ch == ',' ) { // Well well we say a comma, arguments *MUST* follow sc.SetState(SCE_ABAQUS_OPERATOR) ; state = KW_LINE_COMMA ; } else { // Flag an error sc.SetState(SCE_ABAQUS_PROCESSOR) ; state = ST_ERROR ; } // Done with processing break ; case KW_LINE_COMMA : // acomma on a keywordline was seen if ( IsAKeywordChar(sc.ch)) { sc.SetState(SCE_ABAQUS_ARGUMENT) ; state = KW_LINE_PAR ; } else if ( sc.atLineEnd || (sc.ch == ',') ) { // we remain in keyword mode state = KW_LINE_COMMA ; } else if ( sc.ch == ' ' ) { sc.SetState(SCE_ABAQUS_DEFAULT) ; state = KW_LINE_COMMA ; } else { // Anything else constitutes an error sc.SetState(SCE_ABAQUS_PROCESSOR) ; state = ST_ERROR ; } break ; case KW_LINE_PAR : if ( sc.atLineEnd ) { sc.SetState(SCE_ABAQUS_DEFAULT) ; state = LINE_END ; } else if ( IsAKeywordChar(sc.ch) || (sc.ch == '-') ) { // remain in this state state = KW_LINE_PAR ; } else if ( sc.ch == ',' ) { sc.SetState(SCE_ABAQUS_OPERATOR) ; state = KW_LINE_COMMA ; } else if ( sc.ch == '=' ) { sc.SetState(SCE_ABAQUS_OPERATOR) ; state = KW_LINE_EQ ; } else { // Anything else constitutes an error sc.SetState(SCE_ABAQUS_PROCESSOR) ; state = ST_ERROR ; } break ; case KW_LINE_EQ : if ( sc.ch == ' ' ) { sc.SetState(SCE_ABAQUS_DEFAULT) ; // remain in this state state = KW_LINE_EQ ; } else if ( IsADigit(sc.ch) || (sc.ch == '-') || (sc.ch == '.' && IsADigit(sc.chNext)) ) { sc.SetState(SCE_ABAQUS_NUMBER) ; state = KW_LINE_VAL ; } else if ( IsAKeywordChar(sc.ch) ) { sc.SetState(SCE_ABAQUS_DEFAULT) ; state = KW_LINE_VAL ; } else if ( (sc.ch == '\'') || (sc.ch == '\"') ) { sc.SetState(SCE_ABAQUS_STRING) ; state = KW_LINE_VAL ; } else { sc.SetState(SCE_ABAQUS_PROCESSOR) ; state = ST_ERROR ; } break ; case KW_LINE_VAL : if ( sc.atLineEnd ) { sc.SetState(SCE_ABAQUS_DEFAULT) ; state = LINE_END ; } else if ( IsASetChar(sc.ch) && (sc.state == SCE_ABAQUS_DEFAULT) ) { // nothing changes state = KW_LINE_VAL ; } else if (( (IsADigit(sc.ch) || sc.ch == '.' || (sc.ch == 'e' || sc.ch == 'E') || ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')))) && (sc.state == SCE_ABAQUS_NUMBER)) { // remain in number mode state = KW_LINE_VAL ; } else if (sc.state == SCE_ABAQUS_STRING) { // accept everything until a closing quote if ( sc.ch == '\'' || sc.ch == '\"' ) { sc.SetState(SCE_ABAQUS_DEFAULT) ; state = KW_LINE_VAL ; } } else if ( sc.ch == ',' ) { sc.SetState(SCE_ABAQUS_OPERATOR) ; state = KW_LINE_COMMA ; } else { // anything else is an error sc.SetState(SCE_ABAQUS_PROCESSOR) ; state = ST_ERROR ; } break ; case DAT_LINE_VAL : if ( sc.atLineEnd ) { sc.SetState(SCE_ABAQUS_DEFAULT) ; state = LINE_END ; } else if ( IsASetChar(sc.ch) && (sc.state == SCE_ABAQUS_DEFAULT) ) { // nothing changes state = DAT_LINE_VAL ; } else if (( (IsADigit(sc.ch) || sc.ch == '.' || (sc.ch == 'e' || sc.ch == 'E') || ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')))) && (sc.state == SCE_ABAQUS_NUMBER)) { // remain in number mode state = DAT_LINE_VAL ; } else if (sc.state == SCE_ABAQUS_STRING) { // accept everything until a closing quote if ( sc.ch == '\'' || sc.ch == '\"' ) { sc.SetState(SCE_ABAQUS_DEFAULT) ; state = DAT_LINE_VAL ; } } else if ( sc.ch == ',' ) { sc.SetState(SCE_ABAQUS_OPERATOR) ; state = DAT_LINE_COMMA ; } else { // anything else is an error sc.SetState(SCE_ABAQUS_PROCESSOR) ; state = ST_ERROR ; } break ; case DAT_LINE_COMMA : // a comma on a data line was seen if ( sc.atLineEnd ) { sc.SetState(SCE_ABAQUS_DEFAULT) ; state = LINE_END ; } else if ( sc.ch == ' ' ) { sc.SetState(SCE_ABAQUS_DEFAULT) ; state = DAT_LINE_COMMA ; } else if (sc.ch == ',') { sc.SetState(SCE_ABAQUS_OPERATOR) ; state = DAT_LINE_COMMA ; } else if ( IsADigit(sc.ch) || (sc.ch == '-')|| (sc.ch == '.' && IsADigit(sc.chNext)) ) { sc.SetState(SCE_ABAQUS_NUMBER) ; state = DAT_LINE_VAL ; } else if ( IsAKeywordChar(sc.ch) ) { sc.SetState(SCE_ABAQUS_DEFAULT) ; state = DAT_LINE_VAL ; } else if ( (sc.ch == '\'') || (sc.ch == '\"') ) { sc.SetState(SCE_ABAQUS_STRING) ; state = DAT_LINE_VAL ; } else { sc.SetState(SCE_ABAQUS_PROCESSOR) ; state = ST_ERROR ; } break ; case COMMENT_LINE : if ( sc.atLineEnd ) { sc.SetState(SCE_ABAQUS_DEFAULT) ; state = LINE_END ; } break ; case ST_ERROR : if ( sc.atLineEnd ) { sc.SetState(SCE_ABAQUS_DEFAULT) ; state = LINE_END ; } break ; case LINE_END : if ( sc.atLineEnd || sc.ch == ' ' ) { // nothing changes state = LINE_END ; } else if ( sc.ch == '*' ) { if ( sc.chNext == '*' ) { state = COMMENT_LINE ; sc.SetState(SCE_ABAQUS_COMMENT) ; } else { state = KW_LINE_KW ; sc.SetState(SCE_ABAQUS_STARCOMMAND) ; } } else { // it must be a data line, things are as if we are in DAT_LINE_COMMA if ( sc.ch == ',' ) { sc.SetState(SCE_ABAQUS_OPERATOR) ; state = DAT_LINE_COMMA ; } else if ( IsADigit(sc.ch) || (sc.ch == '-')|| (sc.ch == '.' && IsADigit(sc.chNext)) ) { sc.SetState(SCE_ABAQUS_NUMBER) ; state = DAT_LINE_VAL ; } else if ( IsAKeywordChar(sc.ch) ) { sc.SetState(SCE_ABAQUS_DEFAULT) ; state = DAT_LINE_VAL ; } else if ( (sc.ch == '\'') || (sc.ch == '\"') ) { sc.SetState(SCE_ABAQUS_STRING) ; state = DAT_LINE_VAL ; } else { sc.SetState(SCE_ABAQUS_PROCESSOR) ; state = ST_ERROR ; } } break ; } } sc.Complete(); } //------------------------------------------------------------------------------ // This copyied and modified from LexBasic.cxx //------------------------------------------------------------------------------ /* Bits: * 1 - whitespace * 2 - operator * 4 - identifier * 8 - decimal digit * 16 - hex digit * 32 - bin digit */ static int character_classification[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 10, 6, 60, 60, 28, 28, 28, 28, 28, 28, 28, 28, 2, 2, 2, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 4, 2, 20, 20, 20, 20, 20, 20, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 0 }; static bool IsSpace(int c) { return c < 128 && (character_classification[c] & 1); } static bool IsIdentifier(int c) { return c < 128 && (character_classification[c] & 4); } static int LowerCase(int c) { if (c >= 'A' && c <= 'Z') return 'a' + c - 'A'; return c; } static int LineEnd(int line, Accessor &styler) { const int docLines = styler.GetLine(styler.Length() - 1); // Available last line int eol_pos ; // if the line is the last line, the eol_pos is styler.Length() // eol will contain a new line, or a virtual new line if ( docLines == line ) eol_pos = styler.Length() ; else eol_pos = styler.LineStart(line + 1) - 1; return eol_pos ; } static int LineStart(int line, Accessor &styler) { return styler.LineStart(line) ; } // LineType // // bits determines the line type // 1 : data line // 2 : only whitespace // 3 : data line with only whitespace // 4 : keyword line // 5 : block open keyword line // 6 : block close keyword line // 7 : keyword line in error // 8 : comment line static int LineType(int line, Accessor &styler) { int pos = LineStart(line, styler) ; int eol_pos = LineEnd(line, styler) ; int c ; char ch = ' '; int i = pos ; while ( i < eol_pos ) { c = styler.SafeGetCharAt(i); ch = static_cast(LowerCase(c)); // We can say something as soon as no whitespace // was encountered if ( !IsSpace(c) ) break ; i++ ; } if ( i >= eol_pos ) { // This is a whitespace line, currently // classifies as data line return 3 ; } if ( ch != '*' ) { // This is a data line return 1 ; } if ( i == eol_pos - 1 ) { // Only a single *, error but make keyword line return 4+3 ; } // This means we can have a second character // if that is also a * this means a comment // otherwise it is a keyword. c = styler.SafeGetCharAt(i+1); ch = static_cast(LowerCase(c)); if ( ch == '*' ) { return 8 ; } // At this point we know this is a keyword line // the character at position i is a * // it is not a comment line char word[256] ; int wlen = 0; word[wlen] = '*' ; wlen++ ; i++ ; while ( (i < eol_pos) && (wlen < 255) ) { c = styler.SafeGetCharAt(i); ch = static_cast(LowerCase(c)); if ( (!IsSpace(c)) && (!IsIdentifier(c)) ) break ; if ( IsIdentifier(c) ) { word[wlen] = ch ; wlen++ ; } i++ ; } word[wlen] = 0 ; // Make a comparison if ( !strcmp(word, "*step") || !strcmp(word, "*part") || !strcmp(word, "*instance") || !strcmp(word, "*assembly")) { return 4+1 ; } if ( !strcmp(word, "*endstep") || !strcmp(word, "*endpart") || !strcmp(word, "*endinstance") || !strcmp(word, "*endassembly")) { return 4+2 ; } return 4 ; } static void SafeSetLevel(int line, int level, Accessor &styler) { if ( line < 0 ) return ; int mask = ((~SC_FOLDLEVELHEADERFLAG) | (~SC_FOLDLEVELWHITEFLAG)); if ( (level & mask) < 0 ) return ; if ( styler.LevelAt(line) != level ) styler.SetLevel(line, level) ; } static void FoldABAQUSDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { int startLine = styler.GetLine(startPos) ; int endLine = styler.GetLine(startPos+length-1) ; // bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; // We want to deal with all the cases // To know the correct indentlevel, we need to look back to the // previous command line indentation level // order of formatting keyline datalines commentlines int beginData = -1 ; int beginComment = -1 ; int prvKeyLine = startLine ; int prvKeyLineTp = 0 ; // Scan until we find the previous keyword line // this will give us the level reference that we need while ( prvKeyLine > 0 ) { prvKeyLine-- ; prvKeyLineTp = LineType(prvKeyLine, styler) ; if ( prvKeyLineTp & 4 ) break ; } // Determine the base line level of all lines following // the previous keyword // new keyword lines are placed on this level //if ( prvKeyLineTp & 4 ) { int level = styler.LevelAt(prvKeyLine) & ~SC_FOLDLEVELHEADERFLAG ; //} // uncomment line below if weird behaviour continues prvKeyLine = -1 ; // Now start scanning over the lines. for ( int line = startLine; line <= endLine; line++ ) { int lineType = LineType(line, styler) ; // Check for comment line if ( lineType == 8 ) { if ( beginComment < 0 ) { beginComment = line ; } } // Check for data line if ( (lineType == 1) || (lineType == 3) ) { if ( beginData < 0 ) { if ( beginComment >= 0 ) { beginData = beginComment ; } else { beginData = line ; } } beginComment = -1 ; } // Check for keywordline. // As soon as a keyword line is encountered, we can set the // levels of everything from the previous keyword line to this one if ( lineType & 4 ) { // this is a keyword, we can now place the previous keyword // all its data lines and the remainder // Write comments and data line if ( beginComment < 0 ) { beginComment = line ; } if ( beginData < 0 ) { beginData = beginComment ; if ( prvKeyLineTp != 5 ) SafeSetLevel(prvKeyLine, level, styler) ; else SafeSetLevel(prvKeyLine, level | SC_FOLDLEVELHEADERFLAG, styler) ; } else { SafeSetLevel(prvKeyLine, level | SC_FOLDLEVELHEADERFLAG, styler) ; } int datLevel = level + 1 ; if ( !(prvKeyLineTp & 4) ) { datLevel = level ; } for ( int ll = beginData; ll < beginComment; ll++ ) SafeSetLevel(ll, datLevel, styler) ; // The keyword we just found is going to be written at another level // if we have a type 5 and type 6 if ( prvKeyLineTp == 5 ) { level += 1 ; } if ( prvKeyLineTp == 6 ) { level -= 1 ; if ( level < 0 ) { level = 0 ; } } for ( int lll = beginComment; lll < line; lll++ ) SafeSetLevel(lll, level, styler) ; // wrap and reset beginComment = -1 ; beginData = -1 ; prvKeyLine = line ; prvKeyLineTp = lineType ; } } if ( beginComment < 0 ) { beginComment = endLine + 1 ; } else { // We need to find out whether this comment block is followed by // a data line or a keyword line const int docLines = styler.GetLine(styler.Length() - 1); for ( int line = endLine + 1; line <= docLines; line++ ) { int lineType = LineType(line, styler) ; if ( lineType != 8 ) { if ( !(lineType & 4) ) { beginComment = endLine + 1 ; } break ; } } } if ( beginData < 0 ) { beginData = beginComment ; if ( prvKeyLineTp != 5 ) SafeSetLevel(prvKeyLine, level, styler) ; else SafeSetLevel(prvKeyLine, level | SC_FOLDLEVELHEADERFLAG, styler) ; } else { SafeSetLevel(prvKeyLine, level | SC_FOLDLEVELHEADERFLAG, styler) ; } int datLevel = level + 1 ; if ( !(prvKeyLineTp & 4) ) { datLevel = level ; } for ( int ll = beginData; ll < beginComment; ll++ ) SafeSetLevel(ll, datLevel, styler) ; if ( prvKeyLineTp == 5 ) { level += 1 ; } if ( prvKeyLineTp == 6 ) { level -= 1 ; } for ( int m = beginComment; m <= endLine; m++ ) SafeSetLevel(m, level, styler) ; } static const char * const abaqusWordListDesc[] = { "processors", "commands", "slashommands", "starcommands", "arguments", "functions", 0 }; LexerModule lmAbaqus(SCLEX_ABAQUS, ColouriseABAQUSDoc, "abaqus", FoldABAQUSDoc, abaqusWordListDesc); tora-2.1.3/src/qscintilla2/src/CallTip.cpp0000644000175000017500000002501111213435521020103 0ustar michaelmichael// Scintilla source code edit control /** @file CallTip.cxx ** Code for displaying call tips. **/ // Copyright 1998-2001 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include "Platform.h" #include "Scintilla.h" #include "CallTip.h" #include #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static const int insetX = 5; // text inset in x from calltip border static const int widthArrow = 14; CallTip::CallTip() { wCallTip = 0; inCallTipMode = false; posStartCallTip = 0; val = 0; rectUp = PRectangle(0,0,0,0); rectDown = PRectangle(0,0,0,0); lineHeight = 1; startHighlight = 0; endHighlight = 0; tabSize = 0; useStyleCallTip = false; // for backwards compatibility #ifdef __APPLE__ // proper apple colours for the default colourBG.desired = ColourDesired(0xff, 0xff, 0xc6); colourUnSel.desired = ColourDesired(0, 0, 0); #else colourBG.desired = ColourDesired(0xff, 0xff, 0xff); colourUnSel.desired = ColourDesired(0x80, 0x80, 0x80); #endif colourSel.desired = ColourDesired(0, 0, 0x80); colourShade.desired = ColourDesired(0, 0, 0); colourLight.desired = ColourDesired(0xc0, 0xc0, 0xc0); } CallTip::~CallTip() { font.Release(); wCallTip.Destroy(); delete []val; val = 0; } void CallTip::RefreshColourPalette(Palette &pal, bool want) { pal.WantFind(colourBG, want); pal.WantFind(colourUnSel, want); pal.WantFind(colourSel, want); pal.WantFind(colourShade, want); pal.WantFind(colourLight, want); } // Although this test includes 0, we should never see a \0 character. static bool IsArrowCharacter(char ch) { return (ch == 0) || (ch == '\001') || (ch == '\002'); } // We ignore tabs unless a tab width has been set. bool CallTip::IsTabCharacter(char ch) { return (tabSize > 0) && (ch == '\t'); } int CallTip::NextTabPos(int x) { if (tabSize > 0) { // paranoia... not called unless this is true x -= insetX; // position relative to text x = (x + tabSize) / tabSize; // tab "number" return tabSize*x + insetX; // position of next tab } else { return x + 1; // arbitrary } } // Draw a section of the call tip that does not include \n in one colour. // The text may include up to numEnds tabs or arrow characters. void CallTip::DrawChunk(Surface *surface, int &x, const char *s, int posStart, int posEnd, int ytext, PRectangle rcClient, bool highlight, bool draw) { s += posStart; int len = posEnd - posStart; // Divide the text into sections that are all text, or that are // single arrows or single tab characters (if tabSize > 0). int maxEnd = 0; const int numEnds = 10; int ends[numEnds + 2]; for (int i=0;i 0) ends[maxEnd++] = i; ends[maxEnd++] = i+1; } } ends[maxEnd++] = len; int startSeg = 0; int xEnd; for (int seg = 0; seg startSeg) { if (IsArrowCharacter(s[startSeg])) { bool upArrow = s[startSeg] == '\001'; rcClient.left = x; rcClient.right = rcClient.left + widthArrow; if (draw) { const int halfWidth = widthArrow / 2 - 3; const int centreX = rcClient.left + widthArrow / 2 - 1; const int centreY = (rcClient.top + rcClient.bottom) / 2; surface->FillRectangle(rcClient, colourBG.allocated); PRectangle rcClientInner(rcClient.left + 1, rcClient.top + 1, rcClient.right - 2, rcClient.bottom - 1); surface->FillRectangle(rcClientInner, colourUnSel.allocated); if (upArrow) { // Up arrow Point pts[] = { Point(centreX - halfWidth, centreY + halfWidth / 2), Point(centreX + halfWidth, centreY + halfWidth / 2), Point(centreX, centreY - halfWidth + halfWidth / 2), }; surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]), colourBG.allocated, colourBG.allocated); } else { // Down arrow Point pts[] = { Point(centreX - halfWidth, centreY - halfWidth / 2), Point(centreX + halfWidth, centreY - halfWidth / 2), Point(centreX, centreY + halfWidth - halfWidth / 2), }; surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]), colourBG.allocated, colourBG.allocated); } } xEnd = rcClient.right; offsetMain = xEnd; if (upArrow) { rectUp = rcClient; } else { rectDown = rcClient; } } else if (IsTabCharacter(s[startSeg])) { xEnd = NextTabPos(x); } else { xEnd = x + surface->WidthText(font, s + startSeg, endSeg - startSeg); if (draw) { rcClient.left = x; rcClient.right = xEnd; surface->DrawTextTransparent(rcClient, font, ytext, s+startSeg, endSeg - startSeg, highlight ? colourSel.allocated : colourUnSel.allocated); } } x = xEnd; startSeg = endSeg; } } } int CallTip::PaintContents(Surface *surfaceWindow, bool draw) { PRectangle rcClientPos = wCallTip.GetClientPosition(); PRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left, rcClientPos.bottom - rcClientPos.top); PRectangle rcClient(1, 1, rcClientSize.right - 1, rcClientSize.bottom - 1); // To make a nice small call tip window, it is only sized to fit most normal characters without accents int ascent = surfaceWindow->Ascent(font) - surfaceWindow->InternalLeading(font); // For each line... // Draw the definition in three parts: before highlight, highlighted, after highlight int ytext = rcClient.top + ascent + 1; rcClient.bottom = ytext + surfaceWindow->Descent(font) + 1; char *chunkVal = val; bool moreChunks = true; int maxWidth = 0; while (moreChunks) { char *chunkEnd = strchr(chunkVal, '\n'); if (chunkEnd == NULL) { chunkEnd = chunkVal + strlen(chunkVal); moreChunks = false; } int chunkOffset = chunkVal - val; int chunkLength = chunkEnd - chunkVal; int chunkEndOffset = chunkOffset + chunkLength; int thisStartHighlight = Platform::Maximum(startHighlight, chunkOffset); thisStartHighlight = Platform::Minimum(thisStartHighlight, chunkEndOffset); thisStartHighlight -= chunkOffset; int thisEndHighlight = Platform::Maximum(endHighlight, chunkOffset); thisEndHighlight = Platform::Minimum(thisEndHighlight, chunkEndOffset); thisEndHighlight -= chunkOffset; rcClient.top = ytext - ascent - 1; int x = insetX; // start each line at this inset DrawChunk(surfaceWindow, x, chunkVal, 0, thisStartHighlight, ytext, rcClient, false, draw); DrawChunk(surfaceWindow, x, chunkVal, thisStartHighlight, thisEndHighlight, ytext, rcClient, true, draw); DrawChunk(surfaceWindow, x, chunkVal, thisEndHighlight, chunkLength, ytext, rcClient, false, draw); chunkVal = chunkEnd + 1; ytext += lineHeight; rcClient.bottom += lineHeight; maxWidth = Platform::Maximum(maxWidth, x); } return maxWidth; } void CallTip::PaintCT(Surface *surfaceWindow) { if (!val) return; PRectangle rcClientPos = wCallTip.GetClientPosition(); PRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left, rcClientPos.bottom - rcClientPos.top); PRectangle rcClient(1, 1, rcClientSize.right - 1, rcClientSize.bottom - 1); surfaceWindow->FillRectangle(rcClient, colourBG.allocated); offsetMain = insetX; // initial alignment assuming no arrows PaintContents(surfaceWindow, true); #ifndef __APPLE__ // OSX doesn't put borders on "help tags" // Draw a raised border around the edges of the window surfaceWindow->MoveTo(0, rcClientSize.bottom - 1); surfaceWindow->PenColour(colourShade.allocated); surfaceWindow->LineTo(rcClientSize.right - 1, rcClientSize.bottom - 1); surfaceWindow->LineTo(rcClientSize.right - 1, 0); surfaceWindow->PenColour(colourLight.allocated); surfaceWindow->LineTo(0, 0); surfaceWindow->LineTo(0, rcClientSize.bottom - 1); #endif } void CallTip::MouseClick(Point pt) { clickPlace = 0; if (rectUp.Contains(pt)) clickPlace = 1; if (rectDown.Contains(pt)) clickPlace = 2; } PRectangle CallTip::CallTipStart(int pos, Point pt, const char *defn, const char *faceName, int size, int codePage_, int characterSet, Window &wParent) { clickPlace = 0; if (val) delete []val; val = new char[strlen(defn) + 1]; if (!val) return PRectangle(); strcpy(val, defn); codePage = codePage_; Surface *surfaceMeasure = Surface::Allocate(); if (!surfaceMeasure) return PRectangle(); surfaceMeasure->Init(wParent.GetID()); surfaceMeasure->SetUnicodeMode(SC_CP_UTF8 == codePage); surfaceMeasure->SetDBCSMode(codePage); startHighlight = 0; endHighlight = 0; inCallTipMode = true; posStartCallTip = pos; int deviceHeight = surfaceMeasure->DeviceHeightFont(size); font.Create(faceName, characterSet, deviceHeight, false, false); // Look for multiple lines in the text // Only support \n here - simply means container must avoid \r! int numLines = 1; const char *newline; const char *look = val; rectUp = PRectangle(0,0,0,0); rectDown = PRectangle(0,0,0,0); offsetMain = insetX; // changed to right edge of any arrows int width = PaintContents(surfaceMeasure, false) + insetX; while ((newline = strchr(look, '\n')) != NULL) { look = newline + 1; numLines++; } lineHeight = surfaceMeasure->Height(font); // Extra line for border and an empty line at top and bottom. The returned // rectangle is aligned to the right edge of the last arrow encountered in // the tip text, else to the tip text left edge. int height = lineHeight * numLines - surfaceMeasure->InternalLeading(font) + 2 + 2; delete surfaceMeasure; return PRectangle(pt.x - offsetMain, pt.y + 1, pt.x + width - offsetMain, pt.y + 1 + height); } void CallTip::CallTipCancel() { inCallTipMode = false; if (wCallTip.Created()) { wCallTip.Destroy(); } } void CallTip::SetHighlight(int start, int end) { // Avoid flashing by checking something has really changed if ((start != startHighlight) || (end != endHighlight)) { startHighlight = start; endHighlight = end; if (wCallTip.Created()) { wCallTip.InvalidateAll(); } } } // Set the tab size (sizes > 0 enable the use of tabs). This also enables the // use of the STYLE_CALLTIP. void CallTip::SetTabSize(int tabSz) { tabSize = tabSz; useStyleCallTip = true; } // It might be better to have two access functions for this and to use // them for all settings of colours. void CallTip::SetForeBack(const ColourPair &fore, const ColourPair &back) { colourBG = back; colourUnSel = fore; } tora-2.1.3/src/qscintilla2/src/StyleContext.h0000644000175000017500000001074111213435521020671 0ustar michaelmichael// Scintilla source code edit control /** @file StyleContext.cxx ** Lexer infrastructure. **/ // Copyright 1998-2004 by Neil Hodgson // This file is in the public domain. #ifdef SCI_NAMESPACE namespace Scintilla { #endif // All languages handled so far can treat all characters >= 0x80 as one class // which just continues the current token or starts an identifier if in default. // DBCS treated specially as the second character can be < 0x80 and hence // syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80 class StyleContext { Accessor &styler; unsigned int endPos; StyleContext& operator=(const StyleContext&) { return *this; } void GetNextChar(unsigned int pos) { chNext = static_cast(styler.SafeGetCharAt(pos+1)); if (styler.IsLeadByte(static_cast(chNext))) { chNext = chNext << 8; chNext |= static_cast(styler.SafeGetCharAt(pos+2)); } // End of line? // Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) // or on LF alone (Unix). Avoid triggering two times on Dos/Win. atLineEnd = (ch == '\r' && chNext != '\n') || (ch == '\n') || (currentPos >= endPos); } public: unsigned int currentPos; bool atLineStart; bool atLineEnd; int state; int chPrev; int ch; int chNext; StyleContext(unsigned int startPos, unsigned int length, int initStyle, Accessor &styler_, char chMask=31) : styler(styler_), endPos(startPos + length), currentPos(startPos), atLineStart(true), atLineEnd(false), state(initStyle & chMask), // Mask off all bits which aren't in the chMask. chPrev(0), ch(0), chNext(0) { styler.StartAt(startPos, chMask); styler.StartSegment(startPos); unsigned int pos = currentPos; ch = static_cast(styler.SafeGetCharAt(pos)); if (styler.IsLeadByte(static_cast(ch))) { pos++; ch = ch << 8; ch |= static_cast(styler.SafeGetCharAt(pos)); } GetNextChar(pos); } void Complete() { styler.ColourTo(currentPos - 1, state); } bool More() { return currentPos < endPos; } void Forward() { if (currentPos < endPos) { atLineStart = atLineEnd; chPrev = ch; currentPos++; if (ch >= 0x100) currentPos++; ch = chNext; GetNextChar(currentPos + ((ch >= 0x100) ? 1 : 0)); } else { atLineStart = false; chPrev = ' '; ch = ' '; chNext = ' '; atLineEnd = true; } } void Forward(int nb) { for (int i = 0; i < nb; i++) { Forward(); } } void ChangeState(int state_) { state = state_; } void SetState(int state_) { styler.ColourTo(currentPos - 1, state); state = state_; } void ForwardSetState(int state_) { Forward(); styler.ColourTo(currentPos - 1, state); state = state_; } int LengthCurrent() { return currentPos - styler.GetStartSegment(); } int GetRelative(int n) { return static_cast(styler.SafeGetCharAt(currentPos+n)); } bool Match(char ch0) { return ch == static_cast(ch0); } bool Match(char ch0, char ch1) { return (ch == static_cast(ch0)) && (chNext == static_cast(ch1)); } bool Match(const char *s) { if (ch != static_cast(*s)) return false; s++; if (!*s) return true; if (chNext != static_cast(*s)) return false; s++; for (int n=2; *s; n++) { if (*s != styler.SafeGetCharAt(currentPos+n)) return false; s++; } return true; } bool MatchIgnoreCase(const char *s) { if (tolower(ch) != static_cast(*s)) return false; s++; if (tolower(chNext) != static_cast(*s)) return false; s++; for (int n=2; *s; n++) { if (static_cast(*s) != tolower(static_cast(styler.SafeGetCharAt(currentPos+n)))) return false; s++; } return true; } // Non-inline void GetCurrent(char *s, unsigned int len); void GetCurrentLowered(char *s, unsigned int len); }; #ifdef SCI_NAMESPACE } #endif inline bool IsASpace(unsigned int ch) { return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); } inline bool IsASpaceOrTab(unsigned int ch) { return (ch == ' ') || (ch == '\t'); } inline bool IsADigit(unsigned int ch) { return (ch >= '0') && (ch <= '9'); } inline bool IsADigit(unsigned int ch, unsigned int base) { if (base <= 10) { return (ch >= '0') && (ch < '0' + base); } else { return ((ch >= '0') && (ch <= '9')) || ((ch >= 'A') && (ch < 'A' + base - 10)) || ((ch >= 'a') && (ch < 'a' + base - 10)); } } tora-2.1.3/src/qscintilla2/src/LexNimrod.cpp0000644000175000017500000003232011213435521020455 0ustar michaelmichael// Scintilla source code edit control // Nimrod lexer // (c) 2009 Andreas Rumpf /** @file LexNimrod.cxx ** Lexer for Nimrod. **/ // Copyright 1998-2002 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsAWordChar(int ch) { return (ch >= 0x80) || isalnum(ch) || ch == '_'; } static int tillEndOfTripleQuote(Accessor &styler, int pos, int max) { /* search for """ */ for (;;) { if (styler.SafeGetCharAt(pos, '\0') == '\0') return pos; if (pos >= max) return pos; if (styler.Match(pos, "\"\"\"")) { return pos + 2; } pos++; } } #define CR 13 /* use both because Scite allows changing the line ending */ #define LF 10 static bool inline isNewLine(int ch) { return ch == CR || ch == LF; } static int scanString(Accessor &styler, int pos, int max, bool rawMode) { for (;;) { if (pos >= max) return pos; char ch = styler.SafeGetCharAt(pos, '\0'); if (ch == CR || ch == LF || ch == '\0') return pos; if (ch == '"') return pos; if (ch == '\\' && !rawMode) { pos += 2; } else { pos++; } } } static int scanChar(Accessor &styler, int pos, int max) { for (;;) { if (pos >= max) return pos; char ch = styler.SafeGetCharAt(pos, '\0'); if (ch == CR || ch == LF || ch == '\0') return pos; if (ch == '\'' && !isalnum(styler.SafeGetCharAt(pos+1, '\0')) ) return pos; if (ch == '\\') { pos += 2; } else { pos++; } } } static int scanIdent(Accessor &styler, int pos, WordList &keywords) { char buf[100]; /* copy to lowercase and ignore underscores */ int i = 0; for (;;) { char ch = styler.SafeGetCharAt(pos, '\0'); if (!IsAWordChar(ch)) break; if (ch != '_' && i < ((int)sizeof(buf))-1) { buf[i] = static_cast(tolower(ch)); i++; } pos++; } buf[i] = '\0'; /* look for keyword */ if (keywords.InList(buf)) { styler.ColourTo(pos-1, SCE_P_WORD); } else { styler.ColourTo(pos-1, SCE_P_IDENTIFIER); } return pos; } static int scanNumber(Accessor &styler, int pos) { char ch, ch2; ch = styler.SafeGetCharAt(pos, '\0'); ch2 = styler.SafeGetCharAt(pos+1, '\0'); if (ch == '0' && (ch2 == 'b' || ch2 == 'B')) { /* binary number: */ pos += 2; for (;;) { ch = styler.SafeGetCharAt(pos, '\0'); if (ch == '_' || (ch >= '0' && ch <= '1')) ++pos; else break; } } else if (ch == '0' && (ch2 == 'o' || ch2 == 'O' || ch2 == 'c' || ch2 == 'C')) { /* octal number: */ pos += 2; for (;;) { ch = styler.SafeGetCharAt(pos, '\0'); if (ch == '_' || (ch >= '0' && ch <= '7')) ++pos; else break; } } else if (ch == '0' && (ch2 == 'x' || ch2 == 'X')) { /* hexadecimal number: */ pos += 2; for (;;) { ch = styler.SafeGetCharAt(pos, '\0'); if (ch == '_' || (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')) ++pos; else break; } } else { // skip decimal part: for (;;) { ch = styler.SafeGetCharAt(pos, '\0'); if (ch == '_' || (ch >= '0' && ch <= '9')) ++pos; else break; } ch2 = styler.SafeGetCharAt(pos+1, '\0'); if (ch == '.' && ch2 >= '0' && ch2 <= '9') { ++pos; // skip '.' for (;;) { ch = styler.SafeGetCharAt(pos, '\0'); if (ch == '_' || (ch >= '0' && ch <= '9')) ++pos; else break; } } if (ch == 'e' || ch == 'E') { ++pos; ch = styler.SafeGetCharAt(pos, '\0'); if (ch == '-' || ch == '+') ++pos; for (;;) { ch = styler.SafeGetCharAt(pos, '\0'); if (ch == '_' || (ch >= '0' && ch <= '9')) ++pos; else break; } } } if (ch == '\'') { /* a type suffix: */ pos++; for (;;) { ch = styler.SafeGetCharAt(pos); if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || ch == '_') ++pos; else break; } } styler.ColourTo(pos-1, SCE_P_NUMBER); return pos; } /* rewritten from scratch, because I couldn't get rid of the bugs... (A character based approach sucks!) */ static void ColouriseNimrodDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { int pos = startPos; int max = startPos + length; char ch; WordList &keywords = *keywordlists[0]; styler.StartAt(startPos); styler.StartSegment(startPos); switch (initStyle) { /* check where we are: */ case SCE_P_TRIPLEDOUBLE: pos = tillEndOfTripleQuote(styler, pos, max); styler.ColourTo(pos, SCE_P_TRIPLEDOUBLE); pos++; break; default: /* nothing to do: */ break; } while (pos < max) { ch = styler.SafeGetCharAt(pos, '\0'); switch (ch) { case '\0': return; case '#': { bool doccomment = (styler.SafeGetCharAt(pos+1) == '#'); while (pos < max && !isNewLine(styler.SafeGetCharAt(pos, LF))) pos++; if (doccomment) styler.ColourTo(pos, SCE_C_COMMENTLINEDOC); else styler.ColourTo(pos, SCE_P_COMMENTLINE); } break; case 'r': case 'R': { if (styler.SafeGetCharAt(pos+1) == '"') { pos = scanString(styler, pos+2, max, true); styler.ColourTo(pos, SCE_P_STRING); pos++; } else { pos = scanIdent(styler, pos, keywords); } } break; case '"': if (styler.Match(pos+1, "\"\"")) { pos = tillEndOfTripleQuote(styler, pos+3, max); styler.ColourTo(pos, SCE_P_TRIPLEDOUBLE); } else { pos = scanString(styler, pos+1, max, false); styler.ColourTo(pos, SCE_P_STRING); } pos++; break; case '\'': pos = scanChar(styler, pos+1, max); styler.ColourTo(pos, SCE_P_CHARACTER); pos++; break; default: // identifers, numbers, operators, whitespace if (ch >= '0' && ch <= '9') { pos = scanNumber(styler, pos); } else if (IsAWordChar(ch)) { pos = scanIdent(styler, pos, keywords); } else if (ch == '`') { pos++; while (pos < max) { ch = styler.SafeGetCharAt(pos, LF); if (ch == '`') { ++pos; break; } if (ch == CR || ch == LF) break; ++pos; } styler.ColourTo(pos, SCE_P_IDENTIFIER); } else if (strchr("()[]{}:=;-\\/&%$!+<>|^?,.*~@", ch)) { styler.ColourTo(pos, SCE_P_OPERATOR); pos++; } else { styler.ColourTo(pos, SCE_P_DEFAULT); pos++; } break; } } } static bool IsCommentLine(int line, Accessor &styler) { int pos = styler.LineStart(line); int eol_pos = styler.LineStart(line + 1) - 1; for (int i = pos; i < eol_pos; i++) { char ch = styler[i]; if (ch == '#') return true; else if (ch != ' ' && ch != '\t') return false; } return false; } static bool IsQuoteLine(int line, Accessor &styler) { int style = styler.StyleAt(styler.LineStart(line)) & 31; return ((style == SCE_P_TRIPLE) || (style == SCE_P_TRIPLEDOUBLE)); } static void FoldNimrodDoc(unsigned int startPos, int length, int /*initStyle - unused*/, WordList *[], Accessor &styler) { const int maxPos = startPos + length; const int maxLines = styler.GetLine(maxPos - 1); // Requested last line const int docLines = styler.GetLine(styler.Length() - 1); // Available last line const bool foldComment = styler.GetPropertyInt("fold.comment.nimrod") != 0; const bool foldQuotes = styler.GetPropertyInt("fold.quotes.nimrod") != 0; // Backtrack to previous non-blank line so we can determine indent level // for any white space lines (needed esp. within triple quoted strings) // and so we can fix any preceding fold level (which is why we go back // at least one line in all cases) int spaceFlags = 0; int lineCurrent = styler.GetLine(startPos); int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL); while (lineCurrent > 0) { lineCurrent--; indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL); if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG) && (!IsCommentLine(lineCurrent, styler)) && (!IsQuoteLine(lineCurrent, styler))) break; } int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK; // Set up initial loop state startPos = styler.LineStart(lineCurrent); int prev_state = SCE_P_DEFAULT & 31; if (lineCurrent >= 1) prev_state = styler.StyleAt(startPos - 1) & 31; int prevQuote = foldQuotes && ((prev_state == SCE_P_TRIPLE) || (prev_state == SCE_P_TRIPLEDOUBLE)); int prevComment = 0; if (lineCurrent >= 1) prevComment = foldComment && IsCommentLine(lineCurrent - 1, styler); // Process all characters to end of requested range or end of any triple quote // or comment that hangs over the end of the range. Cap processing in all cases // to end of document (in case of unclosed quote or comment at end). while ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) || prevQuote || prevComment)) { // Gather info int lev = indentCurrent; int lineNext = lineCurrent + 1; int indentNext = indentCurrent; int quote = false; if (lineNext <= docLines) { // Information about next line is only available if not at end of document indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL); int style = styler.StyleAt(styler.LineStart(lineNext)) & 31; quote = foldQuotes && ((style == SCE_P_TRIPLE) || (style == SCE_P_TRIPLEDOUBLE)); } const int quote_start = (quote && !prevQuote); const int quote_continue = (quote && prevQuote); const int comment = foldComment && IsCommentLine(lineCurrent, styler); const int comment_start = (comment && !prevComment && (lineNext <= docLines) && IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE)); const int comment_continue = (comment && prevComment); if ((!quote || !prevQuote) && !comment) indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK; if (quote) indentNext = indentCurrentLevel; if (indentNext & SC_FOLDLEVELWHITEFLAG) indentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel; if (quote_start) { // Place fold point at start of triple quoted string lev |= SC_FOLDLEVELHEADERFLAG; } else if (quote_continue || prevQuote) { // Add level to rest of lines in the string lev = lev + 1; } else if (comment_start) { // Place fold point at start of a block of comments lev |= SC_FOLDLEVELHEADERFLAG; } else if (comment_continue) { // Add level to rest of lines in the block lev = lev + 1; } // Skip past any blank lines for next indent level info; we skip also // comments (all comments, not just those starting in column 0) // which effectively folds them into surrounding code rather // than screwing up folding. while (!quote && (lineNext < docLines) && ((indentNext & SC_FOLDLEVELWHITEFLAG) || (lineNext <= docLines && IsCommentLine(lineNext, styler)))) { lineNext++; indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL); } const int levelAfterComments = indentNext & SC_FOLDLEVELNUMBERMASK; const int levelBeforeComments = Platform::Maximum(indentCurrentLevel,levelAfterComments); // Now set all the indent levels on the lines we skipped // Do this from end to start. Once we encounter one line // which is indented more than the line after the end of // the comment-block, use the level of the block before int skipLine = lineNext; int skipLevel = levelAfterComments; while (--skipLine > lineCurrent) { int skipLineIndent = styler.IndentAmount(skipLine, &spaceFlags, NULL); if ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > levelAfterComments) skipLevel = levelBeforeComments; int whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG; styler.SetLevel(skipLine, skipLevel | whiteFlag); } // Set fold header on non-quote/non-comment line if (!quote && !comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) { if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) lev |= SC_FOLDLEVELHEADERFLAG; } // Keep track of triple quote and block comment state of previous line prevQuote = quote; prevComment = comment_start || comment_continue; // Set fold level for this line and move to next line styler.SetLevel(lineCurrent, lev); indentCurrent = indentNext; lineCurrent = lineNext; } // NOTE: Cannot set level of last line here because indentCurrent doesn't have // header flag set; the loop above is crafted to take care of this case! //styler.SetLevel(lineCurrent, indentCurrent); } static const char * const nimrodWordListDesc[] = { "Keywords", 0 }; LexerModule lmNimrod(SCLEX_NIMROD, ColouriseNimrodDoc, "nimrod", FoldNimrodDoc, nimrodWordListDesc); tora-2.1.3/src/qscintilla2/src/LexCaml.cpp0000644000175000017500000003051411213435521020104 0ustar michaelmichael// Scintilla source code edit control /** @file LexCaml.cxx ** Lexer for Objective Caml. **/ // Copyright 2005 by Robert Roessler // The License.txt file describes the conditions under which this software may be distributed. /* Release History 20050204 Initial release. 20050205 Quick compiler standards/"cleanliness" adjustment. 20050206 Added cast for IsLeadByte(). 20050209 Changes to "external" build support. 20050306 Fix for 1st-char-in-doc "corner" case. 20050502 Fix for [harmless] one-past-the-end coloring. 20050515 Refined numeric token recognition logic. 20051125 Added 2nd "optional" keywords class. 20051129 Support "magic" (read-only) comments for RCaml. 20051204 Swtich to using StyleContext infrastructure. */ #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" // Since the Microsoft __iscsym[f] funcs are not ANSI... inline int iscaml(int c) {return isalnum(c) || c == '_';} inline int iscamlf(int c) {return isalpha(c) || c == '_';} inline int iscamld(int c) {return isdigit(c) || c == '_';} static const int baseT[24] = { 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A - L */ 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0,16 /* M - X */ }; #ifdef SCI_NAMESPACE using namespace Scintilla; #endif #ifdef BUILD_AS_EXTERNAL_LEXER /* (actually seems to work!) */ #include "WindowAccessor.h" #include "ExternalLexer.h" #if PLAT_WIN #include #endif static void ColouriseCamlDoc( unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler); static void FoldCamlDoc( unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler); static void InternalLexOrFold(int lexOrFold, unsigned int startPos, int length, int initStyle, char *words[], WindowID window, char *props); static const char* LexerName = "caml"; #ifdef TRACE void Platform::DebugPrintf(const char *format, ...) { char buffer[2000]; va_list pArguments; va_start(pArguments, format); vsprintf(buffer,format,pArguments); va_end(pArguments); Platform::DebugDisplay(buffer); } #else void Platform::DebugPrintf(const char *, ...) { } #endif bool Platform::IsDBCSLeadByte(int codePage, char ch) { return ::IsDBCSLeadByteEx(codePage, ch) != 0; } long Platform::SendScintilla(WindowID w, unsigned int msg, unsigned long wParam, long lParam) { return ::SendMessage(reinterpret_cast(w), msg, wParam, lParam); } long Platform::SendScintillaPointer(WindowID w, unsigned int msg, unsigned long wParam, void *lParam) { return ::SendMessage(reinterpret_cast(w), msg, wParam, reinterpret_cast(lParam)); } void EXT_LEXER_DECL Fold(unsigned int lexer, unsigned int startPos, int length, int initStyle, char *words[], WindowID window, char *props) { // below useless evaluation(s) to supress "not used" warnings lexer; // build expected data structures and do the Fold InternalLexOrFold(1, startPos, length, initStyle, words, window, props); } int EXT_LEXER_DECL GetLexerCount() { return 1; // just us [Objective] Caml lexers here! } void EXT_LEXER_DECL GetLexerName(unsigned int Index, char *name, int buflength) { // below useless evaluation(s) to supress "not used" warnings Index; // return as much of our lexer name as will fit (what's up with Index?) if (buflength > 0) { buflength--; int n = strlen(LexerName); if (n > buflength) n = buflength; memcpy(name, LexerName, n), name[n] = '\0'; } } void EXT_LEXER_DECL Lex(unsigned int lexer, unsigned int startPos, int length, int initStyle, char *words[], WindowID window, char *props) { // below useless evaluation(s) to supress "not used" warnings lexer; // build expected data structures and do the Lex InternalLexOrFold(0, startPos, length, initStyle, words, window, props); } static void InternalLexOrFold(int foldOrLex, unsigned int startPos, int length, int initStyle, char *words[], WindowID window, char *props) { // create and initialize a WindowAccessor (including contained PropSet) PropSet ps; ps.SetMultiple(props); WindowAccessor wa(window, ps); // create and initialize WordList(s) int nWL = 0; for (; words[nWL]; nWL++) ; // count # of WordList PTRs needed WordList** wl = new WordList* [nWL + 1];// alloc WordList PTRs int i = 0; for (; i < nWL; i++) { wl[i] = new WordList(); // (works or THROWS bad_alloc EXCEPTION) wl[i]->Set(words[i]); } wl[i] = 0; // call our "internal" folder/lexer (... then do Flush!) if (foldOrLex) FoldCamlDoc(startPos, length, initStyle, wl, wa); else ColouriseCamlDoc(startPos, length, initStyle, wl, wa); wa.Flush(); // clean up before leaving for (i = nWL - 1; i >= 0; i--) delete wl[i]; delete [] wl; } static #endif /* BUILD_AS_EXTERNAL_LEXER */ void ColouriseCamlDoc( unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { // initialize styler StyleContext sc(startPos, length, initStyle, styler); // set up [initial] state info (terminating states that shouldn't "bleed") int nesting = 0; if (sc.state < SCE_CAML_STRING) sc.state = SCE_CAML_DEFAULT; if (sc.state >= SCE_CAML_COMMENT) nesting = (sc.state & 0x0f) - SCE_CAML_COMMENT; int chBase = 0, chToken = 0, chLit = 0; WordList& keywords = *keywordlists[0]; WordList& keywords2 = *keywordlists[1]; WordList& keywords3 = *keywordlists[2]; const int useMagic = styler.GetPropertyInt("lexer.caml.magic", 0); // foreach char in range... while (sc.More()) { // set up [per-char] state info int state2 = -1; // (ASSUME no state change) int chColor = sc.currentPos - 1;// (ASSUME standard coloring range) bool advance = true; // (ASSUME scanner "eats" 1 char) // step state machine switch (sc.state & 0x0f) { case SCE_CAML_DEFAULT: chToken = sc.currentPos; // save [possible] token start (JIC) // it's wide open; what do we have? if (iscamlf(sc.ch)) state2 = SCE_CAML_IDENTIFIER; else if (sc.Match('`') && iscamlf(sc.chNext)) state2 = SCE_CAML_TAGNAME; else if (sc.Match('#') && isdigit(sc.chNext)) state2 = SCE_CAML_LINENUM; else if (isdigit(sc.ch)) { state2 = SCE_CAML_NUMBER, chBase = 10; if (sc.Match('0') && strchr("bBoOxX", sc.chNext)) chBase = baseT[tolower(sc.chNext) - 'a'], sc.Forward(); } else if (sc.Match('\'')) /* (char literal?) */ state2 = SCE_CAML_CHAR, chLit = 0; else if (sc.Match('\"')) state2 = SCE_CAML_STRING; else if (sc.Match('(', '*')) state2 = SCE_CAML_COMMENT, sc.ch = ' ', // (make SURE "(*)" isn't seen as a closed comment) sc.Forward(); else if (strchr("!?~" /* Caml "prefix-symbol" */ "=<>@^|&+-*/$%" /* Caml "infix-symbol" */ "()[]{};,:.#", sc.ch)) /* Caml "bracket" or ;,:.# */ state2 = SCE_CAML_OPERATOR; break; case SCE_CAML_IDENTIFIER: // [try to] interpret as [additional] identifier char if (!(iscaml(sc.ch) || sc.Match('\''))) { const int n = sc.currentPos - chToken; if (n < 24) { // length is believable as keyword, [re-]construct token char t[24]; for (int i = -n; i < 0; i++) t[n + i] = static_cast(sc.GetRelative(i)); t[n] = '\0'; // special-case "_" token as KEYWORD if ((n == 1 && sc.chPrev == '_') || keywords.InList(t)) sc.ChangeState(SCE_CAML_KEYWORD); else if (keywords2.InList(t)) sc.ChangeState(SCE_CAML_KEYWORD2); else if (keywords3.InList(t)) sc.ChangeState(SCE_CAML_KEYWORD3); } state2 = SCE_CAML_DEFAULT, advance = false; } break; case SCE_CAML_TAGNAME: // [try to] interpret as [additional] tagname char if (!(iscaml(sc.ch) || sc.Match('\''))) state2 = SCE_CAML_DEFAULT, advance = false; break; /*case SCE_CAML_KEYWORD: case SCE_CAML_KEYWORD2: case SCE_CAML_KEYWORD3: // [try to] interpret as [additional] keyword char if (!iscaml(ch)) state2 = SCE_CAML_DEFAULT, advance = false; break;*/ case SCE_CAML_LINENUM: // [try to] interpret as [additional] linenum directive char if (!isdigit(sc.ch)) state2 = SCE_CAML_DEFAULT, advance = false; break; case SCE_CAML_OPERATOR: { // [try to] interpret as [additional] operator char const char* o = 0; if (iscaml(sc.ch) || isspace(sc.ch) /* ident or whitespace */ || (o = strchr(")]};,\'\"`#", sc.ch),o)/* "termination" chars */ || !strchr("!$%&*+-./:<=>?@^|~", sc.ch)/* "operator" chars */) { // check for INCLUSIVE termination if (o && strchr(")]};,", sc.ch)) { if ((sc.Match(')') && sc.chPrev == '(') || (sc.Match(']') && sc.chPrev == '[')) // special-case "()" and "[]" tokens as KEYWORDS sc.ChangeState(SCE_CAML_KEYWORD); chColor++; } else advance = false; state2 = SCE_CAML_DEFAULT; } break; } case SCE_CAML_NUMBER: // [try to] interpret as [additional] numeric literal char // N.B. - improperly accepts "extra" digits in base 2 or 8 literals if (iscamld(sc.ch) || IsADigit(sc.ch, chBase)) break; // how about an integer suffix? if ((sc.Match('l') || sc.Match('L') || sc.Match('n')) && (iscamld(sc.chPrev) || IsADigit(sc.chPrev, chBase))) break; // or a floating-point literal? if (chBase == 10) { // with a decimal point? if (sc.Match('.') && iscamld(sc.chPrev)) break; // with an exponent? (I) if ((sc.Match('e') || sc.Match('E')) && (iscamld(sc.chPrev) || sc.chPrev == '.')) break; // with an exponent? (II) if ((sc.Match('+') || sc.Match('-')) && (sc.chPrev == 'e' || sc.chPrev == 'E')) break; } // it looks like we have run out of number state2 = SCE_CAML_DEFAULT, advance = false; break; case SCE_CAML_CHAR: // [try to] interpret as [additional] char literal char if (sc.Match('\\')) { chLit = 1; // (definitely IS a char literal) if (sc.chPrev == '\\') sc.ch = ' '; // (so termination test isn't fooled) // should we be terminating - one way or another? } else if ((sc.Match('\'') && sc.chPrev != '\\') || sc.atLineEnd) { state2 = SCE_CAML_DEFAULT; if (sc.Match('\'')) chColor++; else sc.ChangeState(SCE_CAML_IDENTIFIER); // ... maybe a char literal, maybe not } else if (chLit < 1 && sc.currentPos - chToken >= 2) sc.ChangeState(SCE_CAML_IDENTIFIER), advance = false; break; case SCE_CAML_STRING: // [try to] interpret as [additional] string literal char if (sc.Match('\\') && sc.chPrev == '\\') sc.ch = ' '; // (so '\\' doesn't cause us trouble) else if (sc.Match('\"') && sc.chPrev != '\\') state2 = SCE_CAML_DEFAULT, chColor++; break; case SCE_CAML_COMMENT: case SCE_CAML_COMMENT1: case SCE_CAML_COMMENT2: case SCE_CAML_COMMENT3: // we're IN a comment - does this start a NESTED comment? if (sc.Match('(', '*')) state2 = sc.state + 1, chToken = sc.currentPos, sc.ch = ' ', // (make SURE "(*)" isn't seen as a closed comment) sc.Forward(), nesting++; // [try to] interpret as [additional] comment char else if (sc.Match(')') && sc.chPrev == '*') { if (nesting) state2 = (sc.state & 0x0f) - 1, chToken = 0, nesting--; else state2 = SCE_CAML_DEFAULT; chColor++; // enable "magic" (read-only) comment AS REQUIRED } else if (useMagic && sc.currentPos - chToken == 4 && sc.Match('c') && sc.chPrev == 'r' && sc.GetRelative(-2) == '@') sc.state |= 0x10; // (switch to read-only comment style) break; } // handle state change and char coloring as required if (state2 >= 0) styler.ColourTo(chColor, sc.state), sc.ChangeState(state2); // move to next char UNLESS re-scanning current char if (advance) sc.Forward(); } // do any required terminal char coloring (JIC) sc.Complete(); } #ifdef BUILD_AS_EXTERNAL_LEXER static #endif /* BUILD_AS_EXTERNAL_LEXER */ void FoldCamlDoc( unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { // below useless evaluation(s) to supress "not used" warnings startPos || length || initStyle || keywordlists[0] || styler.Length(); } static const char * const camlWordListDesc[] = { "Keywords", // primary Objective Caml keywords "Keywords2", // "optional" keywords (typically from Pervasives) "Keywords3", // "optional" keywords (typically typenames) 0 }; #ifndef BUILD_AS_EXTERNAL_LEXER LexerModule lmCaml(SCLEX_CAML, ColouriseCamlDoc, "caml", FoldCamlDoc, camlWordListDesc); #endif /* BUILD_AS_EXTERNAL_LEXER */ tora-2.1.3/src/qscintilla2/src/LexCSS.cpp0000644000175000017500000003075411213435521017666 0ustar michaelmichael// Scintilla source code edit control /** @file LexCSS.cxx ** Lexer for Cascading Style Sheets ** Written by Jakub Vrna ** Improved by Philippe Lhoste (CSS2) **/ // Copyright 1998-2002 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsAWordChar(const unsigned int ch) { /* FIXME: * The CSS spec allows "ISO 10646 characters U+00A1 and higher" to be treated as word chars. * Unfortunately, we are only getting string bytes here, and not full unicode characters. We cannot guarantee * that our byte is between U+0080 - U+00A0 (to return false), so we have to allow all characters U+0080 and higher */ return ch >= 0x80 || isalnum(ch) || ch == '-' || ch == '_'; } inline bool IsCssOperator(const int ch) { if (!((ch < 0x80) && isalnum(ch)) && (ch == '{' || ch == '}' || ch == ':' || ch == ',' || ch == ';' || ch == '.' || ch == '#' || ch == '!' || ch == '@' || /* CSS2 */ ch == '*' || ch == '>' || ch == '+' || ch == '=' || ch == '~' || ch == '|' || ch == '[' || ch == ']' || ch == '(' || ch == ')')) { return true; } return false; } static void ColouriseCssDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &css1Props = *keywordlists[0]; WordList &pseudoClasses = *keywordlists[1]; WordList &css2Props = *keywordlists[2]; WordList &css3Props = *keywordlists[3]; WordList &pseudoElements = *keywordlists[4]; WordList &exProps = *keywordlists[5]; WordList &exPseudoClasses = *keywordlists[6]; WordList &exPseudoElements = *keywordlists[7]; StyleContext sc(startPos, length, initStyle, styler); int lastState = -1; // before operator int lastStateC = -1; // before comment int op = ' '; // last operator int opPrev = ' '; // last operator for (; sc.More(); sc.Forward()) { if (sc.state == SCE_CSS_COMMENT && sc.Match('*', '/')) { if (lastStateC == -1) { // backtrack to get last state: // comments are like whitespace, so we must return to the previous state unsigned int i = startPos; for (; i > 0; i--) { if ((lastStateC = styler.StyleAt(i-1)) != SCE_CSS_COMMENT) { if (lastStateC == SCE_CSS_OPERATOR) { op = styler.SafeGetCharAt(i-1); opPrev = styler.SafeGetCharAt(i-2); while (--i) { lastState = styler.StyleAt(i-1); if (lastState != SCE_CSS_OPERATOR && lastState != SCE_CSS_COMMENT) break; } if (i == 0) lastState = SCE_CSS_DEFAULT; } break; } } if (i == 0) lastStateC = SCE_CSS_DEFAULT; } sc.Forward(); sc.ForwardSetState(lastStateC); } if (sc.state == SCE_CSS_COMMENT) continue; if (sc.state == SCE_CSS_DOUBLESTRING || sc.state == SCE_CSS_SINGLESTRING) { if (sc.ch != (sc.state == SCE_CSS_DOUBLESTRING ? '\"' : '\'')) continue; unsigned int i = sc.currentPos; while (i && styler[i-1] == '\\') i--; if ((sc.currentPos - i) % 2 == 1) continue; sc.ForwardSetState(SCE_CSS_VALUE); } if (sc.state == SCE_CSS_OPERATOR) { if (op == ' ') { unsigned int i = startPos; op = styler.SafeGetCharAt(i-1); opPrev = styler.SafeGetCharAt(i-2); while (--i) { lastState = styler.StyleAt(i-1); if (lastState != SCE_CSS_OPERATOR && lastState != SCE_CSS_COMMENT) break; } } switch (op) { case '@': if (lastState == SCE_CSS_DEFAULT) sc.SetState(SCE_CSS_DIRECTIVE); break; case '>': case '+': if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS) sc.SetState(SCE_CSS_DEFAULT); break; case '[': if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS) sc.SetState(SCE_CSS_ATTRIBUTE); break; case ']': if (lastState == SCE_CSS_ATTRIBUTE) sc.SetState(SCE_CSS_TAG); break; case '{': if (lastState == SCE_CSS_DIRECTIVE) sc.SetState(SCE_CSS_DEFAULT); else if (lastState == SCE_CSS_TAG) sc.SetState(SCE_CSS_IDENTIFIER); break; case '}': if (lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_VALUE || lastState == SCE_CSS_IMPORTANT || lastState == SCE_CSS_IDENTIFIER || lastState == SCE_CSS_IDENTIFIER2 || lastState == SCE_CSS_IDENTIFIER3) sc.SetState(SCE_CSS_DEFAULT); break; case '(': if (lastState == SCE_CSS_PSEUDOCLASS) sc.SetState(SCE_CSS_TAG); else if (lastState == SCE_CSS_EXTENDED_PSEUDOCLASS) sc.SetState(SCE_CSS_EXTENDED_PSEUDOCLASS); break; case ')': if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS || lastState == SCE_CSS_PSEUDOELEMENT || lastState == SCE_CSS_EXTENDED_PSEUDOELEMENT) sc.SetState(SCE_CSS_TAG); break; case ':': if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS || lastState == SCE_CSS_PSEUDOELEMENT || lastState == SCE_CSS_EXTENDED_PSEUDOELEMENT) sc.SetState(SCE_CSS_PSEUDOCLASS); else if (lastState == SCE_CSS_IDENTIFIER || lastState == SCE_CSS_IDENTIFIER2 || lastState == SCE_CSS_IDENTIFIER3 || lastState == SCE_CSS_EXTENDED_IDENTIFIER || lastState == SCE_CSS_UNKNOWN_IDENTIFIER) sc.SetState(SCE_CSS_VALUE); break; case '.': if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS) sc.SetState(SCE_CSS_CLASS); break; case '#': if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS) sc.SetState(SCE_CSS_ID); break; case ',': case '|': case '~': if (lastState == SCE_CSS_TAG) sc.SetState(SCE_CSS_DEFAULT); break; case ';': if (lastState == SCE_CSS_DIRECTIVE) sc.SetState(SCE_CSS_DEFAULT); else if (lastState == SCE_CSS_VALUE || lastState == SCE_CSS_IMPORTANT) sc.SetState(SCE_CSS_IDENTIFIER); break; case '!': if (lastState == SCE_CSS_VALUE) sc.SetState(SCE_CSS_IMPORTANT); break; } } if (IsAWordChar(sc.ch)) { if (sc.state == SCE_CSS_DEFAULT) sc.SetState(SCE_CSS_TAG); continue; } if (sc.ch == '*' && sc.state == SCE_CSS_DEFAULT) { sc.SetState(SCE_CSS_TAG); continue; } if (IsAWordChar(sc.chPrev) && ( sc.state == SCE_CSS_IDENTIFIER || sc.state == SCE_CSS_IDENTIFIER2 || sc.state == SCE_CSS_IDENTIFIER3 || sc.state == SCE_CSS_EXTENDED_IDENTIFIER || sc.state == SCE_CSS_UNKNOWN_IDENTIFIER || sc.state == SCE_CSS_PSEUDOCLASS || sc.state == SCE_CSS_PSEUDOELEMENT || sc.state == SCE_CSS_EXTENDED_PSEUDOCLASS || sc.state == SCE_CSS_EXTENDED_PSEUDOELEMENT || sc.state == SCE_CSS_UNKNOWN_PSEUDOCLASS || sc.state == SCE_CSS_IMPORTANT )) { char s[100]; sc.GetCurrentLowered(s, sizeof(s)); char *s2 = s; while (*s2 && !IsAWordChar(*s2)) s2++; switch (sc.state) { case SCE_CSS_IDENTIFIER: case SCE_CSS_IDENTIFIER2: case SCE_CSS_IDENTIFIER3: case SCE_CSS_EXTENDED_IDENTIFIER: case SCE_CSS_UNKNOWN_IDENTIFIER: if (css1Props.InList(s2)) sc.ChangeState(SCE_CSS_IDENTIFIER); else if (css2Props.InList(s2)) sc.ChangeState(SCE_CSS_IDENTIFIER2); else if (css3Props.InList(s2)) sc.ChangeState(SCE_CSS_IDENTIFIER3); else if (exProps.InList(s2)) sc.ChangeState(SCE_CSS_EXTENDED_IDENTIFIER); else sc.ChangeState(SCE_CSS_UNKNOWN_IDENTIFIER); break; case SCE_CSS_PSEUDOCLASS: case SCE_CSS_PSEUDOELEMENT: case SCE_CSS_EXTENDED_PSEUDOCLASS: case SCE_CSS_EXTENDED_PSEUDOELEMENT: case SCE_CSS_UNKNOWN_PSEUDOCLASS: if (op == ':' && opPrev != ':' && pseudoClasses.InList(s2)) sc.ChangeState(SCE_CSS_PSEUDOCLASS); else if (opPrev == ':' && pseudoElements.InList(s2)) sc.ChangeState(SCE_CSS_PSEUDOELEMENT); else if ((op == ':' || (op == '(' && lastState == SCE_CSS_EXTENDED_PSEUDOCLASS)) && opPrev != ':' && exPseudoClasses.InList(s2)) sc.ChangeState(SCE_CSS_EXTENDED_PSEUDOCLASS); else if (opPrev == ':' && exPseudoElements.InList(s2)) sc.ChangeState(SCE_CSS_EXTENDED_PSEUDOELEMENT); else sc.ChangeState(SCE_CSS_UNKNOWN_PSEUDOCLASS); break; case SCE_CSS_IMPORTANT: if (strcmp(s2, "important") != 0) sc.ChangeState(SCE_CSS_VALUE); break; } } if (sc.ch != '.' && sc.ch != ':' && sc.ch != '#' && ( sc.state == SCE_CSS_CLASS || sc.state == SCE_CSS_ID || (sc.ch != '(' && sc.ch != ')' && ( /* This line of the condition makes it possible to extend pseudo-classes with parentheses */ sc.state == SCE_CSS_PSEUDOCLASS || sc.state == SCE_CSS_PSEUDOELEMENT || sc.state == SCE_CSS_EXTENDED_PSEUDOCLASS || sc.state == SCE_CSS_EXTENDED_PSEUDOELEMENT || sc.state == SCE_CSS_UNKNOWN_PSEUDOCLASS )) )) sc.SetState(SCE_CSS_TAG); if (sc.Match('/', '*')) { lastStateC = sc.state; sc.SetState(SCE_CSS_COMMENT); sc.Forward(); } else if (sc.state == SCE_CSS_VALUE && (sc.ch == '\"' || sc.ch == '\'')) { sc.SetState((sc.ch == '\"' ? SCE_CSS_DOUBLESTRING : SCE_CSS_SINGLESTRING)); } else if (IsCssOperator(sc.ch) && (sc.state != SCE_CSS_ATTRIBUTE || sc.ch == ']') && (sc.state != SCE_CSS_VALUE || sc.ch == ';' || sc.ch == '}' || sc.ch == '!') && (sc.state != SCE_CSS_DIRECTIVE || sc.ch == ';' || sc.ch == '{') ) { if (sc.state != SCE_CSS_OPERATOR) lastState = sc.state; sc.SetState(SCE_CSS_OPERATOR); op = sc.ch; opPrev = sc.chPrev; } } sc.Complete(); } static void FoldCSSDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { bool foldComment = styler.GetPropertyInt("fold.comment") != 0; bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; unsigned int endPos = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; int levelCurrent = levelPrev; char chNext = styler[startPos]; bool inComment = (styler.StyleAt(startPos-1) == SCE_CSS_COMMENT); for (unsigned int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); int style = styler.StyleAt(i); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if (foldComment) { if (!inComment && (style == SCE_CSS_COMMENT)) levelCurrent++; else if (inComment && (style != SCE_CSS_COMMENT)) levelCurrent--; inComment = (style == SCE_CSS_COMMENT); } if (style == SCE_CSS_OPERATOR) { if (ch == '{') { levelCurrent++; } else if (ch == '}') { levelCurrent--; } } if (atEOL) { int lev = levelPrev; if (visibleChars == 0 && foldCompact) lev |= SC_FOLDLEVELWHITEFLAG; if ((levelCurrent > levelPrev) && (visibleChars > 0)) lev |= SC_FOLDLEVELHEADERFLAG; if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } lineCurrent++; levelPrev = levelCurrent; visibleChars = 0; } if (!isspacechar(ch)) visibleChars++; } // Fill in the real level of the next line, keeping the current flags as they will be filled in later int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; styler.SetLevel(lineCurrent, levelPrev | flagsNext); } static const char * const cssWordListDesc[] = { "CSS1 Properties", "Pseudo-classes", "CSS2 Properties", "CSS3 Properties", "Pseudo-elements", "Browser-Specific CSS Properties", "Browser-Specific Pseudo-classes", "Browser-Specific Pseudo-elements", 0 }; LexerModule lmCss(SCLEX_CSS, ColouriseCssDoc, "css", FoldCSSDoc, cssWordListDesc); tora-2.1.3/src/qscintilla2/src/LexPowerPro.cpp0000644000175000017500000004556511213435521021021 0ustar michaelmichael// Scintilla source code edit control // @file LexPowerPro.cxx // PowerPro utility, written by Bruce Switzer, is available from http://powerpro.webeddie.com // PowerPro lexer is written by Christopher Bean (cbean@cb-software.net) // // Lexer code heavily borrowed from: // LexAU3.cxx by Jos van der Zande // LexCPP.cxx by Neil Hodgson // LexVB.cxx by Neil Hodgson // // Changes: // 2008-10-25 - Initial release // 2008-10-26 - Changed how is hilighted in 'function ' so that // local isFunction = "" and local functions = "" don't get falsely highlighted // 2008-12-14 - Added bounds checking for szKeyword and szDo // - Replaced SetOfCharacters with CharacterSet // - Made sure that CharacterSet::Contains is passed only positive values // - Made sure that the return value of Accessor::SafeGetCharAt is positive before // passsing to functions that require positive values like isspacechar() // - Removed unused visibleChars processing from ColourisePowerProDoc() // - Fixed bug with folding logic where line continuations didn't end where // they were supposed to // - Moved all helper functions to the top of the file // // Copyright 1998-2005 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #include "CharacterSet.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsStreamCommentStyle(int style) { return style == SCE_POWERPRO_COMMENTBLOCK; } static bool IsContinuationLine(unsigned int szLine, Accessor &styler) { int nsPos = styler.LineStart(szLine); int nePos = styler.LineStart(szLine + 1) - 2; while (nsPos < nePos) { int stylech = styler.StyleAt(nsPos); if (!(stylech == SCE_POWERPRO_COMMENTBLOCK)) { char ch = styler.SafeGetCharAt(nePos); char chPrev = styler.SafeGetCharAt(nePos-1); char chPrevPrev = styler.SafeGetCharAt(nePos-2); if (ch > 0 && chPrev > 0 && chPrevPrev > 0 && !isspacechar(ch) && !isspacechar(chPrev) && !isspacechar(chPrevPrev) ) { if (chPrevPrev == ';' && chPrev == ';' && ch == '+') return true; else return false; } } nePos--; // skip to next char } return false; } // Routine to find first none space on the current line and return its Style // needed for comment lines not starting on pos 1 static int GetStyleFirstWord(unsigned int szLine, Accessor &styler) { int nsPos = styler.LineStart(szLine); int nePos = styler.LineStart(szLine+1) - 1; char ch = styler.SafeGetCharAt(nsPos); while (ch > 0 && isspacechar(ch) && nsPos < nePos) { nsPos++; // skip to next char ch = styler.SafeGetCharAt(nsPos); } return styler.StyleAt(nsPos); } //returns true if there is a function to highlight //used to highlight in 'function ' static bool HasFunction(Accessor &styler, unsigned int currentPos) { //check for presence of 'function ' return (styler.SafeGetCharAt(currentPos) == ' ' && tolower(styler.SafeGetCharAt(currentPos-1)) == 'n' && tolower(styler.SafeGetCharAt(currentPos-2)) == 'o' && tolower(styler.SafeGetCharAt(currentPos-3)) == 'i' && tolower(styler.SafeGetCharAt(currentPos-4)) == 't' && tolower(styler.SafeGetCharAt(currentPos-5)) == 'c' && tolower(styler.SafeGetCharAt(currentPos-6)) == 'n' && tolower(styler.SafeGetCharAt(currentPos-7)) == 'u' && tolower(styler.SafeGetCharAt(currentPos-8)) == 'f' //only allow 'function ' to appear at the beginning of a line && (styler.SafeGetCharAt(currentPos-9) == '\n' || styler.SafeGetCharAt(currentPos-9) == '\r' || (styler.SafeGetCharAt(currentPos -9, '\0')) == '\0') //is the first line ); } static void ColourisePowerProDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler, bool caseSensitive) { WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; WordList &keywords3 = *keywordlists[2]; WordList &keywords4 = *keywordlists[3]; //define the character sets CharacterSet setWordStart(CharacterSet::setAlpha, "_@", 0x80, true); CharacterSet setWord(CharacterSet::setAlphaNum, "._", 0x80, true); StyleContext sc(startPos, length, initStyle, styler); char s_save[100]; //for last line highlighting for (; sc.More(); sc.Forward()) { // ********************************************** // save the total current word for eof processing char s[100]; sc.GetCurrentLowered(s, sizeof(s)); if ((sc.ch > 0) && setWord.Contains(sc.ch)) { strcpy(s_save,s); int tp = strlen(s_save); if (tp < 99) { s_save[tp] = static_cast(tolower(sc.ch)); s_save[tp+1] = '\0'; } } // ********************************************** // if (sc.atLineStart) { if (sc.state == SCE_POWERPRO_DOUBLEQUOTEDSTRING) { // Prevent SCE_POWERPRO_STRINGEOL from leaking back to previous line which // ends with a line continuation by locking in the state upto this position. sc.SetState(SCE_POWERPRO_DOUBLEQUOTEDSTRING); } } // Determine if the current state should terminate. switch (sc.state) { case SCE_POWERPRO_OPERATOR: sc.SetState(SCE_POWERPRO_DEFAULT); break; case SCE_POWERPRO_NUMBER: if (!IsADigit(sc.ch)) sc.SetState(SCE_POWERPRO_DEFAULT); break; case SCE_POWERPRO_IDENTIFIER: //if ((sc.ch > 0) && !setWord.Contains(sc.ch) || (sc.ch == '.')) { // use this line if don't want to match keywords with . in them. ie: win.debug will match both win and debug so win debug will also be colorized if ((sc.ch > 0) && !setWord.Contains(sc.ch)){ // || (sc.ch == '.')) { // use this line if you want to match keywords with a . ie: win.debug will only match win.debug neither win nor debug will be colorized separately char s[1000]; if (caseSensitive) { sc.GetCurrent(s, sizeof(s)); } else { sc.GetCurrentLowered(s, sizeof(s)); } if (keywords.InList(s)) { sc.ChangeState(SCE_POWERPRO_WORD); } else if (keywords2.InList(s)) { sc.ChangeState(SCE_POWERPRO_WORD2); } else if (keywords3.InList(s)) { sc.ChangeState(SCE_POWERPRO_WORD3); } else if (keywords4.InList(s)) { sc.ChangeState(SCE_POWERPRO_WORD4); } sc.SetState(SCE_POWERPRO_DEFAULT); } break; case SCE_POWERPRO_LINECONTINUE: if (sc.atLineStart) { sc.SetState(SCE_POWERPRO_DEFAULT); } else if (sc.Match('/', '*') || sc.Match('/', '/')) { sc.SetState(SCE_POWERPRO_DEFAULT); } break; case SCE_POWERPRO_COMMENTBLOCK: if (sc.Match('*', '/')) { sc.Forward(); sc.ForwardSetState(SCE_POWERPRO_DEFAULT); } break; case SCE_POWERPRO_COMMENTLINE: if (sc.atLineStart) { sc.SetState(SCE_POWERPRO_DEFAULT); } break; case SCE_POWERPRO_DOUBLEQUOTEDSTRING: if (sc.atLineEnd) { sc.ChangeState(SCE_POWERPRO_STRINGEOL); } else if (sc.ch == '\\') { if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { sc.Forward(); } } else if (sc.ch == '\"') { sc.ForwardSetState(SCE_POWERPRO_DEFAULT); } break; case SCE_POWERPRO_SINGLEQUOTEDSTRING: if (sc.atLineEnd) { sc.ChangeState(SCE_POWERPRO_STRINGEOL); } else if (sc.ch == '\\') { if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { sc.Forward(); } } else if (sc.ch == '\'') { sc.ForwardSetState(SCE_POWERPRO_DEFAULT); } break; case SCE_POWERPRO_STRINGEOL: if (sc.atLineStart) { sc.SetState(SCE_POWERPRO_DEFAULT); } break; case SCE_POWERPRO_VERBATIM: if (sc.ch == '\"') { if (sc.chNext == '\"') { sc.Forward(); } else { sc.ForwardSetState(SCE_POWERPRO_DEFAULT); } } break; case SCE_POWERPRO_ALTQUOTE: if (sc.ch == '#') { if (sc.chNext == '#') { sc.Forward(); } else { sc.ForwardSetState(SCE_POWERPRO_DEFAULT); } } break; case SCE_POWERPRO_FUNCTION: if (sc.ch == '\r' || sc.ch == '\n' || sc.ch == ' ' || sc.ch == '(') { sc.SetState(SCE_POWERPRO_DEFAULT); } break; } // Determine if a new state should be entered. if (sc.state == SCE_POWERPRO_DEFAULT) { if (sc.Match('?', '\"')) { sc.SetState(SCE_POWERPRO_VERBATIM); sc.Forward(); } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { sc.SetState(SCE_POWERPRO_NUMBER); }else if (sc.Match('?','#')) { if (sc.ch == '?' && sc.chNext == '#') { sc.SetState(SCE_POWERPRO_ALTQUOTE); sc.Forward(); } } else if (HasFunction(styler, sc.currentPos)) { //highlight in 'function ' sc.SetState(SCE_POWERPRO_FUNCTION); } else if (sc.ch == '@' && sc.atLineStart) { //alternate function definition [label] sc.SetState(SCE_POWERPRO_FUNCTION); } else if ((sc.ch > 0) && (setWordStart.Contains(sc.ch) || (sc.ch == '?'))) { sc.SetState(SCE_POWERPRO_IDENTIFIER); } else if (sc.Match(";;+")) { sc.SetState(SCE_POWERPRO_LINECONTINUE); } else if (sc.Match('/', '*')) { sc.SetState(SCE_POWERPRO_COMMENTBLOCK); sc.Forward(); // Eat the * so it isn't used for the end of the comment } else if (sc.Match('/', '/')) { sc.SetState(SCE_POWERPRO_COMMENTLINE); } else if (sc.atLineStart && sc.ch == ';') { //legacy comment that can only appear at the beginning of a line sc.SetState(SCE_POWERPRO_COMMENTLINE); } else if (sc.Match(";;")) { sc.SetState(SCE_POWERPRO_COMMENTLINE); } else if (sc.ch == '\"') { sc.SetState(SCE_POWERPRO_DOUBLEQUOTEDSTRING); } else if (sc.ch == '\'') { sc.SetState(SCE_POWERPRO_SINGLEQUOTEDSTRING); } else if (isoperator(static_cast(sc.ch))) { sc.SetState(SCE_POWERPRO_OPERATOR); } } } //************************************* // Colourize the last word correctly //************************************* if (sc.state == SCE_POWERPRO_IDENTIFIER) { if (keywords.InList(s_save)) { sc.ChangeState(SCE_POWERPRO_WORD); sc.SetState(SCE_POWERPRO_DEFAULT); } else if (keywords2.InList(s_save)) { sc.ChangeState(SCE_POWERPRO_WORD2); sc.SetState(SCE_POWERPRO_DEFAULT); } else if (keywords3.InList(s_save)) { sc.ChangeState(SCE_POWERPRO_WORD3); sc.SetState(SCE_POWERPRO_DEFAULT); } else if (keywords4.InList(s_save)) { sc.ChangeState(SCE_POWERPRO_WORD4); sc.SetState(SCE_POWERPRO_DEFAULT); } else { sc.SetState(SCE_POWERPRO_DEFAULT); } } sc.Complete(); } static void FoldPowerProDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { //define the character sets CharacterSet setWordStart(CharacterSet::setAlpha, "_@", 0x80, true); CharacterSet setWord(CharacterSet::setAlphaNum, "._", 0x80, true); bool isFoldingAll = true; //used to tell if we're recursively folding the whole document, or just a small piece (ie: if statement or 1 function) int endPos = startPos + length; int lastLine = styler.GetLine(styler.Length()); //used to help fold the last line correctly // get settings from the config files for folding comments and preprocessor lines bool foldComment = styler.GetPropertyInt("fold.comment") != 0; bool foldInComment = styler.GetPropertyInt("fold.comment") == 2; bool foldCompact = true; // Backtrack to previous line in case need to fix its fold status int lineCurrent = styler.GetLine(startPos); if (startPos > 0) { isFoldingAll = false; if (lineCurrent > 0) { lineCurrent--; startPos = styler.LineStart(lineCurrent); } } // vars for style of previous/current/next lines int style = GetStyleFirstWord(lineCurrent,styler); int stylePrev = 0; // find the first previous line without continuation character at the end while ((lineCurrent > 0 && IsContinuationLine(lineCurrent,styler)) || (lineCurrent > 1 && IsContinuationLine(lineCurrent-1,styler))) { lineCurrent--; startPos = styler.LineStart(lineCurrent); } if (lineCurrent > 0) { stylePrev = GetStyleFirstWord(lineCurrent-1,styler); } // vars for getting first word to check for keywords bool FirstWordStart = false; bool FirstWordEnd = false; const unsigned int KEYWORD_MAX = 10; char szKeyword[KEYWORD_MAX]=""; unsigned int szKeywordlen = 0; char szDo[3]=""; int szDolen = 0; bool DoFoundLast = false; // var for indentlevel int levelCurrent = SC_FOLDLEVELBASE; if (lineCurrent > 0) { levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; } int levelNext = levelCurrent; int visibleChars = 0; int functionCount = 0; char chNext = styler.SafeGetCharAt(startPos); char chPrev = '\0'; char chPrevPrev = '\0'; char chPrevPrevPrev = '\0'; for (int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); if ((ch > 0) && setWord.Contains(ch)) { visibleChars++; } // get the syle for the current character neede to check in comment int stylech = styler.StyleAt(i); // get first word for the line for indent check max 9 characters if (FirstWordStart && (!(FirstWordEnd))) { if ((ch > 0) && !setWord.Contains(ch)) { FirstWordEnd = true; } else if (szKeywordlen < KEYWORD_MAX - 1) { szKeyword[szKeywordlen++] = static_cast(tolower(ch)); szKeyword[szKeywordlen] = '\0'; } } // start the capture of the first word if (!(FirstWordStart)) { if ((ch > 0) && (setWord.Contains(ch) || setWordStart.Contains(ch) || ch == ';' || ch == '/')) { FirstWordStart = true; if (szKeywordlen < KEYWORD_MAX - 1) { szKeyword[szKeywordlen++] = static_cast(tolower(ch)); szKeyword[szKeywordlen] = '\0'; } } } // only process this logic when not in comment section if (stylech != SCE_POWERPRO_COMMENTLINE) { if (DoFoundLast) { if (DoFoundLast && (ch > 0) && setWord.Contains(ch)) { DoFoundLast = false; } } // find out if the word "do" is the last on a "if" line if (FirstWordEnd && strcmp(szKeyword,"if") == 0) { if (szDolen == 2) { szDo[0] = szDo[1]; szDo[1] = static_cast(tolower(ch)); szDo[2] = '\0'; if (strcmp(szDo,"do") == 0 ) { DoFoundLast = true; } } else if (szDolen < 2) { szDo[szDolen++] = static_cast(tolower(ch)); szDo[szDolen] = '\0'; } } } // End of Line found so process the information if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos)) { // ************************** // Folding logic for Keywords // ************************** // if a keyword is found on the current line and the line doesn't end with ;;+ (continuation) // and we are not inside a commentblock. if (szKeywordlen > 0 && (!(chPrev == '+' && chPrevPrev == ';' && chPrevPrevPrev ==';')) && ((!(IsStreamCommentStyle(style)) || foldInComment)) ) { // only fold "if" last keyword is "then" (else its a one line if) if (strcmp(szKeyword,"if") == 0 && DoFoundLast) { levelNext++; } // create new fold for these words if (strcmp(szKeyword,"for") == 0) { levelNext++; } //handle folding for functions/labels //Note: Functions and labels don't have an explicit end like [end function] // 1. functions/labels end at the start of another function // 2. functions/labels end at the end of the file if ((strcmp(szKeyword,"function") == 0) || (szKeywordlen > 0 && szKeyword[0] == '@')) { if (isFoldingAll) { //if we're folding the whole document (recursivly by lua script) if (functionCount > 0) { levelCurrent--; } else { levelNext++; } functionCount++; } else { //if just folding a small piece (by clicking on the minus sign next to the word) levelCurrent--; } } // end the fold for these words before the current line if (strcmp(szKeyword,"endif") == 0 || strcmp(szKeyword,"endfor") == 0) { levelNext--; levelCurrent--; } // end the fold for these words before the current line and Start new fold if (strcmp(szKeyword,"else") == 0 || strcmp(szKeyword,"elseif") == 0 ) { levelCurrent--; } } // Preprocessor and Comment folding int styleNext = GetStyleFirstWord(lineCurrent + 1,styler); // ********************************* // Folding logic for Comment blocks // ********************************* if (foldComment && IsStreamCommentStyle(style)) { // Start of a comment block if (!(stylePrev==style) && IsStreamCommentStyle(styleNext) && styleNext==style) { levelNext++; } // fold till the last line for normal comment lines else if (IsStreamCommentStyle(stylePrev) && !(styleNext == SCE_POWERPRO_COMMENTLINE) && stylePrev == SCE_POWERPRO_COMMENTLINE && style == SCE_POWERPRO_COMMENTLINE) { levelNext--; } // fold till the one but last line for Blockcomment lines else if (IsStreamCommentStyle(stylePrev) && !(styleNext == SCE_POWERPRO_COMMENTBLOCK) && style == SCE_POWERPRO_COMMENTBLOCK) { levelNext--; levelCurrent--; } } int levelUse = levelCurrent; int lev = levelUse | levelNext << 16; if (visibleChars == 0 && foldCompact) lev |= SC_FOLDLEVELWHITEFLAG; if (levelUse < levelNext) { lev |= SC_FOLDLEVELHEADERFLAG; } if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } // reset values for the next line lineCurrent++; stylePrev = style; style = styleNext; levelCurrent = levelNext; visibleChars = 0; // if the last characters are ;;+ then don't reset since the line continues on the next line. if (chPrev == '+' && chPrevPrev == ';' && chPrevPrevPrev == ';') { //do nothing } else { szKeywordlen = 0; szDolen = 0; FirstWordStart = false; FirstWordEnd = false; DoFoundLast = false; //blank out keyword for (unsigned int i = 0; i < KEYWORD_MAX; i++) { szKeyword[i] = '\0'; } } } // save the last processed characters if ((ch > 0) && !isspacechar(ch)) { chPrevPrevPrev = chPrevPrev; chPrevPrev = chPrev; chPrev = ch; visibleChars++; } } //close folds on the last line - without this a 'phantom' //fold can appear when an open fold is on the last line //this can occur because functions and labels don't have an explicit end if (lineCurrent >= lastLine) { int lev = 0; lev |= SC_FOLDLEVELWHITEFLAG; styler.SetLevel(lineCurrent, lev); } } static const char * const powerProWordLists[] = { "Keyword list 1", "Keyword list 2", "Keyword list 3", "Keyword list 4", 0, }; static void ColourisePowerProDocWrapper(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { ColourisePowerProDoc(startPos, length, initStyle, keywordlists, styler, false); } LexerModule lmPowerPro(SCLEX_POWERPRO, ColourisePowerProDocWrapper, "powerpro", FoldPowerProDoc, powerProWordLists); tora-2.1.3/src/qscintilla2/src/CallTip.h0000644000175000017500000000476611213435521017566 0ustar michaelmichael// Scintilla source code edit control /** @file CallTip.h ** Interface to the call tip control. **/ // Copyright 1998-2001 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #ifndef CALLTIP_H #define CALLTIP_H #ifdef SCI_NAMESPACE namespace Scintilla { #endif /** */ class CallTip { int startHighlight; // character offset to start and... int endHighlight; // ...end of highlighted text char *val; Font font; PRectangle rectUp; // rectangle of last up angle in the tip PRectangle rectDown; // rectangle of last down arrow in the tip int lineHeight; // vertical line spacing int offsetMain; // The alignment point of the call tip int tabSize; // Tab size in pixels, <=0 no TAB expand bool useStyleCallTip; // if true, STYLE_CALLTIP should be used // Private so CallTip objects can not be copied CallTip(const CallTip &) {} CallTip &operator=(const CallTip &) { return *this; } void DrawChunk(Surface *surface, int &x, const char *s, int posStart, int posEnd, int ytext, PRectangle rcClient, bool highlight, bool draw); int PaintContents(Surface *surfaceWindow, bool draw); bool IsTabCharacter(char c); int NextTabPos(int x); public: Window wCallTip; Window wDraw; bool inCallTipMode; int posStartCallTip; ColourPair colourBG; ColourPair colourUnSel; ColourPair colourSel; ColourPair colourShade; ColourPair colourLight; int codePage; int clickPlace; CallTip(); ~CallTip(); /// Claim or accept palette entries for the colours required to paint a calltip. void RefreshColourPalette(Palette &pal, bool want); void PaintCT(Surface *surfaceWindow); void MouseClick(Point pt); /// Setup the calltip and return a rectangle of the area required. PRectangle CallTipStart(int pos, Point pt, const char *defn, const char *faceName, int size, int codePage_, int characterSet, Window &wParent); void CallTipCancel(); /// Set a range of characters to be displayed in a highlight style. /// Commonly used to highlight the current parameter. void SetHighlight(int start, int end); /// Set the tab size in pixels for the call tip. 0 or -ve means no tab expand. void SetTabSize(int tabSz); /// Used to determine which STYLE_xxxx to use for call tip information bool UseStyleCallTip() const { return useStyleCallTip;} // Modify foreground and background colours void SetForeBack(const ColourPair &fore, const ColourPair &back); }; #ifdef SCI_NAMESPACE } #endif #endif tora-2.1.3/src/qscintilla2/src/CellBuffer.cpp0000644000175000017500000004212411213435521020570 0ustar michaelmichael// Scintilla source code edit control /** @file CellBuffer.cxx ** Manages a buffer of cells. **/ // Copyright 1998-2001 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include "Platform.h" #include "Scintilla.h" #include "SplitVector.h" #include "Partitioning.h" #include "CellBuffer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif LineVector::LineVector() : starts(256) { Init(); } LineVector::~LineVector() { starts.DeleteAll(); } void LineVector::Init() { starts.DeleteAll(); } void LineVector::SetPerLine(PerLine *pl) { perLine = pl; } void LineVector::InsertText(int line, int delta) { starts.InsertText(line, delta); } void LineVector::InsertLine(int line, int position) { starts.InsertPartition(line, position); if (perLine) { perLine->InsertLine(line); } } void LineVector::SetLineStart(int line, int position) { starts.SetPartitionStartPosition(line, position); } void LineVector::RemoveLine(int line) { starts.RemovePartition(line); if (perLine) { perLine->RemoveLine(line); } } int LineVector::LineFromPosition(int pos) { return starts.PartitionFromPosition(pos); } Action::Action() { at = startAction; position = 0; data = 0; lenData = 0; } Action::~Action() { Destroy(); } void Action::Create(actionType at_, int position_, char *data_, int lenData_, bool mayCoalesce_) { delete []data; position = position_; at = at_; data = data_; lenData = lenData_; mayCoalesce = mayCoalesce_; } void Action::Destroy() { delete []data; data = 0; } void Action::Grab(Action *source) { delete []data; position = source->position; at = source->at; data = source->data; lenData = source->lenData; mayCoalesce = source->mayCoalesce; // Ownership of source data transferred to this source->position = 0; source->at = startAction; source->data = 0; source->lenData = 0; source->mayCoalesce = true; } // The undo history stores a sequence of user operations that represent the user's view of the // commands executed on the text. // Each user operation contains a sequence of text insertion and text deletion actions. // All the user operations are stored in a list of individual actions with 'start' actions used // as delimiters between user operations. // Initially there is one start action in the history. // As each action is performed, it is recorded in the history. The action may either become // part of the current user operation or may start a new user operation. If it is to be part of the // current operation, then it overwrites the current last action. If it is to be part of a new // operation, it is appended after the current last action. // After writing the new action, a new start action is appended at the end of the history. // The decision of whether to start a new user operation is based upon two factors. If a // compound operation has been explicitly started by calling BeginUndoAction and no matching // EndUndoAction (these calls nest) has been called, then the action is coalesced into the current // operation. If there is no outstanding BeginUndoAction call then a new operation is started // unless it looks as if the new action is caused by the user typing or deleting a stream of text. // Sequences that look like typing or deletion are coalesced into a single user operation. UndoHistory::UndoHistory() { lenActions = 100; actions = new Action[lenActions]; maxAction = 0; currentAction = 0; undoSequenceDepth = 0; savePoint = 0; actions[currentAction].Create(startAction); } UndoHistory::~UndoHistory() { delete []actions; actions = 0; } void UndoHistory::EnsureUndoRoom() { // Have to test that there is room for 2 more actions in the array // as two actions may be created by the calling function if (currentAction >= (lenActions - 2)) { // Run out of undo nodes so extend the array int lenActionsNew = lenActions * 2; Action *actionsNew = new Action[lenActionsNew]; if (!actionsNew) return; for (int act = 0; act <= currentAction; act++) actionsNew[act].Grab(&actions[act]); delete []actions; lenActions = lenActionsNew; actions = actionsNew; } } void UndoHistory::AppendAction(actionType at, int position, char *data, int lengthData, bool &startSequence, bool mayCoalesce) { EnsureUndoRoom(); //Platform::DebugPrintf("%% %d action %d %d %d\n", at, position, lengthData, currentAction); //Platform::DebugPrintf("^ %d action %d %d\n", actions[currentAction - 1].at, // actions[currentAction - 1].position, actions[currentAction - 1].lenData); if (currentAction < savePoint) { savePoint = -1; } int oldCurrentAction = currentAction; if (currentAction >= 1) { if (0 == undoSequenceDepth) { // Top level actions may not always be coalesced int targetAct = -1; const Action *actPrevious = &(actions[currentAction + targetAct]); // Container actions may forward the coalesce state of Scintilla Actions. while ((actPrevious->at == containerAction) && actPrevious->mayCoalesce) { targetAct--; actPrevious = &(actions[currentAction + targetAct]); } // See if current action can be coalesced into previous action // Will work if both are inserts or deletes and position is same if (currentAction == savePoint) { currentAction++; } else if (!actions[currentAction].mayCoalesce) { // Not allowed to coalesce if this set currentAction++; } else if (!mayCoalesce || !actPrevious->mayCoalesce) { currentAction++; } else if (at == containerAction || actions[currentAction].at == containerAction) { ; // A coalescible containerAction } else if ((at != actPrevious->at) && (actPrevious->at != startAction)) { currentAction++; } else if ((at == insertAction) && (position != (actPrevious->position + actPrevious->lenData))) { // Insertions must be immediately after to coalesce currentAction++; } else if (at == removeAction) { if ((lengthData == 1) || (lengthData == 2)){ if ((position + lengthData) == actPrevious->position) { ; // Backspace -> OK } else if (position == actPrevious->position) { ; // Delete -> OK } else { // Removals must be at same position to coalesce currentAction++; } } else { // Removals must be of one character to coalesce currentAction++; } } else { // Action coalesced. } } else { // Actions not at top level are always coalesced unless this is after return to top level if (!actions[currentAction].mayCoalesce) currentAction++; } } else { currentAction++; } startSequence = oldCurrentAction != currentAction; actions[currentAction].Create(at, position, data, lengthData, mayCoalesce); currentAction++; actions[currentAction].Create(startAction); maxAction = currentAction; } void UndoHistory::BeginUndoAction() { EnsureUndoRoom(); if (undoSequenceDepth == 0) { if (actions[currentAction].at != startAction) { currentAction++; actions[currentAction].Create(startAction); maxAction = currentAction; } actions[currentAction].mayCoalesce = false; } undoSequenceDepth++; } void UndoHistory::EndUndoAction() { PLATFORM_ASSERT(undoSequenceDepth > 0); EnsureUndoRoom(); undoSequenceDepth--; if (0 == undoSequenceDepth) { if (actions[currentAction].at != startAction) { currentAction++; actions[currentAction].Create(startAction); maxAction = currentAction; } actions[currentAction].mayCoalesce = false; } } void UndoHistory::DropUndoSequence() { undoSequenceDepth = 0; } void UndoHistory::DeleteUndoHistory() { for (int i = 1; i < maxAction; i++) actions[i].Destroy(); maxAction = 0; currentAction = 0; actions[currentAction].Create(startAction); savePoint = 0; } void UndoHistory::SetSavePoint() { savePoint = currentAction; } bool UndoHistory::IsSavePoint() const { return savePoint == currentAction; } bool UndoHistory::CanUndo() const { return (currentAction > 0) && (maxAction > 0); } int UndoHistory::StartUndo() { // Drop any trailing startAction if (actions[currentAction].at == startAction && currentAction > 0) currentAction--; // Count the steps in this action int act = currentAction; while (actions[act].at != startAction && act > 0) { act--; } return currentAction - act; } const Action &UndoHistory::GetUndoStep() const { return actions[currentAction]; } void UndoHistory::CompletedUndoStep() { currentAction--; } bool UndoHistory::CanRedo() const { return maxAction > currentAction; } int UndoHistory::StartRedo() { // Drop any leading startAction if (actions[currentAction].at == startAction && currentAction < maxAction) currentAction++; // Count the steps in this action int act = currentAction; while (actions[act].at != startAction && act < maxAction) { act++; } return act - currentAction; } const Action &UndoHistory::GetRedoStep() const { return actions[currentAction]; } void UndoHistory::CompletedRedoStep() { currentAction++; } CellBuffer::CellBuffer() { readOnly = false; collectingUndo = true; } CellBuffer::~CellBuffer() { } char CellBuffer::CharAt(int position) const { return substance.ValueAt(position); } void CellBuffer::GetCharRange(char *buffer, int position, int lengthRetrieve) { if (lengthRetrieve < 0) return; if (position < 0) return; if ((position + lengthRetrieve) > substance.Length()) { Platform::DebugPrintf("Bad GetCharRange %d for %d of %d\n", position, lengthRetrieve, substance.Length()); return; } for (int i=0; i((curVal & ~mask) | styleValue)); return true; } else { return false; } } bool CellBuffer::SetStyleFor(int position, int lengthStyle, char styleValue, char mask) { bool changed = false; PLATFORM_ASSERT(lengthStyle == 0 || (lengthStyle > 0 && lengthStyle + position <= style.Length())); while (lengthStyle--) { char curVal = style.ValueAt(position); if ((curVal & mask) != styleValue) { style.SetValueAt(position, static_cast((curVal & ~mask) | styleValue)); changed = true; } position++; } return changed; } // The char* returned is to an allocation owned by the undo history const char *CellBuffer::DeleteChars(int position, int deleteLength, bool &startSequence) { // InsertString and DeleteChars are the bottleneck though which all changes occur PLATFORM_ASSERT(deleteLength > 0); char *data = 0; if (!readOnly) { if (collectingUndo) { // Save into the undo/redo stack, but only the characters - not the formatting data = new char[deleteLength]; for (int i = 0; i < deleteLength; i++) { data[i] = substance.ValueAt(position + i); } uh.AppendAction(removeAction, position, data, deleteLength, startSequence); } BasicDeleteChars(position, deleteLength); } return data; } int CellBuffer::Length() const { return substance.Length(); } void CellBuffer::Allocate(int newSize) { substance.ReAllocate(newSize); style.ReAllocate(newSize); } void CellBuffer::SetPerLine(PerLine *pl) { lv.SetPerLine(pl); } int CellBuffer::Lines() const { return lv.Lines(); } int CellBuffer::LineStart(int line) const { if (line < 0) return 0; else if (line >= Lines()) return Length(); else return lv.LineStart(line); } bool CellBuffer::IsReadOnly() { return readOnly; } void CellBuffer::SetReadOnly(bool set) { readOnly = set; } void CellBuffer::SetSavePoint() { uh.SetSavePoint(); } bool CellBuffer::IsSavePoint() { return uh.IsSavePoint(); } // Without undo void CellBuffer::InsertLine(int line, int position) { lv.InsertLine(line, position); } void CellBuffer::RemoveLine(int line) { lv.RemoveLine(line); } void CellBuffer::BasicInsertString(int position, const char *s, int insertLength) { if (insertLength == 0) return; PLATFORM_ASSERT(insertLength > 0); substance.InsertFromArray(position, s, 0, insertLength); style.InsertValue(position, insertLength, 0); int lineInsert = lv.LineFromPosition(position) + 1; // Point all the lines after the insertion point further along in the buffer lv.InsertText(lineInsert-1, insertLength); char chPrev = substance.ValueAt(position - 1); char chAfter = substance.ValueAt(position + insertLength); if (chPrev == '\r' && chAfter == '\n') { // Splitting up a crlf pair at position InsertLine(lineInsert, position); lineInsert++; } char ch = ' '; for (int i = 0; i < insertLength; i++) { ch = s[i]; if (ch == '\r') { InsertLine(lineInsert, (position + i) + 1); lineInsert++; } else if (ch == '\n') { if (chPrev == '\r') { // Patch up what was end of line lv.SetLineStart(lineInsert - 1, (position + i) + 1); } else { InsertLine(lineInsert, (position + i) + 1); lineInsert++; } } chPrev = ch; } // Joining two lines where last insertion is cr and following substance starts with lf if (chAfter == '\n') { if (ch == '\r') { // End of line already in buffer so drop the newly created one RemoveLine(lineInsert - 1); } } } void CellBuffer::BasicDeleteChars(int position, int deleteLength) { if (deleteLength == 0) return; if ((position == 0) && (deleteLength == substance.Length())) { // If whole buffer is being deleted, faster to reinitialise lines data // than to delete each line. lv.Init(); } else { // Have to fix up line positions before doing deletion as looking at text in buffer // to work out which lines have been removed int lineRemove = lv.LineFromPosition(position) + 1; lv.InsertText(lineRemove-1, - (deleteLength)); char chPrev = substance.ValueAt(position - 1); char chBefore = chPrev; char chNext = substance.ValueAt(position); bool ignoreNL = false; if (chPrev == '\r' && chNext == '\n') { // Move back one lv.SetLineStart(lineRemove, position); lineRemove++; ignoreNL = true; // First \n is not real deletion } char ch = chNext; for (int i = 0; i < deleteLength; i++) { chNext = substance.ValueAt(position + i + 1); if (ch == '\r') { if (chNext != '\n') { RemoveLine(lineRemove); } } else if (ch == '\n') { if (ignoreNL) { ignoreNL = false; // Further \n are real deletions } else { RemoveLine(lineRemove); } } ch = chNext; } // May have to fix up end if last deletion causes cr to be next to lf // or removes one of a crlf pair char chAfter = substance.ValueAt(position + deleteLength); if (chBefore == '\r' && chAfter == '\n') { // Using lineRemove-1 as cr ended line before start of deletion RemoveLine(lineRemove - 1); lv.SetLineStart(lineRemove - 1, position + 1); } } substance.DeleteRange(position, deleteLength); style.DeleteRange(position, deleteLength); } bool CellBuffer::SetUndoCollection(bool collectUndo) { collectingUndo = collectUndo; uh.DropUndoSequence(); return collectingUndo; } bool CellBuffer::IsCollectingUndo() { return collectingUndo; } void CellBuffer::BeginUndoAction() { uh.BeginUndoAction(); } void CellBuffer::EndUndoAction() { uh.EndUndoAction(); } void CellBuffer::AddUndoAction(int token, bool mayCoalesce) { bool startSequence; uh.AppendAction(containerAction, token, 0, 0, startSequence, mayCoalesce); } void CellBuffer::DeleteUndoHistory() { uh.DeleteUndoHistory(); } bool CellBuffer::CanUndo() { return uh.CanUndo(); } int CellBuffer::StartUndo() { return uh.StartUndo(); } const Action &CellBuffer::GetUndoStep() const { return uh.GetUndoStep(); } void CellBuffer::PerformUndoStep() { const Action &actionStep = uh.GetUndoStep(); if (actionStep.at == insertAction) { BasicDeleteChars(actionStep.position, actionStep.lenData); } else if (actionStep.at == removeAction) { BasicInsertString(actionStep.position, actionStep.data, actionStep.lenData); } uh.CompletedUndoStep(); } bool CellBuffer::CanRedo() { return uh.CanRedo(); } int CellBuffer::StartRedo() { return uh.StartRedo(); } const Action &CellBuffer::GetRedoStep() const { return uh.GetRedoStep(); } void CellBuffer::PerformRedoStep() { const Action &actionStep = uh.GetRedoStep(); if (actionStep.at == insertAction) { BasicInsertString(actionStep.position, actionStep.data, actionStep.lenData); } else if (actionStep.at == removeAction) { BasicDeleteChars(actionStep.position, actionStep.lenData); } uh.CompletedRedoStep(); } tora-2.1.3/src/qscintilla2/src/LexPB.cpp0000644000175000017500000003027411213435521017534 0ustar michaelmichael// Scintilla source code edit control // @file LexPB.cxx // Lexer for PowerBasic by Roland Walter, roland@rowalt.de (for PowerBasic see www.powerbasic.com) // // Changes: // 17.10.2003: Toggling of subs/functions now until next sub/function - this gives better results // 29.10.2003: 1. Bug: Toggling didn't work for subs/functions added in editor // 2. Own colors for PB constants and Inline Assembler SCE_B_CONSTANT and SCE_B_ASM // 3. Several smaller syntax coloring improvements and speed optimizations // 12.07.2004: 1. Toggling for macros added // 2. Further folding speed optimitations (for people dealing with very large listings) // // Necessary changes for the PB lexer in Scintilla project: // - In SciLexer.h and Scintilla.iface: // // #define SCLEX_POWERBASIC 51 //ID for PowerBasic lexer // (...) // #define SCE_B_DEFAULT 0 //in both VB and PB lexer // #define SCE_B_COMMENT 1 //in both VB and PB lexer // #define SCE_B_NUMBER 2 //in both VB and PB lexer // #define SCE_B_KEYWORD 3 //in both VB and PB lexer // #define SCE_B_STRING 4 //in both VB and PB lexer // #define SCE_B_PREPROCESSOR 5 //VB lexer only, not in PB lexer // #define SCE_B_OPERATOR 6 //in both VB and PB lexer // #define SCE_B_IDENTIFIER 7 //in both VB and PB lexer // #define SCE_B_DATE 8 //VB lexer only, not in PB lexer // #define SCE_B_CONSTANT 13 //PB lexer only, not in VB lexer // #define SCE_B_ASM 14 //PB lexer only, not in VB lexer // - Statement added to KeyWords.cxx: 'LINK_LEXER(lmPB);' // - Statement added to scintilla_vc6.mak: '$(DIR_O)\LexPB.obj: ...\src\LexPB.cxx $(LEX_HEADERS)' // // Copyright for Scintilla: 1998-2001 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsTypeCharacter(const int ch) { return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$' || ch == '?'; } static inline bool IsAWordChar(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); } static inline bool IsAWordStart(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_'); } bool MatchUpperCase(Accessor &styler, int pos, const char *s) //Same as styler.Match() but uppercase comparison (a-z,A-Z and space only) { char ch; for (int i=0; *s; i++) { ch=styler.SafeGetCharAt(pos+i); if (ch > 0x60) ch -= '\x20'; if (*s != ch) return false; s++; } return true; } static void ColourisePBDoc(unsigned int startPos, int length, int initStyle,WordList *keywordlists[],Accessor &styler) { WordList &keywords = *keywordlists[0]; styler.StartAt(startPos); StyleContext sc(startPos, length, initStyle, styler); for (; sc.More(); sc.Forward()) { switch (sc.state) { case SCE_B_OPERATOR: { sc.SetState(SCE_B_DEFAULT); break; } case SCE_B_KEYWORD: { if (!IsAWordChar(sc.ch)) { if (!IsTypeCharacter(sc.ch)) { char s[100]; sc.GetCurrentLowered(s, sizeof(s)); if (keywords.InList(s)) { if (strcmp(s, "rem") == 0) { sc.ChangeState(SCE_B_COMMENT); if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);} } else if (strcmp(s, "asm") == 0) { sc.ChangeState(SCE_B_ASM); if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);} } else { sc.SetState(SCE_B_DEFAULT); } } else { sc.ChangeState(SCE_B_IDENTIFIER); sc.SetState(SCE_B_DEFAULT); } } } break; } case SCE_B_NUMBER: { if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_B_DEFAULT);} break; } case SCE_B_STRING: { if (sc.ch == '\"'){sc.ForwardSetState(SCE_B_DEFAULT);} break; } case SCE_B_CONSTANT: { if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_B_DEFAULT);} break; } case SCE_B_COMMENT: { if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);} break; } case SCE_B_ASM: { if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);} break; } } //switch (sc.state) // Determine if a new state should be entered: if (sc.state == SCE_B_DEFAULT) { if (sc.ch == '\'') {sc.SetState(SCE_B_COMMENT);} else if (sc.ch == '\"') {sc.SetState(SCE_B_STRING);} else if (sc.ch == '&' && tolower(sc.chNext) == 'h') {sc.SetState(SCE_B_NUMBER);} else if (sc.ch == '&' && tolower(sc.chNext) == 'b') {sc.SetState(SCE_B_NUMBER);} else if (sc.ch == '&' && tolower(sc.chNext) == 'o') {sc.SetState(SCE_B_NUMBER);} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {sc.SetState(SCE_B_NUMBER);} else if (IsAWordStart(sc.ch)) {sc.SetState(SCE_B_KEYWORD);} else if (sc.ch == '%') {sc.SetState(SCE_B_CONSTANT);} else if (sc.ch == '$') {sc.SetState(SCE_B_CONSTANT);} else if (sc.ch == '#') {sc.SetState(SCE_B_KEYWORD);} else if (sc.ch == '!') {sc.SetState(SCE_B_ASM);} else if (isoperator(static_cast(sc.ch)) || (sc.ch == '\\')) {sc.SetState(SCE_B_OPERATOR);} } } //for (; sc.More(); sc.Forward()) sc.Complete(); } //The folding routine for PowerBasic toggles SUBs and FUNCTIONs only. This was exactly what I wanted, //nothing more. I had worked with this kind of toggling for several years when I used the great good old //GFA Basic which is dead now. After testing the feature of toggling FOR-NEXT loops, WHILE-WEND loops //and so on too I found this is more disturbing then helping (for me). So if You think in another way //you can (or must) write Your own toggling routine ;-) static void FoldPBDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { // No folding enabled, no reason to continue... if( styler.GetPropertyInt("fold") == 0 ) return; unsigned int endPos = startPos + length; int lineCurrent = styler.GetLine(startPos); int levelCurrent = SC_FOLDLEVELBASE; if (lineCurrent > 0) levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; int levelNext = levelCurrent; char chNext = styler[startPos]; bool fNewLine=true; bool fMightBeMultiLineMacro=false; bool fBeginOfCommentFound=false; for (unsigned int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); if (fNewLine) //Begin of a new line (The Sub/Function/Macro keywords may occur at begin of line only) { fNewLine=false; fBeginOfCommentFound=false; switch (ch) { case ' ': //Most lines start with space - so check this first, the code is the same as for 'default:' case '\t': //Handle tab too { int levelUse = levelCurrent; int lev = levelUse | levelNext << 16; styler.SetLevel(lineCurrent, lev); break; } case 'F': case 'f': { switch (chNext) { case 'U': case 'u': { if( MatchUpperCase(styler,i,"FUNCTION") ) { styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG); levelNext=SC_FOLDLEVELBASE+1; } break; } } break; } case 'S': case 's': { switch (chNext) { case 'U': case 'u': { if( MatchUpperCase(styler,i,"SUB") ) { styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG); levelNext=SC_FOLDLEVELBASE+1; } break; } case 'T': case 't': { if( MatchUpperCase(styler,i,"STATIC FUNCTION") ) { styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG); levelNext=SC_FOLDLEVELBASE+1; } else if( MatchUpperCase(styler,i,"STATIC SUB") ) { styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG); levelNext=SC_FOLDLEVELBASE+1; } break; } } break; } case 'C': case 'c': { switch (chNext) { case 'A': case 'a': { if( MatchUpperCase(styler,i,"CALLBACK FUNCTION") ) { styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG); levelNext=SC_FOLDLEVELBASE+1; } break; } } break; } case 'M': case 'm': { switch (chNext) { case 'A': case 'a': { if( MatchUpperCase(styler,i,"MACRO") ) { fMightBeMultiLineMacro=true; //Set folder level at end of line, we have to check for single line macro } break; } } break; } default: { int levelUse = levelCurrent; int lev = levelUse | levelNext << 16; styler.SetLevel(lineCurrent, lev); break; } } //switch (ch) } //if( fNewLine ) switch (ch) { case '=': //To test single line macros { if (fBeginOfCommentFound==false) fMightBeMultiLineMacro=false; //The found macro is a single line macro only; break; } case '\'': //A comment starts { fBeginOfCommentFound=true; break; } case '\n': { if (fMightBeMultiLineMacro) //The current line is the begin of a multi line macro { fMightBeMultiLineMacro=false; styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG); levelNext=SC_FOLDLEVELBASE+1; } lineCurrent++; levelCurrent = levelNext; fNewLine=true; break; } case '\r': { if (chNext != '\n') { lineCurrent++; levelCurrent = levelNext; fNewLine=true; } break; } } //switch (ch) } //for (unsigned int i = startPos; i < endPos; i++) } static const char * const pbWordListDesc[] = { "Keywords", 0 }; LexerModule lmPB(SCLEX_POWERBASIC, ColourisePBDoc, "powerbasic", FoldPBDoc, pbWordListDesc); tora-2.1.3/src/qscintilla2/src/RESearch.cpp0000644000175000017500000006361111213435521020217 0ustar michaelmichael// Scintilla source code edit control /** @file RESearch.cxx ** Regular expression search library. **/ /* * regex - Regular expression pattern matching and replacement * * By: Ozan S. Yigit (oz) * Dept. of Computer Science * York University * * Original code available from http://www.cs.yorku.ca/~oz/ * Translation to C++ by Neil Hodgson neilh@scintilla.org * Removed all use of register. * Converted to modern function prototypes. * Put all global/static variables into an object so this code can be * used from multiple threads, etc. * Some extensions by Philippe Lhoste PhiLho(a)GMX.net * * These routines are the PUBLIC DOMAIN equivalents of regex * routines as found in 4.nBSD UN*X, with minor extensions. * * These routines are derived from various implementations found * in software tools books, and Conroy's grep. They are NOT derived * from licensed/restricted software. * For more interesting/academic/complicated implementations, * see Henry Spencer's regexp routines, or GNU Emacs pattern * matching module. * * Modification history removed. * * Interfaces: * RESearch::Compile: compile a regular expression into a NFA. * * const char *RESearch::Compile(const char *pattern, int length, * bool caseSensitive, bool posix) * * Returns a short error string if they fail. * * RESearch::Execute: execute the NFA to match a pattern. * * int RESearch::Execute(characterIndexer &ci, int lp, int endp) * * RESearch::Substitute: substitute the matched portions in a new string. * * int RESearch::Substitute(CharacterIndexer &ci, char *src, char *dst) * * re_fail: failure routine for RESearch::Execute. (no longer used) * * void re_fail(char *msg, char op) * * Regular Expressions: * * [1] char matches itself, unless it is a special * character (metachar): . \ [ ] * + ^ $ * and ( ) if posix option. * * [2] . matches any character. * * [3] \ matches the character following it, except: * - \a, \b, \f, \n, \r, \t, \v match the corresponding C * escape char, respectively BEL, BS, FF, LF, CR, TAB and VT; * Note that \r and \n are never matched because Scintilla * regex searches are made line per line * (stripped of end-of-line chars). * - if not in posix mode, when followed by a * left or right round bracket (see [7]); * - when followed by a digit 1 to 9 (see [8]); * - when followed by a left or right angle bracket * (see [9]); * - when followed by d, D, s, S, w or W (see [10]); * - when followed by x and two hexa digits (see [11]. * Backslash is used as an escape character for all * other meta-characters, and itself. * * [4] [set] matches one of the characters in the set. * If the first character in the set is "^", * it matches the characters NOT in the set, i.e. * complements the set. A shorthand S-E (start dash end) * is used to specify a set of characters S up to * E, inclusive. S and E must be characters, otherwise * the dash is taken literally (eg. in expression [\d-a]). * The special characters "]" and "-" have no special * meaning if they appear as the first chars in the set. * To include both, put - first: [-]A-Z] * (or just backslash them). * examples: match: * * [-]|] matches these 3 chars, * * []-|] matches from ] to | chars * * [a-z] any lowercase alpha * * [^-]] any char except - and ] * * [^A-Z] any char except uppercase * alpha * * [a-zA-Z] any alpha * * [5] * any regular expression form [1] to [4] * (except [7], [8] and [9] forms of [3]), * followed by closure char (*) * matches zero or more matches of that form. * * [6] + same as [5], except it matches one or more. * Both [5] and [6] are greedy (they match as much as possible). * * [7] a regular expression in the form [1] to [12], enclosed * as \(form\) (or (form) with posix flag) matches what * form matches. The enclosure creates a set of tags, * used for [8] and for pattern substitution. * The tagged forms are numbered starting from 1. * * [8] a \ followed by a digit 1 to 9 matches whatever a * previously tagged regular expression ([7]) matched. * * [9] \< a regular expression starting with a \< construct * \> and/or ending with a \> construct, restricts the * pattern matching to the beginning of a word, and/or * the end of a word. A word is defined to be a character * string beginning and/or ending with the characters * A-Z a-z 0-9 and _. Scintilla extends this definition * by user setting. The word must also be preceded and/or * followed by any character outside those mentioned. * * [10] \l a backslash followed by d, D, s, S, w or W, * becomes a character class (both inside and * outside sets []). * d: decimal digits * D: any char except decimal digits * s: whitespace (space, \t \n \r \f \v) * S: any char except whitespace (see above) * w: alphanumeric & underscore (changed by user setting) * W: any char except alphanumeric & underscore (see above) * * [11] \xHH a backslash followed by x and two hexa digits, * becomes the character whose Ascii code is equal * to these digits. If not followed by two digits, * it is 'x' char itself. * * [12] a composite regular expression xy where x and y * are in the form [1] to [11] matches the longest * match of x followed by a match for y. * * [13] ^ a regular expression starting with a ^ character * $ and/or ending with a $ character, restricts the * pattern matching to the beginning of the line, * or the end of line. [anchors] Elsewhere in the * pattern, ^ and $ are treated as ordinary characters. * * * Acknowledgements: * * HCR's Hugh Redelmeier has been most helpful in various * stages of development. He convinced me to include BOW * and EOW constructs, originally invented by Rob Pike at * the University of Toronto. * * References: * Software tools Kernighan & Plauger * Software tools in Pascal Kernighan & Plauger * Grep [rsx-11 C dist] David Conroy * ed - text editor Un*x Programmer's Manual * Advanced editing on Un*x B. W. Kernighan * RegExp routines Henry Spencer * * Notes: * * This implementation uses a bit-set representation for character * classes for speed and compactness. Each character is represented * by one bit in a 256-bit block. Thus, CCL always takes a * constant 32 bytes in the internal nfa, and RESearch::Execute does a single * bit comparison to locate the character in the set. * * Examples: * * pattern: foo*.* * compile: CHR f CHR o CLO CHR o END CLO ANY END END * matches: fo foo fooo foobar fobar foxx ... * * pattern: fo[ob]a[rz] * compile: CHR f CHR o CCL bitset CHR a CCL bitset END * matches: fobar fooar fobaz fooaz * * pattern: foo\\+ * compile: CHR f CHR o CHR o CHR \ CLO CHR \ END END * matches: foo\ foo\\ foo\\\ ... * * pattern: \(foo\)[1-3]\1 (same as foo[1-3]foo) * compile: BOT 1 CHR f CHR o CHR o EOT 1 CCL bitset REF 1 END * matches: foo1foo foo2foo foo3foo * * pattern: \(fo.*\)-\1 * compile: BOT 1 CHR f CHR o CLO ANY END EOT 1 CHR - REF 1 END * matches: foo-foo fo-fo fob-fob foobar-foobar ... */ #include "CharClassify.h" #include "RESearch.h" // Shut up annoying Visual C++ warnings: #ifdef _MSC_VER #pragma warning(disable: 4514) #endif #ifdef SCI_NAMESPACE using namespace Scintilla; #endif #define OKP 1 #define NOP 0 #define CHR 1 #define ANY 2 #define CCL 3 #define BOL 4 #define EOL 5 #define BOT 6 #define EOT 7 #define BOW 8 #define EOW 9 #define REF 10 #define CLO 11 #define END 0 /* * The following defines are not meant to be changeable. * They are for readability only. */ #define BLKIND 0370 #define BITIND 07 const char bitarr[] = { 1, 2, 4, 8, 16, 32, 64, '\200' }; #define badpat(x) (*nfa = END, x) /* * Character classification table for word boundary operators BOW * and EOW is passed in by the creator of this object (Scintilla * Document). The Document default state is that word chars are: * 0-9, a-z, A-Z and _ */ RESearch::RESearch(CharClassify *charClassTable) { charClass = charClassTable; Init(); } RESearch::~RESearch() { Clear(); } void RESearch::Init() { sta = NOP; /* status of lastpat */ bol = 0; for (int i = 0; i < MAXTAG; i++) pat[i] = 0; for (int j = 0; j < BITBLK; j++) bittab[j] = 0; } void RESearch::Clear() { for (int i = 0; i < MAXTAG; i++) { delete []pat[i]; pat[i] = 0; bopat[i] = NOTFOUND; eopat[i] = NOTFOUND; } } bool RESearch::GrabMatches(CharacterIndexer &ci) { bool success = true; for (unsigned int i = 0; i < MAXTAG; i++) { if ((bopat[i] != NOTFOUND) && (eopat[i] != NOTFOUND)) { unsigned int len = eopat[i] - bopat[i]; pat[i] = new char[len + 1]; if (pat[i]) { for (unsigned int j = 0; j < len; j++) pat[i][j] = ci.CharAt(bopat[i] + j); pat[i][len] = '\0'; } else { success = false; } } } return success; } void RESearch::ChSet(unsigned char c) { bittab[((c) & BLKIND) >> 3] |= bitarr[(c) & BITIND]; } void RESearch::ChSetWithCase(unsigned char c, bool caseSensitive) { if (caseSensitive) { ChSet(c); } else { if ((c >= 'a') && (c <= 'z')) { ChSet(c); ChSet(static_cast(c - 'a' + 'A')); } else if ((c >= 'A') && (c <= 'Z')) { ChSet(c); ChSet(static_cast(c - 'A' + 'a')); } else { ChSet(c); } } } const unsigned char escapeValue(unsigned char ch) { switch (ch) { case 'a': return '\a'; case 'b': return '\b'; case 'f': return '\f'; case 'n': return '\n'; case 'r': return '\r'; case 't': return '\t'; case 'v': return '\v'; } return 0; } static int GetHexaChar(unsigned char hd1, unsigned char hd2) { int hexValue = 0; if (hd1 >= '0' && hd1 <= '9') { hexValue += 16 * (hd1 - '0'); } else if (hd1 >= 'A' && hd1 <= 'F') { hexValue += 16 * (hd1 - 'A' + 10); } else if (hd1 >= 'a' && hd1 <= 'f') { hexValue += 16 * (hd1 - 'a' + 10); } else return -1; if (hd2 >= '0' && hd2 <= '9') { hexValue += hd2 - '0'; } else if (hd2 >= 'A' && hd2 <= 'F') { hexValue += hd2 - 'A' + 10; } else if (hd2 >= 'a' && hd2 <= 'f') { hexValue += hd2 - 'a' + 10; } else return -1; return hexValue; } /** * Called when the parser finds a backslash not followed * by a valid expression (like \( in non-Posix mode). * @param pattern: pointer on the char after the backslash. * @param incr: (out) number of chars to skip after expression evaluation. * @return the char if it resolves to a simple char, * or -1 for a char class. In this case, bittab is changed. */ int RESearch::GetBackslashExpression( const char *pattern, int &incr) { // Since error reporting is primitive and messages are not used anyway, // I choose to interpret unexpected syntax in a logical way instead // of reporting errors. Otherwise, we can stick on, eg., PCRE behavior. incr = 0; // Most of the time, will skip the char "naturally". int c; int result = -1; unsigned char bsc = *pattern; if (!bsc) { // Avoid overrun result = '\\'; // \ at end of pattern, take it literally return result; } switch (bsc) { case 'a': case 'b': case 'n': case 'f': case 'r': case 't': case 'v': result = escapeValue(bsc); break; case 'x': { unsigned char hd1 = *(pattern + 1); unsigned char hd2 = *(pattern + 2); int hexValue = GetHexaChar(hd1, hd2); if (hexValue >= 0) { result = hexValue; incr = 2; // Must skip the digits } else { result = 'x'; // \x without 2 digits: see it as 'x' } } break; case 'd': for (c = '0'; c <= '9'; c++) { ChSet(static_cast(c)); } break; case 'D': for (c = 0; c < MAXCHR; c++) { if (c < '0' || c > '9') { ChSet(static_cast(c)); } } break; case 's': ChSet(' '); ChSet('\t'); ChSet('\n'); ChSet('\r'); ChSet('\f'); ChSet('\v'); break; case 'S': for (c = 0; c < MAXCHR; c++) { if (c != ' ' && !(c >= 0x09 && c <= 0x0D)) { ChSet(static_cast(c)); } } case 'w': for (c = 0; c < MAXCHR; c++) { if (iswordc(static_cast(c))) { ChSet(static_cast(c)); } } break; case 'W': for (c = 0; c < MAXCHR; c++) { if (!iswordc(static_cast(c))) { ChSet(static_cast(c)); } } break; default: result = bsc; } return result; } const char *RESearch::Compile(const char *pattern, int length, bool caseSensitive, bool posix) { char *mp=nfa; /* nfa pointer */ char *lp; /* saved pointer */ char *sp=nfa; /* another one */ char *mpMax = mp + MAXNFA - BITBLK - 10; int tagi = 0; /* tag stack index */ int tagc = 1; /* actual tag count */ int n; char mask; /* xor mask -CCL/NCL */ int c1, c2, prevChar; if (!pattern || !length) { if (sta) return 0; else return badpat("No previous regular expression"); } sta = NOP; const char *p=pattern; /* pattern pointer */ for (int i=0; i mpMax) return badpat("Pattern too long"); lp = mp; switch (*p) { case '.': /* match any char */ *mp++ = ANY; break; case '^': /* match beginning */ if (p == pattern) *mp++ = BOL; else { *mp++ = CHR; *mp++ = *p; } break; case '$': /* match endofline */ if (!*(p+1)) *mp++ = EOL; else { *mp++ = CHR; *mp++ = *p; } break; case '[': /* match char class */ *mp++ = CCL; prevChar = 0; i++; if (*++p == '^') { mask = '\377'; i++; p++; } else mask = 0; if (*p == '-') { /* real dash */ i++; prevChar = *p; ChSet(*p++); } if (*p == ']') { /* real brace */ i++; prevChar = *p; ChSet(*p++); } while (*p && *p != ']') { if (*p == '-') { if (prevChar < 0) { // Previous def. was a char class like \d, take dash literally prevChar = *p; ChSet(*p); } else if (*(p+1)) { if (*(p+1) != ']') { c1 = prevChar + 1; i++; c2 = *++p; if (c2 == '\\') { if (!*(p+1)) // End of RE return badpat("Missing ]"); else { i++; p++; int incr; c2 = GetBackslashExpression(p, incr); i += incr; p += incr; if (c2 >= 0) { // Convention: \c (c is any char) is case sensitive, whatever the option ChSet(static_cast(c2)); prevChar = c2; } else { // bittab is already changed prevChar = -1; } } } if (prevChar < 0) { // Char after dash is char class like \d, take dash literally prevChar = '-'; ChSet('-'); } else { // Put all chars between c1 and c2 included in the char set while (c1 <= c2) { ChSetWithCase(static_cast(c1++), caseSensitive); } } } else { // Dash before the ], take it literally prevChar = *p; ChSet(*p); } } else { return badpat("Missing ]"); } } else if (*p == '\\' && *(p+1)) { i++; p++; int incr; int c = GetBackslashExpression(p, incr); i += incr; p += incr; if (c >= 0) { // Convention: \c (c is any char) is case sensitive, whatever the option ChSet(static_cast(c)); prevChar = c; } else { // bittab is already changed prevChar = -1; } } else { prevChar = *p; ChSetWithCase(*p, caseSensitive); } i++; p++; } if (!*p) return badpat("Missing ]"); for (n = 0; n < BITBLK; bittab[n++] = 0) *mp++ = static_cast(mask ^ bittab[n]); break; case '*': /* match 0 or more... */ case '+': /* match 1 or more... */ if (p == pattern) return badpat("Empty closure"); lp = sp; /* previous opcode */ if (*lp == CLO) /* equivalence... */ break; switch (*lp) { case BOL: case BOT: case EOT: case BOW: case EOW: case REF: return badpat("Illegal closure"); default: break; } if (*p == '+') for (sp = mp; lp < sp; lp++) *mp++ = *lp; *mp++ = END; *mp++ = END; sp = mp; while (--mp > lp) *mp = mp[-1]; *mp = CLO; mp = sp; break; case '\\': /* tags, backrefs... */ i++; switch (*++p) { case '<': *mp++ = BOW; break; case '>': if (*sp == BOW) return badpat("Null pattern inside \\<\\>"); *mp++ = EOW; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': n = *p-'0'; if (tagi > 0 && tagstk[tagi] == n) return badpat("Cyclical reference"); if (tagc > n) { *mp++ = static_cast(REF); *mp++ = static_cast(n); } else return badpat("Undetermined reference"); break; default: if (!posix && *p == '(') { if (tagc < MAXTAG) { tagstk[++tagi] = tagc; *mp++ = BOT; *mp++ = static_cast(tagc++); } else return badpat("Too many \\(\\) pairs"); } else if (!posix && *p == ')') { if (*sp == BOT) return badpat("Null pattern inside \\(\\)"); if (tagi > 0) { *mp++ = static_cast(EOT); *mp++ = static_cast(tagstk[tagi--]); } else return badpat("Unmatched \\)"); } else { int incr; int c = GetBackslashExpression(p, incr); i += incr; p += incr; if (c >= 0) { *mp++ = CHR; *mp++ = static_cast(c); } else { *mp++ = CCL; mask = 0; for (n = 0; n < BITBLK; bittab[n++] = 0) *mp++ = static_cast(mask ^ bittab[n]); } } } break; default : /* an ordinary char */ if (posix && *p == '(') { if (tagc < MAXTAG) { tagstk[++tagi] = tagc; *mp++ = BOT; *mp++ = static_cast(tagc++); } else return badpat("Too many () pairs"); } else if (posix && *p == ')') { if (*sp == BOT) return badpat("Null pattern inside ()"); if (tagi > 0) { *mp++ = static_cast(EOT); *mp++ = static_cast(tagstk[tagi--]); } else return badpat("Unmatched )"); } else { unsigned char c = *p; if (!c) // End of RE c = '\\'; // We take it as raw backslash if (caseSensitive || !iswordc(c)) { *mp++ = CHR; *mp++ = c; } else { *mp++ = CCL; mask = 0; ChSetWithCase(c, false); for (n = 0; n < BITBLK; bittab[n++] = 0) *mp++ = static_cast(mask ^ bittab[n]); } } break; } sp = lp; } if (tagi > 0) return badpat((posix ? "Unmatched (" : "Unmatched \\(")); *mp = END; sta = OKP; return 0; } /* * RESearch::Execute: * execute nfa to find a match. * * special cases: (nfa[0]) * BOL * Match only once, starting from the * beginning. * CHR * First locate the character without * calling PMatch, and if found, call * PMatch for the remaining string. * END * RESearch::Compile failed, poor luser did not * check for it. Fail fast. * * If a match is found, bopat[0] and eopat[0] are set * to the beginning and the end of the matched fragment, * respectively. * */ int RESearch::Execute(CharacterIndexer &ci, int lp, int endp) { unsigned char c; int ep = NOTFOUND; char *ap = nfa; bol = lp; failure = 0; Clear(); switch (*ap) { case BOL: /* anchored: match from BOL only */ ep = PMatch(ci, lp, endp, ap); break; case EOL: /* just searching for end of line normal path doesn't work */ if (*(ap+1) == END) { lp = endp; ep = lp; break; } else { return 0; } case CHR: /* ordinary char: locate it fast */ c = *(ap+1); while ((lp < endp) && (ci.CharAt(lp) != c)) lp++; if (lp >= endp) /* if EOS, fail, else fall thru. */ return 0; default: /* regular matching all the way. */ while (lp < endp) { ep = PMatch(ci, lp, endp, ap); if (ep != NOTFOUND) break; lp++; } break; case END: /* munged automaton. fail always */ return 0; } if (ep == NOTFOUND) return 0; bopat[0] = lp; eopat[0] = ep; return 1; } /* * PMatch: internal routine for the hard part * * This code is partly snarfed from an early grep written by * David Conroy. The backref and tag stuff, and various other * innovations are by oz. * * special case optimizations: (nfa[n], nfa[n+1]) * CLO ANY * We KNOW .* will match everything upto the * end of line. Thus, directly go to the end of * line, without recursive PMatch calls. As in * the other closure cases, the remaining pattern * must be matched by moving backwards on the * string recursively, to find a match for xy * (x is ".*" and y is the remaining pattern) * where the match satisfies the LONGEST match for * x followed by a match for y. * CLO CHR * We can again scan the string forward for the * single char and at the point of failure, we * execute the remaining nfa recursively, same as * above. * * At the end of a successful match, bopat[n] and eopat[n] * are set to the beginning and end of subpatterns matched * by tagged expressions (n = 1 to 9). */ extern void re_fail(char *,char); #define isinset(x,y) ((x)[((y)&BLKIND)>>3] & bitarr[(y)&BITIND]) /* * skip values for CLO XXX to skip past the closure */ #define ANYSKIP 2 /* [CLO] ANY END */ #define CHRSKIP 3 /* [CLO] CHR chr END */ #define CCLSKIP 34 /* [CLO] CCL 32 bytes END */ int RESearch::PMatch(CharacterIndexer &ci, int lp, int endp, char *ap) { int op, c, n; int e; /* extra pointer for CLO */ int bp; /* beginning of subpat... */ int ep; /* ending of subpat... */ int are; /* to save the line ptr. */ while ((op = *ap++) != END) switch (op) { case CHR: if (ci.CharAt(lp++) != *ap++) return NOTFOUND; break; case ANY: if (lp++ >= endp) return NOTFOUND; break; case CCL: if (lp >= endp) return NOTFOUND; c = ci.CharAt(lp++); if (!isinset(ap,c)) return NOTFOUND; ap += BITBLK; break; case BOL: if (lp != bol) return NOTFOUND; break; case EOL: if (lp < endp) return NOTFOUND; break; case BOT: bopat[*ap++] = lp; break; case EOT: eopat[*ap++] = lp; break; case BOW: if ((lp!=bol && iswordc(ci.CharAt(lp-1))) || !iswordc(ci.CharAt(lp))) return NOTFOUND; break; case EOW: if (lp==bol || !iswordc(ci.CharAt(lp-1)) || iswordc(ci.CharAt(lp))) return NOTFOUND; break; case REF: n = *ap++; bp = bopat[n]; ep = eopat[n]; while (bp < ep) if (ci.CharAt(bp++) != ci.CharAt(lp++)) return NOTFOUND; break; case CLO: are = lp; switch (*ap) { case ANY: while (lp < endp) lp++; n = ANYSKIP; break; case CHR: c = *(ap+1); while ((lp < endp) && (c == ci.CharAt(lp))) lp++; n = CHRSKIP; break; case CCL: while ((lp < endp) && isinset(ap+1,ci.CharAt(lp))) lp++; n = CCLSKIP; break; default: failure = true; //re_fail("closure: bad nfa.", *ap); return NOTFOUND; } ap += n; while (lp >= are) { if ((e = PMatch(ci, lp, endp, ap)) != NOTFOUND) return e; --lp; } return NOTFOUND; default: //re_fail("RESearch::Execute: bad nfa.", static_cast(op)); return NOTFOUND; } return lp; } /* * RESearch::Substitute: * substitute the matched portions of the src in dst. * * & substitute the entire matched pattern. * * \digit substitute a subpattern, with the given tag number. * Tags are numbered from 1 to 9. If the particular * tagged subpattern does not exist, null is substituted. */ int RESearch::Substitute(CharacterIndexer &ci, char *src, char *dst) { unsigned char c; int pin; int bp; int ep; if (!*src || !bopat[0]) return 0; while ((c = *src++) != 0) { switch (c) { case '&': pin = 0; break; case '\\': c = *src++; if (c >= '0' && c <= '9') { pin = c - '0'; break; } default: *dst++ = c; continue; } if ((bp = bopat[pin]) != 0 && (ep = eopat[pin]) != 0) { while (ci.CharAt(bp) && bp < ep) *dst++ = ci.CharAt(bp++); if (bp < ep) return 0; } } *dst = '\0'; return 1; } tora-2.1.3/src/qscintilla2/src/LexCLW.cpp0000644000175000017500000005275711213435521017672 0ustar michaelmichael// Scintilla source code edit control /** @file LexClw.cxx ** Lexer for Clarion. ** 2004/12/17 Updated Lexer **/ // Copyright 2003-2004 by Ron Schofield // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif // Is an end of line character inline bool IsEOL(const int ch) { return(ch == '\n'); } // Convert character to uppercase static char CharacterUpper(char chChar) { if (chChar < 'a' || chChar > 'z') { return(chChar); } else { return(static_cast(chChar - 'a' + 'A')); } } // Convert string to uppercase static void StringUpper(char *szString) { while (*szString) { *szString = CharacterUpper(*szString); szString++; } } // Is a label start character inline bool IsALabelStart(const int iChar) { return(isalpha(iChar) || iChar == '_'); } // Is a label character inline bool IsALabelCharacter(const int iChar) { return(isalnum(iChar) || iChar == '_' || iChar == ':'); } // Is the character is a ! and the the next character is not a ! inline bool IsACommentStart(const int iChar) { return(iChar == '!'); } // Is the character a Clarion hex character (ABCDEF) inline bool IsAHexCharacter(const int iChar, bool bCaseSensitive) { // Case insensitive. if (!bCaseSensitive) { if (strchr("ABCDEFabcdef", iChar) != NULL) { return(true); } } // Case sensitive else { if (strchr("ABCDEF", iChar) != NULL) { return(true); } } return(false); } // Is the character a Clarion base character (B=Binary, O=Octal, H=Hex) inline bool IsANumericBaseCharacter(const int iChar, bool bCaseSensitive) { // Case insensitive. if (!bCaseSensitive) { // If character is a numeric base character if (strchr("BOHboh", iChar) != NULL) { return(true); } } // Case sensitive else { // If character is a numeric base character if (strchr("BOH", iChar) != NULL) { return(true); } } return(false); } // Set the correct numeric constant state inline bool SetNumericConstantState(StyleContext &scDoc) { int iPoints = 0; // Point counter char cNumericString[512]; // Numeric string buffer // Buffer the current numberic string scDoc.GetCurrent(cNumericString, sizeof(cNumericString)); // Loop through the string until end of string (NULL termination) for (int iIndex = 0; cNumericString[iIndex] != '\0'; iIndex++) { // Depending on the character switch (cNumericString[iIndex]) { // Is a . (point) case '.' : // Increment point counter iPoints++; break; default : break; } } // If points found (can be more than one for improper formatted number if (iPoints > 0) { return(true); } // Else no points found else { return(false); } } // Get the next word in uppercase from the current position (keyword lookahead) inline bool GetNextWordUpper(Accessor &styler, unsigned int uiStartPos, int iLength, char *cWord) { unsigned int iIndex = 0; // Buffer Index // Loop through the remaining string from the current position for (int iOffset = uiStartPos; iOffset < iLength; iOffset++) { // Get the character from the buffer using the offset char cCharacter = styler[iOffset]; if (IsEOL(cCharacter)) { break; } // If the character is alphabet character if (isalpha(cCharacter)) { // Add UPPERCASE character to the word buffer cWord[iIndex++] = CharacterUpper(cCharacter); } } // Add null termination cWord[iIndex] = '\0'; // If no word was found if (iIndex == 0) { // Return failure return(false); } // Else word was found else { // Return success return(true); } } // Clarion Language Colouring Procedure static void ColouriseClarionDoc(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler, bool bCaseSensitive) { int iParenthesesLevel = 0; // Parenthese Level int iColumn1Label = false; // Label starts in Column 1 WordList &wlClarionKeywords = *wlKeywords[0]; // Clarion Keywords WordList &wlCompilerDirectives = *wlKeywords[1]; // Compiler Directives WordList &wlRuntimeExpressions = *wlKeywords[2]; // Runtime Expressions WordList &wlBuiltInProcsFuncs = *wlKeywords[3]; // Builtin Procedures and Functions WordList &wlStructsDataTypes = *wlKeywords[4]; // Structures and Data Types WordList &wlAttributes = *wlKeywords[5]; // Procedure Attributes WordList &wlStandardEquates = *wlKeywords[6]; // Standard Equates WordList &wlLabelReservedWords = *wlKeywords[7]; // Clarion Reserved Keywords (Labels) WordList &wlProcLabelReservedWords = *wlKeywords[8]; // Clarion Reserved Keywords (Procedure Labels) const char wlProcReservedKeywordList[] = "PROCEDURE FUNCTION"; WordList wlProcReservedKeywords; wlProcReservedKeywords.Set(wlProcReservedKeywordList); const char wlCompilerKeywordList[] = "COMPILE OMIT"; WordList wlCompilerKeywords; wlCompilerKeywords.Set(wlCompilerKeywordList); const char wlLegacyStatementsList[] = "BOF EOF FUNCTION POINTER SHARE"; WordList wlLegacyStatements; wlLegacyStatements.Set(wlLegacyStatementsList); StyleContext scDoc(uiStartPos, iLength, iInitStyle, accStyler); // lex source code for (; scDoc.More(); scDoc.Forward()) { // // Determine if the current state should terminate. // // Label State Handling if (scDoc.state == SCE_CLW_LABEL) { // If the character is not a valid label if (!IsALabelCharacter(scDoc.ch)) { // If the character is a . (dot syntax) if (scDoc.ch == '.') { // Turn off column 1 label flag as label now cannot be reserved work iColumn1Label = false; // Uncolour the . (dot) to default state, move forward one character, // and change back to the label state. scDoc.SetState(SCE_CLW_DEFAULT); scDoc.Forward(); scDoc.SetState(SCE_CLW_LABEL); } // Else check label else { char cLabel[512]; // Label buffer // Buffer the current label string scDoc.GetCurrent(cLabel,sizeof(cLabel)); // If case insensitive, convert string to UPPERCASE to match passed keywords. if (!bCaseSensitive) { StringUpper(cLabel); } // Else if UPPERCASE label string is in the Clarion compiler keyword list if (wlCompilerKeywords.InList(cLabel) && iColumn1Label){ // change the label to error state scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE); } // Else if UPPERCASE label string is in the Clarion reserved keyword list else if (wlLabelReservedWords.InList(cLabel) && iColumn1Label){ // change the label to error state scDoc.ChangeState(SCE_CLW_ERROR); } // Else if UPPERCASE label string is else if (wlProcLabelReservedWords.InList(cLabel) && iColumn1Label) { char cWord[512]; // Word buffer // Get the next word from the current position if (GetNextWordUpper(accStyler,scDoc.currentPos,uiStartPos+iLength,cWord)) { // If the next word is a procedure reserved word if (wlProcReservedKeywords.InList(cWord)) { // Change the label to error state scDoc.ChangeState(SCE_CLW_ERROR); } } } // Else if label string is in the compiler directive keyword list else if (wlCompilerDirectives.InList(cLabel)) { // change the state to compiler directive state scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE); } // Terminate the label state and set to default state scDoc.SetState(SCE_CLW_DEFAULT); } } } // Keyword State Handling else if (scDoc.state == SCE_CLW_KEYWORD) { // If character is : (colon) if (scDoc.ch == ':') { char cEquate[512]; // Equate buffer // Move forward to include : (colon) in buffer scDoc.Forward(); // Buffer the equate string scDoc.GetCurrent(cEquate,sizeof(cEquate)); // If case insensitive, convert string to UPPERCASE to match passed keywords. if (!bCaseSensitive) { StringUpper(cEquate); } // If statement string is in the equate list if (wlStandardEquates.InList(cEquate)) { // Change to equate state scDoc.ChangeState(SCE_CLW_STANDARD_EQUATE); } } // If the character is not a valid label character else if (!IsALabelCharacter(scDoc.ch)) { char cStatement[512]; // Statement buffer // Buffer the statement string scDoc.GetCurrent(cStatement,sizeof(cStatement)); // If case insensitive, convert string to UPPERCASE to match passed keywords. if (!bCaseSensitive) { StringUpper(cStatement); } // If statement string is in the Clarion keyword list if (wlClarionKeywords.InList(cStatement)) { // Change the statement string to the Clarion keyword state scDoc.ChangeState(SCE_CLW_KEYWORD); } // Else if statement string is in the compiler directive keyword list else if (wlCompilerDirectives.InList(cStatement)) { // Change the statement string to the compiler directive state scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE); } // Else if statement string is in the runtime expressions keyword list else if (wlRuntimeExpressions.InList(cStatement)) { // Change the statement string to the runtime expressions state scDoc.ChangeState(SCE_CLW_RUNTIME_EXPRESSIONS); } // Else if statement string is in the builtin procedures and functions keyword list else if (wlBuiltInProcsFuncs.InList(cStatement)) { // Change the statement string to the builtin procedures and functions state scDoc.ChangeState(SCE_CLW_BUILTIN_PROCEDURES_FUNCTION); } // Else if statement string is in the tructures and data types keyword list else if (wlStructsDataTypes.InList(cStatement)) { // Change the statement string to the structures and data types state scDoc.ChangeState(SCE_CLW_STRUCTURE_DATA_TYPE); } // Else if statement string is in the procedure attribute keyword list else if (wlAttributes.InList(cStatement)) { // Change the statement string to the procedure attribute state scDoc.ChangeState(SCE_CLW_ATTRIBUTE); } // Else if statement string is in the standard equate keyword list else if (wlStandardEquates.InList(cStatement)) { // Change the statement string to the standard equate state scDoc.ChangeState(SCE_CLW_STANDARD_EQUATE); } // Else if statement string is in the deprecated or legacy keyword list else if (wlLegacyStatements.InList(cStatement)) { // Change the statement string to the standard equate state scDoc.ChangeState(SCE_CLW_DEPRECATED); } // Else the statement string doesn't match any work list else { // Change the statement string to the default state scDoc.ChangeState(SCE_CLW_DEFAULT); } // Terminate the keyword state and set to default state scDoc.SetState(SCE_CLW_DEFAULT); } } // String State Handling else if (scDoc.state == SCE_CLW_STRING) { // If the character is an ' (single quote) if (scDoc.ch == '\'') { // Set the state to default and move forward colouring // the ' (single quote) as default state // terminating the string state scDoc.SetState(SCE_CLW_DEFAULT); scDoc.Forward(); } // If the next character is an ' (single quote) if (scDoc.chNext == '\'') { // Move forward one character and set to default state // colouring the next ' (single quote) as default state // terminating the string state scDoc.ForwardSetState(SCE_CLW_DEFAULT); scDoc.Forward(); } } // Picture String State Handling else if (scDoc.state == SCE_CLW_PICTURE_STRING) { // If the character is an ( (open parenthese) if (scDoc.ch == '(') { // Increment the parenthese level iParenthesesLevel++; } // Else if the character is a ) (close parenthese) else if (scDoc.ch == ')') { // If the parenthese level is set to zero // parentheses matched if (!iParenthesesLevel) { scDoc.SetState(SCE_CLW_DEFAULT); } // Else parenthese level is greater than zero // still looking for matching parentheses else { // Decrement the parenthese level iParenthesesLevel--; } } } // Standard Equate State Handling else if (scDoc.state == SCE_CLW_STANDARD_EQUATE) { if (!isalnum(scDoc.ch)) { scDoc.SetState(SCE_CLW_DEFAULT); } } // Integer Constant State Handling else if (scDoc.state == SCE_CLW_INTEGER_CONSTANT) { // If the character is not a digit (0-9) // or character is not a hexidecimal character (A-F) // or character is not a . (point) // or character is not a numberic base character (B,O,H) if (!(isdigit(scDoc.ch) || IsAHexCharacter(scDoc.ch, bCaseSensitive) || scDoc.ch == '.' || IsANumericBaseCharacter(scDoc.ch, bCaseSensitive))) { // If the number was a real if (SetNumericConstantState(scDoc)) { // Colour the matched string to the real constant state scDoc.ChangeState(SCE_CLW_REAL_CONSTANT); } // Else the number was an integer else { // Colour the matched string to an integer constant state scDoc.ChangeState(SCE_CLW_INTEGER_CONSTANT); } // Terminate the integer constant state and set to default state scDoc.SetState(SCE_CLW_DEFAULT); } } // // Determine if a new state should be entered. // // Beginning of Line Handling if (scDoc.atLineStart) { // Reset the column 1 label flag iColumn1Label = false; // If column 1 character is a label start character if (IsALabelStart(scDoc.ch)) { // Label character is found in column 1 // so set column 1 label flag and clear last column 1 label iColumn1Label = true; // Set the state to label scDoc.SetState(SCE_CLW_LABEL); } // else if character is a space or tab else if (IsASpace(scDoc.ch)){ // Set to default state scDoc.SetState(SCE_CLW_DEFAULT); } // else if comment start (!) or is an * (asterisk) else if (IsACommentStart(scDoc.ch) || scDoc.ch == '*' ) { // then set the state to comment. scDoc.SetState(SCE_CLW_COMMENT); } // else the character is a ? (question mark) else if (scDoc.ch == '?') { // Change to the compiler directive state, move forward, // colouring the ? (question mark), change back to default state. scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE); scDoc.Forward(); scDoc.SetState(SCE_CLW_DEFAULT); } // else an invalid character in column 1 else { // Set to error state scDoc.SetState(SCE_CLW_ERROR); } } // End of Line Handling else if (scDoc.atLineEnd) { // Reset to the default state at the end of each line. scDoc.SetState(SCE_CLW_DEFAULT); } // Default Handling else { // If in default state if (scDoc.state == SCE_CLW_DEFAULT) { // If is a letter could be a possible statement if (isalpha(scDoc.ch)) { // Set the state to Clarion Keyword and verify later scDoc.SetState(SCE_CLW_KEYWORD); } // else is a number else if (isdigit(scDoc.ch)) { // Set the state to Integer Constant and verify later scDoc.SetState(SCE_CLW_INTEGER_CONSTANT); } // else if the start of a comment or a | (line continuation) else if (IsACommentStart(scDoc.ch) || scDoc.ch == '|') { // then set the state to comment. scDoc.SetState(SCE_CLW_COMMENT); } // else if the character is a ' (single quote) else if (scDoc.ch == '\'') { // If the character is also a ' (single quote) // Embedded Apostrophe if (scDoc.chNext == '\'') { // Move forward colouring it as default state scDoc.ForwardSetState(SCE_CLW_DEFAULT); } else { // move to the next character and then set the state to comment. scDoc.ForwardSetState(SCE_CLW_STRING); } } // else the character is an @ (ampersand) else if (scDoc.ch == '@') { // Case insensitive. if (!bCaseSensitive) { // If character is a valid picture token character if (strchr("DEKNPSTdeknpst", scDoc.chNext) != NULL) { // Set to the picture string state scDoc.SetState(SCE_CLW_PICTURE_STRING); } } // Case sensitive else { // If character is a valid picture token character if (strchr("DEKNPST", scDoc.chNext) != NULL) { // Set the picture string state scDoc.SetState(SCE_CLW_PICTURE_STRING); } } } } } } // lexing complete scDoc.Complete(); } // Clarion Language Case Sensitive Colouring Procedure static void ColouriseClarionDocSensitive(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) { ColouriseClarionDoc(uiStartPos, iLength, iInitStyle, wlKeywords, accStyler, true); } // Clarion Language Case Insensitive Colouring Procedure static void ColouriseClarionDocInsensitive(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) { ColouriseClarionDoc(uiStartPos, iLength, iInitStyle, wlKeywords, accStyler, false); } // Fill Buffer static void FillBuffer(unsigned int uiStart, unsigned int uiEnd, Accessor &accStyler, char *szBuffer, unsigned int uiLength) { unsigned int uiPos = 0; while ((uiPos < uiEnd - uiStart + 1) && (uiPos < uiLength-1)) { szBuffer[uiPos] = static_cast(toupper(accStyler[uiStart + uiPos])); uiPos++; } szBuffer[uiPos] = '\0'; } // Classify Clarion Fold Point static int ClassifyClarionFoldPoint(int iLevel, const char* szString) { if (!(isdigit(szString[0]) || (szString[0] == '.'))) { if (strcmp(szString, "PROCEDURE") == 0) { // iLevel = SC_FOLDLEVELBASE + 1; } else if (strcmp(szString, "MAP") == 0 || strcmp(szString,"ACCEPT") == 0 || strcmp(szString,"BEGIN") == 0 || strcmp(szString,"CASE") == 0 || strcmp(szString,"EXECUTE") == 0 || strcmp(szString,"IF") == 0 || strcmp(szString,"ITEMIZE") == 0 || strcmp(szString,"INTERFACE") == 0 || strcmp(szString,"JOIN") == 0 || strcmp(szString,"LOOP") == 0 || strcmp(szString,"MODULE") == 0 || strcmp(szString,"RECORD") == 0) { iLevel++; } else if (strcmp(szString, "APPLICATION") == 0 || strcmp(szString, "CLASS") == 0 || strcmp(szString, "DETAIL") == 0 || strcmp(szString, "FILE") == 0 || strcmp(szString, "FOOTER") == 0 || strcmp(szString, "FORM") == 0 || strcmp(szString, "GROUP") == 0 || strcmp(szString, "HEADER") == 0 || strcmp(szString, "INTERFACE") == 0 || strcmp(szString, "MENU") == 0 || strcmp(szString, "MENUBAR") == 0 || strcmp(szString, "OLE") == 0 || strcmp(szString, "OPTION") == 0 || strcmp(szString, "QUEUE") == 0 || strcmp(szString, "REPORT") == 0 || strcmp(szString, "SHEET") == 0 || strcmp(szString, "TAB") == 0 || strcmp(szString, "TOOLBAR") == 0 || strcmp(szString, "VIEW") == 0 || strcmp(szString, "WINDOW") == 0) { iLevel++; } else if (strcmp(szString, "END") == 0 || strcmp(szString, "UNTIL") == 0 || strcmp(szString, "WHILE") == 0) { iLevel--; } } return(iLevel); } // Clarion Language Folding Procedure static void FoldClarionDoc(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *[], Accessor &accStyler) { unsigned int uiEndPos = uiStartPos + iLength; int iLineCurrent = accStyler.GetLine(uiStartPos); int iLevelPrev = accStyler.LevelAt(iLineCurrent) & SC_FOLDLEVELNUMBERMASK; int iLevelCurrent = iLevelPrev; char chNext = accStyler[uiStartPos]; int iStyle = iInitStyle; int iStyleNext = accStyler.StyleAt(uiStartPos); int iVisibleChars = 0; int iLastStart = 0; for (unsigned int uiPos = uiStartPos; uiPos < uiEndPos; uiPos++) { char chChar = chNext; chNext = accStyler.SafeGetCharAt(uiPos + 1); int iStylePrev = iStyle; iStyle = iStyleNext; iStyleNext = accStyler.StyleAt(uiPos + 1); bool bEOL = (chChar == '\r' && chNext != '\n') || (chChar == '\n'); if (iStylePrev == SCE_CLW_DEFAULT) { if (iStyle == SCE_CLW_KEYWORD || iStyle == SCE_CLW_STRUCTURE_DATA_TYPE) { // Store last word start point. iLastStart = uiPos; } } if (iStylePrev == SCE_CLW_KEYWORD || iStylePrev == SCE_CLW_STRUCTURE_DATA_TYPE) { if(iswordchar(chChar) && !iswordchar(chNext)) { char chBuffer[100]; FillBuffer(iLastStart, uiPos, accStyler, chBuffer, sizeof(chBuffer)); iLevelCurrent = ClassifyClarionFoldPoint(iLevelCurrent,chBuffer); // if ((iLevelCurrent == SC_FOLDLEVELBASE + 1) && iLineCurrent > 1) { // accStyler.SetLevel(iLineCurrent-1,SC_FOLDLEVELBASE); // iLevelPrev = SC_FOLDLEVELBASE; // } } } if (bEOL) { int iLevel = iLevelPrev; if ((iLevelCurrent > iLevelPrev) && (iVisibleChars > 0)) iLevel |= SC_FOLDLEVELHEADERFLAG; if (iLevel != accStyler.LevelAt(iLineCurrent)) { accStyler.SetLevel(iLineCurrent,iLevel); } iLineCurrent++; iLevelPrev = iLevelCurrent; iVisibleChars = 0; } if (!isspacechar(chChar)) iVisibleChars++; } // Fill in the real level of the next line, keeping the current flags // as they will be filled in later. int iFlagsNext = accStyler.LevelAt(iLineCurrent) & ~SC_FOLDLEVELNUMBERMASK; accStyler.SetLevel(iLineCurrent, iLevelPrev | iFlagsNext); } // Word List Descriptions static const char * const rgWordListDescriptions[] = { "Clarion Keywords", "Compiler Directives", "Built-in Procedures and Functions", "Runtime Expressions", "Structure and Data Types", "Attributes", "Standard Equates", "Reserved Words (Labels)", "Reserved Words (Procedure Labels)", 0, }; // Case Sensitive Clarion Language Lexer LexerModule lmClw(SCLEX_CLW, ColouriseClarionDocSensitive, "clarion", FoldClarionDoc, rgWordListDescriptions); // Case Insensitive Clarion Language Lexer LexerModule lmClwNoCase(SCLEX_CLWNOCASE, ColouriseClarionDocInsensitive, "clarionnocase", FoldClarionDoc, rgWordListDescriptions); tora-2.1.3/src/qscintilla2/src/LexInno.cpp0000644000175000017500000001736311213435521020142 0ustar michaelmichael// Scintilla source code edit control /** @file LexInno.cxx ** Lexer for Inno Setup scripts. **/ // Written by Friedrich Vedder , using code from LexOthers.cxx. // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static void ColouriseInnoDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) { int state = SCE_INNO_DEFAULT; char chPrev; char ch = 0; char chNext = styler[startPos]; int lengthDoc = startPos + length; char *buffer = new char[length]; int bufferCount = 0; bool isBOL, isEOL, isWS, isBOLWS = 0; bool isCode = false; bool isCStyleComment = false; WordList §ionKeywords = *keywordLists[0]; WordList &standardKeywords = *keywordLists[1]; WordList ¶meterKeywords = *keywordLists[2]; WordList &preprocessorKeywords = *keywordLists[3]; WordList &pascalKeywords = *keywordLists[4]; WordList &userKeywords = *keywordLists[5]; // Go through all provided text segment // using the hand-written state machine shown below styler.StartAt(startPos); styler.StartSegment(startPos); for (int i = startPos; i < lengthDoc; i++) { chPrev = ch; ch = chNext; chNext = styler.SafeGetCharAt(i + 1); if (styler.IsLeadByte(ch)) { chNext = styler.SafeGetCharAt(i + 2); i++; continue; } isBOL = (chPrev == 0) || (chPrev == '\n') || (chPrev == '\r' && ch != '\n'); isBOLWS = (isBOL) ? 1 : (isBOLWS && (chPrev == ' ' || chPrev == '\t')); isEOL = (ch == '\n' || ch == '\r'); isWS = (ch == ' ' || ch == '\t'); switch(state) { case SCE_INNO_DEFAULT: if (!isCode && ch == ';' && isBOLWS) { // Start of a comment state = SCE_INNO_COMMENT; } else if (ch == '[' && isBOLWS) { // Start of a section name bufferCount = 0; state = SCE_INNO_SECTION; } else if (ch == '#' && isBOLWS) { // Start of a preprocessor directive state = SCE_INNO_PREPROC; } else if (!isCode && ch == '{' && chNext != '{' && chPrev != '{') { // Start of an inline expansion state = SCE_INNO_INLINE_EXPANSION; } else if (isCode && (ch == '{' || (ch == '(' && chNext == '*'))) { // Start of a Pascal comment state = SCE_INNO_COMMENT_PASCAL; isCStyleComment = false; } else if (isCode && ch == '/' && chNext == '/') { // Apparently, C-style comments are legal, too state = SCE_INNO_COMMENT_PASCAL; isCStyleComment = true; } else if (ch == '"') { // Start of a double-quote string state = SCE_INNO_STRING_DOUBLE; } else if (ch == '\'') { // Start of a single-quote string state = SCE_INNO_STRING_SINGLE; } else if (isascii(ch) && (isalpha(ch) || (ch == '_'))) { // Start of an identifier bufferCount = 0; buffer[bufferCount++] = static_cast(tolower(ch)); state = SCE_INNO_IDENTIFIER; } else { // Style it the default style styler.ColourTo(i,SCE_INNO_DEFAULT); } break; case SCE_INNO_COMMENT: if (isEOL) { state = SCE_INNO_DEFAULT; styler.ColourTo(i,SCE_INNO_COMMENT); } break; case SCE_INNO_IDENTIFIER: if (isascii(ch) && (isalnum(ch) || (ch == '_'))) { buffer[bufferCount++] = static_cast(tolower(ch)); } else { state = SCE_INNO_DEFAULT; buffer[bufferCount] = '\0'; // Check if the buffer contains a keyword if (!isCode && standardKeywords.InList(buffer)) { styler.ColourTo(i-1,SCE_INNO_KEYWORD); } else if (!isCode && parameterKeywords.InList(buffer)) { styler.ColourTo(i-1,SCE_INNO_PARAMETER); } else if (isCode && pascalKeywords.InList(buffer)) { styler.ColourTo(i-1,SCE_INNO_KEYWORD_PASCAL); } else if (!isCode && userKeywords.InList(buffer)) { styler.ColourTo(i-1,SCE_INNO_KEYWORD_USER); } else { styler.ColourTo(i-1,SCE_INNO_DEFAULT); } // Push back the faulty character chNext = styler[i--]; ch = chPrev; } break; case SCE_INNO_SECTION: if (ch == ']') { state = SCE_INNO_DEFAULT; buffer[bufferCount] = '\0'; // Check if the buffer contains a section name if (sectionKeywords.InList(buffer)) { styler.ColourTo(i,SCE_INNO_SECTION); isCode = !CompareCaseInsensitive(buffer, "code"); } else { styler.ColourTo(i,SCE_INNO_DEFAULT); } } else if (isascii(ch) && (isalnum(ch) || (ch == '_'))) { buffer[bufferCount++] = static_cast(tolower(ch)); } else { state = SCE_INNO_DEFAULT; styler.ColourTo(i,SCE_INNO_DEFAULT); } break; case SCE_INNO_PREPROC: if (isWS || isEOL) { if (isascii(chPrev) && isalpha(chPrev)) { state = SCE_INNO_DEFAULT; buffer[bufferCount] = '\0'; // Check if the buffer contains a preprocessor directive if (preprocessorKeywords.InList(buffer)) { styler.ColourTo(i-1,SCE_INNO_PREPROC); } else { styler.ColourTo(i-1,SCE_INNO_DEFAULT); } // Push back the faulty character chNext = styler[i--]; ch = chPrev; } } else if (isascii(ch) && isalpha(ch)) { if (chPrev == '#' || chPrev == ' ' || chPrev == '\t') bufferCount = 0; buffer[bufferCount++] = static_cast(tolower(ch)); } break; case SCE_INNO_STRING_DOUBLE: if (ch == '"' || isEOL) { state = SCE_INNO_DEFAULT; styler.ColourTo(i,SCE_INNO_STRING_DOUBLE); } break; case SCE_INNO_STRING_SINGLE: if (ch == '\'' || isEOL) { state = SCE_INNO_DEFAULT; styler.ColourTo(i,SCE_INNO_STRING_SINGLE); } break; case SCE_INNO_INLINE_EXPANSION: if (ch == '}') { state = SCE_INNO_DEFAULT; styler.ColourTo(i,SCE_INNO_INLINE_EXPANSION); } else if (isEOL) { state = SCE_INNO_DEFAULT; styler.ColourTo(i,SCE_INNO_DEFAULT); } break; case SCE_INNO_COMMENT_PASCAL: if (isCStyleComment) { if (isEOL) { state = SCE_INNO_DEFAULT; styler.ColourTo(i,SCE_INNO_COMMENT_PASCAL); } } else { if (ch == '}' || (ch == ')' && chPrev == '*')) { state = SCE_INNO_DEFAULT; styler.ColourTo(i,SCE_INNO_COMMENT_PASCAL); } else if (isEOL) { state = SCE_INNO_DEFAULT; styler.ColourTo(i,SCE_INNO_DEFAULT); } } break; } } delete []buffer; } static const char * const innoWordListDesc[] = { "Sections", "Keywords", "Parameters", "Preprocessor directives", "Pascal keywords", "User defined keywords", 0 }; static void FoldInnoDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { unsigned int endPos = startPos + length; char chNext = styler[startPos]; int lineCurrent = styler.GetLine(startPos); bool sectionFlag = false; int levelPrev = lineCurrent > 0 ? styler.LevelAt(lineCurrent - 1) : SC_FOLDLEVELBASE; int level; for (unsigned int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler[i+1]; bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); int style = styler.StyleAt(i); if (style == SCE_INNO_SECTION) sectionFlag = true; if (atEOL || i == endPos - 1) { if (sectionFlag) { level = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG; if (level == levelPrev) styler.SetLevel(lineCurrent - 1, levelPrev & ~SC_FOLDLEVELHEADERFLAG); } else { level = levelPrev & SC_FOLDLEVELNUMBERMASK; if (levelPrev & SC_FOLDLEVELHEADERFLAG) level++; } styler.SetLevel(lineCurrent, level); levelPrev = level; lineCurrent++; sectionFlag = false; } } } LexerModule lmInno(SCLEX_INNOSETUP, ColouriseInnoDoc, "inno", FoldInnoDoc, innoWordListDesc); tora-2.1.3/src/qscintilla2/src/PositionCache.cpp0000644000175000017500000003521011213435521021305 0ustar michaelmichael// Scintilla source code edit control /** @file PositionCache.cxx ** Classes for caching layout information. **/ // Copyright 1998-2007 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include "Platform.h" #include "Scintilla.h" #include "SplitVector.h" #include "Partitioning.h" #include "RunStyles.h" #include "ContractionState.h" #include "CellBuffer.h" #include "KeyMap.h" #include "Indicator.h" #include "XPM.h" #include "LineMarker.h" #include "Style.h" #include "ViewStyle.h" #include "CharClassify.h" #include "Decoration.h" #include "Document.h" #include "PositionCache.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsControlCharacter(int ch) { // iscntrl returns true for lots of chars > 127 which are displayable return ch >= 0 && ch < ' '; } LineLayout::LineLayout(int maxLineLength_) : lineStarts(0), lenLineStarts(0), lineNumber(-1), inCache(false), maxLineLength(-1), numCharsInLine(0), validity(llInvalid), xHighlightGuide(0), highlightColumn(0), selStart(0), selEnd(0), containsCaret(false), edgeColumn(0), chars(0), styles(0), styleBitsSet(0), indicators(0), positions(0), hsStart(0), hsEnd(0), widthLine(wrapWidthInfinite), lines(1) { Resize(maxLineLength_); } LineLayout::~LineLayout() { Free(); } void LineLayout::Resize(int maxLineLength_) { if (maxLineLength_ > maxLineLength) { Free(); chars = new char[maxLineLength_ + 1]; styles = new unsigned char[maxLineLength_ + 1]; indicators = new char[maxLineLength_ + 1]; // Extra position allocated as sometimes the Windows // GetTextExtentExPoint API writes an extra element. positions = new int[maxLineLength_ + 1 + 1]; maxLineLength = maxLineLength_; } } void LineLayout::Free() { delete []chars; chars = 0; delete []styles; styles = 0; delete []indicators; indicators = 0; delete []positions; positions = 0; delete []lineStarts; lineStarts = 0; } void LineLayout::Invalidate(validLevel validity_) { if (validity > validity_) validity = validity_; } int LineLayout::LineStart(int line) const { if (line <= 0) { return 0; } else if ((line >= lines) || !lineStarts) { return numCharsInLine; } else { return lineStarts[line]; } } int LineLayout::LineLastVisible(int line) const { if (line < 0) { return 0; } else if ((line >= lines-1) || !lineStarts) { int startLine = LineStart(line); int endLine = numCharsInLine; while ((endLine > startLine) && IsEOLChar(chars[endLine-1])) { endLine--; } return endLine; } else { return lineStarts[line+1]; } } bool LineLayout::InLine(int offset, int line) const { return ((offset >= LineStart(line)) && (offset < LineStart(line + 1))) || ((offset == numCharsInLine) && (line == (lines-1))); } void LineLayout::SetLineStart(int line, int start) { if ((line >= lenLineStarts) && (line != 0)) { int newMaxLines = line + 20; int *newLineStarts = new int[newMaxLines]; if (!newLineStarts) return; for (int i = 0; i < newMaxLines; i++) { if (i < lenLineStarts) newLineStarts[i] = lineStarts[i]; else newLineStarts[i] = 0; } delete []lineStarts; lineStarts = newLineStarts; lenLineStarts = newMaxLines; } lineStarts[line] = start; } void LineLayout::SetBracesHighlight(Range rangeLine, Position braces[], char bracesMatchStyle, int xHighlight) { if (rangeLine.ContainsCharacter(braces[0])) { int braceOffset = braces[0] - rangeLine.start; if (braceOffset < numCharsInLine) { bracePreviousStyles[0] = styles[braceOffset]; styles[braceOffset] = bracesMatchStyle; } } if (rangeLine.ContainsCharacter(braces[1])) { int braceOffset = braces[1] - rangeLine.start; if (braceOffset < numCharsInLine) { bracePreviousStyles[1] = styles[braceOffset]; styles[braceOffset] = bracesMatchStyle; } } if ((braces[0] >= rangeLine.start && braces[1] <= rangeLine.end) || (braces[1] >= rangeLine.start && braces[0] <= rangeLine.end)) { xHighlightGuide = xHighlight; } } void LineLayout::RestoreBracesHighlight(Range rangeLine, Position braces[]) { if (rangeLine.ContainsCharacter(braces[0])) { int braceOffset = braces[0] - rangeLine.start; if (braceOffset < numCharsInLine) { styles[braceOffset] = bracePreviousStyles[0]; } } if (rangeLine.ContainsCharacter(braces[1])) { int braceOffset = braces[1] - rangeLine.start; if (braceOffset < numCharsInLine) { styles[braceOffset] = bracePreviousStyles[1]; } } xHighlightGuide = 0; } int LineLayout::FindBefore(int x, int lower, int upper) const { do { int middle = (upper + lower + 1) / 2; // Round high int posMiddle = positions[middle]; if (x < posMiddle) { upper = middle - 1; } else { lower = middle; } } while (lower < upper); return lower; } LineLayoutCache::LineLayoutCache() : level(0), length(0), size(0), cache(0), allInvalidated(false), styleClock(-1), useCount(0) { Allocate(0); } LineLayoutCache::~LineLayoutCache() { Deallocate(); } void LineLayoutCache::Allocate(int length_) { PLATFORM_ASSERT(cache == NULL); allInvalidated = false; length = length_; size = length; if (size > 1) { size = (size / 16 + 1) * 16; } if (size > 0) { cache = new LineLayout * [size]; } for (int i = 0; i < size; i++) cache[i] = 0; } void LineLayoutCache::AllocateForLevel(int linesOnScreen, int linesInDoc) { PLATFORM_ASSERT(useCount == 0); int lengthForLevel = 0; if (level == llcCaret) { lengthForLevel = 1; } else if (level == llcPage) { lengthForLevel = linesOnScreen + 1; } else if (level == llcDocument) { lengthForLevel = linesInDoc; } if (lengthForLevel > size) { Deallocate(); Allocate(lengthForLevel); } else { if (lengthForLevel < length) { for (int i = lengthForLevel; i < length; i++) { delete cache[i]; cache[i] = 0; } } length = lengthForLevel; } PLATFORM_ASSERT(length == lengthForLevel); PLATFORM_ASSERT(cache != NULL || length == 0); } void LineLayoutCache::Deallocate() { PLATFORM_ASSERT(useCount == 0); for (int i = 0; i < length; i++) delete cache[i]; delete []cache; cache = 0; length = 0; size = 0; } void LineLayoutCache::Invalidate(LineLayout::validLevel validity_) { if (cache && !allInvalidated) { for (int i = 0; i < length; i++) { if (cache[i]) { cache[i]->Invalidate(validity_); } } if (validity_ == LineLayout::llInvalid) { allInvalidated = true; } } } void LineLayoutCache::SetLevel(int level_) { allInvalidated = false; if ((level_ != -1) && (level != level_)) { level = level_; Deallocate(); } } LineLayout *LineLayoutCache::Retrieve(int lineNumber, int lineCaret, int maxChars, int styleClock_, int linesOnScreen, int linesInDoc) { AllocateForLevel(linesOnScreen, linesInDoc); if (styleClock != styleClock_) { Invalidate(LineLayout::llCheckTextAndStyle); styleClock = styleClock_; } allInvalidated = false; int pos = -1; LineLayout *ret = 0; if (level == llcCaret) { pos = 0; } else if (level == llcPage) { if (lineNumber == lineCaret) { pos = 0; } else if (length > 1) { pos = 1 + (lineNumber % (length - 1)); } } else if (level == llcDocument) { pos = lineNumber; } if (pos >= 0) { PLATFORM_ASSERT(useCount == 0); if (cache && (pos < length)) { if (cache[pos]) { if ((cache[pos]->lineNumber != lineNumber) || (cache[pos]->maxLineLength < maxChars)) { delete cache[pos]; cache[pos] = 0; } } if (!cache[pos]) { cache[pos] = new LineLayout(maxChars); } if (cache[pos]) { cache[pos]->lineNumber = lineNumber; cache[pos]->inCache = true; ret = cache[pos]; useCount++; } } } if (!ret) { ret = new LineLayout(maxChars); ret->lineNumber = lineNumber; } return ret; } void LineLayoutCache::Dispose(LineLayout *ll) { allInvalidated = false; if (ll) { if (!ll->inCache) { delete ll; } else { useCount--; } } } void BreakFinder::Insert(int val) { // Expand if needed if (saeLen >= saeSize) { saeSize *= 2; int *selAndEdgeNew = new int[saeSize]; for (unsigned int j = 0; j= nextBreak) { for (unsigned int j = 0; jj; k--) { selAndEdge[k] = selAndEdge[k-1]; } saeLen++; selAndEdge[j] = val; return; } } // Not less than any so append selAndEdge[saeLen++] = val; } } extern bool BadUTF(const char *s, int len, int &trailBytes); static int NextBadU(const char *s, int p, int len, int &trailBytes) { while (p < len) { p++; if (BadUTF(s + p, len - p, trailBytes)) return p; } return -1; } BreakFinder::BreakFinder(LineLayout *ll_, int lineStart_, int lineEnd_, int posLineStart_, bool utf8_, int xStart) : ll(ll_), lineStart(lineStart_), lineEnd(lineEnd_), posLineStart(posLineStart_), utf8(utf8_), nextBreak(lineStart_), saeSize(0), saeLen(0), saeCurrentPos(0), saeNext(0), subBreak(-1) { saeSize = 8; selAndEdge = new int[saeSize]; for (unsigned int j=0; j < saeSize; j++) { selAndEdge[j] = 0; } // Search for first visible break // First find the first visible character nextBreak = ll->FindBefore(xStart, lineStart, lineEnd); // Now back to a style break while ((nextBreak > lineStart) && (ll->styles[nextBreak] == ll->styles[nextBreak - 1])) { nextBreak--; } if (ll->selStart != ll->selEnd) { Insert(ll->selStart - posLineStart - 1); Insert(ll->selEnd - posLineStart - 1); } Insert(ll->edgeColumn - 1); Insert(lineEnd - 1); if (utf8) { int trailBytes=0; for (int pos = -1;;) { pos = NextBadU(ll->chars, pos, lineEnd, trailBytes); if (pos < 0) break; Insert(pos-1); Insert(pos); } } saeNext = (saeLen > 0) ? selAndEdge[0] : -1; } BreakFinder::~BreakFinder() { delete []selAndEdge; } int BreakFinder::First() { return nextBreak; } int BreakFinder::Next() { if (subBreak == -1) { int prev = nextBreak; while (nextBreak < lineEnd) { if ((ll->styles[nextBreak] != ll->styles[nextBreak + 1]) || (nextBreak == saeNext) || IsControlCharacter(ll->chars[nextBreak]) || IsControlCharacter(ll->chars[nextBreak + 1])) { if (nextBreak == saeNext) { saeCurrentPos++; saeNext = (saeLen > saeCurrentPos) ? selAndEdge[saeCurrentPos] : -1; } nextBreak++; if ((nextBreak - prev) < lengthStartSubdivision) { return nextBreak; } break; } nextBreak++; } if ((nextBreak - prev) < lengthStartSubdivision) { return nextBreak; } subBreak = prev; } // Splitting up a long run from prev to nextBreak in lots of approximately lengthEachSubdivision. // For very long runs add extra breaks after spaces or if no spaces before low punctuation. if ((nextBreak - subBreak) <= lengthEachSubdivision) { subBreak = -1; return nextBreak; } else { int lastGoodBreak = -1; int lastOKBreak = -1; int j; for (j = subBreak + 1; j <= nextBreak; j++) { if (IsSpaceOrTab(ll->chars[j - 1]) && !IsSpaceOrTab(ll->chars[j])) { lastGoodBreak = j; } if (ll->chars[j] < 'A') { lastOKBreak = j; } if (((j - subBreak) >= lengthEachSubdivision) && ((lastGoodBreak >= 0) || (lastOKBreak >= 0))) { break; } } if (lastGoodBreak >= 0) { subBreak = lastGoodBreak; } else if (lastOKBreak >= 0) { subBreak = lastOKBreak; } else { subBreak = nextBreak; } if (subBreak >= nextBreak) { subBreak = -1; return nextBreak; } else { return subBreak; } } } PositionCacheEntry::PositionCacheEntry() : styleNumber(0), len(0), clock(0), positions(0) { } void PositionCacheEntry::Set(unsigned int styleNumber_, const char *s_, unsigned int len_, int *positions_, unsigned int clock_) { Clear(); styleNumber = styleNumber_; len = len_; clock = clock_; if (s_ && positions_) { positions = new short[len + (len + 1) / 2]; for (unsigned int i=0;i(positions_[i]); } memcpy(reinterpret_cast(positions + len), s_, len); } } PositionCacheEntry::~PositionCacheEntry() { Clear(); } void PositionCacheEntry::Clear() { delete []positions; positions = 0; styleNumber = 0; len = 0; clock = 0; } bool PositionCacheEntry::Retrieve(unsigned int styleNumber_, const char *s_, unsigned int len_, int *positions_) const { if ((styleNumber == styleNumber_) && (len == len_) && (memcmp(reinterpret_cast(positions + len), s_, len)== 0)) { for (unsigned int i=0;i other.clock; } void PositionCacheEntry::ResetClock() { if (clock > 0) { clock = 1; } } PositionCache::PositionCache() { size = 0x400; clock = 1; pces = new PositionCacheEntry[size]; allClear = true; } PositionCache::~PositionCache() { Clear(); delete []pces; } void PositionCache::Clear() { if (!allClear) { for (size_t i=0;i 0) && (len < 30)) { // Only store short strings in the cache so it doesn't churn with // long comments with only a single comment. // Two way associative: try two probe positions. int hashValue = PositionCacheEntry::Hash(styleNumber, s, len); probe = hashValue % size; if (pces[probe].Retrieve(styleNumber, s, len, positions)) { return; } int probe2 = (hashValue * 37) % size; if (pces[probe2].Retrieve(styleNumber, s, len, positions)) { return; } // Not found. Choose the oldest of the two slots to replace if (pces[probe].NewerThan(pces[probe2])) { probe = probe2; } } surface->MeasureWidths(vstyle.styles[styleNumber].font, s, len, positions); if (probe >= 0) { clock++; if (clock > 60000) { // Since there are only 16 bits for the clock, wrap it round and // reset all cache entries so none get stuck with a high clock. for (size_t i=0;i // The License.txt file describes the conditions under which this software may be distributed. /// Styling buffer using one element for each run rather than using /// a filled buffer. #ifndef RUNSTYLES_H #define RUNSTYLES_H #ifdef SCI_NAMESPACE namespace Scintilla { #endif class RunStyles { public: Partitioning *starts; SplitVector *styles; int RunFromPosition(int position); int SplitRun(int position); void RemoveRun(int run); void RemoveRunIfEmpty(int run); void RemoveRunIfSameAsPrevious(int run); public: RunStyles(); ~RunStyles(); int Length() const; int ValueAt(int position) const; int FindNextChange(int position, int end); int StartRun(int position); int EndRun(int position); // Returns true if some values may have changed bool FillRange(int &position, int value, int &fillLength); void SetValueAt(int position, int value); void InsertSpace(int position, int insertLength); void DeleteAll(); void DeleteRange(int position, int deleteLength); }; #ifdef SCI_NAMESPACE } #endif #endif tora-2.1.3/src/qscintilla2/src/LexVerilog.cpp0000644000175000017500000002400311213435521020633 0ustar michaelmichael// Scintilla source code edit control /** @file LexVerilog.cxx ** Lexer for Verilog. ** Written by Avi Yegudin, based on C++ lexer by Neil Hodgson **/ // Copyright 1998-2002 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsAWordChar(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '\''); } static inline bool IsAWordStart(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '$'); } static void ColouriseVerilogDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; WordList &keywords3 = *keywordlists[2]; WordList &keywords4 = *keywordlists[3]; // Do not leak onto next line if (initStyle == SCE_V_STRINGEOL) initStyle = SCE_V_DEFAULT; StyleContext sc(startPos, length, initStyle, styler); for (; sc.More(); sc.Forward()) { if (sc.atLineStart && (sc.state == SCE_V_STRING)) { // Prevent SCE_V_STRINGEOL from leaking back to previous line sc.SetState(SCE_V_STRING); } // Handle line continuation generically. if (sc.ch == '\\') { if (sc.chNext == '\n' || sc.chNext == '\r') { sc.Forward(); if (sc.ch == '\r' && sc.chNext == '\n') { sc.Forward(); } continue; } } // Determine if the current state should terminate. if (sc.state == SCE_V_OPERATOR) { sc.SetState(SCE_V_DEFAULT); } else if (sc.state == SCE_V_NUMBER) { if (!IsAWordChar(sc.ch)) { sc.SetState(SCE_V_DEFAULT); } } else if (sc.state == SCE_V_IDENTIFIER) { if (!IsAWordChar(sc.ch) || (sc.ch == '.')) { char s[100]; sc.GetCurrent(s, sizeof(s)); if (keywords.InList(s)) { sc.ChangeState(SCE_V_WORD); } else if (keywords2.InList(s)) { sc.ChangeState(SCE_V_WORD2); } else if (keywords3.InList(s)) { sc.ChangeState(SCE_V_WORD3); } else if (keywords4.InList(s)) { sc.ChangeState(SCE_V_USER); } sc.SetState(SCE_V_DEFAULT); } } else if (sc.state == SCE_V_PREPROCESSOR) { if (!IsAWordChar(sc.ch)) { sc.SetState(SCE_V_DEFAULT); } } else if (sc.state == SCE_V_COMMENT) { if (sc.Match('*', '/')) { sc.Forward(); sc.ForwardSetState(SCE_V_DEFAULT); } } else if (sc.state == SCE_V_COMMENTLINE || sc.state == SCE_V_COMMENTLINEBANG) { if (sc.atLineStart) { sc.SetState(SCE_V_DEFAULT); } } else if (sc.state == SCE_V_STRING) { if (sc.ch == '\\') { if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { sc.Forward(); } } else if (sc.ch == '\"') { sc.ForwardSetState(SCE_V_DEFAULT); } else if (sc.atLineEnd) { sc.ChangeState(SCE_V_STRINGEOL); sc.ForwardSetState(SCE_V_DEFAULT); } } // Determine if a new state should be entered. if (sc.state == SCE_V_DEFAULT) { if (IsADigit(sc.ch) || (sc.ch == '\'') || (sc.ch == '.' && IsADigit(sc.chNext))) { sc.SetState(SCE_V_NUMBER); } else if (IsAWordStart(sc.ch)) { sc.SetState(SCE_V_IDENTIFIER); } else if (sc.Match('/', '*')) { sc.SetState(SCE_V_COMMENT); sc.Forward(); // Eat the * so it isn't used for the end of the comment } else if (sc.Match('/', '/')) { if (sc.Match("//!")) // Nice to have a different comment style sc.SetState(SCE_V_COMMENTLINEBANG); else sc.SetState(SCE_V_COMMENTLINE); } else if (sc.ch == '\"') { sc.SetState(SCE_V_STRING); } else if (sc.ch == '`') { sc.SetState(SCE_V_PREPROCESSOR); // Skip whitespace between ` and preprocessor word do { sc.Forward(); } while ((sc.ch == ' ' || sc.ch == '\t') && sc.More()); if (sc.atLineEnd) { sc.SetState(SCE_V_DEFAULT); } } else if (isoperator(static_cast(sc.ch)) || sc.ch == '@' || sc.ch == '#') { sc.SetState(SCE_V_OPERATOR); } } } sc.Complete(); } static bool IsStreamCommentStyle(int style) { return style == SCE_V_COMMENT; } // Store both the current line's fold level and the next lines in the // level store to make it easy to pick up with each increment // and to make it possible to fiddle the current level for "} else {". static void FoldNoBoxVerilogDoc(unsigned int startPos, int length, int initStyle, Accessor &styler) { bool foldComment = styler.GetPropertyInt("fold.comment") != 0; bool foldPreprocessor = styler.GetPropertyInt("fold.preprocessor") != 0; bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) != 0; // Verilog specific folding options: // fold_at_module - // Generally used methodology in verilog code is // one module per file, so folding at module definition is useless. // fold_at_brace/parenthese - // Folding of long port lists can be convenient. bool foldAtModule = styler.GetPropertyInt("fold.verilog.flags", 0) != 0; bool foldAtBrace = 1; bool foldAtParenthese = 1; unsigned int endPos = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); int levelCurrent = SC_FOLDLEVELBASE; if (lineCurrent > 0) levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; int levelMinCurrent = levelCurrent; int levelNext = levelCurrent; char chNext = styler[startPos]; int styleNext = styler.StyleAt(startPos); int style = initStyle; for (unsigned int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); int stylePrev = style; style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if (foldComment && IsStreamCommentStyle(style)) { if (!IsStreamCommentStyle(stylePrev)) { levelNext++; } else if (!IsStreamCommentStyle(styleNext) && !atEOL) { // Comments don't end at end of line and the next character may be unstyled. levelNext--; } } if (foldComment && (style == SCE_V_COMMENTLINE)) { if ((ch == '/') && (chNext == '/')) { char chNext2 = styler.SafeGetCharAt(i + 2); if (chNext2 == '{') { levelNext++; } else if (chNext2 == '}') { levelNext--; } } } if (foldPreprocessor && (style == SCE_V_PREPROCESSOR)) { if (ch == '`') { unsigned int j = i + 1; while ((j < endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) { j++; } if (styler.Match(j, "if")) { levelNext++; } else if (styler.Match(j, "end")) { levelNext--; } } } if (style == SCE_V_OPERATOR) { if (foldAtParenthese) { if (ch == '(') { levelNext++; } else if (ch == ')') { levelNext--; } } } if (style == SCE_V_OPERATOR) { if (foldAtBrace) { if (ch == '{') { levelNext++; } else if (ch == '}') { levelNext--; } } } if (style == SCE_V_WORD && stylePrev != SCE_V_WORD) { unsigned int j = i; if (styler.Match(j, "case") || styler.Match(j, "casex") || styler.Match(j, "casez") || styler.Match(j, "function") || styler.Match(j, "fork") || styler.Match(j, "table") || styler.Match(j, "task") || styler.Match(j, "generate") || styler.Match(j, "specify") || styler.Match(j, "primitive") || (styler.Match(j, "module") && foldAtModule) || styler.Match(j, "begin")) { levelNext++; } else if (styler.Match(j, "endcase") || styler.Match(j, "endfunction") || styler.Match(j, "join") || styler.Match(j, "endtask") || styler.Match(j, "endgenerate") || styler.Match(j, "endtable") || styler.Match(j, "endspecify") || styler.Match(j, "endprimitive") || (styler.Match(j, "endmodule") && foldAtModule) || (styler.Match(j, "end") && !IsAWordChar(styler.SafeGetCharAt(j+3)))) { levelNext--; } } if (atEOL) { int levelUse = levelCurrent; if (foldAtElse) { levelUse = levelMinCurrent; } int lev = levelUse | levelNext << 16; if (visibleChars == 0 && foldCompact) lev |= SC_FOLDLEVELWHITEFLAG; if (levelUse < levelNext) lev |= SC_FOLDLEVELHEADERFLAG; if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } lineCurrent++; levelCurrent = levelNext; levelMinCurrent = levelCurrent; visibleChars = 0; } if (!isspacechar(ch)) visibleChars++; } } static void FoldVerilogDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) { FoldNoBoxVerilogDoc(startPos, length, initStyle, styler); } static const char * const verilogWordLists[] = { "Primary keywords and identifiers", "Secondary keywords and identifiers", "System Tasks", "User defined tasks and identifiers", "Unused", 0, }; LexerModule lmVerilog(SCLEX_VERILOG, ColouriseVerilogDoc, "verilog", FoldVerilogDoc, verilogWordLists); tora-2.1.3/src/qscintilla2/src/LexEiffel.cpp0000644000175000017500000001645511213435521020432 0ustar michaelmichael// Scintilla source code edit control /** @file LexEiffel.cxx ** Lexer for Eiffel. **/ // Copyright 1998-2001 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool isEiffelOperator(unsigned int ch) { // '.' left out as it is used to make up numbers return ch == '*' || ch == '/' || ch == '\\' || ch == '-' || ch == '+' || ch == '(' || ch == ')' || ch == '=' || ch == '{' || ch == '}' || ch == '~' || ch == '[' || ch == ']' || ch == ';' || ch == '<' || ch == '>' || ch == ',' || ch == '.' || ch == '^' || ch == '%' || ch == ':' || ch == '!' || ch == '@' || ch == '?'; } static inline bool IsAWordChar(unsigned int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_'); } static inline bool IsAWordStart(unsigned int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_'); } static void ColouriseEiffelDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &keywords = *keywordlists[0]; StyleContext sc(startPos, length, initStyle, styler); for (; sc.More(); sc.Forward()) { if (sc.state == SCE_EIFFEL_STRINGEOL) { if (sc.ch != '\r' && sc.ch != '\n') { sc.SetState(SCE_EIFFEL_DEFAULT); } } else if (sc.state == SCE_EIFFEL_OPERATOR) { sc.SetState(SCE_EIFFEL_DEFAULT); } else if (sc.state == SCE_EIFFEL_WORD) { if (!IsAWordChar(sc.ch)) { char s[100]; sc.GetCurrentLowered(s, sizeof(s)); if (!keywords.InList(s)) { sc.ChangeState(SCE_EIFFEL_IDENTIFIER); } sc.SetState(SCE_EIFFEL_DEFAULT); } } else if (sc.state == SCE_EIFFEL_NUMBER) { if (!IsAWordChar(sc.ch)) { sc.SetState(SCE_EIFFEL_DEFAULT); } } else if (sc.state == SCE_EIFFEL_COMMENTLINE) { if (sc.ch == '\r' || sc.ch == '\n') { sc.SetState(SCE_EIFFEL_DEFAULT); } } else if (sc.state == SCE_EIFFEL_STRING) { if (sc.ch == '%') { sc.Forward(); } else if (sc.ch == '\"') { sc.Forward(); sc.SetState(SCE_EIFFEL_DEFAULT); } } else if (sc.state == SCE_EIFFEL_CHARACTER) { if (sc.ch == '\r' || sc.ch == '\n') { sc.SetState(SCE_EIFFEL_STRINGEOL); } else if (sc.ch == '%') { sc.Forward(); } else if (sc.ch == '\'') { sc.Forward(); sc.SetState(SCE_EIFFEL_DEFAULT); } } if (sc.state == SCE_EIFFEL_DEFAULT) { if (sc.ch == '-' && sc.chNext == '-') { sc.SetState(SCE_EIFFEL_COMMENTLINE); } else if (sc.ch == '\"') { sc.SetState(SCE_EIFFEL_STRING); } else if (sc.ch == '\'') { sc.SetState(SCE_EIFFEL_CHARACTER); } else if (IsADigit(sc.ch) || (sc.ch == '.')) { sc.SetState(SCE_EIFFEL_NUMBER); } else if (IsAWordStart(sc.ch)) { sc.SetState(SCE_EIFFEL_WORD); } else if (isEiffelOperator(sc.ch)) { sc.SetState(SCE_EIFFEL_OPERATOR); } } } sc.Complete(); } static bool IsEiffelComment(Accessor &styler, int pos, int len) { return len>1 && styler[pos]=='-' && styler[pos+1]=='-'; } static void FoldEiffelDocIndent(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { int lengthDoc = startPos + length; // Backtrack to previous line in case need to fix its fold status int lineCurrent = styler.GetLine(startPos); if (startPos > 0) { if (lineCurrent > 0) { lineCurrent--; startPos = styler.LineStart(lineCurrent); } } int spaceFlags = 0; int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsEiffelComment); char chNext = styler[startPos]; for (int i = startPos; i < lengthDoc; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) { int lev = indentCurrent; int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsEiffelComment); if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) { // Only non whitespace lines can be headers if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) { lev |= SC_FOLDLEVELHEADERFLAG; } else if (indentNext & SC_FOLDLEVELWHITEFLAG) { // Line after is blank so check the next - maybe should continue further? int spaceFlags2 = 0; int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsEiffelComment); if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) { lev |= SC_FOLDLEVELHEADERFLAG; } } } indentCurrent = indentNext; styler.SetLevel(lineCurrent, lev); lineCurrent++; } } } static void FoldEiffelDocKeyWords(unsigned int startPos, int length, int /* initStyle */, WordList *[], Accessor &styler) { unsigned int lengthDoc = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; int levelCurrent = levelPrev; char chNext = styler[startPos]; int stylePrev = 0; int styleNext = styler.StyleAt(startPos); // lastDeferred should be determined by looking back to last keyword in case // the "deferred" is on a line before "class" bool lastDeferred = false; for (unsigned int i = startPos; i < lengthDoc; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); int style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if ((stylePrev != SCE_EIFFEL_WORD) && (style == SCE_EIFFEL_WORD)) { char s[20]; unsigned int j = 0; while ((j < (sizeof(s) - 1)) && (iswordchar(styler[i + j]))) { s[j] = styler[i + j]; j++; } s[j] = '\0'; if ( (strcmp(s, "check") == 0) || (strcmp(s, "debug") == 0) || (strcmp(s, "deferred") == 0) || (strcmp(s, "do") == 0) || (strcmp(s, "from") == 0) || (strcmp(s, "if") == 0) || (strcmp(s, "inspect") == 0) || (strcmp(s, "once") == 0) ) levelCurrent++; if (!lastDeferred && (strcmp(s, "class") == 0)) levelCurrent++; if (strcmp(s, "end") == 0) levelCurrent--; lastDeferred = strcmp(s, "deferred") == 0; } if (atEOL) { int lev = levelPrev; if (visibleChars == 0) lev |= SC_FOLDLEVELWHITEFLAG; if ((levelCurrent > levelPrev) && (visibleChars > 0)) lev |= SC_FOLDLEVELHEADERFLAG; if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } lineCurrent++; levelPrev = levelCurrent; visibleChars = 0; } if (!isspacechar(ch)) visibleChars++; stylePrev = style; } // Fill in the real level of the next line, keeping the current flags as they will be filled in later int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; styler.SetLevel(lineCurrent, levelPrev | flagsNext); } static const char * const eiffelWordListDesc[] = { "Keywords", 0 }; LexerModule lmEiffel(SCLEX_EIFFEL, ColouriseEiffelDoc, "eiffel", FoldEiffelDocIndent, eiffelWordListDesc); LexerModule lmEiffelkw(SCLEX_EIFFELKW, ColouriseEiffelDoc, "eiffelkw", FoldEiffelDocKeyWords, eiffelWordListDesc); tora-2.1.3/src/qscintilla2/src/LexPS.cpp0000644000175000017500000003127211213435521017554 0ustar michaelmichael// Scintilla source code edit control /** @file LexPS.cxx ** Lexer for PostScript ** ** Written by Nigel Hathaway . ** The License.txt file describes the conditions under which this software may be distributed. **/ #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsASelfDelimitingChar(const int ch) { return (ch == '[' || ch == ']' || ch == '{' || ch == '}' || ch == '/' || ch == '<' || ch == '>' || ch == '(' || ch == ')' || ch == '%'); } static inline bool IsAWhitespaceChar(const int ch) { return (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n' || ch == '\f' || ch == '\0'); } static bool IsABaseNDigit(const int ch, const int base) { int maxdig = '9'; int letterext = -1; if (base <= 10) maxdig = '0' + base - 1; else letterext = base - 11; return ((ch >= '0' && ch <= maxdig) || (ch >= 'A' && ch <= ('A' + letterext)) || (ch >= 'a' && ch <= ('a' + letterext))); } static inline bool IsABase85Char(const int ch) { return ((ch >= '!' && ch <= 'u') || ch == 'z'); } static void ColourisePSDoc( unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &keywords1 = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; WordList &keywords3 = *keywordlists[2]; WordList &keywords4 = *keywordlists[3]; WordList &keywords5 = *keywordlists[4]; StyleContext sc(startPos, length, initStyle, styler); bool tokenizing = styler.GetPropertyInt("ps.tokenize") != 0; int pslevel = styler.GetPropertyInt("ps.level", 3); int lineCurrent = styler.GetLine(startPos); int nestTextCurrent = 0; if (lineCurrent > 0 && initStyle == SCE_PS_TEXT) nestTextCurrent = styler.GetLineState(lineCurrent - 1); int numRadix = 0; bool numHasPoint = false; bool numHasExponent = false; bool numHasSign = false; // Clear out existing tokenization if (tokenizing && length > 0) { styler.StartAt(startPos, static_cast(INDIC2_MASK)); styler.ColourTo(startPos + length-1, 0); styler.Flush(); styler.StartAt(startPos); styler.StartSegment(startPos); } for (; sc.More(); sc.Forward()) { if (sc.atLineStart) lineCurrent = styler.GetLine(sc.currentPos); // Determine if the current state should terminate. if (sc.state == SCE_PS_COMMENT || sc.state == SCE_PS_DSC_VALUE) { if (sc.atLineEnd) { sc.SetState(SCE_C_DEFAULT); } } else if (sc.state == SCE_PS_DSC_COMMENT) { if (sc.ch == ':') { sc.Forward(); if (!sc.atLineEnd) sc.SetState(SCE_PS_DSC_VALUE); else sc.SetState(SCE_C_DEFAULT); } else if (sc.atLineEnd) { sc.SetState(SCE_C_DEFAULT); } else if (IsAWhitespaceChar(sc.ch) && sc.ch != '\r') { sc.ChangeState(SCE_PS_COMMENT); } } else if (sc.state == SCE_PS_NUMBER) { if (IsASelfDelimitingChar(sc.ch) || IsAWhitespaceChar(sc.ch)) { if ((sc.chPrev == '+' || sc.chPrev == '-' || sc.chPrev == 'E' || sc.chPrev == 'e') && numRadix == 0) sc.ChangeState(SCE_PS_NAME); sc.SetState(SCE_C_DEFAULT); } else if (sc.ch == '#') { if (numHasPoint || numHasExponent || numHasSign || numRadix != 0) { sc.ChangeState(SCE_PS_NAME); } else { char szradix[5]; sc.GetCurrent(szradix, 4); numRadix = atoi(szradix); if (numRadix < 2 || numRadix > 36) sc.ChangeState(SCE_PS_NAME); } } else if ((sc.ch == 'E' || sc.ch == 'e') && numRadix == 0) { if (numHasExponent) { sc.ChangeState(SCE_PS_NAME); } else { numHasExponent = true; if (sc.chNext == '+' || sc.chNext == '-') sc.Forward(); } } else if (sc.ch == '.') { if (numHasPoint || numHasExponent || numRadix != 0) { sc.ChangeState(SCE_PS_NAME); } else { numHasPoint = true; } } else if (numRadix == 0) { if (!IsABaseNDigit(sc.ch, 10)) sc.ChangeState(SCE_PS_NAME); } else { if (!IsABaseNDigit(sc.ch, numRadix)) sc.ChangeState(SCE_PS_NAME); } } else if (sc.state == SCE_PS_NAME || sc.state == SCE_PS_KEYWORD) { if (IsASelfDelimitingChar(sc.ch) || IsAWhitespaceChar(sc.ch)) { char s[100]; sc.GetCurrent(s, sizeof(s)); if ((pslevel >= 1 && keywords1.InList(s)) || (pslevel >= 2 && keywords2.InList(s)) || (pslevel >= 3 && keywords3.InList(s)) || keywords4.InList(s) || keywords5.InList(s)) { sc.ChangeState(SCE_PS_KEYWORD); } sc.SetState(SCE_C_DEFAULT); } } else if (sc.state == SCE_PS_LITERAL || sc.state == SCE_PS_IMMEVAL) { if (IsASelfDelimitingChar(sc.ch) || IsAWhitespaceChar(sc.ch)) sc.SetState(SCE_C_DEFAULT); } else if (sc.state == SCE_PS_PAREN_ARRAY || sc.state == SCE_PS_PAREN_DICT || sc.state == SCE_PS_PAREN_PROC) { sc.SetState(SCE_C_DEFAULT); } else if (sc.state == SCE_PS_TEXT) { if (sc.ch == '(') { nestTextCurrent++; } else if (sc.ch == ')') { if (--nestTextCurrent == 0) sc.ForwardSetState(SCE_PS_DEFAULT); } else if (sc.ch == '\\') { sc.Forward(); } } else if (sc.state == SCE_PS_HEXSTRING) { if (sc.ch == '>') { sc.ForwardSetState(SCE_PS_DEFAULT); } else if (!IsABaseNDigit(sc.ch, 16) && !IsAWhitespaceChar(sc.ch)) { sc.SetState(SCE_PS_HEXSTRING); styler.ColourTo(sc.currentPos, SCE_PS_BADSTRINGCHAR); } } else if (sc.state == SCE_PS_BASE85STRING) { if (sc.Match('~', '>')) { sc.Forward(); sc.ForwardSetState(SCE_PS_DEFAULT); } else if (!IsABase85Char(sc.ch) && !IsAWhitespaceChar(sc.ch)) { sc.SetState(SCE_PS_BASE85STRING); styler.ColourTo(sc.currentPos, SCE_PS_BADSTRINGCHAR); } } // Determine if a new state should be entered. if (sc.state == SCE_C_DEFAULT) { unsigned int tokenpos = sc.currentPos; if (sc.ch == '[' || sc.ch == ']') { sc.SetState(SCE_PS_PAREN_ARRAY); } else if (sc.ch == '{' || sc.ch == '}') { sc.SetState(SCE_PS_PAREN_PROC); } else if (sc.ch == '/') { if (sc.chNext == '/') { sc.SetState(SCE_PS_IMMEVAL); sc.Forward(); } else { sc.SetState(SCE_PS_LITERAL); } } else if (sc.ch == '<') { if (sc.chNext == '<') { sc.SetState(SCE_PS_PAREN_DICT); sc.Forward(); } else if (sc.chNext == '~') { sc.SetState(SCE_PS_BASE85STRING); sc.Forward(); } else { sc.SetState(SCE_PS_HEXSTRING); } } else if (sc.ch == '>' && sc.chNext == '>') { sc.SetState(SCE_PS_PAREN_DICT); sc.Forward(); } else if (sc.ch == '>' || sc.ch == ')') { sc.SetState(SCE_C_DEFAULT); styler.ColourTo(sc.currentPos, SCE_PS_BADSTRINGCHAR); } else if (sc.ch == '(') { sc.SetState(SCE_PS_TEXT); nestTextCurrent = 1; } else if (sc.ch == '%') { if (sc.chNext == '%' && sc.atLineStart) { sc.SetState(SCE_PS_DSC_COMMENT); sc.Forward(); if (sc.chNext == '+') { sc.Forward(); sc.ForwardSetState(SCE_PS_DSC_VALUE); } } else { sc.SetState(SCE_PS_COMMENT); } } else if ((sc.ch == '+' || sc.ch == '-' || sc.ch == '.') && IsABaseNDigit(sc.chNext, 10)) { sc.SetState(SCE_PS_NUMBER); numRadix = 0; numHasPoint = (sc.ch == '.'); numHasExponent = false; numHasSign = (sc.ch == '+' || sc.ch == '-'); } else if ((sc.ch == '+' || sc.ch == '-') && sc.chNext == '.' && IsABaseNDigit(sc.GetRelative(2), 10)) { sc.SetState(SCE_PS_NUMBER); numRadix = 0; numHasPoint = false; numHasExponent = false; numHasSign = true; } else if (IsABaseNDigit(sc.ch, 10)) { sc.SetState(SCE_PS_NUMBER); numRadix = 0; numHasPoint = false; numHasExponent = false; numHasSign = false; } else if (!IsAWhitespaceChar(sc.ch)) { sc.SetState(SCE_PS_NAME); } // Mark the start of tokens if (tokenizing && sc.state != SCE_C_DEFAULT && sc.state != SCE_PS_COMMENT && sc.state != SCE_PS_DSC_COMMENT && sc.state != SCE_PS_DSC_VALUE) { styler.Flush(); styler.StartAt(tokenpos, static_cast(INDIC2_MASK)); styler.ColourTo(tokenpos, INDIC2_MASK); styler.Flush(); styler.StartAt(tokenpos); styler.StartSegment(tokenpos); } } if (sc.atLineEnd) styler.SetLineState(lineCurrent, nestTextCurrent); } sc.Complete(); } static void FoldPSDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) != 0; unsigned int endPos = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); int levelCurrent = SC_FOLDLEVELBASE; if (lineCurrent > 0) levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; int levelMinCurrent = levelCurrent; int levelNext = levelCurrent; char chNext = styler[startPos]; int styleNext = styler.StyleAt(startPos); int style; for (unsigned int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); //mac?? if ((style & 31) == SCE_PS_PAREN_PROC) { if (ch == '{') { // Measure the minimum before a '{' to allow // folding on "} {" if (levelMinCurrent > levelNext) { levelMinCurrent = levelNext; } levelNext++; } else if (ch == '}') { levelNext--; } } if (atEOL) { int levelUse = levelCurrent; if (foldAtElse) { levelUse = levelMinCurrent; } int lev = levelUse | levelNext << 16; if (visibleChars == 0 && foldCompact) lev |= SC_FOLDLEVELWHITEFLAG; if (levelUse < levelNext) lev |= SC_FOLDLEVELHEADERFLAG; if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } lineCurrent++; levelCurrent = levelNext; levelMinCurrent = levelCurrent; visibleChars = 0; } if (!isspacechar(ch)) visibleChars++; } } static const char * const psWordListDesc[] = { "PS Level 1 operators", "PS Level 2 operators", "PS Level 3 operators", "RIP-specific operators", "User-defined operators", 0 }; LexerModule lmPS(SCLEX_PS, ColourisePSDoc, "ps", FoldPSDoc, psWordListDesc); tora-2.1.3/src/qscintilla2/src/ScintillaBase.cpp0000644000175000017500000004500311213435521021273 0ustar michaelmichael// Scintilla source code edit control /** @file ScintillaBase.cxx ** An enhanced subclass of Editor with calltips, autocomplete and context menu. **/ // Copyright 1998-2003 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include "Platform.h" #include "Scintilla.h" #include "PropSet.h" #ifdef SCI_LEXER #include "SciLexer.h" #include "Accessor.h" #include "DocumentAccessor.h" #include "KeyWords.h" #endif #include "SplitVector.h" #include "Partitioning.h" #include "RunStyles.h" #include "ContractionState.h" #include "CellBuffer.h" #include "CallTip.h" #include "KeyMap.h" #include "Indicator.h" #include "XPM.h" #include "LineMarker.h" #include "Style.h" #include "ViewStyle.h" #include "AutoComplete.h" #include "CharClassify.h" #include "Decoration.h" #include "Document.h" #include "PositionCache.h" #include "Editor.h" #include "ScintillaBase.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif ScintillaBase::ScintillaBase() { displayPopupMenu = true; listType = 0; maxListWidth = 0; #ifdef SCI_LEXER lexLanguage = SCLEX_CONTAINER; performingStyle = false; lexCurrent = 0; for (int wl = 0;wl < numWordLists;wl++) keyWordLists[wl] = new WordList; keyWordLists[numWordLists] = 0; #endif } ScintillaBase::~ScintillaBase() { #ifdef SCI_LEXER for (int wl = 0;wl < numWordLists;wl++) delete keyWordLists[wl]; #endif } void ScintillaBase::Finalise() { Editor::Finalise(); popup.Destroy(); } void ScintillaBase::RefreshColourPalette(Palette &pal, bool want) { Editor::RefreshColourPalette(pal, want); ct.RefreshColourPalette(pal, want); } void ScintillaBase::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) { bool isFillUp = ac.Active() && ac.IsFillUpChar(*s); if (!isFillUp) { Editor::AddCharUTF(s, len, treatAsDBCS); } if (ac.Active()) { AutoCompleteCharacterAdded(s[0]); // For fill ups add the character after the autocompletion has // triggered so containers see the key so can display a calltip. if (isFillUp) { Editor::AddCharUTF(s, len, treatAsDBCS); } } } void ScintillaBase::Command(int cmdId) { switch (cmdId) { case idAutoComplete: // Nothing to do break; case idCallTip: // Nothing to do break; case idcmdUndo: WndProc(SCI_UNDO, 0, 0); break; case idcmdRedo: WndProc(SCI_REDO, 0, 0); break; case idcmdCut: WndProc(SCI_CUT, 0, 0); break; case idcmdCopy: WndProc(SCI_COPY, 0, 0); break; case idcmdPaste: WndProc(SCI_PASTE, 0, 0); break; case idcmdDelete: WndProc(SCI_CLEAR, 0, 0); break; case idcmdSelectAll: WndProc(SCI_SELECTALL, 0, 0); break; } } int ScintillaBase::KeyCommand(unsigned int iMessage) { // Most key commands cancel autocompletion mode if (ac.Active()) { switch (iMessage) { // Except for these case SCI_LINEDOWN: AutoCompleteMove(1); return 0; case SCI_LINEUP: AutoCompleteMove( -1); return 0; case SCI_PAGEDOWN: AutoCompleteMove(5); return 0; case SCI_PAGEUP: AutoCompleteMove( -5); return 0; case SCI_VCHOME: AutoCompleteMove( -5000); return 0; case SCI_LINEEND: AutoCompleteMove(5000); return 0; case SCI_DELETEBACK: DelCharBack(true); AutoCompleteCharacterDeleted(); EnsureCaretVisible(); return 0; case SCI_DELETEBACKNOTLINE: DelCharBack(false); AutoCompleteCharacterDeleted(); EnsureCaretVisible(); return 0; case SCI_TAB: AutoCompleteCompleted(); return 0; case SCI_NEWLINE: AutoCompleteCompleted(); return 0; default: AutoCompleteCancel(); } } if (ct.inCallTipMode) { if ( (iMessage != SCI_CHARLEFT) && (iMessage != SCI_CHARLEFTEXTEND) && (iMessage != SCI_CHARRIGHT) && (iMessage != SCI_CHARRIGHTEXTEND) && (iMessage != SCI_EDITTOGGLEOVERTYPE) && (iMessage != SCI_DELETEBACK) && (iMessage != SCI_DELETEBACKNOTLINE) ) { ct.CallTipCancel(); } if ((iMessage == SCI_DELETEBACK) || (iMessage == SCI_DELETEBACKNOTLINE)) { if (currentPos <= ct.posStartCallTip) { ct.CallTipCancel(); } } } return Editor::KeyCommand(iMessage); } void ScintillaBase::AutoCompleteDoubleClick(void* p) { ScintillaBase* sci = reinterpret_cast(p); sci->AutoCompleteCompleted(); } void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) { //Platform::DebugPrintf("AutoComplete %s\n", list); ct.CallTipCancel(); if (ac.chooseSingle && (listType == 0)) { if (list && !strchr(list, ac.GetSeparator())) { const char *typeSep = strchr(list, ac.GetTypesep()); size_t lenInsert = (typeSep) ? (typeSep-list) : strlen(list); if (ac.ignoreCase) { SetEmptySelection(currentPos - lenEntered); pdoc->DeleteChars(currentPos, lenEntered); SetEmptySelection(currentPos); pdoc->InsertString(currentPos, list, lenInsert); SetEmptySelection(currentPos + lenInsert); } else { SetEmptySelection(currentPos); pdoc->InsertString(currentPos, list + lenEntered, lenInsert - lenEntered); SetEmptySelection(currentPos + lenInsert - lenEntered); } return; } } ac.Start(wMain, idAutoComplete, currentPos, LocationFromPosition(currentPos), lenEntered, vs.lineHeight, IsUnicodeMode()); PRectangle rcClient = GetClientRectangle(); Point pt = LocationFromPosition(currentPos - lenEntered); PRectangle rcPopupBounds = wMain.GetMonitorRect(pt); if (rcPopupBounds.Height() == 0) rcPopupBounds = rcClient; int heightLB = 100; int widthLB = 100; if (pt.x >= rcClient.right - widthLB) { HorizontalScrollTo(xOffset + pt.x - rcClient.right + widthLB); Redraw(); pt = LocationFromPosition(currentPos); } PRectangle rcac; rcac.left = pt.x - ac.lb->CaretFromEdge(); if (pt.y >= rcPopupBounds.bottom - heightLB && // Wont fit below. pt.y >= (rcPopupBounds.bottom + rcPopupBounds.top) / 2) { // and there is more room above. rcac.top = pt.y - heightLB; if (rcac.top < rcPopupBounds.top) { heightLB -= (rcPopupBounds.top - rcac.top); rcac.top = rcPopupBounds.top; } } else { rcac.top = pt.y + vs.lineHeight; } rcac.right = rcac.left + widthLB; rcac.bottom = Platform::Minimum(rcac.top + heightLB, rcPopupBounds.bottom); ac.lb->SetPositionRelative(rcac, wMain); ac.lb->SetFont(vs.styles[STYLE_DEFAULT].font); unsigned int aveCharWidth = vs.styles[STYLE_DEFAULT].aveCharWidth; ac.lb->SetAverageCharWidth(aveCharWidth); ac.lb->SetDoubleClickAction(AutoCompleteDoubleClick, this); ac.SetList(list); // Fiddle the position of the list so it is right next to the target and wide enough for all its strings PRectangle rcList = ac.lb->GetDesiredRect(); int heightAlloced = rcList.bottom - rcList.top; widthLB = Platform::Maximum(widthLB, rcList.right - rcList.left); if (maxListWidth != 0) widthLB = Platform::Minimum(widthLB, aveCharWidth*maxListWidth); // Make an allowance for large strings in list rcList.left = pt.x - ac.lb->CaretFromEdge(); rcList.right = rcList.left + widthLB; if (((pt.y + vs.lineHeight) >= (rcPopupBounds.bottom - heightAlloced)) && // Wont fit below. ((pt.y + vs.lineHeight / 2) >= (rcPopupBounds.bottom + rcPopupBounds.top) / 2)) { // and there is more room above. rcList.top = pt.y - heightAlloced; } else { rcList.top = pt.y + vs.lineHeight; } rcList.bottom = rcList.top + heightAlloced; ac.lb->SetPositionRelative(rcList, wMain); ac.Show(true); if (lenEntered != 0) { AutoCompleteMoveToCurrentWord(); } } void ScintillaBase::AutoCompleteCancel() { if (ac.Active()) { SCNotification scn = {0}; scn.nmhdr.code = SCN_AUTOCCANCELLED; scn.wParam = 0; scn.listType = 0; NotifyParent(scn); } ac.Cancel(); } void ScintillaBase::AutoCompleteMove(int delta) { ac.Move(delta); } void ScintillaBase::AutoCompleteMoveToCurrentWord() { char wordCurrent[1000]; int i; int startWord = ac.posStart - ac.startLen; for (i = startWord; i < currentPos && i - startWord < 1000; i++) wordCurrent[i - startWord] = pdoc->CharAt(i); wordCurrent[Platform::Minimum(i - startWord, 999)] = '\0'; ac.Select(wordCurrent); } void ScintillaBase::AutoCompleteCharacterAdded(char ch) { if (ac.IsFillUpChar(ch)) { AutoCompleteCompleted(); } else if (ac.IsStopChar(ch)) { AutoCompleteCancel(); } else { AutoCompleteMoveToCurrentWord(); } } void ScintillaBase::AutoCompleteCharacterDeleted() { if (currentPos < ac.posStart - ac.startLen) { AutoCompleteCancel(); } else if (ac.cancelAtStartPos && (currentPos <= ac.posStart)) { AutoCompleteCancel(); } else { AutoCompleteMoveToCurrentWord(); } SCNotification scn = {0}; scn.nmhdr.code = SCN_AUTOCCHARDELETED; scn.wParam = 0; scn.listType = 0; NotifyParent(scn); } void ScintillaBase::AutoCompleteCompleted() { int item = ac.lb->GetSelection(); char selected[1000]; selected[0] = '\0'; if (item != -1) { ac.lb->GetValue(item, selected, sizeof(selected)); } else { AutoCompleteCancel(); return; } ac.Show(false); listSelected = selected; SCNotification scn = {0}; scn.nmhdr.code = listType > 0 ? SCN_USERLISTSELECTION : SCN_AUTOCSELECTION; scn.message = 0; scn.wParam = listType; scn.listType = listType; Position firstPos = ac.posStart - ac.startLen; scn.lParam = firstPos; scn.text = listSelected.c_str(); NotifyParent(scn); if (!ac.Active()) return; ac.Cancel(); if (listType > 0) return; Position endPos = currentPos; if (ac.dropRestOfWord) endPos = pdoc->ExtendWordSelect(endPos, 1, true); if (endPos < firstPos) return; pdoc->BeginUndoAction(); if (endPos != firstPos) { pdoc->DeleteChars(firstPos, endPos - firstPos); } SetEmptySelection(ac.posStart); if (item != -1) { SString piece = selected; pdoc->InsertCString(firstPos, piece.c_str()); SetEmptySelection(firstPos + static_cast(piece.length())); } pdoc->EndUndoAction(); } int ScintillaBase::AutoCompleteGetCurrent() { if (!ac.Active()) return -1; return ac.lb->GetSelection(); } void ScintillaBase::CallTipShow(Point pt, const char *defn) { ac.Cancel(); pt.y += vs.lineHeight; // If container knows about STYLE_CALLTIP then use it in place of the // STYLE_DEFAULT for the face name, size and character set. Also use it // for the foreground and background colour. int ctStyle = ct.UseStyleCallTip() ? STYLE_CALLTIP : STYLE_DEFAULT; if (ct.UseStyleCallTip()) { ct.SetForeBack(vs.styles[STYLE_CALLTIP].fore, vs.styles[STYLE_CALLTIP].back); } PRectangle rc = ct.CallTipStart(currentPos, pt, defn, vs.styles[ctStyle].fontName, vs.styles[ctStyle].sizeZoomed, CodePage(), vs.styles[ctStyle].characterSet, wMain); // If the call-tip window would be out of the client // space, adjust so it displays above the text. PRectangle rcClient = GetClientRectangle(); if (rc.bottom > rcClient.bottom) { int offset = vs.lineHeight + rc.Height(); rc.top -= offset; rc.bottom -= offset; } // Now display the window. CreateCallTipWindow(rc); ct.wCallTip.SetPositionRelative(rc, wMain); ct.wCallTip.Show(); } void ScintillaBase::CallTipClick() { SCNotification scn = {0}; scn.nmhdr.code = SCN_CALLTIPCLICK; scn.position = ct.clickPlace; NotifyParent(scn); } void ScintillaBase::ContextMenu(Point pt) { if (displayPopupMenu) { bool writable = !WndProc(SCI_GETREADONLY, 0, 0); popup.CreatePopUp(); AddToPopUp("Undo", idcmdUndo, writable && pdoc->CanUndo()); AddToPopUp("Redo", idcmdRedo, writable && pdoc->CanRedo()); AddToPopUp(""); AddToPopUp("Cut", idcmdCut, writable && currentPos != anchor); AddToPopUp("Copy", idcmdCopy, currentPos != anchor); AddToPopUp("Paste", idcmdPaste, writable && WndProc(SCI_CANPASTE, 0, 0)); AddToPopUp("Delete", idcmdDelete, writable && currentPos != anchor); AddToPopUp(""); AddToPopUp("Select All", idcmdSelectAll); popup.Show(pt, wMain); } } void ScintillaBase::CancelModes() { AutoCompleteCancel(); ct.CallTipCancel(); Editor::CancelModes(); } void ScintillaBase::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) { CancelModes(); Editor::ButtonDown(pt, curTime, shift, ctrl, alt); } #ifdef SCI_LEXER void ScintillaBase::SetLexer(uptr_t wParam) { lexLanguage = wParam; lexCurrent = LexerModule::Find(lexLanguage); if (!lexCurrent) lexCurrent = LexerModule::Find(SCLEX_NULL); } void ScintillaBase::SetLexerLanguage(const char *languageName) { lexLanguage = SCLEX_CONTAINER; lexCurrent = LexerModule::Find(languageName); if (!lexCurrent) lexCurrent = LexerModule::Find(SCLEX_NULL); if (lexCurrent) lexLanguage = lexCurrent->GetLanguage(); } void ScintillaBase::Colourise(int start, int end) { if (!performingStyle) { // Protect against reentrance, which may occur, for example, when // fold points are discovered while performing styling and the folding // code looks for child lines which may trigger styling. performingStyle = true; int lengthDoc = pdoc->Length(); if (end == -1) end = lengthDoc; int len = end - start; PLATFORM_ASSERT(len >= 0); PLATFORM_ASSERT(start + len <= lengthDoc); //WindowAccessor styler(wMain.GetID(), props); DocumentAccessor styler(pdoc, props, wMain.GetID()); int styleStart = 0; if (start > 0) styleStart = styler.StyleAt(start - 1) & pdoc->stylingBitsMask; styler.SetCodePage(pdoc->dbcsCodePage); if (lexCurrent && (len > 0)) { // Should always succeed as null lexer should always be available lexCurrent->Lex(start, len, styleStart, keyWordLists, styler); styler.Flush(); if (styler.GetPropertyInt("fold")) { lexCurrent->Fold(start, len, styleStart, keyWordLists, styler); styler.Flush(); } } performingStyle = false; } } #endif void ScintillaBase::NotifyStyleToNeeded(int endStyleNeeded) { #ifdef SCI_LEXER if (lexLanguage != SCLEX_CONTAINER) { int endStyled = WndProc(SCI_GETENDSTYLED, 0, 0); int lineEndStyled = WndProc(SCI_LINEFROMPOSITION, endStyled, 0); endStyled = WndProc(SCI_POSITIONFROMLINE, lineEndStyled, 0); Colourise(endStyled, endStyleNeeded); return; } #endif Editor::NotifyStyleToNeeded(endStyleNeeded); } sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { switch (iMessage) { case SCI_AUTOCSHOW: listType = 0; AutoCompleteStart(wParam, reinterpret_cast(lParam)); break; case SCI_AUTOCCANCEL: ac.Cancel(); break; case SCI_AUTOCACTIVE: return ac.Active(); case SCI_AUTOCPOSSTART: return ac.posStart; case SCI_AUTOCCOMPLETE: AutoCompleteCompleted(); break; case SCI_AUTOCSETSEPARATOR: ac.SetSeparator(static_cast(wParam)); break; case SCI_AUTOCGETSEPARATOR: return ac.GetSeparator(); case SCI_AUTOCSTOPS: ac.SetStopChars(reinterpret_cast(lParam)); break; case SCI_AUTOCSELECT: ac.Select(reinterpret_cast(lParam)); break; case SCI_AUTOCGETCURRENT: return AutoCompleteGetCurrent(); case SCI_AUTOCSETCANCELATSTART: ac.cancelAtStartPos = wParam != 0; break; case SCI_AUTOCGETCANCELATSTART: return ac.cancelAtStartPos; case SCI_AUTOCSETFILLUPS: ac.SetFillUpChars(reinterpret_cast(lParam)); break; case SCI_AUTOCSETCHOOSESINGLE: ac.chooseSingle = wParam != 0; break; case SCI_AUTOCGETCHOOSESINGLE: return ac.chooseSingle; case SCI_AUTOCSETIGNORECASE: ac.ignoreCase = wParam != 0; break; case SCI_AUTOCGETIGNORECASE: return ac.ignoreCase; case SCI_USERLISTSHOW: listType = wParam; AutoCompleteStart(0, reinterpret_cast(lParam)); break; case SCI_AUTOCSETAUTOHIDE: ac.autoHide = wParam != 0; break; case SCI_AUTOCGETAUTOHIDE: return ac.autoHide; case SCI_AUTOCSETDROPRESTOFWORD: ac.dropRestOfWord = wParam != 0; break; case SCI_AUTOCGETDROPRESTOFWORD: return ac.dropRestOfWord; case SCI_AUTOCSETMAXHEIGHT: ac.lb->SetVisibleRows(wParam); break; case SCI_AUTOCGETMAXHEIGHT: return ac.lb->GetVisibleRows(); case SCI_AUTOCSETMAXWIDTH: maxListWidth = wParam; break; case SCI_AUTOCGETMAXWIDTH: return maxListWidth; case SCI_REGISTERIMAGE: ac.lb->RegisterImage(wParam, reinterpret_cast(lParam)); break; case SCI_CLEARREGISTEREDIMAGES: ac.lb->ClearRegisteredImages(); break; case SCI_AUTOCSETTYPESEPARATOR: ac.SetTypesep(static_cast(wParam)); break; case SCI_AUTOCGETTYPESEPARATOR: return ac.GetTypesep(); case SCI_CALLTIPSHOW: CallTipShow(LocationFromPosition(wParam), reinterpret_cast(lParam)); break; case SCI_CALLTIPCANCEL: ct.CallTipCancel(); break; case SCI_CALLTIPACTIVE: return ct.inCallTipMode; case SCI_CALLTIPPOSSTART: return ct.posStartCallTip; case SCI_CALLTIPSETHLT: ct.SetHighlight(wParam, lParam); break; case SCI_CALLTIPSETBACK: ct.colourBG = ColourDesired(wParam); vs.styles[STYLE_CALLTIP].back = ct.colourBG; InvalidateStyleRedraw(); break; case SCI_CALLTIPSETFORE: ct.colourUnSel = ColourDesired(wParam); vs.styles[STYLE_CALLTIP].fore = ct.colourUnSel; InvalidateStyleRedraw(); break; case SCI_CALLTIPSETFOREHLT: ct.colourSel = ColourDesired(wParam); InvalidateStyleRedraw(); break; case SCI_CALLTIPUSESTYLE: ct.SetTabSize((int)wParam); InvalidateStyleRedraw(); break; case SCI_USEPOPUP: displayPopupMenu = wParam != 0; break; #ifdef SCI_LEXER case SCI_SETLEXER: SetLexer(wParam); lexLanguage = wParam; break; case SCI_GETLEXER: return lexLanguage; case SCI_COLOURISE: if (lexLanguage == SCLEX_CONTAINER) { pdoc->ModifiedAt(wParam); NotifyStyleToNeeded((lParam == -1) ? pdoc->Length() : lParam); } else { Colourise(wParam, lParam); } Redraw(); break; case SCI_SETPROPERTY: props.Set(reinterpret_cast(wParam), reinterpret_cast(lParam)); break; case SCI_GETPROPERTY: { SString val = props.Get(reinterpret_cast(wParam)); const int n = val.length(); if (lParam != 0) { char *ptr = reinterpret_cast(lParam); memcpy(ptr, val.c_str(), n); ptr[n] = '\0'; // terminate } return n; // Not including NUL } case SCI_GETPROPERTYEXPANDED: { SString val = props.GetExpanded(reinterpret_cast(wParam)); const int n = val.length(); if (lParam != 0) { char *ptr = reinterpret_cast(lParam); memcpy(ptr, val.c_str(), n); ptr[n] = '\0'; // terminate } return n; // Not including NUL } case SCI_GETPROPERTYINT: return props.GetInt(reinterpret_cast(wParam), lParam); case SCI_SETKEYWORDS: if (wParam < numWordLists) { keyWordLists[wParam]->Clear(); keyWordLists[wParam]->Set(reinterpret_cast(lParam)); } break; case SCI_SETLEXERLANGUAGE: SetLexerLanguage(reinterpret_cast(lParam)); break; case SCI_GETSTYLEBITSNEEDED: return lexCurrent ? lexCurrent->GetStyleBitsNeeded() : 5; #endif default: return Editor::WndProc(iMessage, wParam, lParam); } return 0l; } tora-2.1.3/src/qscintilla2/src/LexCsound.cpp0000644000175000017500000001416511213435521020467 0ustar michaelmichael// Scintilla source code edit control /** @file LexCsound.cxx ** Lexer for Csound (Orchestra & Score) ** Written by Georg Ritter - **/ // Copyright 1998-2003 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static inline bool IsAWordChar(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '?'); } static inline bool IsAWordStart(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.' || ch == '%' || ch == '@' || ch == '$' || ch == '?'); } static inline bool IsCsoundOperator(char ch) { if (isalnum(ch)) return false; // '.' left out as it is used to make up numbers if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || ch == '(' || ch == ')' || ch == '=' || ch == '^' || ch == '[' || ch == ']' || ch == '<' || ch == '&' || ch == '>' || ch == ',' || ch == '|' || ch == '~' || ch == '%' || ch == ':') return true; return false; } static void ColouriseCsoundDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &opcode = *keywordlists[0]; WordList &headerStmt = *keywordlists[1]; WordList &otherKeyword = *keywordlists[2]; // Do not leak onto next line if (initStyle == SCE_CSOUND_STRINGEOL) initStyle = SCE_CSOUND_DEFAULT; StyleContext sc(startPos, length, initStyle, styler); for (; sc.More(); sc.Forward()) { // Handle line continuation generically. if (sc.ch == '\\') { if (sc.chNext == '\n' || sc.chNext == '\r') { sc.Forward(); if (sc.ch == '\r' && sc.chNext == '\n') { sc.Forward(); } continue; } } // Determine if the current state should terminate. if (sc.state == SCE_CSOUND_OPERATOR) { if (!IsCsoundOperator(static_cast(sc.ch))) { sc.SetState(SCE_CSOUND_DEFAULT); } }else if (sc.state == SCE_CSOUND_NUMBER) { if (!IsAWordChar(sc.ch)) { sc.SetState(SCE_CSOUND_DEFAULT); } } else if (sc.state == SCE_CSOUND_IDENTIFIER) { if (!IsAWordChar(sc.ch) ) { char s[100]; sc.GetCurrent(s, sizeof(s)); if (opcode.InList(s)) { sc.ChangeState(SCE_CSOUND_OPCODE); } else if (headerStmt.InList(s)) { sc.ChangeState(SCE_CSOUND_HEADERSTMT); } else if (otherKeyword.InList(s)) { sc.ChangeState(SCE_CSOUND_USERKEYWORD); } else if (s[0] == 'p') { sc.ChangeState(SCE_CSOUND_PARAM); } else if (s[0] == 'a') { sc.ChangeState(SCE_CSOUND_ARATE_VAR); } else if (s[0] == 'k') { sc.ChangeState(SCE_CSOUND_KRATE_VAR); } else if (s[0] == 'i') { // covers both i-rate variables and i-statements sc.ChangeState(SCE_CSOUND_IRATE_VAR); } else if (s[0] == 'g') { sc.ChangeState(SCE_CSOUND_GLOBAL_VAR); } sc.SetState(SCE_CSOUND_DEFAULT); } } else if (sc.state == SCE_CSOUND_COMMENT ) { if (sc.atLineEnd) { sc.SetState(SCE_CSOUND_DEFAULT); } } else if ((sc.state == SCE_CSOUND_ARATE_VAR) || (sc.state == SCE_CSOUND_KRATE_VAR) || (sc.state == SCE_CSOUND_IRATE_VAR)) { if (!IsAWordChar(sc.ch)) { sc.SetState(SCE_CSOUND_DEFAULT); } } // Determine if a new state should be entered. if (sc.state == SCE_CSOUND_DEFAULT) { if (sc.ch == ';'){ sc.SetState(SCE_CSOUND_COMMENT); } else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) { sc.SetState(SCE_CSOUND_NUMBER); } else if (IsAWordStart(sc.ch)) { sc.SetState(SCE_CSOUND_IDENTIFIER); } else if (IsCsoundOperator(static_cast(sc.ch))) { sc.SetState(SCE_CSOUND_OPERATOR); } else if (sc.ch == 'p') { sc.SetState(SCE_CSOUND_PARAM); } else if (sc.ch == 'a') { sc.SetState(SCE_CSOUND_ARATE_VAR); } else if (sc.ch == 'k') { sc.SetState(SCE_CSOUND_KRATE_VAR); } else if (sc.ch == 'i') { // covers both i-rate variables and i-statements sc.SetState(SCE_CSOUND_IRATE_VAR); } else if (sc.ch == 'g') { sc.SetState(SCE_CSOUND_GLOBAL_VAR); } } } sc.Complete(); } static void FoldCsoundInstruments(unsigned int startPos, int length, int /* initStyle */, WordList *[], Accessor &styler) { unsigned int lengthDoc = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; int levelCurrent = levelPrev; char chNext = styler[startPos]; int stylePrev = 0; int styleNext = styler.StyleAt(startPos); for (unsigned int i = startPos; i < lengthDoc; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); int style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if ((stylePrev != SCE_CSOUND_OPCODE) && (style == SCE_CSOUND_OPCODE)) { char s[20]; unsigned int j = 0; while ((j < (sizeof(s) - 1)) && (iswordchar(styler[i + j]))) { s[j] = styler[i + j]; j++; } s[j] = '\0'; if (strcmp(s, "instr") == 0) levelCurrent++; if (strcmp(s, "endin") == 0) levelCurrent--; } if (atEOL) { int lev = levelPrev; if (visibleChars == 0) lev |= SC_FOLDLEVELWHITEFLAG; if ((levelCurrent > levelPrev) && (visibleChars > 0)) lev |= SC_FOLDLEVELHEADERFLAG; if (lev != styler.LevelAt(lineCurrent)) { styler.SetLevel(lineCurrent, lev); } lineCurrent++; levelPrev = levelCurrent; visibleChars = 0; } if (!isspacechar(ch)) visibleChars++; stylePrev = style; } // Fill in the real level of the next line, keeping the current flags as they will be filled in later int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; styler.SetLevel(lineCurrent, levelPrev | flagsNext); } static const char * const csoundWordListDesc[] = { "Opcodes", "Header Statements", "User keywords", 0 }; LexerModule lmCsound(SCLEX_CSOUND, ColouriseCsoundDoc, "csound", FoldCsoundInstruments, csoundWordListDesc); tora-2.1.3/src/qscintilla2/src/DocumentAccessor.cpp0000644000175000017500000001173611213435521022025 0ustar michaelmichael// Scintilla source code edit control /** @file DocumentAccessor.cxx ** Rapid easy access to contents of a Scintilla. **/ // Copyright 1998-2001 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "DocumentAccessor.h" #include "SplitVector.h" #include "Partitioning.h" #include "RunStyles.h" #include "CellBuffer.h" #include "Scintilla.h" #include "CharClassify.h" #include "Decoration.h" #include "Document.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif DocumentAccessor::~DocumentAccessor() { } bool DocumentAccessor::InternalIsLeadByte(char ch) { if (SC_CP_UTF8 == codePage) // For lexing, all characters >= 0x80 are treated the // same so none is considered a lead byte. return false; else return Platform::IsDBCSLeadByte(codePage, ch); } void DocumentAccessor::Fill(int position) { if (lenDoc == -1) lenDoc = pdoc->Length(); startPos = position - slopSize; if (startPos + bufferSize > lenDoc) startPos = lenDoc - bufferSize; if (startPos < 0) startPos = 0; endPos = startPos + bufferSize; if (endPos > lenDoc) endPos = lenDoc; pdoc->GetCharRange(buf, startPos, endPos-startPos); buf[endPos-startPos] = '\0'; } bool DocumentAccessor::Match(int pos, const char *s) { for (int i=0; *s; i++) { if (*s != SafeGetCharAt(pos+i)) return false; s++; } return true; } char DocumentAccessor::StyleAt(int position) { // Mask off all bits which aren't in the 'mask'. return static_cast(pdoc->StyleAt(position) & mask); } int DocumentAccessor::GetLine(int position) { return pdoc->LineFromPosition(position); } int DocumentAccessor::LineStart(int line) { return pdoc->LineStart(line); } int DocumentAccessor::LevelAt(int line) { return pdoc->GetLevel(line); } int DocumentAccessor::Length() { if (lenDoc == -1) lenDoc = pdoc->Length(); return lenDoc; } int DocumentAccessor::GetLineState(int line) { return pdoc->GetLineState(line); } int DocumentAccessor::SetLineState(int line, int state) { return pdoc->SetLineState(line, state); } void DocumentAccessor::StartAt(unsigned int start, char chMask) { // Store the mask specified for use with StyleAt. mask = chMask; pdoc->StartStyling(start, chMask); startPosStyling = start; } void DocumentAccessor::StartSegment(unsigned int pos) { startSeg = pos; } void DocumentAccessor::ColourTo(unsigned int pos, int chAttr) { // Only perform styling if non empty range if (pos != startSeg - 1) { PLATFORM_ASSERT(pos >= startSeg); if (pos < startSeg) { return; } if (validLen + (pos - startSeg + 1) >= bufferSize) Flush(); if (validLen + (pos - startSeg + 1) >= bufferSize) { // Too big for buffer so send directly pdoc->SetStyleFor(pos - startSeg + 1, static_cast(chAttr)); } else { if (chAttr != chWhile) chFlags = 0; chAttr |= chFlags; for (unsigned int i = startSeg; i <= pos; i++) { PLATFORM_ASSERT((startPosStyling + validLen) < Length()); styleBuf[validLen++] = static_cast(chAttr); } } } startSeg = pos+1; } void DocumentAccessor::SetLevel(int line, int level) { pdoc->SetLevel(line, level); } void DocumentAccessor::Flush() { startPos = extremePosition; lenDoc = -1; if (validLen > 0) { pdoc->SetStyles(validLen, styleBuf); startPosStyling += validLen; validLen = 0; } } int DocumentAccessor::IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader) { int end = Length(); int spaceFlags = 0; // Determines the indentation level of the current line and also checks for consistent // indentation compared to the previous line. // Indentation is judged consistent when the indentation whitespace of each line lines // the same or the indentation of one line is a prefix of the other. int pos = LineStart(line); char ch = (*this)[pos]; int indent = 0; bool inPrevPrefix = line > 0; int posPrev = inPrevPrefix ? LineStart(line-1) : 0; while ((ch == ' ' || ch == '\t') && (pos < end)) { if (inPrevPrefix) { char chPrev = (*this)[posPrev++]; if (chPrev == ' ' || chPrev == '\t') { if (chPrev != ch) spaceFlags |= wsInconsistent; } else { inPrevPrefix = false; } } if (ch == ' ') { spaceFlags |= wsSpace; indent++; } else { // Tab spaceFlags |= wsTab; if (spaceFlags & wsSpace) spaceFlags |= wsSpaceTab; indent = (indent / 8 + 1) * 8; } ch = (*this)[++pos]; } *flags = spaceFlags; indent += SC_FOLDLEVELBASE; // if completely empty line or the start of a comment... if ((ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') || (pfnIsCommentLeader && (*pfnIsCommentLeader)(*this, pos, end-pos)) ) return indent | SC_FOLDLEVELWHITEFLAG; else return indent; } void DocumentAccessor::IndicatorFill(int start, int end, int indicator, int value) { pdoc->decorations.SetCurrentIndicator(indicator); pdoc->DecorationFillRange(start, value, end - start); } tora-2.1.3/src/qscintilla2/src/LexGui4Cli.cpp0000644000175000017500000002130211213435521020463 0ustar michaelmichael// Scintilla source code edit control // Copyright 1998-2002 by Neil Hodgson /* This is the Lexer for Gui4Cli, included in SciLexer.dll - by d. Keletsekis, 2/10/2003 To add to SciLexer.dll: 1. Add the values below to INCLUDE\Scintilla.iface 2. Run the include/HFacer.py script 3. Run the src/lexGen.py script val SCE_GC_DEFAULT=0 val SCE_GC_COMMENTLINE=1 val SCE_GC_COMMENTBLOCK=2 val SCE_GC_GLOBAL=3 val SCE_GC_EVENT=4 val SCE_GC_ATTRIBUTE=5 val SCE_GC_CONTROL=6 val SCE_GC_COMMAND=7 val SCE_GC_STRING=8 val SCE_GC_OPERATOR=9 */ #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif #define debug Platform::DebugPrintf static inline bool IsAWordChar(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch =='\\'); } static inline bool IsAWordStart(const int ch) { return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.'); } inline bool isGCOperator(int ch) { if (isalnum(ch)) return false; // '.' left out as it is used to make up numbers if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || ch == '(' || ch == ')' || ch == '=' || ch == '%' || ch == '[' || ch == ']' || ch == '<' || ch == '>' || ch == ',' || ch == ';' || ch == ':') return true; return false; } #define isSpace(x) ((x)==' ' || (x)=='\t') #define isNL(x) ((x)=='\n' || (x)=='\r') #define isSpaceOrNL(x) (isSpace(x) || isNL(x)) #define BUFFSIZE 500 #define isFoldPoint(x) ((styler.LevelAt(x) & SC_FOLDLEVELNUMBERMASK) == 1024) static void colorFirstWord(WordList *keywordlists[], Accessor &styler, StyleContext *sc, char *buff, int length, int) { int c = 0; while (sc->More() && isSpaceOrNL(sc->ch)) { sc->Forward(); } styler.ColourTo(sc->currentPos - 1, sc->state); if (!IsAWordChar(sc->ch)) // comment, marker, etc.. return; while (sc->More() && !isSpaceOrNL(sc->ch) && (c < length-1) && !isGCOperator(sc->ch)) { buff[c] = static_cast(sc->ch); ++c; sc->Forward(); } buff[c] = '\0'; char *p = buff; while (*p) // capitalize.. { if (islower(*p)) *p = static_cast(toupper(*p)); ++p; } WordList &kGlobal = *keywordlists[0]; // keyword lists set by the user WordList &kEvent = *keywordlists[1]; WordList &kAttribute = *keywordlists[2]; WordList &kControl = *keywordlists[3]; WordList &kCommand = *keywordlists[4]; int state = 0; // int level = styler.LevelAt(line) & SC_FOLDLEVELNUMBERMASK; // debug ("line = %d, level = %d", line, level); if (kGlobal.InList(buff)) state = SCE_GC_GLOBAL; else if (kAttribute.InList(buff)) state = SCE_GC_ATTRIBUTE; else if (kControl.InList(buff)) state = SCE_GC_CONTROL; else if (kCommand.InList(buff)) state = SCE_GC_COMMAND; else if (kEvent.InList(buff)) state = SCE_GC_EVENT; if (state) { sc->ChangeState(state); styler.ColourTo(sc->currentPos - 1, sc->state); sc->ChangeState(SCE_GC_DEFAULT); } else { sc->ChangeState(SCE_GC_DEFAULT); styler.ColourTo(sc->currentPos - 1, sc->state); } } // Main colorizing function called by Scintilla static void ColouriseGui4CliDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { styler.StartAt(startPos); int quotestart = 0, oldstate, currentline = styler.GetLine(startPos); styler.StartSegment(startPos); bool noforward; char buff[BUFFSIZE+1]; // buffer for command name StyleContext sc(startPos, length, initStyle, styler); buff[0] = '\0'; // cbuff = 0; if (sc.state != SCE_GC_COMMENTBLOCK) // colorize 1st word.. colorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline); while (sc.More()) { noforward = 0; switch (sc.ch) { case '/': if (sc.state == SCE_GC_COMMENTBLOCK || sc.state == SCE_GC_STRING) break; if (sc.chNext == '/') // line comment { sc.SetState (SCE_GC_COMMENTLINE); sc.Forward(); styler.ColourTo(sc.currentPos, sc.state); } else if (sc.chNext == '*') // block comment { sc.SetState(SCE_GC_COMMENTBLOCK); sc.Forward(); styler.ColourTo(sc.currentPos, sc.state); } else styler.ColourTo(sc.currentPos, sc.state); break; case '*': // end of comment block, or operator.. if (sc.state == SCE_GC_STRING) break; if (sc.state == SCE_GC_COMMENTBLOCK && sc.chNext == '/') { sc.Forward(); styler.ColourTo(sc.currentPos, sc.state); sc.ChangeState (SCE_GC_DEFAULT); } else styler.ColourTo(sc.currentPos, sc.state); break; case '\'': case '\"': // strings.. if (sc.state == SCE_GC_COMMENTBLOCK || sc.state == SCE_GC_COMMENTLINE) break; if (sc.state == SCE_GC_STRING) { if (sc.ch == quotestart) // match same quote char.. { styler.ColourTo(sc.currentPos, sc.state); sc.ChangeState(SCE_GC_DEFAULT); quotestart = 0; } } else { styler.ColourTo(sc.currentPos - 1, sc.state); sc.ChangeState(SCE_GC_STRING); quotestart = sc.ch; } break; case ';': // end of commandline character if (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE && sc.state != SCE_GC_STRING) { styler.ColourTo(sc.currentPos - 1, sc.state); styler.ColourTo(sc.currentPos, SCE_GC_OPERATOR); sc.ChangeState(SCE_GC_DEFAULT); sc.Forward(); colorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline); noforward = 1; // don't move forward - already positioned at next char.. } break; case '+': case '-': case '=': case '!': // operators.. case '<': case '>': case '&': case '|': case '$': if (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE && sc.state != SCE_GC_STRING) { styler.ColourTo(sc.currentPos - 1, sc.state); styler.ColourTo(sc.currentPos, SCE_GC_OPERATOR); sc.ChangeState(SCE_GC_DEFAULT); } break; case '\\': // escape - same as operator, but also mark in strings.. if (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE) { oldstate = sc.state; styler.ColourTo(sc.currentPos - 1, sc.state); sc.Forward(); // mark also the next char.. styler.ColourTo(sc.currentPos, SCE_GC_OPERATOR); sc.ChangeState(oldstate); } break; case '\n': case '\r': ++currentline; if (sc.state == SCE_GC_COMMENTLINE) { styler.ColourTo(sc.currentPos, sc.state); sc.ChangeState (SCE_GC_DEFAULT); } else if (sc.state != SCE_GC_COMMENTBLOCK) { colorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline); noforward = 1; // don't move forward - already positioned at next char.. } break; // case ' ': case '\t': // default : } if (!noforward) sc.Forward(); } sc.Complete(); } // Main folding function called by Scintilla - (based on props (.ini) files function) static void FoldGui4Cli(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; unsigned int endPos = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); char chNext = styler[startPos]; int styleNext = styler.StyleAt(startPos); bool headerPoint = false; for (unsigned int i = startPos; i < endPos; i++) { char ch = chNext; chNext = styler[i+1]; int style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); if (style == SCE_GC_EVENT || style == SCE_GC_GLOBAL) { headerPoint = true; // fold at events and globals } if (atEOL) { int lev = SC_FOLDLEVELBASE+1; if (headerPoint) lev = SC_FOLDLEVELBASE; if (visibleChars == 0 && foldCompact) lev |= SC_FOLDLEVELWHITEFLAG; if (headerPoint) lev |= SC_FOLDLEVELHEADERFLAG; if (lev != styler.LevelAt(lineCurrent)) // set level, if not already correct { styler.SetLevel(lineCurrent, lev); } lineCurrent++; // re-initialize our flags visibleChars = 0; headerPoint = false; } if (!(isspacechar(ch))) // || (style == SCE_GC_COMMENTLINE) || (style != SCE_GC_COMMENTBLOCK))) visibleChars++; } int lev = headerPoint ? SC_FOLDLEVELBASE : SC_FOLDLEVELBASE+1; int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; styler.SetLevel(lineCurrent, lev | flagsNext); } // I have no idea what these are for.. probably accessible by some message. static const char * const gui4cliWordListDesc[] = { "Globals", "Events", "Attributes", "Control", "Commands", 0 }; // Declare language & pass our function pointers to Scintilla LexerModule lmGui4Cli(SCLEX_GUI4CLI, ColouriseGui4CliDoc, "gui4cli", FoldGui4Cli, gui4cliWordListDesc); #undef debug tora-2.1.3/src/qscintilla2/src/ContractionState.cpp0000644000175000017500000001334411213435521022045 0ustar michaelmichael// Scintilla source code edit control /** @file ContractionState.cxx ** Manages visibility of lines for folding and wrapping. **/ // Copyright 1998-2007 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include "Platform.h" #include "SplitVector.h" #include "Partitioning.h" #include "RunStyles.h" #include "ContractionState.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif ContractionState::ContractionState() : visible(0), expanded(0), heights(0), displayLines(0), linesInDocument(1) { //InsertLine(0); } ContractionState::~ContractionState() { Clear(); } void ContractionState::EnsureData() { if (OneToOne()) { visible = new RunStyles(); expanded = new RunStyles(); heights = new RunStyles(); displayLines = new Partitioning(4); InsertLines(0, linesInDocument); } } void ContractionState::Clear() { delete visible; visible = 0; delete expanded; expanded = 0; delete heights; heights = 0; delete displayLines; displayLines = 0; linesInDocument = 1; } int ContractionState::LinesInDoc() const { if (OneToOne()) { return linesInDocument; } else { return displayLines->Partitions() - 1; } } int ContractionState::LinesDisplayed() const { if (OneToOne()) { return linesInDocument; } else { return displayLines->PositionFromPartition(LinesInDoc()); } } int ContractionState::DisplayFromDoc(int lineDoc) const { if (OneToOne()) { return lineDoc; } else { if (lineDoc > displayLines->Partitions()) lineDoc = displayLines->Partitions(); return displayLines->PositionFromPartition(lineDoc); } } int ContractionState::DocFromDisplay(int lineDisplay) const { if (OneToOne()) { return lineDisplay; } else { if (lineDisplay <= 0) { return 0; } if (lineDisplay > LinesDisplayed()) { return displayLines->PartitionFromPosition(LinesDisplayed()); } int lineDoc = displayLines->PartitionFromPosition(lineDisplay); PLATFORM_ASSERT(GetVisible(lineDoc)); return lineDoc; } } void ContractionState::InsertLine(int lineDoc) { if (OneToOne()) { linesInDocument++; } else { visible->InsertSpace(lineDoc, 1); visible->SetValueAt(lineDoc, 1); expanded->InsertSpace(lineDoc, 1); expanded->SetValueAt(lineDoc, 1); heights->InsertSpace(lineDoc, 1); heights->SetValueAt(lineDoc, 1); int lineDisplay = DisplayFromDoc(lineDoc); displayLines->InsertPartition(lineDoc, lineDisplay); displayLines->InsertText(lineDoc, 1); } } void ContractionState::InsertLines(int lineDoc, int lineCount) { for (int l = 0; l < lineCount; l++) { InsertLine(lineDoc + l); } Check(); } void ContractionState::DeleteLine(int lineDoc) { if (OneToOne()) { linesInDocument--; } else { if (GetVisible(lineDoc)) { displayLines->InsertText(lineDoc, -heights->ValueAt(lineDoc)); } displayLines->RemovePartition(lineDoc); visible->DeleteRange(lineDoc, 1); expanded->DeleteRange(lineDoc, 1); heights->DeleteRange(lineDoc, 1); } } void ContractionState::DeleteLines(int lineDoc, int lineCount) { for (int l = 0; l < lineCount; l++) { DeleteLine(lineDoc); } Check(); } bool ContractionState::GetVisible(int lineDoc) const { if (OneToOne()) { return true; } else { if (lineDoc >= visible->Length()) return true; return visible->ValueAt(lineDoc) == 1; } } bool ContractionState::SetVisible(int lineDocStart, int lineDocEnd, bool visible_) { if (OneToOne() && visible_) { return false; } else { EnsureData(); int delta = 0; Check(); if ((lineDocStart <= lineDocEnd) && (lineDocStart >= 0) && (lineDocEnd < LinesInDoc())) { for (int line = lineDocStart; line <= lineDocEnd; line++) { if (GetVisible(line) != visible_) { int difference = visible_ ? heights->ValueAt(line) : -heights->ValueAt(line); visible->SetValueAt(line, visible_ ? 1 : 0); displayLines->InsertText(line, difference); delta += difference; } } } else { return false; } Check(); return delta != 0; } } bool ContractionState::GetExpanded(int lineDoc) const { if (OneToOne()) { return true; } else { Check(); return expanded->ValueAt(lineDoc) == 1; } } bool ContractionState::SetExpanded(int lineDoc, bool expanded_) { if (OneToOne() && expanded_) { return false; } else { EnsureData(); if (expanded_ != (expanded->ValueAt(lineDoc) == 1)) { expanded->SetValueAt(lineDoc, expanded_ ? 1 : 0); Check(); return true; } else { Check(); return false; } } } int ContractionState::GetHeight(int lineDoc) const { if (OneToOne()) { return 1; } else { return heights->ValueAt(lineDoc); } } // Set the number of display lines needed for this line. // Return true if this is a change. bool ContractionState::SetHeight(int lineDoc, int height) { if (OneToOne() && (height == 1)) { return false; } else { EnsureData(); if (GetHeight(lineDoc) != height) { if (GetVisible(lineDoc)) { displayLines->InsertText(lineDoc, height - GetHeight(lineDoc)); } heights->SetValueAt(lineDoc, height); Check(); return true; } else { Check(); return false; } } } void ContractionState::ShowAll() { int lines = LinesInDoc(); Clear(); linesInDocument = lines; } // Debugging checks void ContractionState::Check() const { #ifdef CHECK_CORRECTNESS for (int vline = 0;vline < LinesDisplayed(); vline++) { const int lineDoc = DocFromDisplay(vline); PLATFORM_ASSERT(GetVisible(lineDoc)); } for (int lineDoc = 0;lineDoc < LinesInDoc(); lineDoc++) { const int displayThis = DisplayFromDoc(lineDoc); const int displayNext = DisplayFromDoc(lineDoc + 1); const int height = displayNext - displayThis; PLATFORM_ASSERT(height >= 0); if (GetVisible(lineDoc)) { PLATFORM_ASSERT(GetHeight(lineDoc) == height); } else { PLATFORM_ASSERT(0 == height); } } #endif } tora-2.1.3/src/qscintilla2/src/LexSpice.cpp0000644000175000017500000001502711213435521020275 0ustar michaelmichael// Scintilla source code edit control /** @file LexSpice.cxx ** Lexer for Spice **/ // Copyright 2006 by Fabien Proriol // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include "Platform.h" #include "Accessor.h" #include "StyleContext.h" #include "PropSet.h" #include "KeyWords.h" #include "SciLexer.h" #include "SString.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif /* * Interface */ static void ColouriseDocument( unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler); static const char * const spiceWordListDesc[] = { "Keywords", // SPICE command "Keywords2", // SPICE functions "Keywords3", // SPICE params 0 }; LexerModule lmSpice(SCLEX_SPICE, ColouriseDocument, "spice", NULL, spiceWordListDesc); /* * Implementation */ static void ColouriseComment(StyleContext& sc, bool& apostropheStartsAttribute); static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute); static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute); static void ColouriseWhiteSpace(StyleContext& sc, bool& apostropheStartsAttribute); static void ColouriseWord(StyleContext& sc, WordList& keywords, WordList& keywords2, WordList& keywords3, bool& apostropheStartsAttribute); static inline bool IsDelimiterCharacter(int ch); static inline bool IsNumberStartCharacter(int ch); static inline bool IsNumberCharacter(int ch); static inline bool IsSeparatorOrDelimiterCharacter(int ch); static inline bool IsWordStartCharacter(int ch); static inline bool IsWordCharacter(int ch); static void ColouriseComment(StyleContext& sc, bool&) { sc.SetState(SCE_SPICE_COMMENTLINE); while (!sc.atLineEnd) { sc.Forward(); } } static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute) { apostropheStartsAttribute = sc.Match (')'); sc.SetState(SCE_SPICE_DELIMITER); sc.ForwardSetState(SCE_SPICE_DEFAULT); } static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute) { apostropheStartsAttribute = true; SString number; sc.SetState(SCE_SPICE_NUMBER); // Get all characters up to a delimiter or a separator, including points, but excluding // double points (ranges). while (!IsSeparatorOrDelimiterCharacter(sc.ch) || (sc.ch == '.' && sc.chNext != '.')) { number += static_cast(sc.ch); sc.Forward(); } // Special case: exponent with sign if ((sc.chPrev == 'e' || sc.chPrev == 'E') && (sc.ch == '+' || sc.ch == '-')) { number += static_cast(sc.ch); sc.Forward (); while (!IsSeparatorOrDelimiterCharacter(sc.ch)) { number += static_cast(sc.ch); sc.Forward(); } } sc.SetState(SCE_SPICE_DEFAULT); } static void ColouriseWhiteSpace(StyleContext& sc, bool& ) { sc.SetState(SCE_SPICE_DEFAULT); sc.ForwardSetState(SCE_SPICE_DEFAULT); } static void ColouriseWord(StyleContext& sc, WordList& keywords, WordList& keywords2, WordList& keywords3, bool& apostropheStartsAttribute) { apostropheStartsAttribute = true; sc.SetState(SCE_SPICE_IDENTIFIER); SString word; while (!sc.atLineEnd && !IsSeparatorOrDelimiterCharacter(sc.ch)) { word += static_cast(tolower(sc.ch)); sc.Forward(); } if (keywords.InList(word.c_str())) { sc.ChangeState(SCE_SPICE_KEYWORD); if (word != "all") { apostropheStartsAttribute = false; } } else if (keywords2.InList(word.c_str())) { sc.ChangeState(SCE_SPICE_KEYWORD2); if (word != "all") { apostropheStartsAttribute = false; } } else if (keywords3.InList(word.c_str())) { sc.ChangeState(SCE_SPICE_KEYWORD3); if (word != "all") { apostropheStartsAttribute = false; } } sc.SetState(SCE_SPICE_DEFAULT); } // // ColouriseDocument // static void ColouriseDocument( unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &keywords = *keywordlists[0]; WordList &keywords2 = *keywordlists[1]; WordList &keywords3 = *keywordlists[2]; StyleContext sc(startPos, length, initStyle, styler); int lineCurrent = styler.GetLine(startPos); bool apostropheStartsAttribute = (styler.GetLineState(lineCurrent) & 1) != 0; while (sc.More()) { if (sc.atLineEnd) { // Go to the next line sc.Forward(); lineCurrent++; // Remember the line state for future incremental lexing styler.SetLineState(lineCurrent, apostropheStartsAttribute); // Don't continue any styles on the next line sc.SetState(SCE_SPICE_DEFAULT); } // Comments if ((sc.Match('*') && sc.atLineStart) || sc.Match('*','~')) { ColouriseComment(sc, apostropheStartsAttribute); // Whitespace } else if (IsASpace(sc.ch)) { ColouriseWhiteSpace(sc, apostropheStartsAttribute); // Delimiters } else if (IsDelimiterCharacter(sc.ch)) { ColouriseDelimiter(sc, apostropheStartsAttribute); // Numbers } else if (IsADigit(sc.ch) || sc.ch == '#') { ColouriseNumber(sc, apostropheStartsAttribute); // Keywords or identifiers } else { ColouriseWord(sc, keywords, keywords2, keywords3, apostropheStartsAttribute); } } sc.Complete(); } static inline bool IsDelimiterCharacter(int ch) { switch (ch) { case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '/': case ':': case ';': case '<': case '=': case '>': case '|': return true; default: return false; } } static inline bool IsNumberCharacter(int ch) { return IsNumberStartCharacter(ch) || ch == '_' || ch == '.' || ch == '#' || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F'); } static inline bool IsNumberStartCharacter(int ch) { return IsADigit(ch); } static inline bool IsSeparatorOrDelimiterCharacter(int ch) { return IsASpace(ch) || IsDelimiterCharacter(ch); } static inline bool IsWordCharacter(int ch) { return IsWordStartCharacter(ch) || IsADigit(ch); } static inline bool IsWordStartCharacter(int ch) { return (isascii(ch) && isalpha(ch)) || ch == '_'; } tora-2.1.3/src/qscintilla2/src/LineMarker.cpp0000644000175000017500000002540111213435521020607 0ustar michaelmichael// Scintilla source code edit control /** @file LineMarker.cxx ** Defines the look of a line marker in the margin . **/ // Copyright 1998-2003 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include "Platform.h" #include "Scintilla.h" #include "XPM.h" #include "LineMarker.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif void LineMarker::RefreshColourPalette(Palette &pal, bool want) { pal.WantFind(fore, want); pal.WantFind(back, want); if (pxpm) { pxpm->RefreshColourPalette(pal, want); } } void LineMarker::SetXPM(const char *textForm) { delete pxpm; pxpm = new XPM(textForm); markType = SC_MARK_PIXMAP; } void LineMarker::SetXPM(const char * const *linesForm) { delete pxpm; pxpm = new XPM(linesForm); markType = SC_MARK_PIXMAP; } static void DrawBox(Surface *surface, int centreX, int centreY, int armSize, ColourAllocated fore, ColourAllocated back) { PRectangle rc; rc.left = centreX - armSize; rc.top = centreY - armSize; rc.right = centreX + armSize + 1; rc.bottom = centreY + armSize + 1; surface->RectangleDraw(rc, back, fore); } static void DrawCircle(Surface *surface, int centreX, int centreY, int armSize, ColourAllocated fore, ColourAllocated back) { PRectangle rcCircle; rcCircle.left = centreX - armSize; rcCircle.top = centreY - armSize; rcCircle.right = centreX + armSize + 1; rcCircle.bottom = centreY + armSize + 1; surface->Ellipse(rcCircle, back, fore); } static void DrawPlus(Surface *surface, int centreX, int centreY, int armSize, ColourAllocated fore) { PRectangle rcV(centreX, centreY - armSize + 2, centreX + 1, centreY + armSize - 2 + 1); surface->FillRectangle(rcV, fore); PRectangle rcH(centreX - armSize + 2, centreY, centreX + armSize - 2 + 1, centreY+1); surface->FillRectangle(rcH, fore); } static void DrawMinus(Surface *surface, int centreX, int centreY, int armSize, ColourAllocated fore) { PRectangle rcH(centreX - armSize + 2, centreY, centreX + armSize - 2 + 1, centreY+1); surface->FillRectangle(rcH, fore); } void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharacter) { if ((markType == SC_MARK_PIXMAP) && (pxpm)) { pxpm->Draw(surface, rcWhole); return; } // Restrict most shapes a bit PRectangle rc = rcWhole; rc.top++; rc.bottom--; int minDim = Platform::Minimum(rc.Width(), rc.Height()); minDim--; // Ensure does not go beyond edge int centreX = (rc.right + rc.left) / 2; int centreY = (rc.bottom + rc.top) / 2; int dimOn2 = minDim / 2; int dimOn4 = minDim / 4; int blobSize = dimOn2-1; int armSize = dimOn2-2; if (rc.Width() > (rc.Height() * 2)) { // Wide column is line number so move to left to try to avoid overlapping number centreX = rc.left + dimOn2 + 1; } if (markType == SC_MARK_ROUNDRECT) { PRectangle rcRounded = rc; rcRounded.left = rc.left + 1; rcRounded.right = rc.right - 1; surface->RoundedRectangle(rcRounded, fore.allocated, back.allocated); } else if (markType == SC_MARK_CIRCLE) { PRectangle rcCircle; rcCircle.left = centreX - dimOn2; rcCircle.top = centreY - dimOn2; rcCircle.right = centreX + dimOn2; rcCircle.bottom = centreY + dimOn2; surface->Ellipse(rcCircle, fore.allocated, back.allocated); } else if (markType == SC_MARK_ARROW) { Point pts[] = { Point(centreX - dimOn4, centreY - dimOn2), Point(centreX - dimOn4, centreY + dimOn2), Point(centreX + dimOn2 - dimOn4, centreY), }; surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]), fore.allocated, back.allocated); } else if (markType == SC_MARK_ARROWDOWN) { Point pts[] = { Point(centreX - dimOn2, centreY - dimOn4), Point(centreX + dimOn2, centreY - dimOn4), Point(centreX, centreY + dimOn2 - dimOn4), }; surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]), fore.allocated, back.allocated); } else if (markType == SC_MARK_PLUS) { Point pts[] = { Point(centreX - armSize, centreY - 1), Point(centreX - 1, centreY - 1), Point(centreX - 1, centreY - armSize), Point(centreX + 1, centreY - armSize), Point(centreX + 1, centreY - 1), Point(centreX + armSize, centreY -1), Point(centreX + armSize, centreY +1), Point(centreX + 1, centreY + 1), Point(centreX + 1, centreY + armSize), Point(centreX - 1, centreY + armSize), Point(centreX - 1, centreY + 1), Point(centreX - armSize, centreY + 1), }; surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]), fore.allocated, back.allocated); } else if (markType == SC_MARK_MINUS) { Point pts[] = { Point(centreX - armSize, centreY - 1), Point(centreX + armSize, centreY -1), Point(centreX + armSize, centreY +1), Point(centreX - armSize, centreY + 1), }; surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]), fore.allocated, back.allocated); } else if (markType == SC_MARK_SMALLRECT) { PRectangle rcSmall; rcSmall.left = rc.left + 1; rcSmall.top = rc.top + 2; rcSmall.right = rc.right - 1; rcSmall.bottom = rc.bottom - 2; surface->RectangleDraw(rcSmall, fore.allocated, back.allocated); } else if (markType == SC_MARK_EMPTY || markType == SC_MARK_BACKGROUND) { // An invisible marker so don't draw anything } else if (markType == SC_MARK_VLINE) { surface->PenColour(back.allocated); surface->MoveTo(centreX, rcWhole.top); surface->LineTo(centreX, rcWhole.bottom); } else if (markType == SC_MARK_LCORNER) { surface->PenColour(back.allocated); surface->MoveTo(centreX, rcWhole.top); surface->LineTo(centreX, rc.top + dimOn2); surface->LineTo(rc.right - 2, rc.top + dimOn2); } else if (markType == SC_MARK_TCORNER) { surface->PenColour(back.allocated); surface->MoveTo(centreX, rcWhole.top); surface->LineTo(centreX, rcWhole.bottom); surface->MoveTo(centreX, rc.top + dimOn2); surface->LineTo(rc.right - 2, rc.top + dimOn2); } else if (markType == SC_MARK_LCORNERCURVE) { surface->PenColour(back.allocated); surface->MoveTo(centreX, rcWhole.top); surface->LineTo(centreX, rc.top + dimOn2-3); surface->LineTo(centreX+3, rc.top + dimOn2); surface->LineTo(rc.right - 1, rc.top + dimOn2); } else if (markType == SC_MARK_TCORNERCURVE) { surface->PenColour(back.allocated); surface->MoveTo(centreX, rcWhole.top); surface->LineTo(centreX, rcWhole.bottom); surface->MoveTo(centreX, rc.top + dimOn2-3); surface->LineTo(centreX+3, rc.top + dimOn2); surface->LineTo(rc.right - 1, rc.top + dimOn2); } else if (markType == SC_MARK_BOXPLUS) { surface->PenColour(back.allocated); DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated); DrawPlus(surface, centreX, centreY, blobSize, back.allocated); } else if (markType == SC_MARK_BOXPLUSCONNECTED) { surface->PenColour(back.allocated); DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated); DrawPlus(surface, centreX, centreY, blobSize, back.allocated); surface->MoveTo(centreX, centreY + blobSize); surface->LineTo(centreX, rcWhole.bottom); surface->MoveTo(centreX, rcWhole.top); surface->LineTo(centreX, centreY - blobSize); } else if (markType == SC_MARK_BOXMINUS) { surface->PenColour(back.allocated); DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated); DrawMinus(surface, centreX, centreY, blobSize, back.allocated); surface->MoveTo(centreX, centreY + blobSize); surface->LineTo(centreX, rcWhole.bottom); } else if (markType == SC_MARK_BOXMINUSCONNECTED) { surface->PenColour(back.allocated); DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated); DrawMinus(surface, centreX, centreY, blobSize, back.allocated); surface->MoveTo(centreX, centreY + blobSize); surface->LineTo(centreX, rcWhole.bottom); surface->MoveTo(centreX, rcWhole.top); surface->LineTo(centreX, centreY - blobSize); } else if (markType == SC_MARK_CIRCLEPLUS) { DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated); surface->PenColour(back.allocated); DrawPlus(surface, centreX, centreY, blobSize, back.allocated); } else if (markType == SC_MARK_CIRCLEPLUSCONNECTED) { DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated); surface->PenColour(back.allocated); DrawPlus(surface, centreX, centreY, blobSize, back.allocated); surface->MoveTo(centreX, centreY + blobSize); surface->LineTo(centreX, rcWhole.bottom); surface->MoveTo(centreX, rcWhole.top); surface->LineTo(centreX, centreY - blobSize); } else if (markType == SC_MARK_CIRCLEMINUS) { DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated); surface->PenColour(back.allocated); DrawMinus(surface, centreX, centreY, blobSize, back.allocated); surface->MoveTo(centreX, centreY + blobSize); surface->LineTo(centreX, rcWhole.bottom); } else if (markType == SC_MARK_CIRCLEMINUSCONNECTED) { DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated); surface->PenColour(back.allocated); DrawMinus(surface, centreX, centreY, blobSize, back.allocated); surface->MoveTo(centreX, centreY + blobSize); surface->LineTo(centreX, rcWhole.bottom); surface->MoveTo(centreX, rcWhole.top); surface->LineTo(centreX, centreY - blobSize); } else if (markType >= SC_MARK_CHARACTER) { char character[1]; character[0] = static_cast(markType - SC_MARK_CHARACTER); int width = surface->WidthText(fontForCharacter, character, 1); rc.left += (rc.Width() - width) / 2; rc.right = rc.left + width; surface->DrawTextClipped(rc, fontForCharacter, rc.bottom - 2, character, 1, fore.allocated, back.allocated); } else if (markType == SC_MARK_DOTDOTDOT) { int right = centreX - 6; for (int b=0; b<3; b++) { PRectangle rcBlob(right, rc.bottom - 4, right + 2, rc.bottom-2); surface->FillRectangle(rcBlob, fore.allocated); right += 5; } } else if (markType == SC_MARK_ARROWS) { surface->PenColour(fore.allocated); int right = centreX - 2; for (int b=0; b<3; b++) { surface->MoveTo(right - 4, centreY - 4); surface->LineTo(right, centreY); surface->LineTo(right - 5, centreY + 5); right += 4; } } else if (markType == SC_MARK_SHORTARROW) { Point pts[] = { Point(centreX, centreY + dimOn2), Point(centreX + dimOn2, centreY), Point(centreX, centreY - dimOn2), Point(centreX, centreY - dimOn4), Point(centreX - dimOn4, centreY - dimOn4), Point(centreX - dimOn4, centreY + dimOn4), Point(centreX, centreY + dimOn4), Point(centreX, centreY + dimOn2), }; surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]), fore.allocated, back.allocated); } else if (markType == SC_MARK_LEFTRECT) { PRectangle rcLeft = rcWhole; rcLeft.right = rcLeft.left + 4; surface->FillRectangle(rcLeft, back.allocated); } else { // SC_MARK_FULLRECT surface->FillRectangle(rcWhole, back.allocated); } } tora-2.1.3/src/qscintilla2/src/LexAsn1.cpp0000644000175000017500000001215411213435521020032 0ustar michaelmichael// Scintilla source code edit control /** @file LexAsn1.cxx ** Lexer for ASN.1 **/ // Copyright 2004 by Herr Pfarrer rpfarrer yahoo de // Last Updated: 20/07/2004 // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "StyleContext.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif // Some char test functions static bool isAsn1Number(int ch) { return (ch >= '0' && ch <= '9'); } static bool isAsn1Letter(int ch) { return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'); } static bool isAsn1Char(int ch) { return (ch == '-' ) || isAsn1Number(ch) || isAsn1Letter (ch); } // // Function determining the color of a given code portion // Based on a "state" // static void ColouriseAsn1Doc(unsigned int startPos, int length, int initStyle, WordList *keywordLists[], Accessor &styler) { // The keywords WordList &Keywords = *keywordLists[0]; WordList &Attributes = *keywordLists[1]; WordList &Descriptors = *keywordLists[2]; WordList &Types = *keywordLists[3]; // Parse the whole buffer character by character using StyleContext StyleContext sc(startPos, length, initStyle, styler); for (; sc.More(); sc.Forward()) { // The state engine switch (sc.state) { case SCE_ASN1_DEFAULT: // Plain characters asn1_default: if (sc.ch == '-' && sc.chNext == '-') // A comment begins here sc.SetState(SCE_ASN1_COMMENT); else if (sc.ch == '"') // A string begins here sc.SetState(SCE_ASN1_STRING); else if (isAsn1Number (sc.ch)) // A number starts here (identifier should start with a letter in ASN.1) sc.SetState(SCE_ASN1_SCALAR); else if (isAsn1Char (sc.ch)) // An identifier starts here (identifier always start with a letter) sc.SetState(SCE_ASN1_IDENTIFIER); else if (sc.ch == ':') // A ::= operator starts here sc.SetState(SCE_ASN1_OPERATOR); break; case SCE_ASN1_COMMENT: // A comment if (sc.ch == '\r' || sc.ch == '\n') // A comment ends here sc.SetState(SCE_ASN1_DEFAULT); break; case SCE_ASN1_IDENTIFIER: // An identifier (keyword, attribute, descriptor or type) if (!isAsn1Char (sc.ch)) { // The end of identifier is here: we can look for it in lists by now and change its state char s[100]; sc.GetCurrent(s, sizeof(s)); if (Keywords.InList(s)) // It's a keyword, change its state sc.ChangeState(SCE_ASN1_KEYWORD); else if (Attributes.InList(s)) // It's an attribute, change its state sc.ChangeState(SCE_ASN1_ATTRIBUTE); else if (Descriptors.InList(s)) // It's a descriptor, change its state sc.ChangeState(SCE_ASN1_DESCRIPTOR); else if (Types.InList(s)) // It's a type, change its state sc.ChangeState(SCE_ASN1_TYPE); // Set to default now sc.SetState(SCE_ASN1_DEFAULT); } break; case SCE_ASN1_STRING: // A string delimited by "" if (sc.ch == '"') { // A string ends here sc.ForwardSetState(SCE_ASN1_DEFAULT); // To correctly manage a char sticking to the string quote goto asn1_default; } break; case SCE_ASN1_SCALAR: // A plain number if (!isAsn1Number (sc.ch)) // A number ends here sc.SetState(SCE_ASN1_DEFAULT); break; case SCE_ASN1_OPERATOR: // The affectation operator ::= and wath follows (eg: ::= { org 6 } OID or ::= 12 trap) if (sc.ch == '{') { // An OID definition starts here: enter the sub loop for (; sc.More(); sc.Forward()) { if (isAsn1Number (sc.ch) && (!isAsn1Char (sc.chPrev) || isAsn1Number (sc.chPrev))) // The OID number is highlighted sc.SetState(SCE_ASN1_OID); else if (isAsn1Char (sc.ch)) // The OID parent identifier is plain sc.SetState(SCE_ASN1_IDENTIFIER); else sc.SetState(SCE_ASN1_DEFAULT); if (sc.ch == '}') // Here ends the OID and the operator sub loop: go back to main loop break; } } else if (isAsn1Number (sc.ch)) { // A trap number definition starts here: enter the sub loop for (; sc.More(); sc.Forward()) { if (isAsn1Number (sc.ch)) // The trap number is highlighted sc.SetState(SCE_ASN1_OID); else { // The number ends here: go back to main loop sc.SetState(SCE_ASN1_DEFAULT); break; } } } else if (sc.ch != ':' && sc.ch != '=' && sc.ch != ' ') // The operator doesn't imply an OID definition nor a trap, back to main loop goto asn1_default; // To be sure to handle actually the state change break; } } sc.Complete(); } static void FoldAsn1Doc(unsigned int, int, int, WordList *[], Accessor &styler) { // No folding enabled, no reason to continue... if( styler.GetPropertyInt("fold") == 0 ) return; // No folding implemented: doesn't make sense for ASN.1 } static const char * const asn1WordLists[] = { "Keywords", "Attributes", "Descriptors", "Types", 0, }; LexerModule lmAns1(SCLEX_ASN1, ColouriseAsn1Doc, "asn1", FoldAsn1Doc, asn1WordLists); tora-2.1.3/src/qscintilla2/src/ViewStyle.cpp0000644000175000017500000002554311213435521020520 0ustar michaelmichael// Scintilla source code edit control /** @file ViewStyle.cxx ** Store information on how the document is to be viewed. **/ // Copyright 1998-2003 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include "Platform.h" #include "Scintilla.h" #include "SplitVector.h" #include "Partitioning.h" #include "RunStyles.h" #include "Indicator.h" #include "XPM.h" #include "LineMarker.h" #include "Style.h" #include "ViewStyle.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif MarginStyle::MarginStyle() : style(SC_MARGIN_SYMBOL), width(0), mask(0), sensitive(false) { } // A list of the fontnames - avoids wasting space in each style FontNames::FontNames() { size = 8; names = new char *[size]; max = 0; } FontNames::~FontNames() { Clear(); delete []names; names = 0; } void FontNames::Clear() { for (int i=0;i= size) { // Grow array int sizeNew = size * 2; char **namesNew = new char *[sizeNew]; for (int j=0;j 0) maskInLine &= ~ms[margin].mask; } zoomLevel = 0; viewWhitespace = wsInvisible; viewIndentationGuides = ivNone; viewEOL = false; showMarkedLines = true; extraFontFlag = false; extraAscent = 0; extraDescent = 0; marginStyleOffset = 0; annotationVisible = ANNOTATION_HIDDEN; annotationStyleOffset = 0; } void ViewStyle::RefreshColourPalette(Palette &pal, bool want) { unsigned int i; for (i=0;i 0) maskInLine &= ~ms[margin].mask; } } void ViewStyle::AllocStyles(size_t sizeNew) { Style *stylesNew = new Style[sizeNew]; size_t i=0; for (; i STYLE_DEFAULT) { for (; i= stylesSize) { size_t sizeNew = stylesSize * 2; while (sizeNew <= index) sizeNew *= 2; AllocStyles(sizeNew); } } void ViewStyle::ResetDefaultStyle() { styles[STYLE_DEFAULT].Clear(ColourDesired(0,0,0), ColourDesired(0xff,0xff,0xff), Platform::DefaultFontSize(), fontNames.Save(Platform::DefaultFont()), SC_CHARSET_DEFAULT, false, false, false, false, Style::caseMixed, true, true, false); } void ViewStyle::ClearStyles() { // Reset all styles to be like the default style for (unsigned int i=0; i // The License.txt file describes the conditions under which this software may be distributed. #ifndef SPLITVECTOR_H #define SPLITVECTOR_H template class SplitVector { protected: T *body; int size; int lengthBody; int part1Length; int gapLength; /// invariant: gapLength == size - lengthBody int growSize; /// Move the gap to a particular position so that insertion and /// deletion at that point will not require much copying and /// hence be fast. void GapTo(int position) { if (position != part1Length) { if (position < part1Length) { memmove( body + position + gapLength, body + position, sizeof(T) * (part1Length - position)); } else { // position > part1Length memmove( body + part1Length, body + part1Length + gapLength, sizeof(T) * (position - part1Length)); } part1Length = position; } } /// Check that there is room in the buffer for an insertion, /// reallocating if more space needed. void RoomFor(int insertionLength) { if (gapLength <= insertionLength) { while (growSize < size / 6) growSize *= 2; ReAllocate(size + insertionLength + growSize); } } void Init() { body = NULL; growSize = 8; size = 0; lengthBody = 0; part1Length = 0; gapLength = 0; } public: /// Construct a split buffer. SplitVector() { Init(); } ~SplitVector() { delete []body; body = 0; } int GetGrowSize() const { return growSize; } void SetGrowSize(int growSize_) { growSize = growSize_; } /// Reallocate the storage for the buffer to be newSize and /// copy exisiting contents to the new buffer. /// Must not be used to decrease the size of the buffer. void ReAllocate(int newSize) { if (newSize > size) { // Move the gap to the end GapTo(lengthBody); T *newBody = new T[newSize]; if ((size != 0) && (body != 0)) { memmove(newBody, body, sizeof(T) * lengthBody); delete []body; } body = newBody; gapLength += newSize - size; size = newSize; } } /// Retrieve the character at a particular position. /// Retrieving positions outside the range of the buffer returns 0. /// The assertions here are disabled since calling code can be /// simpler if out of range access works and returns 0. T ValueAt(int position) const { if (position < part1Length) { //PLATFORM_ASSERT(position >= 0); if (position < 0) { return 0; } else { return body[position]; } } else { //PLATFORM_ASSERT(position < lengthBody); if (position >= lengthBody) { return 0; } else { return body[gapLength + position]; } } } void SetValueAt(int position, T v) { if (position < part1Length) { PLATFORM_ASSERT(position >= 0); if (position < 0) { ; } else { body[position] = v; } } else { PLATFORM_ASSERT(position < lengthBody); if (position >= lengthBody) { ; } else { body[gapLength + position] = v; } } } T& operator[](int position) const { PLATFORM_ASSERT(position >= 0 && position < lengthBody); if (position < part1Length) { return body[position]; } else { return body[gapLength + position]; } } /// Retrieve the length of the buffer. int Length() const { return lengthBody; } /// Insert a single value into the buffer. /// Inserting at positions outside the current range fails. void Insert(int position, T v) { PLATFORM_ASSERT((position >= 0) && (position <= lengthBody)); if ((position < 0) || (position > lengthBody)) { return; } RoomFor(1); GapTo(position); body[part1Length] = v; lengthBody++; part1Length++; gapLength--; } /// Insert a number of elements into the buffer setting their value. /// Inserting at positions outside the current range fails. void InsertValue(int position, int insertLength, T v) { PLATFORM_ASSERT((position >= 0) && (position <= lengthBody)); if (insertLength > 0) { if ((position < 0) || (position > lengthBody)) { return; } RoomFor(insertLength); GapTo(position); for (int i = 0; i < insertLength; i++) body[part1Length + i] = v; lengthBody += insertLength; part1Length += insertLength; gapLength -= insertLength; } } /// Ensure at least length elements allocated, /// appending zero valued elements if needed. void EnsureLength(int wantedLength) { if (Length() < wantedLength) { InsertValue(Length(), wantedLength - Length(), 0); } } /// Insert text into the buffer from an array. void InsertFromArray(int positionToInsert, const T s[], int positionFrom, int insertLength) { PLATFORM_ASSERT((positionToInsert >= 0) && (positionToInsert <= lengthBody)); if (insertLength > 0) { if ((positionToInsert < 0) || (positionToInsert > lengthBody)) { return; } RoomFor(insertLength); GapTo(positionToInsert); memmove(body + part1Length, s + positionFrom, sizeof(T) * insertLength); lengthBody += insertLength; part1Length += insertLength; gapLength -= insertLength; } } /// Delete one element from the buffer. void Delete(int position) { PLATFORM_ASSERT((position >= 0) && (position < lengthBody)); if ((position < 0) || (position >= lengthBody)) { return; } DeleteRange(position, 1); } /// Delete a range from the buffer. /// Deleting positions outside the current range fails. void DeleteRange(int position, int deleteLength) { PLATFORM_ASSERT((position >= 0) && (position + deleteLength <= lengthBody)); if ((position < 0) || ((position + deleteLength) > lengthBody)) { return; } if ((position == 0) && (deleteLength == lengthBody)) { // Full deallocation returns storage and is faster delete []body; Init(); } else if (deleteLength > 0) { GapTo(position); lengthBody -= deleteLength; gapLength += deleteLength; } } /// Delete all the buffer contents. void DeleteAll() { DeleteRange(0, lengthBody); } T* BufferPointer() { RoomFor(1); GapTo(lengthBody); body[lengthBody] = 0; return body; } }; #endif tora-2.1.3/src/qscintilla2/src/Indicator.cpp0000644000175000017500000000437711213435521020503 0ustar michaelmichael// Scintilla source code edit control /** @file Indicator.cxx ** Defines the style of indicators which are text decorations such as underlining. **/ // Copyright 1998-2001 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include "Platform.h" #include "Scintilla.h" #include "Indicator.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine) { surface->PenColour(fore.allocated); int ymid = (rc.bottom + rc.top) / 2; if (style == INDIC_SQUIGGLE) { surface->MoveTo(rc.left, rc.top); int x = rc.left + 2; int y = 2; while (x < rc.right) { surface->LineTo(x, rc.top + y); x += 2; y = 2 - y; } surface->LineTo(rc.right, rc.top + y); // Finish the line } else if (style == INDIC_TT) { surface->MoveTo(rc.left, ymid); int x = rc.left + 5; while (x < rc.right) { surface->LineTo(x, ymid); surface->MoveTo(x-3, ymid); surface->LineTo(x-3, ymid+2); x++; surface->MoveTo(x, ymid); x += 5; } surface->LineTo(rc.right, ymid); // Finish the line if (x - 3 <= rc.right) { surface->MoveTo(x-3, ymid); surface->LineTo(x-3, ymid+2); } } else if (style == INDIC_DIAGONAL) { int x = rc.left; while (x < rc.right) { surface->MoveTo(x, rc.top+2); int endX = x+3; int endY = rc.top - 1; if (endX > rc.right) { endY += endX - rc.right; endX = rc.right; } surface->LineTo(endX, endY); x += 4; } } else if (style == INDIC_STRIKE) { surface->MoveTo(rc.left, rc.top - 4); surface->LineTo(rc.right, rc.top - 4); } else if (style == INDIC_HIDDEN) { // Draw nothing } else if (style == INDIC_BOX) { surface->MoveTo(rc.left, ymid+1); surface->LineTo(rc.right, ymid+1); surface->LineTo(rc.right, rcLine.top+1); surface->LineTo(rc.left, rcLine.top+1); surface->LineTo(rc.left, ymid+1); } else if (style == INDIC_ROUNDBOX) { PRectangle rcBox = rcLine; rcBox.top = rcLine.top + 1; rcBox.left = rc.left; rcBox.right = rc.right; surface->AlphaRectangle(rcBox, 1, fore.allocated, fillAlpha, fore.allocated, 50, 0); } else { // Either INDIC_PLAIN or unknown surface->MoveTo(rc.left, ymid); surface->LineTo(rc.right, ymid); } } tora-2.1.3/src/qscintilla2/src/LineMarker.h0000644000175000017500000000271511213435521020257 0ustar michaelmichael// Scintilla source code edit control /** @file LineMarker.h ** Defines the look of a line marker in the margin . **/ // Copyright 1998-2003 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #ifndef LINEMARKER_H #define LINEMARKER_H #ifdef SCI_NAMESPACE namespace Scintilla { #endif /** */ class LineMarker { public: int markType; ColourPair fore; ColourPair back; int alpha; XPM *pxpm; LineMarker() { markType = SC_MARK_CIRCLE; fore = ColourDesired(0,0,0); back = ColourDesired(0xff,0xff,0xff); alpha = SC_ALPHA_NOALPHA; pxpm = NULL; } LineMarker(const LineMarker &) { // Defined to avoid pxpm being blindly copied, not as real copy constructor markType = SC_MARK_CIRCLE; fore = ColourDesired(0,0,0); back = ColourDesired(0xff,0xff,0xff); alpha = SC_ALPHA_NOALPHA; pxpm = NULL; } ~LineMarker() { delete pxpm; } LineMarker &operator=(const LineMarker &) { // Defined to avoid pxpm being blindly copied, not as real assignment operator markType = SC_MARK_CIRCLE; fore = ColourDesired(0,0,0); back = ColourDesired(0xff,0xff,0xff); alpha = SC_ALPHA_NOALPHA; delete pxpm; pxpm = NULL; return *this; } void RefreshColourPalette(Palette &pal, bool want); void SetXPM(const char *textForm); void SetXPM(const char * const *linesForm); void Draw(Surface *surface, PRectangle &rc, Font &fontForCharacter); }; #ifdef SCI_NAMESPACE } #endif #endif tora-2.1.3/src/qscintilla2/src/LexGen.py0000644000175000017500000002533411213435521017613 0ustar michaelmichael# LexGen.py - implemented 2002 by Neil Hodgson neilh@scintilla.org # Released to the public domain. # Regenerate the Scintilla and SciTE source files that list # all the lexers and all the properties files. # Should be run whenever a new lexer is added or removed. # Requires Python 2.4 or later # Most files are regenerated in place with templates stored in comments. # The VS .NET project file is generated into a different file as the # VS .NET environment will not retain comments when modifying the file. # The files are copied to a string apart from sections between a # ++Autogenerated comment and a --Autogenerated comment which is # generated by the CopyWithInsertion function. After the whole # string is instantiated, it is compared with the target file and # if different the file is rewritten. # Does not regenerate the Visual C++ 6 project files but does the VS .NET # project file. import string import sys import os import glob # EOL constants CR = "\r" LF = "\n" CRLF = "\r\n" if sys.platform == "win32": NATIVE = CRLF else: # Yes, LF is the native EOL even on Mac OS X. CR is just for # Mac OS <=9 (a.k.a. "Mac Classic") NATIVE = LF # Automatically generated sections contain start and end comments, # a definition line and the results. # The results are replaced by regenerating based on the definition line. # The definition line is a comment prefix followed by "**". # If there is a digit after the ** then this indicates which list to use # and the digit and next character are not part of the definition # Backslash is used as an escape within the definition line. # The part between \( and \) is repeated for each item in the list. # \* is replaced by each list item. \t, and \n are tab and newline. def CopyWithInsertion(input, commentPrefix, retainDefs, eolType, *lists): copying = 1 listid = 0 output = [] for line in input.splitlines(0): isStartGenerated = line.startswith(commentPrefix + "++Autogenerated") if copying and not isStartGenerated: output.append(line) if isStartGenerated: if retainDefs: output.append(line) copying = 0 definition = "" elif not copying and line.startswith(commentPrefix + "**"): if retainDefs: output.append(line) definition = line[len(commentPrefix + "**"):] if (commentPrefix == "" in definition): definition = definition.replace(" -->", "") listid = 0 if definition[0] in string.digits: listid = int(definition[:1]) definition = definition[2:] # Hide double slashes as a control character definition = definition.replace("\\\\", "\001") # Do some normal C style transforms definition = definition.replace("\\n", "\n") definition = definition.replace("\\t", "\t") # Get the doubled backslashes back as single backslashes definition = definition.replace("\001", "\\") startRepeat = definition.find("\\(") endRepeat = definition.find("\\)") intro = definition[:startRepeat] out = "" if intro.endswith("\n"): pos = 0 else: pos = len(intro) out += intro middle = definition[startRepeat+2:endRepeat] for i in lists[listid]: item = middle.replace("\\*", i) if pos and (pos + len(item) >= 80): out += "\\\n" pos = 0 out += item pos += len(item) if item.endswith("\n"): pos = 0 outro = definition[endRepeat+2:] out += outro out = out.replace("\n", eolType) # correct EOLs in generated content output.append(out) elif line.startswith(commentPrefix + "--Autogenerated"): copying = 1 if retainDefs: output.append(line) output = [line.rstrip(" \t") for line in output] # trim trailing whitespace return eolType.join(output) + eolType def UpdateFile(filename, updated): """ If the file is different to updated then copy updated into the file else leave alone so CVS and make don't treat it as modified. """ try: infile = open(filename, "rb") except IOError: # File is not there yet out = open(filename, "wb") out.write(updated.encode('utf-8')) out.close() print("New %s" % filename) return original = infile.read() infile.close() original = original.decode('utf-8') if updated != original: os.unlink(filename) out = open(filename, "wb") out.write(updated.encode('utf-8')) out.close() print("Changed %s " % filename) #~ else: #~ print "Unchanged", filename def Generate(inpath, outpath, commentPrefix, eolType, *lists): """Generate 'outpath' from 'inpath'. "eolType" indicates the type of EOLs to use in the generated file. It should be one of following constants: LF, CRLF, CR, or NATIVE. """ #print "generate '%s' -> '%s' (comment prefix: %r, eols: %r)"\ # % (inpath, outpath, commentPrefix, eolType) try: infile = open(inpath, "rb") except IOError: print("Can not open %s" % inpath) return original = infile.read() infile.close() original = original.decode('utf-8') updated = CopyWithInsertion(original, commentPrefix, inpath == outpath, eolType, *lists) UpdateFile(outpath, updated) def Regenerate(filename, commentPrefix, eolType, *lists): """Regenerate the given file. "eolType" indicates the type of EOLs to use in the generated file. It should be one of following constants: LF, CRLF, CR, or NATIVE. """ Generate(filename, filename, commentPrefix, eolType, *lists) def FindModules(lexFile): modules = [] f = open(lexFile) for l in f.readlines(): if l.startswith("LexerModule"): l = l.replace("(", " ") modules.append(l.split()[1]) return modules knownIrregularProperties = [ "fold", "styling.within.preprocessor", "tab.timmy.whinge.level", "asp.default.language", "html.tags.case.sensitive", "ps.level", "ps.tokenize", "sql.backslash.escapes", "nsis.uservars", "nsis.ignorecase" ] def FindProperties(lexFile): properties = {} f = open(lexFile) for l in f.readlines(): if "GetProperty" in l: l = l.strip() if not l.startswith("//"): # Drop comments propertyName = l.split("\"")[1] if propertyName.lower() == propertyName: # Only allow lower case property names if propertyName in knownIrregularProperties or \ propertyName.startswith("fold.") or \ propertyName.startswith("lexer."): properties[propertyName] = 1 return properties def FindPropertyDocumentation(lexFile): documents = {} f = open(lexFile) name = "" for l in f.readlines(): l = l.strip() if "// property " in l: propertyName = l.split()[2] if propertyName.lower() == propertyName: # Only allow lower case property names name = propertyName documents[name] = "" elif name: if l.startswith("//"): if documents[name]: documents[name] += " " documents[name] += l[2:].strip() else: name = "" return documents def ciCompare(a,b): return cmp(a.lower(), b.lower()) def ciKey(a): return a.lower() def sortListInsensitive(l): try: # Try key function l.sort(key=ciKey) except TypeError: # Earlier version of Python, so use comparison function l.sort(ciCompare) def RegenerateAll(): root="../../" # Find all the lexer source code files lexFilePaths = glob.glob(root + "scintilla/src/Lex*.cxx") lexFiles = [os.path.basename(f)[:-4] for f in lexFilePaths] print(lexFiles) lexerModules = [] lexerProperties = {} propertyDocuments = {} for lexFile in lexFilePaths: lexerModules.extend(FindModules(lexFile)) for k in FindProperties(lexFile).keys(): lexerProperties[k] = 1 documents = FindPropertyDocumentation(lexFile) for k in documents.keys(): propertyDocuments[k] = documents[k] sortListInsensitive(lexerModules) del lexerProperties["fold.comment.python"] lexerProperties = list(lexerProperties.keys()) sortListInsensitive(lexerProperties) # Generate HTML to document each property # This is done because tags can not be safely put inside comments in HTML documentProperties = list(propertyDocuments.keys()) sortListInsensitive(documentProperties) propertiesHTML = [] for k in documentProperties: propertiesHTML.append("\t\n\t%s\n\t%s\n\t" % (k, propertyDocuments[k])) # Find all the SciTE properties files otherProps = ["abbrev.properties", "Embedded.properties", "SciTEGlobal.properties", "SciTE.properties"] if os.path.exists(root + "scite"): propFilePaths = glob.glob(root + "scite/src/*.properties") propFiles = [os.path.basename(f) for f in propFilePaths if os.path.basename(f) not in otherProps] sortListInsensitive(propFiles) print(propFiles) Regenerate(root + "scintilla/src/KeyWords.cxx", "//", NATIVE, lexerModules) Regenerate(root + "scintilla/win32/makefile", "#", NATIVE, lexFiles) Regenerate(root + "scintilla/win32/scintilla.mak", "#", NATIVE, lexFiles) Regenerate(root + "scintilla/win32/scintilla_vc6.mak", "#", NATIVE, lexFiles) # Use Unix EOLs for gtk Makefiles so they work for Linux users when # extracted from the Scintilla source ZIP (typically created on # Windows). Regenerate(root + "scintilla/gtk/makefile", "#", LF, lexFiles) Regenerate(root + "scintilla/gtk/scintilla.mak", "#", NATIVE, lexFiles) Regenerate(root + "scintilla/macosx/makefile", "#", LF, lexFiles) if os.path.exists(root + "scite"): Regenerate(root + "scite/win32/makefile", "#", NATIVE, lexFiles, propFiles) Regenerate(root + "scite/win32/scite.mak", "#", NATIVE, lexFiles, propFiles) Regenerate(root + "scite/src/SciTEProps.cxx", "//", NATIVE, lexerProperties) Regenerate(root + "scite/doc/SciTEDoc.html", "")) { sc.Forward(); sc.Forward(); sc.ForwardSetState(SCE_H_DEFAULT); } } else if (sc.state == SCE_H_ENTITY) { if (sc.ch == ';') { sc.ForwardSetState(SCE_H_DEFAULT); } else if (sc.ch != '#' && (sc.ch < 0x80) && !isalnum(sc.ch) // Should check that '#' follows '&', but it is unlikely anyway... && sc.ch != '.' && sc.ch != '-' && sc.ch != '_' && sc.ch != ':') { // valid in XML sc.ChangeState(SCE_H_TAGUNKNOWN); sc.SetState(SCE_H_DEFAULT); } } else if (sc.state == SCE_H_TAGUNKNOWN) { if (!ishtmlwordchar(sc.ch) && !((sc.ch == '/') && (sc.chPrev == '<')) && sc.ch != '[') { char s[100]; sc.GetCurrentLowered(s, sizeof(s)); if (s[1] == '/') { if (keywordsTags.InList(s + 2)) { sc.ChangeState(SCE_H_TAG); } } else { if (keywordsTags.InList(s + 1)) { sc.ChangeState(SCE_H_TAG); } } if (sc.ch == '>') { sc.ForwardSetState(SCE_H_DEFAULT); } else if (sc.Match('/', '>')) { sc.SetState(SCE_H_TAGEND); sc.Forward(); sc.ForwardSetState(SCE_H_DEFAULT); } else { sc.SetState(SCE_H_OTHER); } } } else if (sc.state == SCE_H_ATTRIBUTE) { if (!ishtmlwordchar(sc.ch)) { char s[100]; sc.GetCurrentLowered(s, sizeof(s)); if (!keywordsTags.InList(s)) { sc.ChangeState(SCE_H_ATTRIBUTEUNKNOWN); } sc.SetState(SCE_H_OTHER); } } else if (sc.state == SCE_H_OTHER) { if (sc.ch == '>') { sc.SetState(SCE_H_TAG); sc.ForwardSetState(SCE_H_DEFAULT); } else if (sc.Match('/', '>')) { sc.SetState(SCE_H_TAG); sc.Forward(); sc.ForwardSetState(SCE_H_DEFAULT); } else if (sc.chPrev == '=') { sc.SetState(SCE_H_VALUE); } } else if (sc.state == SCE_H_DOUBLESTRING) { if (sc.ch == '\"') { sc.ForwardSetState(SCE_H_OTHER); } } else if (sc.state == SCE_H_SINGLESTRING) { if (sc.ch == '\'') { sc.ForwardSetState(SCE_H_OTHER); } } else if (sc.state == SCE_H_NUMBER) { if (!IsADigit(sc.ch)) { sc.SetState(SCE_H_OTHER); } } if (sc.state == SCE_H_DEFAULT) { if (sc.ch == '<') { if (sc.Match("

Next: , Previous: browser, Up: tools


4.3 PL/SQL Editor

This tool provides you with an advanced editor for developing PL/SQL objects.

Elements of the editor window

On the top of the screen is the toolbar for the editor.

Below that are two panes. The left one "Objects" contains the available objects in the selected schema. The schema is selectable through the toolbar. Select the code object you want to edit in this list or start a new object before starting to edit the code.

The right pane contains more widgets: Contents, Message Log, and the editor itself. In the Contents list you can find declared methods of packages and also variables or even anonymous blocks in your code. Selecting a line in this pane will move the cursor to where the element is in your code, for instance where a variable or method is declared.

The Message Log contains all errors and optional warnings for given PL/SQL code. Clicking the log items will take you to the exact place in the editor.

Toolbar & menu

The toolbar and menu contain pretty much the same commands with a few exceptions.

Refresh object list
Update the Object list to the left of the screen. This is first on the toolbar and close to the end in the menu. The keyboard shortcut for this is F5. Observe that this list is read from the object cache and will not be updated unless you reread the object cache as well (Available from the File menu.
Select schema
In the toolbar this is a combobox listing the available schemas. Changing the schema will change the objects displayed in the Object list. Selecting it in the menu (Close to the end) or selecting the ALT+S keyboard shortcut will move the keyboard focus to the toolbar combobox.
New sheet
Start editing a new object.
Compile
Compile the current editor. This will compile the procedure with the debug option, if you don't have the debug options you need to recompile it in order to be able to see watches. The keyboard shortcut for this is F9.
Compile with Warnings
Compile the current editor with suggested Oracle's PL/SQL Warnings (PLW). Fixing these warnings can speed up your code.
Static Check
Runs external static checker and displays result along with oracle errors and warnings. This button is only visible if static checker has been set up in preferences.
Next error
Move the cursor to the next syntax error in the current editor. For more information about syntax errors in editors see the editor section. The keyboard shortcut for this is CTRL+N.
Previous error
Move the cursor to the previous syntax error in the current editor. For more information about syntax errors in editors see the editor section. The keyboard shortcut for this is CTRL+P.

Static check

Running static check will create a temporary file containing currently open code tab. Then external program will be called with name of temporary file (with full path) given as parameter. Result from that external program should be in specific format in order to be interpreted by TOra.

TOra expects one line of output (written to stdout) to contain one message from static checker. This line should start with number of line followed by semicolon and then text of message.

Note: in future TOra should be able to interpret linenumber, code of static message and then message itself. Code of static message will be used to open automatically generated URL descibing static checker message.

Example of output from static checker:

     72:STC-0100:Comment describing function/procedure and it's parameters is missing
     107:STC-0200:Name of procedure "my_procedure" does not comply with naming standard
tora-2.1.3/src/help/newconnection.html0000644000175000017500000000775411420561767017554 0ustar michaelmichael newconnection - TOra

Next: , Previous: window, Up: workspace


3.2 Connecting to a database

You can connect to a database by selecting the File|New Connection menu entry or the toolbar button. For more information about the menu and toolbar see Elements of the main window.

After selecting the menu you will be presented with the following dialog.

images/newconnection.png

The filling out of this dialog is pretty straight forward.

Previous
This list contains the previous connection made, selecting an entry from this list will set all the values to the right to the correct. Doubleclicking will connect straight away (only makes sense if you save passwords).
Connections
Values to connect to this database again.
Connection provider
The type of connection to create. You can choose from Oracle, MySQL and others.
Username
The username with which to connect to the database
Password
The password to use for the connection, this defaults to manager. You can also configure TOra to remember your last used password (see Options)
Use SQL*Net
This is perhaps the most difficult setting. This indicates whether to connect locally to the database or use SQL*Net. If you check this box the connection is made through the Oracle listener, otherwise a local connection usually using shared memory or named pipes is made. This is only available for Oracle connections.
Hostname
The host on which the database resides. This is only available for non Oracle connections.
Database
What database to connect to, the listbox is filled with the values available in your tnsnames.ora file.
Connection Mode
The type of connection to make, usually normal always suffices here. But sometimes during database administration SYS_DBA or SYS_OPER is needed. If you don't know what these mean you probably shouldn't be using them.
Upon establishing a successful connection all the settings of the dialog will be saved and remembered when the next connection is made with the exception of the password. tora-2.1.3/src/help/api.html0000644000175000017500000002503011420561770015431 0ustar michaelmichael api - TOra

Next: , Up: extendingtora


5.1 TOra Tool Tutorial

This tutorial will create a simple tool that can execute an SQL statement and display it's content in a list. This tutorial assumes you have knowledge of C++ and Qt programming.

First of all we create an include file which defines the tool widget. This is the window that will be displayed when the a tool window is created. How that happens comes later.

     
     #ifndef TOSIMPLEQUERY_H
     #define TOSIMPLEQUERY_H
     
     #include "totool.h"
     
     class toResultView;
     class QLineEdit;
     class toConnection;
     
     class toSimpleQuery : public toToolWidget {
       Q_OBJECT
     
       toResultView *Result;
       QLineEdit *Statement;
     private slots:
       void execute(void);
     public:
       toSimpleQuery(QWidget *parent,toConnection &connection);
     };
     
     #endif
     

If this file is put in the main TOra source directory the configure script will generate the appropriate moc file which will be needed later. If you don't know what moc is, please go back to the Qt manual to read up on slots and signals.

The rest is pretty straight forward and will be much clearer after we start working our way through the implementation of this tool.

The first thing we need to do is create a tool description which is done by subclassing the toTool class. This is how we implement this class for this function.

     
     #include "totool.h"
     #include "tosimplequery.h"
     
     static char * tosimplequery_xpm[] = {
     "16 16 3 1",
     " c None",
     ".c #000000",
     "+c #FFFFFF",
     "       ......   ",
     "      ..++++.   ",
     "     .+.++++.   ",
     "    .++.++++.   ",
     "   .....++++.   ",
     "   .++++++++.   ",
     "   .++++++++.   ",
     "   .++++++++.   ",
     "   .++++++++.   ",
     "   .++++++++.   ",
     "   .++++++++.   ",
     "   .++++++++.   ",
     "   .++++++++.   ",
     "   .++++++++.   ",
     "   .++++++++.   ",
     "   ..........   "};
     
     class toSimpleQueryTool : public toTool {
     protected:
       virtual char **pictureXPM(void)
       { return tosimplequery_xpm; }
     public:
       toSimpleQueryTool()
         : toTool(203,"Simple Query")
       { }
       virtual const char *menuItem()
       { return "Simple Query"; }
       virtual QWidget *toolWindow(QWidget *parent,toConnection &connection)
       {
         return new toSimpleQuery(parent,connection);
       }
     };
     
     static toSimpleQueryTool SimpleQueryTool;
     

The first thing that happens is that we include the header file which defines the tool widget and the tool definition header files. Even if this is included in the tosimplequery.h it is good practice not to assume any extra files are included by header files.

Next comes a definition of an xpm pixmap. Normally these are placed in the icons directory and then included into the file as you can see in the TOra source. This is placed inline for clarity.

The next one is the big one. Here we define the tool class which has a few important virtual functions.

pictureXPM
This function should if defined return a pointer to a xpm definition. This will then be used for toolbar icon, menu icon and tool window icon. ‘pictureXPM
menuItem
Should return a string containing the name of the menu item to add to the tools menu. This is also used for a tip for the toolbar icon by default. ‘menuItem
toolWindow
This function will create a new tool widget and return a pointer to it. It doesn't need to create a widget, then it should then return NULL. Some tools there might only be one per connection for instance. ‘toolWindow

The number in the constructor is a priority indicator that denote where in the list of tools this tool should be inserted, between each 100 step a separator is inserted into the toolbar and menubar.

And last a not so obvious line where the an instance of the tool descriptor is instantiated. This is a feature that is used a lot in TOra. This will ensure that all tools are registered when the application is started. It also works when using modules, if this is compiled as a module the tool will be instantiated on loading without any hassle with functions with predefined names and such stuff.

Lastly comes the implementation of the tool widget which is not much longer. I have divided this into several parts to simplify explaining them.

     
     #include <list>
     
     #include <qtoolbar.h>
     #include <qlabel.h>
     #include <qtoolbutton.h>
     #include <qlineedit.h>
     
     #include "tosimplequery.h"
     #include "toresultview.h"
     #include "toparamget.h"
     #include "tochangeconnection.h"
     
     #include "tosimplequery.moc"
     
     static char * execute_xpm[] = {
     "16 16 3 1",
     " c None",
     ".c #000000",
     "+c #0FFE14",
     "                ",
     "                ",
     "                ",
     "     .          ",
     "     ..         ",
     "     .+.        ",
     "     .++.       ",
     "     .+++.      ",
     "     .+++.      ",
     "     .++.       ",
     "     .+.        ",
     "     ..         ",
     "     .          ",
     "                ",
     "                ",
     "                "};
     
     toSimpleQuery::toSimpleQuery(QWidget *main,toConnection &connection)
       : toToolWidget(SimpleQueryTool,"simplequery.html",main,connection)
     {
       QToolBar *toolbar=toAllocBar(this,"Simple Query",connection.description());
       QPixmap executePixmap((const char **)execute_xpm);
       new QToolButton(executePixmap,
                       "Execute current statement",
                       "Execute current statement",
       this,SLOT(execute()),
       toolbar);
       toolbar->setStretchableWidget(new QLabel("",toolbar));
       new toChangeConnection(toolbar);
     

In this part the parent constructor is called and the toolbar is set up. Also note the inclusion of the moc file which by convention is called tosimplequery.moc. One thing worth noticing here is the toAllocBar which is used to be able to transparently support either using KToolBar or QToolBar depending on whether this is a Qt or KDE application. This is very important since TOra also supports windows to which KDE is not available.

The second part is the setStretchableWidget call which is used to indicate that an empty label should be stretch instead of the tool button which just looks really weird.

Also worth noting is that the toToolWidget class is derived from QVBox so any widgets constructed in this widget will be lined up vertically in the order of creation.

Next up is creating our widgets and connecting them.

     
       Statement=new QLineEdit(this);
       Result=new toResultView(this);
       connect(Statement,SIGNAL(returnPressed()),this,SLOT(execute()));
     }
     

This just adds two additional widgets and connect the returnPressed signal to the execute slot. One thing to realise here is that all the toResult children will use the connection of the closest parent of type toToolWidget in the widget hierarchy. And now the last thing to do is implement the execute method.

     
     void toSimpleQuery::execute(void)
     {
       try {
         QString sql=Statement->text();
         toQList params=toParamGet::getParam(this,sql);
         Result->query(sql,params);
       } TOCATCH
     }
     

The toParamGet::getParam function is used to ask for bind values in the query string. To understand what I mean try executing the query "select :hello from dual" when you try the result. The toQList is simple a list of toQValue which can hold different datatypes and converting between them transparently.

Now finally to compile this module you need to add the tosimplequery.cpp file to SOURCES define in the file Makefile. To build a plugin you also need to add the following line.

     
     plugins/tosimplequery.tso:objs/tosimplequery.o
     

This should go among the other plugin definitions and you also need to add the plugins/tosimplequery.tso to the dependencies of tora-plugin.

You must rerun configure for the tosimplequery.moc file to be generated the first time. Any subsequent changes should update the moc file automatically from the Makefile.

Here are the example files in their entire.

Hopefully this is a starting point to help you read the rest of the documentation and start cranking out those plugins. tora-2.1.3/src/help/editor.html0000644000175000017500000001613111420561767016156 0ustar michaelmichael editor - TOra

Next: , Previous: globalsettings, Up: preferences


3.8.2 Editor Settings

This page of the options contains settings for TOra editors. Editor settings are organised in two tabs: Options and Syntax.

Options tab

images/editor.png
Syntax highlighting
Use this to control whether you want syntax highlighting or not. Observe that without syntax highlighting you will not see the indications for errors and current lines in the PL/SQL editor.
Use maximum text width mark
Check this option and specify maximum length of text. A vertical line indicating this margin will be displayed in text editor. Note that this option will not prevent text to be writen beyond maximum text width margin. this option is purely for visual representation.
Keyword upper
Check this box to convert all keywords to uppercase before displaying them. The text itself is not changed so resetting this not changed and the text sent to the database still contain lowercase letters. This setting is disabled if you do not have a monospaced font selected.
Object names upper
Extract all names of objects (tables, views, columns etc.) from database as uppercase (default). For example this setting will be used when generating object creation scripts.
Code completion
Check this box to enable code completion in SQL editors.
Editor shortcuts (TAB replacement)
By checking this option and pressing a button "Edit..." you can add/modify/delete editor shortcuts. Editor shortcut is a short word which can be replaced to a long phrase by pressing TAB button. For example you can set that a short word "selsysd" be replaced with "select sysdate from dual".
Sort completion rows
If checked the completion alternatives are sorted in alphabetical order, otherwise they are in the same order as in the source.
Indent same as previous line
When inserting a new line indent it to the same level as the previous one.
Text example
This is the font to use for all editors in TOra that are not syntax highlighted. Choose the Choose button immediately to the right of the label to select a new font.
Code example
This is the font to use for all syntax highlighted SQL editors in TOra. Choose the Choose button immediately to the right of the label to select a new font.
List example
This is the font to use for all lists in TOra. Choose the Choose button immediately to the right of the label to select a new font.
Filename extensions
TODO.
Tab stop width
With of tab character. This value is also used when indenting automatically generated/formated scripts.
Use only spaces when indenting
TODO.
Static checker
Specifies static checker to be used. This configuration option should contain %1 which will be replaced with a filename (with full path) containing code to be checked. For example:
          perl /usr/bin/staticChecker.pl --output=TORA --file=%1

Syntax tab

images/editor_syntax.png
Syntax components
This list contains different parts of the SQL syntax. You can change the color used for the element by selecting the item in this list and then pressing the Pick button to select a color. The current color of the currently selected item in the list is displayed just to the left of the Pick button.

The available elements are as follows.

Background The normal background color for text.
Comment An SQL comment. Currently this only includes – comments, not rem comments.
Current background This is the background to use for the current line of execution in the PL/SQL debugger.
Error background This is the background to use for lines that have SQL errors in the in the PL/SQL debugger/editor.
Keyword This is the color to use for the text of an SQL keyword.
Normal Normal text color.
String Color to use for text in strings.
Unfinished string Color to use for strings that miss their terminating ' or ".
At the bottom of this dialog is a text field that displays en example of the current setting.

tora-2.1.3/src/help/whatprivileges.html0000644000175000017500000000462611420561767017733 0ustar michaelmichael whatprivileges - TOra

Next: , Previous: newconnection, Up: workspace


3.3 What privileges do you need to run TOra

TOra should be able to run as any user, although off course you can never do anything in TOra that aren't allowed from that Oracle account. You will be able to use pretty much any tool in TOra for read only purposes if you are granted the SELECT_CATALOG_ROLE, also some parts of TOra will have limited functionality if you do not have the ALTER SESSION privilege.

Also you need to be able to create the plan table if that is not done for you. The plan table (see see Database Settings for how to select plan table name) must also be available with INSERT and SELECT access. TOra will function without the plan table but off course you will not be able to display any execution plans. tora-2.1.3/src/help/common.html0000644000175000017500000000367511420561767016171 0ustar michaelmichael common - TOra

Previous: preferences, Up: workspace


3.9 Other common elements

These describe other elements that are used in several parts of the user interface.

tora-2.1.3/src/help/security.html0000644000175000017500000001252711420561767016544 0ustar michaelmichael security - TOra

Next: , Previous: tuning, Up: tools


4.7 Security Manager

This tool provides an easy interface to manipulate users, roles and their privileges.

images/security.png

The window consists of three parts. First the toolbar on top, to the left is a list of all the users and roles. Finally to the left is a tabbed window containing the different settings and privileges you can manipulate for the chosen user.

Toolbar

The commands in the toolbar are from left to right.

Refresh
Update the user and role list to the left of the screen.
Save changes
Perform any changes made to the current user or role.
Remove
Drop the user or role currently selected. If the user still owns objects a question will be asked about also removing these objects or abort the drop.
New user
Start defining a new user.
New role
Start defining a new role.
Copy
Copy the current user or role to a new name.
SQL
Display the SQL that will be used to apply the current changes in a memo editor(see memoeditor).
Change connection
Change the connection to administrate security for.

You select the role you want to work on simply by pressing it in the left pane or any of the new user, new role or copy buttons to start defining a new one.

Defining a user

There are five tabs available when defining a user or four when doing the same for a role.

General
Used for setting the name, authentication, default tablespaces etc. for the new user. For more information about this see the Oracle SQL Reference.
Roles
Which roles are granted to the user or role. For more information about defining privileges see the section below.
System privileges
Which system privileges this user or role should have. For more information about defining privileges see the section below.
Object privileges
Which privileges this user or role should have on specific schema objects. For more information about defining privileges see the section below.
Quota
Define the quota for the user, this tab is not available for roles. For more information about defining quotas see the section below.

Defining privileges

All roles, system or object privileges are defined using basically the same interface.

images/priviledges.png

This list contains a tree view with first the schema, then the type, the object and finally the actual privilege to define. In the system or role tabs, the privileges are in the root of the list. If you open the privilege you will find an additional with grant option item which if checked will give the user or role the ability to grant the privilege on to other users or roles. In the role case you also have another child item to the privilege which is default. If default is checked the role will be enabled by default when the user logs in. When you start a new user all checked items will be made visible by expanding the parent items.

Defining quota

You define quotas using the following interface.

images/quota.png

To change a quota simply select the tablespace and specify the new quota using the radio buttons at the end of the screen. If value is selected you can specify a value using the size control at the bottom. tora-2.1.3/src/help/template.html0000644000175000017500000001537211420561770016503 0ustar michaelmichael template - TOra

Next: , Previous: output, Up: tools


4.18 Template Help

This tool provides help for writing PL/SQL and SQL queries by allowing a non obtrusive database browser and help lookup.

The template help is implemented as a docked window if these are available. They are available in Qt 3.0 (Released only as beta as of 2001-07-11) and KDE.

The help browser are divided into two panes. The top pane displays a tree view of the available documentation. The lower is used to display more information about the selected item in the top pane and it's content may differ depending on what is selected.

The top pane is in the default distribution divided into two parts as well. The DB Browser (see Database Browser) which lets you explore your connected databases through a tree structure. The second part is a plain tree list of available text documentation. By default only one manual is supplied which contain PL/SQL functions, but an editor is supplied to write more help.

Items in the second part is simply items with a descriptive text associated with them. Selecting the item will bring up the description of it in the information.

images/template.png

DB Browser

The database browser allows you to browse the schema objects in the open databases. All the open databases will have an item under which the following information is available. Under each table is a list of the visible schemas for the database. Under the schema the following items are available.

Code
Under this item all the code objects are displayed. The information in the child objects will bring up the source of the object. There are also child items to this that contain information about grants and dependencies.
Indexes
Contains all the indexes of the schema. The information in the child objects will bring up the columns on which the index is defined.
Sequences
The sequences of the schema. The information in the child objects will bring up information about the sequence. There are also child item to this that contain information about grants.
Synonyms
The synonyms of the schema. The information in the child objects will bring up information about the sequence. There are also child item to this that contain information about grants
Tables
The tables available in the schema. Selecting the table will bring up the columns of the table. There are also three child items to this that contain information about constraints, grants and references.
Triggers
Triggers in the schema. Selecting the item will bring up the source for the trigger. There are also child items to this that contain information about grants and dependencies.
Views
The views available in the schema. Selecting the view name will bring up the columns of the table. There are also child items to this that contain information about grants and dependencies.

Don't forget that more database browsing functionality is available in the database browser tool (see Database Browser).

Setup help templates

You set up additional help files by selecting the SQL Template page in the options dialog (see Options).

images/templatesetup.png

To add an existing or start a new template help collection select the add file button and enter the filename under which to store the help collection and the name of the root item under which the collection should be displayed in the template help tree.

To edit a collection select the collection in the list and press the edit file button to bring up the template editor. If the name doesn't exist you are asked to start a new file or cancel.

To remove a template press the remove file, this will not remove the actual file.

Template editor

The template editor is used to edit and create new text template help collections.

images/templateeditor.png

The editor are separated into a few different parts. On the left is a list of available items. To the top right are two buttons add new template and remove current template. Then comes a line editor where the name of template is. If a ':' character is in the name it will split into a tree in the template collection tree. Then comes a text editor where the actual description of the title is written. You can specify simple HTML in this editor. Finally there is a button called preview which will give you a preview of the editor result of HTML.

The result is not saved until you press OK in the dialog. Pressing cancel will discard any changes made. tora-2.1.3/src/help/output.html0000644000175000017500000000473611420561767016240 0ustar michaelmichael output - TOra

Next: , Previous: invalid, Up: tools


4.17 SQL Output

This tool displays the output from the DBMS_OUTPUT package (For more information see the Oracle PL/SQL Supplied Packages manual).

images/output.png

Use this if you are running PL/SQL from the worksheet(see SQL Worksheet) and want to check the output. It is also used in the debugger (see PL/SQL Debugger) but as a pane in the debugger information.

The toolbar contain the following controls.

Update
Poll for more output immediately.
Clear output
Clear the currently collected output.
Refresh
The time-out to update automatically. The default value of this is configurable though the options.
Type of output
You can choose if TOra should fetch output from standard oracle output or from Log4plsql module.
tora-2.1.3/src/help/index.html0000644000175000017500000001173511420561770015776 0ustar michaelmichael TOra

TOra

Next: , Up: (dir)


TOra Manual 2.1.3+

This manual is for TOra, version 2.1.3+.

tora-2.1.3/src/help/session.html0000644000175000017500000001075411420561767016360 0ustar michaelmichael session - TOra

Next: , Previous: storage, Up: tools


4.9 Session Manager

This tool is used to manage the connections made to the database.

images/session.png

The session tool consists of a toolbar, a list displaying the connections currently open to the database and at the bottom a tabbed pane where you can investigate a specific connection to the database.

Toolbar

The toolbar contains the following commands.

Refresh
Refresh the view from the database.
Filter
Here you can define which sessions to display. You can choose to see only sessions of specific users, only active sessions, all sessions, all sessions except background or all sessions except system ones.
Enable timed statistics
Enable timed statistics for the currently selected session.
Disable timed statistics
Disable timed statistics for the currently selected session.
Disconnect session
Disconnect the currently selected session. You will be asked if you allow the current transaction to finish before kicking the session out or not.
Refresh time
A list where you can select the interval between automatic updates.
Select all sessions
TODO
Deselect all sessions
TODO
Filter
TODO
Change connection
Change the connection to administrate storage for.

Inspecting a session

When you select a session the following information is available in the tabbed pane at the bottom of the window.

Current statement
The statement that is currently being executed (see sgastatement for information about the statement).
Long ops
TODO
Statistics
The session statistics available for the session. You will get more statistics if you enable timed statistics through the toolbar. There are also two charts displaying waitstates and I/O for the selected session.
Wait events
TODO
Connection info
Information about the connection and versions of the components used.
Pending locks
What locks this session is currently waiting for.
Locked objects
The objects currently locked by this session.
Accessing
TODO
Previous statement
The next to last statement being executed by the session (see sgastatement for information about the statement).
Open cursors
This contains a list of all the cursors currently held open by the session. When a statement is selected in the list you can investigate it using the normal SGA statement view.
tora-2.1.3/src/help/workspace.html0000644000175000017500000000554311420561767016673 0ustar michaelmichael workspace - TOra

Next: , Previous: history, Up: Top


3 Getting to know your workspace

This section will help you familiarize yourself with the framework of the TOra application which is common to all tools in the toolkit.

tora-2.1.3/src/help/Index_002dlist.html0000644000175000017500000001442611420561770017357 0ustar michaelmichael Index-list - TOra

Previous: extendingtora, Up: Top


Index-list

tora-2.1.3/src/help/help.html0000644000175000017500000000626411420561767015626 0ustar michaelmichael help - TOra

Next: , Previous: Top, Up: Top


1 Using the help browser

You can always bring up help on the current dialog etc. by pressing the F1 key. You can also select it from the application menu bar under Help (dooh).

When you open the help browser which you obviously have done. You are presented with a screen similar to the following.

images/help.png

On the top of the screen is a toolbar with back and forward buttons that you can use to go back and forward in the history of viewed pages that you have previously looked at. This list kept during the duration of running TOra, however when you display help in dialogs that help is not added to the main application help history.

To the right is a large area which displays the documentation. This is essentially a web browser (If you run the KDE version it is actually an embedded konqueror) and works as such. Clicking on blue text will go to the referenced section.

To the left is a pane that can either display the contents of the manuals available for browsing or search result. Note that the TOra help is compatible with Oracle manuals which can be browsed in the help viewer if you add them in the options dialog (see Additional help).

You can also display a different pane where you can search the manuals. In this version of TOra you can only search external Oracle manuals and not the TOra user manual. This will be fixed in a future version of TOra.

Just enter the words you want to find and the sections containing all the words entered will be displayed in the list below it. Selecting a row in either the search result or contents list will bring up that page in the right part of the screen. tora-2.1.3/src/help/externalapi.html0000644000175000017500000000341311420561770017175 0ustar michaelmichael externalapi - TOra

Previous: api, Up: extendingtora


5.2 API Reference

API documentation can be genereated on your own directly from source code files.

You need to have Doxygen (doxygen.org) installed.

Base configuration for the documentation are located in TORA_SRC_DIR/doc/help/api directory.

Unix/Linux: just run make in this directory. Make clean and more various targets are predefined. See the Makefile.

MS Windows: Try make too. Or run doxygen manually. tora-2.1.3/src/help/trace.html0000644000175000017500000000525611420561767015774 0ustar michaelmichael trace - TOra

Next: , Previous: rollback, Up: tools


4.11 SGA Trace

This tool is used investigate the statements available in the SGA.

images/sgatrace.png

The session tool consists of a toolbar, a list of SGA statements ( see sgastatement ) and finally at the bottom a SGA statement view.

Toolbar

The toolbar contain the following controls.

Update
Update the view from the database.
Schema
The user schema to extract statements for.
Refresh time
A list where you can select the interval between automatic updates.
Type
What type of statements you want to examine. Can either be SGA to investigate all entries of the SGA or Long operations to check long operations in the database (Databases must have timed statistics enabled to generate entries for long operations).
Change connection
Change the connection to administrate storage for.

Don't forget you can sort the view by selecting a column header in the SGA list. tora-2.1.3/src/help/invalid.html0000644000175000017500000000525511420561767016323 0ustar michaelmichael invalid - TOra

Next: , Previous: alert, Up: tools


4.16 Invalid Objects

This tool is useful to recompile invalid objects in the database.

images/invalid.png

To the left you see a list of invalid objects. Select an object and the editor on right hand side will be filled with code to recreate the object, you can then fix whatever problem may be with it. Rows with errors will have red background and you can see the error in the statusbar by putting the cursor on the row. You can also refresh the list or change the active connection by the buttons in the toolbar.

Recompile all invalid
This button will try recompiling all displayed invalid objects. Different types of objects are recompiled by callind different statements: Index:
     alter index <schema.index_name> rebuild
Package body:
     alter package <schema.package_name> compile body
Public synonym:
     create or replace public synonym <synonym_name> for <synonym_target>
All other objects are recompiled using:
     alter <object_type> <schema.object_name> compile
tora-2.1.3/src/help/charts.html0000644000175000017500000000661311420561767016160 0ustar michaelmichael charts - TOra

Next: , Previous: lists, Up: workspace


3.6 Using charts

There are several different chart types in TOra, you can see them in the screenshot below (taken from Server Tuning tool).

images/charts.png

Piecharts

This is the most simple chart. If the chart is too small you can open a snapshot of the chart by doubleclicking it. You can also open a context menu by rightclicking it. In the context menu you can choose to print the chart as well and open a snapshot in a new window.

Linecharts & barcharts

These two charts work in the same way. The difference is that in a barchart the values are added on top of each other so you can easily see the sum of all values.

You can zoom a part of a chart by leftclicking it and dragging a selection. If a chart is currently zoomed the word Zoom is printed in the upper left corner. You can remove the zooming by right clicking on the chart.

The snapshot feature, context menu and printing works the same for these charts as for the piechart. In the context menu you have an additional item though that is Properties

images/chartsetup.png
Y-Axis
This part is pretty self explanatory and is used to set up the range to display on the Y-axis of the chart.
Show last value
Display the last sample added to the chart under the title of the chart.
Show axis legend
Display text with the range and units of the axises.
Show chart legend
Display the colors used in the chart in a legend to the right.
Divide chart in grids
How many gridlines to divide a chart into.
tora-2.1.3/src/help/lists.html0000644000175000017500000001540011420561767016024 0ustar michaelmichael lists - TOra

Next: , Previous: editors, Up: workspace


3.5 Using lists

A list is a very central element of the TOra user interface and is a standard way to display information in a grid. Here is an example of a list.

images/lists.png

Navigating a list

If a list does not fit into it's designated area on the screen it will get scrollbars that can be used to navigate the entire contents of the list. There are also the usual key bindings left, right, up, down, page up, page down etc...

Lists can be hierarchical as can be seen in the screenshot above. When there are child items that are not displayed a + is displayed to the left of the row. Clicking the + will expand the row and display the child items. You can also use the right key to expand child items and left key to collapse them.

Result lists

Result lists are lists that display the result of a query from the database. Only a configured amount of rows are initially read (see Options for more information), although enough items to fill the screen is always read if available. To read more items from the queries simply scroll down. If you want to scroll faster use page down which will read an entire screen of data at a time from the query. If you want to read all the data available you can use the Edit|Read All menu item.

Manipulating lists

In a list you can change the sort order by pressing the header of the list to sort on the column whose header you clicked. Clicking the same column again will reverse the sort order. Columns that contain numerical data (Regardless of database format) will be sorted as numbers (2 before 10). Observe that not all lists can be sorted in a different sort order.

You can also rearrange the column order by dragging the heading of a column to another place.

Accessing the contents of a field

The contents of a field (Specific row and column of a list) can be copied either by double-clicking the field, or selecting copy from the context menu available by right-clicking on the field. You can also drag the contents of a field to an editor.

If the contents is too long to be visible in the list you will get a tooltip with all of the contents if you place the mouse over the field for a short while (As seen in the screenshot). If this is not enough you can display the contents of a field in a separate window by accessing the context menu of the field and selecting display in editor.

You can also place a line in the bind parameter(see gettingbindparameters) cache by double clicking on a line. The bind name will be the same as the column name in lowercase.

Exporting the contents of a list

Contents of a list can be exported by choosing an "Export to file..." item from a context menu. This will give you a following dialog:

images/exporttofile.png

TOra allows you to export data in a number of formats:

  • Text - simple text file will be created with values in different columns separated by a required number of spaces.
  • Tab delimited - same as text just columns will be separated with a tab character.
  • CSV - values will be exported with a specified separator used.
  • Html - a html file be created with a single table containing values of a list.
  • SQL - a sql file will be created containing insert statements for values chosen.

Please note that this functionality can be called from schema browser as well as from a sql worksheet tool. When exporting to sql file, only calling from schema browser tool will produce an insert statements with a correct table name. SQL Worksheet does not now exactly data of which table you're exporting (you could be exporting from a number of tables) therefore TOra will put "tablename" instead of actual name of table when exporting from SQL worksheet. Do not forget to update it in resulting sql file!

Case of keywords in insert statement can be controlled via configuration option "Keywords upper" found in editore preferences.

Other list functionality

Lists can always be printed by selecting the File|Print menu item.

You can also save a list as a text file by selecting File|Save menu item. Any graphics in the list will be discarded and all fields will be left justified in the output.

In the context menu for the list you can also select the entry edit SLQ in which you can edit the SQL used to generated the list. If there is no single SQL used to generate the list you will not find any SQL, however you will usually be pointed in roughly the right direction in the sql editor (see SQL Editor, Where you can also find more information about the concept of SQL dictionary TOra uses). tora-2.1.3/src/help/debugger.html0000644000175000017500000003343411420561767016461 0ustar michaelmichael debugger - TOra

Next: , Previous: plsqleditor, Up: tools


4.4 PL/SQL Debugger

This tool provides you with an advanced editor and debugger for developing PL/SQL objects.

images/debugger.png

Elements of the debugger window

On the top of the screen is the toolbar for the debugger.

Below that to the left are two panes. The top one Objects contains the available objects in the selected schema. The schema is selectable through the toolbar. Select the code object you want to debug or edit in this list or start a new object before starting to edit the code.

The lower pane Contents contains the structure of the selected object. Here you can find declared methods of packages and also variables or even anonymous blocks in your code. Selecting a line in this pane will move the cursor to where the element is in your code, for instance where a variable or method is declared.

To the right is a large editor area where you can edit the current object. The editor is described in more detail later.

The last part of the screen is not always visible. It contains information about the currently running debugging session.

Toolbar & menu

The toolbar and menu contain pretty much the same commands with a few exceptions.

Refresh object list
Update the Object list to the left of the screen. This is first on the toolbar and close to the end in the menu. The keyboard shortcut for this is F5. Observe that this list is read from the object cache and will not be updated unless you reread the object cache as well (available from the File menu).
Select schema
In the toolbar this is a combobox listing the available schemas. Changing the schema will change the objects displayed in the Object list. Selecting it in the menu (Close to the end) or selecting the ALT+S keyboard shortcut will move the keyboard focus to the toolbar combobox.
New sheet
Start editing a new object.
Scan source
Update the Contents list to the left on the screen according to the source currently in the editor. TOra will try to keep up with this as you write, but new blocks and declarations will only show up if you rescan the source. The keyboard shortcut for this is CTRL+F9.
Compile
Compile the current editor. This will compile the procedure with the debug option, if you don't have the debug options you need to recompile it in order to be able to see watches. The keyboard shortcut for this is F9.
Execute
Call the method, procedure or function closest to the cursor. It's off course only when you edit packages that there are several methods to choose from in the current editor. If you have changed the source TOra will ask you if you want to recompile and start over or simply continue without recompiling. The keyboard shortcut for this is CTRL+Return.
Stop
Halt the currently running execution. The keyboard shortcut for this is F12.
Step into
Step into any functions or procedures called on the current line of execution. The keyboard shortcut for this is F7.
Step over
Step to the next line of the current editor. The keyboard shortcut for this is F8
Return from.
Continue running until returned from the current function or procedure. The keyboard shortcut for this is F6.
Debug pane
Display or hide the debugging pane at the bottom of the debugging window. The keyboard shortcut for this is F11.
Next error
Move the cursor to the next syntax error in the current editor. For more information about syntax errors in editors see the editor section. The keyboard shortcut for this is CTRL+N.
Previous error
Move the cursor to the previous syntax error in the current editor. For more information about syntax errors in editors see the editor section. The keyboard shortcut for this is CTRL+P.
Toggle breakpoint
Add or remove a breakpoint on the current line of the editor. Breakpoints are indicated with a small stop sign to the right of the line in the editor. The keyboard shortcut for this is CTRL+F5.
Disable breakpoint
Will disable or enable a breakpoint on the current editor. A disabled breakpoint will be seen is grayed out in the margin of the editor of the line it is on. The keyboard shortcut for this is CTRL+F6.
Add watch
Add a watched variable. See here for more information about watches. The keyboard shortcut for this is F4.
Delete watch
Remove a watched variable. The keyboard shortcut for this is CTRL+Del.
Change watch
Change the value of a watch. See here for more information about watches. The keyboard shortcut for this is CTRL+F4.
Erase runtime log
Remove the content of the runtime log which is in the rightmost pane of the debugger info.

Debugger editor

When you run a program and make a change, but still decide to keep stepping through your program without restarting you can have one other changed file plus the current file, if you try to step to another object TOra will ask if you want to continue until you are back in the edited files or recompile.

Another thing special in this editor is that the PL/SQL editor will show you errors in the package. The errors are highlighted with a special background color (The default is red, but this is configurable in the options(see Options). You can also use the next error or previous error toolbar button/menu entries to step between the errors.

Next thing to know about the debugger is breakpoints. You can set a breakpoint either by selecting the toggle breakpoint toolbar button or menu entry. This will add a breakpoint to the line you are currently on in the editor. To remove the breakpoint simply select toggle breakpoint again. Another way to add or remove breakpoints is to double-click in the left margin of the editor where you also see where the breakpoints are. They are indicated by a small stop sign in the margin. If you want to temporarily disable a breakpoint that you might need to enable again later you can also choose disable breakpoint, this is also a toggle so selecting the command again will re-enable the breakpoint. For those of you who don't know breakpoints means that when execution of the object comes to the line containing the breakpoint the debugger will stop and allow you to inspect the data.

Which brings us to the last special thing in this editor which is the current line of execution, this is an indication of where the execution currently is at. This line is indicated by a special background (Default is green, but that is configurable in the options(see Options)).

Debugger information

Information about the current state of execution is shown in the pane at the bottom of the debugger window which you can be hidden. You hide or show this by selecting the command debug pane command or by pressing the F11 key. The debug pane consist of several tabs containing the following information.

Stack trace
Contains the current stack trace. This means the list of called objects that have lead to the current line of execution. Selecting a line will bring up the object and line where the the call to the next object was made except for the last line which is the current line of execution.
Watches
Watches is where you can inspect variables in your PL/SQL code while running. They are explained in more detail later.
Breakpoints
A list of where you current have your breakpoints and their status. The status can be enabled or disabled which are pretty self explanatory. It can also be deferred which means that some error have occurred setting the breakpoint. Every time execution is restarted TOra tries to set any breakpoints that are deferred.
Parameters
This displays the input and output parameters that you passed to the original call that started the debugging. The output parameters are off course not available until the execution is finished.
Debug output
Any DBMS_OUTPUT output from your debugging session will end up in this window. For more information about using this see the output tool.
Runtime log
This is simply a log displaying what is happening in the target debugging thread and probably not of much interest to anybody except TOra developers. One exception is that if you somehow get an SQL error when you function or procedure of choice is executed those errors will end up here.

Watches

Watches are a way to inspect the contents of variables in a running program. When you add a watch using the add watch command you are presented with the following dialog.

images/addwatch.png

First of all you need to select the scope the variable is declared in. The local scope is variables only declared in the current context, like for instance this function or procedure. The head and body are variables declared in packages. Variables in packages are usually also available in the global scope. When you declare a watch in any scope except for local you should also indicate the object in which the variable is declared in the format schema.object.variable. The current object is prepended to the variable name when you select anything but the local scope.

Finally you have to fill out the variable name. If you have the cursor on a variable in the editor that name is the default when you add the watch.

You can then see the contents of this variable in the watch pane of the debugger info. The value will be updated every time execution stops while you are debugging. If the variable can not be found it will be {Unavailable}. If all variables are unavailable even though they shouldn't you have probably forgotten to compile the object with the debug option. You can remedy this by simply using the compile command. TOra will always compile programs using the debug option when in the PL/SQL debugger.

TOra can also inspect list and table object which will show up as child items in the list to the variable. When this is a case you can also see how many items an array is having in the parent of the actual data items.

You can remove a watch by selecting it in the watch list and selecting the remove watch command.

You can also change the content of a watch. First you select the watch you want to change in the watch list, then you select the change watch command. You will be shown this dialog.

images/changewatch.png

If you have selected the parent of an array watch you will be able to select the index you want to assign a new value with the index indicator to right. Then you enter the new value in the text field or check the NULL indicator to set the value to NULL. tora-2.1.3/src/help/preferences.html0000644000175000017500000000605111420561767017171 0ustar michaelmichael preferences - TOra

Next: , Previous: searchreplace, Up: workspace


3.8 Preferences

To access the preferences of TOra you select the Edit|Preferences menu item, you will then be presented with the following dialog.

images/preferences.png

In windows preferences are stored in the registry, but in Linux it is stored in a file called .torarc in the users home directory. If this file doesn't exist a file called /etc/torarc is used if it exists.

Selecting page

To the left is a list containing the available option pages you can display.

The rest of the settings are tool specific and covered under corresponding tool in the tools section(see Available tools).

Selecting a page does not discard the changes of another page, and no changes are saved until OK is pressed. You can always discard any changes made by pressing the escape key or the Cancel button. tora-2.1.3/src/help/explainplan.html0000644000175000017500000000565011420561767017207 0ustar michaelmichael explainplan - TOra

Next: , Previous: sgastatement, Up: common


3.9.2 Explain plan

This element can be either part of an SGA statement or by itself in some cases (See above for a screenshot). For more information about execution paths check the Oracle manual Designing and Tuning for Performance, chapter 5 in the 8i release.

A few notes here is that the execution plan displayed here is not necessarily the same as when run depending on one of these reasons.

  • It is run as a different user which doesn't access the same database objects as the user you are logged in as now.
  • The session running the query can have changed some optimizer parameters compared to your session.

What you see in this window is the execution you would get if you ran the statement like the one you are logged in as now and in your session. One example of this problem is if a user executes SQL which accesses his own objects which doesn't have public synonyms, then another person can simply not execute the SQL without modifying it to add owner specifier to the tables which TOra will not do automatically.

Explain plan requires a table to store the result in. The name of this table can be configured in the options(see Options). If the table doesn't exist TOra will ask you if it should try to create it. Without this table you can not display execution plans in TOra. tora-2.1.3/src/help/database.html0000644000175000017500000002026211420561767016434 0ustar michaelmichael database - TOra

Next: , Previous: editor, Up: preferences


3.8.3 Database Settings

This page of the options contains settings on how to interact with the database.

images/database.png
Autocommit changes
If this is set any changes made to the database will be automatically committed as soon as you make them. Use this with care, the transaction handling is there for a reason you know.
Reading object cache
There are four options of object cache behaviour. Start read object cache when needed - will start reading it when it is first used. Read object cache on connect - TOra will start reading the object cache when you start a connection to a database. Never read object cache until mandatory - TODO. Never read object cache until mandatory (Will leave some parts of application nonfunctional - TODO. Note that reading this is quite a costly query so you probably shouldn't have this checked if you are in a production environment, on a slow connection or not using the object cache. The object cache is mostly used for describing tables, the PL/SQL debugger and code completion.
Initial rows to fetch in query
This setting indicates how many rows to always fetch from a query when executing it. Observe that you can always read more from the individual query just by scrolling down. Check the All checkbox to always read all available records. Be aware that TOra will interact sluggishly or not at all while reading many lines. It will also keep the entire result in memory so checking the All box and reading a really large table could bring your machine to it's knees.
Initially read in content editor
If set to something other than All a query will be placed only this number of rows initially from Oracle when browsing the content. The reason for this is that Oracle will be under high load if a content list is started on a large table. When this value is reached the query will be reread to fetch the rest of the values so you as a user will not see any difference.
Maximum size display
The maximum width a list column will get automatically regardless of how large the content is. This is so you can still see the rest of the columns even if one of the first can contain very large values. You can always resize the column by hand afterwards.
Firewall mode.
Makes each connection in connection pool to run extra queries (selecting sysdate from dual) at specified interval (see "Connection test interval" option). This could be useful if there is a firewall between TOra and database and firewall is dropping connections if there is no traffic.

Note! If you change this option, you have to reconnect in order to make it effective.

Connection test interval
Interval in seconds at which TOra should be sending dummy queries to database (see "Firewall mode").
Indicate empty values as ”.
TODO.
Number format.
TODO.

There may also be pages under this for each individual database provider. Currently only Oracle and MySql uses this feature. That setup looks like this.

images/oracle.png
Checkpoint name
This is a checkpoint TOra should use when it is making changes that need to be rolled back. One place where this is used is to perform explain plans without filling up the plan table. The name doesn't matter, just make sure you don't use this checkpoint name yourself.
Default date format
The format that you prefer dates to be displayed. Changing this will require a reconnect to the database before it starts to operate. The string should be a standard Oracle date to string conversion specification. For more information see the Oracle SQL Reference.
Maximum cursors to keep open
TODO.
Max LONG and LOB data length
The amount of data to read from LONG, BLOB or CLOB data fields. If you always want all the data to be read check the Unlimited checkbox to the right. LONG datafields can not be specified as Unlimited, if this is specified 33000 characters are read by default.
Explain plan table
The table to use to temporarily store explained execution plans. Use the Create Table button to create the table if you don't have it.
Keep plans
If this is check explained plans are left in the explain plan table. The normal behaviour is to rollback the explanation after it is initially read to keep the explain plan table from filling up with old plans.
images/mysql.png
Possibility to break MySql queries
TODO.
When calling create routine statement in worksheet
MySQL routine creation does not support "create or replace" therefore if you try to create new routine and it already exists you will get an exception. This option controls if TOra should try to avoid such exceptions in one of supported ways:
  • Do nothing - do not try to detect and avoid exception when creating routines.
  • Drop before creating - execute "drop <procedure|function> if exists <name>" before calling create statement.
  • Drop before creating (if exists) - check routines table if routine already exists. If so - execute drop statement.
  • Ask - ask user if TOra should try dropping a routine before creating it (without checking if it already exists).
  • Ask (if exists) - check routines table if routine already exists. If so - ask user if drop statement should be called (without it creating procedure will fail, but it could be usefull if you didn't know that routine with given name exists already and now you would like to skip creation and probably change the name of routine).
Note! - if routine creation statement fails you will be left without any version of routine in the database!
tora-2.1.3/src/help/script.html0000644000175000017500000001613311420561767016176 0ustar michaelmichael script - TOra

Next: , Previous: current, Up: tools


4.13 Schema extraction, compare and search

This tool is used to either extract a script to recreate database objects, compare database objects or search database objects.

images/script.png

Defining the operation

The first thing to select is if you want to extract script to recreate an object, compare or search. You choose this by selecting one of the radio buttons to the left of the screen.

Next you should indicate what kind of information you want included in the extract or compare. This is selected with the checkboxes just to the right of the mode selection. Depending on the mode some options may be disabled.

Include DDL
Include any database definition.
Include constraints
Extract constraint definitions from tables.
Include indexes
Extract indexes for tables.
Include grants
Extract grants for database objects.
Include storage specification
Extract storage specifications for database objects.
Include parallel specification
Extract parallel specification for tables.
Include partition specification
Extract partition specification for tables.
Include code specification
Extract code for packages, procedures and functions.
Include comments
Extract comments for database objects.
Generate prompts
Generate prompts in the extracted result indicating what the script is doing.
Generate header
Generate header of the script.
Include content of tables
Extract the content of tables as well.
Commit distance
TODO.
Generated schema
This specifies the schema to be used when extracting. If you select Same, the same schema as the source database is used. If you select None, no schema is generated. Specifying anything else will replace the source schema with the one entered here.

If you are searching you also need to indicate what you are searching for in the bottom left of the front page.

Containing any words
The object should contain at least one of the words in the line editor.
Containing all words
The object should contain all of the words in the line editor.
Exact match
The object should contain the exact string as in the line editor include whitespaces.
RegExp
The object should contain at least one of the words in the line editor. The dialect of RegExp:s is the ones in the version of Qt that TOra is compiled against. For more information on regular expressions check out http://doc.trolltech.com/qregexp.html, if you are using Qt 3.0 or later you have a more advanced form of regular expressions.

The next thing you need to do is to specify which objects you want to extract or compare. If you extract you only need to specify the source, if comparing destination objects are also needed.

Selecting or deselecting an item in this list will select all it's child items.

If you specify the extract mode you can also indicate a way to resize generated storage specifications. This could be useful to make a database have only a few standard storage specifications making the database less prone to fragmentation.

images/resize.png

You have three modes to specify how resizing should work. First there is Don't resize which means leave the same as the original. Then there is Auto resize which should work for pretty much everyone. In this a resize specification for each order of magnitude of size is given a specific storage specification. And last is the Custom resize mode in which you specify how to transform the storage specifications to new values.

When you specify a custom resize you add items to the list with a limit size, initial size and next size. The sizes are used in the following way. When TOra is to determine the storage clause of an object it will take the initial and next sizes of the row in this list with the lowest limit size still higher than the current size of the object. If no row is found the one with the highest limit is used.

Reading the result

If you extract the result is available under the Result tag of the dialog in the form of a worksheet tool where you can either start executing it or save it to a file. If you are comparing objects you will get the result under the Difference tab. The tab will look something like this.

images/difference.png

On the left is a pane containing objects only available in the source database. On the right is a pane containing the objects only available in the destination database.

Only the items in the lists that have checks on them are actually dropped or created, the other items only need to be added to lead the list tree to the items that are actually dropped or created. tora-2.1.3/src/help/additionalhelp.html0000644000175000017500000000577211420561767017662 0ustar michaelmichael additionalhelp - TOra

Next: , Previous: database, Up: preferences


3.8.4 Additional Help Settings

This page is used to configure extra manuals for viewing in the TOra help viewer. Specifically the Oracle HTML based manuals which contents can be parsed and included in the left pane contents tree of the TOra help.

images/additionalhelp.png

If you have compiled TOra with KDE support (Not Windows or Qt versions) you can point this to any HTTP location. You could even use the help browser to browse the Oracle manuals directly from Technet if you wanted to (Free membership required).

Remove path
This will remove the currently selected manual from the list.
Oracle Manuals
This is a quick way to add a collection of manuals. When you select this button a dialog will pop up and ask you for a filename. In Oracle 8 this should be the index page that contains the links to the manuals. Observe that this is not the page which links to the different book categories. In Oracle 9i you should point it to the docindex.htm file in the base directory of the documentation. If successful all the manuals available on the page is added to the list of manuals.
Add path
Add a manual to the list of manuals. This pop up a dialog asking for the name of the manual and the location of the manuals table of contents HTML file (toc.html).
tora-2.1.3/src/help/rollback.html0000644000175000017500000001263211420561767016463 0ustar michaelmichael rollback - TOra

Next: , Previous: session, Up: tools


4.10 Rollback Segments

This tool is used to manage rollback segments in the database.

images/rollback.png

The window consist of three part. The top one displays the available rollback segments and you can also see running transaction that use segment in the transactions column of the view, the length of the transactions show up as bars in this column. One bar for each running transaction using the segment.

The last part is a unique tool to detect snapshot too old problems in your database. This is discussed more later.

Toolbar

The toolbar contains the following commands.

Update segment list
Update the view from the database.
Enable snapshot too old detection
TODO
Take segment online
Take currently selected segment online.
Take segment offline
Take currently selected segment off-line.
Create new rollback segment
Create new rollback segment. If you are confused about what the items in the dialog mean refer to the Oracle Server Concepts manual as well as the Oracle SQL Reference.
Drop segment
Drop the currently selected segment.
Refresh time
A list where you can select the interval between automatic updates.
Change connection
Change the connection to administrate storage for.

Snapshot too old detection

The lower part of this view is used to heuristically detect snapshot too old problems. The operation of this is that whenever the view is updated all SGA statements are cataloged and the corresponding current position in all the rollback segments are also stored the first time a new statement is detected. Since the information about the current location of the rollback when a statement was executed is not available in the SGA you have to keep the tool window open during the entire duration of the execution for this to work.

In the view you can see when the statement was first detected and who is running it. You also see the snapshot info which will display how far each of the available rollback segments have moved since this statement was executed. This is represented by one bar for each rollback segment. If any of these bars goes all the way through this column you are likely to encounter a snapshot too old statement.

Finally you can see the SQL for the row. Selecting a line will also let you investigate the statement using the normal SGA statement(see sgastatement) view.

There are a few options to configure how the snapshot too old detection is to work.

images/rollbacksetup.png
Enable snapshot too old detection
TODO
Disregard start extent
If you check this the bars will always start from the left of the column. Otherwise the bars will start corresponding to the current extent of the tablespace and then wrap around as they grow.
Restart reexecuted statements
If the execution count is changed for a statement reset the location of the rollback segments to the current location.
Must read buffers
To display a statement it must be reading buffers, it is still kept in memory if no buffers are read, but not displayed in the list until buffers are read again. Check this to remove any statements that you execute and simply kept open even though you will not be reading from them any more.
Exclude first appearance
Exclude the first update that would show the statement. Without this checked any statement with execution changed and buffers read will show up.
tora-2.1.3/src/help/toolsetting.html0000644000175000017500000000427211420561767017246 0ustar michaelmichael toolsetting - TOra

Previous: additionalhelp, Up: preferences


3.8.5 Tool Settings

This page of the options contain settings on which tools should be enabled in TOra.

images/tools.png

The first list contains all the available tools in TOra. If an item is selected in the list it is enabled. If unselected it is not enabled.

There is also a combobox at the bottom called Default tool. Using this setting you can specify which tool to start by default when opening a new connection. Many people are for instance more interested in the Schema browser than a worksheet and could start that instead of a worksheet by default on opening a connection.

Be aware that you need to restart TOra for changes to these settings take affect. tora-2.1.3/src/help/searchreplace.html0000644000175000017500000000727711420561767017504 0ustar michaelmichael searchreplace - TOra

Next: , Previous: charts, Up: workspace


3.7 Search & Replace

TOra has an advanced search and replace function that allows you to search result list and editors. Replace is only available for editors though. You can invoke the search & replace dialog by selecting the menu Edit|Search & Replace or by pressing CTRL+F. The search always operates on the last editor or list that had the focus when you invoked the dialog. Not on the current widget of the next search etc. The dialog looks like this.

images/searchreplace.png

Specifying the search criteria

You enter the text to search for, this can be either in the format of plain text or regular expressions as defined by the current version of Qt which TOra is compiled against (For more information check out http://doc.trolltech.com/qregexp.html, if you are using Qt 3.0 or later you have a more advanced form of regular expressions).

You can also specify if the search expression must match a whole word or if the match is to be case sensitive.

After specifying what you are looking for you can execute your search by either pressing the Search Top button which will start the search from the top of the contents of the target for the search or Search Next which will continue searching for the next match from the current location.

Replacing

In the replace text field you can specify the text with which to replace a matched find that has been found. Note that regardless of if the search is case sensitive or not the replacement is the same case as specified in the text field.

After finding the first occurrence by pressing Search Top or Search Next you can either replace it with the current substitution by pressing Replace, or skip to the next by pressing Search Next button again. At any time the Replace All will replace all occurrences after the current location in the editor. tora-2.1.3/src/help/gettingbindparameters.html0000644000175000017500000000524511420561767021256 0ustar michaelmichael gettingbindparameters - TOra

Next: , Previous: explainplan, Up: common


3.9.3 Getting bind parameters

This dialog is displayed when input parameters are required to run the SQL. For instance the example dialog is the dialog displayed when running the following SQL in the worksheet.

     
     select * from essprc where prcid > :prcid and begrdt > :begrdt;
     
images/getparam.png

As you can see the field name as specified after the : character is presented as a title. If the same field name is used at several parts of the query you only get to specify it once. You specify the value in the editor line just to the right of the field name label. If you want to specify a NULL value check the NULL checkbox to the right of the editor. You can also edit the value in a memo editor(see memoeditor) pressing the Edit button to the right on the value.

The parameter editor will cache it's value so it will remember the last parameters you fed to it when you run the query again. tora-2.1.3/src/help/tools.html0000644000175000017500000000537711420561767016042 0ustar michaelmichael tools - TOra

Next: , Previous: workspace, Up: Top


4 Available tools

These are the available tools in a standard TOra installation. Individual installations may vary.

tora-2.1.3/src/help/tuning.html0000644000175000017500000001132011420561767016167 0ustar michaelmichael tuning - TOra

Next: , Previous: unittest, Up: tools


4.6 Server Tuning

This tool provides easy access to important server indicators as well as server statistics and an editor for database parameters.

images/tuning.png

The interface for this tool is very simple. First there is a toolbar with the following controlls.

Refresh
Refresh data from the database, will not read another value for charts.
Refresh rate
The interval between which to auto update data, observe that setting this too low could put a high load on a database server. This is also the sample interval for charts.
Change connection
Change the connection to monitor in the tuning tool.

There are several tabs in the window.

Overview
Displays an overview of dtabase statistics, shows the flow of data through the server in an intuitive way.
Charts
Charts containing important performance information from the database.
Wait events
Information and charts about wait events.
File I/O
Displays information about I/O separated by tablespace or datafile. You can select if you want to see average wait time, blocks for tablespace or datafile by using the combobox at the top of the charts.
Indicators
Important performance indicators.
Statistics
Raw statistic information from the server. The statistics is shown in two columns, the first one contain the actual value, the second show the change in the value since the last update.
Parameters
This tab displays the values of the parameters of the database. You can also use it to change the values by selecting a row and entering a new value at the bottom of the tab. After changes has been made you can apply or export these changes using the buttons in the toolbar at the top of the parameter editor.
images/pfileeditor.png
Display hidden parameters
TODO
Generate configuration file
Generate a p-file with the current changes (And original changes as well) into a memo editor(see memoeditor).
Apply changes to system
Apply changes made to the system.
Apply changes to session
Apply changes to the current session. Will only apply changes to the main connection and not any child sessions TOra might open for instance when statements are executed in the worksheet.
Drop changes
Drop the changes currently made to the parameters and revert to the current session settings.

Blocking locks
TODO.
Library cache
TODO.
Control files
TODO.
Options
List the options available in the database server.
Licenses
Display license information to the current database.
tora-2.1.3/src/help/toc.html0000644000175000017500000000554311320423565015452 0ustar michaelmichael Contents

Help contents

Using the help browser

History of TOra

Getting to know your workspace

Elements of the main window
Connecting to a database
Privileges for the TOra user
Using editors
Using lists
Using charts
Search & replace
Options
Global Settings
Editor Settings
Database Settings
Additional Help
Tool Settings
Other common elements
SGA Statement
Explain Plan
Getting bind parameters
Object description
Memo editor
Tools
SQL Worksheet
Schema Browser
PL/SQL Editor
PL/SQL Debugger
PL/SQL Unit Tester
Server Tuning
Security Manager
Storage Manager

Sessions
Rollback Segments
SGA Trace
Current Session

DB Extraction/Compare/Search
Statistics Manager
Alert Tool
Invalid Objects
SQL Output Viewer

Template Help

SQL Editor

Extending TOra
Tutorial
API Reference
tora-2.1.3/src/help/sqledit.html0000644000175000017500000001170011420561770016324 0ustar michaelmichael sqledit - TOra

Previous: template, Up: tools


4.19 SQL Editor

When TOra needs to run an SQL statement it will not actually use the SQL needed directly. It will fetch an SQL statement by addressing it with a string. The string is built up by a module name, followed by a colon and a unique name for the SQL (Example: toBrowser:ListIndex which will contain the SQL statement for getting all the indexes for a schema).

For each SQL name there may be a number of actual SQL strings that are available, each are associated with a version number. When TOra requests an SQL statement by a name it will receive the string with the statement with the highest version number lower than the version of Oracle for the current connection that will be used to run it. Each SQL name also has a description associated with it so you can understand what the SQL is supposed to do.

TOra has a default SQL name to statement map which can be redefined by the user to either add support for different versions than TOra originally supports, or change the default behavior for TOra in some cases. The changes from the default map is saved in the file defined in the options dialog (see Options). If you make changes to improve support for other versions of Oracle please send this file to tora-develop@lists.sourceforge.net and we will incorporate them in the future releases.

You start the SQL editor either by selecting Edit|Edit SQL or by selecting Edit SQL in the result list context editor. You are then presented with the following dialog.

images/sqledit.png

The window is divided into several parts. To the left is a list of SQL statements available divided into modules. When an item is selected in this list you can use the right part of the screen to modify the SQL associated by the selected name.

The right part of the window is divided into the name and version at the top. The version is also preceded with the name of the provider (Usually Oracle) separated by a colon. Each statement name can have several versions of an SQL. You can add a new version by simply entering a new text into the version combobox. You can also select any of the existing versions by selecting them from the list.

Below the name and version is the description which is independent from the version. Below that is a worksheet (see SQL Worksheet) which you can use to edit and test the SQL statement that should be associated with the given name and version.

There is also a toolbar with the current available commands.

Open
Read in a file containing SQL descriptions saved before.
Save
Save the changes made from the default to the SQL statements to a file. This file can be used to send updates and improvements of the internal SQL to incorporate in future versions.
Save this entry
Save the changes made. If changes have been made and you select a new item you will be asked to save or discard the changes if you forget to save entry before.
Drop this entry
Drop the current entry. If the last version of a statement is deleted the entire statement will be deleted. Observe that you can not delete default statements permanently, they will reappear when you restart TOra so you can't really screw up with this.
New SQL
Start new SQL statement definitions.
tora-2.1.3/src/help/memoeditor.html0000644000175000017500000000354711420561767017043 0ustar michaelmichael memoeditor - TOra

Previous: objectdescription, Up: common


3.9.5 Memo editor

images/memo.png

This is used to display or edit larger text than is easily entered in a oneline editor or list. To the top is a toolbar with some editing buttons. Specifically you have the save changes button to the left. You can also do this using the key CTRL+Return. You can remove the editor without saving changes using the Escape key or closing the window. tora-2.1.3/src/help/browser.html0000644000175000017500000005035311420561767016357 0ustar michaelmichael browser - TOra

Next: , Previous: worksheet, Up: tools


4.2 Schema Browser

This tool provides you a simple browser for exploring database schema objects. Initially it can be said that the browser also provides a browser like functionality for the template help (see Template Help) which is covered separately. This browser will provide you with more information and you will also in future versions of TOra be able to interact with schema objects (Dropping or create tables etc.), this is not fully possible in the current version. The template help on the other hand is tree based and some people consider it easier and faster to work with.

images/browser.png

Using the browser

The schema browser has a very simple interface with a toolbar which contains the following functions. All of these are also available in the Browser menu item except for the schema selection and change object.

Refresh
Refresh the displayed data from the database. Also available on the F5 key.
Define filter
Displays the define filter dialog( ). This is used to specify which objects to show in the browser. The default filter is to show everything. Also available on the CTRL+SHIFT+G key.
Clear filter
Remove the current filter and revert to the default of showing everything. Also available on the CTRL+SHIFT+H key.
Schema
The last item on the toolbar is a combo box where you can select the schema to display objects for. It defaults the schema you are currently logged in as. Only schemas that are visible to the current user are selectable in the lost (Really, TOra does not contain the secret DBA password that will always let you access everything regardless of your privileges).
Change connection
Change the connection this tool window should operate on.

The rest of the interface consists of two tabbed windows, one within the other. The first one you can use to select the object type you want to inspect. When you have selected a type you can see the visible objects of the specified type available in the selected schema. The second tab indicates what kind of information you want to explore about the selected object and depends on the object type ( .). When you select an object name in the left list you can inspect information about it to the right.

You can move the keyboard focus to the schema selection using ALT+S and to the current object list using ALT+N.

Available information

This is the available information for the different object types.

Object type Name Description


Tables
Columns A description of the columns in the table. For more information about this information also see object description.
Indexes A list with the indexes that have been created for this table.
Constraints Displays constraints associated with this table.
References Displays the foreign key constraints that references this table and the other objects that have dependencies on this table.
Grants The grants that have been made on this table.
Triggers Lists the triggers that exist for this table.
Data Displays the data in the table. This is the only part of the database browser that let you modify any data. For more information about how to use the content editor .
Information Contains information about the table available in the SGA including analysed statistics etc.
Partitions TODO.
Extents TODO.
Script This tab displays an SQL script to recreate the database object.


Views
Columns A description of the columns in the view. For more information about this information also see object description.
SQL The SQL that defines the view.
Data Displays the data in the view. This is the only part of the database browser that let you modify any data. For more information about how to use the content editor ( ). You can not modify some views depending on how they are defined. See the Oracle reference for more information about editing views.
Grants The grants that have been made on this view.
Dependencies The objects that depend on this view.
Script This tab displays an SQL script to recreate the database object.


Indexes
Columns The columns that the index operate on.
Information Information in the SGA about an index. For instance analyzed statistics available for this index.
Extents TODO.
Script This tab displays an SQL script to recreate the database object.


Sequences
Info Information about the sequence.
Grants The grants that have been made on this object.
Script This tab displays an SQL script to recreate the database object.


Synonyms
Info Information about the synonyms
Grants The grants that have been made on this object.
Script This tab displays an SQL script to recreate the database object.


Code
Declaration The declaration of a package or type.
Body The implementation of a package, body, procedure or function.
Grants The grants that have been made on this object.
Dependencies Dependencies this object has.
Script This tab displays an SQL script to recreate the database object.


Triggers
Info Information about the trigger.
Code The code that implement the trigger.
Columns The columns this trigger operates on.
Grants The grants that have been made on this object.
Dependencies Dependencies of this object.
Script This tab displays an SQL script to recreate the database object.


DBLinks
Info Information about the trigger.
Synonyms TODO.

Content editor

The content editor lets you edit the contents of a table or view. There are a few things to note about this.

First of all the content editor is designed to behave nicely to the database which means that it will only save the data when it thinks you are finished editing a row. This happens when you save the current row change or you commit the database. When there is unsaved data you can see it in the status bar that there exists unsaved data. Also observe that the content editor will respect the auto commit setting in the database settings.

The content editor has it's own toolbar with the following buttons.

Define filter
Displays the define filter dialog. This is used to specify which objects to show in the browser. The default filter is to show everything.
Clear filter
Remove the current filter and revert to the default of showing everything.
Save changes
Save the changes made to the current row to the database. Observe that this will not commit the changes.
Add new record
Add a new record to the current table.
Duplicate an existing record
Create a new record copying all data from currently selected one.
Delete current record from table
Delete the current record from the database.
Refresh data
Requery data from the database.
Go to first row
Go to the first record in the editor.
Go to previous row
Go to the previous record in the editor.
Go to next row
Go to the next record in the editor.
Go to last row
Go to the last record in the editor. Observe that this will read in all available records in the table into memory.
Toggle between table or single record editing
Swith between editing data as a table or single record (the later one could be useful for table with a lot of columns).

The content editor can define a filter to specify which part of a table to edit. This dialog looks like this.

images/contentfilter.png

In the selection criteria part you can add whatever you want to go after a where in a select statement. In the sort order you can list the columns you want to sort on. The sort order only affect the order the records are read from the database, after they are read you can still sort on any column by clicking it. To the right is a list of available columns in the table.

Finally at the bottom is a checkbox called use for all tables. If this box is checked the index is used for all tables, if not checked you can define specific filters for each tables and the content editor will remember the different filters as you jump between tables. The reason for this is that it's quite common that not all tables have all the columns you want to filter on for a table, in this case you will get an error trying to access the table with a faulty filter setting.

Defining a filter

Filtering is based on the object name and can be specified in a variety of ways. This is the dialog used to specify the filter.

images/browserfilter.png

The most important part of this dialog is the editor which lets you specify the string to apply the criteria to. This is not available for No filter setting. The different available types and options are.

No filter
No filter specified, display all objects.
Start with
Only include objects which name starts with the specified string.
End with
Only include objects which name ends with the specified string.
Contains
Only include objects which name contain the specified string.
Comma list
TODO.
RegExp
Only include objects which name matches the regular expression specified in the editor. The dialect of RegExp:s is the ones in the version of Qt that TOra is compiled against. For more information on regular expressions check out http://doc.trolltech.com/qregexp.html, if you are using Qt 3.0 or later you have a more advanced form of regular expressions.
Ignore case
Ignore the case when matches. Since object names are pretty much always uppercase it is probably safest to leave this on.
Invert selection
If set, include all the objects that does not meet the specified criteria instead of the ones which does.

Some objects you can also search on what tablespace they are located on. This can be specified by the lower part of the dialog.

Include all
Include all regardless of tablespace
Include
Include the objects located on the selected tablespaces in the list below.
Exclude
Include the objects not located on the selected tablespaces in the list below.
tora-2.1.3/src/help/sgastatement.html0000644000175000017500000000361011420561767017365 0ustar michaelmichael sgastatement - TOra

Next: , Up: common


3.9.1 SGA Statement

This element is used to describe an element in the SGA.

images/sgastatement.png

The SGA statement have three tabs. The first tab called SQL simply display all of the SQL of the statement. The second tab called Execution plan displays the execution plan of the statement. This is described in more detail later. The last tab called Information simply display the information available about the statement in the SGA. tora-2.1.3/src/help/storage.html0000644000175000017500000001133511420561767016335 0ustar michaelmichael storage - TOra

Next: , Previous: security, Up: tools


4.8 Storage Manager

This tool provides an easy interface to administrate tablespaces and datafiles.

images/storage.png

As you can see in the screenshot above the tool is a list of all the tablespaces available in the database. The tablespaces can be expanded to display the datafiles they consist of. There is also one option available to this tool, whether to collect information about how coalesced the tablespaces are, the coalesced fetching can be very slow on fragmented databases and if TOra seems to lock itself when you try to start this tool try resetting that option to not show coalesced info. Using the toolbar you can perform these commands.

Refresh
Update the view.
Show extent view
TODO.
Show tablespaces or just datafiles
TODO.
Take tablespace online
Take the selected tablespace online.
Take tablespace offline
Take the selected tablespace off-line.
Set tablespace default to logging
Enable logging for the selected tablespace.
Set tablespace default to no logging
Disable logging for the selected tablespace.
Allow read write access to tablespace
Enable read and write access to the selected tablespace.
Set tablespace read only
Only allow read only access to the selected tablespace.
Modify tablespace
Modify the selected tablespace settings. If you don't understand the settings in this dialog please refer to the Oracle Server Concepts manual.
Drop tablespace
TODO.
Modify file
Modify the current datafiles settings. If you don't understand the settings in this dialog please refer to the Oracle Server Concepts manual.
Create new tablespace
Create a new tablespace. If you don't understand the settings in this dialog please refer to the Oracle Server Concepts manual.
Add datafile to tablespace
Create a new datafile for the currently selected tablespace. If you don't understand the settings in this dialog please refer to the Oracle Server Concepts manual.
Coalesce tablespace
Coalesced free data in the current tablespace.
Move datafile
Move a datafile to another location.
Change connection
Change the connection to administrate storage for.

When you select a tablespace or datafile the lower part of this tool displays the objects (to the left) and extents (to the right) in that tablespace or file. A used extent is displayed as green in the extent view if the object it belongs to is not selected in the list to the right. Selecting an item in the list to the right will paint it's extents red in the right extent view. Unallocated space is colored whie. Some information about the number of files and extents are displayed at the top of the extents display. Several datafiles are separated by one line of black in the extent view if a tablespace containing several files are viewed. tora-2.1.3/src/help/window.html0000644000175000017500000003722611420561767016207 0ustar michaelmichael window - TOra

Next: , Up: workspace


3.1 Elements of the main window

The main window in TOra has the following elements as shown below. It is assumed that you know how to handle a normal windows interface therefore no explanation about how to press buttons and select menus will be presented. If you are administrating Oracle you probably know how to handle a mouse.

images/workspace.png

Menubar

If you've ever used a windows program you will recognize most of the menus hopefully.

File menu
images/filemenu.png
New connection
This will pop up the new connection dialog (see Connecting to a database) which is used to open new connections to the database.
Close connection
Will close the current connection to Oracle. If uncommitted data exists it will also ask if you want to commit or rollback the changes. Observe that any tools associated with this connection will also be closed when closing a connection.
Commit connection
Commit the changes currently made to the database.
Rollback connection
Rollback any changes made in the current connection.
Current connection
Set focus to change the current connection.
Stop All Queries
Stops all queries running in current session.
Reread object cache
Clear the object cache. and read it again from the database.
Open File
This command will open a dialog asking you for a filename to load into the editor that currently holds the focus.
Recent Files
This item will have subitems of recently opened files which you can load into the editor that currently holds the focus.
Save File
This command will open a dialog asking you for a filename to save the contents of the editor that currently holds the focus. If the editor already has a filename this will be used and no dialog displayed.
Save As
This command will open a dialog asking you for a filename to save the contents of the editor that currently holds the focus.
Open Session
Open previously saved session.
Save Session
Save parameters of current session.
Restore Last Session
Open last saved session.
Close Session
Close current session.
Print
Will print the contents of the list or editor that currently holds the focus.
Quit
Close all connections and exit TOra.
Edit menu
images/editmenu.png
Undo
Undo the latest change in the editor that currently holds the focus.
Redo
Redo a previous undo of the latest change in the editor that currently holds the focus.
Copy
Copy the current selection in the editor that currently holds the focus.
Cut
Cut the current selection in the editor that currently holds the focus.
Paste
Paste the contents of the clipboard into the editor that currently holds the focus.
Search & Replace
Display the search & replace dialog (see Search & Replace).
Search Next
Make another search with the current search settings.
Select All
Select all rows in the current editor.
Read All Items
Read all items available for a list. Normally TOra doesn't read all available rows for a query, just enough to fill the screen. Scrolling down will read more. Selecting this will read all available rows from the query, this could take a very long time and consume a lot of memory if selected for a large query result.
Preferences
Displays the preferences dialog (see Options) where all aspects of TOra are configured.
Incremental Search
.
Auto Indent
.
Modify Case
Change selected text to uppercase or lowercase.
Bookmarks
Manage bookmarks.
Indent Block
Indent selected block.
De-indent Block
Deindent selected block.
Quote Selection
Quote selection. This also handles quotes inside text being quoted.
UnQuote Selection
Unquote selection.
Comment or Uncomment
Comments/uncomments selected text.
Goto Line
Goes to specific line number.
Complete
Pop-up a list of possible completions. For tables and views this would give a list of columns after entering table/view name and a dot. If there is no dot a list of common statements is given. For example if you press ctrl+space after entering "sel" you will get options of "select" and "selection".
Edit SQL
This may not be available because it is actually a tool plugin. Can be used to customize SQL used by TOra to determine the state of a database(see SQL Editor).
Chart Manager
.
Tools menu
images/toolsmenu.png

The entries of this menu start up new tools for the current connection (See connection management for more information about current connections). The contents of the menu may vary depending on which plugins are loaded.

Tool specific menu

There may be a tool specific menu entered between the Tools and Windows menus (In the screenshot at the top of current page it is called Browser). These are described in connection to the tools that display them.

Windows menu
images/windowsmenu.png
Close
Close the current tool window.
Close All
Close all open windows. This will not close any database connections, only windows.
Cascade
Cascade the open windows over the workspace.
Tile
Tile the open windows over the workspace.
Open windows
Here windows will line up in a list in the same order as you open them.
Help menu
images/helpmenu.png
Current Context
This will display a help page on the context you are currently in. If no specific context is found the table of contents is shown.
Content
Open the help window displaying the contents of the TOra help.
About TOra
Display information about TOra copyrigh.
License
Display the license under which TOra is distributed.
About Qt
Display information about Qt.

Application toolbar

Using the toolbar you can perform the most common editing operations, handle your connections and open tool windows.

images/toolbar.png

Editor buttons

Load
This command will open a dialog asking you for a filename to load into the editor that currently holds the focus.
Save
This command will open a dialog asking you for a filename to save the contents of the editor that currently holds the focus. If the editor already has a filename this will be used and no dialog displayed.
Print
Will print the contents of the list or editor that currently holds the focus
Undo
Undo the latest change in the editor that currently holds the focus.
Redo
Redo a previous undo of the latest change in the editor that currently holds the focus.
Copy
Copy the current selection the in editor that currently holds the focus.
Cut
Cut the current selection the in editor that currently holds the focus.
Paste
Paste the contents of the clipboard into the editor that currently holds the focus.

Tools

The buttons in this section can vary depending on which plugins were loaded at startup, they are described in the tools section (see Available tools) of the help. What is notable here is that when a button is pressed it is started for the currently selected connection available at the end of the application toolbar.

Connection management

All the buttons in this section have one thing in common. Except for the new connection they all operate on the currently selected connection. The currently open connections are available in a drop down list at the right of the toolbar. The selected item in this list is the connection that new tools will be working on and also any commit, rollback or close connection command.

The numbers behind the actual connection is the version of the Oracle server that this connection is made to.

New connection
This will pop up the new connection (see Connecting to a database) dialog which is used to open new connections to oracle.
Close connection
Will close the current connection to Oracle. If uncommitted data exists it will also ask if you want to commit or rollback the changes. Observe that any tools associated with this connection will also be closed when closing a connection.
Commit connection
Commit the changes currently made to the database.
Rollback connection
Rollback any changes made in the current connection.

Other items in the workspace

There are a few other items on the workspace that are worth taking notice of.

Statusbar

This will display any messages that TOra need to inform the user of. TOra generally takes the path of not bothering the user with pop ups when something goes wrong, but simply display it in the statusbar. Or at least that was my intention. Due to the fact that many people had problems understanding this the default behaviour of TOra is now to pop up a dialog displaying the error. However this dialog contains a checkbox to revert back to the old productive manner. So if something isn't working, make sure you check the statusbar if something went wrong.

There is an up button available to the right of the toolbar which when pressed can display a history of the contents of the status bar. This is also useful since the statusbar usually clears after certain amount of time but the information is always available here. Both the time until a message disappears and the amount of backlog to keep is configurable from the option dialog (see Options). If you select an item in the popup menu the contents of the entry will be opened in a memo editor (see memoeditor) where you can read them more easily and also copy the text more easily.

Next to the left is the coordinates of the editor that currently has the focus.

Fursthest to the right is swirling logo which will move whenever TOra is doing something in the background to indicate that the database is still busy performing some kind of operation in the background. The speed of the animation will reflect the number of background tasks that are currently running.

Tool windows

These are the tools that actually let you interact with Oracle. For more information check out the tools section (see Available tools) of the help. One thing to note about tool windows is that if the caption ends with a < digit > this is the digit that you can use together with the control modifier to select this window.

Workspace

The part of the main window that contain the tool windows.

Editors

For more information about key bindings etc. see Using editors.

Result List

These mean every kind of list displayed in TOra. For information about how to interact with these, see Using lists.

Charts

Used to visualize data, usually some kind of database statistics. There are no charts in the example window above, see Using charts.

Object Cache

When TOra opens a new connection to a database the database connected to is queried for all its objects and the synonyms available. This data is then used in most places when lists of objects are displayed. The thing to understand is that this data is cached so that any objects modified during the connection will not be visible unless you clear the cache and reread it from the database. As long as the object cache is read you can see the background activity swirling in the right part of the status bar. tora-2.1.3/src/help/alert.html0000644000175000017500000000571111420561767016001 0ustar michaelmichael alert - TOra

Next: , Previous: analyze, Up: tools


4.15 Alert Tool

This tool is useful for debugging database packages that send or depend on receiving dbms alerts.

images/alert.png

This tool is controled solely from it's toolbar which is followed by a list containing the alerts received so far on the watched alerts. The toolbar contains the following controls.

Registered
This list contains the alerts that are registered for listening. To add a new alert simply write the name in this combo box and press return or the register current button immediately to the right. To remove an alert select it in the list and press the remove registered button.‘Registered’.
Register current
Register the name currently entered in the registered combo box.
Remove registered
Stop listening to the registered alert currently selected in the registered combo box.
Name
Name of the alert to send.
Message
Message to send in an alert. Pressing return in this lineedit will send the alert.
Edit message in memo
Edit the message in a memo editor, useful for sending newlines and longer messages.
Send alert
Send the currently defined alert. You can also send an alert by pressing return in the message line editor.
tora-2.1.3/src/help/current.html0000644000175000017500000000506111420561767016352 0ustar michaelmichael current - TOra

Next: , Previous: trace, Up: tools


4.12 Current Session

This tool provides information about the current session.

images/current.png

The interface for this tool is very simple. There are four tabs in the window. The first one present the privileges currently granted to the your session. Roles can be expanded to display what privileges are available through those groups. The second one present the version of the different components in the connection. The parameters tab displays the parameters of the current session (for more information of parameter editors see tuning). The fourth and last tab display the statistics of the session. The statistics is shown in two columns, the first one contain the actual value, the second show the change in the value since the last update. To update press the refresh button in the toolbar. You can also change the connection for the tool using the change connection button to the right on the toolbar. tora-2.1.3/src/help/history.html0000644000175000017500000001331111420561767016366 0ustar michaelmichael history - TOra

Next: , Previous: help, Up: Top


2 History of TOra

History of TOra

I started the TOra project in December 2000, the reason being that I had been increasingly jealous of the tools available for interacting with Oracle databases to my colleges using windows. The tools that were available for Linux users were not nearly powerful enough. Execution plans being pretty much the most advanced feature available. During this time I also made a lot of attempts to get VMWare to work without any success fortunately. If I could have made this to work I would never have started TOra but run a VMWare client with Windows.

I started by working on what is now the worksheet in TOra. Already in the beginning I envisaged TOra being plugin based and easily extendable with new functionality without any or much change of the existing code base, the toTool class being one of the first written gives this functionality.

In the beginning the development pace was really fast as always and it didn't take long before it had at least in my opinion surpassed any available tool for Linux as an SQL worksheet. Most of the development of these versions were made in airports in Asia since I spent about a week in those on a backpacking holiday there around new years 2000 to 2001. Yes, I know there aren't many other people who would bring a laptop on a backpacking vacation, but I knew I would be spending a lot of time in airports and what better way to waste the time.

By the time I was back I released the first version of TOra with both worksheet and database browser. By this time I started looking at the PL/SQL debugging package available in Oracle, this was the first time I looked at developing functionality in TOra that I didn't really feel a pressing need for myself since I rarely write any large PL/SQL code. This was released in version 0.4 at the end of January, still only about 1 month after the project was started. This was the first functionality in TOra that is not available from any other open source project.

The next big thing to happen to this project was that TrollTech released the first version of Qt Free for windows at which point I started glancing at making TOra available for the windows platform. I've made a few feeble attempts earlier using an evaluation copy of Qt/Windows without much success. But when this release was made I really sat down and went through it finding lots of problems mainly with regards to Visual C++ (Which is really crap, but the one you have to use if you want to use Qt Free. Of course no tool can really replace emacs, gcc, make and gdb if you know how to use them).

After this development slowed down considerably to be able to stabilize the program to get the first stable releasse which was released on the first of september 2001. At almost the same time as 1.0 was released the first development release for 1.1 was released featuring a few of the most asked for features including improved tuning and better busy feedback. Most parts of TOra have been touched in some way for this release. The 1.2 release was also the first commercial release which is a way for me to ensure that TOra can be supported well forward in the future as it is starting to consume more and more of my time.

This page of the options about fonts and colors used in the user interface.

The future

I will continue to develop TOra to be the best possible database development and administration tool for Oracle and in the long run probably other databases as well.

By the time of the 1.2 release development of the 1.4 release is already well under way and will mostly feature DBA improvements. The database browser which will start getting more and more functionality to modify the browsed objects. Other changes are made to make DBA:s administrating database which people are accessing using TOra should also be happy with this release since it will warn more often when you are doing things you probably shouldn't be doing (Like running a server tuning session just to get a handle of whats happening). Improved database tuning with a new wait event analysis tool is also already finnished and ready for beta testing. Also PostgreSQL support will probably be available for the 1.4 release.

Henrik "Mauritz" Johnson, GlobeCom AB tora-2.1.3/src/help/worksheet.html0000644000175000017500000003367711420561767016721 0ustar michaelmichael worksheet - TOra

Next: , Up: tools


4.1 SQL Editor

This tool provides a way to execute arbitrary SQL or PL/SQL code and also investigate how it is executed and it's resource consumption.

images/worksheet.png

The worksheet is split into two panes. The upper one is the editor where you enter the queries you want to run. In the lower you can investigate the result.

Tip You can enter multiple queries/statements by separating them with a semicolon.

Toolbar & menu

There is a toolbar and a tool menu available for the worksheet. They both contain the following commands.

Execute Current Statement
This executes the statement you current are within or after. When executed the statement executed will be highlighted in the editor. The keyboard shortcut is CTRL-Return and F9.
Step through statements
By pressing this button you can execute all statements entered (and separated by semicolon). The keyboard shortcut is F9.
Execute All Statements
Execute all the statements in the editor. You get no result from the execution, the statement is simply executed. You can investigate the success of the commands in the Logging pane of the result. The keyboard shortcut is F8.
Execute Newline Separated
Execute a statement that is separated by two newlines (one empty line) instead of the normal ';' character. Could be useful for people who are familiar with some other Oracle tools. The keyboard shortcut is SHIFT+F9. Only available in the menu, not in the toolbar.
Reexecute last statement
This will re-execute the last executed statement. The keyboard shortcut is F5.
Describe under cursor
Describe the table currently under the cursor. The keyboard shortcut is F4.
Explain plan of current statement
Displays explain plan of current statement.
Stop execution
Abort execution of the currently running query. This will not work in Windows where the query will keep running in the background until the first row of the query is returned and consume server resources before it is aborted. When you execute a new statement the current execution will be aborted.
Clear execution log
Erase the contents of the rows under the Logging pane of the result.
Gather session statistics of execution
Enable or disable collecting statistics when running the statements. This will cause TOra to execute at least two extra queries for every statement executed when enabled. Next to this button in the toolbar is a combo box in which you can choose the refreshtime for the charts in the statistics pane.
Previous Log Entry
Display the result of the previous entry in the log. If result caching is on in the settings the previous result is displayed, if it isn't the statement is reexecuted to generate the result. Keyboard shortcut is ALT+Up. Only available in toolbar, not in menu.
Next Log Entry
Display the result of the next entry in the log. If result caching is on in the settings the next result is displayed, if it isn't the statement is reexecuted to generate the result. Keyboard shortcut is ALT+Down. Only available in toolbar, not in menu.
Insert current Saved SQL
Popup menu containing saved SQL. Insert chosen SQL under cursor position. Keyboard shortcut is CTRL+SHIFT+S.
Run current Saved SQL
Execute selected saved SQL. For more information see saved SQL. Keyboard shortcut is F7. This is only available in the toolbar.
Save last SQL
Save the most recently executed SQL to the saved SQL list. When pressed will ask for the name to save the SQL under. If ':' is entered in this name it will separate into submenues on the colon.
Current duration
While a query is currently executing you can see how long the query has been running in the right of the toolbar as a slowly ticking up the seconds. This clock will not stop when the first row is returned but run until all rows are read or the query is aborted. Moving the cursor over this label will also display a tooltip containing the SQL currently executing.
Change connection
Change the connection this tool window should operate on.

Using the worksheet editor

TOra uses a ; to separate statements in the same way as SQL*Plus. One difference is that TOra doesn't count whitespaces in any way to separate statements. You could write several statements on the same row and it wouldn't be a problem.

Another difference to SQL*Plus is that TOra parses the SQL you write to determine if you are within a PL/SQL block. If that is the case the entire block will be executed. This feature can be enabled or disabled in the options.

     
     SELECT * FROM dual; SELECT * FROM all_tables;
     
     BEGIN
        DBMS_OUTPUT.PUT_LINE('Hello');
     END;
     

In the example above there are three statements that TOra will recognize and execute.

There are a few words that are treated as comments for compatibility with SQL*Plus scripts. They are , REM and PROMPT. Comments will disregard whatever is to the right on the line. Also multi line /* ... */ style comments are recognised and ignored.

You can also use bind variables in the worksheet by using the normal : character. (see gettingbindparametersfor more information how this works). One nice feature is that the first line retrieved from the result set is stored in the parameter cache with a bind name the same as the column name in lowercase. The example in the getting bind parameters could have been used directly after executing the line select * from essprc and get the second row in the table by just using the defaults of the bind dialog if essprc contains a column named prcid.

You can also describe objects returned as in PL/SQL by using either DESC or DESCRIBE and an object name.

Exploring the result

There are six different panes available with information about the executed statements.

Result This contains the actual result of the query or describe. For some notes about descriptions see this note.
Execution plan The execution plan(see explainplan) of the current statement.
Visualize Can be used to visualize the current content of the result. The first column is assumes to contain labels and the rest contain the data.
images/visualize.png

The toolbar available contains the following controls.

Chart type
What kind of chart to generate. Available types are Bar Chart, Line Chart and Pie Chart.
Display Legend
Display chart legend on the right of the generated chart.
Display Grid
Display a grid in the generated chart.
Display Axis Legend
Display legends of the axises of the generated chart.
Title columns
TODO
Update chart
Generate a chart of the current data in the result tab and the current settings.


Information The information available about the current statement in the SGA.
Statistics The statistics collected when this statement was run. You need to enable statistics for this to be enabled. To update the statistic view simply change to another tab and change back to statistics. Charts are updated at the interval specified in the toolbar regardless of if you refresh statistics or not.
Logging This pane will display the history of the statements you have executed and their result. It can be sorted up or down depending on options. You can see the statement, it's result and the time (as recorded by the database) when it was executed. You can also see how many seconds until the first row was received. A new statement isn't added to the log until the first row of the query is returned or the statement has executed, whichever comes first.

Preferences

There are quite a few preferences available for the SQL editor.

images/worksheetsetup.png
Auto save
If checked the worksheet will always save changes to the editor without asking when the window is closed.
Ask about saving changes
Ask about saving changes to the worksheet when it is modified. Selecting the Auto save have precedence over this option.
Add log entries at end
If checked new entries in the Logging pane will be added to the end of list, otherwise they will be added at the top.
Multiple lines in log
If checked the lines in the log will display all the lines of the SQL executed. If not checked only the first line is displayed, although you can still see all of it in the tooltip or editor if you want to. For more information(see Using lists).
Parse PL/SQL blocks
If this is checked TOra will parse the text to determine PL/SQL blocks in the editor and execute them as one statement. If it isn't checked statements are strictly separated by ;.
Enable statistics
Indicates if statistics should be enabled or disabled as default when a new worksheet is opened.
Enable timed statistics
Set this to make TOra always enable timed statistics for the sessions that it is collecting statistics for. Observe that timed statistics will not be disabled after the worksheet is closed. The change is strictly for the current session though.
Display number column
Indicate whether or not to display the number column as the first column of the result or suppress it.
Move cursor to error
Move the cursor to the location of an error in an execute statement.
Save previous result
Save the results of all previous statements. This can consume a lot of memory, but will increase time to navigate history results. You can still clear this cache by erasing the log.
Execute directly when selecting in log
TODO.
Default file
A filename to open automatically when you start a new worksheet. Choose the Browse button to select the file in a file dialog.

Saved SQL

This is a feature you can use to quickly access SQL you often use. This is a popupmenu accessible in the toolbar of a worksheet. This popup will display all the SQL under "toWorksheet:" in the SQL dictionary(see SQL Editor). You can create submenues by adding a ":" character in the SQL name. The name of the SQL dictionary is what is used to generate the menu and not the description. You can still use placebinders in saved SQL. By default this list is empty. tora-2.1.3/src/help/globalsettings.html0000644000175000017500000001742511420561767017720 0ustar michaelmichael globalsettings - TOra

Next: , Up: preferences


3.8.1 Global Settings

These may vary some depending on how your system was compiled and configured. Not all options are displayed in the screenshot since that was made on a KDE version of TOra.

Custom SQL The file in which to store your custom SQL. For more information about custom SQL and the SQL dictionary (see SQL Editor tool. The string $HOME will be replaced by your home directory on UNIX or documents directory in Windows.
Help directory Should point to where the TOra help table of contents file is stored (toc.html). This should be set up correctly if you made a normal install.
Plugin directory This option is only available in a plugin based TOra installation. It should point to the directory where the plugins for TOra are located. It should be set up correctly on installation if needed.
Cache directory Should point to where the TOra Disk Cache files are stored. There is one file for each Connection.
Change current connection with active window If this option is set, changing the current window will also change the current connection to that of the active window. The connection is only changed when you change window so if you want to change the connection to something else you can still do so as long as you don't change the window.
Save last password Whether or not TOra should store the last password used to connect. Be aware that the password is store in clear text in either the windows registry or a file.
Include DB in caption If this is set the database name will be included in the caption of all your tool windows after the tool name. Observe that there often is no other way of knowing which database the window works on except for this.
Maximize window on start If this is checked the TOra main window will open maximized on startup.
Desktop Aware Set this if Qt should try to figure out and interact nicely with the desktop environment. The reason for this switch is that in some versions of KDE TOra doesn't look nice if this is checked. This switch is only available for Qt only applications.
use Disk Cache This option tells TOra to Cache the Object List in the Cache Directory. Default is No Caching. When Caching is activated, you have to refresh the object cache with the menu option File->Reread Object Cache, because, the default source for the Object List is the diskfile.
Antialias fonts Check this if you want TOra to use antialiased fonts in X11 if available. This option may not be available (Regardless of if you have access to antialiased fonts or not).
Docks use toolbars This option tells TOra how to emulate docked windows when they are not available. Docked windows are not available if you do not use KDE and have a Qt version less than 3 (If you run in windows you're it). If this is checked docks will be emulated with a toolbar, this has the drawback that you can't resize them. If unchecked docks appear in normal windows.
Style The GUI style to use for the TOra application. This switch is only available for Qt only applications.
Display alerts in statusbar only Display errors only in the statusbar. This is really useful since it doesn't interrupt you as much as a dialog window as long as you know to look for information in the statusbar when things doesn't work.
Connect history How many connection entries to save in the new connection history list.
Table scale This is the scale which to use when printing lists. Lists on paper can usually be a little smaller and still be readable. Given as a fraction where 0.5 means half the size on paper and 1.0 the same size.
Status message The number of seconds to display error messages in the status bar. If you specify 0 they are kept until the next message is displayed.
Message history The number of status messages to store in the status message history before the oldest are removed when new are added.
Chart samples Number of samples to save by default in charts.
Size Unit The unit to display sizes with in TOra.
Refresh The default refresh time to use in TOra. Tools which refresh automatically use this setting as the default. It can also be changed on a per tool basis.
tora-2.1.3/src/help/unittest.html0000644000175000017500000000504311420561767016547 0ustar michaelmichael unittest - TOra

Next: , Previous: debugger, Up: tools


4.5 PL/SQL Unit Tester

This tool allows you to run procedures, functions, and package members independently. Selecting proper PL/SQL unit will result in anonymous PL/SQL block containing given unit and an environment with setting variables and required outputs with unit results (via DBMS_OUTPUT).

Automatically created code blocks can be modified by user.

What is the Unit Test Script? The anonymous PL/SQL block with the following structure:

     DECLARE
         -- declarations of IN/OUT parameters
         foo number;
         bar varchar2(22);
     BEGIN
         -- definitions of parameters
         foo := 1;
         bar := 2;
         -- calling requested unit
         MYOWN.COOLPACKAGE.FOOBAR(
             foo => foo,
             bar => bar
             );
         -- printing of the results
         sys.dbms_output.put_line('foo: ' || foo);
         sys.dbms_output.put_line('bar: ' || bar);
     END;

It can handle only basic data types currently. No PLSQLdata (record of etc.) supported yet. tora-2.1.3/src/help/analyze.html0000644000175000017500000000652311420561767016337 0ustar michaelmichael analyze - TOra

Next: , Previous: script, Up: tools


4.14 Statistics manager

This tool is useful for collecting statistics and analysing tables in parallel. You can also use it to browse collected statistics.

images/analyze.png

You control the interface through the controls in the toolbar. The rest of the interface simply displays currently available tables in the current schema. When collecting statistics only the selected items in the tablelist are analysed.

Refresh
Refresh the table list from the database.
Schema
The next control is which schema to investigate tables for.
Operation
What operation to perform. Select one of compute statistics, estimate statistics, delete statistics and validate references.
Target
Depending on the operation you can sometimes select what kind of statistic to collect. Choose between all, table, indexed columns and local indexes.
Sample
If the operation is estimate statistics you can choose how large sample should be used to estimate the statistic information in percent of total amount of data.
Parallel
Indicate the number of separate connections to open to the database and run collecting statistics concurrently when collecting.
Start analyzing
Press this button to perform the indicated operation on the tables selected in the list below the toolbar.
Stop
Stop current run. Before the stop button you can also see information about the currently running statistics gathering run if any is running.
tora-2.1.3/src/help/extendingtora.html0000644000175000017500000000321111420561770017530 0ustar michaelmichael extendingtora - TOra

Next: , Previous: tools, Up: Top


5 Extending TOra

tora-2.1.3/src/help/images/0000755000175000017500000000000011445450571015242 5ustar michaelmichaeltora-2.1.3/src/help/images/analyze.png0000644000175000017500000017214011303312237017405 0ustar michaelmichaelPNG  IHDRsRGBbKGD pHYs : :"tIME  l IDATxu\[l`w'6Xkw&&حk+*Q]؞%]X|3e=sg _,Y$I@ T[ağT*MIN"@ g%*΂2@ 'A0;H$@ ? TBemCɝ_@B @Q!:sAE޾}r?@ AQT*$p\Ѳ8WXEi/ +1t^rlRoY!cN}e<ӷW9Cs@ (sQ HKIMMDA3SS[;{ K%\H)ŷ}};Nx"Svo߶m@c)Wτg8$wONC.# Jjq܈w9(3Y6O;_oo݂f^+n6g@m-Z*:LxM׷ٻw=F/9*RHnW3B5T)=(w۾v?R9M%ӗqٌѸY{kGF2Jywbɨm}}|v0q݃ ]N=&(F{J fkᮥ!2N-2ѣT@`lbǏ#G17RQΘneA;m%^ svp2&y(t);浳ѫ!s^O[u#_Esdt.lѻq=4:k'?N]v0^]@MOD2ȕ3]MiWM=0bK#-~PB$ܓw>/Z`1`!=(qFȜWkfz8óʪf^'؎;V7E80N4-'G?{Q۱NGIIIϟzL`hhddT*[9|mp(KhwPԕ|ޯiQ:x{,#$V2b/ umӱ3Jwl5c7gocf66/(~^X{2-]-ZˮmG1~V g71zb`]C:0ueE ]vkӼ1]5g:L`AI2ԅ?GN薞#FY}kDc2/1kF.Zaӧ! cȧ]SCZ#~x^P׶>ޭ;Xq1A^On=/j[Z',L !z{l.~>~.^bVn_<=wAȋ۩ wyzv땈Аzkr>m{^BŔ#Nm_#OX0_i8!7P ˗^z9j 8(99۷xZd%Kuѣ'OVɓoժe.jkgﰰ(+]vy[Gڙ^ֱ GKt]w;gI2=[-?{k'֏naX+ʶg!|Muoqmt^k gaӬ0z6F.:쏷昵0i޽ 1ό7ڿzy5g^!+ƊKV$G>5s7eTbS ?}{X~tFK4/2SBdq&̘k.5CNPv9G6æwnd;" &: +x"d]7\sѥ}pTW9"ň2F$C۩9/(x-W֩uWR7-d8zߍ;W]SȢq}<^2@a{m/^^zU]^|ν{...?~Qp\ffi)L\:dw\z ٣G\JW%s)M~`\ M< dioƳ_ߠij_O3f _YutC unλ, b9i85X$J4M+`Qe)RS,} 9prisՈ9q;~!,|qFNJsBDZ~`hPAhDS/1e*$OrMݾ+St2j jP~$ NX؍^`8db:| l:p1]>>snxH)vr6|< ˩SYN~6ܦ 57!mn0O+:1(!.8.jp8ϞwJ޻˗ǦD*(Uw=w/(\mUUyZR*T_x1]_1ِzpRL;1Yǻ) h O1X1ex,4 2?Cȳ 6 P9M_(^)2O o>rnΤg?g"I*+rlh>`6o΋Zך>7îUOrrhJ_e2LƬ4;0׮~fE"ŦHR!eP.KJ鄅X#JNѱh&XρtJ{.xTt1 46J:%.NE<v<죖 r!R EQc1Y΍9o86Iv΍Xbҳ ׋ R Jam%6mnn`2=4dyC6T[L^PѠQʹ /k[\,:oֱ-7h'{zU(ž57ahDS/1e*B?4040yH.#ܽ5xTNX(j96 01/o|껔Ԧ&dC^Ʀk37 004$p"2۷ol-0IKKg#΍Q\UOHyS^|Mr{v0wKK\pG|enSW>(l›MB̨ǁ~@ ACC#SQjР@ DBU\nId.ь$z_3.}ʐ4zCfMY@ 4 @*H*V\HI [\̅@ hFt\ZD[Er!PB @HW@ t!@ C񛙒$B.!5@ DU*Z[`s8*Ջ HH$?Ih4؜@  Hܸnʿ2L ޾y0P.8]h|C/Uf@ R> "qqnn5RpI; %_ $8]yPD#JR.WXZZ +e3A  B(6rn,Q JLMMb? EquWO&%''jW˳wcAz l&@ zP$AH2LJAV3K\&Je$AUŹ9YU%b##c7Rh&@ zPꪱtI /V=a5lj"襪L o@ ~.I(5aSR N+8 q0 R5h&t!%O$ŦL<3н'B: =K6JaN8Asc+O5`[Qe*vw/.^ VDfxL@tIb'8]yeNRѸ ]6J㸺~GkN=l"  I bv/ϪZ>.^dߏ1v pQA=>[}Zkk~'ެ`3A )4 1]u Nי}O2<ۙb@X8r7 ~ۡ ϼ`b}{ggٚI-zc Eⅹӯ6Z~#Ow泶1gݭ.]ql4=M Vu+Ͽ|f +vNYG͈Iz=g=!O](+_%%$lrIst]0_ /^^ 9qs{v: KCg:uׅg bI6C'Eqӟvnu“$S "Ow߇d=P\Z@~="Iܵf|;SBٲ@4 ]PU[F2W?]ś$^yhW|U/㔖ϷGOڽ Sr]gn͖M3Eum)f@ R>P*Xd>z=ǡ3CU@'oo%)TaZ l>Qrg]#JԖN@43A5zB!}/;FQd_͜sȬ_CmqtK;]Zjࢊ'pWH$Q) x}?5`Ik:#=SƄ-:')ZffC'Ol "lÃ4$Ӫv̾$9^ܒ_XyڝMcs̩#;tDcJ2|.#ĉS:;#:0ARo\yc;;ٶЗz'8ώa6C[Oo&5Ws]40,|CQyIs1Fuc(MP+[KY @ }A骅HItxI6R$;mXZM _[p[srwsS"vCqEo ߏzϲ~&Y 85y  4U}FR] )ɲ]+q9E{?ڥ6ET)i|{>]i`˖(Ui@RS2$2ڧ4C@06JYDbƞ&' ;aߢEWJGi^a^v^BsC16LTh$1wੌGXv,Et5*~"&dJsRZKY/"HeGH]y LfRB~5A Ҕ}E'$b"m7@ (]uD iIe ɺ IDAT; %nX 7.5ҕlǮvvU4MRI^-_ڳnY`xpӫxQQS[NZ^uS%֣c/3x{ݴ'u;57g*_Ц-3.m`[fYM)%Qf95md`&Nٲkz-RS%E/vŮgʿٍeOa-ϯPSZ6*4M&ڏ\~mץq}hV]n^p*4ītzi&XTaJkߩ۶=xY<ɖ@ Rfq_J˗8//Ϝ\^YG#s:dV죫]1L#{"1J)~7+zDe ://A~A3h4@*t8yo|9yBz !]SH~ʺr{ @ )ҹ F>ۯ=,k+?Ӡ._=z + @ ~.UJqj9JcʳQV!Pt!< *1KaYr6pLz6@ ("^&   6pT] " @ ݡ[Y * T044 TA _+|W JNJd0ꡢ?$h H%Da _+|W u:?>atUȤR@ ?D*[XXZ&'%v#B8!8`!Й0D(K.ar  ·-e2TF+_zEQBš$I^W-aaj ;: UB~<@g_t1 d%3J\442 ^)KXe}X'n4[e ?K$(V}$f:OutQS(Z86rvq\,΅ '([*em%T{'`5~_U65kTggg`ot3hrŊDE"5)[*em%vۦu$%ԭ[F8_,x?R*j̲dR ̯DAŋU.\pRsa(&W(0 BscD W* 4&_ TYV/k^S5r)uʰl+++>_mݻ'l9VVVL;{(UݹsG!!cue8x5v U(\g! A$6YâDo$7B[B}X}U3Pִ"6EN鷺\uM rܳwMpWov2AՌ&''kϞ=~[P}ORI/po~.5oqxrfI5K-ՋVlܹCSBJW%sUq\UT… ug}H2oS<ջi"=yin͇' lٴq=Ʈ'%I&4ijȚkگSoWM-c#&fX,3:77($$X"Szii>B_%([%m%?--L] s-W>,"H #zw&ȫ/3ěM7Vt˕W!$* 17o^yf-mσ7߼gGo^y^W>EQQE{׽9^ _kϯlS<1n`еq_5ivyfNݺy}yUu#MPl{s_->7q1η>3ad\~5qo7G^ߝC<.q_|D"[eԩ#Z %SnW߻}~wŧbAάrgwPm@Ce܊U[:S |8C+"#I(Cā#""(Z|(qz%;5ʰj1lZ_9Po֪GYH}{4nֺgHbڤogJbxr..[w"VLx}|]6qq3N{j%ٹo%5rg&;gBRg;&wi٤߈g?٣o?>ZJس>:KQ ֽj$gsmի׌iЊ!AҞM0dܱO@ڏRƊ뫦ګ_9%-;͐ŗ5 O&4)l>pgYR؀QK/81ŸE"4 ױboڎR`B窑xڵ1'ˉ#>Re/+ަ A!/u^{)mWۈ_U[h !qUXN1ݒV_jc_jȲlkč$Io|j^^zKI^p^5;3,݇pk1iXAǣ[6wumܣxoHJ$ɐҭ ~Nm?|bB7v6y\D泽 NTb#&!ҟs4MRSmէh fU0؎57skƐT 4 uNRR^QֽE0{R-rdlHvzL:Q\҅\.wРnӶmv _Hw\ @*?\:g\{Y$ϭ_q/6]F )RrU}Q::$͠A޴0rbj?sf ck!0ܖ Dt V \ČE[vZ|b<.l~kb\orOO8eTMz#|||wFh>>>ef&R2 1RCs%ggVJXϕGEM{o/h4?tի%?|O[ v)"A)"x&/@" 4Rm]cyhUDfysDGG߼qf͚[|o-R} 3I>q7s_뼉}8t^iEכem{I7lz~w3"fMqyɔYn<:@Y¨ť6\qh{SI_*RĴ sB=ubjiS4$@ RTápg,,J`OGQSתaZ|rtܝOnw^u=XҕO3H59ys*g7RI^IC"&=OWȾ|+G_6Ub1Be3 ϊ0l8j^S' bo[f\z'Qބt9S~j?,ppghk!I,+tB92l 7o^l)%p;x&#:)&?+R7TgRUD~bg 瞃\\P^@P V/گ|Ճ$*"U7 x9sϟ;s.)SP/YҬm-^,|MD[&,39LnC@X[41kC?P}D$qBI yfTĚ(v`º n#]ҷn$!Iw O?IqXy^-q8J˜g Z~_22JO4Lz;ub|h}2Xob.kyPf<;%Mg&DZK38zD1myK3 b9q\Ld2<ߤ2űM/E j,IƮc84ӓ?K2LI\&W/zyw9<Ʀu BZaS)ι,`ˠ Z?nd$?{u6*q@Z:hN:Rfnj2:KA:S2@<6P{L&&W(EF {0LHw(v1;V#L{=}i|^z({x?7E'Mt=_ ߵ~1pypu'v"Cn]њV0tK iޖfmA$I3Ҽ{ b̳pKy:N:6$5jl{US:,IE]^z4>HsqL\׊TK٘wH=j^C1}ҟ4D庢Rp`,չjI՛-_&D3-vdAܦYeI+7i\L7maQ2W&ID.X T [׎Vv`WkGkÂezC꫘['pb3Z!;tÜ^emV۽,V:#t} =Y//pI-2kzܺ 4/2[cNx&gຎ aGu+V̝;Gm#K.h|Ztl ~.Ĩݮn\yά [,Y[0fhwW({5m_ͨQ*_yyyfggd2-bN]llb=Ooש#HJ1,TRyt:d=FUV/keMa#TPQ|Wx} urrURtiѪիf:&0vP(y\N 1](VRofX|>Gül׸/q܂Pn2@ p*A?2GSBk`7zYk ;: UBtb-_rifffUWfЙJ@OOJ[`~H؝;wPFv\J>,Hi[ t:NE/_>תYKQR_>b%f]5}HW'k+ym_`gʢge @0e;w|*(ë3"nOuQ(8`@{1U(qvfrs?[[[At(k9_۔Mȟ7q^&)ʪzAE߾(?R*"3!v5}{9J8A'Ԯ30 |ڵk 7&b߿飅@ 0zY[5;m' U}Ve H$b2(V! .:vf9n EJq lkkkE?~5,--,-⏇>^VRMaTPl^t0;K.ʻӯ2(Tg~YL`(* D*bx<U*em%v?M UVet:TdefT'N&UڙqNg@fX,d- [|XG5 v*>`!Q@3%I0M<34vx ,::ZB@ @҅@ @҅@ @~+ƈ.ҍ/ @ ULZgo]3𭉄,K=@ |c oRW{h.gO@ Te^|(.:E:@ Rũ((?4Ѡ @ UFtorx@ ȟ T@ t!(wwB~D_}2rAonVu{!ou*vDZ ,K=wsssskҸqSW777777W&iP,b.>-[x;iӵx/{ƳVê KyE$pе*oݚ7quswwk٦oED5w_vwy+***^{nGEEEEٌǁ!OO"oEhei'K7QXz+E e7A[O> W+hv+****./6<][ݫnRTT[;*k ([:LXΉTbŴ=ٝ]|k h"*x".X"ɚxמ$*^G1TT)n.hMh IDAT>*":}Y~ӂL&ի-qQ#O@ȝ̼*~c%wwrbܾnC\(Kwn٢UEg>KwT&հQ&Eu+r'lҾ AVnCm[I o,vc'WY$O;w+S?x^~-Z2BEn~ӯwЕT4go#` ? aI v,KkP:X81Lc˕nvK1yǒ_+I⼀ga۬0Ѐn$GIW2e̞j(R#_u =}3jӑv>/+Ű?M%nG>:3vT"e;vdvAC7v<$J?(O[zF5y8R)MVеFvQ~~9zu萰[olń12PʘR^_ך+>{~˸VnÄ'=Nn _K16ݜ;倬֫O]=.`"%f CVg)-Փ%]-nEE=:dXYSeQ6τѧè7sa~Z|;E:Ib~棓9gXGJ*pDcfX0Q$M,L>{9C#osU2P4Y Y[6hI9ab٦q*{߁ٙcԫ^0{~䭈Q˗^G|RRMLY"sΙ)Yݩ5!M *v!DEEEE=im,%Jl=|O3\8 "Xz1e4= {7 ^{a?x_=hkεd)e241kk6h`@>LOC=<>ҍn儥"t׮xSWT`yzڦbgɯgξMÝd^!0AKms[^6QO7k{e;rdrωkb\m%Ʃ-r@Y2D +sHL@g?ڼO1)möuh(6aF Aj.ɡh؟)=j;12Kv, WР=Z4rfB<:C`D{dE*7Yߊ#py~wS,q>#5+P542͖U60=df'"V)O1n⫁\j"I@/r8~OӼ(7$uAmVeq"Li6*M ["?a@sMdP|t鏋9c:Lev&Ǣl 6)Ni$,%{RP#4vc(J )~G\{N3#M0߾?v%3`-ɺI~#Ȟ}( K>ю6KJ6ڝJr ֠\'yyZ(Ƚv3(Qry@VJ͂oQٖtEVPќO2Htqk .;hj&$)ؘaS; SF,]{#/K!f;GcL*Y{imh2Oh {Ku uиfVCĵQUYXV/hZP RpI>u#1"e|0lR +~"캬҇ °lޥ5$YC66`ܚ|2;FNkcP̊UetHa4>BZQMu~ب4@s (qN'xNk=L) ԎŌo8$}sZOĆGfǨU9SAI#E=HH$9{ ^3~ B~b#ǩ^G}RVSQ&JRd Zf\_y@1-iLZ-Z$TV m*ܿn}EJoUJ(2^е&G^* )#}/vsm߬mz Nt5F,Y'5#*%ܚeE)k :zC3أa@HW)4SfNv,f5Ur$#r]U#V %F3hh {^j~LTVUJ(ң">ZۘRd> t_C*R_^%p6b_Ǻ5r s1"T ()hӖ_Y}']JTaB;π&. OzhI"RDT:"b]ޮX?kz *`ED:P)5(KawΞ=3eEPWt?:t֛/B%gphR%)6?u_9"Oj}Rٯ .QXEy;{+GHT2lcLH;i< ? "*9K܅ϟ?BXȒvE7&aN8b LDfxۼ#Dӻ|+|`cU1Hr燜S'{aF)jK _{Y;= |;~ȿ*8g.kk{%K_Gt^ݼM!?..oåOe" 5a(xWiWnc6G[ htT(uס!"ü{r7SUϰfYA*ƹk*v$ BH|X2LXX Kwuz>̲IX۽WV_6na Vm pr*=_'{ ˉ;si1kgklJw{{{{!k_:ڠfH,Rύ;u35盨Q.Ξ:j}ױnn ۴}Cݜ݆Nϊ2/2Iw_=J"EAwzvνj)6?u_oUtWT˂ % KTv=8g psw5I&7`R7_wsqA%}|i44af4T{F'~HBX[*{UEERxȚ}6(cyy <>~E(z:MޫRX"sNE},b><--TRr?=!.U_=u|OjJ2BH $'x#Z)>85fguW#"C}W}SCV~QOOxsvvxvpn!.,4;26kXO:qLn=]c颎T!@Vlj"w"(:5-1\ȒZqT[KJ_=s7)wW^=j"AZXޖ}%>/$Y.mWsr-/S~QOW#PxcR,-di#+Z DΦC 5Uweǻ~ciU8H~{{9 wokU B$E}[jd,-5aBJhH#M;Hʖts*K|5Dddbb::f6zXܛRayF)R4Pn "K\*c? El>l;ը> Erpϼ=a6 "ҭ& \ .f>lq羋CS*p"@]i6/|ń=IGSzCw^ǾOxwg[ׄ ci,8|]RC촁 / IK*]n߭RɎDD7L#ȅLdvqy/fJ:W3%)9%C,#귟pz$~7]Nի$G!/Vqdے٤~r1 *2.1GRzi:%91r>->=VtB۫ ,r<4Զ:ϼdNi/bm;S D۴}IOCRZ*+W!P@R{ey!riWsbwoonia'(%Twp/E_>GRO#؝,~Rxz4ٚIxksd~ݵ GD ]uSfs?΁Jx)_PRU˫C JvԜgE^qդA / IK*]Qӽψޏ|0È[/e[J\a*0_#^FQ̼c:-CK 6Aê:rmCj ?QoMCg2w~E{bK ?_tӆlba'q0L$U#^>w/^,ˍey.Bp^˯FʵV4Eϩ!k[t iaAe_I IK[*]aÀ7u3ҬDEAJD 2`1 M.z2haձԇCuttߔ~bf}Nd|$7GU\^?sx)Ө}Q&Â|_PMp[͞jTʫJ;لHviVx6-Ϲ6)"!>F&&?y .O[t%|Ч\i_v'vFLotIӺ$,xT #&cA\Uy:-qj˴σO MAZZޖ}%>/$Y.m{RSB 99ե㭤viMd}S3j R9̾II]JJJGd$o 2ZtzZD -҅ @ˬt{+o{Mh0u|2,o;wۙ7 0ӒBK};aAпV%{h@ J8fzw[{;[{ێmllO-FH6ڡ3.^ٗm>v.}}^L+ۻO-fO{;[{n3bkC>קcy8TRavv-ltppo¢WKE;T))~0M{!G>Owv!$*~b|oW;.L0_wL HiZWG;;+" SM SZp}A3{[کcc!7q] N&[vol׷cGC{1Oa^YC֤G^q컪VUNAl}oE!6tĎg=qc.u^JS%aV̩ |WMrƥ~sOt)"Mq(xZ;XGbaQ$(~ŏLhǹtYFTD#fBűN{ 43K M Nw>&BvOX[;jN22hRQwG-<%&gրA+$|ްs2bS[*잾z^(qL۾T\pu U$KiWN/`WCMG2⃟@}S ~F؆ wNL t'li7MiSOH n*%o@Q6t~ǀ;sDuA~ :s71LrBHh%#` !u>6*dH4-,tGLH@Q54צjidO'/bHOxItaA Y~^YXcLFD9a= cejW1yHv'y+Iicc1lݗtqޏ8}A/Ԩ? IDATYv氮K΄7wt:k}xD&1 }.V wܣ񥈟}7$zreLl;6 {2%Ai FҴ{SJDWQǹKWBJe#FdФ&BwѦW-Mc ,Ңh{fO3dw[%QTUbH^ Ɩ%]lFWɻ}F!Pѳ=IH EF|CT, 8_ĉ*2ːw֒ا2tC5.2#b+Oѥ,M ;2V AQ{T 97,#*vtٳN\`u2a?e"Ȯ(f_+zKf]k|nv4֟ff"~q gg[hA 4er$2IN 0F;&xlÉ"Bi{]Td[SFCA K^' /x~Y6DDO=/EgO~q7`h7%gO"Rx~j˓qaw=Obg~~, }CRiT%9=DyWaBDC+#5 Hv') AtNqU稄"!I g'AXQ8{W^F?ݍ+Jawݶ$GŹoEY=ͽiiaӾ?Jն^W!XT ,C_V=M9o4(vѤ+}kјN]gZ\*tKzu3+@8/+%FZ+5G63A?)(,f/ಟ_5y JTvXp15E:~͗R!B’ԈwZ]4!yTێu/ :(Å4.aO>DDz|[yi}A4Cҡ@iș6fʉ qenw-uT&.DZ?T@kw5M|2LMjK{S֭mk1Uq=5S@XS3ׄ\sGncح8vݎ|vp0N> וuIƽsʨ'y,0T\QARH^Ԕd@ HNNquu)**x+)FlZ+Yf  /p ,TUzt%%Ǐd2-8=aĚ g mPF< :^tinB&4i ;-)dsA[&Vn]ݛȈMxhiI% RIdߖ#8LZm}2i22`ßrd6Ա}}vNJ(+; }ʭfOӀŲUbD;ˆidjcKxj4^i2cځ7Z'k?а].?W"ts8yqy rnodLzM\{(o{ >",ivOwY]X;U #]DYjj}@o_֔VĹʙak&8[3&fPBHy8̐ihl>f4^A΍㼜tkFqu63bLU lݳ?2ˬ˸-  ,ҌԇW֌p67dU(l9Ҷrp>6`Q;qt۳N e\=bKxQ _ktvZ:;1rL$gZ:CN>ǘx8*5'K?Tc5]ZjRlW9זG{8i)quN,)`»܍OŢys#mWsr-/S~QOW#PxK Yʁd2}o-clL$Y〞jEΒ{{c@QmmGQՃXMR-2x +u*NV7Ø&V%7D!$gr1nSs=];UDGB@8#ݎњYMT^0 i Ylg=cxHV8zkʁUJpGbH+݊g L;x/-4b.WU3v> a!jO6&RPRxc귖7Wp=i/o2 -fFED_rWDQ\ۑW9s{Jٶ3lU$m;ė{ݵhsAƾ|\T|SIpm5Pw 58$ﱕbʤ#)LgZ~{qlFPfN6a yZԊ;"'U(UJb‚ 7!}|kIoxz_{bݥR;w$EŹ*5NDT~4ҏ\*+TNJIJf_0U=SS>2BUKҿ %r^USӯR>}q_ ʖ)ɉm??> ed-: ! k>q\#"!<^QHLT_0Ȟ% zm_KQ-iﶇ{L>`Pv%_>pjN{yBr&eNKn6eC\%J&!m 9zhJ׃>շk k:vz@QnKxU^-PsҤJlS0Wx&B!^+/2DDz^sM4Xϩ4/Nŕ]2,{hN 4ۄ,! >d e>9xh2gUBspGRH[*]aÀ7u3ҬDEAJD 2`1 M.z2hrUey8\W_OW_OWi;M鷞,iDIڋrOp2e]t[l ~Z@E!xItr_)8E(;;a $8"V3_C(*~b|oW;.L0_ QIV?3|nvC.ʀIEx#,#<m]- 4y׵SGoz{tٸޮvNy'k}c]]',?!)rmz9Bv߽J)MzR@gůIgX^yűZU5+;] QB8?؜;מ@č y+=LY16,_k6Eʡ uvi/u%$(|7UιQCM $ %}uN'y0G ,"U `N!xs?X*QuX|9Cezӛ͒]W)<=DC#BH+v, ttٳN\`u2iߙ5\ gO{EXQw~׭̲NXS4֟ff"~q gg[hc\>LDS& 30iaAf wm8Q$R<-p y>AAĖQP@BRJ/x~YۿmTӳz_U4uWyNz0c꛽k:!ҵ/Ĩ6XP-OnF=M7S>IW쭖u35CzO .:>_8x'ydqSl<0],\H#!4}U~]1Bcc4%()Okι]QnnKz> zSj!*Z!vgXzC{V:E*0G$*aAfJEB]yQKkfyKgo}#G ,toEY=ͽiiaӰ_ۮ{Y_ުQ꩞˯YjĭzjSxz3on=\KGD=Kr6Nm(u Eo;phҕms+ Q^_Qĉ/!/?RB%PXZ=Kh鵮ׂ}G=%`d]G^H@8ޚ{̰0EeW rߕ9S!rAXY}t?WoNI>;ݕfp,ⲉzl?0^TkH*]QȃXs_;!Bة%87|*?jcU1T^ҫx\yYǖ/46Z =)x(h8[\97ҡK(tWBRit>B7(h@CGzT$5VI Ĭ2!±kεSnˍ|1'B8ۂ xڎ y1Tϊڗi:Yv@X L">a|!!18*>?>{bۆR^pw{g2uFu.b0ɑ ^\ 5VຓnDANm (H*z2٭jؿ'Bə-=wd [N*GTb?<[C56u[' dIBtLtPg0f-BUOd]pّ *B޺hE}7pÀQEqA+W}.i*WmSuPG{ ngz#:jmM+DZ?T@kw5ʭ8wNYbFT]7ԀoMaAf@q^^pBϭb}Ԏaju;:,6\R_Iƽsʨ'y]T\QARH^Ԕd@ HNNquu)**x+)FlZ+Yf  /p ,TUzt%%Ǐd2-tt*]JQ7%lB0ӒBK};aAпejhսԍ IDATlx؄Wo͝Z2 ܹ  -DmI? @*]V'#:,-M-i0)!AFHoCKH^KjYهj4pѩrЧQkd1 X,Q5,AAԾ,F=Ư\7pƅ8p FLԮĵ qb{pn_;3Cǰo jv۰<XUpNe4dZw7+BL!D-jmf4d'@ q^Nff5?_Y3ܐiowT*$fGf62`ua ,u^liڱ|aSgzeladk&Jie8yNKO|tvZ:Y'2LU%D(}5]:;-?SbF3-~wʉQ3骁1&Jd'9aIg2AaS.*g_]Sq? OL]8ĴԤ)$\t-ӧټJc RԪJwi) H3p*&${&n}.9-5!فĕ!DfafJ ?wSvyh?]Ś$Kg;&% g^B #> r sŧ4vܽS,M(R6i Ϗ4Bȑ+]Uzc˗)(匿ZCԊb__, S\rd@KU2Hw71\iW*ǖ_Xr:H LqaBwokU B$E}[j;.gmR6^!ĞXw)6["'U(U DS% eb@XhHQYM>Y'.ze7]兯2i}ȑU8ݾ[ՉoF 奊W)I4S_̔tdgJRrJ҇YF_Hr xIzw JT"C5.$y]y$.q"Y^s܊NHy{uSc u!Dn{ȿgTXͶX&I@kv2ƒOι93qU}7&ۻ*ȑ"UxEEW( R> 4WUKzc_z6yu`^ 9rm].Ή |S3߽ϞS)m"hzý72*~TO#؝,~Rxz7w/'"r~(I ,%QA\at#Ew Q5;3H=q+]f~F2ڤ'E #O"yMZ 8.4րէ]ԩ9:]=zsCVЎ PeYWM6 4OU;X(SPuN# Ԃgcy)_PRUR#motEO>#:x?È#FZoYv$_X m+7Xq0TSYn]{G}sf1̖ѴO2ᄵ}rLp}!!Q!k d+v \M!Q;O2#A_I/"$,|MKUݶ=4EST3BRˤ2 h/\yQ&B8kBr!*xa<D!$(Q*D8Q˜U($IVͧys*Deږa9Cv@X .)OU뿻yM# <ק-};`͗QN/rR&9Ҷ׹Hh܇ov3ђjj3h}i8ì !̀A <bWD!]' ڋuӼ qa 2ZI1TBTu\4 3AӖjk:ppک˲*pj[;BX!$(^3ijm]o?8J"q:ZQl\*'fOs9ZsmwCGJcR˓,Z!9=KOrU!"}2sE!4\)\zy Cuﱇcr*j=v0{M`Ey玴ZťMoo?-NiOqV @I nDPfPͷJi]Y٨ S9Ҷ!5%!$S\]]xBHg죂;oDExpn˘v 5?Һjo-eqsYT</+ldcr&#|i'7v{{ByuFzʚLI AcqL~Gw_z-!UʼG#G_t%e\ 7Ɉ~^>*7د/26P{^vdc?a&O{w)eds\}*ׅ9ìJB(ʆ.Ptvn>ŽHHrE}lnSpq},Ɉ(g:ral>~:^&J$Dk~+7|IřsFE P$StܧNI<$nUC-E 8DϼqK?eRsaA9bpW3 zOVLɓ*e##motyW8F-2>XcYїyh 9nkA.ϔ̇u&D 8q7#8ʝվ((zQI~9C;*~&VM _-ܦ⹎l;6 {2%ߌ:Ԣ: vxƝBQ6f(޺Y.-2qL9$,|YH~v[ +O}(*sW#ר?$a]US+gfֶvk7|Rϝ>܈'Mj>A;X֣RM' ]T)IiފleIn,Q3zU=rnvz!TlzOGaeB%'h U=+K~é'2;2+d}:L POѳ=D # (Qѳ=St]yz.YӦj]ʳ rqwm:yM'Ri}Yɺz[! E׬}Vo3U 'D uQ!"~EvE1Z콗kU]2{Zs7zjQ2jc|M\%Lf`a;/xsv5;<ά5_}t(Ԥ‚ }Qen0e:]wU"UxcmJDDԃ\2l.BHqߥ %cYOfX}WP5|Y'D<^\5vJ?WP |i~jUK'ҧ =ϒZ?ByA#!D paH pD DӒK3˅ΞV_T4}U~]1Bcck1' zB4/oNGoMbm֣Y8{WFwT횽p٩m 2Uld}:ѭ;ݕ DV0U"#!A驧tcl;ŜC'TƔsBnr5Gy3"@$|PKR6_4I2‚ Kl⺄̱W&՚H2쑤ȑ7U˜#Dm.vB؅SKqnTV/~k8 kUjW]7󲢏-_i4m Mί.U/) BD$UGw_#$*qxsb4({X!QE˰ˏ~>K!aIj;\.Tf%O=$q%XxV[CZҐzjGDQmCEHXÏ21\p鿻N b0͛/v190͘ڎ y1Tϊڗi:Ywq/_eω9vdϺ5}u   42,᤿ΰ> 1{ך*e##m{-r佂Cռgv:d@&*z:-!D5h  LvZ}6BrfK- "~q;Xv9CɲBmծuFTv$"ֶ}!D޺hE}7pÀB薓 X]SMY%]T=EqA+W}.i*WmCl-g>6Tʺۍc;Җ/!DHB`ح8vݎ|vp0N> ץ goeDiɻ:*Br*Uw9DH)BwNYbFT]7h;Hvt.u:x?{d' AQlGGOl]ժUQEŁ*.@ *C(@3%T |қ{s\.tX{nW0{ H7C(ykS}6Bm\*#Ea#n{{_|y!.VUUb6o{r $d}R3<ꎾ'aA_V4CRMLI$ a}8gL#[:l PAzpzJ9ݬ 'ٻa@wGRK }O.‚ lBh;SR6DKphݑԒB_ /d^dt[2YitC]چ4C:͐n558|nXؗa>4YxcDf=4C:r˭?˜flf=l˹ xZ5fD3:P/hddn5h_; iǖqkD3222.3Й<~Y.}t|T܎׾ ]cmlH;hV?ܯ%$YaAnnu_ca+xEZc饧?F gehW ʹإAI3GNW*ge?Xm}EQAaQs.*]|X=\_#" ;_g S¢.*m*q*sgQ V>v# ,nho2AȚ.N?[X|_.y&Kk|bV,f&wyOa/k# $‚ vA_ Ť\dDiYyk0wN4{ރjOm9#ntk30h{ۦMM4͌?읨'lϡ<{Zdb ]+P]\b|\PA[O6; gjm^:W!I{܁;O^f푵3$RhtaAn xɭWy/nO3rկU UfO4HC9L3 qۿX3ӏܪ7Y(ch^,j::̓܂‚g}\y靰#6v= IDATM=rrr^E`,48Dy=E@ܚz~S)P]H=͎eQjHTpGZ}~+%+5Fw6,8QĆ(jdĪ4bBSՎwtcĈbiH@a v7oDA#zR?M !w[}!ܶ^ ?測(i !rÏkiϰfm߁gC #f%H t9r޵A'O?ٿ ׫=fBtfTqqU!4Ru ŁBVY6r3Sp6U$piZq ׳wIo%HIEX9gWoY`!y}qNnvWkıN-ԝu\*O~uVn+'a!J2GvrB\.777ݭbm"IYRfx7}O.‚ rv,9 ۇJ*++śH$Odtt*]JhW@ @ɦX;k޷̐0#K%'aA_f+݆^ l.c+ECm~V$r@IL/'?hUcG1[/6CU7*qmem+@/wYc<\\Gp"'yZ\ U=;Jx]ٟy;;P> ,ҝ~Ǐ3Ƹi.B.jϢ1\&8"cQ/e흮tKMNIؤ)$*H{_K\^2)+ 7LWZmCu5.Gb?SƃaA QuPZ,Ca5^ʥK2GWBa_(7[|JfȣfZԘ*ٝ_GWq#UIANqΎ>YlڐTPc>TUV-Tđ !އ M8:{U24P$~t*<'] a#ntY2g9F%矸%)W{tx彧xhh~SlgwJH.mO&r^FvM~91̬EһX:{|;[N`Je<\o#<+g-y_E"T:ctY=:yW9lA:Ԧ|yR9AdҤҫ Vu9oWNS ^pninfU"gWGG{eή.ήB oxW[ DR4qJZ5xl @8ËݩopI4j/W^b F!tg\YT4@B]uTx2G:X2ŗW?2kՅZbq^otQG}DLGԎx[P4 }$^}'DuǹFO0E|/peִ3oze|SximY}a{ C|i!|3;Ad5]uWiE&Cu}_qۿP˯L M#x> #/F^k:A8e?`X7ځv6G >|l&ᬒ kc[f,\M= hdG4 N7.]5ݗ * *"a[ǜ.[@V]֩{J:t.7,6!pv飓nsm =8F}fyY=l촁 H7\sl6G!.33pviɭA|e3¾/e.:b4EI~0RWoX^RŨ:V3#e;B/e"\nnn[UUD56+೒IoR;\A@YzXrJUVV711&H *PPT.@ /eefH8 ;ZR |rAezG+96&ZwGÀNlL@l$$mHI  ] %8&P@Oør,grc\ڞl/owłul1LLeS*]f4+C:͐n[ېfHҭ&20?a>4YxcD=4C:r˭?˜flf=l˹ x2>NM3 g ZhFCJcEfdddn5h_?nmf>nJqWLp`L2f` \VOcߡrB͒&B!qcmY8 q)o3ec.ou=E_o~c,T !~Wot}Cu5S+T>;aΏ!G>(VͲ#.7h?ΩyxfI /^Z_mM*c׏Gc &_<~毴"V%r; ZSYyqfykLQ'ԼyKl#ZS .N#B83^9c8|CV&wx%#'S&Ad{E,6lPM?gSbmIRٝ;- _6t_uF-:TlԓmJiv:`wrcd>C?p|Ze+gm)dK 4Y[|o"'v~8il#qdJ#':"5Y_a.?q }-7smK 0j0fWju[*a81 F2  =NT 9'UxLy^g'UMգvV%^+e40NXbt[rTM;nkw:^:rگ`:i\65HA[/mRg-o Atqz]w`LE~o W tr.NJg( n-3 s|O= :3Ժo9b.uTyeQL̘1ͪA@i++̾.&kTFƦ&tf NV5465169'tˋW_\ [ DR˳raNhܧkDA;؈f>.ڠo ">S$P[f ˨pHT"BTDT++^T6UjDF^#5ߞy:;*'hǽ)g<{ߢD4Ss:Vf& 8?M97:YfL$ ,TO;V% :AtLṱ+#C3kv *T5+nf`9b㘿oExCq1[^LN^L~nUnLЊ37E@DAe}VA_Wu`cFT(Fsz˼_Vr׿yu\Vg!!+rjQ !^먐k !9LOt\k>#R84Y+HdpX%w<.k HdLL$ ,LO;trWLi|Sm& ƈ3Ґto::߈8!F~z՛8'B) qʷB "mqYQ@P54eC +B^fؾ4"@V:'G!΄ܼu}ڟ~JmܖOnv>b]E7 AW{0ЪSrB_#\+, H%vafX,\Qwz\#`l1A@)rynUUU,k'ج@n0N{?3%VԮJE38&Z@'KIaAHHYxQ%oaPTee常xciУ jXFR*:l;<tL1LLeSӕÄ) C-6G]d0r+~5p6@e6tI26fNi_6TxfoѺ] =Tӛ$DCդsŮ]u'7W6ŀMo| eG!~ <+Cs\kΎNk9ֶ[%n5va{$q3 b$ #=D*pa<õ1*9}_쒔+jt:~o-N [#m[`ylWn$WMR%]x[ubUVڛ'ټ4yίh,>"#&*wS*_|._nI ye0 s|O= :3Ժo9 ITQE32cH6 {trN߮6nN>F&S88:8z/>k/m|5tvuqvR(h7Cz-")P յ` ms0qW Y3Z__Z)ŐZI 6BuF:;8 ]F4U9;9=IzdDTjuv4֙F6lF1jnuNl-! *6쒹$Iu">k>oChW_8\L5a^%W|G( IDATGnsją>׋$L‚ .^vL;u"(>{NQu>|7prE薛ªI I 1giBK'UG}[b nI֕3 xfܣ{'~00 y~8ÐPxzR )M7BHr獄 0..w/~}"u}RBUf F!1jn>1UU7EcXgC2kb. l~I440F#{*NmH&Ad{tqg[&z u0R˝T0KͽVg"Yh)qKi8adM1FW&`#Yl/83/ds rF鍝]Iat_24,+vBym/FXiD"*sqYQɔI#A@ivWRo7#-^#~%os#ae@!%)rynUUU,k'ج@μo?I)!ٻa@w'+3K?>~g繝K]q=^3afpL|DҺ$Y@%XrJUVV711&H = o4N[>)V_cѨAKG˔I#H~44_f<=]1)>3gق]:{b>YJ #wmj·‚ ƞ. 0dK_ad8@ PdinVf0$  xyt{xJؘh  ;1 =$AпK.^dt'aXt_r8ιk=T_߲p2 bˊ"T̄iVt!PW!͐N3[MMd"-a?4Owލ}htsէvɉLA{it [[d1z쭗se|fD7ϪZtGiFCJcB! it[#2*Q*vlF4##3;)?.%NzjиϿ _ᖦwx%GNsici/C) Fiix*œ*ge?Xm}EQAaQs.*]|X=,75¢?~]x,-dO= O7_oy r5yg9ըyDcPg;= wp|62vg,(}rWo^v{gĵWNN.y|eO*Q8)h@c~ދ&M-[(|CV'J<&'S&A ! @35|Xņ ~lJ4ɷWUjyKvaH0mѡ@߷2dn3ާWUHUUV^֦M,5("*\fm9)Ul9il#qdJ#':"uROvp #*C}3[8#9r.Zn:XnݗTaaͮ6F0˘I#H~44_VR;{NS턥^+fIG O/GU9kRD\V]ʍzzi:[xCuTyeQL̘1LLeӎWW}\4 M=z㣩MM4͌?읨'kiljbljs(O)*Dg7TÈ>иO?X94׈^gc#kcÔ cbluC[cJ.xY؎YtsqDSN9pEzTg->OsT/\:6FL\sMACAiG+]~VmD1;E(b|j<-(,xzzև z弊XhHSkj[ ĭ)7Uk" >$P0 y[8i^nv. ^S\kGܼWwjcT{od=Ά'ZFYcܺ6(\G_YKYASCa$9-/7rxцo2 2 -O;X⌴WЯyUyZ嘜T_ۿnn;V]؝@<n;F_͖^Rv4 oGŵd{nW*QzNqFy{vdk܋>MisB76P24L9ymƍk9e$$?dd/Cv'J" ?v?At̃[WFf dGnUk4V8f5fs*)1z#?.cr &eƠ˲> į+:1Qy !pbZ4cqe%!~G[i[yfݿ.U "hz6nUnLЊ37%B}ngIH!༶duS#4"a9T|#12 bˌtyeсϔƯbݻV;n}U#f!fhd˦󛎮2'333ٯ|V'fHuX&Am ?9.f4#6ěn ӶC}aH:{s ]эl|g̎qP+Ac*BitkQ/op3YJ'GYNnܞc3 iOyY51S,iFFFn3H1ŕE Or%~!`;Eٺ5K8Io/Jqa - Fiix"\nnn[UUD56+))ebc%8{w4 D駓OT*UYY9..ĘD"!x0(V+Ѽ:mN>pǢQ2) Fiix {c {_ )Ł%A@YtTT.HR/DK8 ;ObH J׼o?Iٜ!ٻa@w'+3~{G w B_ l.$8+׻rK.9}'3 []`~.[&A ! @YTJ:uP{G{G{k+k{{G{ǡߥU#-4syiBN~x{>nc^mۇ.Hp\S۴H ?yЩK*`cX1^FL_X #DƄt!4cǸ9k-f"J=eUjBW?8{Ӡ.~4$4 Ǔ.9jtr+OH{ruL1LLeS)+XLt@[%ޛ"k' G&U]^>jpN٣# W;{U뺽W)JROX￲!|xCu-yvwdP_uB}g.ĕSDPef<&_~{2Oq1%S7I4)CЈzmjWXyvk^$=Ppq0|CVHJW,L1LLeTkf˗OW yTٔYvY%~q#wd$ 8go_Z[]w5V[1:CD}ɫϡSקMi M2Zk2!|zDw`e<NP##DTԵ:N$itNk9ֶ[%n5va{$q3 bˊtY2g9F%矸㍳KR<ґJajU'vX n˨ޮ)Eeo+۶|)NӗvqR:C@Y0+9[}j÷$*ʢҙ\1 bːtrN߮6nN>F&S88:8z/>k/6tvuqvR(h7Cz-")P յK1E=ySЦB.}(WWgKԈ&0g''4>I\o?L3{B5:Tg->TvsT/Xb^q6FL\sMACAiG+]:#~]vDQ|FSU|$*)!19%n-7KUM=bӄn?: xqk4PtH յw<1AU׽o! 1g`\\D)$%_ZoD5 6މ bwt^VuP6?$z]^ rB#lqo}ጌa'G6t FiilyJg>/~e`OY #/I(:+auV+2`ёh86C{^H={QisX+wOJAPv&eȚcTL4:236P2Xx؟W_Yfqop-?gu̘1LLeӎU4.\p1b϶Szcvx2>|l&ᬒ kc[fI4dék?[Y Bw#nyк>"K1!wgœ7zAȢ[0ĭgokyjcajMbiHH!༶duS#4"a9*HdLLACA2iNB_*f%kǶC !L^wdEU%<ڣvkB}ם# 㚐Ol,2aG~:*P]ZQuY^1~SiN0u9sFNxpd-1Z3^c@ .Y뤟X( EslϷܷ+76 Q8)d*ANq=t_$ )0Ν"LlK8*^/}[qa - Fiix"\nnn[UUD56+3ORdefHphO'罏yn+jW\yLآ`!џ.&IA !eIiD/CRMLI$@aͫOJwnFmd Z:D^LACA2)ʎa]̜id74QV=1] |Ԓ)Ł%A@Y=]SN*]J$K;t23$hdgݝ'1$A@XŃ`;SR6DKph݉^Q& ,]BvЗ @ = ovE_mn}W,؟_˖I#H~44_V<e&L2 醺ڽ it!jj"!nq# YnC>U7[MNd :ܓN3-g ܊#\,iffoۀwp3c! it[C hEǂ馁͒&63UKmi[r{I5:Εm NLACA2s}^TPX`EEϹ vcjXJ`<"ҋ cpNu|?,,*(H?"~UfU.y~׬_-?TӚ\R}4& _yOJkEIW$QvxǕxR U-Yw%#ɔI#H~44_fh;MUZ|-Y.Rim&$@5p[t(;LoԷ;?luM!&XjP0DTr{ιd|xy`pV ZpGXsN\tj_̱ݺ//pè]ma81 FiixډJ! O 2+F#*N8wGJWtgi^`*Vk,I5x)7>}MZ71~ ^=/.NJg(S9[}j÷$*ʢҙ\1 bːtk30h{GSit'4;QOXPнD^}q-R2Tl1I.~So.Uxuo0%x}n"D?W8^4RfϚ[.f5W#SMGتW,sHԲ1quR MACAiG+]~VmD1;E(b|j<-(,xzzև+mꙗ*cPqk )MeCubu z xMqxew!DPs\5!\jH#G_YKYASCa$9-/7rxцo2 2 -O;X⌴WЯyUyZ嘜T_:Qvֻ;%y#v$(Lb/oOƼ~7g/7x[T)OZH)yaU+3^@x؟W_Yfqop-?gu̘1LLeӎUCI>ysk{Z]­ U{Ɗ٬&lX%<>s8o[/bpPwVW$@:Qly;. į(|ùp{W9/@Zk{MV75J#VɝN3>ȘL1LLeUgJW1݈ Y7A3ҐN342XeF#zR?=}=}=gzitZQ'ܶ^ cbF30bCȐo>m[1T!\5uWT&~^:lLIDATG,,4'6$/@j/ sS5["sG#"#ae2 2 O\swwbXȷ=fr=<%LlLgݝؘ/triv.vWz}τ-1-^IRhdA@XR:Fb[>T*UYY9..ĘD"!x0(V+Ѽ:mT] wx,1h(y2 bˌ۽ JIO_aO!8 /K$֐inf>N/PT Y9-A$;{w4 a8z7ٯrQ;esYzuݙVGS̴\:LWzzz +B">x6m9!Z[Z˗Nʖ brȪ]=]œ) Fiixڙ]|-l*!*>#kَRc>dw/Nq_1\tmCUK~ <+CsTđ !އ M8548šßsrө}0v뾤Z #lvSa81 FiixډJUp*xkcTr߿%)W{uV%#vy)Z+L[ٝi0>VR2鏙(df- `=Z Ar.NJg(S9[}j÷$*ʢҙ\1 bːtrN߮6nN>F&S88:8z/>k/h1-PhoxW[ DR4q+CUorݷPtM8Ňjg[(aRD@Tg->TvsT/Xb^q6FL\sMACAiG+]:#~]vDQ|FSU|$*)!19%n-7KUM=b(B(o[ ĭ}@Q 7Sh lH_ vZao!j<|3d0G_YKYASCa$9-/7rxцo2 2 -O;Xa϶L=xaua䥖yEa{%jETxS">:RqNY ';5>/6z4<yaU+3ێ&L9ym&.sV'ˌI#H~44_ #/F^kl|9e?`X78a7aw*l0qfr;ฉ;t86aw 8BZ;Hx4L)P0P34$O[BiK'fHy構]&#'!=o H.|knX n|L<6Uhe{yc7ɤM㖒y*]X~I7"(S@89<}=p+j7#T]Fii):|L&:tp8=ɳy矪q K/GaQJx6<:W*P9/Wm] i%ZP!XT:_(}]WK?ll<D3mwNwꥷƾٷ^vǖ5ʮ6BGOCOCfOqO=t_^8ǫy?q&(iN=ݓF %T*w+YbD yǟw܁ziF/8]t88?Jf@)nW^i׫䟍G&Q}49HQ,q >lB Ҥ!Q`bbUNrQ\< .p'(WG|Ǫ6"*1D뮕$<]Qc(hG`6%EQDmj48m۶k<Ǣ3jf,^BJJc?cBs #j \:fWN/׶8=A$ tфFSBnhwžs-k5ŗL)!ͩ FRZYkKipHOg$ig}׬%r3ittb '٩8s" KIc(fԚv1qEQ[Z3 3cA, 4]4cPSbMrGZ=6ybG!Ag6N)ҳqgB#8fFd8YԗiI~p 1f?ȧj֬o MjL,fc1˜bя`0厪^OQI+4?C22<'-\$I28]|B't3MLĤ򟅕B34X$fi{eNRQTE}x3ErIE_wo6=}4:_TU=\#. 4C3.4[(' J6o 7~O>);~Eeh4tpp3 p|4k+邲w4u*LpN[ZdY.XnC-[!DU!MZbƉlMw9I?]`R,4B*^ AP*Pjڮ,S绫VI/|gOsssKKKUUդnpf}]< "֯SttfXN.(s+ikq Nddd-+g~رcϭ]̳ϞQW7qmx, ͙3Y9ƔgƬEO ݅ *fhv:J2 pB?#x=aΛ]b_|ۻye?o|g X1]cL{4@34VsX 4f\OSc jknI^x?y7jm}72:%KA/)gӶ-[Ԕ: R{NnN\nB1#,ٽ[nK.Ã'^;E91x{mݼM+ ?.TFј(s~R*}i"t@">>N͓E3)R\r%8$T߆phW^y ˗GާTx_7HDKӦc={>sE~Y"dxGSDRJi*e:"H#" lB*hӕbK yr3fKLp#fz>&(bW[>)CC[[sWDMW"qkkg)d(|{5S烄XcڋՏd-֩Pi"{Lx@9a`oB ڏъ@E*TU]]Q$y.zNh$uo^,EcީS1p( RϛPFx^9s.Ztb?wÙq#?p>r"3gΜ5{V2h?EQ%А$IrDb<t):P4GA4!p~W$;;544SN`(e˖=wz (:>߻`0Ōv>M:<<|wxxʅ@`J͌g=8]A(ӦNX[P>Ȓ4eI礔ʲ,2* ;ݨ2:r;::YW[[QY)|PH$s'w~IENDB`tora-2.1.3/src/help/images/charts.png0000644000175000017500000007124111303312237017226 0ustar michaelmichaelPNG  IHDR pHYs : :"tEXtDescriptionWindow Class: tora4GpzTXtTitlex /JT033TU.I-.qrQг2452T6440200040UNHMTp*//N-%BCkJfI~Vh^IfINj 1SRBJ2c^- IDATxwXSW {PqOPR'Z@km](Q[qoEV܊R*,2?@Hb$\y< /sϥ$z]!(  @QhB@P(4E!Ar;E&qS*@=u]4Dw|BYzfJ£>ݐV_f=~ZQIp\w`akA֍v[>ʥӠ1SGw`Р6 }~/XRn' ײzf ۓC\$%}K3lu~ӘȻ7/mpd48@mFg]4b~+ Vl$E8~W}O*'Fuv<Bwv]auѳc޾f,#$U(GVؽgn}XXF[5sԐ>^==:v7ijBRp4N~Davm]+$'f}ă"J_:BN\\1̴ߟoc=;4'DoIS[8VⱄB´too.>,:!Dϒ邊CBa+p9,Ǵ3fNSm)*I/<1ah7URAQ! !Ɛ8a  "wL-e[ МM!fwv m鱘&=n[,BJ0Lv4+[ZTDy%мf܌{ۯB׽ȭoS4 \Au ڎn~pBoҋac Zڙj<)ېUiKtă SnwoeP_`p&\':c¬.zu`Bh3Z/c']jmP5&f5=@ޑu]@eBq36!4m;ފ#,.o]>|̃r64IҞ,hKOz[zLB'8۞S'L9-qM"ʽ{:өOScX^>cQ͓GN4r4ceRḴx&D@h8n?p N8TU"[@%' uBuWe ݼ·D"ؠn/4E4@(3^IA!íyh4;Yވ)K!:JrUY4qqqȇo ^;/qTdWbίI~^=QZsrTEE *T =#BٻNR>hMJ=!vȸFoXrc|%BE.S{Ԭu3<<@#`:83o-iAֆl Vd~=?iU׶_,)kx]T]jwDe>$% m=bf9? rH6f"lPMٹyU7BIzz/Mi3h C3VWc[C {v{i$hd~XT!% ef7w|kv/ģ@#C mjŰe Ą_}\ϰ%GN֮Eۮc"?mѿc>3e!)&mlocŀ侫OZu_9|Kwzwj7] wSRb6Lt !4-k.'%ϳOe)X" mqGXr/ X x~#rf:uQȩG'xQF!BW!+3ouۏ;br?þ;abrJ1#;4ۼ؄趘9Kcs>&ocߔe)6f:~ci m-RybFi`n\qVϦt5dИN[3!fzlS| _KW_3X m6ɻy$ ˈnPwk:Y]՘A! J]g@MhFy4cBO\}×ИJtNAxZ(>+\7g.l:&gyd/[ziqi棫SK%tu)ebA΍?.}eTgp7P ͠M7N^MV֡6Τs[V| bІ0jgЪ[_OKĄ&hq%^͕;ìoZ{'utuYii9tzeZ]8+m% c ߛ!`fnɁof>nϮ[S휶; C\.!-Abnf*].;'Tލ*M}O]?ae/}>|(=h ")~5ɴasU׃ƭ"һkC{k wG#WGp7JFA߱/*U]~u3~7FuY%^E1æMӡ/6@u[z>+ g'6r9}|,փR+Ph>;Nx') B>.N']ZwG&=|Sa=?Zqޜ7ldTC7th~8dQrgԣizWo ][i7բŭo& # !D]{8Ĺְ;LK=uԄ.jT?q ͯq;x#Xv,gN]|{?B h4$|_.|."uz v^b%J::Dʯ - ZNKw|Q  ^عl;˧׃f[k&tö,xLa )Ŵ2D%_ZzЄH\I9|!?zQ_Ut%փV4Mc75ce/ ޭq RһkAW&)M9)bٻy|}~fi4 փ1) }v7vڥF^W o zzh1ioVE<~zts !⼛[O?=.vKM _ o-΄e.nq*Ukk;wwU0r9NWQ}=vMidzAc-HYHߣDD)E4#;k4d>$SӴ[?.RqFsid47f/:~TcqJU1lXtsؠEڮYd.q7P]_'5Nj ۭp1X1N_4_ـE)PH! i!Rr*5q2aM  V\in!|B]ܹJUw*܍8k\NW]Ơ%e/ί 3ȻSރƄ;:oo@CöjMBiiQtu)ebA΍?'"I .Y,=T*dn\* #5V[Gpjcfۭ| jlkvݻ%ceMsso;hulʴۼylY]X+uK:_ܹ]0ttx? ~&fEO|5tJ7_)=#Ru=h974PJA+QmXIt 4B:vW5mTck۫ ]P]}gƥ5?,~A@5`00 @QQHbYhP3Ơ0@Qh3!*x}׉^D ]fn]PZ{9mޣS, q6եyy/cn75m`]4E})(9~T ]ox- P]hB@C~wԄV 5(l_늼~4uIG(ԩ@@יMوD|jE[K1wa,*x}׉^D ]fn]Ɛ7\4;'W4Z{9mޣS, q6եyy/cn75m`]lpjsC(Ks9iɜ`q=^2}eOJki~I*Pj1hh<>~HAZ~twkN.$"AIvc weJ3Idᇤ២oŽdήE|1h묍Ko۵qČ"qS]/h> ќkff!ҍ99y2TR55kP yFԌY #7~!-~ǣINiFOFdUU@Y7&  p|NLQc8b:͙*AKMI\.9tu P{qqqu]B' :LP+hPZ_A mXox4-3g/2!~z9?lD#Q]yiox ]0}ջW=aBszr7*]]N,K;ވԾrRŶћil:!pW[ѐq%;+dQT- IDATY% 5VyВ"}j#+_p.[D)_?oKէ\5O/戈B0g/p+ycp~Xs6*[']awsrvyi-X/!111111#;Q% z:VlE' }>}8i3 %&>kHK=˲7,+]}|͔qLVS/ݬ34;ɄEFe$e`cǤDBht-s{S}S2W)wgc |_8Lw sÌM |NZN.ysrBH>6%)ϺWiu|񫝁}t?=ia(+R*#>,QܾVڗ~X}OH"OL>(lzF)©n* hsw dHHc0e BXvG㗛b_O+T=yT]jlԹkl 29["UX~j [q_YwDG=f)]vPFg3JA=Jp*ZuiŴ_~]=YF$"o_(drm:F~3_y67fR|onݺu60^qu*c:+b:4 B)Gy>i_^?E׵u3fZMB{2G*qr g2ȄSQT0H/OoVdƀe&ӗ~w-Y;ofy"*J/3nʖn{vDل"zs|J&ZhTLMTQV"itZs:}TbD"q:+$Gr*VY6ge'W]QW֝x %i Cv"*zTD${mLP/q@/ % Nܨ\q7b"d;k-ۗ䵯L9[.&~VܾU>VZJQB%uF;A>SaC3emul\a'zy*s{y9!3  `$NOНw=d).Xp^zh5q=&$x.]}Q*j⬇a/-K  ODӲp-t_FggF9g6?+/j; ( (4E!(  @QhB@P(4E!(  @QhB@P@Eɑ:q=*l;A=N~j @TX*<Fclz3}2 i/ʬ7A">5i,l#ȺwS7xg4f.\Az0]~ ]:KA]T+'/Y>6:7'/ 5{/:2d܂owp A7?gV3G-o"DT /=zY$4osԬa.p㟗SDMD[ۻzÁO63}+rHJ,[bܪ#ڲZ(hx;F^ˑv^+|%AƉ>A_:\A:^/caQqR:OL?A>Xq`2JD\깂Gy%мf܌{ۯ\^iַ*^:0Dw47s8mP[-#\4qv-^F⃻mUvq?.4FF:FoJ=yqʙƝu4 va ay|ϫ?.|}^Dn3R¬.zu`Bh3Z/c']jmP5&f5=J ԋa=g8~RM@ĺa\˒g:uy~lBNo{vN[/vVLSwKz/gopSC4(}z>ä~MFS ʽ{:өOScQ3ebᝲv$sBwqf~rpa&­KG]Wl D4Au4Z#!hhGų;XFM-[W{ dy`&!E!(c\.W%u@CP^\\܇+hCs% cV5:bϫt244;'WM։݁u]*5ة#)s3S?XPɇKJGYo`$Lݱf%Ǐ1vWX@#E.S{Ԭu3<6~m̖'D sn475!V^FfS7<3}5rjR&!ø뼨^( +#;܍0{ۀsOaӷS[@zqI0_vN~+.yVƶs>eu]"λe-NSѱ)&4EJ_=O(1 ݍe%n vQ3Jdi,>.zܑi=۲MTQ}R,lӎgE>^Ͼ ь\=!Aˬ!-Ӵ['zφ5cDm3s<_8fhƞ͙唡Mc9x t8N@Gk5׉ @vk/RR̳ӗ?t6`Bs+Bc/.xZ b"$8tö?TϹ59pr9Us<1B{ehIx}?wN^&_|zf!=:ww{4666 yd/[ziqi棫SK%nYG97zB&&dXRXq?z>#>} OsS׀]isn st% ̓KvFz"e/<~Ưy{}[@ݘMzn{fj֑;tg%bBr99۷p0-6o[9ŮE9< k]Q8V֡6Τs[V [Nf__,kua7b242Vzel~QV;w~IMi/|ts<TrQ&}v=C!{/fN39,CI#Иt CgH% ;S?._4LXd4æq2ᙄu -@& NOKw=GE@Cr6UŅ__6(JV@.Z2ݗrl{?^5#c=h3:^Iz2`G5EbIV],\Ep񗀀+%O3Ӳ13:EjʃCR"goKu=uM'M]YI5z4vj\Z=1!e~h[ !w˳2BS6L!"k \֩ےg2"D{e٨"ںr)|HS@SԸ4ma"̹[z4Go&e7rͅĘ_[]y,%څunu˴ĘtEG7{:!9+:K+xwTEou|O;J=h'++^ѳ/gM0~|1~v\LXtU)>/ϥ)y7=m2;_:ˬ]MYեeI(*|u/X\Рu{Ѓl䑛v<4B̋=^q X8-6AF}cο tB$g;[&>L"bҩK7 ZK&{}RũE4V4u6Y$S2 #v)"ɣ˻>]@Լ42t56t,XqykvMXN~˟Wvi"~cw9KHh[c/)H(PsiZ]ZWp:l'e3փ&aܮx,G?NjZ &H%b>vaӉ|B,!Mױ/s|7WL) ron[j. M۲'WXu6`c sBϏM jѲKK4Ӣw`vcKe}dl:laso;p!Cu4BHuV$+zo} k B|th?r(QQ4v8s3Suf4N5IITލ* ,F힫k]җÇ-&^욻yE.]>Wy0@駯& u o0{QU)\2p#0gUo,kբH  U]`)[K.Ohy8Fem~9~ڴMBHz%%_hp=QE0ۮ}OЌ.2|iBBCaG]RoTQ Z4Z4ixjx=4o E0F䌡ޝL_uEٻ\?(`uCs#F7 'MƏҜc`cfR?xg  2ɼ iZL-4VcwH)ú#+2/Z>_\=]OXsy hY)m\4Iǚ`;y }n8xq&j(Kέޢw0uO5iu>m Ւޓiu2eY.]{{ti+d5`nfgnڈ`(Ks9iɜ`q=^2}eOg` d΃ݝecK"HPtX-Gq*!k :kvm!1mcԩmK7b@3`, l1Ơ(J.ԃtAh§zW29( @Qp7Ea p7EVo­1hB@P(4E!(  @Qh$f.2|ilBsMMB`nf1Ր :;'WUPATTj} 5#ixjx=B@8(  @QhB@P{ٹyfu]P(4E!(  @QhB@P(4E!(  @QhB@P(t173ͫ*(4E!(  @QhB@P-5%6sܕkUUMa ^FhxL꺐Jj *jw``TFsS&5N5I!kC(4E!(  @QhB@P(4E!)!;7̴jA@P(4E!(  @QhB@P(4E!(  @QhB@P(4E!(  @QԔrWUU5JXhpvnއMMJB`nfWׅW*\UUCQQ4p s3JWRc=Ҥש#)tm`(4E!(  @QhB@PnTK*4E!똹I](4E!( ]0 2!뒹INλvٹyfu[P (4E!^NN&r@UhB@PT PL:( @QLٛE:qaySVn vѥiLGGYʞ+IK ptc1tI+{R4^# ֹ2AL:$ߨ*3d- ]"ID"n)>^[56W45`nfJ׍:(є%k :kvm!1mcԩmK7bZ꭛f4\׃꾞ajKCerfq0Bhx-G]'PUc晛TH^'}J*S_w_ܼ\^$f.W$4Nqqqu]B}% :;P+hPZ_A mXox4-3g/2!~z9?lD#Q]yiox ]0}ջW=aBszr7*]]N,K;ވԾrRŶћil:!pW[ѐq7;=dZ"ej~SּhXE/ FAKʋ :N}1"7l!4~-VriL?-#" ^ Ü^ؿåK䉪q3aٟۨlta߭J̵ˇӺ祵cErW/#OĜhHS8-9=ZL!̓\YTZ4jaʹ脡''rf9!}$g i`YvfesEr oϵ2S6iw*徛Ug IDATF|:h٨ll,4"Hena*>~JfJW6ۨᴬT̈́s. 9P[%fl",LHtwrλ˗BD)IyJU经_ եKN GYWA_v1aeҾz;|GybBPNK٧eSKnwf[o|sRMTТd/d$A6`E`0EL3/7Gž. ]!W(PtΨN)بs׮dr{ErT n?^ ^?>{=R6|nDq OK<v!XT}sRMTЂK+q:4Bh,}& }EB!ÀEmW~95}Oͳ6{v֭[S+YӸ=h7^J>I)1Fjړq?UYۈᴔ{z<>KRd˪=fW3Gw޽{wQśM9&QNԻlЌ:{Y[]")}~h/[/'k5rD≞'^qNǹLC.#:ɸ/t6GojOdm(Ygyʟ ^'ZM\{ KWn_}8aخp7=yo}#CG?yѴ,\{|;{h ]iRΩ%#;~<Ŷwa4IÝa|B@P(4E!(  @QhB@P(4[wzp"Ի*TZ)YXY߽o!>P WnV @uP }~L3CU֚4 d]:v}O뼛Ј!:FgWTe7kevmb7h̚'/BvD~m"Go" y۞fs !D\l3 .$j<9rTڕNrYU6n ?}cڴ;nA:͇ EPۡǤ-Y?}^|SVq\*ޚ˯&gنM[v:K<_ !w{D+h}~wu߸?|9aV,B/~;krv=}iW.Y1cZ?K93/tڀT$Tx\VCz9AůFl|>ة[{L[מ۳CɅ؄3?ukD3N-ˬHye&uѣ_yfeZW54T(x;oe=5?B7hOS!B_ܱ/mZjo梉{xh2l௮.'LݽAi%ׯBۼK^}Ud1ne] Ӷ)ϳpŝO+gwфAJke-ˬgao\s[p< :DE:t1[Pwᆇ<3]SaH& b]0e{X?K6!e=2bmIW9}+S^I齝 YaBˊt~Ɉd8lAvVLSwKz/goLPrժ'8۞S'L9-q5EKMI@\AP(4EaPr?5qqqj@o4fxuf?ٹys[Fk^vNn]enɒ-hͩDm(߲(G|!h2kCqUa ahԌ؋JڨlE`D脑W]ٰkO58M~s[ણ1VdUKSJ~*O~Ҫ6ֶlیY2IZ͗>cu_0W΢[f ⶴsh=/<cIJfom۲W?*;qt&[v ڦ˄8kqv=|B#mvԲ&b5 VRc0DŌhPePp)CVlBdžN{wU; ";;젠iKj殹^KKM𪩸ܴ+f y :3Y<3gH>}9'=9ِN4Ky1/aJbC{'̇c 98⬝{yqo3o΢?~5LսGn?T~.?2g١zX9nTj?LWDZxj>+9MVwM je{u}7lŚgWb ݤlbe;9٩g+HmEJyeûb.:Q;KA@sK }]rs[^z3?{5t[{*}{HRvUY9Sv֌Hq9iZ1- n;s3/ Խ55һwWm;3jVn9] /(WGԓTQZvS&9BOAt{%+qةݙeC_ ޾h+gr,fi9Кƥ3-S֠rBCCC"1!V<{{+Yu~uyaI$qʲ?Kp$5&MEU-Xcgk_}ڄ߅ۦE`B.[;#!8XsxB>>4lvNDMgB\z^KC7E ![^q:{|vCKQb'w/e%E KGK.Y {'mR5[~H/"~r♜ja]crBZ}sq d$_-Ԋ~S ![;ˊ.Bz:K/(o:)gR"=ͩ-N)5K.^>[:$ĉ>q 8̖/"fs!Ҳy2_ٳ||ʞ^,Bڑ6|N{]^UUlܣZ~tMP\q>&(LԖ(fС#)|e.<7eቔq%jiK蔍G 'W&[{et2}ęq9kϏ%GcnN4cmZ(ik]a!j쁝^ᩌHK.}>g?[I"'j71?0:~ۗT;{pL`@H>fQEM&) 'ErbGogqBM%4'C7Q(vjΥ/qP&25#m,ǀ-gӲ2/oviW}i?hxӬYɞOgnZ⻣jtmֶI23wk{5m߻Ē[q{R3ss<7տ%]U9TqJhhpᣓ#ypVR62Ȋzt0{/ˆqJڇ?+JN'WYcB3}ʝ 6m?~ţͰŇ0'{[E ;|ΧG 97kY"W4Y|R`ǷN߶,Y]6QBOyjj㴕Њ#ˆt {w?&%Ζ)w6F\ۤ|}t\JR[⪺QUfgm02 \l֍mj֦M=m5,4x'NcD@[0)tJ`TuKhFY~鬢ցfj/ Bc :အmÆ`,LKgal <= hsK$h;d38Fw4rJs 3-$ǯ@/~u.SL; !H ~hm[S42_y@!ho15"+4?>64@oS\vϰAlMyּN EevbJAY.OZ|9Y7S1fG3}W=lO'׻ٽs<}07]u%?xWW3d9"e|@L8kĥ>>-[tPA SD}ysN=5*ҙ21лhn+#տDw#I=穄nhW:qy_[]ڮ2AbELAF'fe։3%][w0SGs]ɍndVSLr"Z|/ow7% ye{*SO^EOkz#:~x3jZ68] /ԢZե3mqjGaPXϹ:-103u47ܕ0F*>V<{r!1xW|5veO/~oDkA'߭l"/bV>}ЄJg 2nY9BouzhA!ZĬڿ<`Q_F}3mJXJ/uXJĸ>hM3mόL h` p:4G7X >b䀶thd4 0AB{Hg -0bt 28moLAFۭgYts'zA:YWmхE%j_荞BpkS_=w@T(e%NJ4XcbOtuC?~t jUnB74!Ȋ}fֺjب ::a h`,U,.څ=CtC Na*7KSo٘ 퀦ui Vgx@c|n2Nb渴uQTUibho Na*SV9LBC$eU4^ Mh]\ɭM)5K.^>[:$4NaZ:A2{f{O_/N`akG14VEt[ M8.J>-8ehWg^&׍b|֓z1)*I>}B]|_o3(ZU7t֟zqF}{~x'N1~4 M 8 iB@c|6 A'A>pT qH߀h0&h3AF}h#AIuW!fs+1>2k}ݴ}xgPz4!teDڷ{:Dgk3Tw4Ms4; 45{%}_!MW-9q鹰ed_.ihfw4Sو0D^hٟ[)P >j z5.nr@3j2O8j%o%z(?uկ+

s|~"YD%Ki<_a9N҃ܳe5iTHӕA;+ڸ'*1kkflG9a d=0x냖V=FDV\R箏_YVwҴeҲy2_ٳ||ʞ^,BS9@s4s; !m[~cϞ5GD~Z;7&|uBoP;CB Z#; Æ}ԑF] 4G3ٜm6Ty4jmFI>h]\|(BYMHg3CF0kVa?vc "h2{1􁃄@Xa8h{`>hU;'3| FZ74!AQQ%q>~-A@w(7Y1F( G<zh}9bKOFEm \xD~~X Z7EUs^Hv P+JZ`@y#;KA@s Hszwz~B^q{1!Lؚ QmhFCF;:[޺k}[']̼߭Փ}c@–iY7]XtY9Sv֌Hq9iZ*UMIβ''$ފۓe5J24 h!mJ/'D !w\{BMڜfx#؅='j!C"ؼ"/Ϝ"=8,WP07*we7Mm9Z#8NJ= :K Z:1 2y=|K}Ɨ>p&hm^^ʖ!G5BU7{X0 rޜ2H+D,HOJnyjXҖ cK;u6o׵R (n :O}bK0stj&4AK](tu Ӌ?=bZv_fxu+JӵE]l:8OɛVݨ~?\uJ7e?'N0Z(njcC<1s~m?Q&]NdU%){WDZ9Ӎ+=c1!}zΌ.ޱhzL!-;qr0fFY+FOI.,1W0ƀ&h{mK鿓mvrnfAEfi3!6Vc8]N8-76Fwg\]c71k~>o?[\o[(6uXf2_BU:-՗kuFoԍZb_*IyF}{~!8wh4gCFTB0A[%*-`8+^3ABk6uCF0URQdk|nkj3-5Q;p4Sl RuOh: 4:5556g1 4! Kf ma202@t4N0)'Lf mr0hS ޸ m|(F \eh70gK`R #3 029! `0tC02=' L `\X߀@@U20NX34S#mcC4Ff"2Acde7X+12`}f'h`  0>Ql4a3NeyM 3h,ea|# #3؛MC4Ff;Acd; ~ 3&h`` +02h3d`0>ФlLǬk׬ 7D#Va|jn@3K`Ð`jFX>#3@y #3 `FXD33X¿WHg04!$55m 0 ɘ `ې`fFh b  6 3I8`c`ZFF@: !2l,ȴgq !L~2,A# t 2|WRC:sWԿ{o,J(r0ƬJjj*ĀtL@,wc`pƲp(;Hg`,M*X@4Y> ;``8VAM0Jap¬` ֈM0J z14)VMFi 6M 6:h4XS@x= `{,)iPh[eMALl41m`>)iha#MAL6D3 h b >`@Sc n;fO6/6ں`d 6*HjkhPVHj4C`5@  h >, {h$  Im\P&e&B@BR `i'5AXkA( sZ=)eC@.Ul& m:Jgjf7QЦBk YA0]1n3rDٖЁm `(4C?WmIENDB`tora-2.1.3/src/help/images/browser.png0000644000175000017500000032517611303312237017436 0ustar michaelmichaelPNG  IHDRZ pHYs : :" IDATxw\^ GB(V5XQK43X-vFcbQc55Fc ;:}ev{3o!L& a0 `0]!I$ɜDQ*ܜi:`0  @ J廔daZ7 `0 C7d9`0 `JaR(`0 P("04#`0 A`[ҥaCN HP `0  IB#C EP ]XbI`PС(x~m :1׷q!ZBч_84xtm}Rԯ {sA%`0 ARTzZZ\ܳTT0D"pw F熔f)-E8 Xq} HrȮ]zVF ܫ5lcj)]!:5G.>JQr$; 8?(pdyf*&Aq-\|A o점sYxI"j{lU= oJ$x$޲?6u"ԩ7,;pN\J.wު>vL )|XqGlIߍę0V[t~IO6pM`d\ӅUwz|=G0MgvgL@b |r_zqgqq'Eq޽Kyܠ~hJ(LaٽLMYjzprg!'oы 걳n͒ÑU5)-7fr.^|GV }{ܤí qbԷ[|ΤS]IfnjAM?ly!=9JXv%...=>sfcnjZn?Ƹv&0(X;a¯HU[\.ӳ}Vm~X0O֥MV#;ʰD2{&UCNp$?O[:nmvkT֯ӈ_ݾ|;O1UqwUڭ]._,:2'ui~ԯtstn~4;f ު}NUf0=[r&P<]ڻJż-ψ`0 IzL1)))^ ؼqy111-,'Mʡ?kOtС /6oޜTAq|swd/.@kxΟ]m3gO꒾y'rM_ ȞxޙL02/NnӴik}ן8GR4@>nsgO osf*s|=y޵ߧ6s?ssvsٔϕ@:֊pL9ZU7U:mz+>m;/0 PEko^W y'Oǹ ׯ6-0eOKyzxhsKMJK |Ν?ɓ  ګgORZG 1'v$@oMS0Ywv1Ӫ"V<6DEWr# q2鬇ܺ5vo/][۟{e6[[${F"VqP'˵~REj~> {)A~ qhY]։@GFS=듄 ]hv>qiմ~?.9AH-< 's$:[]蹠&[n2V Bæ&~)::(yk#_wHS@hHACzq[pκ^eCe+ nx{ݗd^OS׫ujl@[ǤOѪe.~qmG<5 k%)>2o|:h\ uk8hr}ٟV׭ǜrsC8=Bԫb֖3I< *$I4-T" ߸y?ZGŋ7o ~U J"IҸ.g޽z術PdȶmeDf-omkyuͬB~JEMsGJW;~r%\(M֣ھg*S@:x PNZzےFG5q/#{:d9 €@j4ǧFѨ@{P̊ KZzHuAN%PI5Z$zN&[n2V W :;|( G8k}##$%F}+r@p$d䊸Q2ɟ]dJ ^cj|qU'_g\'u9:71ԩJ] TOs5"@o<~޹n5f郷ϧ:H_/[Έ`0̇ A$I9  gq;t{s+um]NIkM <==kS8q)qh 0)X2wvngz1xpd͟&@ -@9/e\~S;BKjq_wx8EFi(3=9rFy!]=dnSH&WP"R'lyHvLq3\O{6Jhү0(ݿw ? y|f[0 @`!!osrshR˫V͚4M+7UV%HBӘ9uUz5nܺuujլY;VлݾsǸ>6Fq[m|y_m_]vKR IuR]iNE r_pc\H}[Ozrc4ȟcLJN޴`z-HU :adcȭеI?ck7?E ; ; Wǵoog? ɟYf爯NݳHoR훃c_75әvΎyK|ȱ+'6t"dm'U1 ;}U麖V!_}Œ>]-4M+Y54I&!9"p 5$)a9zs%)KOTJ:bN0{ri!h;۩w9Պ̋̒)WI תeKiZܻ{Z^^*|)!KJ=y4V5jhjh褤PR:R`Yh@#J7[LurL߶>rk;sь0ӯOV"ԯw %I1?sBp `0 2|{xxzQ$۷au CL&-R[|q@䫇w,$ ie>Myx6,`0 pvvpܿ.$HoڵC$J).R@`P/ަMRr1 `0{  Ŏ0 DZI kA\\눃Q,|E>$hH\y"Ea/`00 RV3 a* JV(a9/:uE⬎8 6Ԓi*x}?™7oE.ŗx8`0!FzEw(U |)fqc^l>?7rˮzǐ ~@\jcJb=90/:尡EF8ӭ߂ڿoO?g.vqR+"6jis]|#qtԺK~?uG- sڭgi"YY/ر߅;uh"G/OtKl֡mY% `0LE$?Mیi3:Mo85ֆn_l56W8B͍F-^69im9s E^6[o߱s޼yP۵|*T5/zߧyxxLfjvvqQa[ľ=|; |Xhzpºmi^hv82A (K-3{ӧOOZj-XH!岥]yQ{eam" '\xUx+ynk٢WX 6X1Pql{9`0 ⢍p_uvb@#K8,B 0\P*GVE4h0 QFU*~wć"!^ѽ!B4CwYX 6:b~1"abnhaG`0I ѽm:KMw^ӗZP\<Sj 8i Zj&[@<Ç վhjq]ی#EׇP*IoTH p%˵4n43#|N?2!0 TD4M||BxV \Q:R(>A3F?try|.^ pDkپc)w70(!T#^$>!8ݻsNYc~Q`0 s5jcr|y첨oŋ\>f`G; |Pᖵ"rˋGQ{m Mx<\u}#`0 ! ܻ*jUYk){|D"(1\Eqq `0#|}} |kZL(e %igj=E `0BD"xn]|bC9%#(b! `0 @= Q>p-%c0  `욆 `0 `0 `9*!ת\.EQ& `0Lh4AV"̷ ˓BR `0 l)4-ԩ[iL*[AAut^ޢMOKLʳY7.1 6 RǗܜRF(yy{$'9;;jD R\~ق2Y]um[ 1( )BT&Ma߼iޢennF)kXp9VHiTVV-RS. y|Ǐurf duyͶm%0Q0 S$> 0 RT0 2bJT(a$QYFfFYV@dKq0<[]ua uT0G @^f:u߼~t*f4;O_.[=-2R>z(VglroEs1 "4D JŦ_\:E鶁~Vhh._O4MʭPl)f=g˳n6P9)d1 2X_A^Ƙcnd R|. m2rJYn5RfCG}ߛ(Td],7! dEzϨ)XV`w[*(f=6VcBZ3o|kY] 5.hqÍ_ؾ#D]W_\ܨl*Fؤ4BGLSFjxe7X.e]JwIs@f)wl_Zǂ{ 0eYb }o_ԥ2aփeV&-N\~x."z 6P`cfSf IDATs.Z3ϼ+@Jpx\un_(6&ƨo >E\G`ݖ] h[UH{Ԍ8qlh1o9V`0 W ܧ,_GiIcg* yoWSV  Lt׻lӯ/ uCNiMi&)'hhimYfb-(rmiu ) hh>߆>zj&I57;vaH~xɫZW} vѺ9.+4nI[ h f" iʷtpd˒:"N}zǚi.;H~{E 5 X9.Yh`g @|!u޷81s4 d?߆ roljč!'T'Q^YDg\fDyl G{ֱ_3oۂUqs׍~q^Jȳv7iƔ ̛0MֽcWzvPo|ݱ;[h~4bİ*OϞz2,fŐ:I{=gWG luj-IߣFȋj Fw0yJlt}HocC&LNd7F؆MGӑ&qPAtdԛ4u"@t5Oa_z_OՊ2\`3M׿v{W_gO.?xVY-&m5ˈ5#ZSjwU:7߷Mfn!6j>1~픔f7:M#B;r0yJltd>'fȠľ {MouDw(Ј&ewtP']e53Y S^ei0-3+ h1 զE n1sJ8d| uk4xj?R|gd~yN$%̅ yjX"!CZ9P\zFu$)Os=]#Er$ET^Ing!ro?D?8{XD=&,_Ijvc͈׭ OزYv_,Ռ*MA=A)[۶릟QC8؛GQ|~}gpx\u%t}R'SF'OFA!3wh>}z9,sI"Gyzx~I1Ol# 0`0Ӱif8LmĭeB^Z,KHeF/)ةv̾]2>DB{fLn}3j8Xq(tt 9@Z'i>{pP休J7)O(C (x6Ki[d&{-Irm1cRk} jubSS# aՓׇ8B.EdTF$'Ab)@LřS8nMzl$`*m MMh:mZ LYW'[&[.X5_2oKm;p-=#Or.?蠎k؍%"Ē+v0*@p@4"DĘŖm{k+z y/Ҫd*Lԓ_F"UEI-ش(LHzsU/ZdTCONnµv+0 cw78bT9*I͹"mvŋN5O+n"7&j"?^zA:Tԧ?nGe^;ĥAêX'On0F|qSY nF3P"co֮ w1"ܲ];7%"st Ws_mo*3º{9I'T2nI,A`dIYOq/>v" uóWŵ9iԚJM#s#@ {GEK\7{ӕ,CpX`ln98|O&n991p@ _#ϰBr8BPیf:xve?’ho >mNM&GKoZ0rmnA >ְpf^< ]υU~uk++o}ʠ-X"fN}l>?{>lZy&n| t9ĥ/|ƍR޶yv`IR ɓՍ8'LT qAaQ+ֈM+ ýf-%1hHoE[@6w; {𑳺pA[3wɷԽv;[ͷ fRKF P*Io@'lB&TV>/ /]788=h4eZ!npժ_OK([ox#ůM^vAsg{\Bb\b!cqTϒtPrpX'@b0 >7^_q[쩗 L @ъ%"_D,d\ eO3KHl'-=VԩW )7nG5ܛK2^J`0` ]}y&]Z&վC֒>]B:@>Kt/Vcr ªJgo,ue]f4NbOʵn,y4#7fyLBqrhU%tQ"T0u1 \>_je 3A?ןF&o%%guIRZS%d/}dٓ%;fԂj_m }Ju )Jmݶ2cOZdKq0<[]ua 1먔Zr9(J HaeYaRYdKq0<[]uaM 1ReQLQ? R|q- U`0 `,EPxxzyy{$'9;;K'Bp8T.'%mY iZ]ފ`lCG"V*=_(yn.ϯX$WLJV1 B[E D|\/b0BT*J0P&Rrk,i+zI^UD*-6+AK y͡iZ&˩S.M2 Jqz+ w ZQ:>ݴ򯿅,/NRJ$.BתFQ5ގ b^w)\.W?bTJc n3T85G*z4S#94P$2Zqwdʔ H7")ZI6zڳ?~֭[GDDԨQcULiuCYRLIIr[Hc]Ĩܠ`gp [e0au0 SC5(rww7 ]U&`Ū!+vNkTJUܥK%>x޽{KY+ZjKJ~@`;e6ғ#([Ml&W1FU&[lW WNaFP aT8b ]Q:>ݴ򯿱RRimA{ĉ.]uGYqDEYnY ejU#yU8Hk#FPL -*10G bPb=f趖J覕5-bEh>I0vKk]"{X]UX3H)R d>|5ݼGn|ݴ! ㋃ըN &X(?ZgW6=}Tvݻӧ0zOj=rDϖɱV1A^xڵ!/n?am4~g;ZVWdb,UqR3jé;EvDQ'?Ev(;Whrkݾ 3=.e -_ H+0ȑkLu2_\:uʰu۠pE*\ ݲ]os!,#4 "?'N!s޽{ccc#""ӧ62God\TYByq#>w\NLL8Mӌë&-N\~x."z 6P֙ TvM(ܙ}i dE SYb X@cU-e46o >ȿISbwky#}y`TK;R%_jRYad[xl`ܝ1|]Uj tR@G iHf˶15Xe"s]8Vrv!and HGMOܳȪeIY5!_9.Ay||݆>PɷF/fkbɛvE6Ajhqqݾu.Kj,S.;GֺѶ2&/()N8\n^~,\6F^Sg_VΤծ9^NH%5?zɬn٘նkGdz"FRJ` }ym ¥|_4QywZg};N7nڵ{ɰC 贿c&f\1e{bm-ng}$ק7=oZ<|񱛯3iqp3ƵZf)~Гcn*E nHL2_M>*ª-f'P'7m]&uF؆MGӑ&qw[Tr.$0Vو^eK1Jݬ1κww=L*4~fQv_/X.܈7\x~ݣ-&N;px3b?8mWM Y薏r%G&\& in&AHNadSm2RG'kZ@7|Eu{*z[Qbw1|XnF]w X33ѢѬ}uj-IߣFxuJa=|~?v\X5bԱUBXEc%_jon󮶅}w$rYaŒWNGEE@tt]p-Z?EB6t h}%NE[i+?oQ*ahZuuU>ΠyN-3xͨ^&< vyrYj &537ζ@0ϸa"P',o̶ӽ"' H~+lKNO)UKs5ǵ3Jz|5I(!}ce3ZY{Z^$գ8!DaUz (t$}p"޹s{LXſD9;D~D-;iһ }H5Heh7#Q]!QQ4:><{H+?Rר$d?|>MAC0WJVn?esHo7mp4@p$kͣ(>"x;q)W-)TEԪiPٝC9`Q!3;z*L5Vl'gNG vHĿV*^I( ų#ݫ`i7\AƼvS?5>kU(s_ԕf-kYŃ(rG<$ Fмa]"7kfOorjp~X? ݖ_NJBQm~X(طjt*^Bvgо}]~iBٻq3YQRо}ӧoNҰތ,J'.QL!t=GR0?~PnR>BZYu~v*9h竘BkEu^%[NЏ|^4>d-lB[(.#O%\m9A/ڲ !GKG¥#rFP A1)yѵľ5:|L_\_ 6FcIrBgTF*0& ֤GnNZM@2[Ȳ6hA: 8y'F'7=|%!CZk@#|K+u`Ӣ˓KǫM5V沱u\±j~J3(ҕ 9}!uf>kKZtNV0>);5#OK_$M[ֲ7}Y?+yLmĭe6TV֌r.3cAs 5壓U#C*XH,: gE z |݌,J'MMh:mZj89ܬ*? *ybj8֭[GDD;wNJll͛*@򼚊Ez)) i䝌֑o%2M]G^)Bn(HB0 ;jf%lf:WalߴEetGd/db_P"co֮ w1]kw MڵjMHәl TT gDqyug_\2vk QO+AwR~lӶ\mәj#mu_!:(T8G٭Z:篮U-X: gV—dΫ%:4nYwz@q|}65v"Fb(DHޜW*BtLu}a`U˪QNXad2읊0id^++L7Xa{XQw|oF[5Ƶ@p]kDm}t7O!\WHnֺ&R (9*!$M,900zsΝ;wI,M%zˌZ󼋉]Dfyt-v\x!J}綕$ t yD%3{Oޗm3\U3iu5@V Y2Yw/zr zk(N(IX{.%yֻٌ6^]ο2 [גU -T;{)_{96@E0wٯQEQ%8k\JU[I+%x^}_ՇrlZ-L:gveZ+9S[к7,?x=Ixuc|eقpf.)IX{/'v%i*ݢ-9,d_ۮYϘj8dzF>_|[QZAnwF%c)9u`Y7p(Az3S޺Ѭ$}&_.>IQ Pndn ݹC|˞JDg?C:!=(,j~=zO]#{~X<]\SQY`Y(S,[?{hm&NM&GKoZ0rmnA >҈ɺ!_i%FNi:q !ߵqc m iy֎뻙i'jȽgzg>eYYYJR?%QEeb'k֬-I Ey3UjԨsmb(L3VK_GES/o:[\3FS ZҥBUl\ Z*\=Hvw|oij$>#T*OV|>_(VPT+r*i;qMlbkpuEqqDiqƫKy,hh ]0ͣ/X=d%Z(@~[qLFU&[lW W*Nr/7^Nqp=\]ׯ_T[naJJ\ ݴџȗlo;G׈,q][ :Ծ[mJe^`:fRRZݔQ -bp?{g^`I0E@̟݊xvبxL{ce]᣻sϜ9gsΝơ(^5";4iEm{XS[Dz7E^x-PAVQi/jKTRKlVبeuݪܥ?>zҎʴ^@*%I](u295(Zzb5yAD,ݖHb*(m`rW7p6bB !5)r2ں֊nU")Wh ^\Q2ե@#pQ8;(¢X O)m[50^j򯿰ә#`+=uݪ a9#-(4@]̑2ե@#pQ8;(¢LQmp %aۖd EOpxՑL&u@ Q84J#Ʌ稈ʿ~\U]hq~" xéԬlBX,EvR~j%ЀҦTQ+;v옒DVWAh,^QQO:::&mDNݻkhh4&h===.I% j%Ѐ0tp8gdwfA}Խ{{+0 ``2ڀA@kchߩ DYёd{0t4ފ(*mm@V @ qqUUUA!iQ!d""3#w 1 &nH܂uoYSmm@ypB @ \G0(Na!V6IMI0`+$RBsqhv4mʇ@C3sƵYd(%|lA3 4FlA`{0z%gQֺմro`$Sk@.ap.b-^>|p%"\tAVq/䈐:~ Eb:?@ /z, 5-1N3YtH[#lĺ e*xYҖވ$AbE t%1`c 7v^T"h***|rs||-[l"pD"-Qϟ?>|pk"rrƏm"*(U )pQXasU GdSwN9[l<Q(VF唗fC H[8䳷c:0=5鴴.Z#7z޲e 4jցpCd͒ %/.PoQLF}2|[4 EȡI+a~~Ç[ # T V01]fR0i,:"6i}(=Nr+Nи,Wc%2BOj;ߜ ^\9#`UK{c7Appn@ifnQ8b|6sHI+ Anoo|qޚ]x ܯrEHHΝ;>|hkk۲9uq[/Iܹ3$$dq[/* o D)q Fö^ˊT|Ǵ8_@v6eۍjߝ^rɩW[Gᔿ Zt3樴[k,=*U&/;8eR#N? *<;y&<;^kDFCLIN` ķBln܂Uj廛AAA8obkTdf [nٲe͚51I;n^,W+@ Km9gt8FɨYLeqzyzD (1YaՋ};e0H[t"D9GsTlYX8"7n(X)Eڡq_B~Ѹ$H''Ey[D\9C DQhOrV-%i0̟4~2/I0/MT j̳ ZuSѣS,8crh¢LG= /DD(Jcd;GEVx+EINԳ(a5hXPo܂oIeXPOʕp[ DGGsW"oH{@ ]űˇ?8眦}oB{Wdi/WܞQf١D~͘[TڳbBPѵGh)jvS'ݓ'DHYҲ9*,z❚҂qAht[*o>-U -CQ2Ar4|[_ol[\ J9)ݭ +[w7 U (,3} &ey ?@}lfulguӁDј&\MDؐG&Ŗ( VCf-Ʈ?q9x=}*$6E{@ "@ Hcq@ }jMCfɫ3;^x1Cб6kvjhXჽVdwG`E]8F~߿r_gCώTL]~6+Ig)U@ޒl(IfcqNy송s>q:檃66s F3.o˼l'ٗ_5c5NY*Z+g\סΨ{6xֳo5l9YH/F5~CK.GvBW4*iM5{^ozPD,]6_H[^k~V]]Gp~@ dT>O-f8gd^x_gsẄ́2iKό;o<}pֱ%tXL:x ty}s#;|]$íF8kɽx7 9.SzlM(f/ ]p_?"6CYڔg~`:l2TVkoE @dޚGP񱸤C%ﴴKʬv>J3ijB4LFOP}0)tՉ]n>Ƽ(.QrQvjW&ˉ wk?JH)7݊+fAi:8FPέm7BrQLm4 vKИWYs ?|Zc*jHuNMgVuVӯb4-jqUh\^J+C(iE%&g|YsR֔Q BJi!*N) 35'T @ D~8:cޥ"iHE:w:hFeFxD]0^Do+@h9 ɿ3B|!q܉`Fѻ `g^iԢڥ2l ZNxԻ+Km 7@ $^o6eVS3!|co_{{yl1/b/ K ^>r~Yfs-w  @hq'b|:?FZJ53F8⧇OyS]z >Sߪ +Jf)߃֝ _\@ F$_~󯻧N11) 5azYr1pʍTighШjFe |労4RzK$/WwKTp$mtҤ&}??\3O<%,8@̱xYOg " M*ݥz#I4Lp'Ab Yvox AT3eͷkH6ۢTN Ԅo T0^D{elp(QbzڅW; RR `> /2F :Bi%! NM^vjA]s U1^ &8J)w$I+m_* i Ɍf$ݵjw8uu(UCކC˯j*MW3"2Sk%X%<'qY s<A1VkX9ʸfO`~&!𡞢Wu͙޸;|k^]n#n_9؄ FfCԄ}=%f_HNcۂ9*rVQ!UT:7|D}U&25?i8}U,lAXY}`5xzֆolYCMǥcKbV]C )WE0t4al cw??-?'E4onm^ RBt8g-4 ν&jޓ N>X&s/@L-EgO+1[MbBQea:-@A"Twsu[CGAQOټ#9l RuU<+`w(f]t=g7>"}jDT$U^RK0Qy75 HL$ U׌yq+z05h1iPOut`B]ZmUO,&^znC:M:>X!N}h6Dx45ɓLlGw:~Y70_io~UIo@e/,]\!>G.x^bɣV@ DX B֜:7s<~{p?֦E<\ET;X+;q]%<'&7}fZԺ9kv]ޚWסW6!Hj H{U&r =yߧL)1/|z4 d(Ce=08ZEOɯcrp\dw7qyzg-4@  o,Cn>zB84&0i@|qP#A~,WZ8_م@ 'huPx3DM qUm۳sUّƣgyQnztA::1@m C|niw'jѱi}OhѱN(֦r1oHeTuko&qp@ 9w5ɍ3sq'uA^>\gSgQ;\yMq' O]⻷//W1s/_>==k߽K{z=+$/0ǹo%Sz;axz&Y?#Oו Nꅽ;Xnzg=w 3S3.5D.uhf&6Ef=eW@Ʌ; WsBqk|9c|;X8&=M̻ؓPɽ$ Ԑa@y]-I5ͩL Y1`|&oѐ-=~6N\5y_ ?5i RԨY+jƤ@V3!#g-YP*C.h"N11|o/gUzMiiCN"6ި#uytDՉ{{Z[$}Hq'~]fOb =9#㷻SKe6uwm^_rRc7<]:` i=mZܹ$e|Xl 'N`6oi;좃<("JΊ}z$fe~{ui_!wV9so|HvڨG¿ow HKtzo4N<+lթSn|9)jfu7spJ@r&o6.7qڄ32bOp (~;E͞qoO*4 xy7٩h HX+RDB6/9k;@)8Dj Zh Rby/OLk⚸X%Q?#g6_Nݬ7{1cY;5 60*(fQ0-,.H.o ~NW_ϠC? USݴpj:*rO){sMFڑ18QuSWk-U8Z.9o8}o?{Fܦ10P"LIͯacͺu⋫9eg0FͳNDF^jޥNh ~AVfmFfNp?k, հȋh vק>jd7|w*t(*=/M_N>額x!urnk`+4'hpqCXf$~3(Mͦ3AhMiaG?W7QeAӬ%HQ#ѭHL 'r&4@%HRqD6u^MG0Eч~K(ZNF-W^~IM  DX.6|M=ڎ^ƨ9e_>o5DsRNuhv"\ T K2W~8>--=#-=#-#;n$%TQ9|vу;=, 7識O?^{tўS1$S2{e%I uG*ޟ.|ξsAG3*3#2a4c:v|R]QP2&jM&+2lb:@i8"+O^|)qB83o w*)̽wyn:V5l0_S nN?_ٌܨ{shX|bʘpjl'gF⧇OyS]z  -E DVWa&W0=u{ N]Qu@wL\tl?4$t˲f2+a9X&zr^CR/^@PXUuy3tf_t|ם:ͯՆ^wNi7gF~"Ȱqvڞs~;*b x0;Q[*W&5b"/LhcKJ !Y.{}x_gs[1.BPqp0716516wj\Hq:`4N榦v>y _lǽuL'bG \?<=}[?ezV΁R2á20D"L~*œD"5~bC5怴#1/>~R`zOg(@ D[|@[hܗV@ ́!@ AXYIJ&֮}nΝ*;$ܺk7(?dYbljbljlglbljbleL;N\ufu¡6g\סΨ{6ƯqzɥnZcXys}/P4 @ @ lGXJlXx^k-I4zMfeVB3g cC$Dˢ7OZeFF܊VIW~aߖ?p:KjjC"Za׸*Q֤s Cs69?13uwGڏ= .&P,R%ގ(tUg ?23>?y hM'~NLFqx屟,z٤!~7wOS6]z/Yoo[`m@xOo|z)$ NYŏO~߸ /C \s^jQ+yhVԇW2RWѓO?ow,YLjoxxR<<)= _=Z! G@u===\]kY2Њ YDXLhŌq8e0 ^F xO쫞 5pzjV$3VwbKK~8`|`FЋ^~{V?KH4(Ŀ(4hEl,^oT H~H#~hO]2B>ekFE4p 6iKMԝlH! L.g8ɣso|_[` Mg%Daz];BG+{LZ42ݡ~Yso>5Vgn RL,g#: 'ΞgDDe/-̩plxUW@'|6M#"E46 cFΨL赇aԼk4I$9H]ꍝžQ49 QAssb)S-)'gҰeFpB+x].f|ɰ[W%PofA!ښsI{ 6~c+ 㗋hv33dvMN5ZF*5AwF}E`JKaTr7qxSz]yӅyUP츓Cnj@K$Ⱦq΁C湨7y.y}!gͦc5:[VmBF̈́8Y @I#:I;bNhM)P5zOJ&=* &kC<(<_ř_5a}rc[y<.! 0h`ӊhfV3"qRn8,`m+d*ӕ&j8 C_FVXSb-!a钢\?Yd猠oz-0c_(s(L1)ИR|y}O\0 &Mu ĥZM=}e>aS9}1QZ,jVŠwȣyh375}s/kks23њӝJ}Be}C!U`I$ gŨSP]&;QC;Yo [d]yZoK g|@,YuJAaTjR%ӨL !)*&#ٹbAS1.) ;(aj0cnD˸pQ&,OwJaƄUҮrƢ&Բ(|wi)NW tIQ !r ȾiOs&+HɩH!vS0rn_ׂ/bp=-/G4{sOolKɥPu7Fþ@`wi k9rj:n;VypA i@Eφ2bc7 t=/a]>Ɖ^4m@E3N٭BѤ_;`h`n,2S`Qs"h돢:4}%`>s\>k?xEh<ǻhc__5z)(=o=wK-Vː5GY`,_-VvCk Q|du9cG\_ isܶ㓭"ӅEr,+==۫N- JaffUc _cی{2DR3R|y1G&u o#.eV!9重]{kG#.`FLlSVns϶5S'K&6uokibq[D"L&zgaaN"?cXᑞm,Dy'1_wQT?3םwnj2 @j~\ U "GG@Nyܑ+WrQWw/ 䠵B%Eg6γ9"=KG9tA~io욨CB})g-(\G-]{5;Bs//k0&^_]T[z} }|l^WUQ+ h뫹U{@iYTL]WE]qj@ "?H:q]=O4QRIoU4zlja96fzvxgCF6>qxEܯ<åjIu2WJu5L^"b;7q5Ja8DA@ EqqvkRXȈ}jZ| Gs!Gjе5WXSW}uv_*p} :Jo 6;:4ױSw|L،7IXtZZj2nU@ icPDU GQO=:B\lBN-a|9$WiF<̢W4C\NKO.dQq@ :8v#C]]~N%?rt=+@)PSI3JcFv DU 5Ȭn貪f/UAZ@s)kZ63dwԟzG.Z2q3\q܇u_Nep7)'7Ƽk-W@(+гrtMz,aNIcqV 7VC&,Z›РW8%k+kX A5IBQ%C{?bӫ*1g t33b’Y:W;_Pgnw>Q+!C6@ oCҟg&asoH5&NQogVƳAOTW3R̶:$6e }HF. /%:fze?"02O|+nPBi}OԲ!"~Z{Ѻ88wX+-HfW?ܜn1Nh02?Y?gf)F]{мZibgC Xarȏ :ȳېŧޔ]9MMM u%VoN,jkfbf;a۽lzorHmzο{fs1565t޾t&6Uupa2*$ED7_pɍ,@(,|ҫŬƂ -qab`ZvwCKޯJ%?dn~:"cSSq- ˙˖䗳?=KRF-YW]~kNTj)~kWcJQf-[,6[5UUks{{o"yU_N%ݕ53qZr^j:AǸ}Z"sҺNc6SXD&h%'+;'+^Z(BLاf̺U@gnΜ􄿝 zϳ%ՊYGJGONroUò0ҎOZnӤ̤WޮZXx.y4pe9V׼T5*Ǜd¹[J #ʡ+>9e85.nkfn}KI+,&vcv3&_yL|շ&\y5# r2F ';󪿉8.|Vf/x~eb #ɹ. 8 %e921.['ZA],~g9": ?\jKꬅ:wHF8=BQ0 %65.u׏nl1 J:Pf]K礪{Ejki;מx;RsX x(>W xhn4cԊJ<;IeΊz,Aayo]̴{݆)#QH ~AϪ-KfsPUi"n(#8d[~>Y%o2f4"4cp[ m*N\ϥ̬IX? IDATn]\z5L"j3yx338sHΝID,H?U8]O`3Ց MX?{0),A~F۲M*Iu&jQuv '8gks aOphKmH`]} ņ2jߩٙ7W _f~Ru E{VU̕q'lΙrCԤ|tOib{жo114NgU{z9r6z~}9 o;?1ТL&m`MIW*h$,`RX>/C(4*Ga%d2BfEF9eɥrUwIHV'X9X,:~y}L^A.mnFv;ZT&bpT]7$m?&&~9吏[S&qEAӏ ԔCm NZ/TX{WNSmx*]F׾ؤJ(95iK*:4A*%ߦ Nk/vk Suh/5]Gզ?+A;6RCї ѢVĝ}1]I(jĮѻ$17@Z <^e{zMYSW$:дˆD+3_mI^s3B11;wOvvd&knpPq!S7d;sal[~`mr=q-2 6*D^;eqm$Uv + +OP(0_[ k(:pvLroHؿ66dNs F-V*w>qY"*Lspd&!Z[N}}o[~3~X)ݲscOl,8۩=rmOsrYTzfкV zK2aΦt'?f<V&|/] |lД5+ OscBc!\W[-D@c?( <7ӥ;]Ke#gw;cJ߮q/upc&wī!Rj`vI8JW޽M!5ͺjhovffiBuk"+{aZtC ! 7 _21pZf] 9xaGOϦ\ic-=0tiJ]4bg%/﹤3l zCW\/^mhy;MTWnE;JÏt``&ixaGNdchsK7AY)mkhC0}*D[kQ$3w+ǵ4KZ_f7Owy/z*a\z)6ՙjEYg H.[}qq1JHHD DgFCC`פ4pu{\ɴz?;vTNjd^sk*츺Z?ַ}Q⏦ә@P3evhi:e[;)mh'W$S DʽzLhOҩTj6u fO@?jIfMi%l {`8AXƖr_w[d;@ ~4Bҝ߭G+ 1Еר+NC:x=~W%¶q؛*7v8YcOwhX̤įX,V @ ⇐41EUȕdcE\|HW>fz{/|s=W}r_020nlHZHTϬlk$у[fd5RTBH$D 6*++ĝժ[:<fdv2P'3T[%+2*0ԮR-сopȾӧW[Vd9~#dk*ˁ)]OrjRXqd:P( QHaOr+g̪$(p湠.ڣ|~ 3MtTV-qd}h^%h[8`o7ץ?0<}ΛK@ ΍:7 0}kx\!_yySvLroHؿ66dJ+J#N,RwU#-CJO fz9VAwzqb 2I9GPFETB Zmnjnaniani2I8,8s򚳯yf 40eb]9J^^=qD_䤞]S}իRA_a<[b?㚛4Yn/[3hS#C8'L/J;mݿ^>  2t eQüY,l]F,qdYLݨ5זӬtc}U2Ѭ~2m\i#ǶD%ڄIJd|V[(˾>w̏9yT9vH?{fFDMdAtي(Z[!Q{+YsgْI!Eb# UVɧ ;nni#,u@P8-0屛NA;?wЇ!͍J3ހvNK<&i-/KTs 0[nϨJt'J$ҧ)bfȆePPUT%WEPi[sBѝ6,AJIy.EO?PI"xt-M];m#DU7Cy0LFTK7_C&.`$03s*xxfNL~DB9+':MEYAB9+'-6YL6[-0JboHYֶ6ֶ6ֶNcNԑ E+NK&/(*44>y'%(ZN\f^j":mRmRs ?\{7.a weM<~w"9Xi:YO\qmJ+c)NNvĶY[\wO3y9srzx޼'L`%kvpdǧVj@V0LYX~'(].?HGY|ʒljSxǕo<,Jzn.JՔjT5*ltaBK `W8|1S022U3IAim3d2v}dZbE;lrfw[BPȺr*R.#S"KQ7DHJ敧akl!+SX AP֦R/圖.6Qgw] ^ji2dtqtvF8/y/(sX UB֥`@ "5{2m^7/78>rUɜ臹] H h;u7Fӝ$q %\!#[lDQ>G١݂֢ow??T60s9'?D˻~+T'MdM$cA#0ꮳp >\Z2AV6JZܝw oH>rya&W.Π"J^[j#bl&a8J&r,e*H$iK #N:6$iIZ溈L+3 vHkU'5.)˟hw>wh6 ;<vIT|{Ԁ7|rp"O~bL~~e{`o~*ɥ"9s%"4's'kWvaxMyM6)9̵>U4氫9h+g1wJ|f秏ҘRߠPTȼ¤_PZvQSe8g#"kw`D*)xwByӄФIP <$Gm8F_,lE@]K(-/kI {a>8(Wk:ps_J[Sa&9xs _%&*Mu-U;չM-d1MKJ'g.hwp=Ic_=z3M7E//] !ۿJ Pi .+x4l4Υܭ[5 yR.=Z9ENIaqD9wt4w|a(~:ñW6^-=ڨ`6e3jh3|T̹xEG߾7k$Eu[4֚ '=82Ws+cqvXu=~tc|N%7ϑxŶAFu,z Q=Bu?i_Jӡ~-1JSWJWN0[ܢgNrs=oeLŋzZKot7W88ˆ|p ^6n{n$%ɗ,G/;<ܬiϪ|~.%@ D%6!!}hNqk6Ϙ~o-ʆE/zu#H@B{AqoZe. )qrOp %痼=ukە{n5^ߺz"f^o5hMnucl*|O w/{e8c+ݾpI| )oN=WZ0GM~7UxXdGR$X,$r@ Ҋ9^1Y)[/>/I 'S&[7}n>΅B]g[>9w9NZ>rbjNJ Z8P-'ox0轰XXZ/^kiǶA/X,H⢽ =0g-uJ4 y|)u X,fRW,xw@ C:rxY=d9K'uԟܗ=)iI2 h]yoMdX[oxE嫌vR] C67fyd\GYϨӟ V\弻_?[ӝGEMպ4[JllbF"|~ qgfϟv2AgY Ֆַ)j$NDcB|{zcw}fyXW ~rBdJ.ׄW+=`.XY/ϬY;' #Vn߯ As\?^xݯE>3͵=kN3X-,VeRBZI*ZZZƣ ym/ZZzF?+<c*CT6v7JqyuN1Zy%ļvt4wf` RO!N/`Ir:C2N<xh KӶO]UW{d,j7̼1~ݱV eWzV穐"Ηd&;J ;s䊍LXuѱU qWMyaiUp3/uNmDAѓ>+ 7e3nhJ۾Z[d}?ͨ8bȹs #4UB&\qoDǟQŚr[e?t _2?ĒPz䜈puCw:pjs,v|2N\4GgIcqo+ծ`DA7>PEJs K/WO (XOl=)0_=˘ՔVSf|տ\UiMvDR'rt䈃1™a‚d;M}|zնls;skeI`Lon&M,Ŏ?zyj) ~ ;3xzSN t1}N;nRaƅw}.O%{7ݬs}CK[qdm;);rƌB}\j-<3w }/u!t 9>y^ϖqV"E_ҥ2]f>>t耄l(M,Qf*oOlB7\34 ;)mh'Wld>e@thΩ\5$G\3LBs6NB9dG1 :J 3N9w!adgV>8ZQLY'N9 S cŋ/^xx%3[[r&h7;jΪFR0Ξ:e>j4ӏ\z˿E÷] E]P'۽T6"ٔ|<9ĸ0oLV?2)m]S}?%3vod\R-0vm]jt7YWT}]?KL|vx&ufDG懫3cKP8t!9PR0=zU|:N_NXST(7/b,|`¾$T<>X⸡v)`.`rI+dK2*^t=].]d4#e8w&#فg VF=FϏ8Ϩ{4QӽK6slڽtf)i OY/xvʜC(Xì #/`W.Rfփ$7SJo.ef=xKcb L <|&| aA34D򻾞s,)dQ歔q@y,_qel?km&ٸ5}m7ghH$&7uQ( Yc CӤ8836Iβ0`dNQ[% ̏>p$**k#Z86_c/KVޗ .Up xZN%Uheu$mp3BGBn*]R:?J,Iz⊾ai';;2cVf57Vt(򸐩2ƝIy06dY͛A>.𕷅\W<<}@F@{{OeX9'4-ˈ :^z7ҕ"ĜQ ^JJ޻XƏ@屢aᰒ-{&NvjCÓ*'G=l=eR3swS\6tm=+.ėW?^F6sݛj+« >8:oGמ#Z԰h5egV9i Ĭ] uMGطԈx\ \$RZ_f7Owy/z*UjÎ3O_̌Z]>6AQrBLGƖԻ0fM7{}iî%Oǘjjkijkj {z#<ɸ~QKӉײZM >JԖؒ D%nĔI#@ Z..tc*љ1bo\e]Ny'~U6詻_z)r8ĮT8xlB*#i&:=~'SL%c{CZJjZK ݯ~JKIMKpVFxbZJjZJjZJ62X9ջ>_~'[=~!EIhILe2A4 @ qiE A^uc Om.F5tW(}n,Psգb0ya&2XNlCzpԮí$7P(~Ckxcw:[NR̖ pf8q4.їW&aI_Xl߭@  TJoitQM j$ șh P2yUvAƊjN}J]xD(ebkUp޸}n[{Q} qehllbF"|~ qgjϟv2AgY Ֆևx.d;PxXe,{4 v[w2#bYVlEopȾӧW[Vd9~#-PQxl/:K7mcc{ѫ:ݾ8YSg-Lx־j D%0bʤߙ°8 " _nW tVe9@a; lW~nE:Zw0>_@Tzim@rC3~/ ˯n.Ӊ\s6 `^UMr&'&~yqkTc'9^x-9[ra  _#} bhUz"@ 'X?1,ugJwe:l^m*f8~ծq 2 Uz$ 8imSamdʍ+'ө?՘ss/vlr[ޔP4ް@\#L#ebp X0q5g_J_riniany7Kn~) 87q%*KJ  :2ԓC]&ڒw`/ۺ}J^פ"sKKٯ{eMuɌ5ec/jť7I/z4D jl\=ҘH>8|pܾsr+'X5d&*mЂ S8Xc@mӅfڮb cCФ)EFhV/Ho8y[]X tgeA#)ұ Z%n, !k҇V'E* Xmi/zsK.B3?U1ӆל' -MoZ8}gH?~װ-'[]_h' 4k_kO!e>sS)Ҁ[%@6ߚ1# ?o`Y4ºCo SO/cU\_8b۹ +x.Dz k|y'Fv2^)vC&:Fkf|'R>MY#?ű#m,|vή>u¥+GXڸOx=U>s謴:<=g1*|tdsghn6Ae"5sOqފy;JwK_-sW]Y1*6d1\R=ޠRKӛeALyXdgrJ`w? ꘀ_<8hJ8NDDSxqۭ,NU5sv޼=;V@bӧa+cVi܍:_Ix*/,=sQZig9̈Ȓ25rS#/7#v݉y<*;yYte^Ą-Э)OZG]ɂ;˖\N y,:l][I J>Oq+&vOIdAMu&}gKĈKA;?wNF FNt$B.^ v75Rp\u6InyY.' J.?{Dw@#[$xFiWL}OԘ_k98.GҘ@ѝ6,AJIy.*q8 EUQCߘ>m٪n,AaB?,VN,Dq9WThtɏH(gD;k=H(gDeu&/K"3399i!۠h3Qך".fyXXX:9*>̩#^W2S#(YM^nQv7,UNd乞t h9qyyDx*I6ʶ ?`9YQMKg6YBК~t!DxEm$::iݩ jJ@z k UZK wr#+xΫͱǜߍ-Mone L6zmXi~jS[tESjL+K.*mN+m_!TE"08 %bT&O T&^ٶÄ<@$q XDYM:>zD_^ !80ݖ0=}cځs'&]b|z}r'u>R-!.7yieXC%1ȊV| k([9$})rN #:8mSu[[yxוhe&CƋOGg#:=fiꭲ62.~eLhAU)`ݓ1(lszohiz3TzY^/o0xg^ X#煙>6J\h]gmq%|d61S|3YV2V+_Pʱ! --N¤J4AˆNG3b_ ;6Pa5$.]R:?e4C]X}:@'Dvy,>=T YCndEJ?Ř&Ğ_Nк'4d6G䢮W?&YL.飴Vp+|~A?b{L`g{dI.JlxPh! 7G%'QkN).K AuV@ Quם^@ ƚŐ52A DvPA ZD;gIcq#mA7TT}J,ƅ%''Doϋk?~];i]3Es/gZsEM-G/;Of[Z[4inanianDsKuR~󍞮~ p_xLQS[n>K*ї)zy8i(4@ Dg%}TdmBCm1#I_Cr.'eͲmm%MۋT,J_o]R>=噟J0F\(R/:]Uwv\5Tֹ,ƬU@_WA.9?~%@2.᪈)Y&pl5uvhZX,D@ qiE AV~ʖ@KϋQd>W:X AVӼ -zӿ'm`9I_J_T֋Zڱ!eІ xlÆ4.їW&BL_ b1b[5@ A(E˂a&˩LuqTF/kEp- >TMW0M:}izk nѧ;d)[}F-dr6Z[ rїW&VNytķ &f$7بwVonW tVe9@`PmIl}8q,?Xlú #4Vk YBvn˧)0=K1R jAYx,AVe1]%_,FfsgjGns7hc]@D]#LXQ-qQ|axCNοHwqQt]?tJ .-!J bb ؏ c %%v Aٙssf;g2DFgݥ@& vqz=àiڸG~QR犛 oI$!Oe/sf[p6 p%'.=r~RײX84LxnXdH\LLԿwMj:f'C={q6`=g9O籄$:w@cˎtZ@ /c{ LBmwsl9-2N2;:Q7KoL )pK>DU*5kvAnd[^A 3Wo!4O+|%sv73RBlY$XLoV @ ]eiWL,dq5rnGUZȒ]w᛬J"5"(Ln,S бʝ^*Sb$[*>CxOC\k]swp;LTU*PUÊ1`fo`GJU2'Pl~*TeΜ y:kѨ4U=;3n4PNj YRiE*Mn0d75 : 2WVQћڞ^ќN΀4#1Ŝ差It䋗ƺxѐ[Gi 4'c5O.O#&?TPPX0 I% qn pVS$h&H ;֌ڛH41N,PTZbkT !ޛl\:I~wo==2p`;r_ZNq^M' NvisG>Z -t5X-XM#qThDy1o3ag_kHKU.Ǫ.2g>=e\پP3NHo~IKSKpK7ӵ75`_x46}2z;Gt_ "ѩ*U2⯥0O\xsvro.]M2~ۮIkt/nkG-b߯| /1G,5+׍3t{օX;NoE~+J|ܪ6<䀧HD2: i˷U d7%z>/Y;fći Gi(uu.wto5԰g~ $>v_QfDN'I"6qT,[#Oh AZM-% K]L(dSCz0ZfߓrѤ5~qt'LV0= 7Otтk좈CKם)MvQGkixo֬9S1,d:߼Փ<sYdݐ_&#gCk ɞC+ 91͉ 3sؘŀi/{exd׹̧}X)خI8V~ho_D+<յKzS@1܆;\A-m5>iQOV}qYԺK ^;L]ٸ>4["i\&|@Y@yBƭk1. zim<ͿMY׷B$z?E d97/.sA3<>4GM9!9)r>-xمg6\dsn/\xIb)o.r5Wӈ۱snxmw*!)-C56R~WVi .#-)rfc釫KHNz8%=oC;蟐Y/iJdm㒒NXv|F<:<@:+2>5?stWA4Ͳ~Y?)Ae !Z$7/D9c_~./.Q d,/G㺜|j,rR )K6H9RU0ľRxTgW}^6;19DCI~tum%O=>bOc(YIS@\Ӣ֥F14Yq OV<xƣo46$ k *e({Ǫ I2 [~+%STjt>S4 E}RP}qBx;,*Դ0g)IڡWʾ!5\V neV39mߘ/!{J`Ԕ?s'Mw"5ՂݣgVYgf8yݛ.6| ey]ؕ7;3]3\>)A$X>LEov85+0ʪ'VA ɿ-_S:u h 1U4Ǫ>߸y5ƬذjH2<Bxn vEJ9('mhbY޶#ȍ>j-nb&P )ƪdpDfZ,aRs'*U&(t*UfUƆ-%6{S.BU+ H䛮0s!Ā^eL3lgNYd[;]5%lWߔVTꭨ[QjMeg=UNY5F9-tׅ}>DӤ4?=!jIi@mUJ"&}5B&#;?VTUI"쐕6jZ6Dri]ExO? [38֚Xf|ÕxzH >)fT5uㅏun'4]9w6OWQH2m󣧻7`dge5r`ii)HLLYYYE DOFQQ155U]] Bil[It~ãXO:ocM2-"'$!:V5=Ͳ u 6x~A{=$nc FGǨEDD&߈sm~_6VfLUt@ K7IETWZ%Nߡ@ ğf2= ŗ_'#Dw2mIPA EtdOKeYe*FipU~|E<2.@M m&n*p^^>XF4 m&n|Ϯ?!Q1*t! N5_ld}ermvjWћ[-Zm?386I[`n퉼$4G?O-kCx7q7çOɞJKaN:*@ =̋K .=55}Ĺ?F_>3&k*E= ᢦ`w%!Fb;)mmX/V~Ka5)%fqmFZzF5 vggb!V{`FZzFZzFZڻKbxm݃|pK^m$ǫ$rħCx71\ǧOd={xQi? @t_~"GGT]trQE #_2]9mD8$aU6DZ$ d4LIDI1R ~[6>Hٽ:6߼Cx7OD܆fXQa0j~@ B8?Ȭ]nh y $؉ץ*9z xn\uZm]VHDѵ fv h~ɪ5gV@ ~:z#>*xa) Wr~l%jXMx`TFȲ'.cAXE[{d t_PrwwݎCE=de6V'?nJO4>`MUR} vyK-tk~wK|gbqvsb%XYybÁaW"`3+ʓ yy ")O [`+Oz޻/)bpBmuJU9ֻ`.NVw`ul*iiŧO~@[o}'ŧ%D׆3Hf~t)=fdnlla9b/K9/ȸJoMcn⪀*": ~&iHT4 ? m[:~7;'xi?kNzjr˞J gL-lƯ8PZ7){yvᖦƦNKfVGp{K"&Q xpJ$wlrj0dU:*R1QO~AH!vm}5@$H'Zyuۑ6jGK ) ij{ 1}EΧ_ޒёsFQ}o6؂1,d!CrwU%.{5:E>s)R~oMr5Aso*{dK.*/ zcsHhςJyH+nCe_I!̫֗AU 9p+(]=j٫ՍݟxK˞o[_3^(+鑅VsqfoQdQ+~Wx) o̮mLsJ 4%^/9 #]ZߊKS/7<:|$lN1~BηmWcI$7 Ny)`EoX$V;e)}cߥ \_ǥF&+g[JҒk N]ld;lN ZLRߙ-2pc!WL~Nj8Z„f IDATVj#+ksi WfݫnM}W ֋T s"M|iᬽ;ۿ/"d0ۣ㖽ܻ\ؗۮ>AL?̽ݗvgg Tϱ'ぬ3eR0ڑ:D!_2[Żs+?^ڹ3iR)$yxLV[GЉ'm+Kض:'g*?ޱJ)b ;~l̉5o\zr¤ItJymoE>0fN'DK?DTZȢsz0(cw\z- 8d1^-@&0Ү)O1J,ltA}BMyb0s/[vjЧ Njnp;Sta\\}S˽݅ΰVWŜs0nUZxPfDmi@jav'[x<>~k/k_5?# O)mHq"-'؉Wء\Af+£îl5O>twB6vQcW~:LuH&SͶ&1q ,MM_}dݚVq }Ѥ UH(d<[jJ$CŲsoԠ%ǟ"j ]w+{8ٚN:IzR/Y+Los'' (gKGš`5;6*ңr)CGI]|˪oy4IDJG6ٰx{n%g%Fi"ѕ$ca'ಊ^?0 xJ]ecbhd=JH dUq::\S>;M t[z⬌O1U-1w4=:ț\oQm+T%+7dlmWa%df%j䱽E7;Yyvbіm:JoGHzI#Vt3Y\YުXuҵ=;τ%00YM~G[z34Mtp%6scrjUËe+3*bbuIH 2>Ul$i2pA<ŀSRRy؁kw8lU ױ? Rh(h&(68O!E%Iu U881-7Ls>jס@ZB>CLP{IOH0ӟ^z֥vR<߼z>L߻#Žs)6SO7[#/G|9Kα\p^-1wUpau"LyQ5<;a&go;O-A7v$(U/>v˳)g<{hfыSx۱&o6&tZv;VxmksUДxG7yDJ"r EIaǘ5\NM^M]0k٪a+j o؆`eoWms:fŭ]U LM,;Z7YiتVsgEU[TX~IH*S]x'NJ%}`pBU囏ؠف/A|jx/=R0I|BB-w>-Yg \=b,U}6#gQ樂\Ѐ/"fZG~k`=-+850K)78Mj0vK!EɩM0`p k@ t`F&H - Kd͂3^SkL .3D> '(+)N.{%/X}|g^^yF7/,rRKxI:&s0vYۤ Ft:k8c}N̩}qawrcquhԳwߗ[-JhQ///uEfLJ>K,ba804Gt9Xa׎5&֓m.Q3sW[f[N%' ?*Sq<@=ȧmN^̸y!SnA&15|48A9a+NS&A*DyzwzjЕm1_B~%k`XF!B?w $}5[) O8{S wc(?z" 3XuPkaQ3m_|Ղ!wIT}fR;޷agn i;m6ݚq <@L}*ԈNﺘ8Wn[d/J]{lOFt:k8YzM(>hS'fg.e%LBkNRafnOy@kZ1L`_XZ,--e0t:=++CEETuu[8V#k6݁RW +[9n}Ibon}9%*6DN^IC]~\2_>Z Te8@=a{5#Iۘ1tD"((*>/S{oCnJx!kLD>@

{}Qxzp,oB81㓷k|5y]+F'o*[؆Ic(ڬj.!ܲxMr^$Wpxw @ Ӟqs[4->y2TJm-A(Whf:Hk{d>'VV;~OG_>?v /Xߩ7]tٙ0{X |/P򭖓7~j1Dőmњ/*3nhs ?!x1^MJy TA `0 @ OLHⴁw{)_p -`+L'@0GW62BK.y.t#KYEfK㟜_o,8 ^0`c:7;]SڱBɐgqbE\ ywxYy,ۊ6ҨCx7Oxv @ ӱxuڽ&F6^H}i;9 ͜m'( G7yd&D%KY߿f&V bvAnd[^A :& D 6L9jo:yfɞb?7Dw+체+oNXa&XIaRopFUaX *e-d.;MV%SZ&7@ I)څgXVBdXN/) }@wWC1܈KoyW١hiiŧOYBtqɞʲTe UwbX1,RjZ&sʞM֯SYLUיP;pKb6LET4G.)j妍83'k!FgS"tpvgd mUMfAS`ET;hEKc]lMMM,~o@}2Vʮ;=V0q:)O:b󩼡HDfS!Zm;XY4ĸrޛl^a*n='˻C8|`y |_ Gn/DbwiiJ)]y/gs|]n,.3#kCIEZ"^Hkᆭ&^}K9̼{:Upyя[bw)όIZJxAy+]|x_lbzj=2ФӲݒg3W?s#Yq?Dr9V8/6)뻻i=`Գ}8֋/=Q86֓5?~Prթ;g(Ϛd={Il‹1Y>X.%ݨCrS 5ߊ7( ^uQ=^KNROxHO| E[$&D$y 'Ҏ+;cJu>{,;]9<u.'t[M]߂?]Է7NRS%05Zzq\~͛犿;UФ #_XdOKGUu#§kQU&mha0-[jGS-]>Wau2϶*e6aKpL_)pfF&OM,OVn?y搋uăqN:ҡ9og-M8dgz6 49rS]Ԯ7O02TX>X $ A0.0Ti*4M}G;ٿBs_aqjdlw?)6xY<3u>fVP|Xdf=yZ.o-(&|@YMLGEYK:.,P&•"&H|~):2yybү ޝvOHps,ss+kU%$' `ΞuOA>^b9p{v 2<Ґt]FZRm 4ٳyڔá"wk?ݾ~^ ^70>1"g\rڻϑbXSp35TK<~11rN3kgWop} ɻx_|vM g 睱\)g򲐅q+K59)5 ym'ӗ>^v2҂JϪݒ)tUGv eT@BK+2[QUO5`VunQWME qC.V>D$1^8: {GHdGg<-"1u{볛jJ -{'x,kxEK)mfj&dȢZH(f~(j-|Jz)QRP[ߺ/2z;QeVfe1@XAQ:`Շ' v5(P-1)CHvpzO vy‹QASzw~@BAMn|AwHא&E L̾.6ˉ e-k|1@e4ci@|qɇ̤@V=Q&̍> z51r'sZL8GtL@Y]ZaHkmPSFeWeUޑDe(xn َĪ>ss4VtGVۻ'2#a—wB7`"/#QkEgoY%h?L}xj}mKOƕtpIN*/"e~avU ;̋760F%Wǵn(a'xrs#`V~WbN^))R~̘ᅵv&\uz[Т ~؍(BJse&k$MN5%9%=Ym)+Ěy_*ZCȲ'.cADE[) >WQTEH cp89u\+&kjnhOAg)@a%K| )pFQ-(]RһK 90s<ȥ.j"CDT猠w5*]҇JWy݈x陷c[∮|dUʑVCgy3374]^ 0FvԩwئSiX9cgM=\%ʼ{b1\7<Ϭy| [{<?tXw\`'χQ%_ALx)ڹK cwEK p5߷6:mxH*rOxAyANᗒ`1V%K%2B}f!۷v>^dTp8I!wKl)@wbj.+?g£$Oz)6HXH. &k~q KTA}]cf%0fSk=S7YH$W}U1iagIU>*Bb"bqDW4lwpXLtβY6Xb)zvtM:e*BcxW=)yyINUV*^`\MW9GILs;V|y}U ,%x^oDƬUEAwߏ v#-7,9uvhHMDǜr7L?ҳxeA<ri]ExOeEPӲ Qa4)M-Ov;Z5oOsٗlGSHDqNͬCg>8qmk?,3cyJm1Y{/mÎ+@uOڏm c%[3vΝcUTG6;L[p/zy2ϰv;}g)Ż3CcIUQ՟/2-bm`02fbi9`$&&G SSSտoil[It>T) rr_^ڹ1m >h2kxuf"+R9VN:V1WGVNkZ|I|iP+e`[@ K{%]f.cCo G1`ǰH2}p 2lysӆwý]XpCf a|H o"ٵr#79.x=doe]iBUrU)̼{:Uˆpy@{o3ih*ʻe,v=juo(SNbZ9⠠4unQ$[%ҩ}["<APx~@ t&2.6U*1Fڕec6~q?Q`TiBNwLǾ$'3)"0Sm'5`8=i2Tێ-R3ڹ>7wTW]t{γR Te8@=`P؞X$rJ?:@PY$;˧?yC쪠V~cT'kU؍υƚG"zm5/ҏNē%=>&%놷ѳg7^Qdc;&8UYU8%!땟nim7w }~yԶLDx#ά;%tbyBVt#}䫼 /Η[+^?1C3_ۈd?MĻ~øawMu|u,Aa &ּn j @QOt39 Co ƍ8E@mD'B^],\4W@ ~5t#BeB7:D ?o+Jk+*VTꭨD5Zspd9ÁfZ"̓mrQD&RoE7(Q&>`GW5:vco+.k9KMV;xދI ;T9tNJ˙,rڪUBGmOm g^[DϤRϸnR_{5*>NW;ܟrj7_O=TKϾښ@V[v%o%dn/Nryh~ ? ;sl2x 37nw'\|rqm?l?^zhۡ 2l{>mɍy<QߚӖf{?FYNk. Ў}̀g_WU}2 ;Kt2uWx4;8q6clYMYGU)#N *[N"e!sfoQ\w Ц3ƵcR8bZ#\mtT"R}&̉>CŰ*awBi W.>$"öB"wj4]_4pX/㥝;&rI GåL~PYY Y޳*Xʓ@jzuwt`GY$haYUƲ~šsD׃ n3kN+|Fy>B)(b ;~l~̉5itjks&MS$k=B1,[;Qf|"JKw_ EyϞ\qe-݋'-\x5?${堇F;%:#F%.`;-|lW2v_ }veyѥ'"/ MuG{eFm$xJ]ecbhd=J Jڛ 4j>7'DCl)I“,g  ϩ 賖 I&3UJgYPu~$!UA%?n;SJ\mQipx jSR8DQe||̊@tI:e8#XI{Ed1?̮*e$K^X"u2'=ITֻ]v٧d"ڊ11u=Bh|E@lz`jSݺ%OY!{`{g` ӑ۬dƚ/KL2@[._7;yPsNnk{v K,``@tI:g8#ӜnuhַwhxwrqIPjI_a^W\WG je,EXw(N ͋7V/af2㔫xwm9NG0ϰ~ꛕ{~$AXz`;5Ata8{a~#<6?e~){(NPIwFt b lsd7?<=f:`p_phݽr6Oq2+;:y+,Y؝rY:XY88>sKbqDG#]kar2#}*`pc_VG5}ߎEdl]! z6pkE_ -0EnE+\-|HspY $L3K-~q%൛o_|#z͒/'LJ>K,ba80̊Vtp.SN8`fyS"3c4^B)W\WQA j!iJ pʒUKMb rKlv˩d]E]wт *(vba6vc+-(AJIQA>|?qfgvovyѕVxoe}f;^C&Ns)Mi횃Ns=XKYs`*|ÁcX?"DEn[JF4c7k\'I]o`X/+nEٻ! չ4+ZYA`:F@2?h4ڛ7t*ZH$j;@ؘfS1o~f eׂ&a xU'$#T~{TG"  "ԙAo׆qw]io8)gLSwZg`5@!@ADѐ4f_D Ik[< H%j_=v̱_8 Gݶn'~y|vS7oу{=EҴ6{&W;?ztMr.;`W)sY#|iƷwvbQ(/AAگORL6OA)v2%QlNZǒ//M)*3v?~KqHZ}g<8? zcsʒp@j6v~OM@T9` (ޮX̄X<.  n*ۿҮrӹEߟ(Q$<Hq4qp dkK\ky V?o|~4wQJ3E9gljY}L{kV<3i(1&ϯLZ3K9?uBQȶq(@LG /zɚ'I8NE V)jUpe *^'[;+hwVO2g$UEj{.~}mr=vqՠGkƯv7|!]?V*\ ?uBQȶq(@Lh\SS6k:VV.1%ZxFd1e 4 R59sK16-d(jUWJ3y@;9t'+6<+5AA5ȵ d;gΩLXqXw'eû˓T(P cjcŕiJ k2@.\A#u:EC. ;moN~cGřl<,{}/<^IR@REAwy"Hc'UWTPP0vF֙C{w1]6GEJuM u Ue#k6=XKYo[FSR1r )jJأΊ섃v&ߣi5 _5}(H2zji;:ZPoL7?Բ6to\Zhݜv6y}X63iZ 8Z5F<$k>pͮbDEuO6 #IkYrbAdxi]>trYeY^eREAN$ 3}=q-^T榍T%H })X?u\㔥z_JL͸6~}-umٴg>I2:ɣ[ߟPd7gV=wGݗ?svBՀc3~[ϑs:Mn&vǢ@HZᄄ,` ^ORq$9k CpիDDEˇ,nH.At^x!M8Cfn}.Z6D[W畓^lw^ xe:H:nKڙ-XBlF#Y' Wh {; ou54]w٩7/t۸qsC35њ%%Qg6a;p^qY㺫kmzBچxēs^.+%lf%CYSjfs|u7[{bǮ\YA_ Ͳ75V&䋬fpw"ywgI\Z G4ROߍ! Ł'cwF(p'ć4|u٣lZ"&C E Z9=+Oɪ͊ܜ >Q>PdR=["xg`Nrr1{1Pٔ 'wU 0~\i@ҰnjS \y!hQ#XYֆt-c3I%EO/1,(H'2EwɅ}q]r^UZEؼ *[\N*InI"'c,SK-/NOGM>jFYz)Ox!(x%|&Υ֨k/ 0Fc+K>u}e̓~u=al`9';eR9:π-n+<*(bQC%%_Id$5io&^*F*ZL>,{ G.%b^\Y[(`)e4 ]EY!́"t-՜qH+; ҆޲f5gd;3m 3-@̥p=$?<[32x>Kr /ό zTNiRxaG9tkh8 [w,O3 #6kkj{UJr&Eexݬ-'H)(V$Ȳ]iDAKx9A'PGT^xjKֿg3G>P޺ZZ&#v;_m$. ?-kl/5fCj+#pt;} MQYm DŁ+\^z:;c\1" ,wn cW!Mɐf@E:jθ׏E4RC14gxx,<7FOn0pP+|6%$8Ȯ.EBQȶq(@L!-l'111M6JV&h`w QHpP)7`V?3{k! Ҟs7,}C6X*p!  H;Ƌ#  !j_pV]Q]CCKn2p/%Z=9ɨrzjHnt ^ρӷĪ3Qp"FT0xōC]SC]S]EIQI]C]SC]5nj&*Ztb3"}Zhihi9[4=AAi͹..ה3bYĮZoDe/z9rMBmukOS2*z5F'>wXRE&ƽZx[jrJjrRՅkjD2Guzه ƞ}, :se"mAAj'I .rőylvZ#d8ZO8FQqMĵ?+^˓? 7n#\9Gq#܆%j.b&/vAA<>˗ׅ\ua[A Cy2x\?TVX6:q%VrĤO:sٍ+hl]Ftl|]IΛ$/t9$.6Vboߒ-Lt*1qw E{Q^^&lߙ뜟MA!Pd8#TSԄL4dYAk"{CaD:JX4O]V Tu:Ҫ!dաn>>eXlw<FuIgvlTk%8'9~Բ.S66.&lyo0~E a [pmFlLt'm AG"ơu0#q"lxqc><C՞gYȊ.%&8I#̍,O9ttXreB'!> X+׵ MVs?M֜s8c;? 1BO-q[\[7"Eu@u kOޯ^݈8BMDNaz1͵Eo[/F# Hinianas)7Llkeae؍/$f&#+Lu7Z}fE"w(m73`ǻςH=:nJm\-Ԝ'W;+cջI8ʤOՁ[~a~}_ϓdV+^sr]kYCJ̶9X~3lg2}m X=J\'=dW j/#ʺ.ykR$*ac˓ 9xn^>HrGQIۜ{ƌVk bHROX`╫dH3?"2 7ެGgHe9漓}hWlYޥi]IBH9"ZռF> Z w(m'TOgOd[nXBڊܜ'o6nŒ~ _/'٣9ww\'53"ḧ+6`Azl@:+^Gݴ/tK!Knё{S^\|0KvCflY"kL3@.uGd<>/5xˈNĴ 1&^\v@ȼ:%i8׾'SXnk*/98Hbom1ʺ1~޳3`FtOQPN9jsk k)[}.'{Dά`i4in܂']m-,?N*ac=1Q*}^}g~k';`b$vٷ-O%漝ܲ}G8LvrxE&(l8aOr5lxѨ%V)U59\/j+I Xr8%8b} Fl)ס6 uNXI7eOIE5½/K!.buN <^ 0;ڪ6~ S_z3cĈG/mT棔2G~`iSRM+NNGAa#QpۮYynNwp&{7nӵ#=w/.̖wW|+BF.R =qsl=v=G/a{]ˈwAq?OB|u!4j"&C3j.`3]nEoz7kz ![*k#3CϽl"NyqhMW8_Wh3ڋy/w-{O*g5$(fȾ*x\ɾe<IUg:k/oY zٿ;K,'k&(4s<~/rY.'Ծ%]UAg1*[O.ewX;G_xYLxa*(-Ai϶cMۗEwvTDdiuHՔAdZ9#k>l?SNC{+J+:4H <$bXiz9j_Lx)8):]f j}֨k/;|N WiӃ+pa5c8t׃ HsLr1'˜kFʓHYp?(')<N;ԧW5Nu[tuf;ꅀ A6qsz]lI-łX*4'$/T5Daro9ayඏ??뼛ػ$թ#UPF` ye[F;l[\\p'e;L>ͬl*G]_lq耫{\󯈱=d~9ڠfBn7Iys]2|hK+FpΐqUm>V}#}24qcY;{GBZ1*H =[}'ꞎ윐\0vK{r{Tb/{ye3GXp*f]HZCcO?-qj8X\xeq|"UJ ,߭D\RX|N~e//y[n\Y_Z0,.4IJElj+ . C e3.#&.;+voe8 O?wnܺpuY~k 16zs1C12/l\B' xYiF0.#9*GBZi?0vM^h&w_~vFR.NL+v.#v;L$zR5}j;.zP1xU"i6Ut(~ҏ²\I!e}[yR'9Nj]9t{ĕmFo4 )ښH?@x.1!i<3'*:pԾd&تP2jP7}kW- ^^wAj)T sq7q9nJw%%N |s[tv9e}pnk;=HT_EE3B e3^γ݋|eetM~b. .#_Y8%xYFN*C\ˆzf4Ma]TI.{عkb2}.!SH"ᱲk.\:J*/0 70ۥP:*6}BJvhoބjkөTjk"*M_bcNqļAn_ DPvg΀& " h ,}C6Xj  Ǵ1  9Go>ʪyj5 lejj.OYbܲϲˆ&EAAK1*XqgJpH_Gn8Sz>}*'+/ms5`d X,BAA8K4G} n2$JCd:7<<&Jotf ,3!>7|񷋆  %ʙ޳,>=5+Z|~!ݣ~7#Z"[ E̸ "(//uOݦtT(m P)jBQ;8ɞ;\ޖ^.g:cW ,bUfbRή~g Up.E8YWA!kͻtMChR /gJk3B:nSP:*6K~*bJǃ(j<fv.OJ,Lw,*N}=J7WU`ْ֧D.  O1$Gul\6` y_v8\JqJApжط/<8FOSxy:y&qXؚHs 8{}/<^IR@RE2 /o[npe~kev%ӌl[!Hb'UWTPP0vF֙C{w1]6GEJuM u Ue#['61vu8"97il T &o(S7uGUiTB ?7:7>#gøOs;aDj˹c,_O/}%MP>H~F:?ږ ͧƉ:FO;WOѲ5J}+ʹ7RؙVmGiPvn&nl]wMZK0fL>{vS"~rW)KZqmB*;ĴU{~QuGL8v%. 0ŗU&lmYnqBNb9@1.tsAX[F>iǮq6x){y6<"}뇗 P"Aa׏J(kųFF~}CߍPel΍r)vf&v?T/3w9v𴵾͙?g.h$ȥbIp2Zzž4N櫻k;v2&&~\SvS 70~z-u疛HVNy!ƍnc{ɏrS@hhxoS[n`=vS@ %pvA;3?9Y Skr]s#ߞah뾽w+]EBLKY`'7 ODNd>}eD @2dQt\ݥ~/?-UUěwrVj61zRj8ZdaRnɋZNLs/'᱉Qhn{1 ܒb 2g'C$8׻VȒerK8c5 +1Per&#hXL3 J[&,:AC}q=!i] zEr)c%^Y2|go+[&>^ldk#EsĖ D%ta']r_bMOXaWE+ z,(J0qȊ.%& &_ʍ)hSI c3yKG8o 9$RRX:G+v 3h+@@[H>uuHC9f#.ZR/ x}z}$-q[']F^=86D@-#;#Izf,.,z2~>'muwy*(UPpPF~1=i>n#w#RKxg U+S (Ğ |NΛS$M6.l+gY8//PB#[*xMø?#yqJY|"MFd'z?HG?t-k4:EC}q]0o5V;2ϡ]Cae޺leş}Yyx1]C]SCޫrUV3)*kMGGkjl}#l|7U~{cҟ2TU&|NG'NY3xo rN|X_GIՖ|/[$*Y!=:3I@Tu4FZ}=Y8NbKͺ,kQq WΘFO=yB#CG87ɔmh7G)*<'˝o`_f:$NeS X,VFzpܟ?mmX8:K{IIIK}6sC)=s8\fԅ_78dJI$<eTeG^ڸ_n]R N'U^>0pP+}6#$8Ȯ.EBQȶq(@L!-l'111M6JV&``w QHpP)7`V?3{kAØ{y2 y ;  HۛAh_,h/-l1&PPTWQRTR-cEZZ=9^{;ERS6Y*3 8oN.ۘg\0۸fYHLN{$c ?!eT֐}-*59%5j}[RSR3%)߈c%UM#HD2Guzh ޡM?mO#BJXV[ϑsnJ<hkح#g_~up`-7+^m=~ A;FJhAA/ɏrS@lNy!ƍۜ'u7ms]#؍9s5.l|wd$5lm9Tb zqw E{Q^.53K9?uBQȶq(@LG E;nS˺XNxtX4=VyqcOy>f\ C&+XPtWABU+I+kX$VZZg88$ܵ.zلwWp\#fƆ#  7Ȋ.%& XaWE+ z,(JoWW'KN9p,^EЧ{,AoZFp~)8[|&d{ Sȸɩ^1.zv5\IJbXwl{?0WB$yttX,$EyĀ :a;:|–  5NԾ87%<^q3*)}^ ~dQA_L)`|6U w> Y}F!AqCS4flu 8_/={ܶQzj{ފ RGT6w /ߵ{&?+>Iaaޛ" 8Y}*'xd1.T[~ݻ&/~_ P -?7gI[ͮGl0o_Iܼ . * 9%XKk}qkVd͹)s+iG uu?d-:bHZ)dSp89v"wRԶm>ABz;^9@ROOv1nf)]|?` SU8K hD015CDuqG汧u% N/K4G}ՠn2$T9@Mvڃyzά}wP?E쌄r~ˡ<)%{W#s {ƌ$q?{=ы ܂7S21EQu ,'{IS_)o}qR`2LpȲIڐ2ޮl4F^sZC1^):3&C ev}#/p:⢜C Ǖ}_I4^\ux }N۔e,(]]GS =gߚ _a޼L#>;1"rI0qsl=v=G/a{]ˈwPG?7gj1. rl ʏgh5N<f_rvAճ+ ϥp^s(k9j3YiW ^%c}oZIҘo]^YN="^R{] :x[Wpz{{2V'sBemdƞ\|(wMd)/-^G9(j<fv.OJ,Lw,*N}=J7W<ߦ Ay^0]Nr=WRҗ ENF.tkȪYZ]˂ :IZ_fC̘ڧh]l9p6KGB/,|MWXX{d}c`>.^pyBszUK4ӘVuT"Ji?V>כ끅2]B {}/<^IR@RE2 /o[npe~k"CD'$q|"UJ , @Ka8˘M=,_z_ /.4N+p ǟ$1PV熗|)JdX2z;(32ER`89 NTpb2Yqi72 iT3^g1ݣ9#Ś(SqMgQ-QAyޤ&tE GRzgWo,Ĕ{8/9JPm2lڝsDةw.)=])pR8tB6^BtȚU+= 'IhY{]rZ U 9wSc42":! (:pԾd&تP2'e|Fg{F *޷+iݮI}<ʽFLqU;*xc0!Q;!Qhn:׸lO,4pYyxɵ:9Y#,|M gxѡ+nb&v /z;yUgH`M >-:2Svh7c$Oq k'ιjMfI̳wj]mX1+J_mM[4ui+>n6'ٳ1 !u.}<=ٜuѸeP}ICzϽ!Y6c9|Cr~|+S%Og7?'A|).^Z/^f˖ܒV^0a^`4c ,Oáf ['t g\˅Kp7wHܻB!A_:.2#7jmS\[49:30KJ|D}P#ZӦ^m6o7_-UȃDyo3 ԖT]ŧ74Ͽ{:՜V-Xcq싞짹&kyN6w9}aVׁ2("Lc+|Fq5=mZvכ03:jNVňn`Kd ^EXkcG itm6itz ӽ$BaD\6Z@+hY gAm.Zzxo}oKM[~ ~Tm8v*JU\:9V2imo{o]3JgY_ˣ;Lo)̒3 ,4arz39/}lX`PB&4y̹V,+-_\#xK KLAb/|Mb[S/.q|bYvj5*)D|9RÙVdqzq*KTG2"i$K2ybĦ n<>%)_T5θhZ$7*Kp[#"/>o~vB NRL|&8% ;Q{Oy;XMՉGمءSǮ?I-Lt9yPk.CF + YQ[t7<%& CnEG/W^iL6J7Ѐ;x|@ Z{RPqT yWw߱Q@ =Yk7>yb1B⢔w ,Y{[Wc#l11NT!es\UB>ק4 ˉ"O1Ǟ㝶]|Kǥ3A.yK=fwmR%h *WWb:퐠{;@H~FANbcF~#RK>'+GX-6T )8}xX.|vB߶7q?\1B<RRܪ"ꖣ0ۺ;;841a5ENrn>12ԸPC4X[+ُ%CVٛ4S>SB֎lh=pGe{-랬m. 7WնC=VolMCjWkm®krajB)Z{i٦w5oKPG{Q&-}<*^a &+[ُ59y# K޳Z ~KO(pMv ޾zFLu8ǣ[{埙׷_-"9Qͺm<ݓzy9##{r#EQ~_+NEϿN!&Bw^zmJgLjNG!Ns$5>uיF-G5"7rB"?|xu]a_!$t=4 aaE6)Jr^[tZwg}?,n|JÝ,UWO{2?BD''tW4`lllRRR+FQlh:2Z=bPciS~84lޏd 6;/lŔhie}.z)$wh ux뻌L e_nG;_\\krˑE~gf޾8FA΃, 15r݋-UІvMO?{z,F:0I]ޙ2XTGqqU5B_g/ }Y|kw}٪+Z!۲-Y͕)I]DopڗĹ,Yq^R!kDP $H 2iLnUt,ⓐdtq;{-}(~{zuЮk~7׍c\ 0l+!}F7{YgC7X~Ϫnѽg:ط* -#CZq9Ӵ;ZZٝ S}a?K{-:wyEu}iRXO&^^d͸\αr&ȇ[5L&f?|qc'###4JEY@P/[jv_ȽCWds3OUqRAV,޵Gm'wVHՕ[NqN,*%=N67pۤȍnλYmK/^}lمOB55EWg8cF|s ?ӸXP0i3׷>=B'ʸ<}1|ƅۼ[8C?85xuڇȕn,Ndߝ?fGɘI/NMJsyEe^{?780n_ON?G!Ad;_뫢c=Yqe]E'~HyԒ@т\F~ ='`Y &>mjF\[w^>mZ:ߌe;`_&ܔmLMI̞cB3lګi/|5o,f ji3\@bAݠ_Bw"泖q1-fo[xLqvҭ9ڝyCQA=gRJU-GEn2gr;s:۵_731ed8Alx/fΥ`TgO76AljewFԷQ]x0 W>ʝ0v7'Gz2Fa2PDŽb*DA U:wN?UQ|K/מLܺNZ4PLFm"NO8Rк}?\oC| s# pU]ȡEJĈ# ,vg#ܶpH7Ioo?﷙<0M49GaTꚢB̸qޏȕKWbA} JR *J)ĥM1 $)HVE 9t);U-GRf }8Mje\<֢{hh'dR^OX߿#e}W~fbT?׭T (zl3go>MRřw>73,װySލOEd*B=?3?fa'wZݓ|L4Pc@yc'~߾OyT{߂T֤9ɼؼBw-Ӹ7"ٹSD~lFc:&`9qLZz>9}rRri5j٫ȉ#'%Cל}:13sӐK+ɞLh/iϜ񥕆 [80aCP7i5MNLHV\vd!D 8pmg+^\%t}[YrQDwO?_y+nsF} q?<"<湗àOuO**T1*ptB5qSI2n#YB> ŢkP`k)m'6ܷJR)!džG9*XwyjO Mey"ҌWSJ|܁~^XU 7k;#{bRy\:dCW[3QObD >?>c01zy[LC}eؓf Hj1b|A!R'&ykZ`3'{{EM`#T-2do`oF:*?LH]XRUi9p?_=/.[ Zy*>_K:7vćw[P]mH_WY~%TAҳS˾ fT_19%ƩVg`sGn8KiE6q ܨ`Qfɡ^5|7{lo@4ʑѭu~4LqAm~\7iWPSD'{2_upwhr)j܈JU>aBU!B(C|lJH5yv6.̨Kn&x㘆 Fw ZVAhP4M=x9@=<1zN*@I=ͣl"/𒕯3EӲeٻTvNqTa}Zt~ȵ@r#[99Y[ZX99Op@aO )8CJy[X~ ,沷sph1IBDy]zW vhw Wi!ARp!e#Ê:Lg~)!"ɾX-L?w|&0@?|r᪽sTX ¯K(E3wL}v-yZ8q@+B#[CLu%%q\yCZ~L=hG/^˼LVMk i9:xz4% ӽ$BaT=j3~KmnN&Wв:HC:h[6DmN4 ="sY;ZqV<9SQrkCv?_Ĉ7B”cs>F?wt{w !*_0/W_ƨNotv v頫 ^即~Ps,IQ)UnJWY5ߝm&#MY?mKH*ӰyQ7Ylpq.s*&TV7Y -3-5C7~G7jii)/_N!$ e~<=:Gwv|}||w2"Go/n?rʈWs(^{%̗"DN͍B,لMA͊!$||3a+:N4<7|yfOvi7D"K.} ”!$H=xTv~~ǬQPcυ],i5[cAo7(y[q%.'ׯ]/&Hewv s64hdn|רTvaAU q~Ta]N'A~xو.>]Xw,V妁oNwgv[4&F4 $0aب*@@P/[=Vۙ(ΊDC|-c\ u,۶]Ǿ֝WL(=-x\n)eX@s_E2׏оCICV|'IޗY\58kp2 zty3&\>r;sa7hݹǏ/9?ھn䛘Uj@nж3"G 7w\)6)_zzQў(uj 3q9|\HW8@BYBUpB->zo~w yӀ !a%L=2W)\gW+gF4~ QM|Ԍ& 85 ʏ;Hyύ߹0UIfo.R-ʉ:(mֲ:q',h<}~+mypv5Ms8"Os_]qsIR+=j Da J3y{y%eswُk+H΃C!D RkzC38r_ YCi\VL6kʾ.H$Yݶ=!˥YC VIqR#BH,Ⱥfw϶?B}̉mCt5՘Tb4⓬^,eC{6}h$~U>P񰦭(75"  >BXp0d&wBo6 !M*enfTswm>W?h0:v3-24:cQ5q\@˳S[n c"DmvWBHq;籝JB<, WvhD 2JĈ|9 1h7WÇI2BAQ˂)M*P&Tn ,rLPzHW!BA5Q#ORj*Gc׬En"D>s '޳FB!8"W }({t:f fGc}$C%{3Gs%mU4jiwv%HqEF)Haf;bߖF9 ֔M#eSOt]AE^b~FcZ1g"_.PM{3K術CB&]a]>rضƲB,l]5!pa.myʎe~\!$z{3fG7YQS:.ZZ' 4o>Mu܆탩vCvTx,5gEN-&#Bjc?WmؽkJ_Ypؿ`/%$ݬoZ0M߱eQ_xe?dGrQ }jdjg±*:-zo-;)țL!&~>е32BN6 ڝm뷭J+#u˞s,ULe{?|O!H}r@@|>䔞_DMJJD$rhYǹw4h}l]߅|# 5L&f?|qc'###4JEYTr\CNu)$%&Tm˜i='F ФsQo6ٺzB\myʎ _DsTa}Zc:\u|> :8q{; s8h| rq|^R;Ǖ';4A-5Lg{``0A(L]|\Ӿͭ) ZVA=h$J I!7v|(5R[I~B7ȍi:>cS/m*C.lJmzB8}}P#BiBk6!:GJ IDAT; ;:ņP?АⴏQ߱tw$$IIޫWO&Y/Q@.䔸XG@ d0Xt:c4$Ax܈=zK sR^!9a.=.F$I$S!Sa*"ɄT~,[0a0 a .RIK,<*0 I aҿWhɢeפrݒ)Q?WXA9&r5,=̉/A'ICe*ɔMtƨm1 80r[XV򕑊KIä+$Qa0Ci/A 2AWdT>Q|9B  20$IPp T *&&‚rq\lIQaH e2YҝW.RGj)B 0QrٴRob^k7Tٿ^Lxz_B ńXLxخh6 H$oݼK 6LZ^+Ts^c^[ 1GtX,T*mSmu9ĹeÇ/ZJT#Ł))-]rǏ ro/m1W/TmZ9",Yl0,1C V2WdgYbU5ŁnYzubb"]ԧO"S7 *;[IvBBzUx4Prz*[_YcF1a^@%p11ɧ(mr#G2m~իkkuM)ŁqӦ_׬]ڣU̵C_7VC!&f%4q/Orq9TqQ!׭]˗U+W.[J :$Ap8&Mn#HRrE^W턤r&4zsBUȷj5Tٿ 5eN*oz'

\Ł4hp+W.X *)b]uO U1ߪbߘƴI$"##_r-- XA.tݓrҶ 8K~B2 mUM$vY U!ߪP.5f *5$R$I>|0,,аq3g*.),R"J͛/_ݻǠӽ$b80a0Jzjo5bbFPQG$ԜHEGG8ަ~W"sr'Lxʕ0@YL>WZc0l)LH$UNT\&մje Uo*bטBJe0F Bytp 9kn}Β,@k~ZXXPR\,)|ޫ7o2xK`&{(W$HD\+[[ErPE}%5P0 ˎVq0)`! &UnUHql^J!,HҪcR^*!e_v?s8b='Tʹ#@z>{JqdW%Xka&*fTekǫb|>I UD$7)Ӵ"DJ!OBdBay[@/|~l\,͆n!=Ng0LtD߿k?;kb\訜l dS'*ڬ;I<@tc1Ԕ`w,C$zxxR)jbDå Kg:887&5aFհCY*e`ܽonN&$KHptpZ" mllD"{Wa@1La4ǰҺXɊ@\b2 D"S:* cLLL.WޟWۢ|(Vי0XGGG%. JKy6 &(-7j$[HP8˹wC}PG޾yheip(JHY,EEET*O$bX666'%%x^b;lRWG.V8`0RtP7pp8t:Դa1FFFL&Srs+r @ [Q-uWp /uAݹT1^jsIR#I) s%H\ rpt%w$|C$8.}' 5$@(˓ ?/IIENDB`tora-2.1.3/src/help/images/quota.png0000644000175000017500000005253011303312237017073 0ustar michaelmichaelPNG  IHDR, sRGBbKGD pHYs : :"tIME \ IDATxuxW̬[=Ak)N)PJݽXZw'.;#1dC3O2{ws;gؘ7`Yi` p\ 0 @( pwwHdk qj"p*a1o)WEk8k_ަiZT i$I[kODӧR ASe0PRx%Y+.[h d^opuuT'Wĵv/om+JW7w5jD"55%ֶEЏ= Z$IZe Wb Ϗx*ht +cW&)1IPFM(+ BPxMOO+XQs+ξUx鶆f۾xmat:ROaXzdVO:2 p蘘tŲ[{xzE0޷*Vr l8' cM2=(e7MWEn+9k_DeXkhzG140ֵqXi}RYQ$p{>-eg-_ჷ JbŐsϬa5ߠIv6Nǚ)9[/ey'`)nAl9kkM]ye5ݛaXXf 74N<CQ| c\#߉de5ť|waĻS&,*.M{Fȼ>53?Bͻ:]ϑz?zp f3L_YQdWal[YJ<8a?͕apVd ( ] ['0yO1J W J{$DEeMSQwVZgɶ%5WG~d̐tpܴ{œϜ­_!Suw;wNͫ'W,>0!v\Ӱ_ HNȿQ}ٟr78Tm3x\T:6#Fk݉S2\sٳ࢏͐*:*_3,;Ui!Đ'M}8hF68BHz͸ <ީ=L YԌ~]q[k:'YlN*{[Vƭ_VEĕξL{Z7%uOs8GC7o(B.df}, |3piP}wGRlWCTFG. ̙Xq 1Kh2-Dzt ZQCi IMeQq16n>~;V^F㹫p3 }~gX~~>ӹO͓mi`hd/t"֐eK}i6U:]9F?~-u!}j|yH2./6[::_Xmfh[ 9/(V6*osq9mfhaYu9C%/$?}ߜ%Md&\L\n]u=ieY.j@P#SLN 9kۢK-wOF[W㶣Ǐ4k@1iajx1ֳ,o!lд*CQgOh| pGP.gٻ]yi;/޽wI?_Jܕ](R6n߸M'rд:~gw^~Ǚ!%/v辕}^NѳL: u5XFV۱zu=ieUbjOz)#SNBSW-8FOn&/mft$r7r[5 YX&!w\ǐ!Ν')uiմ6Vr YHtEh0>Ą0Lb׽{>חZU<\6`h+_1A nܽ0 a>]ɸB!2ex6½#0S6\ҽ$^ a`"}z?ϼ55:Hsb!:K6iI:#qRY4pQ1KvGy}Lx)ـ0ؠKrCjwQVӎ' :(fS5OcV<ʹB-uj.t0m'Fy3Y?c{j! ݆2u>"n"WF2!kp o!sTz: x~2Ҧ׈Rȼbz1"L"b5IjF*IG8 qSxfYDT˲e1}%>^/\F;K&t Q4Ѕ-W!! ;w,8NqԐthŒuRf㘯7ځEuu ! qDv\C#8GlRw!T%=iݱ1z5xui3ڃ!I \x+V?i_7/ǝ]2R4_B oT~ul&8)eu?l5:ltlC6}5dGc^A\vuzy8|/YEmq^E%i#r%s=b 7]A?g T~z"ot?t'CǙ6E}M6^b",; Ym$Ĵ68Ӥ~<|uFr 㴢}fMiSCkizJXի?YDpqVO,B֥h<Ĭ2JarBdV-#3/[0d-UXي#!3nS$KEP[<kB&Vaݪfv̐[ +ia,$}k37,g㶍9Nf Ra 4qO1]LvUGQSRBH/qEیϹqy_Wg?'V}6}Z4sᲠvވ}#4։3vޢB-Uyߟe#-p1dx떭bH7WSBHHPe|\Vm_2[urh 6'BB2Fg^I; C+yFEKq&tq>?&@J<8lekIʪ{cO>ȨTsiǵt*eYܦn֯?xVGwý+ڎ䱈$s uF3X&_L5TbY8Vhz Nظda.-:A`a5rd03<7by{V%*!Jg D̡RnzLRTx ϥMo7;eZ9' s嗴d3-zQ\pB  3u}mL΃#'EXgn9r1 ajc[85qb|ߑO+4Ro3%_®nwCvn/{IȂd+Ygv>UۻJ׭f= w\SgX׀U%F!O컖D٩u¦fʊc;SV2?"#?uے#?tk(Q1;"0iu"tjmΓn+ǩ%4msޣS׎ q-wKM[~QlrwCZMb'U!wkrtp,Poƍ "4BL2[6:K2zݦ|$0BD^ulMy26ng 0+n5 ߺq}r–Rv)+mpwOW6wg"¡ՌVl*̱Fn\e`e|pi3Nn7,=.fҁ-]rD\%hE-G)Y'A]_oy5.l_$pi9!bž݊䶱ڨ6@_ܘIokjЩl ' pb`Kc0ڷZ*\¡l:u['УG>WO"ӏ۵oo&4)#?6#Ο9vkq1 d_n(쟿b~W2gx%VηI'M<GxXo3X .8 >yEx|mKk a8C5`y~P(W׵yfЬ@ٶ/p~{k 4_ bR IZq#Ð`p~9z[""8?HZHB^L``kg*+5 1`B9v1[[;Ʀ7'''5%a1ozCgZ CfļWhۺqHv柎#bh^1Xf6iZ!? h׸AFM[-Notd{ѽQ<7s`& 4i̿R +U|AZ|~/Ί'6cB/\,zp%[h8-mj64legi9&ηCB\=lbr 1c7 1QNpbe%*.5+iS*Άa! uF]d(L1hgu[+g_0#/ߍg5~rBYs۪7/떹qﯴQm~wo_9v\ޫ,Ltřw=?{KW+ut:Vy~>˹OĤU{FO.Xz7~vn]?1+ "IQG96z޽'<Ǿn~ĒO\~7|~޽{\\ױzXnYyɬ|d-~~ƌQݺg3EV@1gJ:纅l'{{9x>|L'Ĺ!S?_:9,PF`ߚbuf5绎%k]Xh#ު-yp0~_ c!Ν'K󼫀8m{H^Y:g/34쑱ϸaBLdW`WXjS&C't\6-2zaϔfQ,Yrd&ɲz-pmؘG}%.V#h̴7Јpjd^º-OWioud3S5NPb6B#L7#y;\*boR'8NB c:QT1ُ WjC|^@-i96u48SWեöʁLdWa R,0dW0 *,ρo_IJ,V(2ġ3.acB=GVK!2-.KjS{;se๵h֐~d_64c{IYyR@-WW7#,/2mviGwfU:6ߍÑA M7=%"Ri̊|\T5}n.:uq{B"Ls=//3/.09rS+#H m 2ZO +,[Ti̞)6R=ÑHC}Sb=] cu!¼ Lmnߑ !F w/ފ2!Fۛ٪qzg\s&RI". 3o{[5z¥3P &Y7I@xɒve!FxuDzݼ{%kqz*gp1d YMW<@ qpM/ޮo?0;vfLeBJBط|ͲCBʍz\"iW7ΝE\[$@!UmpԷH,dΥVmenRC-mZϛd~_Y[ j !8N_-]`ٰ4ǚ]3Cmڻ*gߞ!8{hjrܼFFVzgUgwމK6_W\~aOB+R+F\j0} ,0݄;A#bZv5yfMA/mI; Or'ip/ϘA:M}s^aj4ffBUMgv:ŁDPt!c̘tO?ui^·yuἼc4d3fPh9|iׅG:sl HE !D#֊ on6 IDAT_k Fo 1JҌB1\KwjW6wid;0ݙ?:i'l12bo?Y|Ur UAiϴuvԬPI;vDLgQv0ԏ/)(2>vU$7Wӡ175JfLrӲ(Qmrrv@x>~SjW+qs/s䅎F 8AϾ!輦ڛnϠߩիn˴sr3eCX`/ t "hcn<ϋDkߛ_yk0mJFpdvܝP1_;\ORW2-T[C4h\K8vvs $B4BTNxU@#D#Պ:nIs8NJcl_R Z,zS+}oo[ Da 2$G ==mz]vy[Ӥ"4B#ldlow t Yu(o4U(jx<#9ecOf'Lk*@ q|Qͮ 4;8Qdw|Goܗw<.1Aמ+y~F:? z/(ߔ_tOB^(/.\ [d ڒ @ӤVp[^^s(-IӘuoN]"i>*`q.{Ov[Fh(3B!zr?+L:4Ӊm֖n;UdžQE< fm\hI0+_"h ,Bq\+_bf_n=7Hd4NV!˷UZ|ʸ*WKU'D!'c&^~ԗ=0ۚ.'):WɳaB?ߎxɧJL#kc¿^)Ԃ!,qԅ2M"Je> dY:wHEjoܪ?2R_X]ս~^gIJ8y"D%oM Da7>n5y9vN[[kt5Y̛u/Rω>خ\g 7Jhh, XfΌ>a'$'iFOĒ[<~e7sܘTxB_?AAכ2ѦlMORI!+OGIOS(U7DkL L"{*}i>gI8w^w'.^hquAb)ip!wyIqVǵncct V/IWЏZo8agn[hO>vL[@ñ3=4@ʫJ?>lprxh娨_yUHR)Tƒ %E*呤^(~G#F=~EP#o()$IgmO#+cڶFcVl[(hiABtTd1R(.q(nإ~o-<Ͼ:~iiȬf5כ)?UJ:׭k9U5{VW^լրJ\RsЉTי쫓~&sG t5ᖂ-dEЬk{om.ts~:A#/MwqG' Q I+ڐwXX!BY﫞 9k>wy_~~e^񄵃}x 9؞j2qfs>5lͅ?˲.e3O4}77֌lذdniQ-kxa/M kP}:(@rul@|^ n|&[_ބCkYDUG9f@J99]cb"ws7+_VF*;OWU)AHсp0V ]@KA5:O>[y1g^۽E*I]SUR&yv~0MP $\8??pa{ yyɅT)#)7JfDh Q=G'vt711qOwHt#YԃL[+Wf2oW^rs gA:4qYM܅gݖ D1y?5X|*C&hvIxNa6,9e 76;%W`%| }/s(mJ Z@KAh\ xN~^^Zr[Oӯlx*6U%g#n5zL !n}seXQ|}|ku[fՁiՅμMB\>Mq:6iMxYΆM&!4ǵǖ-tUtҝZMhQۯ?pd~>wqR`-@./qrqX@C 44DAAr>hŭkzx{x8xy{x{{ѪP/gӿ^>>Ao+ѫB=}Zn}X͹:K`%e||JyA&}J||.enOlHAKw{|HpxQR!Gok$+ \g:7| Ȳt1~Fs8.|%F?;~fW!DM&D:AP]?wK[_R덭g#!4".|ɹ֯1'gjǘy98-^e12] (A[¶١1//㙶s\ڌ|#K @Fe!r ׀Jr&<#+|u0vVo}yN @9F%.e9W΃/*m0PBC!4 4@rq| 4D A@ k]zƯxj;zSu |TZpxB\|BiU!.HcB͏>KOO{vИٔ٘97sރ*͏>~Co[#M)RXq$3ǮVvV+А A0%HLe=9u!˶Z Grι֯_@/O_?ԇg|s]|Tζ=j1%4}x>B84Wy?[I*7~'yv^r;pQ A_;~ yʹT|@Ur. 4 4@rq| 4D A@ s^ZmE-ɖR'~RIبǞ ʺibF*J{ۧJ6>(nإ~o- "DH<}ճ=!}B9R>( @ͦN~Q^Mgt~t:mp[,C؃3Ikcɤ[G); ױQ?.;pnd:YRC>h\d3c"!UG#ZF/q{P.fD{ۧVAޯ7=AuL?+0APtAcSXI\JDŬ*S8-C\LTS'elr2Ba߭R&y!o B-+ 7x%R-Hd@"tuJs1%w"|]N= ;IWh3ϹNz8dH+sPyMN(I>Ѧ=". %KRph2<(}O 1 Ϻ- _(rɅc'?d3xV3{!πa%|C!Vtsw.Vs=Y ~cw8eSρn> AE#D+.<ʕbzRGR,I?rxAPtq\{l=VxdT_ZGYu`ZwR!J٢}}}5cǧ.8{Ύ!*{J9Ы}+7v#}yJ'u T䰕{rR[ͽRo/Y$APZ@>hkA|CJ"h@!(|Ж221.>Ao+D{AP@>h>2U>QW%>v"L6?zX#YA(?\s_3OgyHc>9Ы,ed~M+ӹ|@zg.*\[?gNOAP#2228UTic-?_*aglƋys:ҵAP'烶ٔ9&ML xObD^[Z=4} (?F3Ah>Ȍ[88:lџ%(O. 䃶=zX} V{( 4V.䃶gp/fKusL'+APZ@>hkAe44  @@ 44  @ 44  @ 44 @@ 44 |@ B#EQ| _N_Z.M4CX P0 P(p\Rq8@ه"h (G`4 7,KӴ`\.  #EW7W[[;XckXְLkPNNNjJ2{gFhVA5k,"rϞI Rtus7 93Cձ㳄b| z55%֌@ P(jˋљH-G:jX=dHhHEQkԎ#2`@ ӑzRg#i޲('}?rge5;udvH.0 0`0q\iRhYhRӑ,àm4c QXFmƽzSˈҤ<Ş_f M:ڈDbCQZs @ (8@eOq4qlY%2K$Mx ܭ~UuDոqtE(FzR,钒E"<- #w ~* 4,rTziahIJYW؄€6{Q(eqT* Cf p??J eKxwcU Rfv}LNbf"CHĢ #eHqfg"u{ i}&Vq{Rl*Q*^^ޔPL4T*1Z֫Jx|-[8N*ar%3$d),bH\tE,X]wׯ mܨiHQXT7F¡񐪪:QΣOx-T$1 yyjvBeIw7]JkYZ&Sx:ز M/7oɢ_ׅ 14m$uɘBhHT &/ҘB{{_;L3F!3t5՛Ѽc5j~ZCaYV8885k1 I5;{LG}fZ~o>m7hԬ˨egym:[5l~GJcmj-[hF|wXl˴^-40zӣ{l٠Q)iqgTMz"-u*aB6x`2PU%! ғXahL4$EQ7Dv{vwߛ7j]3|Mc7n\X-s_i`Jecc׬,UTf $~vOӧmtډY5/nS)NSFo?ξGI1@ZmZh#Z(vBgK{~jM.ux"1gh?dž[.ݻ{D@1lԾk3\$?/ b)ErmfMKM&552n[Ų4[1if= .Op;:5Nr-r*'5u0d!NL^c _x82?ĦƂ{;£P"99əzUlj)Nq ϫH65*.0H!BIDATDEYZkЦVزSD f#3#5|oKi״G*LoTK8nfI82w g`?ha#:u 2|d0 ADGP|(rG!rCCBq5I#k{/LsljxS dW ,bYܦ:)7 ֥u%^ǰ%%yZc|>P] Be _Wؽ\6dۻ]@ywMe z392[XZpu粇,5bE(XW0~#p2vm MX1h avkpX5WUذI@˲bb㺶૏RGnJwC7 瑩wFWZv$S¾żxvm֨aӯ/>e j@H$:.)1!YpuZD")`qա5zc\qtYorװVu,Zmj}-ql`ia6lvV|!tT[>͛46Vl3p:,]5kÀ&moSv_zm*Qr9IEyT _ѩ_1N^f=p[w 6jU lgPWNgK͚#___///x,Zx<@pM?#Rű?."< zȋs6 nNSC`B0e8}e6q!/OsE8999;;߽s;w\\\ʭM*]M8VVYKSemH0;VXt'5k,1<<\_D" c^G:99<ԧMs^>"WfZ nYh\+ŪcȌ]+^Ft[ O'pD1 IQJGTJ^O404MJ$OTQU.l敆@,E=A,{]y6JKvn\ۻR`H7ɦ Nk޷p@1FVVٍ3Z~дR RGz^BH==< CEwbܭnPH]zV~{r񏔬!vsz_~Hha NFk26շ,bYOg^=^0|ae$I" y:RgT]wׯ mܨiB!"$X%ԩD=B!&g@n[/ݻw޽gyjGgvyy&I9`ؼg͖lS +!3ltjN2u‡14IJ1Jq7Yo9כ6egjl\鍒K]`ۏza &\ƏnG\^I7>{Vmǻwsh"u0.<ȑڑ99n[(`Io([\D;ӹESNq#N[͖=Z{NfM {NfsvnnfflΓ6LPZ$gϞ[C ,qΝN(veߗ_B!EQ6ۈ#RSSm6[ۃߟސfmkkSU5&s[[[lU$cn:l0ϧiBUUVbڝ<|xCЪ͖aB@u# ؕo(}y┥ >h0My $$rA_@w1~io]6tB}oŤH]"R M!qR*&%J+Mgy8aQ{:3z!|/9-0:x%IL![Fy[ڳB`51c."t+B7 18 Y4;^]ScZ?p!dpg abQ~r~#Br꫃3YQQ1v̘\^!d}u`C٢9mIENDB`tora-2.1.3/src/help/images/toolsmenu.png0000644000175000017500000011136011303312237017764 0ustar michaelmichaelPNG  IHDRDxD pHYs : :" IDATxw@ǟt-{,Q܊2Ł{sq7VBEq{w."lٳ;~K7O$';~0 CNE@4RA6n§rN #*aBǪ CPId^ZDžPl Ig0:3BL(LJK ū׆Nhaľb`*J)C_>I%)&c&0 ShB1P 9ʍ0db#sW+'_Aų)CQPR6J@&AQį=JnEU3(yp1 3>_EDFLWu*XV[]6 y+"8@LVEeRFKnofX~8JGN(_+Ey}ʥ+09✜,@"~B KkkkPx0]r@7@TQ &YN.)Jʠt !6PiYAYjUzSjF] !?H7S5 T@#wB(NUnp\@(΍NE2C)RP\ee/Yִ毊$j ib!(B8FY=+ TU>QRcTRdsPœS/yђ/ɆjeE6([ 7l'RZb Λ ӧwHhX}T"k~yy,¬Cᾣna? >f1 aKgRw5j2RN> WyLQʢ}?_$6&̳i3TҠ QI_ +Ar:UU"(J jd]S(jVG0?>L۳SeFR5f[vi">ߜҗOEML gV[lpgC|#H|2[UDG!$ymB䶴4xnkQ1'q\&ˏgSlO|FяRȯj+vDy|J`E9QhS w?jI.~k̑?`sJ5kE|; IK`7>2vPNBή4a~WbŒ}|G߯{箁v?OnD˳Sgz\* qyv6~ӵFD[%( OBw % =/]{r'nsY>Y92ijsg×ĭ^a(c_oacޥca+WjYjsi*EKa@ٛTNi[̭SV'١9/B Ⓕ7^Ez9w^]~"C!܃'R;w.%C݌kV)B3 jӹ=%yL6f씋:п4n.e  0Z`hnW>٫x|ɳ g) FokJc:yu3-Re/N$[FL pЧ; є =?"bj3F8rN{|`XvvU5$~>}bMthJ.i'ܵs]tkt>aI_ĈFe޻I0ɁNyssnɓZzS@"vEU5B ڑP8ӕ7ʚʌ.T` _(Nx~D^_+R.bu/G.[qZ 3yu=##~9V &yn,S4Cs= Հ1 ĜLbؘoO=sg#{ UYq:, F e+ iDu۝_nCLLp=3d8%iev$&b+7BtS:^PܙO<b$+< O'*|7JzչdJ(aCDWS l('#jcHAy6^A; „6zux'=ƠApˍ'6]ߍ'eyn,^DvrQCK*0mYXejA~'.Þ@Ve_LWȡ2|zV E ?ti1 1 MZ**{u>o}tW_d02Ы5([vnʾu b’gǷ?)`դ&EHG uOLSu J|j#=i9φQECLEPͽ-7tf޴CԧW_p?9+24ca3;,u64pG.Ѭ֯N_~Jk1fnCޚM,[91GЭ)un(|,ɆA,'pm&/1?Hfhw47lu>3ҩ6EbP#=siW _Qr=zqU[JyX#!3 &V\J{bw +3CuX,fX?iP>-lj~%|IAmPlFogK/D3IY7:VR]PrP'&kOeI.Q~]K=R}Tg6~-t4 7E%=@ޒ)U0 M)bKUC$~Hj:QYtIzJ/~.FyH#Y%CG߃C qI% s'\iC ŷj/ܲH$m9(88kW(F0ݏѶm[U|v}P6 2="O6+ ҦMuzZ<!#ݹ ]Nk\RSjAK* 'cS7.DlDZ}C1A@QVcXrfJhH Z$۾r u:TFD7BJD%j % Ϭ(NPML(k)FQY/.Y7z,Q#TU+VAUi/J-JjִBT/L%iWia( _4{aMb1*_WU?Dyk4tEjM n~d)(dfU>l$~ժdK)HGyiYiiw j#f}@Z a`""Ӯ]M#QBU`Tz#Qa eÍRXXY/c CW\~CUPG!sC9UU"]$$4Ȉɔ @EKJKtzS&EQvOIoP( defr\333 X[l>@B@DOOK^^EE9SUEmKJJHKa666l6RXXhggfIP &_1HH |dVTTPEުOBkI7HCBRcLBRwor lmRrsrQgHHjLWo#P/m8c%AuI? |' ҩsn'W,BT1a];u?hƎ|va>~0c\;v>u.+NIMs$uI l&AuY|ΘoaJ|y$ID[{y~yNmX2f^64imq { UӘ L$t (<nÓu&4(,VށT 0AI[41"~a׸53JmgJoN]za@goWL :yHʞF׵sGcBuBN?}Sfqú&}.Ȯ9(aUpbج+'PY6D7-h<7f^CrN&*/GŭOʏ|+oG[IjwT0j=7jmowg6N8j,>ـ)wl/rsrſwuw}Hl-q"rĤ} ݢM -~ň)A ts@iFh@Puw}Fk5j(.oiS6L*JFխyzX>v󃅙Yĸ61bN6bb" f@\h7d1~A-CF>)դEq}03I~kB *(MT'- Lee3H QxnUj@=ϟ{"yO.YtfĴFvQ@P v b6|L4=}+}qiZ&F?=9/{!|ǃ&D,?"BDa:v]W}P;̍^|{Ԭ^++x`={vҀ uؑ/Ag_'g2䁾6c c_ 滒Kl" V$H||| 4dmP}^6H8Vݾ}s#m5e\^ɚWW8;IDWt_1:*ȣ?O ` `Vs m0I]T0I݆T0I݆T0Iݦ6*7g4ABݩED`y[X=hEB&!BL/DD`Eߜ޼蝏`6l5ylO_f"aFf# [pvX#m|G9a˻I_6mϹn }“nGGPQ#8@&)LN6@llR% ^' ojJÀʬ3 0 |y|Ɉn]vj~:`_W{^TxΪ׌30bO\f߷GQ/=:o{#xwqXy)#t OץL?o }H˟?Gw^0qq¨1JP ;~ Àa}>;>e8 ]z~ ]y,-j䤴]hhgL2"Yڹ}ܰ.ݗKE9_01n@&nvةEߌWZphnݻ3xߜ? |A7^Ggsa\~4o_X,V;FL=vOki9Ǔ=6]{k qȰ79 b(/> 'F.y!r\K=un.<BdI|"Fbc<}kz;inA]E=?l0#*B3qllo6F#11=L˟-K:d:nJ3Je5 ޿͓d5a0k?)۽B>(^[*L p5h9ָKe1ʽBգC#62-:ƹWem1$aJ;@zzK( hnBcnWrZ+V(';+oC;{5ѳs$/bǼM]cdU".JMX TbNzYǍ70TlإJ,BcFfy*G~:i;)E| :G/głYvF Q#-SYvF&-&?o!gEZ,.N\OGuD?m?鳆æC'ڝ<~U!ZR)*\EcUى| +Ow`Ik&,ysfe{;i,[+""bٲeLLL$TWc7_rDN߮bmH؝WR*Ũ"'6fMc n#R.0[l.:3qp(e̢r/T5@i ŵ{eFL5S7):F:?=幁oO[`ո+e9>cMv#_= aɓSP XL=jMBN5\MXq砱wWĮ̩QBoOk685hC%{% UPͻ-Qy~<ЯפSmA^ז9dܯ*G ZO_?!cЬ֮[ej.ݲUݪkýw %7h*&n˶cw0m5eլn?6^~S^T`"El- n ?$_7~aAΨm碚"U_=y)Mn@=׋veժR_풲wpPħO">j †]M=J9v\/_n#W]Hb ̈cdÂ<}\NgOc0*P1ZTezċrw3 T}{ovd%t(P][fԿDӢ.;2zƫaXi\ o,Zrj֡[=p͚oM dbŊ+VW-՜ ߟBգӭ->|V&ज|B`cڜ;EkcBc:yy?+hY8j9b>f6hZGSϠ"VX]Y#"z#IE\ٹ`BvY?4< ;WfqCYGz1'zgLi,Z+^ WZ*p#gi!C['-5 Wk[ qx" IG)DN[ ͲS}mcbCkYPL<jXXeZ!J"3ɏ@O!^ ?k "CT񛯿TĜq+ubŤȶ%{\Of|+8ռ /11;_5t_ IDAT:h&-^Yw=((&￝GE/NG>)C"+x ; a!dz<^Y#ﳮVM:^к T潶oE\V Q\ӗ"dWCfy#|VR]C78O }|Twp"?U>;h펓3`mSUV!ѡ-ϩ]S+訜䔑57??gf٬&75 ?$>>'b,']_?11QW_&h/$uR$uR$uR$uR$uR$uݛ$HKJ EX;z˹G!CCW/B& &L0&Y(c{v֭o)|vGomafLsZfc$w^: 9C̋0anwJ0v҆Fm=)Riۻ_Y,W\3`#-K:VDwF&uptRGa~ݛP0[z5ba J=v|o?n>V]TEO,ݭwBd0 1g$A?`t%Ã^M4ySbҋL`Ux{b3ܷkzY#CзO}&&*~|4P7S Ty=}yxZs)[w3 :iJNgSHbˆ E?uaSBCCe_CCC::%hmR6m%вGf|!1В&s@\|{#^[s7MX  o_o?clhGˎܿ}nոViǟ8OC߈X Ap/'S@TpTQLka4 ]rۧ4g;3ԿD^?ky"59Ņ7-b:ͻ1 5]Ht@`L/_|WufY 3|vˬA=ǮC_N239E2'vC\ahMO ibDA-߶;ٵ>(tif'-Z3 z=I^8WƦT ݺF_ vF6;z?+Ήd9|>B3k7pjS*+H '@k5*ӥ z"] 3Њ^^yVZbV*Ulĸn9ø!S6iE~ޟeLUqE6b.*zsb#I:ta#R&1:$Q)X4 G19U$L @f:D?&$Bh4g6L;CK(|@ Q{#B( &w}1dŤf%|4;GTCϺa>ḽHU]'Dv nl*sR,2RG(Kgj.T;"-|D%Hx#q&Q/-mIbbiʎ쾖c̷i1L!ٗE컇 5[>WH.!-<}Gj^jUIDžwGhK8&T1*yp"1_ 9)EG,).ioKIjwT0ŭͧCP;=fi|@ ]tR[lHN>-4n_vV߮TUK }߯>c'-'= H9ֈrF;N/xV|նO I|C7hx?}gV|.uDVR_M"v MC_ #AO;CY;]9Yܕs%$&nt5݋GF.܋%eO$ &HZEf'!` & &ې &ې &79F )>}ΐ]YNI\t"T-[lIH~$7{ )(U{yzy A@y``$ݢ:|'z9!Xē;"E-t"0 NYGwc'm\[%nO3<^Kqmb~ z+\?'{N&VU 65P6<ښPN;^dJi|qC 7e\n#Ɯ]ҽǸEbAE<}zY{%G"4q?Q3{zO_Ăԋ' bW/v)y .~|<7}*fBcPQϫKcSnePw/%d9l>f6` GLFO pfQA/T Qϻso\tbHX,Xc7w9k1Ξ+V(*TcxE[ph= i s9FTY#G nЀ"}e B1&dsCgCIY!50L\^q m^ŬUb @5:`_Bϵ,d1`Bէ|U6#&HMSx!~#4#x^$` ´e"7#K?svLB|Yۚnh!2lnU/@aڱ/ɀ)c@5i?qfaytEbYӎ"~”*qؓd"Md>*@5m޸ؾL**yvb f['"E\JeRO&(m6*>s'ʒL݈d1>(G]Lq[#w GUsn#-WTSbq{J0qp Z6Ԇ`uϹwlELX*oA-glO0K8TS{^_9fvSV.Xej^ېHb2,\{y`Pqǰ%ò%6nN߱c$!y3';KyY#I}{kl;6zXm;wt+ȿ 1`/o{Nde;C)U-q+4˦>Or1]e;CȹB/"_sp/B}^I~eH6I6I6ȓQ4a Q= O C%?qhuOIS(Hu90B& &m'(~C BPYƭۧGaӷ<(Ư8zҀ>="% =!TS|%SL :5KK$5{AA>3=4WQ'wT:8yުsUDq&mE/7/:)nw3*óW"<| ZE~Twg#Q~٭+'-GQz>jXk`g? 4"ƨXw: Q3߮$HRdW6 M mK[n2ǭlB mВ]ҢaV4A~=50'=ÄNK*xnB'.hDO@o1Iqgc0FH $of~&K1>n6t+Yda3`g?]`0+56adDMVWZ\A=F*ЍmvXqeK ^lM ȿ֭-7+{^,qs E;KqSZa2OҸfN(L[Vʖf.e4d,$ t/͚8 ښykSEk |d>zf`DZnR%q2Kd tfw?">??z}!6DTԉGĴm?cщY|TXT2\fV)(’'v&4S]39 GW/z슊 Fn߆ٳ|Rdjdj[oS^%x<Yst}na:.XbC?W>p6umsxC:ĜZҌ`PoƠC{ìV.XeL:^ H24=ǯZaǤU4˖7nٍgx{gepQU}äIo_vtj/-I{5muZ>3ԨA6 I_hhgS4"㕘x(x݄U2[4+y \JR,o8ҧX͋Q hm@Rש 䬽ݣR7vhy / 3$uR$uR$uR$uR$uR$uCBR m0IF4gL&oti  |ԾP__\~]s~a֡ѹ T# bƍ4v)y&8۴s;vR,ifNw7_9Cjl0lvzފ:@0X\zߘIz3hWp@@@)S>&7qi*)KSU`am *^`UfnAgF6H[FY?wx^=&& 6 T+Xchȝ;R?@LƮ1@Jȝ; 0 Den=*7lcF&v):1fڶ^1( wKzwU`7wV4A2cdc .{XnȆ6,Ëmk7O.!r4bU&,[ytk7.ax]EmF9)q>k]mNDDTw̾=z YإNjlaLA-f\jy{}K$^D6 " y:ŋjPOOTZ+Qz4bQLqأ+9x =|)4vJW]Z'ˡc}(43~L(78lXt2DG6iL6FZێUc U~{=7V/}dRQ[`Uy "ry4KGks T =*9)[`bd76&a H*62f6u0%kJ(݈>Q (XK\WWWפ$P'\N{+ŋ0o0~^x\ԣ c uÚJ^[3lhhlr&OX H3,Ge( &b^O @eڲlY uf#oͫ9ߩd7޿[ib/N]zVF:EjNĕONQۛPb:u *(9s9~ɘۙ|TTl4fvH%"AcE6};p7^?GTQZjT͈We}X'B%Tx-IEЙ#kmȭ" vWKE{E Z_1Si[6E}bqSbg|) i5z܀zT3?6VݱxX9w9Ug`5ӹ&~֏nF-i3oMx0E@Te66hb&_' M%H||wVFŸ|#wUiӯ_^w-M6ָk/"i]hŋ*_,S/7K'*ܽ.o5%pb{ȨƋh4pf篾~(ȿPѝ/#CtowzƗ[zYVajF\t`%<1k M0$Ƌ !ews.y휤nC*nCFsaעOv/ wu=bNH <4vT3Su*C>_Lu=n{z 9_#(.{}`+zuъN]Kf> /#,akՉk7o\;MKyxMcr }bu?E9YYs?ƤK$wWP(ʠ1.\hkkǏٳgh s3RtbrM(D+?\+(Q` 0`Zf ry-qպݠK2GۢzVT\i>G_f`yq|γdqhV-Οk%z섣tF/_0ݧ76#r?]vQ#Q 8#¬Q*$nW'0aI=Kw,sh')ċZb@ P3sAh= +wS'O}ɔSl#lϝ;wƍ/]BDIOOeė4"{|΋bax}]Fk邚Nj/{lB+?E팤!vLmkl2i(zg7-ZP(cǎݧwxpPJ箝EHOO1T(/x=HqҪ%^?t7'z[ib/N[zY:ŋP դmѷũ$@[mk]V)@E)Oᓗ~mp]o޼;,VBm޼}⒒RUU֭[`=K-E Olȭ! vVHEkٙ=ވNjpeC_[:;οR--۲kr&.͢E #W]ʴQ Z}FBgDeY]܈1|?7;Ύϼp񂏧OiycVZձ[GK̘rklԪ65qjS, EP]=C-[FEUUU_9Gʊuucm b1x ո"4YɫD9&~53fCnDZ\UQB)HuxWw??>cW}3K9b8ay(ٵ>rG'˓N644?Q%w j ;@tۡ1'7brV?_??__n^||1殒ԎUqU\PZl~ۑm *^pKU!.{nT slYw~mt)@F5T0 x"WP$|'z2&/bPVJ JӸz#BA]GbLXⲅktnO8tbP4}Fm1WPR1Or.eQ[/jڷI}"خL !,eZ !*{4T!T}CUN2ķB-{E$>"n&. IA:B n "הZ6tgۻ5"բH[FIk7rG5W8*(-E\:t(G=:Ǒ'U~l6 jj#(8ѭmbxujP"  |׬q2^WY|kk xJar8=( ,?YR/S4aj/uū<1k_ ]cʐ &ې &ې &ې &ې &ې &ې &ې &|\s[u^iL}>) {H]sl̠o:4ARL})=V<<,Ψ2 ATjw}EQQ>^GxVz=Sۦj&)+iͻS={:Q(``H-xZ`U9'G\&/y?pA}j!~7](#5ug 2xvԿ*T&ā(i }}'nǭ3 Ձ ʷq'fa| Oe"b@MXlk&9>63n T(̹t Zi=c]Muv^gngOg^w4@sR:q4`4Z֩H6qU+NW*)v/VYD@V-iÖ2v҅.Ux ژ ; W[T}qՋOx:ؙJ.f2mx?-im A\peBlr׵6vNjwE V/=k{+JJNC:)Ef_{e^ "T*J"28VDmݵu"ubண*8EŪV֪? ADdȸB$([_<ϓ''O.cs$MT=O0Fg1еŵt/n#|5ec號4z̖2˄͘ɃmYcѳz cttkPUDb hb8Ե;17<.v&>K-&䆨K$)4i2,&B&ct6kAGL0a9¼*Aњ"P[ބG.w*K˚YN'Ob6ܞ\y1.D֖/kZ3+d DMomYZ\j^EρG> Y~[[HHHxxo^^}Mjq[m;ت 6z^yj 3cKRȰ"eԩ?D4-q]A㡚2qoTjrv_Ҳi:n &˰hGAs8W=ʪ hMiΞ'O55Ɯ>rƌח.>`,}h1˝Z864~ Z^3T4_2曡X={?ߨe8m1D,}^6z]wgw3|jݏ< TO" KW0/88pfdb@ކDˡlc7'ŋ-qV,{CgpoZ//eFN'j#e NL3Cx$u+-֥B7կzO ^5j.mj+-h 4`flP J0BA Fh6(ͦ ~S\S#撘. &j%TF&{|T.O)(tjov P *HgggۓEk'n;GrM߾o} dhET|\X$vqrjA)W$%rMFE܅w={Wz5+{$.\E|/l[v^(b?s{eߦĵqM}In\hQJT$cv2ʞ~񙾞V P>ڥpа&@7ið}=Z[ǁV]ꔩO<3烃:Ǭ.~ZD,7558omm.O(*\WPD kHC>+]hqh 2D _zy~˾* y >)R_A7#qP/sIAɖ*U?e_ӫme WVptxYQ."s_e*T<EFF^(Cߚ䔣CK,ޙQCUyJ<,X&E 7Me2NE/链ealԈIبyEfWf$q_|r 68qL[[U7(mie8@ճ[#thxtPCϝO"?蠫5,*ִwt҅3_[ϞڷfRC#(Tr![(}^6iۢ^.Iݯ,]NDʿc;> Ws#L)Av eN5q3bAn츾,P(57}[8OҦU>fQ6qcDW3cfQ`ξ~ 3g|04n?lؕ=0žFH(B2$jtҵ#*W MNP< 8n=h9meROW#JC]˜΄ǂN:n8ryy.``P :۰%.i݄i:9dQqp˖^@1ءQ^^ᠮEzzFz,C-lovq=p`^ O3U<AO6 /4s/S'ّ;UA?)kzWS DEJ亻rqޡ!tH 1S.;g4+>}1}{;/}uYWCw:иy.xBE-_ħ\zc{vnzIn pMv3H'9-)|zXyqz=dx>={X֭ze&<.-yHR^B"Ր f@$@$Օ&I ږA $I:8$)a Lv /Fb¨M}uڭ X(lb)0Bcb0&0 c+:qJ3:%rŷ!>H%رY èR75j|O/; FGLX~qD43PʼnoOk R l.m4]]D[b4hOs1 OE--Voãۉ)tfnc z$7.t ^qF-[9əϢm!5Q1 Aݠ/pbݧ1O6S1Ȅ[,awv= Һ~0ʗ^p1(u$/kώ *3OKm:b4/i xYO$@$:L默? KDFS*SN݀c;a"1r}>"/] 1-$em1Hat;LVb:,BLAaz '3,{{{5>&]ywXd cpX[A:1A҄nnn!!!{tx/=,xՋk/W11Jhaah OGK1aG8@/cnn#4;ɩNA>BQxB"lmm,h~!m4ʢ;ɹ|Ζ.Mx'hy0BA Fh6(%٠#4`flPM܊+ZMc7'jbj-ɍ?{47޽MćZ*+V؃UܸЉc<?5o'~[]xo_:U>JB S(ǿ\0P*R?+wjxqW!kNܐx5Z#o項V/OS8xLY6gG7l:tg˨!Zd|jux٭=b}:Ev- }#8ؑk_-]U.~N1ժHߟYx|%}ҷ,͢J,y9K.\/Rpa^&oVQNb㜟>3}MY—BoϗwɖyZUrjos1IРbEB$PJTqXg֔_ұ:'-׽w?9 dW:r/'{c\L-!s_[Bl慻&c4MZ: Z]YۥJ߽wFaQ1`*'jڰj/aj&7a\!-KKܜk F3 IDATl==$+aю2+q{U˞ի}sp|Su,^Ҳv L SL ) z{.B~:]U n:c1|V|qv7GϩcNZ`6h߅: p`|t +0gFN{Y]ǭY!Mٟםm^^fZE!Alii߉n'Br/ E 닐ApŨ?XȊ%#~;JU+_5PW+.z+RTp4g{֦ oײKA]fQI 56eշvoMfm9<{٠#4`flP J0BA Fh6(%٠#4`f/Zf!).k\ʭ [ҡ)cQⅧg|?֯ n{bs($Xo: &]'YȀ^k߂lPv~ח?f=Q ~/$7nҜa"{)<"UuMXeLɦ`2vf6fӷ?_3wk$qiuصW?mTPœ@h*R?=a„&!.xwPg(Y>]= .iKգ2#J(8 4&K̔lP"da:'?U.V4Բt6;W:vcmex,4A,Z)M[J6=B -s-H :]J&$Wwl Tָֺ:PB9ӦSd+POް5ES\QK_ī*kO=N.αPI,VC(ėIAʉYyK!WdT@;toŞXs:_HnTmD46烕vY6bf۲kNbcf?]zP6ڲ6lz/BP1a 5/Pihj{4"jhi⽢hS%٠#4`flP J0BA Fh6MTyirP8ԩ62 B u Pu4|9`FҁFzM5%v]>Bx? yv{*Uhz%kv_Dpowݯ$J^vkqC=؆eC;Q䯳Gx y*<|+&HU)EEouWoߨu`_ =++++33ua Ņw^jB V:*d_>g+$fp[-F%IE/链ealy^{G2 }Wb'!TftĖsFL1tʉ__x%虭5CE?.G?\Ex<X.=7+hI <-j+G|0JW,kی]w=ל@8LTMW9k<#;3ƲM?e{z_tv:pSN43c1I2))^ 1=_[>)(R(j.o_:~ڣG}i ..QgO7kL<ɔd)ʟW4vv,迊e)F#.dW:gm26Tߦ.ഽzdevemr2+))gSRΞ=zlUk I/_9::N>}oܕ rHI |'#nTuF^Æk8Ǡ 2^Tʁ\b%nNqfnKXdt1=`_|p<!-lA=R,*kvwww <<< E~E~o=|9`/J?xzxzzA\J`xlؕXZP[KWdY]:n gF)I=?vύn3ׄvbyglW%Wt0+|Wo[>ۨOk,54j-Q틘:}Fjj*ź:|!ŵ)R5 D3l ʡ61 #Ii1Ue2#͸TZxHqn)392!>s]v0mѰׇsG`XTcYY+6z};9׮q']Zou¶PK}6N.xQj$1I^{{/ M']?۵+à_F5MPf]hsu.f??=iO!Cf?RD*Q:y<xS֎l`)ʂ2|i暸KxLSh-8-Iaa |B̺e〔ݶlC 3٦nJVSg;?.|YŒ[/0-c{mqP~"@ &m4%>"$|hO۔Yvms7!)}d3tk{yw%A  Y2 =:pOct֢QtR}˲kx6 D,$D l2Vo ~y%#'vh]쇍OG$&&oB/#?JOjVRѺ+ 1/Q}2Su<ԛ9]D[ gzPdmti BA Fh6(%({'G@IA Ij %I *R ڐo Ib$AX]im@ ug /F~UwLv /Fb¨M}uڭ X(lb)0ԞeUThLVcalAݭuۘB1m6S Wh^׬GM$jo*a*Z7$/Ҩuw71ʫ!m4Fh6(%٠#4Q+%NXރD:"k|g[P4 ?RK(XJrB'X,WϼS/˪mg hse;1}_J򕴊 }bܧswwng[P֙-"ki|}pDxx8~:a;z|RZ{'yׯ?*fcHg-߉q玱՛kM/߅Jo:h3Qud6T|ܕwR1_c0A,ZY۝ȾqM{x3LyT& ngr:#͹SXΟ[S,!Z_A#NǸjW/OS8xLY6gG7l:tgccnFP1^~`Ԧ7s8L^0գ=$qoYO4jI|gmFJob2}  6N{/g:-V}l^c ǩ#HS7Kfty $7.t D>-; ?{m :%8!MI@Ӏvǜ 矼:{[Tu^]#""x,^x//\"Ņw^jB zPw?,{OӟBlM{G']H=;^*3߸JH>q xVCg;;;5 )qLy0E̓Ņ [{y2lwd-^C7R5'7D_}^"&II5\WfJ;4(\$c6` 8udq\}dc@gP y uMFpU!Qqn'jr/;ζVY=\DEڮ~#+;7Ŕ2P62ynָyqrNb5i bAv5. 6x:LֹzV8Hb873жnnn!!!{ڑڣy^ ކ?p]w2R6unO>\Q l==$+aю2+q{UHi4L Y gP8Ŗ@z`nߝְ^h#I/JH3$Vi!ɺ9ŷ[VE^)#<}r&_ lC6§+ 2b‚bD#+ 2botXv %$ٍe$;BI"B{{~%P[-6|(ډ'=kHSY5ӏ_19oFjq ,`P17XpkI0Y+6z};9X5,*qrqaސ;_]?F{(xѥuV'la/gЖ &;G2 XF}V `ڦaM!v&P2l֎,ZJPkcLLŲOxgݳ/JXlNH~j=PD3)àh QA΋78ohJP:| OJ^]8Y{#_ͤGh>5T?i:v{-ǸW4j+H|rI0@vlSe w%FMFsiKj hӄm(˸~Ӂ*X}@ox)|y Lf拐Jۨ 0SsU7 Y2 =:pOct+ɠ)ޙf;emԂT{m@y?i`0TX둗+kme9ڮ$LѐEzc0@@sS7H\7TBblm5:іV?".a+WGPRe#+y"BZv؎;z,Bm|6ҥK7@QA`fX;U7n^FBJi ӃL\L@>QK$+|ыU1 ]˲1$hpB Lj&_"3䷅H[21ꗽ3;iAAD q[86]=ۣ6MEA[@]fQI 56eշv> / _C̓ J0BA Fh6(%٠#4`flvmsD[ cc7'_K&Aj{B}Z~Ű+m#C%/'=a 2HW|ZuYkxh@mT]= nl ~k:rIDATSF-ݳxgF uWeFU 'wN[bk;:Bz׾y$C7%;q2`)mG|<ǐͰSi2OKGl:zbK@YR̹B)^2h)'~?Xq ۢVi!>v.Qѿ d6-88n5D #Dk,I 2Ns Yp1>t`ז7-88n'{4Z4,{{{dCWT2W ʚ/GO_Sۖܜ@ox`jAA^Yu!Z&|5Gz bO,E\9/$eW[=[^:SzESdZ4\Dll,'ॷ^jc-e}C:vgKPBnmjcၩq68$"s@FVBJOPG$K8dx _D3Z8 .C, #D,#m u}rP^m4Fh6(%٠#4`flP۬N @VQ%IR]$Iu!-Cf*X 1Uh<0AF1z_Ĺ1Kkz₴ë54pd}CaK[ VE#h Ke6dǯ9y ~a[f-{guK Y]xo+,T]">@T0-0H3$V] 8lvN yu::Uw KeeY{vs1w^..S]C]aQuP?KoYːy*meťTUAtYxG)1oZDMtt-4gZiK28Sc2f+Cf,v=Wr䙗!3mԫhӲ?n~΄Sol}cC uIa~u*}c]AgNG'd\TiW:0IWq-767|Y|'KuGv[d`q1R""QQlR#-^QkudW:rԫh~'DMDx/=,xՋk/W1p7jגm8»|ȐD"!KֽqN| 8]mJW],hM}1WDH7ZkW&i3PGH߿6>2\ ;E mM.j]ae4?;*2кvwΗeCwX(_4I=m1D,}^6zI=Z3_Ϩ^A}ė qsu?&H@k"|ɚ̄9 fm .NHrBKo}O~ ?i#LӨտv-_dLl!D45,~/wm%T"&6Qh˴<x'P J0BA Fh6ɑ$$?O$m$1$P(jCY{'$IbuIH eCI*48`k`[,@EH~Y5Fmkn5` @aHa,\V]EdhaL0aVxXFuۘB1m6S Wh^e9Q\x  I4j@aG]-ݍaLjD̓ J0BA Fh6(]|->Ҽ$I6Р &d#H^򴊠k1\q״^1i$q=zL7:$N{k;4|(i' T V<|7~WLZ^~w__//oJ}%?O:{אੑjdKT<08իwJ" ~5m>cttSp(G՛g1еŵt/} KG3MNv bRszGwTM_E2VyQ rI.Wߺp _V >`Z E.2'm=0.\W+QqKl7eɚ̓>/GJsYuX$K—BoϗlJzP !P k3]Vw#KJx^)u,g#n=îwms77Z5[m26jA6ZP ۋ\y1.D֖/ӖdZ둗+kEle9Re='i4aݲ {\bM؜3Za25G]2+pBTqK ,ÞeV$^( W9cEFGRTI%$[@-ɿ~J6}Ia{ic;e=G4;M7gx0qa>CG1;rbzoF~Z;wfX?/E'gV6b銑}C“2IJs=NkL\꽄3<6o]-%^ዼv~3wr0LI͍2I nO%/~0l/MP!+ҖLeNMkB2Z_CE\xVv恍ilW(E(h4sM=QCr@]fQI 56eշ騮h6=`̈́C5ڽ,O[ ʼi֚ifZ } ZK@" J0BaDL"Xb9!Ib2/;@4y:,s3ӌg\~hnF%E{*C%5?sA]SF!2 q؁ỦvJK=nqEgL=4k-p_ںu YY6zCqq1yyyҧOllݲWgkH@V۷/%%%S\RL~:BҿΒb@^~^D]ok/uo?۶QPX)-+HAa۷ol\$z.ddFB!P|EA 7Ȼo݀Ea[l޼>}a6q9].tb6ӷUUz qP 3x| ӎ K2RhqFF ?#SD_'߿ȸ\5\|T ٶ3A>_~_Ʃ1T6[|XQ U&ń餱\N'&Dy^TVUUUCZ̧s-;nݻU7uz^6oB>}ۯbGWe˖?y6$LM?~II .˗/gΜ9̛7c;y1g/_;Kiii^ !]]MQqt9q{mˉ{nߍKzv-E%衕)߶EjMxV`jF+Bcؑ;pDoF1ecfz6,%Xԡ{3zYP]ˀ¢„tUg: gګa>3 t]P!(Rbԩy\3g7]y%go f8 MO #/7Éy8N CӴv ö_f_|rZkZ~: AS5Z5n gqZxdo3pk0\?^F n*cޟaC1kf70xK=f#Ox`u7}!'OŠ ;q}pK9 :}MN=iEkOd2l,^2ktvw;ָˎaA v G]&;#fdsqāC67`UӨ#7'7X4Mog˯^֡|j}u(R_g*63~T6:wΪ謫EJd>mV=< O?\w%5~駟·~db!5u8L&>C~{:vBvxaG]]msn kY6z;aǜLầXo.> W|5/]Nܹlv x=,B1gQi^Z^Xpys+ٰ~!\ H+yf TWWsws]wq]wQVV^VZ 뮻ؽ{wDWU/';p8x=h_桜;:Kٜ\Rɳ ?\tQҜxs-)?gKP&Gk6mЀUOygVz<:C?鏟]%NEULGN"Oҝ_k`.q 4Px0e"_EZb]\̕ןn>Rh;g.*>jq8]¹E+|_> YSԃ8%t_yjjoZ1b#FwޡgϞtnݺѳy'(c,coiASU 5j3+۱"@9y(F ʁG?IeK3RH,93_I`CuT4BG) ǵ GeTmYO}rz0`!:pmh1C\|h3ISr8?ma;):z8r Wq^1i"xK+i /O S]ow\l6dzn:$I8bԡA?ư:ZDKGK w}7SOZ/[Ze9hB|ܱ>.W1}tNmFg,$Yv|1|3/ O=d3$$i0??G/˖QYYigJ.[̙G,hO67c=cݺs#VmUbW4x5G˸qs#h|U0#OԳw׬I] v׮ i΄LagXa O 'cy9XɊϧtEX%q=70 \w]:ɕȃ6a&߱i3UKel+;7̀zPƧSNE=m9xՁ|пCeBbj"J::;auHQdKQՂ$ANur=dyŗؼU,cZj"$)bPN;`=d6mZk]$_vՊb?+W{ŗ^fÙ[1w.~YP$fӇ,f~_t)S;֯_Y~=L:eK{EKuvX=DQQ֯CD;|@eVZMqq &)DO䲟N'AS/ rϟ?kݗ.ǹëytjxjPG #qK.r _gB]OH̸E.SgLl#cۃ/dgSTTC}hZuu:sr(**Z/ۻ#L@gCTMCQrss),(h[ףh{ ~rr(f??wn$aX֭W'onS?iD=v^_'I>.i1 dU,وx$cKFdp(Q@{2!7A\S ALXq LMAO& >L&Eo/z{7|ȐCi)'#qGE vc5PpD 8N2`!oY~xeN`{:Ɩ"&ǀE2"QO!L 1’3^x gfCGr @) *;Zl[ CTdMض!"UiDhPәX$qbHĘKopȆdÇu~0H џc$4뎮bJd&LtdƟ`Dp{a~*g~uo@yOhp@֧Ր.d6: ('QC@?i vۓKOA?Y2p@$"Ft}k:l+ѤF(y Y *~ HdP*ua8hR2$t5FR_!4 O7cKAO#D_K;N@qv)4QRIߣ$:/ܞǗ\b-39UUrQRRJuo6~3󻩩l6[s&JTU!C*4' F,ّ)g~$5L1h"_#2O* !~DLJ~Yn-i7@R}hjj ۍ+MJ?wd:A>zĞODu0T#F#CCC_{MKSHe7HJ N QR\B]]EEE)jG"4FKA "DJ7%DvfRg|s|&%|:W)3V:nill7~rFsNRnB]F^&76!3"IQݓE<9"cK}ɐQ"n\i5pF{v( R*Y;#iv0i.gR[$ #f wi7V V&"E@uJz0$ugdI oBvյ=6"dO61[cm + F"7I6jIhѼenY>[U+E}F0{˴oh;LyvΤ({{7YDh%?vKpIFnjDH{km$ba 5\?>μP}"rh/dAgLniJc1HsK娔M$/c/ڏ3%fp"3]Łc's˿ 5|W18ߑ|ٓOIS0jav[TE0}ͱn:#>MԿ:H,.>{  IDAT  \2ѶvC6Fjw%<>G?_’EqϙȖAy+yE>gZ¢ner#k njZοMត{8d\:z zO8NO`Opb\z*vdl38J>ddH9{89oMܠ7,??rU0$WAMG 63*(#>]3zFf#JJ}q8f9os_1=*|}3-r>CClC?S֒dWc 7csG48$}O3{qeiVCAmG'f"8EyN_Dk7I9}՛X]ҏ苛ۀҗ3(9}+sˬv{~26];_߰?ʅ("L\Y[hM|4vL73ȅ8gD;mj#UѢR83Q~ϳw.&kȳ]ߓu\0GﳶAڵoowl!DqRO!_>?y4p&-$M9-^dk;r3@)G ;n?N;Mr>f\c!܍o3]cW`@\͞#U`Ph\1fv P9F $g@QCtG)C2*Ȫa&|0= bJ08ӌLd,Xm6= JRzYqn bNuFC {GbDX$Ra ZWl']I5m`5 $N.@}Ɲa'7hFd Ҋ!U.0A | $j{C#aރa{ad3 :46'{ 70Wy5_k100Wz}=>a(dg<Ko`1GAFI^d X Ҧ@GtTىGvIn bѳ0YH(s/%/ Rݴ܌E#GAVJޝl,H(}N7~&yphRe]e3Ȓ.4F6?P}NwH~d(b4)ݩ.Ss(‚ơ9B IEe,< T`_ lg޼7*Us*A@KK3MuMxܴ4{$I%wJMte['̸Z:;'m 1ho%z$_!p(5.c qqq]nt%Lze] ;*;ibIHBDD=r"+hbDHZ̴;?- Q:HMycu\|EL?.M7.Ihf7Ɂi?j\sY 3.+O;Ο6qhySq8&L>m!Oj"X&ϔ$鎵q̞< 7Gb5-̉?q^>20_Ņü `4M/ W*6y^|x>: u?ss0lO~y+7ѵsxU>'XWoŷspxO">-Z uC·D5R ]:qܯ 8]N.*Lz/x=A]]>ű>ni䘢*^l$s7,%{Q R0?e[lv/)KM\2挧P g38WAɩK"W?Šbνx+H0\c A:q_B2ۆGL 8fcƌ|3gb62$6cO4/q E2=9y'[;9|s0d`fLA)|[6и;Ni92]ўfLА !u6 "!aƊQLsV VUz]wfO?3gr5s( ,b̲IHm74;n椩Ω4;䭪sbA^\܍+H!rvorf5y38w@CǺF/csuiVW?"3K'g%O|ĺo]_!u#!aֳl"rXx=x'Xf-<(JۤSZYBBרYȇ77`/s]E#o~c oXS,VMgC(c8gGK[=/#3U !5<'lvkxҿ^ jyX4\W͸DړFs~u&t-_0YwI~֓>ށ6n}[c0a$fv^@^eN\yRfqgʯr̉|\zz]~H}tw].3bлwo\.[n%;;+w |t10p $).E8p ---q?x 00tNss3}Czrץi{]  bv$5WIVVV0AX/> *tEii:?a17>q=?ܭz2^Lf2n  ޸?eO]oi5|z<>?o*q|\<[sjb 50t>FQ0w]BG'AoX+kJ8Y~[81|V^\Q9WGE^+, ݧMȌlɤ3'o|vO{[+K"BtMp4Ǘ$ Ӂi1~eH0ժ} v)!xY5=5zVp~]|ֺƒ2&bg`)rO$;'I(&;wD夆}ɷ0 ^ͬkj]*\oeAChb]cۥD n}'u> ʍ/?Ƀ7jaӦ6\j: t<775[J o'gȯrɑ<zL yL=|g=70H}t4l6ڰ#ʦM,W 0`@JuVYW?&2\.0tH7ϝȸ].V*zCYYa)%,';;r@r3׮=zbYqܹ5XzKyyO=pԨ^`OdI"?/Sܜljjjhljb_P5b"+'ݻSZZJqq1H7͟9v F"-%2EL$I`(**t5 YQZde27]bo DY}=AFr@$70@:^!7 ?27```3'c~t<݂170g1`0~} Q|~I~E'!3kuץuJ&]k~.7VbrrrZZZt`Y @$evQuYV墪,:At1i H]א!Chڞ^)N9"~jcIt(nw]O]W~pLC&1yN20j|:7lka$ۃ,+v$KdnO4輯ЍI1i\qGƎRY2K!pt++K]WYY=o ~ ſp1Ә2i G{m_xs8IL>HμCvan -qtx>i3N_f_R?M:޼|1)Sgsb35 {tw]v”uaO]OҘ7p 0׹f" j5@ ~'^ csR1t|x zie!g]vl *j-,*.{5Ɵxm})g_p}m21vX %7s?g1(GA C,|,}}N_+.^?(ta|ո‹z0;6׭sKBd oCVRZ-E5@kq-f Z8I$sLa@@QdvAnQk,+l۾E޺~wƔoS/JNorE뛼͋/Kriً\f/cr}:=Y0_|K"bsA$Ly/g:Ʒlڄfk70SW/wRh ]mjZz&6}\P=rs6u?Ëic8gT=6uM*g}HDc8 ᰧpV_S .?7'7}iu09]~gơ_Gh!9{ᬽ")NS7̪~sʬ#*!(EL>ζu'Ngǻyw؏`СH}t8dQ'YUU*++:m:uu)ںu+[6oa ڱc;K~\B~}ݻ^WNJ~ @e ?Ktw:x ;dҲ2}-~YzQLY^פ^]DYnٹ66"p]i, 7,[̷.';+^=ʍXf-ݺq׵D޽}9f̘6~ǔZw];w-ES5BVv6ݻuVw]q CFVŕ<Ε =1]]W!. ۍ(jf3uĚO~axߦ.]]A5j$[eL.)Hse؟d]72 ```0{Kn-[y@cȑXm5.OHujx Q 70GIi170؃[N;`mVw]vL.Lҥf5MvceQZ֍Pw]aw8Z w]&u_UUn7jFqe8N*+7aZy *;қaÆ#R\w]&Сph7UOsK9kvi+]RQsvǕwXmdǟv,|}7QQ1-xU`_Ӎ`2٬$rb2xl1$5 /%f61|fR *vוBݻwO]Wq8l,UI}U%cO9)2g5s=cԙp*dܛ86Xplqr G0iw cknSXƯ53j>o!C'\Lj%pi^}g `>O^Avt1:WN]k7.)2+Ù>P=f ?b~{Ld)K+{l Xggɘp}nNdp ҃N'oW2:.Hziz̴e[6ڥBYùOn~.^_slEcp $˳535R4l:o]/.d}meN?H(رY˲¶mQ%罔i$݋\ ͭ~֙î]ضu =Qvn݌nGq*OGyk@5eS6h<_s9@mx)3o;;/ g] xrqo仩r0KNt.=v?&/cInݕf)t }]$&V"?ȪRUUGd])ڶme츱 aۇ^z| E?~T9|cRJKp:| 2C*l蚆$$dErr/_zQR\IQR˻Hd_]΢gO$$6kޓK\IDAT[]I1Qޫ7={ ;;+ &w}00ثpץ( 99R;4 E*+-um`.鮫OGQd, 6[YY6]~}hą.XF}0udWz%@5utBֺ/oԧ(Jpt,9Lܖ{t]700H{&K}Fo`?cK})?j g``N27#oN:=/l1Gޛ $Ig~]Gn$᷻Nm500x2>Oy.viOA';400<қ300k1z~} Q 70GI`"]Wz400~׸7юܶW8׳ܞZA+)לymvVӭ{YL\7<엝jn %e}`_~VwIo4xd%Gh1`` wϬe-Xz%{~A7<qtf 0ıȿeMEoodT[,Mˀ|cOLήxD~3b_;q9c1?O Ϟ޼WsƹS-#g `7ѱNF߉o^F7<ǎВMI(,sRM1ODZg;)ֿƊ&Fjzr!ʏ-bS!,9Y1>^\SZm)Kg#5\fBSF7<ԭe dS6Ef{ؐul7O$S6fs!zRʓA{-̚Ü7z<b~<y;F#₿m  W6~\M-*#s|Y4ne.';Jd ŔV4Sd2Of }l*w >y$2ՉG(de;;L8;I!pG#3"p)΢(# #; 끂2::(`XH DNI:ݡӟNwVzz^{k4h¼CWrvbv+ۏ~>ؾF>:ۯl3;gőLmG4ܖe^φn =ɝԿ4otw&v>q+̚ԲX̚OKϱg8kRүNAin4iMS#u"8['ӴKe`*IqXĖ^!DkqUƍ--VJZBm"BI $PBD(I~!"$J_%/D S/Ʉbh4iT2 `xp\.uM%..V%c$$$QoW%2p zMT[`ر#h{&O% J׮| !n55=Kf#..NgMֵ LkJ5]1Ѭ{zW]3fΛ;5w1;)J!=s6o8OΛK+bTG )OpSH0id&MLyy9ӧͤɓ෩csw΋We'm| yo|cz2?nI'론WIphcLx hn tjnYg30!mf>윭W{1˥_XfeE^E !QYQ[YorGgq9XPl7.x+*ٹ;w&66ٌ9UBrQ^^ơB**+ILLԥ\]j*ǩбY"8bZ1Ӟb6B1+D"BI $PBD(I~!"$J_%/D"Bvzix^/F ҲILK<<= x1v-[PiԏWb&ų1'UU={i V4M#%5=myJv/fY=;QCulz d|bny+zwlXŵɦ=BS\g0|b/ 5W7|ɑntiGkۄnߝuJ?lxCg>1=3bNfȔ%<9<KԨAsrt^W/G7m"iJE 4FAqSڙ\;A'ܿ._c,VloY6/wF K2a}j7oFFOAÙ[UuMx6cS/6܁뇷x{Dt?w⟬}n~VaKOr}`=$Cl6wd$ |~_ă8]\}#7_o(qCӹy;|ExD)>4o1_c#ވbJI;r 3zpKS[w&pӮ!.}jxoㅬx5n*jT-oSPS[nux_#LJMZ:UqE,aP.}04&֯!uuLkGlZE3̢Ր1srvi.jCqykl&T{vsix* P{z<=/qrxbR_h!=oi<$:Ը H:›_euɜ]P`[h}6}y/Xw,#sZ 1 eL~\yw8mC?baȯZsk531Ze..׏ՙ4Wk(p7(7G55c'& ܃]ƁQPs[z1+R7.|_#嶡x6q{~P~ɖ}~I||E3EvR~;J)>C%#u%>L4冂PdvI L%͞PXXH昱TUVi>*&*Q1lC:wWIL[sy&"x_U cC?Ⱦyj*u1QijѲYUUl6+۷mݕWbXҚ $ #mYtءI灷ŘF >C.,V QQX,fMbZφ~00(.TՊEo#n$;o9G!1=& hm!D i/h4kv//D["bzҩ#D8_ BDSt ^?t/R\9}SHpaZ~jScqjR.fEr]BpPSSö,N?:r:qE0(Fi%;l6.LK7jNϟ!Rd f4VX Oٔ%" A>Ub9DVdZ/TPʒ" 5DQRg)- GC2A)m-:BVn ġc$sA@hi箖3DI"eʻ[(kgp=M% Rt0UUjѮ_+ɰiEfD)@Q^#VG'J=T\we/L‡)x.XVB,)zʹKRt%$ԥ)sGT,E~p(ֆ@Y~u*zjr =[U9FQ=ew,KY\T١Qs>xwZG$kb<jo!k'0TվPD1nqW, RBl",p/hVRi3v2*Wl]06v a.Z+ΒhL>(kRFWD(B@^~^ 'Dúpo% ~sE >WWkp&\ Kt,r֢O,OHU 7 ^$Bd]$-lSQuGR"D` ‹f[xBӧ KKK##"cV)g1%j)qd3k IJ&udMxK2fI$5'TzSj5Qސi"j3sKʑ IJYL9"+.a@)L zok';fJ]wuTqC{RsvT1UL!-KɷMC򗤏TPL̷}>ߩ']5111---::& .PW(>f&UTQUUJ#EQ|>ߙ3e& UҢ"" l -ngxttaO]+*@r*Q"HwJOu^$a#>iR:W.۷ŪB"##j֬Y^ʕ*B!;#&v0MErA2Xbŧ!"$-"2Ra$d܇A]}LA*ݲ-iJʖ-JZdALjxK+J%|\TcXx ºpn(B`JW \*fkp˗g'L*W5 /Dpћ'(r|5Ċ*AI((,a!E ERJJRJJGZv$555 N gs8&8WHM$.z-esJ[f3-999)9Y3 &9)I5=p %㥛.y\eUJD@h WEcLGB\.&0B`0Od*!DžM=apMIj`(, ԅT2z '} Ŝy# g<MJv .x&;6Eҧt`q(w]kԬRU 6~>X`;ԚE*Ul8zQ#dHi%11ʕmIÑd˖--p6)yY'3uV05k֬Qɓ'{=Fc;o[ 0ժUTr/^lW;=΍.=z־S1MaÑ_XxoV).زEݹ |>ƜĎ/rvLzzmoXnl[ũiw #US1(?IxH=)u*8SXE!D;z&0+r_Y(eC{FRg`ˎr)=;KZS*66 ~v+2 -Q>jFK甆=y"$AMhxRN,i20%ڏ7P;ծVt8 ϟ?3}ۧRRR<|ҥDвe]iix;QQO>{5pF\q8$&ZyW.]:z'ʖ&&/ :rh ЩTĉ^uUF?y䑤P( SXXj8=hz6\rlXԨc&kaA㉋{JKJK"#q8'" ޴`x6-:ƿҩNX߾]Wㆼ>eX8DJNgNaDS<|ȯvey=`@7{kÙH7y7.G<}_no[Շi^ޛIUS%%-BiMŸ uD(]#M8IMB^ E3p"b,E='\cк eQZJlK8"D\I67x6mLaM b<(jw^$]B)/G~-H L"(zjZRmʥFDQ =O\BB(3_~YFDžPGWmp8RCgϜׯ'u]~{on]jj*a!Zeh4Q.]ڡcEFEGq8(fqC 9RuΜٛ62DUC rԠ<t(gZLΙUsy(@ 66VQcBiIiQ{}ۍ|\|Thf)<8U?Utϭ;Z>W 3uc>+>h&s'{|}y}BOwxss'|yK:$ pnqo8_"@+ߙ_#Ԋ_g#P8W.C g|dcr?//2Ϻ%+ ,+y6eB`oM80%4 Vp`,{`$'(q客Q!0b hT6ѵ5^}ƖC&^1P>.KW @J" i -6(*i_$LClF=5; y,55\PY CJG#DRjsJ T8C I9qPi͙זA")R_pZ6NZt (x1!Zr9s ,x~899YcřI3aC}ob$8Η~Aɛfaϐ#rrrrrr:t0dCC Փʘ_gC*7ǟۦqvU%(iH;h,U>(/ jg~ڭ2 qaTS"t8d^$[RdF[˥o~Z#FHfq~ߒmyG n]+95.⁞;cvk$cJibR!86.T hN3DU~n 538RU Ѩ/z} cL*GKC:Ļ '*nBh)ʖ*D5xb BRJ!sܢ/ؾ#w7Fؒ靓z$83AQhG"o}dIbBUN 8ظ8;_t阱c wM kL$qq+U\vmJJ o8;n#1)1 & #-1ӳ|\i_{so]F7N=-_3웯A EdxFɤ`;ݕON:tygh'9<f#7 JU[#ж8}%9~؋h ^PttME~B:sjbVcřЅfYHi!s." bs<㕔X (sSgA 6L%E4׻EP0`ɖ.p&11 zLXg劈`LĢ 3a&7}[U"T4@':&nݺU&w< =;+#s4#yb IDATjNIӦñ կ/]o߾7XFM Y"wfpzק`4]CRW: 4b<qxE~Ҩ(O5')3NjgN.V^e;F=!Z 4JWF#2jRDC'Fܐt,f&!D(PڎF=zZyUa68&M)dž _ׯ -=ڥxtU  D)8.Ĥ~ZZѤ7?r8yP̄3W斉cxWݤ:OKOFM0@z,L1CrhКMFH x.]??vTU՘R˕պMĄD-y؁1؜ZHR6Ɇ JLaT#'xؓlldCf*vBsY @m@l)Ez1-1 0 7A>* r%,KD4FjONka塔bqWWd\Iq݌rix f4 cPHآBsmy,wMnT6=ŭ/е^O8N)N+|t <2. &@jr~qXxd'A0h=eNiI 挻ڣ\Zpm^-/ RDDDGGSJFFEz<L.).Qßy:záP$8"8 KfmDY+H Kyc92JKd eoasY oPKR0]Ҽ_ C֌C I xTr-[,,@XGDp[3YAb\ ؖ>dXqetIE!%p{MSW@ ΰƎM.6 L 퉭X#3ہ,`2SZ.0gͭčM. k!÷Nenh`r!ks5,SRjMo +4AMPoe@Te&X7i2'/#g5m77u mlB)4""8E3 }>ӟv=hBLtHSoj=$}> vӬ H8NM@ W-^ǥ p`4Roi)fiST&ƞa%dA{i!')E^N 'w5FXQLqleDOŻ測aJLP¥+ O$1XO@=RJeiV &5 h2fnRt/q4`uTqhhd|yCjj"їQ2, pURai!?u !A1}„ >-yC볊Ƌ"V(E -W31.>I$BbXX<#t[FyH};>'x=s^7إ !_ *U ;0& ħt EvjsL:\|OLNTvF{1#4̤jNTXz@̬NETݜT-v@5Ѕĕ\ N@B1gȰW].o1[q", ahko,f6ZCSצ,tB@v%z _*<3x$cdq:]`o,|aH?ןu@@AS+V< kɰrAA!Jht\30rIG].%  x!ح){Nٓ(ՓʢyY(r9$Jci%1*3! e 9GDc-%@y*W2zTp\ibwYݲGKKyyXW,zdB؋`PR  WoONE.65q.&@9|}(-VM0?+P,67WU?1-Li,̷b1* yTL"(8+9t!,.-M@l2PԌ6Z0Q[L}! o7Ae/.Gnhe/Dln)%ll~Xv*ԗԵg,[c%x\R ,oVf> ,G\mJԅ\HA좢^N@d34I!lsXi~T"W쬼NjV$ t!("!Cn1P%Vgx8tcjR3n XX\qca(WÇȣp4)2;SD"*NP[<W`-akE3Z ( lR3 bv\1vˋ*[`uy++EuISn(%?YI5;t8= U˾xrL]l.^Znl2^d(hBM=&F 3_z)ɶ-v5N4K\A`ꔀO\HYM1qA #[b%ԅ]&DAyG| ӫOx84r4o)q< JbdM( fH)bcdPfRXWuJ145C-ijDFA :R)Ɲ1,|f M?X_>ͨw`AA<0/"MaQT%y"9R S x"B&ј3{5,VaClVO%RڀL@h vX Q3 K+PJ-0"3SHpEWin*".қ411;%\Qg/5@9SصF.K%v)(Y!C?No TѿY'U`yb_IytSjb!kn 'HN„?n@ A-AB$NvU+5dXb!fbٻ x T0^?9D)e1) eՄe4X"" * M L h+ĒKA%M[H_U6B "fzIul}&uq}X{01fLͥl/"TpYs%ϮPr"%QvY?ځ1_o`]`U]jlqz31H2M\vݕ ;AQJ90A n(*P(R6#E3Ĵ CPAq ]kpQ2Ȃul-ĔjȟS{[FB$+,SB)2XekEJlQr j[Uj,t䔦E滖:oZ1qs)+8e*i)5E_6f,D5e`5NkQ*ȕbDLA3!Txh+"E+`[10^ۭbhncg:p 9[L$JRbY_Yi]Ą$E/-L +;M$:poO-|FP y/Jl7A)%L"U ]"iY[8kMa@=Z>eٗZDg|/e4ƴRr0X90l3OF*'BD0} ,ޒRM7-V־5wWf 6LjpZi8jKX77. aDq6` [el4Z`1,Hx-9YV0hFɶ/L3p=E@R)A KVЌ0!BHiP,xgf#+׮?RrJ]EE`I >MBY#r^wz~C۬9m=ilH5EZ_B &:qƉII|Rq YE1Im10O60YIJf4_+*ZXHk{8ځVw c%· {,ԁ&[d $6"FðEQ.-s!'×d] C.6^g[)fHh޷Ox%\0h7{IrzeCP!twKjԂ|Ol5;٘;wںo>3 ҆??a~9iRBR-ZɋweIP8ɣ/uQ՜2j^Ps>!Yv sP0V4'=ypyGjy@hb_2zF0Ed!ܞLޓ|Dj=2PyG**f"s $~[D83?8N(NA +1,/L#v`D {1V|æCzHUq&ogfPBG9Ôj8z?5=#sV)DԘVe-eMrk訨P!_ ຉͅ M1U z[Cަצ{ےgW; |F+ޝrg7iyc_pJ)GkؠIYG*jҠAۻ4x`Ө4/ֺE[\upGSulּVS-#oФ#>RY=ׯf"B·3pC hֱS[RR#s 'mRͅ(PU jA]moůݫM @;?7of5e C·N߱Eㆍ:pԯ.)#6Pjctm߼QvF^ Rydj6i?nKЂ}k=2@g9#K>Ʌk=2( ^eѣCn0i>c_`1GWQ7y:h%*MwWQȠZ6jaeJwomJGn\IשW=QJ) ^ٴxmg7jֱkPRZsW7fdN>RJIQݸ1o3bK0T v7eHVMwѥK(!*4TsthѤqG=|Ok߾6 4cZ1};hҸyޣ]TL 0Nm4jڲc3y9t]K֥M7Ⱇ[_[6nԴ 0j(Qmd7승oԦY˛=P ?~NZt?qz6n7zK!B TcتY}݅J)@·3xSfMm^p)hPJIі7\8΀Fo-"R^wl߼i֝o5KP)UƫKޭ]֝?P l}ojۢio3򱅛LܼIAN)p-tB>6~`6-i)Z%d~mc Sڪq-oyp˸cm jўUԭ}f-twC^> oiոs]zsX\ܬvz3˓/jwӢNFZn/e;s9KZ52 [RJU-s7S/mx8+~fRбw4܂nq%ό}!@Yv&- }mD/y>]oOoX|Y1iU %^ޏ'잃n:{X%*t{%#aaw~sE7T5BgZkأ -Y%h/`?fM{F=Ӿ|x*uf#@WN&6mCjre?<5߭Qb7Cw޽U-(ҽ]8W?-Li`f~яoֽ`,MlpcAC^ !pzիj2M[}Vk%$ptѽf~ ~FeɳrHmT xfտ>jۢru?lPӥ:um=[$_O|w1Soxd/X5/UchJ.\:+fΙE?~ë!8pj$k2W..} >|hWŮZ}8-x,yC=[)4dc`(IՃm̏gtGj;vTv[hSƼ^_W7NTN1'gNBYy-([œ?9X qj*6ϋ~ܩoS豛$s`>,q5ynF+v)ng @^:3[xsY) >| }4h\2&/?4ͭes ;ID 2'pq#:Ս7wwN>aן|;":R:OO_,vVyd_OޜLyMI Ն;kMqafbSm=qC! _{zՕ>lGt5}4|l[*}xCǖ-߭WRfOK8LJHsVc${(U%˵&k&EhV.\܀P_<@n8e{C@ Ph601 {wTP;^<|CN/<ٰ1bgZiGTid]c={TU $o%7?k+tj$y\4~B.\Uo:3ZнCݬdJi֓>V}7A)UKX}>ƫ]G*}_|ƾQ@t)_!Wڋ~RH“~}bj }q۵q*}O0[ԘFwܐߡW)lqьssF#Xۆ,}CY2wdƯF{H'l+.T>CҵTy5;h5^n5:z#Qn|c =R|מXM?m)9'?TLA|޺Lh0pʼnndʶ5Jt@LZiZw3Sfb(^Gf030] @Q+nW7lv7xW' @3h9R5}.]8y_Z}oD,TO(uW8q[ziPRp0ZiQ Jr$+ Qj3Ě#v(;ѭ8jVpb] CTH@UCATI9=gM+_} Ǩ3Y .F @X5w) :Ԝuo= q3Y,(|=š _'=Jԝ,)z !B9E6j3>iv@ȓ!JC7nЦ_yÚS^W^֪4jG+@)5T4t[NDhkp&6NtPxR#<1^Px(HkMϩ9ޜPC Iz>yWb|B է ZI&l"*6r&6m"$IPAJi(oX{FR3@"uɻ'Wo8{kjD$@i PzzGK6E m(e 6pQ6sQ\ĎPHlېWeHp[w[LX؁_m;fjww[4Ɲό @<Cfm{/fJi*b|yW9.)^Jˆ\|eK%Mf|Zox.~}ǧꢴ`;V hQu~`'jjnj]rL)6{5 J)J qjQ2b*V;bi+ks&ݽ+wצNU*θN^ٱB@sP D=kB;>@أ8[ـ#_nھk{}+hnu0g\V_a];wڵkuY+Ί-O|]k΁bRt֝͌qBߥڄ A4cIA->?䛦?ۧ9jUsN-7{SMhzGDB:b3cH0m;vرsǎ|#N$1 W# +۷_kġ@Ht*!={㧯e n3PR]9PN3ʯ w޻QpԶ=ȚLX+Jo\w]u7L4{w&*Ii99ߖAlzcSn?hs.?xQ)wLt)Q=%-oLՒ_x~Y DtwGqDx4OhܸL%"sȀky]klZwL0]B:Vxҷ^LjIZ7[w$`wS_يn]McE@IC4L,9+?;ER〈Tx/vjT:ޚY~r=]V=}׾n4djPJ{UsFWqB^okp/:LH3:G;7b ># 7=y?qnL}yz:wQ9ŕ;P|7D}H!"ck_uiSS|ЎmZl/4L,=y ]=ƙSۺ/k6ahzDjyk=ڥVi>gRQmѢpRxΙbG;߱bkCx%*nXʁ3Fq "cȠҺ[g[%,f p{^sLMJ({f1j1͚]gC>fWNʺmߛ:"+G!ss`u/T'hsD֍- +~>=)uGdk]ffF JvD'XՖr?4cÓ>8`+Ww?ޱVY 8Wr& +6գqF)W,:^H39k95'ή۪6啳.VC6ŝ9jެĜn-%U }z.WS'v?ڟUz탲5jiUI_Ÿ+BSZ4O?F6V$B ƨqj%ō,@nq$#xjUxۗ}ُK;ֻ;}/^OnYԙԼ~]߭/wR{3ub䂿5ۭf\ܸj_wfN ~JO͛)I>ldΙ1Żv}*a*vR38S;C0曏ֲRu+5E:ڳ @$,aں҇1f#߭M3 5g__#B]?s@NClp,gt|wIk]n2eM.yϯn\һM߲\P˨L_5μֹ皻6l}iKxvʾ7~+q9?;0Ӑ#\ܬtm.o޽a] <eW6l']̛]4zኴ(Ov\KnZ֊=J7nzbrWS'O=zVZ 46 z_J˺cхhTcʏ b6׀9KC2"}36!?ag͋nV=SE!P#(:YѰw vggo IMGRKe ۏi3չLIMA K(T*'q AS+F424j}uzTU[bxlU6Q:┸3xQ~]B]TXy5M\и\!0/H3 ' @TR/r.ETh4娏3@ڪYM}.F:J ';+^^mR9Ssqd/(_Ì*SjS 24L*G34n)wLURQ<<,N:zfO15sp6>1[sg{'vC$(-$͝=^NWXNYdpm[ng. xS ptr=Tt1E Y[ش['kIF¸>}o7=˗PaFu?8{Ncv JTN7CCs$aA Yt(2Ku AdEI:8*UoZ YT|!u۪u0 S ho'Pe*']zC"B7&@5#:ن]H+eq$P,˜Ǝ^^fuV`!wHM4R (&i&Hi$4_(,I@GT yC5Q|$|H㨖o' @Ͻ%>ӝ_b^|!M& u dd:rIDȪExh çSIJ IDATi!ILKF)pSK5+Dɗ +Ft)pºIbq̕uu8~i,žك|;tˮ'R?LWq͌Yϧweخ/Bqދ#Gtm`P-I4 yW|i>^6W:v2p@!@i% ZI|])3U$(0MFz@I/(!j ,BhD}*5I ?c*3FxYg.K4vCg ~!&{8iOJ|w Wm?pL-XvL^m{-}ۨ'!SwڬRW^?xy6*ۮ?? ?mڃ5?nwP,x՜C%_;gX7ęw/ 5|;G'\r-נo{8Y  ,[z6fߝ˛4`ę.HW/˺' ?xm:+TiyT([ wCƋcvB jkPE '6سx>.ʊ8J*PPp1jER4L:Isz=& Dzcgrҧ3[Yв  {s错\  C>3R9r쌞zty1[h|37>ez–EC2h 3Kp]F3 T1]+׾J?i1]+G (J m>$cͼÚڕ :f=,6ް)Cw%(Zb9N +4_ĪrIIh w=/1OD瘻$@eӹkWLn( wu.=_㱱oW̥=>yݞ4H4}V lsuBI¸K!WE@0 YtpF]s,">Pr&՘)e/~#@Kyi{8P$1/G3v3ohIY%b^ n*-Oc y"|ٶtkO 9n– {f-m\_kHk*Q62Q|',-9lI&G%zmktyGfi!sI2l4rås)<^m]懿meD~ĄP3ö_Fڱ,5{^׾֖xܶ~>!Ώ)2@϶3Tx[1 LO;}BimDA†$k=G+tC.^[(nmaN\ ސI˺]__ꜭ @T;AYy!441dR.'w;s_J{?[|+I ^ތ-̨RMZubd.yuv.yyjk}~|CkDPP|HE OP]I}љ$ ?w;fҨ0';?^}B1׽ܭS]xW߽e|Ыn>Lk~4w W6ST[4]:~÷{-aY6pTW=`Z$˗w@h3KeqӜo9B{h3nnؼ[#|ɩJ\j#Q̾. M"Abi[=TOVQ0nk[XRYw|:B@ H,{Ӱ~M2J"BX52>HB܆_ I|u~ZydD 7*&̵]G[(A|ȔnNN-O(];S- ^q=9;8{Yx _]ڀRHbT%Ih@YeHGNT>8#3l՜z&HO%[,6ޮoWYm (){PB %PҐT<6zt>솁~YtmLoURwdes|¤jFm(@ T~Dqԉy:96 <ܽCUeL4 B"$@ 4QkO=2n]_"7Ş-) _~(KeQ&Q3R[!IAFI@Ps{/6-^g,ްc5u5uy5g,n}^2>0uiv]^&襀 ^3Mk(Ȩɠ6(ԌVHEQR´o,V58yNѝ:m(YWcu1wÙUM"!K||+;xwXhPͽB aKmӲ'fZʩF c~M@ z c[T-u(Ic0kÕPLM+0 DhA5t/Rh@ $Ah,N {HJBx`@ +B(v1Nt L᫠A @H8,:m_KdB 3Q#eW 8u5jdeRS¸l-|&+D=ظ^}Q)✈}sodּǸ5JF*=bj/^4ݹ^Cxŋ(:"Baa oX1YC7mڴ~jAo{T\<~S3g$^ܡ$%UTFha~ڶw曩20664io u&\`ԩ[Σү),ߐ/;Z0@[7Yк·yT^FaҙWK>F׳ ڳ/ jFy_ѕߚ\?s_@C>@T%A,_bȐ!fff6o>vX`33a?tJlbmp@$Di7ʌ7A, 0PDS /#_h OqqmTt^Wg'tg,ێֵ$e>@T5EE6oٳ{7nX\y UEݰH|sPscTf db@?h+I-=DL0'&kQe`E)̰2=o!wА%)C1/-R mxALa+'`ȢG j Ϟ3s0 HB OІrQ\xnnFc|xb[VJ^FY~V_O&O<Ú}kjôpco'qQ2oǡG qٻwo&xݪd%Y-g.]8fT2,E :FeHGgU׼YĠV+tvsCBDzԥðY,ﬧM9Z۷(#y^MfZs ^Mn\TEJ Y]U4I$Ϻ?ѷ8ѥN*߱6JMBfBCtGn].b-y{5_5C 5\fvn(Z8n^aNMٳtL2%S祎e_WK{G\l>Zؿwy"۷5],.tO`ԛdkf4G!e7LlB_<ә-͡ջu,XQB $x6VRRN͐V+$jGZTA{(ps/44|s^OnιҠzq}ƄzOذ ]:W1Zr7Z頑?oh~wMswG 4pLpLmg?YZБ> 1i48ߛw\,;7i[!@c@\A8]?r98HU3g۱ =6 lS$Ndhb 1\[z)9v?3|m?!p8δj,>*)X} wf J(UQ*ʼIG.q4W+%mAm-}(:=7?f BX L!.o0Q4lh1Ĥc8}c9Q˒^3̝٬uܱ\>J JՐt hXHs|ytV\Y4Ȏ^ioK27F/QOKGz/ɧ>SgX8vJqћ[=@P $ߧI3o`6XSF\^KyܼUm]Նc`8Hg;pD1p(r,)'4Aim{;]1I+폼[cSA>K3N@ Uvj*Ʋο?jdwYfesJMLww  pi-P(+.Vªs+O-<)+ޤg%mq{ԒACނcxb^#3Wys֓ /=N3Eó2DB1H2랬nrgDnl-_GQ->]SC480z̯Wx۟ V-ݢ\ +>z@Qj#@qok/7='[#S8kRxd1F7'Ц{͉ώqYVO,%F@ %͸m@3_O8999ID%.6!!ՕUy+4>h|}]]wi!o5:NLX%,λ. Zyi` FFkr=;NFIa,[EJ-~9׈.gD:l%Wy~uҤ/lԒr6۴z!. &}Mw @HIIS,HZ8@#)/6'.I7->?o6ffǞ)]\}@%*8V)JOjLg<g+ڮ)K7$W+ *9Z qM@ct3psN*R$A"E%,V^VWx *^H, x>elCRBM/q}ʙb)>B^ęl3+K@sy޸q4Ir|qنXiL1ݧzܽ"Szu6pׇcq./SF< qu'SiGBHD ZEdN˕ YEz&,|TPӡHx^b9Z eMOX{ 温9l6orNΏٓY@7R|QBZ&0\4y3{w[D_u%OE=47Xӷ>+Kk#Tvس(J2C6_rqғ8/Y{.54则Í[^ZcnҚgu=Ҡ{7(rRt K4&.+75%p33(eoCHZ`fs#q4!'*E`)So ӏ֟Ӻ$<@8vqϙ=sg=^ZLmGGPma]>V^ /G6ך[F/^SU.ԏDqh|vu "כѴh˔18'Z:d>ȎQ8@Ʃ ι 2d(B qHn?cNaY{Yv;(*v[ޥ<_!Z{PFI! ܔMM\LwsLaOb1)rYQsܒezHPA KH2yF, Jk?r 3y`'F+#ԏ%||q=PAnY&:1$}&gkɚ;@B>Ȅᬄ?ڜɻS -6&~\{CB}bB\la9>Ț!$QQEXE߱׎ʷ9Q },[SC^NjkSD j35DhJdjlD j1rdjy|YIv2_ӿH3݁N͆>BՕUO Df| _G:v}90nk[_lo,Ϭ"ے ~L[*l|!A.n$ERJ0mxEE QU@ צnXioď1@E>ȅAVz&_ o"#6R\=_σ+1F\z.FqoD)ܤ3 F Ox㷣/Y- b߶qQPՋ,JO<">SM5hitt1[hPY7_mׅ$ *_w_ w!9167O}iiSу.~*bɘO >MccK/qǸuat)<ۋGẍ?^ow~ ylo׷+G}gg}<8Xp~s\s=&3eiLFtCjM,w}OFfLT)J(kWUr,>Z1m_H9E֛d>e)hU'3uf𜧇?XX>݀iƚK‘ mXns 0Я9ζ>IT +/|45˗s3ˇx1ÖMP1% ,+x">Hw6%w ?-]=QHUHiUT5r-Ӻ e*87 BFL,1@l:ŬONH"d_r~`J̡w:9Qx(U5Hþ[EYЁno՞c͵LJoXz0"_3b^B!]M@'@8t1 8'⨓~sc _N]isj70&'ònIwu+”e56!?'+so Z xUߔt&l^Kvފ+`ϥ]>GN&LCAvmaZ6\WYUGbǞO'G{ Ā12`?7=穿8]]vENQ`e2GD됰W6lܨyg \G#" @ @u0?Cg.ŽXƍ ~KBس˳_LΧqq_'%;ކ\HQaG9NT]h10!!L*rje~D1V"ĕUqyTd+82@ȏ ϶nR<iɳ-MćƸh2eZ&؆s_*yEe^ˣ>ߒswѧ'J(TIè *1@O<7<ðef|Yb_U,1Ks :p eFioK27F/<ư q:wu.7JLfߛfQLQA+/lOU[DK$v5gJ?:*lUi1`(k]VӛްyHQ9d|۠W$3iqa^ݽjɩgf-a }: QCgKOv[rْ'VM.mނ,h[6>ۻt+NSn" .JwYfei9*oV pimJ7f <'ܝ + 9ǎ;gY˾njɜ#(J~D*JcŅ Ffa`wZ0v5eLw5K}bEó2DB1H2Mg%}fx#y[ly$ZJ~V΋@ t6Hw>HȹwVyȈK?&O.tTW)UQb^n/{|O.(B>uË踠$:,rwI" rכkXvTIݜ$)8ܨP\QSI/_*>Ȳ ]\2u>u@ e/{PA4Fe>=Q+} 5dH&<4ŊЊZD TB BZC*R( DA"&d>w@Hu64Ku|Q|¸}7&8ҨK3x>,ō+*mroj?em DC^X}ȴ˅*cd(k7}Xupܛ_?]rFܵU96)Vk&GwLorzY?'&w"@1^my0O!R#T?8{Ncv dOIVU@K$ǽidb‚)ݜN $ƢżQ<ިŸMiX+O'QHb%;2]FkiՈ *YZ-.J՚*胬{%GU7"9Fw_ |]5ʋ:"GNy{Y#:|8u{bZYV,]nG9k цׂ;Fog-9-tȟ749$RɕWlK{ҋnMμ ۚCABd C?%yNrz6_x>MOhNSkߋ vbʕѢ9TriLP)ߧYup2y27i7XNgLSqL53x/+gٷnUhPI@ brPV*6/IXqcvZQ݈]+ʼnM&}ܚEzd:r)Tkՠ6,_&55T<+SM+=E28>!DeJd.NaªOhgi0p-4%uה6F|MP# ~0mZf! !'t=ߦT"; ?7{osزç]:0їgǻ b0D'ޑ%t AVCw *<+pyW{lw Wz=ex3tX}>k+u=hR ٸO=Y?v\7Pl(Lݜ\Z\r.( s\gw{f?N޹CO:YsU|@1\{x2N_Lr#ݬ= ٭m%mP n(d07ifRj% ;rJ tS 0 '[Jq`̱23wP Hl=15cjkPÊ2ls(ն]L(T 2aLf.G2\5ݤㆧRrC40 %uSUU' >duqx,(HEPDhA!ۢoTβ55d(:Dm2}Y$8. ũ ʯ̪0?[.|QB4 0q e͍e܊T~Ga]'~x{{8HƱDh|۠ߙ-YH=U^ƹ%NZsOYM߸WG@moY|5 eVF{Ww5Xk}# rA+-cȂ0ͼLqT'I5ճ/a3q D)Bӈg?b#0hL3זFe:پ7IOvjnL?؜Egv$v*$ȧ,OgYv{'sKk2YV|5IfOnZ%[)f2TOiiY=1TolÉ; VY|>+G%a{t:K@8HUCQKrC3NY]&+,28t^;PB %I"OR:Eis wGN&" /9E[L |uPXaϠӝ"`b*+w @0VÐFK#u2VJLgۧWhCF'`7LF͟PB %I#lu"Ò\Ȩ'TƑNΞT+$$[*^dZ[9Hw3;PۘK25nNzo0NN}cכ%:y{Zi/<2OoTGTOk G4aӹSzd4fִ^Q R.IaR=N;6"wѶM jJ(IRĕTVb IDAT6琪ƔLD 4 6ݝ"l`ee蛕OE9eY%V~?_@GL-%&9ɲn\'iNNjBߨ^Cޚhd3{%#M/=2/zپn2x`Z|P dY* Řh @%/2ldRG`)8ޮ : UGP°9&/$ĀJߨ^8 ALzNu"D u $Ѝ]{L۲uzKt ^o!CsG^A4ղ|!A.H|w=HཹkU3D%vzzˌKy\\gN5 *U$Ө uD2#ШAI@?Br$9Dq=9;8{Yx _r)Rʗ0 6?QZMX m%_$GNtzkmP%QB :TU}wnA7Yl쳽]߮, I L>qnjezo>syL@Q*# >6ʨoƍ_S4қȫc2.*Ԭl%[ xEg27q##6Yvݙ-[%@1VL~cZřǍutӊK`|A;_MIsUhLV*k-V6Q>޽zK),C% ,+xJ9vɆklq[2}:x>J #IF}{X8'<6y.( jT!C%)1_0Ỳ|,c@W$K^]H6gő-謖c--!2E8`ggRzJ7鳢[[Æmj PRVErܽ>$8ӪR3埿*+QWdZKHdͨqmJ(}IctisoĄojDT j2klVY0sturlx0/©%t6[=[Ehz=gs:]1dPrtqvrqvj"T(TIg9&lc& 7['`} viafm,W-: V,r2$4cN#oKi;y5q aQPqV=ZGEuW֪U=uQ_'*^ lB$ !2~~{%$ON3AD OVؗ]]Xm3ՎJޝ{8a@Q,\tn"J쩭YٹۅfFՋ85A_?a{бɞLuTjf1eסVR& Sd߉fQή9@VAVSY|'dhڤNa࿌J)gݶ㸅Jb :$Տ 1jtϗyޫ{F0,IW@|W2gN<:iiRfgiݦ8I- yc=w[ܙzO"tY Q+QjQEK/ز]P.+޹2ӽ_{Kϔ1o/(> SvDSlu֪TKL)NuU8'~"(P[6cTE8'N%TǴ[szzu 6Fڤg ء ǭUOiqGDӮrԦ~!խĥG>G/fXZYudl쿛\YտcI~މbG;V#ŻLZtH|-j|Ь$0)F"3)F166(\*LcJ ; AV DAdUEdˁt!Lif|[5)EQviWTkټ=5\RQ4UkuC%j~(DmuAM:T!k%kf v&ң.?͔y^O84s{pfǪebRLFըjܢMYiQEJSN_1N͞V 9{2Yu׹_{_+QPF:bŧ~H}j-\# TL}BWER1K׃+[q()*a,Jc?H6gHK;ELޑz&UzNx?~"NڌhVE'gKf#%9SS>x0sČlB~VDcoPH_dJJOk_lADF%%fdfzyjAg#sI69u# Ȯ+M|ZƾpH1Q wg g#^sA6k>MFI%6֩vcB݌-ktΊz#z"!tG MA"zA.T&HDc #*ځG MAH +j D Apd_wИ0ߨܓz-O>Ud&a9!Kp:Ngbiŏ D - dedRp+xIΆ4%S?qU VTi)Ow?)5ЪʨִǙln 4@m 9T 4Y\Om_YN,ۄ@ e\)VEIڡ ўd)jJ;K=Vfڙfw/?i~!wHmGD@d"xכR#r8Iʫ>ZDEK C|jf=uʰwSJGrBYi^\TzR:s`DZ}}r$ M#r/]n-^?c7sۚpS XdPji?MJ::_Gnho\/K|~W^?9E.V51ɦ٫ ${MšU6)ɼO;n.\);ǑA=#d'Mh [[cA]eVD%%mEL^D27^twqi? @t0zfw+#_ɫ7Y@g:¤F4"j Ճjm?q &*V{;\ϝ/bįtnѸ[ݙ8 # -2 KU~)~ >rB8x!—gvw+sAS t8EqA_Y4|ͮ#糧-n; ܍eĿWڛB1AH m Mʌ_S>HfVe %Ԛ U Ey1wu ;] O2yՅRӨMG&Q6%&b;!ϻ޶]@5|9x^ÁR?\8pm)48>C&A ?uM 5sJ⮉19.m8t0jr~~s˅'O[Ӛ\!uH0[Ye4F^an3uXJ,9iZ|C- pmݨEos"E惬D+1, J,aqm|N0kۊP VUY&vAaxķY G\KajWA& >kuy;`< 𒇻u^{w]Զ‘$W_Y'MFfmC A qcn|y[R46یŗU9rB56qbTDG(ZX_qus,UT;/1]}LOLݼQq+{*7|}+0.FD5Zdr_5 U.9%3+̎&2LQhQa|}N.2Cþ{Ica5d T ɺ#{B}+ƟKd;~5%O'0X@t9gtӒ-Ns4h4}T ٫EG,?3|x{lgBw l<~o¤廂^79uOp,[#6\D ;HkF̠A1JD..>R@ >6>ȴn1̕b̯A*fКmm $hqTKM" D>}<@|Ȳ&Pa $hqT o@ݿ?d#x u+\:` ."AP1} /=>ȍWybg Z1ƒIn0*vK̿ԭ6gɬSZTtoo>V^&jA޽x}@@1B R)vbtפq|xuf?ˡamp,#vjlwu+Y+ ŕfԮZfe+1v}mP: 9bQ۷w:x0nRo7Ru UG~ւJ"3z/ϸ|~ܣo/6)V|+KSn7˾O.7իD1V}v.BDW^} BPoHN:|rzhA i W8r9gEDZUI˹uxN y~Dh)W/k,Qy=:;3%z9GȡNO9vޏ84őe%uXIpEՉWvkO6=^eR-#_l+}>, 9\aNwGnNwhToCQ iH35"Oe5\9:: GEӅ42W,g*ӹT4[ 9NwOwOw6wKGliD]B{>mz.JWU]}rѳy%6  S:`&戭-=gKd`G٧bDrΜ݉3r =Ǎff$Z4G68k4oU'# )jՙ(n[ݙӷGm^ {2RŚ_rHniH>׶&^xjFZA-|&?[ L>6>^HmUGuk3jr~\Ĵ5VjԽ烔9P[J(=jLf IE16w ;>qlplBb_wta濫E3`f1!+6L"H'+}91=m^kK׾ .~6vt90|EZW9#2#deq#< Yǃm(Tx1? @'Ҫ$P m̯&a;1 )rceyw_H ˕-W%.N2Z Δ`H :פ`e=[ [[-޴&5arC=q*M?ja AjA]'oՆo9r Ĺ-i@3EERDT*em w.eű/l+yǑŲWm wo*eE1dD7:O}8zW{$S}ƃ1Ւ딙՟tcib$93*5 4).Q= ,SZbq52`4S/8 ΄&F& fw FŃ6"X\ɑ^P 6\ܻ-3z, D?99ӝɹ;Wa;;T˹7YՓr;b㨽RY5{ !pœq.;3gKY佞63}rvfiHm>ʄd%50YcSB",u[;F|zI] ا׶љ" jW%Q&rZ )-ZU~1@ XI!*Wk,$Ьg>!|g꘿b9ڳtϥs>I\z?[QN?ZȪmPۃgl%[Z]NUk|Ŷr/ ܼ-qUZ|a`3@{i@4>|@yid&)G"GO#tQ ehO|facdl}"wE8R K}-ȸD4w,eQ1&,0}+Sd~gkA}wzr랞QdcFl(0$#T'ډ .ϺbK3}A[rPë8:|PDױR =&T77m֩DӒMffwH]f\>5(=**dqǯ;;!&+MV@T?M #{ H\&KCIl0qh-A"Q PЋ|'[Xuv s=@GD z"ȳ8sמDEm>~$8/9DsȈ:gN~Gk}[D>H =>@ A0Gy5b Y$uPŋt2hRŋ$ҍa.ID=QE@@dx߿b˝XnS7@+,}{XрdP=!6*haq MڧUd?oSo!GwGϤ 3nL4G>HBsm. IDAT$obދ:|r5 &td7;ǝ2x0IX=x{dA$nا|-G>2՜^Od,WKfWs&?ϟ^{AE/IuA9Ywdn]2l];ua(ևS A^Εth myIjTNog~ɳ%hfDTCtp(w5Zz>S*8UdTco\\\8*H%zŷڜ+X}8r;ȸgl\mTm-voMŖ8OH۹7b6ꐨ$J*X9wh!|3j1f+NzZZyTq_\lV CyL4(p:sD&z~*F$&3{p\yT"nԶ;_^3qI}QrYOa̛^ؙyGW|ՏXPlY M.-ϧ({9ǛV3&bɪ^ƌ  y${Za=(P|LA]zhKw4ѳ4Hqm|XTfVe %Ԛ7LwW"(/FqNa'c ^W!D/qWfZ?ձ+f_ prY6_W y}rŒ!/{2]"a9s ,-8x]k'zNJ̴D/R&9􄆌r r[9d2;D z` }Lt0ȄT`|u*%Q3G ,~jpp9pAE?MOΩ2X>'>)%7qn y;3^^$`ccferŢb_.<H/0PZ8A"H@P4O&-0B. I4ŪF4S3kK89Μ&&& {n~19XҋJZHũHzD> wzK]|r}PWTTfI&"_wdBDMEDv-]ql\+П ר}i5 L^WAn1}~Ak}d:R|=|~A} 9"$zny 6d[,T&HA_bHAWbJ^g@5x'Gd{i3>ROB"Ί@ 5>K AZ}#[{ Yro`{ag0z]|G4y Mȑ?s8GZJG@^ۤ]\}}=:L~$mQF˫ kI|ބG}7Oe@>Hu곃Ywd&^v"IÙxɭSN945ɉEk^}GzN#ZPC!1+H[}GjpߞͺMČ#+5c} U2D`ہt2I;LM[O|y 9 c3ZL?hYS (^[oV0"Ӭ{rP]ǥOeAMԼ;,#Ŗw39Xp03qf?2N[ufTg:hͭL4W̟^4x &1z[+OIq$oW|,&D_ @ZR4&pʪ{b֠^8h3J@ي\ZzuL/nRj m|si&hlHTc2.ƉZȔ]#_GSkx֔)EZ+6{xd{QKgIj2d҇ߥ~<0bmqR^Ĝp؞)l5ܙz)V֣m;o?K2%V;2) '̋a_ya;@QRPa tkbLt"`GUFz.xS؁dkόGtcՎfcDyR) $%~?J}RX-dΒXɛS"^~}G*'(›',/{ i'gڌv!'9bB˂ qfm[j ؄f jHB^jߊ*C\JϩzReRfl.Y0{ygP!왘 K_vsm~Z$ps*{CF* ɖ=[߽!TŦlm[~?օPШ~4e/]Jx%-}Xۯ&,+}l{ONM,SrM gz9hRr hl).+Sj) Wf(^LRX‘W)p$ ^&$W4f8\(ԗjP(nzoX 4!ݝ=;b=hS{zvt@s)6*b9iB^-(oԦO:~dj?毝cnֲ#ȟ΃ rv ۾O/ҥCҬ?;l{d꿬%[Oq 8Wj1yv/'Lp seu [ qW%}$TmIL U2 3j+ɻXd2;I"mk9) )e2.Ѷʪbșw27rxk(>0|YeUʵ&$IVݫa%qͰ [WMMGveʔ;M5>x5Q;#j!^u?y]v7gkJ^όtҔi$vto=6OJi/ٓ=o.xr5=h7J [hAT~ CkIՇZɳo\KhK0<7mߟ߿ҲŦdK ;@&.)KKd /?=9uOp,[#6Ԕ>L_#=*ۙEQn'`HX3ۣ$>5OJʔ /?5J#c99LX&@Q@? >HRRRS\]۴3ʖ/iv-m VX후,OOG7Dh'yqz-j  Jdj`,3{55 :1lCSi7'٧7;+ꍘrzt7R#:R4UX\& `zQ^T\j5z n`Rz|q@ST@dRkA.B4=E>HPA){c ԭFnV#c!M:/^?߻1ߕ@p9g=EJA>HH|U7.vmNΜқ>BR{Nih$E]iD }PA}˾O.7իD1V}v.B@QgΠN.CTcڌ12|H;{Zi5T Y _f|hh$UWXn`'1Ӵ_8ҷBE=K/&_ i2og_ggD\;9I[:ǮVUw$1&&5%zoEW 1FF*0\O1/+ :l:MՁFgd=5eN 5?0T/[zMPŭJJdMl?nW + K|m3c ݶ =xN+*~GCHp[K4f7rZU; _/ ޔTyFu&UwFS>PfꃴujWΨUy3֋(+䨇ޫsgKGbrtyS~wY,/XH([IOQ^OiD  ៸(}V%1RP_reo˕3’$aߕɰ+K}-s\jFFe^pF>LMMKOMKOMʌ;ڕa^n@;ٳrUiec+g3,d*+xtPOӤvF9&5ori~V<>Fꇞʕ&1+xץx{cdE]D+߼ 0q̥iRf.j }R/_W$\J+;R9n.Ί(Ĉ+VL)ֶ[ֽKe;WcZP~ O*p곃4jeb㫶7_JᲢ~|`2|[% @Sl43r<)v#cd>[N;{p4p k背5Z%ݕHc +UFU(s@ν/TSX@Ed}i,. K^_(}-vdez̈k+Yvdۥ]/ocPK_7ܷC}vZv>#ؑ;毝) 콈mλHtFm\;<۷;%gZZIue4Q/ k 7T6I@P8\9T]OͯSlR!Pf(^]e򢨧GM,z1YJgIfYRxe\w[sn9,5[ΰ ƥt|TîVKEU{j^H.:?UȨ|NQSuSֵa,! ڞZ%Z]E۟m7*4ᵀՉUX( )6]^3*43tYO~A]1e]-@4c^đ!V6#cmX}Qk/ V#/?=9Qר KUHՒa˳.; 2`qyq; g"c^~)-ICoDXLB(Đ)ibN)姦^9QݬIᄎkPF;Hog*?fkdl S6ufV$no!>HF#VAG9Ave3W:K|lV_4e d-lLhDe=xhLIq2d83޾MlDh hDqqqf| zҰ>Ȩ޶&YY:tCR'Z|4*t$ A"GRoFRna D - d;}"0..ެ7bEM >߶ |lW}ªRQ%  z :thI@cJz%C4+7TR(Oc^R-U i0ZK nvDKk]hy'>߶ u~1R9ǪWUm F+wRWmA1^ Y?i|7tqE}X‡8F DSavDs>HLw)ƚY6Ӝi|{)5K!iEܧ}a˯81gjPjT?4nvCȨnIJ"Lx@rpୀ8ocxXzQw$.xnjxxe?{4;%[U6,cLlIp>>MTE8dόΌ QށEQ81|vc8Zr=u"nT S,r >,0vlۘP?,ˈɚR͚11Z4Y2pB.)ɱ $B/t? x{mͻڦ 8~ K&x|\!FeJߺL̗%;5zCr;+K +-[l C:$ҝ_HEyOO-3ˮ +(qҥ-ȸD0wB\ ]ug?s2AnѭC7^U[ ~T<9gbr6a շ1b2S6o7a}S[;eXIbY B4Ê@|w d_w>TWW׶ y}kϦAhq(|{S>0G\lQDA"A6_h惬uhHd>Hu>3DѰ> R?"- L}}G4yϷoڃ@  zz@ DA"G z>?hXn.nnޝƯQ-kaswquvhkļ+Yuf'?woU498:988!~N @ 4A"B$}jv/t s^F?S+xIΆ4%S?qU VTi)Ow?)5Ъ7g@5x'j51RHu zRV-hS1, I;!󗿖 4P<|o[)I=Vfڙfw/9Ci~!wLgΠN.CT oν7Ǘl0d$a\qusILX2E'ݬ(SS=_̓.^#=Mysq-pGԔMQ])gOyzzRY~,2^rk?S=MMyyrb_VG A$B/AX735S=:lDE${# @/OwӞI#gv2r1*mڟ4Y@g:¤֒F; zY\1%D?3 jɗMџ,˦PXmǯ<֍C @$B/*t0/vR|"m&w?Nyؕ$'wv7+2Н>r>n,tBxln^n~!32t.ϼSr^ri}====~/&PЋ|5!m;[8ڪ$P NN?){ ˟-۶M<.Es+K}-s\T)y˩2M-vRṉߊpg켝0Adx]ȃ܉{/oj[vH @Sl43r<)٪%6}9'y"eυEm>#Ewofm:BD腞 4!ݝ=;h@~ݧ{+J׷mT&[ӺLskʡI}~+(փX85gQN' !$hh$@4g^1F@k"O A"Ŋ@ >5P 4D h-V^Ad%7~!#@4L&m֬N۶ 2,; zQF,qbf@@NӖ@ T~b&tbCGhW뱌ji,f,r'ɰOھX`@vA"BR(d>_@2 ݺ#&%iŗF/,m]awRþ{y6#>߶ ]pO/:EBz7r ʥL)ct:I$}ugzŊ`$Vӎopq NsЋ*H}9mws6J94Vy=2y$P}Eš,oU] QfuHT aZ .V^q+Ӭ=g Kd8`GbDrn2sw͕gK8.Fm57ZpR7?0iAL*鐐yGW|ՏL[ufTg:hͭL\8oUdO+vhk (Zn zdy1wu ;]r^be5N O29!z/0sߩ&H(d3 c{ڦD rg`!ϻ޶]@5|9x^ÁR?\8pm)Y.t|u+L&0@ >> \A%7(3cN)& W 畋,*}J,aqm|N0kۊPԋ,lm0g[eyxnIeYvF Q R@A(=5,45 n!Nz% HT7?V*m$ 1L5}Y35H7یŗ){\Ia GnAB ٦8NX\P,`ژ0TDKu6ÊI~މWK[3yb;"1:~mO}q#SQoA-acaF6p U.9%Q&2L1D7 BXqE\)CyYqZd~/,-8ȤA熯8$3L&$3$579_/ˈ:|5PO yB Xqxe?{4;%[DKFGF$.St=bN˒aPuΛm΢ wwT5@օwI+KpHg.{hgrrLHB})Ox߄IwnrY2Fl(0TC ;H$hh$>(+**S&""86o.Z@4AAQQ){SD#H^AӤR)M& rt3.{'V"l6]"F4 z{~u֬NϿf0*y]>q DU6gN'&ZQ #A$8\(DL 悑uΜe^3 ;Ŋa@j ^ E@ Zh @ j>H4Ŋ 65$nsި"$wBTkY=x{dA$nا`?!'"КWcQ`=gDE3 >_|I}jkuaDMԒw&k3Ji r":sB+>͙LHXw_M> (><4R[^BC^ 2HO+ʲ_ߠ k )kˈ@ > B$B/#IUw8~LJ ޶<}>ckψ@ >ړhuhB$-+W[1(S*+4G4}2"A"&AbZ\c&Hd& :9DɈ@ > M:hJƼ!%$?0i:r= #%?y4owO GA"I}]68"i?$M>8t NΊٗ.GJVs*v ;nLE >Ad$nLE >M\$܄ۅ"hD3 AKAfo&  A"A"D -D4 d{~./_@ AGj>HY-mG1/I+6zenSç  'yrDǐ|R[h0p(w5Ht?|~dnq)jO$|FM:P$dsEGgMMzrÑ@z7<#d}/*Ye>{i҉1|ښ7 ]Ueeӹ!?Td$y-8}*?-34R*{2ƚ3|:$ ߓibįtnѸ[ݙ8a7vXF-#f_s"`lg~d S:.0s7$gL*6STB#D40c wO}:p 3˯hF,}}30f˞|HX:>܆.K@LAQNߍYqnԕ{$d@8kk#:rc`J~i.iz\HٌCn9d҇ߥ~<0bmqҲieΞ^Rs &GnɳE-%:]k'zNJ̴DuKeZh8 |$B/A>CB^̼{nQQ78rB.Lz\0+#K[11݊ޢMkrWx|]:wXS7{ lPq κjV[VOkuκWU\:jV{+ Ȑld{~0K a<>r͹I>WnNLQ+Oۓ3: )MGiZZ׆,7W/ۯ 6NǏʚԄՓ"t-gZQJ ;~柿f~DxN2aͬ EeU`7UO{[3l{cz$FQҪ+'uٙw}ys4'6l*&?$by/d2kzYrZMJDɭmׇ_bss%hgZ֨Ui:6âk2Y^pY,DgS%.3OeK( ^0`v=ӀF:J'iգCU < r~$9$N>tk$ ISTr䘉%wV|lח7\UsKٗ"2',ʙb5!>Xi(*22Rb t.zSu/~STƝF-H_N*"Z y.C: hSg+t} 1R<Ȝ?><溩۩ִNJQ]D('[PDw1=Og(`"u# ireS~,Q%7pi/h 緞y7FCm@[]Ljn0@ ~s#ã Jr¢@{A؍{O0Y^ 1Vjy!d̮b B0Y Bȼ0YBu΃DR, BA"KSQ9>oZp% VɓɬIVi:GR.1!̬ %#%r" Xl!X,9S, IHrc!;ԔЯKx'bˠN(YxGo`O"3U5MƊKLDL/+byF Dj_F;xB9<2Wsl @2_&C' }\Oh:#~J=G܍)i$Qi$do98OŞ<6lk&3HH '#e '2'+i΢'Rܿ.:[grP_4ӕ͝>(f\L퓳!TdKAe{LI%%7[Fa%BLL/Y+Ԫpž БeDv;yi<`žFb &>bÆ6/gA|ωnFPlazAlsdɫ_ 2fspR?k>+2=sټ %E@\ԭXǼ]/6Kis_\k'uWx86C 1b"T}`$̃DU;, BA"KJOrbLhdaLGC;SHIp4}lذբy̔[7 >jP\C 9)\M͸\/2FVۓ'IkMm(1}BUx1S$*Ii]vݻ:0+Amy:˄5^ȇ7Ql 6l&?aD>W_ (el)[lrg?x &feM|qɷD"PTr䘉O:]Muv\^XȓQMJ'" TaMaÆ4 $Ŋ1S$pY|q}pQO_AY9M,6Uf*<" nG !T5$233A\vuDV( C-Y7S]r>Sl 6l #fʃ-R P$bXP[]Ljn0`IJ>C`~BUHdf Ό_ar?}ϋ/M 1DO+M\ nb ߹xu+M B Hdfv0YA"̃DyjyX #Ax{_bA!s?@0B(X # Za4[Ȟ!TVX # {;עG杇w@߰Ƴv{~~ց|'M.Ŀ-ɺIcGnaEaxIrn>sخQ q1Oc+S_Wqc}QS^a2=!TA@"FAj3=x|< #u =-7kR.oaiDV։=t x5etnOS{xy{4k?f}XO:ΎO{5vndk =QJ^YétuqO:ٳnR&^CV̦]izwn_pbJ=UCO>3<'[n;df^H Tٰ@"FA۴>+u+*U]G5ͪ K?v9B>f"T1 R%t9}DƆ7'ɏ7c@k_O&ǩuc#ٶYw氬XLYm57IC;ɓ9ٴ&{r,+_! ˹:ETF;ly=UX #ʃ|8l`4*xEqdxl[MټT֦ؽJ_V+~#X #&~YZbA>9:嶏.ccRCyw ᝷ތÅcD@hjd>~Rki΋bTul%j#|SNNE5zاmD*+9Ykvq':>.9m1,J1bdiǿ5ݎ%0uƕ}L;sh7eq?U+KD~v\Jd?vM4xw+Py u+uitFG}ӯo`7m&VƧxdqP&EE'Q\ ~PaYLiis<_`e/g.ϦxEճ\m$K8ts/5ޓ9XP _Qn_h;]ònbmSLSPGfmm7 Z" $byei|63,0^12_)+KDmiRz|ecwHw囪GrB" ΕzIVx):0KY07M_T!*HdFJCTFo[yU Ü)}Բ9?|Xxmӧ 9߹l7/=C]ֳ{ X^6KiR!~Pe̩5ˈ̺qPWҩ>fy/nj#.}{W7?0gZ)!T)@"yЏK.'靫gL^aXw*/1e֔BŊ rV#^+{4s =l򊓱*5~{3u7+Jt w5tʪ3/4P Om/4(#V~wz6ʹ'z5cdMAGcBbaD%݂ WR4t֍SGV S>~׎~=-?AyWkWpfOn ;f7yW{J3!*HTG(Хk(CZ%p޽&~^;yNwRtt?lFN!lGNs!T3HTz9@ggGQ J'i,qHT\+1BJ~Kӯ:ylLd l<|!T@Thܦ;#vX߹mwonSW=cg%y,U?TJL]YוЊ\] 8U5!*ŊޠIw~[AVl`eyiQoa—k6~:`k׸nhBG !Tq@ӎ bbb73P {UAj V<2ŊBovڷ7WXr$!T` "A+B!dHB,!X B!@"B`D! B!2/ P⥿B5p8,c {t:U!, _ \.kJ(W*4WA ˭=O"s8溺{PTWXBbt:H\KRbUYWRTpBhj'Od2]bD@ӴZh4)syn8֒{Z26*@ө*@r ЊGBx6M}j^+E<5q[_Kܬ5PgsH7ŝEoϛ}My/߸c#2RdEˌچ i!I/g};H\%K!dxTB5z6`6گ5 ξwΈ.AA3EC ʨgx/ydynآΧM>FuF6ͻ|΋А/4v]3uiجyMP!%OX gԯuL n!'SuʼSIjJ?AST7m,2|qޫ#U@=SP`}lՔ/Pafζ߾.\BhzOH4HT 5>]x܋IPgT__M߭埻njLCᣈ<#3.yim6}?[^XE!jϧ^rm#Ws~k+>J"'۴&ֱs]8 [ߟk[W#N͚ {\ȕ7N.jvk͑*`K˓O6M?Lԯݥv+о:'מ[?ko͂=r6ln9 Œ%K,Yk…wX|ŋs  $* %nuʡǿ.:}PWB{Cm>5Wfq<|l@=ad5WݵMT53k=uf6G`]G'naǓw#o[eHU :];4y>!okF; <7KĎx,w~dFo!oy-s"|6͹O=ύ[8auJœ9u -ELlJ+ui؊Kޱ/Ȯذն&Ə+W8s4rkI$b랦?#gׯX|.wDgz2)/^jh#WԎ&i5E@,3+bi6ttyT,/[ nsi5Eeev&DPtjW &ڦ=s [[Jκ\Uv>"MDnO/?IqQRЅR6z\a~x%heԗs? Kٗ"0Bȷ fee?˿_er666݃ϟR .@"/5074dtdWlx2M.!̺e_- 5Թm*܂uw[=ʁZ9`blEi9d@[B3["s"s NV%\D!S*QiueWԞGn)?tB4~ټMm]}ys!S)WZ=yϝsuu]lJ,_Q|?Ԧct؋vlMd^guqTC{,7n8#@+__$;Mk4Gb%ek.;RSaO Zz俙2^-[ll֤ڳ⎸ WX5"uBd{zlWh2o}-*]C+J 6l*iE7oޢE-hE;A"!lZڳEk+%/]6ܳWy A @m:/ݒ3{/~SC @8;u1{ȩncdgዷ oȩYkFg~|CsL!Ou:]\\\*Rì+P5pJKTGpÃyGLye}괟FBf$ɓ'vrɶJ2"IYsCPeiZTٕG(:;;ǏCoܸn!HRGG:NNBЄ\ E"rAGb1/͖d<Ʀ !T BD" MxL R _)%B!~!T3X,JbxB?GD! B!2 $B!dHB,!X B!L;Hjm IDATBEQZmՊx2W5bg)gE0@t:bkkLǧI\.y0fM:-8_oYgmCQTRR sss]=(NRYt:H\KRbEt:G x̀3^۔"@4ptpP*J^ZV;88=y"̑Ubɣg&mS\?hVU&TxSnnm[:Zi{W@o埣Ә]tM>F}ΐA;\p4NB*)Mġ_-y#CGJ9ԥMub/dJ [+jj#KNI8OkέǭX1j p~ u9O?$> l5o m?gÜ><%hS1Kf;h^^mwN6MBg;gD C!gjLUﰼ߷YBg^?u[o߾mpօxGTUߺtsٛSo~;5&}[E﹜+PNQ{nePF:GTXVgPeIsz#p!K@s/4(#9n{j^&θ.:9pm#Ws~k+>J"vދW<Z T__M߭埻njLC1ե|z"Nх\P"_KPG;Mi*}jJY~G:];4y>!or\w׎6Y7SՄθ7Y|elGf,]-ZYf8iSdKqۆ{@t2"o}AWJ'mG&uOD>b\-;r6D߼۰ ۹ݿz>bR]0rKYǮ'^k_J*4=[V7-#&yI7ڼ$ T1~x_ΞW3vPq%+)"+Dux٢]D (44Il\1VSty UCbY+ q=6}q~g(^ɬ,^Eb*tYO5-<Pg(n.5&G*!Y\MS/; "'c?;Ɨ:ikυ.G،__RfiO.Q_Dy̙Tn3αn>SjVtc_Otdl3x4-Vo|;er|` "uhߜ{*cl:5-1U`ƷtL3cǏ;~C_7:ktCmtyѶ<{ʕOFuuU>7.0c͙,[{הRž6lMV+-mug#@hzOl^Hlmҥ}^j vlZ|$s?#ˎ{=KWV9gABmy{Km@)xfX,_gƩ>B&,:k!a^?w,3-`ǒQ j)VqFq,L3Xf4,_]u`齿}f[2O]V’4ivWrv.mla5sYm_ڭ3~2|Zlg95T]Mz,|Qd~Bb]e.a=~yY+ q@ӎ ѻN=XTtfLm2w,!p;cP3#?gLJRf6mL2Ǘ%BJqR;1먊ݑ;Ԍ:??ȚUF\cf6m3H6{Whƍ(,,̄fDG͖ue95yqҐO]#Rf_L0fUP;g6c8- ,K,=zN,y cxO;ukqyRѡP(4߽T#chpkrV>de2dzQT^BD" fzU*G x̀3^۔"-V%BaU2ki,zGU hpkrVrŪQGmpk!`D! B!2 $B!dHB,!JR $B!T@T>zVA_ iNB! <`[s,BU>R) Iچ'aOULe !4*Uv.s3k$BH_U*H$jwO($\S@#_.*y!T*JQg͉p3:+\6BUdi׉?38dxIENDB`tora-2.1.3/src/help/images/database.png0000644000175000017500000021674111346734565017537 0ustar michaelmichaelPNG  IHDRh pHYs+tEXtAntra?t?PreferencesMtEXtDescriptionLango klas?: tora"0 IDATxwxU[;-^. (HWTĆ DŊς`+TD?ł"H !޶G6fevwv7 fgyϹw̝X1ߐX (P@5 aI:i/ժIiQkFJ( TxK);c }Xk/RQ okiu-_^`}@> *AǑQ*&۹?^S%AݔpuϾ*>KWuVm2.D\@F$Slپ\8nKaEԚGyydʾTZFMLL4ɚP- A@EDQDRRh "*|␹^¿$_lݴWv;}j>O.m+`($ Z!\^$콲eP{l% Žne jNkj4DWaÙcho^ jڎV]:)6sX `0 DԨ}qs!l;']ϥ;^W{Wp._j>ۛ.qҧ>/bwll< ~GP{ qƙN 8u'YS9*-ZehUzN8ShWijTD5 >ɉ;U1h(H X(5b4RC)Vz򼑨uhcd,{h'L-ǝT(>F>[QNBxRt98jE8('XW^.q%1 pU|^ p7~NDW/ :o[W}goKtbIi FbՌs9{J'B{}U??yԨZ9oa|$utjNd/m'h K:AKlL,%&ظxrrK-i5zIE{81ᓷqŽzkAXp=A>Ø.b:+'F߸a@O3A,z SX}Lԝç|X fXt5+/gͶu%buםrͣWb-bʹ\5'ݺu1V&Ǿaөʖ+>?f '_7EZgyi8g$\/)zJìek79i-,V7rWeD@rȝewTz|;s?#ᣙ#Jv{E8*x!wB8p㏽[v|;AVl[ݾr[튊C$97;F!1՜TNyn8\cx\Tb+$ݶJH~şxqx8ۻuᅽ>_j݇Sh4p|[~6}ONy9n;#|L&#C) ''Uh۶Grdl){jNLbLϡcXzLhdQTh2a,&L矧aقdL E]ȶ}@Jr75/U珦%|SSλ ~Y˱ ̀HIn6,n7|{/B]h$ B>[5ڷ$Jּ],U_NK>檼*]*ŁYZh> l<z)?xf/:-qϵ֣NmadukƾJ-gHvsPU//ʕ__\dU;d﫭mvm98 k_Gx|4_~pxwܹ FJ':rٓM1k,ry'8w'N3++;3'{y'뮻8|ϜEEEn:LF˓8)alܗOƹbRGѿm=veҫe"VQdl7tGQJEQa!łhnٲ8v4rFCaaGq߾_bP\LQ#Ym*%yV"dE+ tjkDE8Z|P\ۭo4GӼl>{vØzC3ιW £2wxoC<#<;鋠r-"NG[n|:xQى'8 gᗃ__%@ehP*<~ P*~k:UVL>Y*n.9-f3/"s5LM6|'9}>p9}onC3|p9y6_套_OVШUL8Qr 0 ݚF\39 :(vvtmᎢX"ڈ#-PC^aeYrUZ݂؄n7LAnپnA&G뫯s[W fڈ{Zsصb:^BuYgmGP/ QփO^u9x!]ii[ O u x2!ᓃA/ aZ()ǝNZdffTyw3-/2=/XcG1ٶ];Re333ݧ}LOOŗ^OV89k2a8cb+`Gy &3+~8D$ 5Bvj$$&~8 J:Xu^Z$&%f]U\oGΒũ~Ϳ9{[W ^ûs6iҘ7Mf nFw.ӥ/2|i>V94 gNC(OnԈRJJMw1 1L$7j$GˠVrw:ݏ=0gXwm}_m*l{)EÔZU_^QkwT_zt%7>tWe,nvm\,wyG_\>j̅*np=AɝOpZ;eg3'k{-mq.Ƚ"LJ/;OVw`A@ l]\*Bֆ{jIJi4U5g`؃'*5sVUU4{g=8pY8_"\yǑ{oJK8 \}8Nܒ|x5v9>rK5 /ms@ SG(*"iџ>5yy.'G.|ɻ;N=F%€S.K.!/KK]>pT  POP~mG0w~|:@xD\컈'71I┋_$ʙ1P~9!n9C00pSD}nE+P~]"AޛZ w#K.7\x-x%gqtGޟӡ~'YYxjoK4'5ɯ"&_PׅwD{-yVO\kUoEu}#71)$"|bA;n-ӳ%-ٷ" EUJf% 2k~.w&]Ω8fWQŅ·S_+wc |r3S.Q$ BEuR3 9e2 ~;ǧl3>ފj..|V{g흫rCP@(2 `!Sw޺([_xPL ?'ʾ{_. 20QE\OoOuA/_[Wo *gm?HaB"=&TSx|C*Ho3 +GEUTt?ȀV ![j{Ab%E: j&B&[5R2r}X#D͞./,rB ]4:Yge{;H[@$(&?wsa@NL{?H]ϓ1/3|Nkn ?E}}*P2 )5AQW~-ȇ ^.j_ՏZ>*zoۄѓ'VC BϜս_T>T|ePP; vtG]._bvS[9%k^ ܮ wH8',ߡ^S='jP OO9w?up_V?7 %- A)w/_ڗ袿XNn7?Ϲ7K26b|`y.䮞ۂSA"HF~JuA~RGN`kH>] 6z>o8Cae DDB'p.v4n#i{)xKr/pV> y>89y'js Q.HnY-G^@>Ծ %O`ӕnErŤ ]>+QFvU#fv%`k\V^ @*qT8cPKĂQ%EN+Oг/szu~ oj ߞ~oh,B"W_2 'UkH-Cwj);\N@A#)5P<16j 6Bb9]E$mS%C&˜W_,Ŀ u0o xo@!:xPf?T"ޥt^ۙ_aPl-”:#\ϟ]۠zӮc *Dz++gďve%Cڛx]nW1T ^Nc I 6/iM4rqYڦ4#eXcq+垱hڜ6zEl6m1k@Aqj "ZPtX*emw/}&&Ƀ/bm&9b%R7Ǹ^K(S!le(#Jv&ԡ]ݔJ!=&h3{DVHrX弖8 *aJXޗElR{fqW=i}h궲|d"}&ݲWP0aӿe;@G7 hdH!΢Ҳ9-eck8f pܒ]33w,#Kgpi6hނ㳣N`^S*7BDӴhX1㣹.qqD⿹ꅤ:5#%9&}z0mx"oJA.ncE)~/ljcG){5O0Ne{!`-b;w2[KRSRiy/Js B{rD\!l7:*\U-6bsJ^UݳܧrgkjK bO+xURIXOoඅ;28KY<<)Pcb3!g?5fJ$$-gX{ W{382P^'7m9M.޽W:~G_yiբ9ͻXSkV[\AH t ׭"\GhFW w<՟~j[K蘨Cow{Np UtOYک%>D%+iAݑ_u*2K}ȶ=7 (ڌIb5xZFh>&0J9vTvMP^Alp3PT-.B=\\ #p r^-i[.~٧mQ <X]Ҙj9D!D$!sԖBΛ9,NL t/4l[KcBz#`[/p9۞-Rh;dc*S.cOظ{@<:c%M`)L#'w/nC-hղ}S{:ꇕuJj*گ}]kSX_eLw7˶Kj& '#|x!Pw  xq!η "=wȎ$B5)XٟoXf<Dk^s.g$:}}o;ɿΠۨUtgI$e9h[Ѝ׷~$d?;I:N%F}(xg_}?ɒY/rЗ8jԁ]iGpѐ TeWP_N5R].ޚc:+PdmX n}xieP$B1QDksssuZ1gβ jRmJE-` c֋bV-11hMG2yӒ#Nj0V'/y@8Y}x?ٟgMhD!T2Yxy+,7rl}es$F^(bX())V;I R2uLJ*/*]m½[aB^ .t`*cWxItEEss4pξz#&6'>ʄQkH᣹L]{i1\4i֓<Sb,Nʸi$(պh/bΒ{9gFHWkiǥ>&GoJ!2#C{^#@`}I]*_)bbu\3}8UvEx^y{P6Ùu o"(իtKS}7{V?!]2٢cW:2b728kڴill~uEӣHKK#.6BBſpԹ* n%bM"('L˾g}ݡ_O~֢ l,~t e>Aaal2a2IeHRR"99$$$T+PnDA-Z/u +֭UmPsx !w Mt~t&*ԁb@~~> &DLf #=\)Ʃk:.WE5gŸY蹮0]mJsk{񵟼1}XouZw T@5id;]lXt `d6LLf3rS{V exqæ٭|t1e,cPPeaxkgy'pBW·wp/kqL:EE*%{_'3x,]Ty<~5EG=WJ~fŕ|Δ?h0զyǟNu^׾=O;ٱe-sZUmpM},ٸ?|1_ˊM\>{҇Dl3[XC9/86|;o>߶lI(c3y lzo0"sIJF_~˞5 >Bl *sU{l^V +W-B5&leȝ[ӎ_/^qʫ4|K;VL@xKp[%6<[7 Nk1ZvWͶd '{JXΝ֒ԔTv14{/rß)i= j%3rl'?S^*|8EXlKT'&tb3(TҮbt[Q$vy.>]wՈUt]7^k{` l*;@]S@]X/1߷_Nj 0[ )R:_XbˊPAnA8~ү__޴%g)@S$/w 2=0/˻dz|a@ļ^?'ez35\k%t S^PlNn{Jwxl~VoezZ6?%'e|4ofgb,gq\d1oh"u!0u>#aCְܰ zԘ164\PyꨦD[ I+s)7'JĈT9x (Lԑ͈ 8o.\ pG,Iev6|=McD5#Z,$JH(_ߜxflݺl-[aw{kp?+ } @@`~ޯLւV-mH0aƻ6`P?;Dj{{3+hA`3OUdp#r4ӫф5NݓgV/ejn>x:vjIElcɶD{JhDwaݴR!-wOM.6F;gemY!w=8jt0A$A 'RNt66]p.U9Vrw.żj5_}k>a~|<sEp;c6+~!˦7U n\vړnj.~7> FpߤxV0cfHs(Z5" ˰"hъgSE O\vM+B3,& ,{m̝ {;U7E)nRSԤ6:1yfQ#*5)XٟofM$%:6Bߠ;gM)s4-M?|/n:{e|~H=MGϒQ#γ4El~.i6NBS1˜j+$\]lz勬n $1яmn{Kns2+7)79YMpmKu?{uGbn㋧}+>ӥŪMe H{٨OlćaCNm8>[}Õ (P!sՉ9xdo'#IjZш!Cy 9:K~g5n [~ֱx fӊ%Q0O/g5.ٗMcr.2YxyCY?doe3`s$FL Lt:uzGh#VX1/@;riڒ (P h2oĢmķ/pYt*WNm0Y8 x&670c*ma[ghn&պhǜ˻ТY3ZuNgThq颏;lEJ+zMϧ:܁Uc<(q6+-3ϕ寐;a"eWܶ9)-;sh>vJ^2T*QQQطрN/L;zJKKٿo?QQQTίtmQZyػ&?wD:0 (P PLqpDZ4vO2Rz&N @hDLc)|):H"QW3g x1Yy3o׎ɶG28FrF%kl (P@re7`Px[g`8,d[ !""&MV9|0dۘ4nLrr2ʥ (P@A"C!w oʹ,t+錒'j8z=IIIJiDDDDD@ (PP!bamX, -a-]3~3~- aLANF{(\=/FT*"##Y*J (P@Z YۜsX*nfTpa"8n-CO (P@ 6B &9(%|7q{S\[q~ cC<Р3;B (P@A-fLb1C[WΨth*1 n˨1㋡̇0{q. QD!o)sŘӢ1QafVyuo fbT 1uq (P@!A&[A f )+?_>} "(P@ d|_lgQ>m5\I4-pa4)9xCt5i#Ost>n( ezoG{1NդyD^x*=Ĝ9㋩u1Tc,XcxsdqvYD3Bt"ooۇoå%UoVgDµpl3O]Z۽}9#,sĨm}ܴٱM( (P@QUPnf-/ Nn|5`օQN,ΊNpD+ưdL{C]]M KXi.&3Bk[afoc܌Oz rsGh! %5)ɌY|F)A4#F Niꦮ |t5~y6?~YmMY0#V'BecMLdtR| iFx0n/B;Yϝ-߈Z((d)nܖ03|Z6;A>ڿeֱfզ$gãg)=9O뱊oX0ԫ_X@(Tʧ|*ʧ|*((( ++0Z$$(+w֠R&:&.dEܐ7e%_!1^^Z6A=LH>\o+sYS,봋3ZN]#шfD7~C<)ń diEPyi_ .-Ʊt+=^ԁeWコyVTz=4ƕMJsl7}3AU}x?Nh^ޝS3T$&$V![, i׮ `0<)P@ ȀZؗ IDATh WLqpDZ4tO"RXA}U;rLbiT+J~ӳ"GG:JT$RѽfobGeGzbQnU@ ZVv{n{2`uyzA۞ڦ@B)P@څҫ@AP.EߧWd߹ U/?}T PPQ xB(o@APQ)J᭎!&$"ǦrIt1H{pŽکC&?c Ns>RzwB7w%+ܭ,=:ӵnzv=ǍuJ8\&Nndb1yQnς{gt_s&y Y[':?\B!7ڎ|QZ[G7j>YܗS 픢(E))ǎNeffrĉjC |S+ jZor=Cb/ұ Me{'+垱hڜ6ze$ 9[q~thќm0ƧYwPq)u[&b'new?S`5l~vLwc[\q~1w$];;\#m~煇'""}Uܝ|}58a| 4}6n!g;I䖹iM[4N7nÓψVLqZm3znoܗ7mǏ?SR<#JKy "999̞5 balq \7Oc#R/>82& ?E￘UݻkJ]lhMr~1>yh Mh27x0zn'/W x ]Ɨ1trؾ<_a$`DEDų<8tވ(($XRmѶ[We.E*ÒZa:@V_G۸|ƃ}ܖbig竲O*q,N׶íO]4I:[4ԏ.|Ur~|l? (ڴiÒ735k/f֬Y/2k0zJaܿ:+F4U,ow礱X5 #ilsUT>E6xU\Vq֚%k>eyX^dŒ Eԑ͈9oWtgIЂSlJ&zgTB%|mmPG6w597ʯU'rs#ڍ?,Pх/G.w1)P@l6ӯ_?~~!ƍKaa!= _޴??ןN)JQRb4t$nF 뮻t$FM>/m%7eOxs3niGzM}l6qƔˮRT\Ƭq!2xtJ@ј(U(FDa ۡ"Z TǠ(K]WUXG 1JJ4HH ""H(-)%#뺻u~{ye;{}s}>[ ݌i׈zu(pjŸ.l}~m'rԹ1e͒;z7t [Liw%1;Pތ妖D9CԣQ)#*br=2uC)G+ca)m%9[9b|ɷ2E}7̄7K(0 ˻4A,dgnis{>rI7&MW[y̩[nu~rډMlb؊|g)}=->NN}s#&USV^ݱe=o8tm*0rr}lRfIFD7}HܽUG)AAVnT ]L)]Ǐvƌ̚Û8-(|#7xq 3a'C9~3س LZtm[l"0ݼQ|R㊾BS(Ԭ-1ZnE/`Dk  LM BQsŋȧ0j't*ss ʕ+2978w|  ZMٲ(W, 3/wh͎+wK+D.cmm)hJJ  &-,ܼX  PYX`an^bM dޱOJv(?2AA┮I'jYCӷ@'W+T L  ³*8FNM坡;Awi7=~Io=AAA(kXM\ϗTN)Cn^KX"9_#ZJVӸZ[-V5=3 ,upwqv۱lu ni.fs`Φ_ >xq   zo/O2eLYSc@}d };ML) 3,8tG}P`eȁ,eBlH52ƟeA|_6 -~f]!/  Ŭ;  gˬ*\'N U%F} gS9 sSRm ڛ 7@;bshveo()Xu5Y|ڞ_t[@aU[c<"j  )(: rXJ܋ӃMwH0-Oj7q.9P %ެ):#cCR6u,1AG\eR/k@nFК)  /"WզC6zDR4W6A݁f)ecYh00oop1MڧrZ?2tS(ܱaѩ`o$m!wsGY^;AAE:\kԕwĖaa`uuȋb-mvYH4*Q۪Qj>V@ZaLVrN1KܾŌ?;Tg %j*I0 t   ES ]ɱ+{4F={]Ms\َL}w8'Tu~9Je-+`ԸJ{j8rђz݊jߧk' |^ cbFI@j  9̜Q(y'zNW+ Ba)`LLK%Q@B* B񉏏TR< }]] + B3 DE`ogGFCAi4 ;P|E_x%I&Q&11AAFAI_D_AA^!/E_<5s*k"  /GW g\]qu.KRqvIFOAA^kkvcK& o˶+sALR캖+ih] /%=nd4_-9z$tWҩ0d Eئ"ph3jz^ݧnb2reՍJ5oa0VJAss8nVN uo1w8>*%?qA($||F.?ba`~O7M~gj/^ʳܼs71=EtPTRC)+@lbۋi߰+a!7-K_3M.Bt!#It!+C.$lii׀.c;ՏVMW3_ rDRϵnu3iK7Ш;|Z) yraMZi0g.|{pajt!+ԴV~J׷ӠPƘ\>Gtn}!9ȣb^7b7bU'F~ѕJ*3r/1{{z29f$p?& (ݨUˎ]XAxȫVo:a~LM>p ydb藣XЕ%O~ uՋ6?nߏsd]{jM7<9ul OiUO~io4GFI_W+FԀUk\㴟OflEdÏ"6W}(>/v)8 1uᵗ9NI򠏽Mܖ)2̝Q%"V;lA? Ӿ7;bHo/isY$6 ǒr, k#V'!!%'O{0Dgy[OK9r>ln&$k!)!75A&c0׼-\MfhV(*P59RϞ5VZ޴ (a8 G} 3JS[yֱ_cMl)}+jcQiħěy`eLf>¥,ţ(+Axˠ/Ae>>y̹4ĆȬ.Mחf81)=&8]U8=n=]W6\S'*f_ԒӺb?-ޢ{p!C~.%I_2rc"F qYSQ%hf玕": OޗAUCY:{/ FtO˓Xv썛yӅcaj%dJVb KBa[V8 hv^Pe)rthI ORtFmS;ɓ'SgXd(Cd9uޣjvaC=Z!m6W̡#0퇬`M~\ntl_O/!@J.zԠZ+.@, / t1Dz@zqv&]`-M5\ǞsOi׺#Ѭ~.7Jy3:DNB@mieW2s'̍G'U6%CϊOYO&EgnΣ EvoX^JW}cƬ19U$c9vel=XGaWWA(rM`ݷ[| zLL2abz$͙Yb܇u= oYVC; ) =oMsa&5`Qʋ]Vr+SEp19}jC9+>!l;<r/[Є-w0{)+{ ?wf&e)͞/fo*ҵnkʯtE : ?0Rj\=Vħ5AՄř;gVhyznݺE!IB[$QC7b=~#s:aL=J߁3brۿLcgmj</ !1Pq)<<JY aȑƜ?dg[_dd.eY%7}z!u9R}EbXv\ ŹތȑcEFAAV\$6_ˆDΑJᶚZˬ7rWJ ̮~)_Bne/7zB(  B #vh V,a3,ۅ~4h!sGO'muZŭgX×^=IGe4l; w%˧@,]g8 O`$^6nuژ; JG{C\' >^m9v7ARcSudlBM϶c/&  BC7Ns#Ԁ&p#GC9$~ʶ#@,w灆O&ZVaxϺ+'qfi҇DND1/Ĕ|oKߓ `{l% IDAT:/O1瓿xj(.1#c>fy|g{ F !m(k޴/ 9=/ꆘ# P m~R,+=2Mw;;H{ʬdHMo20?c?'VnMt;z`xQzL,q029rc"FI)MsH茹 V]!.x-]_IWL7Vsffe@nH!MldPi-Q.FAA [tst!E^cp㾦c.%:v~c%Es#RO=hB''}. Y3YC`z6)"IӃc2"Wnam#G v6g}^rRQU?ЦT *Ǚ\$U҆  B%'F=of?kT5_ Fc_>UX!hhc㌳D؟r{,07Dp3R\~>?IУ}/^@աMKTQGQ >W#mn9K[fÐznDГ( eC;. a8<Sm/ P &ln4sbY RI[YOڍmjhK:=]Ey:byr<WeD{5oE*CV7Of7÷7 Ky`e>,ی}lm5ͦo$FS-M|}iԊ7[Ҫ O)koT:-iPKVm  Ba?0Rj\NjN|[\šS L|PtS.KL&G!)¹}ǿy^֭[6jD\\Fx_ Pr9*S'ORYH:~M?GS2 GrM!$3(e<&IFOQR~[%dZ  Bq+HFeN 7 #K!:c FH+Pb(TIWEARH deQJNvB*+%] AAE&  +kѤֻm"Zǿ1%]_AA({󦳹#3K;h 6=G<.wN䑬VuN Cd+ BI(Gw}E΋7RA3/@AAO?#lz >y_Hs.Auԍays,05cR='2or\̒v:Ȑزwÿ"^MNhW>av GĬu|-S'ybJ/Ut>СXweuLh`˕5w"ZWY'LW so3aVd /p^VGPP($ L&c> F&&&ԨQ;;gzJ`@;) %--T|#~1 ;zaq\H?-F]cTv^[ J1JҔ諬~?]B9Y>;na:|0 !e-a}}Y`2Mgw% d> UC3j&=lMe,:L𭐤-.w.H=J1Bq,NC`Bƣ+C(ݽu1b /qwVѥqK˕Uė͇OD-\/R lʔɴmۆӧxZ2y pG&u O`oOtT!B^z%7dpP!#'X5-`aFɀޗAUCY:{/ FtO˓Xv썛y!T>_r2u?O>k]] H=`$MB'jc;SLæh4y_#4hqWxyO?=|Y8RvWK[Z{S|u%TKv0enS/<+7`[\Ib:Wu'?M`u?`ܑz̞ӞRv4jMfG.7x{fFmehC/]=y㝉Gc9Trգ=Z1t*gn̳7e/4Iox)g%sc^Mv\ǝs;%_/<l«`vl8z8kfʔB-YFSџloM .Rd?0RnJahXgTMx] {g|BF~`4cZwg=cʞ[Eӧ,۷?5R2"7@iM91S,{ٖ뱮ԆgMS eձʦһot'Ǟezq&q$S?jCyS#awkn.zB~Y@fżCOO_3܌0*OvkL鞱m(+9!c!K FLLmkIĞX{(05[WvSmyKuwl'Hpo:__̣}]GfՔYl1R>tz׍35YEac|meO`[x~Zܔ\уSR޸qF~11:/ׅbQ?œ*y{`~'eť߯/{j0܉Ǐmj׮zNĉTWz`4%QLe29ff9} OO\h pzV"Ϗ>!3\Ҋ'O^ќ8kNBl{XٿHn_.{w4Ⓤ/CVW[]|V y5m?kZ =]ޏȮ<;V$9U~A~ZwL΃==y}%5C_9vYY?inѹ!#SyDj~|}5]XQV0v? ٕˡIc1 ]]UJez}uMIfʃ}1f۽()scof= s/ѧڠ"4 \M:AG^!0щfS.)RՓ^9ښu֧޴MQT̛;z:xGTm[9T?^N/y``Zؘpoۨ<)P SJ7󣒝IYmaCd)g"Gaf {aıC{& χ ZeȱP S5 Sa! 7@ժ6ḳy ?-(,[=M6Gc5; dJjxb2ZO>#/%БF\C=m>FLӛ-ͧ1 mZ<)KwC8W}ϛ7g'D'3$-̀!ZZp!;@g wssc߯vΜ+,)_|vXOzձül+e_x hD_!5rc"J,%psW Fh>` bg֐5ΖinC}dx٤NCE,whss0>c:PAؒY_u&Z6à)lyy!q dv7kFh1BM YS&ӏg}}/S{u>:jk= 解6X&_7y]Ĉ[W"h IiP4ִSȰ=* 9`ű@[V&u+IRR m *.柇 qHxA* fq`_pssK͠ :uH:uؼyKTLWs@2}dW} 'ÈN3~!&a{c2cm "R%1<~ry/6d/b'Bf^ sc$VIxF6(t8O?㈐¶=aхeZu @M7#|hʵ56Ak8NI0]Ŀ:upLaYS3-:Nn[A>a,]zIae5O8u>)kyr~fI+Ӕmzy=ehD~-%2|MU\e{> ;}ښuuD(՛fgqaj0"+'}>YV o-g\5}p?ꈦ8Ҥ/ >>@XX D3~B+8#dM}'w`صO+Eq`G0beS.SpV^ySq&=,y4ѝSѹkӥI7'W<થ(]]Έ !Cc0ae7{&+Kd;lД:} g?{*ۍkڝoP\N=ۤ1[MLvO~ eꚌ6A_Y\eS^<ښ#[_?xi]\tG>g#X3ycһ+^ͧq,X:_oڵkdRݻǠΠq=,Y!s{9y9!U4ru!i+U6#jVnI h~iܜuhX:0B"83 nN7R\+WaR^ҁ;`$"2l8/B>SWhyzBBBhטk>E&O`[̾pbnܸo# cU@A60iX[[7̢Yh4:ulЗg ˱P8uda2rԜMQ+ߞJ9>Ӑ.x7Wk&[+Ang 5Q7Ubk)Qv̓B(MLx :&&&BȄGv\{p8WYkΔg0GjGOc~җ}p6w uxC(Fd/χxeCaaqxN^Q&{g7eKZɵXՏA]tO 3,8tG}Дu?[uC}: c;y#{d~ ʯ`kwSM6ϫL+ZR7A(nƈ|vKFf:X7 ""ŕ-P}7}|6qbF#r$PT_FIIIT*dg ˦xSE;J)v[钁U%F} gS9`1k:1TR)@՘3|>f+!c.KcigoV+ؚCr{RMcN#b;ܴ\{9fP>?& ig#(׶@;bh` IX;96_ljCp69c)𰐃E#~٘u){^xRIWAxeE-WsW(&i60*C{-UmSOa**cʤ&^LIqdž-m֥MY+`h2KlħKp=T$i7k.ePDSjmr{:}mbd6xۤ k|>/Ԡc&35g &(9rDFF[^:fffL07|rd2nsNV)[,ʖ\|OJKK(p1 (~ħěy`r·E~S3XKL+rso$^34{i{ ;~ӯ4ƀ3(\sKrC-EusD>>.HAx]l\.SS$?VVVX8=G^E/T|/t^g'LCrFogdR|GW8|6 |^+%3wm@Gr|1[ƍȼ]X3 L]$]F%j[5JO(i IDAT[:}z?f1 ;ڙ7݂ d,,prtB ޜQYXνy:(eJkӹ>tl_*y{fFmehC/]=y㝉FQb-}|nu⒏`ܦ^xVnׁ/3t?TʲlGkp$|>rM,K?7rFyDtv +J&!󽉎J\RiS|K*e=ͻehĠ/Q't+[O+xEmt!c -ϔ8~% Pr9VjkN?V,q ,8H+YV!˔WL8 ͽ?a ͻ vAAZ<5V@gwt 'G |ޤ45;|κ/j`YAA^x#X,7v9oGY%OU}Q(>) >4fʂ  )}v/!gLߧ{AAJBHQGRakѸFwNE*OAA^VEϣs)]\psqf,9t4}~5wxn.yQi&}IWI  «xFmdջ!,x- ԋJ>! 辆SAw|_ ̑AAx ڶ>Ӑ.x7Wk&[]$Wox uz\\>7ӕ9gRVVj^ ާi5Wq||' AfͽD gWos-& ùvzBB@$d2xh00 (JW3g%I`0eˑ Bh+v:'"һ;$ƒn|~\ubo]R1#g}VBN3,*.xct_qӨbnJ-(@~@ǸfX'F `ˋYgкT+jɬ2eZ#?~ qח?L9RigoV+ؚCr{RMcNֿ4,1ƬV4TCKVa?n>^VF UVد?!.9f$p?&ڍZ~y_J8>GGRDFFre*{{ckk[^);Z(^'QTҩisMǘ !_0Jgۄ菉"MzbC&FnKU۔N s'oTWĎvio3Xj%3'`$>]r$IKYStFdž-mK&`:s*~f9tSښs[3 mEvLa^4?21AG\eR/>Qf@{ 5sZy9]8%]154gQQ}eeKT!ONtG-i?!Z3xL5-Q|)ca)d BoݢzxzzRJ:k">>RI[Ԯ]; 1x{WAfffxxzB\WqLQrKoz=urk?(t%wtoUn}k]#u4NNvx3wLN0;Jc [=PZc-?2 0gEs{ݮ4yUdM]X8aTr·E~Sn(ҷ!g̣,)ڌcqqHڧqÛE&‹I.WZ.@PPWոrCei&E(]⊕(8Ȣ_5`D8˿[IFUЋݘ{a/Odъ0}DmF37bt'|;g#GW8|6 01K])-cj5`0:tZ`x/Z^jAHQ ])K:Dnފ,sU7*}34 y[bT?^ϓojS19lGkp$| 헭}Z݄_GlXۙk302M0^\'jgn,x؉PP8͌2І^z;) .),]@G˝ѹ3r |P^eBY%c;2}7&\pAϵV ]4/T-;LcyԴ̚&K_gol9-m--_qs{^4kV.GIQғ⮳~T+j;:<r.G`EXp ZCP+ZK/CB $#Bq. 2yrٽevwvƹl;E&ӅײeKټiJKKVZM2;^#!!ZVJ&!!^y]j4"Sϛ9_>򼉎q1}cLOzmW_֝dtV)Ӽ߈tR^MMT>:rS8:Ik2j^F;5i=f?ݨP&nDDޤIiq1 4LcżôjF}2Y+}hHEfHICiT{f9xzzjzɔ))Z(^͚,+yI/~}SM\ 'xSѠ'>8K&èq'j$+tnMW]ע%Ok>A9t ^^bH3O<teӢTl>SN}ZžFzS'",6L,g~FYwM^ٹ~ [4ɀüԂ.֗=YzkК~3~aJˤ /#:ѸN]aoz-ul{GumSѺ~]oA)J⫍{Ң^]5GReOLENcn̷efA:0gv-_g wYuHG˩diC3F-핧fcA:{,ߌCٲeYf-J6СCz2K$)nBKcxWKmLwԫ ~n~4 9 ;wOqsrᷜ'U"-? %Czn%~^uW~9p55 թ3qg9{r;#J*RŐ`\-o>©;[ 8I&r4B!?j˯4R}__x ;87}4>cޓhNg0u~u(&"3CĿlf-(e.CfF?'O3/.޷pVH1NQձ і22$FVT, tWqϖ>C[j*CnW>csOrO"rmeA=/ :U8jkK2aYO>L -C88: `y, o{' wp4$]$ ,Z9غm6ȼ|dd]2K9,vf;WOa |}~c/...)?]xT֭>,fc}M\!*n]6?ЋIɇ6!:"aduqō 0H> ǠU)KxOۚ&…bs&<lyUrgb)\G+uBdQ( ІhezM,*Vԁ/1VDYU"ٴp!ҰpǥVW%+ 2q|{\7SnC~9?ġ˪LFh6k:mBWҷQ}-)aJ̎F3CPi7&#VX~c&yէQ\ &.e-ra'9ٖoDmkZ8GP8;']1}zFFθ5ӎKXֶHҭଦ "-[N@@}Nhh(}N@@˖-ptiC.f^_R;;T؍_VFuWgB5m- _+ASG-iL;FLNe^\Τd~ލhhV]Ƞ38gʐo>M:^o܃ӸQ|<)>Sj_>K ֟t`tKzQq5'mBQbvt1:^'XkMcY0eD9u69C#94 Q~" |9hA߁rڈø닧g] /`7mbP*DFF㏳ӷsYJV\FÇ]Ǔؘh#J153,Y##q)Tʊ3g_;`n23Hn_[L?× Nx6 ‹ӽ]eG(n_4JX[_/r(8&kc3 $tg=8ìr'6@b ^l3 R@QXۋMxp͇?7(!yʳn&} wAdT|yDRB$)N}ӷ/ :,=@||9WR)=HneA\nRivI$CIIyiĢ3w`lqڋKU6qs&Uc2QP[6䷳beodYղԪ햳tɃia/@bw$[684-Vr͎! tUt//-cv @ Y>p&Vi Bv0Dn[4(31Tj7>r<,3UK2#oo֬ҥ+NjDa;G3s3n߼ l<ĔD.ǭpvqF"I`q45qL7)|}.dss{7g8zTA9}Q JT8-(e`KR\yri'mbنEɌLT4Xnȷq;(^EIC:D)7O4Qdb=7ҢlD9i^ 3!cM=:wf'x޷򗝽QQ`kkBà 'Dn{VK||!DEGc_>(LRJɑ#GP<ΩzsEFT";hj*VAG!tށemU[ҮMtïd1ch4Dk&w) :\}]EݝJYNO+F(mY| _ _LMMHDDDS>333LLrľ)ŋG"r=.s9ZXXRXQ+.|<򼂯 >xjD=}kܕ,1XCM_:B.,㢴kŅIUt =2f(^CKkKT9>S@jW0uNDy^-][ĨyFjbKiϮx遃<Z/wx E#7h3JX~vҨTTy{:EWs{[lF2oh]%Uhۯ %O' zzG DH(r:RnOE[ 9_@^ MA$SSS EzґH$b/|RɴN^U[z_dzxd BVEPwbj4=zD }oA%ʰRZqi\w0 aJ$|Ē2ZWzAAȎu$O  DTAA B   mG_7zUzr) TћEtAA!w򡂯#FNY'\\ܨڰ IGC蹕l_NUi0>LG7:s!2T~XG'GsEzd `:eAAwI {`#3\$Y#THqMy4_ g.j) :٦hH}WAAOIWwߓݔhfԡWrZұmم >bo_ IDAT# R]~" `Izz֦3jve։)wR?7]}q.q.]wцeFT.kٚt' %}W咔kZÕR"$H"$HH~$ϛkQCqs rHv۴(](Է\G` yf=o;v$x"y30t85 Ͻ3?Sz{!ețy֎up(,CAAU7ёXTc^0. O{1yt:*oS5LR6)͘"knf2i]O˦YAB/f!H3eȌ 1)`Va#p49, B ht:dz$xU~ԯzZT* )Cvu7Ypnp G*;` 7jD р|Mc⌊b+56DI`^}YgR(ie%( ,&ꤏqs!70 ùq+Tں#N ͛T\++N^IϵQ ƅ=<˺%H5'zƦcU3}$76]D[y1 ndႥ>;j(sJOdw$= +pR5VI˾GII,/#.Rʔ.]33. ;)66L?] &8wG٪ ^lEM3=ggPf(3& ;5 @CJ !EDTnL::}>U޿;Md}۶'U۾w >aFi~nύpt&Ҕ~gu[d>6ǏdD;Rlimଦ -[ʜٳ%44M}ߘOVs J.|d2V6>ugg`iϹc$ۜ`V~0="qHS:r?UI舸 79wMRcγ|G~X+MV,@ fY^Ɛ}/H# oϞ̝3OOO}L#G hV(0bh'JVp3/)'v?J@yJMʯFSI| 7ٟtBֽYy/= >Ș6J OѭpE'5!i5OG4lk}toQmz: OinؤeLby.{ۧҿmcoH yOJS.]V=FǜtjH&0fr Gwū~:`A^7Sۺ1e$oFߗ@>y ǝ8.qc>ve)Uz=H(AiDe!-=W"H ٳ|3f e˖e(Jo؈#Cի]DxG+PЌ)ֲM)vHVhKaƃ8oJ^bShA^Sg,% |G^UG;ȊqYAV~ʮ";cA21~\{:͠V;3Ӝ>}?wɮF oX׎~?_ΧMƯ~Y̱Oe9՟cz3$E勺FZLu~w1nC"KN&(pW’j1l(Ag׏Rwѡ"kIj1 <{qZ%(W.D&<bT?eLEkV|19%eHJz7׆_;z}兣B̶=FVJ>U gӤ8y^:x=|3:ЩQKXLfb6 6 mE8xG>wqqa̝7e .6vؓ dȎ:=aݟl QSGW9j>g<I@Wo\Mr3#{t̒q3n57ckx-52Gnl2]jdoGf߈9 Z[] M*7ggY1~⃗GGs,H>Z浈M]6)KJ+_m\yz=Y/1iVd}l˅ei#}naz(%>'=5{A'U@ZI~hl04 MբӥAVc$0VDGG5lS.NQa& BϭddZwuխ2M)g#*ԭԙ 3xY^Ko2/9mL^ 9ŏ+Q廭:qQ,UPyUsŹ}V.\[^”#ѫIH IB;ʄ1E>ydӛ`ǿ9>ޏmgq"Ef怅<:_'N$9GIfV }~FS?":ME4bo_# R]~"sm7oVbWU~W'_㛮H,t=E݊ظxM+ĹdZx}ʲٍ5n:E?vz}o `ѷHc_*U\H&Ŕ7fx[+v lF?p6EL3JvFVT>z s%[bQсgpBѠs獔̹ҽiC4jÈ]ft2״cT ,W4߀ j u'L~&uatg=%=H1Vߴ1'Y >YϢ]3cS1o@)id}%o tfNjc'`{})Cz3e%J:9R(r-?Z `.qk<mYMA(X,[P-[Ǜ ☛u=25fe}I=Σ̸]9[+wnħUPIʙ4YGӽ\rj&Ӹ9~>Z7 ~x*4x}pzsZĵYޝq9ςN*/7ybgpwb&tըqB^h+~>__a/bE4p;}P|} M8;J%tgPt\#ɰ2U٣JbQWS/'aŒxq`c3E`=}0-:f&E^ȓkS=ޞDVꋇ[O'^ |K}daV!>ʇݜQ]cLF(aZs}41z8,m7eY3.w"ͫGLbhѤ_rFNtR>$. #{MEF-rGgP28+c BN͚#]t=ZA(_/Ff#w`YdABt9:BɍMV^"92w RJ2z=='. ov:Ĉ !5qBXB ,䖡*r[ǑZcS(Ύh3C1mc ;5@bg:TGDHʍAgcTC);%%Bc8(/Tp5*=`?hSGb/z9EA(@HR""‰. 4 fy_*@wmq-=⽦r)֞3LGGdLzL6j):+~K1)*9F?'^jE:]gI÷3*-0c'cX_=Ĥ9%!LLL01yn; Y,84D_L ,c\r)'3E'YA+v](& '/ BP񳔿3`15 ?Q  {ѱԉp·^tq6$̆mpH@hM-  >U%Eއ?,  B Ÿ1!  YJ!h@#92f  %m]$#`1^5z󿨂.  1ȇ +k٦:e]pqqj.L<&3Ϲt䈳#Ύ(RNIWʅȜ3vK[2o+  jϛF: L[ 6h^;%MGk`$3oSf {&/5D=%C /{AA.80K|WաWrZұmم.6[ƶFY\Kj&n|~ҒƫrIʵ% p~Дcw\ujFL6Pͧn)WU~W'Ulņ_gJztdtil>MIEY'gk'R;)AAAȍ7IO/E -&K'ڐC^lǃk>tos~j;q?7Bo<7@AAZJ0Q$P|E5f^AOlԋK[vǣtYzі1:QR̢]&4Gwt⒂a/oI¾>-[,W 0ߧqkmY^$d>])(i*En_'[h4ⲝ4 z,HA|ޑdJP87gwsGt0y5 h/a7Xύ))Ah,tT]ˋկ Ve<\}E_)ͳ\3%LO$FfHu8̧~DĊrVYMP]7l9A4ixZCűI#H2}ٳ@ryK- »-?ɼ~&kY>Еtށe+Jw;Ho^KWH\j(dp׆C~ &.WAfT">$Al.# ,܋PSGXO%jjbJTj0TAy:dV  yrJh/|h >_h6G#X#Զk3wnkqop#29͑j@̟?]dB;%%v!u?EzmsIj[~^P\`̿ 5I3QQ/QJFFg;Uj*Ŋ'**WEA\&:I|d7%-ݵjUWGGJytbvx遃lVlc`-7\KQ~øi eiBxm(ay.eAbUU)_kh-eT+4wsR}Ru Ji0Ô*~N#22;[;45\SkNQ<ѹ+!ɵwz"$H"V |΢t*G{3;JEgl ׇ&n(U]8AA) by|!a)nN5cJ m:`=ڍZt6_ۦi̋]{ s&4nށAtL! Y޵G_ Rs,xm _tlNFMi#H91P.XzXyS>W#ʈx*;me֌NFim4+.1YAd18$+_-WT޶ٝAggp#~uKc+ cߖyptϴ[w˲ xqq ?*g4&aЊsF^b鏧 k ;x Sx =>Q:h_rlHc:Oz3v Iӏ0~>x}+zcv%'lAAHoV^<~-Yuԫ)MZIA@B>KΖV2fh>.yFթb?E|tTr>8{.E 1Pڔ2B"/Jͮ|viߧ_ %^bw$emĿ`/2lc;1' !qN_;z jB̶݆WC)K^>u΋G$DI$6yA/?vy,YDTmi+)a6ݜE)բ1I0+J#_ W?3Fٰ4R@ý ~! jkMS2;jw+ʦ9TC7 IDATr!U#QR2#Ķ$ /閔|uX2qRv/{, \%3#:|C7H[wZL\fͧqs|v,B>Rͧq (=G=>4tf)^ezL/dz͹(Srܔe2*>kzI<23,噼ۦmƥLqnjOsM0t$zEq`z'UobqU;tg4M>ub]?@6:WI͋c/ZMդJ*̟xčK$NR4Ҵ*ܟhmY  kRD.yo}& XDX\}#VS"T_4&rVĦ6̉v!C*34;+zQ"@9,WG[9_w[9fMQmx $GJ'\iLv$-p*2E,مi~ 2+w: a<ס ʯaڰ%L@jUNBYs :4aWٹ 쮳  |un\߮rbWfCtiQ5tsz̼6,6rI'\֤=v > iӔ=gs~$MMED7kFdcAAȇ6rZPgy ܈OVT!3 sww|Mt4 6XOeθDû@z{Edͳzyu$2xҝǖSƷc4!(::s%}$Zbu!Ջ l7=Aٕ962f鮕 N]a6hS%k^Tj6LNGIe6T\[@Vtn=Qro.Fl;!sic?|fEHMKz"Z ,J7{ydV|:tMYߤWː:$O{oFePduM/S}6Y  y_bQWS/'aŒx^uӅ^`B ԑ2f2 eȌD 0lRd cSe*ʑ;˶X!0>1޺;E:%M0ʒҋԉr2d29xzoMēݛ7ԏUf\u)6rsZxav /guyc ɤ'::FFF<|L&  'zёpnp G*;` 7jD4sk%apָX*>'CGWk.)ĊrVع4_/a7Xύ))h,Y"4ʁ>,RbMY92 IbObdTNv H$qbblFFFruHSv~~\[A!W}Nqa:g R (׺Y8cNϤl{ĚB*NeA3O˳Si# ,܋PSG/ėH I]QڸAɕVvCp׋=9QJ6̬LuQxs۽ 2mbM:R K%gZSmRʑ֦I̞;}ߟǼ8\CCKkKT9>S@j[~^04K7jI0̘SZJ[\aI.fRgxd^cH}?2eIp]){L*3(SŊ!Hu/^)\EbP  |RqyVC*@wmq-=⽦rpSƴnLC_c'Y1ȋPL-)J'bm7F.*ׄr }GsHפp\_l=m%ldq`V{ͣz,VNbLI3u?2e"/坭࿣R)rlmmz$ sss EsAAd!n1t*B:4t =p3>S>c]N>Ke3gF'x5kƋnS^>gDTA#'ɰ/TǎqGމSpщJBAN G,|Ɲpz+ҺO$ R4ITAA((Ew*ڰsx>~hE;OyA,>uAA Uft1 CZAA LAAwE~ַ?6  x~4LIX>TA'WAA"*  |AAA|d  {L^G"WjWVFamm]л |R*[Ӽ*> @DD7oݡRX[tqDXX7oݤR(ʂ. 䋴u+ G^72tqDll,2RJ. |޾̼G-9D ]j\rNŅG,|Z/iŧ2!MKc-̔bU2tR7AyA^xɨ%yJZ<`?yf445ףe1 @ǟ? [xWsΙ‹-:0`Q2oFϚҤ,>굫ڹ-kgBer ؂MӲ}_o@A׾wQ?In_w)2r! AY7n ہt[bt7RJniѻ'O%=IrcAL\>l"L</ x 鋸h% 8{{wx`Gkr=x9B-ڞ߰GE?pǤIt҅^0̝Gv?:D!$I(Eo3bzr4ZC\ìhds&wM8EMCf/] d|WO<#V/s|3m*o{3|< h1sX=u~Cs}lA1ɹǹW8ZYu+~cʊZumfɾ3ytG}Ǟ9%۟'W#p6q+dfէt10b| lpfgQAcǵ;xjh|fΘH-h;:: r3 MSqopt}(M⢅#k=K7GruаFŷ$ˏپ?IqrوYĞއ?5#kok:20~0\2<:j(Z폍]vuouW3 v%%@G iC.aeqLc4&g^ևVntE%,t oXNgx{`ySaA #b?_ǚ71.G2M0GW"=W|jڶkwqqq|GLL#q{,ŋ05MbW0+f[0SSVm'O S^{D<f}E˲`9Q /Qkz^YY9n0݋?y)%[r}Kӗ+yҾgLCޣhR~M }U+l-_[ ˬ1_`uy㠀icEt(|A.@'?o6ڿ.w͛Xb%qqqoټaÆr 'h[ M4kk./i/>+_n%vmۯI'>hS$E 2xIϾv<&=Ko) :C߉ڣl9t--bg( SE1ΘʣEȅw1o>lL wͷ=Z|oظyu*.! uU>zmnYOo FE3g嗑@ZZ&\g;8B!&I8JIƒZ كFrPOM3G3yAya9v3ӯ@!N .}f|PF-c8wx\@ Ztoe 2W=d9)Ίc70v4I\\8eqbUՎ܊"9~t;J&3iaݿ,8>¯mNF6:?=ǵgC|t9|/ >HMϩs=m.KGټ0E}]46B4E[n匳tV^X*X0>SKXX<7r|WtСiFL|'o6gx"vOD?zEF4!?/O|QgƎ?ÂƛLrj5MC !Dp8ؽkher"D LC4*?E&fbZ: єu͑hJLEc,(J*$AKT:!B45ibV#K/(^M2|!B/4Q$AJQU4L Ô^!4 ]GQU#D]P4PG!JL![kBni, B!W[QB#UuCB!D1 Uu҂/GFB!DPQU_:]dkҊ/BgBN|tAK)V!!nz-H/(\`+Bcwq~EG%EQP5 {)IB!>&d QU/BѕIKTUÔ>B!h0JE2L( \h+BaJUN҂/Rt8!Bb(:BIBLGё_!B " B!AD|!B!$B!BIB!" !BD$B!"ȝlE3M] B!łi>>H/ǯmێȨ( 'QQQQ#@VV&)X4 ~SnIEuBnݻǎ:$!B4986]DӴz[$"hO^n999 B!lMv$'m#<<ޖ-يdDEG! ͣYL Qo˕| PXXEB!D}2)((`Z?m҂/B!D_!B " Baς{|y y;?d__Y!k_!ɗNņX]1.쎮J[|) u1i+.kdK0igu-e_!đ+4&T\3&Ι^gR&jܛJ߯R!% BF@֎Wd Wl_/ ?oaPD"O9t#X[3js m!e-")`ȁ8;ϞGTZޙ<~I%ڌcϽלE+[Q+?3bTk>Z#+wI0rDs/ݎn\tߝExgvYe3k*Չo_ϔI&A;hwNO)? |j7ӿ'օO} <'|j9,J^}i|q#Wf2goNص2e~"na<*<(M#Pf,~cy%3}Y3XU7n[ÿ2$Sͧ BFEs4OëX9:DXP-5?~ $zY#k˶DrgPFE7 𢡊-*KҪ٬TG,AM\D`cneIq !DH!^MB?w~`kL֓5N5;SCcR÷_SPZgT -ˁ5ËiV3n!&iBшZ|N yt K_I+AV\`n#\s$ mqSuT'n!.IB4 zn*,yV2W>CF%߲]7ndSWP4-;;_1g?6uqkuBj.:B!\9kXV4MCQZ,Y!랆E4qfGU-(n# hj~ à}l,Q(~EQ}4L m IDAT4E3! Q_,+) 8DSLäyQ]),p‰'z˭Nnݻq:hv#B0y h<iwg?Lx,77;zjͫ~|@X ;a ޞҁ+TX* /jFSQMz6.GM.?67mZ ~x"_B&N7bZ=fL=D'*=?%lXwfPLveD%u*jE (Eύǔ䘽{nY}=CKW2e<HXPPQ'jv*@kTg[$BT4S bƍq}/u! #F`岟e=QSb|T@ZϱϽЬ+G_r1iSts7fȒMS;Ϧ?H,&w#qu&_x5#{Z˳yMd#QY(H(kΊb+cL^f?z,>ĸ!EeGjK$MVT*zSgue o5<<Vf}͕Xly5񤗵}Z޾ԅ\wLz1+l^>Y"1nAm94+jef= ="ޏ*XJ2쵼3EJ $j&6Iy/<W[xuy;;rYL/Ok:4u&f!*:]*]E1RU^Vhm۽REU((#Rˌ 媫.5&Xj3c}ޚnl޶Xj_KGU3W_yq5KdfYCX9s=}աU,y~ή6Y=G}#:TlrKX nWt{&=9Qx\Ӿ_E1m*V2[(x#y|.ayiZ0gY3X1 r7VIܷ`ˉ^:K:;me*+Xi|!l6Vkx,OuZ$+z7X^SY:ƟFmSzm/g{+UXyoUͫ(#R|7nu1eA"/+mse$<5Hy0ްlG!5b-YԦګٍ!͸, xR(gl{;ƞ:=o~ uC/['7w\Оs-ݙ>mZՁWZ9]2Oyn\xlw'mdLxow|\LNc-9\7>._Q9/åҿj^]@:xx:X=t}ۿ;0$BT?3#ys璙qU4Y,Xʋ/D(LCFc:bhرY?s֑#k"3LU,=='ae|Y)1c8*z!܂jmAQ#{H 1WM[Euu`>?fGM;bDZ];l֭쵤{mϘ gޡb{]֬Z?200>g2횖SuY@^RjmTՆS[`[sQ%iSzj:ˮ|(CQ,b*֨;_.s)5Id绩JyqENڗ>yokC-#Q\0=vp.ntVc(v:]ًտgpQ|U)Se:WCx>DU8b{nݕ%gJ%p_M=y[+yl\BBOE .ƅBtoOgS ]%)g:/J : K^| -Yz}KmtVNo<,y(~'ퟲ*T歹ϖlSXJM^R6Tg wt[W\Ɍ3Xj|w<(33fе[;G=([{bq J5"m!U;#ef!>Ϭw$!Ãi)J=/-̾r8/?kN*?h\Xm![m)Z@P:Noe% j'E?Iz\UY,= I駰}FzۧSxԶ3_gc*HVʖPIEɍlKSR?|\{5s=L^t]Ip<W7)?˔S^sE ~z/3^`%mRK⨈l֒Pˎz un璧8IJ\[Yj}$BSbsi(J`7]"^Zֹ1RAu)ẘ>+@<.G}47o#''#FruS)~K\lqUoW1 ZQ-ŭ̎\f Q%9F!۷G BmQ^ݕ/dse( ܷL'໕}ic k mIaKzݱ<8,sy/zkK9x~DZ,-5 - 9&^#YO-m mIYx:SE\Y%[ojOH|!SQ X4EoE-QwPS-Z4gw2r\x"r:ew(NyQ xCF^#+)0@煳 `֦͋ТNV_3!#}&?O KcGo>-6 e]u:!i+L܇:D%G0gֿzV2#`F˥28Rp!8QSXݗ×/^y} ˜bIOaѣ[JrT:WcVlMWkґDws[S8Äh*HCFįiV;~0p yy%uUUӹwʽ8쎃^/Yt"=ʗk'cҜ*RĿk97_i>B4.FWrSU ӾIaw/L屔cx8!-,zh ?Bkd+zƔO3gK!,Q yTCLa?8 3'[}H?rN\~|y@~TƷ9is%?n^~uדK7'-}T& nS{1L@U]udS`LOj__N|KƕK!DTUtvUfu֨uyq#'fO'Ir/j̳ά"Cj8'\$s>˰w`˘XjUO2s~#:BxoGӻ:^,gSmg:d=16" QUU %+;V}@=6mbÆ DGG* ~5Y^ΜŗWއt#MALhجGtTrBCug׃qG-٘]{Iq,PT$ QA-P?Vyfh޼9N*Q- {aND) Ew2{'z>#$F8-q8lQ(Ji_45RUBCCڬDFFPXXXLE.ݎ(5ZB4%VX_|j5&p8۫?^ ^!DQۣQ5'NgK|H4qV5E[^5 Qu!ƪ٘)L~K/B#J j"xlCMbAӴF{ !$B~?aOTd$HEGyho;L78F KZoɦM[رcge.'FEHZEPq2}oRܝ0G˸J>=#w^^-et;a_^E|t5se#r`/N_`Y(vTUڊN>'^УUj1Ҿ;d\^\3IxaʴOqrhG :&}ڹPhC\rŜUHkxiEP}}x#ceQA uAv)Ş={IKKbw>v售x H/DY,V8jnRr`:=?l%W:Eq5?P_f"??ǎ#eBnR%rɠݛjJ+zs:&T~2YwŮ/J [QBҷ'JȓΝ !.= ؾ}'V]L[#DYwW$QzOw4K]ĕLec~EpCz=߸ޟU0;W.?Xl[_4]->c@c$ѬI9!\|̶BrGʷ`yۗ%ܛ<7#9O3fF:ޚv=c a+:w'Wg|l_7\6!q-3t 61㞅$19kx}7qLp ٷsO0{D&oMt=/)g܃'cl7lňϲuOӕSƼNmo'ѣkO]xK=-NoEp< /pGNX3ul#t ԦV"SSrr2)))em6RSSyf,a8io=/վ!s? c|f9[(,^Vσ wIDAT3,qD_KϏ} ;GX+Yy[xèTQjz _|_?xIŤ'./quf}Mt7d۾`Gͽr+7g?_rb0(Zh&v#xt){e,oX\?NOde*{zKIJJ:[r?m-'x|hds䃥1exee9=HӾaM7fa4~+cE` q׮=I!\- ʮ]{8º$o3k8i1}mbA-1e=5G{.ޝؾWl\0kߡYkI/ێWI;كQwOIw7qgRQ\8>|vρe-*͊R:YX5WI{%''v#OH]'Z'+N=p 9'Kvn&@UlN4gK=M?x&>Nnun9I*(+-Q[+;_вd:‚n8tL$==[ngJSbRͱ(4*?Y_89!*ha=:ZFu|>Cct>* 8Tv?{ !}$ پ};:6LvΝ;Ѯ]C橏m]פQC9s<-]˻ 7wgj !zo80ֈX' $ Tj DzNP:_-"w+U(ΪYȶ^?OD ukJ'[?I]5l%#_r W9<ul~QƗl4NëZ8+/Rq#OΝyk曙={67|3۷o^㨣:+JPp^K4v^<%UHk|F;v0w,nyi}vDFv mĭ&$ׁƻ&*|cUg Q[\Vrҁ~ )J OZM&!OwPe%Shk u՗TT9[6sI#hI*>TΒ1g=ʓ=0Ժ^Q3w(S~-m&=!ؒجf+U3f,^1d5`RP_;𥴌XCG"G޽6LCc=N޽zqn -dHs[C5n3Ĝڪ|V^ݧ^'sk786𤧰exZ:wRXSZ =lٲI adB=58K+i ;6N>٘߻4Ք0}Ce\Z@ e2oW$老'm O ?; O罹EXǒ7XfmW ͷ_~ޢkT{4v#n,Q]t(ۗϭB=%$:>}ȦLSo~:: o>^C#$܍Mx֕X%eI׿aX3ؒm.(2U>y<Fqobx<2ה50 S+?uT<SaȯJg5dĹeoɕA$6o!{VZbſ:~mۆil٢#҂/D%\0g;r,׍O](gՇwլrQ\}7ϼcP#=yoĴ+e:pypl~;ע9KLp&(>g"-ϮU߬nɻaGo4.XҢzqxji𙳹*V.=L(2L̬hCak00A/9k:0 (zJMT '5LL1^z*oDǀN}gLn2 {&O-@=ZT_;]q*Xqɼcll2:~FQ;W~?Y[(Jxα5]Y/`l|-Qb ѱA1"6۶%D||,Ix>rn2s fNbMoU홷&ɧpv !4T|0__Sw'%9'm!ЧTeZoPU;O?X=H5!:`6%--hmۺ]|~_n;݌vp,vOHB!* SQr/_'ѸEGG4oS]lk#I&AJSUiӦ5^O[ qY6n݂VގxgWZ/DÁf {L۶[ao|$!? :: Á())FkUVZ9ϫ9NEEFQWjbP%خ{ :DEF|l}W|!"Jvv6V}@=kD~z EB+_EQΑ#*q:ؤ_#(hV+c&5awh޲9(v| hBBniޢ9vMοG(݊޴TUma]Y(3$"hiR|qLH41JDD_#ݎn(Ef`&Z=_-EQݖQp8ݩQrRνiSL4P& J )ɽh'a!3TU\"(`!Q-҂/i#@BQU3'iA+p ҂/B_.(a`0!BJ`U>BԖiB ^!$0WA=|TE^r|!B7E0LT&Sj*`* !j Q'f)BzEE_-eE2B!iTM%A+pB!MZFWBEQP5 4B!g5ɗ_-nt.S!~YZbFC!B&K4 &S袣#B!]V:(J(:B! 0zV|`B!($B!B_!B " B!AD|!B!$B!BIB!"Jfxuh< B!DP՝lɮY #*&фxl B!DPUb@0vI4!8ѬCB! J܉Cb]#B! V!B " B!AD|!B!$B!BIB!" !BD$B!"H/B!D3M]uUeX,h(  昕cLGgg<>眙,FD*;BE,P,VhA+ ղh{EQ  TV@/BY "Hd2<$HX̬9Iy=Y>]"Wy"RɬdLH΄p՟!.]:Cawn\N'>ϐy?/JƪS#9_ϰ~N uZĀ!vYE:C5o_D ~ 3tW')V=]ZI\%cFp~r^>waNai2o3g wB_ 5FG̀UKF/\aś^(׊k\D#ur M=GRrRaMV71#uF X{O3t& yE %yF$g#3xx\ݧ㳷o&drODW$W^땆V*tR m>=;mz7OYɾ"}8-;7&p_vnו_!/UUإd3aH"YuvqM:99nÿ䬷9w?65Xjc)1 دI&Тil^붏sy'i>8`gp6əq/#u&Qt 乗qSÙctWڶn.yqo6Qm[ҷ7;YEi7~p\g&-<-\¸Jo[|/Wŗ{ϳqG,iNjBSgP^; a2fOx`鹬4o<y\w!N Wo≻IOu%g;%~4q06|{It  { c5)y#WPiWձǚ&'^Sx-W+:,3P4MEQ}b܊VOFؠp_އ;=.:G8w{/3*Ӄ<(I׹,[|t11S:co7e| lܓ)iDpFZf%cOOީp{.QWv܎ji/y;Y6 f&d1gn/*XzrNU>=\Qy|iN6j*wL]Z/]Qk|P6]a"$̈qoU+\KβO7ύR^w G!-\!׹-,Kԏnl.V˹K٦wgGMvv6gfy}XG^v#kO櫯mP=d 5s=ܛc>)6/ʤ6dĘ6S]u?9S]kB5>}!yf3 N;R)F >TBK7_&3EVM)Yȁ.E7u͛˿ƚ;n53VޜϮ#w9}źCPVjʮwdD2fY:=y4}pM36)5B)\7٦7tg W9HADh=Dz3/chRwg[/ƴ!]x;%~}'ucN]Z|y.^Ȼ_䂞@_Ndc  gF׌R7MԹp1[a!J6@,WöO>ijN5?c6u_*Ӽ^o[G3ۯbzTOhNͬdLI΄pԟSlڿ.Ctt1UpI&*׊~q!LسjmC )#Df%cBFr&Ddkʝu]bۭ[Att ^ǯjժ= y~M&3Nm[V],y)o|70⁉`$:l`f%c{%9" "'Nr>/vѰQÐdcj$'sCXʿSTy"RͬdLI΄p՟\|>l6?9ٳglASYXVRSS]VՐ=PUH 61!'9"U!:DEE KC`#&&-c}BTUH 61!'9"] #Mӈ%&&&UFn*DYɘ Y?*oUxC,qu#*DdIƄ<əsV\B!JvZ/B!0viR !BQك;cB!"t/.|!B!6uɛlB!j+=*_!Bp\V|!B!]998x.C$B!-Za*9ߢ'R3xHB!B`R<Ŕ>qGcB!Bp`ٺmNFzYLR!BQ>ήN'[Z7hVz_Q^l MDq Z!Bqm=G,MI\RZe1B!BTvS#{*S?0XBrSZIENDB`tora-2.1.3/src/help/images/preferences.png0000644000175000017500000031545211303312237020250 0ustar michaelmichaelPNG  IHDR/ pHYs : :"tEXtDescriptionWindow Class: tora4GtEXtTitlePreferencesJB IDATx]w`UE?JI ]JE(E@(",UQUQXbcUWWVQAJtʝ{griᾙ33g̜3#6lFsU] >O>O>5e'7Rh͋`AX!' J:EYN\,-,ZR˺5 [փ>L4EZg6k֖fdBRЇbu#J)!BO!RY}@2U**BItSZ84V ي%Ni(9x RMͼE-l:e"R#f k1CHkz@ijWf28UbS ey aR{q< k-Oª9Il ]Z3y˩PjA)\TzW@)׏$mXHc܃TmF:: L)57!Qg,/ƦulHF"Tq$ = @Dnc*8,5*Ӱ}V8XVrcf[SrS$`0¥%BbQ&hv/c%KJׅ֛*T:gTְ3S؄ڶ;X9a.C "q(Z `2ϒXHp lPKdTNhդkpږΩJqO%Eu&ē`gUIBr@9oEEQR' mEP(i?oֲec޶m윒[\w}W\\ܻwNxFhT & t"].պtpEFkL5IRxA| +nY 9PrHICd+Ap{֌dx)JhUCM~FNx>JRQJp)r7l߾U]yF*Ky;n?מ}[(cSإ9׬]o;o>Fl`vCU>*p!OQM.E2` ;>5s>%[!Bhj~i]1cƌNk׮,pvj%7qap<{%&=K.)< I´nzʔkqà_|3<3NǽW@PPV,:Om2:6o<#:r9`4999iSHKK$99%@fF5}]~Ut՞̳g8Ӟ}1#l;;<&\ 0. gxptĭg觢{F=㚁͂}K =8!](酿?0iQg^${ Y5/+mOmTP'!f:cd(o[Z'lbPl=ݗ#u޹P_HZﯭQcĞOWv2AÁ)EKZR/(&;3.M%oqj%݂^#\ tΟ:'$Aˆe.nif+R_pS"3ojq)RCՍ)`SÙy jO,¦F6ּUiGk ga'"jq`Cp3^իWӦf+*ٲeرc.dxg̙hc%:tܹsx5!U /R'f.^hɒ%7pùLXvF({9?_qy'j [V:4fddL_zd̞40 ##r×<"^Zo̽E8kCr͗OweEpz6n{V O34m4g6+]p?/`7<┧^? *uMdY0= 943SW J<q"G>:GE7/2Y* dlQ `[u!259Fa5hs}"*et86K4t7\HAHag}Uv̔ͷ-CID!Wrv9v;D8104Z=&v5Zv#lOUz& Fsp5M B9ZDt%\1EP6U*N<ɦ  /Wm9EH\s8xaNlNfΜ~t++iݺUW]ORJ/9s̙31R wK/+tH .`ɒ%K,:t瞛X- Vx%߶dwtDV]Н%ĢMsczz>tb0lbX;,ͩ ^Hf5jKNϴ5\,'Q~n.kݞuDj"6wQp`. g)#t8Ɓ‚zwNr5Q 'e'Ar*frB`xyhP$qavr0GŦUZU\RrU6Pa. |od~FsuIem `+b鮘Ĭ0rr啕W_}gŗ\S%W\~q#Ft@w۽WeyJAEBٺu??eʔgeO@)}gFtRͽ 5kqW5hrW@Ebs1&[ h ma,'c()T,۵|M|/vS) whj>(7ᑵ@3i>XۯyHZw%mL[[6ov_R,ITag fkY@|c_-y +. ߑbEƐꩳ+<Ш@E} k` 66u?:FII} yk.9)ٜahdV6c;w ?\%@0D淋;af1p$ \%^^ ԕ'RkyXKT;7Dӏ "5bqa9]V QIٜѿ7neĹ6FTdY J"y JUizBJ b3ěF;y0#vHeCup卧w |P~#gTPIq$=RŪ*+RRS +/F_i7`c2!1>ת;њ*v 73cD\ٴ` ޕmkЛ ,LD]HqjģlPsQYw:SPgl]ANMiUvATBWTZK` *{;X˪lg K<(p >%6Iº0Вqֆw%fk-+o<կ0;h M$''''C! h:R]M7JrY QVixNbʣZ`Dҁè}jӡ1qb` jAqр2Ln^bveE?g ҡpΩwfUzd xP7"H[^{Yms_jA2SZ߆q? ݔju <8T6+GW^M3eaY१[HWThLЉlx *:a)@sƣV=(D%ܺCBpf\y㩤¬ J|o>ҪtHZie0WAϪ(MCfvG'vbͫ*p_muӈBp qShm(oqS]DŨN9:Sn_oi QAJ`Ș2NX P965J#}3 9IyYϡH`&Sw,+<";84TT]J|yAjїᗤXIfkJ b((f Rs *N WĜzDYm.P ':HRޜ}ZIV_*f+W`VwO%EuFc|Ģv^Ϭ4F/ `#s,,~)P0dG HCYmvw!| 5z" hkyB\?a$$Ԅ9U̖GMP %7?Vy I@j;vKgZEJ. KְaHq9P>bO5BY`ʡ\3b]n0Kl`̞˟QJH>l+ -3X]G^OHjMl <-54.gfцvbUz1#x\E ,cf 8 s!"2*( BiFCx Uvpá0wA6#l>fA,maii x( 5P\).\J[A#k~ʖvי\JMֱNp|^D[7w|ɧCl\^U)JōN~T$'r-9nMUe~s'f\j$PÊx.Ya$.\%0 ^eYQ-5*˅ؔzD!] G2 ,Fh` % f'.r]wIb8퍮pJK؉ $8ά V"8n)>isE,WUhХjG 0Cqm8K9KhM㠏vYRUdgjܦ qa(lءU Yeyr:[~4Co%#ɭhb{`A3RX 3K)즒0cQGvZ>:J1Ej'|i #r"ʭ 9>L&"NbGq >az2CtFwG]r^.Qv`eMwVRO"x,m=>XX#`2R;Erm{!nEͣd01Xf߲׆vT!5B qbLR/GL\ D="ETNzAqB Lѭ!!:%j< jЄ,N@0KB)F΀.qqAm%k&&FKFT`;B@7qaٓ 15cDJ* ]!<ԣ1n xa#!i&;!38̧I>;H4aZ5+T!Irm%z@F' Ep9ct#/TiAW0& ^gjAW4&yy5HR4Jl 0V(SgF IWsS 5M%)K՜x{A  8%Ԁh!0~M3S膴U"[`AteuiLMIa>,䣱)%k ]wQnM$g%#~ 94#h5?2~b` hL%/UdH %^oWO.x +h 4& R% `8l{'w@Cש'-•h[{J$@)-;Kr`6^^rׄ%eQgF\I+셌ІAHaɥEkRO tJo & <)A's_(W Gc\m%RtrW죚FGX7o>\2`}QYPH ;<)~`_cdԠ5`(HPp .(7ptKK%N2>s vAj!ua +I.@C9iQv_NpMG+$JKfYk5b0L7^nNħD>;H )0a宅$ :CjڷͣK0 tR)dm7=dJ bG(j~aZ3uhUQ"W` VB1M[Q88m5yGG1,D P.]Vam8HM~D<`j)^=vnJokTIȫDe,[ܐGc 2"'p5"*.+ Vܳr-"5'A؎KQo׹cE;nGDH)!UPehÙTN]ϡu{/p8!ձ-x3rnݝaL` N0`g]+ 2lf.Z8SMn7\>g՛)qYU&mʣ_KBGхY" (ʷ'$e[ntIUik 1rGff) IG_o.آ,01) = !vNXTxnWf8eaPCzjږ.9ո9mo=)PRpLw~a -g{K) L0#Ҋsj؎ְn'Mi?`ZC&aRO~iyT|:Gc=I0M-'2A#İ c)'fig:'.Ȍ*"uLqyAQU2,3U1W; `*ez% &9!P zX3eN!j`?ָ ~g/nN7̈B0W. qЀulSW7o=t8#3q*Ǧz;l-UuX.6A~䣱Cd > XD 9!ި%g^WwXDC i ,r&3I{=gN[u,XRCz@3AXMvT5A w)k 7mFj鸍_mM^ ¥/r"9`/׻.gLV0Nj%[!0'a ˆ!b䣱Ca,`- "qd 3. eLֿ*4D[f)T9B@BfF~@Ѥ!pQ,z }$Wq;AE%R4p:E6KLA7<]uSVTJ9+S_PLn:m^S4ix:0uz{Цڠ_~oc ={62H!^WTTJ`{CfNvV&@ XV35LZ^LJe@eRWQi0'ѥg9x\xH#JH*ڵ a@ȉb^*r2lC삮d/O>W;RINxLkj.hRa]Y)UtGcJX`޽?-[ֲE &OIeee˖/ׯ_MeCs$dNf75vbF Z/kwʳЪ=F\qL rTV;Fjl^K7/XJ =@88ueDC'3^2_40\o I\LvPiꚇʳM70}:86VXX۱co|j@zsBtJ_s/Iۯ cD N`JȓY,l.l@WJBi4905kÉgⷪ !J̩J*\J]뷗Ô/$SfxQ낵W )3rG'JY<ƞ A/_i;N{7Q@T\qt$%8 IQaG)xnsjz5.DA؟$4غ-[44>5l٢$hBReC?`68bƎ}--]~H-D( pC kĖG kml5njuk=p􃰚` l?`50+\cHSG Wա'K(`)c0τ o!W-#-bslO)!̜u [Z~uc8e:>);r.\ZlLM{B@ _%Ki@(P4aqt:xtPLɵ]>i&ii^8#3<=@Gr]\'ꂤ4td!6V~}_wO54>x!-/+C^ׁg\/N>g~ާL}}})ZuѬNW!^X -qE$ⱽvG10lطrԱusVWPطƳݾ`|6;?zE g quvyvm<̹rT܎]zx-%LvNƋ?&:Mv GlBE@VY:Nj<&4$.~Ѱ`05 Tݚ2X PJCd| }tQ69yw]vQ:n6Z=yTR XE %sj4@qni5{+׎ Ls4,"?ՖBPJ^Z% +V}'X lxm{Tl{_bV o8}UU|[c}ߪHr}pt~#8|Ѐ_oyOYmcםX//-\l;_*ƍysŦ[wo^|;p^Nzw.omO~#.2~*[8}.]qo4{uC.uM F`/U7O }]CME)Pu[C{g %NdkPf3/X;&[tJE]-+]yhcÐ1.pC[ڳQ| %bQ =Cb=R[YÊ #6K{vfO )]jEGJ0$ ڨU#dfڪ\eԨ|JHuEc6t߶8@O/Y: ef7 Ii-z}yYgܼkQZ׍حs^l(/:~t9eO)ÿ~~el@lm +蔟)?ǩmز!&S8ErH(-`TbHnM9!`Sg=61SzvpճŸD OFʇrEى Z`S@?P~ԾMH}eu"2 ii%|TBc?(xaT)-s3C/|j83w\-}_D3U%&]+Mlݳr/K߽"9/= ࢁӿZ~ïCAHR˾gM9=g;"J3sQaEEoEN#AKVsw->nԍO`o)V{ Dz0bîWIE@  V3r(=g GlP Wݼ C ^T"L.xjr"~!3 Uf"!- DC3ĺ1dU IDATedŅ,fgdz&JW?2(' l-9omG'ؼtطi2_|>gt(n]59\7{#9CŢ9w/LNn ]PFPd|%թ/~|ie>{ým&N@SsC5{@_1pj5{2@mGnߒS|"gnCi)X=4Gцko@Y.El9z=o]mZ6'\W-S~W޻i#I5*BQ=w=8*(m HV4cuqRmMW0<'p8 6\7B-Ny=qσ8nҺg:gc~þp~7{*@2{_ˏi#NSͩwOxS<ԋ?,tc=yƽ@rv!gOvah~siK%9yZpØo^p%̟'D.9c뮾udϹOm!PGiŶ H.8ҙ7u+b-[6k %ݟMdPPrtɟ1':5FLh*~Rl+o6xg؎ș`?XNjZ8:*ҽ%%;wHNN8?qx%Դ`0۪U`} z/ UoϢC6m;ZjFJש֤ F\(' Y& xvZjo5 X<([{mq*ũ~QZ+{kpOPL)xxx fڐL4L6'ꃢ%%MhrΝQi fjCzOXR'4RcǧFNm5@,d:;@ނN?SiׯKRC㗔n B)*C\2H*ڗwumQZif:|2MW(fyj'ni$XMng|]C۷lߡ}Gձy/z']ْyGe@pОg93&$sd;cB3'L3ۚE0=n{fW.EwCt//cymPu⯅>#f>q㧾k5Ff>2!(sLezn.|H:{7}kPf 6C(hELzy(cKbo¯ " c&=t@F "qIJ=<.N\QJɆfjj{kB Zq.q+2 N5O+陋ڱo^!J٠OYET)zK$ʠuOşꩮ1'/xd:vxee7=}{yU|#zw:;11ǯ\>8Yp'_1/.1_>| <̹rT܎]zxau)ѧChuK)'j{IgH\\Ba!))kKKn)K`/%f憚1꘬Vp9' >߀&Tze\t:mJ^z1G8',5 oռ;a:zثl𚅾R}[/O>j4W솏W5Mx*ۤ7n,hư+6m\we/xkEWY+:vu+;% ~m7O钵;[6ܝ\/7/7}g7KF^Nzw.omĶw7rn_>.^Ķ?t +wl?.;I090@HnOMiq3PK!TdNjsh¦e' di;7,^ ]G}Ε-=Տ?| Sl /~s[#4{f:O-~OMEe\S\'>y:u~SExs|˸NpW}h3`1=Lj9t}Ȅci]I`JY2t{7(Q7~f`04>{u_IrEGe:1{Ϸ۫(^4wUn7?һS2s{?S)_M`PӤ8|2-[BNmA8#*Z/^0a0 ,rïzpBu BmN<)s[X 9};%"SjPFÏ {N^O>50h65Xd}Qivx3$74SXg&)-U(@Rt$)GNٱ{'qY/k]xϊۆirx,cľ-@Biʠ+PFvkzSN؆zʝ[Sy_6iփ:U9am@]8UjC98Hgp)kVcM>s2 [޼fW5ʤc9R9I 6([}xO۞uy<_S(ADW{Ct諾&kJO<ڟ w0JV0]+2}ϚrzowD gE ~KGKxPzn-Y۽"ݨ|g߾5vSO?O5&!Х%득5 zK#~pbs6]_5~̟xX#+}ѴνªD%|ɧMt6Ƚ@Kxjڿ讅sM N^7 /4;}wMN=77c;?l*}‡{یh 죧 C0*g*~NԋuԣU݋o"Z+BI(-3=߀t;<8r*X2yײy8V1MӃ?ٶIiSXh{|(%&Qɧ4[/.߃}X' SgzxdA^SYzYDtjy c/uNٿT=y]\xvO7 Ӎe_wr;=c?w^0@IW/Tױӑny}{MBmΘ1 3vZꭟ?r.:<{n3o.n# #U// ^y[tYo6)@͏38V @/xzأ8W&U~ʁ_Zquw "?^#Dz=5k"TDK^4󿺷kܮq҆b=xPUu$MV'|ɧCprRE;BUeC}ءA՛1Ux⎅pB1|'|1 n߳p\"nk̭/޳Ɂ'|'|:Gcn~@KO>O>TO>O>HјO>O>ӁFƬ_/=rxHL@O>O>T{c h#I Im >k=t')qܸt (qwdŎjH3궧=:9)ϖW06O>B LլV?7}kP&)v晿 7oDnx;+PDz'|'O*I8+{ΞYԯ C^7-k/ߣ}m`W'2Uj9Wꓟ1Kϡ/407u쀮y|2"{^Ya`zr*nsx\5R8ch_|Ï ڡcgm{OXR(O>O>'$ ya'JtɅl{c,\ݾH3 ZM}}G49˒3W xݺO Vӗu7vMó`8奅?w#?K(e)v.YڲM[wo^|;PtիI.[E_Qض.FMY]GeU vÒuM_6-Pa)UqHj;óÁvԦJu`H|--\qVTg&dc޽BF'gp22 /R3kBn?xcfQV֑Һ\}QY&Nj0]ꪛ͏&ҊO>O>9XbsUUJVucv뜗{9K:<+l$7ڤj}yTlu&ߞzJnNzqX=+nV)?S~^S_Ze_\t9eO)ÿ~~elx,@ QePo(#M5e}) ^l|'|I*ֿR \4pW+o?uH2@tʽOSW^SvbNj7'Yfi+!gE ~KG; LZ=k9q)K;s3hޗ1G}'|ɧ?''_;eFUfϟpK :5{(riV ܽ0m̹)zo>jծ%U )v>;m|نJ*ϼæ8@lg/|͈Ɏeٝ/G?*2ͽ⸣>O>ӟ]0GC&<Է޹T9 sOu;Pn4}xA.=Qe}u/.?S#∻_=ա6# ҡc~ϳ_:󦮩'=_tPA^NGIgpN׾}g>ukv,+g~=js'y=Oڧ>O>ӟO9l֬YߠbDK^4󿺷{Jb E닊6t]X,V~уWUUE>O>tQ8ݢECzݪP{?~jЪM_XpqcS{wr$w(~¿-d8λfbG5$gu"+^ߧ[B: ?垛q A(O54-AlCOZ& s,i޼mf@)%d])))޿A_}RZ6N (^O=i[&=^~E %1鍒EwtpL߽pq*⹇Yf|j|s߷kwe'}Z-Ɲ3vՈ+?5(5IKK]fMfff=~yX%H?\3/'mzb=@dw篎 e7{9y\^YaHo"Ͽ[{׸varSOq?~8A7vtH҇ta騦>вO>uٷ+hyF<^QYdkhbiii999YYYZ7aش˞|f=?H:KZϞp׉ Bٯ}JfͣRfv)g8_N-y6ڎ̞ +>\=S} O6ܹsF6fZ|Ч@ Ip;[</))ҥKeeš9HUuNNNQQQfff0x2EJj{9g/; WuE.vW;@K~0RHzߙ5!sK?G~1{+7MJT1}q G g y֢,ϡI2}S(JxRZUUF j}xh0iCP/oboDG]`c&wg"{~c9tLq?])ԶMh}o N;'/-':|QG 2 #q1gO;Qw^0z rY}ln.}K3訁C?>XMJP쏗F q~<0[aZ*O>Ld~U+R]{٫gϞ4UD̫1},MBc1 sL.Xл @ɽvъofȹvIB)ԲYSNb˟oxSjCXOdIY7 5}3myzѲqs%c%K~] S?8{YrSHCQe߽#OOW-XG|~ɓujȚ~۟?\ƈ` n 5 ]a/˕W~Wwl3it0v~1T: Ɩ>t}Zy)?i7M͐*5"j"oExs9ϸ~t׬0`aμ n}jw?V '0`АN_]/;>u:sٴO6Gj*w һJQ: *ػkeŶm-+"] zhzMo}0^fB^n̝[+aD:|t?gs(z{r(ogߠ&a8itAXp4jyY: IDAT,<@ohv.b1X^iz"_s:Rtd+:aje|zZ]{@=l],5r -6 QAFC/@aҊOv62q*7( Wb ȟ`:N|X5)bT>!&z/'IJ2i^\{ PYI>SP 1e* 7IJq{98{ (@Q~).'>GTuZ2ŚtRa7|xË{;U~heylTnF! +&ȴοz0FߠAW}#%x2ȗ#LWe*";zn$PwsLu\iE&5~/OywimEgnɾ$w0#JO.X?8z*H[7tenWUSindX{[16B91]'11ӒK/SQ~lEÆhSB4gMZh&EOxSKAR~oє])'/c&>sk?CZteixʀy{k@s@͛CGS/L8>R}ϽyhE4!L~7JdJ rFFk hg[b@ \kәvow~hOcg{xm}'Bf nQx=$ϓfĂ@TLf_$)v۾w|cF [`+*!JZ}yiYݣh1@ U> Dܼ 0e6ᐪg3f,bFtĽ}E2I t󁞚̪}) C[FSn7W D(h"4#c$14@7&fU_,HE7G[QqN8WN@w]"z@m )h9"X=IZKVaptqai LYم<^äW/MJ܅> ' 9 \ mC O"BRn˲e]](+iK`I̺ ;r**߬473573~'Lg:߷k²=lϋNf@d77rP~E.6&݇VK%qs9zcه@ _M~/?F"Ӑ X Iۂ"JJl&z]boYܫ7lX}XٵuzNYyY)7*}p޽{sʥbA1O5R~{\O z,ՕŅ?-sJG))QNW IMKX"HBϜ͇.>{£kB|k,̀dqjElј0a4+Wܣ"/d|H_B}_}LEpqtcRV]wq2$3 O7дLdsr9܂WkđX(λ&-saJ}ߞ!P. o|jp>5X%%AjNۛFf 3aUiUu3k:F^Q=WvX>> 0umT:RY#)*ixTSݪRXp.]"q!(@ >![^w+d PՈͤr@s*[Ss OlL _>,bi* ťkO|v7.?+ 9PI*>ΪA#1d]2Rɮp, V"'F`<ۯ>dȸyމ` _Ξ%neH**J>6_ Cq-NC<^pZn3mK^a Ii|/i'tr\mŴ*)yF&tbD{<ڃ21S5d\T҅"+Ϭ>T!xQ܌a~5WHP)b @iٵ+4 MˎF"'Ƕ%S4$v>4NN:?3c- @\t'!\"gr]T'uϐ_ڲ$,qQ3wuO=#lM<%9o:E8AG:jijl{dؙtX#ן]S8vs]vgQaӼz?B\nMQ&s#}>|Ký-ͭ7Y 7|d#C]C1е]F;l`KCw֌ń@ -:1/O6$-Ҫo߱c4nC>wkAFQ]{:h_b6txCcyKX`n}cS6PHx[oG.g-zk6RU4efeD9ܼjM aĮ1 4 ԘuaW_X݆/۹y5:uV6&oXy2="f8d2Yػ&mc^ׅdpd#oL)TYM`?!FiΘkD@^dE&wFЋoXυQ@ɵQ>lKa*7 N%_d2i斞{]=_{cj }Lԥ@ p*d~W ŋ7a0zzzd2E߃j*TglL&tCZ:3tc8L]y!̩w>Gzcbw&M GM@}H16 G[V~@ _e2D"Q[[[ 9jBt ^ӔMP7P;4?" ]k=&MNy!$o  ;KXJI><#@ R C"~5 ari: -<[4fA?ּ>uӵvM<>8I_o|lA/UI< ,7:u @St4'懡vƓ7ܨ6rռX%740IF&7_(`*_G*'Un/*8X-οnzXXA'M`ʶ.@ } UGZv[`) v2Q\i辣qG&ٛx9֨JX @'0vm#i!,SSS3󯬱iryyyVà Q H$S ꭌA>*#A @o @ =@ H{1@ zc@ Z9bvD ;ϻj!@EQL&[n!8dmX @BB$_gw|UUU<>b0E[PBXY1LUNRT(X,@McL"qoیp;1`trx\3C=fA Ajjj2 T9B ȷP]]mmeh[*p866LqƼVF̌ #8d@Vg9=akF;_ }}x+s IJT@ ?$ vJRtǏ5oruuue2@oZTJPut*5Ynz]|&܄IASmFVrߕ)'9kL-@::dIOOҏTQ COOf2Z H"vnNõӡJ"գ8b'Ѝn+sJ׃I@>+'kqCH[!?8r_5hK.;2q؂sQ11;³7v]] PF(*  (?@,BjƤ<e"umDzp5Uva6E'UkܵwZ3"$[q?)0 uxB@:((C5ڮG=z~kw SI՗' _En1U](i'Y۸_wh[O8@̎>=l],:͍L|wP bVtO?2ۻmIr^e&Oe]v1;xdff.+G6=͌L]ƮT k޼Ml\@= q܎/ڏv 5Q1TU`:N|X5)bT>!&z/'IJ2i^\{ PYI>SP 1e* 7IJq{98{ (@Q~).'>GTl`wuO=#lM<%9o: ceedlczPrk2v_gDyMcn[_--|сlQ;.3O=HwlڵM[͈)q#A:%Jee։VTZuIŅ&5~>ངGH2|A:O&W=\=q"i!!YKnd侾v\AR˚7 $g^ \ %rynnƣ}Xs('=&d;&PvZxe3ʏseuJd줨~)릇m/R}ϽyhE9ǰ!f<65Hʟ'͈7 $̺>IRrs޷}#>}<ƾy, (R`hؽOޏUwޮ4kt/͗͘GbIDTRYo5/ biÂk$DVt~^eN;W47SR֤L&6&%lT$z)4l9K YSAאőڡLa6 MJ8чܛ(QqyG4Hy[ߘb$~dxAw[&EXsaqT | ^u[k{(% 7Q;-r3DJs43-k=I˜*Kh_hX2?aҚ@0o+S*p1VLBӾkC63NeٮCK96|QKRn.SH:L׈,:Y ՝t ϥFБ. XD@ɪ|r9*2|xM'Kh·\ ƒ?YyDS?MY,A$1 C J< 0]^?0aϜko >2R @dr R^˴bP-(ttfO |[(ӽb :`um.ĺI[KH>D9U集n@&{dGڻN%BՏg!kK53m7>(")kEZY-qѐBhK5>L^eJU-``4US@T$,aZݱqcWtC0Ъ* *Ϭֿn^Jx(,E>& B@ay92f@FH\IejK$S:O&gMiTt2rȏKOsUZsQC'v^p0u),Հdֈ7lјGJ5׭:ຐ2 TWaw:'W:t=nWVYR?&p#FGMU&6zR3︪ IDAT`Y3+nfH KN/I*cŸQ6ò&XwH&HJ> W8նxlVP YTTK@q,e' e'ßS}i4@O#3;MWEn%{_"*vӫ|si52TZ<Ӹ(1)CI(jzo $^Z<ĭMxSL譝#zx[URejjjna٪fA ;;+//KҜ\OO./(Rm=g~u(SQQimmM (#NMQWrj#vğo$C!H"H23355+(JlP J@5@ ȉU)N$r|| g.z11;«'?r? w ԂUs7}̒0-kڗ'!yP`"ZaC0>gxf.t'4E^W"SK)^){|:n[(Go[pN RWB2,h:dVHRU fpc#CGsr^/\1kXN䨧paoqchLQd2H$,VhQZ|1D%qnj p(6[`0T*5-5U[[Jz6@$ryTSSLHV7&~wDi5=w+?w[q(#FeBE}a;kU,gg%Lo yJVg9=akFDlP Ns.wab(w߼9gIYGEo`o ԘuaW_X݆/۹y5ӛ'W<[Y=9roD{O2"⓼vIZrs QAVlXW7P=B6^|&wzA 2D"A[[[(ܡC&t:BӔ@Z&6f6` {i xir]@QY~r{oQT'yKayl?R7@  _=FP:T*W`:&GZ|jޒ~ݗPiM5?tܕ 4[EKBd%7lI8Gg$}]Y_1@ DGsb~Ԙ'M:ۛm+/*)bEQ]Q*|>N,,nr8;d266RBtT^Z*/I 9F#n)3 }>J?Ecuߌ5&O nsgU7,͡g#RLK^,do }߁ 78o`٥)s"Jd3d-=c7jNK]zC'+4Qo,R*ʦ< WKSc#Τ+M>ج# mwcB1DP$_`k݌ (߿4*]fzds ~=u/߲gsD͖wO|x~AUiݍS=\{!n,,Pl@Ic(r9̔w_#yƒٵ7t¡[GV~i( ݷ08 Jz l`L]g2bFJmR@11x{'&GǎԞࠉI!XֱbQ`W~77G[QqӹK6VuXưڇp?gW,U'Ik16 G[ӖXKZPäW/sb>f>%@p+6!Fp2@ ΜzpT'EZwͨOBN vD,n?5 P̃v%` ei:oN}?w#|;<,etiLF1< ?s]m@Q233C-iXF,9Bn-Nu$w AZH%a[Uml/oBvAf!MֽyUMr@ؠ“e;e2)Ç'L痴}X6tm!Yk6dJ5I$\! ~r{oQT'yK\/4*$t=x„=sV1H-iH%Hy\,ӊI@CҶӹ>}7mnwlëNlX}&m-!YL^TVoZ]AeR'OAZAgbe]HG33m7n}z.+wCԋ>[ףּ#ƆA%"Ȅ%Ͼ;dxoJ*ޜ[.JlPؒI],̀p8 <@\# Q08 3H<r'jXbotj|jđX~e"A5'-=?<}~Q"M\ %4I<󩙬ƒ-茤7> (EB Q)6-/B>>k #PAQБ3g 4< Pnթׅ ޸KE>!(}>!٥Vqʒj`ui?jToc~iE?7,XL[5Raizb{a*II><^L[c+/%w+m CDU|+|]!A18 FGd٠“-ND"ϩ WZA\{7PjY/ʲXj$hڛaN'HD7+#p8_ăJx"`1>6vT k!稞Xnٵ+4 Σ`Y'Z+DOmKiH(1|h tTf[\3_= 2NBVOd OC3(@%i iUy3zA+9[w] #{ w6,#X7ruG`=8d.{?^3x>ia'.ۿxנQ'cFVn O~ReY<^~YlV,qQ3(!8EY,4b5uc7O f(LCQ,s#}>|M^oZGZYc:rZk!"PB"Չ}\G,|!.RU c8i݆}5ׂE tѺ>2lT(?;oc͡$`57E/-wY<{˩Ą9H՚YY٦&ViDdgeYXX|]wT$bf5PQUemmM ):z;\Ul~+@T@"dffj6T*enB@*4@ IĄsss9 oJ:QuA,N'?CҺo.ÂvQoU5p  HReO*d }?Ĝv 8Ԧl\yWj哝?{wiݚ]T*x\݌ɝm+Ϝ\aIHzAܯUi+T7Z;. dH$ 7GFpj(r7v Po4TD#W!\.'[ ̀ڧ 4(&+jgǴ& msvY?lAi|XĚQF$ fG#@x1"* _sk*T'Z&Vjа[boó% Dkw4XL12XւvYɿrzGQys* 2$fGdpӜ]XE-Žb\&ζ;.ƙr1;@+ХCxᐎDER F ? ȏL&qDlF0c2LƝwt361n [Դ .Lf{ooLZrnkQj*\p&y>"ŠEc;f 7!|Rp;m? IDAT}ȋN%_d2i斞{Re%BgDW|-ΰ ?E$qo*o*vZ餹%yY(z0eg]zC'4$(h -<'l73F6@Ԍx] il@Zj)~׮,6++gmU`0(Q۠bfU&ڛDM?aB߰ R @y/CoLi YQLC/KV>;SާW>+ %If,yt?/.|* K ? ZQ Nd֤ zQwluAJnTҤ'JH5Vw֗w0`WxLd5 ycʪ|VvFaK)7a0k-!i[j_5c9M@ `( LnTDu`0W^OP^jҪj;~.Y8mPS.ל ՞m'MhuF]C^!K2˛@ 以91? mbeEKnszt.FJrsdJ(#¹& f/-Z.3l+D$G6UȚ@ y6B.ʊ: wt6${S39GxH*B0Ύ.KUQl–x.mi# )XL3C 4Kme$K[fegXZYqϸ|g;u 3|Q%ݽ?$7[@ Y=O9?yw*§/Qʗ:6 @ K{cDf,no+ƿmlo+  tJ@ .@ iOgLci'N~̯@ D(d2D6ul鍉c8հ8gG\G|CjYK7%"@2[an.N$!5YY<>b0E[㈢(JPG*DN:X,@-G@uuuII1DR^߂T=ޕV|) Ȭ*e7I ]x*R/M,GOA mEM fw50`2m 񩮮fs,,vdV&1Uhii8\;ro " ݇ :\ y{9CsfII/q,t[Y&@7pbPKYyUmXS1iyaG 1z.g[܎c_DlP`ףn5/ "#{2g&V@1;ؠ coD]nt|xVd!hk}^5 ^hjA~uI{"Jd3d-=c7J. =e͌Q?,:ʪI:1̴gorH+/L5X PvZ˝ǭ&Cwtqd㫧xۙ9 \HړdG6{:O#i"%UfQjcHA3\Yq"IYjU[#}Vv!O0KSm2F@! 3h5%(CCCCYTL̎?{DBBW4łذc_u{/k_eյUlAHKB|4APɁdLrf{zFu@RGD%4QUj5IiK~P ">}k)7ٛ5;0%9nT,}.0yD3)zckΎı+jJtĐ^]k\&A#Mj}2Y'G 9ĩݸ}>Ky|Ks@#Iɍŧt4݄MKwemYL%o& ) ݐIY}f뷻0Gno|me!J``G;[{'UUQJC0V>I 1scskdn\v"INnn_~>棔'n^~"INomwש P%453eR/m9Z@l2NEKTR؈D޵wҌsg}ɺvˉ{iR$^y*6*M5}_qyRqr {elXq:EAv,cXSṷ%@}Td[Ec1ˣW,/ÜEηۤ;Ui{g2y~ҮNJup-z.SQCz 8jSD۬F- i, ǓuSM-z6v]T{߬Nޣ;oߢo i~\*q좱οi`uIJ"ގ5hm #xa\dna,vq.K>ogyg%{cx`M'WצJ\3,gsPh|:Zѵ^_EoڼKnH٥z˨rdiR%lV )}mTp]Wg'gZ$)JZP5vWQ:P=%4ƶi:d];p.l;}էg2K[Xi5lh$0{zM#s ʏo_u/}1aA(z^3)}h2Xtٻfyм9>"l}䑘+ߚ1 #fO =3R"nRb>Y?ysbJV[&>wZJJ 1!;&b$q~CSܫ4?x}N<)gOlR^WO8gyj{_4ս^BM lp*lS9~EjTE;:$nOFKwn 2OO>x{Q׾`g jN:m+49(3o#<[qԙgnx|*ݬM''*9wѾK?~ij;[Or\bdM>[w7^~>xu*#ﳶ%rߖiJ`*Ume:e[s}fwv0e}DA=ktn#ުB*m3؍p8^̏>rஶN&t0i0`bU2hpS;NNӭ@O>d`]\p4E T<}u~" `%{IN7bIAҾg} b j1֣v10zaCL^;M;3lo?od(=L5zhqj:Ԭ tS}?OR<8lO\2MǮ}+;;\xfM}})bWg^AmkUcMB!I@~TX`}*0mU k^E`ogn&t0ĭ':j_=桋d.q6'VuRJi5}E~lԁ|:GA;&}1S߅E}P6\R:%m)Ҥ]^7dRJεRod<؊%{"*)J) ^JhB'!KAcpi?[rEaj$!gQRJmp2~О_4CF8n\e|ah7wky!S?wn tt%SKư&s +NhL OrJM/:t~(75nN%Uh:Yl8(򬻯m tPS*C D~Noo *iE|6M )]!bQ4euT ridXF 9CK@uwY&3HirnE @(B#( +jXI[ΒiXUjwsvW)0jZ=v'mG}u \ߊLZ:908Qi`Zʡ;GRu'5LPHttmB_R}ؐί& %T9rh Y^97oc,)_/Ъ,mSͧ8i{XPj/" ;\:bS|g͑S*@ c}S( y/=2(xEގa5mmGOM[GX\^aj%lsoUQn/jÐ .4At?@(g;P<y{#O+F[ۙ:K68pXvA#T9M;s}yf5lUĤ *P<)%,Cƾ^fy^&QJP$}- tQur6o:(/GV޽r߿n^jKSgh&&DnX o/=.*HMνs[uu&XG{@zs2A{â{&Esdu=V]wQ~hb`)ڋ٣|f CB}7uԕ\:bSt}<\{.EA.]WP񓶟ׯo9wo9'umcˡT/JVQ GͬPukO?P@3nFɩ1h Ѵ%-Oдy7荛Vk5!DthHnrhZU0,[.Zޏ~x\Zy$Io5y_W b=[ˀN×(8bZ]cA]Ҿ}oҗR1-Z j֪vtW֦y`υu ; <1K6_C4ooQqfn[KXuv4)#M_botM R,qU6')֋eq!ݳGGu^A7* 5o=_~]??5]KVS@&qTubY=[ڱ)W++9ӡEF䆱ԫ00ln 恋6eԾIz Zt<TE}nUZ- %11ӫLY穩ܾlsFҼysDRPy}a\OOO@fݽ"ߢe㷯Bjٳg"SCbFIJNh5GX,6nLf?9uC7P"Wrq$7PYdOʯK=ۡIH;u;YY9~ S쓧DPTEjOJ.ƍHs|.&S  6.hkJv~͂U"fj>Gޑ5Wj_')/̬8G{FPd jr!]1֫㒔;2ژb-0Th4mc쪝 (S9e;-s\yOy&4 ݀4tFrrFC%''1bucFc8j5 {1K_F_)]f]u8O?O=mX zu*Y}ݍԽM4P%ln}40ȊJuC7o xCg`9=?K$IX2"Fy11|_wb%RilL3Vq11u,oo}Acu%Ljc5k۩Ҏ-`u؆o[v)1NU%lrqp}Ͽ=t|ۮ&՘6cN F̚\l݃^ÖdAy3(0}ZjPX>o5}A qӎ@ܿg7*qӢN͗fǮRc"ƹK禇Lp&h7<5zFW/Nz!Մ5cc?Gtb!+ *Fr4ڳ{uSmU[[[.BLah&Mii2[ń*^Tj7w74'Ş,ycXi{6MΩNȷ8hL&$EGB.0:rS\@ 0115$ `2eqe n(>8nP so|&׶p!_m< IDAT$jol>_൴%{YoWO]Kn7-mS&_`h1dxcB?pM8& h4mPeK)݈52ƶ9ۆ>73UaZ/'Go_0Eͩ@i}SF,RI9 j54IQA~!7TuFQEQ~kT@uyҤ!ITmPUe謦 3Ǭ'EJi1  m#\yjk=+^fp Rjb;ki4 Ɋ7B!MER&V42f+% OPͷ,`Zw\w||]]< F X7+r#AiAnUllkvPyn[L?c+t" .Ke[Zٌ@D}nU%͊PTH^eQTF=H+jՏ3B!d &r>1⨐<Ǒx2 )Ǹy!|4hp2F( ( T"(:1Fc/22m/")>!*)Rmh`2~ӷ!2EQobј!ejB<~ FQ$EЂBH Hh@Ghӎ~c_ݷk;ކ]^/X !PDQTYo>~ĄN <u!KS& ]]]kid{]2V(UI+lO_}]_i)i/AApc4\p\ptReo8j5 {1K_F_цd~ԼnXV'oտ;g:T~vWj`#~B#k`2d(3# T#|HFQd͌dhLs?Ftsة3[?m$,3VUʖ!w޷ #OZ&?`0H(BU>t$`0heJ%ʯɓYӗ;'!K~!",۟ZWF=JE9iޜ9r3)O:BQU~CSܫ4?x}N#vGI WD츛{ bNZޥ@!gh&M?շ/S!U~v8Jj%VD>u]\]\]ܼlHQ9#،ՍKgY`?"sX݃`^Drb6yƁMgqR1 " .K9,EX4vۍJ}x9aτU)iZDHS̪sY ooR*qţ+Mɝn̺m:PK g-;՛UE!Vui&t.113m}3C٥ i\jj[y!BV$kO_(mcVӋk鮛ܸx7 R#B!TKBu#gB B!*O!B'B!D>EQAWE!~, 2n4Fs1JX8 qA[k&&V.<|`55i!&4Uʖ]o(>Qqzɀa%h]5s x7>#>#>d2ˤ˘RCH':Vǜ.}}F;%5-[yΙէTf[d4Aduoh>#>#>jx0ZL((z1*!Y ^ž3.՞L{6> ^~Qgыug5KU@g;&aÝl;P`}ֺE&`:7 ;uqND*wpPT9]BR)vv^zi&%MƼeɬ$=O>8eSڲhZ?5^)KIS߶{z ?4ŽJ1izq!ڸMoolpޠ 9CHVV. B!TX,&I?Sh2xщ&M?շ/S!U~LW&ՔR>۾,(mBftsY#4} Ew8#3չ$P(UJEQ_. .| @R*J$`fn\w<>9a{T)iZI#M3Jw[v5kqo p˼^v;֟hf o隷cK9߁ 4Q~_oږ6Mɝn 3n\sSmXn.C-M޽ ҿv&BI:5G,!!mF[M7p$gg'/_#%4fg6ڳK_ZObSSSܾlsF<0@RlU~~ֺ)KRU=Ԉ>>a7r##8q dk(  =riunɿM!Tԯ~?&|bIsl \?qR ԩ=Z>sN6M/YQ[SگI+Yȿ>mv+&rxVMڏ@BYtM4mѦDŽs BzQ4k8]Xw1=ܸx
BdO0Y+&x\/S@am[= .| )#YI&:]Lv13- ROvdbP@?]M,?MWpD\<f+Fp@&yf1{WwhO¯2-LB2G7£ ^ˊ({`Ui˘"wQaܕ|ok॔.tjWq,ܸw+3l:\$VF]ؒ6ovۜx0@MIʻZim9(|sosn%@xwTɽo=n{LlLqV2^=/*HMݽyC9w9*1GM\S'a.@s1JX8 qA[kQ C(BIMt59xPw]_-ʈ|S-ݷf. tSmlW8oj v9#xM2 ᥡWڬpMuҗjeqMt[ʼegYr`97;ki3 w 1)ɫFO_ķƴ!wM:tw4C[Q/cs[UV<}6h4)ϟJ8BƧNvw_8B񸑑.oD5c^T܏Q9 m`.# bN iRnI{eVlsͨ6]:E>sHmb4]`жe1U2V(q#UVd5u 쫿ttjYM5B!u<5}w}7)1z_ YX}InbBXm҆cҧ;[7h.6_p78nzؓwd9l|GaB!Ռvp snm1yv/SCP׌v;0adV6 vSu~I5xc74g݃XP*#ʘ!\:˪_,X1){=ĩݸvReF^0tN{3aU% 91ծEӠE]XU ]6|4mX:И<: R^HKh"/Q-Kw!їB!Ǝޣm|{붡LUEh^w!6ڰT@+r=J#&:ݙ@~ R)BFC2ΦT~|B! W|+h.r^ $wʳ Eq~_W\yy-9ZilVy]WQjeu3t/ݢ` +N(HuvԎE7rpLkB}1dj88Xמjϱ]tqi3 9'-vm_z~ v7fI;wZVv!J㍹~xc޺L['9\= gƂp1Bvo,FiR]^7e!C!PEMg-%Ӱ4sZ.B!w}“w)B!CyQCF BB}!C!*OůTR EQ*7ÛnB ؁qH x:;:; 5B@2V(QLVNSߍ@]M~w$Y0BUrƌ(qԌkr{nJx<dbmJCIIj's6>"PVE!w˜ј:~yHHmsC`_}̂) z88Uo詂ȽfXPmWG={ж]lsͨ6]:A(S6~ 4W8)l" bN iRnI{e"kS@d^ٔ9ea#;UV5?`TֈoB!3ƌXV~L̚|; YuMqpLZj9Ey$&%f ShD츛{ qRlR^WO8Ih1崳)OO=B%}ybղ&%F!Ktث?O~}&"+;W={rpG^+VY# !3 /kS??fqGTdNѳ{l HNO.<8 6v[հ`-w]x2'jG\1C\tUaX0i^b^ Fȋumqљ/#i6O+,,{pܛJk~IU!BqG8nP so|&j54Y 3V^$!'7fV3ӠUZ_om:8“Kej͡ɣ 2^V!BX6=u̾2Nd~\6xUP|X<3yiTOΆ9gS*? byyݵQII)I)I)/RP` Kqˎzs0Ǥt2^p]B7d]^Ľ4)@H/Ο̽M $̔Jkݢ` +N(HuvԎE7rM5}_qyRqr==V;zx{3t*!Br22:K@F~Rjαמ`zr]糜>yn֭/RcrJ^N|0m;wt|Guu:nU%}ݮqa]6ê?s7x5_ޠRUW3ugQ Vyڧ( Z]jl`а!C'$$dt:FQ$I^]$R6ܪR$&%9;9y)bʿ58pӾޟ4X'1/^~& TRo9d+RemccffF(p8L&KŒD;;;HTeAz秧Ww3555p^loD̵OlHvyݜ[̖+FSa V^H5j!27u4.V(2!z捇Gjx<^y%Azkã2EcDAg4*;9Ua V^$M*Ae~+Npy>>ojjjkkS^w6g{ )/^%?gAE)-X "??RRRfX-iQ)VaԈmGݗiUgS2a)FNrޕS#z.T4:Ӳ~GB(bXѫg^xjra@NMPP(Uj5ERǖ%55u/_Q*ZPR#QswZ7m4〩kN'ߺ^"GEruʬq}eG]ʏ3KmϬzKcQ?coWGG7φo[*5Mm'ϦGhʷ?L6bxXAAȑ#r]—HUpPYJh͙9ӧw7tAeGSw}[JO qxTY& v 7 q5gwOl D/G) 5v)8Xx\.XhT"Yt IVŢ[1>Dp1-}t ) KUllBBEM_Ȋ,&o|;O3b|O?%O<83H T/1пI@A ORQԈmњ΍8k`.cV\5xY_uo~ЂcIrRGԡYӦ{6CԈmGݗ6*5{Av׮Y^'7НbޖΨ6M46IYra(3 IDATM hudW*з+}ʶe(R2MLZ8p\ (EҮ$) sfL$)t EuQwر^@Qz~QL9g5uP"&%0,[%3,ۦZF{M2DA#8ЙLh`F 6 g0G7'xY%{b>pB)9K2hQ5=GWa- v2X ~Z4=BS6exe٨.+t4yA IUIv% Xq`^f# jÙkȡuqFxf5pt;':Ӣ Dv7}gVE8xJ}Oi S3eS`-(,Au~vir$q{#r5ۋsg mR 18L"Wmc_?Zmv}0'8Uؐ1lEQ_~[(xv[7bc0٦J[7G^x:5jM]:I7R72 |MQ[h@Q4 T2޾vn`ќVQu>@ճc%}gVyhʧKVgY:$J T$َ9T誻}Ex80 neg$zíE:o|\Z: dVn9sQcnlҀC (q!=Dؒґ3"<`ٶ0Jsdy[\$kQ4GY^7̼//)(eʁ z8},.x!mۘհcmT!H3pM<^cz yRxGe*W7.[IS).?NRu㥢xfy^w:QJP񋘤'dkTiWnH4CzfbmB&?NWgazܳl 59ms>Mgv:e`j4'>g9%lXʶvN:  }oXXС}5V ]Z={KiJRsoCT̼YJ{5EcmsRѤ ?hBuŻWJ , b 2uއbg"%T.^@kljBpСۼy'#GkC+`(E6YZXرպ3Cax]aѠST6UY%ϯB[]c恁Cܾy};3sfqY_*Ɩ)6s&œz!44G??cS_ݭ_O= o^w])9z'_v_sbe,ѣY37lXܹBC.\TEM;kxs'%%999(>bcϟ?jR"T\j4d\Qhz⿨m} ☘ܺuյ<$^hxJFOî߻>-ybOOOy")iS<{Lp>|īgϞ1k8Ͽz劳qg 7mcL0dYthj]{t ĠR&2*YJ~k׊v!TPG\(&&&,WS -^R4hMFOb,,3c-鳧Ž^ I']z5(y+Λ2>! B J^?16iӪUDBoB7tqd2TV66UBC{|Iп`4˭V͎N={޽W65r޿B͖H$|ӣO$)&%FcLtPf---'&&&2%BS hj@-Jj9<`4 Fr&&&Tich4B? ED_A%)zUgOA0(BUde5WB!Fc!B 1BB!Pyh !B b+K+JIeȢR*b ʻ:u{KipDPݵV6alz UWq&c4(BR) JXRSSWXER EQGJc6KP@@ˎ,)j!}fS@wRW@R% pqptprtprJtȸd2وa#G](J%*Cz?srsgN%# ;nD˦*o3,=C40]%?ʁY7U>|?8 ,^,=<<~iJ$˖.|:"LRX`D_&$ h+ɋWW me`lk5kP9S/ @roMqK,cKBZ5 8xd٩Sh] nѴy!KNPj4Rܟ:h:q 'ɜ:]!Ik6 ox[ϵIJ ѯ]VFZ0m9-K&Ζ =Zv.*jb dg,v؈oj4$¯lxNziGt;}fh뀀NcFg9W6?hO_笡>s4QwמJe>6*Gkڧ bN iRnI{e#n\ͧ͘j"aA]]<{@,a5\}~;_59ׯWWjJ,wg} . }Equ ;;4A1ŮQTbXcIlk%"bb7h&HLbum ˢ9g3sf޳w/^9|ҡ1`^:Qe"%˝]\ d>_8xi|e/'ƿ"NYg[mG#KG٥>*1kk٣=bN%hܝiZ^teϏWJHS1s"&l,̿L{4ϕH{w/g6‹./^xRBEmo'O;\o?vXiĽ&^5w|!kT[7&uz#5?Z/<9lR͔ҌvC_:oOʈ/<8BzڬMl/xY)xyg *<$9[˖݆ߗ"'k矚~Ȏ[Y)*؆"_9{Ř}2,Z3aB(<;}՘w>Mu !<{iǓ^[ƂuT~tH;Ľ_]x}p c9*akB#GFt !ԥK8Jet ̉E>0?r`cG&3fm(3v衂Gk=+b:f`L_\W#cǶO.%*{rFn\Rr{VgytσkgrkGC=æSԜ?>S^ f!ՋB43LۮOP3]/R'ȜBs){$f0O.iӹˮyV7 Hrpq0Mٝ+~mtoYUƗlJxцoX#:-*RYӛIݣvm#b!1l?FFiϚF簑2I2!roޚYצl.ZH ڌ\J^9D~vtúeB:"oJc0=ԡ[95Ϧz|0}0/.ƴm5]o>?fLԘ}+'1Qc?ptBXܻ9wFHXҵě7RrI<^]{SKGc_4QW)~ZvߞH2 O^)JbwR1v$?=vߟZQT:ڊHB]Qs!ƓN+bX .$fiC}#fHDs_;y} lx0D1Q^\ujY",WN,X6"cݲt2cLL- Ca >-z7R"lȉ<9M%|ݔ݅]]-BN|p,E@~1ВB?fnVIqI@%wpS)+fU,fզb"cߚN? )gc!*BVYZ ]*Ou/_ZFxG?іs/~JG3!D~l;ܐ5~-_359kY4=(ɔU 0mZrO}kM*?k6kz9&򗟯>Sx#)oJ\"~3xOܫwq&_ܒEScelj1/%9ƚkFnJddryJr;V~;; .qkԕ׺ 魟-_v!٪(I z5&x "h9{eAo 4<:.Dbѕ˗}}۸.Ǐ"^sxqz]L]+XpW3wיf]NqT6t85Ao uuqh۷o.,]w|Qxbd264ʑ$)JM%ƀY`&X,Ri#\.W p8ڇ)fdR\ AS@\.Ӫ,ұT0r9* 0{d!Z:`Eק K 1K%Ao 7`I$G|5f1K%Ao 1`FEj c2t:x?H20FQۤ%Il%,]Y*@o  !dmH$lI=A&gd>um\,[:D"|), BfB\.oA[ 2Å|A˖"N7N`>>><ұ @ x%K&9:9T(Ƶ8stp,,,(Hwuvv  Pzz?j۶]BٹRgGD*hLyij;;;TJ6#ξodah6FYWSX/ Hgnu[$XQPP02|Ν;{x5 (Jj)cWvvkssQiZJEQ5oWiw? wXEϧ)jo >e駪l>ד?7V?\/xWhw?׼חPҿץsH#4udұ[8t,e~z4wksbr! )ʬMT*-^fD!d`w̙ߥnxȺmmOTU޺~qGu#F.'v޲3g4!һp|X(0K&bZ͈]7΍]ujٽ^<'.q} ph ""6&FT\-ɾ[KC zcv*UoeRÐ!CQ!ڴٻC?;{QdAo'+oU b!^}{UH%orD37,̀ɉCC>4!vl`nVo4]AbYrIXe<*]ۥy± s6OSw阰^A'ĞQSHrάO.ns@HnY0:,( 0d/?l{|h?Y*xFuz}!@*R/7W@@`ﰈ{r4&ꪮ!/>.o}u4Qʌj6^;`cZo?؞%QzL}&/Yb<4%W_"^]]~&\oۖE,h?/;w>OB,=gr7 )1kqmnX9[)}.5ȑUmJvX>ZrB^77|0?r`cG&3fm(q<^bD9b5|tC֋o4۱w` cfw. %g5iFNynf߆,q#1N[^ht.9Qgu½^35=tP^iQ6lx\ݩHFREjjFC"bWz('4yW6k3-H$8q"BheND?~+6yʔ&sP藭ۭjlvĨ1t vem{\ݚ/aB9?|Uy`&l7{ߜo? 4<bYO{GcGp%!ցKlZ Ոcm؂v=kQ:{u=e>*oc!~_|?Ywum>d' ί(,qcUY O& l'.fTd؇Z7_iy& 7O1vC!ؠ)c"%bZyl'Q:+!4fyֲ՟^9v<˾ՙNW`tƛVi&V~gtwl¥f+z5ȏ"\ .H"~oȶˤ7nЉNbbW^zuѢy7mۯ_tJKRm qM9##ͭM' &.%AvNgfq<++w>RL6~㙙J׾uyrykYL&ùq=^']Lf&)("WxxN&6@??餄)6[D*kժi#T*ۺukֲoVMKK MMl6G Ź7JzaONN#,0d0µya#G;Ծ0=O+S#Juw=\XW Qǿ~8D8NL쪎;uyeLlծXQ Fdk>Yɒi:N=?魟-_vC>_3Uz#Y8E)^6ꕍD"ќs{9hxt:],E/_npG?~(t'Z: L\KGfb,A8G*LjQ:q,r۷Bfr]]\0-55[ Bgg'ggg.ibX2fclHJK#0 D,ֶ ^}\@ p8pcYrTBoe2Ͻ}MG*Ach\.P^AѠxo0L RK p4i:q8`Y$X, zc1K%Ao 7`I$x20#j1L:PRizzzBaF()KQmK$! ƀ8hBrDRZPPf, WxK2<#kbұ$H2fyyy !7&Y!|Ж pa>_в(%H(!C~~+dzt,5) @saK#1 zc,d2AJha\syד?[:[6@/} z~}>glo_ұ[8t,e~z4wksbtS(S&Y[[[[[O6UT5+ aewBo Qy#5児_Q-ϯ헻oű\#]8Q:5䟵\knӓKM}߾! QƹN-3~݋}%.Ϝ~048 bcbJʕ1rU$Y}7,c7ĆLZS:Ѕ>=-"ONNT4b8/9diJqfח񒿷9@n4c7˴Anpɣ?;0JnD٭t| CwߚD/G=WOv7&ur#ܤ/-~7?kcxa,+&RKB4.,x B((WՉit#((A6LhQ5RV40Z1jW2[ MJ30:L`h~ı)X ]랾5hν&5Җ$p]wGoց],]w2BL)F7׳|#;њO3W[vNvdƆQ3^Sy(U0J&BP*wq)I@iJ*ԗ n.槓?7PoUSo?6h:́a·)2̖!ytWa7wQRt!F=c?chPdd9 'o !yd73-/ՕLN]4J-U3is'0Ddwj_ut)*JzBxɭ?J/R4:GcL8G~ޯo"~ ܬVĝZ~U:ץoFuNdb{F+4C ӵyI躲jyM Z黯pͳI/+*+*/shmn l?.rI)zqOuฮ~U:) `SlDFVq"5jZ!BSC+=+浙lO?H4qDeN<:~XyWl)5P[u٪x泏KqHe^w}?2GïZ ULվ>SxɝC?*% I9Q*1?kqI۽?۽W޻۰z")c"%bZyl'B{Y{Z7_iy& TnɦZ˯J׺3”D79ajJ:>h۶a' ױr۪S|Q͠ѽUh,'u[Zt wjgM;PIl:s{E!u|cj@t՟7[_`"\ .H"~oȶˤ7nȑBի-ݼiu~W3 ص X[F [8ۤTG5*ta?fE?99܆h/0mk nnnm?l4q)sr<=7;YYYd3qT*֤d2΍-1 IDATI6{'S,>ٯ>;?UVL&"kWT_͟V֭[^~3 jDBC pl@swwom|*TNN#,0d0Lf2p81:vֹs1Ub,,RmlL&K&?LNvsw;}CDsΉݻ·rxhxt:],E/_npG?~(tصz1&8Qw;Qt::RY1"bηp0#&zc,\ F޺}pa@z"4M,K&l kr$)J9&Ƞ70HblmmJ\.W p8l\&j5I !4j52Zrx#0r9eim`2$AH%D/ޘ7 Z) 7荁S29)$X, zc1K%Ao 7`Ip/~`FEj c2t:x??x@&/Ch4ȿvMzc\ph4NNVV!9BRZZPfL-4Mw߷ofXjw'ޘfA\.oӶA E|'aH(!CFf˵t,5JpI zc,d23AJha\syo$ɣV>66U|{{{Tjt ANQS2Q$R)A Yk>Jnf>`]y}K}g/\]Wa+94N<w)K.5+VmQM'%acۥII/l, oW.i j =Nb&\Krxr}>}`.P-ƶjѶGj?[Sz=?311KAnIQ#I6l[߿GQb8/Ν9s/1נ7LI oAAώ]508dҥ"'b {'3&k[ԸO_ޚw\GT>T^}QFhZs7m͗[4y+{fnۜ,^pY#o\ !v1fٚo?|}~~a_ȵy XReJajA2/3 ؿנ rԯ7@{G힬|axg  >kUlJ6]"{@92͑#]`ymoͪUفEc? 5hBx8nQs1M1syVk Kn Rr۱q$C1׽vNۂ1;FlEG!B"4ÙMYj4Rzz[30S>kuXBqEeddwźwbF?󳵭ݤ3 t 8"h&p#)0' :6V BnuB5ط6tA^2&D9ӎWTc69ԙ뷩G CnG7Ci4˯- mƭ?0;r |>}vيv:wǍEþR}BX7ًS}P}oJ̡0_r* Е˲ ̡Q\B?\RV=F- cMj$Ű3{Ӊ 5V׺eʯ'!j .=_~υ N,]>o$]>.p (FPT(RTy`򙙙AJ/d2΍kYϏ~:9aʯ87%ud돇g46Eڜ]Lʩk6Դ4K1kkW.ѱ_ů* soo їsZ7`gr8qq OɉM' Fgff2 U2t 7['oǤg#$)~qc;.54*--?U,6׿Ftp͇9X`Y4$?Zs=LL.࡛f~(EkFBr/V }Ѫ[S+^^^z܈rxhxt:],D/]npG):::E":Z rᚥx3g94f/L\YcaCr8[hAerL.}GX9Ao uuqhXjj[  NNN\/@dogPX,Y,Ii$I**{{{KȠ70HblmmJ#!r97]ri4L.7 yl:!7&WW{Fq\cmp; 1`^J9qe1K%Ao 7`I$X, zcEQAhZKb2t:_=yڜ]fܕ3]0 +{S)TT( !x5FUTe1`)")í!;;{ڵ9(vDk"wksvw{I(_1_O_#>=-_P`G~ 5 HãN'00 0dP׊lumklFB!DQ[|]^R7fuoժ;2Jtˀڶkav>?joJʤWx5 Q(oJP7T:N!D韣d.(3g}jSBl>O@ᒜnϷn1>UMZ(`~쑍֘Y׫n0%(&mM=kW6WQ!}+ɉsd!D/{.,Dd7h(:w4fwDREV&8:8 2Q" 7GS19da}{di [1VxDڜ]#,5KÇ}{ҵyb>Ls]^>KO? 5hBټM<`첋xǦ88240hmd$z6gȰT{!!}pto7v ҇if!yNm:X1T6IH@]z؞[IgXcᣘ^3#, Mjmuif( EI{ZNjMAИv/Xz}y߷o}IVNHr=Vɀ0/G)j˦sEK;ԯMEWbv>{2Zctc!FݪNşQ_mMUYEXGVNbA{[8=ؤ-1s'(}_0mag%.%׏+_.W'qxe7|Y3ڑ]^r|ͅ|j]Y=$\=Axw 4 M'kq:~VFDZtۤC&%%%%%0wPof}Wu7wv]6_LJ;2Ӌ֛hIsuH8ھGeHڋ꣆B'z;-6{dѻvﮜ}ǎ+ees(DQE/ϯؑ|3}}[#_,.R A3__1!Rro}I3¼t:iATҙ\E1NlKu_$ G!Bp/O8M rHew־OӱWOoktGZwXE-bq<> PXIn>(W]Rrhi}[p0uQ:[}B14^y[ nndXIߟ/I`O}TW5"!ӱh{=*>B;u׾C69j@^/P8qD￿p<ӧO_!4y>W j"1`F;IoHJI~0˹7o$]KxawO.FUw)FCnriC>[_9snd)*賮4I+D+ ;v G!_-Q{ !ȥ TQʌk۟䕚*V7BD39M#&߆!h FIȻDYnM%X]xld@4kE}O -r{}BDIҺ9[a 5}mjC/ q.۶%燖YDp8]ncgâپKTf/Q TĂ-"j%ƒQ)V,BkbňĆHqAdEهGgΙ; !/`ˁ=QHĢђ#拺v/D|vӾȹfB ֎g7\y-Hf];WL-1-#.\:kD-Bb' ?MbG1I)&39cg >+ewBO;E_cU e#\ORJeDMe6"qkf@7KTX4>*bսzrttx႓+UJ!0nec;y K;}B oh 9yOZ^?M'chX{#GtV[ ZLűh9y֭ B*UA<;"XTgBzuߔC2=T!se Y4B*(ĤōXznw\ yL0*XC߆LY16EgUh>Bgq+xEƈ\6op6~RgKGLVGnˆ",uεcy;3&Is22S܊2EWG,]ڲe+gg֭[ѨuG0+% Akq"iZ>?|)8F,S Yn!iĕ9~r]B_> IDATBU!µÈS!+Ek78xk5m:~0[=I=Mټ-J/Q +?Xg4Mtɯw01PD߳ZmS/'7.ħroc0?CpmzO[5A- @I0OEO/dc$)d2s7nR>}`_C&Q1a9c(@@6B(֪U 8GGG>D*PPh`n{ Lz Fpd2dzV*xPP(H$Pu Lz BP(e^)IaO@D [/dc |V ?&dn&Jfn;{`H)A6`Jdc)A6`J12ajEQIL8ƀ$[ iZ;8XZZ!0A_z:qfEdxdn*a&M1 P:D"?|p_*$ip Q&I,5ZPaRaX@ihD5޼N4u8x$)nh--4Z0\.oڴR@pQlmI24MpO%|MFѨvraX}gܠl6e0o6e>>EUAang^Ӯf YJjY1BN9N#1EHժT*+^+ W$a#\ژOS=|xή:A6eQ^| (G_MUOArqץ HkaGsw!1q$Ck"$ΝF/DR:éw]̫()Km(ui[w+X9v1Mheb\FI051`DR233SN8yZ!kk׮?zRLDUU+Qf̨GTD~ͺzjU{~g&7%nbS<ҢOA )痢#x]2{kfn|kwo1KMKT샌sƀQM*UҀy}|i5¹Ø%+e`,ط9S4Ezݽxo]N 9.ͳ} ٹK߯O }LYQʇ!<*vuk!;{ g{M:{Ѹ>]}&{ 揿2s{2e~Gvo֘(XE}<*Xp5"cD)u=-xFFl3c]'b03nnڻ-[s-FQ->{݋Ypfݻvl@6#7|B&_sZS'uzDVD]1X䵨LmgQPsNh+]7GȬcE{]<8Wʾ0w3ʋ;07Dtŧ,xlWҳg_47+|~[-:.vٝμ,D'ö:chUgRiجsT_yԺ~屲U6pGЉ%"D7ضtȃdQT:;\vv~zeZ)ŝWZ,b0f?Wvv`0" Ji!o,kͅ1wo2%f3U1t۷liG 0C6_s6qߜ7'3q; 6Pȉ;ʍFf:R0˾9pNTѱ/èyNN`````ΰ۶o \47/ Ǡ=Ƅ18u}oRS G~?|bጙ35jX BZ簚 RLHzGs%M[p1f3wޱfNzb)+GS͸դyJ9iڬ}l&}]ٴMߟ0 'la{{YeJSc6o'(ւaN/C>2!rŊ3N#sMh(BhԩbOc=FqZ_7?o5yHHԻO:wcV|C Ҷ{["MZƯ9lܑ-d!ĵn/r(tű2ã1֪xhiv놰i=&{ ;vѫey]Z8[ 7;Q\;wW<׾H凵.m|/[I!Mf$)L-1Elne&9+!DzF#7[ @]<)v㋉9M}v'R(t-R$h$<ǦXOv \OP9>r-х`A!FVU|ϭA*7`Pi8"z %\_b0C$]O WȝFR#eK맡ju4м 6vsa=Qe#mu75fEut\}[9JXy`:=^ssz-.0R$qٚ6 !Hȡ.!դΪV/\w'' J(3ll'OYޞasO >DyO9t6:Ί|+!S R vᩊXwWQ'ôRÒbԾIBdLsyuOj R ǢPF>StV̡MYLi1s,Z wۥgjμ{;-'4غ\AU=u _V%r-!I5Ϯ~ $9JjW+qU%Y-kXFF2aq]9Wh^]ݶ9d˞4|+ze? ˦1boݸLaz|̰5'rN/>A#$I{hQN"u?,ajTa?UoQ%ak hK[lܺu4fƀ1;7/boVG!9"~oޞ$Apvݦl^[SEA!ߪea)n"$ƻ+ֽ ;HΑz)]BYw^}1`}[~>ƈ],iAv c a\r1&8͎Yl1LZ gh#4pggM5,P޿4%ͭb4[.ե~Ξ^J־-y,_uZVbPn\VYG/MruoZs02:"SWJ6PH*ePcɕHO!o $897Mvr4!a'1Eq9fp=zX--KN4kMʼ'.Zcsw4M%ˬ~#@#B,=J,keNQ88%\_جkF-|(2wLO,Lg(mCif4<"UVņܹs$|JDtO DQ@6*I2L&?wqF..5d2Yyw_yXzn:sqz|NE,@U{ LȬzdc| ~P U&AѷKY"t J0ȤRTzܹƍ;:"WÇ:Ԩ!JU1wOp82X[+Ue[(H$@`(PaBVZ86:Q`BCMл 1`,AB@P敒A@@@6 2-gQ`Bol d涳fތ`Jdc)A6`Jdc*ƘaVk@^E$i>τl M 05BcL5쬬שx<kY>I7IV+bkҬ0 EzI$iߗJ%$I:ƀq4ItMX"kN*&''ǡf-aJciZ$ppx@6]D+2GPdF*aY\޴J+͞F{,Hoj{*Aolmm5 FؐO~  =g)a'|SU<ϼBilF]eZ(xͻݽ:jU_p  Ee eU*Fe1?,BVRw@+l06lZQE6z$8ݣ{q'aU06mJiw!){\2U`'uk׃.uUpҋ?2*Õ`ݖ#!$kvfgki$or߁gv22(OU1`D!CӱGth)Ol]>}-[ *#F cFm@ Hn5 YL^J6aƸIOy7*(!,m!MAcOok)y!s@pT2D%6 ka}la.دW>#N;g>:w7i٩uh?ӳkI!'_hҾ?Qʇ!-U1U2ز?t~Όoo=rc|z'%lߑ]?֘nY:Jk"7TҦ ;߼7/Bae7o ۧO>)5}gׂ]=={ KͻֻLpk*k-m _O'^3z~O>E0jt\0Q/N:%UR0_#a#{zz koKkW46iƭl^czhux0< 9`<64K#o4iSb}Ʃѐcq޽{b-Yv]Tƀq~ `:[R^4ۋ;b;uЩ, JvNvAG/]vߙXt@.{nP݇%FdB([da2ͺ87L9 +' ndȍ;g埗fmMg]|`Z(7=ls;dY}6.e AetWdY%s>FY&OG86rwWnOwe @yԬ1u)EdCbE_ʸyŢB%07fSg Hö<}`^Өb\5l!f^fb見o_:(}uQu/is 1Ϗ- M]1KǠ:]7&Īz}99; n۾=$$$pܼw1`L8)\B{ZyHdF, N"p[w"eߥc=K.r8[zqm;< w=)(aBlv3zIRT4O|sU~0.'vIq+H DCYp.^,F3`VO97EY}6+`\$ej ' ~&+kʭfV߫HY2P*RS(p05%v F ioYV[G݇lf;[O!E{h#L2)_IrVs z?|*I~~~+V9ua|kBCBSND\7rU ZZ͵I[EϷX6imsF!עfg&R?Qv&ae±QOkUv4iv]7|&{ ;vQJ&/9KdՈ#32QTJ ^S(5"Bfn8)Yg/8z|kw&g*ee@֬Ҋq %](8+JS<Uon~I++M̊ ~Y - jxoru1 Dćr/Z$++!B^feeӣJUp`aV1`L81oxP>;wW<׾HW凵_8?׶\Btvn%"4YIJH3WĴٿ-~dBcelވ<߁*x=S ENY%;}lB~w ׫- %nN0k B14[lK޼Oɯjٜd&*yN[2~&P~kVŸ@?t姐?+$Sjq*ʮ)m1)#lr$V#6 k|˺Y#]M5R*VZpA\\ G" IDAT6lR>ӌ6.Fdi~9t֖:ΊwB@*?U=ݷSKg=лNi%21}q#"3ɘ/r׭Rcxyq,ZNhux9J{|skHlLV.-+qV*1x OĤӚWx--}|V7=|ŧ*Έ޷Q"?>L\,Cq?t姐nI+#J>.NŔYSʘl瑾Sq4FͣW)1lU?E6\1Ah5Lf\kkG,]ڲe+gg֭[Ѩ+ߩЄcоGߞIݣM |iҮo{BKK& 4zd^Y' tv޳ cEC:8S $GL:HTH+k7qj$5눊͆k:xTv u3|S<.GԸ(/^wҷχHA+XA6ϤW?0e@1."/J(?)ia3gIed}W8UҦm0B#Ǫk.MU!}C3#C_wHAF3@NF̩ EƘpf7;**˫ fOy5MU ];k 7mf԰@zxӔw7MNtrrr7ooyvZ]}KTZAk\+PS SN /Y)lTJ%M7FA$/Pܧ(/~/H+...B%IGA0 ILLTt'Eq9yS"f߷4x@g #ͩsF4MZ. Hܼ\@HE >_,(جk3U2x` Q*(2^$IL&Iϟ;׸QcgWǏX5d2IV@TIOO*TKMUV Hgf@Z,k ;3Lx&@# j"8DZѥ,Jj:8tp ~MyD  Fpd2dzV?û@ H9@@@6 P(ʼR r2^ƀqA~ LMv̙ō-L 1Sl 0%L 1S c0V5u @/H4gA6&jTM !1&_PvVW<5D,$Û$sP1 5i֌a"$~K$Mdc8t$&I,5ZP0JԱ4-j88I}eiiip I e#ZZ(2Z\.o RfOV=d$75=7I#l'VreM~Ѧ 3\|gܠyUy× YVRkZc|"jU*56W$a#l$cÃ_xxyy\ϬL)BH/J^8! Tl#kA|ڍvwᡍPf*w}ct߿y?Uŵpm3`|]фOU1`D!CӱFӦ^>\֔_vΖ50$ =5džBڔ1?؋!sscV[1qѭ - EΖT\Тcg/gz՗1n ql kR{ #N)}!}_ !2蒱}uoҲS)jlHSBg=:)rhջ%W(x䷷gzvcоFe2Ð0@<`1R??xJ<{>-Il7q*'BcrXy>sycmi^=Jˮ~2V1ޢ=W`L_eJv_hooAc6/1=yx:PEk642b[:lvSw/f!ewn~JA6SQ;2m7әq>6d<Ǿz|[LpC>J#Ĥ]_rrʮ W(=w!u3pnr@WN[qKv'#Q\|`AӻLP2zPvW4zCNvAG/]vߙ.oZhjǯ)ȸ7ضtGK-0# }[]jp :BhDl7d>?04wŜ6ֵz #scoޣ 7pj[w|-=qa0y.޾}eM3=*3'v̞+7~?K/Ҫʏ<''00000pgXXm۷.]g~jAc 2FxbpKCw_W^d ;դ8dREKwXϒˡ:򖾺#p?W2NY1l}ݽõj9bVkK!옽1gvnidbYUHR6ȽpZBC4%Õ86jdQ5Bmz9\cx]:L]0@5GۼKɣsGv7ybkyTg0#9 ԑcFRĵn[9 /Z0U{`<ӳ|&mY%sl fvc3MәOPVkgAc63zo'搢_~ۍr4EFH>yd K*VUUI~~~+V9ua|kBCBSNDw4 ?(m4?J} K8t?z堉5B?U﨤]O^={ F~#|j!B58dk5mu,u-HA+XA6v@oSפ]V( #Lv)ApMA˓z=g.@6Z qbrópnY.B6_1za3$GL:X^:(h6?Yͳ|Qsdm5O-.tfdȒki=?|~5Hp\GrH0Bd+hr޵v#Uנk]BB,jɂt K:1&8͎YS^Jbٵz!PBBs͌\{ViNNN흝V ?11KTZm#( ׯ]sss5qF^]]~c9_8_X6}* jJ}on۳-vrF$I>_R)OQ_@ JW"#]\\*q?$U}c(HPǩ5UML'IӴQh&e^ܳnZ+~X{]zaq]pÃ$ gI|'uw)_U| ixl T> D"у{E"q Errs߿L&xe}gKP2\ۆVΨ/ Z[.qxttt٬kߎ^Pe/-df.@٩a3L<[Ylp&+z˷?})=fڨGQ {l T>$e2T&=w\F]]J?GckԐd$ikDž眪_.&uñxZi=Z "m& ]ZP1&(1`BVZ8vYT*qpp z"2y/@1p82X[+Ue<[(H$@`(Pa:&dnc!B( 2$0'\̭1`\i>+2}dc@%3=0sfqc'g 1Sl 0%L 1Sl 0%x+PryBBBp8A`1bBL&3o *MnnnRSG'' SN~"HLGl 4ԯ_v"Ա| D"y%dc(  k֬)JMgA*֬Y3#=ԁ|,@%Ӧ 3\|gy?"ɠW*D" KKSG Ѭ>;m۾go ɟ>nF9NGXnuIXӹпEx6wB1_.u\\:l4dg*s56%l7Z\' H0Yh X׏~sgͭ8cM T@ڔ^`bYUHR6Ƚp♺V#lƭi(%IIa?b/D$+BϜƊ:kuLHZe=c6u$6**Bdwae±Qj*^;:[8!+j#;pM6cΈ:F70yY=Y^[ 5q V#tΓ =-?fhiFJj_/U^A`FwaLc!B8kš714^SB(o @3WĴXvUrysĩ }Rz"99!5Jp%2=m ~R))v2ߟT=J(ݱ^ ٤xS:A!i%21}q="}<}L-&HD/vS_!&+I^/ch߶^LQtFsaݪǺ㬶i+(FU޻z!YipiqRӴ-"*^ذ/Q.D]e۟w219v̪͡oS?Pٸv80^݇tUvs{*DYtd·kuSQIANl]3]P9/m7?m2~J$k>gQpmߓ$pjTvfBXJƬn㜧YZߺn;F9Re!bٵz !!ٹqfF T=MIqws4M'''wVy)|Nrr4h@QUV'@*^tqqr+3+I<~? TeYUeS * Irh"DӦɹΧAϰjh&8pPix<^NNpA;HQ}X|^y1(JhR)I‹#aZUz(fef:B%^PoBp)} %:!\^JT co 0%L 1Sl 0%L 1Sl 0%L 1Sl 0%L 1Sl 0%L 1Sl ώ\.OHLR( 1V_P pwsɤgŲln*U*777ic|SH$U5m*q T Roׯ_vmHdX&B!H^|H5m*q T RBf͚Ri?T;Rf͚?+3owuرM6^[jUT)L{IXӹп0YU<ՔH$kׯ cǎn]@Հl T=6StңoW_ϠҦ sڂzocӳcv:yyyzyyð;yyyyu;~с<ր2A>Kꏀ};4rSǽAn|S :Nu4Bzꔼ<+++++iӾV*F[JPpn{&ВP>! ֕:b.<}d$N0IDATE!)ac_xpMs1/xp0߰ge aI[A!HC Ve[vcEFT Mx`C~BauƑ20LHpR_ٝ|YȒ8jT- N8{K.BȡW/{p.B1VRҢO'˜{JY?|ڠ]g9_#{c阽c~w-MhA!M{b[ɼ~r/6h7t)lv[qqocWZ:i˔-q{"6lj&nWfK?{ozpsqv߬ 꼘yCɹgPb4]'ΞнH$?jۉo޼vqqY8|Ĉ:;;z*@6תEsU~=~ MsZwo|tLS (,isk0 bnۥإkeak\Awo8vܖ^Mi0&?Q$8Edд+]c_O͙v~k[ql#Bysrͪ1w_DA|.>LJos? ?oow&-Bͫgu~j(̞y1м|%ǡ=_խۨݠ{沥MZQyyyQW" ޲e+P6m T$dcs7 ]3oTSV~.u|Xw;v|B8zO߲.y}45駠)]HѼ:p&l9B:[T<ɓ'!/.?&\//_A6Llݝtl -Ǹ.{j:| r-޻ǦH߰!t/'m; _ɲSkb H~dA!o+n q%2ǣ7.ӯWtgctG{=S&Zu5.">je6N:gC^$T ~D53f\~}pP Bhȑ副L%jt편xA{zhF{;{V nܸlDmJ\>bAglv>^ ĪߺBURAZQۻ&gf2ڤ " \+BYD/ .((WlWܐEh * eIs~LN&!s<43srm9gf-[zzB#77w۶m'N:p^3mZ*S7j{nMiG@KK9tԩ[4nvI233{&%9AyJhB};P%˕nT~e9qc_IOOwڲeY Wh4Z۷'$$t5v2m.T\ p*տ)hƷ!1>>cǎoO/T$&L$Ijj@>Zc^cǎ=*|yJm|G)7xudu~?T>J/E5L%[k" G;EQvr\Ѻ"pӪaxYG&/{`:pA6%dcZB6%dcZB6%dcZB6%dcZB6`znh8N'I2e2uuMTeNq\/( cB@a1JyAPc@(cT@b1xN%8xPuE4yTfx)e DQ*tn (^fc$I\aBc8_ !9W:t:uT ʯ999gNR`+AQțydY.wH%Ћ%b́fATZTeZ"?7XAAAYJ$\~ӧ"""TZKI Ȳ^*<%I٬(Ԕp<(ڱv{atƦZ, d;~0,05%\J(v(c/:l%PB\t:(~@hw=B( ~J{AKAWX|I?|H%ř |i?,h)SCx geW]3PK걾S-}%k~eKSPaJکs{{<:E,': ض]C~頊迣%e ^Xag9 ػV6⢇nݳg//ʽBS:8뎔CY߭hKř&Ѻ_+v]ؠUM'}\aGV65i +Rޡ.yں9mlqi2{c-_>gp#ӂH\{kpßL^{6Nj[/ʄBl\ܱ{ϒ7u&_9Zm_7~~Or]٘<_GHXR<hKF>?_0^07bOc);+4yM~O#'FwZ|sҡlyاmMO4j9WUt=ݗdFSW1}$Ag ԂVE$I(?Qgn`t-r1mz:Vտy ,(΅57IK"RNju?yo[.Rg%Ψ.:g塨g^y焈mJ('|-ǍEMKKG2v"{$gU»ed]dȒfa+ ^lR(u{MgG*٠ULw/OLw?y{2 z|<ۗ!=̬0Hd-tf980B#cƓѶ^@{3řXa]fk;־m關])a1=,r}O> {UN_?oSz_8{ӟwOXY5kTUB+{ͷ7lXaÆ k&7hӯnӈ6:-5hIuD?cEm^zcWN?_jι۟76ogflҼV}G^Ҝ1oNuFg' T]Y;?r79nLTGsbӼCSugBY,7{(eW?ԨHoGKJZ ȗ~^vGkJ&EnɴhTuU]Ox'n*Q@"=Etr9^3傓w?fter k=|>KXjh{SB{U?K&+b{z4ihҽlXeI{ko?['_-ᢂ=5\C@r67;LտB$IIqzre~8h؞76~|u̙B( ݚݣԫTAnhיφ\-+U TIsKHk&=uTA *)=J>^D,&G%i"tR]Zr` jGR]5/!TU6[)Qt E˒%Y4\`:"XT7ői?UpK$\k`TQU:(]ǽ?[GhP }Xr/,:)#֎IYc5mJp2.̓ ۈR3 R@Tp)P@,ծMlq]KTsQX7dN dTћ1F@aR)(xyVNNNNNN7m?  rsrb@pxv8 ZNĆBP0s>X+aBP֦^pQKF,wQҪE%AM=^[YR+lcs^.]PHkylFںu͛@ވѡ3vB\//p\j' CE8Ĵs`$ ⚡呦W Od<$t \P#7Œ]hCN ܘbA765c{EZal E`$1c36"rORj)@ja(,4! #@AmO0g˜)u UTm"ĮN@ (x'b谝b}r,;PU+J:CXo!+OHS 7YJQgK. CCSSO i,CRR^dK*U^pQTevl.icȕ [?8s%{TP%zqw-zee?YӺuVZOfgeܣڵki޼Q&]7C;vT7U"ʵ3&>O\6>;mdO=#_ٰ;1U* !0А4@C!ji#DX&Ch jiкBY!0~ 2 Z6S1>"vbB1b'hA.SVY;-%YadT^h @ /:"g)+`pֲ.<؋[=vEmLcO`)ͩ_dlphRL6}bb9$yԁB"A@QHwM Jc_HAqchkcƌ ˋD(}W96RlM>Ǭ.kyEŞ={ 'u?_)h,_Ü Wx߫, |w}Λ9߹{<{ 3 u'ތΣsA' } FF?u/jQ\#8M& |+,][L_L"B"X@ Տ4UHNZ):BK]i[,èv,Gf2%We[qєz@8ECMׂ5ع+E  ND' kT4~pRck؜L!fbbHcK83sñU3CxΡYN׸hշC⨝;5<< G9'x7^7n܍7ÀC&Iƍt>aбcǾK/4;B(ŖTCjb\jb\Vjg?֥I&'@Fb=^oEyybbbFfaWWW]g>3s6a»^d̽oE^I֕f\-yݵFNŭp!y\'vaηfZôbN%6:+iN](ubVʏ1@+BDYH8]>E \l͕j_J-{!!ɽHZ$_Jq&fRAvHaHM(ZM@) :j[AAZo:i [}bYd n& Q'4#U| ļ2_;\oƗH;iٜ#DU#g*GѩD&R)G WH*@$uR!EG8cT$u/^#8p•mEm Ĩpz{ evQ~\V$vS+ ŭ1IxIU|N#Bp%H$A:RK}[xLS6bH%[3hǦ!; {s TxҜ& J L" !]_$ ?Dոqn^^~f͚5k֭ޚc,=R/x饗+\^0Vg̴1cƬXbŊ}1bFa bNߺUvo2;#Tx2~m/!>8ox#$` j y2OW^<@d͜ݶ*1/ P,Zo;:ߐ92$a)ENl5R1R|۹X5R> T(r0b$1Y$*Ha-(RLo#sM6FVuz8?KR$TsAlSCseSa-簂Xʼn}=#xlƦ.Q<(ͬEp-Ԃ`w$pRFќ0-ji wl:Z"8<7w }yf%[:rGRوHt%J {W := UQ@IZlfsHca+P*:(qSA=PC^l6-cTE7̿;Lvu޿X&>!ֿM8F{8z*D+ޕ:ZaR d s+_uʨ 'Bptbakq,A st^Ŭ3h^HJuNsf80ޖ:DD4d j'm\%W FFw&G2L_5rBYwjž1[BoD 'p@6c!F2|o&Ԕ-mqnl!YUG5_+/bp$QF~ann./8rȡ Chܹs̹曇>iӧ=zE£Xc|jt缌yv*_֟&cL>@0YP|֭;tpb]5JȈG#[]qq5=]_?iHi1*e9Y|r7 " _ȩ넙m&FId"Ĩ6rV@l E;](_ 8f9MãX%[(DS4#Zm+c80IQF'# $jН;>Is!i\N輇8pprJHנ0U7 CuRP۔eS%hR\m>gR[ٔ=8[ӅY#'5kzj۶m ̓RdgeR<`޽{Μ97t]dB#/RK/ 2$777e" :6L?mr~[d?%iD'23K7'biӉlTVq%i.ʳ YbDmEFspjhԲ*[#eNlvñ rQ+F$D?Ʃ Uwn'bc6R(R(EAGf_Ob˴"X6ގZAJb[lM ,BWC=TLtb3x-Rb#'`(ƝOt^g!6Jy Vd D9 \6F zو; KRK!bNv[b3 )+4_\lਣ է2k=m7i͎/m )'$t~Ww|~A~bB}֭wJ֭Z˟m1Tr*%Gf_X腬&'VCmJPЄ =e[xdN RZ(+"R!7:9!&3\9:w!%B A.r`T06ŽB Bx U{uHV)"LTV2l6i^T Gjioi ^pQWIn}k]ںkWPZjZZbbŋ-ڶuaiii555-ZѳgV,_S]- &Y6';*pfk[rdR[qJ{W߼+2@mਣ Ջ2i~#WcJO<8fNi5'^=ϒ)M,cYǯlsMxsK !Td-R!XPƦ*QL/!P+r0D"V!11CFb`DeCvYTH 6II%`FrMDU+)];A .F+tKԻ+5$ZJ:Hu19\\P9ak+Yι]56~%UbQ;μCY=d}"> q`p@]!OYviNC׎0*M| ?:Ϡm))s*dxLqU)LJr@\H8l#JTHfaK ̹:aj9SB;*/c,D"Ө /+^Qxɵ_f{,eZ@*'`K=S,²=9kZ˙ljU 70eP"E4c*Ak`xֱG Gr;C"NPYW`a\!rU!XQBl>/k(:ʛIQ;q.ӚXO09L@] j-|-卨^'!l&awKVV q2?F1 ]v+!}ǯ Χy7|^eMFʈfIax=E!g;dCdͪ`/vTI5K+s/jQ)Ev,0&Ya >.SV 0YQKE}YCpgiђNOJ?=!DZ۴׷^|gD2J &HW}GësP|JatL<\{}dG*Ý8BG`Kܫꦗ{B՘ίz*4f6F\bfʔׄg,Oq@477eYzwImXt߳׀s{niIofnݿ|i=zu OV1߾*]5}C6L3|5vظoJ g>KR {頧P٪9w ܧg\;a-2ֿNӫWS_p~ErTDs ߠR?Ϻ`Иs!}|Be=+CiWcϸ[3guݒhG9M>0ֽq﨡{ nciHk6иwhg?p[soiN!tϯ;ƆwUh?fdζw_O-']^:oh`^CzauKO~'8ϲuE{ԣߙW~ X8fXWlz^ R3~zc-wW&s1@B L|XN9pl6$یs|kڣGNphyG a 7//aܼ\+c{sv3~g&ng+FZ "ҁ^J{Vr*UXO5UhXGU F1:^)yԗ`0W[p޸?ىQb LEn_-aѻ7JJ68us#!z<ǝjYoPaM5{z3ꥯ||lM>tܗ\O-[ύۛʦ6Unxsߐ'>Y9TxM쨦g 8!PC3}jt7ͮ=O/s̸}چjs>!O~كs`~Sg;̙bHkJfW{trwO] yڟ0*6}lλt 2ym_2.壏w(`wߵWU8cc % WZ&&&3Κ_ϣM(] 3k.xe?|5nyn] /B)PkgOc>~M>0^̕aÆS|?6w}RjXg$#ZX?YNͦ9W??Zi_+߻aGƞv?W8o{iaA|wz*)+i;Ec ׯ8ۼWO;>4B%ٲۋ+|A#+߳a;k&ϺlwW HuJgL9NUvGCm[@ s9 j P.GޒNNvU@PY1:T'TS↡ݧPk^^ꛆNzSۜu}cj뤠]W>/{oysC9i'e#'iF8r }߿YwMЭs'szt_vbx%j}WxhA*e17k9;U~cm71jwoݶ:u| zz{ٗO}{ ࠌobϔmE͓xv{Cq/ip s7a4%%z}C1c/%:(Yڿ>5jr1l_S(5PZ)'{q -Ҡl1~ozL"9y'7b?/yX$O|ɗybM_t;i]'VZ,Xẍ:ЁEO~]㳧Hzۼ㧞LkXD*[ϭ@6YoLT~<{c!/=,} Pߎw}Ytħg~=D`7OՏLm(Y _0{҈f T8Ub<'bVm 0)WgW`+N$Pf#TR5b PW.aW-fbZlkT F9W)bV۹ؓ_DgUPնe^xVJU]*ц᱄Vq$ZO)Ft5Z/|kO8Rw4-'Vn_]NY1vvvoimd<m-Ibvdc:'oiL,z)?/m7yi 0Z,qビ2,OsWҴgzƓ#h8;/iTo;X ۊ&5!B|FAZw\Ftm{/37>5uhϷ9Ok%Rs<$>c Յ6#*ݻ( UU̶f:$NoSW\/.,=Ki{n=Ze'njguK, nyѕ?@r w(ڧ:-sɉlgLn\:Ȝcz }֡Ok<^98O;k%eH}/"_yO&/8 e>jjʦ[;#EOV'ihU6{u+!XqkUspFY' lhm>剧' @.@W l&2;tJ_agI?lnkm8H9ןEOk9gb؃Ps&H:4.UxۢX);p޶R)Gb8yd n5jijU-_y+R2Kդ_=e?Woj~*-T-ASb̸ſvus9rмo.̗|5yMӏxiه{NJfF`t5 S%4p͔@o}{}Z$4~VϾ;; YWϐ|VɦY#Y~IM6<Ɨ5K&$]ߤXqpwRy (rÞCJPERӠ|cy{z>7R3JjVIrxC]NySg0eCroā?''P-5RWh=7w]T\\(,^kMa~(( +fK~V:!Gx hm" V HDM@OLh48aR $ɷ?By4jkCLN?sH`lDF :@Mr (y]r2"oBAW'JRAsCXu+RGƛdTyP%.'R27?,.r|9S3 o }F7YyPIR^RtKm#fg^*oIb4o SqMn)ǜqXo扗/?:s 9JW~æ%䴔ĺDaE?}Y *@ʯo65Le2',`_P|`_<_$i9?{iHB^U$:Xk rPJ N޺i w ߁?4`9 _l1eȹ Ne5]%szY_V^ tn /HxO7V(V̵vӾVkKW-H9`( ݳg޽ٻw}{۷[o/p|o߾}}]\\l Q~acqB1C*A+g ˓B ,U(@1~>_wxq&,bՁRJk6< zcߏz*j: IDAT{' oxC/mqG,dt[^8jw6' he9My!LNZ*QZ۱*G\*9Pn.1p;![x-1?Nzx~֛}ʃϕ=N[ 8:Ovrۻ3CF2Өٗ"\".է%<?b| PΦ66I95ӆ5O=?>n䚸gܵ3}_oplK'oY@,oܰÐ[^.IIw^2 FNf?#VtPV yֳu8sR MMnlJ8`cDBC{x^wQsFlniЩSwOy|IqϾk['BtN]A'ܚ Ú0bP/ֿ`kQF˼'>33[ N})ޤBZ-sC[S۝~s׵Iđ*X JK)m5Cn,fjh&LUeл6:ʣׂkRձ@$9\] '\{Y$q1(@BI B±}x$P|P+xS<Vz+fGx+nEh;eSQHlq-ߴ؇zK?8`\i QrܔzY]fEO!p>CjsTtE~P] \Ug:YHqݰN_c??}^SO0rlMb# 9MlS?`f&̲REp! ǷvNtKu`̋ƮnB8A&M\4ܷwηmx 0&n9ݵV-K?%eYeMFٚ }bop*>^ l~ƀCO޷UR}2߾+|yHfqPnY)?Ɂ .w }ܬo)E4=쌻&_މꃏR䧐ƅ=>v}Oz!HOG&?ӑM$ }KlB@ =w=H1(+@PǾŬ-7:08JpS e[N]D$䪲(FG!XlbTO=V:c_ 6QDC+eV ½<ڿ H@uFC2ٽҨ2郯zP!JHyu\&n3͉[D)Pr.C)2IcN[gn8Y(7ͯTmk {$7풕ďTS3<%>5+?a`$?6Ihb+.8g1͜0r'iY˵A"??@|ν`o/Cj0RpbhPec֊#2L鰡ؖuJRY)(*:\d;yDG9F^%]-i4C[kΕ+8anbt4S(sR?\OʄVT4Gvth'b!/h)N`_0m4251^6լcǎNjZ,D= @ػg7Xs&peB4IUdD- .EyESk 6F1::Qp|(b6F! BӱC Ee%ɒLZi"GFВX e?cgnO s 8_է <_PRlJ=J*nei̔=Op3-(@= j)AUnCGzB@2\+ԁ!kfdu;Q,!` hA7K,D\AD_Մ\aXD-:{#咠`-[1=wQ( me{/"Hษn깔SY`h2;7 -(8vtб`T@Ie: ;B@vP;D+6 !W)N=Ǣ P+ IbmSLm>rqS vV~ŒQ$C{c?{CIsv<>G=<*`űOpJy}͂`-м,+Efц,)geIEPW~% 4ȭ#X$&pER$(8f9q,I+lM*|a)xC-@ya*|dϑ ur<2 ZE~je>rXMDºY ro|Xi Vȸ(%1c(F%bc%`¹c I&BJf.1Z$5Dqilt7Epv$^%֥E~UB"CNBvWus¾RW |ᑀt7gjK!HuO|M`,NB*u8}a DB1P (Fj4*ǵJbY&9,;,r7S*JvP Jjh=XAaV@u5~F?ԽM未KDVR8Q( bZ5F1gR ZD qq7ҟaA %rX&/)^+VWRe:{X BB%{s;斗y`Vxx)gJ :|Q:DjU&Emy U5>IMHcZj1;Gf_ C\\Cl1Q’Ty=tx<~8$FGw[De0 %|, E&?Y*q:C0VPX-H1x<>_KiRK2 WK<~)#9JզC$@EDO'O#UkьR a~C̻TX+4!k1Ѐp:)2j"Jb%9뫭ݸqC.Bߕ<^lO3(Qp'HinD\Y*"\""íy%\j|bE*j.OC?^_[ *_CTngFа_Q6i_A儷"L +P2AH@ĚXV-&3؏QDL,XNݎ&JzM)1џD2MLJܥkbRRuU՟ПE^{=Ik[D#RFgŚJPQ$ BpzUZKHX/4  *bz#4uX>֗yӦd8CI' z;3/Boa-8x5qʡPT2 r"$ z9Ϟ_ nV, Iا|Ҽ{Mz&5jԨEZڀ7qՅjF&>6#{3zB͂/hO ׼uO)eƠnnO4}hǯx_޴6sʇv(H,N6/rÇS>7AC:hRS7wE.+{/uФatQ*㔮 Zc\_ |#a kq^Ѧ#<]>SH{w;ɺ:oJOFUo0޲"sL>gamRwnmݩ̶CZ'0~sxHHom ύ .rϤׂ3g'_6\v]wsIxѻ}:;h&=|hG)x:?V/s|3$x't3b /-P(+Ţ_zMs?mϼW-U{NC'!TI|mEǧz!u74%Ip்2=*ex=zU# g=1=ekg^}q-<2Cn:}ڸ/+eβ=a_^5zez"q$\;M!_<{~׋kL[F,(ܰ#+r'303Gרy \w>|]]լ7ѿaw"I?nxWr]-T@}ϰ1g䵫}Ůi+VMrr}w].UZJ-lxqnPʥv0Kbl&_(7m?m$Pv㔎U&*!6o#~;2"^y{ͻeAJ ˻%nzy=~WS:Fģ g)ҵUC66_>x`U_. 4'=9.ToS_son?cB+.$Xywۅ3w7M7TG!2xEu':>>|w Pl)բ1(DK"%&&֡_~fcSF d+TB>BϜ~-ٷ'i@~~AQwqQmvы,`[b{{Xލ^c4GQDEco(Ep׸(~?<}v_Ƨ`ysyB I&VcJeDEEzhKjk٬,.W+՜&ǃ@}:vĉpހ.,F2Pg9pBf wN:?rAM\K)YΦ &͋:o?fm]\W0C% t8x-V @ٷFy\ubV;~ vTِDZԧ;~2:oK-2كwwb5RcF"yXXDRI1OzS}1!ISfG;)/\y2  y'ߊad68sxuD=gj6. ! g'xseYu/WP)]/ՈSw=> IDAT( u]d9 ^][c0.DF@+~USȺuw+ٲKX"TGO bUT`BPٲ~?hHԜ^mV3!-EV!0BfF&sBTWH2;zĄa6օf(U>/_ ͛7yˣ.q<99u+<{VQ3):?uPzk"Ri"ܮ k$z[7$% pُ(9\ R8 y(VND)ۑϢST=G^wG%$2/ Z0j=gjAC~i|xI`݂Tͪk՛k1l d9J,KIX UMO7\HuuϪw jv:Lk :gOpBjBvN}O6Q}˚tF.nlϹ.E ͖/zQ4 *u1y!4U۬.a QJX>b6:::`K-dK[.{Z}Tst)EfSXR 깰5΂^ 8\.OLwy0lҤɽ{rqnfAܹQQQ ƋWݴfUׯ^r4UfM+mhxZUb!Ax8*Bb"g`P@[YtPG[۩uĒHq37}ZC(@yq9&=Gc녚=>{-Ef}^%\D`u;$ܥSe>;r[\](7B8߻́,v[Onuw(vn-iEk[Dl1$?Il/7#:Y_#Vq㓤%yz-['Z^@5#)l?EĿ(i)v_ MJ#e4NҸR8̙߫=|OfG}Ruϑ̀W*4UYY~N'P1A%駻,]ںU@U)):ЧV,$,, @WttbUrZ6!j9 66bbb Yc m nٗ⬭O&& +8n.Q*aV7=|3gc-_Oϩa5,piʋB\Ϭ{[fBnAhT!nQ?k)Ϛ,oҵb fb-ĔI+F!"?{hьaPs[COM+7rDhM Br @L! WaӀ˕2!J.Az^zme򝽋/V!SGmq˨XQPb۳h꭯P=>~o}̹e㧚Y=WrkDW^RSS$-KW3zz˖履YTl6M//Ok|φs%C rn_ `{y `Q8y?Z@彎IY9r\vΖ!W1aoI^ͪ UV P1 6xDD8,Yjt̛ Җ]7[A^ a# w&`$ AYBplU&8=`{h₍٫LI |M{ni s"Hcc(p " 0ʹmtqJ0O"`ڞWl6;EN5K#=ېuWߙ0pWmy'1xv<} Y3mryEU*u-#0Y}5{yO9ywԙ}Wb<'l)Cu)bBn )FoO( jB_,¥lYH'B=rsFq]^IMI;{}hKW3 B&^~=$%(1Mᗞvq31g n}}r `Wk7KFq7<> &SN.\JfƂL<\~eն8~S )wJXuRbM}_QbX*yrWc$nJ-#E5"EmBpu ;rp] 5 ;!k-yl9ܦhZ=ScL9v]k =V;aq h.7Pbߕ`[(m/g ?-7Fa ~&6>y&{n?Ӫ˫9eǟS͛TmF0^DhOl um XrlojnM5.{AJֲYN]R13mupX5/,{7;lOoLD^صen\-*›|=܏%:tn^FȚVV!.~F\./_ƫ4ָo ίTt_%L7*cER"|鲥ӧMGO+X b#٪NYEB|k4,#OF ^.#6Z}wB0 !~ K4So*q%ī Y-0 3܅⹲w";޾oElJ\7 od;/=(7jwrԤVVBgdcw(Cg.*Vc"Ɯ_ݣ~k_esIZ/_W^A:U1]hW*޽wppsuK%zei[SSRݿμX3VGZsȤ_'(rTU^rѯnJT5@GxB喤[:SFRm0@kk+@P 4g`HOK=}ݘI Zspy4t$|PpJGov#}h'B$]x׭3330|u’e>0_?} G Jnq$oOR-Pv*z_|#>wvvq˗ݫ͝UVo`NJRE*QJNE qDF"TP |>̌1 F"J>JNE }1 < N/Q0**\bh200000000T=XjpRH%a888c8a8#@ 3# B! },,D_A] (07BQ_t  0 q V+j* DZB@,$`(DEQ~HHzp`nfnXbQ>]L-Ccѻ*6P$S KKo|>jFPB t)^XTS}YBuŠUh+U#APj~@*ƽ~]Ӈ(E3VwcիWEQe)EXP:B$I,asqܗ/_[Xdr83avqqMD85rku7K jr2ӘRP,$LZQ">O{ΪߠT*U(ekB=m4!BH!#rp Vшgَժ$b~P100000TiXRg`[[n}O,,-D"qB&gPtqX"s\333K +UM6T*=s PѭbB2ܷvm P  R >%tŋqp8_?Ff_!޽}묬,X,--====<>}Yr]'/nK(D)o P(SW666z_wlqrR&Gl.s 'h/$I=}οwryu7wO/̌z ( 9Qvtٷ W zU?Q7M!̵kgtM/ &{uO?k}GƱ>) ٮA OE_}AS_ K/]v'[ksk0ݶɦ7o^;:Ck'T$''׫[/'7w̘1|>?@?!_? #=C.nh!E͛7cƌ $aM@jw,2GǶmu?:ry&%]!o_l08$eA3=ɣ.ݧC݇N[m;V_[=^-viWu6V6Eŵӆסepp=G;M0R Qs6gI^کepp۾Sɢ7O74gs'ppG{sPyOѣmHpHHۮƯ;CYe!& l{[Y_XAn$3,+6 ͠"RTVXˑ:z BXߧ驽Yͭ0Nˢhs<gY'LB1vhռ g;6j!rB;w˗/ϟo&Ο?ѣGW\Dl6[.kb$ܼ_~9sD"Yb9}QA}ܰEw,:zsWhqx rcD8ok+ף& Qs1ףX6a *ʑ3/ {.uI#0E,&5 D]6MS @g7,bZTLUe`8p%/[lr2]Ve}Z1vϤHiefg se <,jXr=|3!99oxА-;(U_GC]37!Ph.2i׮SRSMְa-r̄B/(J2'7#5jԈqRװ(;ޥܦ72JZ RS(#sui2S) %Yrۗjk1i뗅X3'_D,ۂpݲqy,d~[m=~5-|=&5y,umm6dq=W\svCۙIf=6"~s:j9`;6qCwIobi+׏2KKPK!pҡ% 􎄭SPf:O&lI> ™)̾{ƠNCyaÏ3Sv#. >Tnk>; ?kր!-K?V]ݨ7E1 G-`F20|q%뗏BWs S ߸y~e#Rf)83WڙLA_tq
Lf?r#.FL6~"q߰>?;Wh#ZΪHv][#㯥Bܺ#sڼ3Sy&9cuW˗m;]\qH02ٳψ~y)!?}P[%(>Vs.8>`ùϨ{\y/]_6!t>#P?'"ie\;,Gh [SL"TWX,R2R"DCdlxU!J߉Fee߿; ȸwp=^.ΜB,C,'@\;6[ vE!@P~wqo xѢ&,\ljOy^^8h$((hٹ9"HkLVTvXc;z B)"$)`8OS%$BCYO/t &rb-l;vc_{Cj d)&K@X_L<' -sعUHvD,nHb&vs9s}3m~N KfX>vߙK-)rG*8SQS(!Pl=#jS3&Mh?{`VdnumNO;(m\='++',{p͐ MK,*N(S.PPRl0F20|f؊΋e8v`xw۴5F?jY[p`†M&n;;Yyo˟UuuP1PSZa?xW^* _ǧ +wξmm41dxdp|rr594M!syJouo$neҍTY凜HgDPԓ7R;,l':s|Ϯs|ԚJ9u7]'HǼ?-]7yEOxJXOVm8z=Wr1Ɉۦvؐh>5 IDATv&KWs9>MOzB,D9s~f,gitƪIHU@Vqbahx쏪8IHe.\˔qPJR][r1Bsb) EFF& j:pCϯNYYY[Kݰx<2+.G [6_|CPo$J(ΛLKh5$,괲J>w )j8}ZºE{2oCSy&$K0jMc\ ruMnM_g)(駇g;^(B^B, LDRr}'\vtHUW pkSXS\4bj ^uhMD_}SMrF(3n>tG1 @濏9~5>Ȏg$\w<9=Lܿe>^ 7aTlZ6;}RJ]\JAXq`ϳ$ƞձfmE=Å@)`fb`|X,7 I8Ap9IdƼ< +MmN.gsVe_5dt^<օK^Im޴< ;xɀ}ZNrrJR"[^^ R帹_qFiCK'm;?Y֞DqBΝ1 3fX]v-H3|_Y_~/ ]30zf`yO$ƵjtS%cvflÑ(Fo<]A~qK\2B5yj} e@Ozꃉ:=^zYBt} r8Ϳ/:T#z/HɓHU䵫 BMϫ1uF|XB̾AaN{= |ZzTbmݰ)Fxgp]˲l49bwo}cVs@Xyv@a l=굪V/H$5jH$bRYE5 98eAѤ :9jaX2B"q3N=VwQUG,Vf灌[X*.Y6š!:Q}hIHۼˀ|خ^p<1׀k=(ucn}I%҅e`(oBNQȋp[ يԻwIlav;2^oa`f8`Zf=~i/PӲe` 4Tl:b\F?~pt&pg(R Zh#? Z P T: 20|fLr>CwߨMͬPMa*C000 |e(`ٴs֚֜^@ P~4_,tZUoZC~W&100000TF HUfBY”X,a[>t_s@CaJbUlwmrlo}UhT!Wbɷ]jdaa`2!W * UŽJ2e B2T-LŲ=O%XQzoG 8A(dr܂ڕ~٪B$I< ey ֮'>l6A:gPB S%>h>uS(y '3X+KK͛7J""Fur8Kz]Ir[stG_RbgSbfyE&{/i\ڷDFFm޼)"bt)2UtJ7SNr{ymDJLO4%*6i>RK.-C$ɼQ$)iwʟ\033 [ jy⇞T!WYTGY>Sb}Tߕ.Zª>jkY$5FҕgEg9eJ!d P^c=Up͝;aCѾNmSCe$5Lb56\xNpsu ʱ3{N--Kؗ%77ױIKRdeeґf hu^T*|c򧏖wkzOWƌbTѣϤbZ\j(װƤDFF Bb,We뎛&dq+8Q½]+MTTTTTQI컹{ Zw(\,2C" IXsB+\k]X}]oJWykJږ#鱗,/: Q ɛӿ.ݷrg#~ً_JQ V&/RT{zL8+J`FJj_wScm֝,3LmW! K$d uqV,㷪_#@p=R3gV[0[3f~_Lg7T_'y{7NnDQRLPPUy6&e?émV,-p3 , W(R(PWF-}[͚6hժU``T*(}ak3 ӫ;<֯<#:(ӯ[;ы$ gR|iѦӱgV8YYmSEQ_oE?,ѧ)X*9VwiW8֑s£l/Rx`׮]oTP{¼Ffǟd)E\yNی5K!?ˣƅ |횙:e̍O00fO>ű%ż͡f ._2:HجeG`8Ȇ'0uߤlTt(+oֲ߰w1'.حXTC'##uiY+k![&@lPPPPPЭ[Jm4hڵnQ޺u֭[AAAwC-_ Aݻlذv"؇vP,ٲeO/ ;Sƾ4kffǏ*Xݺ"=+RۗҫԁV'h|ce_+}#2#sH[̀MwۥD;Qo%J\(d19/+\A?˒N@'Ԟ;wIK`(#VfibS޷5.)G!KG7K;՘᷻pq9={ƫ6 5u…/޹{1r0fF EG|;]vΝeQB#`أbOʲҩ_Mwd)wH7r)קsbg OA[7)/,C\>"3|-Y@T*S({oK.iw-_hݚ;I`TB![^ESUZV#J; y[mo) Xpdd;{YAMJ:PAQXx_Ӵ|>PÆ "/\s΁hέ@. !X:z Ng4F+aͫqʌݫӻԚ\|}һ 4AiYYYW\YzurJڶk7iY֨HD++;L"דm_X~XMZ[mݺg6\$.w+F؆۳r왓l,¨7~<̞m }GΏ,?ަ֏ڼQ6#&ݚ0at )ܲټ-Y2_]փq%2ϭ200L9JXuk$RRugyY6 po'NeRIUVgs>ˍO_n݃H|֭[ $w};vƢkrxZݷ~{.;Պ~ZjժUǑJŔV+EPL$4!l̟ݝxxX#tК㔌2|MCjyiX RJI xG ┄# (r32$1!I$~@6l cy $<8`\+k$Q*߯i kF]B\/f+ ]GβtKJ$I~M- ΍Z8Q|mļ|zٜٳtn:xרidڵs,1TSñVVV*PXջ|_[񒝝x:\v5,,lE%,g ף\32lS*]Ο?Cݕ֭[nZo p܆u9~O+ [1x6DD)'W=k=XG [#[7o߸w;0A6{|x-[:^Z(?5T?RD. 0w[9_,JUcΊHQ68,7Edgsr`Vx (mgXP 铧ǎ{㜇:5X\IΜ"gqdiBe~`X_c8ۂU2vXZ\8?Sg8w65%W"cX<%>*#V\c+.#pZ#bbbBC$|#gK|}],tp>}y 6}MJWA͚e)B)+rlW.<*%ҝTו&RxQ Gr+ ]vTw(߄K;i"}%&mvig4.l]*HWlzНۃYǧOZ|k zWy)Mr%A+RS-e[iOTF}Ee{z<ڲ):WMX!EHfM/_T*/]D!_Vqk1ӟ=yV^6~6SW᜙;4$M&ZY< ny1a߹#^WJ_ǧI@8a\y~ķoLR"?5]x oHQf~ʐQ<纶T"85|EӇ橄TF|֛,%RJH"=nt8poh7k۔5k?.6*8>k0{PH3G@f=3s`!m.j@-m [de%Ԛ1T"=fIJe^\K8u]1.k~Po-_Ν5O`9_%*M-t@T]`KhPwq[tbn.}xq+ηUZXs3~谡^&ڹC,{yy8yuHkO~j l0vYҺ!@I2߶mK=,a:o9nҠm;/y\gZ?5x]Ĝk햎n0Wk&ø-:]9: ؚYpGRz joyѭW03Z |D!n!6E IDATL֪u7_{y{fuK$wG###Tp,Td F_|:U*%ªSͱsfυc$_G ocvSR5TJNEv7z=nqjE 5I*}kxH'g=mwIV\KnQz:Ԛm1eۃ&yts ~o{|>4^?[vh!]^`$,C)(_ k̲I'(bQ%ey{Z:k5>AR|)FGT*5.^s}:d-ЦBoj}]e?rGqۃZ~;!aK8he C```(OJKR$!)cLH&%P{ӁQ%B Y}_nkx[Mݻۗ-]jemؿկS%,Ao߾Z]К f} p4I|}~*,T:ΝTSO;_ڑJA=΋ eTƼX](p8O!T647YnR^ u( 㷪 0@BPi*l'7/nnnuYcbF;v$sʹM 7ɩPElnb+~٪wrrpw~@[ѱ#Ąx:[U9UܹjٔXl$Cp@ *yߕX I6y + U+E"ñ[㙙x<Io^bX/TAos}ջ3Q /$AovP9ZGIX?onʡ_95v}L3̨9 >|dggV6 FZXX|i_>U/cJ,㸶͙8777_Z={m\F # &(MQwwAvvvkA'vvv9|'zn08a>1崺{Pn, T* WX*w𞬻 nue-]U @7W MGW\Ǭg@fE˦bɌm3y uS'pkrn/ ޿obg```0Ĩ|'2Zտ@HO++;~>VlXM/>B MoBj>Eøbٛjx [:;Zaxt>f^x)doѽlrYecƩs+ֽ8kөLC1*3*4^,#sD<]J`8` y4g?MF~k6k*Ccz#,7>[:n~1IS뻔O?l&3vO P"QVB* 4yJzĤ]sQ$_Z} 6{32rl&]S30TiYPhYRV\o]i-۶`? 9$Pw.:<ɮ"4nT~C6Mt2jqIо}Ce 2|}h\tT/VXoY;SGx7opOxpiorݻ7Ooݻw޽r*//Zx=U۷XtE ֨C7J!-dM"eܱmV9mn>H?luӯ6ũ>k‘nklpa#99 Z^yqjkUG.i-:> ͨSS\BJ]WkUpkZpl(A L{xnOU6ն~8@ u^W]$n]_>QTڟ=\;J)V( /}'>WCk6lɋ'Ihcc|wckmmmU}hkcT;4|ˣ\ @_j{8{nގֶ[wOv_w诣[{u]s@;זA@e0Mm';>~Lw\gwSHHBAAĊg/g뉧gb9'*vc9" z/!uw$`BG|_󉏗Wnҝ5, QyyAg/M'7ƨ gWλunVѠt>gO"ЪuW/rZUB9 nܒGG==# s?pdN;\Ԭ=<7|Eb?y+- ohuidYq3};*,E*ևf3ؘ87Ag0`ٗc3 \oke𻴌KJȿi ƬkRmib̆b١+w?OxS7E5<no͔Ou<(2'đAyE$\l~~ꈽD%@zF+V]XJA훻6jz*]||^Q-W旾sַ_sKug͘)ؾw 8J7EÐ˿y8swtp>ߪ< 9(pٝ4ۊݓ[iȹYFh^t Xࡃ hѢ*ήUT,/V!:p#N:=aO\'x}Xdž_IsIoOm[Xf>gcmRߩp:kɂGLݯ,e Qlf_, c8+p& oa9v5X#4S*|:vcL7޸2Ѐ3}Gv$Mh=5n/~}ݭܾcmm?[.zre˥iOO= IOJuxṒaK)N͘a>vnYB0L lf= LG_[}sҌtR8р03L ] pg0u0 hRo2Ir SeF  ٠۲av7fsMe!kVqЗs#~N=,.(%;0߯M 2J^zva3ce6gbKkK::8,(Qڳ67444444q9e:+M~,0˘U7lyYo^7Mu+F,p&0eP)#؆\; E]ݨt MKEҦF$b񊕫6gzzyŢ4aX\\\#pyẑ~1`sqV$U0#Uz+0)*ƱsyQ}WxwGM^G lћ/ܽu[mFy'wL@֍yz{sS-/eYsv$eKYyg= {dFzF4MS|]v>c&)ݮfʟf<~|Nzr:9݉) %K2P۞mlnrd;٠P6l#3c=MSd u*8a՗W~06.8z.co ˑ+IȒra6shoҠM?y6 #NF8uJwg}Y*xqJ4nmwb7;.Yrz!j RXqC6GfʪoWmWr8KOq7Ĕ, 8]ZlD#d_tLt̘YeF E1={2j+XS/h}MXnI )Q΍NwRJ86al=ab;tx5`g2r/KOJE&ʪM0Lvi\J1h]fA܊ ƶ:*a_,ilS_۔sz-̉<_3N<ģosH*ˋЏqsKZrd_.{UntD),ȉΒ(e1av{5Ý)%t㷾{EB|hJ+r ^RC-xۖ°A^,NgK<ہVwx|F=fMv(`4:KGۯ߸_sv"0Mrz͠vVnjD$Ia׫ 压LkܭJ S><ˎޙ,(Eβmǩ}qCCǏy6ޞǫ[=?[EㅽzѢE K 2rHoB Q`kk_kEAjzޯ?פLv+eNjJ2gg]W_,P7GW.{+2Y(SXUeXnPh&,|;{w}zn}@ qSPL[~A׏65baE})#Q{3aZ@ *Jd"Q5V3IV=L۟pDP҄E  /D<9 3Q)iBB o Q)O\㸡)=mdP}L+(yQD @ ?Iyb"֝[+"Q^lqr̉@ u oKmP]P; [{ S(1U"^j_0 FKtOiZܸ<E 3% Bjr@|o(@|9 hQŵ?m׬Ic?MR*/uCZD]bCٲK,-yc\yb7NZ4_Z-}ҘMhӶ̱bw3sV&k޳ˤ=ab sɿ37,yofl윛uFjAyFȮ]m=YALWu?5" ,P_( Ù,}v?iXʤq_YMY*u?|owH?;6N0!(s_Qb^\ Tv~gD} {e+M8/U!E BSQ'_hd 6Z'^~ލll]ZY6#|i^mKa0YZ+ ;0NLg  tly^e00\g9(bBR~B,Z)/c?+#hŁq2R-i^9U&Q{ʓ.Lx|&" CFFSNͿ.6,ٳ]6'f.Q U"~uE M9J(r[M+, g˧#NIxL`t9,jҴ昔1m;x}j/1w0+X Mo0E W÷E~LzjDbtPtf2.Vtfr%2I:2f\HiJ*(J)6X#dw-{gǹ$op%VLCyA&_|&xznC fѹoݦ|{Z@z{>dn;X#~뛳n Yr!Of5ei+=L͘2tu|Q&(QP$>{{A{M;'u [6YX( aC7eRsLf][-<h=z{D4W XF|F5s5h?XlQ/fm1K5 IDAT |n\g{WmfvBPDXuO,ucZ SdY\T}&'z΋ԋ4n7eK)t~QvcimLXM,HYD..eR7ܢjn3#vI]B޻,9Ϸ. athST96ם_>u>\"j@ BTbYC:oꟳg Rs_=5eUdU]dfHRLSދ,iR_YfG.h:zFL+ _,@TET9a~M'w].:)[3sjڱ^DPz:u_}U;&{"D(=HYD9>_,ð%F,b0_"U 2a2 ,+bTG\,QX$(J2_l QcXi얮F=ͭʖ&BTE *$߮/Vkf?oW{{g.cVnwKc66qɑZdоQXsē2*Q+ _,@T) V,Mp۾X*;ty?3qC>Ƅ&}J(Ƨ>|Q ,u-O\֯u|&oˡA׽-S4qu51 —sF%;֩ݯW~S5nơ _Cc?ɦT=ζ6ֶ6ֶ6V ,ۮP7GmީiGӠだ_z8>L$Rm׀?gSE_&-|/=:5l;*(FRXtc0+b)wV DR4GA9_6tL@+p)ޒi -b.f_7Mƴ&_x;@-NX7,*֬Gw<|Z[=/qƉg-(9FKJ˖)~GΌ>AU~yў~v!Ľի 幧< rO]K0d 9b;j/} ed4FѴ g[gl9ҷB9p~ Ł3yUO]i8nښp~.FV>HXOןWs鴻ι:ЅO4}Nm8mFWkfެÚ;)I>CIkiĹ=|,* FA%*:ѭӳl!Jb2oqueA -'}iuqkXD]=CUX}ȬL?tyRާ9WL&FGV 곢 Х> U~yGRi2 (lFyD2&lp&3b) JLߑ7DN= @󯊗iR(Txԫ3_Ҙ<$%$!Lnϼ^&ui隉;X2 ѭ@Zr ޡK-'"w TaH\,PbѶ/`hda>LP8Ha5\ PpI[I_MS:'ګ%do/JyLld -5n֣Ml<{A-11bc>~v%OѼyTdYܿ>7~DU<7 ]+ D DBjgE|h/+>mavC׈h[ߜuW_̒-5}-9K (z%Kٻ<{3>y W͝wdeG'nvz?֝̒P{7Dc+/Kp^d\OyaQP-[ # }z_TiNqLTZ@A >/޳ϱ޳ĸCKo]*|s@.sz\y%n&5e~ոTɲ@i\{~E"]2gϏHs'-qaJD$I~QUvqt3/gl8{ܒ CvQ)65,.j_$6rWSm[^mPj}RSSqKIQOvwwqGMQQvv 0iN#O޿^lѢUF:1!FGǼ})Eb1Ej8 aJP@ 8[#:u Q:9fef!}ڶж+/71i\…@E|336:.a+2s8)tc=TPPaa4MSؾFY(JZ肿yT @ӴD"~iff@ @,g:y ^%h6G¦iPxai /7i`Z,2aul===՚\TֲEKIʎ2% UT[(oQj+W06bD}$Yվ4dgkXDR/0'3#xKXrMINir |Nȃސu;. `РA|X,EQZbb\*XQ_x7K W=/633h:(hʕ+ UEE_5#6-ـH(Vl4bDR>~վԷ߀KkXD/V̙3V>iP\,X|ytt€={ /)Xh(Hۋa ӊ-ME$zQ?r)z+RW|̜1}"@˗W4ȄU koi/1$&$vmZjɊzzZ6XLiVqʥ{)Yn^T!j_u~1c˿>V;vV47n\צ4fuk;[{.c66Sˡ>sfnιYo d٣˘t,,*uN?TnSX3n>A&lRD L2MՄUɺa!Ds%M֪ZQo(/V G+V+WX}ӧURrb877ɦcaFd9nKf =i}yy\/'t`~DWdj+Jӯ_O?_p؞M6)@q}i.(W/Q4,^UT"lܾbL:e G`xu5~JeOvP'yn|_&jֆ ~:&o% clF~Lzl3`TL$<{}>2K棧*<[>l)I{vi~YV=n1=?4q?1GSzܣ9J;aUpmFTNnJFQmX,}=}ccc6]۲ DU+*RDϊad۔+So8ӳsSkFK-jm7^v]p6yv-{g [zwcWA^ S˵eXo#_ٷa &A@ rcʱwW]'@ eѠcQ6:8G m,6top}v]a\ 9Bmcc?ٳԍi1zVO5*ZX=zF3WI=B?jhk7 ~\.]>JݨM] &5gϗyK2M ^sd+@3Px#eFߧ#d6r9A,׶\ЖTcc 6--%BT26&&D|P5)\Dr,\X$ӧNYZZ8ndlqW0}Ts#X"zi@ʑ͕Ώ9j.b i޽ёlѢeF2d&1!vC *D"QD, 842##j $ ~b-*96׽\_a\od@ g$I&YPۢ!UL5q4YvظIZP?>BoˬwMGPm[B܃eۅf{x:2dC j=b?h2XSb>"rzF)[?[3W/I#,&Iķwo%@| 췎z+dfffx|\= bb޾::} ڠ"[r9.hV$gH4`ԭ+L(LU,2d>) HLHpqmpdR)E@n`P,Gf2y¼ׯ_xb+c"jn5﷏,=r$I xx$],6!<,לua\̮ KӞzo7%MNYE7f>;<4@燚X ØLfثW&R-<111a Tp㩐;MS *ږݾú[ݬ4YH*~' 77܂$fk\553KNJ/fff|ø.?$'1LUgvP`=^RMPoVv!ujwx|puU0DRvw >SpA_48ijO3|iM;h9 vlaNkm"T!)*''ǽG~+b(;@@aE"$''Apg]]ûo FxiH ԣՕ\7Dr~vD@;ðJ5*|pҽ'nɯ O8-`D̼o zp_}}Ӕޜݱޕ o-r),w3oo#q1JbwNnT\߭C# J vYv/\lA퀥-Lř*y@~|Ү[T}&=Vw'b(2K4o>$`6lƨ kfR,U+Ct i%R(CV,MRD,8p 22k[o|Q3(/M{J.ۢn6^qT. 7+x-qeo ­-e{qJ:+2&QjZVM1GNe8/mE;ɽY0@taҔSfo- :f'qsX9gx݂cXY#73<;;:yV{p5vv6K9wO+s"v]6eg>KA)c9 oS!ύȌX޽ω!;𬾭]~-+i;26Cl̇7WZkܘ7a18%h`neo'ϋ+[b:&.\ɇ;7"ĥUig} Z!ݷyf-ZlѪs *􀯃w/j j$)G/ ϭ?*YJKV SҔyC F޵ߌ*?ժ*SvYkJeY]oy7G٤qm ͔Ӵ󜠃۵t=Jqhm#RUb" >+;-mccYd`ǧe Iʑ0x]l [W6(ra@N=gm{g|Lr2 8-(Ic#d>z-ʎVg;4Z,sKKӞ8v^\Ǡ"# {6뉎&Vnz6B)_u$I8cd_<@Rs݁uMt+%d_<՜a6tUPE4Y#!(ʸ=gaM{sAwžUT^ZF̧;Χzn5 jUihYƇWa%$l]} :T[RwkgM48 toIl[VJ?ĕ څ|┭J_.ͧ}<|<^.K񿘅z0hS׊ IDAT!*6 Iy999Z(rp*=tc۾6cd1v|7{uq.7\G_+kd7T__ ܰV+V;缬>.Jz$ߪGCwZ&P >! Fs8d,qRb4uvM$fUSKܨ$kNuƆ%xpT(lIxu=ڵnvr\0nb x:u?(Tܥ Q'_RZ݌L'&\ߑ%,L.JMh9IRRi"jP򇸎v!4DVҌRi;'B\ ύ#=Z۞*@ף+˅BTV^11a=@ XjukzoGtGGӂۤop%[=mQw癸E~0`/a-h暥D5o-h0|n53`42W2~xmKkb\y^' )Ѡ  o9]*UْaϞ/5#d6s ?>uۙA.:9C049 ܰS[w_|0reS .&1],\:ʍmhЯE\cMlTV$K8amY$ϡ؅S1Tm4BY 9@e<o>G}i3?RL.u%ėϞn\5.G O&(74)F5ڊpt*"SUPO}pnQ8I~/>N2mNO\8YmЂYpi eࢥ#p(UzڔW 8#⺛ @4gj Ҍ剩k0cCjf,\{ذrT65K jڱC*:)WFL}Vr-@2>G$J3kܺ+ݹRSWX ݰbXf֭U詤9{Vq7TMizSeݪ b ?iIM<<)AE+Ujv׮^0dr8&ʯqQjKn`*ܨ۱ntvȸ3LԳ<Sd ]k_[|N݁0aŗ Tgc 2F?ڌ8ee׭_t/"ʞK0lͳ?x%1oj)] n ɗ|~=L` {Okpޅ]q ĉ) X7`bHTV )i*rnmG_?mܟnZdQ+n}~ŪC[&:Pׯ>@W;0>: $E@Slik]>}w]ş|h gh. ?lݲ#Acm1qeznޒlm1CR4u"{g#N,_EG$ayf[NF莀xaU(5V`1שGAfCvwѨVmh,aD]")E`e˂a>laTn_ ֿg!Ix"B)Ni"//ecY~v>9j[$ῧxV y^IDwPC\X^,2u4tקWM6Bm}i'OoSLS/mR?Fee'C Ҕyl pO mz_$inaIQH/'$)'r\V|Q.WյqjjjPHemX5W$wYrşoo]4FJ;tZ(Mb͋~mڴmӦӸ)|9]֮@^Y=s^~#/tE+U_UP V^-;xР 4|D9̺oo˖2.yg^ FhK\cZSOn%I1:(8 !v%0  +p"2:rIo%0 LzpoWcӦ 7FE'HHJNvLǼg_q!SmKZ/B?_Q߽JMDI"L׎Wv%Bm}'^Z/Q,qq4Ɔ7 q]1Qڴ?b+k䰈:]$E2Fi`c4}9 pqxM}4khHlh4^/OSNrxi`萙1Y2/0B}Q웂 ;nzbNssmlgP4{ĂKߋ=*LKi (iRNU0/5RyݥٟL .`j乱yr9;RYXc!q%aEtUmѣOz\϶ˆ(:8A e^rl $fsYqMGGZ-Mj+K?jcuȪ)T t-CӥFJE_4nѾ侹(0*^ f={Iw]u-q.K.pkE1hT,5O·g!8K?yBij&6ƇwՇ:4C`ۘM|%U%Mg=|?^BYsu` _q%|9~&#r&ty ySeC3ămֹaܾN<"%-qS2;d:#V\O9ƣSҾVjwKQVU}ڔO II'0 c: 88F\h 0&IL&ARDPAT$=15WJbFDWg;ˢe|ZQO}ʿq"#~u8X-M @ӵ}7{x]<@IBoí}G]u} 6~Q J×-(J).>vuw'~>y~RLVsQ?LR*a|̖Z^*#jpuugݞ=qche& x+INnҀXswԡ$3S&l BQQko`~HD 8c;pcBĎCPWwŖ9y|1G=l6j5~&"3]@ j+ڃf2scG]1V( @QMBtņGW]h_G., %~$,x{2NdW.W a.d,I.NIəi _Z9 2*f 'J̅R  `tA0HZv :mC;SJ[n+Iua?NNw TdbT-m !"Ȋ beek$أr=5uSEO +J<#s*" Fm$kЯ3Ɲ_,Zʌ!Pu,eHiVGIWZUlQв sx:{OlL[efOm?TTT(((ZYZ* 10$g9dPM `:aDzD=h"by* ۃHQYUldnn@hYGAcY\e #d5[gn`C봀58_lQ #}|S\2@%ŬK!̹% o{qwga↾j.w88)\I1x ]PRY E;-Pp j(TaqBqeKNɈ"U#ÞKnއ3b4B`W.;v஡.[h+ޛΒMk,Y6/;89jAEٜvq.!X%%E8xѡtJWoooJkpa#A'AL9v ^9GRܴAw3`T:ڰA|.ڊEs~!#MCB+ק]G?RF\gܙ\IsVOOa⍅C{OEN+Ff;n-ڑN ;t#ϣ+VMpXYU1t~o=V,F9O^hI:v4M% ^{TpekGX-)'tv2KE)A ,M8ܼ;b ?}*-+6c.%D˹G"CrjrFhfظCl"ywc(6 kI [[VoG쟧ߊeCGIc{i*]KacXT4W2Aƿx,:!--$R `C"I9B S$}oǶYv#v~]还---*"S6 /@_~xqrܱœ7Ė!$N:xfKdΞ?C\y Mv?ǔ(uU]= IDATN8(ڂUT~!t9tr"8ruU2 d(sP͸zɘA K6=``UUX_L\sh ҥ Ԯ%z"+]}Ŷ[qy&nL;cӪJ^)tdQ.rJIa2 ,;S JUZ4VŌSMdscUV* w <.uK*5 upP_α{֟N,#p7 W|yi Qg5lŭ>*hṚbJйՓo d}m⣍vJ U,KBjlf|x"UOP#hX\lهEWTwv; %i0 foi]͂03c6_qn*(mjk-PPPPPOۯ l^=5 yP% H\J<Ψ&|,UuǜSɹKbˁ_V.å?xmsaՆn泂j7)?,mXؙ96$z|bb$ "it10q=`Ĕf:#Q"F"JYUZOꭧPHqY$d@$C?~4eƁ|ӷzFz߈3?HL&+*H }Cɶ8S)M*iu,qٟ^p LG|Ȉӯ3R'7*U5+T vr3WR{w7RpEBl8@W_H-4XU~: ?e#{wv3j֦х$Mn%( 2X-ӯEAAAAAAi[Z~mNG,( )bbPL9 V3}˪E!DMpJ6LUr7.l3ڽIg%+i3/hsRX XEi#Iވͩh!KŢD 8ہ$tLL@`"ǟ8B\7:jFb eTDDDQdQ`}{Q(FzN+􍰷1w2Waٗ;qŢbKc6IveOwͦMbcޖ4EFѮyɷO= <ז_ @] (KP%j8tHR>NzNH ( _&~xkj y1ˆ5KB3y@5&7\c9p!髷.`1l 5Ԑ|Ԟ磿κs V^^ĉ{=I/{rC[.comcewaH'.6jBxOA_ޏSÅLY.yrWdC"I)d,a+v% DU}~ -wL?bR" nAnܘ+N@Ȯ9\YxeX,[$A3Ub|9@8i vm͛FO,yߝ{3xsC,2>2e,6up߽Eܬ{>ڎU{mU*(q5ڲi_0|ٱyZ橋ϲsP/< #ʨ0EYz35 طl9 1aSSS/]3¢_9 FrP(+ö'g{J[P@c#we;\왘}$77Bx^d~+}똙׹L ɯ 8okߓyYgMiVc<:@XlJKCjfIh*YZ: ܜYf^2f̘| H$k{I_ ~ѧD,U 8%;!]U>7|E+9UP_l{WqmWƟ{2W#`G8z)U/:z _%} τɥ))xb\eV ?\j-hG3+LB)ն%/E3E/s`*~//i6yShWKN'4LIM:3/d2SLIN-!{uĄϮd1񟸔TfJj쥞UR[ ECLJ^59cTˆ[ԐXaћv[~?<=̑w&NnqԐ ~{$ߊ35̪<h3÷Z<߸~Pw"s#~>g(9\]jڹϵikMnϞy;zKnW$jAeDc rO=Z1&Kxtk FYTgIfХR#.,wo|{[ {8}Kgmwm#']#L6rJ6BMMMMMmժUWTl xy 3[υIq>s2\D_v BP@{f)kИ(L$0HK=k.|_]R짗rmT~#@欐> %!iM~9/東-zˁ"mhwb&1,me#Be~WSe3CS_i]'qƇKLvi X+%OdS{L== #9@`NV8B}"@!,x{2NG٥44Yniqe;ЍFVC~j,90MP*8 ^т*ޔ:b18$%g 4{{5~f 8MϓO_^_lm/_^_dm9F7/Nҫ罸@ 8z(333۲eiEEE```wN#++5Q[qb(J՝}xL7#,et SvilA«bk=&XY#j߹yobI;DRI Ȟ'$/E3E/sy+jxe&j谴Z((#n6+^syg9bW _uHYĬ <+"+=-L4keeuX\gˆZ8y?Y Awqq#6w;cWtx+*.h7mon6yۭ.N;z֍ZSѣKDQLׇ^.N=̐QA"2fIX9 i_Eb3E/siGsi}6_5PŪ jc;܌YZyHB yBK2$(+TU*t7VQ[Q8uiV9Gw2B^nıo% A6a>8Dƫ&l#[%~QʇRAU#W7忺"!`de/+*Md/L4wSO'*^.&L4wxꙆt:ynjr,啰ν:I ߟ7nܸqK+͊\ex[xMzۻ࣯E<aE;ƅƍQt+ܓ,>8kՆVi߳tLR&aj߲g#$-sQWim0¡fCh|KYn@ߝ+,[;jI9-Y)܂ᅵ'/tt;SmԦNCOX5ae1VkTRK{nJ9a\iW,}!(IQP6l(e#ج~#ſ~&#KP~>?JX*=#u47g6Ԫou'^pn ;/?tĆlB0v߉k(YLտ+@(%Я܀!j%3W^=3ZAfIH 38V 0c/hۢdJ"gwa%-nfaaj K?7ܦ1FTͶc|zR%ov B+WbXM-wQvveeII4eR4Ą4ccceeObu|>?%ڻ$%%t El(((((گuUB O//&BvV| F|5r͢4?Pm[<,:- oIմU"V14[5_2*w=8.Bce?MӖ*]2#j =mJ CDAAAi<xب e,GH_$mnD>}V/\:&(uiϳ=֢kȑi$Rސ]Fʏ}Uj-J ?1k|[+, _3|m/4@YV!|AS;wLyjж :ZoӾ}oLX m"RG^4$_,bjh {JbM4Zz( "pJΓ>4Xa%nmhggd 9єn@J^3v3[P%1 52)?3Îohk>h%݀nj7p'6|8hXwsf>v\Ixyrv4u¤ ht?V=~_%n!H_$BT۫-tsIohoh`=Y!%om747Ҷ];ښq=7ƩC], {x/ ,L9\\f'M۴z " ^څ(-JSjw5?2XY D6?AC0"D]V,Q,o+Z.'bq Di#(,x{2NG٥44) DŽ=׿@6[0j>l4ch]U3h2w(S2{&.3+@Xy8R}ɚTb5v`ᓐTv}) @76Y =']Z&~ W3qJ7e Q ?3xe/\l9o[!5i/l9Gfu7ߕn@Xvוzt׍#_IRvcNMNԝÊT\p|} Nh$K%I]?>_맆e+*Rv; kN~GNKߠVJX@*U-9<>רAgː#fU\R{}Zyv 4+,q^]m{N~WTtEq6!rV@A,#뒑tHU Vxn&tԲbaJTQ1eXU+UQ5R&G c؊3?w Ui%P$ b:^-Ԭ*믐4͕*Rx/M*([fjlD76x_de 눪&#H/KA1K0֪5Du:{X6{"zZj5뛌_B TBҹ LcfJY.9tG`$AG(2hV`ȹvT0Owse`6* IDAT6]0@O]7p*V#RNB ?5ǕZK `j>\H;. J_g>{/vvs74/URNfƅ9߂K">%?pvŐ*,N(NɈ"Ŵ#ѧ,{I/E;-+/:bWN!BWVs8Ha2R 淴g{PdwrЕZB4DD=ϥoM|8<]_Zb>}h" 5Xv%H |w'Wg@3l; n:N WuQTR.GbJ bCԔFi*At|@#jKb7D%&ySR4p_D=3AjJRBw`$AG(O=ML,{Zv.`?7D+ty|H7sSދO},;>/ۙ$U Ptފ9i#n*ah/ͼiѢjH-}|OZQH<$gm<!Gԥ z9B8$[v] ai U)w玛 E|!;Ӌ'^pmd˵/JX*12?;ݐ!忺"!`de¯R!QP%Tsp$5+IIN/R O1T(mʱgLr1:k̊Z]VXQQx˼vJӊ2N}z`&cX0M-i&.d8d# :Bi] 5.lO|W.eqA7MLvIʍW 񯏏  +8fFv#=Ж0QP3sgHAwd1}+CuTp#hfG:mRFR2Yrᅵ:Z:/|SD~=Myj8A.'p6wrbՠ*: <= wjmra͑v0D̰S lǝ8ܼR-X*8ż{Sǩ<u5C~YE  .=t/Zڙk +RuLNiJ /#/U%DSE}oӊiw2;uC÷2ՆY`35HPZ,ŤU6{0K?Haԁ0nED5E ſoͼg! b RA{22Y2süFq ##Q<@+1_~[ @|wic4fUBߵ֕է%5XѪz wb6T5Yԟ-ksW]O}\ppFdl6֎fAJ#88'J[p+VX,VKӻwve%I4CCK+k<~hSE`$NKfll)ѱ{^^O4zfF:kbD322ڼo[]Ԙ @_cVnn9hϺIBlaA_T!9 C~O" ![9!7;V֏EA*LI:FlNE Yh\, ʯVay((n+TY5O]!M⭵-,,,-,,{kҿ/<ی#ټsPPPPPw_%;ؑ3Y~A!S{*+x)#GqYCAAAAisZ'RoQ~QjZApʑJ3PwdZ+, _3|v_^yF-_( kIϵ-$A*g]eZ J淵_%[uc#_\lio?ߨ-Z&5b[Zz( "pJΓ>4׈ˆ3{Ywj3YֆF]}vF zGhX˻;-)_X6ɜF7q/,Rs=,}:>fH3u=V&j[:*&f?1TaqtfSWWQe}ptrCi'勶V]@.yVu>TmM:ѐؖr X, ENusaۓqZ|8 ovgs&c ͟C%{zLk⏿"x7! T_``5v3BRWۙ$,'bS GRru7}e=qjԲb;q]u2uta ?Zf&RGIWRO?fm/mC{Yikkn:Kbuvl+(tu1ֶ\{P.##/VX7)nfZJœԺ{xH"_,'35nN}F}{|_7%GKݯj7G57mՆqzMHrz4eJ ?uwM21][2sCge~Ox[^/3tUz-U?{.U0DJTн^G}vn~ئ?d6rY/%|Uͪ *o4]ެF4^Ӓ`S1Vr!&c[86!A$UTrp*= [cw-]qՋ vw먌'l|yr@:Z?’K;v{~n4B;R4vzУ6yAcO} GZ{eo9]yY P6Zspgcg%/b[܆УZ7vX`oLpok[{|/T6qZ4nV"& ~hbF@+a{o)Ov\3>,qz$2_CTx}ױU~NHѿ}:b;$r b5^MŶFYfuy'g-9Zv;W۽:Xr;j_E{~&޽46o©'/Qxe,smRoQ0U҇Fiȝ$̬fՃSV݅Nܵ4a†:FX!$Qc"/#EAoEGq@Xrִ tRjh?Td~}TrHPdxJ|aզ.aUh&ߊF't P=08Ur%洫sW35;H9E .Bc4S.F ʾ^KW}8Au!&N{;()Ը ++Jy}=sm~WTn_tXl2#I/kf49’|V\떃jϮwf5͊Hwz{n7~ܾ*V-Roe?7ܦQYE6mcgf|~R B˗tuuXVEٗ$%' -mm\( Ҿ}362RVUѱ[^nOťt))LW'))NgddVG^sƻߣF=64نdkɩ6QQQI{TB=ǧL&RŢ okg7xn76E LdP( Q[H3p8k{{;!`1vE5@X_/.T6pL{*j@VVNIqQA~F7M*3232Z^_I!Rw!T"v y]G)ȋO'ޭGn==ǖVm @bX Ck¦2SD&o<TZ;_,4%Ru-\NYǚ"%e?rQ%$`FM]\"}4WmD;`ٕ -93 J{F~+4CD +[i/O\rvq+bU\ .oko7o/jMJC;P^֊By @|m+_l+ CP37Щ? lzU 3p GSג+i(Y:. )X}C- ˆ;&CU(q{]mǼ-\wU \^W!gr6438:xcލ̢ Z0~vFtc% ,VX\O#!4B $@=AZ P3(1U|BS|Zڏl<00$a7.pui>⾧%5+x~֤sьKswOhKBxoߙft ԣ`2NPk(΢aϺ={q/{^P!E,?+ti@ eDAi}b _ j6 2G' 6ai"HƻFĄTE6ʤMo]x z R'`zgy|^3; p5-8j'!uwэ.4lj%SOˆlhoL-RMaۓqZk|8b'W.! b18$%g 4{{_$e3B!/PKvjkn<+9wu9pevjYPu@z[^^^R\\PPXR\fs|!`1Ǐ }}fѦqj/h%7/>_J۝JwV :0>A,{Ҥ¸nDG|jy-U.rRLj !2f FZ:NRUeKWƓ,;peCe*X-3{X_ [_??F};5i·UWw4L^.ߋ((jt?rābE +vh@}F$mbP:,ŰU'YS/|ȉ[Y,Nw?,)qhۙ_ґĺ01(CPw_>䬂>}Jo IDATelr6 C43nޢq*8iBjpbKo|YJ)AiܲuӝTqR4ھ$W4C}wߥ_@RbwŮuCKĿzCd5pڊ hV"_lxG^Ex/5u{zMQMMM/LBؿKbsEk TK)Rn K">%~x ]Y[#Ha2>QE;-=;BWFjyo%v(TaqBqeKNɈ"%y.=|elQGAӉSE Y|̰/hGٕל4U)>;R^u/_)A/=Mf~4j땰 m75Q._ӥn?8쬂S<}/Ÿ=BpyǹB?d!#wwzyHk RFv e1V)q_3Vjbɴ?>?jN-D hP; bdmîPQ/-/.ٜ vdϗY^ȰrW~q;]VrM |^9GRܴAw3UV-9+8yM#-UQNi2y jF9?8$g)%Ve}-zaA.e~ҲPS%Ne՚;B9r"/W4],4deꅕ/mBСͩa?v`'l]p25? K}|Ik7R;(..:a[1U1QlED类ڞ\`U29;={^BUG}$lsʰ ڴXkzQE[xExB`q²Y5@[.ӸC~2pP˧Ś>~#7~M7v:~?D#O 9A/Z?+vB#xeTm!-zqɣ hT-7jg:TfJ/$)G]bp;#0 gfi޽;Tܛ-jc(J:yvuv}W6z97}bq{xѭwҖ/'V 3VC6l_BmN%ZߙWo#5Ō83gs3P.K;U1i}v1ka/IˏrfԚ^7'8^ }c|+oTߏZ׬>q7c-U]7!P CԤy1 _n_Z8}N#3ɷW|#$kQk Z)6/p̤qV1wo߁qFg|jԯ(s[Yx7^V*%l{i51(wJǑq3>x\WGJm']6fMe),'<{c˰W"wߦʯ΅*Eո='d5ѴX=M3e2_׃=#4T[۹xs0t';K WqtﴨC, Ly7h Fhâۢ~6kƯ\vs[G ꐔ%QcwoG\ZbL$\`ʶk-DND[?f ?+̚Vē2kT$_.|tVFPXᓵǠ ;M!/~z6wH25% [TTC,a8[6Li?F6U*~P!L ocz?zN;oO,{.[tuF)(|}}:4%LNDF@1:r1Zw5fe2@7Y8;g|lз>nۆ|i&,snt9J5cqja)CuHw*_&)fp+"EgGt3ʧ;Iyahc  +AOkS %;S&#J'?8{Lb$ߝ;|_w{>cr?`eb ~1~<,FVX_r4;~u˂KehtLL={?u4($3_O!q^i:` Q(J?l'!va3J4Kx/^\;ΈqG&JLCd d"Rsh X\V=xC(!/g b}z& ãHE^ ,$,_(_f*2FAo@AAQiڔToxNDFfyyyyyyuw5I "3llQ/ƪ1]:w<0PB$!nj)2?GxZzZӁ+&lP1̉+H覹JUp=9 aR1_aPA& l^syu}jb* B@Me L@9SM˺LΔH1f#oz$~h 0̵~'IE6?*ףl{s/Jըƹ+E_]:ek\5[Wu|&pҏ]w &`:.-yG{3sjwc֔ ztqQPT?%b $'L:@| &F)G.n|>iLoc:RT2,&懳Kʂah 2uQT>E,͠ i@{[[ ]^sܛȒ^[:֞} YUw;dBӫVoa@;[%O \JT`Ʈ']$CN1YQ`l5Gcg{\ &6 :`ĸ/'uh-qy84fʇYG7,&& `Bfoʮ<<ݡK?&pin:(@u''u9nmָjhluA5[ljLF|3@O8C׫P3kqOY@:V .XÔF!PwB# ͨԞ7v8Ԯ 3^MWDaj`FW,_N+DtC.cm sw{1E $߸js@PζPPT:Ȥ{fubBx6nBSILdm&(D Q!(*jبG8^..(~#+3#44ͽo*2FAEekc^I,6`B=ER4$$D(V=*ao+@8FA6mE2eeee]PXx#;N?Gm>dę>+U_y#Ɛ%Ƕxs:Շ4lg%nR?D2]C*@8_|9aswa܀ɠ.Mj6wr@~q탅^8+ oz9`Wې!3 *a`Ny<)f.tۿNIJ)8E爦(LPo<0}gL5wn}FմvSJ(DW b0*B.K뺺Yd~ UyxS XY[Ց3W3 :N==U/_> )`1Pj#?kM:9)(j*F>k*/a=b቉kߤF,׶:( LAn }ߴrǑ|\:1rYΘs/K:0\r迌v }{ߑHT+#RLI4ヒ֍^T8K<)WEK37ouhdħ'G}Je2ُ?Xlm{nSҡyG׵-))RPPB#cmm,0zPiGaޥ>eXNH8L̈waT8AdMǞҍOX}d$R_l}⦆x.v"nOU z(OڔQr9zCXDԏ/ί+#dAK ?JRP*VXݖ'þ}|!nFdP1n\}9JiAs6iȕ|VEѓrVİo.*2߸5[s<)WE7 z:8lkA1L.:( OfDAe$IryE)a}J/:p̋Bs\W:`jFou3f`K:u8R{97}b(+w7 =4˙ sk̰cim+Kk/L'Hw{ x0ێ qԆG(JMi$,N2 C(J _)ʊB䦦zz@$ {5~D4@[n=(GP){"a8ATdj,m@ M60m1?m)-:mB}wp.ӎB1hR+E9q<++ݝq\VUCLt48)F*V35OQ#K C1Te˝)QԈ)CWrejfX\KAQG\}hKmɇCЊCU_P\be(TUSVBDR AWDff{XTu3R*72ly״ѩfJǫ]_M(%ɗ*zE ./V)/Q%"5_)*IT&PzKSSS|,O茰/_x<*_RPR [VQ#KT,ՊPK,DSyT +ECB^,V-'Kh:F=͞Ś"v9a~{F]ې_^ ðFc4 0 a Nit:r\nTl5EAj{/D J:U՝eUřK$luBJQE/"a.\{9 v>N,:|x޿!/K*A {MjZ͡t&d0YL&bXlblNdTԽ;w LMLX,Z%RXYx@^eUR%p<QG4h6mHw"Eu}|jɒ%~~~_0/a*aBP!$AܲӶꠋ0k2jͺV![6fdn$WTИKѸNtdǠ TRQE1V-s@PtXY+>9Ɋ@?Ӭx+7N|+!2_xD)0v}iG#FE͖ Y[Ց T`~z$3&Sie76LȪ[yܥ;J!P%"{!9*> J%Da˚*aVE)(l21-?:̼+k(+Fc2(. ttt|>A HyX,%1sDnzr21}~C襢zmu٦܌[˝ )6o+Eҭx&JEUjk*Q*HP,+EA@8VZlL54HX"9 $@q^ rC81eȞCQTM6:*>Sy5嶲mF xowlj 0=;׵vpo1lsRwӹmmk[+8|̅OGw6F8~ik_Ã.8w.$RLI4ヒ֍^TܘˊWogzbǏ;N8OYN:1s@Ԟq1R/-ʙӬ]E_w&GG>Z7cBͪ?4D͛nB=UyTڅZ?&@%jeFIH$YAS@W$$1['ɚDSoIftefM'/KV8 n ^ L:$:‰bGHh\NX{xg &-䪃!4=N 5X~~C z>LpԔ0yT#=:׾s' R RlϜ6lnltb }s0qDX] Zvxa 6c3҉p 0[5(˿FSF߉g|Qf]ƥۡhZ5Riz?՚U{h~!젝k>_Wm:OWUiYJuJHQ ǖOJ _)j܈ âNY7\ IW!{yh6{xa,ח*%͏*S a/Lڍشx@^G.)d3cSݳ-cvᙈ.]/˪Ӕ )K ˢD)*jcƁI]i@ŎiU/8ܑ%~ K7FR((3h>g9lY]*â̭g䷇ƍՃN<9]\De0g۠'qŏIYɌf:HSB2 zun_i\Hcz ,)w: Z1@/}K6<:u^2R6cݽ O%'DIbv.5X`<+ ~E͡qak*u-GMS夲PN+/d!HX h4GT )kMug.sVZ(J}^t 㯼_hWFAuο\ܙ}=5(Oy|d8KC <{l[~s&N*ҿUP)&:BonƔY'MF9%l[o<߿q*^@)֬>9]@܊ò_[ wIܾR'=ٹ k`zu;m=#jirCR$ ''ʥ׶JИaP)O^`7Lsz?ՠBjTA52?v83TTPwFϟڀ?@UʄwCphH^j T ͛8 iu#Z:Զq76Ǒ wqolB|)ɈyD]--ms%7if}wnнZ^l@3d扱MV {=%dIiӏn5\C//?:Ydmfv`XDk+UDM?Mtz> h36x:zK3{Z?ՠ"PciU?8ә ((]UAJ3C_) CcJ͒@&]ӭ0JW/=23BCC\ܫ2(V,u.h"lmltt׫09)Q6.6 -Z4ȐJ!!!B066ѩ*@߾~:6m(JUf,-kj:J3%^)[nprYM{璜|C^lq1מg{6wQDٲ)wmJFP!'nүZ a/߸qں=жi.O{aQI"ݤNysk%ʢcRTL*+f˫Wkڝ?vm/kcce,i/(** 8Π3pJj+~U@QT 0 }}y.)Rl,ZIzB+/ l6bQD.]*RNPx(JK fs@T/tVzI;1zxA & ˕w6Wߟo_TdV4mz~)W үvj۶^£-daxyD%cF^6ѮiJBU[3SoZj]j^ߞ=|Pn~En((~tKVS,P]_A5|R >4ĨqE%,EPYB I8嚧 t:a/eүUvjmMo}߷^\'R_h&u{Zv߈f7cSw܊f4:I \e@DΧs|Hu{ڸb#yk݈2_4du.e,yk܈b4Oxw?+nIpD#6w7d}wòf _ا6daA||F07͖ך$k(Z> $ HX,ѴΩPJѮ{qE$Ai'E8N?[X8qc1Kn :h޹g>:buγCƌPgrgMG__G0x:ա@f޸'_o3'HfϽu*59sB{!pcrc%xuҨ9qf}H6N=徊=:cmp9Ug, ;~}>dF| Q?OOB0^#& h|6zT|O 9u8 `2B|&-r)f\~:XPjmmn6V~*~jq=ߺltv%8L̈7r쨦ec3Ĺ}9(pOXyb~/ω ia Qf9G5ң>I%z+`\u0=zv^<"`I:p0ഘKmՙ5XL sm`)( :S)vdee8.ɩi_ P(8\iB|nJ\ajj@ "OUcgirhͭfk5',[ڥb'a TY V}/hɈAM4 oDLF2JBsѣ+2 rPdoiH69aּv{3Evx&K/qWEvD[a9qrf1;6E=ۢ8k-\>.` 233D9V+ B} *#ǎNNR4!!#f6_|ɏWjY{11?%-Zg6Z}+UKŖ/2 vT nm6S`LIp\/.D?Of:HSBh<@nk= %KR<Rjgh<9]\GUȪY%_ELF˰NYd rV! B"ʤ RU,I2T"(rjڵ"==}՘qUigP|o jۢͭf1_1vsbw\ ''ʥ׶J(}8tKabBtSNA,@Mif BV Π=R-?9'~eov=G$n_})LLȓ\c5KYy>'HXTV $,I4[n[6izύ? TȱaVV&Z044 Js(^~ϿD[g6Z}zbJJh < O-@t.tμzwxYZ+w7 =4˙ aҖ/'V 3VC6lep3@̜y@u,=7n/{?rKLc^.9t֐D ҸfNjovl,gWjQ#D-r+I$Q^G׾4j}9V(p׮1?cUgo)ުxЖ_?[9OwUC,a8;qôr0{(~FM-\uUת^ceqi4qu^{.[zU5`j3)&[qT.:ȟOYo&THe$IG@`ץ]E)Y$iq(DIH{kc!p5Oȣ4J7.)P QmE3ZznVVˣ~uu4 Ԯڥba. 2Qrn?KŘ){{E|$ ?{` =`{ߋ~ BE{Vljpz{a{Fzdzw]qਚ: qoֺ H&%נ@Tj4m r\޶Ӱ40tozS6ԟk5(_{곯I"gwRdM*m(Yo9挞!erƠjEUm)Mc܁Xcd]ErП(0NɊ(r)A/UNhR4wE騚,,ocۼ~yGӮum@m{E^0سT\yy=-$8yN],Êۅ ;NǖeftY!Zi<+~j=fr"Ok3qEu}V!S H^*w[W|wo((4m!s>l;!'~ NrPVۦ i2i6:$_&U= $]e8>i{rp$Nwy)4V]%17Ĭ]7TT<5ؼϻlhT z.Kb)KEC zyr$aJ;^.빻 i_W[ě~>|P]]Ȋ-@Hj>Aʸ`~βÇOw`x.5>6vvд+ݸ@o~qh:n1dƄNV,2nYLWokfK/o }:i{1x-g_DftKŋ6Q3 d'&tssxf6\.<~iBd1Ϻt[6|gcs&@MK ĕy0-l(AȡFuu5y> 1px~i'&#ỷ|ϕވ]ja*̵G]Ү`k Ǫ onҦ 6ڞ{?^JGIF ϪsR4xDtŎb\[/FKHe0@(R.. Q'T%8v}q%:)h $IqEꋍ'$?}ocK$ۦ)7.K z/dޏ7!&KXH9{Ϝ?{|!dỎ!бu]3n/qyR㊗/\i顐GM:sc͑7Ƕ&շ ggFG= H7ip'_&/gϼ}7^F (ƈ~S$?\쬴3NnnP "qdz.Evk8wWZq8~ضwƪ7 H2'⺬GVwH>t۪CGVwJn[-$ݠS](h:tEA9/%tMto[O9a\4/iZu7 nڍ,^R`BsIc}Z]J(9/sթM^QPT͛7jd_ %Z{UXZG[蕻Y2W3O6Ïɒ@4{$Cϖ#ʑOOf<=ێ(N)5ljI_eyuLI͙H!PmFho9/.t2a ٟ~ ƚaaMeC-iTLܿ(yQksbL"M"!ixQB$BD6ϲS^~zڲNT IDATYo3#xʷaZ E̢4.[2 +4'KH[h:tEH:$Z4D!#\.Yr.iZ_9b*o$fD{,ߵҍ <7?jN]y~T4Uń jrfoKڥb+/Vtڃ7Jh,i9!ze]ҨzDʓe76ezDsEsZhi_k5X,IrdpPُn'ms咈#;nx.l.~w|v]܄4$ovM8$} ʫK^a+/)rgwn9K74ɛk߲c} /KKCMxLwOCa9x`RU~G{LK%raWhe~?LH@d}8e׸^6TnC.4!5ي:<2rp#BF @R$DqKc!(~x?2P[_s_~thDG@zߔCd/ˈ9gҚ-\ɭFu_ֺh ڂq}͇Uȕ1̉w):%M='گ$Ab&aT}gIv:w)bq2 VLV!jWFAb羽Ǟ4$2,??o~ǜ)l]n3ёQёQ_VHRT3Z6QV;[Hֽc%?HdҘg|x.2C(ⱙzs_*_4b:3[ 3 q ܻg{}t\cJo G_$$ (' n=}'#K>([G;Bng_*mr^w&<^d xv(1Qfݳ/ܰg3# P{aڹÏb$tawes¥7\g2ìR<0"K ,ӭYۢk> jܺ[=,NFwIҜUx@!/,:hM Ote&I @ "%$@kmmDzbK, 7͢mۿMmMY@p[[a!N"q߹W>$=fm\1ԑz;J}g+lW f2]Ig}Y7<>^7ѿmcZs#`>MtВ*'[}E7k0p> SgƗ4!h<оiVp<)ZBs:$4 s@Qj9ws"l۞svS*0껿`h1_5+F{Y`pi2/c&Ki t.#l >١w'2^<9t1PRۂ`l"qY !nڂ4՘Y?mb:07 #rnj\L5P&m۾`k4+Mjkӻ>̧A1b^&5(@Bsl7~Pk&0O)ͪRg2*7aK1YL<0`o_̅YJffۧG ];jir6)f})*i@ֻCzcBX7jJ[ʦ^( ,Cǖc4{^K n_zQÀ%  ۍ+,А }~C&]ӭ0JF]721yꥻGVfFhh{UTFOн֑7o 2sMl51m6o6$b }kˀ=1Sֳ]䪃> +N7NP0yT#=:AZVD>l4Z_yq"{: !q ,_MNL!}R>T'jr"֫WwU[E,&^k  K.}2*ϑf IM >w2WDt]uK1Oݖ' b5( 4JH )#P]ܒȉ# mKI"VmQ˵.DםL?|Ng(4RlJ[uj)4FMy*I :uӻ7]VWNյEø@E3tcTV**ARKd˛ M&b y* ܾӸ"9]\GU_cLIp\/<Wڊ0[RUĴiT 3vIʒ7rVVTIIMi-jam,ftEFDu۷{Rz@ :v*mkV?\˯CmĕOU}M*ѷbfMxxbY JDTlu̿Űq ;(b? @s6=CY~),[}~qog]Teq{kxgoˉ!É6e)M%Nzum]''6osm˭h+=G,XR }kg?۹)o4t2q<-FHҐ󆔄_ݴzX MǦ%> vl6K&ANJ͛+fd%?}zw*D~[T>j~Vkomv؊Ŗ.@u/ku#Έ:6,2 <&;'$,gj)fq 6̥е `v3opݹ]GeG 5Q4\2ylwwݤG Eiu3|Eзo;67 j$ȨNg)L>7uwqM$mv7B4T E콟]]9=,,'g尗v*]i"E5uw?B $~?~ⲙ74f?sٷr`BAOYH?8Ѻ;GZ2bk89;-{jfvv6LJJ2*iҗ_~:78KujP5XYYA$EZD1<2̣q>1ûͮQP.|:n1Zbcj<3v&e#[`^ qS@#++b գv瓓/_R[ydځ2S`\*(%4zCۡۊUޚwa06zD"~U!"΍;o3+ůϟ6s׉--*tAgbqUP-S/2AA?yS10TsKe,=Um+C{2=Q ±}'kC?`v?gN4֫ rEem(Sr8C8P-{$0.k|(c#<4dH a.kєWC* a\*(c ؁Vv"U,*зk%A f3PP'@͚5 ÷ aL]oԯn*A$ Jff1 S$̸W&L'P\?ê(/mk\*8%46+yY /ɠ_HkW.ѱcMGP J$ʫ:W Cxz9lfs86i%f+.rL&wrrZXo<2`9x}w%rYdۥ_%h-Kڳwwwyejй}x4z}w*4z}_^fPxθ@+fd0K+Q50ԢN<.yZcFT52Ie -ޢj^rvڵo߾v}WdJ%Zd.CۧL& T*AQ EQE 1E=<޽}+c8I$/_R'qW# &z1j]qXX2'r؍y3<9u%#Cn垻r-a5he,3#~8ө`VR C.͡E^|޼ZX3(70 JX^{ϸP~ԯ{>^_VA'^q1z pD#\W D6NN_R 77٥ ?/3+@L'P\?1U*eO^J=m`]҆O6oI,NڼV>!Gֵ:Lc}K @MA9DS7eg?Y˭nBQϼq\^5=}[Z|@}Oh_ݫ&$[wmYӳq’z8K/GlxMvܬTC%IUԋ2_aſ UOׅ6P J(}O;ϟ?߻woR90|7n0@޽) VS)+%:rջ H pܠrslsrrp "''.77?LLR,.oLԡy\g>=h e\绸 (MISQiO-@ X,";vPif{Rս~]z:tCQU]q1zȒ$b0w$ǥX,! bT"q7} &&p)wvMOm]s 菥]oLTP:E5""0a„SZLStkQM饬_֭ EzJ*MDf!$yG(/&L8AY᩿Dܱ^z"MǞ}]hi2p@WMPXU>"d/ǢϽuݦ)ұ0ŌKȗ̻xI{J Qr)PXճ*;VZ-,yl!;FX$Y௿l$2ü!})~5_[.v!U$~m|>곟Y޾{OP|8G#/Hkh^ Y~13y_6&өQ8^)kY7xϗi_Y y?[Nr?^{>y>bEC,.\i\\haHB*VU@a'yv#sr 8gm5az rc_7x,YEi5UtX7f޽mKAI| Z Y 'I}CLn5!$wKn&+X,y̌z>&u:B*eg*.eJ!ؐJ:IE+BV:XWc2I_U*գk#gȒ:ux?KgE8 RDwn9,BfIy?q?>`9dPjSm p*Ѱi[X cng8 X~Fd}د3)lgzշ`よ a}Ps7=)Svՙ' YWtqbO%j掕Y*Ux%dokb;.M$Y{%%%>xO[W[2o6b?=N5nDtA, GTBYȪH0(ӈvJRqQaaazѯBARyL'(SȦVvj=:SV ޜl{̭'6f ݳ tyM^i7~bɮu- ?9&ٌ$4FBp8+"՝,۾,ۗ,3imOxc[+ۚ$I8P] k'e{o ɸ^߸5 2# Ij+Vh5NpFOgWŐ~wuUi+w}(r*֌j3nÑWǗJZkR#g\TCUY[R$.hJx֑}59`M69%_TSeۮM.}5)#g˦=7fk6]8-ަmg!EfdmZ;O + NҎo^v* -c=WdPX]+ Y2TLuPf6M9>. m$LIe&88Z Y4{)yr9N]D^.lQ3!ߜxe1bC3 Ө'W^K]rω^BGsZ^Q>OHĈ*K:c5pC{w>'j cF[\ʔqP 6pHs'F% ڷnfؼy4i;ry*lE H%L$4:u~\K6~XTŐ.Av< AD(2K&4Yc܁S _S%{j2չ8A3j05SWH7wAI ݹ 7䙊AEߝlu+[Yn e` E A/9dV-} Uh_~jLuҥK`ɒ%OiN^lǷ>JSD(&X-ٽKpZ| ?l4t;2MΛrM?Hx3fbz?R6!%KfY?`L ffx-gݾ|ܦ4 pm=tZ`![~#u_ԝ hz~9?~tww__Ky2 zׯ_Feie2y&RROAk*6ۡCD11mfgg-Wuk#ssw}}zJ/nJWjmjie5 2i(/ I q I°ŲYl/o;wzyyu~A.}H 9LX6we{r/'f3ξb+46+]1M, 檮&/tkvڷo_vroekhi2TT@ʃD,zą2a:R# 5t7ǿ<>- k:‰~1.K;K<ٳxɶK/JkѨ[vg3 [$1ʻszi﮽s"BEiW#< ,}N]v\!a猫tjeQuv``*9\UˏNo&q1 []> ׫P+U2cLҵW\S NPm5L C*pB>XviXβi3:'o~1.K3KD1o柑Zy~ &ّ!or½L?Vtq Ja=}o3oR 3oUe|pr8^V9k%cVW}@$DPcQ:ǵ Q@Mc`rPW~L^e)@*b(F\;˟\w9w6]\s!/&DT}(d~U>s6Whׯ]z>^9d݇/n(czW=`B Ul-:襢 VW}(J"(sp9j|T~V sX ƥbibv-xf͛4R_̧gSGwv*"GI%4gxڵ%d5=Dxݦ6HgǗ]4ާ5.fd^B,%ϋ KbtD)8*XyVu؅ $// YLMra|y9U=+ѯ &_wAmrrr1 #SG?BU;<~;qX(J*qh{Ɩߺ`@j*A RA,7ѩX:Sr*/gFnYSl+?fExpN:B K@Rib9lw9̦՘ W>a݀y-gg8FmZOol)%XW-:{m[Mlxມ~) |'>>K`Qc&_Om>-Dޯ4VYVDOw=הMk{80S?|M|nSmrm?$lpRܩezC]oKU;R "Y,) Cw 3@:$U,6'miv| npW6Vھs[Nvݗ=bŬn,a#hhFVw;v|_|cSu|ѸI"8mf0^[&[0lԲV :7O㧳V5 L\bĆ6_JJy x┻_%-->[ǒc^A([IVeς]dU3՘Oܜ9Sŭ@ŒJz a.k;9@f*HuiXI]Д)d#l6kTs;lr ~efK$aQ 53|J,Ovi\F[3MMDk!l&£ <݋, ȼ'x26qYD®;-0auXT~NeS*Ǔo/ oT,˵<0TjaH*@f*Hu`5Du&;,w~7@w4"/.*߬eu *shĻOJ|dKK8`%"r7EL>Hi 'zsFtjcpVn<D딕?9|at*r /[-EJb# c9t7 iy2giU/py婿'G!UwkyW*urfpoUMa[p_\>qr,kƝ&DtyO\9ѫa>Tz}Ej) 8Z0JAZ&u*=گڵ}+/ÂbT"Q^0A' ݁UJjbhÌF/Эvbw5(#[ b̖*_J~Dӟf߾"nexBe}-1R{r?_Kq=>*~~oKsV~Δ.}R$*p7̾!tSdV*IIIus<4DXpԦ(9oxPd$yY淳Hs~4[^yvǷxi{:qI,0YiF<xxzkMSIe JXkh)@c :zXC}] oj-e9gȼy2dvlZ=iNn Y-AlQ>k [,ƣ/sqa4S/?v¿(EfDo="?ocViP(pyK oq, 8P'IsB/9&}GsPs?N:Y (!ʊTY֓cWSZl9 F}臑qlyfIWٯ.8 =u'6t/oVEeW#G$/YX,[[[3l@ga0L*b"U˖/igE4KGurXP;P@XXgHHȘG>Z*ˠڷrGELbVލmV/zROʅ zz@Nƾ_ͿU.O!aLEsĢPT,~}jVg%Cj nFPkxyoؼ]Ү LFxo^/MHS#~Lyxة i9bQ4LgI!5 ? b: aTċHul :wّ4<W'];vxڵG>D{ɓPVO/j)urxHCR)ilE۠[oϜ1CgΘ1<^W -)ۯЯaaaaaaeV#"##СC[{/2<<>"jg0c ^G"GAhr)(/eXR fn-l9/$$NBs\>p[95gSMLt'mcHe6̨95\*_;###CCCCCCTx7nܠׯWDj3bR @¨XS%,˪+>U}0!SlǦfέxo=\OP\oD?7b?i2sW#_~)>܇dʞLS|rl pktqL;o\R.l.ag]w 57" 1x싐656sEUD"r5E"ѓO`!nnn99^ :yģG;tn~YVFݦtM)>Zz j/> H4űV^9饬_֭ EzxZ c~M'LD" ݹjժ=zl);U,o> 22ZVrU)=qpZn4µoU%5\MF6l!9yTF u@)Ӥ3U55w|N8VZ._2h em7 O2@,tc^',gQG!L*:, rs][:_H7`[QM}ɡNA C=vƱ^Ih\!*l߇)YlΦX=8 5ߏPkѼEQVV;CCCK\~SEv -aiBݥKAtӡ֔@)-R)Q+X8TtgfffrrNSXd__ߋ/VP˪CS=NQM&B |זgb98p81[-Yl8$߉A)ti(tLTlj+& ^;d=`_CP{Ų/V XgMɃWؔh&bp ? t`/b3p W/J}}<"sӗ^TJ IDAT2(xzWߤ>]'NRf26w55w s{07xGkrݷ F0Yc7ry R_$z%a)rrԯODA~~}+%a+(”%,J֪P)nԁ#(x@gw(gerj~uF_Bӫ}ʺF׊x%eUT+(X=ꪱfBŰ,Ա`ňYWEέyRԬf38(۹!OG̕E-5Z|u#\[q!Q`k&EyTrSԢn(v,b x߽+v?\9 !q—Cܚp Tzt98uשf,^,8SM)y,\l*a׵#+k]_1f[n 9wwN3s{3|FBdMtq'}jY9K_>e5~<-Zȗݣ͘x]WC5i#`4klbIj[8??Od^^^jג64$$K4쮐J:YT%B644t޼yѝÆУ~UF-DŽ3e;|~9Ji,heҫQXp I`X~CͼNBon9(d1ݚz9,G`S~s׭@ㅁ dbs+BJS ;Z{`^V6lkݠWdK>˾Sz4ae=Z r2X,cY}s;-\ruq=rr1{6jh@8}~ݸrwm٘q0ڹ6lIZ]Kؔ$},Aqئ5e;Eҍ+c|mM*t3{20}'o7CS?l[9JFlޝX#CPǖYS:XH$@9̛Ҧ$l@۠j cA7P+A5ROP?DO& 錮vСܸqCcP=97Xl9~"U;XAIag!z#k&d$3Fĩi܄=ծ0$mxQ ĵרjL(0(J[k*ݰ"Ԣe]ñj =b} } ^4hV[QBRvV!"ŋ(6QR\"9S 0 Hy`[c7".|Bw`˕֋{=XerRU߰gp7 Tӷfxjj]ix5㯭FVceeTIMV܈@gcckmmӼVv}I JV0/V_* O/Օbo"ܸqcׯc|~Æ y$0*A~e0~v-C.,!hU.C8sdc |8ɇPSٴ[G5?^E | j8$5jG+->ΖJ$AknGD,DY)zuM,L)'# K$*W>hJ/@*@5i&e +^l) ZV 4RA;Tju;T߿p5%tZ4QzFlXFš0Z2nU_FZ\80p:;:F>@[vAkE|+q\fUI"Q5P}L&stpl֬ $Ib/DOq~QvZBEOrN _c\p8n؄ ⤮wr= 4;ڢB!d,#ۧ6#CJW֠e֢١bjs!h5Y0dRK@u.D`"Tm k՚RPGꀖH*+W{ ݁LF~4 i,oAP_S@SJX pjz!>.Vu|L8;rcd2 \&`覽_"$hRHn&\[bdb `s}V⣔9&cW)pg3" @ F~08k/K˕Q#BQ@bk]!I0N[n ݁UJ@FŖ% FH- 0g5O V*5/`T0Wf"0MtA_2 RPQ UBݹZWusq~(Ë~K0xӷ_eF}N %ScwY).iYڝ]+,1%Q\,!8< X8;',@qwWؚ}W'YVޭO׋Hwl&@@ӀG;BXҙ{CDfc~Jwl:$wio暥je;WJ =x۠V,6##˨ܼ|(FydGSԱ=ΨrTq Aɂe0DD>%M<+Ϊ)hÌ.(y{a߉;yh=[S{"Ÿ$xqK Pi"KDvdHqۭswKy⽽ +oX 6#wՅS\4'-ZJ̖xU?s"H 0aW5Z.*ɠYYY_<^ 100T>0H_\ܦM`vv 'Y7ֱ ;o%W|GM?kӡ_Yߕ ,I0e㞛x`?s-L~*p[ fsqԫo-7.@fRƺ׭SGN100T=YYc&: O$ PiۯL 2 u7n޺q[W<]c_Ʈ<:S@>?8l{Bqo1z%Rxw)|6P~aOz.QM? /N^ΰljKXIB*"ʘ7kYت(`(\c 2T-t(x-Oy쾛|㼝Ѭʳw._Sତ|k滉  \K0;EZzJϣ*auk I%;yp@Y7g 2$ώݯM4@-n",ܛ<;4pg*h3rIB\qEfu &T杔ѯ AD+N}fمbh>w"o+4U ݛgrլI]8Wy9wl(̾VNv,[4;͋>lȫ5Y/I(0QPkOYEy6=&7ڵ6HŁ}LKri>@\׿gNy5twt|A ss?~^׿!*d& ~铷˨獛4KKJ=Ç٬QUR(-Z"zj˫RСCrR"6m%vrOxnm_?=`<6;.Tڅ:232'NINA$Ix1A8ήG">xzzW]OvV Eg_2-5HXc;ͮY@  LR*hذ\O"~m2TL0P0*.eV9';+#=t~rRIO/ZM*Axx`|~>U 3 UbFl6]@LyJS 6n=~UJ>ni{ӣ%~nCKɤ~ܑܢYxxգ7)Hnl٭M@Jn\̽2ɷuQX<ѡugS w>h½=F. ]_mӣ3;Sϖ,7Ț\&涳-}#}g7+5b78([<U)[%k ?t{xU{ÌBUXѯF{͚9Y&*aUQ_Ⱦz/_{z5*J|~;js@r@}!gH,vYrE<ƒ1KS 9q/:] d혟ZpG+ pGoʚ 'jةt<>EٰJ]d;m>Su;gfZ%+"eM;P#?4QFҢr3U#z+ࣳ{85 4tYk[윳AF`7;uP=OG6Xp|B[E-jL<ٴ#;|ձo|qe$b·cՑL)y֋29X̹AGg]:f"lƽ[})SWɎN:1qC`Tly0d2N7!PU_|OVvjn[sD|Okf(UDJSm8Rם}M_j(,7o4WY(kJ}KfGYӫ_畑}3紧y:W慤˃߽s.}Mq]^El'踷yC'.(m~t1&+Ng77loŤ`]t.^xjyϪg2]1qm֦G1_kY$Q=ko];vG\du1z?>r:6']r_޴ZxK5sDho=. /ߓC}jj ]5;rNJZZcT"Bl 5u\']yKT` IDATn2PMpKva4ǯhi`9`ޝr7pAڪ&~V[6Pon hSKC[{֎ynH]ZLa)[+XwgYTST1Kn{7εRm9S*xs 2)̆KFz>!`9wh?W!QglzueŇ`$%mF.ݷ׊@+ַ̭ }"SbC-!=eYvV_xw՗##0}G5PˏmPuzp'[;~[&qig9j+*P6<ۊ:neT?gcgs9_D +{; 9^XRvK>5mdGw t3򹣟>Bb̏qk|mlx*\c0g1ܫ^z}G^}F7P< xHcL}}yl2#2 BQ ڷ3KcV n`d\Sss> UO-}yF^Vז|t24gimz䣯2r?ޏ 4%&W`#^U.O˰"\+Ž-` }?I|ydtЏw<WO7=ǹ̈)%˓ݎ,K|j^NfJ/;Cs"&On#ވv(Q^S, -+e˩i3SVKYxh|PmLvK_`D(g[@|Ifo&+<檀?ߎ+ʽ\  ҿ}T괻 QW{[w5tox_hhߎ.x0f8DoWra?3A޾m {Kjn^kה ~1X-|{|'=' %K{@)vŃ!T^rrNQ>w(,Y{qAHB@}fts֥Ў;r+OmK⵱JiqkDBй:Œm 귱o tf>Z,E9y tцQvLNG~u]91'$撙"j&hl,nqUQl%~y4ԧ8WܺslI!;`0< ~`.'6mڱZxa2kQ~oMx0OEB~>^_~شZ&Uviɻ'&g'AUկݎfx)Evu .}۠ L)o8֦Gƽ%{l,1UQ)G] kD&NTVDE~ 9Yi|,zׯsŊij0XEqo|k~oVpzSきӄzt xY<{ ҥo>B`V=]`1=]{KIzw׍>˞V!$9GV6T(mDĖr aJ{5h'U~L6wU#uihހWeEӫ{3Tw}*FD/q$Y<>b֦F65oZ:>fLuϫ]W fpK (z)dos'IH9>mz4JGߨϜKd1QO%y8ϴp1+^4{=Q,Aifb=zh8"TBnFmcԠ*Nv_Za|m.NLCBxY$>zt}T\qڝEQٍm2bETDZ:^Xw7 *ΓRZ}wDg"6u+ur=b/5++=qhr#+֖DŽǯ_%=>=A[7h-P_]>jANaymkX ^D VsІq9 i}֗^-/n ]K%J.7PKK5yU\N=ۛU㞓r[uF@T6V1?B> mq#,'*50{Etw@±DPiMc RI[ Rr]<Ώ8GPYyQϯ}Wv(AG`O ~HVf={ ݔe&*ق2Χfgd|yumxaxe q{/cAͮȘ4 t$(-Ѵ^^Q@OW= b/ׅ GUݲ(0tJ[O3O68U>M:(Լ\N&8%.tSfC.~ndXʾuqIQY&FP¤QT @+{k9 $t}0uҐqfYО:ʿBg@WPOx/M:±iV '^&FVCve<ڷ8Ct`X?<75LS$bp~Ios57&G`ެpA K_/t5521ڗ]w*גdV|lՉH'g_ .mxĒYv3?WpRjy((y%m?Й,#|s+;f"JHZwqjFFS!sHa=2p >m=IOp$R4%s7i5/#%kyffV6{ TV:7\O-Lrw0yӚ++F>s&PKZ<+8^|:"m3+ i]zx낃 w8m̘3;n^ +e r9~ɨήvh2M쌷'F| h=mh>D}psHvlEn׾ 6PVɓ}zF՛c+' tuv0iK+lui"|@;X.-oxhK[~3/''?JLztxzP&42||hzڢ@e8̆ǮV9ƤR):0 JeQgQF3&hX| &&=LLJLb|_μ0s﹤DmNʾ+콟]`姦p'0 Zή&34Iٖ<ks-P/\yUPZh5({,]);n zOu @ߟZΜЗVy{#BLcKoȤ= }ޅ=}ߐޥ[6_TF1 PP~.xsYް%-iFi ȨjKg RSٯ/qY3Z;N+g78bOy|i9m"$s)W&++4%lV0s5oWn]TG=t7`?Slz9Z#e%xgܔZ:FTz؊sݾƲuzbFEM%;~R 0H \+%f,j#ƃEotn?(Mx/1Mp=gZQ6<}: #yQ3ٖf2.yywdo*PWvGPxmt}a A3v&$gQ=cNQׁ` SB͉]}MqMfD 5o,>i)Tm?o YNBf({9~TԼ%Ǭa"`Egpuk2fTTw՘`<8e8'm:]&Aa_rP(_X,@O62}])ݺ.wڨ75NDU%Cѕ8D"#e0*Mw"+m ROdT\:mJ)13PHc}cYyp YWzBI2,_/D15$DLfz^UkGSKYIeUl`p"8XIR5p0tRsvyӣ?{yA33 ܮQXit7 hvzXc$l_8رU+M^wg?$4یx -Q!y>d5λ,&z4J8Y;-uRKt~G@I6.a+/zuα*_|GSeUlHҸx$J+8 (exum3*p8,JK:NTTTdde y\R[PB v#Z#50d@%o4m"8R_Gk^@ѪlAv) :l(l*Vs,oX̦qON RX\wz`44kh'g;XDRIk$ce04NDG CT5&d|$N0wZ Bb_"h]> '8拘ѓ8+n4aC.~bu/sPP&h9#gZޑC漭6#bۀU\gl:vYZAUyf31`SR*&zN! %w/D99&L.GPqbkjjTTU F}C=3†lLH0 { WY gWw\{KLx_`d܉ZO׊DIɛ.}X` WHXYqjwd1f]q92 ƎS8q Ыcrܝr)0JMu7!? vB&utj1_M9jw|Ro˾)5Kk66M&xR.m lvut_Rn啞G-..Nm:E{6y!?_jnn4\o%!8%Zp~tI6.;c ]ΔՏGymVbm&Oe=8*Аs茖8f2xy;,ЉD e*pe,KQ<3e}I&-tVeȨ!$ECA+TTF:V6lFUEAVi|x"Q&Av} rhX'x/v)кm5bu]}qHrCTvT6rUIc4Rts}ؾ+ϳ[7ū" B!K ڱ@_EeNJ_uhn% :-~;Œ91!6qRhr;3hͬārv1hGTv vZ?iut Y,K0k?  $ƮsB;u0LHh?7ٻf-cr Gj(;q5 y q~oس`h({u U;Q@&`شe^zgI\_iYZ+NVVnepOϳ^.ԂZqE4G ;~&+`ɱL Gn:ufK!]Q`1D ӯ őTƯ}pz*<ȺE\4TUnU`^n-W ~:J-RvrԪ] E/--L {[[8?y1̰飹Wd@5m_2:e Je#H=>vbXF{'n:%9pfKPETbF:X] LٔVn;d **iF]Pio'a}+$_ic e813V2YZa] VO/Ґz a#ְF,fCƥMA#=\]_Հ-珮8-nń.CgzH?jgx v+z.ǞGl%D?yw߿{8VY:7{W޾~prd+),5??_҉㧏u2T$a'sP {߻B]􊤭 WmMSI^<<1Gzhx >ry$Rw^_Mew|YwUZi4p$iÏ9<–aDFW~`$^@FVDҸ!jml@jdzl0ɻwZ9TCEn8{vg8d ސLFl,nɽV9!K"煽"#v7ș{$ͩO2S 5HkJ Dt6cE]eο.U}+=HO?dW fi#`9ʞy7~k[*!:FOPv gbɅE8>"?mE8̱<F?؟^m^4~A ԼA; e#"B &j0E._HwjuFٳop}w[/eK~ZOVANOm Oe{ V޴A6eob_1NC$>t@j>ǿA6+HZJQNAZ#ў?@4*Ҳc@7a3M[cΜprVcm^6L]=zI*'FEZ37|&~?HדgE֎w В=zb$t]V-dk誈2S"#J7WVt7Aa4&|nMRsySw׌;eD3%>tNX4C1lm3FzqyijǤT:0iT*XAc걛Y3]wZQK.7@:66 >5#ZcJޣYmӭWׅY:&+܀3R`{8/fA!X e{q\;H.䎗 Km{m߹AJlQ`5VXLw hPY \MO8>u9mB m$\81 )5Ǐ o3 \(Q[q6 ̬CrgjEA@!67ZYj:t ~p𐣶b:?>9 hn @^i֍9+6NkG㈓s _k"[N*2S\q;$aOOܪuk*u= +MV$kQծ7lV\&oUaY{v4Wq˾ !z*'.%$zPL}.#wA/ʨ()Qt(b9\Z)ɥՎu#i#/H>@ >z#kYD9מp ('A#f8a &h%j>ld/̌Wr$y vv8x$[r,8|eocږFl=FD{k%٭A^Wc6]ZvХ{ck-UY̚Еhn ɠveb F<ʤ"9b}./^(Z]owgPj%_EJp Q_|㦈Ēz['.[  خ:5K)kz:ׯ8 :8Iawi$hִ+7laK瑘m[ks mbv~.D W?!|Țj$c>R s??2IE? lAAAc*3Brղ? "_~ :',A;6ih @ec3~U(owG _bюEDn2ᨈAG/m-'rlC G;v>!??rĖ]aS}4HG>K!'"'xM@*B  ei-IJ۱LbZ1'e;,`lO-e}0$`%u}o$~Fb|.QFìMK\N(@AA@Y@= 0YYZtlWǿA69`G,tw(a+!( =UU.б >*y8=^_nwNRp.@}~񯞠r9p /'';oDWOߠAH$lSp;E])oxȯߗ^fgA}rϚ}wL'%Ǯ^H'hd۫5M=3b>GI,叏I:}W7:^}u55 ͍|Q΋9H[`srp' % M -M -Mӱ*鹂ԥ{Xhh52aV=]1PGS[vȬ}O+x+7XGSb԰F63heO,TGSK7HPS -M - Ue%&ǵ3UgYTST1KFk t0TS1wsp6+ikꙺ~Zپ5^@Ws440N9_U/xjkj뚹NG1xo3Ka%,*=*gY79pZmX]\7ѨIlLWzC TVniAէy9ڻMܒ5QjsxEfsG?ձ]wٲ|!1Ǹ5>66}<x1Rev'j~ ?LdFd@[/ڷ3KcV d\Sss>eyoO ;=>;jg_-f` }?I|ydtЏ\܉׎~NC| p7ά|;Ԩ/Yo/sgmܓpIOUss?u*>g>*r,C j24giZ¬q453b{F}d% H7^^ O>*#/@q,:"UO-}yF^VזQ^='A ^8?PpzfבZe)k%{E)5HAh΂^3xDžU;2jfxO?9g]N #Զ$^Ԙv+O$h)U?+dTTT~LPS[}o?sN.LsO***P8"GB4?Ċ[u(QhpKEuU~kT|YҝQ~oMx̳wKH~>^ͽlV@Ы>|(.j#q/G%qb}ÆlX(btLm EF˥23jA*zt7 V@cBui"+4>*Si[ {",2^zѠ|-$ٟ#QcƑgSzRDd i6Cx~}: ̙BYtdFiȩ=_I`͟DE(ڒU?.d[h94,;UUU޿STTӶti>[i .*d{H$3 VW.zͅKRҕ薿;MG8;^̪7L>6F&^{i'f,ӽI3='Lj #"ChdNO1! (KPPmCIhR?сQ_XP,jS#W!qLFPvRغeU*oOO(,[C Fry5;6w2-?H2sdEHoӵɐ_td9l 0̊?*;1BO N3Cb8&6g=sY;Q5q6l!js=SCj  %HȒk+*Ӣ= IDATTp.ԈLZ,lP5lZ(aPֈ^eR łhɫM˩wQdž>K|/~fX8V c@ͮȘ4]$Ci27ԕܸ~7 E\|snK`8,VQ_TQ!';+#[jdgMvHέć!'nQ~< ZWeyB Rߩ/Α3ܽE(٧By_(˒9G216+Ծ9-a/cޓX;[F7 NJBgb ۻG:HN0wZ0ؗH=HPx"DKm`xy\5jF#i ǩOOC!={1pi(57&@-Ͳu߿Y9g"Lzѫ ڒHէSR-or"⻉%L@(Z}{(ܐ0 Zή&3q@ɿpUA=jѳ>DIɛ.}X` WHa†lLH0 { :~V Om)7g^&JiIP(T* FWTP١̉ȶ9. FAFAlFœu$X2{[IfCcW+7ov"X9[d72ieOB ֜oH-/|jvQ.DfQ|.q9bL ɵtFaw-Rv2\ STjB^#*K1g{fhj-J2Xq|,Oz[^xjAoz4dY2\WS:+Nls"(2a"GT`c:hS'k|9./Gw쩩k1;X7wyYSQySzzkG^qjz.[in<9{t\Q0뿞_7Y&f;yN沇b4wNgOǛkhijhi*+)khjhijhK|QSCKls253I]A-"9"Rol8%;Eg\K~N V5{TVpZ=F,9UYÄonHVEAA7AUlW; YϋZ[EyÁfaT}]4Ym1II1Vn`V>^0rύ'e6zFDLM(Hȸħ榞rQ6<}:Y<⍨,9h%;HLrīw[hu3jOevP(6PPP>Bt_! _FbM#%n տ W({=]/.B+J:¬zs4E&h}΋C(a6߳^ٹxTDTĐ:H-&Y(A-ʨͮiV#;j1>sԙm'Y?w4zXDzb6;T@c扳]-M>pkZ<;{FsNXtD15$DLfz^UkGSKYIeU]N!ە̆:|I!cT#5ϽaS`DW3=oqԆ-޷\;ުwqQt]>3t)"؉-6&A~ RҽIJ9,., wvsggΜ9H#cmfvׯΊ#Gu0k6Bb~4y.{Oսo'n,׻j( qXXЩ"qlKIp/ֱ&uo`Vƹ\`oH²m4lI?BcZ%Em{戸>r 4 ]S;삨g/)KY@ϫ46`س=ӛ8 "ba1YUuܱ{2g7TiSDVr}rҏI_ɤIxN+dedKz }~!wQ>m+6ϡE(s\Z.nk x^Wj:[.ut^N^Q]n#P5,q ؗQ&U!zjLuָEcT:Oߵ\ _pgۜEU/GF<:6)|֊]77Z)뱛$%cet`^NMInWRkn *>.sɨ6V,3|[ Ŭ[|rʬ3-Դ:?5nY)4v6M 2f]xj;dF&1xi<}+(sk~_3IRG!T;܇S/Dd-7mB=lQV068w+ _ֲAmN}~TxWD#i%\Qb" Rhz+uHaA %+$ vum]4G+)v%%Ln G{Jӟd1hだff #M)uyZmvdZ՜+%iq{1mg^{ T}MƌV ܇TyWJՑ~q\ow.޾k.|)1kF0tzvN}SN.A%u[9rکȤYs.sQxO|#_Crzy[)Z3}Zl QdA5+J;m) u2ir%ȣx[y|`FLv  '_ylh\V͗? פ}s60b}VבDՅ Ic!$<p$ L=Wo7'{ׁtSEeB -Rijy8;ʜԻe^nF<;7hƘjV]o_"RQjV#u{RwS~Fص2 V~Zw!4'6& KU+NڵőP'1W( NӬZS_O4C&35Q(/@0r۔?݋Ԣj¨G<4ni`8G[gl}gdKG=ϾBwSTt]/ ]NwhÖĚm8og @u T[A#a@%ZUvD*46Qq q̴{,^my!S]DAxJ@묶45L&u%Ύ%Ql9mj7}2 d[慦]lX,u]$X3*ڬWC|),sm>^ؑ̔ Σ2jA$6ʸ5 U {"OUWW_?'k߾|݃ ȷ/bw`#Tv}rtFuMT9rԮ6Hbf Clp(3{2>:Ӂ*Vq9\""=2p%4܁|-hp8~ *SJX|ŅQXA6RhQjeJΩ쮦%~ +3Y^C:hFzq;S]D5S%tֳ+豀z8djC{rTAC!8^wL!\8e>7S7mDF2bZ~I'b*WDQBm6H9rGQ9MCbALFQa"#`jBe (IPe|jCڏUEj$hW=.ľ5iPK8PKÃp$5bb G?)Փ5z[7e)&Bc۫e?Ga tQ JQ)S|p"]h*b<_6!`)IkF8jXEIQ. 9 k=)vXVxALFv[cy9b8ᘮ+M.=M}h .O+T ?|Tk6jI#7}~~X./ 'c1H)x`l=jzx:;d9`alsW#ɢ˧5eK˖|;l3 I[VsVxHvDZeR$ *'"іҖ_I"7HOwM9!V6$"I|FI"[ <]Y!c]ٚvJr%@T9d)Yb (ä[Y9RZ K!T=qч1`e=8c 1eYU4Nq&mvnN< (QǴ*jŜy^DG&B3D׳JXilU?8RsXяޭ*䄓Id'uݥ-_ю R~ BBQ/!De7m5*:=UQGuAe06ȑir2p33+*\ ( ("@y/.H\GR7Vwq9\ > \ԙb\0 d%x*;W6LYg ].TX1Nv+E,FSdxPUE+'wS2@aׅmogۊ M%iψSs8X3 9Øn,GT5,a&}Hmikw{n~f~oZS f$B4n|bimTٺh0^K]VlQPQ`T&}OmמN!#GNsiX2q߿'*S(&&]Rէ߀kN @lup : ?5%Ĭ LfTVtل:mߗt+n88E.OR;\."wFqVh$ m{ԽVK6;\eGo;/Bql9a[_ c0YՙPPj-(*/xw4;geHNKBGs̸Lq' `%\HdiX^Vnڋ.8&+!-Wp~HƋD"ض'\..u-G·|3_?BZ:UyVUPTLBtZI/BQ@$jjfƨh:YoooHI!ã;zj (qLJaK| n{y-}pJiZP5/2ZҮPB8me6 K(p_˿tq%^jk Bc3xeUe<35,N&R{zdNQE )eծ!":I寧f HD2 w,?frZ%QO'(Wor/`\:?{-w(GveRߐސH[[V i"#1#4֩pibBiY^J:]6-A^nr\FeeEy^yy/1Q7ܾuS0&ڋ f#,`@qж[oJ咊j] _%Ct}D3F4Jl#QD@h8O )cDv$=gި}o'Bp]zVq>(W/*Ye)ȸC|h ߩ!ufnYީof>5p5 2"'.3!fONcri&wo-O9E_~feRh5,Ǹoc_xEllLZz*.ijh>DD\~F:>gY|rg÷V@X0l+3J^fJZ1I]ԣ9ʣRex-$DI]8UL+$INrG1 po KofV:YY: N[|cߙ y_0vh Vp_c;ie?egb`dyB;?o٩MɁE톽 >3B'EcUuyIFL)iDRd_d[3e+]KHDWVp4144osZgSXsr8Kkrd; @VZ֓bd=ҦOӨۡT=V1Z[R$dޣ7زCzzٽKW={z9doS:D=iΊ,MLLxLQضS|pPT9`eeQg=}'Y#,eNQʉT 5TLd,/-4zm n`y Aز/P*@fNXH+_Q2~yGOclSN}{DSޜ w= W^|Мszv1=5-=5ӕjVb'^}O2K&Jb扻_rխϙu'̤C?iɷo/b, ˓Vqx{(F$T5~5,]6") {]FR'Q;qcO|OK4Z&6X?/-=EI!jKSi9ӒRBu.^L)W)تIvk#Xg&vum.`pl] $RVffh}}2ۇD$EFEzZCCS_߀ɬ(*عsg---/knߺI x dAyV/ſ`$DG >aaMl"$VHQ-Oo՞˩7QJ=:l/cοM¯C28߄b=xސ}#KkA~og|L^ 71ZwzI̡mĶKwi8ɽ3R,j^͗n릎H-'َ\]z[';DP'&TZrsrrlmlh9s*((ܺu ðW;;YNT*u+Vw>  6.)?=|=1rȑ= ]-VlV L5R_Җh2Oai.  tM2b d>rm L;/<Rt.TÑ"&:4{^eƝt3)KAh]5q,,S#!leDRe_ zm/ 5q nqc k%䆠cе><[#7IiϖvaG-|}ePj7p\+UVkܒxӽLp8E3nܗa||֭X}nnneER#l^qessn:Ŋ<2y5w=4_,NK,U91-flF |qވN^Y"\Cyz?ph'-"kR-jRE΂xy[CS]$mhк3C<ݚ R|~[Ra06"B%Mf*AjPɝa=ZRkTjDZ;+"g8"%6YR xE {|wBm qrw;*x/YQ4f/332H= #+c_Y`$$,q{QѬ^)+]ypkV lZR)#̒:Q_Qd@ˆgގ䃾xa)ŐEcvc1\F~eM돹OEbQT6橩)FFF[nYl#ڵky&bllPZB&xݻvƬ[~5%%TgF_t͌Lg2A`Tq-ώ2~Y76R\BXc~vNDb 2SOYs+ݐ,l`e9YyG8ΊUr-E1.A]'[nqG`WGrk-yۮ,j (øvEǏ?Q2c^e\%K'3WWn-r, DU±2DPSRnXDqb0G(xOmkd}(d33"ο,!ړ&rή<55o޼i97lpy9eff\x?;v䉸ZT#cl9z}^bJArU+ۿe>ҶհW4(ҜǦ12wIu~.jgpZé45鍟dQt} e>cbIgtpD& fX8tand=m*Httbc޴k׾VRcIh-.ǽ!OVYԱm?L~) 4հzH+{N]9 a Jbr3]Ų6<(j]R*|oZOa7xH-!u'_|ϧAg(;*.;h{D7V^L7n^HT[EiNUV615UPT`V2~f,{꭪+*j?twIHLõg󒫭wl6ǏdwwЃmbڴ? 9D#F$!eӋEҊr:îiC<@&%t%q$&&P(w̼ȸDvn\qu{Ay͚Jv/˚ncEo954uj< >F1-/NsPd$61>11d,,---,x|^n-80b#Ÿ[Xni;<my[xh`)AÆĤ@Gn69vcibX1!.5̜{r}Kf011fP>ڛ:4PƩh{O|*Sd1@oȋN@"Pa2 &>Zle޹7>fN;/%U I8fС:aճ?GSh/Vo9dC`2YYZ..NNst+++ΪeyV Rn=XicS9ag}z-HQ("bܒ|~, 4R g|x|÷F&Q"k.O4 BH$8Ecf2YL|SR /8v{ARN0;x*&@~[h, (9tz,jh3JO R%]=Ԥ+۟h_Z؇3*Wjqc%\^1 O]&l&qQzK'WN. NSCGZ)47%2+99W6VpNƩN߷ S0[`:yjVGt{nxn0:=-(A}\/jfx6?SюW54f=o[MSr SR'NLM[)a)2oծW>$85()L)ɟ",cС{?Eʧ~JZD.ŧ'>_bySzjZzjNT)5u.^L)nClղ)ENJLKIzwkdǺi 9r4('BK!wdXn߾XmPq9"_lb\<z*1`Q!l mCs!Yt`X{*,n;9l% =bXʀP;Ϙ^KP;խO=Kg`NMhyI( k ep1Hjcd,,{f>n3J>k۾]Tlx0A_d 6g?m솨!^uĴ~ѥ`:vpiЩym8+}`}dhFC*0Im۵+jlk|jGݾ/ʁV8ϨRz2 MW5{68e%z:N@9+c`{='Ʈ`r 3l49Q$6@EC(RbZ;őڛpɬA&!TICX3UIǏ]liv'"a> MofBnAQ[()kI?BcZ%Eߪ}x?1Lwט&K+xjS(Aؚ?KX(Ii]CW~4W9ڥ^ցN Uq]vzZS5̜].3d%20ufXX̜k7|ͥQmYfdPxdE6TϪ]?ܑkƹTGʒ$4:J 8VJXYz9T.\T:5_UrUgs~|NǮȨqU]EhfJTb񜮿wWȾ\qK%x"!\l%ϰȑ#oi%%%?jjjFɣz =wG:eee?Re5j~o~3Nlg߅*&;Os=N#W/쥉eF=6("G|Z^qz'U<Ya HiF2ee=ڷ>F\6[uujiho*PN2mϬīX{d]Wu\ :fTz ^55)¦^-!@QokNN-MMM/@U6\|{U٪bJ&^s}+Š8bۘ^$.n+jh\[R%J8WKQŒ"zk@  ڙu7k+/cT:Ou-MlTXal@Fgocb>?*!kY߼-~{#REfe? I!N/g5^ēoRnںSPފe8 }P/Y77]&بK;&e>+Qo"omt~aN5]| s^tl;Z(p)o,oc^Sv5SeD~"II>[\k<9 LVTj7fA}]fA4|Bս *}xa~tݒ+- G~W. ߒFmr仁ێۥZU%%*pɣZxOs|,m<̌g@P)삯ɘҾ*x*O [9 VJ2Y{xKJlӧS%s_N3<*qJct]yk 8ssϸ=ZQ@63/ӤP,chyʬfG} h$w]" D!sl~Qc`U݆]k]x3⡯.6S*Vֽߩޫ)Qa:rSțD~XcJ 69vc %~v&J*9U[dV9<ǫb|TK]%PXi'Gwurp:5b  h{i}V| V_|9*Z씾]ԯS&oP.-.usʁ$$N3R.6ɺOjl@U]rzaEFx!}IbjtYpTs[LF*MS31?u=ŪV:_W"nqݺxL1R^1DTۈveP~.3So)oD4$RQHK i䊬9Nx[ } ,{LRN ~Wu {)!%ث0b`赃p򅈘V[; L=Wo7'{ׁtSm>NˏxvykҾ9ciRu{RwS~Fص2 VC^ta({5r^R?a:/Zfq}Ic!$<I)frdTYb}Vב#qNiNDd2k{dU0E^7R U[SYzk͈zSmʿK3;Q#-~Msoc2JpYU+HDR?krPdY&z7C0r ,5-DrZ"nĦq]ݺ]{Q.R`<2e;OTqu& ]BL8LIXV̳6cP y ȸ EAPNH%+bF J4RiXYz39^}3[ S;tҥE, ﭔtU@*De˹SQBOt,Vx$nj-~Q#)O+CTHHm$$I$)LEHzLcpt@P|9'eo_, ohX=L&3#㧕MԖk#G[Yvlt*?_Y>wF\-!c\5}OfGg:P%0.gyA yoJOu%Ib Sv8p/D ϾjL A'ig J+tz#w~ ʔS]MCKHWAVf#S%˲_HO) \z =w0s,Ao-i:XO$쭴SΗbe|GE L:ڋ؁kQ#S2`D?$(LU."e=HJ0v%K$QPt挫xYɼGo~{I(MʈDE֙[D"چDlcRxF&Ӳ@*DeiS<(m}<7F:Ŧ-*/T6a"*,33,YXu&,0.d< ͬĒ̼ȷVDvN̹wH_89t<]ڀ78#<NyS\>mumzR{n =´4ؑ,ٝ4p:ҺeN3N[~=΢1M\a`ɉ |ZVvU hqkOF]'[3~@Fu@UG;m^y]o8k-_Q4(v|Oi;QK|gv-(^ȑ#πWikLDa-փṴS8:89:x-PXeʍcz::2{`3v8y\\ޓ4`D+@i];tr0)'br]V9@rInq%C8:]t5*hQRcnSzt3cgV E{4Bgvw+_ ^}Y26dƸft:u,2tdokú9vj*/cwOgRυ?J!ۏZy`XS<$9b*?sWX<RE4ʌ s)_f=&Y! )=+WL IRsS5c&5Dd~:uRHh:2oV2Ȑ[i$))-m٭| #n'<~3I_rrsLMUԓ|ZC4ϊ׃z]X ~F cmHdddy<^ffguu5^yܓGQF/fŽdC0L"cqXa 6Hs8\&p/?/,ӟkJp:u߮ :N|m,)zϞDuvO6WmujfdYwb:ܼX\'`&FЭWt{O&sY-6 vBD[zb ֬jגPq&Lex DW^`Sǽ_q}£OS]zsZzSw9DrSque釆YbB'ܴ]=Ó X7y Sʟ.Rsgb .%2 Hz98O[-lG$~[ (H(fpӖ*(EDjWvFN>@8!D02|- \tT_ABv^{.ErPNF^1o1)p.ݧvƈQ7xO裤6iP|V^5eyyUkA7ijI3pJԫG0l`w…Hl{n3_8 ªF"dQWS swL:ײJj;`oD%Jtx:7h9oZWuOW! X? kh QٯuG͠5TQZٚIAFYQX /fՉۚ?6l5& !:Vx)n`>'dh{^ߍyLoXj5" D]fɗ_)jRpA#,c"XA}m500ְ̡y%tD֋3ŜH/QjR^Nn^NZ7g4MIA_hIJxeW2ǟ vTl>;{A!OJ[2Cfs">-7;Ý]]UQךx\R.pd:)5.Fޛ̒Hx]KrDAE{u xQ _s&2۸ &ڑ;/%JC~1dm DXP'pPC̷̿yGT5x,:fìlʼn^ۚdrcX&V|nhn^ BJLxʤf43SK5|5RQIh4"M=h9j7(^TbE,]3y9NYE,ָ MQԝ?y8L}%+ r͐/ X|/ydKgx5O]Ajhϱi-%*d?H(*R{+fH"d翾0cP_`Hh=s'[#F {h]?n[Kf-VK̹1@[Ig7x+sc.+\W5pƌ>¡ ?…iޓ׬Y4ƫJurtr1E1q:ci$Y cH.P IDAT[;:[).$]ľ#Wfn{|ۑ@csP\n9$? l;G\T_.mqyj`Ռ{/S 1iөcہ/ݖƆ,I7{~ ԗiQ>'omr!C& ˬD%vH[^tJGCkvX~h:_ȫLLeJm᭷3Xn髣k^ OE V3Xny\xhqx*`ԝL%\vQ\ z~*.>߭t)U</Q,KT"e [jd4'IؽB-p?'RPbN43Sc eLlY,HEAnf4cc)Z,  ]Z^6iH.oHtfդ^]}5N (k79<!ZK(#3hb'1ĴؓVt|:9fj=TJc;8ܖjl}LqgtVW3sOB,!#yǂw]| dvW/ 3^I]aA31sr)FM*&2JKz2W?4tI_K+gZx]-}ψAǬ̜ܜO*;xF8=+#3+#%j. "5q{.ߦӭ$"EYU|z?U6j(Uo5J۷R 8S7oN?3E!*sڦë~[%]TsŃ1@;9YiI2Pϩ\qm0T vVC#AmXI;n-/׀*ց=+OGdJ2w`캌0 4-Җ1h=ȓQ:W_Ehlސf–4-g O~tJ n.VV3^4fzch}B)$AK(?m@u4e@i8Qp]Ű!rGp) }FV˘#U 4f)6F|cO0i tSks30mw^H2wdp8#XZR[?訤]hSKWq߃bYpdESzdX}zH&/)䥢twEAxO`zdDS.sufܥm.NQT}[*a Lzn b:7DUԅJ/VɿjUI=cefաN~eBS}q{ L;ʠ~T:>[AG>?1JcЎ}Swtwol﵇,zޯ^]=o{(>ЈԨ#EB Q5b..8V2 tH} cvH',ǀXO6FYI!VoLQr\4IC*9+?7+FMyT v쓲a~-"$nWv~9V$6RFbdVӶ]}#}m2E^&|YXJS? taիGOLBШ Þ_z?~ևON62#TR?JZs ~a)`g<6#22RYBNzzXFw镼2]4iÙIkM[6MjʓQAO"U v ݤԘ2 ؐ c8JBe0>};{RmBXvĂQG^Uᔿ[ |+YHJ:3#ӓ;р<`}F /u7Rf ω'# +ڱoh>@2td@ 8&+ 6##;4iʊմ2Fs gIZe{߳V*kV' 7rTGM)gd&fa@kgKmV{ ßΤ VCƱx|u0xg ؐݫG0>Z)R ΜXh0vWZ1RyakU0<uuTj3eAܭN:o{z{AYG VSrt˸fӅGF.w+kYHhΖؒ)j*s㊢/W$=Ԇ4_(֣imr$ᗼk k[,=P@HmT11'@BĂgN認P$pf7^,r*ȋKzY8̪Ί03d&4zYI-AdaUJ].IgQ$Ei|FFfQb sBFZaݘw/eAE$U,(WІnGZza M::IF uUǨXר|UVtj``aCU7͌(t 4H~!QY@P:fКv(nl-7;bU c MI +HbNj)w $"2F)xB(a\Ow!I`KOwbc^D<>HtwRK|}f>97ޡd GϱrD' ]< TdI w S|ɦZT5l!]S)Qs0GgUhx4DbDBP <1/cc"7V<>hƫ' ؃5<۔~7N- _yw+ݶFJUoXzxJ]& xl0 ᵭL&t;}ogk󎾩;T`8N TTg s6Qg3MӈK@ȹhڐK5|cf!5;V Ȩ`~cx7Mr4ej)JW VDDeDur㢪}hF&F. LPD m1*(V]KӁS/7Ǩ!3X۾D60iVc߉EhFFf]F-ָc_U}C4SXp Clv\- ,˯xf/U1+R'k2.ljlds3ڊ;ԚDjh<7dbm\Ҋk{4`~x'|M!U׵{iH{ x@m"O!lNV)QDXӹw_mo)(QF@A Ac &Wh&{۹#^nbbbk߹ӆJM3@˨g/9fjI_>uqv-+-}=30X\޽ [+@lLLQI;PD߄@  EQU$8 q~@D2@CK& 5&Ke"^ UW"ֿ79MQj\\\y<^ffguu5^yܓG)bDc1k9##Id,Q0 AH _d2N~x4;h4f1au=o`[U1V~ ("$iە!n IDAT'wCnd0x[W7<  -හǭ:1zjkkkkjkkjjjjjL&dCg/MD F`0E53 :^]M(((/+//+/+-+--+-)-)))..).*.*,.*,*,(,/(/oP:'c1ՄoֱόcCC  GxЌil)X jٹ}Q#_Cގߊ,喽:xd7;iNbgdbldbk$Zyle. 5s2v{9{M6^*z>{39 +";'cI { bZ5h/?‡o[%:KQ!)d M%J(=(X%#%Go޴o߾׮]L 8<ZI*S Ofs(Nƥd|yu#f\n<,*5.Fޛ,#AeaScd~/cDqxfK׿J4l˃)sr=[dUX&׵t)GNP^]b9('l5( A}Hf*tkTA H!l%Jt|ӋŚ-y?0],vdkY˗pUl./1=Zqx(UA}58+nBNa`Cnd089iNלZ3^ _k1$E.qVTII#{X~#Vsk6'];[jztդC/_ `2ҿ0ESDB.%–n+Ag/"444==]UUuyHkyA >! E^6]Ҷ26gϫt;BO [?lƫ| ]o+>)՟Oqt;0k^ltw܌GueDW$<(3%#@DT=-3#R1E$t3F <߱b.2eRaG7|Vq8@ hvb!**:*ii8VzJ~1G`Ӗ-ek׭wrtB6,RzmVŎwaMb@UxG`3;O6+T\$'Fso4N$" -7]s+Z;މuh䭩FB_я%+ޟcxu4nh^:M10}1  Dk$,poy mujUWV4+H `$aabb7Qτl:?"4 e,ͦP(AAs$]XIB%:ӫy_v*(SVfZ6԰*Bf^Saa;Hmסu(}_/@ Bf~mMպ.;} SK}cVFfVFfFEinYI"_Lj"'pׄpvy2*dL(QDɯG6"(dԇs숖A^D=ߕБז1BUU[_B&/6Xz(.C >)j1ZHrːNRfވc(kec9vir F 1%m G֨b~HPT3"eMhDª#/J/igmk{0:+bL ʠ: *ȯD7;lDߠL=1n܏LEDtD_M!#5~#R2wQ6-fñGT7ltpp w܍{ZR!Ϡ:k4&ވldanT.?'KVP3cO:o 4O/= .ڜēMRn\nɕ\o#6,8Q:}CzEΣ" 7{~D !(?py11l+o&2(bPV۠Pm3[pעpu5hsբ=as>^n]L9P%6ܥKWWfgtuuquwS bWkC丅Qfvsk w0}cݜsћUΎ}WgŅº[g rwu;\Y^ٳ' rrj"ssMts.t͵Z~J(f@ή?Bz➝\03.?8pvby/M26vn 7||/1}?7s4}|$3u651u]v>aZVNű~F6C.=G/ac `g lA3urN_35 s̝/>V9>NTeg2Zˈhf@rx:M+({g312jk|U Rw8_&.u['*B4<}]ُ“e(*(EX@bljYGMx`(0lܪcw'}po陕cFz?.RseQd+BJ- N)zVZ k[VݾChXPtJUt#cx]X^ѭYAW4~rWtpɄ[uEfg_K%.dY>K)IOsЩZ88<) -B"-t{\MK?Qb.d͔c"z9w p{$gn~n`AEN:1b|-_j^Sc 9ɯhUY:u-ؤRy6AP)3n~L3kqXaj+{m˾S 8oxv>{Wt>_YU9߿w x" b|~)NtMS`?'JhymjVnvƗg֌2'@ EJrsӒ3֞pDu w'[NvNngV -hyyj(K"$3SL95 |[-,#LEZ鴴e=btGnC `_>p%5Wi οK~abqxſ|֭Ϩy{)Y񸀱^V8(>3nF%a }0Nǔmn3#_5 ,mCBc{ΜvupK^G{aa4v|ssc9[,Z4?#2e#8y]2ЌFjkgˢջ5B#ҨHA ])BH\h9ľG]ά^5U]W8hkWoY* Ldnv^.{ʃR>~~`/7JӋTğLѝ|)huX--oQx,?j% Ѝqb3`>'dh{^ߍyR̂VV14E'-<#9%g9kgPռFoXj5" D]f֏>ButTuD33VGŒM{Z&H %Ub_;۪me8V;&ZFڮՓ??4&W eC kW׆t I$$}fj@(zԿ `XB(Ơ4`1,bqX,< "B$$ L"Id LPT)UUU55Uu55u55uu5 u5 uu uѻ)>4$4tuuuuttut ;wd`hĄJ5Ѩ4SSS333ss3 ssKv9% [ A@(G#']vwWo㟝gt+~ D;)zW]=9GW7-b0xԷ[_^쮑}rر4ytS\La6ߔE@;S@+(uVZӐQnӈ2K^Tg;w|*H('2.@-嚹Ҟxlj]?Ӵ??êQo(xlf&ᵭ$KFݶ~JW&Wز2^2 M=CKBN-WޙcUT&G##{[O!ncռ/j2‘ OxY]l^tCMu[D6jQ&.Sۀ! Շ)UTT7 FmlBAQ=.39psO 6ErMhY)iƖDdjN.`B3P%sG6RâRgvIW}Qhg5vs%BF+ay@qcCO:k7A%[ e~c+HY) ߠ(m_mYaCdH銡hw""R~ћ'ʸw^,& Q,)edTrLXU#ج|fVU-#<Æ,Ӭk0Ú'7໴̆oj۽w2f>`*`ԝL%}j*ڈ ҏn{(8TB3dk~k!-@hN΃{&H >m톭7,֌QYE_~!+^F&iztB)$|k*:uMK )(C#,Zwԕ64B; $?xUk],0R=y>)V6\.؈ g [% Vm͏Z5? k^t^@e摃j=NOS۫g):#jr/{}>g&@SlL1zӒX55+95t>gh!ٸrFQ<uVԠ __GMk V ߓx+QT_,U^vy`+Λ?l̨ ӗZkMJlE|J(by}R:~Cר803Jň$ѹd ]2/1bLVx-Xr׃vݻ ?y+Z,  7:T 嫇y؏e.:m<̆Pu]_ mH]fSY>58l72(zi^1=`NXCC'^_ky@q贾?$CReCi wr ݵ';'EV; gm:5-ll\#;zn{^WHxÝ&G*rJKK[ %J-ёHf߃%Uuu޽ّANOO711WX7b6bdψUsMȦ#o''}535UUSO򩋳kYO= `޽{%% {y<^ffguu5^yܓGyb*%Dc1k9}mUWVU4pVDv] ̺Ӯc3yZXĸc=7wMfK?"(  3L4(Q҆$Kͯ5uZFaȊS:#^V{]td aie"(%|H+/1Ҳ$~q8dtvpL& 6fȴ.Lf΢].G'Qס3 0A0k/ ` ,hzB 0BoBp+E;r5kQi6pLJ)L<6Ga` =LfcrʼnAףwkFH&h/D,U˥;>O-}[n*"L6F ؗI˿mV|poii9e3gNs'ϙԶ |~ޏ Z'W~%J2xР*c "`$t$%,憏kT"VW[sM7hёY :^R\`0 =}>_[ jv|T=o;?pem)DS3s@ib{ _ܼI]zJBnuۛ785KNFASNf:̆t* IDAT ߛ`92%ӠQ\l)BHܼ$&нjpM7x _Vrbn'Oq$AR3g2RiǪӆ eee `s|vRҦ(X,V~n%J$hO/NvdMӢQ* X:Fsϝb?߳lWUw߼}|ղqk Ux?dr#A'>>ǼD s7EtdEVl6qJ J3J&P(_ jkkЪv>=n|ډSP>jTr ȿʼK}1~שf foQzN۴lo!k"7궧K./$숝,unr">r QT跶 @[c(U>7ȈN6Fsڵ{iC UWA$!6>OjrW㿐ğ 7сM_$RD?h^l@M( BAQq#@h&GM Aqq E*ie,2??^f1 !3~:~}&K]W7E99%Λ3õΎ{#9Y|a˥QD3/ ʼnEDNE12*!wqMuo?w- *``&&&vbX? |ULT @1PDPc0`{wg's>9Y"Baq_PA٬ꪖ}l[MM]GWHUUa.qa+p;Z%P_{~/F{6VhU?lB:C4l2ЕB~:c4Ŕ'Sڙxdۦ8kZ=-B+/<2qQ1(1crtpd2͝@ b0"MNWQQva2|;HH("I:9uK2wϫW@Q-5t^ЬFDf$8[lq|Z/{cC'ůh~fqˀg2M-֧a u67:r\)YO*vʧvfAx}JY/R͆zq"Jc<SɓCہC@svy;Ob׼;toa]OdfxD$C,fltd=" mcq$R.DrPW,TSSd"Q} I_Zw3=\h;kHC<}<]O<9g0}vw!c 3VLUK(ѓ:DFHOh*!%ˀs$Qq|+I<{g+=^˽;"^?&)^Gͭ Ƈ AL(צO=6&mISB#mw c]ө8vQdꀑ!WEƫvhޅBʐViJ\@Uz3%1Z>Wq~-$@.Q9l- hoBH$j?;H$x\.b;~X/wiCU<5X$qqf_^ , 2YQm>Ík$Cvfq Q 'm!Y_Y#xz`΀ΖCV]0#IҴfjEgmbƞULd^DYE,NYMFiQ7$`$# A>W63&m$E8z!rJn6pero#_J" GZD#;ձkWWǭWF~#;;Mx+ʅq1zX&ª:k/ފ03qו1Vɿ7GΤׇUdIJxUsU/T.˘rXL5U,oٔ`2UߏCvrҥ>lٺ5$$' ataPPZDiZD Q00FUYr"zXaHHBc&sjD+qR|^"7^W#NȈ.##`Nkg-jdfm!š<&FNU "iPxi5&6)::Am;x"}ɫ6MPm,8AՄkAa%wE:!OE.+R WR(fs!M=B7AV$ v0+1somr,O5,o2>fg=; _N O ?#DZ4X5=I#^w8_ xڦ= .l]t')!#?%vX\Gl߷zXקǷ2$ G,hqd_+U,(5e5[9N?a |z :ZX[,7?o{}%Pp>CgLjzgڽrÏ }y2--u78;1́0J+Ar/Lfs27@5RGVLj8˾Ϲ9ssr pjB.O=rn?ūa6W0Z et5_7ד {{c+Z`4+dͨ)$ E]IHH<\5wG&KB[s{J[@sŇ2^ub Ձ\G < E"鏀gy㗯_z:r~ YGPzpUǮ^={}ޡq;ZXrL.c ^c&I#y5؍ eyjF(7M e Qc/HJ*܌. x7 p4pR_PZZ{L&:;&k.n!b?ͮ\Ɍz:Heink, j=;x~ &/}˵N3xݲ>/muei6Qy^=ǜ"W~:խn.-u@}={ )y:ϣטS_"nqs> P 8!GF 3 }әŶlr+s)X7c|I8fL5[ULLYXKo")rGKL˫ jjPgd' S C!bf_n\JVP9dύ1OB$@q[m045%54U["h/Dmq쥸[*>W9CIˋ蒄\kgd7*v #N{ ׏"C5mC|vJ|Bnl! j2^W[ZR)[JCDus2?@U'`,`XOBPxaȆDI.պ=~bsPSSsN_:Nx?G)E* lV N'55a|<@ڵW tYۉ"ů~6sxxj ^!'.[(̀ti<u=GAUփ[o5tM$#R. QgR8%<chB~jMG3Rl~k2OoꩆR *vΟ h0<C*Ȧ hRmA<qK"IP fH*s8# iM4Qrs@Ž;w^]]8 ;u4%%V="jIcc>|H&kX L\K$^)դk'uZ?quׯ+@pD⏭XAjTR4G*$S@xu+1Uu|T+n=@[!"pmYkrAC̉jNܵ3KܳcoGS$]{Ǚ.Pp>ͤt7 v wuu9%L\I:{UyOʄITS-謄Kexz}ה>  6/ByXAw.)-9{欚ZK!C1 6K 'hjhyid-Z gb0tκΤ6k * A ?e{Æ?/E. $KҐܻ{(njoAu^@妾Kh](bQ~Kd*x.@WQuJCs77+2`}qY0M<eq1&TQw&jmK AP 'dfH\2^Yk_%[-=K=jc򳾚xz+7sVuv. ږCV8u-gLz/ڻƜJs y{SixO-#z]#IoMi: \o ֞;" ^u5kV)qCQ#`2'>ݽ *D"::P-w"^I@X2uqW"CP6p_М팈=zvc؞rxN߼!H|ldbKE*gv9)ͷzJeft( \{yO<Ӄf5cOYY&<^'&t:]__P(\'+eeuרAЇ~bjx J7ޥp ?"\pr@ߧGv =y8Vj]$  aՈd, 1CMM6aC` JGh],S3_6"B WiBs b˃3nRX&QhieNwtugmpPd8:,8) _6DZ|ߞRfEs ܵyoBPX,VYYYYE9>>ȸDAAECvxxᄸO3ITd ޖ"^E3b F[Ɛ1zeA)T m!Lׇ0oS[ۻb"E㚐SiunNU0V 2Yk[⢢6OL&^3515v«MDh_6} a0eeeA綢t;)'N?tbP\74%9]O tȝ/dYyf޾{_3X;UѷX4+4Œ`V}W&R Z{Xk |/lɹcw ?[3=U=ZX|uDĮUCt ! q0:n;F'Qi17"ey@M~~gLN']UEt2~%Kɨ S96\J_n!2ȬA!`2~o?3O*^y&ĦYnYfRʖvQrΙ(\j?$֑DiFd*zz)",aA{) x@рa~d^# J"QYE@AA)0ume|yA5(NGk9J?JxXܰnZ -S&zU>-M-fF ` ^^]޺&9*Y=N R [pFO> A$UUUqܒb >}AR>/mWF54ï4/O"bp3c>1xA\B$ QZF̬ʪ>? "!7KU AՄ*#š<&FNUDҲj=Jnpa%wE:!OE.+R WN=yێ,dwMS=Tc[le۲x;or&ȈD&fp8T@//+PĐou_y((((( ZlSD @)49`CUՂnxhJTYe`)%@FK5tAw<W&QXjJ~p{Wu U;^FZAEQ!L0wG[\p,Id[_-'*5{:pڞ#Z*0 X,UUUzuإC{f Ԟ8ڪ!"d'wXt|Riw_VJd{P#vR+&$wn+k۪b8^1ʏ5nm#$ZĄc\>EOsԿ*yZXϋ$4 O/MEJ%^suɢOOmQ^y(mSy)WOѽψ{=1㇐~&_ 0(((?6i:n\|t_ T8D"H5BPxum9RA|r}D6q?n:[tyä>B] @lz~^>DSKFp]+?~8]>ݳ9G~ɾԸel0#̊ݻ\q {Mr&b#Kt;?@m'OյX!9UVg?PV[(a~^^=G)m`fmkٯ.r;r8vWQ!>Zpf3zwXa~[#ધkFs{^Ԡ 33ϕ}X@4W",#ėn+ -j:²K^ČO|zuSʖ9$of5wQuqˍ%gm kaӽw=8v߬nRڦeC^'*bIпo'&'\>JIAX4d5_[EU~HCN[=*/lY,hUbEUNdfdj1|b}{g;^)5,v61pL&[ +v62 /1/ l]>c^0܃SXv~1FDf$8[lʔV3Oeolyd:ܬtuRba.qujVf9l1-ٷ?`'!}m;b5{j򥄄/?IL|tv:t >8%-$ s1x qK^/תbJVA{! ׾&McDt|Xo"p7#cv+i:fG8)f{SϠD[ 2is aD-+ep4C;;7o\kW?M\lp*&8|ifa]5T>jä.kef\P-VX|mԓ1iO<"4DxFѢ)iK%\`=챧RrߞUslUoe澿1O +h2j'mT$˗KE:=%?*jچ  ®M>B|!tHX87JIAi9-ٷwg8#oѯ{X&mȊ&zyoK>7w+jmaH#&d}u)*WRt0^>KD5̭C|zO-ᔰ^ِR0 옵+V@΄k FJYDҰ Y:S `y/CAi6A&zZ} 0ί Naġ6zS08 RVVҴ*x#v>0ௗ2Y&W1:R+iZ9Ԋ%h{Ō=+V )Vs0XdlhX,.$/||G?hϊlNർgVkAg ||[ߜX͙覆W^'W~ikgE?L~7ނ2+d3ж,Vqy<.I񉉏ΌA-Dq7F73#-G@P!WC0R!M~ӿ$x`$*_.kc'&=:3:0JTŬM2C0VB ϧM53quu;l{`~eڗzo>z~mE'ViQE.jiJ4hh!UlLsMb1o[#cbTTk{3Z6qTM2BfVeU Ks3Ss3S Eo,2QӺ9=8 ľt^ ]EQi偧iŝ ˆ\\HN&GfELx"+}ZN%JTCϧm?d ]ό s;!8h↙w<.,J9W ?ؐ0;WDEe1ҌĄ/&VRD8 +}0Er]GZUDž/O|E 6'ZU "HPpqך㙕FU/'fU K)Zuym:5qN콑!BFAf"fP|zFۃ`G +dͨTYe`5fАՂnxCln1+#(5{:pڞ#X/F/y7f,ۯ([YV6IKLy!Tm $Sm## QqrPڒC)Fmɉgw\0p]C3v \p|fMdtMl%~ ΰ$=7M߻cQ. k[z]K[WG,4|ߦ>p;&Zi:-aIgSi6As-~bṰ+@_pp݆2vqy+LNN?⺭q~[wm:3`+.{U*No\[f@d7ӡZ$[jTxhMRf.F\u]\3V)=ͽ Ysm5ؠ&)zJ+b>Tݗ-x0Joo-79.YTZੌWDZin9x]ش5FeMEj-h RTdvt*& "Di K{L1Qvl9b륰у7t5?+V3گSi^u*b_N}ڮoq9q }qbi4 0{N@iW…1.7`$.d]R`T3_gšuZl4G$nraD$6sAkrC f8!GF 3 }әŶ`5CDw3 7"ng.^vg@^1ZY{Ί7$_ii $D49GEiϔ5TiufQ>zP'B2̦BiY1Z^ʱ^((((([Hɸ> DU)1&1yBXc|J!NVQyWk75ATtyVk z|qJj슜KB], ?x/RfTD56`T.(v?xsz_5^y|ƗgWL%2~{"Gu{wCSf 򅣣3A666sp 5ohJs=y/(073SQUK{ڹkyYOY'T[o߾ݻwoPsww:񲲲LMMTAR6(((jLp!laJV<=s@@_CJӮzHK_hN= y CjݏK;+zussْd*Ξ߅p3@x]]ۓw- nW_x)91dk׍2b痺 aD7϶t6u,\3+)+fӶ˟90N}E嵩- K֎{-G pz#n>A#Tn͢WWrii 9A漂~:h h`1 t8UGGҽ}S>}dEd$!f9뵋Y,y} ?@9R>0DXegNKTXx_o0j>#h`@'JϤʦT&@w/b>j=vZுd%>U (}2{Ve=rN8~n dfDθ7n=v㧎=^&O_F˾%8((]D" $9.^rf>:x b~ߪyW^1Fǽ-թD-<N{]S/KJ"XM='tUSUUtzY1=ue]x*@i%UĿ51=1`$_D"r{Z5p GL\ϴßv(!2-&fyeB25V`C z͸Ly+iR L zҎc4o[jh%+4-]]$ B_az:x":9iVFtt=:^C 0$ ]]<m+kR :YIQ)h@NV1Sd>5Nkz_%^%bd<Gr!ҤbSx&4]SR JXG ys"@ g|xB)+=kvlmI$|Ϳxᚃ2s:9rJ|զn쌃Y,S#ݶ6׼aƛE#or^8 |9@Q5Ţ4F"kaiuNcշO NRN,Q@ŠjΝ^{]!=7uKʞ*˻B" whߗ"޲`vmuVESo]~5OPV{elŠWդp)fD8:;.ną]|i1 rP*Crz^}{G"NQZX0sI3=Hc ÐMA4UIt>gVJQMhlxsKi]3ҥl-SǺ?s^,?w{K&0MH7s#Ч<'(I.1/?SPgA79Vf9'1Q89G6otֻwQK-  's^>>>[7>NײJPf@5N 4,~sNAI?|l_c£6^P )9_>?Ú !sĖ ,7քWpy}G}H묡|SVTAUYO& Z97Dl@Xvۼ 8V-=҈P/爕!kն;b 8Fpţ'd奞vw7o3R]׎w\=w5$ ,қBAPjaJ;AX"Uˬk)[b4%q X*n6> 8xsk@WS #9 qB5Vo}A:x7`jw+;RM9?BIC%"u6V$}ޡ.$%.  _oN&*|foʊxѹ`']*as޸n!dTAZ.?e9"_ߏ۷o7r(-VTr9ȦORo:as)5S ܕU ٺKUO`t6121+d2$=mML-Yr$"/i~.oCmC##cS>ӏcrgg7I5R@yN"|h[v)X1vhZ82?;pkčNhH8h[|ڿ|jcd;ekFV?FM^k7?G&iX:Ӥ*O}l6)zG+n6|oRe;׆22\ʽNJn /)`XeE/dISI&#vTV8$3%vp"Ϗr@$`W濽{dI*:D)|AfoU `4hշEL.S)qEIC qE^U|NuaZ!vT)hy7ͥyq.ϪO&!#Qd:lKlj˦ IDAT*ztl& R;4CX}~.f&&Vޡ{sxj0}89\|0+`wkS  dk)Gfbndb?r@=z?`'!w^m)/*ae1^F6#6?,6۾3l)̌L=Zev YzD|'-³ n8e&Z tuv8vWURm<;3O6C;]!vTV]E#"JB -|6fp8>Yۓ%`ItX=N U9ˑqTNQhp)Sm +vaߥ+&vUFRDުǒ r\*9'<%FyY9o~pBeiy9f{"O +GTB)^JN#*]$/_{t[7h2?O/YX]%KKbm {_RŒPXzrPny|rm$U]/~ʤojm7(#PR(ZǼ v}ذ=)MjH dG'l~"c I2 )xw|+)N8aڃ b9vfȎbű"Sd?;%CO=SN a=ܨgD7fM<{unn擃au eĽ;K,u$O`֣%YE%,>cy[oS 'FѢ)i#צO=䯮#B#?rFiJ\'?Yqо|Rh6QB$ܚ1~Z yq &fz^.懣&[Kyi!󂰫oӯO8

NȬK_Ʌo32uEu2*ԙ+rk͵l6v0,@Tg4MQ>rzrJR 9G'hIPt,zȪˎA}X_ukoW_tdi9+öW|%oN!J[{zFP-’5+%)8;.#[̌bIൺU\.+WaTyW$~1k({,SbCk6DnTG?hϊlNർgVj<CK"ʤciZV` ޳6z1crA>W63&m$E8z!4(^x"O[PZ yu pӌ<.sPsR5M d_Y OT827o9b .3c aiLѣMIxU#Ӂi,+ekz>XܝYeד2}6ІǻM 25^w7̥J= W<_Rk(6f;կxyKJGU*ӆ{7ߓEc9D4~zN6ϿU*&Ĥ~: Ya~Zvbd ݸK[Wuh2C |u̮jM_HGv(,RzS/kA`P,D}7b>1vLkE4WxӨ>E^.pq̽MökkjLa J=G.9tNJ-͊H-tpO⁎6As%WK*^ͮv`i\#BfVeU Ks3Ss3S Eo,2 U,xk&*&jZ̗AՄ*AXHZ6d K׋tBD^|ZhҰ[N?Q/7IL 5#G(VYV^|M9ҸE saDT>2Y KRvjDNjHZ;F@w|+oGeD1ʩsrDB*581FuQ.6^9-?Dۉy:z x[,uWity1R@Gq%4ߟ+ě Q (-u[%|s=^-U~vx wZʗ%b57fG"N)V|ڊNf} 狠*vPC|3+6NH>i 'e^#G-,RK3ۇmI˰I7GDpE#262v}Zs8UnswI{[ck g䝗YEt@ȫхzi9`oQԕԌăQswdk*ZҼ*>T- ឌz_3e^,+e JGv&CX%c\Y$qPFg רE·&yD>N!nn~Q9 KDrj s`z}mWacNOi٣c'RmvyOt2lPMdggѷSK-@jt J`a"`wL|>|v`b|vaҍt/y,(|?|ggΜwsgԀQ<]hitv 5hW_,3 5t=h1E&kB=}EOzny{t &ySHJk/y3P )ʆ͓cVm1EiRʣ!Jjo+JڢB\]歹<&{)a[CQ=Oo[mj8"}s{ln^~4NN L}<ʴ6du2m{=Vf1*n0=j& 䐅KaD$Ǵz{ [cs1t-YsyCFY)GM|I %0Ө}KCq?0ij =eϜ~+*p㸅қN-޸y_98YAqހUlf+DTE`Pd۰g& z40DIlr}(Ccf V*VWg##`&+IuDM9Zh NZ @dl+8[o.(oQ1\5? (37(c&&&jii7^wۛ=i/eON "tu"?.ȯ'$/L:;;ggeINNqtWZZd2Jw5+i`pW3ʘc܏o{ܳ fN?=WFt{]`gm%4S!upK#"K9D*E"T{؎l|l TݎzўXDW`#6_&lzmaw'9`R&e_fTI_G=]bA QޱՋt-:O~׾kO-@!BMXvF(?Fu)+!L'7_w Ϩ}hnХIdIyN_'H+ecUhTg3hr#i1> G,֡bFw>v ^ĝN0DwTT`]lcUO<1 #=,UOaU+B E ~ĄGƶG!kν7@ ~5$$7.֗S|qǟξ: 98i̓M{^͌H3y'Ɉ:4gt5^.IuJ[csb vU*xUWe@D d"?NNNNaXNNN@ V1GA[yckx[J9:ylRcRf~|?"/7W 笋,_rdPnl܊bٌ\ ƹiޓ,:5ȣ; /} @V4]:/AnUUkKdJ><'_+fV4V^G !*W~d{-nBm +PimM##`mh6?)@ -Iܜw_{`ӵL3EJ9+pLr?㷝XeMz_ Jce"+D)qg_sg|:V 9XxƫjOe(4ij<य़E$4OnNA{ZOmaD7eμSѻ6=2N?S@ 3ؤI>9X?s \`$F t8XLZ3]/ @tcgKF/6%^w?͈d0(hEpH&pʒ1>*́h/.-? 8,^eˆOm^ nk^Y]=-`E^y5T jb&k}A s7:iY;=c vJ]p/9bʻ_cAbb+X77WW[q~ ڞey,wo8BgaaaaώY˄d㕆>cOЫǧwE17? xsKWu=X* ;Q@l/l4 P6,u+?~$?JHHHdOD@ҰlΌӆ;(sݬQ_8⻅48;I*N {/=tdGH10IBb_h%UȀWޱE!0iYû=h?+VϕUFe%\_rs|¢kQ)q/XY;'^c)_n5~iݼF׌@ܠѷgy`kM9>c抹?~9-̟kJ~:t,411OgVɊ+ OJ0)푕5Ne'F"҅ӰGߔhp!ū k\捔 fPSoU+78s'*OO'FIQڛ6N\uEiͽV^TDCC6AEgAƛH,pm2c8%c]LDi'5;'JW0V c@RjL^5SV杫+VL;󮨹ߦ£-x}6]oB#ɿ͊@di- x6.Ms(n0^ЈRc.'^ts 0i9#{4fr6Yqfӈ"6`2stΗxe&(t_RDf[)TJMc2f62J.e@6>Tun#Υ L1=D Λe[UM)IkHP凜jUk H3X{ZU[Q"ؿ⵱A+jEvVWitBԓJHFBׄ .IVBAȅd^Q_oJ0+Ɔ,RKdaha #rPwl9CJ!EvMr?=)R2ya5 IDATЭ}a]DgѲIg_476:Um q}Pkf/&zLR GËzw)ɐԛ#*bN.6s `k+0U_5y)7̮=c$|oǍ;v?ߗm+>K fk.*$ Ov8AlNjv+SZF7.0 ec)fry=*^{nv'SKٍ de*0Wko_@P(5"+*L{݌)K(*Z@OWGOWl̥ʬ ׄ"Mr=zY\RcA7iU=lpOVSD1O^_=v̒%B<;mN攧arƵ/JhQDZ~X2b1f0"R`ҽ8c̗+;~sw:c̚a4tP;{;{;ϤdUVa=$=3kLT&>,ӛd chOrE"Bܗ̻fа&~3O8_!"i}TlnΞ_o*&i“j I"$z3?&wTidxkg1 Ԙ> +7>QY}h ^з[gu8=%+)e# K#ͻ=kTyz&46"WU9U?%쾲d`WRuhd tdz||UL[G:lc#E4qnTKX!W٥,U2E}Wᬂg\k@6z;@h2xi\7i ::?bLެ`/PK7S"Kwp\<G- FUwi/޹ZT;. ة4S+ .xYg,@>tҙwQDd u7^K2,`N4M{*NKr K@Ttmwtǭ*;3I[N]deHǾw4 +RC̔{o4*[IUgUp/.=fUiľy,66K$>/a?[6)#Slex \yFA7ܻX0olwԉS5vL渤oG9nJ}#ۉ+pLk:SlNُʪa-ZZZfQCR+ fN9~ȴt=]]9yO}, '4c! Buvvدd&$$dd l>ჺʸ[6xXFa7e}1ޟvwq_Ku^TI?5]:qeO'ǮGV%=ӗ-+[GUwč?/EaͭulH݃o?/a׋Sve^F!N 㭻͸ D7ÁZ9XEnK=~"HYy/ܡ'ɞo]{Bh֣X ڐ @ A[V,r ZnfWrȪFy/66a;6{2@tha6ߎZt,22@<!mݗ@t&VG g2E ~UUUQaO n@ :&⯋ӹ}B^K)ʚWkw~۝f-Çڱv@ چm-l1N4讪e 6̥U@ FrdFZzF5_yš:8T61}{boԃn\c?|Ǻs_fockȌͷ(+ivA|)loDD{='mhuk_yukh&0 DۚG+{;W3:ᕟ7}*l*/v5=r典Jzt`IjOkm?V3a::}Fx_Nc t nP*OfZV SSb#M-c;ϭ~($^n<ӎkx'ﭫmh8Mz8s`^ƣorɩۍPzr2:/n@+8ޞvX߶7Figg{x鐄Ԥ}XcJC6ͻ&;MBZRM^ά %?jTzj')E2MT9rT@bjʗVI9~*iiiiQqAAJx.tꘙ;"7 U1__~p& $.j rďwY QӔbNM3JF՞qtR˭7-tE$z\Ye:jTFZ^(Pn\JeWW7u@ܠѷgy--\Eɹiѯ/qRu*/<1XL:ݸXD A9tH{7m7HLuu4Qt"abiv@ ԭF)gmLHABߢ#Gr=G V,{_<"D}b^5]ڎwQ,}ϱ{VğX~^zZȆbyECo,C$L=ֺVLj* 'rʢO"/@1b"@Q`\̦-&RWzꋊZ7=IYq&GL/edY`P׹L RmUFBׄ .IVBXR)%ˆjPD sc=P+Мix4kn?ėu x.!-p;!11YXĝLw3NF ~AZޗߗtiCgfLӥM;YryY:Ȇ*1撮^{~GGU8nr2TQ pS0ySKH#(S j.uJLEETslGmȖ2gvMD6ԸӬiG`4-7!A|9d 9;+8NrrcR&o* h.\[n*gHJB6s5#z삗'}adN5ANǒkKby}^xEf8t>}}^ʴoм{cvaDL;|3?ӎ4ZkJaSN)L6M2h@{cc Ev d" ȊE 5PV,݅@ | +@ @V,@ _`g 0Lt̀g* 0޺ی{ITRWpڀOk4vá1),bN(ͥ4f3dU9Se~/a>^nXI{[Ly'.V^G !6ڐ6PO&8y{@ Znq9<쬻5֭[n];TY̯ٳgϞ#˺ҹd ,ֳh%C{hh+s@kGc@V@6xi5ǡ2SND>QLnG 6bC[8R__ T|:'甄'zXuBbٹ|VL=qߗv ;veuR{}(?''hm+B^Ydmmm`{p!GQ+唄0{;k<{fc. oL,ђJT"^x",4&?YX~vaM\{hihZ p_n@I^yԥ\Lu5Ե -Xll.ƧWtdknC]˰q$Ւ`ל!== w~NӍ2UgW72q]}1`u7tް,N-\QRN$|v)lL448MXs'k+P{6P^KNz^R&n΍1tϿpb)43rι#X<\UD_Xjk{ 5WX]8wN72:)@<}r_xih[-JNыSn}VPZW*+c83H'_/'Flf.C[Z-xp^}+hH]Y:j>:qxoc3{}5>o4L"s_|ڹѩО- +y!1 FIN7xšcw%1LFn;珘3{-xtjҊ*\틗[v2&a2r^߳+fٟ[Ϊ,L|qf˙f*3'6xwϙ>WT[rxʐ=QTfWdǾ{o=Xiv#+\2N3".$3 РҾV,F՞qtR˭7-[c1Ne'F>Y1usI&=ss5R"[!{zbjDo+ T\HK|ްBxANEƥDY&}jzhul0FL {n۳ nhqIdSY(gG*enKn!w#'*OO'FI(" P4't4R(k8|ZʓW`Gyjdμoj|ekLt1'4R73ݓ^r`pC9FvmG#>{JXB# "s[j̯q1Z9ig0<xûS0ni!qPr)$E5o\9trO{u 4)Azׂ߳nݼpb5 'پ4T']-Fq<0jƧ"v3lvi-4&ଯNj6[On3Al) )>cГ$;2u OlF6E~8* b8Uu^MNNtz_b)=F 6U$(xɿܤ ,A!%(Pz8T2D"c Q`jU)pՕ$?ﶒXD]S_TֺIʎ69*4鸑2\2F,m0|b\fP?J6&!_XHU qY}JnVCDFBׄ .IVB۠m +՛ {N v#F&}]6Yr4B8%Q U<(%a2}Ϗs깑0Ii3d /FomJD{FD%Cceܼ[UOKQhjKi7%U`D*4{: q 'GOHԸZ_05_)KL.Z|sRF S ^l{IHiy( IDAT>ԙى@{bywG'~7_DӑU}0$))9%)9%)%=YZ9$ ^WZY4C5.Hi%1%gYۆ5Qt'4Iܐ<sKc>TvsT;_x Y7BQbs^Q6ŕ5> ,ܳJ)  w:F),u9_\}-ݨ($RxEVUSBjd{/ͼ|&Vآhf&֬ Zњ}X%,`r;k +:K?;nlhsS_u+p4_:^7ģq%@=MDx[Z$MTq^fH2쭘\$Qhރ6=X]deHǾwXB.߹FL W(޾C,#{K C*6@(j$v# sL7.xsrzp'fЅp/\V{2M9;N|4D `S1,fN+4VD-Oo~Y[Xj#۠yMaݝ0x_zYztk #w3=wBqX]rDyJyW_ثpta31ow]4 6]0YͦQrN2>7 pc|ƒ+ħ,F>{ݼ~#Ak K]N,+|uY\nyK}U~OVw_;9֯}py/b7%}s=Ag r6]zmc{7(n 1V\xn^9ˆ2`q߼}ih5)YZ䏙x6.MܗBQ3Rp^so\:kQEh-@R$T_>ЈRP4]<xEԡv-@3_prdؠ-1U8qU}^;ީMiqTݎzExf潐r~Fr'ֿ! n̛@ ~3oA^xz)79jTG截5-vMF@2Y} h+0 g_9r㰘r.EFYvh 3YQYE\t7MSQ3U%5)Hx_|0lK{k@ $e .GnbEhYEc:Oaw]zЍkC2aDA ݊9C`thH3SDe䕼sc/#Mm-둋i$Zp JB`z t˒oc FښNs%RNћMt4u z Vr5^7+i:b[ޘX"Ȑ-~}`s/]M# ҙ!3k H4m$VTa< R 8 ʩw{{Optr{5s}WQm_nJ?Df/ !w(X+ǔ"9%j} QTϳS"E}r `Z.K}ǧD]kLKQD@!gԵX9iU5l*jÑi/+Iq\-vFՊUtmwtǭ*;3IgAR;nĔpxU9Rp (1;ߔjM{ u<63ޡGl]deHǾwD;@tIna| [lmy,qdX!W P%[(8a|v%=+Ԥר)))o1J K)!)Qss}F ;3cr[!.}܉ӫ56"v˅&!vvj<{-=kb+x@,bc>jcM LY/ 3\]})~ 콞 Vm7Tx89mMoZ[[Ozve=gCdBX)N C 503nYo\iM-0H(aةg/x"ŃAq'}oEdse)LS(ZS2v|3xuKxe%+IT)ؿ 0@ 2dʺ=WޢM&o>y{QJk/VާR=鵙QǍ@FX$ BlI =zHWJ%LTtFG6Ps~꬧*UmmW TE~>&YX ?|7}O{ʜjn_Aki\D3[@oh."~ؖQU?@@  5i:N)z/?7N^Ұa6nhzX%lr[c Hh>_!oe!+z꫎ @tĎE}\ݥEJcVtR/V@bꂰRtٛ=fQ*? @.@K״bD_֐,{@ ?hlYď*t ,,zA :0ðק.?Z@ ZR@ ZQ֪Pю +@ :KYhq1d;-Nuh@ Z6ŲO;x"eYX[XY2eemecme3h2NNW2jS}ZX={j>|6V66΋#Uߠ ~颰v;|Ҋ}&V򄧗WapG[k[۾/\@ Su8~m>v阻 )+rd50S/ja|WBuehC_,;֖+䞊bXT_6:ڇV[룀 ^OKl(O:i)8;kX^]ڜ)Ӱ ^i莙GX'HP]t?K7R^dż#wN*~/{/4@ԧm%N*Ww>Q޿rU[gjaӵ|ekLt1'4R$:@|A[ YNj#.fu v|ܢW}3|Sv#F&}]P; B͉.̎*şwVOcQB!)Zr4BtтdljɊdb+y\&kX2/?p }hUrkL |X7RAǰ iּO, ]4f5YF+kr99 x&Vh*Ld҅VIq2_n3qQ>oӯdvc!+rpݰ{*7BS~?-z.vd"'}|CVo>xy_5QlX,ܳJ)  w:F)ݚ瘜GoCÞP\Qۣjr }lͺ+sETAT+`."4g==˝eAt:*g2sq`kW G}([mܵOA]kp@V,h~7E)y8L;VuO|8Uso >҃nubק9i* s_ *)0r7sG(IG !Hx%q-;faBt|A@ӱs_aBܮ58 +@ m.17o]tT 'ꊳW0pϵo]t#(paɽˉpvRXqͪjʅ!* : o4\xz0S*3TPD#&!*XO2.<{vL W07 pMIOOOH* YQl,g~U@ X()$].E Ri c·.'i+ה^Om !IxA׿wMvsHy<ӄs}W߿w0Eh" EVI sekgI<Ӱ 8NGfM}Y_t,{-rp2)%surzy.d3V퍂G}aŁz)J5=MsL||BiI7{"%[ohO҅Ĥ]32\/G 7/7L&SfGNjz}FFB<AWo&[ Uv#vmN @)|g  AqRF0M@Ct/Bi\4+bq ȣ YOw!HiڴiCKhD<9A,hYȲC;Dn^,"H]b|>߿AEi<,[[uhp}Ru:Zy$񫠅11?ǍV8X ,exfzub.b$5 D =iW.mW5}iW.{]7j5g<##HD"JJ(AQt)۶])kE"x =]uCAA`uAuAaaDytd$G5n8OUtTX`,eD۷$ ,ى*`j@XV$*%XwwnHmkl8J}o.[{UUeJ v{_>[ObXYPtqQr[ha yc"lUhQZZ`#*ed-[ ,TKl@峆 |vk16`Y ba6alZ\F왳jZ&u_~U_/?o"ɼYXq'~~~)RعSg[oջXFwWm H}\#nRm_+4fܨ4 ¤Cź̎m[>j:nwluEn˧Xq&s>t-53W+wޖ8\#ViTSAͨى6Ph6 FU ;ÞQuGr{D|E7͛S"HS5ØsI]VRSAͨى6~mUv6UӇ=3b?& |ERXX87n͙;wРAe  aX hb IDAT W.-qIrwTWԌf$H ]71xUӇ>=|ϮSO,],ԋO.,^G+))U}P4MjmSAͨZKXl, u=`v霻6ZسN7tR/?fe2K/Mk²[j75]j{[*IuH5M]߭Rm_Q3jn7Pr <],ԋg~{ر],%$weX͕' ãnR2*57J͈@#[["HH>eKڹsWV׭kWv 58\ʓ"}!\7vw}7J}EͨqjF܈# ~vA d2i43g~ .NI :t$ QhDQsq'MSiF l6^8q%]<S=MtHDq槎}8ܨm!tVuJuj^57BFD nA]`+s"` ?ȐG,--іq0(0Р/]خm%[;N8,o >Dy׈e:֒ɚX'X3Yk*;!,+6qIN=B@P'd˅;H[)PhTUaglsvJl~-6I n lCw6ZyjUNk%Pe㷕؞`L峇nn[9l*TUNR}\J{mT`}WԶBea}BE1[+IsoY9&֫eWE-1l_Ns2[)/`B.UOgY`يx ˖gJEf,]lO ^&J1p'Bpt6 a{m۱,SRZr!P(DpRdbͷ'@ ĮJ) WӯTByp!/y%n 0YvrX4xkS*մihvQ-lZc+M!tFS϶:-\v=?| 5Ob]xTIT'w,ZVbZjh   l G:u;F=@Ay~ubAAl;>mDLÂ.AAhQc*sEAflZǶE#}*igW9&$yFt  -,˚f@k_b###Snm:?uSaWWk;>[ß1lz+ؠ~Vb{^K/%$ͺ>71mv1_ '.eB?/qS1ۺ|Wia"1yTs߾7 oX€oL*tbgT*Y&i;uNhb`鋭VЭU'oSr_jVXn©/FulzN ]|\bST eʍwǢmX%&e, ¼¼niqN\#FA`?5 @[6gH h]2 w6LO3 j)<G&b}m)\zߥo4UmZ}{k* @NoL8MiH(% bM7l[Gj:EH描<_繩`Jfڇ׺p-$w靖dK/ZI[mk9E|?*]LMz+|~rroϿnӆ;q֯y?uX]vP$|IN>udùĈq XYezR7R*Nf)L*uUԿibjŸk !}'1Rʖ߹vᅫ(.ohd1*aӞ݂s;1fj=8iivA@wk"3N}rýǏgQQ38w%ML}gl(sveei~=p<Vpp xRꔧ9x'k?~Gg]z) IzoO( }c$ںIZsQM/~kZƐs`SdcϷe.~F՝۴ۭ4'BL_'6z7_xyW|Efd񧫧8M͓';akр)+>}>6tc撪mtY 魆sNn;$Li:==aN:i4.]8p̙Z(d2ӧq+EE?\&[҃f H=0!|SUaztm% m =ya[e[ qy௑8H]<oJ/c ."; k62,0:FRMu i6a3/+ξtpӗƅJpݏn֖_iRrco7] Nq@} r Vk Ky]ygV!9e;52dhM>!} ߞ} iIz^±宼 GbVӖ\3wg>1|r傞_ˇe . .]4 :u:x`޽:Øg7|}++̙3 E3fz7l҃NO'F*ieAK U?qrdV^ؐ4F*>Ea>YMȀ^}|ו5ܹ/;XU`ԡCRK"/ƞΚ /r )kg7?'j(mG c͟ջ vq>4GG>Q͂r4*1 xiKk?|rvca%H|]f`57 v;+ܛo{jEs!1DeH{<'ms^x͸R0 c=wa7J¨zkbG=5ڵmla!ŊA3G/=aJoj,AE #%|7{"xשCzGqfk<=w[h7@JªiK  :nP\I")Lo׉!JJJN<٫W/XLOHCR e)S 88)tkp}S{@rlhrl@={tU"?6H"rNm$+BGNz֭E1m*.ay;8sc|y/ٕɫǧ| -UH_E`Q6Fv*Ƈ0wԤv>u?`!og?r/~oޟOt'Ϝ" I$S >XC>KeAH߱?J°AãwW>v=>9|)p緍Jn=JH}_8~6S_/u9yUprBXa- 7JgLE~πpdmKnmG?>@ i)e}:c4 F7=z/OYb`K{_s8a_Że303;=GLfh4Z;b9:t萚z ,|cf'>c&˲ #\_,V5m`$K}b=T.NS#Ǟʋ :(M];mS;# Oڲ稖=Gf9sL0./\Ir2|??e{cAB[OYD?թƂ,gKNQs0|3KҵONvr"Ko9zdKD9 lSNLlAuY3>l玩T!l6~ь/~wY{sw,wZY@Elۊ:F{}{'-z7Yqwg6I?H;8^huv3زo ضE/6猟 Kd=$[ 3|EJ9?6⛫U`֨驥Ӈ&4_M"̥aӲ€~ϽD?_ؾ-co}ϻXMim],4MƍuȘ"p!4cfŇlul#+ 𕦾ʠ:j G`.:19ϵ_>?YdahSa"ٵ;ѹWF68IDAT'8' 8w Uk!qMUϡ x{ =Nдl4UQ{¹%bu0і}z!OSi4tl\YP4"^㩴ʽeUj5M@/i9EgMWkkac^n݅.0k{Ϳ+>7`p6T)U_ >VB6^jNkj  d2[(J㭾RYݼ0Mic|$>j5MǹvŧTݠD JT\R}1c鴉" D0J[vvݱtWC i; -|D<<̴śNoWS`ݭU`bpBhH( Ʋe7{¨ .|{% <5oحLE4v@fB7OK,x"l#:6SBIPɋeYPֱٍmXkixMGA'AH/he"C8IAAм"  kL]F ͋MHx,GdRΗ^   pƴtE%z#7AA:N,t/=G}@.AAμ4-KOݑD@p}([L9$0J)#$B'!DʛĮ!bp')UDa%XO3QUrdH¾(RTɼĢ f]pFluwdtwHZsD\(ZN)r K50#BQo1{8=J `}undyJlR<:ٜ%9(މRjdZ+e'2Pg MyG@6,_bM\ J ! 9NI54>EǓPʊx mR]G(%qkr(A X5$T,)"mlYGӴrUM(Bj b#6_\QEմʊx"x{Jd*@jѝ{ȇ@EʟN)Dc۶VUUF"@ W\\iZ2&nggÉHf!lcpTfl hOls&IcJXAl-v5*ƌJT)Ύ;v$]:BbS2҇,"H~ɔKǾI٬{jǻL+8=)@ioF0 K9I20 "WEQbؖ-`IIIVV^;EQb-JBڴicxQV.(C`^*CF% rws xZFDuz/$R+HfLxM/Zp'xw;vl_j۵k7E؞^wӦN8M6- !ȋvM4,b|-[6-^XRV抍..ytPanrxoټDF;wl_һwNh~ɿx)f$v[;2ص<bk׮= Z((8GuCUUsr ̓V#l6 kM"`=뱣RVBM1`&$E` 3EEF{+!ypTR7n8GË&d`Hp|B2SIi*T$#s# $̌qAAWP/r p3d^h#A 6a2貲sSK- kG/N(#B\BVQ얝QxK")&5!$!HSVVӂ֮]{ꩧqs΢=zZnGQU5۪U+_x ~^-ZhѣGuBrrZli`z+*+,pp+-,,Ԙ&2,Q^MQbB FQڢEŕ pe(" ,*2TفR]Q]իWs}5U4SԱӥظquk!jhD:*A"8g d<\ސP$N \ DG7aŋU֥貹kXY#7ifi(E _Pj7cd6aUka(PXNޞ2 kk^x␪ywݿgoy,m6F!NOnw -`6 G.|pYB^`Ă?~we+K1Ε8hUh֣UZZUi 5RŪXb5zYbc@ |7/לg6%%! fn%ǺD 0(lkBPEURBqQJ*@UJJ 05 F{)DJ2Q{q tL MP)`n ?vʼ$t{(5ʵ&^1iH0S>7#12 ,*@1 j5IۄRh0( عKM`=z喱c=>c $?Q)aS1J)(OiY). //m4Uy<2G!-dyfDب"0&W^^?wҥsΛ~ư7|UW-OϩS~ Meڵk٪R]שȋ^\:vۣNNv:z啕;w!9N6L\fkmGf/<MG$ͼRݮ0r|W#SQBŤs,gD}Znl!3r(PmA%$RӷbBjXT)yU2\Dth @;hJ1]x;wڵWoZ7d7P5=)>o<@)ugzm5i]zբޛؽKF?,^4؃Ϗ=&WZw{ksFq#PJ)o{+̡o\r_a[i{Lʥom9˚/kD oްI.ʷ8e=_nƢ̞W<]2y*:=s>᳽^;h$5/IF>j࠻7ϨS$ǗzvjUOxJN3S[AX8힇_@-za3u4@GKX8孬88S0Hw fL[Q=c&"'X}΂(h)+BnN3A ̝<ׇeOQt[f*+Þ ]GHlx1V(/7q?˯ܫWpNX5 f9@ (!$'7Wӵ۶}3fԨQFӧOqy~ZXXHvz+14ax 5kf0+Z !ܫ+m|5뒀@HW\1R,Xp뭷>\7̢bX"c+KƧ4KAD" )SVUU5*RSSkᜰ몦Bȓ}`h} 3~w} ̵Zk{osm]ڸg5qMS%]O37==nn\rӟz_8',(ӅaUmr3g>8Nm}oyKİ)h}O~#}zo{3o(ywLZ9_^]@zmg+*|m?s_7Wt @V}_3%J?ƻs>x7WK#:ZŦ]CyyN?s'3wǟY] 7_y͛3Cw 慱sc8*˅` G4,t|cɶo'?%AM`U`Q]$?nKƉeJZ tRFf;Z EXX%mz3/A&+ mˑP$DY[5*O/ "T[WqQ3}R*LwGI|^7iEȅBt]/jo/͚iӦOvر-Z079AE1،co駟! @Di!*ꢮshđ#Gy ,8n@5I>y`95%Әx4L4%ϯbQ`08ub[{kzH[T+I0AP {:YUBq.l5\Bת4qfQP?KCs;!R ~a|/GEVкjw5nt2qa|B!QU\]M;y::xz̒|E^╗_>Ͳ [<љ_n(z鮨_/#)RZ+-}>< ?!J%GPt2$;ub-_ͥ]G2V9=ꙻؾ$|*LM(XH]Y̮oi"6l *l4M'i qܦ(#Qo@Ҳ}=۷Tr( Ec>.|$^X`… oe]kHBm"0Gt;af-cϧ3g,X`~/FbԶa2Z|@`Οq`^~>!Q!+({?ӭ-} 3{(p㲞{'7|6oGnUa wt?&;?=>s˗ǻ+JWv}_TN@*=XThKߛ- ղT҃[f*zl0ꕿ^ MUuU!}kayQU|&@"_ǫxv945㐇5-TOvy3[d#rBI;\1%]iQ]<$xvygM*گ{A[<=׮QiqmSyw]4lVaˮGSQ}ϰ? ޹!3 [u=آ@qW oOmݓ9ۜ?yb#O]:0N?3Sc_ZN<^ڜ:᎙sR5H+@;%vBD _$+j*جxsHW@> F/ݻ{HAhaR.xgK֊2FH"y,mA\ZeHG__<&cJ.̉մUH 7VFkx6cjZ׾f,7u3 ˷RON^%|*"~@ߙ`׼ķ¤KtAUT 4EQ^ _V~1 0bvBB30D#25sQ&xm) a(fa(0 Æ&00LD-74xRӠ8ѰD=Y0; 07u R0o[b^-\;@sp-Zh8@]%KB$^TSUUӸ&(d,$BTUUUp&ZK;!Yp,cPL,]dL<3^&)_>Xm?}D:H$>O|~aKڶBF=AǟХsTӌ)`&KhvIi)T4.tqKX2YWOJ4Q߁jEj}hYU&tOCV6mӡiXml_`;+fׅ S2:v_pJveL&1zsLBعXېcMjtU1TfdB9Teɮp%"e)91#ZR `B 4{=>}{Kږddd4m9@ V@≸EB)iaE i `K$>O߾6!@)W @5UV 34LV!Et\?ֽmI?Ø'$^m(Cy̒y/<C)irU\B0++##wof gggG"ױc>:/7/G"BC), xԡ9cXd2C$ ē x_x I,3۷.)xbaxӱS4l\Zr$5tшVO(ٰOq;|p%Y[Rm@ xt%G[JqC`'3o:-(@~A0[&z}hDt83feg|ZDx !geeDMM 1Wllˉ+ϨEX<wY`gK޾979lw)&Dx4degSJUUF"h43x<P]Uŏ"uf oHiJGT6`e!'kc3$_p13x0)=%"ɜ_tӲg6Crglȗ3SG%|K UQnSl!-yInٔ~HQG H%+92Ljo8,5!A8pv. _3 @~?3uF#D" bթF?##+ԓxњ;Ǜ޳2BD641se X(J0eP, <{?XZh lwGur b@ !QUUkjjp.}5DDYf>,qƖ5%x@Q1AK+{SotD8"1aQkk)  4@:Y_ ~E:5^NAlVmMnqV"fِa$HVPeGv :sVÝpOGėrdCM|, "3C> x_[ P;hYlY *[C;…Pޓ)݃UƭlqI Ji<~x?E(&Fc(MP<^1!D"$ /KdT6ŢQ !c8h[;m^M^9bx<B D*R?RpGD#\W#FQ,&WRpl6%~閕oTSjc&:r:*!v߭z"=%n'E@l[o Y,67)P%fesO gfkw ?EbdAׁQY?oԩ9@GH`qPh V>2ZlΟq} )Ms*[p2" 1krq$DwncK.ģb]qOK{?}6`P9<3[_ k$s"?JqV ^/Yk bbϫ$F>µJ Q(O![27 .@1,wh\^_ gH Z^jdeg;㡘JE4 BQr"%PJcM)NXG`8P-QLH#% J'fLH&IK.5J9‹:5rpi Ct; t]1~ѱ"H1{6ƪk㡔D.c9E=2)B4U6bKJ ;fNSD 4M+kzmi[daOmsFM(eJ-qő*Wu4}5^[ZN  :ҶQt&dG -rx$`$0LIy I %9jO1ކ{5alB2jgjY<7$Y/V5,]H?XS뷑,6#4̰ҩ"\ںx%&i`:5Ss|%1s\ÒSvƥp>Ӭ28dY\WtrTd\ y7G 듨:Ynv sGL`ogB孑:R񛜀6Ƥ-7;-e=߈c 1LXA2 F D&`#ɀ.tQBAj|V,tw.Mj>}QI8-B=Ds /gpvSS838 ҉)X yq`ICA h|_Dž0/ L&,0d}yn->BYD@} #c0ABe7 -D\Qtfܦ`GL ټ N(a6 ddf 9]qb/&| "l/Z) Mg?^DKq/'ɷ} $.8w[R7 k%xTTN I}2=;F,ado ؙ%8$5#]CvG@yLad]8M̏-%rnr.NDLIFƒ55a8pQEY#5_;%X\ :4ʕ#a1&`䭑c2l0(3_ XxfS-k1eEv @u/40WbðSvK=NL;Әc$;yԷdpBStzҤa=H0➴C" ];܅NRkf&̫Ql% @O[r 1eJ&d?W";9Ԕ\7/, m'co[?_0?0zgA o@lʄ0 M.C8XhFF?`0בHZn(Xwc&D't aHEp D9B8FΞ>#UI6 h1(eJOcMJ+L m8 -B.>y K莩H1Gęn/OI\7C)KzKH2rR5 ׬H4W߿bŊ*ODQ;Dt&b{SieR}?K* _tH(?S3:;("gI)4oTQ U\r% C)OS'cl Rquͽ0y-1 ff*.Kr [vܒ1XS.yݹD\rɥ?--i{ϸ4-H `34s|Q0\rɥBr_'L$De\hS'ڵ{ Š:)dK.R?U[+UVUC״&T~ w[bE(x< z:D+.KQ}LHm(/j]iZ$R46TU f[ڹØG։<ϲXQQ~HDQ0v??S@Ng\jDj؞?34MٳW$Rs.c‚k~ '9)0j%m4..dT^^iN;dgg7.MChBRg0֩h,H#X|sF,0Fh4Fu\ KM;w֭[6m`SKMF555۷oYx(7/ڹ#qDN1a?_t=[X۱ w_~s_RyDp؝:n#R8&frBUg1Ƿ7ᓬ߹}X<ϻc/8߯y>:ju 4DAUHR\r*++Z45RQjHMDVEEMEWTT$1&Kb. tzNZڣ S˗'D:d\Ț7Ǝ.hr / GTFWFw2[l23.={pɥ)?tSu|Svq6O?T-pAk@"k M'z% U.~uoʃg57N61JxrݟGR\tȥ x?Fqaڵ|g4R ]p\C:оa~V%:MC:eE>たyi-.ԧv8ehCz52)]Sf)CZTn$(xzk[L/P=(%yX0iq7|xE H':UYeڴ׼S%xȨnņ-/y+' ]rdSzuʱ?LzO֜c^ne˖.[t/9ZShy'O+~GR9~h٫|w1Jl\ o Klu2a' :я~%F!}N|jW.kUg4\ IDATnUԲoAǟ^Tmfɛ?>B?ޚ8+N9U@ONso:/QC:_'J[Oqƥf_ĻiSΘ11=%nW*}ЩDu_;^}R^˸ُڲz_m77Y^\dػz6LR|_Wh&j@f;Is%***ƍb؍7H4iMÇ74D-l$BwN_2#P(ZOo6 ^wӶX@=yòc,Yԥ4o $;_yznYc_aXלW%YlG?yנF8rqVE^veן!Stl/>=fw9j`kAo{3<ēNY zk[~pp-s\=~ݼq弻 >˛vK.ѣG8g;]sb:,"_M4/@`^W4C9#s@.i ֙|G_ȫ~p⟾zgt4O:\7Cz(Ʃʹ{)ё͛51ᒠY_fk wMlFwyBis ({.kِq/xi]LG-++/gm[_<9//'Lx_M zh~~B-sJU J#ZP9OfG/EHl\Er󻄽4ZHa8 A󃈸 \Zltk+~^mK`z%ٴb]?c`,Z jM_MMYqtn!Nf2x߶f͚>m۶zO>8!_rޕEW󻣍Qdgkj2i__ri&3JQFY~}v{)Z[~ԯsZls-Q]-[ֳK2O>$CfQr^rhk/|JZŖ5|υ6cZX X4RcX<^c%%X.Va?>ю)K@ #׿} xG22lC^{?j_RJ%[&:)?9ꔇIgZ͑*~ߕwh1 珎_y;3&I8o^M#g-b٦^\n?YK:믿>餓H-m?yf;x O{I/sĽq p=^t# n| R81kA}|_63.(=|Q86Š5c7vI:4lphw?C $v_Wڲep8i:a3/#o:uLkDT)x p6Q<ߴis.SKurΝ쩪MI١얅EEEPHlβNtGb\rɥKavm۩x>wuOs\h& RH !PGFS ! f%K͓!`p`V0+VXѾ}f+b;;vHͿnժ_[ݪ19|>euR? xX,*RsX<PDQVzEC좢EEn]RL ;'u UMqLK.bDnEQo@ ;;hNT'$>.9IӴ͛65o[/ѸT'$>la %=333l޴uɥ&!UU322sŧ4Ōu{d=\g遌@#%\:x`Gb$`K.QJ5MK4J>4J0Hw%\rDgjRU5PRJ9(>tm>;<%\r #MӪkjziZMMuSSg B9u_tivvCٹK.tQeUUIIiHMSRRU533غxm99 iK.R2u0w_"+,(h{D K']r%pº"x"S1S vN HT״:C @$b]Kt%\:8)EbO?쯖3 9l75x/dҥKZK.AJ͍yY?3_.qǫ?|K=PS4k}c5.ZK.ԸTG'Ʋ[lG]psw ;4dGGu6Ϻ傓۫߉-14qʰߜ:c;eϯqI{w@^/|T߾N޷F^'RRawK.tR^-}E,n۝{.Z8ޮ?qSe|K 3+v//q# *@ש5 z޾5ikPM$ҥh\ s%\:X) 5;"$u@<\k=ۿ@2;_=O7'F _YwmR'c. K\ױgtRZx#AK.Kut~>ifHfQ&hH|F־?f~fox?0n,[ ޠ4 jJsHVm(-[YG?jJ5KZCHD\rɥާ?{ {m?ȧtdȤPQ ykG`ۅr7<jӾ.U&Yti討%K.ֶw_SG{^X]=Y9Jb_|gD] s%\:8DrړK߼c;+r67/=!w}nPeS4~p:mߤn5 ii|НK̻ ӻ'n;W-Pg K7ntRU5O@StVYYٮ;~䃟HAz~ڪ`֯[!J}0)a;"C3t 6..d(J/lg1}_n:4GϞM[n\"ʮOgBKi"?Rulf@^jemۖ401A636\rIx\j?;;QeeeQ[Og**ڵsGnn}j ?7G:vhd<]jʕpO׳Ky5RYM9AWTT+i[!Og][((9ne?ckx);;U˖EE2zS#`Xbˬˮ_2}.,U)#uKq%0q_I@;F'hV)qʹ#y=M>z}sD"Q]zHQP(h=$4-@ Slݦ c2;>xt܌?d~GyVz宛dut ^H:ymN'\Ŀg?}g`&8E:241}=ig4~9=:qOt_pG;ĖY]2z?gM>yPUPkyY~'~Su>r38OJykh|?`§/92:\4},!̌@`H S Խf4;iЉg~-1 =nΣם7O>몇>1ղr?/7Mz{g]Z -.2ݗ9W{j\hc 5>Z=}>t!䴱Y5鉝_ӝ;M}m}xz^zV'$a]s}1|=6f_Q9tԩ3fh t12eurPool%!GsOO nw墝 {~r`Μ&Ӏ?5\&W?pԯ!zn})rSsgS{{ͬϿ?sTgǘ5w_|6j_ϟ12ɧc}~t#&7_8C|_W*Բ Oj |;4ĸF+,=}_t s\q7)S^&Mw]UUU /"IF-dv~iKTJSy9][?-7 h[ 1{<8Nv/ 5〾-%La]ZLś?ұ}忼Ktx]]?HmQ~yg}ם.x]e 3#OFW+kI}N8`}{TO_Cn.eAOvcjҟѣ?3}\{mvv\aIޖ'_whsԿkN?8悙czW\uӐė䨻QLRd zs昳^`lm ZO]| iYGl&!Ɵ!۳ڔMjVpװ%6;>⻖ >{As}+OPZT=I!˘Wk7B˾gBƜL/@rcfvN[8gK&}S.ÏVjl9ҳ?zZ[}?5jC-VTzުd5n}:E`hJq|TFX"^&xSMlwT9ɬՕ5X{r7%5gi{Yֱܲw.E!zH~]UyDs={vDdO[?m)reIF"i?NVvW{vl_,zD6ެU^? :|Oվ59U?o{;)g|y~~*51d]nETx67O}8Xx޼yl鹻wٻuF1Giӗge0skBs2o;m]SϦlKZHo]}2ajzx^-!ELy ,/㨹1㍾No&DkMY^\l4_h$">滋W9֭zwI? CMZbiάtæXc.!6mr" q~vMOK^cw=Zx׬c45ԙy^k;jf.'2Y) : )'3S V_!"">u&X?\f #1M ][>0B#r|:᷾2J,WތV}[KS6U< &͟9BJ;%vNArrYYn7w/\f+;c~T1T =UHCIAKEQ \HE`4СG:ͯ"B nKgz+.]8a "JuNύEk;Wl]u\=9 :2QE#E#}[ql7>wZJe,4@ϠL&铧bc*!SN"O)}#( OIYve p<[(kԞ={zpۗ9so[;TS]Ju 󌊈jX$%&&8s8*ʒ'!A"6`KEf̳GdXl>W qo }U)7O.'5(ONV^+!%$55B+$RzN=E).prQIRrcodPFD:N$ce>kjDKEl̳$tDmNc>/a>aa4="È(I=)6!BLB7e`aBa*d uH^vmU0`2 X V /~kM@w V!U0`K#8 ؅ V!U0`2 X V5][+ X/d tSZa*d* 3>+|>^D;ʲ,"a 2ʲla$qW AXNiIDAT mQ|dK:C.UXk XWhz{ d BaYaY&!IСhsKeh4jNwhǿyuY90DOT.ϘG1Pr\$= IM~Bו@4~u1յ< KUj߲t. "m!EteVC+s^M}xv͘NX2bu+ )Ȥ24#ɿKB^DB(iaNZ8 :D+ͨ%本e|AF!@jpTOndz^߄ԣ B{G #~N;s#y$ \ =z`גcH!˸]`䍙I"5lXIB UʓJ7@/R4 "t ':x%ev/t%9ːtȂ z \0wdhEc ,E+U_NkC .NeG6U9&*pԉS[R0h)4xFc7`{}WY"кv/p$jٵP tϿ,vrVo664搈@ RrsЈJc;D#[;yY%4ĪX^dʔf#"u6wI8?|]w 0H0d$kbfMBRP; 4EݷvJ5.7([:93Ⱥ(thvi2n E7 bL:9~)Ͻza1e2>ـp֋o(̦SL\_!ɩ=.eͷ~zakySK~-}|4~ m$j3X0hɣ!̠Dk,ѣa:規h]5 y0bq<NL;q1\w">)qW?ͲCt]}̝,'OȴcS]xG.9}ĩ{p/)9E<}e"ŏ|qы8fDvNHUj1'7yin7!}{cv#eSCZ8ʉ gnzSVrA#~TT!xA+]%ܘ .̅ NnA 4!P ؾ/KW> poRRO><> \N˹b]mGCds9fҾ mE]F܌{nhylYk|y7miL=[a OJd9P@5p'̉Wkh$!a1Kj "O4ܘձxu xd}#<gyVţ@z^KaTW&VRT[8do86nn޴:E  WY*jL3;+9sÏx+)**x"Rg]/_$\ĝNY<2Z_ov#1z` Ns*e,aڔv$E}GeeEʹh$BYpm\߁.+|[TOV@bz 8TUdNT 'Vǹw.Jz2/ۏgcѫ'28sB+Dn/m w%sb:r셄` -9t^r!/'nz1-̽l?}UK'o+y3?Pygveoz]AkVǸl~4xУF(?(}yH:杊d,6fbǘ MlA HG+xA[GA:jIw]V2AkP \9%ՖPs:>dY騅r)8#$9i꥙vreo P KWiT`\QڑcayiR ~HZn#Y ,s^YijMIzTH+$#\!⁡o(e.aVIEh&u œf@ɤiyd<; ǣh[˙֛L41)'I JBN9!E'(g}5bQ"07p=O??Em65f_͛7q`ʔ)u֙,]'" _eWi$( NT[QɎC mt)  :clG!;scb[o1|`"DVƤlVPa\.$e8}(Qps.ipFp{/!B}CDjϟg8 4u xmF;id$G]q(O =`Jk>ek xtAιXF4D2nXT#Fq¿gmP.9VubK &XD(I-S:P6PxBnTuSp5=u =ed, 蹧%pH!ÜtDJoӱBX.m83^q#܇PJ ,&А5B?f<=}hhU=QA 2Wb_ <]9Rt%:0x{c"˘U=u|6mKEB!٦ Ğ(L.u#jimwe}BeЎ/'`sm$ O2Q-w9F=h$#%9,٪PN(x,NNG  nY,ґ03-S< 8FWE MBUTW/pb`p Y~g1$C (EF>2I'g:"oKؖ'Jp͌Ii侻~ˮ݋S}IiIHWhg'P"]-92K5 )pdPQpR P|iDO|Hg<9%!zm j-x}1x 7 WƀJ'ݶkI\s3HMmۧ F:B)o;Fz'[LKY< A8_30BRG7% r$_?ƩHIGYڛ\C 98gW(%е TZB8맑;s]-'!`/`GhcĶxT)m<3f ~:[˷Hw` 1&ל<8v^z o=?6n {1n=كIqsƍǩŋ8fw1L̲@C `QY︃ǟx+.`裏}]O@ }.M 2Lde))G?/ݕHEa^G_D,.eԸG@- kH8ѤR.[T9AIٔ'22MQO&eS% ?’[s@u"AC]r?f7)Oj: aF:ExqvPr7&8{@i_ 9_{:Uwp2z @߽_@)x,_0*|uMqDCTXV* $a{u']z] BQ$0 `Ky]1i&cIC>p9:C,4(y=,!itu3@zҬfD^]cG ZeWx'ڼ~a `X'YOR$5@d eBE<~G^OksdreԻf-h# ]Oxo1 >$msRQO&isAۺ*wT?RV#zí3.pr.wOwr ` .ON<ţ~13tQـv  3ndooU+Ÿֳ{XJρYEA,sfeeK/U+Wqz p8Z@fl#:W_}|V^Imm5| vyg炏-$ x-0KN\QB|h^(LUFwNiI>VoTC%e|R,u Y յ|Q"%/PL PXw9/~unL k^\I/P~/p~<Ɣɬs^ \pL33Nm t IDATJ8އe㜾> XFs^\pL8' ʸe˳<9f@dP>T m::~S@oyKK?K lqs9EkOi|Yv+Z(j]*XfBC@?=rd=!ؐ̊/}ޱXIy㘩iѷ71%eoZxo9N¡rS=k`r,&6ƹ XJ| MYik#XϺo+l|&RZ-'dTncUTxD<))w3v#s:ݦe 8 1X04:"pP $7h- _@w| A0g5$v4WgVӥ#>12)%T*1, 2^n K` Y p540od"_ R>|'c& xVӌ!}R'$xͷm` [ 2h :>b&[#ȸ?~z$^L@!k6'qn5ո ?б!%O@rxS KknO^f1j9[2AxҦ羧2LFgN@riVES`gI<1B U$S#-2s3)(" Be5pma{wٹ{<_rZjs_ (p 'UVNyYnİ$4=$ 5" 1A켐R҆}V8Tpm $C?J;NXɚP4 BoY,=9RI ?k;HLR_}_m>tG&5˯oǫ H:o bmSzvd7@Ì.ah86BS8+5R[#q9ca>p ט~G2q6GpE<-ٓKga^T]aZ!yj>Z." @ ;j lF>ʙ  Gڞc]ɭ|=0ÿ*P%TX1OeA:#tm]wϩIXFc.x6AJhiS2FǻP?~98܈4);f"-B8yٍ =F3;)S/i5G* ~͖Ly:ʫ,ՑPWWO]0TFAH߬NEWvx_hڐHS?]UdL^W &a |ٚIB[Ciuҍ)7u".k[,>!rCP"NhWuC;AEWZMY}FllVך6Icls ʯMhǘvv]Cz 囎HS_Z>,1xfx675ڐԡ^w$u7ٍY&hI=H 芶z 0 `*.ZۊC3-mU5[Ǿ5E]Q+cvzpH˫SmV!)r#dY|{2Zͧ1\4ŷݼӴiR F{j thhWmFfi֫ DƎmD"NoӃm;AX(b`Y+WP?feQv7]f^[3-,sb/hQ]ZNiΒ!95K:RZZHH$$47mZ_(%)H )**~<'ST\LqILgQ HmM 999)mzr*s= >S! !lS>W3vbar;{Av_mT0bHbPp]tw ݺu ݬLu5Cێxm楻.;yrt7`Hf7Fu͛-Euo_-.'g{U7sx/q_~ȣwG0zc'58^;w{0~&L 7jzN=.&IRp'epAdq: zz8MnUvG"cQlg9Kv3l!ն.6_e-Oʅd:Dx{vF}Qa+!0_Ilgxn*λSf/B{`'YًY#Obv»b7lF=-W_qO)ʣ*T΅'sw, N( y;1Kؾl?]5+X5nBE</~Oѫc}\ws.YyKfŁ~5Yc\6uB3a:#N'sILe/<6^[iuЏC)ֺ3?yR$mÓԅtpO$ZsԽ$$W2YޓWg2dXA s;{-t Lh`SK .g2J8DjX,0Je<(atHVE뢑#O`쨑Lk;@#OKYͫ\>m=﬋AnU z3zcFbOq -d;RF\u[\NGxPdzH!Xvs>K5yӎ8>="($goz_f(Vf`uba{'t Gvڇ\"ڟNJyD&2߾9?VOx#{IL ~W[s!Nkq^̏IuC9cJ"MŤvKvS{M<wQ+: D,kض:&j/M}Ԝ=%go F}-@t(SU*GP԰F߅F.1k42ƫXXm\XJc(3:1g•v lwCP( Kv➏Wb*X5_:V古@԰2j[&v Zs\}ƒdEO|ܭ8~@B·|v8~/põ}|u{-]J$g7?|cţ׹tll̫]xtޗ|ӛ8% \{c<'~c׸߰⋯.&.8Q&9DKoY"qI=y80k??l:u,N}!ʩǜ ӎ9Î&V.+k+sѱpӘ5O?9CɏϾ5ًq~΃'D6ĝ5 Go7͙eJ>͖Y{s_u QYKg;n߽ĊCC#8^\ nW{{]:! ^eC,dJ=zn9o=*ՃgPJiw/:87}{o&, 3IZ N *{X\ {|D(Ӷ7@Cs)ByȎm1W3mo?r7<#ޝ7$xlQ~q ~q}7w,g3>p%՟Ps2a*67ڄ 3iRq.''3)s7~-kb w$q$O.]p*{3w❉7WzhpR)=_dh6-R #˿p0j0#x$|"e9/INc{FnG_SpLf؞1g}ڔAh0>p/nCIQG1,'f8y=<\w1y9]i9 oLM4#9\CŌ//FАׄ!$Rg10ĕo{r{%C +-7ʝ9yd~M85+wν*fo5K IDAT-?^?9ZC{Ax*˞㫬v^-{'#E_R@g0`i. ȴc#Glz977\u:+Oہmu=Nmɐ6*Y>аQٳ~U<|U鯏X Q=.~#s|[  / ƹ_yvL O9/sa3>ωaa璾CBc.LVrӟr5y񲷴18~fa2&ˉ4E9&zo ?D>bKT&nHrY-'%Բ6δBn2Y# d6CB p?Ds=^H񶹟z']'!W.oߌ`0(~2zC,P.YACD XZ^NJ(B$d#GyOz}f6R$e}Jiu30]?T@Y^;?bx+2+=OFS` ثTz>} .{o4\4{S+dWc]i$2ʘrU)n:j:e M2;p-u4f `Wynf6}râ-4I}8sNdW}3jd>ӘP 2pqH7<\?mNnGSÚBD$0@|#-n=t;ƞ̪9qv?qkӨ ;]^Ci{2 )@!,NI\l6 3LuiioAPńaVoޭdPϹu7 ' g$]pppWKs=/qV#}=@#[ݧKbyOrӳP Yİg2(COw#xrt\^{ݧ!}-5_yh?8beY[~|?wΟȯ؏~JκιޝMPNCeoG[i[(:H̋?&[&gNj}PBX/x<\eӖ6Xs{$V|ɜ|ݜn]Jzd ;G;Ev <#EhGm!hXxIYQ&lъg/ / >q[q8ٱ3(|ۖ% |.gY{G7}wLO7SM9,48u$Y?WTJ𿖐>c3NHE 1@|<.}6Y!fksY)um#]vDゃq334|s>8A F bYy-!/SwS~{8OmXeE77:ڲ?4L^@ .:])ux;}8)zS}3i-mqlDnG)/kq88|َ9!BiQ1ˏbΛeb_ǢVj:*H6{akܶ9:~g 3}O}ۨӀC866O{:;=^{k`?CȲϸ^}|,Ƀ67hg97(ˆϸ"ޙ-Cgp{}Y+ƢtpebW^Q_Wˋ/Smg1i3{"3eʼn XJC/Y_[>㒃V3l,󀄰;s{ODk^vX6o9R毛W/_مeo̯g" Qܒ=n8m๣[MXFl;q͢s@ 2!3|<>iw2cى0̗y>cw\|CJ %vsY/TmDMo…`雼;x/nY?y7-6,a-ٓyle͊BgINK৶:㐛AD @1c,#r||}Qu+)輥 $Dpz=G"c=Yyfg8sv`<! NAl_esF2(7y ={!믘 @^_:̄":yoxhM8i3&[8?#\˧,b N)Y9RCPv0xJc39 D`8[ @勷R>i s3BɶzZDm%4\{G}cGWeȑ,[|lp a#qfoCtyV&Clo%w4C@&u ɊTRgd2 O_OGu`f[۩l(Ws ҘH6" 3^ ZXN'Z[MɐBC ʆr<F2'w=3QD@"KZmRK%`GG}:jlGee%%%m!g[f$l8>쑰 rVGW* n (kj+W'+CojoF: %yTFRRCNI);ieɎ>Nb_d6f:ı rzzww@"ute)nUVQXXH0ؾߖ\ pJbo^-xNJ]IỪ(#JK8`R7b}C ̽b YG_v#yܻekExM%_>pYD VBT:of$(r[gy)tjĵRTx7"QjEebVFIO!UTm Z@ Dh ~"=g7Xs1*m|Ӌ_>&Ĕ*4T ovI$a4ђT@;DO5?ՈA0(X ڄ<<~{{2-߄Gd~o2R7֌er-Wc7s[bɢS V mrxBr{c;Qk~zne҇΋jێR6d_:pTii`oRf(tAsi\=kG@ղݕg"Sf{ ٳ=R|j< kl:@k>|ӧOgϞߑJyHwyy gNa͗=$<@ +i>o5&h2lz0oU1a&Z1Ś{ <ƄJvߛl9" L gq\Gr`x+ϹH$ )f^\o֞ "z</IT fᏳzv\~(gH+PuAlpCY3n+1 OF0~nbcsA!IhO?xyyѾ}3kb }i]DvAަÄ|Yq\Ҟ7^% :7˖ѭy¢1]ae??{-Qϯ+SzmBz ig ;'gYx= ?ɨVo͹̗x7+ X4M5Ùq&[υ&O̤=fX>v2A'6[*J?AkPS] K8ۛd½y|䨊1lJCbvn"Xk>Lx Q5kLagXxƍ1_E%G *t } duFP-E~7QO)X,bW߶p ?0fbl<1Ƹ%i \PX1g:;k~X5zJ:ԲiK~T/S[CѠu KJcnᔂw|/ ߿ΖXUIKQr6>,L'&o<)N:s#tn2n ?`fuˬL}{ t'9vw !E߬dL@P).q&U? 0=@,FHq\_WUۭ $&}f?,ݫr k6&Fo>XGt^zg!arZM<{Hl>dhʶaԜ q&v~& Y=]Nʑ"6!IICL2g*9jw_4su.)[t2dwek-7n:T*/ d|2tqO3FVF7w0Iw?Ast-k޶IiS\"iBھXuQ!SQ8><#-Ha= wbgvVi ?[E76rqQd/g2HgM" Qȧ8no;IB6ҀnL?M9Gz;+S| ùVBMlqPYJtۏY(bI,5tɵ Nt;81?? d2EkmTCOTgM~iu(p"=n0:RRuΝ G;ƌ3d̙;jիa0V^AMiL\ȏrzF>άOPQo9o:3}$^ƾc'J') -rSB(nkԐ}7p?6C[&k0IE;3߮e+sS*GEyyZJgU Cm.M79HXLJ]Q.&YH$ܽt֯śЇdŤؽ/:r: 'M^[#F{۸aL?đ}!g2p`_^ FȾwQm,痾?[ܭ>+=a֚ЇfI7W#Iޭ;*U֭[7d;q0|4z4ZBe[Dʣ5ur\jrO'koҭuqF =EV8(*S_,vyh.s]aW{)T cx0ѹ6yD}Q$"ҽZ~\inƘkˍ*PzT*eіyC͜_|*03UT+`>mN⇱P m_Tl꼽ځ >-yf#]և:Φ뱙n0]XGk] >bޣNYٓ*es_Ӭ2P7z&el:3vvaC21tPҥ+CC5s9s Y~/>>>3lbV%ύ,165X@E.qDR9`kCcIz_|ʩyDrT*,L&#̙;[I2AE JEpm\bu3Q5Pyts:(  OۿPT.^/#X@ [vզ㯩-Yd2vv\z7wWl;hF#QYWkv*d9QFOChNjOO/X6KFcPrˑU)E!ʳ0)HB3N.ۻJ*Q֫oܼ͛7)^8(r8+QؕsV< c o@TRe2nNHɒ%(Q$xD 6 IDAT/_ͥ7+?{GP6؝qA%;mY&ίfKs) U3uwa'W2y^|VO: KIfJ]s9r9N*݉fj=Sl5@ 4Dmu5ŨMw `"bvt|k*c5$Oi<=΃jNQgN}?Qz̐j}&VUvdڡfz2#T2Y>+3vȟmYή50>ВTw;KQ=ǯQE",eø8|/;WU)C)߰E,nqo()d2rABA!λٽ7vs%wI]uM@M)~c)'' 7}[3o,szzpn((K ΫKv`^xmn2N/~Y*=yrҶ }|4te3nP:Vw\$@9̇l,F?3S!}.MV8hKem̜1???XI޽8qŋU֙4Y3^[&f$]|oũjN޺CХLnxɝA&Ի||S,7~Ш;$0btl_vx33 ޢ;`ߏSh_,pNǽuӻC~ ӮTv>H,U`8$t}Epg%o앧O.E֤YɝLgު! vgAP6˲n09R}QHA 3 AT' ft u5e]hG7GSa6l2~x6~4n?%gR䭖ز ziB{xfNσ&еX~N/ogug:X)8qnjbŊX '''_eʔa&W$,5-ŷ.h.iUcKк/ޞn7w^ .s,ٖ:>xTȟy^bW h?z=7ℚRȭbx+7}'GOy m`91CVwfޮ}B3v 0&_tot>c>fA;,۳]2wdt9v'>9ͼjU鷘2ԕ_Xƥo58f|`.9Ǯ ۣKџ;leY>/Tq { y~ (nVF3}1N1}]g"> W;سU"ineՆy}'sMO[#XHRc*9CM-:{ODfp\.cr5&35J|7wn=0[#vvv̝3d{銄%߲RGX}.IQ cLt0>e׈,f`ocɠ8)f^\o֞ "z</+/0O3 yJ6ؠqQ:Jeg)k.0+PaDSL~6 m1G]UhLMnS>;EuU"WWKqR\N|r^gq% y=.S&u///vfdpӲ8ZIJkAA4#}@S,Έ=\)_'ъWÄ3,<ƘߢB۰xFBנJGT%WLR%2I2rd£%&gi MygXzvBDMfu `vJbFeuPDi:-%WڣR;”8-[=̭ HѪ,B5Y"1Zf-=J`_h~)Eעkq!u?ŹEi112'*8Ԯ>8)Y2-2suϫ[qf>D#%g.s[K;o҇RM: 6@H\cj UF#&S^GYt^"ŷs 1wW"Q)=\}Et7!&( U]k[_f|_&k،ΩK`U])L܌4P7U҅gS&ߩ(?Ca\9'-O/smXC\YZ͈1S[X>"8%K_īkm,FSw@P#$$yMtREl}g*}5Oo#Ḃq(~~-)ۡgsM~u^^^)oݢSԮSP ."~R)˚4nL?M9Gz;+3iN>8b n'^w0T= S1uɵ`"1}V(m?9p:0La /u_+%^:GˑUǣ3)qpG$+"8dT|ͤ0s!BJ*xP {Zs/c8QYl33uKWF8WZvע mp}1hQ&C sm)Ks/!/6;G)s_f,cW]|ב;30BJ],H5qJxj1!8'P'^bnބʀ1 IɖF25X͹˘/̩ǒ`RRwv0iBސ5CYO\2""}:~e13feG{5$]HonP9]iԨ1m/&o" F))ǖ[@#6iÈj(6 h|wi5ÐLHf$ EZ.lߌ7'pm@gjpS:G_}>}VC FIhW\O ˝>(3oӸYboMJWPBڷ sD{"f*–ǿ "m;Jd. Ŷ;|^\cW?jōiÙ{< cs$qwKˀ #a^@e==1G}DZnvc,N\^:kfѢܻwƀw-vX7;Zd!9yXa 9N;#&exΎW.F^o.JE6P ,39̦ j }#rh+6wZ2wom2  Eؘ~8*B ''gGʕ)U7o/VgF\(€1115:r: ' #Ix`ȑP@ =@Y.˗sެ2XU1tc+ckE|wN h>8Ը6gO(,%r t:EHT,d2ٿQQq=3F*U^#&&66||sUC"@ (@YAMtuz$dutz-Ft @ HHdTnn zu>?p( !B;$բsujIדfRgڎ ;-{XeVQ 3j%yᥣØußKFе FP*xUݗ 8#4'ȴ6NҤf/f:^Vg&KYWW3cϘKRɓ0%<`W1vKf,E[l67[4q@O8 Is^a2M:O½0Pb6|)M dFn,L@?Eۦiܢ ABb;z[Hv ;˲ߢ_cZt~1dQG]Ҭ 1Iqm/0mwҋfͷQ+A=tNMX m(Qe"Lcjwv=;f|馎+R,)Js}|nK_Żt{s7NpNNjGǰ|:()֢;Eno|!؛l>-ǿ*d% + +^o.le!"7ߨ"!ܤ=XB]9) nrFK@ckiݚJ/)k/0xd[|(~XS;Gcz3a4\{=j)9(CK7|%&7xwdm_1uٷ{j5G  "/;kMYk]眮hgXklMgo2_l{sֵ<< 8Sm7^ YJfڡ g.>W |n=9Jje([ fFr]\WkϚyP,jwe$'%Ch]oOoj;y{c;Qk~zne|Q&Â^jafnk|BrG[ġv$jd#Ƙ""oߟ6wTxp޻~OMc)>Z1Ś{ A(\IqȑpwK ;9.5P9goҵUq]QM"~?ΞDsO; uz7EB-օ&^]ʻ[fs¾4RAQ!'!/Ѧ3D.xu囉F=EQҝ~LagXy(#>U ܘM*Wvx븪m I9Uw(}7[E_Ts&8cw|-긫+[M6w9צo(ք!?~7v-ޠMʝkvP.;lZY(JxB(=p=j㲤#γiyl*L܊6HHQ6X IDAT\^S]t^{kqO`e]GEg[-[UUIlII8N+QۋVޚ.Mt!/µc)}ˌo⛢hT븉Gqrkڶftg$QiÙsN|޵9M4Y G@_lFxs" nB%l@Xw-mL,B믧%aYPs !/(jd:/_s\ML۶B9!5-N៪M)^>i'*|囋WR ,ɣK#!EgDƎk("61x8\p"S 2!&ɳJiz5r?|tU݌~GW I}+-9Jo\k`t*Q=IwAtmgmXF9~ꊒ"-d{Ϯtd1>:Kyu^fm+1S +MM.5 2Q4. `S],%tilR?P@T"xOmK0zzgYy9Ӫ} n X)f$XkB$+&',׸B|͈?ϳ<=>GG;_:iEֈQ1s6E/qd_,Y:+'Y1$voXCaCPR$' J /a"F?금@/wt4>pxhѢDU|: {VpU[zz/FT(djS1i7Rm2HrUv!oVGʕ%:2;TbnAzq+N+˙?q4u۷kDhh&S鱱ܽ{'ORrez{Y]vpmݸAE>5&r7WNc8~iLAgd2lmmh4d `Yv-N%E|ҟR!ֲ+,\s.b9pz> H!r2@ &Hw]urn[ZQF-GQg^,d5ez e3[L{ڃEc& rrB ܿȣX#J'/jtͰ7֖QH` >>`0u\T /%d*'d%,&ldvV.en/pv2 P{3A }GS|Q2bplx.:d^3GhaR%A9ȪH&\2 z/KJLfodd$=BVeˤ@ R4>KHks ti#du-xJ nv+n ,߭_?4Y+Ho+AN w`5~mGxK:=`Y7f}}sWF~b4׷ 11DcFco b4fc@ U$r"<7nƑ>jXcܧyj(K]Bz]G\'!St 7$::%JH&t/^hadC  |#t!^CEگ!7.ƒ\rܲlwy >>:3fuڕ&_-͕ 1%!{SIOʖ۫*D.ܠ[]F>a2 A8zww0j-y(.d-\#Jd!9z%0JBog+R& VN?Խ36u`L_)4n^LJc6WH-,Xcמtlv`0- #Q3om,.E*G APƉ'-.Ǫ냉cSv$mr22&/g=8tOp跕|X+ۓL7^A$Q8 H Ia"o#vއЙj]g Mq)n|eb$vhNfc}B'z62/` ^pQr6 b;Kva[<{&Nԥ`sF>.w_! QL;t]Ywt|Ɔ0w7<1X|?߬Fi9x0lÐ9ۜkM[jg[lyڂgϒb?JE"!1QA-(pEds}'pFYa>&;k%kӔ{-)pCk{pIyF\`goM9;9r[ھӉ܏0͆kفr;Y;y|2ƋwVIlFD IRQi|ȔhN3q‹t}UiwFtZ3S9%X_QۗRE'YɛXѦf-ʙV}Q\)CV!%"XGͦK╲ ^@w߂ >ܦ(vR1ZU1l/+(qPzcpt(!DDdvV|R #Fęw#N9|)ltH if?F`hG1\iJ툫gER>Wx4cXy&C=Eۄ#>NٟԦf- ʉRvbB (h^" KܑiP8f uDy$S¢.h.^);RQ5oƖ+Sea%-3`S|Eʹy4caYz:ֳ lcI~PS@&5 |:e%8e+Гb>#!!Kmj&ޒfrcpN  G¥)?]KHyVwN[J&6I^5vz1Vբ%Ckt=JqLsbc %<ƩL:pH~iq~jM"f󂿱mցR1ȝkӷf8˗%0>ٓJ wEJ_;1F$c&rSn5!I CNl:Sd$!/ "\'!S`.S%ńZҢ˗*>6•f7ފt1]Aqʍ3ѝӬM/&D F lbUV4o݇;rWiΨlҚݿtd,ȯ{ɕңuv=qޙ9V!5 mO*M(Z&Kmj.ޒА{$ a\ua.P'$MQd@&=f!q9ɜ3{WNB]w>gn㰞 ^Sk`g|ʮY}A<s|f6{',Jjf哺ʄ{dx`Trxž:14 .{/|ǃ?{_] AdĪE̢UfTծ?JRTmZfiUAl";Mr{ 9<<|4=vR[ˬwF_2RHNjyؐ+ܼTZح$=lD)"""""Y{$/!2r|[%ׂt61x+]cB܇fCJ2't-kh<9I S˄ұsxxckkVc\ %% SϤ;tl|V~^DD~}%c. M*;C{{=˱qnh0czsyVx7ClnW4~b¥Iq5NC}gCD_ϐVo pvvɉ{Rre5._Nd+a_UWHѿ(~gC΋:4ϙ>cMB;A*{L41uϔ#]<_睨;z W_oATO CUH [Cf-jۀEAD^rmvi.Խ*Cㆄx;굅c{5kF ]4N^Ks ]uxw`J-`!߯JCB*쌍 T)P*ptt@T"ן,27#n)?|B=w ɼo̢iS[OfPqiiB\;/?m!jDV%22 c2؜D"""""ωL&ӓGG2[IrH)pj,ZTQ?8]+"F" Jvb#BDDDP6rEMi=t^j:ㄾ?~O*|v+>e&""""" | T@ņOrǾT3ea랽0ݦDDDDD X)EJ:c_eO':";GXW# +=HkHk:"JyS?6X_zEy?R3}B>t_bIDDDDyy1-]f:qzAgzFhBR/p0O~jI{i_] alBL&Wo^І̅ʭphyp\ F@JVJV1/mRZ<3L͝MhfV]Oayv j9Rt2$qnN*s#^:ohZTTT *Wb?=QThRɋmHhc8s?B(&{/C. \=27OeT;˼!,>y'Wz.]7M?ntiqUoV$q)\Y>.s=}ЭPx֥"d$5PMwroVƙx'@k Þ5-[cˬM}g/C}Ir"yŠ ["-C\4zE>a3l34bӅ(n8x}|zf?[\:cB eLNGRr2+V$11-~))_"IIt:ˉYK@qi,{+G}J$X/2|8e(0tJ=w73#mIZ\yk/_oM?c/7r>{R%mDz)R/q|xHlدnƱ볣趌 n1KNbN'>>Z B>4Z ^ǣ\wQ8I/&C#9w1{/:щ.yCR fM_?Tdx:I@åXpH Q)]'nAw,pbKKű&3nLIA>c"nF;>7Jg!S*iY^GJEIJv@FJjACKL'm7IVt0E{oj/z!h~$gӎ%|w۬xHؔ0[*=fьmD<9f C2<)7X2.8K:}۴p%PAZ|כCr2^8VFw߅IL/>9OT":@pV$x٦K}??s9V IyxC"EȔ _8k*=𼗧̆5SDe.w!oQPTpi,fHo˖ӳz2deJq>U;pqtW:k_pDGFJ@Rœ ]֓ 2?]e (DY%)mRA*i]66at@);iֆАaڹHח(L 7/s`X^cر\pڴy'gߚ)4e!܇}G⪐̎]iV}я-ҬFzS8'4dLO`ֺ̏9hA IDAT;Tn> s˦4mٞCƜ-pz֕_;Miy$=Ii۔fF\z#B-iҢCf!*մ]! ߎ v)>iׄ&oaPXexm3wR"""i2SPa7_SgSIcQHW(R8p=S-bddoѸq#>|hr!OH*,I;V^[~ފ;Mcpt V&VtOut?;}-)|} qH 6݆3gl |>f"`wTWw;7%g><9.<ہAID]}G@0o4*׷|ׯeʖ{e_/kRbuaex811Yz#6nիQ(,ZOwk$)PI)4=@; {MzNﻸ slAASJפ7p?O\?%2dAnXy;Æˮֆ2N2$2g* l vRw!pеScNMfVJנLj$ܝWMyC^/NUpQa}\OTm6ZWp#ȫ/~ݳ_DF~۶};aaaر.͍#G0c $ aaT fk:R7J!G)Zp٘%%ID,#[Ju5($N1:oꏓ*[_'O+fCPdK"1[|ڂqWH@P8*5[24r[Sh+Q/D"tJ)c"Q)Jb/} ߉HRp>9 28:W`insOf_G YkKs#*EqYʃ&:ʞBYDDo0<4QxO3ğ^_.aǤbuZM\Ĕ^i-!}s2{=Z\y]Hm,龑t74g!?fγĴX*e\yCvE?A N|T0u>EѵvfVrYm)dR)dNu89:FRbBV2n޼L*.<y]آvMO=Bд%|"(mi܅vFDm^œ ivTGV֬!-R<_rܒLHH$9,*{t:4"䤨T;{{{{$u"""""ρW?͟Nc⸙ ڄ7kV#+s ݳeh1"i3NjLwq]C+惝򿶃H"KC"?ma%f8g4eA+81A⹰dISC Ғ;@+q(B2WVOd½\zB$ۆX7"#.Z&ݯ9Bߧ[H8:9QR 6F(JP*H$[DDD$Z^TL=X=?4uѾmM,1qIh\ytwxײ.C>/okuƣ bsWq@V.jh1!ݽ~E"`ggRizep͋ySВ6 X>biK"u 9)mɲGa8tCM_%9WryEr"HJV;!"""Rt(Emx3_N#\-,3c*vO8$oo4W2ƼIޥ\J̟mn׉,R]z%OϖF45!ȱxXGd^r-BBB~K8EDDDD^.2 >7*W.$N Cobl(?M)OqH"""""""#!:bnKNFcVB@&7DD#MɈdWxݿv'tVjh:J*;vCH$f?ccb{7 \.~d;? xpBF-ώ/cp~={ܕz1T"!ߴqflV\FӐܖdy q㬳n02NJDN#9%jժѨILL:NIJ9{ dfUZDDD ߱^#5jE G*U̙t,2zN|Eǁ'il‹OP)&uF1g; "zuy^RgBa&#~fv_\eG]̿lR͋eU8ܷ6ɽ2FCuFr~6nN8n>t!70L, Dt(/Dr,8>>eڳ .o$zTU*j,|,ؘX֮YCB|jHU&Z{Ch֢]Ό9gy+TE,[7*x:l>wP}O zڔ>$ΆkҼ)]Σ=fV4$dޥ_f-0vN'烜UA}h Ǟ6d;~q7vJHMO˷ F5{,(=pCNS䎥S_&1o={2l0j.>t8ɲ ӑ ;)ؽoj喊 ~Ű=)g/6?]G)Ir?KT*>p(.\@PЭ{wpIت09>ρӁ s :]y&ruQj `EƮ`rωʲGz]FUDszg[C/, uB9,c5j?$ d!NڎrGX.f}x=Y%eqq9(ӫ$0F2֌jrA<<<_ {orv{غ7v~:??mv3/ߧLi7¶aϨ|fW$o+?? a]l,{.*uZϞ_}tًmgnb67kS? azXv8OmM{ط3/:ao(N8P9QʞԻGN(߬N9m]P?c$om.eXN~;ժ6L_ݛgY8]Lƚo]Y;Z1qe$/%Z1_س;ON#<g #٭n-[&)y+Kz2uJa~R싗)ewgqu?;ƼA-y3*['H4LV "U~ ]Sѽ(^Miz}Ӟeb q|p-ɰIqI zTRS NF僊Y8s*=Y:(vŰEs萹ף,='X85tz$bcbXNlLL =7l`( -Z;> O3[kZ6YwO><[nc@SJJՠG5p;19J q5ɜcWQL!Efk&EA*D$Eї3Xg~o%_>,chk8ʐȜC^{,8M3,rk+T[Ze3۴hٕ1;9Y󒲕 Y{ޙ[ CfӨxw@SJ+ݪj$kbΖ o!UTCqz'Zo չn :wqgVeN6T+& 9!w4glq 'ABְv0Y(@^/BOr;V֝2 ɈKqm0__ʔY}R<[1eZ>0z=D Fc WsȚhlj=>%Bn|4~Է6[9{7gTpƅeŸe?pw$:TE‡ݾE̐mvرc?,]GaƌH$B¨\%c<{~k2Mo=$N9el\q_.>IR'Ju N}'™fdr=mŰO OR]V%2%}*z`%#QDCԥ 7lH%^+` \xO"7!-X\WAScTֳ.qq7~[dCP٨]jDf9gScrAАbS |Y[eQ=Q8jt,Ky˸N^V ̢4ĝ``&ׯ?[QVy\mN?}4E%kyB*-aux;#Rp//O%Kߪ6A8zwEklFq4ʌ?&_F_MhiGϧ}i->]y>`4Җ~u]r  bL0NǧFѢydM/G01Ldv8 ܌P0W{;mbA0de^jW}"75Hs2JL}~_M,Of弱b~6:W($p3.3 T]_)z`.AنdNAMTd;-Be6Y14.DnvFYVZeg̮>rA0[V`\f/@O!ϥRCBpҝ?F9۷IPYa[嗌 E³dwsHY"(%P׍DWPjoEY *pu BBB:ufȐRU9N<R`:>c݊CKգ=Ö%gbTRǭWQKU:=cDƜa³5nE賡CnȔ8ۘN~nԥŲnL!{9$ȝ+PRr瞡UDkMǓ<ؖu",=s^Z)? |E[̈xlEJ&X W+:WW3x :@O>Kr=ÖEgP62QԂgd|'y*y~]Hkz$&}I8Ʃ3S= AvNbSH%RLj/B te2֬]K֭yL>$!4:4LWRf23m~Ի 49ץoЎr_:[Ā/QwE܃J-?fVip";Bo<%.~2`vŷ̓yL۴Sy<{.c%Q[1}Lֿ*fK{ZsLNį4H(׻omܗhb8MfQӏ\iֿ2?Jd%^0sȽ]?n:?,a>(mmsGfW^Z=i2aL7]fjyf̦M?7;Z7M] ,'ABl qgwO.?OfU/2H&i]v(<_BT* B[^D /[k'#n9+$U DY{)7`zt=M#bD.y5 H_^d+#.M L1,p[VqL q0 ,לZryeBi[l jTt)3mLɁkbM~<6 MBO/V\D hXO)#:y7KrBET*'G~1*^{V۷iּ9Qw3!""""(YNvvH{u~Ep:r-jmI"11hjZ-^iZ4j5~~IL"""""R𼀆m-_!ݘSu'_)J* 9lF_?S*IHHN?N' "O: {oCLb>Šx~O !eVrY#>zl8x]Km! uUS 759NGJZSZll,w]8;;hHUtHMNԓte mX3[LznjĠO2*;:#Ek`k<)|{/X}9? G"]F,MFsV>?nONOjrZaU5+~HThS>e&svL-j:CRGVlu=0V_ sU>g0!KX3ߞC-9?g]Blj3bmD*?ٻwO8![LvmhݮCNϱ<пKMD~Mgpvjۃg]ѧdOڴGvsK%@UBf#?ү[氈u6̀NѬ89zs9 =F%Vo{oa @ ԠO֣ۼCn0q]r^2⽜ϲބT F۱lT!g'YpҝQw c%o븕bľhA))2 6}ǣ rTъe_}9>&n ʶj{1ZO/ѸIQxgo/HF&44AU;8X&+w MdϟEs.JlS*Ցd\1l%sww ϶}ukYݿȤNAIL/)vnlK~H@i/8}rQ5Fbm\=ZזŪ[v8s~Rvc4ZŬ7Pٕ糙Y486oemGfvql?sKq,^ bsFA@} x۠>DkԞ;wbk圯+Ꟗo2kww2?&J ڄ<Će (0* >IC6;MPED.=Sm<Dٮ|W(M+N^TOx \=\DI0lTݰpbcbFlܰիWP(Xh1z]F f㷯Gip &1[;1_5(tqFMSJW${jCY"Sibϱ+MdΔ4užҍ g;ş!:ï7R̭]?J}qşg )R@Z^f}ʊ6۾Nr;JկK s\l)X_^`M?Vp(){)OSI~D&* Ryt')z-Ԋz(:.ʔ_Ճ([uC{}GiNl%g.nǞ J??rG8i֘HN|\RpWm۷Ǝ;aR8r3f@"F*;`Zw$GQ艀5~a2 <)I8$RAr _{ku)I‘ ?-5qlh*lqg TF-Mki73JO77Af|Gg_bλJ6f'[yZߡRYt =ţE^ >A8JAшgŖ9 _۠zt8.NwBˈK33c9-lȼ3tæS7u17>K /uW g"RG}_yeyֵ*T 4Nb t:F~)-@Viޣ .qgx]qD"3[kۨ%WFL6=&p(MT qK\qsN͞Slo>On3YrjIA;$׿{KA!>c|26n gbl[EDD +&帑[[yr>]e (DY%䄭 d^4\gn޳%҇It^2vۄӡԵ@3U7 ֟h5kf4& BBB:ufȐRṲ{vu$>'! s0qU>;æEk_`2Rlq܎טLSLײlX:mr~>Gs1K) w*47}Lu8kӧ/,``i RwNg|$J)`(_AX~18t0SM%uIXI*(=z;1pۜ (qM>?I.y_.DžůY|x߲@3 2v<ے] !( ;Yr8zʮzL%3pBSb6!,yW7&J?Ւ>FSYoyYv<m黇Fp<ԟ~SwLimHaP&-SK? aX8NqCu'.>I,:c.2cJ#XB[:&pY|~7gcTn%8~,&\oO '֠G1zKlٴ8j8O.ࣵ!\1VØyFr2n7xKJ=W7W*ZQƔ^J\.,{q'4CH~Lt'/c ]\_.=aƪSYΦ6~{tm\ cyB`Ѵ߈Ts-Z',Nx)2(WYrz37XV7?OG"ƭ:GڳΰÌ[/>7jD' đ蔅p-=]8آ{)k7akT=ƦP^e :з.)5KtUP\Ӫ{Ԑo3ӛ0DDx8Tn\=e 4KlsWvs:;>] o+3liݣ=fo:t(, ڼЯBRgTPL&$VC<GЄFeo^قrw^_[wI6deo}QH QR:l+OΖ-[Xhڵɓ'6}:5knO>:oSJGiz jCx ?FrX pƟ': sUn HT3wf~egkL IDAT]:LXlԝuq;~-CBN QRC:p(z n.S#q==CuȨތMw'aN“T7q,[Sʔ~YU]gJEzbvmc~ti-E~yJQb\J[^28~օpݑ6fw{AETrFB3ӉAgմy)\B``y&}0/z_S>a3>F/%Wh<=gbY\KK{r0Ղ3Hӈ.mevXd(>W-mسb^'# yfDW̠{>OԡXQSe]1gTo˭/ˤOp%Wy@LNVbU\Y'M~Pܘ|=Yy$|Ҫ?RZ]kδR7圵1>(t3v S} ؟§j/?Mh#oOgqzχēOzL}aMS$֓(1=f4%ݞ>E7۷StUYÀ7ڢ_{E` |ylGoct% Es 3UunucX,hJz'™3Q !DAq") X1_&mg.N'17]^'11ST)%d֭ݷ޿!H#wn͖nݺ/Nxn3`vbN"I"! Ñ, %tGB!"T" {xt(B!$" *Vd2e>B\l)HyBqqv] g$DOBQ`KL"Y kӆB-7dI> -}]!Q`4Mtp8 :!0 <}έ)5"3?~6iZn*ÁUHu:kB5kgΠӑkw 摜8 !!ӉfQh͖' W<<=נ!@ӡ{7tJH"!JR\>E߅h)88*WDUՂGTS>N#.OB7:<ɡ{S'hC#yH?"飯JLl,ŋfxPQNJ(fKrNOd /nI1rYzLG}w(Y*IIIv9ﲇ|F{AGStvPU'ӆ(0iN2茸{y56`ٖ}9w ƀ(fǵ?x1:q-aMc?AQ~+./=\IFg9jqtpyfm Dx$IbTlƧ;y| _mǀ!Չa44M0L^Ikx}{44 X&t:VO/bzK}힥e *VUzhGBBJ] )Q.mp4UR(SݫKie<ݯ3˗lv G7r!)u6Ȑ;lҐxٌlSo#h eĨ= 0khZ<'W]}3ęRCYZiԊ3p=j׮CfOw~I)eqδlT: 182+!ugiY.! Gԟ߸*7lXt8` ͭj=] Dms9،U|L)o_.7{LZq2/iIg ̫&%s4Mk s8ȷKҵ/zMiBAI೟'pii'zM PFCY9e?n/s '02fGW<2;VpwGhj| iяA3qtu\ diA Q(h` Ǹ14g _kQ%%(h%.9Ỏqi/w5i7t~Сsa(my-oi2g%tn([\*u4(<0^kԙ X/ֶ!Ȣ=Gi엜0113a\NkYjT4 g>bڶTtS<=KnjTKۣ$P0zע{w̥أ,&i̝S*Bf9I t~ K;sy:$p}<$qeV VOME)YJq)ށfaG _c.(jNU{Xœef8+gZ1N`҂ߤk}OԘPngb&|q"cce# G-z/Ρi#rp ,]vhPc9Lv?PA4.]hpS`ןv&1q8<ݏ .Lk2ܞP9p ^‘m_s?N;,A䋂-<ū6|.ӝ)qs-UD-m|$j|)բ?,OmcX2N'h(Xj0݄${sYu-C~DBf;0vx^t*12Ww:|(յSr!9/T&l0wKOi}m潍<Է)wʐm.Mh2w^(92kC.YV| eyqTKM'aМ \8%ZFXb:W\[?)=|ITP,X]SlHzי=k'o4' Wϓ&;jn{CULoLˠy(~};yMN<,Bwi.*.Ҷ툏w`'2d53翮Ј6]ӣtqgҡ![:>!'+>R0m-2嬇Υ"ώ^ȳs{)BDB!9&B!rL !B$B!1kC!rI4N'C^Ϸ;$B\p8h@  N'Q9sdkDB!rtbiܸ 6rGY7s.]['۹rIe~]#\%^ؖ }2*ak9t&È+_yc`;clÉI4zSSt ?ü,C{QR64P:T;9IՖj Y[ĹmȾHعgf#UԘ6݆ѧZr)8!{74HvMĆ 2}=s<6OĆk6csenuׂ19+x/Elj-&݇?L|sَ\u M]wptÕGOY4m%na?rՙRFң#x[ŧAgWڼ 6 ,vyyߑbpYYmȑD N~@׶L0waK[0 ֢;I$Drƞ#Ng%КU#l:aN4-_25+[.@y/62 ^'g5+xWxR)yg-,\Pyynջ2(VO]Śih>^5)& /็jX8%Ӯk}LrbJ%b4YY[K|(1v@N4 *IJimrE^(FX6U6PKܓsrP5MG1sM)Q?iիEF>i+I?X-ףv:4l}燑RwLFua^Sj/86D>MkJkOe7OrC-+a_H./""8:ߥS،Ui`d_\7X|Ěĝs26ӁXDg[c1+,bFNɇ:SS#=Ne@mEh;qok3_ʝ-4 bN}a1;2呹߱7Ąs;:MESeL?0eNň~ QR KyI$DһM8'dC@w:,DPq8'b@IS-Fd% P݈rޚq/Ǣܶ_d[~,hK$(eQoT՗iPpya!"3%o_zmCEK#zf/9;`c2_A1c"g¸\ŝ2ֲԨhΨ},ŀmyzH ըbUtrFB<^iͮW_$ bx8=Fk M`𬌷nmc΄L>jPB37ϕrFY*o%x&0iʗO}@38,tmKCk&L35[$%%agIr-g#tz3zM%'2"4^"ER-)5MƔ-]P$#<'= iSqbmW=Δ癵b&_\I1D8M -'k3I#tXFB/ciOY1=D9AM6~gpOPg-fe,Zyԟtnfdyl;Nĕpm $: ʼs>%û֡#xұ)CIQ_2;W YϬe爮F{vҕiњҷ$:S.ō$~3[x~WmZ\fW;͝Rn@Z͉h[I0ՐxM3RE>X~Ɣ'.d'NP\z`׻ IOZ-"g ^Mz\0Az1x00n */7|4/ak}ym^J</:+5ϐ&72&GBIoLY9gR>) >2VúPED[k$}F>zuW ~)yBK \c>X[/P<0Ch~#}PG~6 ͙_2e%jw/g}^|Og ,Z?܇kg7e>o?u }ʼu ]:gm ;$_yBDB7c@?>՗oH i3B{Axx8Oié'q:HOOw.6_w܅Ȑ̜Bf·B#tLӵ^m^Dw]HއxwYsS@srxL9G4j,={Sl9ۏp%\*Y"L+۷m?λ *Vd^7bѱck$"/-1>[:>!'+>R0m-2嬇Υ"ώ^ȳs{;|:/緛wx=`<343h-/"CKQUMd Ӊ_y+g$Dwó"sbKJnE2[wo>#ؽ)lv;$TUӮ%m=lfũk6^e-Ƽ\Sa+N6ɅhهrK IDATgj mY²-9~9W FQk?ސ{,;7a؆ :M<\zp"<$/ d:βjue4{2߹A/Hw+4CϬI >5[j9 sP23;~re DB4ɶ%U'-\*)I"Q$5R'Vl܈3n5poOwZ_,&G (Y܏z0:?n"<@CC_#~Ƣ>'6L(YZ֭H)S1vd;S*Rҋ5_k`|=hU4~eѾ{u?s9uuyP)kg@'?"A=<߇s}[|GfdxAS\(%FMIYC9r(֦#ݘ&Δ4բNVtxg,ǖNQv6{HJ);owe:i0/Yǩy K~326 ́ƍn0-T=w29$EWP،UaSnnWᑖjOW}3DhN6cb)X7ufopr:ͤH-KԱxV ¼o"mP2'mB|q4獃|{$]Tlis/# \Zډ^6º.EmPV{dٯ>CI6 ّxm=(!&i*/c10/#Hw/FcЌjl]YZ%H"! /s>\L{س?g#F3Lh` Ǹ14΄54O{D̉qi/w5iCt~=Сr!'m!4g%tn([\*u4(<0^kԙ X/ֶ!Ȣ=Gi엜0113a\NkYjT4 g>bڶTtS<=KnjTK'g$Hf|pkCg&4 5ϋѻe w;geٴ4Lc4ԞRFp\Pg^$ }×w*Gu\I+ xIn1>YV FK$thq\wY5MƔ-]P$#<'= iSqbmW=Δ癵b&_\I1D8M -'k3Eh6OMPB&3-.lfԫW %ɥ!^)n{ozcR Z0\Q^3r$> jUœ?ƃX:ыuODL֐ϖQ;}sJ8=\ơr56-q{X?Nizw E)jUV>YU|IH^.s-UD`s$j|)բ?f3x'44Xj0ij(vh%rx%4^g0qϘv3+6ܞ^ìӭ=n4}Zg&3t T%u0&J̟K;>G 0op07m*['|(}>(V6r\Ix;/ڐ0DDCY^ՒM3>vC4&/ -̍Y+_Y;hngpmSm!|ܛ +⣷`u5Oγ!MeƬm$<#Npo+/RcHKؿ7$[[ƴ GO ׽ <<ڴɓ8G`mm[ Df5Ѧ`zT2n"B:>ĻP 7տ#PZ_ʄsx *ߜNң'z@?SXWůM˸Up-B(}V`0PbEvl~iAp#M?9#!h1܍ׇ?!C@6}O{W0}RaF %2~y[YeYKEgG5GkB䐢 hdp19} E۞?A|mAG!rJQ\\,طbŞb`2/(D3M$&&~J~6@ !EQM_A :,!8q8:VwwI$@`?;w,萄 ___J/ŜH"!9( VшII"-f\]1ty$B :ł9 U@DB!q QB!1I$BcH!"$B!DI"!BDB K]{-tT[B)Zo .LiY̘ޑYK^L&+h kQG}j]=R/-o! I$DeR(BI$Dp7*wSy4Qfگ5]J}<ݾ8۾ecU9.5(عq7$*i\blݼ+05O.f¨1tnE$d-7|w*]+Xp^VSb !Ŝ_MO!s1*xz,oT8f' ٲqbTm C{<aFQ5pSoo滬Mj͸ٰ|msLZu1nYl!K>"xC^Ѕ_GǤj_?AઠҲkcԐ︔?ٟV`I01)ִ!= (4|+{jKket%Y0yM֘DڳCb6j8=Kd;c4#V5iN1a"w+E#([Bx#(kBߚS%?mgÄ;_HRg|81БԜ8]zf1%'[Щ64 9clMX Mh#r:+[S擥ƒwSzX{*'ܴ_iC/Ox}uLӾG_aK)V[Sw:^X$8r^|KhDBjzҸWbi<}ɞAY5f~v:0ڹ }!'ӫGX1/>Y˟-!4T]QH&Ѥ&'O髨;eo$njgNI&l7ϓh,K{{Q^:H/ PS֑;n淃ga͸+h[> +vq!Iq0ťy+JOBIat!^UX| 68kF?3}ˬH6 )n1doz! g5~? xTf؇k>ԑ%R2n9l?k١$bÿ LۯIQ\d!#;"Cndr#:EnƎ"}/aސl>So)2g' B?%* n_pjӆS'Ot2J!`0PbEvlߎ?C-4nĢc"g!BsH!"$B!DI"!BDB!9&B!rL !B$B!1I$BclQnܼIPF#fit:yWyWyƫ$%%aۨTOO|ُK"! Ltt4N~x{{t8B@TRwwR 8k ~-NZ߮#2)xm[Ж֓AVlOyln]l?㼼pɧ3HBF%b^kא* DG_d̷WqM l/GJimCvb9&ˌK1'[^₮?= Qz{|c-_ ~Ky_!+e{\6r\`ޓ]7rd͹UJHBE͛?&v:3jZ/zSP{Ͼ=s95㛞d=5Fsxט:=KYF=WؒwjqOKٝwNt;&;U0gE2٣) pN<ʥZXsG$O.h/)[ [Y|֋}횳* 'I$Dbk jT#>'41`4 gS]r/&xN,ˠΝJnseV#Q@WKa+9\b(ġKxN#4SWvbM*>㉷8Sܟ~Ǽ1;{qh3V^+ײ\sE (TŚr1N]M3 _]-EV%VFo+2Ǎc"tSӵie/oihpϝV2Q#x a:u9ΌґyY?ʼ=9g.Giǹ-K_兙 7,[%tl7u#~"#ۆaCyLY*Ps/\zzvaf|>w#nY5?<^gVGu*=;U-:ۓ[]1 Of9X6gX.Js:182/6߇( I$D6`qouњAkÒp&\ +nwpdb '6A5)$,xSwsGf$}yJ{b̴_q*Z`&NRG uxc=,>Vo>Kco]!!Ro>G%Wcf)[zuFs`VW:(č3x)ݑYF=Mx_Ĕۻ&?\&Mw(B-mA6Qq(*Pq! 7("npD(KN}?B$iu`s<{\ xy&JČMۇAZB\?.'){3.z5Û[TdTRymc޷2po׹QTHJF1 OM^[FqC?"Z+PH6_-8TP~]OMЈ/Mښݙ=FҭYCv9pD254=ZBJµquX_g={Inqn>GVX6>W11,ദ`Wv.ȑOJn\_bch}dza?#H]yb0M"(]*qx6j|E(W}smn,u.v$Ww?Ջ3ڰt~:qY7lޝ:Ƣʻ.)MzUbn1?(3z}9 K?i碴O%%S{Aنׁ-y{铸&Nmٗ^p+ϘZûV珤MCp5Lx Sa6ym`Ўco秳򋹤Cie{gmmgm4qtHz2'u.v$Rqisd[rNyCZ4~r sb: ז#.l6+Vkda?oNy||NT4:FOLzy믺f[Ȑih"kLD14}JFKJ jgmG֏sW`d#[J!|'{F+?E9}bBn|]ڳ'QJg˺R2oo Ot}f[[~Wt wV[' Ҿ>1qVkƅ3?0n g#<5:3N?&X7 N-EҝW>£8K.mJα=u7O'޷rwyꁾu@FL6\9ؗ^Qx[Nr_yw{Ňl2w[OݽuP^yU^Fw+ݩE8zi.vE{o62TΌX#՛{Ēm8r.y!+`7voz?4d*-!ʐ!-MjbT@Ҙ":8Qլ_FA_`/(xb;vYlHJ/3NU,cV<$dOls<זVH9ΔyZ?>_Ŋ/s`c}qQa0ajt6dn$Uz1a*>$ weIvnz8pe= q vо߅cн3>~/IqGL`vM9춅(/6+iu,yoʔa7FDDҏ1LL߭YK^n];&"{$DeZ8v.3Vm$1Նڱđ?" "&\W ["|%#9·_giGguǬ_Ch4F{9gԍE٘&ƴ{%3u!PF9!@Kg"Tihh\6"op;}'<Ą!*tr9 }n^>J,l˧8F4G&YmXW`*4 S}|k-Or쾵$ ~6e{T:"wHaԼ6Y?oC:5 (s¤f]TB9Uj%qSn WbǰBGDŽ(瞣G$%%tz/oC Q  vU)Єq-_lTk#|wZ]8w];vօ##}'w$fWh !+ym%bRYQ^i;Y=7(ۃA!~;Lɫ҄fazt"(qg_I tʪ9f˫cN2\,1pڇWxmرdgg39s gΜaРp89gɥ sj|ۯLy/+q]T {V&IrNrh _~,jE6kC1{XE095cO#GNÛa|^vOhdZE˵aV:Qۿ82y6O{Zc:};oM)ZZT̿3N ߻ YmBE̜9C0衁,C=4d_@-|潵Ԁ( C/dۖ-|""A~NXLjfbѵ+t~M*A w$&%ѵ[7L&$}ᇌ"ddd0a[>l6vwԍ.,NG\z](t:Zi=11HBVVfC>Ȁ$##'xȧZfefTXLriC!Jh0rP 7ߜ@߾k }as! ~U Q}{^_!*P223ٳkuF_A;pqyh4aHHr2YYWH&{aNNvm dEVl޸FV-HBG>a6fpT'Éf#&.UB˚$¹\.2^:N Ջ.'5k 3+ U*5]TW u;Go#Xx̝1ŬF[:QS{[ѽ:~5(Ή#~ڞØf$ weI1';>Xƻ]vίw#4T`Wz%ڮWD?@V<$dOls<ז:_dg1>c;X0u.w`6^YWftLJRbLg)@u3m/;QV`35o;wS^scн3>~/6&]}qQa0ajt6G܎iSHܘ&#_$D9DBVS?|ڀZԯpee`h_[õG[/.˕B3WaHSc;sC}5$Hg$}3wj?mD[y/vB%2uY X͝ l=m|`#ꝸ"8ZD۹hBUgL πmk! ۣ&|\SH3z jNE9KgJ3օ p]\<[ޑ/g3ŴCгI d22=-ԊBtǬ`hO 'Wg"TgѸl_QB,d3gëa!- !Xu ##ĬsoHƢ\2=\L&4 G=[+P#)ܺ[ϒڥb kN2lF:f@mm:Gw^R<{J_ EmkvELE Ɣ~lLB>UH(!͸36?Vۃ[ߑD]E5wC7_4>hIYNAvl9ftIeGs‘w]gj]|UX8, 1;V+<).~G|i^[?.TgG"UrFPvW DP ~Ͼ5Jn8OSYPҽn*-m$UC8W::-:ϖoȋi_٘(/2"!|G$Іs \KMETok8LOHVџBh+d,DŽ!39ecD]Zty95cO#GNÛa|h xxf hZϵ" >}3I1a^΋j|ۯLy/+q]T/\%rj^8,%Cxex4&]-M/oE#R6v(X Љ]ZxlINqdl>Jtq5?;^꘴am;fbK7EKBBͅ Ep@'IBT]]jB!PH!kH!kH!kH!kHKJ?eX>߸: :촑DqLV:]4 WJeo^]|1fHTyIxI<ͩϟc̜_;T:u<+txu[DiWxzLѝT y_TStSWg種:AUG{ryGQAFT({k$]Wv<8r?jZCנuώ)[w:>>w&6PA NB5Dѷ[CtFڷ!8s'vpee`h_[õG[(efxym58<7r0Fqw+(~VΕ$BQdDBT0 ~T;bOEo1:4܃ gW-Z;6jCUXZp_3fM %wՙF4. d22==9.7ʵ&շ~yZrsc uB&! o'>{y')_pˠ+O~_Ʉfᨇ#g/ Hrмd“y/Z.>#M:\oϷ1;`":s\;RQ)ȥ Qi[d.}߮'3zP \r:,U-@Z |So]4oAJHSzK%#Bufqt! d nFi|: 뙃rNc{˝92k,s7~r2 Q4:4Nd9Pf~35t@XwOB]-5ʔ2umMu^0O9WFQc95k/ EHT!2$W_(!}2c1.-bqKr OTV?',&5z31dڕq:>P!Dqt:qv[hզ- |(6B=I$B5I$B5I$B5I$B5I$B5I$B5I$B5I$B5yDt&1 t:TUEȫʫʫ. Պn^l!!DBLFFl՚0_#vlNWTI"!|pr2-[QFL+SBQ"##AUٷ_4n\I"!|F(UH, b߿Bꓛ- uvp 5T~4nm[2˧|!DJ"!DO~1 8 KiS[9/u'oBۏ9l;75< \AdY_!D!TA\b\)1fNn^7^TYbl?/J ixLŚ}WⰥ<Yp`=9pA{OàvLLFfo:M+ /BB(R?,f_{3,y3//nCq1JXwōX}þ3غT`ZF<ьIH"!*WFS'Aڵ y:µf2]œo%OAkMΈ}hEؘ/trr/IA_#ցWI&a'jC>JxzNZ=X\%[RFjB;0ͮx,b>L$屧 څ;z=fe%!|ST.$25!4 џ!>f n๮Ȍ'%u7cKT8nœ>aʬր 2䞎ؘt@DuCnљP\\Iup]Ϋ4*+ -q>w3zZ{۟\k/8!%M Q/εG(x2Ҡ9oîaOkQA6I޴e'C`a|+2NjrCIv]ʁ[_YD`*-0VI$ɥ Q(xIf-3Y8[Zj{I?4".DNYx%s\l`+0y/u/(OP:x.ԏoE/]UTc| 'n$=a~.l6+UuaZl݈*$L tCSHٓ("V?IrOLtẑɫ~6qk?7yF6¿b֪JZoڥ\ywam^|>@ 6{m&>L]? O5&؏jxu÷潵Ԁ( C/dۖ-|""A~NXLjfbѵ+t}ʜD{`+IDATn0I%}Cl4ֽF#/Flp]xwgëo!ĥl6vwԍ.rNG\z](t:vhզ- |(#·2.KÁ%gۀ>\y,]ʬ!AR`$#"˄JFf&{vNT05}^f>iD+e.BKf####dfe^!J"!|h4QRɬa8!9NFdDB\ ~~6&͖B!$B!$B!$B!$B!$B!$B!$B!$)}PB!,<}(RS'[jTjL-UjSќod_q-AZZ"BQаpTUVHqR%ՎkT 9\Xn( AAdddݷѬy3F׭ B)11ݻF`P@WM4̨})JT!~}'jo4YEî;ٴqcG(8&jT`(UYѮGuBbiK EQ DbuHB! 0 L 4Mʒ_B`41E!D9om!kH!kH!kH!kH!kH!kH!ke UUq:8*'t:Z(+J JH*\$GDD9FR))gH8x KW*ܮkJJ x/ϢV>K1ki1)u NNvq:lUqȁAhي7hjKovڣVv elO`Ϣa>s j%˗:04hÁ-眪JL\%88'1mWo.>gvr:/x)J EfVիWfjԬQ۶XWƥܮ=.ӣ>(}FHtSR'6ݞ;Qі8o?MPmcZq\>I$|ٮUAyn“>(}ˡoFoTVVǹ2ֆ'і8o?8m39/X;V%׉_r|gvtYyo%ϠCHٴlynۖ}XR7ĤXt!ĴG_u h ~AUoeuY"qv ?wnmʸTlVv`{ mo /\[UEַ?|Nۯ"y-K_cOr&koxji}#iT]ؐpmGv|ҕqz؈;S=@TUiO^-mV7w̧g.*Ú8ۯDz#c ~/}Nyl7x{,rzwF8^%nϳE=8̯q7]}Og)f&oxz]E4~h;m޽!'EK`b!t uRro@ڐ0=?[[IZ4olͮᆾcU-O wvh5dtye;wdtjٌ-ר8a{PUJ&.'T@ <ʜ>i [C3y=d_T Za3[x'2l>,^Vxޮh$@n _ĺlnn/7TUGdq`1sGn4_^>#m'kN+4瘵@pٿ0l`=3yUm׌I/)G^e3{>u=ߛ׿ͅG=BKf¤qyxJSL$<̄T }#CnlEVfh{ZVl gQ/@A1]E7ur5*c50֘_ML}ki&sǬͬGV"=<~<͍y~#Nq.,a+} J}{9Mcd@mEiMu0ڏa g&#^z/389j"S*TF_Fq>%!^CΟ؛o 4mYU)[X+A hC۬gǡ*5qLP B1*p=i82HM7筳 :qvȯO={](WV_l*4Gy]+ 5KXZjPHt`ъo8(i{~W0(~d[9x'=GP[RUϔ@1Ĥ9b&]=+>m޺[t11BwIGAK#Wv%5xu/?mEUmuĖw}jQ\V.G!25!4xv*(;ey͖܍ m„Re7F@=]IL!/HMɒ~׏3Yuh O(y{=sGCHˇh|=~'uwL$z,sUm^ULIqOG~翡f&<4wCx#h n~nK_t??Oq{~vj;pA>xqѱFMg6ACUDYnslE/wMHk8i߲?͎:9 &uqX`ZsR['Q~V|˫IlS:1e^իWxU}ٍUڇ l΢waC˫ϸ1jȚ4SO]e92}9䷝@ޟޓ7Ncu_ʠԡpL]4ϙx{Sg?˝/$[#"-]]LQL*W@+S7~t9??d7WSiʘ}r3h_J{kզ- |XK%!!r,i:GQ|w߮zӮJ5_=aU;>]ܢ8dsyfSdYYXQlߺj]gtl&MJgϞ=nǢAOM)ڬlۺȚ;pAVn8SI˓JGbO͌ۊ<;zţ>XbU>8ñHMKEƔ* _;x 7a\Q L%/T k-[U/A^jEoY|y)्Ri j֬FѰ}6~SDDDPzu(خ۶o*ޮ}K(SE1>Ε:P@z=X-RK 4HJRkW>o˓ᩲ>Tgh0|x_|@tp}PITYTWnp7*R#*<%}FxB3/wPr=I!_J!BTjɈ.szwdëDIENDB`tora-2.1.3/src/help/images/alert.png0000644000175000017500000002661411270353652017066 0ustar michaelmichaelPNG  IHDR1'2gAMA abKGD pHYs  ~tIME 0a0 IDATxqhW(OFŽ/^Cc%:KdKKB3NVJ \b%#tnh+g٭䲭Bc; l7Ү奭VRɴ6`DjQ3,;q!hFgsfh4sF#!P{n Bb6@HӭG6=!>m'/!P*7 ~6 zK`ZBaO)4(%t *2)/)/D?~qZ!̝L\V[rmblIvRͼ]gd4誫I򖥞s>a~R{roq>a0wy!uFS郱!AkC~f!{,aj[47TX*aVN.yR4 (Q/Efi@ Ru/PlľjCxJv䰙=O[#tKװ`:}q*kmg/!`ӑ927|н~'Ti+˲To F}ŝCW'#=O[rߎX͜ikERa)XrJKXӈb{-ϴsb,_G)_/gD+.* kYdzu!p۪П[$ZqKEO'9:\@bjF9g G)h)М{Q0e3Uq3pVk+X,1r,3abj ꇵOӅ Dci8LΜ?} /+@3" Cofc__ |Nj6̓Ӝg5oUlFDDzeE^~MeY*AJ{/EۏۣtV\Gvw{ގ(fBK}xap[>nXpaY ~:xg +հ/8= -,Qm'*&t%f!ձl6߿zՅkeW<;x-ϵG¢(R%HIVR:->m'{­SS0TiЋ=+]^|akBR.YC@),5T%S zwSZ0MG"#Uk0\,|=tO)q&0|Dl,Tdt2l&Bwcɵ' qDNѬ{ɵܟ[BH_u͑R46B8@!9nud 0 ?1N&iBfK\f7ahаExP0>]W9[k2٭XA2ڣWF7;ŋ7ٰ-"55-IN^Už Y5[nFnlb;9k݇2@:fTV5gBm7Ŕ]../e[G~EqU[VrvBoLFRc2Bo6Kh'ԿU0A*w>97[M[ήv6L~:g.63GzZ3>2IL?2_Þ7vZ/+8aǼA% zZ^VGm4ߞTj :kv%;ISXU^_OnLeߴKi//Fhe񗍵l~fpK< ?my%x<`@[[[K&ڟ֞Xu'`0L~>)MN~>i=aT3Tt;L]Z6Y3)_ڤ{ٮrU^=!Q) _m Lؽ%'\d"EXC&v6X,?tg>~_\fO".~}}/;tEH?{=%#>R%nKݙL&s'sw-{,yx[GܾӾTk C^i e2~3[!Qq_`XXSqڡwGj>3Ω/ۍ]/wQFQ׏k=x=?d*4m#o9g[_gfrGء+ژTLM3L2dRP>d:K5C $?n5_< -P_a1ٶݖwM?7%+ ɣuEG䓜6B!3ΖbIrTx65^1bXgggF_;e%t)>~gZu!NmcXMPowCG×yQ\cn򗩄[{LʳPM88G^cKBr_%#--cѱb8Ev(eSvPٲǗԖ}A驴|2]Gʃ]>]!xo@zHyMr2'zy4.#t߆|qw_vp(nT*%]6+O~]6˲h+wæ,uT~bn0n7y;AK?}V_- f^M'lfw0CKn:rtkk/>vYև *#+[~eٙV^{LkV ~RIrv \-IA(j)gט&e|ȳjݏͧiǓUDx05_9'Q ̸[i;ѹҠ5ބ5oXWpg|HWZG>ʖJ RKnSIvXTy85ER5?qzTQ p[>{&BEp7#*Q.e{mB".^sd!P2Jl J)OBRʊF)K*F' }8:D^lVڔJ*ic"Ry.5PMJkzP!L!Svs-7HO7fI{_ AAPurkus-{ -=)P|_ߚd3ZF )s2xs-m㟌1SŚ"1|yx_ l5xa7ݟfaGPVisߚxg N33] LɆ] 4W%*~>fpvv50lRȡC7Yy&Bl粹Gm×͏ζG0lv1;پ֯eʹqCW*==a~d2s}QK,ɏ'͏L*Zjشb­&F]ZXXxt̽P9[H~ ; v,Yl6r>k~=Z΃ ݉/dR#],d3Y2s}XuMw2f5s2h둾t5bORw\ZF8c^چOvcj!aT]>*}=|iL 3`<[_^XΆKBb|9ezYjjh}d34e?{r)u5;;?î ^:}vm<ظ4^6BFqK:۴5B[lSV7jV BH5^6NYMJkBRF٬vȦl%5!R6>!ʍ&x.!TS6BgZJii26 L`R|ƙdIT"Qxo]6o&ViPߺ^!DQ xQ]G\`@P \ m|g|Ԥ(/vw@TR.K(+5.n0GYV8ވnL::;N6 b[܌GT~>Oʞ R7Sl +NvNŹot:5)b O[eໃTϵ 1 /0me٦M2ZHR= ٿm R6J;t?Q&ɥׅD5JǢc:˲Wl +O…戢=`L^W5-eW\\ È˯챐ioEQlu[GgGkx|MLN0 t\p[) KsC)yo$u3Ų(L=x!>cYvA*Zqm| e߲g73Tm72O|{5, .'5)?+ߢ*'$oĥ*w19 bGgG _BQxb_˾+eFdm-Ek7o JyOy'yi b0Rg?JQI^aǏ(~A*Z) 0 C/}9SF+*,+BZTX&_6s(R'ԤT^ve:;9>[۹6y4ea"m춤n.#+1EQyod\D; iy?_jd `^"gƱhM %;aO߶F&z|h4@HOSHy/[c@H튥ly "T -4J xOyh9HL#j -^֋κ#eoO9̻"פ_ eb߸ݘb'),澝AwSꝛP.A*Z) XDss}6N( J,-P2'Oxـjlds쏥n8F!ddVtO!C0_#t_xz lR L!BH50eFޱFZKi`) 5Ô M#-BeS^5MJ qCfixAb/8qkWhڇ?皵k7ڟ]ZOǭJq3R:1ʺ5o٫/ oBhb'N$H"LMM={ߴT|k~??D3\ mObbcnp[pv;]Kgc(riFhȇ):Xqa%jP'e][[q&ORoX^ΎL&{4d_4eT}}pN&:=,d,-}oe27}U՘u8ݯwz#^q $FBB)uE/4U݊7)|BB98BB98BB=pP'{!BH5=bTjL;LId253L&CMDV +y+M|00iZO'sgej9xTS P"KjhP`#Ypꨲ$qYKCJM")G- OC Py OZjRŎ;;͐--岄RC<".nIS^ 1jۊC>V1k#T,eTʼLE\`"\z] -8 IDATt,:f3,ְ,\h(SޱUO5M4UyZ܂weac!^+~Q MmڄۂOEN'Ef@0@.i /vÉ VMb佑x"βvm+RNf Sv߼ :p[0o:;FZB/VdPEFDAKW#.Q p.RaOnqn.TX9H,-)[TJ\FeONCieX(]/uzXtq;HNē |Wj SoAkNT|myC5l<|wQ.lv4RHoȩO/5)-%eZVYi*{KESVQG^mz]cq$<,3)yZ4"YqLT*Ȉ^?SŰ5UqU+bMC,zO{s(!9cmhpAL?75lV u#>YBdF!B)[M(8y%FLz@`V =݄<nY*!`V 3Nh4tUS>nzgm> WGMFRq!j >殮*i)s'3??hfff2LA,#KS X&O!9L٪1>vq a MϥpD$,ԳǞ&#kk-"F_#~)ߢm ;Z V5h4(j*5mAf2!\L]S)#}zze2<}0z;] 4jwWl0Ph4=~?B;ZoVJbLƲf_&{߷4d_4;;:3L^O,Rjb?Χd2Y:1B5oŀy0zZn'DFHRSp!Q:"{TMi .!ŕ O}0c@ё^pR <1B)!TS6BlR L!tʞzjj*5$d2ƃJg&&RdGy+wټ&>KvZɓR_eaJt<$$չϓOjdO; G1zuTY2ҐRH&nVZ4N]OP^]qJ uVM@]:  uQ}g|R(vai|Ro)% Y]/uYv[1s䦧RI"@F\-8;ȓ;^(~A~^[K]cq,2Qf,u3%G!TpX(.iҜ2WruzP^6BlR L!BH50e#j`F!B)!TS6BlR L!BH50e#j`F!B)!TS6BlR L!BH50e#j`F!B)!TS6BlR L!BH50e#j`F!B)!TS6BlR L!BH50e#j`F!B)!TS6BlR L!BH50e#j`F!B)!TS6BlR L!BH50e#j`F!B)!TS6BlR L!BH50e#j`F!B)!TS6BlR L!BH50e#j`F!B)!TS6BlR L!BH50e#jT'2w2B+ZJ٣WF7!Vn \6!V ovB{q^KIENDB`tora-2.1.3/src/help/images/session.png0000644000175000017500000030452111303312237017425 0ustar michaelmichaelPNG  IHDRpvu pHYs : :" IDATxgXK' RDQlޱw?^ػWŮb^@ł-ߏ` ĸ9{f朙$ bpq @ @ )*谥G(D"_# d!@ څD"1LN$ D"QVf㵭@ RALLt:` @ 8),d0KKK Զ>@ RB1k[mldߓ_1@ HA"_O@Uw.q`XL4@ D"D$EEgM9|z#lX"UѦSOv~ԣwڃo Oy;V0i VA$ϸ|m YҫɏIs ݪ2/f?s4jR/)^ebf d挼\qbM QvrHKKz-mشrgk33PE_`/V7+#s;شFp߁2OLv&y DA RO!}͛B/BruuMOKo舐i(ðwfgnݾߟFիwcc[0 'G<rɣxk%:Wy˜1ftkE&{LŸ^OBaFrjh[5k[* ?1n@ln4#ACS88â/@pah3K^, 4:DiéH$VAz^UJ6[uڵ;n-H?wN#w. YӬ.J)3dq$%+HH![Gw{?Dfs FMj$S Fuݻ]a;f.iAu|3@  a.ҒbE~t4ɓ7o߲X,+K+P )KrI(744o> sɣxU'+\BNܶ~;'0L-d#ߵ+~8qlzc3uagą|2g)DTir%4S& ()` f)sA-ɉW>}9o g0]U5i}.Cغy$$m~טjWDա1% 01%&kz\#e4"F XI{Xjrt&f0~Zn̦ΠS/]]CՒN(Lh0@$A2pvrf1޳XLv䘛`0K\oRd,-,T0 d2MLLt:]zB%Cj l$[[[Eahjn2hgRgyOX=^Z r(Jnf I.?Ѽ{w4Ֆ @&;d_ &z=L^<´`ɻ",u%*Ͽq ͍ގAYA?o3ɥ)S԰YBo=&7P!M&kz\#e4Rհy1a_Jibf W ²¹\M' h XJE|5@ H0-EVfc8Nļ{pi٢yeffhkĢtز'T粳]Z g'Dz)' XjUHHÇ$1XA Z_ 3] Zs*EK$b$=X$F b.$'շ\qVЖmWɰUMO p/ўq|Lr$~DrMF(4Y?XQʓ 9&miƒ2zsOOh^oY~<çZ@ Idrf~0 kެiS D"QZڏF5Wl)e4oִIc{չ^}NM7kÇw撧f!)&^sϞ_k#܃>pl1ӠU'v1։l~ciC^w.?Cf [Sit `+fQ;vf)0տ=q;t`+mkb3n7ul7]ާf hӻ {v3P)J a6y붋G7wjPD@ 5TRJA(Zħck֧qPkcffFp}@6~]ƝS1Bɇ@ " ,-?{֦m;: 0 E7nbjj&UN_5kԡILmS~X6 H$`cQjkkk2(Y-PE`-Ht6eoˆ:u;[K9FV/zVžqS.|^_tp هlML)''Gzs g'gAxJˍ13+!!f͛;"n.:rڕ\;uTa+@ 6`X:l 8 H$b+ Br"W À B P(*J PH.s rЂq*@ _(\?@ z\!@ \I$c*% #ԣnUQU@4,ToJ&b1 _3TשG-Uݪ֣hlYAX pMB]TuZe!!K$Q0AakB*J&-URuVUJF^p8D@ D"~r?qg2lvm0䯦#W2"rIEb>. (((I( խj= s%s3==J yS4խm] T;[mmR+!K$brI x"'gg CjU"CǏ::ڥV)l)e8u*m  zJRllVZUัU%aЕhkk7 #GB?c̬&MXZZXR0r"F!ZJ/BFII.kfna@ P[H@QdefӓIaK)ŋ L)\ҹAIijR1Qjck'aHÎտLW2\ K]J\ʞL&\GG?tttrsk[H=Ը\ICBʍe_ [2B%s8c##X D$262p8n)eڽz2čL##uDP5$XHUVIH QaWEiأsy{uQ^ !=f啓LΕDnWuF^86EFl8 0,KBSP)#r  I꥖ o{V\a+(3z  p\(%\*MsIzvh26+]ě!8bD(8.Rpkb^GrJUo7n3[|)(媮^X`c*o/I 9`FuKtVxBִKQi*JuqҾ~cb:ԪܭF.M /%JfoRC \4S,9GQȬ^1\T$&t*q}nw)bw,:ۼGqyPK&&dRГ!; ˙ =:0ܪy-rqcY0ub˞?f)}&-݆^Bkq^ZNtoU).QR1;w8qB$|g\h!Y g, 2^J/_fδA=k&Jի^-.v:ƆMω uBXQ*dܰtJ` V3A98T@=t8ͲׯJݹFT{RN%I!Hp[Hu$5xԴKlU Q~.,qwȲ:wUD\sd<8Dp}^ͬSO[-q@S=?s;ת-3f{ 7?vhtCnvv=4\`RX26ܙ׳g BqiB:d|r1T 23Qܕͣf|MϨk=[pnsŗ(DUCuȬ*{Ԇ2F-Y233iSN#f AA)x_? 0s]PV4%JvXuժR\\]Nczb $ cbl{߉<4f|h݋(diCY^=$t# ť1I=icؓDN6k9d릱 IBx~Tk7OrQѓI k7С_u?,a̠ч<8vFT҃u -+ε¹e*N?u49 Z=|l%I 9t`6<oxrY3@QOr$Vs(HNb |0|9iӉ 2mPC9t3?.,5ǞSGE-,XZJ#ZD)BzA%ݵz* <1<[;/Dgەwxс͔I6FA;۔٬Λ@gC,М G_A;Oj[쐼XparP (zvmĐJkk޷c 5"}0M,S @X˃zjڦ˸ 7~~9"EܭM v R{˗]@%No; b4FLUo?zpfkbJ2ܱmK9[! =iVbn }[^Qh3ȣYSϥұ+qCkijV#Ygb q'^xlj+%=nWOZO5dxu>Eq^L;n>'…A>/;q4!Ak\ü1 ez &v޽{[nII'kiWR>]Fn1ȦH:͆KV Ec"O ?ZDfuI|<} $g@@kŧQז5~eix6,΢Y~Q,m5G ~.&ƌb . SOxe ztޙ~xeOL/J2s~.n@'zvώޞON]״(xi,SʮWg،TP8 Ӏ0#95[Q5-0`؎Kaxw+|[^$EFf u83s_dKXF}@Y7= yL>/fZ{ڙ#NOb]&RFy]=Wǎ;vm¥/[p%@I @j 7QB IDAT2TCQs]y}JE5ioGAf|>|̹k?E^2x!Ĺb@cS~Oχ1맞y=Yo^u$YC3o 0FS[3U&Cb9۷ ީ7(F-~ykF~ J Yͫl ie@ղAІt~gDA1a$  &d.E'9իV*|Aϒܹwx~φh@h㗸n]J*_o9" h8@R$]]G/JL\QM|{;%5!k:@3 vcq" ,?!Fwٲ㫆oʢ;t1n8O4n-4¼F$ V\UPP 7g l2PXJ7Mi֌YQQQ3g̴ tҙgW\ HО 3#d5Ez$%znn~`9((e؞,42Ӯ&zm6ʰ K8nvȬ @5{!ɏtAa5Tlk#T68(Ad=*hd -J!MLDE)<,1س)9H 2 ~?è̴$9;BB sQ7 @(5`Qbqpjkd%/,&2С}{clI~ƍb=:Ğ|m#x\kGLӵ&8b~`QνH֍bEWړkHT~+jAEt[lozH(2ԆfiSc|%C pA7A#%脄[:p5*O:ZjSarVܾm[nn 8²ʏJmY>]: vjyqD6s>}C8SJ]#\59s/CJ`V-JdTӣ,iP(VXj7Y@*q" gvcEfspe7ove8/PB,DʙBL6բM!=ϣK*@<.@e6J{͛E &CJ7o ĉ7p@ۢ8J%]jxiر3 (H}Q =4JJe+ռ(f#[sɺ[7,9i>fҮCmVHWb1'bύ'Ϝ>}gN̷ܽ(s޴ lxF`"V%Ja1gѠZݻYPZJ[բyBOR\x1ikLqd nؿMRPz'wU;SdƮ6 %WNJ]OݴofSfT$k2$`y/O|8`lkGt$1W;>\g-MC<9{|=.NoU`u?J l[E{rlzBO~%Ͻ7לw;Рqt !`6i7p"~~3Yν4}vx}%Khv/^9MD5D%*ADCRR4:'vvo+RO pX#ݶm X ֕t_?akzzWm2Q/ H ۶](ժG ( j5_w(JW^q~8~]g,?ϥYl*.ev}-xut)|q>3l@')_WmG[,kQrT%pyET*|l R$ɷoߴkذ;DڿUN.'~Ŷu4YM??vIa}k}W)3.80 S҉βlTEتjE@njUlgOwSV IکacL?ϠkC&tP((5z*͛߾}b_5k֝[fM[N__Mjj(/¢I&o^WSjUKEҩVu#W5.PT&#(p5k#WHŐH$_>f%y~ޱKؠ`ucʂCiZɰ`nat*, Ǩ4*+%Q/$>=Ur>AQEYY-h)K/޺m)S||:vyclbzzz޵_ۦE~Z}Q T:5RS~ݡj\QMF7@&#(R1P%!$O7b'my]K TiJ _+4*JLHbbB QI&G,]|MkBR [, 8p#[6o7oz~ꇭZUqF Yur?JFrt:A}*f8p贊?A QD+֢}Z7rpJOrH$ᣁJ*_H۪PoJqy?Z[[Z1]agka*ѧbU`_+i$p? * φFr b 7| a\.G$hpRT+&?A&l[Ν;͚[Ty?} .5bm:KuZ_Bc#nT*J j[HC~8R+TscT*/9d2-,,H뗨jU"Y@-U7nUQU@W*˟aQFuG8F-/ l6Fe . 6(–T*+0r(׹bF+,Db2 /|&!Hes)ZRݪ֣Еg9@Q+ABV6c 5ꖪST*d@WRز)@ R?+@ ~#W@ H:׼؏"Dd~O ?'~ϚrrrW{ظuu@ 2<޻]]\tuueKDII͛5q @ |91)Ev:W2׸V@ Hi>\Y,Y @ 0 ---#po@ HF@ AGC:|˫r<%jHR[:mM n@ _5:ׯk%U$~8bL6m< q.|jgoqV;ɑÎ%? *Q5()Vu9QhAt؊zy龜jWMn "I9}б༜۱e *xָYjkIʡ[{xxg^*٨2-멾][pqswwwwwZ]]_aWGu8%G ?RZ@$&CUg'o6?Rk^=sll x =[6S_ y Nԅ2jڐ*W7-3d/?[*qW3_lU)eU6t&C /x}#AW1r<6z !gqg(ǴtmN6#6lAm'+X~a)cWO9r{sJd-wˮ~ߚ>\2¿GgIQ*hY)jշ;O{:f ($Z3wDBBcoJػP\6AU6 ݐ{璄,7xJ1;65C-ymAuyW ¨# hkҖi:4齥cӛzwW֞؉퟉%6SAʡ]:ķ{;kn 5UpEq')GU]n\m<{0WtQ:R+:e`P+}'xk1_. V(&)Wf}+ٽ"z*ۑMѭ9K?߾ANq˹=];aǾ}\gzuyIk/*7o%~ntx݇Cn!Q]ߜaG=wf 餛ª[Ua9>8֨QQ.ͱg>#D ;x[^xTjV !t2 kiZsKs#Tr 3e{ft }xXUdUȩ'IS-teV껡<9iPu^Kw" t] % ȾhYdϟ^^"zq"}{ҫN>y l͛Ǧ,SĴfL¢۩HaOGmv>/xz:(}TIT \jQū6֓p<2@QdVVuN/xsؙ]mclu&IZ-_ӹ3Z/xFodV3:W 0O"d:MN4׳>{g?(adnGG\d MG'GZ)P)_ꏝǁM&QtmɿRʲW-.6j7OJ] *[\na-ꂔ3*@3)9Qt4oKQ_*iHTNNFczE4ؖ:Ņ?@˂Y(ZV O>A*LYr=20csn^LGgT KV?^5 .{YCJ$(x}ucFxwK8q3ՠ=+lL45-('^a|bthCMnLj>z[ݫ"uF}>$4WꎱBjW+3wygXt饟z~DEQeU@yd l\;ۄ] ?"TWyuB[ux@Hrb\ym#LxI_7"ME`V{n*S"BqڐGq" h%rsXIC|B>)@HGk4Dk4/%:HhDpNLE%FT[ZpjRQzA6){5fћt6gHWŋO5VRiHTc!NL=ϚL P=),0cE-!(+V)qMKmhA;mkWdnWUNZ~0l-0HA$=SH<^ؤo-YY'CشȆmvpv9V4T&kD]@%$4W#V@{>x~ ʪ: "W6QǑ֡D<5oP@j. Qz2-*G<\㺳a]J\Hr%_yzLI*q "6o>ZeTDaG^UQ ["((\=+9\C 4H8`laii杦4}8p}m/D ͵UjsžSϓtgvaEէ’ ?1ȼ، 1:3PXj7}EUumT1kg2~ҋ*4NnX)UQu^6HDJqT YkQc'+Ʀr; M kk_˫Gn7WqC1_h/^K6Pk86fη-*ƝӺkYzkXF B1ҙv`W;A{e(`wkeSG J⬈yz|5rFJԩӚU`HdCQ6wu)hF"l!ӣM`A@qŒ-m NYI595KFuvwlŻ->pjPa /vֺRVrM ߉{p4 7nnXpyш} ?\WNTyS2U4Ja76ckד^p_FpZFCGGŧ>88y=%{JjN$ 5'8/+q onZ{ê%ws0s3zwj T&*@ i׏$빑EP'L3pהĘKk7SR=Zb)εc Lw\: %{/uR3mt[vu>1599)6\I SSH3%ej%ů+ bw ꋌs :mW~69v})]\gF%pIϊVJ(S& 4;8YC#E UɔZE#6GTqI=U.S5+ŠÈ}<^!x_ݢ~tr?IN*J kʾl2 9Y2TC#%yo>miOm}@ @WoY<<ۡaZ3w)I\pXޥ_8 eqsOvo{s`w.*%8{zgg;k=MJUUTjn.v66M=GJkSξu_bn]h:4nfK۵+N2ί[c^LjD"h'aί[+[E1lˌku]㦂?Z<ن 3UצØMrٴ2%T%ϼxu0hbTpD#:v3 {'\俻{:p]"\4A_ZA"x_S0սUn ALEY`yo2,-иissb΋m훵r՜jփtSw^e~E 7Z8e`]cmi*:„i2Q}3bTGSbk^is`Wmգ7h`{z4uwUTQԔWL E^6g87㑟}?]kB&m)!gOO82MR''8j˻;{#G'ǜuU| 8_dŃc3I(»#2 X[4bLQ!K.?ve|}>Vl Jf7;C)ɟ"O,hPzwϤ##;hWL?gפ7/^Lh=Gh"C*y{9+6gSO{^BHI v'޼y;3Vpc>GpіgFQνyn,s6u32#-1t[wAy7;s~}vXrʸz=AĎ,hh h`&b}}ck ]$a#=ISw9ĵi%WLH:zXHi-5FރSvzÅE/mY4ǘ+V]I*&:䰜}V/$ =ȧ{{o*M('9lv/Nrh;x8߷~p#Ki{]VCG%|%+*CVZJg@tB &0#-;t{ߣ)P$k syX}PSMV ^tڑ.Z$i-]K^M|Z. $:T}< )(9C2͉p# osWk)<di4P-!1#ڵicPjDnT~slR_c(z<1b#/z{&UC(Ÿ۬ =!rӄa%'_QOqҒgFݩ(S bcަːY%4`5ӄ~ٺ~5Ogشer*FԠ'p~) E=!;t\{;'LOLqI6,p'K9VsS#8C9-*vGc4vI2˥{[Y0cjPu=2Paۉ?\I-وV=nLz{%LY}WOx+@Ǽyq۬F(Z cqv,nfWڮ30>+e;e7{ZxJRrJRrJR̓UDKT#IZ~ȦAUס7iؙoǬpJ,’ݜ<L q p}O}ٝ$kr-,TF9]S|"](:&4Rt4=#d$SbI94cWm^2W([kِ[yu;vMF2yI9ر4 ⦖ znz9늳SNH9Z D|G2Ɂ.׌"nJ R, %JhzWҹ@Z,d'⎓cP gA8PH95xJ3[$t!"Gy>yKJrB'.*1ɣr<ڡ>Si!P\ :߅OYcŰQj߯LL " lIc (RL@Y7HrjvFFʬ^yşz{yt$8>ɰK!yJOI'ы:ӵ˅.Vn%;۵d䗧<4Ĵc%2S "= ɩQ̶iKcزLjL{]Co$]KJz լ6v/-YP|b]BȊP__FgRdk ժ#Cľ ydɈ8jٿu#_EMfE̴!*,L#i~E§OZ7#i#e|~a92Qv0]J(I)mѤwqw2 d}/Ou mE܃]JdJh۸m3I77>UZe8NJ-T4BKX9\a Bv7dxg5.P[6\q|QqTLf)Ak4䆶~}Xq ;cO_Fp@_/4ގgNJ}I27xۣ~xeːqv_BX::dAķuF])I-W?walRuEE6wM*Dža'7i gGՃ1!k2F>qcjy[ѽpa3[_U؍d{m7#gF԰ paAMBd,v sV/'Iӻ ɠ@㬫OE]vwAe~.̂ggW{iU=AV Ɇ@26+?hEB'׿:ގj=&.()8!7߲Wp G^sbdTrnkW\֓nVgrm/^YT[ TתJul7{z͡966BW_UNrO/ڱCo%RHMW?9#h.jkbcz'ozLOP[ O w(CxUaGd(BA~ 4:<ȓU+l>"8x20;Kuzi{ߓ-l`xfkHtI!cs٘R ?qЮloaxRU22}]83,j "6 \a3ύ痻3i~gJO[_0gZC};M ^]Dk/S>Gls5l5$s&J|3#|sghl2lK`>_gGWmq[B-{od>%$D}OlP-T nEWdJ~HĢt9CLȭd3ndgkf؎>`(f}c_I ~bgk_a|^yٽ81|;;V\ȍӦ^GAO(q몇;1Xhp;U<] А>X^7{ر[s- Q+ !k-DT'''񮅥%|+!O;,*r~?/"@2^FyM VZ$n?=>iBc6=FNa8O |W=zµRb &B2h|Qz* ӷ7p=ۢj4TLx >49x㱾ulE_j0c훺hZ~bzkf;o斣Qh'R ۟o7$0hiKy'z t[u(a&UT7*v FECu xQ#ӵE5BP=_R@ M\-@  ` @  ` @  d?ye@ @,--k<KZzhiB^6ME*Gs%DT,i*bk45\%4TLb„)p@ D3+Q14Q&kn9Z 4'Md}̱w쭒-A ꥹN=ϕlx-NW_sɈAoGZi(5G_cz6DM/-B!ӊbz|+*3nˀCDkUDh.=?'{B/ld߿tFώ>-@Tꈠ :/p;m/*pt+^vä09ݗUˡj3LȺ3BO%yUvڶ:(zBrR/yX5o}ȹ *߱mׯF mbV4 կf+KIQly^ -[shqU+l]!Y~բ6:ّNFN1x4g5"G :7{MO/&ͥ秧Vs 2"7V:+%)>8.u2cCQޝvml?.Cċ{˛ "Yu!omrH7xQ<`s蠁T*Q7)Y|!~>8}zt<%mVJg%mE$Wk:: d @> abO#MRG2֮ѳ=rkn} qMd\^ M}-f֋p@ åQyϠp؞2+}?g.;-ju_fſ%YV4r(F?O\!djhg~ehU i2DDEꣴ.ݚ^wYBCwe;&{gN7AK@4}iV ]L ~? ouѳѿE*8rVL3v!D{}~ɒ^oV2޼ om>.I3gG ??>/$@YՃwƼ]vei*2'f8s hO26o՜O{dΘfԗ)6td՜ɿw@vZ:}J70-l2Զ GM[URXm@#d?ixt˜9n/0wVqK^qJEs5c~Bt_67IsP;_dloyq?6}|w]y]*ڎ„LP鬠i %zTll񾤐m+ d\Z^*U{Yd xewqnfewa.WpjG:−k/XK*YVM,meLm\T8oW$xy?L~dqROood 3SYKX{O2e굺ZtDu;u4nrV/:-oзI..:X<הqA7+92ҳ࿠vu܃}!>KRS{M]"K3;xwk73rZb05{,G(dd5„sIRF2@!ܯGa$50jպ2+TeHTn!~3 V1^={׷Ncpo$=Ol|Fg靱;s!/k %qQHݧ\Ilyb?4I[x~vp 4T~-Vy%OrmziI~ 7>dytm¾Ľc\#&jUW,|=1ߏxEZw^9o mYg̥X!Lw;"ChzR~t&K6{'4qEѷ7\^l_U/G<,'߲F6Z ,K+%3ڎtJj\J2c9*' :ۈNood $ .coN]IGsKp9r7%,XOxiY-"~@XbepۥS_7%@X*F^R2 # pHe #*p*,ʎǍf0Z~u1|OffIribζT$]A 2G &=umsx֧Dhgg35fS# (Ŧ3]뾗K)ǻaI:d}>ܜ L-G;/[ӮʱE PV~,lB1[ז{+<A0BQS.qn/4@%"54Qf/.'Mn0ZB1]Ƕvxrj"Xm7E1opwb v|$Yo>9_` mws&/oDZ ҏE2@(vI )sm۽4Ud e3}.`at3Shp^P9HW [Vtڧ%IJ!*]VX} vv6Pm{l8'7RAjľ5 Z gFoWS2@ 8`F=F[?i-[AtN&$L2]쳁5`^y *FUqZW_+rזH@XX@1wMAχV xw$\е8ҰUe.w 'uLjԫ-pop57<\]͵S 3p O^)]NUܱJ/U9$_Kn7d^ۜA[(zO1FD沗>?I̪sL1GnŒ}aRe^8<\] ̋kf[ Udi_o,#OTQN켹\ʯMuEv`aԐan+ ʌ^yW+ bG%&f΀ c#pgOYA||=|Lt{kD% 8]IXJ9[ʔыCn2O&c3^]A`櫞F7S+Fn 5.8.Hm!aMӀB6^0)˃e9 vop6@yӽ\>Zn j-"WQ?&uq4w>pv=Z:w8HXo7fg;`K˄U Xok[6&?rH)qSwpsn;fͿV˓e_v&] #sKWe^og1=-}@ ^-ֹCi[Nimkcmkmafjf-6/跬[Cܺ툗zڦ°/{XZW4uh$q96vvv.݆gU*_=fl)^2T[}e@I! 9z/=]|zmN xBy?G,ꠇԕS2H߲{:N6vu3Gٓ(cCGgha7ͺקCDXָBCn(iE[߶jKV]7_G&&?=*7h2I&/Y\j?X0_'4ݮ#233Ғig`g+S~L y5ۄԤ7 5ao`#/>4ɚ'#MRONG>PTqBYkξ3dH\ZZr}pޡi /VXq.Ioo IoSċH@ȊVHErai]F.V +4ye*I "n8?T2w_K1{}xyay&5z!up+js !||ܰ#Ϥ*$8#yQT$>ʴeb %\J6>a&TZ:B ]t@n}ZP~ =R?tBX[OR >G mm@Ĵj?`dgC2@ zGuO K_^ph-UN斀 Ћ<@2fza&neDEIۦw)(5[S}i.ڪ84𙱬s_}.?"MeYFV^Sk{Σ@<9}[; Sfklocv@4ɐ7^1mv+[Xd4\|.'AM_H('5{8]fvv.=&LKKSnGw:t^Q]㻸غukDzϸmWeEN(* 3m *VdT5J×/!7dSϭzں]gX5ϭc@]);oˀRO(K?rF{4>% !TuՂ~^.84sj[+ťfI !p_h-ssruK$Ҷ%ʳBseꁗtlմNנStGY 5iW+.u24{/ҍ"ی_}|X`9Lo7;Wg8~bk7-QhI2ۿȯHSYi*Qܙ;:Ȕн'틑y*{虏wݸOCشa1ċSRBfz2wْ&^~e\;"T\֢}11-55'56qė#%Q^pܙh?q)/ѽu+4(&8`ƞ}-ό{]x`UeT }XlfdFZb:;M*-7 0#ow֝#oq U{YD(BM)\) AH6JGzrkJ.~%kt'5P[6*\ ǤD=\eײoq@1=8eס'<\Xֻ,Ar#O*v?dt)az;hk'z9fddO?8ӑVG4=.F O>e!L+-%3 ^~!}f@dԑbkC;:;:;= EV+0շj 5i4jEoOGEҵqϧ`Q_k*JSQ@ÐR~3D/L ߜ70S ڹ鐤K~waQn:$cLj 2`χ&Oh?FPen&T!YӺ^ING8k6w޿@NK1]65FF57&5e>#&9gb~[5ԁRCP,L1M8VP}'-yfċޝ2@)&=ma 1 UBӻ ߝ\ =MHw+[$qM[&bD z<]ԝU(d١ٸ =axbuGK絙weA߇Wtj5g>ؿ+:_ɡ1I3nӡXߢbxTlqIk!/&@sZxaw-\ޑܱ O1&/:Imc|JăvO;XL$]:]h|Kfu6Bjs3eEp3˔v9)]/,-%'(SSSbf%ZLٌNo|MXF6 ո%~MT};fSe do9d*X7{D% E5=]אkeY*,?u6i*3B1CQ%d'xHʡjBZ̆Z>ۭӐ߱k$m7I/OrAuƎ7sӫYWbwE';ItfqSJJeUO\,UBӻ Vd!;<wjnx? *Bϡ'P &@#PE=~k_RBw=q!VIeLCeg vX.}x2Z+5TꟊE"Ah~*2112B 2&^|O]Wz-$9B5m;zyuJeV/P~i IDATsЋO=<[:Rrj daq֥<$E{B?+@YʒoZ2TeJT@b1Œq^~A\́),aNNg L{]Ö=FLfz$ZRӾlfa}i}RBVt"2="[kV%M# wHFƩP*(h0+*dQW)gaBŜ٬LS/>ML;) Ņȑ6iM*$VDI"GHo&]/'( $ύ7ΖO {y2k$m[(UR}&SGCmIQ2(=VlbI^Y kS&;qݲQ6r>/"\,!ysfXI 8*& M] drChP6H25RBrQC'~b`%O>`[$oR whSC_ y2emŕQni,!xW, JlI34f3޿0VD!'θ7e}Oz5=˨_T1$î=T _F{8Z/!,d} ۺQsz3"v!jma];oǰE9/rez06)pԺz"&°ôZX˘tun#wbݸ1bK 5<-޿Sx홭*F2=6?O|3#je{Sx &I!2ea;9+Jʤ]dnq'".v׻2?f3³* zO`؍k+ WrdC u"!xYړ oGoxFowrO@HTPR ܛoB~@8#duP[2JF7[:doDyl]z/~==Q(mmmnEՠSL<݅Qwl0Kvl;@}[ɹR*s<9lOfb,"8x20;Kuzi{ߓ-l`xfkHtI!cs٘R ?qЮloaxRU22}]83,j "6 \a3ύ痻3i~gJO[_0gZC};M ^]Dk/S>Gls5l5$s&J|3#|sghl2lK`>_gGWmq[B-{od>%$D}Ol@W'֋ɔ إeGnm% >?qcNW';[6v$eCqlO6본/%\.#(ZGWt[cڶNlTL LNBB}VVVӼ%ahh %m#Pe' iU0t,zcq+y8lR+/77u24`7{&N?G _jΎr)vשJ=ǽ򿳯/fĜcTw-BC^byac{}co*6,}#~7>2WNuBD[2y6NNN] KKWCp#ΟfwXU6^ƱEe<;.(4H]W~z|(hӄ.lz۷Vq@6yz+ kzMd0X>*Tlo5ozvEi-|irc}gr` 7uѴ2Ŭgz= wny-GhO?nH` ӖNF@nTQfM5(n4T \!H*"@%F~7#kkymi:j4 2/z@Z@ @ @ T{*VƷo&yyy+@ bjj_P`me%޵vQy9 EX,@ qcbl,X-re0r\2>s@ lD"--V5#T:F@ HW@ @4B @4g0,۷ϟ>x# @Tԝ@ FBAARjkJJjll 8_1L2A ƀH :FcP@ ?x"VHHH~ZW#r^iΝ A+RAT$Rjo T^He@\T.dC:]#/@5 **"@RڕQQ>D*j Rj ZTJMڧV=)*[ω sWW-o *VlUKHJZm$[- Ah MIT82AԨ oD#+*$+7ĒIE _ &Maa. ^!np'S(Np8ꮫ^kqqt D$v؉Ngߚ_rzvy=tHvʦ27LTOՊ* eVT*s.oB@ jFa8Q)^]C|%MvuہGL/a8NqoLD._L} eÔL憉v(dh&Ҿ@ :@$]"kWR7=f̘e˗I$u)\ׯ_];cNj5Q憉F(ZeU+ Q"]QDC )4޽{Eo`0%7r-**ڸqcbbުr! q Dv(AR憉Z+RҟPfɌ @ u8;RRVرt:c=_#"7mڤ/.ّkvVֶ; MLL~ߴ٧MkԒj Um&F(3" ]@ EQ"t*)+)rGackyӦ ׯ^ܼvNّkȫP;cL/OOuB!\wϭl_0QkDT*Uʬ>!iNR8>m|Λ9իauiyyywa0hmF=s+KPW0QkFT j@ f!陙6Lf%%5R4Z?iqq*ʪV% ]]]kt27ԍeVJ憉* eV11:Z2C BpD<_$yy{c"QWCJxKRW\IVc"x ѨۋEP A4F憉Z#6RҟPf5 G]!ҔߺCL+!e%?~x%m۶4yr1y4g `bM~ϟ3Z_PAx<^;klTXj;aJVTO(:d $2FSˣ!x*)+'ˠ jLBQԒNYi8EGGϲ2<=ZZ@2̃"ϢE#CB*UIVHAJsKw[YI$jJ,Uv*0TZDeSRc@?IbR)6vd+ސjݐj&ÁU$+ HgM儕~ -+VlTW$U쭱!՘݊F*V}VHR[wHʼnʷpJT;5I"vю>kW@`nfF@ 2-°SV;Dd2u>HAEuA鸃L&{x)y&i"T1 [!dD6mڑI P3-+-U0ZIݑ+5\Rؘ(CT@ As@ *D&3<<;v**TSAXx!}P(,..0)k@Q@  NP(|ً |u ;z;z;Pɪ^|~JrBܢA *z;z;H#!S(t-ܢA *z;z;鱰+@ DS u@aBi D"UA );ʅ(0r4"APKVX!~f}˳AP@ Dn0@ވu0-n0. wTi'J;D|Ô~SԂGďiSk5,65D\WOh`|r8 ""H(jzjXRRbnaaX헿i"HK[<7'[__2iFk`?a ~𙚒.ݡaXI ͍痖j`|jk34Z\llwg~֭{RPr2xʊY 6w`}&syx0bL2C jH8y8ҩ'|>'pׂGďiSq[Fa(E uB|x^l:!pǿȕpя 1@멉Ӱ? d7)Uk`HaRhU]6A Aj+4G}*Y'S @4h=5cZnMnJk'𲣉1/Κ@HGxIĵ{.[ T}kϟXۈH 5ƻ'.\(b3ՋmHNYJZPy{j7g4m7S\7]Oh7qfD/?ݕ̾$̸4kɗenM`YijzV^uM|k1Z4zB"W ";.5bF4E+Qy[YGGK# $%ufh@NU\f^(l?zNΜ{pYOWc҅d>2?Ry:*g}8Wސ÷XSRD}g A6],`8x/5_nYH, ш NԵ~s7U_ϝһ_]K,X?gv:M=GxF/EsGDAȈ\E&]=mz$^N{nPb E։ @0LTү6]-ng]5"F4E5\E쯱B)Z}-ekO)JxȰ-+/I)t]/ܹzaRl}-rvڥ1Wn9"0-N8w̜:|s l]~h@3Rϲ*rDzn?OXQDNjC@[:&}Ut]ǟ|JQ-tT$;Dʯv穝++u㑱 5 T9tp*s9ƹ'6GmvL,?=ngBVqc!t,L7<0*Ҩ T8&zm0^$@f73/Z8x6f^mUM.n޻ߎ_U{b']uzLX:ϖ30l郻os(n#W}`"Q!(bC3*"!;6Ih>fPZ=?qsc:ʿ^jfʕd;r鞣W.Ƈ<ۨ&z0QƪPu6d%e{71lgʒ)@L}-@< z{#' xVJ8|ûo3ʵ}.קxyÇ|VSM=nX?Vn!SG`%ɠ-x֠xyQQs3>nN Mv'fm7okp ´Dt%gh>{{ wtJ#% ڭX?[LDQ:.wwqG 縛xfyf瞙X11I30۞U- %7zpzkx[lE+L{cX63IANciӓEN1"i$9FR]֠1*6*}䩪'-v5xW@{fGZD?{is vZeEiw,9!rnFh\ՆJji NL5bX?C*Ui9l8\:Lt}CZl!k]4*n J{x3jbkmFߌT@ܺ^JAJUuTb'.pJ?1[T .u>#RBJJO|[VW\5ibwqzk@E0=P^LEΜ^J E_o[vZйGu9h 8U]qGOnwc4ff:kN\|nHs\DOس_bi8C!> 60}ljY,&QI:=v|}@+;z|}`=D"*(UM (3[w3S>Yz"+Ao[?II;K c$ =s,'("|d/]8!40`X4\燮É:aj>FC 3]FkmCЌ[$M=DӁ 5!!HB5i¥*fUyw=8ʵrՄ+QCd-J ۻBQPlJJ]Qe _)>Z?Ax ALUa/ת)ji5n Q%aW]vZv3{vdg)e4tǶ!T7wE|㔕.MrljDd{l=sJRB[$Gx?؈*0RRe!Q""ljYUC* ĘVgBѵjYE[ͻٴL&S5#~ ~]p/%חpVeJC0F<ЕSUxQf{tXxH$DqdaX9.]z%-}83WHT)؆,R@Pi҄biLa"*v!;dT;+ f[wᅾy&*N5ƲDH/v~NF+ 0rnT1PnFӍ<{6S$S*:t +_O-֫fI Ub;V nkoɂn\ '׈ ӴӔKQ,BY ~#Z`[ .gRf!aϔ,F4Rլ#(Z7^?2نSDMC1痏ǧS?ybD>B{~u"7W mԒc%~L /p4YaXXS3Y_.Xˬe_ؿW$"mxwy- ~OTJnZ!mlF IDATV:A+1Zv*J&lUfW2Wq @0`lfW㰂thcƄi:n}7PTCak.ZvG?htT&$T*¦.eˈ%W-ۘ)IZZJs 4,$Hγ4k,—?._uV֊hJWiJ;uܜ®QfDQǏE7jhgUյ76mzl$w@a Ҡ($ ǔEJ|Dy? '_"l , *$| cӼL]ԓ }UBzsD>CU$P5h4MTT0،ʻ|>(?±ѤI՛m%b4>aU05Xfȱ攦dm=Fڱ+gdѭzLp[G)hF6S4ذ'zb{ύC<ح&%HK#ȼLǯ#ϟ^ blsM,?6OɑL:jMoiO&Hbigd|k cBHoMOyi]f얚ƮR B-qlL⯪]jBH%JEeP,.@!Ͳo!Ր >W{pj+(~/|CtSNzr40 (]S(~5Lٻȵ8$l’vU0i$}m/9'yhTE{5ŒL\C!Cu%)}_UDJf) % hll6KIjRNrN$PA&mM%a {1j< L>U$"maxW̶#h@+UkZ-Dlii%b"dT p8m e V؉M!BQf6`;oAK\?.jWX65 O;۬v] xqb JFג~>Wsb vN !E{H۶ă8fUa5k]^jSX\&*?R+fFT^ KKA}''G`q9~yi}}͚ x$G7:UG $2?r:ӾzK."N}ym]'{Ӥ(+4m`>Q(ȃ;w9<VB4@"aUb ՒDNꨂ]IĒ?ιx,N[##3Sd Q2mn[\=trm|cgɄa.˶ȶKZŢQf(8ݙBгnyXsݓRMzn>_f1g^ؑZ йfM;L_`H@6;=<{9_7CzF G,IWAM >{IvpAsPu:j)[0oz]T4[Xϟ(C Fg[6ԊDq@㚷5kJejɹ1!5Ɩ` ]X4%G0 EuU ƉatړdC5 U 4犯&00 }M<Ñfl(5BE"Fh7m64e+Tn{䟪R_81PE;oIƞQ4|&nɮy@`5jR3_9?7;л9FfU(%wCSX/,Y0^?κHJՅ $P*i:aӂ+N=[DhăF%E፮e _Y}fEs_eYӢnOx-aM칚0z6$TŢ̌ %!!Q@f$$$$$$e3WEy}v:$$$ui B+V- I S!;̜:ujjjsݻ[kU#7*:9&m;ɝ[Oˡ7^Wc IỠANjP#uV gtɸ5n^]8/N?~ŷ]ǬOa2UC$sS|ҥ e6od2Z.5A_Ǵɔ^9m z ή*ϟ# Iy=QfX$o.qۥ '[߿F䵦 g$$$8 (z $T"AGyPxI&S(ނ_w Pa: )cyiOG? 0FoZ&$OW!)WD9bv}*QWɉ8-o`- N#fLf˂J7zVtʳ|Mq+ eɸ%Όgs8tpAͱ}ؾh蔌|J2q4{6,2#]ǑpZ\\SuVG1!ݼ$ g QFY >iZrbKwczgǧk<8r!< DB&⤐^'/k9O޽VVV+V X|ennRJ@մ֤IYgyJXT&తkgoӥVmz}IpعS<!J<:mQwqcz}zO)vz0r^~#U"'.M&KT8MDYrL&LS߷s /w.} B3j߫ Ӥ:(P7/Ic9Ecs)w?H`-Rˢq’~|'\-8' yٕ4+NKB˩ .ja؉'`:d`٘B(9d)~1_쳌*7Z9ioOS(4 AC_⤐#] iΩY!߽ 0s7H]Db_VVtA,Wc{u:!CC^}ݦ+ 2wo؀72Ҟ >Аa΁sqϓD\W='m/2yTSF̄wRnϸ>-n9j:S' eůD4x=*O)6܄KAShq~84( WZ@REYҐ2"tHJAAukBpرЫWO IP(qquCQ`=7_H?^p1mV +jHs&KzseR BE`C ŵ lI3( 0"ϴ|]ͫR ɏ/ Kyxtit0@&uIwoDձvI?K \@Iabl t=wH$"@zj9kQ@ Мl@ /?D%p}5z;0,\=r֍lBqD]*)EB7C=!LQd<]b 1e f^:r5Ʒ9r:^.J>6wPO~@Z!sm!->-P Т.۫Ua/хrcǎlټ;7oH'L( Q:ϣ&|t*Hy{FfTwqRHS?PzXNZY U둫=M.ZA2_o٪VBa..iM8իi+%TfzzUl cIv-DHy~m\{F=K pYVTƥ?DXj^ X@ qlg̐=s%fտFӷS4^4IgSŰn۵W_}r!?A`cQLXQ+Ѽ$ hr=yoK 46p$tvN&^zZSV㡽3#Fn eZyfmckF\Uhg-@AeB,}pĸi3 sGL\wApγe N}5wi͓&+0l%=ڰqcﴣGt Xpa'Y cXc⺌DVd>?{J@kD-˪}Tamfr^?Knd Wg}EB|`aa}2 2%Fi WkC գt cٔ l9_^;vzO\\X~3|JOGDעAeaZ i{}-$ B<[b}Ngُ60moA:L&:o[ItlIXB~[~w&?T|B兖TyI<ː|ϐnӦ~&㞴q}5k3yCE4)17x{F}uh'isY6c{4m;@!Kk4áAӻ6քa S+?E<ކ=|dnnޥK+L[BA\rC~pı| ӟa8)@ =đT1C!D@ VEȆQ>]pBnS7 0t;vax[/bf}7ʉ|z;.'.ԘE.jMhxz{E{W3iޞ@qwץiڶ1b1;Ya=n8kM^QT],c:6/0CJS>Bq RyI<K@ 0)O3)ݴS_ݼ|U[)aLU@B0W @"' KiJ1\Jq7dZE.?Ud 1Lħ:|{KVm%rw>8_ H4Z^S$M ͛6eee̞3W"_ e1[NsqGkyh/CUtCie,x륥3p`8V[$B^}NK\. RIHHHn5q~3eK`266T*`b9ǛZLd>Z < -}T0h9>{!!0L>-<7>@ږ0@"U.ӷ =$I~r=+rziS ͉7*gkʅ,H$LJ3 1L]]=K++&Z$$$$ Aa#ZJ8jya>ڧu_D v1+ylyګEA^a!O38J@m6]R*B\Soݗ~t7->_۷lݶ&CB@ Hǯ65Յ%2ׯ</EE|~QQQ^n ɕRϕqS)ϕBܾ}K,鹻7gi(a"BkTT~~)׵LBBBBBRupLIHH@PWa {AGĐ6ӰHHHdD"a5|s8jȥ!A6Ο@DDDs @ݟ3WET PgFW!s= 4c8Ⱦm3|NQRWGO9vR~q}=J4I5RԠ+*E itJ-@BBs IDATRL1T*wAs9FЖ$~+mSLA*9 I]Pؤv !!"e?K({ JS,`MEEdz| IÀTrwkG:i v Pi*\:;_L3eqFF,˚u (nk/6?Uʥ˩`ھc`ABBRJ|JSij>`j 5K ?E]}2閼g>?f{S QC^Luգ$ C])[7(m7b˳S-9'QR.JN$AXzM߸r\a*\;ݻ۩9%!ihJ;y%mVlSuHAs qMhYg=(C'5@9omյ RV-&L8}Z*ݡEN[mu* @3尷՗aV?!o/CEs% Z 8:D cKn,=&ٖ>+@7/"KTb64H%'эZ {`_H5vdaq82ss[ +[)Sn%sJIl`a5pE>%W[Ĝ-wy"n6ܲꯙ:XYZٻ' *\S}8y>>vF:* 'A9IDOKz;;ԃr%3 Rj4`fʃ=`b&@#ne7"\>dz?[K\®FH%' S^[`h*,mIڕG(/|Iła[ Hɣ ݺϔ'MeE\Rrr[XZX >?e[_Sߎh_ &/kφ醾W\= h&/CT9RE>%f:h6, Mո'zkY9r`XɀӉ|dϘTBZ43kJeᇛ,N(Eq[}1)cKŅ>p\b=/Qiԍ@aBN-uu6I+ 8 E{ۺ].4ף嬏92^Uŋ\y*qRZ9 d@'P>$b{y5w.$EF٦l0oP;1!66͝5 0D_1LJ?RJ|LOJNtzxYWReEIabEtW4pd @Ri;kmASlĒ&@ZZ_1Td|YggkcmkcLj/H> 8cSm +zV\ 9PD+t3\i +.xmڳnE'Dޘq|a5hqk~+)'W܅@om޷WҩkÏ)k*x[kXb×G3P >W< Mˮ#f =M ztu",%͎);aWZ!.>!.!9QOM.Yٻ/}2gm+R>W,e\N 0S`&Vθ^w4( z۲(4߉+|uՆnڥC]n~BRiK Z8va" k3Ze/*V͊3KT]1l\~~D@֝Foy@~AЭFꚾbګ_soNW$jKF𚳟EIws/[ o~snV =E~XgtQq}K_jd= =G0InźBt|?q -0RtF9޳fg:Y6" o_+E>eBYn<) *l0W\WW)DYֹpk[igq}D.zrnmkcasLꣁnRǻ(PZJXc3zz96rX'Fe#-0!8`IBhx$Kkfa62*ŋU$ fb|1k Nw>,z&)RZr[Z[ٵ{i8}T>!!{5o=u'8aCݭm>ء^Qs/{%7+ݷo@;k׮[sz2gQ iɩ-m=z/8@58;} 6𳷰qxHsι H~I @\KcS$iXJNR+Sn?ΕL%/Yݛ|j`j{Mr^xh?1+nTetH΋-C<,t]xxFʼn2P(LH$ BRڽ1Zpš{G r-X߼ys&(a("}/D1NU!Y:zȑCk'U0׋\T#Ҏb&5яU.2O\HӐp8ϟRSJBB0P(YYW\ E*QT6f-c>ufZy8$;t$$$UJ3WrJB`2LFDbR2C dP H$ Ex;@r}mB6_?"Q$ I5.nK#n;+S] ABRet:̄) x7䴵.'JڭcP?䊪#y~5z7uuNc6Ϸ3Qٳ=^9Fg>ΣӨUl{ʕYVբ k(S;g elGRO|\`u-KG/ɉqCpRo8&!zu6Lr=Od@s3"4,:))㥕Ǹ'xDq[܆)P LD ;Z{[@sH>M2^% z_Xׂ5T:ntDߩu.& trrxǤ6/F qpAy_Oʺ{י'Mzq#n> N=7̭y(qh^DȔm-l]\L ubnߛkJ# 9wkũ|]>ҦY +|C6JOcKn,=&0@02tRgw+K+{Wa;Ⅎ~wŕ/\B٪Hl`a5pE>%!Y^Z|8u.Ay)o.oTILt}=25CfK*^~^_񏏣/r‹----<Ω~2~ޝ/ymD)۳j I=mm5.6|oK*ˁԞ"b^eC +8 Yg ^4XD\S26^YDT:AdՈ]sOO.;U,Ѣ匤ߘ7vtB܋Z *+k=MΕX]$$@:vvHK;!x׌ڒ:焘^:o2Ս(n9W>N~۹3oe J¥h9GRt^QL‡}@n wƎ>S4ggMtiY =~K^S)0Nt.xqA_~;kq?G k6 :/qd]K,/oM==8ad4zrւ!Nu.h_ &/kφ醾W\=PZQ:4 9צw*4؊کB0?cbSyk#;V-Pn*k;7){ڰ(4VJ~(s%pۖN׹"T$;l|L|wV}drGWKns 0DI5NVl9xI=꫾V2ԪndKVPu[ɀ.;)*rl+J74sN#W7'WmMЈAj Y8! o ?Nsq|L~{s&P=[[9w M,KMmYreƑGReK3Ex,2͸O,2zX HIdIaB>M\3H  (MCLG0P^q DeSPZm)?:eŷšvz"7l`)+L)R446}rqN7Wǖ={+oAK  -Gbcqe5Jm\ ]syWywe)IڵOkϺycƹx^i7ױl@ocqDxwP(+Y U ԭn G-4hHtk95cg d+w0Q8y5ngα}~6ÑY>I5k+-O'F/ҲFǑiq*..>!.>!.!9QOup%i<׺%\,[X3(HO#)iA'fF1l4+9 Vؐ+8 )6x0Rh E׉tH7<{O_L -S{^TM+]*pVLDy(f +kuQVU _2-B3WwYx҂>vl ͠ĕ>$ոĐ>{3̖b}v*Yy i} !v4С"9"DjfԶ~†PqrDa8js׃O66En[$0'DmU`_xXPt[eƆJ@iO' 02t.kBVoopޭt adO[֞#$7tmӯ„ۻKoߦYHs\XgtQq}K_jdtl*D\QKT+(8t1(S'ig7~ad*|+'(^|3A^Z,J2G5MU}+ѫ":\A"_0 (k%RPW0p4&:eq4b`6SO~KN+U)ʋBצaXPD#um}=ۚjP47ӣCf#5WI/ PMz,{G]5U~'2N󶳶+##Y\!]o%sIr nmty_5wYg3&P ;Nog࿦C52\W+3^\}bHjiOё'^%q^ 2ICiهǴilu4P`?{ Kׁ4[9TFWqW8E $]M3Vވf<ŪƑ D" 'qiCn֢Y_1ڮOR y>6d^0,{-?k9H~~t@.0@8ផ{LE.ӆEg>úm]tup"S48x| %Ys%Z{UAܜ<'{0I.a5<$|xɧ78lE7T]ߙ̔S1ˌBx(.SDoܲ]\5Ho}'orl1@!5\-ʩ=+$ͲâobԵ +n8#jlz\^1.k~%+N ?aq׏DNo]1N{6^O+cmGY/B`w/C'ݳlW]L'zDToWRQk* B "P(MǠ@ʭ QSL7~$yQRxD/CmE/с~?x%]L,duIVs )*N>1w{g=CFȼ U(yh$I70e[a޼ ubvtrJRo~+]K^PZ:ϕ^޿E5rtVVnvzjn6hYj{]mnSy6yR?u NP3,\[)ʋj!@'S6hj$='A}Xڵ_==nx#Iw3kKKǮ>y85D=p$ NS%K#D?ߕt3״W I}}u- IC/1:$Ŗ!vfv^.~'lg6yBO-އFoakAsQ}#<;R={7&%#.yF@$ H`As#m|f3wۣkLYyѓ(6SP6f劫}MqI]lԩBtuϽksӲF&}=l3ms[gGgJxq7]'Yon|`ud w{KN[<ŜB"xi@,n3wtYAJ+gYI =%rXCMwxǾޏ?8Y}6:hmsҹf-=8Ny-wk6u^ql{?0!xjP蓘Ls=S}2+{zsr3dm:_?? -,'pg[=Rqk61e85~T[=گO0kuuЎ1rJTuԝdդ\u$W~Md"QӷG7o3vݎYmu aͻ+DG-Y3. uמ~"ְi;a햩tB1~̅Ջ_xOձ=XS ->;N_7cuGiH09:{ʺ-#Vp*֜Jc=׊1N A&9quM 2)*Cz^?6Yca9 ˁig"qnprnͺTAAzq2ߜg%dz?[{>]/q[ޮ^rwlc{Q;0.)Xč ?1*A l~c'i&1mQ=Lbm"d ,'CC,ĉW܊gQbO$jy/9 gDhXtRRK+; aDQ?\g<ÚȺ|3iz!+ (Aq-bCl(Xw\;Xe-k⮊ *(!&?0 }|0s˙ɜ39wٮyOU;}Br~duw6g ֫_=C:1gmOR3Rc;~w{'-+_'ZH/z_ f+@ȫc8,ٜ=L Z/_86(a0dҨ3\Tf: CK ūl4`d 3,U4FNJEm_o3RQ?)L%XU Ƚh@忋G Fex9wMi ~:C'@2W2v^8q mXoC Vj>J˭IkD 3,U@3 @ЛlGd?ib=)- %Caq~A^qVGߤi.8S4Urtaӿ^P2UzR7N/uaitkG,aUrZtՑՒ'YT7DXxg@{_~>JD$  8YҘ;ujC +ˌWpj@C*jk<p@c1`BLNAJ\3=Ss/+Jetqx~LQIׯmDpf;kɬXԟ A}ÞZ_4L P Q5Q^[̟jYAS ~pdSe,4 *  >ZeQUuv*Ve/~ kVsjq:U_Jd32\DƊ*f'ߛg8kSqIƆL!av)KUCM!;Ͼ/.A1YM֗7&X *]eg4>;FuDvZZ?̷T-"HV(5$yܒס)?@#[!ofCKOp~%j*Wۚ1NgTx#LJPJ^JvFբnh ЌEW\ y;/)qj#͔ا|*!-3#9&2I \ճ'/(?j?%U]Ǖ1J*9U5>cL̸Y gS.HLStvpr+~>'jgN]`)#HfE4{uf*9A&5:#$egEo4#1򞸾p +<{/Eh<}5Ǯ?e{αWǑʢҔR@Pp?`wmȳR1W(tМ咧ܦ.*R!͎hro+r}h'4Ǹ4{+>ܫ|ZғܚNa'^54jTY%O@^{`#0 xbj8A W~gkŕ ^g&{ٵB^rJ ɭ)OV"%9Rt܏Fy1)-xDehn:ҧF;ItGu"'WxIe DW h5Q|h=SJk={0VÉdWS H+ㅦ+* >Z>PBTZoW'{aNk>ʂb u`T.Zz<88ς zxg)_" LVhpD4/:JJ@/MBD*GQนQ'~iJ4!ny}wصB[_ @wWb$=2ZQ`DiǑH%Q>m4o9c\E7̴۹:^C <}F$KIғFс]C Rt@ O@^`ׂTSƓYU#`[]ڀF5YOo9{+iDZ5D9>dCFQFP Z9BF5 d w❓qr^VT:n0kګ,6Шt6mw9ċv `K\Zv#9JC4qh")FM<L"8:L#h4~׊Co=yz+Կ-4 ([-v[fYtF;܄JcZO' 4~jF,†ϴa0͆/H\Y&v~1%K͕!N_7fXR9-W V}ͭ Pp&w[#RsPbgWtGNL/(H*|ާt QKZ=ͭq  (K_|mb;e6D|!q"mK(}N\< :iÀ$S]o%󙻯tg f[rŨZ Hj\-}]oi@=+oTm'^j7+hWjT[6Hє@0 ~#IBM;sp-WuW2diXR#o'}[ P\i TWW<.-@>`]Kxk>}E(Q1GНVg>>)>.Wab2.8G@iy QOxJ6l8E-&Qy kI-ߵvB.SDB.rmW 9ȱX⤅m}yɾ~矜j!q^o'f*eSr@}y꧃™0(-Wy=xCfgIB 8Lzx@+ Fi2N膈U;kHf -DmĮ''G`B1ylz896ot:TEFti/Z4cTo.y@s .%ߧBsB=RI 8Tf4 [>>[k,_N737)fzDJ6#Vk]aE3ԣ֖w6 LU1EwTE;=0h4ol_Xa&>$OVlI3}Yuej@P"'sj8F-E쉄s.. x#LfONXЫZnS`z%َeeeg3H>Gڸtᙏ[c_yO B A0 A$0n ˫pcƌ 5o_Z۪ǮDQ;ɗж@?D- eЩ;2o"v[2>TQPPP(11L&IK Z@ 72g!HW5khA @ kB -hijkCo\CAtHʒn8aD/ߠ7zC6k۩ە@z4_en9vxqmꎡz_m-=.nB`x*rmw>טS-Tx8W!jg[]ݢg-q3WY*,&e穙׷9 kwH-SUCd<ZC=V%<!+IٙYٙo[t&K[AO/Pt&¤9*R[-f}--7B>8+Erj䝂cHn^XB?o<9ѕɭ!݊z?:R k6;5:t%U<\;9XQ&+Z򔋼7o]w53E%Ңw=ݺ~&?b?4[|ZX*[kB8JHH tRE{*+IYϯPr&u˲]!h2Y $SWbҳ2X~r(NIݻ.ƨI-quqS*j: k@@ V| ,?ӌŒ- _̨#R!ްq&imjBWܺ( L/EN!؉?{lM1&!x-%+\D0$a{\11as&f;l9? [nIS=ÆaȤQig엩)FєBXd*X NhEOGMoǍ_<C" Q+U/z-A"7G9k StTD|7;MQ4`*N޿ZڃJsՌF-=4{ cx $62@]߁ 廠oĩي~o# X;T@X|!8ȝUsm (8uYFdJ4L D"AtMqMCi!boc]D&GZn**9įT\~&wOU%P0uxvMU~ap$DS"ʯɯ̨i2-@W([行=ֺnU mU-\IÈ?sdƆ6I-t( ᲏7{^%r L9(522|reW&ݻLH4u*DY1֋9$S#[!PV9bYl;+!\cO/ LR$&'kj5Is$aj"C!T<0ľǓ3H3hJ#3E)j$/7Q[5BPp?`wmȳ6JIR%,TίKB]͇9ǖK:ݓ[G˯?7uo&CQEt+ÔL?kX-LT9NhԛҮ:ڻL0s7 ɮ W MQ[!<>l½{{8  .u+ Wf*Ϸ(8F+ Rm=kbyEUBF IDATcIdIj; bARf"V]R q%\ ◦P!9[?<7>,lpު0*GQนQ'~Ax?p]+Ņx!~MxE/>Kap$eBNrWhsjq:W~)J|sq7sM4PTې0d2.V(kyVT9B6`A }/9 w!;KZHe7Rd?Dn -ҟbԄ=&`!igy}4AiEF}rRqď&TǦLj.IwʩSsjM8#r9,r' ^2\XMR^NsSʀF5|e/]CQ kh"lLl!۬8>iOdLZɀswѯaeˤÀ7gn'4jjCDIT6Hш󹆮Е|TႥ؋vXv}ҩ ^d˙,})2diXRow6V>"vbp](5 *]7GyXҟ\%.dZ-;HNGrj9|Hp8\8];T 2|=7Srn~ԳZ!qr_x?t&S7KZ|pryz|#CrKjXE>F|U!Ymtq>W@z?0kwq HwKf%+@ j'+@Zڿ>2v?:h=-3iNg膡[JWOu#ݨ-\!GSXTxu@ۀJ&^Z&ՀJ3az:4Cx*ru~J7|7{ z%JJd&0Ҿ6۔m @ W22_= }MٙYٙo[t&:uSZD_1Ebߜ>2\@|;Vy ejXsKxz]|ތ$z›ff'^,x[!hۃ|΃@zѨG(9EC9^ߢ Jj+J\>Ԕ0:2 "Vrz".Z+;tḁ *c˙q;~M43;…!nq~=Xi0DR&JbǤ2Lmm@SVZdIc7LV;ņIM8xkU!{YЌP+WըN-shHZ]v-Wl|?J+Om{gډuy˯fȿ ;>ƗBiLgVNlJ?_o|v8Mm-v4:A_`vz=~2\o!z#̑u89/xXA׆T¢'f}>xaFߡ.褎V%?댸Ѥ U+Emh&uv k6;5:t%/|[wsRRvM(s-8\2׸OYqXGҒ(a!qf.ṿ;mwI H}xJi !F_5N(0dZn|WiFb^Aㅏ/f?N5q?tһoZ+g uWWLLX#9qOa/0{–|9/>9*,5IoTݾE5X|`*N޿j64BCXd*X Nhփ[SXgw"Ql ʥ_'qMjMy[HUb#~c4f׵k:(QDuK,iNe:`a3u+CBE 5Z@7늟Ð?zpQ~,CA0k7!z: fgfe8뉀CE:lVzyV|*.IZ?ؐ0d2.VjKo韢prVWۚ1NgT_ɮZJ'j+x ?ƿ}_LmnHHʜ:̨@Oc^))ZDaP:nֺZ u/魠il4Jv9FR7Aʭɯ̨鲆2)Sti7T]xS!޲AƷǻ͑# ihɉ:Pr37f͝j7 #]5ky@ QBZmP_CHsm~,9AyT_+{=OO|(/hpb4,4ZMd? J 軬9v/Cs-ߗZVLUZ)P,wM Wm#)PI7}U>o)!a| 0A;R~snl'+I?]a׊н-ݑV4Z4Řlsˡhr 0ôIc40D_;g HQBj@PȜYgsU2C v/K~rTn.{iq_]{X2Haˇs=&ݳML'L~T^+#QT)8nfɻ_!~4/8V{z➟sB>`]Kxk>}Eh|{nj˜/fQ&=^}+Hdl " k_=Q{KN0DmĮ''G`B1ylz89t:5d ê;"ך+ɍ?w ƴN=hVI'cCSikLT)V54b6| i6|qD Z԰Sv7fXO'܈,E/i!Öݲ}uHMW(CR'~JԤ5jTjuXҤ u q*'G7Ftxc|mW[YCFCǃ:o~tXJD2uxn C]Xq/ٱ.K 1{1b&G8U,!(S5) <x㕈 iћ(˵\qc&x+?7JϽ gdq S>8" 3Ы.v yL2Dh¶=) dyO ]!%ʏE+w#?$rpG&߮dPr2bTn0ZuK. s~Vjv͊k4:wtHQ` xx0 u".Jy g\;0j\fC*]Ć[SX.bRGp8_r|>?=PVVp63~{\bu1!*qZMly(;VA)"``D MNry.w̘Bar W [Wt׏ic#VeHs*sׁİ#, ^IU@Tzo5r/Rn:h9!ұf dՏIeNt#8c~/|Ye꬘7º䠳=,pDAa\.6L:nb}iкʭ)PovH[/A԰"`]eN)mMǭ^79Y*`ܗT rdPpf;kZEZH_SQ_/%YYo.z"f#F6~yȅ DڸlO"" k"̨H&j+O%I2Lۥ/U^)ج{ a݊~ް?EhDίr53b-'Ψ, ]QPMSv@:bHf[܂i)8ycV^y۫\K|ӻ0b5ϱ͑# P +'uOHK9Y[yws³ȒIbCRDA댸roVõtVLJPۅ}v)([nn y|*!-3#9&2IG f˛Ҟ_㲏7{^%r R9ZŪ FHziGKt>qPZHo:z,h|_Yb_ərPUC0m.Z 82"*K-8I9E *0lıXlV:|{nH=Q2sJVlC%gJߗҔ}X͡A ]sW>ˁd|0-t NYh4h1 k9,f_yɸXU Hﰰ8$- SMHXv[MaR]TՌ#U ϟr8ezjh>5[퐶1S2ycͶ2!rKyU'%%\td=8V+~VNU J ҟ\%^EW Ґ}_[fW T=[gnsQu[k/ * [>p)|5y=ΨiC0GM=@V"^GRp̨wpCh^p|v5ֆ@zWCYU{ػ.`u)O!U48aPf-T^k24Z IDATDPgʌ >NQ2#q+J*IaDU2B_%긅\[jm6?,J+f˛`5yopdCFQ{As/+*N7w?AR hTWvOe-WO&jb?C!gf77gjѩy3',<@ÂwwE_;cpGХUm~p:+3q+\Y&v~1%niӿo̰vs\tL>W 2wxTW&&OR0e<S JQܵeqn>#wf LRx*xkj5In+v9~vAG!xO@*&U/v1)7Qysn"w_K]sY#~}}nFL2^f=BD|k3w7)rme?ȷcq+ۉu_WƨKAu[}Orе\AN_Blq<-o&-l-VW{:84i]-)|{nj˜/f[l"1)mN=L)QmNlr( 1W\GR&+4[Snm{@|}?9B zO`Tlx&O14e抠M)SlA7qX?tG2bGĤU7Ozϳ32,]6n1ۀܨsPiLd#hB˭)PovH?&a]`ͤ\c]~GUd1bV4[?O=zM;=0h4ol_Xa/؛3=}NZwI:DUDk455^%!S~zi.bR ԙQ`8NOOg;::q8G#i[BYg>glE?)d H"X`0Rz_6L5!a ڎ~+n]dMN5XfXU &Ki !aȴp=8/,?ӌŒ- _̨AuAMN (ɘ82M[W@ ]LW\EթgX3ik/6e 4 .+s!f]s2o%.#;tḁ *c˙ 7_tL;S*v_ȗ.6L:nb}?Ά?ڮ+ h1@$ kܮw#! XITSЉϯ̨@T-TJ^))ZDaqJ'G./%YlVzy3+>$nld2VnrT j2QbXE=%Qeʯ̬!U*kٛ#)Nii'F A-%(svozyE}=!N5VyU!gJfE4{uJM~~h>HeJڵ,Dyքq>%i''.>Nwܵci-~\B~bH>x ܎X2",K)ؘD&5>4PV9bYl;+!dڜw^; p=l;J4`R6.n@z%]sU4Z4ŘlsI:ބĆ-20HbA D{}b7jjiT+oB H+UKFI3Җcj#U8̈Ap:'__QQ1S cq-q =-lX|)|#Uuy.񚃼7bFyQI?:Pi~#Nκ$)Nͩ=6قn*~ȵ(]L"8:LskE?-9ċv `KP__ܪIʈ'=JS.c 7ވmۮ}C$)Dt> 堂R),R*)yྒྷÖxSgNU#v9~vAG!xOh5qd:ETZV uczs -7.v]!<;#pڀsauI)ѳ7b/ %txMGC~ W?]-[F0 x.sG-}]Il(\?M~+Q Q2ݨ#i%,s,$× %; A֤ŪbOǒ&ěREw\I)?TH\XA6ު!"^GRp̨wpQGm}Ǯw5B|^}+Hd8ɵc!ЗNH~~[H|5&=6O8'r@{Λ ll[ 0XQ[ҳk(7yxH*skf(t:yUx^u)khDf!*FvЬn.>BYq>7k`m߬æZɀ< W|*|Fgj4uW"z?N68$}R '7jj@P7{$Z*EV(a5M JϝJ,a]ܲ*t_!@zR Nn! H]wÀ>+ŏX!KâJ}k(.M\Wg%ܚ *]ȗס^t8r= ȧrSy u҃khN΃g| ~rtc,nt{@ +|ؐy+| x~ElVj_T!]i-]5ϵC~-oMO$ಏjד!'U &o:hPt:zWWӣ+jetWL995oذv *øߘo5^@B ܹ{x6܆͛ݺ#\SJX/.3"MXPpr$, +ƒْKƒ/XD,yi&_:rm@m/;g0aY™L..[45=S>!}L{ҷKMܬu7A6{ٻ&>M$R)b zb9=^PYNz}z q*H H( :Ãov7dfv' 5Z2싹%}A]6߱.̩T ^+N&THKkZӨTz+:s=^z.`Do9[>? U)#Roǰ}fvTbv֫K3Jߝ\=}!xЖDvm `еgfiH+Ss\'̿w Xg+p+ |搠ORsٰ߽+"|Wfk̈́)Y noM AH.9JGo'#W5J ZPq&hj򊔍t s9JQ9*f['V袋XUCuS Jsx#ALg_IKJ81y!rcY[KC^Oaf<;C\OH(I| >9io:`&[EΗ&U4F.7`MaYyyhzRcA~%IY*F֍*MW&gjrT+}VA&FrQ}Lݛ$Dh9af0yo'FA+*EvTLQ=`b@^. A-ipw\U-O!x=ץp~ltǟI4J KwR}2|JRtdά ;nL%4*JZf|*M*#kU!̬"G1G tmG?;_24]+UDWy=OK;58w]leg=G*aT4 ,Q '>W9\ܟܵ#JV)@+N~(DeIҪ$2')ZֻzR1 ]g[ib cA~oς>[YYꊾUxU^FeAԵVp9ՈM(FE&ሔ^ޝ>rI}[bNn5F8:1^a}$k3*a  ?ψˁjA@ ^9Tk;<ϥܚN!h⁀-m)KbvCvT33^'~#V#jauG@7N37!J:W ;9Ӂfp_r6+8A!t k&y˞[ t~yT876iܿAy~UVR] FjĒLRv[䪁2j$lfZemz=R}'/rkFWɌ3ueVe4Ñ? ƞkyAeI 7.%F*Tb) @MiҸO3ӞӴ"{RQ@NFw><"yA?%/ f.Xcɥy{OI߯U2,u_~}T :k+/+|lTĊ;5Nm Ӱ.mJN칝͓Jc÷PaxJ6\ɛ6ive|<~/#w~/@%{0/$$ƒQ_.H(Y- `BwRX=^²Ƕ[ϯ%l1le("*r۵S>6'𣓊w?Dcd vanE55I;vvAկ6}X\:ɖF51'r5mM-\\yvV=Kazgؙ҇n{?q/8jc:M}zEXNgBs"X=]$NmuMU0zUBn%mr#8;Dscd8!sZS)k.Sej9:4,0?uJ2 64R P~㣛pCn  s|y+|Kkx6dNAAPmmo&3 ;^;R' A~tuk¤LoA5'r0/ 3|}Aߌ@ww J;$e=zh̥Dx~l!˷ A:6 APYsma)8>PW>]96>I*bC6Ҭt3_P.f=;s5Ք<3]zY] sψ{}|6Ĕjbjҳ)7Zo'k3Ø3j:mAZݾϵ[NݮeG,_mumqnBnc A&3X,fj(˹A*e'F,kA5'4[n;5B2?=}G:_0YCʆ 5ɿƜ;m IDATq(lGۛjmhMzdl 1`FI-Z$̿~T&U|;Nulo^zki+ 5PAVfŠ{;K.ĜjDFPpD@ɭh04d逨C]qufyEFw9œfuvCԹ:URr$&3YB[fIzd%ŷׄ{q|7CokjmT9Qms*[WD\y C u3T( Z.mJN칝͓Jc÷Pamg_1R+>r6v"JV)@+N~(т s}i짌ìhj̢5Q43ѧr9l~(WaIڱ 'fl 5FѐY[”'HRTyMZ6ZеVpDmȶ5m1`ŧFa-{w[%ClBt0r[UDXt7xҪ<#.ڪaZN~ʧFFR#"1r]^\IG'Eُ9X1~*ҶK;2etE Wҹ> j/_*0 Dir*I!OSsrJPVsͱN]x,p_F~PLݛa )(yso1j*H ] F·![mC OM 5u'6mu L{W-l{E uiYe'v[$|O)f*o 8a|Wp5#"yrg/9^3wGǦ3y̷m':WgsEt\aq-J+sҫ%qRYŜAx_ݧieBST~Z#=T%w"V[0J̔ 5̿MQZS^V<wjkڸf*mVYeSv\ɛ-f?#IE\Ȭt1nWoX!:F }(+[i LG~;ʎXmz/:}W>gyO2L A0 Ajb>C EN@(>|TEWZj^:o٫;ʏhjmyjGty싹婧SVV[ jҎ\CNEEL&ƙp8a_C3!3 MВTą[[Z#  /j=[{Q~_7E䠯A]_3k}:e - sV4Ҫ+6zLXQin]4ft_ոFn=Bkile AԎyA*>xahŔ3 YOC;);~ȸ̼\mj§,{7=(DRnoG~Q 0]ϵ+{}w}3DI)B޽`I?䬍/mI >e.=~bX]V)XC\`|*w9S5|ݘx ٭:q]QԋkhcV_̨A՚i!jgbj#]RA_–wH\ǖ9Xft37RMLSWQ;6m]fT [qe^LmibJ5'vh;I.=xY*{D;=QHb? $-( #{ è1/ո/ϤǫfҌw'ר;n0ZJA^ֳ :DsVQw3%6k)yyo '}qFnFl?V/(.We[We֤>Z[~q#lM=xG d.w.d*,(G9G ܼsƐG+zvzAc A&3X,fj(˹J֩ j_*e'F,kA53+Qj 3)z&Ya n]o_f6VRtdά ;nL%(5dqu0D?5˟iy|d^wOQUkSEσ3>:)]J́AvD`X]# RQy †_8)'e 0Z>>r GgV҃tN=J_f' Y ZBHm[ `{|]dD{`S=7*HyOPPU*||AP>WYUO1YѴ֤GvfXlGE?xDkp OlfHJɭF4mj ¨19wϾ\0D\%4vmA9Is;94| [{D"Ɍ3آ<@ʬ7S+/ @QYGtW bf JJyEX=?k߫;6ڸΛ7#ΫRGwК0Iqs{Y[^On?题Eu;znpzxk}ߋϾ` sh8/jr+㲤kk!j7z}"@#kq¼'~Z+Wz Eg CF!4Z7>5j̷ٴ{!![^{3S0 !̝{s(=8mg_}y6澌\UT+T(b ' 󢴷>QTwS*@~12RştEO_wDwwtmgόZ5Z6n߯ ks <# o&싹ԕ^S>}- ;[~L`6a9 ^[gEkuT0#_.Cwn}l?GD_yMowꎋk{)DH+"EOي0rflE_:OorªT ^LseD!pߝI#W$rUþ^.즅ſofXziY&˧{9eՑ'{E u=:G80gC;AuaAчBX,al@pt׎@qM/=&">,!/ I& D" Ḩ9BéÇJOo~ںWs `іըDOW'11Ԏd' 3G;"O=]r]WPӔv.jw***d2966ܜ= Z_b : AA3~$q!Vֈm8^kAAy.5w 蛥Om3f:!@  Aԥ7MlDosƸuݾDG¢|Ǻ2R-{8Pe^4՚F _%ۦ0̨ B7禞 ћfbj=pξ>Z[Tw=WP:a[sm `еg?1TAUe›Rm^(@zjQY.(?wr,EޑYåS 2V+ gk :$57%'.Q,Kώ'+?_'٨#a9k3~yϺK%}7ho2zWP"rD]TU􋍚Uo-:svEG'K4AbI6SGI]}xU!|;k CuRܳn"@ [4/F9'P''2Os3S3+{7lra;P!ͩ4k)?W+a52yƜ;hp/yߩ _/dC9LvMzwk)yg6ZI}&Dyl Tհb"%{>fd[[SCб3R *~rǀaFDgV38JGo'#W5J Z-ԭ`U QN|+Uԛ'HR3+R6-i4;+E5iF[x!:BJJϾdf< [hKBٌ1Yv2l[y_g"rSc/ЖRlYykɢs)̌g~ I+ I| >9Q!Ui~{sVqy۹ _SzvCtq%#|o%::-T|=1؀$IY*F֍*Mu O o2Ay}qer@ol1UF/Gg%{E uuX-G/Ъ䨗8#"ӺgJH4Ñfv3|- AUtF+-3l5e_ fGC{i<,T`U>3+Qj@Z&E$+5,AK̦J̙upCfpl=n;@f -L3X\&k*̭MZM\y CいWīʉ {wj|qJ e=/']q[!RQ~@cZ8I{1WPw@0ӻj*ƅЃ6@DRs큁N{H '?}˃ >WYUO1YѴ֤GvfXlGE?xDkp OlZɭF4mj ¨19oڼwϾ\0D\~p D B8@'Ш݋C֦@#,bYu_~tf~nv_LTpzxm̦ɵK,DDѱLfm@[u Xm A_\}j3":.K︖V%Aŕ9I)I bN TӴ2!QH*M;a]۔s;'Ɔoy5LEAD$;sQӳ'o~P*Vave|<~/#wNU/gA5BT Ţ6,‡r)c!@}:ym">f?%62p-|Y_R4ui1IRlBA ˋ_|sV\r€^4*{sM^Nya '=z2mjMR}|Ē4}YZ!@$*QAPr} );~ȸ̼\mjam+T,iXo'zsəһ>'ij#{E6Hs7E`0RTjck• NI}RvbrϾT3 ˣD ^\dmFtbFMˍ.aA717753v~L&=r㤽 l)q'AWk9}͕rO-t0735w * U [4/F9'hKnm` *ƮKoU򵔛a7UZ3-$SLL-w1aA7gCmwDіTĆ mNY;Ofx$ոa|>NQ~8P*0#'2ޚ M`PTq%!K03!.'$MqS|5=bd3,a=rtHn?Iycѣuc~3y|S-mfҿhy<^EEdǐF 6cACd{p4x@WGGʊ a@A2*e8J [ ,eٗAiy±Md,d35x|Z. HWCzKq~)kY«=GhW~\OK%e Sc}fVWհ 0Th^ [F d.׼LUb5al戩YaB@*hǟI4J KwR}0QYJXGVY8{C|T W]<-5u핧j|(|_ZRRVZ_iIɇx AAK\eWe?efFVSV\Y^ѝnaN0y])m/Z6ZYu9Y7!GD"KQz <*V$%O7%WaIڱ 'ʆe* 5Q43ѧr9lQKKcU QN|+Uԛ,kZ7sf$\3UsrMDCM)JTV#ꤐͯDZmQ^q汸.(^Y-AueehfZU/p$o}ֳcK*R+E)xH#)m5!KKшIљ˘c5<נ²teJJw=4}i-^QTLƵUQ/QcFnfffM%4vm,h)tiD%/7tyR;UIPqeNRz JV)@+N~(ךyYng"Vܩqjf)H̩֭=6Dw Q NBRi40TTHqdM2Nsa+$]g[ib cA~MPUhSX|{ng-/Խ;n "QR @0[z'1ӿQY~QQ s'b uܞpo[5)ctuttu}]|Q˵Byx<^ҿISTUiSD_!C f5jobkdBP/N!kun AP'PSS=k6@0vU.߉@ "B$Qk>y||"QVٝ%uOrO]J5k~zMɽ+\?)_KʢZtC_vvdV*vo{{)*r۱,}EA;Wuυ_~29xIDMGׯz54;k-bU)Ӗ!^MeWV#Bns A\PcFi\[$r(kŬ,ƈJ묏5.}Ч L,-k˂ yR@ѹTs ?T #.n",Qig={Q:G>GĬ?_- dSwӏ:MF!q}(q_BׯN5lp_^4PT~_e/c܆uf㜾>o~# 4s Q7[Jى=ZP,F,.j,0zY |jOhjʹ̏O31tߑΗrS/v6Y:Y}1ve#z3x!>a52y(q'?Wk9}-7D4B50KQi jsb[SsI{ 5dnonjgګ93 %~CzSiS~/hh7{Cb֓3XSM~>Ev"F"L88mYz~/G)Ǟ#\(5iDyzg?]bc0#"3+؍RokLX֛ |Wfk̈́)YԺ3"Hkg } ^O>t_q߽ͬ-_³˫?X(q恇V8aKQdTP{O=3Ltl%W7>,%P`7ȥVWR;K=.lPJ^jRfԳ3fUEJ7G(O1R{?Sv1{Vlw7y'Zwg.<%u_cSߴ[)ld.J,bzm4NYzԅ5v6_@^[a5nmNòŕh.WʕoxRx-|]TJ7[JJϾdf< [hKjXq5!E$f^\硍Uwm `еgW>\3;*1;եN\r;21+xߥКHɇs)KQ>#=2dtO ՛PiM1DcRd<ٶ~m*hWw|Y6\/5 HGXBVV‰ I{ ֒E琥Soh7{YG3*Jtt0G\k>Pp(:29C7Hv VZZU~Ζ'J4,35><(׺g_8we@ ?`%1*' @0qVe P}otpxku,Y_$%#ϲ'cU,l^#ͿK~j_'/ t#iD7nB-]x ]Uw5byo\wC $j8o=rWՖp\k+\) ?m. e=/']q[@-Nh6}$ƧE\y Cw@EWKًKQ)%⪆R^u3D' fv K)6SZ2>O;uݛ7qnHdD|*+nF1הQ Q}/0e%KJK6مг1"x DzoX̩8>Sִ+sIEHn4tzr//ۋ _XT\ߏ/L)2On8 {޺7\P׿@˗~ʈ9*f>{^a}$k3*bTgWlt[,iv^Wj>pe4HJNwϾ\0DB>XAVg +’ӧwz)PqMњU KSHօ'HҦm#VQZif$V#6eaTjHnRwɭh04>CZ:·4@GB"`#]ATܗ[\g"ZF}9jTBъ1V0jEw'3rxիW^W(^touLC.,S@ID҆钊C5ȚtTɾb;TSUR)/UK%W6!w]O9wm-@}.N*LK?k>5p~ouP Խ|il€28VU*%"/ Wz#{9v/¼ #p$EH|vv3;{smn R}nQB>sRߤ;LQ k*);9ijN?5TNT)+] Fj%4 2j$ݤ HfdQ+JixΆӴ"<)-aWOT(~H6 󔬬ˁ= |IɓЗ8Qrc\/8׋uΝ9xp}55>-*kvm`dVQ/pYҴtl{WuMPQ50z{/x m vwwwwڇ%J`s3# O\*F#s|NZZ2 l1aKNSKVnbv H"j7"]x.fHX[-jDpd=,(p.6BTrE\Pӆ">xD]B'+_Opm+WY`:1naȣ""Y7U~cX@"c)xn:c+㲤kiUT\^ ^{9D$`qU%b=4LbpjRCUzW) ޝ5qH5CEEkZAŶX$QVj)h>yr#U JWVm[KEڪU9 &p$l+v3gwguq[sAL͎c"|Oʵsu=݈eccç9wOi>Bs%I5AvBVՏ`BS_G+5,[djtp2{=xнOPd1笃C]yvDzK1a^w㿼S|榖-0[]j 4%BB/ƉUzmU^r|ՠLH{7̯p Dt;ItV֜XH-๶IȪW3kFZzaUcmQsB0<<!:ydz6PLfmm]ho6'mI[6eH?S)e+Ñ7ķG~s\/IJ񔲕beq哶$/T"S^p IT~8ae(m2>9MC:T6.W;xU΅!&:F4k%ÆSB9ȯ7b:x k3W<0a;wl0ْ/ʜ9vidGXb3-(~K 6>fed,· r73lYmijwͮ1iK\Œ#Gr B?ǁg`H'cR'XՏ|sQ";~A6} [Btooll$"?t7$=aO"o:dT~>(,=Ɂ3y?~? e}sEkÆ`~~~!0.@zж-~yuWh5͑DN0QӬn+eWc]QvS|ϕ{ʡ_ntj/7t[UbJfNRz@xɚFye2KX{sϝ. *P} i 5t:ݓ},\qz/i㔟a_΀Õx\&=W&QV^*raFi# _++g2MwjparDB[u3?llVz3Zd2BCC_ag^eN666>xmMUjcߧMMf9k {P(d0Z^p7L`4Jูky<@_hUzӣ- 0>wR`TUWt$XdxfMk Zh% mc̻*O}IENDB`tora-2.1.3/src/help/images/newconnection.png0000644000175000017500000014364011303312237020616 0ustar michaelmichaelPNG  IHDRd vz pHYs : :"tEXtDescriptionWindow Class: tora4GtEXtTitleNew connectiony IDATx]wM3(QI IQ3bdP1)F!tnowvLTCD}sٞVuݻv+3,=XY 5ԔRSjv e?ڹ^ݱ ~00 J=E^]Q[ XZ=Py%_*Ogsb,P*_WKz>r"@RԋP'v4a:qzDk ćGkU5ծd"^puI\U9O"+&XQQi/`F]Ww8>nFVV}ARB~|4lJ z Hm=Rج!6% O%" iWb9D:2G%.x 1  GÙR[.[#Y0({-e8B:3:9\ 2W ؛(RPZ7Li{%p˻Z(Np6 {#t+tH^[7KѫگD#SQrPWrT*\6O>NkA j*=4l:eC\Y#ՎkO BL,.)D*}>W2NW+8N_Wr&" Y:PM_"Ӗq|WpA)׏toIp.ƸsNzܑ^SJ-eI Iݍ#W]SJ-T(M-B{AJݑcŊ=jw(X%pV1W?%ќVPՂ q3*]8Z4 M3:(.5| 0M( PWIxq|>fBa:Rk05aBbXqq3 0ؠT>0!Dk tjx_N6$}@X H4{Ғ䤤Դ $'N+ Jrb%qK&: td$RnsNIe2g䒪 "@&R1}䰭2׎HT90:iP\ 7V0gGP ! yXϲ-t{ RRsHud`R J BI)6QT1T!5̥ܣ!9&i%' v èܵc‚fgg7h055-IH) Y޽@aRAT.זD$+~Æ)eIz@8kFe$gÅeկb ybYrۏŦdР:8X[0|>ߡÇ6lXyӦⲲ2˲!͛7?UzubQQO ..{Sb \,ˏL; z%T2nOA6@*ّ&ea{Rr6R4@\MaZ,wpnqY܁b2W[ (Fdž],Gr1̬ {If/>pKJLu+YR.@92AEl0)e,8 _)Sd)U/la4d$>8xioxx|}>ߡu70MS_CGQN07U@ƯUܰq0'ت^zijq'$łp \?WoFYeqɗu%"6} sklܸv={Y~ܢ}{篿ڝҬYs{I^j@Qʹҵ01HM@cQu{#DΎ\H ~_Y{ ؞v=?-Zbܼ>)@ ر}ۚ5nP~Nn^Qa}{1[Le;wl_VdbK"2i֬9g~PUՇ6eڻwz@M6a.~JXƝAywn|ʨ5՟vm\@IqѪU+lrٽ;tUԦm~{m432jתefnqꉦ 0Ҡ&!D1T8$F  H}D U%&X{7ܼyƍ SonbXbV,Fc۷7m&LԌ-s.K:]:7*4"]j [EM7qò76]vNgt矏?uy{_1pjaߙ1 ݋/⇻^}ԪaeЋ:Aia>ED _{kϙPݵxBrg҈7+a+ZAa [ +a+[fa+RἍcPB]_7 ΐѻrD eϷ7cܸ#TGBJﷅi޼yfvy'O<~e6ӧM>㏗ժUԭM.!ܼ>+.- 5_4Kvgxy>eeֽ7uڽw6wD4tKwM>Y7>r}_tc>;5*?;gl`ʗϬZ5*AۭJH;'"ɟA))4׀n7 )EX?3g.\[sIIM ]ZH G ˊ1)yofʕ7p-Q-qR2'̘m:ye\~V>m IDwh4==0 IP^^>~ܸ/ fdfXeY1K&; Esۣ.[F~igloe:jqtنP ><%/_O),?l#g^[gfm +u͹%?];*gߜY=4ou @t7]~'͸6upFH&fa+θw-zm*D,ve-ɯ}vZaWөݓRb%vtysşO葷2QHb@p*%KA{#5#%;A @)7{'8bw8e#m- Y?`l9|bIY/T̕)!+ zkx{' WX R ?@OܠQA-HH]CoG0ܳC&E x?Cg{,*0vqS8INC RJ)%dmz+2ɶ=m,fsjY6BeYuջ꫟}jYcƎ5k֬3\ۙs&cq01b /p$JXhqu$Ρ*HѣG\rʕݺu>|8&G5U9/68:,~wC#HZPul!H"# $)7oYدf4ߨV@}'_>θǖ^t/-Z; @_y2J.vXO+ʚ|zФ_HfO} YL0wԬt##a [feoٙee5, _5,RBs2N(N4 587ΪN(vKX[v ) p{'G< ^} :e' Y%!Pg0#jp~\l:ŤN(W眛Ͻnl/jYMi}]$6۬oצTt^mYik'Z@ؓ\즆FаA@cԢԊAJ͟%SfA7>_hMmcJ3KXR<$Rk],nXg.Jbh[`yr$ĻyLR圲Iq3`DE1oxWIN0T/hRl)"NfǎLn Ġ,du-+fddKYYYcF,$=#î9jTQQ… /.ךּL@a&uywxÑF/;';fŢDH^`ܹs̹k `=oQK/RQ{ܴUO\ڮVF-nJ6"MT.$fff6jt/䓽l߳gO:u32Yi%`K'v{eVR_V u']qj<4i)Mϯ)?X7Mkfy6Njw^'gߖv#'fa+)M痬;|JmK?*mvCѶ v xvᚓ'4zpҸMN SF4K{iXIYZ^ 12O wOKX'B+ZeZeb#Q Ca\j%?%{R>}BpZbw|@vadeDY?/9ZS+y%85qFrx@,\v-P@#8& aq ĪpL/x8~[#yz6m+*ٳfC̅eN%&~ĉguV˖-;{wܵ2Ζ5KX%RGMV m[O޳w9s&MtСV,6K(3fۧO^^^$ל&S\Yt9k'^sF[pݼU=SVhJJj]ׯpaaL,&򊊟~mvV,UgY',@=PO4hȐA\QJ4\ 49AAQNV(*^?,uC {fCo^;tmDKWYε' tI 6;|yӅ^x vYx\8 vj2~]uY( :$<,7rTLI.B|l3Vv48%$LMI*]0(7k;u"1Ex@tğxm֐f2; 4YSnBt3bk*V4#r&RjZ דapBUdYaa šZV4mO[PPe Ϙ 욘eUTTm۶fjjYmyEŏ?Զm Q*3b}>?#=C=lb\L$cTN^{!CL˲dɒptGa\u2%θ[&-ߴ/Ķ Dw@ zժիWu5-=Jc%\fuvOlʌFPa` -ߨ-"TRR+. qvʪJInQdIaS +R f؊VPS ˆPDel.{QXQ#1Xߎϡ]Dpk)gbs"1#m}_1WY IDATRp>}e58=b#?wvaB yCl69"< & Κ@\]r:!ገYDS`(jիWu--MTëb3L  Tp8ǔ"hq>CVZzU׮]E@!| dU"`@Rr @U׬Yc Tqo~Y۰Q̈^H /(#F@0p) o'ZjݠQP(h-n![HD#DnذQ0BeB8-۷7|e˖nպaFPR+JLLt2>jb mD@0UֶZEmJ㤕nfl]7J58!,ԴP(t/mXVQQ4izFNYٕHXWbdZ,pۂbែ8pkb շ2J-O< Vf@~ ؄j $JAu C w8!! iVT2-O\4F{ё1V%K c%H>D)4)hu' ZzZPQQxZgN8@EyZ(ѷ?L # abBCtw55R<$+"P( ~ Dp8U>Ԣ ,=tB) B`F 4H$t+:mPݵgٌF#H%bBtWP()2|>`>?RY0|Q ]UQ$FJ[-z,g Բp8@x [ *u*XKȪ~e%<' u.O_!@Rno]TZƸ4RLS]WHuM:)@fؙ Y3KBDVr \($qXR@=RT%v $y9P/JbJT68ܱGgJv[I8'7CѮg_FGIX k eL'%n.'Ɯ wQjB* IL ^.L2 hhe'&uCPxnT8'Hs6Թt)v HVsLh) JP[R~mC +¾,RMMg f562J9h B!PjrmNP˶1=YuUh G@xyQ*qe =I#kJMo-屛^Bn#Aݓw=،~Wڏ:r&7!`w&b, Fb;!@>_۩+  @4y퇘v[m@4 $'?2 r!la-doFMJDF-J#@"va*5=_?ɦ4>b/çt-2tfxp( -RE`0Z z,vR=бbнDQ{- 齚Ԕ__ڻXN%U6vo 2{ߕTϯ1Ue2wUoiKU{SSԅU =&G;ZtKq%(cTˡ^jAm+q(qk IY#`: jPJ.JDZce+uլ%[BF*8~U]hhT$}~FU*dssJ~F=("`!.1N .2mLժ<8A$Nӕub<"6^EaO _9q!{'.j"JأhBl>˴N+D40KtbLJ#.uyq0O<(mp &B>XɫK#8CVniǂ%.2%tҪ$uB\WjFղ0_n'bEFJU$_ \X)>pv+"QAP>"{DMg)[ kն8Ȟ4 C h@ ay'pP- *Y"h P^Z(8} [Nx8Lr(uo5ql RԨYnA1q"H=&E?@u }bT ),ErUQgLjL$FHBMP2ci|c8یl)Z Na=#$;@4;AC"0.r$oVS*P2KL"DN 6,:^K۰+6v^PC.BBY#TMEh/(/@rat$<3UHEezFc>nL &3i6SݢU'&yFݨ*n *{LD/ A:dxcXpm]ZR '扁%  Wn[]PC\ (HF„!W !LF{7T1U}hq3.{$н(UVpQp:7FR G!$TJ@K.-j=J#WL xrDP5P+tqd;˱8qW䡔R ֝7+Zɳ.&Rw҈xW% DE Q'<إfD H!D*YRVxOVģ/wj^;;qnQлL7%᜺k]FхbKCwNf8 on 9V#n#1MMy? XK43KXB)6=Yi҃0>NRveT#q(ci4]75.(ӭ^"?}ȪKQFJX*:ѫ^˓wY]l8I8[ɗq~c$uH^`)"b|ԔHSz ؤ S|F8Tx\q(#r>@0DXhHuOW  UT+-Q!i~@Q˴QIdD5J<SV1z]28 BVB6WIVЊPT-R+oeA|T{ZT!s .^|t b_wK^XlKꦟOO|Të 䂰wҮ7 óR1(VᆥAm%H[g.<HGZM8^_NHxi@p?u8OALq-wAH48 wyr[ؑ%MH)1ՃF.69-Ub Go 7:mZN>$UcR%~| 8 e߲ AÔtlJS(Jm-9X_ ȡ~1`qa(9/x[U=pRW Zu/gw Ե7{%",:3DC=h cͳNkЍm 8StM%MPs-|m|iP!|Dwv5ߕjqUz<]72);f }e^ t.>RJrbh 4*wX~߬\[n+Y!#ƽ6 ˭ǽsbf^ԳxBz?7P1e?_&ƁI`~8 B\-47\>4 U*sjQ\\M/5V)nذ\5GRSRN1Q yFKrCj@ X+J:Pa ];[l٠A}ՔYvޝC۾ze'9׿|C~=%bE+KHיC}1,|wԌد3_]@QS B)cxáXF>updE?:̛ͅ9ᬎFzkƩ`wWl/n{5wO YC~y%^]O!:q_赅mH;o9g]4#rVϛ\pk2wqٷ,yL7<0#~=f;ߚ! W׃WFj`&M+xy6e4?{n,"6#Nk$D G`jgs#x)Ыk:K ΗgyĽ`#O望;UݵybgED8§l|b=r!-?DZEB)꜠ Fb_0I'hFP2l:bJGPRz}5/ xҩ%hp]| 3_1FofՃ%oF]ټ"BI[]YC4b3~<4g6o~^x~ޜ:ejwOI3?Yr7Or<᭷j\:듯|64cK)oEXw %%l<yǯ_i;M~/?':g~vkg䇩foY F/0 o'Vdv?_qキ!.9~=3Pa'ͥ_~:wY#NuuK8iwםr6IA ѝw Ҷ :*pu ',AgVAePB sRCTwvw9[ M}>^֔`1O Dzddfs.UKzR .ژ3~M icoP;BreU@]f W ]us_}[:fct3ij_q*\15K:CG쨴k2~)&g*Z?✐A[RWmLyԲ!.^?`)Zҥo3/۶hMIiūg9. E-ڔ7檾}F1gKuY"KmqU=/v3v|z×$5 ) [%^F>]$#FzcVGBBxwV-ZaսY (sai҉؅!Sߔ <0r*х#'Xe `ei-ªnq&9Eq|&Z?/}`Y O5d;Crw];JB㾭)ǬlKL4$EFR0B9͓#K#@)?5'` ԜaQdêY`RXin2).eQ,Q -3xi[D VdX%4Kl*Jiâ +L-Am, ~{f)"@ 0^4ZdȰɌ`NsZ3<ԳێkC<(nDe;HFt]n@_ 6=<'o,s &r3gO{cIE͹↻_p\s1F1F=w}Ɖ [=ʹf8]u-r IDATiA<ãǣWIPK!i3Z_neyպQ݅͋O3F}z48R4o)Ǥpt?lY_V^O͡UOkF?RH֊#MkPԟz\Zf/g`*KE;JQm$7H%ю PyxkEz˭lNfQ~yZR)"(Ϣ_JdK!O)l6JYy]՛73?)U CDXKmJc RK Ki/5 i#Z4-g=g9g̫sٷ[U.W=ͭ kOT />{HkKbE:O]{ G#QD>{Hk+6.ݺtҳϐsG鬒9t=q=vɜ.>KsbW64myuCԵϭ+Q VEۥs.=z4g{DxOxn@V92i˲pvgfᏛi$Ksg ð7>e=;w{Ȏoѷk]Jiۆݩ V݂/ӻv{EK-Cz޹ϭ+~_qs-`+%0 /[ Vxwo>y׋;S:\"V蚔9H;wƍƟr?RlXrg/è/<ޖ5w_J ~)rpq[kE,zpKM9g@àG `4Zfk(pԗ_|n鎰eZ౵) lv`ϬYOz W#a-ΟJ+zx͢'Wd:C?(,F~AUQMˑY/ 3gJ7ϣ~ɬ>`ŽgW z/f =kpvtm]&.Ky2r?6N_󁏧ZwOxYb>׍/Vz+>{a-SH.Jm9C <^ӣҒvs)ewb堧>X?8ԓvE3//_}޲5cي_͚gS-oGp܋ L}wO7s}ש}ןN>"ePAԲ(SO mz|/"1&;l?g+V,}vi?B޻Vq[Ӄ1 dӢ>̓y?rH $~:W|woRJ#;]2u%jRMEU>##[M=8. ҩkP^ ߫SAw=槯lT.}9=}zlttFs/{ |yg?H+Wҹ[_/튳3.ѥEOWP ~SRA:i6]~y]-͒^ 47 +_v޻y(_NǑ 5O݀؁V߇?=; B@/O }ˠ]t?ow˫KM#ن-^uM>#٬)CAr1u˜0T@캺U:g}ažs*,^Td簴־)w& N}w^~/}ei [ 5 =@t@f3:Erӱgvzmau*CkVt"8 !Xᚗ7~$$>S߽nl M\6+K=kÑ| muz) ZrNN(߹M5q-'f[T!(z5NPw !料-dSV枎]J)dw 'WoOxc)Bhڄ7Mo,u)-6smN^7}.}pѥ9=owz,Gv />J(vwNJ䤔t 7xK/?Qv : M)={\m_V竞}*v|:cୢ'6O,;>SӜwFXٶ¢͏ Z1Z/={ʂ^v,^tγDž\]FF qNM}s{P˞&4}0%$e0x]Ss_2*ŪTz M۝M)v]h鷱,<9sNqYU!=sPMҤ.VXi:,3Ky"צ>0͇*F*MI@Fqb;K!ef şkO?ٰ*^;Ϥk]G+|? 3ckl47*zzqdӜhbhOkQ,GK 6Jl=q|wdEk?%G @3RY%[JL~]<. 1^qiR\A$'>#<-|?Q%Fr4Z_혆fԝ7^aP oI. 0%D>ƦL\8a( wATbN9*w}5ǔFfr: og~L=/ԋ[\a<9!?qd; `QJ|i!*CV ?^}2Ҙghjwe!IbJb0/b2D\/poG)Ii)0Ugɏz~Q WF-p{bfɶ/^YV\K YƟr/,hvvpJF$}wK^bה_79=vI=zaj`?uE$7}nAwRz6E/q3;wWRF{eS@ߗ{]{~ݺ5K+gGah&yqn=~L3g5T,mԹ{:މMB%/D)Z!ċ"[֩O~~ѽ;~z~W]~cotAΝ,{0(=z cEuC3p=qU]μ%[+4O,8[ѝsG-* [_*?`?n6=k ,(-@-O_#bj>0\SM!W}Am{ْmAj2/zwAݒ)ŬJ@T3 -[Cp @@%)DF7oJtAd|2=->qʚr7ZikzQi\٤ԵLB,GCk(:q7ry%>թEvv(d֔cP@\ҀeP7fNޕ$ AʿN/8ߒJ#Xo檊^~Ay' q i׮*?Q1pW$4U~4k2cVL X2BᏛ ^ [-\S ,xd%Q!& VH(*8ʝ?HRI(Vzo&%%B!cjY,*))IIN5/U p̃R*Fޞ6 `k!CHoYkRM&!Wq(ȇ9ȃc_&%*3SSSՌJh0,!fBosdf8\Yv,`G-J  5]˓6_]RË_[($K/,k .GeOI8lQM3+0j@өGw[ Q0A0ePRrĂō8vpe ̑XIIɉZ[XYYVRSJZjjz78 ,wK‧RJ>?6]5^n]I}T _[x9wѫRɥJ.V%0ۛFf @;p-ũ WԪ]'UTk9ԔRvgeeUy X֔#)j'>/&Up KyҎT;%p  )ۆA !ZX[UTW;Ȩ)5"ʼܭ[ӫ\`YGYO&LeRơ jOb%yδ}]:)^yYVXe dt6G^B `ȯn3/}: 󋧖…uUkg]9O2ZӰ%YG}\Ҡ棾(Ԕ 6xNwƛL.j^u,P-G,цY|J!)N^rӹw؇:ǿiϨэ^_ٮw~/zク23OٶX|O̖}z͓E}Vxy<{K)ܗϽݍaCm}[e)@JgwUl@\\vMnpY`5 Gx Dh֜Y֔^G}7.Vy⬎Z2?E?~pΰD֞|lX[\_ W-zeb@c?e!f7R ? s?}n٪UO|kP.E6nlĕ.$=&g-]nS6M>]P$&p6R j?L2eʔ)s3f|w_iY4AGPjԔ?C7ǀߵP *Cjd#P S&EG)PfO @|Au~B~i= S?fqЉe6iXIi"5bYd"snN97bfZlyA8Pt`drՀsw`^rу?u^ߴQ feA4LPJO?ܳoYs;I,kJM)3ν2N۫- x+kiyab>5}kŪjԗr\:-\ݬgﮣȺĵJ[Kq)eqmw]];.--nHK-IHRBNNNywf:wVsd˕J|9BkNW^J-QmX~1|W$ֳg}͂^*"d񒠠 sgϺ/ZR*s- sӲLKK{L.g';;j*n7xlN}RѼ-}7wΟtkĞjB9KPZ"!Cxqٷ k::Sl+p> HXx٪^J/5rsys];V-/U[z9?|jhvG7X6{vЦ^zEi $ܾxגuOKV3ۍ:MY?0˴7[Ujճ540l[,Zfs gkgys>Ȱ.sqߪW˴? +ivm%j"(?ۑI44O6M<=!SXyn?kYLh2|6hCl h&1c\rI4Eџ=f)1UU٘8ʕ3{!W5颢6lR*u:[t)ǎ=`ZB:Jk-+:$Ir8\JSY,ýqㆷyL=R[$aoo_СBRih"ڬ> N̲}/::NjO< _)@2l&bGGGf=/AY |gllV)! ber=<_lH=B.ץ!ID"gϜP` &/%1I2 ,ewIWW>.31$q]ޝq$ /8\ ^ w^QWYHXɼ#?.YjBvYHpHy68sZ BrxaV/_jt/>sb&Ӣa0XZͻ ܦ S<7{_8ϋʞ{W^DAڵ${YҴKɞYb{ \+5mj7`b6mkkT*@PIB!5~tR\wӑzɾAn1:ժȈU}y.rU:f9faIaq5 ^@?ldV=p@×aaW\:x !ӲV7{/^O) x\.EEyiҠ(nwǔT jb%}."C&h^'S/l|mvhȩ$ hwi1RFA|N63eąvv_KjmӈC)^={`6hw4h>)8n8BN^Իe:u5 kXFl1o ]AVg%he3,A&~DŽA߲֮ﬣ2 dSF=~->}/f4^l05؂LUuth~7٥Yz} H! ֩4|vPn!벇|+( ^dScL9tذ'.KkVXj@+>2%}krV icw!Ax IDAT.*#}c'0-n]A0*oɔP4R @'9h뗷SN~FMn^gZջc.6eVD^3'uK4*ڌ6);:y5R׏]2&DMVJPxArfBN޸sUX1fniWwӅ>[gOqި8.fx&\:{g~^!}9o_13 _]|l٪"uv2Ư͟1k!T~lѪ~&'ߨ0j^wW6kFeY Æ{{m,:?YS~HXͺ쾛s٬óT=lel_NJ4|`}cIRísLjUT+YWI jC K08PMV"׊%K:$l>"tZr\`i{S5bUeFN7Qk, 8ڟm(Z[iX0Lg-JV,G3֍k5-SV'_^ϒѐbԳӷLl+f, `d2B8a<3_ęSTݰEr\ĨS;V (o#^EDxyzx/uPaR(1>>_ 5C>VB{䓩WV)̟Jb X2Н @)"vE^|x6.k=z9puf=zN]NbU3o"hv͘VlN4rޟmڸ^îxpNklmް]xh5#)9Ï/nX*(]ٹ^4Xpҵkg-^/rsnQvXv+ۧm><)}-t6-@yT}㉳a]|vγ/}kŬjyM'τvHUN v0;WJL! Fl6ƥ(LK &pC!$߷Ȧգٗx<ArX zܵlXyX } c^o~s@6,W`Ck`o,θQPY"QA\@ڵ;=i&stŔ<6#͖fz싚.=p ejQ,^r{5MkUz::WIS∬?|&i5M+SD%&KPq; L]Ma&K.e952ZXgoPRam-ls_@{Pk5=~5dSD%ѩp*b٭ҵkUmy+2ƶe-p@~++6$WeHjb[Gr3ShhP" IW\x2yMf& Nn=Bo1/X=50N]9ԗ $_ r=f u+2,d5p}vXi7́$Ztmh@ƧJ 3/2io !Lץ#!å#[ۆ.Ha2Tl >FytYTjaDwQóB|`D!!&KB(,B|ٰfD- xcCą6)6ίO;@*FFFf)  }(xfn5Yj63ʙQl:][{wOс(-Ӧo84Y 'ʞ K6+dۙGUL+~9 ip.œL.qvqH$E]da233cbDBaP-KC}n{lγ8-5qJ]f͐'>zGge#ykF!rm.Iu<3J+Z&w.޾}.( Pk9ɲ0Ytd}F6%@SuzGeؾ5  \׆ =N6cEk&4v]ߓ`ӯҬg]aGʼKnޕ[-cmU?q_SЊ[Trv&S'FWQߕQ꬇t_Jʮ>4YZmT*^^~?ZE&jY*]oIqwdKz+^n'7|t MԲFٲW{s1ޔ9srrD$B$\y^dI ǭ[grо>Ț sAnȞ]"[*geWBxT})N[8~jE*cIs{l{{xmƄ_]RľK_@|lԀu>;Ą_]?ǣsϣ"+i֘cثGnt(IuoQлqϯ`C /=CO"N-ol|Eۑ5}4yGp2?ܡ b2:{M}ܼ|%M%)"1pb#)eh{{5QUtl5-6rn:šs)}*{`+@*34 ruި[ڏُO45P77>5g% I0}j.ܼ v Np&du@mkuKy P&FD3ժYԥ9/o8bv}bȖTڭ-/~k0dz#CV4sE薮leC^)E)cDJXH0wytϪփ >~O7嗴[ME=zst黯bԡ;4@ hyBVĨ)x n]zyt쳓Ch.X+^\>io!J 9ECԩO! 0hJWUBq->͍fc޳79ƷSӧzq4GʭnJnd7,ZY'cϝe.G%zY٭29r絗.8 Ъ~ue:v4u6F[ۡFú償o= qLa zyl]Vi4 V )c.nպ֏ڿgqK.e]˺qVU[0;SPïu_doFnUӫ|[_dQtj7͖u)y_ܽt"jB90˴-{iwy~;?O+>ԚgkT7?xS ;YͲ\y "Zfc?'Q1C^s)]ʋHRX XEeG1UkgGDDxzzzy> mO?w L+^yլ[+:ƀq{.Ϯ{ڶE*+W>͛O`}8ÁD^[Iv׃u:B|9 WY|LsuX 27&s\/v}lW\]gf%C/]UsiڎS.u{՜Kzн?7?ey\rCJ`K|ݙ%xϾVz&NЧ:ړT7G Sڟbё7Ӧ+SaOV dq%Yz~hu.xf+JB.4c|e20Ɵmq 2_ aw_$%,& ]_ͤAg 9OHʬ9PvEֻ z+]o-f3N|֧ R^/,7$:O\CֿKlUB-Ǔ͝Z:E,E#;m@f.7|vj | c^7j`pؠz3.*H`KmȋoKJ^HV/ZrxxMQAڟ) NYϘWFB^w91𿄁WHϸwbHn40aUfNe̢sN!}D iZ+ -M]W,uq_9~eٕ\09UK^;fu0y;˱=8-eTR~|$>U\N$3{A|Gb;>TLhdN.Ӻ-D_Lo &v?:Qb ײ_Zy gMڹUMOʒ( L@^088Y{J`K:5Pwud6UWn?{s&E+b^ so&Aace])QH">eɒ"m97k?!Ҫo躞n\ oΑ]}6;FSCjo7KH#I#MQԇ M;zYP9LkdMU`?iӕ;lj&']Wٮ\[kP2F1)*g'~ B^ta3$t錏ȣ;X^I rat-b8d]֢M:}63v-_K~,sЧ^a{\|zk(d96NN&Ur& @CV?4$ IDATEqjJQK<RKOpw {1Kz(u;RQ1&4RΛꙔhSΛkKW61r齅Ҳ㚟ݒa?|O]iWZey%e²v>?T&tebzIgQE9|z n孜̼wC%,qJ mzt E Rtmw]wҵ4Ar|gKRR0f e5[߭8b,@GV]}Rwm8tiw,oօyVջy =tɲDKGhZg,!ԧD<,KGhQ+4?<:2  %[ѪGFW4%[dȲ1LiW)T@ZRݜ*cbBFĄp.l|ob4$(z: ]tr9ئґz!{ۏj}p,` 2ME H&PM/*Ŭ|uuc+,q4`gnz֐;$wy I:o*`Iɒ6A&x|? xZXC1%O9vcJ]z;ǏLZ{7b#>9׃@Odna56L m38}ޔ7=-eP4#j3ۅ 4wU$@0پulğ=i}b Y~U kF'rY?FWn-RP߿k TGt8^~laMl‡\u2N4v7Jz-K=oUde4EiTd'fPjU{r{=U>\wѵPԗq|\Ny^5uҨ|eZryY FZޡJ@9"""<==}|Tt)V^:7[v`u!uxٔ̀K^@ ,f+U DF􎍍) +NǗB7vܱPz_\|e,f+U-T(nR,f+U1Y⮤,K܋:TkPbBʣR,qdu6[ ֠ĄlѕGvÚ,f+U1Y.WWYXwf -f+Ui?zhŻdI_,/)p0}t7oiYR3[PT%l*XQ&d =ׯByE %BR1l\Ebl+vh{z# !dNI׫Uw,B=t ʉ0؎{{rQ ]E hϻӴ'߿I 9+*]0Y",VLα7tf@-r߯B$ҟ5dAZ*sy`C5~tL!DZ QԼ9_uAƗ@Q# Gtn,E!F+i֩[7mqtأw/N4$:cˀ/8ZS$s9Li]'riHؿWǦi?S/k.3/p/Oy1]uGOnouT͹㷩/KJ  eGNlvhw:OSpvwVϹ3=LWff;-O 9{_X'_IJ^C{ѯs Ѥ^G;I $'xX#$Uvmf v řk]I} vߣwض,%B#8΍Ojhmꋓk,Q-"AN|_lǘ6GP}VlՒ^- zU"kVg4>tѮj֪uuSC&K!X[okTmwG>%)#BqÚN7=}՘kM ;*zUqVd!Tnnw@wRl`XUU>}׺r=&<"C߿Zz3R=JyuFʔ|}ͮ–%B#|;翖ĽFm`0kKǵ_"cܛY2ًmtuKkWLN2>OR?I;={hV;w+А FZޡJJ`##"#==<|˕UC&/c|"}@yraB|`7,BSܾkJ-CME"IaB|5uPP?*&eB%B!nX@!rʙ%Jq `A4{Eq\/OHdފ!d1ry|BD") .%BbOsvvE]da P(LJJd*x<=i4DNNN g",X,6%2Ϸ2oXL!P>0Y"BdB%B!gÚ. ܼut+ulY"BdBT* 0Y"BF(GU*N4D!rqիUp-KB(/f$&KŠlBJѣ9aB0 NWԵ@JU :KSZҦCs$R)a0pG EQRbˆݰ.`XZ$3Bt2Tb aE %BȲ0IRVS"t cعBDXB %B!L!P>0Y"BdB%B!LRGW1E]d9r_iShӊ!PhlMֿk`3 gkkg_/ڳ0ω}bTPħ[b!d DV{w-X!!tQꢮ*E0Y",5uApˤ@wέ8lщP\8v[\15 >ZyZ[5kiXR:8kpV[3~Ga2h/][uRK2L!ukNNvi3ysgvfTv+Zŋw|^@Cy躳:zkch~YX­g%,B@vwL@yUo:x ~m{v]Vuymoe/ 5ے8ŨE`llIy%uM놓g_9dk_^N-PB`Q*TB6/y{{uE%J ?J)]iB@hܼbaB]͛?&d*0#"g"B`'@!33b!&KB(,B|>֤IBMVH*)T*AMSpY$E߉X,qoT!(s`:`׻$늠;"IrUAAA...Gquu ^|I^QdIBe文{^{sJQ|RSL.u[kNYyw>J@S:F-r/Q{ZΛp,f^Ö%BȢ19cƖyVj=qe^|Lk6m렆~n^U;N;hȸܥ|Y.e]j8(AD,}\-ǎpD:}Y|0^bBBx,..+eJUŊY,W V Hs(CD +زDY JUU@MR7 &KPUjk,Z6{+;Yi;O"D HlVT:.##Uxxn33Ҕg4>!Th UQB:0xS%p8F@c!P>0Y"BdB1K%iZk""I !d1t:N+jcc4M;%%&L&Ӝć!dzB^Zz>݄w +U~@7И,BA. \>Դ})G|eB0l[ڼ|6mKey(كC|XoB 1O%/{ПQfi,~eBŀE 0 DZVsFmXDNZm;IWӠx>wFjРiv ehe3nWPㆍ;\z :=Z6lf2 (˽SiҰancit6[,B3M+ӥݧV$!,׹<֐d/F֛wҕ#sX(5ԵC34ZUxQ diA!s -d':)~wo̩=ZEhȇ]Ʃ(]+qۺpsR]1n;ןSQ{5o1:UХ=;2MK$W6yrdFE!{W8罚!r淍CXٿ +ycR _ИeC}`phC z6[r4QvI}мo,reW+p?/[|-t%<1ԋ#8ĨSWn)8@TT{UkBO㽽bccd2:3[J.mO=_XUdW \xG@LjG^c!P>0Y"Bc!Tܱ}jpQעTÖ%B!L!P>!dIޜl߲`!&KB(,B|`D!' JzV IDATkNX,$ #@LCi42VVV@4AF333޽{aMG(*p-Az^.WTY+Y_/,}|ϟ?D$OBd*!d2^W*iu<>ߡCr;C3|B%^ϔJl4ҨvvvR^/%B$iZRiZo+..nْ% 4FUT4](wlԨQzr5M.ޞY:hܨq>>6 ܵ/䟏q֯<㾜[6kGd*Qh&&{WnF.k[f]v򱰩= [KJ`Ű']}S[Ǭ>[d{- "Egu$[wcdC%B3WU9gɤeʴo4(2k(o NUn#!g# 0 DZVsDm\Dndd\wW-9NrÚa7y F{J7nӀ94(5,QA X.yL!Thzݚկ$bi3ʖm68(6MC}^\Z. >IuO.1.õ4丨y{w?3{HMqSTR,J]%h)uz8[E[UA"Ƚ^3؄IĮ56<<;33#~q1\?dVO7TU=:+|XGWyސ7U6`˲[GGu&N`Y͛h4-Gɸv=M"9wtpp]SǚoO-*zyPD #N8h;.L ,N7og O|䕦7o_E7g}/gj0â3d pAH$x77WDj0; M ĀjՒ<6ޥd pE( _4  \>Z^. ܢ X$b/Iqqq rG%:b YI B(i4Z˅bF&1 Sc`,HX,bSwz P%iJKf X"VV*Ϡy38Cam:GQQu|=KC1fʳyN c/k Z"ë^TJ\uhZX1Mٹ!571+[?Hynf+Wpi/u-G'P3"!C֑##A;7wdk##e5G Cƣb &N[7c6@.udl< kzՈ-HL1{G!J ҷRH6m}ms=G)l!%Wۻ E"UteCb[(f=;) ,7QYX`4P Y y2G֪_<}VO#.`Q1h + ~q*%dM ̮k-tZ'Wxϳjva.%>CHBgl\ݎW}q-l'"h>|;~ 3U?ƐBŽR7]YScS[# xkW#tCRü} >xN.S%#D~QcEAؐ{z/dM]dB ?dĸ$SEKV%PEu~4d<=̖͟NcZMŶu K~%{H{)/ZiJaʥyO>`V|*n]UC8xaN=䪼0"HR,Bl޹{~*JnwȫP4zqr.^\[Cev]77}{0ħaXs6Ng)I;^K ]"lLJaR9߭KHDɛc̏ E0f|1³{7dEk1ؚA]m=❖Vhogd46,˲n]TXLy3s.v#E s @0rr0,Iyf-x 7RI LAR$1>M* G4-,Vj㮖lo.>;zC (R( 4  \>5)ZuB[t |m}XW $K#0}|}I^O~!.r=rLRTXlյ %I$P(BF\X02a8 $K B,3 =BI`;Hg83 X%`$K p*c .K4EQ0%y,T*!1&߂,PPO qj:4DZ%ɤM2Ym\g|QQޠ2u:O"y{gy^ cZjV<ȧxukG"f]'~85,퓱&!579j*R.<[j:j!E+81c4"HռĔ @r=_F$KSٚ-+(jߦJ4Z"\"iGD,JiӾY|X1A> +6NEa0#-'Mܸq\CS}?>ڟF!CwT7񅑝pHك,/nQXlMU/HL6h0OGj 1!o=evdҪgJ,I}i3M6!1.ޝ yzR{~k0a+]qW&, ;Nd p $Ea#T~OK⦞([ZաWoGO.m}?"~>A0rzV_~palOa]Υ#gJ|:{ i|00mӞ}~U0U0ƘI?C8 xyl߭4'S8Pv^1Gj1aʥCZ)l0BaT7upttn] zgy(֤:V.w~;ߟa<8dDu% H@AȆaU V(Uz;zYedM\-݅6)wqWGyoCS) RI"wt_dz6U11ApHxˤW,1P {Hѽ\ .=4la6(oᓽz,+KoU'.9_~n_nN!۳Ѱ@$#8ymTac\VٵCSdws7ShA녟XW;|a"*< W.UR\o&%B{){^*!K>}M YI<ˇ˓U)og2 %Tfe ⸩$IK<[u٬> Ou#B3Ǥw'Kzm^^Hk\؎U?*10gg$&[3(KPBBX;#ApgykذF1l,˦hXk1iZ0'O ˩h͈Eiinnnt`_81QgI#$0DZZZ@}`Z HK! LX?>Q $Kcc8Gb$ww7Dj5_ hD媿?"Ol6i+bLzSD:cYc&%ERrB&+#:bϖW{Z8Vر8p>,ˊ?zwdusƲC4[6q1X} SUN<{yzj4pALJLp6@#Y>7آבFCdMK.^$x3VuT:Vo0caIw!=߹8XV<_ufcڽwT.}6@xg';v穢fý4vtgusM};P\a{!kdҧoil\Qfl`tZh&zOJ)jI'6Ki5!lg AcZ!>]*"|ICms_ݾUVLXy$]+(kҢ 5ǻ{ϛ9sqݺ/6_vk;pݻb 0uvÔɲfx&SݼU9 c9Ӌ_rX:u">~ˍ.ee4%}?6 Ц..xP/8xR 9kт bB3}4QuN{{^cl(!)BTbAq>݈m쌹}OKGm?yfװoi<(V>!? Õ?7U# $*| S.-{ep|՚jg\/]p $0#h}m?<{xe߬~ѷ;C`7%b](, VzÉaM,,N)BIDAT|*h&_tm%ˇ6nJk_葺|Ù;q6&(,_c麗o?D z~^LLb Kdf"*ص#tBܙ= -FJ\8} ShXLT1ҤoX_ص₸"D*[hpۺcZ^O$}^Ub" K)0 kw`ռw$Umf6sׯ;Rbk_;{#µ>Rl᭫3fkB?w#W@,Zx,84?>{#_SU$qs%]6ͬ,.7d^uVQ"^y ?x]SʨY_)a?hceMZBAa@׬JÂ[R#Y&fh:xJ"# wO-[_$T#&#pmZu<Yc\1BOݮ]YX?!1<0;0`9 ܣ7ܡm!knT eV3m@6,?EvblB*$]-8N~ZG5fO7Jx󓵣Dii=)ܓKՔfSW9am[2꣉ Dpa}&\.68Ĵ?zS*O!pY[ڰ,f֎} wO>u]mm0BytuaرO䲶%66r {蘞o;wG7lI@eClKXs}4Q}zgd}gX&"pd0ELnm:‡?5+h1~c:u;+ѹu5*}LڷԴ)M=h<RŤ@*(+tr ]׮y%R Sr3g3a\#5+-Ύu͂oڴa@fu ظv,f( ȋ}BAcf1CnNI$EԯDCBBjB:- Fa}kUUbu,ܽE㒒J%)J٬ c%nn5gJP0UdID,zD"e z;dKR &+5 KW\WaӞ1me|35:#j*'K EaaGZp>7== 8'i7,lN*YfaXa|||LH矿8Lf@9zLet>V_5Ô]Y\.iUQp2 HRa,pDlW0ehX b107  M1 СX} S:B$1Ecm-$K H,+ YV@d h Y&h4WuZ2&K`X,nٲ-BR !uu$hE:WZJ~O&cԥo!I/| Eg̑ZV,hvIsGBBkNpEP!DuZnhZ&rtnI)ѴQ4\Z<\ii}RW8IENDB`tora-2.1.3/src/help/images/visualize.png0000644000175000017500000004373511303312237017764 0ustar michaelmichaelPNG  IHDR!sRGBbKGD pHYs : :"tIME  3Dc IDATxwxgoK !!$"E@Z M*EtA"(EDE@@HS=_\.ײ%{wsO;wfv LFq0Zu Hh( Ohj1rt% P赜(cqb1 ࡈY}, d&;;&Pp.W*EG\|Yi3mý ۤ}E,[i0<ϞJ$cKh_ 0LnN"(Cž=}6f&++fZj:'GT&K_ dXÇ-[:oxJ^^^>])"<6ܸ7JyBpz,7';-=M 4I!c˪TjZŲ,˱:4jJXDh]@&u  fff{,'rY""oߺ.f$Ie]_9|oFԙ$P/G3P0LE0#)dL2@8劽V`?ڱO⠽]U?1Ra"a=6ܻM$ GcbeQfIf;RC "+!Gv% $+0Һw5ٌ3w~=h7ኜ_O% Ggbm2m:{?uI)?ڎL`g'D֨m}eu)M(f}&N[˻G8U2zҥIzzUXlZ4?bO48ao,!,iȢ҇l19HDA͇z΄jOgeI +"i\`pHhE6vn~7RJa9lB؜~Yli" r4`SGI [FJ[0:a9eߎi3$a9Փ)Jd)+.r32OuhBgm3z BvvW&GO|;ƶsI|*6‘Q}*ʾ#.F>OWB*[=BjpKdZ\";UĹ,b͡)oNcgMUՋ3lzNj3)j~4Ok"JHfçp9-_U=51 [\GI [_$S p~,c2PZ*b7_ $\ǓwYe؁vSͻw}?xW}7*GޙzeyѶw7a0sn~іT݇${~(%Oxr$\_>{ $1-} >$R ao]b{;&{fE3s/,?ͺ+~ۆIѶwѽgJj>u}˱=+{&1OQ5n+I)i^ދOLۡ&)6b3дYYoHSvڦ_4VR){zEmhOo%Rδޕ 9H#z6Oߚ=HqE~#ʘ'Bqv[^y}I;1Uw8:wSj{~[ Mi{rwST}wםr;;7豧qܺ<ظw11PٗfzS~a ֮7M+iƞ=TChR?(Eʼn}kT/ a74*:,Erh>}ӷπ?=Q4㤷Ž>sSެ-lˑ2|ۯ1JZ$Uś.6߹k{򢥁 z{-EQGZWUES߬+i:"zi[ً4x}tEҲI6ٹd `@cYQ~y4C۟E l*6˄;|̯slڰO6^ZıfnlX׸-Z{sÜ,-SLKt'|o3tGmh3nպe-[xy/LZcciOCӯieRE(yd/H6$=^u9Mg9l+ "E'ws`Ŭw:eّ'Zbj|ͧ'RryjZrY fJrZ_am~P*>v~l+`ŋ*[M{Ɵ2Eݬ[czE*pWFrB$L`5Y{͌ ᓺUQ9#=ɥU}$٭G6iH9%"(PD!%b5Lo!VF++\ Ż$i8Np[lr1u^e{u{ңnLu%F͍iS6qfEQ3!Q=W1I92kŦ_\$ fz9՝M|zŜG>~ufo)XTDsl,dZӴ%p/1U%b}B% ko|~Ӧc_D[=ȸ6^@ RՈeQU| -қ6WN?Fk!PD8+곚0kv?޳guP -LrWMksBh 4!a5)*Hgcn1&6#_qLPh1"\e%芄`%ELSن5Tp,bJ.0B6E՝tۿ&;oEޥw̬9IH0LMCNѰD$QD}T|!Y~pd$8hXW!<<3-16 壿/^[ S.v㘼7:rְ[ bHY36$5my9)+Ѷ\-'Rr\F㶍U|!o0Ǩ𣯻(P}+ORӤs˧!"Z% %Q֨D=tFRu1 ˘,즅kok,Y^t؏L迥Jg(ڷ"Oz]kL=o͛7o޼mt`Ͼ&;Gۖ-Z6r/wrY}G؆L+Ekhl⬬u+L"ODS?IZtKsD-FϚy8K) ߯{8f1UkC}+ʼny&IzW:S=ŕGpĻ˧ku^K*bW#~/MXoB8m' G:n}ݧ->nr0?YAiq0ƞB^Z$K'Fo?az bB FRI-iXI-]^7@E'ZXBKYHأud $WP7bq||Bll;wntڙJ"Tz阘hB0#Yb3ʄUf#NlF'  Se_3s9^,$GVGNH$SAr6z5x?## ǧNtJnQ>̳ ;_ PzdPfo7:vdrl $\grt|#'ZYci5}r"/+6\ ]@\7:jomKτ`kZDN&0$H Hl sm<6ܻMC2òZJDBju^^ ˪J>J%65oғmý ۤ8!JD"ixpyf/=OJ ׏E Z !4fBl?{D*[iiAaҢcT*ճgO !! 0JVܩ5o`( nW^浫WJ;//Gjn(T aaϞ>'YAY(a1iʋ̌LeĄHQ`Y.'Atn^L&3^)55+Y9Z wzfPL ,QU*5Dz8agc>πjȏ&lzz˗BBB*GE׀ξtr  ˴[i4ڰ0aHw"NHjhQ QQQ*ȽqU^BOHh԰Lavb?09^xe\W3q4 -x{۽wHHHVf@ 68}1-([YYYaK0gVEB˭U%:{ /XbmU#T{ Uc]<ټNmZ˽v fffk5j_.3>:$8X?$h5"ڎNN >WU]r Cz}p_}_qd;vN \l^8bmcYJjY篴IXc9o,` h}hHR$t:U썆m~xKtj 'IDew|qO{OIp͗޴*ۨV#4((_هW;UwJͽe=: ?4*4'ή8pBӃ߾oxT:Gzo< EA$P/*W<~-֝|K7jqy%ؘ8˿eI~^qnr.1:mrsY'ueûkݦ]!|#&wkݦcwcf㵉r~iZު]Qέt}g,if63umצM]ޘƚ>ۏdR\^'oB ]d7?R#{Q}灚p&aiol]>wOd30_ 6=e3x-lbg{3lI|_oߠIonܴq㦍95Xvu6m*rCm| E?to'N^Ղwl9u_횺jy&2)GfNۤc6_uo&'w,?wIka*/^K}yS,t+z\p]ꝾkOuD|xZ~?fT3?Իwf5$'(ӂxwjhvDPV5^WNb!dEϞJm0V{ zpMY~pi[{O{'&ړ=oRum'3+kΜ9sYv+͛7ggmlƿ+UiZQMΦu)/n7Mw Nh/ZxFه%py~/Jcڵ 7z7M?)8 ~b*mZg\HJ${OD~bN.....QE}MV=(Gd8HzisE&!"Dj+r%j#tsf`~1νFo&cAxŭZ8|կk+ yrz3t^3λYkJVs&OJ"WY_M? gK|""VX5+>dάΘizz#G}1'֮ бU{X9.,t?w&Z"ǷMk:YmҊ.NDpo6NVAMZ|4Ral"ӪBaTI*41Y6'ZҶ-ؼ=޴2DɘspJִ{;s㡧SC4R7m}Vq,|=|B& r&N`V3k_lդIfhNNa]o ZxYf` q3w6m^1wL]e:ݜƵ]wr9BN4sۗ}oI GV5v)e ݙݣcٗ "ꚤ+'kߦukvztdܚͳj&O8VѨ5ZFV) 1hHDB2iNbN[W?.:dhZwO~>幙"藧.UUf|>GgYzlszX qjQ"ф'?~MrEr$aTzئ$TJ IDATkwN!$ʹum?zU6eI)E+q7fw/4{0B",nWg~gaLBֲ>}i MlZo@a~uZ,OmV !:.>>u6<6iZ&Ty,kJ$L~ĉh㭢}iii#oߎ6N:޽{ժU3r`rA2VCl!Jԩ11ьNW5No+鲭yQ +HY-i{ѭoWϤ46/pb랄(>nTdeV9!Hޡ6`XF"2,8\Jm6αyM MQBvj``[xxK^e #JY{ytTˌ6 fP+:ڼD*kZPriW;LҰ b 5oZ,c]uocUGEL6>GT4PΈBZ =5U!R6}aϮ_MoTHH9o@B5vϸYHjBlꢧ0Y츮ln79gW"O!#ؖ(!H"\  ZI(!EKi8>>!6UFFZFBC.+SND3:ƿ @pX&Mʘ{?f2[yw2"0jخu_XRٰaСId&rKHp!˽W:A WN{uX('~ϗb*Hh- R sGJmMP!rpy,0qu)Gp6'>Yn; Zk RR?FkO-ثEQQ՛t6giƾLfI [7x6ݣTX؈䊜oxdʑQOTg25wM{7;7V%oJQ_N-f-lͩOR_^] ~pشӻY9d{v{ѧb.<ڿcsX;Ł':ӳoj$޿u[s_ wzy ⽁sڿ~I_'ɯ!3.&9]h]j*QKN&ܣ+zwHYVue81l5pܽ#psDž7Kuw6# kJQkX_6mw{~>Υ|"+Dх?\Yk5d֜<˯{<='Ixi/.|WbE|j:ʹ"\e?e~jaHZswaByuZ_4 QD!KN~<,,Hh!Ds]x:ޗp{qaRۺԮℌԆdCޏ863֎;pwU|ֈy{i a:gV}Q6̒EV=qT ) cYamCe%77oW[|hŒ;ވL7u<.bgo.7N^_[Vvsc#ٜ1ۧ4x#O=Mѕ#*GF7z|$aoN+=xp=9w 8\m \m:$~߄M?Q5+WޤۋO2%|{Æ-DN"3Xdlډ\? s۽vѧu,os:廼|^TCoEþq0Iaqڜ\T_Q&mgVe9Df"'߄HjV%qD6%ps\eoMε"#jVcHKڧ|[>ywqWnN V7'(~ՁdžI$ݦxcDM,7EK4V]qoOv`Zf`Kts1}yw~Os'fP9p7>s,HD$](}/]ԡx7-[Ip_[J[AL'ko"*ߝӱJ7|$ ͣ\ 9u}岄sYl!Rk켚xA_f)ڇ?N]/m, nfzARޕoWs~O]]r2ٰO;,]st+/ky{o*ߩ!onkͤ1sjN! ~h><(~ps7uO.h)DA~ ~oGYۧQڵvCZu[#x#2tNo'[^:t{m34URƍqFզӏYݭ;ȮHqxG/>Q^/vhg2o@~?aOp9pB+@9.Irrwp߬7ZԪRjݸN~#5w9ZyEMx ~h鱽ck_I&7alʣ q+x~dߒж'|DMyG9i<[V_=z5u"ip^b7OoW['޹s*&]*ɡ<is<5biZBؼgO?yuS(ø=Қ47m VjFtnIG =Z- }@rr*!$88p<~{lۀo7'99Նx''xXC\{f R {o@At~ S)f8l 8|ϡrl tc.xd])cnD&Xo 'Z*7M7O|$#@O&@فEhzڕ.7R .Y~Q=d~ļ/19VJPRnC!%%]~@vJ;rFop0kx-hx`Gwd@0 K6R \* A'YA7S\ԡe% POap|-GłG7}[F]h$,sJ$8n L0'7:P3`Z-Gu g2.%=kUP78]D|th7p_mE!JXX?^PZթ#$%QJ}.5*NǚhrJJS5y.Oa,Ŷ%PqPOoM{%pǁ5'WvҸ5U0fړx)咓S{5y^TW6lA 'ʱ5^Y|_'0Q]pwڽ>'c3ΥP@fi 6ᥒy:-'ƶP%I&vuRQ!%'+o69~=c6l)Q3Qmdk9lͿاYL+ *ֆ]4'KM|Tel*$8SrRAY"cC(p!7oSpǏg PQM]N]㳆F ߓSCx2oޯ$wu S;oL뷵=?lhOIɩ!A6-KFUԠƩL7kfg:\FSu;Dd1{#*p2׏GlDZXXp76ʤmb]2sXISz&´w46؍ oP| Jr\.Sv((.Xq̮xv'\Uơv7[QK"xpe؀3+ ٮdka7oPqrxQ3uw,f]wRr˃0y# 1ZE,KJtlV{Fh1> WKl&!L0Vn<&j\KP& Ϧ!ϭz Ik6߫x"PV]s|x[֟ihɡ{M qi|&gFyˈ@6=s+b%2c. my^aM ^<R *_i$ܢL-¢:oE-7Αk뷽Mn\h`^(9CO,gXm aSwr;\%1wq%<6M ׼*1=ű!kAgm 0Mdg|*L|~;5.:Olvޣ('B/|w4;uJ3yС2.h.ǁl ;vz{|F&0م m'uKC$ -{ wZj>+] bXf;0+Y6DZH9(\p%؇mO26η] jZ07,]fpXm-Ohqbɸo'/}Њc֭t]V&ڤ-Ϲ^` v+FC3mp {_:0qmȶ-7Ufg`xtgJ- 4(p U|wI۳Sû~s=JѣT'2H!bsS\?ʩc/X3*7ۢ#.l-f7SV7sZ(q1xE*yq׺lqdܴƚdЌEbGDJzLv[ J> !mWI)X%aR}o_n^>eٝ'iy P _޽KP:j1ng⥱YŁ0b};`rkOֱb+z>K'Fn?bOn؎3,-nlXxk6i&}kS+'E)K]VK]>l+bO+!mb/}Bh S׭eC^;0?ϖeN dĪO ]%kܔM.=q 0p\Lϟ? Kzcf&^)<}z};iʠi/f03nldmZ?k,ގ˻gCmݺCVMglŁO<-ƔeAx/>j. ĶxYiWrXw }<+Ijl1o93_?X*c8yq;~[vıXk~KNzǎlWg3HfŁO<ƔeAx/>ZiÁa]ߐbH,~hߤZ2]߇R*"T*>I3YqQ:+E8KƑ{wq{=jzӒVGv6>  Sb>V[╝Fb㌾KX=. iթⳭ86/lnf 2ok[SϥhJэ=*+/,?z( v\6v+7zfu~^rinzH9l1cc[wi-"itWߊb&S˖:"@J,n; ;{V$H,ہH.v:jybf9mΪIK{/ɓGw~\G1F'PhtCF}%QZ  㜂l\ #tnYa¢!ySѣBeVku<9|bB$},Cu\O0jrԌl:\ߋ&uU@ ks"L j&KtX%j5jXFgkn4֊tGgvModO:o2g֭~Zm`@ZxjD`m.ZX<2,Ȗţ,gG70Ѥ0uuZ,OmVKL1\*Wx/㗿?i/U5BLM_ -V[ƽ)3X\Ys4>[Vi3G4ŁO<HHxO,EYd">>r\yN"_CeQ IENDB`tora-2.1.3/src/help/images/chartsetup.png0000644000175000017500000013776011303312237020135 0ustar michaelmichaelPNG  IHDR/*W pHYs : :"tEXtDescriptionWindow Class: tora4GtEXtTitleChart setupۺ IDATx]wEү6'v(I$ET$g39{CDPt;Ir(9.ya#/LT{‚:]]]]]7d55[ZdXO>^pd5`&C$Z4^N}6Ψ+,]Zϫ 4PlJYNJ-[Z6UR55SII0`t`-zFl`a‚4/$`3akB @ڦ;^'\`' q5,rZ%XR1(e58k쀗MskKpH)5uaE=AO9#r{UAz.yX6Yd-YuGp6 {#t+tH>6 IoG~j|P[QjNcD)uϔr`pl2&R]|ku;W@0+(8H` ULSqB4MK&UUD\4 BRV=úUUNVDcrks/b aX:mIՔUԜ:p rH i"Kp5RbRCk,hY;ҳӢuhE9I`p/hudw,V0eŊcg8+MTaȿzDs:1v3EbQ"(O$Ka;ސd2YYY,,L$ܜ*5wnud~j@ LVWW@ ֈD("hB!FqQQQŴ(*"tnT)^ )[$!D#$n,(),(h٪UVV#Rz!#?שAR!445u8;F0l0UHsk4${(1"F7nX| [i:L1aaaVrrr 8LIJh,VqIV22񌉝NHix|s ,LAAAV23Ii$.k%XU2H!, N)<6 $YoXj݆aB233:vxH.-[u3揜ȁ Bj`>o^՜QRu$*\pVڶiRp`<ډٺek0 pKf<|E`k0dsC7} ,M@>U26{,c[SrS$xR0RْA!1,d]J` (P4iLP "lLD%N%HsS(Bر}_\Y.][j:H@!dGَ_]ʤs-[%@eie;<b2I&ܬ UҧUii;wtnѢ) 7Z@ ~Ep2'0V*Ÿa4Z Pa"[lizQO&H D⽶lJ7͛BPUuՂW\y޻7s&]jߛL& JJJ̰¶ b%BX=v"N!DLڮ;)+.$\pn!\ Hv8p棓`R@ve#9$09@d )m'ؐd7X܇d֊ fFȂ2BH $6f%W31 1%8AnU-8R`pg8WHPsֳTt\-`:+\c۬u͛w}ժ͙mf͚qW39woޗL 5mw0@r|/zLZPh:Unc*?@j֝{$$n]ܚSC> WJi+/[SNٳοڏ3vڵW'|0 F.q`nup|J>u\I U8)?2nw͇lH!|=8X3ֶ0 IfK(:8 V s0\Z8=jd0R%K5pl0.+8L˺u ly_hPn`hac4}fhd :MmMӸ2Z0委il*S(H2Svb#zx„ a[SöBu+N3iD#6HXe2i[}(V:dgT.hVte:v4]k{e+? /L&0]Ym ivJLlCqaaQ?[lUT+… {Ԥͩz9,Ȝ@ =?n5\{{{>+).4oºX$!m݊1<UU[n>|TԷw_\UU M!4|;zk@Dُ~\#ED"…D`CKޜG4 āDLvzՒ7_Yhdw}] 9t g$ߢyo'R/s=܍7Ԥa}gwynNET~KD"!袶6++K"E"d@iVO{,DBŽN ϝ|֔Vwkj4湛bK4V6;ڹ?80cϿoEu(yf~d?N+0$i&>sy@ѪI#huw]5pǻN_ѧd~ϝb]>qX}Ow寎A>rS oºI$/ uqݜt7:6r Eb;r\Prxvd`sYR`$(epWI9}B#. PMS$@b:an8DE$k=:lk?iUܕaܹ3^ѽ{䫯7+L2eʔ)~aqIiS-(Nuʔ)fe@/q|2tM굥ߚqO l~m̅xjw~.zch54MkCC ѡSN:<ᝳC^5bBFyUSF_yCc]Y`7V98ͭ%_4 mP`/lPqMp'30KKS1cqjay 3I 0]&28qbnNΥ]MWԓXML(mѢŕW^9i$&L2u)S&M0?T͟SN:eu_?zfxz$j YL zCr+Ǐ?oy(pEeBkfM"fɻm j.ԫkuӳ+뫊<v:gM8O㡗^#coZÚC!zw@0mmƺO9ޞ\\sHڏ?icBYB%x\`t&B \ʏ(x:18/K"k28c Np JSXGiB2 <= 4 Έ2E̶PPtxm#SB{[Aisիw[]y/`<ʸ̆chn\~eG֩S'C)$lNPGlٴ3d99)TPHlϯlټyڴiW_}Ygisϥsύ>Q"&ɡq>nODn^A|V[HK,9ܼX,D*' =+x$#n1[&o<=eFII~EA\*¾Lcɹ%}xYU?M~ϕ$h7.Gw?专+zF>ܽ(Tw\urNӾ=wMo֦s%J@%^2Ta +fS@YS<Odg@E|L ͩ;a٥`@9Þ"a]ca JR9߄ՄxP"SZL0pfdQߺZQ#"NA;g!!dRL$rrrLWֺM|T8y~ʔ`(ﴎb+n$ɜ\I|v1i<ˏ3&yyX!'I.I֭$NbK~;U{Ѐ/T Q͚[Iݺc{laaam]/2rqyh9,7"W|ݏ:HEVq+7o*q1XR#Ȃ .\0hliH4]haoą$*k~:G*s6M.! [OPD-Yye?M#fa64 u5%5v4.)i@f ׍q{R #n sr@a[#%u/ `0-?"CJ -\zvܙRʇ@i( G&A# C̩BH3aL'цr&dzp(XhyA99Ȑ01.L"3=/vN;\ye&>%%`(ԣg/-OtҺMp$LF'vl߆qd =/&7 S ).Ŏ;j"6/?yº3gWXJMB2a␦#tisιHЄ7=HҘwr2Wk wBሄpJG>8t]Ne~g?HSR3eդ@Sh+S>0 #!Rt=+OtںMH$b1n2-b K D(a۴#?4;]͸-H!Ia[TsT(sT{0P=@>ҹK6m"yOP</۱a(~#ˍͯ\J?Qy&lfYYYHl7|n0rrrBPv_XPǣ(E֑_;ejY[db-:<%TF;I;S%b q:VWv5U5ɂ2v9uړ!D IDATqnbM|rl A.ē쫶PyzCF>ݜ2Mr,C`1 {$&f,UniNV\?<.'EnZ _%223+K&Xc$ 1tW2B7D"F')$u(=3a̻0̒t<|mm-˳T+{/l45W`x918}0ePL&uuh43+30_T{w"` LN ̎ٲgA<)X0pE/'XIDXNj*y([30VIuVj K٬GpEZ'؀*qحdZ#TP NycZ BBb23up2BH]]ʀR>(D2 %ZM@8f"Y3pR#mRJ NFFFVv6ukj戄y7шXz0:2Ţьp$GI&uDB4"~PbE("c&ByﵳJ+1$,G+``^6h cL.kHĆKlf7fԺgqO9d,#fkQ5~ʴJAX@<$"y!2B@V(<%^,bGV4ON& M"o&Zv6?T"exf , /+ ʻV \`R \]X$M p{:(%x,"H87]Y,3 r # X,#yyyyyy@H2E8X*6@ٜLI222Th]wXc\lV$A4'Nk{bbX,LbE3s ,:02*b%FҺB;(#ܩQwnM4!8KtXحدfPyI~lQ{){"?a 鈘,C?`i 3˚8Elϲ*ZJ&C"](edA3B`gxw<]"kѕD$1XCK fh*|PfR qjdB`1ܐڿ!y=<ˊw?"ʹs6ڷn - S ]3gC(X,Sv r,y[1" ѨTq!(fBW[iX h4.C.Fĥ&;r!ĺż?Nɨ&!&؅ysJ7nn`01GoC %XW Nv1Y\^ +bBJAȊCZ:1ݺ{>LVf4ֿ -)O(BS>rvp-r|?Yo,"Z!#uNBgդbtO*dDbv[A $ &I潌@@[[h͉YBc1s ټ @Ә')~l('FRt}7<93$s:(湜>6Y7Iy}]Tȃl<)PƄGLvsG19jэ4tϥmijPYG Fѩ݋Kj*ɟT ݁JX@uBpݻ/PλxVfX}T֖ܐ?88wW-_YBϥ$Gfop{*pE%q6?0iPOS/~FPkg 0&{,z)6x",F5w 0T 8!EnZD$T`hNp2L3W|E]Fh N^KR!qɍFz=6aXCV%KH:g܇l 1$ou珇6aBG B=_m A F>FfNDd_Pich>1Snĝ9@``W6 dj9)odJ'LաPi::BT, \+0gJK8hR%ǻIqx9V'{;>{N2XOm@KXጱ4:":w3tkN$%)f9R X5*%\2[i`8#F]8ܛ8r S+KN!q!\Ϡ\%G/ݙR/h՚$o(Ѩ$&y2bNLI6D6*)%gݕ%(5Rb['֯B+ xi)I3#w&TB l0^_ Q>p-aOlk^@aʐ\GMNV*29@&a 55auxpJobn7ts)_Rȏ (ŷƁK!jUʢ C dHH!`(M0,qȤFG#<1ɩ59f@;Ou\v%9x/+UV&8A& -ʜ M*BV_8];JL2)싕EGJ:zt^4VkԖz(C y BgCbCYD5a9 x" ra(Pq]qOuȗ^iܔ@SJܙ6Q⪶">󪇋w:Mُ[ndwgޟΐT4$oaʲ9#PrFBwpDI^Ra8:`zX5UjX8,z5O@ u\SZ\t@HYh/[u٘$!bTqe#ӾA#*Z/0KZV?)rq!6Y', )=Xc@4g(G lr[&2a!-L 81.i آMi[ B>,#ɊRK܅åJH1^[N&U -;T X?X&s <'F ;98XDXʺϔ $ >N!`m`>o _6{SKD2 {aB wXM4eȄ\(_C&l88x" i*څDxBe}CvJK؁!7qE,ُCK{hDp([9IL5?Un[ܰǹ %{+= @k*Jk- i/Nֆ*q_rA\fB{\D~!?_4E%n>` 5 n1t ڑ2L|6>xȲyLإ&$"HlWMD&Aҫ1$uIŖ =%أepen!)s7$2er w$㓘0 Gc[ _S (aBӀs׮%?TUS4M(Q;jӲ="?d1"A]S)᯸2ȔV1mr IH:gӷ?q .7 q 9Vvb!A +9et:%*},y|W 3]GeiO!QˢXOa󥫦0>/^䀶m[Sty7Wt-R.K"a72z׫W4ls#%MmF8JA2PPYYYcGfff0hJJ)Pjرc;K+V\zu^JB)^]]uH.d^-RdOvĪf _){!a/# 2q@ q<""E?F%+eTUX14QrҬ,v5.JSjVGͷDKN̶ڭ\TcHEHQ ͺL$` e:2{Z'({);0*~DQE8GYon.Ud<)/in:^bAA34lU0ys!ZuuM4L&VI΃(h4e9L+_ڧbΉL6LMi?R+s2ly:yB}X4t1?MYۿlR~`;C+r5rSdNNNDt|p A7 Tjg؀@jn (R;9@1}: ~R OY/SpǢh_O|BNr?0IA_Z22U0}ij(M)ZW;T>)'bGHStpUL-5xk0r3 ,wD@xEt+ue뻄ԳUR,w* )̳2!P_pբ LنhDy) +@ pgE %O9e%?V[cZ\d$\7J'zkZpؾ].FEjH03Ll/R+g2~@5 s\ْ ;+b()&aaCqS.*gCuNzoC>UUB WIڳ6YЁ\Jz$c xZ ǐPw9ضM(J %O9gJI In<+WOS<]s4pЛ>O=ROYU(Ui'n騠t`C:pfr"%,hAvC@[u SG_w]D\EUGVycz44c8;)>699~y,G@Z,x0$.TXU.>&?VWک$DJy%RbcxCe&w)'CT pyVEA?v>.KZ~}#ƿZ` 0P?}4g6J]`(:gӤGV1|Y?x CCir’S7tPڤr ͛U%%O9eظ7|Q@|71_ǎRݪ7o;{؀>w{crF튷=! >wVY&_y>pv*If6f};Y7gԭ|=lSN9j/zU?lx?Wm֭;ov  C>Yf!uڄVNX *@9U8>re [m/~VACJgtW՚(Hؽ~YhR++-x# Ri<~= +}CR6UU_g࿷&"O/~->~e&T:mG~p_c{SN{Sv>{eu-λd7s?]sȠ}vu3bOh}dtlU/u'?ׯ4v~`\=:Wsb`7yGR/RM)wpOR7)Q8ѸH@xGRMwᇿ޵{+is =ag𞽇ݍ1Ji|G2@|ۜˏq߂Ne]IKii D<%z! Si8M u"`ra i6Txπ/xs*9z8@f >,?# *@ٰ CZ1mrm'\5]jgM W/Xp5w ;tPQ0*~|uE6C 5;ƾyFWwH0m9fel[@$;"nYn{mӥKvfg$g8`;O!]#19{^PP\:VoNY]+}κ;ϛ>o8O;^؛>1ob>zxPjm9yO2gTo\!ϼi׌hӞzxE ߔs)ZG ?-1Al$xDYJWxS^F&a H0S3bu~_4^0ل :[)[;akVT.!Z쁵:7֐Nyvo$༐T^d){䘇{c{Q;u{P LJy9ћVJ/RӴgq@͢իg/+߼cq=d̍B q=oC@G;S]c1~ċv=.D0?1ŅwQo IDATdk1#l|P ngͶtj%ӍMKdPn/S"acTLswg)4Y799D73?躗'.j$zla'حJ~1JA+8|A;OlCHZ84 ץ|ijUNJ!xFIQ*]+AI 37;c?t~n#grn-NڡrIES9|ꗋyĎO|jQgO[bzԋRJ)j.nwf҉}5 )r &v Ẁ9w(!LȉX)w4l-MJS`R++BvJPz!J.H\xTռa9[ޜ[Q+OㆼXسlNv97G^72!Pt体*'>zÉoBfӃ~aC%#y`mt֬)cNhbe臞CvӤ:FJ:M\z̿?sg>2]BSb䊏b9Xo\%x* CHj8f$kyldS6 UyN\O~MT\b:k#Ny|MW֎R\n5@cL_EBZioR~g̡P(<(#CӞߙI!OcWY)73)E7Fhtw&4IBq01L۴<"=xPPSȞ\OKr^M89zhL]\~Wy͞VnӞI&5Sj @0eaq#ɺ5އ?+5M<E.^Q*#+kDrƺDU㺐$brԗe).5?uROQY(P4Tϴw(mּWk_s:FE)N]^g}Tz?(QVsr@R^$W=HVc:pM*{ ʭ@0&W?xoI:vj@+|b)0 ܱ x唒BmOYn$Ror(7mH9H,qVh1#60o|QFF {=͛7F>ÉXPJY]>={}=?Wx<9{zB>G# tI-X$S[$JCםmbqjz3OAyA`=ztdG:u[Yɥ~]U@~PrM/o(M99LBɧ=@n.õy/L XU${5G+PO0"ܨ6k55H~\ܳMKyȌ{ȠMޱ˯ΥAU?iƣ=&uuxՄsO$J(I=RܛI~: `΍ (<Ԅt:JKA(=hVCv?.J@!O>IyeB У?ٰ38lh9={vnJ.`[e5/ Y(jvVLqOkaշ@ϫa;KO 0"[Z:rHyw,[Ss pqh=Dg}'ȍt`oް9:n[;Ë~R^oW :3Κyy 65:0fї?jZq8b{ϴ[m{gNk{>ݝ]GwszNԜ8iʭe/Ϯi.b샿F>OFl.9kjtc~=pUIz̻j!K׊^ս;WM&mxҝ:еWV~۝o !SpTOD!p!yrdeEIk_]^}+>OQRѡ;uQ:ٯO>^=䅆aȠFKwz^;嚋ߝ_\Tӟ=u.?عPݨ>ŗ1xk?WvOUE-t:~Ui@0?HduEeNxo. gwo/ HVuo}ħ $˕b4:|'=u.0~}|m[Oz{ԭhVc"QV:1#m6N^uýuʢf{uK JZqLQӈAnκf6kw=;uQQFO>x Y[~ցoao,;u޴/~Ç:$+g3l^IK\Cs;٣rlNb=mRW>P(0Cηdmmv {  z_Zf|޶9O>ʍBx<77P]j+cxffD# O>W$m /;zhq$G%7l(^idsk'|)En ^ֿLJnoH@8ХO>Ӟ&#pV)uwR`#A(n,ks(>M~?pĺ)gv7~}B.LG٫O>K7j_3J:U̙]jވbT,ziI~xO>O;uF.=ftuECn7*\#E:!]MM7hti& zw/8wm|K73|Ps8$6z3'VK޿XXJlq1uK;֪XmM9yŋSrq Q{;nps۫`>ߨKܛuIDسcC~(2|7$}>ۄpS{{kǹ2BmzٷL|w>q 5?•p{ߑ!gX ;Rw3|IR5'?߈6;u_T3 3}Բ 1 eg~d5m:tу%MfTD۷o[9gC @YvQ q/}+j^z܏˶h55[Ɯ qάh:Ր+` ޖ@j_M rsN{/9lT,^NV '1_#ڸ&a&y#vpCTJ8ƙv%Z~ƁwV׬)\Щ߿lZpMO`گoߺDih]e]Eǵ"=n\z/粄mh+WVM&o,!z}&[Fx^߻&-u_0YcZrj/nwFϭ܉[lzKfyɭXa&b5w`Ҽ ?#{/i'|گSxϺr^5 UT\\Qqi-HcwV$)7趲y!ѧV,02scfwmDzЯ_P^yɖw 5]߲bK]+vݠ`jͧѥLȲ.h{i}W%F#+vmvn-"?tGpQ+2ۮuhrc:;+_Gp=y6Pt}O_s 8gm8Orj{l%W.٭Yy;0H(UH:L^V2:[+٥7١c& ֦mI $t#~}#t*x%s{9x%?P^N\Cdş}ؕVt̴~b{>g̃Nu꩷:O>A<<3oۼ%?/P9B=~]Y@rӲws[ϭЕD3x3Gh|m8z^姗1zuCߖd9'O6h͚57'-Hx{hڵk߾EoTp?M8i.֬vݺ:vLղ.F>OO~6nhYW{|'|r?2:v{S;ɺGChȦ?f}'8o序^36nX׀>O>PH8qĉ# fh俉'|ɧF&ƻz'|'O>&<R^A~nO>ӾƻD!K{d@ؿ~O>FB w:HޡL.,>O>i1hT`ϰ9iCY[R l>O>ѨjaIΏ U($O$XgH>OڻhDvߌ-!< &qtRydn>no(UΗO>gFQK~unLD2;+`׌i(IdB'|ɧ? ;cm)Wb ;@-Ƣ)s}տO>_FR|%x )@{گgTn|7W7u'?_p|ɧ?i^ӻ Fh{﩮lִ'Jk|]:mX;lۗ}k]04/) J'?=is︻E˖)`1*ڍe y_RV׻]q/X;׶M|}W=RƁOnev%3dRQ]WO;ӧO쵓I*^m͈>飹~ѝņ#[>Ox({ [Ycg}V^3Νmݫ^èO(0ƸP/_ W.#lwM|󢖩zkKkH~|fqѤcf|@X#Er{mEOK==V=:&σ}'J)PzđC-';y7+3󰞇y<JW{i-RرFƒc|#5vQ51*bJ" W|8Cy=챷쌘9^14!Y\0UI^IYPrMI}JC=EH$+)% njyLwt?y+ENyM[0x(0 Ġ omw~8p3NK۽li$9yڥL S.SipwG,ܾ$ŐJ܆PhTQ 8r8;D9 CูRTwrv2pi>Ix/&<7,o r"1pB0gˠ.ϐX1PFͻvƆIMxg9^䃂Mûv5j"2 6;hhD8ZfwrΝ/YE0B69~M?z;+ݔ$Ԁ.*Z}Rߢ^:23ܸ~S@GlC͐[!~U Pp8{5___$_?Z[޸qc 2G#Tg%qgOF'9h6;-$@|X02ybJ5;84Qbo'^g23&j{h4xU#+d%^][r_DO oA7pD&0NomM.O圲O;EU#!ݛ\bBmoql'@I'|7V}~uYMW2 y7@R{s1`sjDoZ0 ۃh =FlۃhJ72L+5eg_J gxgx.}Fڶupp;E#K&-JW޸g#*P_(7ovM g!F[x9L)Fj.)鱗 rӨ 9)cǎ Ls-8, k8H(:;;+ [W؀u+W)=B|>gX IDATab@U JuG[B:?>W"A!83u~#kרU.u:jYhM"J.11 =鞟:|:W5hX7QLr\{i֨#=u MQE3غBjSStxC-bp8t@Q7AĈm] 6SK=u,.ZF|>$) "I洬j)9k8iZjFB1JE^^aEQR mzF1|>,hdhXA ^+Sga8`c`]Ƣx]ܟh=Flۃh =Flۃhl?;ךg!n<ԴFkYW__l.hZ=>F P9U:ש2L DqTC152cȹf250ۢ{xiBT՝OFv'BH; t-%gw |{OXT>}=P!]Ι1ݻtX6/37;:쓄bUIӣKnNQá W ׍8Q# {Z)Utv+O<+j9۵gݷ 8e5`8}rʥ3!.t >I˗O_׎Vmb`lA~N#3% C@7(I{n#v hbnÃ9id\]=AB63},kS֩_YN1 bٖZ+DK#t!㴖s {.5cmnF\uKw\|a^LVF;uVUڢPjg%r¾(ϋrȁ0m˯ҥؓazer0FBj(""i˅BF+C^- Wb]5d[0[% ##<!FфP*$ٗw{/%mee^~iƻco,'5/^q `eBOm50S|9{IڀB, 5g@nŭ?.i^Dyw-ɤۼc8GޥK`GKVUPk5Ո-܀$Դ@R*j W\a_zHJNnܴY-׭J~(==qc? 'G^,ZJƺ5) ^%bL̼jcgm#A4`{D#A4`{^(B P'A`RH-E#$Z0}.^>r&@3>EQ E˖ET B_>H$a  +EQjĤ .y/rjzlG1P%ɜu:-S_%V((ꙡψ$[aFofW!^hSU"СחY-eMV+ 4<*\Y;E8G#PXt}*o2.Ӧ ?qdӷF~|Ka$_4ykZtmd Utcی]7lcd_[ܥG)P/??-|)*WHöߌ%04Vcr0g=і˙%qF80(zaB/Mh̫?9t-#C?ܦ 0+>pf5{ +% gAc% 'O k*R@=M_Ͽ{c HLKK֭B*?$UVMmf<իܩ3\P(|ErrwfknG32Y>8zbmOMMeXlVjj KP_x0@={@̧gs8 ^ް5J%3-Z2>=l@*%2|>DZǏݼy|bXknڈF8K$V'"A74b 0>L.Q&%!oju4DF(jz9g<Ԣ2# mʏbdŇ¼*˰y-jwhj^hڻU&'''8c0 <3D";Jǭw˕ʔ4OOTZcl2,%=X$u]@m({FϞ=kڴ@ oJ%@4E#K$0#*2绹Ŗwb[AA疲#S[Ud)lZ HU@ fcۧjeʋ*lYtЮĴssMsFU`s6Fʇ8 C`\GP_&Ewi{xB/.jmRghDώ]rgQ:h@}ehsH+ӗ$a!lRghIJo!%ʩ &u`{6 j>7~bJJ}f-'9C꫗Ѩ{jsAր >p \%A9w𝱛Ύd!֭D^/'"ijW4MUe3J䖝RW"gI?J$c h}TKuP(0i\rl]`t݈a+2N' *(JPQ}T{l6MZ+a`tm=U?Fӈ*׏a1Beaa8aS&*HA8E \44M6z멳$0! gA)fh 737Lcgn iF:C (7ZmXZȺQ ڟ*bhahRw]#+_6`5f0 ޚ7oۦMDoD"9)ooU3š0 ch`c bh`XO!X$ahAGhh<^֭szʡ j 0Mfβ_1hA `"M8bCGeefg A sxlGh y&z9ڞ:a4=uc\x#+Gx801a 0OݛϚ: }t1 !ǡMg@10p4oa@ԽA4`{D#W20&5eA핻Fm> jcgn͆ ge4"I$IwgF ,e}v&BPRڶkOJUl>X$j; B!(kV"W* =Q$V+MLI@0;+S*Z_So2UyLMrY1%-ViNNrxX}f\L(Z;d[ 7KW")Jzf,3 'IFCS^E+^qع7:q']KjXZ>3n̴i#BEA `+VƘ:,>L(WE5r$Ûw) -3!Iك${M%,AwCZKK:0G 46Qaw|;_an8T =R!6!=?K MZ5,4uY70"WW!z|`GzE3S~3lԖrg:J5;;>i QyWlϞ>ߓ3Wr|wswL)͍ڭ];pJ=7ol+A]_>3Ng(6{kƒO"ՈF7L#LusY7sTWgkKb^];Kt90lb7`;I'nkVKVH*_V7* gv$zv!AO^)BѼ̀tK`? 2 7Y]gk-+Q:fB ~0WOdj[׍,Miu1#`b7[6[:!XB6X<2 T9ŸO*އKV n 7wz@!iuܮc}უ^O p|?u3$zs̶t8!Di4Bt3`/!;LE!D?E{N i~cgji \!i }Jݺ[Ш$eb фP,$9W]#YtB=|cùN\(]A}An~/1m)'}N˺Z>BحgSB&/Ƶlo6$%X/v̑1ԫ}̅ XTSϿ0jcޟk0vJƁ Ǜ:5"DYq.iN!{q'Ϋcp<&Ȫ1X6n)3!¾FEsÕm:ҝ363=kb!Y+[3lU:}&ǯ۪o$IV&6`\s>0w*%x{yx+R_{^Ɠ'~O޻dMO)))laa_JIN"p2qUn`&Iptt6XlXx'ӳ!r*G# P&;yDV>'=NbV`5Wq<D"W \1 0 E*siY[9gdbl[נ:+]W"7 D^*[g(h=Flۃh9PlT6M +I$Iyx6tppD1 a‚L+0ŚAQJn]$UbEbqV o QD#RMF41'Gì'RԊ 3 BtS^*Ҧ0Wɫ!M[@]EEOd!>8mحIj!NPjKh&D?j/:ӟN9!}z4MɎSE7bŦC놽d3^cD#;_fd߅U3a=hټqCNVT"3w<}5>݌B]Jd n*:t.wn#GO53R7 V#('|n$R]J万zɸO}nl^~BlsڟX~[{ΙFTPyV=zSgNsه&EחCl+" 5I ^o7n):slz~~??9S3Q4ՈF gڙYi SNmѢ9b]^-?Y;ё_ T$9+&Y*C,P fcݣ .ؚ~Mxbx*| IDATV$ĮNؕ 7]Gu4/zptެ:}W!ACz8C\HWDjg(IsF30S/3+-b}wmd4~TWW&O8h1`Pa,N˾ ('p1W'|& oݘ "I.=4:zISv/z"zJ>K9h?ի/Pe(uB=Ux`mGp${jٙOn\) ݣ&l6]8wۻϝ(S|ME5kղ+R_H$rqqnU0&8.lF1 BWoTn|ǘ]5" `{D#A4`{D#W(}el $fXH$Ió#Ba Ì>dgeXzEv%IR*6X$lpP sx0ϚhT*=IԨՕ&&$_hD*ZQ^G14-+\zK:Y.W4ma)#~GYY㵗U/[3VR:ʚhjtz=C39^ﳞd2IRFDFFbBYͳIR5! IΚ9g|OLfL\.Ոeo&TݺKd- ΩdVYpB.suq۷2)7I>GS !BРeאҒ&BC~4(> 3 BtS^*Ҧ0Wɫ!M[DZqI!->4U.k"Câ'}w2G ~eѸac7͜szTp[^)8uʱ ;$|iJ> FW1þthݰlF3w|d+Fm3J2BҚ?" jf 9YRdnf,֭kV|ϻryd n*:t.wn#GO53R7 V#('|n$R]ʣ ..f.rž3X( !{GO ʤ/z,{I׌r|w͑NM)_]t};ԑ?"9[4Ȱ#x#Eg>ՙMo8hq?u$xU#1 bϟkgg C޿wG(O:E1ӟ0AO#ztdף£'>-Ij%avo-Kv"[hYTz4,ѓIqsM|w$; ӓ^fqռn\tNsWW\xA(Eys2i= 櫀 uZb 8B#8cDqIc1dC{.IE"$lK!!IU49Rzb,@tgoٻӍ#||8!!?Ys"UM#yC~8y f&*7'pGa&TPamGp${jٙOn\) ݣ&l6]8wN}Hf O56.PM)))^^^-[ۺ"Ń{w3<0}X۽KִpHIIfC=<= wswu7JINa2tWn+(hk}) BrK0pQ ob;w6l g/]؎M_2SxU9!Hd2ى'}ͧOzNV(kVo$9rcqKG7ϊ>}g*Vd]&D=gt,Q}e^ẁu$35(ZdZnڴK4iT(/[Jt @]an%iً䇷ܒѥ=f_ OYGhՐ!+QE7͈ŏ/s)Ǿ6OW1r/3/ 3 F YlF!]EEOd}|EE4sz\FQGoI/v3w|dgˡn~U/6`M>,}U,;da-ߣmc64{}pѢC_ӧ{cPkҖ~]}`r!?.*ţ<ts 駆m˿ޡ\D?ٚTqso"W?{ܼd n*:t.BY[:ύ/ʤ/z,{I׌r|w͑NM?c9O޹x#Eg>-J Z@TTޅqޟԙS\aGi&?X^< ɯԸqN*..t"BhРۿرc .h45{1p|]_,}3'(Sbuߩ=0l|OO.βo?dJ{ ^1C|! @_;] P:lRxc1F-}6+&Y*Cq\;ٱpkAEϮK 8XFr.[ăhYm'fj Sie}g SN8vvfNU6 8m`k1-tO}rPePspQvMByN\g骮m$Pn˾#֭k. :Hy6Ahk%~CgH<AH_COUD,N$ 7JωF !h(dΥ(vK+&_}m;G:m/|+ BBe(3}GӠofEΛt[O * 1k #g!iLjxqݺuK/B :T=u"}+9)7]ilw?r_V.RѾ„o.0ᒶ# ccϦ*(hm^ҍu\fH3ٞO*)Rd=H3ymTB(/$\(]Ay2?'KYZ,J<[2L;Yt?z#x"4oy;7ًr54bOc{ü_kD2n8y9:p`!}4a"zH~szTlOnc|!}A]peWx˩׼9~w+!._/aչsV*lmk}9p7 bN,)hr٥G6 yn$c1ݏ>`㖉&2A8̛dڏ".=52ﺼVJS#WvpZ R@\[?[J㻷`]k.%K?~YYY6n Yh/ :on> E7cV}okt$լY36]yhǏK.C6o|wsXzlnHJJW,݌'O|}-L&Vvբ˽r#]A!F]Nn@x%KoW/YZ6VYS'llvb;6>~Ʉ&|;P7H$?E m x}Sm] aFz \\\b-~ u`!\^7iZ.p 0fj4ŪC_$岢:U+h#BVi*[WF4ۃh =Flۃh =Flۃh =JeFV8a ԅga\W#OHd0 CQ^7faX?9#ŪO//TjT$ɲsr<=kna0bcߺٹ`tЁ&* ,*΋G*mFLDph/~*OPU=a<߁meeﺾkwTL3eEwi{xB/.jM^K/" ܾ;FpFuUeL=Np覨#kO皊 ~+GJ_xn:mxXs)4egUr7B5"[};=0b٭<á:gٷ2ꏓZD+31WHنo2{xLlrV%J:!؛G Vud/? '/!hLB % gv]s{Qn&vxt)]3B8fJ7!P+c<;vIsڳBeJ ˜1#F .}141#FxJ{u,3**| a\e~Ȕ70ȪޘP=[;UО#p۽7֕t $~:pd(ULfTz E SlIRebCVއKRnݿ{`դ/~&NZL0cVRcӑߋ2u3;`&w[>6NO~ρetsݩP@!sH+3a!J[HHJJBuֽ싏="XnݺYQI=aPeC,=w#LIDATxU~^aRab?زuqSKnLyE.Zg0'pK~j=C%BBsu;"E)Sce\G.U K2L_g!etsݩhNђ CZNG#D'O,s_IϬ> g땑H$ƍC͟7#BG&X^E#®&/D\۵ᎠGxMe|uomdii0۲Z~46#~3L=8SKs5kސjA^/Ev]^.qs5ۡ:SyVm;5˱ei+r2Pty׷\Fl;Ng")hr٥G6 y^hCC}rj8næ\Y!d-Ygڴq}pHȢE9,mIF8Dy1 [Ҩ}FY‘ة׼9~w+uW*lrwaM\kdIB " ZWPQZwťUu]mnݫ~Vź֊ZwjՊ ʒd@$!!"NgHsf-RwGOe[7/ak2 ǷjՊin2>'BZnpbQjȠ8Ͳ,h24MKȡ!ܶ͝KIOKdl[Z"\@0ԩsppp.]}MT<"ɱ:Z$ʺI”<ۈṚG>>r܍1hK-[,֔>>>:JKK5ǙXaaIeҀ\-z㗩;ּu/z/I!f8`;K'YӣuxiToڍ_.ITѸKvV%Rp)A>>V#̗l{|jy^kNbO5lvjMt6/sqg=%hV3ZvcmC`>֍qxv 0W|9qw78x,w9ca?9q`6,V+0¨ׯ/]8?7#d8d7w>OkPXn_B!M|yJ ~`wtWo)l֊JޙClHT/,c[qdAjujRR>P59gٳ{! c[ 툋Ҵus@ͳ8lqlW!׌ ޒ+cFGŌyc BzcS~d1B?fRsi;}>c[1Z*T>~8U/I#|5oؔkˣbČyc|Of^<}Aу}&|o1C*+ί1^xw塛dW92jش; ƌ_6&&*zQgoȳlґvbk;1<^^~³3GF RҴeKMSox 8=5RMa/Sĸ;%]YqpԟoJ_=ėX¸+|9REஷ؋>iYK&hoUXW_QLaϾ]'HHƲ[c,_QM$A W&Q=Gi%X KiG)؛,owCݺu !ԩsgFtZ<"B͛Nܶ 覃Y3(tj;#wI_ћk~Wc,ٱ[y[K<$0o)y]"H1)i:222kW?_?hD ]"##vuN wo;nw1-E.mڴFW?Pl?\A%73۟PS.)3Y_R#E_MvgɦYE8+tsF?%rHE!R$i烟EaAaZ2Y2Fjjof.8tsiEN70ʧe"$^-KR5[]IhѯO]iEl7v v@I2FBxB>w{{_$F87GPb#D `H iCPB8HVCܴOzN֒]fmRܵV1V`U#fnb'o!RtgZK)X,!1<,la3g 71¸w/?gT!!NGXiB=h҈!JM {nnkIeĬ˖}5YŏZ1%W)k_]+hϬO?rq6#R"n$q,Wkʋ_{8,p%[K R5k^ {InT2JaThѦ5W|>diߘCG\ɹ#g[1A12= j+k* %j _l j?&hڣf+N޺#i٭mB&6\qժ,ѽ|]8BWDn"SK5;"HvJ:t-;!UyXJonʴ}x۟2-۴=.D$g9̺fq|W-qlBnQvxjwЃ߼9U#o#ėXL{?)iszavE^dmrŀkk&hloΟ"AQ~ 1>!]֭TO5[KV5|+R4} Bvީ \"3OHlnp[j;͡lPMZ2ejQ}>|6YH~>owOBy(nj-mIeAȸMŢ&]w8qIVÿM-d$B[Ƹgјt`HKKceV=z(..ye#&OݴnjH$OHutFWdv R?%3jJ[U-ֻMk޺)$~iwljOYԐעE wǁ?޹S_tV fY0ܤSv׿Y#/iZ0Gh4 iԬF>z=774$ Ćlص]6c䢤xAG6J=<+.rWDRTV9 I^@UE$L hޟeyK+xN[ҧokYY!ڒ18 Tz!9EVd2D47^HI ٨ѡ&n1QεIvp<#s* }ii՛^9sxEEQJR&I״T_>3=t&jR Ou6T*#ˊbt۰qZmI Y'H2--ԩiǸurhA6a,Vj clX"37$P(h2LfF.3 S F&v'OT!Jq<!Fh Ӏ_ 1l p?FaT\<#*@Ͳn{eYZ]B64pR$RADxN&po D"|%p?Fl p?FlW@c1yje4MSdiK(pq|@P!1&D"|*Fy#Fth˪JE۰2EQՔ$_A [jd#@WZZye:8TR)y?HcMudp6U NNcXue5}||t: ':k= fb c˜:$}^% d8T}6 kV;R{`h`0vW|z•2T-":k`b#gVSZZ⏤,$M:di=-{r] Z]Rs]A{f3~SĮ؛|]4cM+~iIY|M_sGN==FÉm_X"&/X;sdZ0F؜QX9Z27?|!iHi`米Ok}_׈dGal^=GgcV #ܡcc>}ۂƂ-"Ks\5 w쑫 G6u=}|E EDʁ˃`6㗙'yƙr% CUyێI= ?>xG!fw ."?kZՇϞ;{ыd$Bo~o|~ߏ*\KFzd#@ġ=<@JU\(2#^7'hz `r'i^-')Yne_- b4LS6HݣՐoJE#LY6IZ̝ף 侷tҦRlXQ&Sf?θgŠ{XBZLbHF f#p]OZ*5+V\rys̿6i008aԷm-_(.ş4F#yg _wթB G R!֯'rt򳝿Wҙ^ T<1%k m{(YsgoT̹GWDȪZZd#@cԙqਏWdof qJ yDپ9^Z'0BX4\/Ċ`q~m0J eBT%«vk͹pU#3rjD{2F{_=ɓF<U䬸E1ڍ?өKOyfE0!o71?0wPAz>3gMީSdI#,`6٘6T8F#R`KGF #w3wҩ[y;3 £kVFL۷lxXz˫㸜Q&877Rg$nݢ֫宾h́.-N&[odR[-{' }Uwd2C?$ݧ~*5|=R'HVP-TUUڵT:s1<|䪮Vt\KV&01Xd0t)F z'*&"F>לī5#z/8xq1j( j0雙iU^5Z3TϤ|0v'ȶ j#|c3)}j >1*ɕ/ N?ktAd8hlggV%@'lsnC:ƒ"FNA,vJAWs^oI}9>|.<(ppؽQ%܅1g.UڠQ_GS۱*AYA8Dc Gn'9VU)Z ڵoFFGS%9+$&iU2^F$$: 9O> }\i)TjL`!/|‘I0Qj ⏂}93h{^Y b@TēݴLEGC# H$ 8Nm6lp$NIl,6> S3Vj[> ݭ@& GO Xv J2(͘?9cO -T'=ƤGe0 L`bb.R~$}LKi8M)5&0 LD11L! okSjy\5:\dY L@JZ RQuUr: 2ڸ=Nm88I"QAd#7mAE:A At 3@A  A@g :A$($z;:@  `zg K$ |a.  /#A3@A%DܱA4's"d] j e0|}SS5 B ʑ'*_^)dv1Ef׏yGwuk$:u'?,6Y,<3<ݨ-)JNx9.r;^&[vZOO-;-}S.2$9DBLξ -;-@QE<=`ke= 3YO49Şd${q6MӁˁlP8)g'EQIlPB^GʴsÛ(2m3 4wѧݤPTzOxN{Nthz͞`=x \N"IF9tɣJNt&s\ή.}r4lsx{ sԗxaYZQX ȱUXL-3Dꗔ yj"~GNS]❧;C*NokVy>ת N}Pk(뿺*o&oE`pԨ5/9bkȍw*byٰ`33 /}(:=R66 G}D;;m&)v;&;224MOU]-ƭf9;EQ#ߍLj E[*Q<ߝ,ۻ1Iy9Ip94(~~>Νvzǹ39ɹ +"TJ}w==:JQ5m5KJprw݉.k7DlqP>(_*i`ڏ"!!3P&k{0ym݉b]t ] tUUU9l׳6 Vގ2S^Eғpk<ߝ,ۻiq,gH$U€2L,9av1d|@B?iin!=jk) B/+/_jz1\l6n0. 1ƭ UWWH&I'(0g;ͰhƯBwPx䁝ianaodMZcQV-6qޏ2<'[F=xM0Y+^݋:ݖ] ,6_|򞞞[nr=\r@Tsgf~'q^o_S~ۭݤ]|);WP4'!2y9[4q0ժPx+69.jq-9V_+R#ÑaIB(Jp{LaOW`{&,OF8:FfEPkNRٞsA9q{ZM Ad A1 At ȣX>m}()Z)Y J3f,lD-PBQυ`[}P!J ˆkW+3gtwAͳ*N=|'>|wWTi TU'wvV\,dg'z^D|)<_d2lL88FH^nʖȜ@X7h`Nx⎅Z<%&a*QyDS*6ue?n2}* MXp#}\h9bׅ"|jLBa:o^XҥKPh(,5{?ǎc:|Ri3uzR%.VQ?NDI3MLJVDeؚlu_LH ?Q}S* \- #(_;Ov }A5x%syϳP8zSA^/X 8pͷ)KI6kWAͰAɮC扏QqY%au Uw}DgPV;fӭW{.%%dy>XAUVVGm5 ϾKB>5 י8o"1ȥIÒܢوBGF2g0I%>;pWwWffo3{?35mdso!'\G\]tl66n5V_@ZgrkuJ̕}-AÿLLD,-Ñkymm=L*m nב3ͼut}SZ ؈Gof:qԸHuFtJ*NiPaw|"4<<#|R>eutg9V XԣՎda}:lUO+;O? a=c㓏?1Bs\;+Wcg{%m{(kw~# }Haӿ1"ӪЧC59 ^`jL&u|ykPk0_\ h6h\o\ouF1o7A)aO~9:NnYd.Β׎da޿OyG'’BXсfDS\l(]]7p}X(VyL$_wQ`Kzt BWC'R!1lk`O 6dEBHxjxxj_-l<\B;Uh,̞B@uBTEwE^{ϙj 5pNR\3W gPs^P脳$_J%t+t2ki; $1IA  q@V]>da#qٓgݨU/)Q`~G½GO;a ~d&(<ٓl 'v{eޡ$aM[MRO\G\r\FclT*r9ceRT4%O'EH&D"P(=^5Wb/4FܪA@KSHk5DmjY`Y rYJu]Y<dKr\mm--6-l2822 -cȵAZD,R/gi>;q-{1VmΎ-iL o ^B͵* mg/6K,J錿˯zrI09/r"A4;Z6}~Z Evry*7;j5׿^>'LǡχWɑݘ",/WΓ_0j*gARD?iw7lT>V=ԪCўKaw`P=HrC [05lTE-޷1B2)Y CܶfcamML8uaVAS<zԾXm`[w]G\zN{x=:І荨\.qT^K[t:m/jUHhxBfIcMFx UE !;leWFZT> XBDf4Nȣi^gGG:M&O?4lTM!)Z"&1Ԛ*AVZT}3Txvtj#zmWy|0Pjm66no'*׍Jy6U-9 z='GU6:mOv y/Q*fzΠn[CftS0Q±H3NO)):e"[L]EΌ vcCdvDO!e5t2. Y3(/pJR_Jr4hm4o7gkU"H3(/%t1S_ =6K;i(6SjHX ZvZ Cr4)ߋ'G!~/n1[5e%~/EyN{(m&j >#̌W'Gʴ㳏H'ko2 ʋ2 ]ZKԯy~Gf b7c٨h::^a!!zMj0船8 T.nĹi7ߊRRӪ[[fAgIu :rK=|~sπ}=ӝbwb5swiC<n=}2n1FE*i`"DH67[M^!77lS+&Py⺐9 JpGa TMQy![֢{\? z{t:mc7d4U.}3MP-z3SpO(ֲb33 wkokB탟 nv9EQюL=.HQ# u!e s:~=Ɔ(_uq19$kjf)OєDXwZCEdW} 'TM/6R IDATl!Cɺg9㽎؝iuۛm.fZe2Y( |AN|=ӭD[ t5d.I?iӾPI_$'j<̌%8zzsR.ɑI͛| Rg:wծ3ܸ*N Ȣv\#ɡkLMi\G]zz;vL&s-A^ ڍZr߅5T*eKd:Sx+E7kBeH:s \ B~rɅow֦gs4_3{vV]QPT)Cz-EQ#.[;nnd4ع<#*4{ UUU}Z-+4Bʁ VZ5|s"aj&5PF }>dk)'2"=t:E5mو'ȖntvK)SX|4ggξN-HAuzy!F%QJ ]ÑaxÑ]ǏϜ[KFAo_2Կ4!OfH$b,) *̧YX|t~Ǐ:={U>4ՙAa Čg+ -dv1&W=]v'A8fvͲ"xGy^ wk}ʕ*Tk!o2}T*|*c^B:g˲B*v\޼9|- Et"DbcSm$ov=vX=|[4fws>{AJH0{~||< `bTz pSՐCj*z#Jl6Ќ?] x-ڎϧRvs]f (=/UY"M,,>ݙ/p8= :rsƣ{^BD62 ̀vmM.Rɪ7y`,,>3cgNj9WTƝMy!9{+,e"R0&Hbgﳋu} !--ꙭShFTbZ<`kIAuVBI"+ FIڀ L=j<)[*:۳'{d=̲8( %{ :A 8g sKvtj#zt0t2tww6(F ArµĴ2DBal hy9FHL ɇL&]I>{ƫݤPf[rEN%`ʊf%t)$Xqvbw#+JOnd)I3j,x!= } ފ2l5i=:@@8_? ^܈(P"g\\YXtbB^!gꙮS]{qB,;-{qofPyof(ʴ: $~/nfi:p9 )(rIQ{5ۨ5LE5i7'Կ^!g-6"Ӥ@8_޾^E#ommbmXTɩ#Ar&g|4\1)ü<1יNsVjUF±Ac7c(dtlnj"WR108>41W{LU=en=^}6~r֢E?qDJӭJ )xx(RT5[20>py@IMX'){ySZVs$≶Cm)OєD{G"_g^clj)%? !9~l[%L .O)DYת FÄ4kAftVֈ < si6cIٷw _c2w5vy&?cc,;-?9}4|DZo-fڔfQ!~L4M ʩ|Iw௙ IVPR &6:H yzz%1ήH(65glΠ|89ǘS /ה!,{>>FRZF{z9 ۏ PrhR* E53ƸCH9!At :A  A:sUL(fg!Y$Mx\ ۋ %s}}&s+@qΐ/"GrD@EIKO'd2~;9?ǫ%e5c\],NJ 40}}+@q@&gHdqd (;v\DE67Kݷ5٘漡gd2&#2s<<ߖVFExP<9C" CV|dGݎݿ?stTʾag? [h%q%}S \пt2e2&i5]@e(3GӵOD2*@v}s3 Ϻ 9eLLQQҧt$Mǻmی[ uO toP^A&Z;;: P\8df~&ZPDLfL`z8fsyOڱ2zMlY VmҤO#YmٔQVb{;::~SUUeku }"},ǟ2" 9ռawU.jSkn )3=ՙg$@qΐЍMo/&s&$GH9c+RNN ZMC_]'}'p90pi Nk9z(;;*Uj JzDzeސ}eDzv,Z0j|pЙJޞ̠Y>wx; B^1nSV+1E7[0Qy}Jy@h3P#z2)JN[.vHt\gv,\V9< }61l|E oΌ?ݧ&f`ϙU}*n1Ɯ_;Ovf_#i$a!!zMj0{z}ᇆJs d|Rɾ5ݕ%ٸGE*i`"Dm-`ZزݢR *8!3 *@NwF]cZ[6KrBWíZWáC-Ʈt ]_tLK; T*zYھN$泭fm''c3כG#u۷o$:y3;/ <-l2822sG 2s2WG&͞0d }>dk) !NHvLRJ~}2h&z#*ѱ|ȶF5m5V ȣ#!/ykkkgw5 @^wMLEBWCYl6пL2n1 7>s3n}wK^!ϗ%t ] tUUU!S^caw5SJ3ȧ-s ~ǝsG;YbF'(,}SOz? /3=0yF$lsͻy<4;͚e6.DRcߧY)Pb^Gwaj?55JˁX蒊KiA>mv {ut~#njc2*]kF W(fM1r4BX3'R'wZCEΈrESK~uOk}VsϤ1Pk0_\ h6h\o 5 OuمHj)_'4Ih=/)_w}l,8µ[:8IyY:z;]`M4%%BEȱQxFoDk6՜zB>Wͯ^]nd7K&$ Ci`aG#*U/T(Z<+yJΔxgOݧ16Q6,gZJ\%'_!Nd%'6q>Ѻ y_``zhk4wHҋp)C,p' s  At 3@A  nÝh5-["SVq21]i5-# 3͌t=;~x#^l{/xaA)YqQW^F-,Fm^Ѽ񭲍;viNB grľNlHP++Z*lT*:c̬ݻw봂vJ6݉eIb8kok1̔ Q(rBԡ_J r[^j/u|%`=v9eb^ l'QnP0c$Nq8R)+Jer9 +GAjJ@R&Ȕkz^D|ÉsJBoiwqWc^:lnoB7w5?v~AFscc9ӣ۠x`jl=sϸ. dldp-׿X́,0;)rvعPYsG=%E \dSM";P": S]3Tri|0x[&!-;-wUS^2. [ K׉LU?vFє*TGb8(/[*Ӭ|S/,-SM_C*V(-ccbPY,cʢ z{Z\طo\bFpw̐?(rx.< 18Ę~MF0Ek VTx~{^ca :Ow^=~}g#ՐĀH:8=g<}=g(6UWZG^n[vRBLl.|-_|-|}Nn&Ka +w%ҡ9{+,md;2s̨'zaTQ>){OǦ5ISPPl0uk%#] eȂYLHgpQ sCΓ=g9ؙ=d;RV`AAg 0 EQ$1222-AJ d.v3^&-5ےI9 :c# 4WxxC_ [ GEA&c5N_rBOۮ&< z4a~N$Ӫq^שo?N0n5VHȵ@0 L䛈c_./u:]UUUNw2WU2&1 L#ё:7<)av116mv),Acp{r4JB!+*q99ߓF//WR24AzʹZ>ﵷntx' ,A^]` ~N^#lsͻy<٩{^sƀ;ٚm٥e$n LFd"ۘģ'tþb1i#,# V)|ABF^bBQh3kfS9fruF݋^~!@ee% 8A?GwY5G[zlygDۡlhuK@+ɞKXhO*!e$n$rΨmbn`;~ǏD@cG {@^)ggl^}oozS01;`mn[4:)JZ)L4M`73~)40LäBP4="n_|򞞞[n2CmodDې,ªJ)O "t=OS`6YWR+罺u6 [n8 \ D3d dN-'Y$H5K0(9O v /lAe8AAg `kA(3 @g BT@t,@fP9A RV6*e2٫OOpL .@21l1ˁUO \ @j%Ϧ:A!e$ncb ~q]^ z:cHt{Lu&njуAyCy^14jb+[*K clvn&Ka Al}{Sۂ 2_(/qE,˅`jD\[\IVȈ5[NK̑|toA(n `l"A"n3@dطo\bFpw̐?@g „!]H̨BC̴V Y,Z:z;:scAAg 3@A`mfLfg>QAd̬ ̊VLp&dn2 Lb ӄ!j 77ėH$h$Uj @IhbIlrđG:[WA8K?G4-YhUavZCٚm$,xW76VLaufc[Ͷv_UOfI$h$U775sp*K0n5^~=MUuu1b/_\>:::A{:4ejh?>uOɜ}2htka;Q iwX,滐 z:mM.7i&G"8)L?Kb/؍!H%X[h5Mnj<&\?zǥXW}g㉸l(ʲOdfi(ͨe(^OފrmFQ`O^{==EYrбX{nj Ez-d8{K4Ѧ-[B!3ZCy>@^bPk(NK^\wG:T:|qmP猙ɜ~PHf;lM}|C sKЈ0n5:Z-cDfU'@JG"z7&w# '9:﵏|e H$=kzo/'ˁ^TTA7ɵ}/Fgpj'Ȇ!?*W(^< vHt\gvtH>~ 9;b7ckپYqxS@ɺZ=սm\=V5EHgKH`3=1bsjyL]/Ö: T"t_rBGIl3K p'mw:R'4H$ \W +C÷3&tJϴܸըZ" k `7Ǯt ]_t؝حn b0&Z]RT*ՙp4%4C4PY9n't5jsSJU35c 6LYBͣUOA qvSc)Ywc:OVGoF㉸Gn3nO&SDJLY(R?2Z VWk4r0AzM"VwT:yS< Y.p0\?Y|t9uU#vj6Ss5gFcl>j cAכ;w8:fp moU+_пP~WKY#hkWP(-cQ_=PYYIPG컙 J LlXbj[-f3='e۰X?ES]ZIX=ƲESK~<Ϟdf6x޼&KJ<;6cc@Yxo˙|_@w}>BQTَuYھn>yJgPy'3@lzs`kAA G{ :A  A dA*3 @g BT4(fA6q{Z"+#AX"IaMYoZKM.I"6ܧP%ՂZ6Y6T*MZ*%MV}IV4FАm}]Gj]LkLuK^+pwx4Req98?V[,XZCs9}_iI9C륾m.EPj`(~FwR.& RQj}]R/EZouZ}1ܜ\V/P~ya.2%J+QQkJG*Gt:SŮ_l{mJ>jk~ ~*wVvuuκ<=<<=53 JEWMkLM}_ynyD?FK:9DX{OöV}:7'wJ}.K/7cULeyEh2mfKnN.@7}mV,u}/urhj{| JqM( A—6)P뢟Cޭ?~~Kõ%[JJZXjߩ=~?gUΤ  /xblpd4T/䇗YPiss5`M7+e?v$o|r]&)rnNLW"!G_-n*Q4ĺEoh'lD z|2hB_!"' p1 "^xr 5yI`"""b0HЯn:RWlCcB MA}|p:{lȏЯ>'/x ?UAA+^`X %h4i Jo=eE` c*im7Qt^C~^f i.j!.5,gj,Ku&Q{)=@ؗS78&*AD4u\(9ѠaϹ긂Λ̛6d0Y2AJ+\fGS3;&"D )MGGn s+HQU82]8LDD DD`^j-uTgh]!DmEc'uJٴs%LU\^9?TLF_7`((AC'3mLhMp] }Sor9$:Ok6ٗ0ۉ*y.Nc Eu@5p$7S/apx\o"u*Mq/=gz00 ـ5&+(e,|Ԁ(Z =3QRp7 @^9 x7oJh D<@ta kI\D˞}pE|lE >A {>kשY]^IX2mA%#7f];ʄ~ ~5Jv"o1"g0AXPpA9*^P? KFk; XKY`ِx 󄟥4V scguWg*e R?x[ojOm L@[X `JM@v@_Ѥe@P7=uaiPo@[X>H2Y$wJpA9eè~] T7_sXrJ$<s8P,X*e/Jv}&2n l_^QvwQ3T?xs[9NX`ِA7jz)8>Yt]0lx(f Wg^`[IDATu3HQZ&3 @{X\ `' IԇUg2?#PW!JV@P3o_>`ee-ԁB.p=66#sԎe?\YQOyRDTPO6@92*3,q#*,S| T<S9S ~d;Nzu2{)r)}@NXcOXb^p(OXeNlҞA`tQ)j@}xW85r {̧a:^VȠFpB_9rp.oUkGXb.R6̦^ΰ9_o};jQ,pҳ)sxa#-zDg2V{&.cgPr^'o7\#s{p|?8 ( Xw0=Tp+*&*kQ;PLH7 1?bܿl@?$_~1)sJwCh{3J*FG_F_ 7F]Ow9 xK5L@^"0(s_j]8 _h[hFQ]^Z֏~=r*q6Dh3897QaVnUt]-]R?¥ &:V1T$Iyx1qMMMW:miI|"jkAHﷻ?uD>dDQx$_1c{v䅂F] x_#`k{/ԥRE$ފ:jlh-ik=LF*Ke2|otWutW?-5m0Tf\\utFw2U*j.2;84MkPOc8BC#XHr5c#<}`B +6ꑛ,:R<۬ 48O x`U+]9TYpx`$IaHNQ| >[ \JIB&uն&HPzw};.~`oS֛S |Z'ܜȟs)Yfu]EQlK;Hi4SXlxzx6*>i +hfF%u\, wce{hA;M <}Tkl!LKQvB5A GLO]1h,S^^Vx tWfǫ`uJ3GI%J*%v~p/L2"ED3`@Pw-ge)*q%2Us&8y=yi"H{sJm('^ȅ=""b0 ""!?^5ٳs3]NA$HSc?h N wQ6ٍ dc u,W< r* Cl]* zD)#/mmI(0&b>*@ >p d؃#!{gǑ\g\Tƛ(p(ut֝.u$0{l+6 =(+f?QUh Rj5?%K:rpz;Qk,1Zhb |sD$0Qh܂斱2Υ[QU!Cŷ۬JO!`@㘌&1zP"p&"" ǽK' DD6a+S)}}xKqFj(|@Iojjz;&?QzI9\1LqER"g00 !Υ7~s+X܂Ąi}DD 8g")'LD`0?#,w劤\[⋿@NHJD)%=;Be\RJ| g Q*Ko`0 """"b0 ""0<Wn|x1Ma0¾;ԜN;&""" h^xQL7K 31мcoJv+2Gx gt 4Oobqquz pt/A8Q6Dq1Kk\@0^WP2K cπ `@DD`0 J)7K_/5OT8: ||5GkT-p'>$!۽M&ApOp_ul]4=V<<4OTal_MO r<˯-./&ζV{VDpynVR@75XzqB ֊9n"pm"bd6n0?jvVx^DMAa M,-CJKJb9yF)M_/Q^杚{9O9UvGwu &G醂 2n D"wQK}v`7̀uպsw۶}/%1<_}O$*^t-m;>[Iv}1ӋwAykK{1o@7Y?c?~Ltlזv:ҭ`_v~{?oM.OYr(SD  ($'*Pr*WBѠ@JJ_4v&%J;C&99P٧8wG;JBB5j֢FZ$$$pQ5Υw/_1$-J \W&-q:G!wY~#qt![J8&6#S;bɤl{J#Xn#6Ʊo.ۼeC~*)W6mĦM0UsjBZX+LlⷕSyȱQOE[Md/χ?/Q!a,ov?}qӋw~oVNc,'ɻHۅDZDb&6nXͼ7s[6'aT?Ŝasm]( @ pb6 Qk aaa;G@mn#rZQn˾YVΏ?>ٟrvm㉏ڵ3ӼL4x/ocmi{yĂl:}wnշ'oaˏӱm;:>:_cH/(o ysV,z]rY|0T ZNe }jhˎ>)233yx1AA﷝O>";xW0dff2d |1v<[Ŝٟ# !..8ԩ8#^1>oCYTğ^3ӃL~=~I1&~yOI+Y~-QyU |rwy+ӌdz.pjylH˺hm3RgY9%%ؙj:t~$U:̜?~K&ԯU:RrQuj"S]GyLT}!&d{ngiw}4"fu⠭,U%?C¯|4-}+Cj"W7ϵ<RŖ]ɮj]G*<>o}m_8s]s}W7c Ldlī`>}Uz^xO; @dTcH2w;@;QàBS9O҄~u,''͑<ۯ*4Myrps"~݆JZ mٜ,C֠h#Fj{!4 juZeǵѠiS4Pd]3y88Ǚ4~,ZCO;(r>Ogd(s~82ziOvBŁ#2˄N3{d|xm> cK6%XRwVEE![*bPJ_9Bs= fm n֜_Ϥ(ߏҕGdJ&M)PKYTlNaz67gȔ4u mP iC`%ͮ@VNT09T|ھ{ql 5 (l0vzrj*mz[z`gkI*h Pv,g_M8uóOCZ-ڑy )ڡF D߿t QZ1ޟF0tPl6!Fޟ.Z.(s#/.;`i?Wbʕ_v26233ymԛ4jPΈ?DO%?v=ۺH9Xz~w&6<ۍZba쬥7Lx%q̜זJADMX}K'Yi,dKLۉTу:!]͗qU9.QPnuGt6>"oK0bxC 4 /[]a9iblN ȷ틛^vmWBՀ{G\;qr/1/oT?XcR1ȟvS8#k1L5JJa:9̗0g W JG<=wy+I@ 6; Fj5A|.]HZZSBP Ng?p cpFg{<Œ~*l>xW32wAcK˺›ҫqsfp1_:ͧ1+`Oo[pզ ")-uxCG^`]rqfo?_Rx?=2meց#RX.WxXԈ/Dmy1>[r7W>ŧld3w_q(265kٰe'Eep7o 2 ֋Yz썻Q5PL^>~_۴ u ]ܼfM*~#2.lTKgW}m_ݧb>.ɟr38%ٓdu>pd`ӊ VhEԘP)=[Nb䏡<29* f{?, vjhot`%ݣ"xe>S{r">g?yAEb1Q.* ZEPp8+Yʊe_d cQQQ&(8 1t<*b/l4K$XfO;Hk֬QZlg (rq+sh88mr MU]ȀJi,Y 0DסC#l]t~asx2f׸pyl穓cyzrOA= vEBcۖtVU(՚vGa1L<^$.I}_3sJ6I \ftџgn@ߧfqԳϤ]?}^Lx=8uǎ4͘9L= wЯ[1{<ӗ"ZM.vÖ Ȳl[1w'`Q҃*qGxOKg?P_6؞b_|GB>EH.ư9u'b͎I҅۬ / \\ݶHɌَWOFTRO.pFҡThݤ=~oldӑ|۹B~q3O6r<33vXW%6w.ХG= o!7sN.#UUE.w)_>ϱGDFzZ"$$TRRʒc҂ |\Ò`k7<"-[,sі_t%@.I;Ui@?ۘꡐzl?-3F~&ȁ"z%FcdFHRRpds[q ũr"/br\QW:+^^.1uB?#1 -}:yJAat9OV4l t[VeX9u_{ϐS~x[Š7 K_'ջ>Hcq*Lլa;eEk6oFj8'a]|5V~ @K^F)F|s",h}RRaz23<ɄCS[ϔW@ X @ qEER@  !@ ,8@ (sq,IIޔh f(ǛaK.Dz_}\hjLS&AAAREp3ͰAA嘔t=#-=p EQ 5 QFDFFGHcZbE|*(8l6_7EZ-jȂ?mAo}, +dvItt4cc#-=v$.pH}\8VTXmV*=^WF^0?ޫqTk읰cAmE죯SCWcQ?a=zEz٢Ō7.0Pn,G*uά8dTʕᰣ(t]OvQQeۂ/^ť4|xo $GK,[sJY$絶%MNť0_9Qn_ l+- |88~nXOjeBSȱKHgSw[* ݎ*W_E1-Xm6w6fE!Wϯ-č(@Zb$d-B c3Dž8?$ sDZW<}/ _` X$$$?>>Yf !!ǎ+܊h>?x4Ϻ(>zk+e~f jd c~D S@Gʳz;m挏A\7Qc(8.H<׻WVBQԭ<ߛm)bi9sf7g>┤nLR-?[˂;Iu{/a!ji~1`ϸ#4#׉5Ctvj}ŋWsH0vQH\|fvi͌wr o%$KܛsSS>&$$䉖DJU>vyjl۶O=ϓ"Y~Jxn6T*'Obɒ%Nwk-={2S K <)8l  @EA iͻC5h{YĬfk?oD*ʧ]PAkJiDt]>$IWl8E5t.s,̶婡 *K@ wZD@iwI9?ѝڵYP}v/gy| QP ̯h Anp( @ԨYiӦ1dZ-u%&&N:dO@]^H+W&,4sJG18;&jϱ_]~'#@ *ܿl( 9&d::7 B`Rtu(@NB$V'ĉh4TR9 <1@^hg1? ;Νdd:%V+DF^9Yا&odϷn O:ϕx>.(gu54#GJ̷/ađ#9/J>󑐐Pz/yi+ ۈFZ&M7,|gAVcgGղeK5kƨQܹ3ѽK.1zh㷏-[yUժVr[FȲދ,ˬZ /N~z%ot@,_BSM0c^|.4nD(] !ȑ#|T^ݽѣ<3~m̞= sxP &2" \f;?@ d)|[HHJ5q_^ۋσ5x*HoF0/)qqq$&&\bj+|DnX,Ȳ(ZFb6jV ۇFnJB%IXeYF%PkiÛ#G'wWXeo!n![NeY߼pwS5͚Z=0닦XnNσmҾXV0#+&17M&^0$E!))!y)vS(S/YbB_'ظq㪑^5kY|Oy!޲5k !zt9]˾uM $G֧-!i}/ڊkVm%d>`ᤤ`X0Ȳbaݺubp8 jn:V\IfffևԬ(K{/$)) Jѓ 5oP~|5s;v|!{.Xފy?-YhAW=/k (.fմyZ4Y Uunݺ^ۗ3c ̙3g;oIJ(.C^X8+bܸezke ~w4/a8}rq͞ s:Tǹ^+IJ.eZ{ uNLL̳n ] s2 [(h࣭(r%IJÇYx1.]O>TXd9u[n%((3gҮ];233tA:>.\mHOe˖bdN<Ɂiب!unF?r <Ʒda IDAT={壬)tN j ZOhѭO%ToW FV0a">n];LUVW.Re eƙSԯ_ XLbE3{$Fcc0vYN9'(>^☖p Jɽ)%]oi.u$j%cGp&N^'22+Wj*Ο;ǒ%K3f ;vUVdddw^6lNm+rgZ-FtvCZZwlSNԻ5kl6s:ȑ#ÅA'"2&qq-Phq\f|7-x+pAQ_M,)Ұr0R7ڜ6r bȣo>>_ȣ`2{cȹʚ"EkԬx. i_(r.q,+d-=sݑ-W>#yp Sl"yǃ}a*smW EfF&oݻ?AuRR]*{Wǟ&KذG)nG +CƸ7nc cdA/cU0/k_. Eh+~GcW^_"jJ+/ó aÆԩ]oQ˱$]ǺRNL~=.cOz!!K҇?Β;OAQq_~ Λo_| _#4O!{(+;:P_“2:!NV(aW]kwm\k炜rK?pI1.ò+/ a^Z> S%V Cɲz!ϯk#(>eCv WV8~+Ub1{Z ~8vj j Q"/k>[Rb)J94 u%PXR˱La1m>psǛ2DzÁNC5$IFrfQ.0M޽X'B~)MsSr,-Y>^oWzI/(, HP1& QYiv;Q nJOaӉ2-z<(5BFCF y7x[F ^/ܬz"u#3#gNr0[C#sY&55 AY`6.槪nC+sbgpll4,_%!Z-z2SO o?{PDG'"ddduvY&9"s,c6[Y-Ȋ\hq\|˗/:˂ IVa1-( B ^|4wh|N8;+̧serVZ-Qk7 vC q,&'9/pktbck#s(\ȱH c-(&B q2ڠ ʕb:FB[9>n&R ze*}g3Mf4j Y.ԓ2ǶsgcỈ@P4rD"dYǞΘUh8Ut uH "(j۳یy$EQH;w+|W(*I*BcIۖ2} s YGT;z (71QH)x(9+Ts՛.?GŘJ^7/v~H;6H"SX3f|܌ɽfrZeI ٫Y0i-cY2VtDTkȽC&3q`wΪ94l|g B- y7ύ{ꇠ绞1Lk-לOFy϶lko_`lbK&Q.o ։"ST|!.PY ۊkR&NCVm!J*H02)[k^ڍT8}':!VWh Q>㡠;BBx/N4coӳwvb.dުy4S3d07 B=[סFaיî!ai.W¸]My,a.=z9d]s~fwr.nXϳfB֑Lգ6B ݁ZGrIY#:Ak=Y*Xm>){q jlPRh 9;7S2^bֆF4}aM8Rل),|tMn6/wJh_7' H5px3rd+0vϸP $;yX~uvMFˊƸ5l1rDBLjd c̞ -aqs#o`pe;njIEHte(1r\b+/L^&MB=۶䝫Xl9xLEKdlc~'ɫ#v1t ؓH>ǰw*{d@ x+rOLJ?wS21R򜒊9T|,sbO~[5^t+Z0RT*LFD|$\;i-ڢ-$r19sX=E?әy*Vͻ_n)[đ݈ rТ_ì) _ ff 3OMߍ3oX uKАw\RйhuY Mxw;45R3&.XW0wތe;]}{dմ lbչPnUeŞdno&wbhLICv.f,X.njQ|r#C0)!UCõsT ׵kN>Gٳٖq<#ӮߞvՑM 䉟|5j@lMvwdHrXW'fu25-j wU/{ϳ(zPU'R5sר_F`y+-6y [:ؙຆmBu ST?*,mWr_y5˿T^{,@[nmҦ-IPTUPv`G5ڶIͮҠmw/atd{FN=~jh˷׈f'`SCBՂg_kAڵ,'~CP'D:G=̅/q{x]ߒ#J<Ц&*tDջvݲaW2Rmsd5sۓ]C8_YXDgϚ}sgN∋s\0yne@|+ZΚ`) Rm7GB{xÝt5OQ|-Kv U&uɥMFtD籡 cH%*[?fwA{590 mTs})EAN53 *f'|KFk`'bڨ;xvD5x) dR-a3' K 8@PL ^O۔ԥJ67e;]9Û|Y~-j5^˄Wp_y5rJQh$dinA{I>~e2[VQ~MC򮯫r7Ͻu7ϡ`?{k)h[U?Ȭ=*b׿pϾ(!y94f쨆"o0[UyX_Np;_-ɰ=Ru\AjcJ?I:C*G˞hF.v% 2U9|#IFj3 }5mvJ$HOKehx[+Fsn[r*P\9Ci6#tkA\%C6f_=JzUW#4!Nb R'e!y)!ANxVx[pg~3.hsʺ6r-Kߞv*-[DǦmؖ߱+`Ee,z}z-۞z˳]+eGr9OBBUkJy~˼-ߐgm\p Tl˔], iyD2{i ~;LkӖVC^XBvG +`OP!NkG1a*UV8jЬ#t1jƪ+yOs"Y'}oCt GƠ-,EX Z&,,аP"c=t:o#@((jbPR] C.܈PmUށ ㄃$̹W[K8mlƓhZelW;=H PE4u٬uؒ[%UyfCv@|q?mƎt) OֽOفvpɎ}%6Nap“SA]1a0\2111`LA:$u(15r k[o5}GИ d*:jgQǹ Sx825幭f@M&qwf,q<T]yQ3H>a]'r ui4n[JI IRM銻;"ocxknYfWI?ȷ;n=f892I7s\XȚdw"=ӎ&3ySFv*ct([7mRj5D(NLḺ.Rҿc+腁z#yB.T;*]5w)Qgz)K*+$^cY-u$7f<[dKxpuͩu~ 5o?oN}]v^BлfFu1S_~uQimDsLT:@? utvE8Ýmj1c6[PdqV9pXEkT G0C٭h ut0Uz*rQ=toޢqˎsu4$6/jLPjv34岊CN%wxwl=t&w+q/H[}P2dKLY}{|+\ CVa#'0yl?V]ątUN;OĹZԩUteĉE RnYg@ 1ٰa=GI\uLK*HlRT A CIAagqXAɑęhIkA(X/'31GΉ-?a$^Hɦʱ9=x|ߤӤSGs`~Rr%ˌa=GA_wvpѧL,o,?# ܡg{9e .V}'l\]dOӰ~yO: PTDGGu6a,h|/XQy&k&xgTξ 4T3RpQ|2JFV@A)QBt49tb4 ]f1m}ԯNAURv 0fHCMgʇ XbZy/xow?Y),Rm/ey|a+=w|%U R^\Dj\6:Vh4b_;/j5r,|s0[xN 1ձX+y&rvdPRJs~|*MvgŹ,n#px~0h8f|uSq W9/C>͂;(.۳ɦNHIU" EibbE.6TDCl "Ez =B =[g?vHYH+ }l{\3'Yqt m8sgJ(M9JxWJ3(<$s ٤_[%nyn׌vaڳp:gSwVpJ|\6tۄOm&e>ώ"Bgzo@aߓ[~i%qG|WI6322lS Nnmbiر]1e{4bݘ-_ _x?cW͡TNWe~~e{ܗmϿm泿1bn9x[&!!!!Ѩ\XD&u2̌`T~6d e5ZZ [:Fݿ"6&EV́ngؤx9`"hzh l/C0j k3? G\ٸ7QDB5z|daʬQ5X.dž `Gӆ5М"X`>fk*%ųgs?qZ9ۂC3eYn{q [&F|QKH3B[ϔypNהf!㡝ܱO^v~`ʲl9 ۆ2d7GfŒfPTߍn2 ڹf#FލS`w=%g̦r*\#rrh|:\UG"KWVԛOݶ}w.X̅ ^N0,<=U ?,[1EfPVpylD4^ cV>o#atv ?\[<iZ+^%&R(27bʎ2stػ)diJ{z/>ɥ3?^G݌iR̓~..E"r=&wźgh3H[1Em*P{4<<#o؇<;7\no)?<QԸu [WbT;')O_Pڅ:0%nHd Cj}3ҟä$Z@ IZ'b^ML4wo7R~ ;>J[Xsz=_2u`;|qqvƯ2J)1&2$ڵZI%yv;. **H)ܳ$w..og &Jl6 y߿M&EJ˓kW);N?1ʴA  טIu%(J~df5M0g99Nc|z89Tmfۢd|ַ%وb YS&EKӵ捙#+b̖8e?7$h|BiZ=E/,ˌ8[fŽq'qef*F|Š8 ˆ1?).tjwi;]sV-gOVh p9;7k||>WNZqܔp`l-ʗkWG{'|!%0.Grw7cO'9eql >z lX+Ƕ0<<1 Dw&Rݽ<3W@ӕ>92 Cm@.>~g?ȇGݕA^٬;~(LY@}+Yl8Ub F dnLߏ]rY/!+!`(8 ADx҃}Ŭu=/> 6i&n gq؜gMa@"#Lt/;X6ށ0rm+[$ckjvI,nOpLyrh-{p*s l~.ǗQ ߡ|aޘ+= Y]OpmLW?>i?}xp&)߿K#u7ܞM%ҹlf E>þa'}I~.څG9ltQ0WMOv^JZڷZۉhèJF =:G~o! s1XjGxdF\Cq?ډus5&1^Y 1Z;82c^M9=h+^A (FQ_MV }; ':3ىv;?xc|t|fG-6_0Bu@V_v&1Kyx,QmIHHTGvZSTO "[7rX#ɟvdW'f/)b8݂} &b e΢=h(WN9irES4j *': 88`ѧaQp 3.d*fV?5:M$[9w7MѸg6oS/C]Rzӑ4ROۦ#V;kJH\"W.XBBBBBQr B2D]ut*cd SQ9p"Qu b</ER!} J3Hq|}NUs.=%͑Hʱ֟]J$nX&7YsMEȜý tüK XrJ.9羾~k\hy_G9G2̿wfcUxlO.rvWKD{R`kKHHHHHuW=ʩ㝈pHY'4)9%FTbՑ.RN):k蕬ԅ5YkI*<٫SC'8ūm є1 6a7M,xKBN$XBBBBB~["o%ZB@.F,2M5x B#Q)8%^TsI*J?ESg!^~j†u:o]7wt=ݺ,.SIz ~*H\Hʱ\bT`1Q$  hF,1V3bWew/yK,]XZ !Ȗ&:0~~ߺhAmcGoJ\$XBBBBB~[Rb4hfkl)3#,MF0CvPJƊAԧ}4]ģ/wՖ!sfw?|nPseڗ-]͇$\S&~n@lL Z߲ͨڐoKHHHHHM{|daʬQ5X.dž `G:,q+ALPHk£?i*on!Él#ci i"A#"U5]c9i\!C0Pڝ#G yl*] ")S0Bk8!SXr~l*G^@5/*X\PƧUNXUQu);k|x@k{I2LBVuٚ%mM(cںD1|>/{WKHHHHHM(=]Pc.QZy eJ5p Ϯ/Dc, d"\,%$. #[Q :BR%$$$$$9S`wFZ] ZX_uh}66ykk/'!88)_*\{I9FIVʱ7$_sAa"9|Evُ͍J!J9.A&2׾ƄG;oG9Qn.W9d "7tvWf0JwB^U(iFkC K &c&\Wh^E)<˄ |1Otpi+)0Z97#V3ba ST~ ٌ\ UY ӟQ8 (e%nR Ra R=O[k'I9Z96PbKQdrfTB r5.FfO.`6Zxtr}:a n4%n.,|1h^Εibl'͖bi{Hc KV,X0v U+@&N@C9(h^k3G QQiV-~ >[9'SWdbī]Ք973`)F;x[>oeW\&C׼)#gH[52s1{.0^?ե3YҝduHiy"OEpWS7yb:ѢmXYh׳@ՇIw;6DI90Spb3(ԛU> )R h7X}ʧ̀>j.wG uKEαf( @ bS`6FʎcklA _!+D I9J"qvn~"E[sR#;R=~A>wNOc+:ilD6-8o/ͼ3e#ߩ{2~EDu+)Ml$gF @8gw,vE.=+\[wjƖNGl ~s QsP 7A?cAlk`\"ӑdgd~oUF/SnO.ò?#@@V#KqSVQ]Dl,z+@sgg"q~_mK^16_ˏ1r\Xj6uZ'y|;4 f+WrlFQgT/>;ɝ/aVUt8AKa6n/enօ`G/s$5)\,oF)8~x-hTdk׮;uHaAA̓'OFxD]FruPeS0(O]LaTULy X%眽H BPJ$jG%. %G&>߀&~X4oDC6GE ] 8Ѭ7I;OQlC #ys#.^5( d2.)HW8NK7=G|l{-DZSk)h_\O]4dq2WAPhݔ@S&dJ۠ǿFA%]0Z&ױdJZ*E!7r,GIWգtU=Zͯ?C!̹q,/}޺Xٲ_rLX_Q=ϡTF?+ID ](M\8a~>xyxTja.s(ireC>zV *7Wq5 |ҔނKHH\\LYԛ&e;ܚ=6z[#J6;v{`)Im4X9VzСOk'Qwo( ZuBCձh+I+1IVVmD-Tfpr'!!!qi+yp .Zچvw\MayiZOxNxe{ѵFzAL2%wrJd N:t::'-  wIf$}]-Ըٲ= KjV'ؗ%| #WMe/ 2]5rkѠ'"DTPYRm-z_XEqڗD%aUiש&`7Q=br.'NL#YVm 6y{ش%}bE%$+װ/ ,y{D{yocƛ 9gwTVeeEI .I=Fva)yaQW j7R30Z,X /(#-ǀ(q6!%i$fQVVLNj< Eճk_hУ-uEzX8s8g K)I"H1ƫ!)),؈ ))̧냂XNzE:RIZu5$/ +E_`ьK]"\w j{aTn@Jw@Ε'<'l[մh1"*7Eߛi[{'o=B#8z|Bg\/*Tx-GslzdhtU*2cqv-ܢ#cp|i6GCn.t%*cI;FI*$$$_α'90XDD]i؞TPڙ>crϙ4\odek6\m)Ol;`9+:=>s3ߴ>{l˄2!d}=[rciJ\~2o-\R:b^('ۏPDsx{>^NH1|U߽[ `orKW'֫J,;΢g?N`}Ťjtm'At2l~HOUu7f`,!!!!!8\Jk啝#8[x99{NFayG +ps^n8ioH('} ShCtgv8 nOF1~O/lBwIʦ/`d[$9N?q#[OWcYɀ1Y̮3jRΘJ94gZ"Ǽ ?%VZ嬕,{ J$ 7z0wwH1pk",O휵z ̺`DDYp"QCh(Ԉq߿s{32K'$"r[([j_U"3x\b+NȑX#XjHTӶRp|scKHHHHH\]Y</?؞O'? N>m623:BΕLxo@I'frs:WʅH 9Z){7]pQʍ( rؽƘ*ʱʕf.*69wvËBLe}#LdKa!JՔ>FaS rd-q䛩?$nzXBBBBB~%8xF\ZtWp:\yDVhfܝuj=#=@R1}XpfLihJDۦ[ܖ/ΰ[)GJ[}l|x IC iv#~5tuX̙ȯ* ;7P?XsMd;(w*=~\(q=!)s:YVKG FSr%ǎf{Zk-%)(mC{\A4D>߽4IGs jZ>@9k͜5Ue8g݂"[7xH4N~;fŵɻ ZZJy/1,,XL"L{iX4ϴ J> wl.6Se[̹֞\F>9m^]5nWvpM[Vc}XJiЧ XZL/%a'7Y,¬|c.36'α= F|~ދVU.]Yq%eT^|Kz>Q m'Ïީ{w:L'P S,obryWu b){Ϫ|g[C1cs1FyX[ZmC53ȫe[=kJRvp}y5Xu'ԇfV:2f <‘gzq\Qa1b#6ӈy)tt)t ل&Ȉ5}Cs~lxݺ.k=A/6Cs|"6!dZjKBØŗo1cc^&rWG?-ƏRוF0QՋfǧVд3lLcë_}+ *2s 3wA%]ǮFKT>}(pC9c7 7f:Vx6H}NwYd*ھ,OW|J:)`!36WM,cٌh7Y3Mri_>~.2|_YrS}ח}"~p3e8䜭 #ɐL;,q1>N8i,U,#~z{UiqoҞQDo}yy_(~L xVFS3:9u HW,a ec l k0FEҭoeG#޷<ʁR?Q~=Yy~ !7nɃe}by"f j'<3*h etu)36V+:͏]iLx(~ñԎ$,.9z]/`nxu,=1>sppNpswmۥ=?j+#|.Zlܛ|Ũh*5cZk\xjz6).A0 m dddL'#aM(a~\o׷I6ؾlyj S~R9q~u""x}~#ǒa[-%H`iZ6'|m]ՇKg~I i$B<;Y222HXȶ3uc ^[}_2NlL 8ªgNl~Pӹ6a^c%]sz~7HG]}~Fקa&Hk%Me&P4J(I<ˎDL'7DLD-\˲5ٺ 9ǽE>mxc-!q}bcO1<>޿05A92>:~U0W wŨvN@Sۃ t`*J$ޑ`>b=KŁ5*ˌh Lbu"T.#gޠ$N"صсf“=DZI | ;>ڦc ,}-"}BJUO>gZ_Z?4}i4"4DO&9|~LlJD2tn ΒpZfmioLUսNPKBi0tpk/څSi*#'Hd]߿n`r|&7d敡7 鍘AYa:ABTе]$hmcx'x3F zw3F1k?v=5/r zkE3%KؐFhD*17,t ؓr[X˯!k+/:NG@-L%`VautfַH)o\b(ǀך\Q\{X @/:a8;cg .Q̐? :>Z#_7_D,88 = km!kiB C]kn1n*E=%QoOCX-?uQ+W;j\~ \I-,AC@xcۗHGWrцb|T!wYַɤ\p.ks Pi9ecjĞ)dӫcT;FQRf`ڍV^LC^tYn^OCGӱ&G?XryachH6(7@u s'+c G\\u:tQX^ٜ%O/ U 㝋9sAL (4hPh3G!w==ˆ|68e#SrqpS_~ <>sASpKz`U6*W־,>֟ieDjPM\>qpÜS{:zw2ڨQ_Qvl~K:/U@;6ZpJu Ή]GR1LMsxxzұUX:[Ziw6|tead0&2Z{!qbƖ$ru{B¨bԥẒʱ\A@Fh**l &X~? Xz,#C$p ڤo)5 0R|K:+!\Ƨ+!8 TD҃}Т&a$z"K&T`b^Ԟ8o ~@&T IDATl(s@TD n\ 4 pZZmI-xqė>iuZYNȾY|YN? :TQ+v<KX@1eք"<Ͻ=ciC@Hsn96m0&qWQ͹lN1]eėZ'u$~ܼ֬a͚5>BK!̌`v-eY¹\B~V YEPx2N#ܶg^gT[دڽ5B2K:N^Ƚz0sU?MNgǯ3}>k^p9MLn~n7s>q(!#6p"%@C͝Fv/oisXq8'3p-= & ??2eIKi5:Ors\܉Ȱ 8Ed[N&%|%TYٜ5ʟN]Iba|%s9kqnu@g4 rϵv[QrXn̜a_ 0\PUZ~} QwASWd0LzW5rNNB3`$ 4 2,:tfLީCd9L"CY;RU^4P1{.a[b5 $PO9'6,[9.ybP?bkI18&|Hڸ'q*vi5x0"ϱ@ UV<ǎ&Uфb!;G[}}=غ$w}'QdtnUznt8i&%]6N_A\4}λ,xw'$.Xl62ld^%* o o!ᄈ]Y ZBxd(q|^*o q4XsӬ IHzv>Olg8{Noiɕs Q|q~ޘOl-.#hSG:Z:V΂C dݒâ&Q_RnBsw2<rʭF 'e~N_i2stc=ҋnm7ۇ9]3] 07b2/Kzoo3ތlMl6{ƙ 7}U8jd-]J Y,&D-s&$ᑍ-q ??27 ;0Gh )b-̞y" e ^{/M\O?"Xv<[Qs\cH7#j3,~ ^+[]ϱM 0\^ G \|`~g4xw, ^>l9BH42@ E9g&uه),IR5T"<#Ζul>xE%iw@ T:Z^C`2d\3fƔ)SQռ(5\>ZG'{gvQG]Ǚr8~.KS'#J(ܔ̓F*sX1Я o ,RKzJqcFYU]%xVI(;<9pcmǶa1/),xٜUVIHҥk@ jZW:ƌ?;~~~h4 f͚h2Mf@zg52gNҎ^)]0,IMcra-X6?:{"Zܱ=Nn]hVAX$Pc͑޳s|4=iTɅ@ \ms\;|Ե)G6d{18re T 5iO'FLZcMW=i_e޲ svnɠG@]FNRA\{¸c6kfm \Q1ǂkC X #/IeA 778s,t"̣pɄ0nkA}C*pmh׌V]L4'<@ T3B H8 }źaL"^RuA>z |_@ `.u?$0Dx5E 8%=ԭA>\H) Z_#AWBHA h @ lNecuG4Υz,u--@3?t p·kW Пu:Z3j+|":Ř`o0t5ⷦ_5nUG|tz0¼3}%"D˟yG^b]-z9V䂗†``esT?\NEjXQx^Y ~xa f߰i@:VA%ad(UY(%b|?MA=Bɽ OrpnLAWZ^zs Vϯ܁TAl6d&p0*P^W3T5xmڇW'ܔ@PPz6Y &I^p> rgyys-%Z-Xr= /FZu6W 3o:k z s1~xW F^Xs7öZ?H {J E LJ0͖Ӝ' *Rނz_NSt)@ \]a_W-b2P(RU"B W{m&ww|LɓF=ʂY]_z9FG yh_srZ6=aXSi@d}b%k"T@8kLj I\.@}켶MT?Uπ"!z9;_;_{"渢 IL*:CV+UZjy_S21Uib6{"Kzu=!摒!pc5GU78u.ˠŅn@ "B 78:X ёO AA@P/qVqvdr\ 91L5U>CTrڽWO c?__ u$&F.e͍bP_]7Z$XZ$b$@psP;;;#j(bΞd2ZT 9ꔫ|5j5T ԋlv@[/|}:@p#b&!zAUO¸L~I:aބ[iAu  ^ObiT*U70y{9[(;L`~;Bd!#~yxz?D@ q\P4o ZSs {GǎmG^OkLs,v xNp{ZpxQ~ yt|אL]欳1r,ʹpr[kHL92 w/o$.Gy6N,}>8hϨO}\/0pYW2긘R\ BCLF#Zm^7Y'Oh[5ms,W<ٟY! :;'8@΂C dݒâ&8ȜϚVX{rfIUlG?Bз#_@JJ )' ~<ݟ1+1/[LfuM_ǑZ1>^ د"6ӵ7l!@pSM,yZ\L$IQޛ9+_$ι س ]^IrAӖ6mЦDhX :L*Y wd7n:uHNvmSͭɣ VKRR111%L&֭+X,Gr֖z_!~c2@[c@ w?e+x{kn"Q*~^ٳGxBU\}a,7W,կ;ڴCAym;IUWq?۲Nն/'jBP1 wlNN@ ccZILkƸח_XFE_w7V[X s,Aթz>%s:[f ,PBD. ڬYGXIrpf?֛k;lQ}+;>ͧ4>P'c~Cr.LjУ9o6s$Y'w>̉}BN0Y 7%jH:o?ֺ\ ϱ@ UʞcKau\6d֒`›HB @Puj*CYF#y\Uxi# @K{"[rթ{H<1ھbBԒ Dd C04z>=g ng@p y@ lTY)K34f@g]YIyw(Y(W!Kշ&G-lݵcY7X56@\W~uSf`E a,AթrXܳcl_TSR cnF T-'] Ĩ'yĿ+R˔Ȑ0ׁpU4hFCA^M9PyӨ&|%Ʋg%W֭@PMxngd ?=2&^5窙 F @PuMGk<짬.r~2qOB xW?HڻΑ4bҳޖ~sKYYdX̫=SFn?/r nwGfg?9xK珳s tc5”sӖH/%]st2a|Gϱ@ U犂T#xkU>e3"![0SǬy|lUÇcPcomFyc^ɽ}Q*7 |l:_"(%=F@]ŴoԐC~D^C`L1Ux nz=ju'SaH,0qKc gS @Pud7n:uHNvmSͭ&ZmMv^ObiZlEaa! t֕ ,TU1e 3O$ Yd2ܪڻA`ٶYu3Əzͮft)\ۛ]vRi{zygϞV!jlZ?MƮ`m6$ۛijM~ZX { ]( (pB!.pMr*VQjΪ-U:=ZJµ,1cDnv}"d^@ck^1u6;T{o=guurB uw{> ;OOw| qVx#蟮LV@,HUTyh-x~JWVVm$|Y^ٕ//SJ-0.γ#,)0gj$;;}̈;<>SMJqXJUfjF"?!slz#Y>PB [ 9:UwYq|{fɄhd2a6WeOTA]!$IϨ$YSVT4Ul2lǨU^ҭMGSK<<<0KDϱ@p\Ͱ g'^/{1\i7?Mjjq9efoe8rٕ:\J@&+d6jtR0쌛b[e*oemogr#Izty'upL&(((@ѠR0L₻-f2pb8lₛ+J&<NKM۸k4Yy^c{nnnv 塱Y L! |xNTI V5S%^_ PuTkE̱@PwaL*)-1M4n܈[!ѣ۷obի';JETTݙ2FR.B``ջ Z6i-E$^^.oHwͼ?{%>G-_x.ne|Wu2Fd )џs94ETl{Fd-aLJ|Ο?Ohh(J#VF#.L@@@bkg$͔B4 88M={`TKSPתA&<} ̊8!E)wBf۽/rrsiܨ/";w{vf=<EڸD6M=wHr9:wTJ Hxx8Jfb{v/lOX5w'7/vKk;^(^Z*-!Ɋc#鲗ˬʹ5=s e2tt:vIǎc Qd4r& m6KT( %"xK>5L={ =,! qW*4ξ6]͈iVƃ,G?T(ZC ל_lW9___Zݻ< ;v+fZ~': ?$R/]لP~RӃTCBB |q֋v,IKB'Q"~ {q9b;Uȕ%IҥK8c21͘f Df͘={ 5BTb`~wb!55wwP*xxlڮtIxxzTiܽ<6ʎ{}IHMKĉ n;lǎ(Jw7iii9(_ߩ y6 d4u3AO>;ӦҔ)͍1^^3L:1cзO$LVVnb $==sݯcdkқ>syrln4)c;>ЛӪXnMdgÔwEl#Z-E奯Esf-o 8<3]F+HZ;4%6*ClR4d2?f vfٲyYj[{Zaf223Kجh=HOOT$= gfdK/qۭr2㞑QFy/eflj>S-]Ao~3gYZׯ_0;# I9?5]۩ FGT*ͽKӦM/6VQQE~ݸtn۶mo!$$‚M26K]azz A_|  4-]7ο{ Aƃ-ƶFxGjZͳns_ߟ1w\ޘ;KOj*MF FC7ޠ~=FHUS7ԗט{HD0g<`có㭰ڲd+*B܈VnN(s_@>M^_֞ݵjHiӧfg4AAdglJټީq\#ϱkk>~f73huOS B !g^ֶgokp <5j5͛7yY` 885kТysZhٹ\rɄA/-XRb(E\./cXrl4y^2P0N/_yϠyUn=bF"ܚbF}D I?}d'\] wω/aD4mCHbP{C._NFGG3arsJ6?hT/hpɗ_~A+aS(Ⱦ\./΋))8&M'ӷo_ΝK=?sdӠۦM̞5_úukYhQMW*<&onwVp:ϧ1wKbB j?@ݧѬwA)w^ݘS֑bܶ9soۙF ;?Lg֜ޅO1S#‚lчDldŜ{PvR5{R'zm# &E{']%[6 l\ sGU4\`[2کz7J_\L!轅%`b?.us)p_8EqŏIII>|~݆{VjI&d7JlNN/dPqR;QBHVžU)0Ks`*kC۶q"9I߲:I-w)9gG5踨<^ "l%]>N)m#K[9 ie1Zz+_hP(UbH~AAT*hm_ \aYq 43h/\Z.1&BVvqoԸ1m$:tH>}l6rYIv)@B^CcǏ[o|5m??a)hԎߣ!JA.1Y,1r~7W=Go1ٝdKϑy#< [#ZUf<6=~zv*mNcXpVadAPw/- y{vE3w/-} 2biQe k'RowƇpN:Yg,`Qg?sPV_r],*oooNǗN:Y#䉓TrO*>%lpQ^{5O敵T|خOBTcJybiR.$ǧRTXKK!/xx@nn66mAP_RtzB1c_]sDj(̎ߛ˄/IAn|J~d_oЀËS kL ?| J Qn]Ob7w'å=Y=߼ń8M z<z=^2'˜ 6I5?K~ ۞P'm@Tm}kܩ峯I|Ek*1$h l6,셿(_OʌM_@?b1,}IJJߞcɄ%'6}p{S{tTmUlxw7Ze@?n0Ļ*# WCki7sI5WW)u;EýVA݂/o'[ԗ$I6|]9ycR \'>$Rg-vWߙ&(3-ș6:dUJ;scԴɇM%BpI"h$pL 1ɇ/HH2W4ǷU<>GEP脓F*~'Γᵅ'EH,b*Q  3# qý!2L'?/_7eˡThx;Kehڴ)ؔ5j#G!:*وdAP(9j6r K@X{{,-(W9(/c+S $3f+dt֬2nL[0,2AQg" O _ɨ`.j܋/$ fi& |KW+ݝ&sa,QQF2v\ IDATPUT(j wwkpЧEcۨ,6V-[QҦ{>\&Uθ[lpJ9QѨ5N6f$Ilf5_H aG ҏepmƫ+WG A>%w~` ^歙i9zB8ЫXͶKbo\#ے$!4KPJ5y]Y\cɛ̚} زM7A|ӧvj05 ~T.R#,uG"""0V$Oa Nr D=pq}*tsrr)81 iO_*+].3frV%pDoV`1}#ZLi+~F ³:rV!pD?~Q* ?XB?Eydg7Vj{ç7o1D9e/>(|UohLL 3gtp@I33+q~sɐ+Rp'//JhÃfqq燢hU'H0}Y7(((oƨ+ (&s,fBv"h;sm6+N&Y *%5 ADrr2>n zQw&5Y]ͺٌ uTk2z9)#eSVjɷ i1A$P54sh\N}}8Be5@ًpT"3BNBJN[|54?~]G/-cEfgρK4r`/ &tGܢMag΂K <e*~{4 ɳoI:tU*)~å_/D hPG0^PRI3h$çHrPul*UC{VdA2jJH} 3:TdMHbQPM9ȜQ'<} xb}տAw8fd$ h4^$ M d0[ ˶7\OZF(F'O P(Pyx=.Ӛ`9cViǶλ&rj4YHHz6 *y뮛5P gFс3ۣY?&uy>oGQm6 SqhzW^~GW[⽅q޶q2wZ/{Ӳm&fd(@I[aJ.-uRqW,;F~VQK"Byx̲'+  u׉gk1yd*(Mo:+4ѻ_U(Fb]|&k߶LY'Οk!M޸wɳ}6Rk ! uc2?&#"*Tx⮡Q#d<v>=B<]p4J OkS(2d~x/ aqB=HIS (a ؗCu2 C":G.F i"r6t_;a>~Ho!n/b8Z3; H朵2,S鳙fQ0A7P8e/H93qmS-l㮯uFrKҿ&v&PV5z.bOEvmENV#=ulKlKÄmKCyc=H~/D-:Rs:fʞ_?b+T?㗾+v "7j\ϴ%}U@1W98NS@Y.qE#-k%r&X7Dp u~Êm$? PE^Ym߮%z#!,ޱ4ö\ NYaӮ 2ۮp~{IrDh8l_K_!z 11@@#ܴ`#aY6Pΐ쯆uңO8oF3(zO.䍨gW/Fr 3Nҿ8. yŔZeUr%NBg\ũ|Jw<=4US٦ ]rzYܹs-+>[Hz Ę98iΫ|U~8Tln8~uVtAxo^ /P|qA 5_ȳ!o|Ag!:i7gT0~c^_3 {4GUAw^n:q ,kz30hz40>T`@ʼnyfM[WD}ܺy;wkFFoѠA}"##h49+y#x7yED,jpUjM-L_s1Z(z , XA cBH\cِ5f0TD*Sx R)RNs2Z}m2~Q2Nrǥ2.;7K\əǏcC(M#zy0:tE?+9Ʌ"~a/+<ϋ~ FNt^3v<}q )17\afz @0SdDDˈXDա0_3no`l;yDb~^7\al[6fiW/;̂a_s:zED^8h~ˣ/"5Lz͉Sd1E6&;]6Ƽɹa@3cX~0.R^l/D+)0_6"_^@ư54:& 'W>`4!ı@~S.bQ 4ڽPZq'_HM/Wݴ6'Pg0mPVƾ¥h|vj GT @Uh) <ϱH/aW0_6A@З~a䄁qr4iC`y#Or 7 dr .^e/ss\ K\|%k5^^yqqsF:95i 0iS[*,oq=v]^vI^14N"(E WZ. Ǜ'<רFnts-+L0& ٫?޸,r H]ٜnWO= 鴽>m BmjcIGQڽ!'Šl؍=V`@_s"6טݖq(ӹVzޥ.I4shB#h?Sqk[0?+`}[&Ag3tX'sH:!{ˎqB;o1$Jq{\L,s~YcZ˱G)vX \{Q9p$mA23ݡ6%^X_G-]:?Ff΅y?WB8+H37+ 1`vr v/͖2@57o~l2o['xχtip9TBp!*> n/UGXDpY?q-=ZѾsSjpkҳvsY)pS)5Ep51.K苯fNrQ[ib3WL'pCygln\yU̼>9TMBO/,^?q狿/eL9ːJU j[C6%7!"*&uEJWoNuqNNJN^k7g:qM1b:V l K5]<W>NxfUۏ3{a~\$P'#77Ek[gM) 2GʵY&ra0z҉\ܯ1{#|d'Ci A=( KɝGf*5c{]Mufu]AIϰq.pS^HbB9rv )1l U6$_"r<>ǩ&WRN[fV-BkXMo؃4u`W} aώ]D"Aܔ cqn9X5CiT\sZt#ǔ}:a1c6R/kugڗ-:ZLgxU뮐t~j07t|P:xwZ?;F&.J9%|3>Z;ێݽ5!)ԫfL7IEBrc® \5#4j )‰S6pm]Mג̟x:rI6E T f~y~0@3룃YV,+Gyl0M@/:Ί#Fԉ\kM@ۂ׏k 7ϥҎ)ʉ˰-[B;s-X.Y[De"Q'?B@G3m&7 0OΞ OձnhN/mٔ(X4OwUGK0g7Akq@ZqӷJL#% NO_|sȎmif|DcPb(C'`"OSy>%]{VHP95'M[IG$y"N0V5|3'2] jћa[Մ̫HI!]bC LQi$4B=64~\Em#[+K>: .-2 p@`}kWF :5wcc9p#h$+|x iDg}8[EYPzo*LcFn=7вF `/AЇaRz֪ (pS=6ߝ gspl\uj2(oܔMIf?Y\2ؓ+:FdRu*Ɋ$ ;J_9lAnCSNjD!Ē`v2ZcfL泫:##ظ8ʖ-Gjj 1y#ubEL/9 ͼ^ f7=G2wxE2;b./ō)/l9o ĐT w Tb9/ʡ/Ds l{BZg}pɛ.-;?ZA d.uu_ǎԱ,:@H~/TZ~,_>l7`АNjjSSIUH+H2s~ޔү©0!ns/~UM*'fQ߉2f 3f:F`*dڧvf骆rU׬H_ga7iOৣLW7wW3$~ NJ%Lq =ÖcѸv&7Qp6vFV&Ea@ֈuVa,_99.~:Z&+K jYe;A;N ψo1`OUEŴ<~ H8L&)N46KA]UgloF8 TNOoPZ(AUVr]'A$BAP44 $GDG$X#Žfc&X$T${ʂO-E...77wRSSII1`tUNseF4$s;6et&0_kQJSc,Gai^rJ JTT΅U'Hxqul \X'"RğoTi7ӳfyx;_HSm\VIc;1R*:Ľ>ݼ">uSQ۷早*l64/+$7]IѸe]$64\ԇY}eʮ =J ],Π}\!R̟͕!K(Us''iSTfbՙ/ڸ:mQzX@DEcKSlmKyؗ*= *P*m>҄Ra? LX՗%Kfn:GmQ@~Hvʌ+R,퓃P2wXEw4tz`U:̹O.zN,o^CVZ@[;trs0Fʛ\gh]_ԩ@RLj)8MfI0d\ًWLLnOLny5ߦ1pvq!66:SRݱh뇥H+ԭ[ؘSܸqؠȭ7sǩgddpv '22F3`Sq=TnY5E^G;܏ޙ'IGQi\:BgU1]o#hy ӑu͛ԩ[d-ZmԮyC8 vM)+R=/#r/-+JQ(:y| x~Cw2&Njf˩T˷\qL3ǎM9u+Eϱ뎸B9J'c ?"=Ed7g)dSË[,/yVcXn(l 6.?GcK)cfׁ"BC{xmɏ$t>[&ff*3ݰ/i)wr^*Bƣ z>(_!뮑t}يcלcjt8?m~zLR"d33iɖY{7u g0/c˗{ X7eU۲-â@($q,z-'Djo˾()Z9y=(JlQ=&e 62gsTFuh~ F4:\6 |33(/8Djz]w`0?X̱"x(EAi:Y/OסӘ՜ˋ@R!"d z e6k3QSp9wj?>Mu'l?Mp3.uyFS/yK\t#O +t&WjN}¡;qT<9'f/*_ 9N:Q'\f^߲Yg%"Bբ̷]@U}+i~jD 92;JV{5eGwuӴV5zw&Ib?݉5Q㍖ nvgm|ߌKÚT٘w?Ν^t-5Q =BZF}Q,=B*]JU=|{ :'f*|s!~?QF,A*&C|,'sF}q%SQ,=nww)l dd.3i4V%?Ff΅y?WB8+Hڙ?'sI4.eYgn2Wvcz fo^ -#xw:}n=ŽU8[5-{|uqͲuq 룗t yH#fM<}?OC@֒Fm!=6Z,#>>ҙ(]T&dCuXŤN(Cѷ.21wfUb^XWp# 4QXzLJyP% 2%NUI'L''%R'w* 3 yP'#77Ek[gMEw/?={ϏlE#Z azHo-C+5;x{6J/i<nBJ [o"H"?':>s.s}?3|BѦU8Jf @{XE=vE wPcv^kg2huW,F6AY&_N00855kߦ 3cABF4u]%T(aL{$H)6neQ!1=+U 9=Okmjf:1W]j V`3OnbASuwzy=ٟ>2x˖o3 GT= Y_9TM|y'x.kJE9u*\p'q07c9}H8̍gaoUUtRx"åveor/̱Wկ=}ˬM9Ъ%[u[8[p )X?l ?yc[5ʥ.ݻCZm3;,?g\:>Ygo1:twB*Gn`,݆gr_5I9aUXyUn3,&$(.3~mwSgƄ)%R3I鸳 TJvyn^jD IOyX'U((&dQ)"B,Xk"u7$q߉JRڼW);3emw9JewE˽Y[OvIl^'.6kmN:͆([Ou<_֔+!%%g|ܶYQwPZ/E)7F(\kO쿛HHH'EkU}߱| K[PF|P7o8Ƶ&l$t҉:} [dJwD'fPw"1zEjol{rWZ&EovDVs5=*'öHgǸ.LچQQ\TE9i964vHq6&)P&wcc9pj$+|x O.8V*̯܆ EjD!Ē r""ț y}eod4Ǧ#v&NG>[/9-}EygI xkf^…<4>$wj),Q̙*3!6${*d2bftAH80:~݀^\otRS3АJB\!Gj4r <8#`o3(t6|围 oQ&+?k7?~[ɷyUmAMd4ZPc ""2r*7/,ZE\y ğoKϚ ~8 ;oq <[\H~m>-s|Ć|>뾂c2(%Ԗ6+3iȯ w 2 Pf{;r y}+-R-KFL^5?׃9VQZVcWlp@0ިVky'N7D»{|dξLiGj̱pA_mu:w-8 Ȥe]Dsq̱kNXܹc[!O qo;q>u?D٪Lyw^DDD{-[hyTh'k>83PdOdY&R4cED^s# O Kpzm*^#DDD(BE^48DjoŮg]hʓi-+G6^XDDĨG} (йmU㥎9N8^rWLs,J]1AQkQ9/W/qy|?j2hDXDP="/!Sc_d~lVז) ^8qtWR$v&yMJLqtoR@/KW.ψ]_ϒԀӏG=#5)O1; O3m[uޠA͆Qk{Bќ#:-'U2`[<7wB?q_+&+Z)/ק笽(MŦX{=)";KRb´EGPu>:(qGq"W97\q/Ӂcqٙĵ igIJWiH߅7I1a;ӣܜj;6/4IGQڽ!Ϟ.Q)7bpsx s2\kLn˸an[d_)n/2cKxٝ&n(/_ S hPuF<P<M8J\{Q9p$mA2<#>4u`T~QsvĬ%2w\65I̢8{_" @{3BMf<ʟ+{!lAa9Ff&{3p=<q0|OR2Skۚ!AyPezG/s._G-GF 8x$F6q7|d[N+EM:nMx|KT_Vsc\+]/P6m4W= ߎEDD JGdݬt }@FU tLzn'7!"*&uEJWoNuq=w&_mVkTr5XvBNyi_3CYW]!8!yy nVo?*6uq7 TP›Ӿr)ʾ99KM1b:V l K _zLJyP% 2y%[1|4?mx_+QssH89)J8PTܜQH̫:QY-}(]%:`m¶v0ul v܋ 2GʵYiR+ѐKwq%XFFکpf/st~j07t|P:xTHΪ .Ru _jw]&v`ၭ9Z li:j#7t=HSg v՗ܥH$$M9k~='RQ>!%-[ї|VA$J2.(JKբ so[s2檇HgxU"fUWȎkIıkMY,fyԑ'r51'Vq/Mq#R#C5'ÕHʜc8h?M qigƾYTDi,盵QןDi߅'l֪2OR - IDAT4O𤙿]9u“7 w]:i<~ˍ$Hên29Frղ)G_/mx3M{ʥ.ݻ^yWhvkzE *l s@p7f9HOnLu &c$^gdD)8t6׎{Rv})*'N\~ckQB秾~kƅ}$ChX¹@\# zW1~W=Cb'{{=&'rtlKFr5.!.(;q rlD:2=T!)ԫfL7(E@_{RA y0x|DDDDP YY,faW6 .6HM62oRd\0_q9COޤWf&jl `[)Zs+2V7Rw$u?dՕHF^kX'_N^~;?mطWIᇎO9Yyt\2XEYk9~.vMEPNd_lWm8Zv-X.HR*L6t3U!̟!k9eeLME前-2g'nu(ɪoTLO3~Vm ڈU=q->!=&Ѩvן ̳o.ixsi\_wB)U(R`DNWȫHvosUZ/ERxe cQ孚A-0 ֪H|adB?)& ?0˶µ*"8 Aԅ݀2gw? Ϳ$JC\u%jkMCFAm̪Qfq$FmҶԵ>Ngyz.Y/ZLё|1aؿٶ>?w4Q_/ֱodEMf# >~;/o}` Rz #&]n]Iuk >+з^IڸmSP"{?4j T5( LQ,g@'`zgw$qR%h^*!NsܹeYgmeɉ ciΉe="5ifnMZ iRWb692,7gB+jup㛙$vT5S3+K%p nPU ~ێn̝ܶ֋ʈqiY،SQH%,,=%MwZ4kC*.OCNE9P[(Ff |F&Nv(śah -\Űcr m1N ˕lxgpʳ!#~OZDc}~9'+  [D*֚ɫ'SAiv SP}XsTl{z>Xؗ9N g$x9D{$Fx@9VOg 02S8 `ϴ_K HB= Qs 51DHOc5j0Q>kUƓ1% ʅJ{Qy/Nb\MxgEZ9.DWl-;1;½ xN~˞ԯ-}Tqk%6\ĞrNܝGzؖؔὍx/{ 28P6,{O#5CPDY93?;Koc z!sn3NkߨnQOq𺸘RTRGj^ǁ23Q?~,Ŷ$VZ/ڡ{@CzZ:hHOM%U!E#C/oQá;/}qF8 TNOoPZ(3ŭUVr]'A$ȴ]@ޘ55j6W b^}zU5Qfjg4~]pMޑ jk~`oWhNleR >6?{E%R *BWQE@Q HiPJW(U#ER z )]I v$ 7eg7o\a~wNgUӄ̙?pcGL^NV $Ǣ}dzu N?MDLL=a.W E/ϔ7;=3צP2QuGS#S! ֬[ '"H ;,#  p~)7&ENl˘OѮ7!it{@2|&Cz{^>Ql)qWгnQ}؟d僙p=oMjըVcrGص#;]bB˪To3 ?gjhEn,;yQ; :MHi]]YKf_x~%j?gͻ5pL]T!@4?|W>ͩѺ8o}\O̍TTn'=V5QLXzT!Zk?ьSMc|Ҥ z|C<:uP+_HJ]2Iw=.{!f/m&D$lX#VIL'SH iKL$:,Y edFذa]ԛ7o#44b.'ӿbjS*}fGGӨ&ZG{G8Ν;Gxx- gӐ$l6ۭϏRU:d}aH uy Px@ 6/s]*dd`"I*16鮿|65!hҸE# odxB8Å^*#P*Ykc;~";ܺF(]{*l&R%?vw[=K5r;0o5U!#S摰at@m1nqq 4ycPϞ#h4,#L@_~ қ {ލS#9[6G^`̡c|0p7J(5ʧXSgid=Os9G%e_H4n?v'[eeՄkMtçyUK˿ϑvzӪA=7hNqr=-Y2ʖWV|}p85&kCnhV| ^iA``ɪ ?I=*_1`gViyЫOźb'vufRkm*)^)&]+Oh&戓tZ2#fc8(ٚx^M(S*x,Ǻ#C m̯f@,1~8qVᩁ_/Qێ\!!aƀNu ٜ[>cXVl¬Yȷ-8T1e]yVIhTk3ٕh)qN`kF3_BR0j$+e;Wc2'#%Mcư} Kwqy-rR[ ;|3|a77ϦsW $ |>5c+_l3g|d;UGO9..Ǚ5ZM5+ e[>䙊,z|7"r,EDm&۰L.{!-LiZ36:|nV/Wcmt uZlodˍ|JWGVbdc1ԽBԩQФpMXi?R?&ޓggcϕ\-_FwlU@"{??Aώ;8{۶̦[$Mªq8/3߱)"GzX<ϳﱵ7}lKFʧ>/K\0!ք8gd}<9Aَp t ij.m)Xr̋ou&Mt'f֎2?r~Hw9eB[QSṨP+?+DO\Ё'KtcDQBjGh<C(ȱZxrfL|Ci\3JM _xcC!J){]2ਗ਼Q>Q%N Cç@XV<׵EȖ)! 7*? &(AĩR/&.qfw's"1`%KjXfw?Gҳ~(uG33~$w(֔ |m~Qin2u=k">q'|EA@lζԜųrd[iqt $I5,8@TBEiqY3$Ew+gS=4ʿxz*]a-eJ MD0:b2,2 kiѢg?ݪ*9`6HBI\]x/"=EP\^+[3/!Q-g KGp4 d~2Ule՚qK#<$ |/|, Eoͼ@F[>[j<*oQ_\ΠaW 55}ǴkfTMwzes9րUzu?ʤi% RV+̬u֜dkxfDmiKyiZ&\,;XQ aLU{L-4lyU+?A䥸q u^kqݱXlr%ƌJ~UV=bmEDz/T$_JŻH}3&d_bZ(1dl9BS\lĥ2&AY @\ĥrO>KFlShRZ:>&ؓ?Dn$&I9(wAt@Bhh(zV*s׬4w\eS;$IBr¸maӎ?ٳe> =T5 e[hZ⇎<:GUJD=z.n%6לQW)6ũ NMih0.rYeq<31kzPI3> jy;xj_Z[v>s>{T1|JL>siRҼu}*S59^[FJchj~ȔUG8,l-^\ |5g.'O/D듧k8ZP4w[I9b#VbժUrTNeӘݫEVt? sV?G_m)I3 Y9gbNǒpjՉ@ #+%헛`bNϲHf=үNf#. X1$0Hy+|3>Ւĥ[,' k^Yw*}45R?(_4L.fh}VN妝>چY{5 k!@]|fp1(z(j:hcJd' Rp949w^M{3,v?-nuל(\̃G*k:Ʊ}?0MOZ1KslLTn<X\\b)$WRo rGր4% 5SK.4 ȱxoƄO׍pqqŅ-Ws%<Ƭ }>U.0a:ەLݘ-y1 ?gh;e fOҨ3YU)}i3eg3OOFTqMSxtsX]?6bYsZ-9z> Z|<ުO6ʨuFVQ&&O9g[O>?(U^l><3lSK(H<#.$ PyT۶;NP W;eE i,ɬU3/<B(ւUy5d|:GFӣA(.Dog˱ &~.iSQ.-q(B-Sgɴt2f'ᨧ+8 JW ҳ!C!蕫fJt;.c+_}(jҔy)ON~d'ʄr;k0F}3ں=1-GW^p֘]&,Qc iCd[C:޴cF1÷$Chl E ѵm覡UYh L*/DѲWKUjدRESl3c'vn=&btD@$ ރAH\ Et _8fzW6'bǯQ M"2x IDAT6 r^5RzQe/E߶&vYɌY|XFKwQϭLL<($5?ee.^stߧjGGl,BQ!b4t A⏟2;$/J)[JvE1Q3eho#KK7*ݨ;l[u.9[^rsO>Q/:/NaŋS/"|cX}&)2val2c4Za61ETj"F.5N9 Y2yRLכXE`몠3C8~ةaE oh啡; )q tع /g-|m+XMUI!vP#4Ὦj:sn߯cGL^NV $Ǣ}dzu#׺ׂ[eX ^^׮O_[1uGSC^'S%^6.J ќ B#xXmV R*?J;TK?kԨQhG}}yJD;Ȕv'9nObDJݏp!-b,KBp3~=卛"0"{t@3}1nBvmKwe|6b FG{SBSwȜC=7n*MoOT;)AC`TWbO59Iy~O]N{Jl&rCR%hq@Í>X/- шdp@Hs1Ór:E dWqT*ŵ<F t$/hXx&秭Ͽ}B/>_ߋϋ%)[RZgʦk({<dG?\T^Y0d`ÊG N7\՞B-22;R9cG,2EcձS)2KII4ά(9Tx::.br (($M|DpOr[8,~T)+K6mX߾>83x[ Q\?XnlW<2#WF'MT"ҋ_l9yHR-re"gNϢI0#ّНl9٘MGm!EYHqO2ٿ>o6=j8a༮+Z^bwSP-{?܀|˱ /ՙ4Vv%ưm>S'SXq[_/Gm+-yew(C e?IS-ڻDG= ߲ˮW^%I0_S d˱ j`0VqwRb!337ob6qttDx(m&">F,G)X,222 @FF:& Պfjb2HG ###tE 2O9X22P*GaG;_'iV9}$v]2EUWcкk,ÿڍʧҿp6DV "_.f3_hL?F),._<˒En_cHImw [ed.6t B FV+*^yŸ^-6&3F fZDVNJm=n/| d_ бp Ȕ]F# &#wb0qqqU^yJFפOT5|J-ADT,K /_|}3 >^("+22RRNblL>>>c|||elRpi~ѝ iФ#Ne|[,mFd x4A~a?_4YP$9vs~Đ-225|9NUaU'[ed&6L*^tقgϞޢWXnq(VżyCF܊,Z k""AЅJ ΟSN],DK"[c1?h8 }b#[e YhS*TFVed&$a4Q(DlY?l A0lxiD]26l)Yz̓uANHp\j7 QU^-qkrddE<ȖcGLSKjEeO_^ z6se>nɼHF%7s^јNid^ CprBq oI2aP7l O(ERi-22Y1) k׮!⽸# \B;8҉K Δr:'(q҈K*Κ Qgزs7,Ey@J,XGGS7=XFSM9bsȽ:<Bj$&cN2Eҽr"9s~L;SˎTp<"]-E_B\%GOn318;!/co\7sb] ك MT*ŵ돎nyo|}j k_;z[ e.WҨ: O_s0M/XFlP(pqqEqEJ] Rҥ :\\\ _Q^vz=id1.>!jು8(y*v i݈F͟e%Pj[2+^jF+0y#Uع631Ķe0 jT.mZ~Λ6fv1hz֥<`Jϱzj'^Bwd(5Z`tՖJ{#3>|?BwST\zÇs窂j߀r1` U֢'ǃa_!wL~9I<~Ģ 7_-Zm9B`Fq&3Dzْ?LO*Tl-3 )OPDCzN5s.$vLz/GHz|{.ѕ 'fs^dWMEXof @毳_ݭɆv;n{꽃]케 I{U_o|+vbwtZ2#fc8(ٮ|`2u|ug'O8I/SJb\\tGۘ_݃/#P*YqӵZj1P*\w ߇o^~~T c?jGD)KޙqiΧoC{3TGG_?p0}!Lҕxw|叐x]i/WY;Ex@⹮p(B&\?(ܨ+|ۛ|cX8Ǐ,)b %KjXfw?Gҳz|1sso֔ |m~QiIݻHFsOڳOI_A<-5}ٖjZg%Go 8@TBEiqY3EJO>ҟ\xtr 9[0v!xiT8RD6z~d{j;xS,Tk_Z'&9]aPLs/"N%,/ nVrJa{HGʕ + *UN+tJ#WJ;ϱI@"VZyCAF(Y's{=Əfm\ǟ>ʇ 5LzNM-<}0% .1-m* w͌A o^jࡌn;~uyO=G2UsiE6]yx( gXz?~xc.(LgQqW"˱dd[K/YIdkkxf?f}d$2p}& vX3YLVo5.} X%x%|"}p~7>7gt 8*[]8ھK~ヘ9[h ӏQYl R1 8;;舧'zɈjET(pP;8hm7<;JrG"|k3i@懿JQq~\$IBr¸#$%%=΁xW~C[kf6mĊ1{Wl=#t,^dW?!kc_q=\XmGϭkNH),2NwjR/\Aաp,z3v+xf]c:TQ0FxAGo'O?>Ǎv>s>{3)MX+Ne6 NZקR c| gKZ@?|ړOqڸITU"'+Gi;~4/ _tFD”̃ + l"D1kDFF)mp!vnc??|&ϕsCLҾ=ZmCB=rX1TT}tO^Λ`zAGrǸiRh|2i5`%Qn y|HXz[ʛjOӽש? _z,U~ OcD==%BmǴ{Q5۵=, aݴ㷫$ccΧTmWW 1g;W#ZV{0=KS|d̽Tn<}SZ TNo[<]>;P\2.P <_vq!{Tx,kuᴱ"222222#zrRF ho)͒Y37k4K^5BCaX1 f u'Y]@CzfjՀ"j\sCOT7 +B7\c!JQ/?>yJoU]p(_ٺS4i1TV5+m)v\4Hb{d<m AJ=l.T "<'dǷOB[/h6'blD%6̶;6 e2lT '<'>[IYcgr2hRΓ󨋿#l)qMjT +%ACx_N~4!<߮.>f;4~8q?EIN!% [|ѭ~W *sif 78/N)ng #%n3eLo AtElO^Q^d/Cv O^a61-H0"*  [X=*ۉ0G}Fp1W/r,^W^^Ϝh .?N @O 3WH7a炼lԞ`4V'Aӄ̙?6}îZ g3y;-Z'T Ǣ`ʚt\00kAq뻐P{GR^ZĂEBeL/ Y^ȢwHW0{;t WpqjU^=_'A}w Ϛ8E^(S52ddccQDפOT5|J-ADTl sڮ5U'; &5֒Xi<tdVT4nő]. g:,o?dE IDATŀ_ގ (wќQHȜ IJzCoOT;)1U֚O4#T!#;]bB˪To3 ?guvqEn,;yQ; :MHi]1;4tsIaN(+EgY| K(fc01{dr#؈22222aÆ Rtt}Ro޼u0..P*WzM)=9ǹsbxbbfQ7)ckg+NG#m9"OY?~t`b|>ecXIfLI#̃FE=<ر}[oZ1vKLVˮSzhὑw\T(d? 7wO+[edwJd9yXu eXFFF?L(Ǜ6m|Myh[G?(\c KLc 0DF P8N ˔ܿc$fa0-2T*%("ef&cG<ĽR&)Ȋç4DZ FRb!##tz!2%ZţJxD,b?:F% <}d}nGt4u#ڳ9, o}eddz BVc0IOO`@PPtz,{ F.#P&;8z;M3?U?v{/8]l9)XV23uTTAtL&V͆jd2B!RR%233Z;Cm=CE+#)q\*DnZrɍ/L Gн# 6m@ZV,KmK0>"P5_Qb`R(~/y隄QHV]4n5}ޤKte ٜ?՜Svѳ.$We|}؉iϿ/wZrYt & &Gfzɖl9)l6 b6c4 h0bZ !==q xA (1m{㻓duʄr|?U(Ԏ͆γyAvGcS?j7s,Ǚ6;ϭi+]&8ӧ]٤پu!/?1 NH5l۶Ukx_nsbsFW>Q%Nj<<4_-Z'j%&c*5䷃|9\/9@<\J^IB7blRc4EdtӍqO;ɥcӡ9cӾGrL-{%7QּzLn<:s$L\,D%esS11:OWNvor$ŦWܢ՜?2|I?`֙/ۓ@sM#48ʵ+ƏfŎ2Z]FR'g-9qv4)aqmSD^p 7 OK>84)xE@ vݞ:dr,#S6ldffl'lӓLv>oP[m[Lj{-$YkcfqmY9׾U,τ8" PL 63_<_e;˸ecEHaa|̌ugtJˈNݞ2m޼m rA\Msoj7?[o v3uL}<5XWn[ ?-vP""JAX$!9Uaoh Atߣp]˽b_KVLqed&$a4P(DldL؋M!Fpq~kBTք{PS? {m[?Ȳ#];!50X38-o;GEQ,|ebi^4A"87(CV?RmCEgPv7e蟹4 CPKXt@BϝFvӵmTd}hQNX+ CS(1TT}tO^.x*@T" a;Ξv?]\3woLgeCVed.͆N˱]N zRQVcz|×qɩPϙ'm%$3'H`ͼHF%TY!#ߧws$=g~ZKd Tt}3I縙/S7g틂ItA(nbWMs,Z/ ~S!) !kH?>ZSr9v4"%ï򨎷kwjR)i%ۅ-]N痣9[ޙ~wQm~vߥ7R!{Q@D")*6D)TDDl`젂TzzqIHr$$`L6:^x[&Nvrquc/[|4cp oߩ<6P%yDgE׈X%V TLOgyFL"::):tRVU-` #_?zҎۚ+skoȮӄ7sye&%L, ܆A0t~1[X>w#Jkַ$K lcu/BMeQW~(B^ȈΗ֮]v܉{%11 VcY FTAX߷$4hPltލ+V ͆V{I| R<5[O.$))^W\IjjoJ}hҸ1182tz{4hHppᶑgU0wOAnpSzܐM+N0}ū+k+|~;HH^x?Bm&H'bBL]ς3ȵp-uIZ ,㫹sXvNِN7La 1 TdY&4$_~u>0c5\? $Ӊ``pw5BCYK,[pH( U`hAbXgӦʹ$kE{H>̦MR'su b=wjB4n!_+oDÁdbҒ hy?﬽4a/&| G67`y \jVU@^^fk0V%""Hnۂ@ոKw7EDDe?+ĉz m׫je֭/@j~1?[ ѣGٴi_ͧ,Hho*L?W&q1H@ҁݽHc+Ym8qϠj]&ko}_2VW,z)IåɕxF/jU_VXjU~Z .UEuZ ArK8B`Rwlv+U-r &^n`` , ))g-.4Z &ZQQGl.: aOM`[ A Ώpv`ZIMM__!W. Xx'#ϚK\l]th4!2FFd,#KgK$ȒT㫪 ( \ ~\\.Ejcㆍ$ dVQYOIX,FBCCZl6\F1 FL&%'w+[n^'QT_Q:^Zj0a,iwо}dY#T$Ioi PUkoo%Iu6|HAEF! Œ}KTѕJPn ݭ{r\t\Mw/o '2"(Qo>z+BGiZO`մ|ᅩ3'Ns,ϚKQt7t:\.'vA* @~T8{e_C _^.y",[~: |5QQŎ ]'\b}EARuVn/IdޝEUO<+]xˉFoDVq* NWn~fG=ErfVO;yL{u /D*#%rʊ_j#/|aGY9^&r }a5SC6=VH-M̈M0c%5&w߷>Anufc0vLr)J  (;>mWsK~af2wƵeC_a0f\@yb $]X^}~PW^yUVѥKWzmlּs&/vPw9(%|XP]; `4R0qH19SrR_ߝEq:>]kƱc;vl[@/^R͙BQ!*EUK]tƗwgQ=z4.w}mZe%ҭ*Ѕe?!2_>݋EOº=qs7}G|pzg[GZ[VҜp(_SRHMġ'T=2_m?1$boDyû1wf$G_9JI4>J:fr0M&>H.-盬Lڷk?uLGeLF3͎Pfj1jޚb(jjt3(J j^Vd,YVG6mXZhAV ϱhj g`%`=ןUj1tJG>̹rոua5@P0nN}/<-]MS8zt -OX1n@Z g'r8}^YʣS&uK;䃑,x|xd*vu~( ]& /E($ BLL 1јLW-5 K1YdY&((^OxXyd IDAT@ vmEQlh42 *j9| I6 EQ<"+SX%|8o'oov]"M/+1lQ?M0g|W1:n/uM23t\[|k==Qu% hr%I0k:[4n 1`4=  $ILRB}fzK-., bTt UT=mVy$ k^.zmQ 058^$;+(r 4 a0?WDm{qr`ZRl3NE,]5̔R*qWXѡX l6؏N+@ ?,l,kHN>F)ջ nNS|-8,goO;H>sΙɾ"E y-~l)k5 !F<U0`E R  "#@r_`Acgksv$4K8J TW${Җl*8R6cZb YYfWwaS4X8娘nEWBDtjNlo@ FC@'O|18}xtz=LNN^ oSqjDG ]AAWx"h~x^>FghĠʵРf'J[4ʛRpZ!^FymϪ/ѵ-w\ɡCӷNkhIrr2GCD׊Vco'fDh4G~ s,I߳?RV>e.t:$8dt^+\UŃE .u*|WZpXn 6qFF 526;o~b G'§dWH V";;-[B5Q>Ul"6& gnjՊ"::рjĉc8uFKl\mbb1;:w\ʆ@phgeen+svg6+*P+:'rvMӉVZ$I5z qIt:9 5_5m+\5[Ӛ<{T&,Fb1BZz&ǎrh0DFDNhh(f-+X98v) 4kނ,l6+ݳ 4\oب9?\b BݳGBWMC:\ϛ2GKbh4՚nRhdz=F eR"O\9Ʊ(X6v~ ʏfj* rW>3#ܜdfr9_i=W>B5Q>燂,,3zeY.S,\*x) "cJL#]+tmfVu&zā"_5 Gfs$./!ުJ\\N \R3Ǫ^zp$-`z!M Qʫ."Cq8\i=W>B5Q>"k4-%Wp>QUPf}1Hm3i ocg0pԤܜoԶQa NlvAg_$/R;]s]}ie)|SMWyT?ḅ;WrE|Q]:x1QKC$EPQns j?"r}5#Dlv 1v8-`=[\OGu@'Yƣ-WZ-S6>/ۛC9 {,8/ϱ6m <mZ4#!Ԍod<[/_I-'#M n? F pp쳗5Xjㆧ1fh|GuG^IP|O29#.3m<4y̘3`@$_]R f䲭 xce)h-Q4qwxz=:vV> 4{1 5eД]wRO繎F+=bWҿ{t,1q<Όa\tGd/y5J4T+<uhjaɯcSv1nS43+c3_n=ޜ7Opb8ܟ1 #zDEAфt!^|g'iX)|ukJ5m3!/ƈ2p&:']:'{i4k&taӼ=rl hyQUw {pfFB-VBV|qɀ%zwߝ El '4 !b6~ \i`g(w@@ hIh&?%h:e*9_oS=1:٠GSWfc~Ґk\j[KÏɖx. 8qjBۖ2; EߕH=c0ed62će|[a݋ϱޏo1D5 '3kɇ?Sr34[:Y9)1|<'dO[%O7C[rk~/Qj&S>:c2|{YԎɋ;iw|x;+_fkF^XOCmo1$xҝ2#/^hçV'.;2F2-M󢧒zkN:3c2fKa3^u\W[?s (^䩎Y%e J#qWD'e : W*zo埲l,?R"*Y{-=Ë{?$ i q"s{*R Ju oKw s╧WYQUZ .MT5ϱ\:U=^s\9>'!2F<˾?ѵgotF\׋]r9ӥ9L6A4 z -C[x) Eo֜OY\I{ҽkWwJ﻾T Ue/ѤC'kK::'S}Y,FUGD$juQt؝9m;7]%};3hDYd$9ڍ0Kܿ #]:4{)2z3}dm;nfРxÝ<6Az!7s:ddŎ n &X;lVr3<&3rE, ~mp+ny1(r:]H+ׂ_ɗ$=zƩG91аA R*oɋs4EO%.WCZB߈s)<[cY܂'K#?JrJ'qcdS@OBR6dУaFҚLvd $d Iz\)A:K:3 ΄xo%/4>+e3z,K $֢-w-/HHUpaEBo;_: J@~|%e:sPJг[gVּVJ}ɯRm~,uԗKztZDip Z %ٽԹאd3T1OP7hx,}5E`R8eWS0l'i0_1/Mˠbu|3d |oh=^(ZX TT-~PVHg:͡ik$~dF 'R""18Ejh؏˲8Ҏۛ_oȮӄ5A07ΜWp?/ |yXZ*-K@p;Fko!q|?XO^c9댷1rb uKQeYSuK-hCIyhzh)LHs,ff;iPv{݋>%]$zw&`s4́ 8w=C}i*x?<4=|y<حHqfq0I+{=0V],f-hјb=^W =Q]H v3_^J۷FiLWe@I+CO%|_( z䟷=H{s:$Չ=\`1`Vs8]4rJ~*6gH lHQg뼚ov6H5cZPM u_MZğ];xaԉmUxYPTrJU17+/csxTJPh6h"'Fs~5^N=LVItJT!i||/n X@Fo:=K+vU9q qNCG`per8?%75w")[Euf0.)%JSZi4vLs5)fHt,Lw9 ')NOƔ8'!ͩgc|7ZUYp}Iȁ-.1Km0/.k+Y6d#!ꋞ*rQ~2$kuԕuͫ^? A{sڀFIn[:NqTg[pmB*+13}_Ly1Փ%/rJ3ll7s۝MP5KM?'}z3(0+6[Lo}Kgm[TD uvu<*">͘Ԇ{_= %ZdE_Ϧ l1d: {ϓhu?}wra㖢Y\G=乜HXPZ 9lF0# ژ%#{poxyV5ǵҟ 4ak=EU8ޜw#[~$ ]L_bK6ذ/2HD3m1zpz&?M{y1$ݕ,^OևToπ`,M~깄l_Vy^Η=ݙeAYyl h$ 96!.#:ؔnoSss#zЅ'ֆsŔ}iAhN=RQ3{缳y5l!eoFFhw45K;-r.uʨP:ژwn!-XIoߩ+SyFS '5 yڵkΝ;u:8pݻ^8@P~d ֯z ugϞ A'I2 6`8'oeg@.t=D.do}QFX?p|w*L厫( yyyDEj-)'$ ȩS'1L~Zt?~ˍ+P29.>l۶7o`Rjɿ%U\Pu8r[:!ɿh:FH} |S^#T:*9[*<7lڴ{ *ڭG[?Md6RS,=Wpjx:͊SNw1xZ{rՋtT泥&{{^/RTJH  X>[!`4TP[U]zn>XURͅ皈?: OtnUԁuψ:.к)x):0l6RSS1Ll61@Psyh8Uz|Nk6s.U.ȷx 3J!?Z\th4-U䥤y$NhP~c؊ր-P2Ž}*Lz(N*ebk h48[Ǿoy5~TU N8^G-#i@$u/ ˲A$I;Feu8|iа;w 00Tu8b j&.~w^pj ƫI6PffHP+:'r9>ǩiؾjw؊؊-*.\|͚j,hтPa)m'8==-[Iך@ !?T\4oެZ͖[iۦ mVV{?IHHYӦ/@ )TAӸqǁiۦM4P#DFFVX0@ |鞖|2f3&BB @ ՁhbtB *F8\\^@ T)'\@I9~zAsŒ@ (c0ؙ[yq߰l@pPaϱo|0}V.,񪡌Z[|dz|KH3Lb1V|^v2i +(P)/|#G"A~it l.b62l,xPG=:WA#5 IDAT勼}gt{U6?˨W-WVV7q1|67q'}C'ٌ6awwm9 *j%yp 4Qzx]yY$r#o%ɪz̏=#ax& wLal\x0G3y p48Ϟ[o`),YNdCu-qdlaN==G%ZWМG&8Z`3aG*)ͽ=ǸkeLTԅ^K×x=X\w/=Aor7;uuqmĄdWi}x #[`|{x{i.b_ i 3S.SF)j+ 쨩{ݦgέo䏜v8]u7xZ>!ZyHO򕛎諆s*4]LW0Q5^j@ (r҈ATl9 ԍq(/0쓷x&ޙ4VV~Yq+H[7{/lˣ>a;iw!,K®ֳ;W:2W1OlSM[Ƴa' '1{G?)2$?3,cv>{ͻY|5'N;I*ՌƱ3m;)D97m!koW9SFѷI<2md>_a۹Ռͼ2MGîC: _-`ڧ)}E\ݚ11$4ɀAm xna.%52F`eOΰXCro䯜L%GA7i&|l_Y>&؅[ǶCg@:­cۢG $ ΀.MMByhZWԿ?吏EQrEbx ^yJ<ú f nM/^e@ d$ n쀼3vg<ß޿z"v 1H =1C:RK/#%TPx657ߒX"(Y;Y#E]lJQ7|qBmJHJ !z3 ;,xm2S&E?ENR:BZ78o+mPDWǙ8zuza)69Ds3)a/-ZFQ*0c!g HQMCőZv9a5Rrƽ7ocټ>xt_>mƗ::dNS-C}tA!sr^yk%;Fͅr`ӷ$áB=]npՌg}h#1xz}*C@P5a+wd"w:ànhU+Ikfr0͎:*p122@Ϛ:uOƕs̬5j VpۑWڣKk&T۹XLgIZ3:"kK&EMwjy8ֆ4'/븕Q%WqsѪ*>c7l *H3J~iP)Bc y$SۙQѪ 1!&ή;?3֛ZExJ2S&-/sh02<s>_iЖvϖQ3cmأ1%V iΒ%l)ٴq"G*S&Ń?>M$C37c'g f<0nٻ)}t6^'̜7Rǃq,t`h6Lȫ_c8qxּ+m$])=co cIV8M"F*LK#=# %r9Be%ynvU$a/~|)'ϔga=yC[Ycw-uMU mH"#?ʮ}t7Bۯ@n&S3GD&!/^UA GUU64妦Hޝ{[rӁHkO`_q- wfЈlL'&/D ӹY;n̝<\QR2Pj**XW{0~⹋y};taj@~xgu4 ("rtMlI캩vW]<7ix懿&1=1Hdك0/ݓVaui;`* mdu;WY,ݼxbLM幊䧜64vǻelTK ͺ)ώRvWDI3hZG$$Ƙ8џt.=W5z&~_}rmw7$kKo-.2.swm׃t@6֥/Q2.V/)wIpo iڵjΝHOtrAwFJJ w^ yv=ŀ0odbDDD*-u ">q9{ež ADDDD\y%wDDDDDΕgDTt=9 ֎uWo=y4@Z I2'=ۨR 뵢]ГUs[q)9s$UK$a(rgh'o={b7_Tըݸ-o7.?a{g|-+Wj9Ys1N$SZM'>`]R Փک/Þun;nYx+g!h]#SNW\{#S|=ϩyz~:&0IAx o _GcF {|#B2ټ:jqX^OX~e˪olw_sCn~Z'E>[O,of!{T"7G:k9f<;}; 0U%ܻ7=2G}ٷŠu|iUu(?,d 0c0BN|n'% Gf=}'Ccu8v⎮0 -qxRf=zmbhi:: ̛ ~}6y vds2w 5Z {`<|[b &44 d2Qex8թKttw}J8^xѹdS}׆BL*T;`&rT:;be\hjR=) jUSm%'U󿼑^sb1sH&5 +X{/xef7RhШQͮOfZeS?M}F]BW1Hgߑ<F]W @Jŏg't}.Wu.jG{ڞ{Od ou9y.yHIΏbN|C^Ġr?ȠU4nܘ0_#@ժU0ظq)Mr="{wJKKއ'^B'ڶ{n( ~r)ǒoeL>~" A/7hmy`5{̀]|~g?I1hM?[]9wwfF/s?%mOjcO}iYP0|\yLik<ۑ'b5mTa@S۬ ë؟1Xj[z[U{>c^Sggh?Cb1Sn߈NݺmR|kW8zR^I,</廥}}|+"1OY3^ݛor\;wrO}ƐwOy2y1 Z(%}l7"M W2/lDGxdGĻbbbU#^9cC+JzMf&v}t'|yoͳ^\s_۹1ٚHڐu/_S8auS?{5}^E\ 0Σ_/Ck$?JLwqxF"R9#)L%7""rZ3 "A C9ˢ~&''Q(|Wկ/}-;^=.̱<%~i8| ]p&k}֫xP榗yWJ4揃GHrCkrr'~o5eԥ/Lf<{q9.ۚ:X2Sv^kөԻ/IgRFZfNBĕ73d?r) /{d޽Ǿi@)3z*L57P,:J0V2b%7.}zn/vTg%>y=;f`z `&k]1j#{) 7Cp |~VZCT;GO|?7gDz>w?Ja|&2vdڥ|8k9<⿀Z̞شl.ZDMyk]dΟ߽~uSzu毭'S^7gC͸v h-n½tnZ:>j.[il{y]Zէvڴ:c˦te{Y]{b ؑ~i۶m#cǎrymXưRۑ+?MTR\/2ilڙYfՉN:SUMxNDHMzt1puj %5t^bAK3=I.WDD$pZDDrbd2jy멝o:c?r0u:T<-1QԮo A{"""vp:?x8v_W"##iժ5˗-d2aXj9뙕]/ """~*77v1<_ àvݺm@TTY-v-YiBp,""C IDAT<99T\Qt[NP VJDDf5v=KخLEDDat:1 [_%%8Nv;v\Bc?w4~y7kwM^0&b* hmX) eӮN,);R~[ z'!uתP8{=d:ݸi,Q]y|,xA8.oWO|f#,ySf=]Rf垕 u5 szhޞ'>#|ހh Bxd՝2{KrJvOgΓ5 F72$p\цM[pyq|^0atFy^Ҍq}x53G@VMiRz^nG Mt9[_N߱vSPS7EDDax˕;_O:~4oi'Ó˦Y#x~C=p|mҷ]<RO+>e\xs֝7w?dtx0\{Y4z(o_߬dOyv@L W\KKVw4gGk_kS8s ©n4Vs'΂qYڽAV.Z]Gvg 'j><$\y b0'r.Dgׂ u`@/FMrz ܇~单1swꅛ15ǰxOz^zb9v ts,"" w̱940#rF Μ b֓YC=v<|h*6ˢ]M֪،\vqaDFFi&[߰ippޙbr6E06ueoP&\&mǍ+81ǥm ±+p}]0w^ߘHpQj\›3y;9G:U>699a׮ftͼ '*%kJ.1o]\g9dkjjafa[V&{+8yzKK*DDDo0~ 9ӆ74◷kx3"8*̈́5z}Lv?VQmUc:ّgSpO~nyӬ5) &ڌfk8<{.mCj<"}z% kr/Dŷ0[NY% aC0 G4w>*+c =ԮgVvP(x˚f"""&&&{ + |P d:vVYiDzN±<& Jh; oj3;P\#0c(xlBY9Ջ4f"""dTKa<p,""Mes,p;VDDċuܥyQcEDDIX*(s5 ̪EDD)@-EDD)@-EDDEG~~>Ʒ+""ETDk׭Þup,""EnM,E)),yhc/uu"j<RΙ±u$_2D.??<~]=qWI>)xĎ5.Ck l6.JIa{!fK+c/!r݇#{18KƑq5"^rlh<וcr2.ADJa"""""EDDDD )R8)p,""""RHXDDDD±H!cB """""EDDDD )* &V!"""":DDDDD|Si1"""""dLJcۧň), y""""RqhR>͆~U"""""erjqct*Ǔ϶[0,""""񐗗OJJ8 @>͆l&''2)TDDDD\.aa6BCC8_cㄫUX,f6oZb53ƦX,GC'cDXXo ..0[r,YDDDDY6e$''c2^Q8X,DEE_M U+\ )ki6if&$b)fv Án/6fQZ5Lf3[la͚}QH'11ĪUlŦA6&f !>.| fZjRMXX&/h԰O6еk7b6ΝIDDDDe!'WjBa@or8{nCBܹ G͙3طo_W(""""R馛PIENDB`tora-2.1.3/src/help/images/windowsmenu.png0000644000175000017500000006100511303312237020316 0ustar michaelmichaelPNG  IHDR1({ pHYs : :" IDATxu`Gݓ$wܡŽ$(^J[()T~$@r;{{rfGygٹ7!C! rD1Lc@$y@Y(Y zItpɼw:`#l$ 6#N(XǴrL.Y(f|w9;#mߩxeg[@drtD.PF(۠ |۟4Ƌ JGK˄Q5EA*)x_ȡHԓm$$"Gc h8%h hڱ Ɇg2dFw/[hͱwe+`p1i*)ױNw(XtcL Qvmdf]h3簃D29<5pmc c~f˵]͹ms; ޸"'xi!z+.\$U1R(:$lQ؅ء ќ4CwTu)W>"BsEᤐ_)@)YLܞ"*JQUL$%"i) ?U%:*FN8jH>Ȯd*QS^:/W#+37^[)"85YHd9  1- /$k.pz*iv'KJHy*+BU`wA0N'i^?+& ;w"gh!ѲI H{{@pKs 9vK^8IFUϕEEG2MGkyrOxU]p rb_ SW6 8eq_.O߄ܬ+ n_Xxqj' K{%R9ȉ5Xtrɟ GHEsSiTpk OWE[C`"% ĿZ -)wI*g&Sn>ٌ`8Vб|劓TXI7_3GEz\R,1 B%Y~')b |+ tB/5r~uXB%DSKK&N"8:)\GosbR2^h7rS - [E JYMI[[OdV`A>͢@ 9S^Td-oL"kEv!3Ӑx>+a !./VF*O0"ē;Ǘ0=#-,񤁫sh_Sx!W nXo#s)ɟ+{lKR2/w23^_ܩ53\e|hoJ^rrlj.496-H7RNTL}504:0=d_01in47{cnq;@EY 8\-g'\Q>@ ?dɹj- rdfn~ێz~=ESJj$s"~~ ĵ=<+[GfJcCh D|L=eFg+@J H|;vܣl% pN4NjmPW.CtYTl^`T1o !F4|tS Yݧ司s?ǷYWDUlȫ9Iv/a1$l>$IΫ+cRߵOTֳRT*b95AݹqKBpwTP8ЋD7Ix։Z K:yd&._,{{}Z^7)n,詼;8t0¡ fRgT^sI[Ens-)'/'<氢 7wW;W~dGy% /ެoI |j]7WW3k}{9Q[tk`K̮==;t&G*ζui߱)nPlt_f٩Cn_b+zOB_n߮il׃74"7mQ*iԬE_N#dyUnNPJUwz Ѭ%֫ԓH~v>ggB<[/&y;s,~7r˙=VxguL1+_nZ?Nÿ1b3lm7$e.$%S[GJӴg/u|W$_HQ<{zM:`y2߶1d9/OY[ڸuN+[Ksuc9}ϞeԒJ0{q-{v-R⯕?xiR[6k#PߵWD8,8x K%^4xғ_;mA[֬~?1W<1'}8\ݺrM!Q>ѥLx [.qS>ڗy,kMA SF @a+2Lr}T\ Hē5fqblj㼕ܵAT}%NQ,lJ.ʫddxαo0qHѬ/QE|E9u!9͸"Ӝx9g<>;6/_>D Щ~Ծg>2\~I:ޑg{-KʵP&fP/|q%ΘdϮ3e<=#G<>6}m]!AUVzjժUi |s#Ӓ MC l1}ȷp͊_q+mrɽ vvS~߼7˳D6(PU%'S|Q%}s st&c؅I%#BByrl;D[/[1GNeX +HNCU4WMI8(*Sb}qR`vK1=5vQ- @+5*@K 3B@^g:W!u@d\8X`Єg^ZO#JVC/[ZBZq=$9{8n(3 5 Z ּ&pt\U[ Z WNm ]j|WOo:u獵hHE*>.M-]1` tEV Ԩ ϥ3^dX`N2)@^p?ϛ}kt I~;eJٙA!@wokJ݊/%Q^ | h4O{_@Thrq#OK*oەfښJ2- %r9D[X?Z r/^MT _޺w]_KB܍ {&d`~.=$ 2ݿvo% '(ks4jǖ>`Li`W 7x-``IW nT%Wt,/s/ےY>_YbnNŁmΙcr?5(E'a/;K]-[oT-3&&*YwR.9PE{"+HGNo $pvDX%LOZ!#G5H6KcweTMԼ|N-Wj_dt[\&SUzHmA&Ezyg+$wY!x Ӳꃣ[ԪE&}g|A E.oVz>pP1_nAK<$Ex*_Xe'Y.IԲki竜k/ɝt0 Bt:v\V]|qVA@OarAII^_AO{X"ֹ%p /9^8::Q$ŕ-RĆ栭Wv3k~Bp3YBQN#+!Q:._T./7AC% j l$lYvxHK{+E! xpplnn%scE! ~V΅oCH\&)>b\EOzxS\Gop uxSA=G 싒_e;`Y<[:\\A_B@4Tϰ]Sv\ܱ}sǶrZEDx>8jc/o) 33t_&E!@O7b%Fُ F wͰ*CyҶ ?GɶW;,"vz[_D"l^4,H{ t8cӼ4FK&,V[yǥg%KHHhb;++͚pc쬡T*jWZ!Be˖޽{lLx-du\in2"l/1asfƉ&-xvMdL61)O|f*%r)iI0?c}nKO-6nI13?5:ӪLQ 9*{``XBR#MkUEݳ6#LA$fBtC[%<+cLiH7M0SVhuZBeVD|]Ǹg[mBYf^{ebH ȼCȲp!5JҊf)3r9?c hQ8OLp~u< A䨪cKڂC=ox-Pn$!ň{lŷ/Vr 7YV#hL2NE\:Iӂ;h.If(<؎>Q\dNIF=물I~H9RL[(RR^:(L/e>*bauDN]=mD>[*%c6Nvrf'lkqEW)G@\x<S$i2o&1FLA䂬|+~kwc*#{J>lw:e)S[Qvo xíbI f1^+K2&MS$zH]a_qo9B\g28?QUGGsh$R{}`@[N'AyίΫ&\\~ "Q&ܳb/񊐔`Q/w9u/ Bs1ʕ;&ζ*:\m!&Jn +oȟW4,6~J'gI*mʮV ;HLoZ,u%dMw?!X茋~"`0GR c<NgT*}4M;[<`04$I$EQAAA@DGE%&%ʙ3==d2`0At7oߦ* Jʕ3gbb"b0?!d4fs\|Eӱb0 "SSS5~7`>ELfFIMM%fS `0 >S``u`0,x`x}`Mg?,/tcҁtm c$vXXjſf"U9w6 `٫t~w.,4܉ujjWs0K9gBF  MJG3Jn|F o=pnd;ѴV56j?|K[p?m^f_M1`0*٩Ts9T[nǪW.T'Z}c]={`$IW _ghKKZ'V`$N BOv3s:!_ mVO J'2QqRT%|kÚ)-G_:m`0 s}2(IK-A? `$|fZ@pe57z]VQOgHNy8C94I}`0٩r Фe6N{jsSF_5$oSVT3&.ԏ;67 _`0*I|`ғ탋n+*w'_iK-soj?O$тNL}*$._$ @v9ڈ? `0M~6~Wm?-6C|Ѵ7ʳᔡMvܾ ~4(C˴x`Q_@sUӦ?7*PnEAuXxθ6?/xvߗd#f5 o#GXٳ>b0̿Bw |:@a0w:`0,x ]b0wa0wY .Xg1 ƻ``0`|rm&ogCh 'u֚x}5]f=.>4ۓkCj}px`N,ߞԵܕ];wKĞ/Cn2ݢ0 &{uos7/ذn7j`0^ esvl'v~Ċg\=lˆ5E)?u^_>ңGNu,N>vymcJJ58p,j%?{߹V9 ~,m5~қrkCSB|5RƩ#Q& j5<I)uJ Pɷ70iQB-bp=h8gO\)7wAQ;Y[K _';u2doݩtR_\L ~WVP6>}bF& [v*@eHNy4SD:uԩӨߑ8Cl(ohECIPn"1 })(ˆ/:GBavڼ::Ỉ Z%rcȒߎڮqEJܶQo˵4ϝMD1PvJ`0lL㘈zloZ֗&yE@N,?H[olӯA|>`M~'D(|uZF$ɀʽ'\T+mh`N6Yg֎ݻv޵{ݛOk`Cd`d@qkgXf|iq.RPad/ogg*L󱋾. `5]^ӌGP@P SΛnF|ÊWkmZҨ߷4Z^`(XPI| ?Y?"۷m ș+׹s` /cW{TTQ2[ ῥXO1̇[`0b0w:`0,x ]=o" mC!  )dET!wRp &#!SB́ Dw `7l6#b3e` Y?pw8EED ľM19CA?f:$A@vDs 0@!J={&-=Ĥ$Dٷl(`dxm, IDATL"{[SW5 #gU۬d}X_S& “Ǣwl-6gg GNHguĩPaan9 2$ /܂S);8%&Fl  JO@2_i(2Ir35 ͂V 1x}` Y .` ]|` Y .Xg1 ƻGuj]#dd ?@5Ʈk\;6 Wnu`E5Q`0BW?]g.^>t娚fQ ^%fs!7kSȊ`ĝ?O7y@g>/[.=MU\̝ջNk.cЮ`0b`o/xkN(༙[.>I0!d1Yi; ާxNCFu3 }qB`Tr*3*ST_QSRR--Eigq 潀 {geÃ3Q|; Wܮ-wdtWzw;f- =f-kyZRw6<9hi}ժmc0{0ѭJ@'_yFcN9 ړ.[8X#5* q"222"""&:*-`0y;<3E}0 oUUs ?% =Sgb0[ w <ׅ`04Xg1 ƻ``0u` B! B0!ĵ3!D0!l| EAl>LQ f/ `mC6 !D @[y`ƥf$u D6"Bqyi1a[c & 1Kl$fsfcC[8ڎ @l [lB l{ A;x @`!I/1fV,fc[$?l%VsAbJaeDf.byPg:Kvrg(kc~&G{C?;&X7K6\Z:$ ǿhqz?Pҳ!`AB|݋0=|Hfn#wĜ儉pJ[\K`0+,x ]b0w߻`0 ]\^BhR$@?~`0"(hVt~ >nꅷr>鿴k/שdby[&ɮs1X,yFc4(UlKKgmrQ T]on9SK^mjȭ ;UyTTBd~hW~NkBVhӵkt i),]{8R_BCC0}5I uktmR:I7XLZTRz8pg9-TEھğZ5ϥOc3 b;ޱ^W,b / 2<=0wUt= Kd{1>Em?fWCn9N{E;/>N0:0O:p7="|J5jܰ|#z"<&wp1U(ll6{\R[ΗmGqҬCoȾ3 h:aG6[>iר3NYl1,fү3v<{_,2xՖEGϝ;spfǘ O>mӶȳN\6ux9qEGϟ; @4}>7?{=3[ѻ&N:ܫ31_9qpة~8@9D.#. J3w攦?9yܩ+k_F1h, '/g1®(K'i/ی! },B/ҭR)Uj\&r/bYl3Gnxp}DW<5ҙOc0s h6hФ՗c72R;hU3<A(ty+pfӎ"G 1aHuJ]'OlӈRWN{ə1fІorMZ@TylSh" {4ԽWIƗ$Kt!>Ӑ5dVYKd{1r&{l!3闫T !:]kѨUi[_0<7g [s'fbJuH˫ Z~#;&voQkR?a3ǘ4 .רv@d3Эŀ}~ӺQӁJiRV #7<|ѩ7&J<;I5[*hnn˟%ƋKtYj荮}}/:R`6> J|w*; fhl9{ﯧmՏԻ37<1m鳧oݿjB07 ./ֱYֽ_oe{sgsþB>oSw>?eRZ5pbRX!YY_N#ߙԥI]>$qY_x΀J}T-(tEK%H4#c<ʄATϓsDݹTnn9{ߩ'б]Ova+&2 @'KvH&Qs,kn:,9pdy} N17H|Ϳp- tE'sodurFZaL2?co).Kuҷuu @%ݽa.9cKŸwburHpZ~Jz!MODg)w 3qB)t@-h#BcWqJ[^U*w!-+w=2x} ;.JC>Kj2'[6@OTc50c "" 2pZ0Kzu_cfY5 EH8z_X=nTtmɄmN~o%J蕶AZ-]X"p(BSz)-u.ףu㶃FFr{/i^_A(K2WG2JujL0wH+ԳC`px@Bݩ]yXr# :Ջ(IU#\u\~K>]o7pPo1fѳfnQCʝԨB\26*Jyo/v|-ޔRzΆ|NjJ67>s,CeLI}LE@ϧUʈ L%| gZ2-:A|hrnl IB; ďϽ'iv1=I#=m#[ ]y[hr|B:k@WɧӗaU`IN)uz#KLymͣ ~a~2ZɿDrcJ>8}5ެ{~Oy}A(Y?8&m!Jx/TrRN]9W,~lC6GgX{ZVXxS@_*}CP%r= 2qPlң1,rjiJR+2FCZ\=H%^eJ?n^R)~ǨΌSجԥXS@W4Ѣ6SI/%h 4 Msɯnߐq,NU_@rqV1E@i'z_l]yN%jca6?TEyy|d^b6)hlX(ȄO/TQ.qSOR)ݣ?XoYOa ?!/]/0x1j?tV!M5e_@<-FO_3qٙg)Ц؛;OZZ7EGMX:iř)V@ݣ˦|i@b6&d1[Pb~wG& )Er-B'{&^r漾 O*l/R"k{Icm\[k %r= L$]g6 `xuyUC@TR"yۊ'MY:%΁9됒VhZq1hKSTɀ &l_s楑$ڱ_x<>@/Q[b[\`_d @fWFjE!hc-*491d|6Cn m^+-߿̌]Rw_5]a꯿bѤshVcT0_[7sx V4_!_P WvٳVաur:Bv#/{ٺoDd~ s9L!5z\>gcWLۻbne"upʍ ȡ>io^bI%ػGaNY-I:%:y߱V7tĀC+I^y4&N/C{UVLJ{ΌQsU8qJD2d,åB(5-3|f!ԁ+6S\J7uFcO# 6"4*jIvHW(rD iyjf[?h[=OD#ZE@?NyU`g^MYeh- h].V7gu 1K,%; UFG4rsCw5'Ddddxxx+Z- |HX,4)|J~wPïw/R_\?k6?-;K~6FR7.1|A0=[>`h_E;Ó;/P .tLJ ryBP(Uiޱ ?luSim5w}\k |0:bd2$iH?R HINʂ5jp vZ BjqUx /TjV$I4!`4VW%BX`0O`9%/`0'}0 :`0,x ]b0wc0wY .Xg1 ƻ>Bla6d" Fc&' #,BkZVu:]hhFMJL0b M׍hj؅O7K{4^;m X6h? le=>2$mDmrxj{n)h]F1 E K5 \,@a{zGm= [u 5 @.w-#tkߪ <͠+6ؿ{Gxf0xi-Wz_,=4-TEeAU=!@L+/d / 2<=8oƋTh?UΚR:#St#m6vt/uqԁyJ8yx ˞ !M@WuLWP~WwMD;ggĽ [ ?Y3xKb>Pb)Ϳj7=u=~t˼ Ͼd=G8Ocr:dtڝC'ԵiljS'ZŲaSNIJ?3'R?f/b,tEL9mÖco?w+\m$6W^x3gΞ9y:B31('DQ=,2fmxjxj٠tl BgJT\RԞoi׮gB|HPmнŷ&ȆFozpcd~6<=2gh60pF@g>M4lܴm[?O=:j~K! ފG/xO'`ysl̀4,WOJ]'M|{RS= _ oT]Љ] xE`ŖYug*IݗQoZ}Ur'뉔|S03c屦ؒ]gz%BtF ֭O׽YFͻYG2#u[xq'RomҧM [t3[~ۮi]\Cl;亹|ǫfϨާng(KԦmW50b4Z8_Xhg,=Be<1A7z(u=> qZ%TNJL߫`H兇Μ<ᷙ6[}'~c#쬍Ouc[g%̗pbͰCꆠ+ˆwnѴmI￵LϢNlb6Cݐ}ֺ qBN>p-=ýIap?,1t*UIݚ5im؜O3U]9}@=zn\@"%n$gvK{1e  *_^es\O {P1WzxEwMoXW aAˢC272xﻈ]v#<:1K/or`8E|m,9B]xmAhL DgkKۮ8YNv,Sv7׍]1(|`}*ْs LBHdyΆ\}p˯h%4-@c3AOTkd.7FoҠAovekѝ}QrͶ_RC"C׫ IDAT&۷kVyz۩%J+mU+` D.Q& ԈE[j\46M3/2ƄIOx(M7iҸIƭl1)w> >2Rf7;wذB\gG3W{TGF}[aaǷ^p庁_~kHΓK77}-y݋y2_<^U{DYU3)Pԛm̚=s.)V7OaM}?Z^_jP3'%ŪΡQAo >|mTWuAY#S:A0_w% @]Fkc%=cE3TJ03eN*{Ŗ4#c<ʄSZ=YD.hJ+;e;M<_%:&/nT,|$|Ar ¾'6j,H3i>u#49X_F% `_?(mĭH $2yr#N }tJ3w3hHlC[n9lN{}~6+ s_Fx}N3A@p{Vڀ׭2@vI{#K߇~n*G%$|Pƫ kE}~)QW̵wf틳kM$Y"<8of/c(syIn6.]'(}[{ f;I& $?+Gv/!]J#O(epl{띥c.dO0f8KjhP4kL/ӭݭy}UGK?MVg"0iLd$Օw>ŝ"h鳏Sm)^vʍPC\jЉ;n%jS p>N0҈6ؽUY^Jf٫ _*ЯPZǞdX-W7o+ڹJ0)o\|O=2F6ɺ#@Jm뮳dPQ/PLOLOp־r$l_w.HYo]~3~dA_՗kW4aǚ3QFʚxsג~MsKP}ĝN|D w_q9*Ҿ%ur8l=+6L:_E}R9T+xaVn}V\&R԰sPH>U}6rX&~l4uhyNØㇵYRQRlL+V*o*ItҒ7DT|įz͛5tu*p֔2pI 匑\BG?:sǬשVBPbӚRr=a͎K7P`af~,"߾7Fmr~y˰S'yɰ:6ʽC :yS[22Tazゲ(B0=e٪3!@f**W ߼Vj8 E`M PpR_eIJ{E.WN1.xϟKEnLjI4L?"&L< m_l~H}q#r׭)K,[ ~~Pczbః1F |}lCWLmᒋHPP .YTPNTP(ʴ[wT]zN_S :|okun`4͊J&`Aڵ%ï\

}`g>`0l,x ]b0w:`0,x ]b0wq=hŪT(F$/ NtG b>Vt:_N#L&%&}s%Dmntlˎ`>Q(\g)f~ h4PPxk v{yťiuPmZ!i.֤[Vm<|A\&.\~~ݳ}ehgK>׼?d˚yT(/՗a0o )1=! V[[G:F ;xbtNxԳӶ=y&r^R,5kW;;gnj.l`Cxcg L{KqJ["R) v'M,-R"cGLuȚA3*RygNl,:wy K{Ju-eX&glޝsd`"-;umҜo7ZxY͓6Ldۼ82BAH:hiZ1&l`#8S>Y;;d#2TuN8X~goN_'cRl4#i3BȢy;.?M4#d12EH97o:%ZB~-\.gl2c2 ]a}Ao@yh3;w76Mm1l];BMNUFb&9\xq֚m\X1~טW~ UVZpބ36.sv&{nS9e@ɧ (1q ~vb09@4XƎܜ}`wĽ[=DR!{oCoO_dywgt}䣫Z'aUgZhۿeWI*`A ^bԧO"*W 8~ւ?u_q#g'1ɀm 'lx1D[_}3fʪУlڵQ?1 0Id t1C]r"cԉ9gŤ7gWw;/8FU-|޶Z:V"oKW,KBRbp3,"G߿p@dXfG~xABZ rsՄYS]r}őS*$M&tq(޳8?`b0f_q*[^ BTaus?_QLo߶ZXd1/. > W^*HJLBٵjז 7N/')UgO_v`ԔdZI4a4V^O-6tm@9lN6m +fc0w:`0,x ]b0w:`0,x ]\O!l* " FC& #, ^hVta6)1Øy/X6hP~.&8>-Lϖl nwҳ%jsv(L b>K4DGE:tm~~>Ee/Y,1]Uzng[6%"s܍#F^: )R1U.y[`P)-[8w\lgB Q#"fKPBKbCclH@5 F*.RV.P?sw33wف?j*`q@Dփ_0FKҋt;^潮S ]9P"Jwn:|1+Hwu5Vi:a:9G##\ȓcY*rS3SO// csmC>ma3ע.,s}\]<*s2{g̵'TU3=\Fz~h_>޸ZԊ&s8mDOS.b̋qxvb NFU%voPQU5Wt3Xێx|r]v^XLtP7c.AW.' zTċZ`B3<%,'z)I+GSq7]@6ClkA+=\=}LIͩRY9Swovf)j^tNH"?~Opr/F *1nn]"h {a 3:D"SN?ӯ[W$7Ops͖pЖ6΅2-:/f˨a1yjX6!t9ܾt~iƥVkBT,-\m{m,7DZ]K;r 3̌6^&!%5i%;UV$I;w4{ ڨSidL^;u]A4)21L^jbͺQ\  {#T@HΘo:-l!?˩n\Ve2װmg?jN A ^*o^b2R-aTdK/\4㇥qgNąuܮ+rOj|$)OxX-9!k*l5y,ajMI[GxcݎiB;_{3 /v) 1!fg#]"5ncrjJnE-Ubɠ8]<&n͑+P!Evs2h~,z|*d.k_uQpRh9Ζ$J(.)~Qrh;3guzokV>p[8ӭE]=WRju'%JY!nݒ>7oȳ"77=912=_Nq(UWߠ)*E5>Py#;p/SMRӃY}˾սnKvN:vXyK.,ˌL%*5,vmd .4PBW_re˼E7;?82M%ܓ|6˳B65qOo1q`IMN?!q?#Li Cc[٠O3'l3w;LTxm印.n N\jV+I-0r"vfv⡘݄~NIՀedr/(L?,Q\XtKcy]XѪZtmDGv\x5; 155y >i?Un?li軒IV?Ȏks-R#$5|Qfm-vu`kPVcCCLOxc*@ %igPo_@զaod4xcF.+{uC\"UY(4/?M{#&fP,Ttc%t-K^F`q-'-pQz?-f1&OXnM܄-l!B( Y2bag(J{|ӆsJq"{M{F0bݹQXH U ,n<L2_͌^o:)X`¬*-Ti{ڮ[ׇDGqv'*wps?rB}+)I܀@*䷓ްmvWu͗袂Kv 7jtX t(s4ջąZkTՓ*5+UiO]8.r6*9)9R<87kYryTߑKhRɿ&X@եǤ"\*rZ׾w| ;L=Ԑ@s }jMu)o^b2f}ˁ7Ʈim$fB-et"K/ݑ垍vڼ)aO19DpbG KV?Rq:v18|匚hl! #w1@tnn,sĆ)%Xd>)i,"_߸2-;Ԡff$Ipyw0/....nǚ+G؉v}̎MSsgzЪe2j 4[FP,'p& Q'O^)! l:l36?*NLAxڹjҘr(u5gZΰ54fţ4TjJKx-iyVKP%p'Wg@%&n3ʊ @)s/Sf] ӈ*t\IyXMWwoo+o^bhB]ݗxjzrHބU)z'fnBFIPP,Dˇ.7{Eo_4G%}}y._ՔLzaTs4m?#L`"ɉ?Wٜ @/m˛tR䥳հ~q5jx灉 |MhAyvDE1a;!ax~[mD-&Fge6<)3xj'n^h5~Ns8 Xhݚ]ȖC1K&gmjtvğE'5J%o#*euw²Z[X3׼!BF؉[Tal"ݗe՜P݆W4B N#3WMٰ6'Z2gchhꃞ:҉5N qpmAőXۍ\r>Y(j(9iڅu;j8DׄlB5qJ_~Ig3NJ77J+ 5 ׯ^8ɢUjV%G%h߰> эCYfuIDATCA<;}Jbdw;?un̐doq:?``W9##8 (lEQEʊף@ד%]'{@s;^Pg[X7P)Ub!ǣJ[ZׅС:Dq~|q#{Z^(8 K^ UU*m}xi>xs?d````f -귭EV#8S E8x<-=D4!߶?#܂<+,l`ռ4$MM|2 AT+%2"@QQe2[U?/_OSlIENDB`tora-2.1.3/src/help/images/pfileeditor.png0000644000175000017500000014067311270353652020267 0ustar michaelmichaelPNG  IHDR"-gAMA abKGD pHYs  ~tIME ..7@?m IDATxh[G?žH&}CbdɗHIJM^Z9YYK.~I}.\hlمF)ri]%]^.RHsL!i`g9sa@!nb;ܬ!&Mlhhh|l҆Nxthwxv[i{-ZBӡ!)HT*/vtQrIYS)lTf-ٺu+9㕵jY[5OMny) -*Wz{PO/"'rv3,SY; CCCH!)zER+dPw :Z`mƅcz,_Ӯt:0XEd'EXS@@TuT"MbĨ7 $4 $M:^ /učR):qyD1gFbR;h=={ P)7 ^{tᥫ-8vd֭[n)c5o?G#)m4W?Z"_vM6wv6/]#2{+Q}יK]3]ӡiűoxs#|ot6Bju,h]v̨d{Vƭo6넯MM=p)\VioO^3m7 4i٩k¨bmܴ:;uu2?6n3{B50ƀ#y̚zM cc~0fz4ƀ1*@vJeM+j؛ "HɢEÍҟ̏eW>ی[wn!g5,B(󏌠\6VDʌe~),J=  ?R'|5lr7({Y? JaZ_ m˓3Vj&6^m&HAmFb!R}vTLJR$F.Yٛc6)v6( O(yD7˦eFWkjldZgjj7iS7SѿEWA@98&/MfneE~9^\(ev 2L~8ikj?o=)X&6;1/#>6ga )Qjt-b0Va3TqW6rva>jlj' Q͛7;_Wuԅ2L=/HӁ`gF~9ķWP!di6m7 I#zU*aqE+rgfJSAu5ήN&cGA?H)&)IӸݨoֻ:ri3nͩή΅/YrK5:5r\?c69r=d2xz8= q6=P_ @5>8=nm{MjCi8ΰ08YEPjli+.NӞc&tAI.n{JxEV Udd@5x/<q2+2F %XH)PuWDw1 )E3CfSm䢧Y65/&c39v=J~@ e6Cz<], @C|wYؼet|> {濚oll_EPHJ헭hki{ʟKY~\ҟ򬵚NQ4 wqccc48N777842l3<>91F9: &M㖽T,{-d,@yNz4?K#EScΣNa- Om566 +eib(1\6#|+tTs)9j4~[2r.uW1;A{&[.Rd62EfaQ ",wF'KY]ju3S6ȯSsC.WzzU,I㰒G*/[#2!Ƙa1a@4/ vv&2#U%C>)mCiT ]tW{1ƍK5Y;>9q\m]=]dd'eq;쵐GؼVJ2G ~/t{ڋ%/C. T@mcio ROYB}j.#gipbv>p?OSdkbfٺzy;<8NAf5K.5 U g|#ֺb/u1 Hy>6/^ f>QJrWHB̴V7Yk5PS!gƘ~*Eacln (FXXtqIIG<ТDrGfHJ + #_*`6eŪ҆m?ɲ>J5\JGr6 }`qSҰ;Ƹiak>lt.\!4}yھώrJ:^h?.NzŎ)չ͂%,ˎ1MMK%]hć9-WQ(?u4&tBYކ}}XJhIaΙvBC>C~2Kv}|rիs--y~ќ׾!;R>Z$`'~s{ja[]#NT,)KTQͥzBq<0[wUfml!6qi٨7va,nO:)9V W0^gO֍ɧ#ڴ]=]tr;n֢<-@ K2}}iJk0.-E%R)҆FgmmzFq<RJG?geE(RO3NJN|~^ݬ;ad q1YOYB}j.#S( 9.k6VDVugœdJQiX%BV1gxhh(`p? O|͍f3 3,Mi92uy*H䔌}g7-ZCtLÜMOaf(^#e`=P3x1 G*mXfbV <%.o OWڐQ#;,e]>>>>|j|'|'|'|'|B_E,iV!X́ٶUpsLm" 9`YkJeSB/u,"Օ^=CL>>{bf1eoejmd<{XPwr1el 듢;Ir2*EoCyY\5IRȾYjVۄfgj̏#,wc _ߛw>o]橏#Sz7tĎ3J}22X!$E$HJ>HXYZƺϚ>TvX,s̱<=[gb\Yw,ue?`ORR0Lˡ(S~ռˌ%5eb(X"@ %:ؠ^Ηݑdd'!"pINsv$(`Q,p3d0I KKkWW l.t]Q=|J^68_̚3c3 A<6@zǯ‚I},Bh|r\_YůJ7֔yith6:ݬWC~?˕JqYTT>gIO5D1ǂῄuuATۜ:X4f4c_$YN$z-ZD"1?p#qX%Ic*#SˈdYVJ^|Cu_`2Y.3ʯ҃_Xﭓuk-9IMRW k< (4{NL #J笚BѤ.5=hrӐ^k濚'3SIh:dٝDLfy^3.2uuzO{9}mB(zf"3BYIҌ9mu9t`ƕL:Z͢i vf@ղZ|0<2q\`qǢK xjLƚ21R9-dj qSUٕT;HZ5D!Y4p3d:)!rQߥ(y,ٌӥD__\69u΂ u4X{ BST,{-R+RJɔn)#U1j zO{5󰓻ͩ؟j9za7 UÀuˊ4HR[4(kof9yŠl~z{z4䖓c֭]tXԔT{5̸ΗWS:@AmmQi@vٻ0j<,Nԁi@nVq0ܗOrSR08 8mveu=LF*zU)UuVJuz10 +KE2%`RUQ|1SOI%I`2TA=(Gŭ0O>RσoO*UtKʖq@5>HvĹm|ʟ8N{Nzمd2xzUȰii6:/f BT+بn6l(ʯ{JI%Q "[פ2P =.ӞU`UsqAAC\:F%IL(alxOnٲ<'=z1ΣNa.hFdb B!v*K-{-m/]Y4 connVJ8niWW2M\.o|QlXǔǫSN M 577O (':jH%UTF;s=hS)8?m۴Zmm24%c㠃lndTZkiw!/ N)ޑvfym-\ҹQU,uYJgBB^预ڞo{O{ɱRrBθ8x/I% T-@As9˛ZYc.v9(=d.Q*{\PȨhd[ 3ͨ xu$RSQFg*` ~=N|z8yiqJPmDoUȎ5(ndTZkQ%BUTH;KlѶ)ʡʹQ=ӬtH/`;J#" Nj4 ˄b/{~'U,?t8tj<\@ D]>%2-' NRdOB5HJ%Kg6q5+T*/Bb2ttlVcXYcG!U xuf|l~qtuzO{9}DT U"-NjptR7sɧ Ԥ}g()D q<줬zGYbd_\ʹQ=,m/І1vs[KRd2j3x8^. 4+'[L I4Fx!~:J:͒fj7k iv,onMllG x@0j=[!Oiiyy(ޑvXGʹQ=2͢oBŸ'>(HJ[ @WT۠۠ns{ή`$!ð[̭L m+TE9=(.^(ƟaP[Os5Je: s ,T!^(T&,sX0( 0( 0( YC[Ū6߀D6}Q(:Uu FjUT)EY7R4IɿV><KUZ]RyA'x]"0Xix":dzԑz= jkYovet#d2 äR)&3%le~E% .syB IDATeSSO FN i,vYvIUլD"agej>kZ>nؑwFVn #Z݊bFz2PM1cu:IJ6Kˡ( ǫS9;A69NUE*;FPũB*nʼˌx9A۪5.6yr$0/w,k?`d2UTť}'YP:U0xyr' ch7,J1sFBbK(hy]6ch:4n֪ʎl)HTndX)lLÃ*J 92/8T9U*H1';!g!e'ma:B3<˲T4{,R6sޕ2TR(6/8d$E{#lo*nDʇc-S{q+]}"2ғ~q텶ҘfظqCEϺPzrOzke2}$LRqcL9PJ 4$ 1H*͘ZisPˊv,*XoHvv>6? s?o{F9U,).vu _M;M` Qȴ4Xv[ BJulZ*oΣ~!:)V*TР2TtJX4:8 aWEOT<'=*!eA}81i>6OEV . `DP rt CZsʓsB<<YZ%)<å2++@0`i> P 2l78;^hSK>fc ͛.J&B 5JuRqNAB{4DFRi)e$*b B!,"Xa1P!eԼ\i+riw?NelOt.Zi"r/M,(BCCC⛆+ЁڹDjIsc!67S71Ilpj"WQl.X:-O|G( 0( 0( 0( fM}<% \.͵Ձ+"HwZl27\vP*"r '[:l8} V.TOϬN -*bk5KxgP% /BLq󈓻ӿ~$B@W+ο0 Jx7Ϲu:qHJgd,vIy?T1^,*=%JMsۑM "6ܪ)G9$> -ʢXw^M {Wz!m6tW _#B$H; ,Lb!:"9]mmx$)"G.dAC@mcioཀ9s> 0nn}z++?j7kŪdͣ$ 3JUptK|~)9I%-TSbY%JCjα_l'gdre4˲bE14UO'HK d˚(qnM~0ӏD,RGS@()A|$MxNuDy׭?sEbUL-Cҥ>?GW1T+c ^._t9)_\J=%*JMs^7agqF `=iw?NelOt.ZibRMe 6x7*KgWgb0Tڐ8poܸam@K '%fI.$/PY8APAOƜpNTBlqqLwLEo/ßB!?USFezć!a=&v$B/u,k?`OR*S]fv#̻/D"ae~EXrl6@F(q.qSd2;˲/uxz: V1w2I/m6:,PoOZ~/ʟXw[G.NXfG7nxgI))}OtP9*PoO9tF!=%N{K* ڬ{b_WXwW.Ms϶jM:`; c.SD&gYej@Cmǥx&.MmWu"1wyĉj%"y>aZ !dm!.c䄞f > /.w޷Ǻ'yL|8꜇uɖ$IZP%d>{+<:* lIӕ # [&?Sbp*˰8uwGFFG8hCuNPRzw= #NŊj?~ӫčH%AN1X#!8HCuѿ@qoV`s? ǡv3nn_zk=% M-`{/ή`$!+qns߸qò21@uRi<6axc` GZZmfffiJ7:*Hp미E(tPUǂM?ibYrϩBt.jY=k NWzhy g7߫e6{DYVd#v e;޻@с,`@{XCǂ#D>H7=\_toq'HJ[d2y1Qa_QA!:68,qlv*"zLVe;ݰ o0LˡH$L-cgM}BH/].:el)bUJe #0L۫~(NG6F P=3M@@9I}>x)4;o +12AZhj4f=8*B3CvLR*j).3);P_ՅcB!A#|~q>~[﫽gƶ;8.4W|}cAz8qAe$ByV1 s+PP&ɖB hll*Ȫ'{ȿtBqb-.4iCMu:!4p2P wIr7<2:2l7E{h:zƅb=D^Jݬ`é!iidA톙fT,Z.6=S_Յ8P>6Gr!`;Tl{qDtTHs8rt o](2<­SjR ݝjU?Qf(GŝR"IcAa*qq*=4{fN2skZdug3}V!op,8DjΖȫ8j1B婃:8I$U;$W*eS-h7omhhP7 O #P.0xEE>L_N}Ro.:cIKn]jei$؅lO:rKW bN">tbG\faNRWhOSn xׂܲj1|l?X\lq749Ax=D^J`n`KNU IJU-jaAtta@)MBk~5@PM".Cxsj6J2 INYeo^ER߬55j6 e@؞$4 $4 $4 $LV޼W!S3/2>k!TќgW}Veu:]ޒĥ |*s&&.hV* (H tJbyz<:KgX*Xs#R`5T a&>{Sʻo wɦM]jR?9k(b,xC~嵪U mfuɲ=JU8tYE,vYv)90/gd)B=@z[QBRyie&}6aeR"̡ۧZrI$l/2g!XjZnb{YBlqqLw)1ӿ~Z%֌_De8E |ooV>W9N#nңgArrj&6RKmHͻ/D"ae^e۪9:AVF  įIqR&z9+Y[&}=R"ۧD&3KZR,.*}*(A?Xѐ`'^cJWo_T'ETSTXb,Kz|th6:ݬQw3YiUwRL(ݥS3qdݠ# h{ c=%N (?ۑf8T@m3^/B ad-{-d(~8N̫Y+⃥EVfad>FCb`ax<8txNyf~1K 558뱨RB>4Sًb1Ʀ+"58V+8G]UB!f"*) *QzK.=A,++\N[z&+ T.Wꁅ\%LԘ*҆m∀S4K1om{m]V&fƲ=)+^ZD>yϳ2!IJl9zeYeHT 3IZRLeLXQeBu'>LfF8f?`.ƦॠT˲c'T3Z~|HR/ujGK<+@y*ɔ3Uwrt#Qf6&*"1wyĉj4&j ^Kd5C'LxO{5LBs3@SR0 8Ƙz,wwLڧLgՒf*l/@\Yg36F8:IM;MWK\`$c;j.2𵛵.=kybKXiKd*WJ=p%Hْ$mH1dՠw{(.f1c'mk4:0XڀSX3COw@r/ v,CCCc&Pthȡz}ϰ }tvu/#H VIYe^,(k-`#$>Xsgr xc@i3`MۓfffiJ#%r_ڞ50!&ZF%DѹfgYV.@^fO|ҥxp,&e.7`YSqQoJ_V0q1yD,#Hk5C IDATwFIS؜P6e5Q+bEI{_U隖_to$'TPA0ƘGv]HXpݑgG:KO=V--c|GB#Ӆ'p"G##dg)hg 4l@T*Ov9JyhƓr)"S6wI5&̻Qb'a^CKaȿVv Fo֓c57Έ^g7}'ۉd"ڭ7}-ޯ3ePQ~RyyɌjy908s  ,OtP9wbsxjzoNZ6{:Q"}Y応F瞕J6SeIh;nܸ!J͹[]2ݿvqߖw+W|ź:rad/w(m80̿0cI^ _&awaUWC-czgbLmɪ(nnl2߸qø($3'D&0DZ,|CuῄuuAT˲K*Ʋx}B pp,(. cLE%INJ$z^IS;I-=U"h,qX4f4c_ (%EJ@y~˖-n"_iLSvXl!677ve֑k==3XY+%9uyDfL׸l`h0"=4@K 5ֳ_Z#Q=BĦiv [;;:Y F^?@l>~'csRßp}ԍ瞍E=>ܳ bJ1ns$ ^Kdg>!dF8#^WR^ )WBѝdBq, ~́?ni"| &, I4%15IW6J "\Ʊ5;n֢<8/wmϷ=߆1Nvvj5z蒏y qDeEH M B!0x{@x<4qA:${Ӱr n?lIojnzIUP|P}ݶH`ͦU]ѯ.(?ਁGlO ΀i@Ii@Ii@IfI)/uJEBLw!|?}{6.ٴo+Ydn?`ORt0n,OV)HeS& 0Lˡd,˒[mT^$4T??UB#M/ŠeY)obCy "G#"<ɲqQ!};x1ذrV <=ߝs?Fo =(9Mu'}VPoK72G.PhNN40wL&0L*ylZfeFQCC%ݡ,Vu5$B(yľoif[-..vX?3僦Fmwp,hXQ-b7=Ǒو``;>8ymM<8B(Q(~=j1ƽC.j4"?O EP(ikllgOs8qURa Yۈ6*T.6=ZcqỹM61F5s3ٌ.ݬؘL& q@LQ @c\\N!"dݾeEH @{PQ@l<{(4a!^ Q.PfLdj4|_;t`^h SRWzz)$qh D^ltchJSY9#^Pr䌸.<#FI˲Tx%ZȺ:YaYۈ6*oZT){'LQ-VjR!B.~=2?f?7޼ysIFf_P]ཀiFRG?ڹƦmu$I4D#GrLdjd\ANe C_DrO2 l&x!xcIF~]*O]:ŒT.ռ|eJ5IҘPmPEJd{g)\XX .kvZlJ*~c<ڨȜ1Q@%"1wy)̱( j%Mi]XXXzA<esuh?A<*a]pMMK27@ԖZDnu'> RGh4ڰ`ST,{-XZVp9MRqA<'^yؙNR$AdPtBu9呭%baaaqiPЃ4BXli"$l9#lH g>i4MyWQn(MRvOuu/S=g{Ȟa#`PZCE89mn{obRB*VAUήNw{o҆bC-eke婖o[/J7EPq @Ii@Ii@Ii@IfIckm;lyC0¡ަ$ŹsQβa]]% JQ Pj3 @Q,*8WM ފFm{6 u6*Y/u,k?`ORB49CobGYxq筿nE-`D̙^lO&,Rgu/RBH߬^ ? #C~$zqS]fvSVSFez=T\κSuDe~̴ieYָ[QEalg2ٲH)!1`l* #6}͋Cw;Sڱ6U^lwqCnBX98q#îc.v`/-^Jym]=]m{Ƌ1nll<^R\uۈ*j~ٲH$klՔ҅B0 q2s6'Sݲ:h޲z ?X5N(BD'|l!677vȵ랙f̺kRx*qDbFF444$ING~J:󬻬E T744 +,VM)HP)]y߶&$mN|<>$]+O|"u4Ʀ :'.MmWuq<.`SV*8vawGO:T lxϿ@EfE{nI~aŖݲEb?9;+ G4RP]oo?.| Z 6Jȅ- NFf)1x*{*qGZ{~( 0( 0( 0( 2Ӭ|6:"%E$ؖ({SoK!X=ڹRY@0 #:Yg4dL}<#'O9Ŭ*bEW>KhR3O9*WL&`Mt2}+=s?W-udYŐ!썼|ﳫ^z#,*;zaeFQCCptDº2})k> )3dZ,sQIb#IK=[by`u 3F%J`Y~ͲxL<4)g. @njft&YMmvijj lu+LKHq즬Rk?*?#%(EvTq#¦"nAkovTN{UN>vW4V _ $H]" Rj#ʑ`TG3E:?NNĞy)LNys?LfR+gǵ?.ݰCu_w?}ǚʸV+&幼#դ8!Ӥ}ۃ1Wy)M쐊Fz}b:_))7fs?b'ǨF{JrGX_߱>\CDzײ$de@y>|&L>N&8N,+6Q,CU U>x"trS弫9y>1ه4έڸ&ftʲ"\X)K1'=0~O6M&x{UBb;jZH]| znQ_!$Uꀢ)Q=r]ߊ8L=O98kN?|߮KGUG=KSc} m'ϒ֝V(kM˥.ĤRn֑7G(o(ωIP>\NY`( X.0uqrONO^|y R)OyיOgDh1PM</Bm\fPS)N6FeL njtӰXC:1ƱxbC* \.Tس,.v!<dYn~fu:LwP~նF4ŜgrC+in7Pޢ-7E R_4 Wmdśhmd-;-s.ƸnT?T쵬!˲VJRɡRD!1 fهNc(VSY^WY#21'=0oVjj.͓(=xpl1k3M@={XaSEx(tOSzJw}C[:;PܖW-[{aുהߕWx`Q4lLY,SPfՎ\.j8J8mg 0R !AR-e|:fUs r;:-|ܩQqU2v6UO%^-ƙ?) ?3iq(!ei$gLeyn k=M6,E ;|d{\.PZVqȻI˱moUOJc읱<t{]ӽ8.Vs' &M z>Ŕ!VXar[kM.7Sϴߏ{T۱vlRjY'#!~5q)[V2LsyGIqieL6*V1Iy['-vD@ɞ./0XQ]q ہԕ;9F2i1?bO]IUc6;և}cXZ쵬4HS_4:]cc<ϋb;SlS˲br?T P_'X3@ӏ:ŷ7%k& ǣg{1R[ L=9+ ǡۈ1Oē%;Qך(K]I+dّᑥR#o455vG9~NL҆:9_Z[P鞦 w 1 SWƨ)Ynm/%0@.AcE-g_*0flLYPm&oT](2^@˝ 7dD#g>)j侌 =6MT9KiLV%Th%>P&%IE8CC7uڎ` cX! AoSD= 6▋]kk !$j+--mHɏk̥5ՄWVVO9xu@q R5MJ˽-+j{ul[S$.7SϴߏS1SD;rHTÊZI}yX"}S]?.VVVY^^awP6$_]?LTE%>T,7˒~")h?DR3<1ZbS͌|7^/V IDATC q+]kk:4e)#YԈPܾgI$WSh1YvZBqT81?T:Ų\,7I+kIW,A)VqJS=XT1v3c^mm]SPɛh+740rď_fzI gIN+Bhtx4R1SnD@oRc q6b~`aYFb.AOlfPzU0 %>CdeMRʹiXgsPO7v6]aX4 l UlgMw=u vfCiːWk/e lLY,S6K.n;!_{L=p*>ߛYXR tb^xY+,Xj-onk FZU%m˭b+yz(we>wɯe*廷kίmP)8}wƿnPC!ί]P`Ð,f2o0Ct%t*yU4gutl|>ӍZf)j!.'nl.{yj<;`8dra__[mI_Q0<8.x,0.@My+s!rP -;8k@-z?.VVVY^^aw 9ua`mR}c#u!{ffFn^i!j vRN*"T959=jjjPV~2 u֮X嚹9hA~Bn^lLQ7ً].O[vZWpsss>WC c5 %κkVX. T P_'X=zO$&?=d]%>I^aMRԺ00ad] cbffFn$ftʲӢv?QU89R;*N$j cckJ,)SNp&RߏCk qSh!v!?⧪%w[ײVu凕o~gv~xssrbV,؅B6Y->:HSSbj>AOX_(6ã =6n[OݣZk?Ho5zX?BH-D+K5Ua垜|Ԣù>]\\\"-j]BžAPMRyXfFnճ:zsҮC*jړ#Ӣ=j/zx93k4,SZ[<\QXC:?iȳf" XGJY_P<_IЏ-;-)T r*PSײl,;b bc;;'v _Z/,ES|!ͤܪ:]PˤQPʝY_19bro[Jcl!U&Z0a9;M (y2nt#ނZuʹiXhz v|ol͈QkwmM lLY,S0`G1[[ӛ VCZ|:ѯ.Q;j@)-W7+p0$bo۬ͅ2Em0y%@^v5sX_}շp07$boi@oGEE-ky+5Dm$IjKQ3 pmZ/N@O8՗һ|&dP\D7sԊz|\`SS^B07; ҶԄ+E%|*Mq*bY6v!x!1P_''P>F픩"vJ5ImŶTO(8+ ǡۈ:D>V;N4|(4dU޶6B~!ߡaH/RڔRy_CT!lRJ`s5jU |B3,{w_C:kgB}a <=]6VoVKBrMvPjmmﶳl$1-ۚc}tʾ~5scge]t:Ò%(i9uja-c[[[uqkk+y+4^ %flXN,z777/` 1ccG TW Le:AVvLT̥WXXv-O3TM`@rOo*.B}${A)rS!46><O(qx,YbZ:Ts* -Z,K’׾c}$ ^τ:҃c}}IJ'T' Q +UfGOTP3SM]+ɱx,{-KjfeIM rF^sS,"P]f:$K@HyV~oX<x!< RIlTs* -Zw/ E 6SBjlUZeCOrN x5j(W^G+eJ1n{J)*us&gr j().lͪsR19?B8o˽^hqx&kM5N-ТeP?xJ)3β,Bh nɉޗz|6$>=QAFkLPPJRѷٹ/{VzTgM B&ZM`_ͪ 9A4[?l6^b%qxq&kM5N-Rg0s_̹:],˲ls1nk'"V9!ٴ}sgg%-USB QX)VJzՍ2[tjEu\ƙ\rWSVS,Q,c,<_fٻP6-JPItEފd+?~rbuMVzm6nݚ@U3qJ j{.eb;,Sm)6 *͚tlv]ǝ+DƒiXֹuDINVko;u.N1} Ma磊}9N|"o-}2_ii,\Bہd]1vE濜w?6I%-k<*ڏ<98rvDX[v| so2oNdw翘/|_he #%<Mm+gǵ?ܞYr9Nq>\n!0Lׁv[̧3vikkxJnzmZ/N/+ s}+90 3q'+++zZnٱX}ދJ_w? [c#w=vz%~IV_lqPͩSKZ~"Y5W<4NuuvpK`|"pz,fnݺ5xb07ohi>wڸșWKE-+:F}خ14G4B(%,z=ZD]Ctt<>FҤOãäw^.ʶ Qy⎍1pb6ĩteY,Y}B5N-ZO$bG\t8yă'D-eE='cw/v!1 m:k mV:DEJE-+:O4 ɧtRү!.VX3>xwvQTYrRWRd|*z+x,B x"<DhM49uj5%-S 9c;{bJf(S<%fej lDcã%vNc)}F;@rYMCZEEݝnvвӒYL]Tɨk? /Bl;SL<Ώ8{rޗ{ǃSa.Z3jNZb5jDTsө"oSMaeeeqeBNtŸq/ i>A]nY) XB`74ѦS' h #a~t_]Ct}BtRp,X,}o?Ae&{â]m1v9M4L&"GDEllXvwW;Cԩ%֤LL5WGu(mޘi \b0M!?eƼ\ 0 AT4'F>{ ]"oE2.W@lbְ:0!K$?r:Rg!3P6 ==3T49;2rX@v' 0flLvY ^a2j{@aǙƆEn`d16 +7Nvۣ| :_>Ibo(s$.We6(NYXu3 0H˽-+j{)PiaEGE ZI̧3vikkx:%}!{'$V(!9OLq;+7*Vk/fY.7Sϴ^Tȧ,v }677 #*yZy~7"o{V=-4|9_G}}o2AOm,? .sĤRX h}H/- ~󴧐/rrѾb|RQ=QHgj"0|-y<3;r!5 l^hWynax8N&AD5ʈ  w5XnA0%PU<@] lV+B(˵CFا*H,krRn֑7G꜐iBgIN+Bhtxc:RSq5%;`F(ʞSEU)#rt !ta'A9 !z>Q/j6k.N]˗//}~EKюt6`Tض˦ؐ = l&0*O41rs$USPFzt݉F$rQ[P65'K:Ա#m}">b!TrMZePHqE%EmE;ӄFFֲ9)4\?g'&fz~<= MC> n$fYiXztl[(eؒI650flLm~5r QM'i5_{L=pbvGj A h# ug{+PʌZDO% =s"|C3ʵ3ޙOgFv:FnQ#1t[kίmӯjrb}֭[]RXx&|}ŞWBCv_mlC!5;T2ۣ|OJUL74eNIkS@oUӉ9%Nj:ťz睵T8]M.^QuPlgPrSrv[覓XO& _'D5r w55{/VM0a鞦蟣?ƃǂ`eF\.|3ǝ 555KEbej+Wrs;wj]n:}qTy#~PK=#gGTN:@^/tEExO&ǃd;9=|ss؊mdç‰)eϺT5#"sW ,B(I"{-kX0ƊkdMt"B 4W 081uMB6oi~s_ç|7YXMա7yD#v:Sf!}X&_cj֨Xّ@8pʲ4*VxŃ'Ĉ56>|LXmNﰯnm0RlGQ5cd_+Qޥ"E)]w; Li^f qT$硵9)4uVK=!R2c,ʫ!GG6>fN]”s5f)n(p8Q#ף.K{)*vNSh\]TfmxpbCt9tBhՁZ{=f|4|*,'1_ro@p@4B6x6U9YZO+N W GJ!j%b5Uun^.e2O@Wz!][b֭['Kk]ggokkvp#gF_鯪^`VoE>?);ÊZIÙOgmL= @o>. g{=f@ N ~󴧐/r!_>Ֆ;軔t4x!0|-y<3;r5ӞԕB kZng}~$h+"Ŷ֟g? /q^`|9_G}}o2A^؟E#.ZBhh((4D5Ekj^SAoh:Q\VN냃t˿p=ܸqThy9hhrm4j60fGs]j`Bq_0cj%r8Ft< 38;!NKf13uQ)=9=y兿/m{=OGB˽mM('> P6<19}tWw&>p?%~1z=tG[n .Vu`vT`N9t_G!<V%{:FDGçuAaU^"~5P(9K3ul2[]D.0kǹtPcEU{'Դ!{őҺ2)Yܺuk`oI2E[k[b9R)6'UGzFΎP-='PʼnU\ ^/tEExO&ǃXE`rz P_'}hȹHǾiM멶0i 'fGJXknn6o'o+1r&I"{-kX0z|,PƸX_B cz=>I[;=d=d#tU kTejO#`Mޤ~cbD,x<("$fk"f]1EEo9E-<=$E H%GdOyWwL:W[HEEy~ySST!czT۵/uީ9{q2_W-YXX:}1|ܩ=T*vQᷩI-E?EQۃm+O|AG=Bq_V>r =644KJqirfdӠ{;7?pRoJ7 rWkK '>Xkuӯ! 詶'>p?7--qzhpSal#RЀ T-!iv?-c9wi푍z+e| ɈJT=~RuA8ۣccG-H}.!nAfk(Y~_)Qw1=*HI]+q3ݨIl%wjN헒_c}-)WmdYP<5|`NN@xP[)$-x-kmGuH\Y1Q,zG1o^Pճ=n`MCcn%.!5m<}7:&x |9!x~1IP/RR|ʯ ?rfڎsLMo}!P2uFer.e.l FΎ{,P]]׻P IlLY,SPfIHm.ZMQ\9 'm%-;;L=pqcgNx6 ÈHwp)-8&hǨe3(NEf:o>;t_k:y_C(B|mb!I`-;-o|T9-MGX_߱>\,,B(I"{-kX?ICF?y 'fGJX(K*P^trO^jjE9h31HSۊ Z5#$fk'XSqMɺ./0؅ 0RlGFb4ƥ( t#:!kKʹbJ[.r~/ˊR4[s_6ã =6nN!8}W,)K)X#̊P_^Aqz_%W}llb5A˥PPmK-P('mJVKg5)i={}g\r5rK;ևPǾZ$-&澘#,W4b怈8K:I0Ʃ+)u&In0EE_R@5¬u'e%r.bew?Ӎꐼ@z)?yeM|Eh&u|!}țoFϓwSm51l#oY2121#g6we+ 6Yh+B=I .N1TBrsg׿a "E fgH4QlY0WhTxOjM~5xrPXկܿҰ@͢1/m5m9E"r%kW0_YYq?8n",fnݺ5xb0x-~1<ҕȣzzr3LKKKy/Ba\ /J F]Y+*~4NyG3$u܅Ba{G tPҏ?bK|9'?. [pjyT<}cL˥S-qnE=?ÍۚfH4yb;rt$``sQ1]O۾.vɗr{q2_W-YXXbW{{羘s>P-Q=>O~"FG1^ rbA>ayQVTAP,WEiQ\=:6>v Ts3$D0*O4^:V0#6.r.7Q}!X}Rk,_0Ʃt-,z\h @GH46ȹm cL7CrJCD-[Qw7<:1~s8Bi`ƁDhfل~ʓVH~ 梿|9!onX lRʹiXt4OͶ]6`xxRcSS>@ن¦מytWjly lCI*lLY,SPfI%襘^f=pSH&3vY҇^kJ~:Zҙ6RoQK4S,` HI|4|*N&8N,+w[[31c$?jY1QZk˷k\ndxd)@ț#ǩ+la1 p=ܸq|orvկY,,,}~W{{羘s>3Gg1h#FLf@.Zgy͐t&'?KZwZBãcʽ5cΏƬu54W9aYGm2+F9b;MC5uE-t  N8v''/_e%p[ȷ4/ҷt֣GDž Xdٖ斪8  &T\7i@.!!rox0|*leې{`B'5'r&ss4TZG2-t9: tcӳײl,ˆBH,X,Rt- 5Fn%Xoe@ CoJP2׮!Ism_[Qߢ:F7Bx1ZmI_"a~n7θX"?8.VsܺX' TlD3=jjjRsOll.mۤm _͖b_>u܅Ba{G t<а,RƇPx L˽SM!0Ɗ.%/ Ez~BKKKiO!_-6'Ѓyړ5s3Me K;I*8S?uiQll.h*1dɡoT!T] 1l^sֱ&T3Wj?AH*b;%(kِoD<\Q]NS|s+HB NFT71&c̯DSo\\D^m\\2uoH @c2ؼȣZkZklY({7DOqЍ n~"ʬ!kίm[1=iϰ9~mWI۬V.j8--ʳRC+#z=DD]n<~D|神#r;C~!޻cȝr9ܠXDjmee㸁WH_JhDmV+C˽-+w.PO{=98oX{%gɆ/MVS aʊWH(SO}>Ҋ}nqz,R#RL{'$P|*cݲc۱6 Pbni{$K ܱA2ozαǡѵFTJg[׋:]ccQp4g} _* NRR{=yUӮ&>q@Ѳ;9L.uR :?cMˍ gڨ滚˜?lWڈ5BךttWwWdP(x{y_C& ]<9( DW_2ۣ|~cM4ZNǐF R$Q#Ez=rrAo򽁑=ˌ"9L^N6449kےr2խ[FP8< pqF8mmIP|TpJs 555#w=vz%~|c*'@%ol&vpgXکc#utGM-nfy}^a>oMZv[PЂJuG~~?^r 3xrC=O{ Bn)'-'O&|}/z~BKKK,ls[v8| =N@Tj꣩=5q9@r9{*@q.1{p;N`Nvҋ=0|-y<3;r/y8Ƙ*'@%oF&"x~pPiX0(B(v4x,(r[-[ ZlBq_.0 '[r.7Ȏ 0(Ⱥ]nyEn g8Jlbv9c@-cm??.AX"ȶ4tS*;ޗ{ǃSa.XMri*P@;z?v7AVnVc̯DSȤ#yN澘#P#"rq`C2u<֑I< ٵb- u"P)YjUUU:$yOxGUU52alb;!t%JiϯzBWB1B#A4NPt PGF4mkl& gt;:~_PJϝ=Th#ժOnټCP1=}="M+uJJ(A~#s\sآH/4}Bixa1HfJi/;ǯAcVKښKV6ܹs3|qE#ӓ>~oZ:OZ4o33?~f~aQ|Қ#o OM㞏>jim>@n: r* $Բöq}$ ~+WM&HeeVan=d<.Ӷ,t%d3ӳg5gW"&Wk~}x]r4T3Lw-r7v*f w›l_$I]/vy=63;wř]{wee^" =_5ꑪ(9jd+#XgLk۴X]gZuͼ?.N=!I&dcK1rĖbڃf{/ִZoV;l=ziسhpHӴ>{cmi]l/'m?kkimi~٘c1SLmzʟ1쳻;SV/#ϞiMLkڌ뛾>/e;)>]`sl>T KKKϒ-ϵ|¾442"qy's߫ޝ=ӯCUWU|P,NʏsV6ܹR[BQߜJ$O6'no׽>-rT!eDS"snN~oZlo:8Ii>̾ R]gr]~t/ttA)mYk/;/mֿ\o~2H2?VoJ|y_ڦd+EҿmoǖbEX@_R:)rTџNSooBtou6|awIK.iVS%j0oFTY#t YxB_\,#MiI?, dmc,Lv[]/VQK9=+b_@2Xz~Qt )/6bK1'r?Utuv_͆޸񇍄'\1 lo.(y͸Yf% :)?,RCCU_~4 kkk#!@!~87Xٻ'|Oo_z !:[TPپLR=ʘiiUmcqct 6UmsxӃdMKs#1iZ\p0᪪ʇ+~;6xq#ݝݣoW W+|-C26>)Y : ہs;W3= _ 7lڅdS!s 4ͅt}#9rƥV2-^lǪ85C,oSu)lxő) o\0NƾEH o_X}狝7ii TUm'.'LWxT,ǗCG̵ 쇱5?|絻&}'vjB=<U_ kw5MV>]IU\P>혦iSNm13xgz~3rTl#/Oǖb-O/M$.hN \pxȁ4jU-wcq\Xd6UǙVX{)n NX޸`3}K6?,I_<c,Jʿ|k A5ywBxnٚѱQ<}cT9PY{9"sBʈRD"ܔdim6sẃ=,{,TEbs8k!p6˧OOMˇ@S`.2܊{ob\jb)5S"^a6P:N)[C4( \o^H2/ go̊l SĬSa݊uOv+WOs(w464zg2<4k WQQquzr:qTVV!+؛cmm,/q XfmFh 7w8\yg?Gя=-`p Hx%:= Ńj;VQQa5;\xBh2r9 MYpb;UUJpEĢ Xݴm(JNB"DV3.l;7Ӫr7={}X >yy|=Q_JK*@mT/x 5mnGY#PxPblyiz\--*I3|JGi$I۵ʷҦyb*+g6m7!w8\yӳwvN*`p6<6٣ͬ(ohzPReN`'4o כCFݭؗF+l{6:{FI#MFI>PCT/x 4MuV{f974=({SGbKSlB2ʹl/j:+]^ʡ{mmit8IeMGW|qg5O0߰b{kQ+1Yf?7:(j}5R(GRF:%2x5Ke\/^rPJZOq>(p{nVmm-cˁ\d.:8ҹ޴?^-[t<|Žp/ JGjd +,;@n Ҭ{x 9s[jVtH&/u@S $U6®(v|i={2DrIe/ \.MUU[[˞v P^dN`@i!{)F“!B%i] JKKaPviV6<&?f!ҒsR'ȴ䐽#ɪt42-(-g/sp <X2tu.(&Wv[54ڟ fu Ͽ}YS{WN5}Ɛf@P0;iVA8f?eiU>Ae<7 (f,0Oa[||X-Ϸ}&nVTT%,Ǫ7aWn(wwjfoUP,fM3_1y=5`k')!'Qxl)v ٌ;|5< ] Q^ OMWw135s_ `(52?7&@ ӭlIL#U*m55565߮Y-.~ULWߜ8lܨwTJ?kK~ 7\.W]]lj\MvzYJ~֮ [v:8um*34klx{bmmmzj{?LYFd#5ٌ&םS4w vn [vi,ˡЙ36?˲4}zuӧ_8_h?[{$k?4]YahaIDAT*so/eI_cR>ߊ=3S[nm!ܸtv57`39k|WJR0`/v堔jw蟢(&M\Yx\>MT@C@PHi@Q80;iP@Jգ 7s= 4XUIENDB`tora-2.1.3/src/help/images/output.png0000644000175000017500000003166311303312237017306 0ustar michaelmichaelPNG  IHDRC *# pHYs : :" IDATxw\GgU@)Y@PwcQ{c4XbCl(boQz•mqW9ُs<;ٝgaJ _.3  H%A'q8DPdf4@ eEQ'gT\e T^hrK{@> B6II|VN@5Q`+UMӸ4eAtղG  JPV(Il<ʨ'݂Ob" 8`{" XtxKk{KBʸT_) (fg'&ʒH$4M BǪU=<]mV3Z>Y E'bcܐ!2zn۶mץ؅;οRFT~Ecz ~MSMZE 2%c{w muMߔa2/ӆh׼I)e%we!j:M] fFҪmQ%P& )Ѧs緵G7V#O{Ј}n4#_9c4SkG>=hd!mF.Y#L>Xݺu[YBCyy7o߾}V껷(}A+5dM2Vk<ǿOyF}œ˼qYKl4֔:8$a9 8^Ӗxך(wѦ#$OhC֎EiKP[*><>׉ٵJ&:VIJ]vO(%¦g׬ϭ6{hN& RÅȟm3ϯg{{Ib׍_c/bF{6]F,9,g.|a[GJPgռwm]'.ථgnZr}ԙ @|8̪ײ%*%~5F<˸jev-yMI3(׉>)`[i Ko*lȦ@,9O e ]̦A~S }y/kZ"t!y ²ŁJB2 J%&1!xȥ뉱M/3*DS绐sCy~vus=~lHy:㏠(b\7?%<|zء}.A M UnJRp8&uiz5)Ư!]UtcF. dNiZ(ׅJ`a]7[}[ _")C~u,6cO=#}y5vEy^]>Zg.±"{D-ݩRO/cGV$\;S*@I){VaXҦʙRªiH}<R]J? b l6իWi&#@P`=ߺ>Eedd899 JRV P@ӌi+//OLJ4kfM:0<ēwjlUim6^LSQf^p=rdǪiPlRb> HxjӢo04A 4 M*dPTzTHd}ʼwxe2+F2Y_R )m5W7~]Hw3M/3F 1 {sϡKO>RP1G: ]OU } >M#[4Y(ߺ>N.>E)ʴ5kDPD:ߺ>uj2muG ㄇ4ärwwu2{}ʹekV{fӺ}f(ϱV㮳 :|믲eѬԙ;[8pl=8ZdH&oX,j[AĐFw"*)!D~šY5ٴx 9q n +lI֜pλ^XӘȉg.K>8@iSO3 )>pʤnu(eL4vDD726XHÅ0Xd)ZD6a'|#A) zhw[*MLl;3F9> nyƋL\؇NYU_g{Dg9+%>p8ߧ6iڌ.B$j߹֫"T$A˗jp|鳌t???}|\^PM7~ml8%̡Һ/oS{ٙz+iGSG ,OȓN{P8%.vN$)֭?pwtrP$;;PJ%_ |uJ0G:{YZcSnj®"H>?y>Mnr>Vq+77'(Tg'*UJXe^Jnݺ5|Bi (ABt J^Te qb1*/ke@L@ V T2b T(JQR>R@%c"T_H%FF1PP; 譊; PE=mb0 3=-F@%c("Tu$Ip"كOѾl6>aa*OVTYvފ(EQR? BQ A:O<_"3@ 4h)y@kcTTaCZa(F(UZF@T.?H$.ժS%~i_H..E"η B$oMwh9::ڬ(eYkٕO˞>GxhHDZ& 8R4-V%TJ0plRXX,Jq-fbS) 7>Y-c޳l< u4 ̞26gX"E1 [3w;@CAY .LUʖnCѠQBP24 h X 0||̓1Њx{:y}>#Y0$u)& 񫮋'sa]mOyQO)0 2n;>Ho 4:-֟{pʁ%({+M:ioù7jjc 6c[-PMg J y[gY+.x~^c=ԡy/ }gfە';mĀ꺤I'Ng5E{ФNuvF/_]-lj/f%OƔپÂ7nm)* C^``&7lwޑBZ.xwFA-{8bPywO ~×y,4"Z;m̓^0aܛؤ^PvbrH` m}chZݻo7bD: @@3 P{IGaeWk2lכ%HOٌn\ Uʖս*e?g<^0bsr֭-6ºoѣep`~ QE-ip+sͰU@si)X|oB[P1K:%EX"Ƅ7N/z ֢ 8,P`фSn] 琞v8#@̪(x̶҅N/vɘ<7ucnRyVk󥸸ۺlB*̉=\A|0diSv߸ttl~UW^_%>!3M~L8s2Mi܍X"YxŋߵK}ǎe˖-^H*[ƫ7\hI9*-Y\s0'\S5b[o}pfyk[q^vxwjZm.? w.jdͯc.}f]kkɘXvon:;J3W^>Nꈟ:zpCaۡ:}622jsg9yĺk~ц/Z כ{UOKvmܺɷ a(B`Ӯr4:q%y'v",Ff7?^Ԓf nhߤ$OPKs潐҈3фȽٱxzaŕ2oK8PIT擘PnE&ǻK4]^T.E Z(@J;o;v Sp^H X*l|VR eo&3`;#ngf˗//[Cݻv۷mn޼yyv# "ɉ5MhP5 /$ cB^90ݦ5frẃ&1\TGT8|ˢ4ihjg?]AcZdԩSNZ^7!r\sh(^ JNBº5ٱr0!ůTe霶Y[Y3;~}ΦD9lE~݉Ss/ we ^K@ZJ\ImO3%5Z%(s$$0~ZC.^QFNV\˵*2s XUϻb0*Ge )vz;Ur3bb2*3TQ׊hHj99fF^ݪѾll kJ~'L[;}jN6]Ǭ>$7 fr:&;  ilDکO9RHU*REP06B/9BF>^۾%X(Uޝ 7_6Eٸ̫M\W\_&''p ȷ JNJ )S~F_#LSͦ -м&@?}oC ͖HO} g''Ph1L4ZFq\" lɊU#4MK$YG'j..K_aDU!I a T*|!з\.، l1}L4|r~2~Ŵ1hx T4P5PbtZvyׁ@qᝁoMꚔD}v9n*rX;8*qQ/T Rݽ!f$9<\|iGFWtFJמBp ޔ@*8kߟV邸5qslyF>]~k!Vy%ڪ~mz}b˥R*։7vYA^sfj%x1t͊L?oɝz&ކ@RB _! q;cú] \s/O\/F;򲆸e{ Y"TmTXdܡyԲgQOd~I FƯԡ{*h֩~=~{7<;4(RhQxYIDATܿW@+/ensn={X̹vX/7O=`67nDW+mhɣ}ӻ5vsskX9"ލm9hx]ǞP疼r/hR>KOתa?#zs,y(@EVx qrle/[Wnj"'L>")Q`߹D2%KJLǵCI*HEB~gG{X^I_:95wkitGߪ_>W]!lLȌrsjbT̮D/&3'zbwvX!3.}]e69t܂`!d-lnI]c^3"^Γ<ЊwpfgboNznRFZ) գg\XG2[ )MHً'.6.AUKf4V)MQ]M{ ^I^lV}aHT$_.ʭ޴vٱrJ.^#=p7$'<:͹x^ A5y/y<_~Fz>v 7!쌕 Zds;J0w|&iVQqi\ rE-2{OJ9|H}+*̘-"g2q PǬ-1T or cmٻBȼmIQ~lPGЊ'/&~@ ,;wq#{{7'*9;[Ƶrs٠ϖnk`wgt`6pDc<8b;ձ*1wͪ1p-p܀>\v]ǵ9yKmOO޽?m`/`0HavcnMjVfWjPb,k~3H殼wn5j*@*3! XP5 XP5 XP5 Xff$MwiZN!`5M1g=ǧx6?8G|>|fp RFϳ'c~* @RMQlKan/4K`jƋeK=zT;PQH4ͦKá(RE-4ZhjP.?[8F?MSHWF'?8hE f&p8'OY cXɹQQQvvvfώI4PA~PSR( oAQEPD}1!4 }ryk֬~ٳE"À?~t,GGDžы뉵.5mٕI T.PE?IYGɦA&vmQttFFƂ̛WE"}7bTJP(7n Cmf@ 3V(*7蓻u'8AKghPtά{ |X(45111OsvvkW ɓtN߽{+^|b]]]5T={ oooqϋ/B[{ʠi$IBI@EL M0.\`u֝9s&FJk$ eI&ׯ_E+/kEP AMSe5[ ` ôM Mý{q׮]CQ48ğ&dRӁNE >u CQaBiPMPb8TW hIiP' wOT_~~ ?"/?_NSyٓIENDB`tora-2.1.3/src/help/images/sqledit.png0000644000175000017500000046206511303312237017417 0ustar michaelmichaelPNG  IHDR֍g pHYs : :" IDATxw|EߵC Az3*EPW$")4i(M@PR B'W#ҏ$1w3;w7JQEIBB B!AR舛;aX,]7!B!DVSx Q !B!b!:* uBBBaE!B!c 11\(B!RR1*r, Z[\}8CW -c@cU!B! * Z>1xbQ N8:;dӥ}[99|>ݛ1\ Eo[ߍZer]x.O/'kX'®IOgk9cѦyq):xkuQ΢83^]N7N9TO!yRPk4ܻ{ b Ex((Eq+r WDŽjs|nldQvb[ Dz19ζ,Hء|gIّإTEc]ȣk|F CuçN;36eQa ١AOSz>\Pcu_O&^˯.A/o=>,m5E)+7,SmYp"iނ6fIK.wn˵꽝6#B!x5j.]ĥPw?_fs?oooCXXW^l]9 >r4h uYۿ&MXNjy%D&p@}O@ukRTTx60}y[%ppHJMm:[#0ɔgi2v˶uuVe`-*D˰.ml߇j-#N7ݚz>UP[MT!CQ}XI8oѥafJxq6f=ΘnymwN.<5_y7]AqE)#T\+T!"2no cs˟=?ezզ>=hn-o#垯}3$#=V;3=ݹ=pv|(9Ʋ^݋[k.؋h-X=3 @]|ͯٽQ=iwyiͻضy@E?is8>^c=N?ofmo w2,BǎFl2s5*s1k _g>ԩ7X,fXN1o|wZ݋~e޽lW~e+{g@t5re$z8(IU§?^E;/1(Џ5&i}-Q;|4Nh?9߷p#Tj{H嫄'ѺJ,2si-BgDgƴ}slK\P*αiKb 8S1sLTmR:чyC+Z4 E:r2~ʼŠ?i" M?m+ t!#%:HJ=?@jbMk#۹5Gcfwn󛞟*\ ]ΰaHz{Nu= 췷/)cqwg%x[ pՠҸS\>;EaAW}G!vO\K׽ZG|[4#Hrpx&TТ֕q@\o ;o@SJhu6WfbήC[fx?0tlEVmK ^(BߡAsPOwnG޶L%BԲL8Ջ7BR- oD1W pq̗Z3;EŌٹ dGYf*cМonʲ$$u+J9>h\T jFM"1Q jb8*qJ0k^)3wTM~R> TuLYȝݳx{YZLKBIsE511iХ'wn󛞟l`_9?lNg1З^xn6L aIZ3_'VFۃi0 NmOWy O9S猗] UZG=PiV#$BIk)΍2NVBE~|iEwa8AO|g&x:qj鏫l7cBRըQNN?q''G_ṶmQ888fYstt.UʦrGGG+}Z6rRdҫ~BބﴫȢ7uI?9mtƩ,.nUa7{Iۻ|JM'%Z yLlso&,!41sYj8*q\5uB9U~:zc$w O5@iиWW8*J%sOT{:jG:0V6GE!u Q1p >N74yäu.?$&b&&4)swn󛞟쬩J~Ax?B1J \vOsg(KT%zU Npp veq%4GepeW/Q*̸V5P~;o{ЭM t9&Si3Jl#ljLS#B< f3ΎN*U;aafUJ58~$'NvTRLXXŊ= 3(J|Z,f8Zz?q2Xq &#u!uK71n?QcUEq0GRץ{|h;!fBb9:pDLET\Seiܫ3٭6/;ЮPKh}j1㍊8J./v\$ >&0U%>d; _D|>;C4DnyP, ?M*_o0(e$uFz,(fݘju=$|~N32k77[Ҝӫ=_lBcZz ⥱޹oz~kٹ3;Ȋ;V2pi]4i˥N'9+ܩ(f܈6sǧ^{N|-i~ϗقϡGֆ/iY95*5ZgoiŠch/4Exv4f䝎3Q]f9˸Vi;y&+Jv#=<1mۘ0(o+Ӻ{cyC\ػ!׶SzBc'?-v oYܥ8A?J h=UZt|Y| c{B'&PtרҰQchѬ4g28u*Rx G+ڃsyTLSO1\&[nQZlIz)qWpG׃Q1☣9d$oPhz֢+Ds>nÌ0"﷔?/Zy$y2d51gpq#Xۻ˘O|Zn~π2x=V!?8ȩS'Xq4jwFpMרI5P<@6Apz k=,9T!BIt-4!Ld`$}||'B!O;I|bNv; \!B!il ?@+EQPs(B!"{Oj`1[bvUB!`5]'1,'f=-0a6mZ>Y/9#eS\F!BQXTC/=b::9qeos삸 :B!A4cq$1ţ$B!BK1#ܞ+̸m:p$HK'$VQT("(((OУ(8::P77ɍ b i/Hp!l*Ak`m+WnZ^+Vz{bcc |2e^B!D>DEEqU|qqq)<f&QV2E! VERٴݻw>|8nbul߾//\Gv*VHҥqrr*!"qqq͛$@?OnD⩐'ッ888rё%KZUB!D>RdIEDvUkyxrgXXx &+2id0,[ɟ{mΟ}4 !DA0^]Nf iڼ9-Zu gq ާf&򯅼ա>|_}&>Ӓ;[s4Tzw!9H9gxgx~j֬Mgh*m_6b^Wc֥Ӻ?V}U߭BQ\EaʕZ:_'$$pQzIٲeϏ/G0 9ac{Bԟt9x O„e kod=;b2?/[ M[¾sWr8?iyo8yE!mϾ}{ضSVƗ䫐®Y!z4yADerKlaϼ fjݨLBlDz,}Cqpkߒڽ`yczH+BLL SNa)zEK1}tLL\\އ뜜ӻ}nݺ$KgЫw}{\>ey}]J\׾KmhѼ_–Ihl7 rKqz^~9-:cԣ}6MBנk6s)!_Wqy\w IDAT,.GThΤ`g_J yH=Heʪ1?2zTSBPC糠YfL>ByrVF,ZǗ5wEY+۴/sn0ǿFRy'u[`!G݇F}3C8B$a[˸|5y̻m% Y?sU=}K<֎g@gG<_b䊫\`{&c?\T`HZxjAK`xFEx QՔ}:Ӭ7vݘj%,]$/-bҥ6M-ɫoވM\L~Vjw60m:0yߟл18iҍBwYR߼53 ;'wد,WX}l@熰m]90h Yush?777ly s~_9PjիSZ5bbҟE5ZJK&*Gʿ݋9®L>W^(|"Rc/+ ~EYK-e{|?sa&#*337-sxo [tmsmf{-k\ ϸ l2ꡬ'sgRh:C"`KүM tF~ Pc?,ՙC8iTg;Os1d?+a;p e$aPBgjdvD>|߇o_$*^W"0;/wKѷUg2α}I>j@~8~DbzR&fKmkʎV_Cm?Ů coѤ0c}i m4<3]J>H}tw'Sؽo/bpC@ ?> +Dײ7X(FK%v|+ƽ+K.3f4cƌfΝ˸qc3bcm;53oA>Œ|wㅈY]?^7ϸiވ _hC>ġyBV#CFU#k 9U#ۗ`FR*Up?{21Y֙jPֿ ‚x 1փ3y&֯ɓ&I3r%Oc,?SETӛz&]:J0wfİ]/pNM\T6] ެsI)vlFqJҬOnoyث>Etj\4sqz}! /SB[eDFqqL1qcryvMٲe\2'M9{$nMr!zH]CL)/tx%}:gtvxҞk-z, .}/fvjf΍/IYLQ{P#嘚 8!R8+\36C+$ؕ&_exήwQ0ZJʃje_UMgS)Xně-s[йmUZ'ԖD,Jix}x'~viG[8T{Mbp̳=оgZV9ߴ6+S[d4Q!^[{5S嶬֝;O7v dGYf*cМonXBqdp}'qgX/C(['e;ض=E mDFF{n>p o\gyxzz&('\VDsl(Qڵ93R^T̘at޴SPnb/*9=I*7jaÅ=b ԝۙ"vtvnxҞkR:춴A}b"O~JD]yo$&<~cvejA,<Ј So*+\zu8ŭ W.M8lSqř(#Mݓwo4u}ovަ{2ig(ќo:(mu;0r4]Mc9L˞кȴfE⇛gm>߹Ųh]}ХgL_N/r%>Nٳ1P w9`5{P! >#4qKnCy2`cmB%pmQ >#)n[?%yn}SMM $ؕI[^%Z Qw㇌ÿ?O@&Cn~ +^mj;=SԶ\i4>9zͩ33>Fc{4wJ\WjLGߟshgN}y۽)];Uٕ}%ži ^?dϷ}(-mCQ,fo6mxw0_'X4Eh:!w۝t!1X4891տdYQץ{|h;!fBb9:pm#g"Mۧػ2 `K3a S6$pUL|{!Wsi_Vڗ= >`h#~g35(N8e !,܆, >Sm(S[sWO-t^uCQ̑F'ujr$^a\M`<ʚώؑ295EfoTPipqO *i2yԤ&s+y5]ƥ~&ł!7AW&OJݺ~L<%I3Sku"7o+6L❳ZқmY~0Odʤ5}.Fp⩦(͆7!NaxLư bAҾ}{uopo0q&Ζ-?~_=6O۸a=7n_~?ܹs$sѩ+\6C;;{ t2))54?~v?1{kZ䅡bhB[ #;1U+bE.^+x/_ &*$ h:M_v!ryï;Xq?|EUXޡ" c_kJ btXkӫ33k)J۹1~5S]Fl\rx_vWѴb9|k[S\ڗG+ezYkWL7Kʥ(S:\=F:][yrנr}>}+b3P(uVm(8dhmBI[hI۞#Xr/``@qNm ԱwkZ×rӸTAv >`[T\փ!Gѳu <? qӤWy4aq]۟e/f=|霻KQʃK͍#G&(wGoIz)5$NKkdZxe1=$x<글%?Νhm,_~X^L+O L=obsjO{I?_$^[W|;ӭWyq-6o7flɟsG0n)<ԳbyTH7cmoC%Xp?~e>6{=44 `@I :޸jjqrrƿB*<8*UNPS"O !3 vYaI!RF\@[>cR3gps#ns(Da*HTl F7W7ׯfł((sDNIc{{ ";(!D֮R~XޟQ!BDAu=Z@Σ~i$ !B!eG]!%HB!`d۷Ѷ `uJ*EI5JrVKz]A *P`d;)%%=E""I,^OZZ,ʳ"*u{SYo3U vNb)N۬[TaB 亣(gR 奖(OX76W=K+5K+z_I{^goRv:[o# ON}H;X#m**u&.q ! wQAǔހ*k`ݗ6o*-%fUkJy)JBV-_cS_OaP..ҺթIIuHɒZzJƦ/HR7U)?NRKTʳΗEyOI?zHNUP.[AI}?5/uIEe͓*]tRYmuҿI)ꤤb9NDJeUY'}ח;>bLF Vh8.y`= nق+$2WML)f^ AҲc#9RYeKZ_kZE\9*[^kZ_?Y./y)@Bbfly/5-Eviy#TI!OiV2$dq06}y;kCZy-/˂>u'e24F4,ZEeR%2]Z{fvrնeIT\6Oap JWoEcޮ\q!2tS[wlD!BDnD3wKQRitB!Bxw_bAqZw7;Q"M,5W!/~WV ([165EQk2't` uڍd}!B!_]1;Rܰ[2ni`VPI; )D3XW!-`:e>y!\y;2bl5ɸGW!B(Ds-TΔtL1A\~Iޟ,ǛacQI]f ؘͫ M+8y7e'iMrڵ]_HD<%E/ 0^]Nf iڼ9-Zu SǤtޢ ;ܒIO>GdG=_HNW i7mC{Kߢs$;,M&}{ٶn'}+\Ğ8\&{w0}.-jCƜeEHC&no?ᙹz*b EFA^[1n,սu֌O"S7^GSmƒ+MB!S$_AxwMSprjWïb}.Q;m"5\2.^J<^KŦWI|; )˸bx] y<eW`NNזDpo/wHFךͧviű7EoKq97Sm-H;}* f.eR-`<3VG\54T9%t߀ԩ2(|3-j^=qp-Iz-YwދÞQH=C쎟:ѯ{ ܵhG" B!Z7xT8d^~$TՌ0"Eʏv hh#ǃ^{'5zfJC-q̗Z3;eŌٹ dGYf*cМonXr#-erWN{Z^;Oe8zU{p>-/TuDmc"B!$n߾-5BnQ`{;E&$D=׬>rܞŅhu]"CI+6)ovNp^K$ؕM+B!Df:TDQFh߫'Wu__.NH~\'QSav}F'=Ыr$+o%$֌b꿗^WXx'W-"泣8v=`$4:ƣ/VEyf՜c8N+B!DVd$QB5*5ZgoiŠch|Ɠfg5o6cO#Lhh9x2%<?"<;qa3fNĨ]m.cD.w]q9ޙo1sPynLݚϵe2iZ>7m'O9duEn$YB!oS]:2^&?^i[u"+ٯdžj5[{7`&bl`XF-V͛)Z(ڵby2n`>C2flg7}<ʽƺ_TS!B<1#zكz,8tL1e|?CN7B!niqy,.Q,j;_oG8H$zfK^eK}s7eqqKiVNnJQ̙܇JN* gy_eղm\uE3ã*"ŶD[N7w>s8T*ȣ<ʣ<ʣ<ʣ<ʣ<>u..T^OOt|E~7 ε=u9in`Vx=Ȭ^;2?4E]wq-U:K;/P}Kg|{Tnh/^Zk&56z5Sbxm#0sidd$'Nۛr>>B!BXN\b_^ڝʮ*=F?ǂAaM*g( !Cz)қX@)Ax~@ &M(RD@@DzI(RBғ+?K\I%0^fv`x+5J@3*:MEFヿ@#LAA㏽\ihh"]UoCd6FE҃% qd 'rvNRꍤUe%hjg77Vm6_ZIW?#ߏ}6r;_RѠ_rbm/laJۻr-  ooo*ECLM 75NfoE>Rtq 3_";`Ѿ{$$gCX&*J۳U ƿڻ_bݳZTAAseŚݴ(p4rgkFc?&9Gp3_Uvcٷ`|.;m'ye } Dڝ3EZ!I#T4^X̔~q:`o\d(G4K)}[W}{&%:>~O֩zXqi-~Dz}_yrҥ>~!y-gnB} 1_x~P*Ud>7d ɹWyoy~# g&bJ(KE |X?iM}rJ'O}֜TkkIqZ$ʇˮ DEg^g RRX%>˂`8OMY;1+¶g>S`  ,WRzt3s^qs3繙&0>ϺG'\$/Zv*pzِG%ΣATDKBiOC34w/:7j_!5gXZ:u\Hfr{tm]>42USR|޴/ =ZɹA9;ȿ~u[2︖BӸmz6 oCrZo)4k&NgXaY}9֢~>r,۰^kۡuI޷M PT5xbyENY+vo-sQ_˟L&_!?wV>w|I?'N-8~LX|4~|OfL,^(_ʓ^T5y+娨b=dY}(?K+(O2˓:Yu Qd4LgYcguqC&rPrVe]a &%e}iy٠;r]ioȫ{ _^+_HwSʭ>GN6zu9tĺo [L:1#0\,ytYukcZe5Wԕ`&._N䌻Gz([Igktl&i[(-eM~IƶgY1nスɛ-gOɍ/&;O35̖|A~~ yڅv0^ - h)/Ʋ4F>[oCer7ʧc3Oe|(~>'Sb齴km]mӶC+oAnW\ޕX$ oܜB{7|hZ ;˛Ș^˿;,<^!MʵC'*LJwV_PYjޜJ/+swa3_ց74%o gi{/^&OմGw4]#ŭ?ʖ{}vgh*a 3mMJ=+rY 껩P9cW#cԗu)N[g5BͰخ͕6m{Y}2/0*4U3nrsJ͖|Qy獦btiY%wρz-;CiTIBSv/w]o`gi䙹8͢[e^v쵮 oEhV~'wߥ.b]XPnZXˮ,sV}H7^ lycsT.|jWTr'\">2u㗬G"#Iƒcz vDv^7ea+$Iƪb?klV-',.ƱI R)([ gE.ڍ`737X`flU~ԉKxͰx\0Wn۴r^# N.odܖڏ-ha"$.%h'+6~i_<ˊ|l-669M"u6]vhwRq] Ax؉DrvӇĢ#,7?L ӚuQ´W [iab}_\xuK{;O CxҾnAXjު^Lt61[q?GrZ$x*Zb{f2 ʪ@iIY*c})uookewڵySQ#Is6&&W&J"5rQx,]TXp,퇧ޠyρz-[ck }>lyOK mu]vhwR]Ϫ T +rO6b.m "Kٯpm۷Jg^"ujѓut&j+ʖ;f'SHԸxxb'~~;1ۖ{f: j2R_%-ٶ7-Yli׶MS"Y,I3!M̭ډbYVJ'H,mVz3ǧ#90Wek|l-χ-iIN*Y{o/CFpC+$ |cFJ[Fr4?<\ȹ!iz6S4?K{7 lн'ϳmx,-{ߡ|<WI}L}W fWvi1g9S㕺8+D_AhNN@& U a9Փ33PY) ıCiQ =?x`AAO)Ņ7>@ Mޚ6%\ZĺVZ}T~)ycx *9ԣ+񇸛F΄xڡԢ>ŭyPW:Q,Ӌ9؟v_]ɘtjhwG=@깪P0xRw~XBI6AbrD5( ^AA,)H݋9LfoaQ$)=0^ N2-$'rvNRꍤUe%hjg77Vm6k;W3P;ґd@Nw۪~4蹌t"Wy~\0V6Nb͇/||5OB\YoD~4쳑۩RO ٬E=  `"3~, ooE>Rtq 3_";`Ѿ{$$gCX&)ޯNeҦ*)<5䊉5xGr֝=g+je~iX<tQ8f@[PA*)X*  ee(h*֌O""MBsœg( 8?o?;$$V]=Ke] WWh,οZ*<1LҳFVϦ>_& ڑJn|7[٧[n*v wG&)~"FAA+Hߋh u.aN v/]ʋKpw8r&q7URJzOlAo˸lf_0yOV>LݰqLfYTpLT'03U=Y#?'!8i@WFLb_&n*  %0]_A;g3=ч$4|i)[$  B.%~DKT(r2gVoѺ+ n6AAQk NJS1I;y(Nd0+  ga0֞$AܥSr$T2%h9H8ż Xt*W.SSxyEJIAAT=&Hq8͸BS-㦷& DGu|Z/^b5jLJM-:]J)KNVf4pWPW"Y=\UY91E_[?|:2I rRb݆צ&9ʌAAd)H݋9LfoaQ$)=ZNH6 hƓD\z)6x䶞̞5зU=|isQ $'GAv]f7)vW]sW(C'QAAJRĘ܏-r&7"pNRr"HDܦI!qt03i5g?Eqn(j?\xPHҌY@`.kQZ fȵ.̈L Kn*  %̇*hrVl͈{,'"$t1X<}Pp{Y{c$ν95 RȐԸzFgv͚TY5cIJ`w\H4 pE>%. DZjͳDLȇ;cvBWD!Hv|̴,,rަ+  P+H݃h-u.aN v/]ʋKpw8r&ѸуP7=1yH|5އ){`ꆍc_gj5U^ U+y.zRUkV܄AL= >ojFijݚFi@{)Ν_̈DAAA(Yknl~ӭ>>^AAR+DEEX=&AAA*uq6.8) 졤_n*  V=63bk1$:8:(ׂ  p;䝁S$  ^+FA,o'QEVAAʒ$Igy]v@Q,$:::P*INNF.BAA*^#yDA`oC   c/NF]'*J`͛o$I*(R)n" Pd ,#d4zCGRDo܏~Pl~9燲n#Ϗboa<7c tu8y'IuRXogY~-6_@ IBc Oӽq/om%2i<r(#Ns~0;St]s-=!1sX~g_MbR\מc8bKªRŋFH| IDAT m:Pj*KJ Gh4AAG,Iρ֭[ܧqYq֛q;ޚ@i<8P?THhSSл-S0oՕ%Ag>Un-L%/x74jABq9"{Ҹy*4/M}G=c \U@'ug Dߘ@JMK"-=jժ:, GG' Ef/\VORD̺_RRC   )$!2,!If>dI~.Yd!rsCcAAJ$I0H2IVNRJ$z{U.أh-F'G .kz8e%Yȣz[o[2_i֦OP:GTܒn1uvܦR+AUӥx84+`T+ IW?ȸcـ޵#)Τ|J!7l2!!ww˓kuxjz>sož4Q5GJMhӦWAAJ`@2ّnSm]'"E0ƀpSc@owS*%p!AG̠.%Rq}MZ;$ڜ l7[ӝ9*HzbU2Pǻ.>'V7g~[PA*-/4X;qMz>?leҤI 4($ F$IÊ$* 4 N'MAA(e ryѦ͛=k P,_W\Jj8b@G*֌D9|œg"&Քw9NS ik(?W؟J'MƦZ;γ k]/n.T$on%h3PvθҲ/ò5ii|G9=N΅+I911h4>:&IwR﷐ ACG'qmԬYo/BKAA(>^Ozz:$΀0<5?7wwoMN7}իU3~vY2XfdƸqӰATy֞&2'gggBCC6mk$D|^'5%~MT*c^N8wJ%dM"IG!:AAʖLT&nUayjnǏQ*4oo6))]I*8+{md0#ر#NyQ)8:8RHO@xZTj5&E#   ZsΝK/`~ qMCL1NC[sǁI,ʝeI~L {$%%ʕfsY6hJJRBTTP)(JTJ%J*sZ[K(+J  e:PV!gW` $ !5 I2$#IdYFpuu^S IAAR&{(dRK穹 shޏ*/ wishk`KG Gj4۳14ر K<³mz3$4̮\l: {ŢP( Hj4@%9xZ{zxh4<=޾# u4i rVyjn)ɤ4b$z绬R9=z9a/_'7ZSK6s=-];g=EK̽'''FsxV,ևB@m$  JɉhѲ%qVmge{rw]FeݼWoO{#HN!aPhr`w<7MjޘKyu/Wz`D}l,~|/E:ߵoDL8U{(Xϙ`'%4nh9r5+Rγ~$|LOQIj"_ - rY+x4Ϥ3y'r*Veq%ŕCw(ˏPuHHHFԮSހqߟ  qpȜAP`gAPKZZZXAWeb[ʜO;|(VyLaA&fs#yaN=v_:r-lIR0ΧxbԐ(;04V"S#(2N8稾j9-9E58 @w$ %}9Fl̞3+6L^{w(_YH=}t? wa87_<*/iՍ~)kEg5çiW*i &###{xsaA\ JNJ*,PMKΊތ`N*4U2nzk~@3AC&<֋׿@ couFATiO+r3MFT:H8s{Ҹy*S |iҤj@;` \U\B<; DΗPggBM JhnM-׹m*nTU0|?գe7X|@t.?hg#S%`:_&ɩ\\}[#ϗ=xsJT9h{9=WlM~gbĭ bsA848pSd6P9_W*%p!AG`(%Rq1¾&tJEJӅՈ[NP$jh=*[i]xY{GhsíR(on|b+gf~tq O .tP1y4t!2*֌O""MBsœg(&~Pw9NܛS۷YNSE^wh]EK@*mIc]lZ 7*=͖1|V.<iwΰwi6$. I+jm4{lwQHYY=̲)q]nJ*?u$>UPN !y(z, BiyPFAx\+HiҚ,*][ÜA'_/ė6p Mqܰ6>ujԞ˜l$[]bjx5JFw.Y+efh\F YyշaaA3x1lj>LyޓOS7l{:S3wք7gLxLau1** $_?";JVEYNÌ{~^u;=SlGi֣1S[ёtzS9` 99! wi...ٳnYQE8QMcǢ,..θY8fHۓMQFxzxؚ /))jk`0HKK-'k'ޣ鮯dk'xo|X^ I$&&ҨQQ / rnn\5ظa}jL/<<ܪu¬گe,쇣>- ϒK3ه'3o5+vR٬ (ZS ;P,Miެ)NNN:M]dI"==NG[ngQohu:3% Elې 888o> a%:ЪU+M~QIG@<x;=zG :88d K䴫ll:+F]uZGT.]f)MEaEP!BmɆz#,q,21ÜoVSa'W5/w%亳|х1f!ٵ<ͩӧ7ڞՇ3? p[͡eOsԟ,{)8SZƒ_S1P7tD#њF+FOG{;{7r٭2mrW+n!dlut<%VO} 4h$£(&(j/N"P hJ0xfϳ`vX2TurƌZJ,=,`hڔח͚RVM<<<믿uޭV?|֗ۿw21]5 _PU $_fӽ.|\܅ʊHy{`?;7aT+/xN |՗Yf CMR"_{ɸ?2mPNŇ\"TSR`/[˶cq=rf7j.Zgl/?md,X ]$Yv~ p*DBkY~ۥ X{og7YFJNOY2KQHXgSk,I87'O,])0"gdoԩSu[5Sr/96ꫯ՗_{nvQGl>>}P*P|CzRRII'Aa}%i=i]c "6Yws-OGu=rxM9J2m=Z2L~uq㡖ADƝ5c5]1c7߰v29fXR6Z7I9ɻCp7O`;f\LFvbG?p{*4Ui9; jГoK뽕̤)so~-kRw^e ,ždt9l,=B%Q[^*c֤Зu} q)52\4n͂GӞr*VK#|M\K7DZV_z+IFU%"ײmu{V^vzq|k^!|}rcsaٯ}ZZh iR( n KWQK;@'%ȿT Y6J(x%*2ȁDE&f=0*Ҿj8v,={zf% |g5jܸX0<{vÿ^ZjLDBBBh ZMhh(S?JhP +W4`q~veʼ6USN;ރg*@z*KPŅPڣ!;Q׉I3vE98Fm;k:2CF qg|)xUCzC_ )W=|{1žqLWN'r66x핾O;Gd)+;ᄾ_˸1/нv .ӊ9/v?v>٣~0Q jƩ}I4dn{8iɐ1cye]zRM<32طo'vq?? C-ܽe,1 IDAT֛X~!2&T_|]ǼyT [`X]anq(Ο?AllemHHHM*Dp']z7uN=4n 貆%zUͦq@/֎!?M55D≅,ӏ2C]9.1}|=ADHsi#1)ӧ3}tV\%KӦR*njL19)Em *۶s(s6KPլ0?*kl9ɥ$^sS 9G6$NwjogY~/+_"1ƽp?ʡ ~$:wsT߀w眢\uL @we0 ͈g͟/3D+ʗ{q Է1L8ż Xt*W.SSxyłuc!? UO`x :Ҹ-*|O*9*=^{ R$g︞cƱDv\/9˛6Q0YUѲQQX --/I,LfbZ)4ߊ; Ν;7dD߬d$%'quk9sgϱtRN˰ 2|g>A'}ۻ6Ɔ"HN"! ?ۙ:СCzNL]R qS`! W'iL^ٝdbεBvxj2jGRg~.\֧c@2gBiRJ \ 5:IPj\mRnr#- ]e!G'Aɻ4kSoTF!#t#ZVrE^6Lѓ TcMR۞Dցx@XmkUVsy6#`oOˬko-pFuhͳ":Scf]βkۜMe[th-[޹Y}Ǝ_~Yf۶;g;T cXڟbnZpVf܎;-㦷f69~24xjɼ)7Jm 3f*ie_nxR[Ɉ v5 8@=iܼr S͗&M>1z* poL|FF]Jc c''I NmxmZk6g#Nͬz4GOw $=tz:4;k_ԙ3%⎲\xG%8嵩mYjF{BU^/Jp|+iU{-nZ=dUVETBg2.+{c̣1/EEeƓ" dW1ΊK… '9WYkc@?w7_7^/d֭lܴ@&ORdU(U:g`=VkWХr)-ʩ4j_"9}&L]F cU gU(ѓ!, HJ 1΁t@ɽ|gxE׀mf !BB*B7)+"E~" ]4-tH $!!m#=$l k}fg̙gg̙9s$G^iL%Mjl9u `<֮Ɋbӳ;l0"" /rP?pAM\='͵;2t~m{uX|9jݚqV+g)LfRSrɋNa"9=cb}.] K]wɜ C>KR毱KctOY>r 7ƅ@e:!$n(z#s-"vGھ:Ryu`7|hMBY5껠|m„̊ztIΜ#WSX>Y056Z•!l=BO;6ǖ_@v ZӼmwǽk

Mp;c@^=Qؒ4lrRpƨ:;MVM>ʬF"U8cbsMCmlk2{𳜚L]n 6T˰et}Rol>);k3 [9u} g-@^OP&9+HKMaٌ_._GXXN<9,0@n \Zj2h<2 s`6yskO! V%Rlqǥ-D7^C [Uxq?Ψh[ IX+.РWzk|یb{wu3 r \0x$׮?y!C`#gCvs?,6r#2)AOyT ֣;:נy]]UM*<9$w yHLORN}^ɑnN6zzZ( 1o`sﭡ4@23{~bId}~ˠLc Ear.?- ҀN1 |g9{,s!bccp5kִp;N֭6o4i҂Nf#2\i4˂plhhل1G{ޘ4¬/cÈNG7`4 ƍA@ƀ 8{?있 ;\KR9661[Y+pe0bDí^We%jWHcx6`4a)+Q#JΈ."N'=45Sx$tFtwdn7%s|ҦM||*LJ5RSS U݋ܛX^Ĭ&3uz z=~^^_TtďHK а!(Xl  dGaR_n*NGZ"?|3>J9]OǾiO{sQ|2\뼆ыlplE7bmQu'ArNʬ^+ 7io"dbgHI>3khQ &=MhRxVqt UMOƜ77 ]>}jlvZoqr8}݌ ;iEG|Oӣ_H6E{p'\e=+-2tm45d9FrQXfkNYn}*M0?;;o֨Y|AHIKr'7iT"e-L6ذk@+R\a׶w?^@ɘ'ߓdfWQ-W.Y>Y`3$㦾7q7#/]B%[9^ R-?FoVJ߳]7N¯!CGp%-ۓp$ ow$vTnݖLJ}![\Ѿ+62U_{_i/hx5}]7Fc"ۓ@$*B^mEχٰ$ބ鯌%٦d6qF4j5͚7'U*W:'?\1MA'O6˒UMtڃ툏Ɏ<>*E;''y-EbB)^@l;ڜ%.hEN^C#pwkeG؟ l"Hm]z#S삏iRe%Eu˛zߧ_vDtKNsQfP_2`0  #--cLr 3FeFW--2&ZE,8˖b. T~&nElk~g6[ڷko՘Sr'(qׯeOT죩.{E # lDkM8dMkR;!C}`@o0`0/2 F*VeKm׋ \ aY''g5k)rk(J9޼qE!0(=͍̦`Ya~0,cqY2k6oLMi֢:S'N~5jo撒Thy#:k׮ӸIRSSi#(^ J;9Bppryy#Kg ࠓe-JEE17fXJ:sAi껻9Ԁn`c[ĿF7-/{K[7Qڠ7X}kZ4'KG^LGKT%(Qt֍˗2<͕/eEԬU13ɤ\cVJ( E^E&?CY{v^ŀ ܘQJn( DA&cygbR)W'h-+J)Dy^ "n/gruL-4^:G=PQ18(Ϧ}Z2B3$ *sg憽Vc>(llxٳg wiJgm|P"<T*{tb,@0?f۟=,cQ32KǓh 8:ǷܼDWFt]XwS%SmWWE)/0$װ$ @ Q|uXB?zcWG ?4Ӌi㛁ͩOPh}O̭L{LsUw9qF2{#bt~@wY}@X7Ct92$g $J^K)9vYʎWH?Es'*q9O`(H'Q @ $zz0 ua[>ev'0sz0"0W~h Z) c|fnˁkVLԛ3jZuߣ#p.i.wK%WƗ"c'1..sg8)9#(ųxYtP.AQhڴiY hc|RO܅*{3|HBי;pǭ`\59ܗ2r_ǁs#f0[sCv,W׫hԇ:JK?[_~>/_oNi|8f"{j{%ڵ hM0~Cv~ /Ѐ^? 4=fY>%B0?Cngoۛ*i1>E?snak\x2le`ҾGhΗ==MdeOynBWmP},_C27}7?F75:Nfܪ@ (!'QP1I_^jQ^֓b֪Dꌭώݍٴ:j*ҿz fE;hȎk!$lk8842zi#vjȢw2z6v̢?ڳ`sFՙ~7{aFxck+vCØJ\ݶ;o3R!MGc2"kypp}+1y$],;p _rK_v!˔5}ˀ>$fH'9ɐҼo֯ܓP]DjwhU-2KsF)c{v ̵_wTޝ $naheօj9&")\i_JWjyPU @vo‰' {Z@; =DPu!JgQ?-M~#ʑ%^F.~|`r} CQP>('q$ʽ8B˪]( -Ue`[ )$ؖÈƙ!̓L~]r*IUJJ rVz!UVo>>%T=~FVPϏ9s.-R\mҍ^DH[$Eî9GgS=~Ts)ߦl%69M`$IdώiLEHQH%yRI}la?roB]Ȟy˸)a =۝_5$ 4U5?5N5@=^m8"Ubh=jҲ(6@P{Ia(Jd6dl@k9 cFҴn8*;E{0љL~}.'ijv~KY4'K'Qyag<=J#ڄ( /e`Al!\ɱ3 \oM{^^\dEK蒸(46>8XKaT_G SF4Z?[2?7g"ԩk2GCc/S~Wxc/+ׄ,_+0wc,,TJ6A3w!MN"\UdAQ{5_Ҩfw'&-bDT' cڏI.CAa@Lߓh_NZZZF[gXZI?Щd5YeL\ 2w7Uf}dr1C= g'<$\>seng;GWb9 evJT g. Q *hbfӷ'3}iG6O8eQ؎JJ@M ql_wfU]nE{ey#45q%QHcoү9"s*Kض" ꄹӳZ2;nX-FGW~dvި N+VCR>7Wug2āox#.O6:૴YP_-ϢK_]_:ux$r2TŦD\R<⏌jw^_wY a[6˨Ӄ\ka~ {2 հgd@B)uEZOQƉUT'?WzL%--&kL{X;{^lS:9d2m'&zR|a@{lefli>&E2k j8g[6+T?mcVHp gT;n辗zƛKW_ܞVh5‡F7{)t̙0uhM$ānh7TeE{\Z Ol5fyb4/\sJ6rF\*\WMƁMjX\e40Nj1k*j8է亹WhOz[aSxLc0+r2g]oؕf{`<֓/:^ԸO7$3?Ki|2?FNƐjWc ɍײ&&*TĀWKڤnkQ" ןx<~䱢"/1/wI?NsoZwS/'ZM䗴|ٿm$)}ˮst u|Iy?Y[>_mt}TH;ϚIc41zuW$T%I r%_k\gx>&Fb}Q`u5Tʎۉ磑#y`@o0`0ҽ}{_?.m۾ʕ+!WR@Ec+X5-=< 1зWܞgYՑ姮r~K'*&Gouʛ:+fg!% վγ_,+6GĒ6csz?Pj}$p)QCZ1ON?&wɵsM ORƣy@ )R;o\~%I̭14YiC&O'Qce%ޏ@ *$ JH rbNaԞ垺3^#,G1|"Sh4F&<_b~7Q}-#`7j?6ysZM\A R$=B¥}F[DaU&zc6!s#Qޛ'3mWްd.mbPkc|RO܅*{3|HBT}$έwڞƽ9SVzڵ hKs+X<WШO+v_ F-9&~B;>h>):4{E 8ԜY/^@ֿ@  Vݷo0!FWO*g[(ғ(Ȃ3 D}|055T`W je6-.k`(7{ڱge^bŽ3q^購wPŌͬU7v&;"[ӥ&6Uohypp}Ka6y t3hqdfOr'lR=Lů#)^iX;v<ltta_|f ޚ ; BX6Pf- rhVhz_͞0iAe] {C,ayZ7&/Ze0r,>a6@_ bO&KIJDP'1:by{F|ѧaOYJDmw) PGeco-rRřŝ̓a jxJAiC-/J*i)$[tW"#CKܽ(bS(\kI' {Z@; ]fA~(ҕfa( UPs=TO) .${V#*)]jy`8?vd֗2p: &ǝdY; D5'R@vn>ϩh?;=H$ Y@ DL*чx{pVw<%zdޙxVsW2(LUKܞ=fQȩ7OFD*[+ g%$3cH$($)њ;{axVI~R^Mȷ s;owr %au\ ͡!j+gnőRh?SIʰxp62['mr@|(6ؕmٵNtɷI8Qթ?Y@ ֍[02ܮtd<.bN%2AQ{-G,Xf#@ZL_Z,U+mޟ>1fB֝D N5]Kͬg<%7~KY4'K'Q?(!ň s x)zpF Q^%q++tQhl|p`|LŋhdS}7rƮ&t}ۼп@ )]G\?zcWG ?4Ӌi㛁ͩOPh}O-u~HPVX3S}0$g $J^K)9Sr0j\vs--==rTM4݇bEBAtAb' 1+kFݗ(1ʉ'RuCٺ,ŋd6"eЩkk DB!Qo{HBD%hndĠm%6ppuAMlyX jxHb8r% B^^l]}{jsl]vŋxm.b_ FhkJ0r$՘޳Z2;nX-FGW~ܧhQ9h REҧO0_@ ʓNX3aΆQs.JIl<۝c=s7ZUT nZkܔMVä́H.A??OȄ{N'0w.̩qՑ.-f4v__qݟ[i/YnARM2_bˢ7(ĵ-{E$BIi;.)nԡ8H yBb>Īj F9N~u1\oa,t~Vh5<»^o.Y_]^>s{.A&ړ6tˢY;ͥ‡F7{)t̙0uhlMƁMj,#yb4/\sJ6è| /ZĬxW>*F^9i{?n NY0[N^@U@ x(QCqdTU@ՈaZJUPj%M?s ZTcrW5d룦XG|/xW + ؈R]êYwzqb@ ̚-OPxy,O>0׹2k6gv mdn3r ٞJm$m:s"KzܿsItȊ.T`. |0ḯ̚.hԓl87Cj_.C'J9]OǾOEpc`:g1nR̴֛723\FG Dz3|VWSݤco"P :Ke4ly.[}g4#'YQbOӂ$ CE%z/JR IDATLﲖ(b=%[—>Kѧdk@ `UB@^#0YC1=҅.KV|:RG)GW#pGQß@5ìS޸3>!o۵ !(2u;aNR\*uq$ϨC\ɟDp~؋T/7@WytBwꄟ tZ]Ta @ ʚ_%̽b#F,?Ȉ|>nSy$Go4[ԾgD$Vse_n[Z‘r\AْO2# rXAi!RAZkԬURDxСCeZӦM˴~@ rb'\PgFn`c[tÿ~XĒG\ԨU[ۧ(@ (k$>D9 _L :jR @"@0b{ 49) SEI@ =“hߺȿj8X:A1arӼ\nP<]kX~1`x6y- xP%Bt.z~@,axO3-7kMnSj^Q_I|{"̅BX~{غ+=KaXП@ DA&P'orRII-E*V38,Qs!x#<@ ؓ1D842!X 2^1Dҫ XI4!s#Qޛ'3mWްd.m%!sk&'q/FDʲBCv~ /Ѐ^?OkTs峗}R.TiܛC:Cngoۛ* w1Dށ$_a?|xF}W_[HѾv]C&n,VW R$j"QO,*~Nb՚?x.) 2GGܱ A Bjil% *|`rSYn:խNX˼1ϗ x[# Dhw3kwiDztD (*K(6AiCn4RoFE(],b=iդDB#W{d.Wuٳg3 KKþL]k'LXpdK*},a^ݻ6裦22ke,~uͻ8X΄7~o+ssV,1m զ$rhVD5d,:$e҂FqĦ's7la^7-lL/"Y{X_@ "ǞD&x7n\Ux_tSK~H8>7o9Ǯ$.4̔=y%?/Npi:6as;;$LؓhT -qM5p (4GDkm4v'3w͢ķKWyTCP=8ɺv҉jN2v4[,_KWC)kP bN@ l;tObqסǯ!9k)Cޢ{vk׎nբ-FE2,f$(+b&uɷI8Q)5hR%Oo|TD@"dFh:=-ҢaWڵKo_Qy#EQWNg@_ү@ OV`_9FՄ#-J 6Υ#yι@捊^6rwC,>zSdթH^1? YqEef,:q'I3碉:2ElpݗsfG822f[LEn{YDͷ!sw5x Ʉ0ɛ~Þ˖ Z iCD3H6YKXy S_Kb܅\Kjл[/si{(8)3e^l;OeO;عs'jB*C}AK ͥ##RoɧKVJŢKBcッ{k*_썉\N.ΘhP+ϫ" ޾2CocΝ=< QPKO+X_@ &|7!8z2x\WdThi xu-MXDrU%?{Ep{{%KoHB" ȋRZ(fEDA &v@!J k$w yfgvvfg cL0.j! w_ң3dgv$<2˷/?Z7'=Hqgg$}NU"WG9#;dL7J N$~@ITj#ʙzA.h;$'U!+<4,[0*j=1h'[V#.W+֭ުh%yߴ鶨U1qggd\3Xagqh?;FeQ{ahdv-1f_8x3MՆ1Fۼ5JZڳ ԏeK2)7p%R pW`Qbԯ  T$E1} }0=o~,I$Jgép `1{_ŋR/naӹoj4=_n[ _fL1غy|4ך-2iB켗M`f;:bp#ʈ1Wڇ#'Yk͖ޚɣ3gPzuTFǴ5M.< Lא, g{ʧ!i 7`ˬI\cqˤfiQA4Eb|3ĨvvǙ|cUPP :k>+V1g2bz@HB&þ@ũ_AA@$f>^Y3ef93fgb[HqspauP4΁z4c{_v fw#_RP; )&2Jkj5(ϙ6WjsuG(.J'G}j8G:7yòՉ#u'}ȞI%P`DX0mL[Ɨ tsF^^!;ԮÆmyL :\S9?p6k擁H~m6w+]VƔA0v^\:!SH|Om0>ȐFPKZK007=3%Z<@ ڔӭ^",م_ӌ+Vw}-v*c+?#h>L{R%$ZAAVXZz/aEK/vFcʻ`pou7  BQBi(Vh C}~姫3'Y~B!DAA!@*>w)#F7AAʛ'Q't7-ϖDpP/`xWl8QXtI /3|_P%)cC_x`[ {C?#AϷ$ߢCMeto=_nǦ9t?lTl%Qx*+vɇ LIC50m x\ik6.k_+`^WZ+y=Ȼ[} ^Q-9~q'r)SvM-\2&xғ2=PLΏ".aw"OR^&?=Dn*Tze5|yuY6b//6iZƝ"qF+f4P瘠pc<}-ޟ(V.l9͇n);crc&=#3ĮUx082:A5^g̔یɁ8qS)؟Og;}LDnZʢݿED9q,];صчX#AƝ1~IY6n32>G +7v<óߏI2])cLz3GklmFϢ4#zWQE, _%<ʂEZc_FN Ku ӅpLoٿ̷nvv4;AftJq>ll?iV0~LLamݲs~0YMmTߎGgOc`u-4}S,L2B/dz L.h+LV0dz nf;!#dt6c]OqGA*- 2:reHYJ؍ iTYp6 kϼ; Mj"~eMoѡQo>y):7}xX<2&"Vt٣~%E2F.|̓}ndvԯOpGX-qe)i_>'fէXV Tj-tAyĄ[{\T@jt5Y=,\U&,<^=jB˼<'lQðyԅH/E[Wy^v۹n kl}zv#*2ov}1W?e%?.44*ϛ ʟualnhjdYeNcsȊzymK?:dֿDZ>ٙOB[Ys%S?[YB'<3eyfwE۸{َ1KA۟=hrNť?Ϧm\MsO9߶׎)/[~A(y } K7H|u bfl{I>ƳEZB# iy# _`_1:O^LYG>#:G3ĤIpBCiba~NMkeDcxps9k"Nrʏ}/?ajǠJD 5;H_ D`%&5[lj6Nm=η׽05%4]\M3P'#HӤ<"FS4G"u4lQ?~ڑ|&GSzz>7j$}]F4\CiE%Z.Nn#|kcӵЌWol̿_YO6HSԸr9N=wxf $\ӡI)UA5~k9!ctM[g%6:AU=><C}H9!=:~t}n#6|u„=KXS)QIeN"+{]=qQ$OtFw2뷴2xWh@qS$T5㺋%94>3;`ѹcOvϗY'N^% (&R]`M"UDMCfDBV s8V8}z[ZOrُ'}2GNʨ-*sl}vPb5U?n4p/4w/N=TNm3NFw/@1h )u7Es1cIܲ/kj*)* 5stֺѫiB?2>*ckZrk)U* JO+IhUﱒh[~l~JqKXwWM0g b[1@`6=z;n Ly(m$l`85=ٳ},S&)M\/ D. ;>O¡]ĩF\hӕKL?s=DՆ1l_kFk?l4}8VsXv~yU+ IDATuiEfa8 ~HX6| r G^klrrcػ7f;N ˟;>>C~87Я15[l͜CxOX0*>oeu]g~^3,a<>jk ^j6 m̮e;ƌX oyXAdTZ_Yȧ~;׺5[͡r^/gr:Bi(lI_5oiEَ1!3xtY:ZIj/8{B}:1>o5!Έs2FY %v5Sٖ nڢt]_Q>{Xkˢ.PY xzg7Pp,Z;fK"0orjܝ}q_[:fGj]g5"q#ƬBDuif3j8;?Fd55[һw/y%X1[eĘ:H쒏xfn8o P9S'Muy>v֏7]g'q*XFYBH!i 7 gC_?f^%ltpr9ԮÆy'܌fS+:R[SG$G铬µ'{{}SE#}skq8τEvsx5LFkɗˬI\cqˤfϹ7WS O:;ӆG5d&5ٮZʟW+ ٿ3[ԏK:YߣrDo9ݱ{SgOH|X:aUߢkۺFXzx]dw=LQ}!@`L\ɞM7!G\e 4-1?9 zk>ľ"x7+?C昺g}&Iv$.6 72VYFeEA uhx{{ӫWod_Ȱ0h9+jxr. TߗɧAMX:-> l’|%-=ƾuheУp(ONPPA~>֭YPQׯ gћ?H,NKA(wK_?ۚԉ Q(bfFJTIA(-lxv.܂?u*@L>ǧ= 5ˇ'+'~\+HP(bUY= Ev0bjܩqG!cgl>O(S&Țva' dik-;g99]gY w~Gz99oVd3DոX].& &졽 Y 믬ɉH wcJ}Ș~[?~c|?jUv-_~ b~ ޾?*MMf)h0Gc>e5^g̋L-sotD#5E^'?SǟbnkZU"7¤Uz :p#c\ Oug=wzh!Wgjdjl}k}Rp.n?՗KބU{{O0a t`v$n4J'e__j%3nv<3~-$LMd?zUrS_g$ iyHe"O\f4iٕa3l\2Ǐ^ځצoؽ( ͻ_ݞA6k1?y DaH\-Wߕyvt)ΚX{̧K5 z{f~]_-_Tzzk NgՖLh{voe P\ۗ2of;NI֝UptF wptX+|%}7̦\uŎ%9CѧO'8lB(Rw.yu7&l;eq9o}F@gu8pGt\xś5czLo:뾏Q~]NN;rpH4kdkjּso_RӗR-Smf=v?cg?W7s)M]O+nKLKmWI0gnǒGɣJ%?PTRTjtK&g8y96#RHvDr!D֭p3k9$]g볃ؑ+]CR,`IBʕzuga^Tᇔ`&6s>YkM$Yl/_(͎++t86)W+$lt7 FP8D*:r4.!~4˝#2s C L[p[In~qjQd*k2* dGz_Lc=Hz:Q] .z_-$}Umg;Ƅ7e j%ªٿ%2oxPdL&# .*G$MF`ђoffab$glxr ]1o,>)[ţUMwMf{q e <mAJ9ʇw -켄 L\M[1IJ 7o0w '6fM''\z,wWc +) xSs\(w]-`M\*RϽiJWq% `QSy%Yp:v)5?0lJ}5'0&XQ׌V"o[\1rs鄸8kUqR^>ߜHc;>mbK1O|Ǯ˞%5 \lfj] ]>PBBX x;v&q|c7uذ-ׇ%q|Z3i`=8A\|_f]݂1Jqm↷# r kG: CxSK3DbݓXAk2htcJ_K;Q~g3>B^ g&}W#USNNSAcPk<Ho7`5RN!~>Vr{ E`Þ$]v3fr>_Y*Ȳe-[k Waaaі]YAb1SQjمli10&[Fʶ˷~⓬oG̺xacaw/T2e~e3/Ot#v\6aB ?BeӪU.P@0"""[njI"5K,Z_}3J(ļdX(Fny$PSHw;#3{5q~)+ii15- N}/(8PF$VDC}~姫3'+JUD$癯 lBr a*L{|Zރ*ZX|8~u#ṃ[PX-#B+VwSA(m2sΞݴUp~n_kIMAAhDwӊ-t߾o]0A(ԒXP%QAA(=E_tq}ʥKSx)H8-:u*  2oI4Eƃ9PTbbRh["0 Fg=ǧ䙹J&lGZѲhu|a/Oׁ.p"F$  XAbٴ$}qq#a?enlGZFLܡr.>K\[=OܰLBnELEmIAAR ВGv CĿnGM3Bڵ߆r٘t /oy' CBrx,N:ְk}Mjw 7F.|̓}18ro|lOשE@Ftkz|SӺ~u{zΥdk=^:v$s{|Ш7SAy,4on߽f}Ţ"b q]#r ?<ƺ9^̘OXcc /g[:͎1|fHf\.`V[VD-  B+ 1rQ>>ÄgPҁ ۑ .55dtwqGoJ%C=؝:  {=HIGקvei 꿼0QQi<<ucL0.j! w_ ֔k3*=˗Uѭ:Գ;q?sX4[wJBDAA)H)s0cI Qr'=PO0̠WIIJV$3%Ru5Ȋu8&ή{m@^YKET4t/`I #6t N@Q/rd+ 1(IDX|h]qH_*INCV f\._,%QAA(oE oʔ9MTrvEL|vEs8Y jsuGqGF%뎣חyzs7S^?J8}!.E\,_AAA( YIMMϋ$m%=?ާ(-0vܒQIIIIh4-AARX, zB$Q(p̵  M'3sL؎e=Loѡ`&wIAAAPm~2qfm.q_l փ?q\E*FAAtDSf~=z9QHM5gi&N-[3R!ծD ~-Wm9˾㊮%|ݰ 'fëYVw A8?>[.Z"/>f4 [,^Z-gdt~)Oi_wS[jիr%l.$I  "cUVgχp5hY$ZccX|*O & Kc` )5 ﷸ7z_õeyw,nMu ?hay o^ք3|a~M yy3ÿ}^#,y3m]rsz/~cWkOHnQBɸx1g2FSZE*Z=:# pSd4bb8x =z(TDk5RTأ||ʇ {QϠC&oǦ_pq<㣓p 3nt۬?? cFhwkcL0.j !bŸ/x u3Vxh% =0>O*#r5<kMv]%5pMQ\IjZ UV]۶T*Uz+\FKHJ*JBEf񾠮(JKE_d2!+J̗dAAJ,hZBbBNRZ3E[3 1(IDX@ђAN6>Hʼ_Q낏C홒^5rRZÈ;+YŊť ֻr擃ڷ+߉gu>ؙ xhM,#񸹹yRb"V-[hX,wtϔz_J>Qس{7*A  b"[Z ;-~' ےho&gKzye>RR;"s&L{@x)qRj4΁z4c{_L7 Jï狼E-I~x}ɖ2*͖Dʢ7d-L>1=%-,ef`XYDJNj`2Ž  LE_mfڸi-bȐ!8u*f גXhߛM3m9$  B+yjCkJhI*nIt27M4`0cN]AVCxAAݞgyjNpafNNN4k֌y8xMlI4e&OڵRjCQO47G7X,$'1i [)7?#:-ZW c{utSѠ( PPy<Ԝ~W8$Iw_sFI8mDfJaB0,lv jM-Q5V+q=f ;o租~B7$w4`LK#-͈NPMG_-}qFfjR|V  p9sSF}U`#TҖĵkY&8GR%8m>LjGlYhǏo=>{&MjԖ6o_Kb)̭hA@JrrtV&csF h0 I*j5FTHj5jIB%I% IRkh *}cJBRPIRRw2C~[Q^elEei֌i2"d~WQPdY( &3g₃NW AAV&GGgP[9iۖud2s+ڮTʖĔ:DRzM3}wkӪ/ǘgy8z*;2 xx3%<=jU_ ۧݣQșR9}EW6O\T[߿O $3;"gToL|\N*Hne)uƒQ@D-@P*ݛ-J6>rEA ^'1swӴFb-b65ݨ"cᅮRVY㫝p@h1GXt.8ۥٌK\L4aw&u@u:fMW]ɭu|EǙ0gzQɌlyhcޔ9cB1%q9\Ҵ4myK[Aa~*&d#sPĢ$53i/w/ m[9ЁPߜGdGKΆ+8ӺthLG膫&k7wYpv11cÝ5쌳ڌ%99XҴHٔ@ xL\>y%q %b;&{3w(։fc{}M3~i;SLo˖{.ϯ)E_?s#95_u=Ħ4hzC1\hb1& ZQ9G#U1GYT3IRw1vO@ (FFAFAɠym'mQ$ګppH%4RƄ6ɋr2IOl|>sR bYkք3pi y63 |҉.zl޿G`ٓigר_؉JNx;_Vn3uǰxz./#.<|˟=״RXxMM&B8:9(kN;(ى+@ C ~-yf/L8e$͢}j{%Ok-=niJWXڒCP3tNRصPhUphci=Zzg9Snof3ITGdٙ>> GkF \܀%-m8 G:}{@FNQض_/n+5`@8,+SqTMܸ͘1 /Q mD,Gpz$%%2$ux{!%\PTfQ&z{]¥x}E]  =BO6ٌ@ (HOy]$X$IIŰ_~hǘ17 n^Qlh),ǠOFed6YדGePҽI DD?n@. OO^_QWB!A^IhT,XЍ jM DER31SzR="_x3{Io C6ŅX*VK!tTtچSuV=S"=A~m ]4CdܹƮdk gLf.m^_u C62ȡ HJ5%xD/sg9_hI )6ymo&،_ҧq]5iB&0h"k!p6a4R)eY.YzFGoZ{j2_ UQ*NY7S׾О]uE}=z,r`3Ɲ]?x%UOnC^S@P <B WAĝ\}Ѐn,av0Ac{wS[3UpkΊ+h5ye&<%?%o[`!lFxk/YIHr5̭\ 84|L]gP<òu2#|?F5N8G]Q2a Ɗ*M=F}{+*R]eɣ|鈜rqlO/1/EzT<.ϯnAug.s'V5TӔ  ]mhVrNձV{ Ga7t!J%rLbQc$cJ֩Ce3ydl@1wOJ,?e!] FPq̚U%q;Wb4.49G#-g 's9\A0s"ӝ㽱˸ĘMPin#oV/Lf3l_Mfŵ!sWB=dQPRe}?R9$)9ʕ=34c9_Z̡}qMtdITsW jU,V1>䱋S+ ]LrrrXdGˆ0 D,B >J'1/x]8j2b֭Fex&=={F0bQ_է*5NT [֕~ManQ$rjb;J_w?GW{mek`>̢XU54~z*=EeTysM[U5pӱ9//NmK0;*9=Q5;T!OWwr)дXy/~ZItS_/jZhe֗vn6\醤dK305:\6s#O0cGJc2<"klNS^IHI]wI?<{ë:b~ @) y 讳g 1+2~\WR^ \%ێ3~-F'q:G3oo)yc~{7LLƗ[a3lK?q$287GG˓ӷO9v|}E1}q.;C&.-ǹɀ1 *Ы{(?"XQNAFQT8"!S/,sTNTi g8q-[j5Gem\ |6Og8}%xJW`S,Ӏbs\ ǀ4oP G)4 _O{ .3ԡKJ΄峨dz{FeOAt!JvLbfL;84JX(^^0oDʷs7 rY,ϳw5F ~_>m#` g1|ǖs׹tSʳ.|qm>,>Gyv<rhAEGHmM.1qR4oֆ֗ᕹOx5xݩBDW!dIEK2w_~ ;JԮ]arC]ỉl1l[J#:y3]?̝=};읿;m&0#)??XΤSf !Q6c6=E߅kcL=婠 W9Cـoc<_Y~./MK_ƙX ]Z:1d |#]K~!ܐlfYAIaL^VNA p=#L2wnbV>Ɋ\5sF_m!Wj?n8Μ1]W"g{owFm,c%D.m v?Ir J/IwSb(IuFvMC-L$n}+4ؕ]b!"L4FO66}ypw 6~t @PxF޽{ K"I/ I=:n\n;Ս*4fζ u;w> {wדQ;.X9"0{fG٪) 8Uq&[gsOr1V+mּ~KwnzZ+1ڨ'(uFN|c?ϟJ )^8[IGS%[3=ʑC[yUoJ|ubb/16<Ѳ%OlII&Pywc}؞Oc8L#orgi$Il %fƈA  ֻ&$IO sfWQ\-UJwcOFH͑OAB;ώwDW5*;7jNS" 弖vğg5<G5Z Lҡ5ucPZiܲ)ng6QnJ ގʎj4b0?2.O4-90%򠶇qҟ#h9.jTi\ڻSFql%=dobaO\ciLʩ*}<÷#GfutE4ÜcPQn /)5zsJ$)Y`]y"meJ׶ؕyZ7&c8,9X:L\ԈdYB%Ir&Ǹ4_Y9˺pTTIOS#5tvNxj)qՎd(K+ٻhȔVJ2?/cіc\6(F0+3guXK]8l;O]?OE1jVLy3u;1qy$~a,XֿQOr_|޷jOF+vR:!cuU~lKJGsFq#ӱ]Z~6lau `CP}>[ Wʴ !M ;Ǚ+ӛ,\rq$.^;ɨX+*^S&ς4 WO`d]8:ə$?Wmu[mz:ԅ@ (u;ObZ>hm"ţ,sE}%X~Ih5dkOQ&0 *L,=W}+em0w.ʱ\5?D}\ΐY;ɣ/5a̙;j dNdY6(ν`3;PRy |4bMQN x^}D6=$c5/3]KZK:1dX8Z /5$df;e 2IҪ3|qUoYI$sjU;cbBË,Ytڭ>ԉaݺH("p ڽ.ز70'p tƵ:=xeJy Q{cof9|jfC+cβ}Yt6^>@Sӊ=gqh3-L5.ؙq|a"i'lXx;=>{%?$Rm`}3sG+=y>nV& ϩT*vhޜ07n2fYF唆l8׬E_M=3M[n2v:["!!jbooJ@]dzR_XGNCUE]Y@ǧ'33s__6K]/|2Ȯ ;<@ F$>jή]EL,k#g잺 yH ˎD)eoJ !UhQ!tk'c1&ա {yYԍIyNY^XM;ri?Snyx<#ϒD. y2`[T;]QoU2xls1XZ?9K%Nr!tT*QSw찘STŏBOmG94fdLv^̑Uqln+NGL\#|*ӕ(y ز`1xŔ۽/ %Za8ʠ򙵮Js}Qё_QT,y6X%>[RV>yaI!<MDI覺{mރD] tTtچSt!J“(`b%&+:]z}ʲJ,[^BCT)S+zQWy tTtچSu!&J>Z:“X Wӡ>=n[6X}"99Gjת;#IH(b_=zL8:-zf3[{=@LL js|)Dth?nV/B9Ȩ'?f&Di%11SzK^^ԕБЭ؋؋?=Akp9\]]P3-DԎĦQL d-`9q @ ($''S\yp/.J'* ϗ_8kx 7LNofNeg0{P$>`5dU5pӱ9//NmK0YJ>$.}2VLH+9OSA->b߬Í qD|5ɋp1ZFVfײꍪrK1$$!n'3 '$S؋؋؋؋gLpp0A|\,ބ\jUʬͥÓ=ir',~Oט{2--/osT֟Nt ‡~E];l9=; {0`8> ~{+C~Iy,<\D@Q>:Z8ؔ9V}M'SA6aNy v5P_wG{o$piʖ-KeX @ N9C pOs01$'Qd Xl;mZ%U IwH4ҸR>E%*+Z{wh3dƆƓڞk|yi=phfb:ukҬ,33kHymERQl"V @ e˖Ewڰ0>c._T'29QSMv)Vnf\s ͳ Omcý| j#O4IEck^R^Z*uȢnQ 8v #^Gm|æl':99P @ gggꫯr]ݼ{啯'aQyoݪ1h]zךEm\12.]]a;1Fa#8LC2Fx`Ppsq Ա@ @P%'3ctӓ3gC5oԊ5\r6tYW72EUio*.&"$/Z6J&LNcAe'iS2UjF/L EH @ % ,r L&3իWgΜ  ׳jJdVzZef/LR$ eu^iBy9Jb׮7(YeEQPdsƱX*_.[7ݻrL&]N֭EB`` ...@ iL&BCCVZavD$^;*Ur+ФIcv%>|*UKX<$x/x 2̀Z Y Z#_3}doڶhFVxOkƚȴ*lDdh a۸!OOư*$ۤ>6i֬/t͚I9o˟4ON}6iֆ^#Zr0^de&:fChڬ5݆糍2MR^4:#=z6V!lւ'g-~]\˭L'ק^vUx8;/v7:qnӉ{`J 踰?^Lϔf-_H@_R:C7$e}{87Yt8DfWY o8I z???bȀ8qo Mu:͑J֐tJ(-/BCC ?5kNOַ+Ly0ZNp5ywD7|F_ e[6aτ%v+Oq{Ğ,$x30i0^įWз|.عFYO2]sѼ2[:l._yKE1e[hH*fwydbSOؾ:*OfӶDsm Qgc mq[onQO}NдgK{od!db^9ggJ6g\@nqdbrGtR;?_e?+FƴʹkI~N,]yxF%L\I/ص6D??ff[Ȭg@`NNN : Tu@bb͚6CGRaooXCx G4sqm}ӊ78p ywNp}mxW?c|I}i:涹gWB5\($^O| tn/\Z+ŹcEkڕZp<>v嫼% ';, {#.o-x?eg|xj$P;Q&zb q Ao`7.}Qq76_Oo0oC*<&;-&2y>IX?c+N/ϠJ2sN׶xĝ&!{vNFG}z_Sg),~<ӥ@ohawT?"BQSNbqqԫ[ڵk@R6࿉mMғhϣز%׺C6\Ҧ06ߛNcԩt3Sf$'钬KsQԦ,Y+56@:pH΁t+ğ'#1̝}xG&*I?69-Dt=|Xr-)g4l(pN;e>/Q> hpKr`al>-ݭ'nWqAhZ*빔{MD]Fs?^%y鲣-oPX:70o&f%`4LҥKs52*[ZNKTpb\ ]Lڃzm܈B>?Һf9|KSz*vS44>ynKCwиץ%-[n톰!Z4kچՏS!姼% 29Mu-^<^ٙe=t Ktu{2'~GO*Z up$4N-l%*<6; LR gɺUO;GjO[~[(hXM  [YчgzHCrJ-<~_Oi~ %1&1 Wӡ>=n[elsewSsn<2' IDAT3 It AGbϰvz vӏcRzuYb9QQQO+K]s}yU9$rGgS-5>8h)6{ oL)ɥ+^RsM7T@z/Aɍz+.6*5sf,sLbʵ+l2_oJ7SF~[Ұ~ȢOѥ/3}tY'd*yҗ.۝տa&v[oGv3qݿGg}>:L0hTRDjԨ>3՟ovQ{ԡs|w("%[Nw']˱bW*βDtj2{]ƴY:@ዃ0jS5MO-"إ+R~'3և&|79)ڳ>3A;ǺğE'Ѯ]g[sّūƳC[S[2)F;*.N&e}Q8ݑ/J'Q&Lv[͑^p7蚷y(tbp.ԏfNK|W^G*VObQpmヽiNNN ,HаaCt_Pu:hD䞟4?3'OsٌME۹s0Ir >[O誸Hƛ՞'bi|>vփB/FToER=}b'ƭ DS'w'P;NlO9H{+N4pN58{_ͺWy~hFt{3f,^MiئCyib@Īnw}z_g)HӎSB9~ʏ8< 1@`;~+2J_/2xzz}mgSL|z!2(jms1sa~zU*X9oFL y{;.SbFxI*jbtM=ӝ5 ^s*쵍{f=חK +Ұ 4*Ǟ`+hT2UV2/'Y5\J0_=n͘a1=xAe.P wR РAbII4nԈ列T5̚MznF' \=jи'{N4U~pG{ y\yKsܟi=myvkx/v޴L՜OyQ?٬?՘ /S,֟Uڏ:DiFӖxCZ\!LHsחh_oo\uoyllݦ4LwvUx8;/vT(<N&p6#gz^8#Čg;ѼISZv{]i?|m ۷osYn߹Cll,::-I#))ؘܾk׸qtfhH.6 Uֻ ?7r3uhxpyCFS ͽ금{0BVg?/v\C3a4+d>DLtS0t~;0a sWܣ|؇f%}c;f*?Ht ㆰ,k_; z(êGqi\O\YM5j_T!M(:STQѼx"D2fYFeEADzBJ~,[ooow dڵn݊Xz=!!!bbpAD)^χ?An;/L ī<@¡lMH0ڱJ7MmƯ0tڊd $qwxk{?E1d IBT9it͘\$1MmؔNC2k.EE I r%N Hμ:#Ex{##'$~ &nZxqAAؑ@ /#ffv ̭iZ0>.ʱ\5=%gCz˺ iH%Bim>HD MlcdSqRŽRmx'VmHȻ}p4Gr9&eWK^}%swrU'c8̲Gq=@7q(ɷ95^ĄwbLD/ኝ!_N˪2-[?sBõyUy=k"h6.Ę]Y EgŁ`O,۝~) S~[! @ Jg0UT6MRrZ#ؕĄ^_1}4g,_έI[{44V}v|ٟpUTybӶO)R̡[yguO;RVEu9z.])o3TbUT>$˰ 7]l z4F8֦i҉bRfPu52`SI9ҵKLٔ}:߭Qzg+JObyBS A E- bۻ$eXaf7k1~1QVg7-˲4,(@ j[Xiģ_|^oXkoߦ5CyMJ# TuMv+Kr%_+࿉ǡhжY9u-@P,z%zenjj$8`SwS1o@ bcwSmj⚽{58;7z5F@eh~}MI4$q6NVF^ZR'2A4<wDDԑeѯ+TNgo i]w ⲧ̕cs>!waP4j?iD噺~WϗW9)6k7b2ZiW.=|e7u(mW?!9o<{'XQ?M)Ss;VfU\R"C 8$ɶMGHD¤L ;7jv{i(qǘ:jWq,Wy#iF̷ٚ e݅EɃ7>_rq/2чޥϘ_Ka];Ŷ1{Fc37z nϯHHWĬo޶luw柡1T6y{gJn-Mn$T)ag7 w2ԃ ã-ߝK rOWjox7nv-܊%YQNp_.TbCoZ ~,f-#n*<C oMyb>Um>ƨ3Bzxj ws/P=>i}ixo| beݴ);c 3 V3[<{_D߼_1_m<$Th5n1K:^&΂b/OVuAHOZ`G@+}5u'!aOYZY"[\u=Z;juTjuֺ^u .Uu#Y 9͹%{ǻ7Ry[rsBs"$ jMt~ZY(Ү NU?F,HS+z jh A\"ڒs77=,%mJz_]®f!6Lz!ێ^~HRV f-񥉌? c@7-9ZOZ8dȪ#r04v$}~?a&~U5X&qd%D cpsjU}qmSje(ZW/Ktie]ל;z!w$cm|zi~pA!£4t0e٢EfRm,O_'3.6DɱHP|@6c JwŶph5_SJ' MG4(K>v<޴7֪);APVz繮r-ksY f^sp) IH )fC%œ #[*IaW)lڶmϜ$#ի`*atXUaY=,rkX{3iĊ.cޒ}r6*iJe Kfh-e3nU3;md@j0e]Ԑ[cPX.nOYy7,j2IFs|ݑ:_RuAI5"DA99Mح Swq+ؙ)>k<}-?&v7;/ RW%mIE51 EMk#'ܱcGE(wݴBJXw;ŪyUW(y^ܻ{Z͒ = kXME Mk~P,MOSصz^  BI'5o3&Q꽹;쌫5[cHq=YǗRWWÔc!K&jސnθyԠg901m>^'\^=\;p D$_5to5]AT?AKi~UJ>Kљ'!9MQx- $^| @nZf]~@eoF_`D^υA_ԵCCԅt8w70=fuoOUz1RnhbxJHvSU0,ǧѰn]yuiOZbnlcg_Ӷp;*3c7P ^ڝn*E*p >?1)*y &|Ԗ&<߰]?OQjSYϺu_>|1_%yy3uY4h!}GIi%v5UIl$wLkxy᭽hk8 .FkN}szR'pD}קVqEo)[ f 7իIz-+[LVYuDɐ?7෿tcg]Jgnm<ăw A@kqbЧ.2N"ꈳ,ڒq؀MykjvkMerUpSʠ523zvg }ɛѽ Fei2r+[yWC<7 eisKځK65Q^ODecF,鋗9sd)=5Մ#icaZ:-\<_f e}g48r2% Ӌ29-Ԅ̟xP IDATpaE[Dlڿ/s? b#I:7sdmO[5V& oS^ȶ Rq!#>%T>\>T}$ȑln]eݑ=7Y+.?nk|ź%QL}hdh?f'y\M;*'RƇtcR,N`zXlAsSVl1 b~~\166g9?lU ")襌o_K R|>`ya}0^bGWSDngk:T4/;{B]yc\ nHxADnGN-7NEK 0^UѩԨ=Аi5_#V#z lh/ f7"v^EGFJT &kA̓9{Wu~:Q$vtQ'<%3L_50sXX]}R^.Q +hX=&wX΋#8T`68)Ȍ+nZWJ^9G}Cr?xƓچ?g%N]% LUAjE ӨwL~)[L#n@u%9[}oԑ79fOfvYn4SOm$\p'Gߟ>DZޮ"h;k$iޯ3XxP$n5JXԴ\>xZhX|in cd0.zfź L Yȗ|4uha;Aϖ hlY75ZC݀ѧlqI &QbQ?zM؈F Rñ\{5n1ʏPnj腽(#Ms1q67Lb|N|nآ٦ufʌ'Lɩ3aDV|H0,ۂ3Wϳ\W(˂ 3ŖaVK3{<3֧l# Ѫ_kԒ6Gj䀑6}Lݑ6زOq~xH1,!MqOHT8bb_]Ҷs܏sǯs_ rZO`ay2shjqx^TP17?iӥO;?zp˗Nw8`]76ʥ>|~c %yV_[.'Y6 )C%y #hywI9DZWѯ_XX;b^j %iĠ*/Y9 T!gY=<]+XjP*HJJ}($<ɲ585y񍇉,2;…v%z fMd2hrnFYQc)y7MCW~ɊHԠ =YgǡD+!MJOe{^3cYU2 rjtKs^IY4܍I%'S9ȬékAjR?FvhYUM r);G~uopkГ{`,E O}ˆ[zhJftC1A؟MDHݮ-0}/ت%Rc[2aOV|FAhT<ѽ5:M E_~7)H؂/xwV[0ߊ?̧Vŕ MW[&TX"OӫR~pdm kױnNNŏϻxGHj2kzq <(\?6)޸~ 25+i\)t_ hFN?ݫ7yz݊sK6{[1h /[yZvgq)7Mbqh뜗Ef]e} O|ذ fmd(hl]~7 gSx 6k2?k=F%/KmY>Ot2h^py4&1KKTag9<-iVgK)qeHh~Ǟػo;+Do:SVOiQWVRDL}kId Zޭrkw\%*'~J\F#1@. hD}[ ~Œ/z1~)gv7gnxg_{c%6Ų-WI՜g5PZ9TK&crf Mv4}'e.ԯV=$ h;o( xc4OvcK[ ;v41ők[tքN{n,>q +[eפR)"" ˫ QQQ$%%q}x*V*]+)Vͫ}Uk3:3YaF(,y^ݻ{Z^ȩ~y~w|wn }1=e`*]дY®  H^xM6V &&@&ޡ,]K"p|gA)nͫB$皏!RC4UVѧR++,8#/g,gìf6lȍCڃɫ!hb~"WNEY_c27uN*0Y+ʅ>:&[t_Ld:lU/î2ܕmTfm?ug!)݀~ KBn+H!J,Ns4.VͫB$t$ K₠W- &ζT bίphƮyi#?b#}3<7O&1kp8NU=[?enS/Ր_-N/Q nab di|8Hly%W}Y#H~7Y+.?nk_ppH[ysn7t.^A]MAAM `Lb~Є_`M;FMI {/FnD́ "}_ˍũLZ1z]ZQFTQw1&Df! i[Oͩ9֝b)ճ +\ 2c1eж"E>( ߎ"}CoTtsŃS]eYǗRWWÔc!(#|_L߹MmAʜNVoo/#5G':&`0ZwZ'S"uZaڙHK(8W g'\J`s}S%?e[{WJWodgdz";Tale-섋K5>7] |UG s~Q]܊7vftC<*-!a;'3]V (nG^K Ka9dK]z 9-b^9ϪOY>f!wt-3|Gwg :Tv;Q͎; 5q@w}3+HnGf(v{]lՊXIbRq v /W0F? Lp?@\<2^XԂ3XhJp{9_es٢*/ $Gϩ aʒian; VEx!Fv1sD*nŞR?|zuVxJ.RxV=/7Ա݌M7x;ZsQ([4e0Ƹa\,N inȭqm؉, ߾ QxfB*Oc`Kn8Ch5{& aDA?Z-,_8J6?.SϩQ{6?š!K7k.^%HџFnZAbD}طƻ-M\N*Th2s229tf~lÆNpWZsN|M+8R:}71tD*X(?y,U;R`kOʙڸc닁#׬oyQDsAߢʀ崫S^U40rۆ7)_/dыIܪ ٬44ㇲA,BEP^ B΅g[U5X&qdI%ٲ3ͩ٣7VwWWpVIO9(1(#NM"b9:ݪvlc]dXC8~3T  h(f|ыN1>+ܽ9s;2<ȵ^2y~<'M ,,]y1#M. j~Lڬ9WE׫w7ObQpۣQ^aӘ|vX7ꑘy2g*._cxl `O@fӒo֡ ;>wC5yWeu2ۺ /˘yO5q0|A wݵLww=+2a)-һJyF)oHM'C2>df|GOʥ2,8LX\b1ɷ+E(56+`%`ܾ6֛n$nZ΍، JwŶph5_SJƓ<BFssQ* A))(ҥ7M?S?|DУl4fnfiR1# SM]7O~FM5L"(3awasm7q BIW$F&H]N ӃRagy@//e 3ƕ=gtS<),oON$7ͫVJtZ@T6~J ?Qv=b޼޺w3A&GU%Q'DgUd Ovto` B~w7-B1W&x!.=Gl;ꆟP.ǁ)CNl՜RKL(]3U*T&}e蹲orPu_"PHH?҃o&Uf3+OR©}PA>y: $HKm`Mnm̳KځK65Q^丮iv}S섋SiJW1oJw-R+nkqƧ| ME(  Cu)H-X+<c=eZH&Hv "HVTD  {F&ajjʹsHHx$eW^ Ut&k+> [y_`ܕɄitM܁:}eBe5f\#=c]2[.JĜi m8g `R ,nk9j! ń*p }\g恕6++H|=>#{Q-o+ҥm朝J͐Ƀz&;Bh4KuDK*bfjFDD!Y}ۈD&&&zo7£_E/o8lޮp o_7] wo|>1ϼLjZGe-<}$7kTAyodѵ1U@C̍,~3 E+jjgN)D{)n//׵}ىK‡G.$`g]1k@ᗶt.N8Ri7`4#:DANy4%x~`;UQWB7tWJ,CbY7s~O+70C7L?LɡlQzqm-!Φkkfzq!o>OEɋط"^?Ž=g iWoX^lژ99-4nmNz?i&C!sOVuȹY$LVÙ8quv y/dIF%; H1suL}$1O B@f$C*Mi$Jӯ26(*:DD "&gV3F}Y =s#ʉ~*c%d!Xaˆ^?,%"![dU([)yzxa߂/"J] NRGw\2>ӛ~] sުk:Ɵ) [ٚE+ o8ݩVBZY:z)Ү NU?Fղs5p%FIh5 EO=;_jzRs5$}5m ljD)Y9@FseE>>dwרIsV(o8*_p)>hnz*ywH㲘gnU;^[Î1l r15WvdXC8~3gU&ZbM Q F& їEOtv 7$5z|z_гe|6CAIiwe֍jr Ǹ*/[oX;XcT-d0*@LĔ2wյ(?Fi@fyt.i]:CpFlǓr.,WBp֣nVmYquW$^Hs5fR(^v|֌&0|`Fu-BI]fdWm;şC|$Z(5hcoz\s`Xgdgׯ|Q֗vg-ܭ2fx*rYpgė:RMR<T 5vXZeVԇo rVxZ.ǡV'3MLEx Ep^򥓬Φo$XWSTyV_[.'Y6 )P%H5JY@y6Gv*.sDKb*Bta$(Ѧ'\k\CUZC/pq ۇyd-B/1ko{|8IVXG\"4WwRho\1~KMiެn"&hȬkM0{.f=Kr:^:KpkГ{`,Ex E?+‘][`/^UKƸe=29R*-:!7ݣHX窇 > %킱dϭ 挛G Z63ig_vKEWg\]=ӢSŞгߣUݜqqnہu"80+qU-{3ѕ Q'c}iN5gF{@3(>C cqh뜗CCĕM#m΢ٓz NԊ%_="U&Wô_x}7\:^r9~*gߨoh}g)UpSDZ9ՠT)Q*S*%![Vw+WI0.DJzרH '3< P)Ia$j0Ch>o:W2)7~ØCHc?!Kr Z˓k\|t"|uuZ]oU)%'^6lகqm.GfU)㴧X2V66Mg$J z]uzKB[&v1:ź9[\j6/ tL6e^.M Cp͘fc7/㩖j~8?=%4,1`[ ,IxE~w^1NrRnFghZ5pw]s<7r,َ D3J,=fReM=tI /+զlO ie3h`fkqӬ;P"U2qqX?1x̒i=p6jבCqೲ]*\n!FӺQfM>0k֝yt +ϱYzf^.Xtv7 M_&,gs v;Сeٴ(A OF$ab,;/!j+*wsP$e4QY7eE8xk~=O?o_N1||lT*CDG0tpj454MJˡF\Ԅv֖:Ѥ7'''a^^M"))ƳgϨPRa[wNo^wB>ݽw~J|w~FMM-}SXw蚏M5/jB>/_>5TѣbnfPL<1$)nB9gϞ\97 R"<vrWw~C3v|̣L+$]|6:*CJYk}%T>\>$6Lz!ێ^~HRt/88r$ۭ9r7bsA R_Hh>io3ѷٮ¾k880MJ2M' lσk=MHã2q@]_V uz%6J GR`ˡ~uw1<%!yFqz$v{ P MߴcԞT0bFN@"Nkf.+ 3O]eZT+GΓ2nQǺ5;Rv^u6QψQ$4: IFm8KpқiXg^T2!3BN`hγZ)FOUKkשyoV$ ń̜Ӧrͻ2vfZ3E:"F.ǗmVČCz2?sHԊ*V %U$!*T׻u$>"XNK;,qI'6W+!96I퀡mE,i*DS3rs S&1} {˒cq)M=p/{97ugĩS!ZbEU Ps}0$  Bz 1$4а~d6Yd/3s\Iw7,dֵb'^dΰf?5P6뤵HPצ ;K%bvd#:ԧ2t}٧Qe`憅u-]a@# GB=Y!>4]WAAOw7;b^j#iĠ*/Y9 T!gY=<]j(\xnWbD&6)Vaԟe5>H9ɲ586%|o8p4qQ$ҭ6ІSdv܉KI#Ӫ mZnԔoMpQ}$  B*)0۫jfau߲N3JeitaPTQ}Ջ.+n TͿ BI}x љӑs=O=?8;>=rlGq{M^LJR |0D89 ȬH)#.j?7cёuN}qť"}@,Cŗo5͍5䍝xr5Ǘ9s}^n>A( DAx;FLdUm'SB$ӌrmXK_?gdH<χ#qJZ{c öX1l_Nu&i(>~ Sve^P~mmdh*hAо8WhRn_Y6@u7:i\/o\tT4ʭ*⬻ɲ׈$~E?䟭rnN ,ga\押vus6^cK(6;#uv'3wRkx UI϶k ̺v,%m8xw.?!3me.^ɵCs==ED61̓i;e~%%>l2uz5ngї6FfOdֲŸD[:axo~?ݪVͣ\y܎Kʣu]da=i1p!GCGHmMc.8T_)u\SdQ7T7M<{j{J M3;Vr#ZT::9ۥ̮SZ7=Jїu>KE'\JcZ@,אJ%q-EISfIH 0-5(q-UV#6z/+UJtQMEAē0Õ3;v2CEl\'S_,'诰$JJQ- 8d7\M?wo3T : _ &c ҦOʾCD:(,Aܾns3*1@“݌+snOn` z/A^ϋ!9Y O.K''HLO4(؆[z9I".3^^A/WKyL]0׾Z|u\1{X)];~ÿy,Z hZ0\IqkR=er:u3pb笎Ύ^29 >|Ӭf q7fڽ"V;m׃QgXr (k.CfV.c=XȌ0$n8Zʕs&13JdU$Hد`Lj*:Ƶgqh+'%g(Nz~p@ukQ!Cɽj ;3ftğǎsqZHmV e_B h{'Ƽg(Ü/u? .>T8o^9D+4)tݱؾiQ≏OzT 3oId :޽rk7l;: ~Gk5h% v)H+b܋gxM3*(^I0+I^>QZc`gg~ŋkW:yD6[xh ڰ|a4;Fڣ,5 ařr̤&Wʱ!@v}n\Cb`Q|?uJJB|``++ %oųd넫m,n˹kYʟѓ(%"@Ffo"t0ޝ"7{jRuhX!(HLۋ&~`Oi0=Ȋ+W3n +q;35aTg8xX5"6nnn_ҸQX$ޠܝq)A5f[<2 1>j \ M@g^K]wg\JVH}hYȟ  ̜:'pNMn4;3*.\Ȃ 䆼``G9i1'ތXs=,)6M7pi3;lf ua.deϕg8#2+BoFϲXd?}  qe( > >OAAA(rԓ~QA[ HI_"V  P艞DAAA!I 7Y$dc'y7 [yIqq A>^9:8__(ѽL۝8td^?g*k g~m2aē9̙kr;&!BE_bdzz.p)UiqhO_C*tƵ'^|eTh@} RRUh5bԴ+ZT)E7=O=dfR֥hՏ4u;+ ZwVx0M] w1hO$4AKyO`ssd#a~_r枬;n1t4G5sP?9ȦT\fݥԍ)S1EwǕ6>ܒ\ޓ3 fHo-Axk9z+bv L0HJ;g۵ܽR6?뤃~-@yxK7K>!+胣<û0;q&Υ̫ Ov3re6}yA^'5&ua_<Y Y|Çgns2\B'} 6dץƺqyg 6[G`0W t6 ?.(|'<lYT_#CZIYGlq6/RR#ZU)F1̞Ox6LڎIit)&m϶ه]ȈeK@fBj9.'C1;Ekf+De1K3쨫L %rK<вy Vz8ûY,/2 "$r;* jtFC̬ Iٸp1+RYx&-i&=oQy6uJAx+E41xBGMd(}mvo&upOʮ(igX:Ò36NDYs2ẗ́ĂDf!tV !ǾGsokAɛ*A6T5ɬiu_T{V5ǘ)#,>uFOF~/THM5ӥ$RɕCZc`gg~ŋkWtb-%VbJ1[MqbŕIJ&&ErOCO0ac>Sa9QntfQf|b}\ Tјm]+;q%$ɠʽi:9SS*mIqvJn[X_'43dv՘גmP_ ;Àϯ^&oHR Đ`}ɍjZ&71,YRӲt%kMp^XXWa?ikQD,i19OoP J T%]'f=J1yR(nfYKPs=BM$33a`\4ێ 1$f6ԣRe$QX0/À~>0QE:h̆E,ScX‡S|ػ٣JRmcwd,"LYzb*.y怱.DZ`^]4b"1!q GLTj숱&2)evEzM7T8ufs ,W5C=k'7"-Or`:P`߱?< 5w87[,bR=l 7Y ۬TްSr O˫W>[Z-sE;| 75,Gist\ Kdry|eKZs6YWSvx1'UE>cPR(bS!ˌ W 'yZ?/E^e0LO=oL52(󤠬㕟IqkRr Nir / j^}'}\dMG//3e2sAx{r@~;ןuwIn$>ȲnʨWHKffY ܍@֑W߼G֑w8_6ZHgz!<0(CLE.B.pS fiZ]0 Jⅻ0z۽{?wȍcFAA(A=y,Y!/7 79u&N\܇3㏯b|.B!GA@zDAAr8+Nr2TAAĜ4TA AAA=od3Jg%c뛼8Rϲ)Ln=  ~9Vvr;L_rqIG[C)!nP:/o Ĵw-0rf`@3 Z~sW(D=.㕷gK:[OtTsYwQxv˂p6L^fIY{0(4e,^!TcE6azwʘH@G3z~µ(,JPϬ$hڟb^R Z@bUZdZ4UOtmZ[SoOy7sd d+6c%v:ʭ XU3%CоT,3B!ShW61f1g&UQR+[ɓ^`dW;R'dU-s˟ٞ 2/¯1^䀭b-A(~ Sre^nHy|g7'BT7}G[R!u)]0DoA|cM7MmƲY բ=Ɋ`ڦ ):39E૚̞ 'W9v0XN tH L03J(BIIO?C̟?iWڼfIcStVN[7%:xVrohKmk3rKmF]Bw.y<~DdR8qجxU</ 2iW=KU lޫ~qk*%}VZ(ْ^6 źTz_bCEd_0/\٤-hS@t򫚰jF(^G!$rkZӡŇ/zSqzBMdb_K-=Lca~t:tiZ#UA;i^q2.u^T= D%0Ҥ-*^%HtZhSArC}R (S2>Lʕ[BJLilU 1pjDl܀ 1LZquqzl H<Cs3.%=ƌ~GS$ՙ:ׇV\ڂ R1п2p&0x fišzS2N}mÔmXڝ2kcΓ̞2@ϪRl=A6<׳VIRL͈xyl 7mdMl߶;wrbb116A*-qG%zӫTɋԢvVh|^ Ms8k_+ }0j|UW+Dxrm>3W#VqdَkDkӈK/ bۀ:cf<@\'ʹ9 ߚgN3׈0.y[tEc9/wǝQveXjB9x-2N;ZO9)_fĚ 7_N\M4|63źp_L2aJ{xiP)>ݟ6s12uyrti&̆SpiJ׆e Zq7ϳp022< IDAT:\bs J$T*U5v>3O\Ϊ?}?"53 ih06~iť K|jAAM\ňZ=f`{uIE]7i ]=*SU_N;1X(W' ղز-mGtC*&L# ˳cՇaq>uAur(̖v Ϥ8zc%`ܢ*RfW)}ѓI| '9VnQAm 333bWvvviE07GH{͂HGERy2-<\M?\ƀޛxPFs .k+]^RPM;M>>re6|2x]WTV `ΊK3Gx)7abӚV6t>fsAxr$_F\yEg1F-w9t%(؆[z9Iѽ%-;ȅ- sF2sJaoǧ 7,?|iP,U`^obspJ,1,N1' L%5ƭI,!#թĆg^zhe &zP?\ =z&fn.D}Dmc69I)p S%_{S$i:[ԺS=ֿyS+ZN/匴?=vc3|8&N;׽P:-*Uv@'gEAAA-3A|s0m1W!DI(oFdbWcZcԔ7к-^_c|$/̭Ӑ`ސh ڰ|aVUhN߉e.ERveHxLĊ Vl-&?5ԌE47doYx+-9U+N?{Oz3Юmϯ$0J ڗxeb<Òe6KֶNC>Q%ZdITϹsz}3fPJfT"NNMb5Tא``抅n7">jkĊA]gZ9 BýL (PͩV^p<@ := ‡MƎk¸M(MX6k7AZԡ'Y1LtCi>©3Yg Y;h}rcCՁ:J 3r*3A[D&}^iQ≏OzTh.Զ6+t6nDj%DpbQɁYSvbPğAAA>i{a`O)[YaJz-]y%us46*G8xX5"6nnn_ҸQXD'C11~A=wg\Jzu1H,3uL-FZC9W%2H50"ѩl1JOz8{{<2i|-dk+%cD٣*CY̔adع)!~o<_}GNvWsΪ4ι?{iuP/ !F,.B.I>LA+}]}< B5w/aikRTT*A" iH VԼzEJE&MjNHHΝ`KuOV6+8\ˍş˪O8J[^ugUxѹ2^Xo=1$˗{ѹH I(ل.Ѫ-h DrSeTo×#dV3w+M%T_ BL`ҿi\F״+ zIUϣ.0.DU:Ң:~f]_廇u^BuH꺢X&]I#Bֱo,D2n)#ii''P95,86# X~*hW֥ԫCgC۷ TRɯkbB9'OdIW rtݢ4 .SG!nr~_[s}.E('ųE]d*-eXIyM!:|:eǪϥ[kۂ~;Q,"3I[`ќ\V!ӝe-V^E5sw9k1 t`xA2-gEjMJcy…3ǗM i(/ir~~75;EAL>;f&ܓ_R7T5{loA%e]F}7]SrvFD-})~3cBjHrK*:R̔.in/ rt DA} lUK;ݥ  Se6 j'>m^+9 3hFfR,kbR=۟;l>RBM´,nӝ]MERIY%[%"ab'C1;Ekf+DwG9RD ;*{F%rK<вEhxoa3k" B"jk"͹DГN.͒w48 ӺB/*UgƤFE\gg$:-b !G _!r,{֡˱-GUsw0MfM[Ʈ"TX+jHKc̔l:#'mA 1T/8e(q|D\@=]ۥ^XbN.U\9ēoQDe(új׊ɏ^]vڔo A?syKTO8(}p4|~t*Fq 8xɏ-82X0mԄrZXNN$ B~pςo Ֆn`愺XesKL+Yt0cC/~={'>ˬ0rl%nQ*O[-}:K 1Tf9KL)fOFĤj{fs`k!{$zP-ۣ3#?tN!:GBӻCld.4ŵInE*ɗ-?juIOԅNln-ϣRP4w24}ƶ㡤tQl]Ŧ8`?Ց:`$O w(dOyˆ2>hP1=#.~ˠOpz[L͓j &U  LS&GS'\ĆΎ^29 >yޓA*hN89;tVRQ?^̓Qi*/.Tn2W <-@1,R#"q8Vɦ8!ϕGhͫo9DCs1m#+:<]'$D/SmN^Y啗fD-¿n'_? V sI4AEVR%=*2ӣ)Nnt꧜sh;%:.J0ooع;wsfƺG篷IBߏaQ m꣐D@K(vC)yʶp jJ = 9Z0zvj⒎tSC\΋I8g@oP\ȋ.A2\xLكi zA* Eb̼˦X*7A*&ƒjV(keŴi>p͜G)^|y ''ԎRMj2R,ja ,X6S/5ǥzLLUyV3۾C9fRur,8 8*,͸10t5J~'N?/N?qQ!B.I>MA+}]ޢ/MlFadTsYwQxv˂p6LkNnߜA,<Ou6MWXQ(~ޝ2&оь^p- ;' C". *-κgukϺ:XYGUUu XuP d%$ +垻=IX2x.yn'>;1dUkƿYbYn!~)ɌF75n'>ʖsRލč)blx{]eS4Ӎ[{K W˘2h2SRRs'7ĐL`` vvv<|0e[v "=:wu:<K=WG/ y'=W`0jꪗZyaBHhh(իWϘ2Ή FFFK%*kXT(_g*w ofWla_it~;nN#9.Y~SqI6CVIp7 ]ģSr7vLmAbg'$Z% ү*L5̲ 43FXVJF(tM(|I*qق N^?;a  r/4idF0k&s&I62C41܊lC4]{ s\st fYLG]®HC:Ne~/_`] LVIRFӏrZRLY싫Yn c#>tTe>   ?WB_B̼9Ckv!5"|X?6V}kciKVt ! Ξ %Q s9{J- 2G^.pT!$O/gyѪI`dj2Sŝ_AAU*Q!1k bQTl˔. <qpvga)=7ndp״ũ$.6]k:xLlH;Xq;nq qjǴrƾ2b4AbҘӛqsBCj4G4Wܕy fc΃_AAA^W; SYCAC !^%ݴNim&Ay{}-wm{we6DЖG[ϙ}}.*82,ֱ XV:}~?;;RP3K+u~k'Ʈۉh)$oeIgcmMm>ʝy)O.l&/>A Ay&Q:e0ki8J*Z^VN2c*l7.rsMdHܘܝ%%ZݦL\=Ӗi: R\Gye5DyϢȃ} 0\eWJCbWxU)1<9"$r3lugmW?P (o;5f3{ ~ߟi>%M{w<"x/VIIt=WsOkV^L+[3Ҵ-"5 jMA( &lͯmJI匵My%7O9B3}=JiRZ\#"UCP%mY%1eL|*}ZAytQr82Dz1u>n#YU:3E_ k5k};43ulUH詞$f-YM?$OɟSWr&gBñ kVjS>$hG{mO^T)y@FGv|"2fL!=mPQC0бfQ7("_ad 7̄FѸCն6~>om+lb(Vx9g)3V'MMv|ލζUw͗976}JTǍAI&\Yei:N2!FҾ#vv44_YRl[9 Z67ҋ1oFVgoNhe1wIe m)AϦ=wrmBna)f) cǺUn1ӖQRSLKҶ5xYT@ ydU(}νSJ%繓{TtL M[jAA\}5Ckp) HұDn#TP3 GxnMeԐķ6ljwky)(ѵΦ;a ƮOY; y›UFǭ|fW̫o3#'_Y^sF ͗"(єj6ڟoG~:.쌕8 D%*$ZT(_g*i7y3z4Gdt B^N3y\-R~ܩ$L]Ie ]| !z^ceB鳃i+Xg%Xl?tmMYr/'%<4T9p&D}<'jB!tm39;T-V1 3'#}/VA$i_]T KN>GfޘN+mcOdQ[29R*ubEl1ւfv79 {^{gl`^8PTtc͉;?ho׳ډn*2c ]dEsꍋ aM.BA"CD(^-ꙕÍ?y^8Bi7gzqgf#V=3FOϻ-H$2Rȵr3l%O*1"רHti BP)k b눧@jg6wIMi~L ~@iMXMoRK ܰ;s7VAjyy+K: OZ{;~$R$Q#_L hbXQ7hB ~ gN^ I~ FnŨhizƒ4]{ sH˹pvޟ`lVէѭb^ uʚS*rǑ|2Z]Du.R2u|wH}:(SrYD?6AJ4)LZwI̧p¹S^(mYk;6(]W8L|5'wef {r]cGEªcXu6`܊N4$>ٓ$jAy#goTEc^rKB*9cߝI;rZZU<LQqjo vK-P &Y:LX>[/4iﲨ>M `_xA*Q!1g-bQTl˔. <qpvga)=7ndp״ũ$.6]k%,`.F4sƁ=f?uZqjǴrƾ2b4AbҘӛqsBCj4G4WΝrW 0gKg'O;w6![Cuw3pnϖ+AxɌh1{'nnƙL?W|p%ĭł Ihȝs'hb03&AȰ%P+eLJ?FF(tȤ2R 4YF Rq$+m&nJJ w֒ ΎҪuW/7*ޒz׶Wx7|^x{~k1}i#  $44իgL{ ###||cooNj]:qxI   eL Z*   yDM   D'D]uuP,oZ%mn%ƞU_'srvy!7*ޒz׶Wx7|^׼ .'1e 7uG"  {[Sͪ"VZR|%6ugu"PnX}#WL)pskKDAur)6kﲠPj;OfP.JތDKh5ua-*_ͪt,9hSԈ7S?Y6#է[kmm~!h֕_ H-4ɜ;ִ1M}Q,>*Ɨygd,JȭU=x.O[VYB7нQ5nL&xΎ[I:qS9H&-2kIBKy%dJyruG c 6|βolxJ(u+_ej?Oxѷ6[? uFG]{k]3wH/3V'MMv|ލζUw~IM>c}{lmlqƠU$w az;]~c bUV'vuq鲟'j\fgi`Cm}+Ti NɌP׏j&ߪIlʚ9w2f2TB¢)鼂#>I~ןzF2$&M2-%%na!cF,MӖi&epl TY_<w:gwt4^YЩG0[~ą~fZ;xi_4\\'a8wK< uåiKQș1VߏI/}A$;SWrmW|H Khְ4 8#]lQ,pfbSэ ~g~5y5o5F3u,Ls ?>@^YzjOS%9>b_ޟڛ:+aԘnBNR㯲50rT>44E)&>gNXԛ;옳 [MQH7 :4QYOe8 7RXtrV1&:i" U׉{]zSV2 fr ڰS~nQ 7吅Þ"l9ؔ<8HILoLֿybhO3K:CL6_\0XҶR@"7Q[:9+ON :c{󐐋V?t=WsOkV^LmEiRJZ F Tm3_6Y0vV/ d(*1EHz))ڛ찵vۆ0qYsќ)zb$CfX3:9D%AU~Cs<,2J#8[foBD 3jlr>'y(qRSjIгp @M[ZwYȟ Y3[9`oQC ʺP9д8_.y^^r,E(L5fk'3ku <U=ms1\iѺ 3/`MoJ-S}ӛ*r$="rT])W =#R@DI9P?dK:UEX>Q'DW=]T#\>nҏ܈Ղ*3;RT4enHΜI9F8Y³a :>@<҄M<Ϝ!_~eaW>9qSo?m~ܠ*8a*ác̢nQ{9d 7̄FѸC O#x5dvf9$[C FndD$? Ai9/l6VU̼1rbUq?gMn@oDGFII+ڵ|=qdg%zMWGr;#3oК]rD Ͻ@y%PXauUӦ,][)78{2D-"q-*Ht 06˸NnV{I(|Q%p컓<&gKa_X3b.ߜ"~^nŪѦDs?qj` )>:5?jbH4w|N $+ԦNE]i:$m"5N"LkӮ|8{"_QI2zo_}]~;uAjP CM41ٿɑ$P.EQl?IroE r8xW 6bD6oO'Sxlbڋ szbȇ'opySE%ws?y,z(+9>mcOdQLThMNunPk-jFiw#»DĬ5ES-S(twܸٝIk^t;>~ cbCށňf8и vu)S>56uŐ̟ތR.5H< bYbAR_X3*yVFɶQ};]Z1z-5Wbq LJ$IVATTRK v WzŦp9 )ŧDcOǹ05~SZ(>-U:I`6J^^3f+$6ɏ}63=.F@nE<]1o4I<bdĆ<2dWL 3kLH~\u8%^lY{`=cY6H۰|A~_`]p/A$j~T\Ƣ]q mt>(- #Es*?Cq]ҏVRDL{J࢓H"_cS#>kL*E^΂2f\8]ѩHeY-Ӻ,!QHHBCd͕Ml)P^-a'2_.cT*?024B@&!JH$H0,JHV*i۶MaSRs'7ĐL`` vvv<|'gW/7*ޒz׶$p\F]*t}_cޡ40,u D>/{nSu|f/m,f\|5(95O~ lFU/Zn2!8(PW1e+ 9::JTAh,_Pr<- »GVSV2JcܠĻ,j=DbؿDA^5 ef~Hv[Җ 7*A(=2#Z̞ʼn٥}kfzmbf)BDDQ@A(3u! DMO8AAAqOboDAA{5-)WfU+kklmKi 纳Ū!Lg[klmiޗ'"Hs,[AA{3I4m^}4+Õ58q NOάeU<0>UoN=AnM޵M"=W ^/\U$*ly$_XÚig0q47{bv :y` JUd:jSjto@{hٚ~ fvh6ཛྷFg0I9ӧDq)b+SIIY0헃  @CLrg)r_~NSoyo#3m.g婛y _N zQ7<j/mǼlsiAUzH ‹WhgKRsZ1z?e;EI&?žYwJ߁e&c3^>'y4͚VlZkmG:$8JBP|Z%._ Cte?_!q9qq8dF0QGp/ ›WXt&D7&o9vzH{_ؐ6cyr8EOƊ};dhP&ēbҚzQE׳$y Zlp3_6+I7_˦=:syo?d7?w+$ЯN=0 >ݢ o"ς~~2ҥѭΔ+͘9Y&Q=g۠*8a*߱fn܁%X̢!e@Q3~8 $%I,SA^t$ر.fFhf[̴o(VB0]c৬rG)Y>YV6ljwky)(ѵ'w?+Kves<72jNAx5.q( fe9<K~HtS/IttjhJh@Ϸۣh}N /W ;ʫWlVy5mcOdQ29R*ubT>妊ւf6 l&Q Je2I)h$+iY lҾV}P*Qp^|߿I#q%>;{.J_ޜ9ř^:šQ@|iCmʧ=IҦ{y P"?Id Zuk fJ7UcN}/EmAQ  PVDQ(/Q5OL۞.U%=L ^rC4WW1id¢UHuͩ޲_FgK)I*,]dשBrEVW$Tn؝F`\gie}\֘]ǰ^s c քUĭvyw\-W*rsu??!<"AX6ˢM3B#8'k: OVv\b)đ/`Ԅq41Nэ^ZmD!QR [6W~6)v i_'NETm ;6ƼDgYзf&+!n]45wАklš[} +jc}1|Q}6x99&e)"   PJW2'ORoފI|X5=[cJ9W2ju< Jdhl]|0y i,snlũVL?e Zq:y V39 3ZNr5GMZغSյǥ~ Y7 A)3R"ϰf8[ڏg_7+`\7e+x   LYk_G<2IMi> =  x>`i+v죩̟#a?,ʏ0W̲+VdtZ6{#]M_d3cxG2*{쑎I6)Y6f2?V$A&my\L2O-OuuP,oZ%mn%FBpB 3^K/|$6n#M bTL+$? AIK˹pvޟ`lVէѭb^ uʚS*rǑ|2Z]Du.R:1y$q$AQ}>+GR酶-{uQ,妳kimch6-ӖHlPM:vE89voIk+D>/{n9Nr >$!կ:ѩUi2 %NԠa [V}kciKVt ! Ξ %Q s9{J- 2G^.pT!$OTו3֔Ӭp=G 8ѕߣnɷ @'Y:0Nm8ô\ qy'$I*җ- Ly OAAA SBbZĢЩؖ)]x;`Szn5tiSI\l au,ؐw`ptw1#v641$?Բid}m1di8Ĥ17愆h6K :R-B[XAsu3> zQ7<jmN`ΖN87˟vT^뿣Etp++}ijmW>A(E ˿_w$𚨢9:enqq*:<r7B% AB-.H+)  hS-RB'$Hr$0ɓݝۙl391Q?^(1 o$$8(2U~j7ze #T?va)daA!|lT*XZX0V ʐJ%H$~$=WTKRI-jj5AA4hPh ͍Ǐ0/4͗X)U-RTl"OSIoFM,|9,MK̝n=G'o~=Us1c2Uєs]"7—doOnev\c|Md]_U wcdn?m*=L7q_x(QI|6ҽRڬfXJR12>}+Z);?ȴGXOԶo\˜s=J Ʉl%G R0¶TyojY L\O=X{Ls: Ž0qt*m:C=f逴ϲ>)T0]Z럳)&ᔁ;&3NNrXVZ",7F,;뒟 5~!n!!!xxx:Ή h㚅hvza.9@ C7n#6Dn#dMA%! DX`IN7 _ࢁi"O1wM<l2'frENmMtmE-O;YG1 1̪ m"OsWu[*'z.SR3>fRZי3ǟȄ ~v;fgQ'm!`dM6Ld6gb^#Y1f"AnJ~3Y) %*pSgOgq8!\FVŘ)-smLfW]%R`F(FӮgWf}uA32*[Tm,([g?g S]lbd'BtLy AklXvRtM $Si6p!֐IނK!}U@fs!xx [`<=qbuWI"թj|f,eWf>UjCSy{|&y_ܐ:J}S<>K9iZڮ{dP%?MUbTՖ76&!?ե؋:|?퓺o8sGPZƍɓ\W79Ο;n?}>teX~i{&?fm(jrĖ#*.?պe;';AxۑDeTΙ kSrd͸C++*JFyzP8`pS|Ɣ2p 쌫+ bŘum ERTiQ)(UzKΆQ΋Eu+Z+6&ơ^jo m%+J]w9cqfcv[}tmlrp⓯k4{O'^hxt;x`lG_@|w'Z.J]c'ɎP&%AOUI}6N='xMi~&ev:FU%l_'JRR" ')4mqL? Z Z˓ Gכֿ$4b1/]3r5m8Ҫo wV=5%yׁM55Զ!+w-r.SJfh2uUHmp]^ϘR7mV1i7sgM[#>xTo0ߩ3®Lְ@QQfKI)*6 oNj^I}W{L>Pë tvεF#`~|ծE+v`]Ӯ0M83~$8Tl͘{$'e jX%=_#>1n loDgX{2q|9|=tZgXKYh$ HBҎeSivcK7K|ը[P#U2x!&:\qSXu4Xy <Sl2ج)~<:V|g>먦:iPjaYw:!O@%]')m" ^6xƦB&,MO2my~4omna7g,FDn\g\;&dgCN2qP6}FVL&99xqlYo.ַ}Bz^ܹ}*^7<;Ehu6#*~ ͧwEY7rSFhب. w #qNP(S.톑QJ_M-yoOFl{wŮY+k&/_Lɕ)ބⲧ*2o6aٻ=Ɨ};Vj: ƮXxwYFLb|o4dԒX.'r[ۦh0kN'Yk%F{^ǩehp :uAovO#)Y'1@O,  P䫑qPFZ0M^m@Ոڰ + OUeF9КxƑ >ΨD|zau2xQzݲ5 *n.ېknt)UfN\#oق   ۽ QA   x۷&Aa;^ʛ_ &Q 'Qx.IვpS@AAAx䫑xUA2p +w]A^*}c&3jw>GV(wкLd~L}fh/ !A7+A<#PZSǫ$Ž6DHrsœ}/" IK_پ^θzRI& CY,lHN9mA R.S1quqrKRם]lK.ƐT"N-gd:ssͳ->$t/KW)S߫؝31g_..|r&Hh'GQًjMz0D$8G1Y18CzqJS?bcWJTz "ktv)Ct'ZwԡYO9&vobySg\Rgn o` |H FVm%8R̼1gI'$_Vu eوi\sr9Ä쾊3 =PZԶSlU|L #70r8%圶@iĶk oB^N2ruh>CA۱귚Siu0@:Ҋ-={T m\q/ќϰ~T)ZxjJ 862%tu+u@h/P]r"2w4d̫}]EuWLJn6 W,41$)AxۑĜzs)}{iYS 3{S-"ݧ# ٣ %@"Ťx\ӯ5+;VV,pޖ`F1%L9LxV\|Г0r>Ox`56HŔו8q'2syl$HM?l Kb ļp.umRH:mof+rJl_GX)L`͵%'xC#BpV;":ʆiW/Ngxd #M}ަ.r.A"MAxHb^9Jab_upuLzt2C5ﴨB \pr,GMaŒC-L\6iMCs:z_ Ct.>DMmfNH=LL&7M +-_bEk!GorouwX55j4OxEI5ܥ;6q44q]#No=@skJd!/tJF#Y1ٮj͆K+/ OXm.YZơk1A 1cX!bBUӭ o$ mn#>Wt'|h=6EufXFo6MKSx_k'+ҔfVA- R?Q._%RQ솫s:(Ƅ$M#Q# LWg۽+5c^,<|,{i#Lhwx?&a`ol`,2nE]VB)cX瞦ds`{zKΥ m~ʮj7osQXn h%R$WHPJ`~gyj'm"5/KmamU:?a᧙Gu1\]/)dBoφ}4<:ʓ7*?tQYvиBYʗD_Ȧ+ĸu?nŽLj{*XG"LTJ|FIѨBxsmۼuV ω8êk ܕ2f20|z]bwo"ŏV6abb HSO3)r .qnNMd/"GpِX?8ȣ$Іf%;OEk#[<..K2cOtsν[Ȭ&P^Aȹ yvڈ3HiS)4EĄ2d5:er2Je5<'%EiVO MO)m{#,^ ػZM)ᓟ©;ÝopcJ gv$Lu(5qjW ?ɘձScХ?U. :cNm=J\u3K8+můsǎq3Gsmⳤ)CDXWU뮐D@D%q,"XGbƵHig'4Q>6zRKQ%ܜpڍO:2OpSE3rjD˱lOg׊DKOg*a)w\CW:N%q,\1W!*5>~s^|#t27L.K =Ƨ3zSfokЄq|,:ŊK+Q.jߗqdoJ+uWLDgX{2q|9n=usju'J:o% yBp /&?$SKm47UOm$?Mqi,[ɇ]?58KT܈RQ*5]ݰ>>C}l? +NnF/3j]ьz0j?|KHA;N1RY~r+CF+hnGg\bįzcU]9iBqsl\޳fԲ=9N\Ji #ץi;WZx.h/Y<{Vc80r/wN1)pͻg3 z(3yn/}J]\măfj~yBF2bX#8{/M {W79Ο}2d2,etV 5v 9AJMc NTpH]vEvSOcޡ[ߑ.Ļ,.>0kN'Yk%F{^ǩ_I2r8Kflf:M b=z8Se˪ohloR$^ȭ v"W6%?EpUV8A H)'(̮"cϞi<oAh}E?{ف «W#1(!`L{xՄ6tYϒ~SyWZ3}l9=۰ + OUeF9КxƑ >ΨD|zau2xQ#}b[!|Rōe2tM3x*_nu'ϑp4rr{3#c`LKk2}xΨ]LקhFŏ٩N&A,7e2o5^~-L˅˖%WoZKBBXVZPP>Տ&]x{'wy)J8K K dRRDT,pR"..d-Zզj5AA4hPh ͍ǏӰQ㷳BUW0z^J#qƛvH}AHx7<<<^337g׎XYY9qj4XZZr)Jv(%=_}\&޽Gsvjt$=8SNaԬ΅(  Bd2tOVH-u˓&~Mr*Ț1AA)M055S4eTX2_竑xP,̼w]u_'';G  Ȉ*Up H$:-+xc$˹)(FBG&3N9 㯼w7>>L<Ľ'Ax")[<V 1)ܢO%R)V8/wJDEFY1(:o2:;eʾҲޅ;oׇ‡I[b⚷@4!wTJtϑ% rDBxx8d?QI ML̛(   5 GsWF3Tk҃I3ܨ^̃sܺe\p-]`$glL+%?Jg2R漯QP*^_K%kAtn>uI*}c&3jw>GV(wкLd~L}fh/ !կAQIŜaEč3;+c+%U(: 哟1;VhO`DrxZ*γ\[!5hBA&4͗X)U->vǐʬ9K5K}9kϭ(Q`Mӯg3J3zN"fV*r0%rs'|_OVi5 Q{_x(1FK|:;VD"wLbE{XV<픾jod-J pZ#yٝyߨBVce|v/ye"F-O*sE>#}s*n!JN IDATa{fV}ƴ#d bs]Q1KfHؖ*Oc\-r7+viiҡIL(݆AߎSiԹߜ;zBuyS2pj{BLrrÏ,7rwWTS K||BUvBpeCLt/㦰h Tx tTteZJ,py&z?2e1Ruָ7Ԇuo ^r:QLg2I1T„Yf7)>X460fL2p:fRYyl!-׋@Q/Valɍ69| 㼃-הf#YѴ?:g9|Hœ3*@'x^d_-aHyr,eHk1fj=zxy4/"#)`5bкnLȤhuK5ȗnٶ^Z]S -17;'lብ)6br1$m\Hy8!̶}ߠфٹ [i".c' +ss%l.yEJˬEFY~B"h86߇yJ|b!>vATR3̺ez>z["4_Iq}, :5B 11AmMtmE-O;9DѪ \unٺ6r@fNJ FH3ok]g"AG f JdJw]U9oG,bt2XIfY.K]!UB21nBF-\23JU73j rEm{bT/+nt*NÐFX#+\kb̔3նgڶJV3jȭqނ^ Oܞ`sEwD0NqeZ{OeŴЗJUloSyb YNӸ wΝۯfj#ΰ='w E ^ݛNEufXFo6MKSx'4OHS4kys9z=1^ ccG1*/e JmN"r G <{ڈrc&w EyzLh&B^ h᫁WXվvc&Ɇ5_MlxiIȓ&&N[AqÛhFES?XcɂԆ:cPM|!i :u47W.[WM5G#{2H,)ۣ*+y*'X42G"Vkkk" 3'u)߶=Vqڨ_qJ34ɥZ{QJڿnՐJy؟:S9F|&N!3GgeecN}Z 6e?'ul̈́Jkzo\-2EmjըOE1%kYuRd}u&=!sJ22wDeSFU(sJCsMԟgB&ƺӫ-&%[5hBI`̄kL.ukנF̱Z);Ah 6mN y!wԨٜۋoG8caX~u#kY)+6UAX>;pe`ͶCWA$&%1u$%%akk-S}|HJf4+H {NCd6Yd ĐY`ftx$⥳a bUUOL "hf")BJueǞ}a +|J%l z~yYˬy1P{qnp8+gVUX|&ܻ5$Ks .*\82 ƎM೔MO|Ϝ3b˰t+E1U1md]r.&WmwIޡ>緅 Ԥ8fx'T?$IQ3#@"AӼ4C.w02&:`Ib.9?{R}yb4zj#,^ ػZMSc8iM<~f gq?`fHvMed-NOKK8b/ٯH=Ɯvp3J hI|zBHD~ZU~ "3|¦-iܨ!->s|ձ;WH76뜟̃z#G Ev/ƛvyM˭mnIqHFq;:,9<̳43O]fEB:&k;Nڤ!5]8J$HPv_ʱ+On]}rBPo#S(NM0xⲄޢ ֑7t{Hug4O**:{:׶S ﯃+Ӿ-[4\\\С畯FbDCk 7ݫ 3mr%%B򮔩?frRKQ%ܜpڍO:2Opagvͮʕ][|S4K`iM(VX_ tWN}Y<'%>] [sJ~w-hh#71'n.<ͷ~}+Rnmȹ0xJIRNETTrm~v;v>8Vfڕ -DZ+S:@B|zzOڂB^}ܑZ( F 䧜_7 n Y K lkЫl8-(%\Ug]ieܫ<_ !%yOOS~#UNN|cktz-q.H_;vnbB(ޒa6/N|u fOb)&Ł pXUI}‹#N='7MKgit0QV}mtZ*%JeJ?XH#)4mqL? Z ZQ aILL⅋1NNNDS͍nݻpJzL$F{6s3؀ѫ1:Kmj3jF喧Y~bow6^V*Yܖ]}p'/d~d|2;p꘴ 1_&RW+r?_Ly01)3^`Hi3 hXjo԰448326E`,5>35q;kZ[W)V5dzf,X:v>HZRV틋v"ĸ?,YڕZc2'ie\SmF.M$Ri)f|(V<:m Waz%]IaEh; 3)Ӷͥ,v-fZB-7g]MO9 Pѻ")'qԪY Tq{A4V1A9x@6 A!|lg4Z-KYkW|y_~m-jʕ+ÑJs4WӠA}INN& 777?~Lobވ;oׇr`a$ys-4z9[=oٌh||WU~(g?EatψbBx7<<.,,,$gzKKKN6z_D(Be@}|ED]?MP$ (գ9x͖*>X B#ޔa$?_&E 䫑(»u1AAxDPtT i bbTbׂ   dO$ ^||א-  5qFs&FgSh+#WWO5a7%`\F'\K~/># Տƕ脋.N%p(怓s硌   Ζ-[زeKXt:6mȖ[ Ϋ$b0a"FΙ?e(: 哟1;VhO`DrxZ*γ\[e).y?ZYʠր Ne-dwnzEȓVW0z^\wc޼y(UJ>֮%K~C/ U •{1ªKP ,gcPE\ҕi+a+z[_:Hi:Zް?Sf\Vn 2x 7D1/Q.YC U_rH =Fs560alz>ϯ| "³4-F 9hogBƆr>xfgaPwP7>>L<~dzOz Ғj*-\Dqlْ;8x 1_E ~C#]{Lbc`nHStMy:2Τe K&m49U^Ȧ.)߷F91t2rƯO:]nD1c^,<|,{i#Lhwx?&a`ol`,6#0rFzͣ$m   D1aDu놭-?oŋckkK?fF렍8êk ܕ2f20|z]bwo"8 $ՙc.>4.M$>!QbN &b 偻3Ε>\%W'Ƌu0uHw |=FS08)LHQPms#U8lHQhOç -b)mY~9[1QR̢<=&F{h!oa^g › \@ʽW̥~SEodFOeZWɹ̏IόE!$; *::ٳu8::w'''ڶmˬ28Wj$KE'?'b6yqg &e1K"Nܥ5_ȁw񮇙2x= 3-.UY]nD@õ/;vRP8ҡ=2)lpKֺQt]7W*%$.qHl`MձDD^cRCOK^ yxMF0y3vo_ys璐PmfgU^/H*XJO$ rIYI2!;ҀI 䌫+ bd pq314Aj"N-gd:ssͳ->\TR:DZN":=Hze ܿjb&M޽G7Yi$4I/P(2䶢<Leӣp@Pi(*陂 LL +GҖ^NĶIې&͛miE}>4{߾o>=o G9/3כUWWtrXFAeTU;>WU^a64w3ůL1N" [\ !n޹i=B"sgYv~|b.-a?8dMC{QjUT,n[Η|9Ą?5cȱM 1Ykc^N~|kW;`eȱv݌)XϨ ?HhHXƳ>%9<^r_lH; c]p.0y)SUo`Û<4Ϭ:tXS̫iC@P(1~Dz OTEsm(ϭ݉˭`=DڏSq/3jؿ#'Zơ zXͅɒgqjGTv|Q~D[$+b@cψP#5iC̝ތ>Hv %wL?Kez_y!4҆' {%+(>o%BǃNxU$<UhR\TxO%g='83<:ȁi nҟJsW/ִܾ'370K`\;e=4 X9y۲qDcʬ?R.?Eْ]ƍwӈ#]+ٸ/Ng 3ac ͒Ffp1܉}FJʓ57p@/_n㡰qbq\8Njk]h}B!zU zL&9J߾h#]$ #ȺkZ+'਩n,bkA"@˅jYB!jNN֜+V~oeΡ]L~С y6z}'B!B\ tzyg78C)( Eg+P\!4 UUQ$j5_+B=9MDD&sr}!B=C\\</ݴme[h6ȏB4:Cg*r!ږᠤs|ÀB!N"Μ!wobbb$|UW|;v- !p&>NoR]]Q^VFuuM)B!Dw1DEhL&_A?T>ZjjjpvwwB!4ш^K5oYFEQ0  B!F}B!Bq Gxf᮫> !B!B:*m6O P2IENDB`tora-2.1.3/src/help/images/largelogo.png0000644000175000017500000005325111270353652017727 0ustar michaelmichaelPNG  IHDRU0bKGD pHYs  ~tIME,&" IDATxyt\ՙH5JAȒe66`3E.o_0$$ _J/ ! :؋|!]I[Mmx-K6yJ5qjgA*aI޿jTéSew~pϫph`G <{|e>gf~Opf}cˏ`E^> gZYo渨rbE^7t\p-Z7p81UI!\T9'pQ (Eu]3p8.Br8N p8)*.Br8N p8)*.Br8N p8),$^gBpQbK:L.Br8N p8)*.Br8N p8)*ᤐtr8N*^3ciHKi+9'"AΛ9x8g/q't9]t.Aō|k :9b¢p4 bG>oG7m.ۤy^;Otʜ.,uq&t.9p)m[_ܧ0q 6򱫵2asÂB{BwKc8_5"{oiT;:>'pKÙux\f9JٴKJ3Q[B;͆ͬk6`0¡)z +66_}-د.NléU-l7%"59)}}r 6'çn<ٍ!z_ˆ5\9]o)l)oI9qpQpp/_hfیmX[hUO5lfn-Ʈ6y(lp#pq_uv?Gf2ܱUD%xpcE\!uy8~ag^r′ip ӌEeYpI6/Ķ >n}=gPgƋ˹NRp$lx 21ͶÛ*rZƧ ]8ԃwZzO5)MZmZ\uUyذ@fٲ{5K%<9\T93`sWL:oVL2'Ki;C :NvEDPĆ|l}n_gW_k_SUB6/VJcğ>B*OҤZ ˇ::G[+DlI/~35s%!ky8 rJ~rBZ>ow_JMLՄԐS@i̔7Jj0HŢXhY%+ (XmCem⺊\|èo}xz'#EsE4޻fیxE.CDԬMU/s2SѴ'9tmeG8Ɓ`P$DdYe2Ѱ{NcGZSO,yVZ*:5kӑ׈Ĕ) YL^=LF]KA 8Zzp{u5ϬkYi/K~.>hȶD#*g!J->76> :%bjefѦK"hɷ2?mhHxJυ=5q53`Rpˇ皊|"a}ӕrf΀A$j~\܇ŔuMz,$Rk5™1 LvGQl5$L_ǤM @84@( Ox\t~$`'qW4XZңɬ2ZLzգu/n+ʙ)GHP?N4) }%}ȃsN/rFY ȄAUOinA!Ig\&hq!ӠEYGu$Y}_j,Y2ޗ#nUt3Ǐm+ߝ{pK3y:zk&MGTIfN3 Zsz}AUF=yVdv0?˄l^vL&&l^LyRaS!/tZM\ޗ:VYq;;VLdrf4OYOs۫}=CMDPw?&XiyF:؍@I8 y5?<*V6ˠ;VlxJKB,lh91ָײj1# })ɵⅻq9ڙ9W\T93\Q_#N$Xo8̚4j slsr4^jФcÂeEpXpߍnsXL/a/ 3M2"&@jxjkdzq`m?Hw ܽDzNRSЭʁu/mċNw 5\0.xkҋMX)XV j<֪RaV;% QkugsgCѰOYokBᤆvMշFfOSQIa?+$/Thq^ ^R!-IϦ`E c߃CvCgԉ.}6zDŕ agD i|ER?Vvx^m^,ںsW'J]k%^;㷢eC&} >wtI_8GA+T%+Ր8*-&J ll8o:;GnYf8G `qvLt9N_.cXlbbmzhƀFB{+i@5KP ^CW0Ox--t[9Jl/TdeNRXBc+% JqVcpFG_B PP,xp}9wjģˏꅁ)T/ڱfVWu1[[^\CJo_|Y"R@WT& #hubk?IXJ ) +( -Y&mX%+=OUeU:3@_%kĚ*[-ɵΠ*2u[7gM􋺶4ks)Z(Ts tJu .0J؅!EAu[ ^KdET*F^|Ԏ/DU , XfOn[MhleJEuYpNrI믟OrSJ}VB,U-9@f묡c1 k({\uYAUS1SI`W@EPD㫊֪$i%w~z֭nP9_8VR%e8&竃MPݺf.G_ƌB'*cTV"A$>l2JSdaEvCj%1^5h@)iE__bw_jz8x撒DIH93A;zbJ<*xʜ.ܷTR8dѰ^#5Z]ZQ+>4GV1ytI\9o}^ WZ)jIe˨) cJӶaJck(y)TPӔz.XWؑifm{c[ p !RK\ 2uCMƴqƅ:^OlG.%wԖq^G|0SHb~YA}܄J@.?.Bvz^dvK9~if$Z+eYuWbRSҪeC/iD˧o {taR,5D0bnLDS)Ɋy^_F[ b7܁ KIXuF W؎+_ϥT R^FI%VԖfmfcUJ%AM\2Q(2 +s`$anM1΋y#E=rL'/WLw̥YNEן֥&aMz̷J;?[gEK"(YRA5j|)uZхpۅa-x;PЁKNY(WċH2) foګH#:k£+>DlwE3`/ĎCǔ:dp x sZ՘S~"Vun=͛w~^?ɳl4tiqtd?R#,$"R2@^'#e@FX)=JIIJJ<1^fi }to +|MgP]<r2/ H>a `k d!C ]tou8K_~FQ%qXvZlRfͼunY&ۮ%ce”1^ =daw ym)%zxtNE€I, 2͘i b!>ƞD6v"6#]>len)1fiУ3J_ eG h«7xT3F" ']H:Kt@} miQ>*2EJʒ+J.x#A!;([JLZu8܋mxvt يj-RJ*B0! WgP\d.'yynO~YkUmM<:9).XL ۆ퉸JSht {Qn6(&GeO)N]mJ;ۇ:"ti0v׷n *clݪx{g.zn;}[3"JNK/}eE?dHlqq11'J*KLuY*(J8~AX'u) Hh+JheYj֨G. i2!*RqvNZUk+TN 6(=|FsYT+T LĂ3NҌ;{̉TlVv>9&G†X2uυ=Lz &@U GZʲLV;Jj NA `uoXXflbYʆ:zpYSPԬ!+@ڌ^;Nl֪F՜K@.wc }!)U''> !?㫱ҬD6#U,Nda⨨lS :6J5E%t#{[M&UJ"D,1>fU,*Gg0 ޯ Y#qF XY:~ݒ"ed ҄ @M9$T$J~*lu8ޗ/&FP]k5rNVYk,ųWckUcӵ]ladžzXvO=Gp`a-h.걤XYZZTeRؗ4CNJV*!VN(ZM"%n y_+Qa3zn*Nj޳IY^bU+"X$ϗ~AI㪲Uԥh,4^W ݽvz4Jl;IQr36/ƶfBu;kp&Eu( 9_'%V2[HTpq &d I6FǐM~V ֔KDidxV1kJ⬻|,pfCECdJ;i"[` xG"Ju2Iu?cJSddRނ΋n\ҲJ*l{JT%2M-,3z\F[ {>t' IDAT*&~5AUR5*;_i%QzjYN FeRōZwǗƴ4&]-?"Ěw0FS]%2\(쒼?cJ 'ROnڏ5o'En{9+ʫ;#ҽBǖQ6 V)?TvS%bSȶՑN$.?F|? y, Y%6SBNFX:~eVX?%FiUd[`L]Z6K AVjsފS2j5#K>9?8S*JZs펆Si1c9dxf'vpeÏm+Mk\%6|WuO)lZ-v<uCߠu,4+k5J\fr[("%aPCJUb CXW\I!iYM1ܨ9vR .;Jŭi -٪_ۃ[&;XÎ {?K؁)v$؀U'EgPGܠ8/6.pqX*nU=4ktT;;V|^/%vlPa[N5Ujbxm:’~w%;YJa ʲ< 2>4]€K^TH_*miCa84` &-fkڡ\V6A}50|>%L۬RcE+smojG_L둬)JHx YRj*o;>\8tk-cXaeNmJG‡zIkMJ}=3#3*^l\.*Zy翳FT&r^ѡ6q!qʩb!'WR ZZ08>7#\+P .* iFLMֲ@UEq Njkm%+2@FdTʯnq%.V锊]֪FYLJŠ sRVjsŜ:c*!mMCI ·rS8vP^Da,ѪԞ:QbէJ m(.ah؇KNȅ.mkâ,Tej,V]L?*%VdxL轲J[U˩AvMu߾n_ʓ℔jւ\ خFjւEWa2k6ke?쇭`E#ӤlCCSDQ?]5"E:Pμpz1P߆a^+kU66ziIZv6ʺll "KHP'\uM0NʤxY[~dHZ=LsV9nccU0>kRZzq._H_|ĥu U e!͖ IvUdN5nT-ζattpf؃k*l86)i,u ř'k![C셊Bdˤ`l,4%GHY=JчV> P=GFsaԢ%#\Pv}|+$Ր095[,$~jjHK@5dd =!)%ۤSJC0%QaR  g5D_҉cS^i2QeE1l(}o{6a/  | Lhg2΀a<[r>C{D8P%I>1Ji.V@a8,zXK+ª{J*Χ#Y_>UAT=UF5XK"Z7N5j&2*@ XfZL y鴯xӁZF騸, ӇBc5Z`0L,T!}AոTs qI,~O=JeO&J,{DT/-)U*i{u61JRWN%dRQ`RصW`KyERkLZR t)NЗR\d[zn\TRCqzaaRcuOŲRcuR%ǂ[±H8~Ϣ03Z9vSMՀKk\(O\rY],LB鄚+cnB( Ŏp`\%WDDpˏC ê[JY 5E}8㨬٨?~$Ua|-\$UZ)[ȾV*Ng&Ѳ;V`7iOeJsIX#$*RZκJ}D`=:R+Z?D{ dT 뚹*|FSDU]k%ּu=:25ok%^;;kDoTjbl; {{Ō흇޻M1,߾;{#_'=Ys xvpi ww{[L[n~GQA=zvp#t Wi<+_&+լJ,D8J"JckiW;,ժ%z}!YqYPi0֣qT%?V?+U-Vg2)s]6a~.??>ӫ?kOG߁בO6WVOG,ʡ@yZ |L`ec@a@E%hU&P[)r [yi,iXaٱeSjj\%VtMHZ+ao`_ѡ޾hiKCN)|g z{"y"֑bl5"DUl*z=A_.G! V"jn*-Dk]UC~RE˿\TTΧ4a6הݛg뽀'ϐD8IRy(tu1[jg:k :L!h|ZCdU4lZ%aaЪR(ѽV&'*l.J%굢㱖d&JV*WrɗRoVFA@i1kֵVNMS%ejL`6xo 9ت;UE/[[(}'FNb%`MyBc%V8 XYr" TXqhx >7$%]Y." s/?Zl 5Ge!1j{VjlbY΀AѕGekUh7NSbZ}.z)U a D-W[ <|)Wkm( j)y}5딼'@=1*"_fRU+s:Q?v%~ 9eO$ D2/Veþ] 7֖$׊T)/ + $&<@:  :}hlt{X /`VYb)9_X al?IN~DR|K5JR҉-gF*#}\**JcVOMX"5Ydw_\Wgw.uY*a?cEDct HJ!/.Z 7,;֩gcJZ^h mI}cYш+JR$3i WTg ESZ3--(~CĵP4DVɈ+y};񮑸 J2#Ej)y?ظ(oZ\HݺHY%1xz OY/"}D+3`BzndյVb_HzZ8amALķ܄ +TֵV𾝙ڂ~ot^}-UMѐ 4@,VA@PZc lߠWZ̝-G)n:e㧀<)$l=Z~691`:HY;kKs{&9[SV캀(&<*:Ä#U &l; {\-c^_br,e\;ytQj3G}?Ogw.5EPbs᭛w;":ggPc! >-Kv|"Y|VXIE+DXH|AQt_ DoHJi5pX f$'@rJ,۫~ǣ"f:)/z'ؾn_\uD淔͛wǴV5#Nj>y#V\чn{-?>UWExj{6V*b+BA@:M4* @ĬT^_%~D;_sW_ڶzmC^OYz 'ihN'M>گԦ"۬SOUi%޺y7OEʙit,̷aY.}C,VA@`x Sq%+-RTz-̚4h(,jb DbL2J}HXP*g mfOWP6x̺ ILIIӦ";0k0'NJl`24v>uxףz< hePh C1Z0<6.Ai5@ R{42YHrYUIҠh)nvA"RDwÂf.E3c8]JӦ9Y eBadT7W㉺G"w⦅t+m:4.yҦæ;@U|P N$V#"@t!=-J"J`ˣĔ/6|m-wy7Q~XpQڿYv;+ˊ2`1ia5jQ\`+G |ôR;HeUZcxZzejD1% `t12HR@\"EeG-m^Hn<ۏotf.ʙoZkŤtdg&^_>_?e=6]?6%VOyBȬV5qE 6]Q`Adzup0D5ke\b!Q`( xbZ[?>FPF-x@(zf'\PE3#x\v[͈<;= 6n1 f@VQXQ Sd@Km㉷Qb?s),)Zc+U YV<f`EҕfDœ Qr,2! S@+E{/@{x?rf>WuQ U625bI/1iIJ;g"{6l4~QW (i50#mb@PQrnZ\?}7: 4 BX5=oW\T93[D#mFeY1?ءצSA-NՀQ?&.?*xjo ~K"xxګ=M-rqTHd0b; P%X )*OlY /BGs^ pQӋh}jY\n掚40lu]V-SR7 9{mCj-հuuٝKr_5TT7MJ]5}lKQDE!@S7ujwDUΌsWags lf̚4XLZrXZ|n_tM`^KrZzUk \_z͞&їtH, 貏c!E21ms_BT{ ~i?w'UΌi ^^syQ\ v ֟Y'&VjtIyFĴ-ǐs@4 q`|?k+\vR|P߆WZPY@YhIJDE^w\_.B) \stpQL{gP'Ycz!Zh5i"?'B 4A &ts[o-K 9|D E`K x.i MGEsXk_zױb+[ ІQ?FFP%GGpn '@cR޼y7zFxUtŁQB KK M:_l<ۏa/\DO g^D!5mF,#LZWLKfcl*J ϿۤN\T92<%Mr`5ioEQ]~֬eF@q DP}x0 [#4u@Xvdیq뚹2A Txÿ`uQtʙ4 #qjΩq6 zzJ8zFd:0@C(HZ(۳[[4.ĮJtCè-ºiaf@SN\ġ.=ׯ^xKE3p Ƿ8*AtLm@q  lsށh/`ҤC'FO:qGn£׋W;Ou8ޗ/XoB}s@ԅ_`7!Ȇe0D;Fkຟ0aoMgpnp4n * pQL;VlȶD'.̷!۪Gnّ~"LFmȼ;v zpn hu.ocބ9b{?G6@{þ]ؗG0!n;Kze..iILeیXS ZVs〪n(~7݁xG?nw',FD`6V|xiΌ8TK&ʜ.,Gy+ym4*gN/7hpa`/\wSedT10m(CsN/FUKۗ2aT`bg^'t.XȷQfqr+tE3-`S2QeEAE%g"nI1?1À?߆)MxzŭU_ɌP"ܪZoZTTP38Fh$~x"]uS8)[1h9hq@ưI/Z=~84:6 m.\(^ë͋9"Op. ILu)ȃլqUOTW4Ef ya3 < ԫ2)ޏG|&ApR UeZ7vL%"HP@N:~ DKw/Czu󚃼EsY`Se&8aAO)n::Gdt'HKY ߫Jʑ& ;D~ oCdmJۏ=GOWsr~o#MLA]V$ ^bmb.Nd!\nJ+iRA% a!rDԐQybsʙr?.1e6S:0NjJ;)61Ur8?gѾtLeYtLŋuL]d⨼ݔ3ʙR[O&+wz8 R W8Ur *N`u$TO2cpvL|LxL3%)2(:Z10)"0I9lbjBW|1WA)aXwxb3*'c" AzYS T9)ML-22,vL *OLq3\T9)#юx+QDScȁP'8. `n Ӡũؙ~ jvt0SX) )ΌT9MLeی(OCB3D%Q TOh'83 nr&sW ˊ2`1ia5jQ\`ZYbQHL) *gRhX5t,̷c8Wtw:7isl@'xb3ʙ0i8 t {5Mx%JC0 :٨1)Ό*gBlxhfB;*0kpl +l MDm#h% gFUq x t_e3zn6`A9!Ax)DIJӦF5w ˜J3N/ǙupQ$ǗҎr`5Q\d\>Q~z g iDPOLqf,$y@a'$\RoN:BDW/unXI9٨α:f舔Lxb3I v_uYcIL2y5#|gEef٨jdBǔslJrCՀa'rFg6EK 2rGB)v_Հa/:u:t8뢏)ޝ$ Eaј2bpp$.X7E\&x%HZ[( :9p=%T@fs=?ybJ59sԅ Rc*qޥUuE?~k6j٨Ԙ",J%TH%#Yi5o FcrԘ">Veo6P~3ޖT-^qSecS͖!0!/u}]iUÜ=}!5&wdR Ө,vcjhLq3v7x:!#AI W7jj^a4nL%y;K*GCs,XsmtZ!n?SR%ɞOo@ƦQEWCW52TɏB6WPZCa^ޜi{jE"_ß"L-IENDB`tora-2.1.3/src/help/images/changewatch.png0000644000175000017500000005052111342452510020216 0ustar michaelmichaelPNG  IHDR8,Wlt pHYs+tEXtAntra?t?Change value of watch}htEXtDescriptionLango klas?: tora"0 IDATxw|U3Jz% M@zED@Q]~`]w]{ E]@ '{K~a>esϽsyLb :KUn@ 8I+IHt)酮Q0H$)H* kACeUmA7O4Tue'ɔcGQTȚ;7%]ͦ@D=AJ:e[Z.lPC +K&Lc%$+ K&F`N1Gǎ_(K&aebOF2aecKіCVCYFݜ4R Yٙ7,@Uny)BRU]%IB$ ^9rU+3;MXA*H X)*뺷($@m{jnq2mJ.\?6%d2BҤ\_Se zQdA1&[U4O+s:Ѐ(Ȋn`0 rD["+g=ޫGHeؒrO,[!yI]]k$a٨EU$JH$vjkkqFi{kӞ6k،u1EQ0 vjkq8%Y2 9b߅r MWɔ&dqh ,gfS=+꩷8cIȉs8ڵܼ\Ҧ\ڴ)v܉i+e3m9lN /bF8+jr?ay}]X^vbϦ5}g1RJȺqnq烧3qixEN+;HsCAa]t!#3Nk{YYtk]Ec3'7nݺѦM]jyyREEm(ޝ|vL9$^ddDw%hd{v>Č i|&rAWTر.]b4Z,جVfj`4ҵ+۷o@˟⺳f~7siDAqfJ$Tōs~L#n{8x],`YuW.F}-?'grЀG+yd<_؈)g;N***رjtؑ۶pkSms.!m/tjk׮lڌܱc]uj[nTG 0$Svdh"j DIar"3Y)u* QU'Y4I~A>UUC@4j9 ضy2 3L8LЈ7%ڛ[7lJTBSEsytmf 58+ U>`-[],o;i43}t|M=v&׬*++$\yqaTVUg{.(ȧʿ=A1bokyW}|՗h66P$W۞zm2heȎ ]cky}:]MauN'lnGܚ,R$ +m|'q [Jfs4 Л_9ǝ}q ll{2fđ}dIzб=#OGʌ}8rܷ틳z)Ν̠>}<n˪F_Zz^4& C#Gq/Yˍms>F䳉׏e5҄'.Q8뮽?p8/GfW]y&:{P5.EĨHd8~u6:6UWgZQ5 `G5iu^AGUX-v4_kꅼxwn-/6;#a.=?-r[eq'T:Ad䆍ίc/ ,n(cWTdW|y<ͳ/rF\tZ2jqfWkc yz}ƖKRncz`:uPU,?sDž^C+KoA;yNהa 8h=ӏAvxmM>8M"wLrwMys ļ]7~JHw0c:Ur[o<_қƶKgz>Bٟ(۰EI~/Ϯs?r+=\we YobTۉʾ}U|2><_@;tW;fCS}6{Ͽ:vV nW^TUeatܻw^x ࢋƍԱYmv7W[ň6m ywx啗馅tMKkS.ddNC꠼[!aXlNN5 /6 Ӂan߆f eT{H3Ieťlpԭ`ML=ni6`yb'Ɍ^\rMArAYs^QjV؏Yt3ذ)ݙ}t/^g%(/4igW?w5 t%&3Kî1O; 1r٫5+Y+Mԋ9W78fOVOAEE7W(8UWWu8p8uX4u| #8쎀vj h{CcN\veְpB*++=DMw cf 𳪪3{<.\%\͛}put"l]׸waΜ3().6zХ0ukk)lKQ&{᧲:7oh&ȒDSc#Ӊ=ȡŋcE12{/]ۓ7IeHVcyR5ilxfn|3WYu8=јEJC\'\AK45՜(91Ѹښ5ߤ~uHC͞EU@oHV r^ ?MUzN&@ofs >a} ]lo2X\Ԭ&F3{N:Mh蓭 {a[Cc_ʂ3=;eG/S F|c# \UY}ySCp6 ν)4!!kV4_+7G.l 2,Gl'ݻw /d_Uwr= ,gppwrUWrsٳ'/"{vV; Bcc# 7=wsq9q:LBZZ;w져]; B0sflRn^x%(ٳ=͈GLNC;7dubT$r3lGY_KKKCimӦXm}NMC$t?cҪUb_rOtZo gՕluej۾MԻ0dw#'-[64C.5YT(8OtOgӭ {L9)-JN @VGz>x} Eǘ7RWVTⰕ란Fq*~ۈLU|&t?8o%z*xȜu:]0&7`ٛFF1u6但^,q5Fٌ]3ָ-9tMuv߅#,s;j(y= N=֐ y` IOIE izl`;FnNFai'R2 uY,ZnV˶ ;s~A=WWgr-޵gm3ѡC{rr(/J}}-}1v\GAD..xwyn4ՁǴ崡\0#J2|BNȦ(Khjl#JUYVhhhpP\\A1w]c{2ϑq`r%|uPˍg̉C:JE2gF.G䤪{=?#O~NS{ 14 .<~}0~^hA *3oZR>#.A[(sm rkw,7Yӳ2p, +0xU4x:\ R>}K_cѫcN64 Sr/~m9ypo|+GsWTηhò1AIGH SǍg̬#?o|WJ)\q>>GNMd<#%Ϯ;t`V +_rq(%%%Xmvҽ{wvG@;QU%1(\m`̪+p:)).AQ >-ڳne3ja׎mvWciӆ6=H}t>, o.lKʹeTUe]/2v+ m'}ȊbO_e·[m"m_`Gm}#Ĉ͛TUv*^osW)1kv)L#EQ())d2k.~XFF#,K),,D8hםh #ๅG5 6%Nk<7hlKWMۮY4Q=spa`v8lA <^{WJ3(j`zX6Ot}a ,O>݉g;WƠYVmVu4c5{O~ށ-R,Qt Avb4ٵk+WHC}=AvN}|1"M'oykGOH':Z7fefh ##A cM:GA&Jpreu~pO]d\bKD"w;0F l$Qam.H"Gv,%zo"=}KIM7!ܠ$<[/[Og$ٹDeiŒ]EV,_yJ/a$%s _ЪfAb$^syQRtdsID.,nٸoa*Qu/PW#l&Gx lqȴKcxޜK)UV+[&bIآ^>$N'Q`Tbï$lk!kBw[$ӉQӰ鞷=E61=G m_H^xnW$qi >ܫpad \dD[2:h!j rg%r/EX:^U_ u2n#0%U=HH W"/F |.ؑ!aeq8ZބZ ā l.k'­ZKr9S:$=yVib_7-E" &ӾjCW޸SMtOqq!0%8=8ȅn=W'#q=Oz} x+{F +҂GXjP h:- { bp \ +@օ vl&S?d~+},T$و!Kg{#=x^zI/~ IDAT]t=>0E7q?6De-þ$n4=l2clH9T_^W>ubFKT6~%ӎ[mh8=6b#<ȣzGOTĖD$&pIzAׁy LŘџКr(۷5N6My<8᜛dE?)gS1gh&_gsxɫ9eFMDk7#9h^[,:svT:X7q2jtێ}m9♓zWz/c` Mmӎ#za-?Vջz̚2}~\3ap Y +sznQV}ϼ \WOMM4nm<<}Z >{:V$w|#? 29}"gχlogϬb:ٛI%o6RgC?27xrx9/ea3!vl+J+?rfgq۫/pLr p~SRF'2668ʁz S2xX\d^ [Ȥ̶>5XәrI%]ix[kbEtpV} Ȉ{fɈ"wrŸܿ7|P2:ױΈlc!eacCaYF@VfSg2:ϸqϛ<>O?%A$K*01hz<c."MaKs2wP5>躆r=/݁Eks iuܡT#pdrN$kӼo̐B# >i,ej9br(踋/1 MaB>c+<CG*xk>|H9C7h?=!he:[.Uuvt]Gœ^x(kVW"}l:|wuoø`~z6:uXak;-Oe dtAM躎hƮ)df"+O]⟔7sְX9(u3 P5绦n2GYTիxUO=UNsg˓/ɵ%%iO[k)}l.)sԑ&q{pFQ1OS<~N:3A7?N8;xws3Z;aq.`T)`MnǏg̼_o,ˀ&L&Slґ{3Ђ :gFIO)dY](1Wr<^:g㎻eNH9l&w;r2=rJo~yر>cۛP3W碩FG0i5lQΙ8e6a}%fs0Ctq4:)ؙײxJL/G<}?g+/q?&oS|Ǽ˸zhFO=1Ji<^:{,㎽w.IoT&=>tGK<`z$|}r \%h1v֓J!⣥ߺ ^8[ɂw`HvZ&E==yanu5K׽E= cG^ٯx\uK㈻#>l` J|zؽL10#ypTRx~_0. Dq{D3)%d$A-@q=z?ؑu\r?~\yy򕄅'Ŋkg j-S-ir!nkEB$}dz1lMv>i@b\/\QKl)r:BZJO\ܻ}Nr4'_Z'ZB -ֻ} 4Hz4æ 5C$h!\)=aGqS$[Ghp+AyN=qJ΁~w V zQc`h`v8#He_ТCWj1z>N@У먪-h4(Zq`_ؔ#j~WjkkT<.^yh}( O~~~ԁ pNN۶HT݋l`X! OdӶm N:t7Bʋ }pil>0fJwgݺudg(^ xH@yVڷoOA~iAX-kjٲy I^ʋ +.a'4<p]o'j׶-{KAb2Wtc咑~l6DuV+ͥtSz४S_ s8RW_F{P im'9e_cr>1##sF$8xܹ7k2洴aJ)麎jp2p`Z#V`Ƕ8ef,FݷԙKK׋G&~A(EY9ٹu.Q0*+ؿ?PUz-^dzoqp~/+=] [DNCZvCVVGы vM}}}r/~$8gs6!tcȤ04aCF**vF׮Qnݺ`2ٶVKRIaҏ:Hi9jյx<+b0YCfu>Sjx|n<|5=yNϋ XNwgV\zuCY|c7=Ď7q,gO7y0 t Yٳ2T)ź ,J.:r3kBZ7=etNG^ݏ췃V l*䜋%MP0J* g ^ Gv'! Î/Y]~96嘛foǟ=o So]H8oʭHmrܜq9q7KrIwE=q59I{mE~v"a mӋvDj3[nl7^ J=u'Kt[ tDyvʶѭ[ʶa;ڵ3!:.鞷p>3)<ukcǍ))dY&=#o-^"lܸvCc.EAUU:vlOaaaٳ={&Ve?H}(2e`4Pu r  !Faa!J۶EayK$I]f3n7X-֬YC.]܂ 6}ժUѓؤg#I2; /<sZ 0)8EQ!;'?~}ҥ[׸7mȺ i׶-999Pj),j:QUUCpM$EAQ SԦeWzz:۷GeoXAvvŔ.%hAӑdF1;@uJFFz= 2**"ovv6F|s#--,ҼOZ Ʉ9yc{E~$I"==$I̻ VE"` C.CW< apE Ï@ b'[C$TZ-3:eO|O)>}Ok]Z7R7r¸3[z@ x[HN%a}Oؗ;?4Fuo{RɅ'X\m6u1A{˧b&Q1&8$/1G5!/rD8\Vo.>5/$o Ўw_+Oxr$K jN4Վ4{ba?V^Aj ' 9t/p躎q?m^3(Q'tq͏/>dja=r#sؔ <қ+tGd$@Ͽ3p׵#蜟s]aN訾աy)*1R!%ޅfJ[//FzKwˬl碑VIdΤy{J1Mo:_z+7w YCۉq#?me渎|Zgwq9UNv~[F34\*EkMT49 P_Z@^?&)dKnSrxs;~3*}Rn^:[_ Yeo=-~Kej;[yk'C&D:guboPU4~9Q1႞Խ??CƂ _q6|x߳ {t)/۶G2lr|yc8zBqxx:}.W?_1#0|)\;; 4i9w6Zv/fuL$EBȱL6.'*2&r~,ߑvͳОˤ9q5:v×g;zu$\?r޽r}VWWuy8D;PU\|8!CYH}x,Q׵?|9fȐ,OGBC&zDuC]ֽ;6''''.O9j*;D?A4)**<8*{f2gH @HaJpprspEceQU!\-kE',h!Ǻd@P` H@&d2Jj&=~=o~r]j2ժYTuG (dXJf{T|ƌG#nFm4j~1g@E}AN|KViQ4s''1% <t;~|A=ng+2{:Nj' :YpsFf}cyz7u^SkzooY,1bNn }MW=ʽ*!BN㤥tc&Uxeh뵇;L_1a--1a 'IU&;# (Qu D-=:! <Ýܚ_l (& \B;2~-2W睝>=Y1/~ֿͨU<S;пϬ7ݚ|/ۧw2oLYRiSpx/-gd"?Mz^Mcł5aԭ/{ORZܕAƐ'ٖړk^[NDy۔Äk8Y9xB6Ϭ)C3ҹ; 5- yX&T`0HAASZJUUq8]_1\aBn/$(_({pF&8eb *q&l~ͫW③@UUv;rt@VBPcZZZD˫.d6}sݴhEו4F0AR44_j~E).TUϩS%|Gֵzy{ھ%o>vqb"y9=VG)jbdg 6(ŽnmZ!)IRR͛5fFsfrk^3ڵRMbOWڬ8Vky.*5(!(l6Qj. yqE/ږL5hUJ'xe3*|:V$(M-O~IԀT!{p$5$spr*IR ^5$8IP! $5 3$I! PF-σG2 ֩Գ$닗DQLz)SJ Y*%vGc@Hf\I+5VV}|5hjMƩ"&ĤKJ47+wƟj3 7Jn)^;l :Yv^n J)B'!Dʛlۑ @ *bq(+Da53^SجZlh vSa奨9yK)tj$m:R#ԫ3 v=#.')sD\)'RPr/rOik%=whhug RIBTεiJz3JlQ<:tl*IDnpñu*2B[=dF8{UU֦edfhi*ք\"5(]' %QEj,ܢbH$q}CMT }?)~l(aT 8Fk[$4*Gx 91;ؠwŪP2,"p ]7aڱU9)޵e`R J[%KwQTc)B(..&+0`m͛#-33l&N47P(ۦ{$ۘW\\e;, ƒ$̌6 c}p}E9&77(==:t{w*^lKFz]w^׵k+++M$gggw]b1\q/w H6pT뜇lğT@ *׶H]$/fF<6iӕbTC%z)2Mf&,Ґ,3r_OTi DZ*\uiJ,-|#JdFKHL/|dI μж?KeXcdnؕ :j)]%s玕+W]hQlbx6dz{ΕVƳE-B}1ݻwJTH4-Ҏdh*}b":P0{vdzwn޼Cu v+- SEe5Qk~E-ɺ|6m\l5k4i2tEE۶o[r?gϞ={o߁A"s}= L4i_eUŋ֭[w9H®ݺ׼hNNnƍq/KVר(B{I&z6?U%bT"p 0gH*4GBI e(i50RgcgWD6CgP,k˪{#k^#~襗f@~~A-֢Ei|xQwUH(z ?/?E֮%KB|7F% iF)/jό3fx?oܸ Y1MJxU;j'й&=S!d߯u?V\;AnNtAQSQU}N8L~G]-@r?4Y-OpLJC^?g3M0 vϟ}>ۧpgtdKjQ9>6i 8o$gF?-\~.Rž 3 #PirE<T;Ju̸ h"k=A467Nw,yԊEE@a QZJA} Oԁ7p440,v#Y}'믟{׮<{d\UUxbVKFXo7/~eq1o_*++[4X0*++U裏̝;wċjدo K[z+0͛5k| J .93fpÍf,֗[7I/T7fo^㟶Zf6 @YZQUYrrrb A#HD1PmܗVIuTU{}c63D͈hw]uwmS .\p?wX-hT ר$?Dcc#ZۿC_rLz4mnX HQF0]MMċ.z(;'4X,J՚N`woXՆsM|^ f\On֏}M\r=2w#;/1wp">[?)y=MNAd7^z'g۰ܜWյg>9o]X ߚr/_xw\t#VGw;/]i |=ݗ = 﫠>@7'#zS{@ˉӑuCCʬc%c S* u=5(V,* ՔBŒ2%ý0]C.h$Ƀ'iXd0I8$D%.J#I@ZZ<ږ:`#mT(x~C"hD9w% hQkO򸙢f='luI82khİVP-?4B BXYfW^u3O?MM ^zř3gN:5 fFZI/Μyԩcǎ}ul^ $W_p.\p=U-Q2IuKz1ݚքY3-{n(!1iW^̘ЯH$##aUMY-矙nGЈu&>XwWl.~ V6G4+~|gG/Y5+Gu&>B̊Yi#/599ӨGծBQj7z2]Yiﴉ fMlottnǶz[\5W#YlKe!PFf: h-g %DehU dR ojgk.A.r'؍'3a;S$6pqHr6hBc(& 1 !fcg1,^`?@'` AM 2bd J 1,2> ΄ஒ 𾥔rK'ԖP恁t(mG:L>ӫ Mo К{޵{kӦ lYH C~Rzi>쳋-ZxuS;shF?pQd֭/Μ9eu}3?Js=7rI$@$,<)IXIJ_5kѢE fϞ}y,k3?sKw,hvN!m[^1䦔B5ez}^)D"QVOg@r?#3Ym 2Ȕft+@S%uG ]nQ9)% 3M/3x#`Sb5LRjhF;^=(rJ)@^x?-_<{ӎ+ L3|?!~d}&*G} qIU8Ui||TA!~V53D9$4P `=lszr{j .5C#N/~왹KN%fh5Fж engߴhW|Vn{l-$J ao>R%g4xKC,GĪEQy5(-IY<=%[n?J$jN8`VTth=! #@LG%N!On-/; 8O,mٲU=z鵵WNK/M[6m4;'jW4㶱G&fWLt1td[J F^I<DyaCBMٶuY<ӌ7 3fx Zeg8C+F٨Qv("\S;B}OꇟpLX4vv!B=MO{iOjX4vwcڌy>ć)g?ᴷ4pشpSӪ|f,O*~iʳ?WP_n]> y 57L-''V]c^US׋Zv!R{kD (zWV, W2q(KKTdÍu!|" QbHx"e?n[EkхbClM&p8V,w 01p#:T_D(GZ։ib̬,ˬl& ̙^? /_>bFH8ը V]cLsǡVV\^-\UIЃ|4-%$$@وbdF>oGfK-5>#Fp )#Nd B"0\$ t).n,d`9,󶶵FUқH$K.-ZKJjj[@3➲hۥK7{jl#ZiSA8!@`׮~톲ifee|m0 /7/ւ NE!0Rl ƙv@U:jB9~5",8<2C%`stVO7z:ܧV]*K1/[\EeNH&ÛwT9@K_f\y(p2Qt帟Y[5av8%[*@-:@+cPMQojD ߬Ec1۬ Բ^/~!h4l%#LߟHX<-2&܉D>~P29uC!Oмќ?aRF`0=#=Hx<PS]76HRHOYnAڕM <\o-$hL? ygj$̸7Õg-G \]1b/[:T q K7NNsEZ]@ NATB* -W4V8ʖ4A$-5t4UFZyF }!cPShs t+ &9J|'lJQѿIKKtc1 ?\Rc --XBH0Γ2ZeVPڳM_h +MLaXؠ" $NQ;O-6Ua@e7_]\sI< . m% MjeR3JÏ*SZl߁4%B3t2$;˯Y2#7p(-e_Z-Qj*y `P%% ' WJvRgqz٠Dx ` 1[|X8I(K_:.OEEoQOŻA+f}:s:Êɼʄ:Iq Py 8RJ.EX(Pe`%C7ʃ} UGpsLkd'yFCbP$)VrN$шP<*Gj# BofD)`BP($M+sIp'S6Sq +VlkkC o-P$OX:r4Ca M@J6xH$&w' D<`6c bĴrۺΈByX}j<p@+myQ;ud(Pvs rNibDppRBnHSV{a6T]FcRt( ws78.8O=`IM"Ƣ 9k* |>o$#̥YH0Yv>D_X֙șlc`px){L0X)V\y)}$̂Y]Rm|#GPnX#/%2<@?y^P<<; i)ҬU!$f0/FpTVIHģ\jwu9Y;kM&9x.P~RtGO75TXu 'hY 48)؅bv!8r~;ODy:ǂ 4UxV2y̠oSbcCN)VΓu$Ea~-{yz22PR] 1 w6^=̑8M.F׭ 5ؘZTN^,U/6 EY'VH@B3)ʢ}$%v.je&"6QQ@ƂXr='j!LxAUX0IHiI8[^;-US]!2Rr=٠XjbW.kX%A˰C4$Fq[uɼQ;D[p?GNIlb E%o%AÄ[ҷG{ JSֱcbBqcsJl *ʺ TOt痰;ZD&7$@ZqH ؏a@S\7J mLDäw\xaLBMKR #KpPc,`cv+ @YR,Y[y+.@Bnw]ٝA%λi? Ƒ%="!$! tnw~B(Cl"^Q9$l04ޘJ&GB[ldؒ$2Ss'V@O'xT5tw%JDM9bIjtE֑?ͨie4׶ix|r4ŎjB3["҉@Ѱ0aJC8md蝉,)q`Z*Q1¥ɜIhx3AV.Ɖ̠IqH¤IlR":施o؋ C qxHG$xJ c :8Y<] /6UODuJ= U,tC,7ʵ_Jn0chZd*ۨZa(5JĀIh|U-x@$J7@7"8plA"3w1KPa7N8FFI}ŻَDzya\ *+ ixA?,Bt~P)Ō>c5lkQ }aSJ)$"="Hl̏ӢFGOt ^R&@e @39Z Da5؉E\ږ%ʞ^ƦLA+pF W !\ia5M(yV^2s$-#،d%u H mIld|aqJVCx~ςHLQ+PJBXFbu!Jx8n)(q08)x!ܒ!(\BDIRWyݲju1 -^ku%VpW;B>OI uerYgMl ʂg.HsoD_+r;&0Do)ΥJ_1-$ˠi|3a/'oPP4] 3U)@%z[D %#՞Tb H*i1ɹM3MFV L$q _☴z(R {PHW8u&$U9)J&O]0(v""ы3*u%$&j%M[\8>$4vb\hA(a Hy"QiԢ- H/qC#u`k :3G$^cw0p8ac9y~gTU&Lϰ3)np7Q'LXP}:U!Fn B:%<RŸA N WŦȩaQAyM1ւA ZH1ZRlF*-?F|vdmpÉPC$߄ސw˥X) !N }ZTNutJVY۠DB B/hܱ:kbhZb Zњx:-0/]Tc"r߮q?4N\.MVϺdkq?AY@ΣX[|hu]Һtmuɮ~xq ]\G!LZȱo3ƹT?46NI%1EJ#=Ԉ)+%{K,kCD78TSLB$ k.!IjfQqPzo-gT s2*e ?'бF&@'PX8mG#lژɜB.]^ |bGd:4d u-J) a~`@y ӆ8!pf݉tIrNɂU*]`'Oѝhg׼[x$}բHj"n$C$j+Y i}*8obǑ\DM<٤K?ˆ@Kŗ3:4* g]4M$3@c"?Qu$ԩӵ+){>ȟ O2%cF: Gn-v2G'O&YnˢK7P0FE>7rkqRD~:۷.1ʦi/kt><9MF`AAAQQ$mYRg|r4aQ 7y>+*+wIy{gGM)pooeԌBLj(0JcXEEEŢ%ՃM<@}pD<7$P]@$ʠI(y'[=B"ut Һ.KPUB Jv% yݾ7N,+vm۵[ful/;)y7j¥3f߿3 f+˞u΢ӷQ~(%8P UbѪ}(HaRR"OBlʧ^p]n_vk_ߵ4Ğ1Æ % lkSj$({ !A8\(jzD"999޵377ٍ, 62Ժevr63fV.{ړ 'b1Ja_ aB~)dfT h-b2Ūk.*$zȊqӸ_y O !bVT%v$,\DlB #!!l4"Е$z XA!AI\I~!FP0D%.q f o?0g{9\tã˄?yZ=w)eY;{q۵ns oZʞ#:mնȩoo E,[ns)=|>#OolVs)kӶCBOן=}ߜխe-o_wrpc4ˆumݮ/&AtWpXև?nsܢ*sѫ]m:u\EO + 2J0 P(c_ MÂ.8 \]섍hI+4I_v2Ư(. tj1RbM0H<tve1Y ̺>xE|* tHwY,` Id`$$48@hX  &gE/DpI([}2~uV{~aI|ׅH͹O|k? K[ytѺ!./Dy-)-sw>rуk2{M7n۽eo8<)riռ gΖ%ڲV>~\Rqê8,(tLJM*tƀPLUiZѺ1hD{6Q.5 įdr"/87Qqd4Mpre]D `=N&qƉhiY~ΘDSȯ`RjA퐩 ^`xLv/0R܉֡bG'F3jՒ'оmV=.X\{ZxN7<ށUYfASz+n9ckzƕ?ˆNz*]E7pr.={mqK,`sVy[^OI#eϏ:qie'v'?2-t0hFW>وx1jI?Bqi)crxOjȬX]aav ˲|drך@,v|4j_ʟ ߤWVafԂeJ6mվY d=soVFb-J?y)[z$òN%K:8. 52Mq^D/@Q R- H)&JQA&9bR( `V.G?-+ʥ._y?.>zGtvQqٲ-qүg%Pܱi4q!Z@"j"X^8BFnRzW/޼b]SuC֚ϸIڒ>,5#xm4R2ry?[îGw~ .ݼ/*7,FQWC.ۗنZ Fz_#u|2O8gOYЌ^}Y8ݿ^+L7#;+drH 6Qg&$hɀ!?s%k;;dQ0\ RWRڽ IDATOxr۟SPpBbp˱# x2z;\/wG>=N9 zxȺg 5%7P}E Ji|W:>GXn[dÌ.Y.}~ݻKBE3>o>G\G[@l1oxY 1. dw\5O)*%"7IT9Sim<˃n۪m#ǿH?to,촙3>sj6MY97t9yU/.۾Ñz׫7tN6}׸Gu:lk{l4w}YOԣm˖{ĶS4)<ɹW޼d@Ƕ9斷T&M=?}X {x ~}`O;~c{O=eA G.ҩUv~9뒧n<,=^1"I~7lR|Ъ{=2ViRLSE GB2 ϒUdZ E _~F?o~ikwXZ+cg.9n b'G(Exٓޘf̛' gt+57?_׵6.͒+_Z3fX#I\.GN W']h%L5Ğ= :֗OUNo?Sj_W׉~r*LF?y?ž^ 8^orxcrԔDJ[ @U*zi-ลނ!CRTdMpcHx%~ Ȯyc|zkMzod}$lU?Cw Md9c՛9Pkj"@23)s,ũ"taNV܄4SRP԰o' PlvlUqM?tuE1lWTF]$|3) /^q6=NaKmxPp)ϭƩ%>&A/!qS.g0v?Y\fv9y2ք$eLOf,Zkeĺ@yqō_D{Jj3|3Qd咼\M)dJ2;o麲M[6.ϓewS C$D֤ezT;%Ntҁ]~T0* QF Q?ykM R7[tPc?P_鷞)?uoƂ[zMWtu50bp(H$lZ7Oq+wSȌY%tKʩx O]>YwV1ymrcُ̙5ܾ&HiZRQ6;\⡽_~m~f>Tv}4=f6£/?N޺j[ЅC6q-NU5^SJ̈F`p"?y|L]bIfg~BX)jX_QW*>FKKK  HWBE%Tr$DfO>rJOǯ(]aIRM"Q)9~߂ ۷o=+*.}lHq \tsIy"NI=3㨊iDuI(EwTz_6rQz /|jnm +ZnE/WPq_SܟQqNѡDΠpc[6i٪eku֑G: ᳑EcCxDU}HagSxjEH&W˨3jdX$%SZi]FV3/0M@^SD;P?n

u8i=YN4DZ2cIڔ[Sm~,  _kgjAgؤQN]|/8ksSUd_eNT>˕bT tSܳy=<2nu*I6tNR! jOo >6W?R2?飒Mdti .vъ3!i]J _,$TO#@]Ju$m nVXҎsp:I{x t`)}ޤIoNhm_n/,$|{{rӛ*W픗&((J$dA4M i|:{P. *> j꼘(rwkziF 4)/K Lߞ۫uD?[6,|ieɷintt D]UnK]3n:wKOL4X6O YmJ9g#MM:Jn-ճ!CbHu4'%;u3@"E)jph}&#;5Żg#;ɅR2)ŌodQs'M q=M G ɳ3:9[fc^x]رmQWqfn|N7 :d,YęUH/MJ"z;Qh~6oGND+Ov]7W6gڻht‘Hh2E)JQ }?,Xؾ]:Ȼvi(זGc_=)E)JQ+<\?k&쬉8Ox,SR )L(۽GK(E-J(E)JQ-J!SRТCJR`QCԪM6uer O)JQRtQT~.nD#{K{8c{LrH4uSRbڶW/+~n /=ሎm[=rCQIܷ\fūY;{q۵ns oρVJף44:)E)JQY)MQF3 ~%$'>_UZuHOf:E)J:5Il zyh͚oOVR HF19g;eW4ڣbIҔ:i)@)%h?+**ٝRcu8Ev|4j_o18#0DBg;fܘ5G%Ҥ Oh4ZQQٺǔ}jj>333Zj]QQy1E)JQljHdV&sC m G2Ԗ̘ai=Żg|n4=$SQS'<UUUXMuM4WS]CM*˯(E!jӦMAYR|;MN mm TyN_\޷}#'}WoR$SfNxbp(Wh(*ϯŒ\MQR%|au9afZ@_?W6]v>`(Lh_p8Ix^wE:t6Ew)wo9j\-kދ}RnNQm| x>ӞLOxIL#*E?yHRRlvlUqM?t;)I`RR)qʔk^Ydmx.O=v;Ve;\:ϑsR^j>Ҧox\W Ku4;>C%s?^[;̟~bfǝnR K2];Y{ӟύܔٞLQaPRS\h)yӪcprƹ_x ,_ƚlpӑ>`M@p51o]x͎)g>_o1gxo `߯s6,_ʏO9CǓio,`) II4g?ngwk/zziG{oc._ƃ6e9_>b?٪QN1BRt![Ņ=mDo&viq\a眤33sVm;8{?do?dySCl2{^f {oҩK"9Z/ o Mb{WFNf?醠ٽiK3?e@(=wg?ē~L5aӛmgS0-3_xѣZ=޻yuQ3clSC{iM}-< sς~L'Y$=sւu68o#s,aV,k%dOxy?{w-l@`Vb*+i\hQN+u7L'= / x L:7AƜ9+ʄr7?{EG>ͩs'=3AnIMyzQB7/|x&K`o3w/st=V*p_Ͼ^T]pdtl\zNbfkgZWu9')y;_p\3'"/K%u!@&{<w(E):đ)ǬhE gc{W #ޱ6;Vf~3O>휤Xjj)tެRf}iDQUoͪ$7 uE;(E)J:y{yxjGdKevѓ;gOsG"(\G辍f)&Ǔ_ީS6ZkIIQ9999lZr.E)JQL 6y Mxye4Ӎ{?+r>_Qp~!}Nҳ~#|iޣo{g\Pl/-x8Trߺ 2Z(")Y_O?gnݨE3R?JQb{`$: g2<ƻ2{~5=~uWO 7c{?K/7'wΉnۮxGrp(d9bJW'0rrr~aAAmmgee䥼(ER:0%G j n~gmIzr3m,ζI#wн=NxZZ8➷ߘؖZ_qxkDѹ.xֻRo @FzzzZMbcR)J_?~|wqQ4ZP(n:E,|gc>v`aw>vb"4t\#Ğk^{32ߝٙq# >f|;/nb3i$pi!vE/քMUWbEBYԁ@ Z_WjI%0]'<1Y A@ ;o<,f/VrW!m6tZo@~._d"t<:U@ _2@~.`d@ /Qzd)@ !WKQ*=[?xㆿ-~p@rM8d\JR*UgR$ .{@ UVLŢJh`D&& xn3!Iv:eb&.]g);pwuXl`E1{&psha/1ɻԷ86g7Q7A$T*T"hI&fbj*~6#TTIT&-VT$ng8 vڛ*.B0S~C>i)QB~89 ",Qi T"DTeDU%BabbR$T_!i{fY/t;o'>eD/JD ׇͻ֥_\}mh %>ֆ d"@dklktRRrJRrJRJzګCٵxq\.+e6_1=@ r\hCܛX;Fm=zԩۚѠV֩V ׌\q!SԮœf-hɭ4- G$ sʴW>+h1iގ U8Z^M4&gq(,۩p@ͽz+]Hf n˃/ =( CI-ԣppw'AàQ ;0ؚZ9+ٲےA8wtWPWTK28.>I4[)icSh'Ƹ; lZb?I!XL$,uD IDAT07ճyNgz~$q+}i E/ˬ3))ƣÐe>eg/g+.) ͷo|RP{aK'N}<6uk^ejHơ'/ wtmaI]Hڞ톞 ۻ{1;тG;&wnu†ku&zyt@6m<_p- )>Si8խ~8bdg_w7!K' |YHz(>LAE&K/wza^뉻&j(Hd\}nj܄ki Z8}<.K,XW\(ޠÑ-hέen~2>dpeOΟz3eϚ.u+>Ь/?ʑ{oKz D%uzg{̞4'scSܙ{ty qZ\E1^ bԽۯ IOWLm?dedpٮXHaqvEAjâ"&OQmYT"1Psŭ해 O>ԭ!1뱁0QTyRObZs@QB\/i5R䣨G=zif,102Aj:4B7]3ή XAX3ϝ=ww.~:IX$,:! $I׸S7o N]5n탼 [T|6 ~Tc<[r )9!>ؚH*ǐG?cv2-!Bl.La +HV 6?uA2vT=^jߢC]wR{r˓Jhrh[$T8*L{X9z8K_$"=cN53UciB3wNӦgS+&:KY Gma0ټìC}|/۲t`}^G82 uZȶ=6}_Z|XmFV4 oO÷ϖ$QJ-~tdz]T~@K]fEm= SԱc]z4`!S;z{:QcƪN dl(ꅿyZu1IH!L{co`E~*(Z^]gݹbɩ^^^2 A (.P2ҟFy[ZխPB';:8j .{is*O_ JӢ ^xuLGZ[Z[XXX6U~{HDbJJ B򡮵u,*APRHDG6(#!{u]Ï3Uǩeƀ^1"-!,wFL&ѧDREqܻ8{{{T]TEOwX8#OiK5nTԛouȷUT,w7IDloƅ=mhU/7gΎ 0*^1Mwh?'$xa׷:⻸:ux<Ti3J> _jV/Ȅf^? 7}Q\:]kc1Է)<؀0uĤϟWԵd0U@ P ˏl^L`zOZqz扔Y w()H i@1!KÖ\Mk/H-C$y<J511hd1 6`0P1ZL8UD7,7sa*ވK!Yt۹9u͞]}78j?c3C L&)l$b8`X@ բ82@]+$c C\LaHNŏXu/ɋ .WL.{KGj{N={>^ؽ, ŢEve>^6X%ߙsdJةݘs×GR.2m0+eEcϬ\eMܾ5zH>Ԇ1Qd(Lr}@~ep\LmRں}b T[@ /#U*RߎT*D"UM@~@Iѧ'"Ǖ)[;|kw>_/Q[v~QPJAO#HQo@IdB?l02o,im)FT3"(P(LD"HRDO&%B Nj?2)?] M$ĄwP@3/Mp?Z|+XϤAUհm87i\Jv+RK='}e! N {҈4%%tl4Xޝ7KIJ|q|@ο#WVSrkljC^.\rAp ^.m\czAr΍ C'_$%; Iu;EYRE1j`Tv",yW,_&Yw׷msyNӦ?4t)}۸u5*lXqӯoq,5(drkba҄+Fu8t$ԝvNݳؐ"Lv)q= ={9s $oHO@*MWf;(ǣG!/}T5nIT_LP /y?,. \tٞRrD̶q%Ly(:%0H=ʾ6kuۆS^kCyQIA+%=աgw'" tu>q -oP\h߽AμÑh_=0*(+ͯZAsnΛ{0tϝ5Y=mw.M80*hkZ`Kznqk{]/*."ݼ{_W3) /0u}3@"+p{MIz 9~ZG.lgI^zndy6-K+WtGZMFy1!E-F&,/zcb`Û+w0^n>5{Ǻ)r ɍڻ,BPLq9F*Caއ^'MpD>L }峞%!{NmvBLTYVk$E]ӥ 8yؑ3޾yb1&Ow#i[b-薁]ҏB `:|rG[:bz_"Ǻk+=o2|Z=D1m=|NK͋ ƞL4> H1n5p#XurdH,S3ԃ (L/iNa?bHQ 4*II͖ *P-z;QK9drZn^dR<y>ˆ=VN^rvt4Iػ&8^ټ NWjܒܳg|{v^3)ٲےA8wtWPfтdډ1N[V=|/8(m:&in~'=Q۷lxݧ_/\Y8FD@ӡ׿ @%Md؁C<4CB:~i& e*ip9%F$)Ekzxyzxyz-˒lzܘAZ*)\kf ɬe+:bŠtpY٥#{yxzDպwv'"Y߻!Iׁm|TUcܮń@02Adbl2th>dЍ~Ċʏ> ikZsЄ?(:]-?dga.]_u ,hފzXl tټӚr l?toQ@+:bdl9|<ܼ:Z}1Ikl==ew__/߾[d32 9g XVLp8aVɡDxաUQק^&Խ 0d7Ŕ[~`m RkONI]SES$R)펢hRRL&C5HoiUB B?vpp qQ̬>Kn?7 H-ARtzddz2Zх` RDRJJ2B֜.^ںGAVVgS($"'z̼$D] ٫3.@ ? ΝceO9_Ku|PҒHߣTE@*Q΁ks3fdR&ml&P2<u53U0R=GՑ*ʊ*P keE$c?:3ñd0U^k>L-5Q MB*@$y<J511l^ˠl6 Ey/ש԰Ӂ-;4wz>Kߒ ejh&k^Kp/4m3+*] ;1sc![5p/ @`2fffU̘L& K@}dBBKoBI|wWTa昞Y~+RXofEKD̋mx'&1-]9ꯎ^S  HȤ)qaGZ"LzuItjE+U z{eZq*-TI@ӀcB̵kԈ\T56@ PIS(dZ"LUi/Qvl%+U :ǵ_ &nĪ^R%'EإM)ZzQU@ yaR{zCBXaڹO}^4,OUAKeP× }xgU)%T-,~=kh \*ɋ .WL.^a0Z>Wm @ gzط:|Z-$K+MϺே׬bN5Yۅ/f͊%JQ| w}~cΩSu@ H] a /j7ڶ7u RKAI[hSESR|%vt@ PTi/0hGW5pGWIːJR*JRI$\@ F&H AQTP|AϢœ\:)3A R@jBERI$33Y,p`p@ z&b333J%JfFd=KS2A5jem<!CR LMLJ^|I DXTR®Hޞǖ!vRwMk)/F͹yʤ66vy%ҹB{MݗYb/xy IDATJB&wu6qɵW E hf-|)[H ]6I}e҈#));G7ds ;Tبfw0b|rbKS%l{ײѢhN̹ srS<Sxm?fZZY{ړy<^'r kk2.9N`f8jw=V_#n=B=7_ {Y; YWp} N4Z'kՈ{NWu:j͹9i=w"[$fʹ݉ .? 2~]=JP!2=MafG1ŽZNW T!e-=d y$ȱ GxU&wN?D3 PI"^qx>RҚˏg1y^=H1[GIEZ:/y+r0loQ`H80Z_# |.s]J EFզ>2q}^1"OUs/?_|Kތ-hEєD z6WOJJdӧn^Vu+P(4:=:÷:Ivױ⢘Y}v/'ȷJ1A‹?>&N}-a~JXQ| <ζQvm~- HT YsrM]k}YZYUwCPHnρ2~ts:Յa +)6ut\iUQO#E)M}`Ac֏v;C Lfܻw&&FLKo7B%w*MM4W?UQ̞gPk0K#a?ڋlҳ?ڋ Dx<>֭0W[;۪'ҲǫmC{>llaԟRk%a0VVu BBbBت3s8++KKK+QuN02AjHT*D.61R:f \@ c"2icQ#϶ȩK5Yc j~`0* [T c1odcפݘŸlA& ޵U};;;}w+._@ KZq>S˃SOߟmFϾԤ6jŃ!C ^o $^NƢ!Uk5WSϿ׆{bREotOL0U 2S 5R[Mv6RWG lj{:13 =ėOȁv$]rM*a֡Xߦ6 9Ђw{&EW! C SG{Q97!ƌpWϏRj!N _$*2׮iSڛ՛&`ZZ˔->^E)YkspQ#,y?<#Q`װTqk}=qZw:"m;NpḟWڅ-{$CY&`/p4vDUb1'"CLſ194YLJEإM)=!ȟ7#\M:$LfdR,T]"&`SE68(*ɪN(] @ e*#-Al}S~>~)&ވ/ZW,#JCנ(P(|>qgaQQnvFLJ1j3%2D_?-EU(>]{xRL@)&*H$vi@RI3X,c|;KMD02Ub҅X$2PT2TofALE^N@ U3h0,!%SFR-JUTTdjbT* \T(LMLTZ +6780(xK=@X`S 68 %^IW]{P"\<I ޲:yN~Im(#_TGk>%0̾<>eƑ{zx _qS4B\|f@wNW^IWT &_9k[/ONÖTyq&ybN>^}OSJ-7%Ʉ}& +V]>ۋ{EL:hx'OAgڊk@~qj72@7֍+xk xeᅕ mmm---mmmmu~3 ̫:nqEYw-ݖ xxfCr/DqW]|~i3ߣ+\6}+ïo WHŽ5М+yy |"␱6n?~xfbմr; 4U,}X}˵{gVwf@~qj-ʽ9$g~><˂wOWBS- 1!O+HzzpeiiOkqTpHcvO'y{y{{y{{ 9~D&<2S/U(^NFd"kP{燙D:)H R[ $첦 V )A,u/~cm $ȿeKUdvJ:J=h`g@5r`QȤSIEê]3;8pIy>#VoNqp…xovD꛺LݰӁ-;4wz>KU ']:LaxIυq#"2""2"" D b -սW'>JE.TҀStT*Ijaч}Ց/`lYmF2mjIOZ|mJ7UX%׬8SI*?6j5򤣧F5هnۦ ߄~ BwsNU&AjF5^2C* Oߋ{hUhQnd՚ړXl^GȨ*MXg[ίy`ɮd9lWGZe*.OȟEmF&]H*e 6&Þ@(wF>&{}rpL):XS$:hSUI _2i)12"!)O^zt׭49<;#5bdBL>:⣼OHӰ|'lMEUBTW՚ 7UŐ^MpT&I^ n^uh_?`D*Evi#-E*KNn=nU޴2;brd·l=cή緉b=`ϖUM2Zm$v+\nrZcv֖E4m!?V0Ʀel L誈_v@( k|{ǻՑiCoJxF,"Gz/O`HzD<:ދs,K%l:Jv[ۍ=- NXΥn;Ƈ]6;(&%%{xyd2P(`u@+⋯Hm].$@gߓMPI2$T,/zcb`Û+w0? 8UK6wC}|%L% ,@PHDbfMLtXXOD {eifկX ͺl6.]ݳ|ª7d͊ƌk!ϴu`09y{-ʰȖݖ :76FԥXӼ6_D9vZ~d bX? Ǹ,L׵j_O@ 0̸oMLfQTX歝Rif|܅@ G `㮏vOg MIK_$m`3g:pT By)Gش)UuE&=̜y…f͚Q!?p!@t_\# ^1xެYW bМ? 3nykf[݋lr&nmO)nRJ% T qGpH?ETrG˾ݳ z׬ *s|x͹[PxXD}z*eSd"ek(NT*A&3hIyv#l?ݘK@nFieEFP@w; )l߉3=f`7%׵ >wlx=jOYj2TT@ ALSfT3yT)'"e(5jpyrQ o7?<Vt$ퟒM-\+qe ͹ۏA>uMv_obiuq~ $cz|,.s{@@NJ36qӌaK.~\5}&UN 9R|ˎeD=R?LLZHv_!LpֆCXZ}Jf=vDvyb j@=lXO9Sl뻖^ /t%`b~t8Vt0| gH1 M4SdSe6SJ7x`@8;L6%L[UR2? Fb&JbV7@ j72d)I&$VbȚΛNEzL %e$a bJU2ܤTs43ќ8<\8) Q>( p8\L$<+WB7RT@)OIdQTy]ŔB2JA`p@ zT"ug_kAMr6=3؞8@5gI~~+Mf@ҧPhfF~̍X!Rƃ]?d$e!UKV$v,+ADWytK)@kf@T`a;o-0eѧr ( ό/뺦#0X~3tnB@t"NXǐ7K8jZkSY%IItW#yk3XԝdޙSedUMLRzS @J &@M,%k),z>Z7'P`Dor͢{9|60ِDe#۰VPAБϔe4}E^N?䷯)s4Lhf?x1yh%. <9z'xEoC-G&IHKJhMdR*(2FrO 6?NVxjw4+H[54m̪ѣFX.kH+SѐŇ,m$.F4> 4ɥSV ]YrNw#<8) ܰYJ™U9U%ZCB{l7q`ĔsonZKJRHZ ڬV ֔L.6řLRpH"Qwtyԫl];fe!Շá*JR<%Dkc%$[.v̙~ JⲚŐv}$PQN77<? 9$-tBZzıA IDAT:r+g^^jg=52jf!q jccU!PcǶF@}‚d0SNN1Өadڰ!@Ro? rÆ7M : ŊD" s}bBB0̉)w|3(3."::wrnTeg? Eʪ4y.6roL1iM߉Wqۏ[<C#݊ɡ)@O"^+^.88/t> ЕnZr k!권< ]dLyZ^fbV<0- Xo?n r'kg%~־]p.Sl^\Bش9Rp$RDl ڲ%vrh 88lc{K+tĉ{/<2rG%.={͘y$~ay费3X6+\>#ϊ2s{KF3 + >瓢ICsnx@S>!2m5ʨx|dҜ@wgô [;1ismkeA !_<bdD&Rx |TQ [Bzr6V )A,eqܰdFoaBa9x4W-U贌8d@[:ljVJg)iR]+CJ/Ewaӻ9sH2ϮTwބ^0:*ݛד2pduˠ˿gB DD' ˒w  r;K94Tc{"AJZXa]߶닝TlwJ| Y*Ǩwt[VI23%.}$+ 9jĆlo l-CVBK!ppCȏvL06tzVlZ߭&͏5FԤ?4eF}YV+.8pEw<{ w`P^TLP_yG98TN- ,є)25K%9Lbc DZXYͻWo~|]R lk]]IZtЭ3W>ώŵf|MX<n֪SN=E!#sm2qӯ$))mq#Y-[ȓ3^X%d[Жr @5ԃSM{!b>+ tf!0Ϣ#.\1"%myၽ#|iLgn}I[.fZ h刺F1,^}{ |Biaz<f A]Ez}!djÑGOϩS \ 5"52іs˒)00`h^yXĿ^S{y$p=IN+)s/3cn R01E3Y4U/  1fC:s*m0^vv3]Y-gE*OP<_v ܬ:JP##Q״5/UM3E PrewNvϛ 1{M[.PU042YezO&Րll}OE]\k8ٻvq8ܜU W>S?n+xpa|b Rۊx;>+Ug2>BTѓ?fvoUͽni$(hTHW]v6G77p&dn5AYmxI=K1ɑ&iUF;𕫇w_nP:)"r/2Mڮ Z/>mA? PBmOږeӦ~{٨ SNR⃽r%YܶWݣ$>9ҷy![n7MOw\‚Gm \)ߧ#rw:e_%S )NLgڗ6IbiYgzu== XZ*J#TULgni5}N"6c'ܾT%B!~C\e {z.֫ܶ"7qDKKsUlW~X6Fko$º@(R(JnݺB4{XS 7snq*$DEQlm ,Q[ 퐼&~."^mDŋ2|RQWT9âۥ=+^gN.;8$T(L&&Ϸ{D">kb}&]ll͍䔤䔤RXRg>89mw w 5LRL肄wK==}S$Id6&Ʀ@&+WIsHi/ꊤS2UqWC3aV&e_R!J(\R_y(U Fw) Zh~ʼnͽjޗ:4EӴZh4E_?ŋVHKhjTm}}ǧ}3EIJˈ?D51>Ϙn3T}&%lťw^u/Y zDξQm<]|O(Y>ch5G2ր5Lnfm&W5{YK:y7]ߣ N%G~~ެ?qرGMpիWX0mӷ㢟K 3/V4$`S7%\ZY=[l~bۖ®3r܆n2 Bo>'^Ei<!D\q!V3VlFjzŸ{;{w?GµsNYsmޛsx7_ppɒ]I2%tlů߸2^l8IUu󌮵94̟Fj>!ma{1BH$rl/{g{n}mk;j<8rf"HHb۠othu76 оؗfCm8jΫX,]>!he+DH)ۯ;/:cch_l8j}iP[Y6с+I,@B7uc"ή+\O+b6܉t=V(lR_ b@ԙbUtԧa<7[2#B,3wSyK^.i1%sƷ[zիGm#)9p;D}96Q3%b`;}.un\en^>BEyQiG'mSYFN(&-=r̘F-z*0!}heUGc.\=o̍ ʒ s[Bu'ܭu<ʅ 9g: x&92u[Y+? #+1~Mdg߳uVֻxP M8˫rdb87:!f#UV:{yYtCØV-Ok8,3>Ӓ FL[߁2#-.S/W·p݇mbZy1+}DV,G%b]oN`THFM\G|o+G3/yG80pR{{HNVO3npD?`5tBgwβzE> mv Tʁ+~EG.(j+7_}h”v7_sIw kև~|2Kʹ|16ܸo7+_sO1!o)OH=L{1ߨiZ!hpVCNDrrO{_RIh_vƕ>N>؄bq׮zxx0UsvSb^-,˃FŌٳ6 (8P(|⟸تXϔwiIEEnz17߿E7/wc}^# 3d;]K~$gIV3nK+yPdxs 4KD}3W>ώŵ*2QM͡z9۾KWشڅ}K&ʻ=v8iR/ޯ!% !tr6S˦Ft< ڍ~H%zө> D8B iè}4,smuw& _)S[ wy-[ғ-W c0ܽcx{O?yi DYݵʽk^k;o/@5*J..U0 l6ZTOB!-;e}/ǒZ3AA\* >,M}Q'#_֘>ϑ I,BRNOu398[n6?\EƊӫJdU qܲ [M m|UyL<LEVmizò6ڦytV澨HM1ES/5^!\k8a+yhh7x} f 4Kr31:Lc S? 2Ik˖u=z?fz=t6Utzی\[ʵmܧu}x+m?%i{czլ(jb`U{-TSj I560|f+O XMj I56)|f-S]!iT*y&yF`u*KWxI,qjWy[ fɆ:(' 4Dbi`[ fggZ 3 )@E$YXXU$I*E ºzOljDThu ZmYrщ$ \Bv^I$sc|tUy9 ̀FRL&h4CVd23L MQ*Z]f]R/^Z"#-FHժTjLˤMӲ=o'Rвwjݲô& ?Kڴ~ IDATVw`2K&';~0Ǧ{StkύOI/ǣmnS‡34܋~C={ \+Qs۞Rlك+Ǵ &$欍piԕOt#;A5 LhtNv=_ge0u㸇oĉ^^ Mɲ +yIn#-4gVCwr,Cy;FL{֩IIʣ z`1jB: K_=*U%7^2dRg_y|;s݆qda8a6Re(I˂i85ߥ1SrPz&Pq=Wbo\$ф)o\z%撀֪OǴcsKzӤ"{TǪOLA ım.z9 2'U*{ʒHRFYz(d;bg~IÅ-qґQ9O~ h& Wz[C N";A:k0gzA*M<}'ˢ7oz⟿<^S;^26ݖM?c5vomzU,wPD9BDil>!۴T8nDZl(P5;8YHe%-Z5B*G1ӽ- /gZ?omo[z03g 7*dim3jD;{{"Μ2ok+#"j'`J3 p6!wZpێ_-)RiezԨ:%V_pg7Cqc[[UnՏ}e϶n?4nW:pѲ_WL U!52{ C9&%ި­m<!-'"_f:okhL77f`?սgX˘:5,P$/cWA MOT:7LO}JkGZlb8\+W<<ᾮ| 8\H$|钛h\,|Gp,99KmBZ..\!XD ci2rc0>8+++_:TŖ>suuUZ|u'޹#-(7bX,:{LCn'>yN,W*PA*99910i;"gL Z&Pb6mmeT'qBVP- \.mjF86 `>h@@r0@-Z&5 Ljh,2YePLh&IR5q.{ Z&PAAh4Z{%BioTfLs7$ jܘ$ xbPP^'qq"5e!HP*&Z98z%H>Ax̀FRL&h44yhj[LFRTu_e5_=M:~au٠ʍ(Jji.Mh*(}{*||xUޘgı?ijrKB&ЦEw!Jp`ވ@_?viʆj:$/">r7'tm4`]b0F2J~´j֔|[^75Osv:w阋gz\r.r!IB!EX~n|Jz}heG.^>-owL̐?ݙz.uۓ>;ï\85CoV˙9Ӝ ._?ѽӶ' /|䶧"s1-|Md^>^sFٴ\Ջljos>!8A%a241flXCdF!;O c9$zu5KSߓ=?pەGUrs>*8A }0پ͍?vnͶwb*\;y*vkBi۾]>irAdNT|y%@Eݷ_lK(3*+@V}TdabO1dw4J2/ Z<7c#r8&LLE^f7c\0&2J0z郤favk\m|d6TRB69l9x#"&q3!"{߽1 QF2Bi/97 7rݔ ; (yh!b"4J hD!R*i,Y~?Efyk}3<V!Mz5/ 恊I&w}^)HȢW_ٵe#Ph(\ k.e=A[_Uuq.X!̢y6MQ2TeKUس EH/(̙a#Y-\ݯnM_("Ξ0gbZ48 d\u!靋4C!Go06\R"#*@%>dS@=}L-\[ÝmДg~E>m8Y%V_pg7Cq[[UnՏ}e϶n?4nW$aaZxvbTNm憳*[l;F.~4jLH˦QQpB&SF{O_أa@?!ɹ%rɳ7*IJpk(=C!ˇW[Lk~{qm O1tTF~r!"E>*1uB?jXjmI:?^,W HMM Ն攕JOTn4^bqkWxxW}]"S>1+._f>E< y"0KNNb1fXD `rc0>8+++_՚Fb Ź*MeX,EgϜix'O:ىZU{䡓#h@yA*99910i;wO, xRtk9ʍ(Jji6F{4BVRRiуmdKe9.)kܽYyW.{]ה`>kPZ22i2LrM$q@h 3hdj h3 )AI#D>9k_)(e⑥c{udeI#5Qjd.'>r7'v .Im(7]:u=y|dX6-:s:4;BY`&;$lrdSdIK*އC]m̥| !u^>&OJ#zkuIjɇ~Ͽ9J%&)Mp`ވ@??wi Vj UªKתSuw㻦,s֐_>ξԼ{M>h@f?ʅkcI_X.#doFI/C}őGm~S!D^nuUG/ǜ߷(S6ͦSW\?]?7]d΅sGF|z0S/e-|vu_pfSk J3x&ﻛO"P7q~aJD?qcg{B7~*L:Jt>+Ng7uo/]cc\9VI%97g sOo!-<7?I\=-X㰑*+5-GI2^^L3jަ{!}p(f\iټ%e>Z郃ϬY-L.n~c)b Baiĥb Z47cQ9O~o&L[ռMeBY}/$n²"Eػ:<3Q@ TB9N {\Jvw󲇮fn\s? ]byw.קBZ(#ZtgZ5B*GUIrӅk hYh.d"4ҔBl*NDޯ h:A޺KDWIzt`}Vz5|c,6L'PT&n*B,~6_gվrJлiMge$B*' 0O%4)K{\D"EFƱ&#f׵7Zbpm4EF d07]Y:\HWSDkH~=+B`t1_ n"Dpq”'MYw\(r rIi"* 4 ܼܪ셤Y:ovoCLf%}|"썺s|’e@T27WWEj,S=_\[jج>~~A=-?BueCSCt8QA#ɔމ {YoCmODk׿Mnk#vvd8}9",LΉޠX6ml4(؞XZj4I[ftxH>;׌ܪmE:lydtAHG.Vsqێ{wUp?^q<񧣺7s RrS'֖e̒}  $ S|J%aFX,˽z劇;$cbF^o o5[,?D˗.O)q*DZ$ixLNJq8@+:$k<[U&;f@Wgl YtWPn ?~gee  oXlyaa\\+d%2y'BkJ# nnwyJi hܯeX,EgΜʫO'<Ű qw+E ū7m?]2xNNN {;DBGә/L"0 l6J2: !+ \. - \.mb[m|2JVP`Z*Z&5 Ljh,2YeP@f@4MB, q `&hCFuppXZ"hf0zJWl/TIEE7!IB(2X(H$½&A*B.;8" BTLLh oD">k0IQ2FЈ6Qmmld2IQ5MtlumU1MX 1+TuޗӨ#hRU>(7TjF)I~CkZZMSJҦE%Kh{N| !]}}LV6-zgX-XKݺ٩ګZ224Ig}vvϛ8i-X-;7/0 uU1Ї&I0u0*ZZgή{a0-\ Kׂ?ݕR:c"݂{x#t_57[IJiJѤ3G_`XĒ{M)*,{SE( Fv k!Ȃ;g ;!KMMt_ G9:at6a˿r.]OP^v2->'L*$~P?.m|zE~lS-ʥ.6r>:y]&OJ#zkujٖuj#fh3 :ʻ/~Y^KG=;g@@M*A*hzú/3-9s8:9g(v:?"{́[[;,:|ҟ Zǯnv|aL[k,>!TMܯ;_w2vR̹}y 9t ltoIf}@ jzo8~jS3_ة=-?MM}W"JoN\7賗No?yeq;Wpتmoz4TQz!T_?1ZwdZyY3ͦ库W.T.KΒߧYwh&؂s-ݏ<266cZ4BT],"w#q~бԵc*wB6l# 9R_&jU7!K`BSb$3)5EJ`rwOS ]' Ȣ:*SQP+ҷG!;]^fVͬ276W Q^ti{+" Ѧ5w׌֏1m}m?p'?]DH=Rj TM#x8N.Eo9?y-:v9d~ۤL?{O:;TO7rHZ93j W!{.# !4UvdnL-"lhaC%89!ftp>*]/_K@&K(ٵuB8j!HU9k hy>o{۵z*C!20A깻j1[Ŧ.Fz5|cYޣm*vQgmsrF862!@bV| HOF@,mFhgoORęǸ9%_T:7LO}JkGZlb8\+Uu_\I<4bl]-aؠjO|\.W$_tO}Hy4.L"p KNJ]6}?K-Ax,39)jF3@+:$kf( Z&Pn ?{dem t'X,0Qkj_^U ȃ'ʽ&]w"bX~9~> h@Ex<''Gx;' E<3_2h@E`&lReb \.ڇh@1 riSwke0&-huUfYeP@f @-Z&5 Lj > Ijhjbpd/B{2,)9ETb`0h/M<.X,2X"B:88J,-Be"RiWl6W3Z&JHsvqX@MTPPM(4n IEE7!IB(4}TB@\G" W 0Z&JdΩW^Z|V_B! _42rZ$I(OFǷwp~R"|estt_ H蘗k<IQ2qJgDVg_;Ow #[&z 4EjVK4A!jUj5M)03ѦE%Kh{N|#q(g~n+%~{ցޥGP( q~+!a/̂42gҤnmu:!D3xM]c:yO>(?qu'ccc.ٻ<+};-HV +,֫Amw\>}|A˧~)Y!H;LQBA*pm3x/] \wxR&Y6WH_p$+iM#31/dԱlRw!~~aKgjP;mZtfRGNN}s{bouum&Dg+?OU3m0X6-%Z!]fmf&on÷ySYr"CM#==0p\Fg+:4j=2VJHcT,|kf?͚zjuܦ M#78LTPf ϙA*WSsl5B;WpتmozFݽcMu'cmf#v|aL[kƳfdW.)~؋{FrJo/4)0#R7ҼuRs},ߝy[vw_1m6bջ7q럩&l"~uisxN+d ':wk'7Nl/a DS1sݤۗ7]?xE 6A*ɳo z`1S놎pm߶(Q Y nhu XΨ~X Bw[Z[ղ_/T4ۦMsf¹LEᳳJQ$YJ2PW.8z]D0_5`4g]ɷӺz 0_@iJBT`,Bfp0DȞaU 4I (>C+ZGlb*vkL1+>&s4BȢ[yu}9sOvib[9EiE= B u]iBNe;<ζp\oF 1v52}ͮ4ǡ-,|,-$HBTeL?{O:͞pP5o׶֥ܘMZD†J^3pr*Bl֪I"UoTW`t97S<,/RimO; )3R&*ٮ&h{*^x['|տ-'ذh!SehM޿gL?=EFaN3!OoE&|-f|xӼ͛&H(UN뙪3M(5. pm}5!{02=%41)=)2\ sޞgʹ{R%4BXs:EEiroSOn(PE -"aBG&s54bN=޹kלxV@ЈRkI&}&PCp.\-]Y>jV_UgWUEbM~QwIikB1Dj6cQ~^ƴn/;a:ۼ}S 0 3!Tp#C;~_UWzFH¢0` p 8Nѧl:.QYB BNzIWa4}>P~n]կ^1SxnjOtPO+\6oNC/OD!md  Un-eF@>^ }FN{rFHSa3&<L_rc*RON`toI OڶtoaXEBkiՆMGiͿJTSSsyAAC} zVS/s\; `L|[޽8.n߲ysvvʫmK1!ϹBb",7/BVfbtD  'c(3Cy "j2i5 Pj""*Шq;EhCHc "%&BH *4hkF@BBAAc<+t-!$DxYF#;SfS.еHtUuMS1v&$DoZ3]R:7)ޏDa|[Shs)1PM:,;]dIr:5Blnll ȲZ lv;Q(1@}ԳW,I.Ka%Id޽#?$&&]Z[@\.ݵ@SPuL46:\N}Lxl&`O-D ƀ`;nEQ<w׫ "@ȋzU#J_AJV%ЭC 5;@ FJ1ۈqHKK #v40]j}^_[Q,c1wu%ETJ@;΃n}[];8wxovcZsniGL*rJ+֞T_?uտx{GFԿ/㟬>8^]DcF}C49fNQv<{}ڦ,d/zhxռ[{︷F-}ԙ,7/\=zd'06W79 `~QHQi.g+/:t}ȩ]zI)o2{Ҩ!.2$؇kNOxu{~_Szv̝m׼ﱱ:!]U s'3/*zvPD =GΞpŽk\:U=?y.."py7=tQ~/pac&ŕж@ԊLt$ZO[`?롕M嫿 3E}CDaG'oBfCٞMZNo*^U27}ł}θ7RM2nOƬbGɺ9}5OQwڪ-_6uǼɏw%ܵ}[L͂IMh~טyWv&Muy7_.W [ƷGdBʈ7nuoQ>~qVoZ^1՛~k!mmݏ˓2*W7e_ۀ:KwvCsz@v]:o?k QpQqw1KOBFA~$'d:~lO_?LM2N*%%qul{rjL@x f'R/ey%ޚ'Fp]}y5?TYjϾ&!$Ę9LP䗂0BG!9~boqݠ&z|%wy'j>uw7u ~>N0cQ4~m>2L@pWfB9#n|:u)Ä]2ν]SOOSbρsoDޜeKԿ߼K6]A?2*e̲HHM D]IsQʎF}=孱`IC?ض'Oa冟HD?xSOL&]t-_9֕]&Du CHYWL6m+i ;/|)&U};ɶ#nhhv6z*mj+yF9ԋW4H_n=rLWʗ6VJL3ajveϿk~vڵk_CM7iϴjbNѰLZ.D{CDZw,G(߮zm}4sZ3(Zҵ5w<7 {ؓ f ]Y(%ynצZZ+v|X-~]CV>SW%3c&cc&@@.yL񒆅̚On0 #v۠;|'; qz?Q7}{R'jEԺ(pFVy]o6>[/~QiPPڂ%Nxgg5Y+fv3! yS5dt Y=oɉ~]}_uOy`9S/Y4hܔLXx=^ NjcAq#g] *L] "(lƅ/a IRMMMW].I ޚW&<3Q$1AO1xZ kRM)}6㝥cSt}[/5;@ b m]qa`F@ {17 ky0@ȵפּ0dN^VTN8AAEKfxPYRG8p`{*++jP%[`a nݓo-xhi^b$n;@ I1xLWpfbMf;5ɇ;c2i==z`ṳ-`-5iMwbwaUh Qy}:xbSx o+UeYei]RDBIDATv{seD= Aly(fff2+-ݷ}^!|Vk׮i(]qN@A- b +;l6ARnw+D(E0s 9;Q(1 ȮX<ƘdEQoCbcaImH-(DAAvA]4[1(1FחLBC! e&B!BBPf"/! e&B!r|D!$\.޽z;+ ,z32Ms֚3`L/ڔ k*FӶZK&74Mh5Ғ6TiBL(JNNTMd@&W8::c Sx^b3UIի86qƽJÝJhp3g ;-ZRFv 1yGN\/`Ҹ:A3i FJZ;Ni:1!bUJD"V9 6i{FHn\̍ c<ڒlL"nh/$MfbAg*2[|cJJRIeH>8vo @Ȥo-0ʤRLZ }PťKmm{}ZkuGn(7 v"NRk܌HɠsZ'ly3aY fz)+^ !4 0ޠLomUS kQOrzhhM"tF)qڽWϰyMgrf˼ZUYt*eaǔ˦XE/fR,fe/f@bVu}3Yy 73@kzfJw7t \ۍ{K:Adc\qI͎.ް.00LQT Ca5W84szjο< A.=E_=u^vokdchܓP,nݴ!`;;X(@TJap[D<+vSݖ05LF"Hh< 5[?B+lNUa*B pB{ۿWTDhs$e?=w~vˋKRa ǨT}}:gh آQ][h1c1@g^q,@kӶ %{&,zuz[w|p5tD j&פm%;GuA-[s7K )7l?I6~x0]V)ѣoԶ@1j -!jXHܣ'H{ȐC[f l_hPf?kBtZU }>탚6o%qiX+Y4򘕝ֵh)kk~mITNBtA#Z6m֢yG>HT :ㆮm2oH`f'NftlMﴄJnkuą*5\CGxK7aWohb̻cw)AguVIUo:[׿iW+6\b("}؉%ȸ1? Q_yarwnSɛ>Ȋ/Lwqᦷuk6/+*sfcݮw.m;}&YwsM{~CMW<:%6FTB~Zgn]ЩZə %!KZSMg8F;38veşg+;GNN(Ϙ~ʽ[{ Qr jڥ/yG2_Nd (GR5BW2!yu*S\M)<mnTTa,f+#zw?4*a>叓۽MsܰK^%7YؾzOT~R>iW]-P+_0I-e p V+Mr:2u&'Us2I0y^|Z%7erbB F*ٱB ۛD<'ㆌq>heً ͅ2$XA?0_VXgѡN$,B%7eB 2=#Jv't>NV^2֏qТD/o1l}>`nMҾȆY?!W @Kݿ$EiˏqZȉFo$i^ACظ_]]Ҋǻ?Vc6\"`pEa\QFuA ܹJRf=޻a66矹s8 |{^X*6þNӒN,w0zEo M{p{TyoQ֞)$ܽ(B{A]]ʜ'{x Q/ިٯꖔif^OÅtfv9{7䧃JMd~`v$fn#FS 6gZ6-Zuv:rj TqiW3Q¨ܱ 7dYoَQZKdikT)"\<)6o*lA_A}0}f8F A u0+wC`tj]KvkeOcFOإU`~;-/Ս˶uFݞ1((b?>[{HNJT 1!K^e(TAcJE3pF3wTVg/]I(ߌ A [M<R&l365-I/S}6lN9bm?ګRHSL^^3"UcIM/3nM!To"c7# c9ڧ5 ;ڡME7 9i{2{:vll平gd nlРϟb +)VݶKrޮWs_~~NHGKږĽ#/CƝFM rW9_|Vo*Š=$uDuY4Mp_6MR)h0n=C g<6MKP]y7NPH|P4%mθD&@ѴEPkQ|u Uh5Y=ֲJxFc5" O)h!kJ'DT!?4@%&Z<3c<\6jLfe0 B S۸Q4}{7HKOW*K}d2\] WUY,Vչ<M4Ya0$I$(rrrBIYnbX&2b0!ONL`XnYYY)`T*nnnb!D&$&V\Y,ca0 Mbw\|. $Dw,|K.M,'rW"W' kjs.dy5G{8p#u־_TH_yeѬv~[[LŢqVfI# d |V _\oegRKָUn8 T΋kY={S::/?s0{~'E9{yGo fD5V2y>m[ۋg@|Sb=cВ-N=\#[yH]?$~Eݗ v(%Q2(OR"x`f 8$L.IhTiwf=W<̗uT "eUr| סZY n,y~αerds&鵣$ϓOD<+So!6n +?E8T0_AhP(Iެ}ׄ@1-j`198H˰oҿfu'(hIҭ#aݽ̴E_Ќ]QON;tcEepҁ lq}j%s92Դ©S#Lt3z.CLaf]o&,tpkî;yHRdY?F[ a:l_ضtߚ?sb;6<]]ÿkk^dvw96ߥF@?>444=-y`08\z˽ @ u/RJr`s#)3f0 4 `a0֠f0L@M`Vc 0kX4 |JDO5h 櫂E{擼| YSW3hקi1o'J6#Jy}#tX y+ "t8S*]Id3l3/`ul1Or_;SN, (n`l"/\Υ\+Wp; *Sr!R&ŔZQ* H?UNlDI #M[haƈ{i}/7'!Qآ)ߣ]8yntuxoܳyp|P7WnyQöbfDrD9B#3Y;ouIh OAjW*xHOH^ˡ R^OeT0Z?򇴫TU, V楾pLZ-4*2Qg/c?)<'ue&/L ,CB"٥bVUm8,`Ȳߗ7k 1HE*7p~tM_=|;_ g.HoHpͻ'v".T{J= st h%գGo+_ݦGw>dk\|I6招y2D08BwV H,΁VPK&" "l7mDzt=~6eˠ`0.׮]`H6odw+nw̗L* %ˏ|}`* ܦa0+ Xi50;~  @!Zs+ B4BH} @kD@ЀmfH0Q/hc 2ؤ101B!hLE@$A  HDۨ @EP'&M՗v'uV IDAT $@Tm&  UqNVDa@ =CS/ֆ"s4mBN/fO\(ĵra ˂b'X nTE,|^(EVlb c!L 3"5J`Vc J*Eb06 Z!?P*ϗQo1>Rl)T]H+22ޅcznղUha֜)0"[DL,'u}{ǩ2T#iÅ:MecJ⤥ -zۙz΍Q1僙 f5HI!@E־< $}?+e7(_|ʌ6eHWgZQ(8iפLG@)gG@uиsv> -I׀&qJg? VhRm-y?nY¦~n2d7~Vw:?AiR'ǩVtF弼ҿrkYk0K0]xzuI8@u'u)e.Ks'No8xػ;H=Ғ4 ww`*K+g,1Q^ D&zVeY<-6uT ,6Lcicy8rR\"'tl `͡ LtCZ5iؕU*Ҫxza&c2;903nle%K't#+a%SUKMLU }+3.]zo _Şi e$-0^{W|ܰ8TUw558c(g'7٦v"ddBxm  qcErp? H%Э㜕Y7j>k\C[sx\]U>*J請%>nwUMRlږš9Gf mժm&pq7_:m8Lǖ߄ inXVaØ`nuIZl;|xM$0:Vz!!!>UWi*i鮚!qswvZGy2 cH1o7wqCP|PM6LӸqc'OʒRUwZWbVd+ ~> Xi5J`Vc 0kX4 u=ͻAH|NJ4jQ+ JE3AxWņ{BaCHگӿ; ޟ""ce+Z7(lQ|yxx)LT!C{nrJڦBXϞ>{KJn%~/߼uS[P#0Sc#ʔDŽm;O5XU;ڴXXgO!fS*yaΉ*7\=&7DOv/]y^RӘ=ؠH6x̝Wa:U(sUmImb鞟kJ]hׁ V/P~߱59eO Xf[ko:5]w֭&ـ8`Ze\e^V2PҐBEI ;>:١(!;p,C/JTI{\dԀ+etj5#, P޻}Ol{T1f+!6UhY"\ģ6DO$ 0bn$ib Qj+*PB$v%_,@ qh6g;?}'|=`xFϦ 8scUVճ0PqIn6xư\iGYa\<>!Oؖ X 2OC)U60@Q16\3kݵ(Q~rcsߣĂN_E¶!^:R#\Υ4~Ldy6s̿/Q-ؗ S-sφ RZxH^.^4~ߦ RZPu8aWgpݫVpֵ;ϘgT$Ɇ[B39'y%Sk Lrf ~ڼ-3-,A:8/^d XNu;~6 swvϥq|˿Q[P}P 9AN8F &&زA0ziY9;7)%ْU} 40"E["af/8*S}kV—1O{x\vTW(wvYz0fcM3֤I?~\9& F5 k20{)I[֏* %kӰ0ҁ=5J`Vc 0kX4 `a0֠||tW?Ɣ1WEJSi+7 2=6e܊|(<ٿѢqڢwo?nՆCڴi&Ӗ/'ܦM#f;WCeݡ:}G;w_j3ɺ37n\=[m E?DV}Ic။o^Ar)Ȩj) sN Y)ppu MbKv~ո #EsZna2\ZF av-Oxw)jacك t#˖#-闿tLے,~sOGҷ1r b0{Yj\|wg͚9Z|sᨭ| jG;tlJTLW-M<7 =M-)BP}` O_6 <3̽l-mӴbChv=bfؘ6YjIcO,^ևLB );PI)d}*ߺ)f@F-R(߼!mܸs^Yv=NsǮ+@\>6=5z4sPpY]MSbJi2y{5rc l6ٯϙ`Kӽ?x8c* j۹#CX'eurW0İ^pɫH>t«YVGTvܾ;NTdqXX}Feʌ W|j֬ÇKhPKK?0TJ+;hb?7Ͳ0&"c 0kX `0eGw!@4B@jM @D P?BP=@4hf~:Sb*"꧒MŠz U`Azx+ q j+*W A4ڪrAvjCD$_]h&7I TXi14m2CarMڃR,4ްEhKA[t,ƔH{:6j2Tu~k+L߶m-g#O1Qߎn/ʵb?GRۅvuEŽ]' ſK0~bz7osV)NUcR2dN[L9=j7oJK2>)Hsd/o$ȸ.u-^:sVEŽ6R4`Ax ţ~zm~f;4j!n>rj%GSX eepX7mv݇\ʩ\%-R"2IZl xYDr$~|a^_SH{BY&!tqP7l{?;޿e3Ķɚr^cm+T<ߵpj4եdT3Q0IcW?[nNUJUR!*\N*>I Ϧ*t1M7QrI5LiDKbNY,/d]}lys?ˢۏNlEŽynp,xux>䀠j $=:o):~md2y|^Q1Ga&%xR&LU$:n'ݎ̛Q{0Q wf; 'X}a6k~Gn[0xL|rR`cV|/vsvH~;gm1JXfm?s➩.AC!pv}d]署|_T@{Zg?g69T1rc)Y}(w95sd5wz¥C_;}{T7eLohOeY.Ipn͙Fz;6Y}{U!D7)s(GOi&y,r@:ϟsr>*jzU ^)w;rڐa=,?$CŞ‘c} /bt+$)]U2I[~!|Vʦꐡ-$ÆoMo v޵}~ ꐞuLwܧr}Sf_m7g9#Ern>Faxj!c:Y5ߜ*G!LjXplL7#eMoh`|<7]kP yh߾};>ZFG̈m|c S^e焻85~TCt G3[ |w+z7)?NUE%4}b2e)$fJXv^TA52ɯ&`pIZF#TmhժR=ұ?bfϵ׎5:MV_]{rΏN| fT`USÕEbxXu墂]{p!?j]O^㚿=+j2Xc[lѿΛ!*EuČPGapp Q ؖ cC4Sו%5wP}WT%5Z{m#G:v)8 ]S62y"_zDGEk]٣O2bʔnݪ_\B*ޮW^*Ǯ:: i }DN3v|"* 1b Qob t pM{(&tEL;; v@,a+ RZyhMMpgk*I %=Ojn+1jZ?ts+O,=FGet{Ϟ=;zXb#|9iWzEݘJ-g1}fv!'8+A  Wc8zoqȼcK*%۫_ʏг].߬|YM?_7H\rcڹN:N1a*Ɛ = FtYLoh(v;eԿ5CHHW%܂F >bQ/qĄ_=88aÆ{jݺeȯEŽa"g_'U_?X!}5T˪Cr3 SJ-\]<˗߻Wb0j]~͸AŪH9kׅ"q!!#w%*΍\9iHψv:`oU{4X1gweְ# R=yIIe u5]Ϯ/ƫ ;D$קO+G{8tsZW?װ1ET`Vx n`/TUsZs };5z驏IӻccMu̱ FqL ׇա]h^JW=ھ}ɛ_px2g8oMZH>:LjMQL0gw-#>n!C5g`;U-'PTҘ|Xb;/䅵ιdNIe_۟uUcxkf:]Ǵ94x4;Pi!X: nǧ>]4'Ǖ F*U߸{`pchd;wl ?ue0:X4 `a0+g IDAT Xi5J`Vc 0kX="_X̿J\_PH9Ԋv݋uvtU*cZunȒ[Q9[T2bHP*Q H5rҳi4t:vfeܻ-ab/% Cyt㎓wޥl yk3UD?q)ئ!? _p޳M#)u_pB>Y3aU~_wx5Of(LFe/E⮡f4f|+O˯VxLT{[VnM$U{GeQ#fNcw0{}twbD n9~ʛ~ڣ=&GOf^gȜf!ثׄ"埵7mN.^wOV?|"w_|raϖ^ΕB=֯gt.I%Ϟ?Sٛ@eX4gC/9W5ý{rLEAvQO\*1GC<{jMp Rޕb=NZ553{U_{)1&Leۖ:NEE٣$qǮj 丆'e*ZYJ\mSAn,a[^˽TZzy{SAHrX5XRItNTAR>ag٣I8]BHmk9Aڸڠ4)E;ZŴ_r;B_目<^epcl55Sd+ϋ/9{!^ԋ)f{{afݗҳgCvJ駞dT S5DP@kw//܈rMW1UKM =R:ԉ ]!lGвGe:B"ko+c>$ǑCt/ Tk~O ˣ3jL<ɤ*a9Ry*r-+]}Nk'7&þ̥֩Ϥgc%z"0]ؗq>]?+Ap іcd]FnӌGBGVvtP~d]#1+1ʐvM&Ftba"zM\{lUJ\+χ۪6`S _Z s-`+VV1kX4 `a0+ Xi5J`Vc 0kXQyϜnq' 0 {}| ض56.ùV@Ϭ^N5[""+I9r |ZնJ0XEiH"qIYmyAn̽7_Tȁ 62I/?zmCHލtWy[L;\̮}>']ϲV,NdwMFBCLҕjvtI_?Ougn%puPBz#eӠ/O6ݦnê,dD)0x^`kVf'Ӏdslj5b Hך ]9̍JP;s*U9yQIsdl`ծe*{djΪe쳄D P(i-pp(t q&E\!׫ZLѧYJTjh[ВH@rk4g1`Lł=b0BW{S- 4ߵῨ4,0G `a0+ Xi5J`AQs!?HM4  U$DU trTi.;BD# UBPN+0^&scz'hi 7 @:! h v t6 J @ޮ5@͗*@ vWA"i#I`\f04BCL7HڭosHJabwL)GNHlknEgwz7OQD72aViE'`0%0kX4 `a0+ Xi5"F9}@v')S9 ˢOS$9bk & wA]oiѣzl8= J6ͮ.?ǝHyS :sJ,YYa0_VyaW#$Hxu]3;W2*U: l>H:Pڪu!jU QŅ uU'[ $G܅W K1#L7,zO>Q۲/S 6rf2i}\,dē[} /H]~D~3ݹ ksU.]8s`1@ÓV|o5w?ܧ !=IڳN52Uøܦ J~O*YFUY2*~+BҢGό&tn10^;[}0UdQc{#h ?z 8@?qBlÎ\ ҋ^F3F!T+[FU۱!ǔ2!K+L\'!bu 1^Z9XoMz.۳}¡UW}Z2Ja%F8.H iݾcC~ ԚiL^} II+V侼{]2/&_بEGv^L+ $ɛ2r /@L00]@4o1K6L[1ɓ&jUQ}1&_X3;񃿛W`hR^(x.8_dM2.?]~WD Zׯkf4+G`LtI.A!]~kt@:4`LtI0i&~⌸c<*m'" Niu{]<,Y)z0:U80Lkj(}`1=x AFmi jIHL!V3IS=o^ھodO\xг_>x+لUk0yddK>ܸ06=O2Ǚ8nۯ^w"V%M/yݝ q"K[)⶷ھK}$ʌ_Wk$. s 7'"o=мx:::g/_\WWWtT#5jgDǓx/]]91'/H(#$[("P1δXs!wm3!ΫHM/U隷|5_DuԹ@s7n5<YbEaQ4Q۟τo3Kc^vڰ~HyͿ(X sfb- 7Ⱦr ݼ^ϓb͎PAkV~n AqQ-[r>~\v͇,O4]glC,+ No8ru B@ ec5$!?}Pk~fTWMf6Q͠}fg7c欸[oCp"BG5_{j\k`*}5p*|+ IO?<YR\5Gf6ZϜ>edddiۛrP3>4_{uj ST/|["A!PL`<}Luk9b l^WKqZ5r-Aĭ۷/\߯_ի9lew߉|b͇?G0 _d[e>x E;Stͻ~ w\34eɈ m,+=Sn|פ\~O]gMt ,p{/oQą;Tۤק;˕?#̛r|%ڛћ 8UzUdPd=v`Og>M{(6MٞN̽fYgϟw|Vсlt{=~ƷH?UJnw6a~+)5dj+FuaܟǔH{/v7b"HvRkSUp2fUVW!P2d1Ið[eˍcl#;YՁtussus>JH=x &KB"{W CPoё`oW UW$03en{} &bƃl9b'?/*9MHMz =U>3gnA^DNz4 :0i& :@4`LtI0iA'*(~wh!$-{hӘy !Z 8#.h`F!ފW_n @I n=̄..*)xsrR(Sz~']qq1Sqa n瓳aGGv5nbF^&*^Lp}g.^>3QzN4u;y91!߉ϴϸ:FY%ΓS{w|CCHM'\XsY'\3fSwc6azG/߉#ʌ_5m'osEšܜc`, 8-="NW/ݿ~)@&Mɯ%:RBtwW,xfۘ>Nc{(+J kW' G4nOO^8b{wۆ?q1/\poaHi"a{D͇5J>tـ{{STQGT#)tY(yq쁎 irRd,9v3f1ٖd BpPEv8fбG< 0m=`_~m2#Ub>`\qnVOߘ #icʀ1VƳ=Su{X;fPu;AiYmyQɓB1BJJW6`>Vg4e<;o>R"):3&un/$k&(ԤmG9BͲ-tϗ<ĪcuҴ3"I[Bq{a{Aԟ~vh/Q3Pxd͜CG?qʑŀBUO{4!DRSn)KT˶}unQ7(P #!):f#hY|gBgn7rV_G6BHz~0=֯|,jVz3ARt$]I(hGz4{{la v#Z& :@4`LtI0iСg/A/=mMF!ΈwqjYTϵ4 YTݡMiݐGJa qFdᣜ^E}[͹9;+JjTߣ*wϷJbw {4zTqC& eũIՄ,HTx.\H\7 'Ҥ:1P~qx ,p{z/oQą;TBק;˕?#̛r|%gƦݛ yVj U[RZkgN]{֒ IDATBFRM}T~f5xyAa71 3>ѨiX|z|ĪY%ߜP{SE=V=H?BҢéFSfc۴![c(CBݜ|hLu՗]48 +6}t,Gg&b D~n^7پƫҢljid7jԡ{eD Đ!*ی L)a7yqm Y/B enFj 7%G3 gс>5^TO0l=B|O_Ÿ?ޖV{?rSFWDj=kF~]ofTR0a+ML^} II+V侼{LSm۩fj U[iw|#;/^MIiᣣ+3[qJ[abOl6lV#AQۼeVH%ﺯUΆ])zp= f̭`t1?%&qέ{ϋJNR)<]vJ ߛ1eS}ejڝCCEG]'?S՜4jŚq؉\C҄C.B|-aؚ^ps Φ&2ݜz'QV3?=KN~QVK{[!?!>OҨ#(FYMBH$[ ~X5fdžBa:<4HmUSF 5d?l+tac(ٰ+s*X:Xh7  d7@–B1Mj"eJSSnPQvNC{)E]Zr( CnY}{cfΡ[7 Yv Q*avȶi)q-X/a(%@F:v6Օe@dkN+ Uѣ1 ]~oWQoԠfzH`@-{{4`LtI0i& :@4`jxZiJiz r=|ĭ4ԟiu{]<,oU4)AwKKo2u`#Hr^;/TcfO>\yH0yј< T As'~62wNxc0~J7zRJ(jv0I"u~"%EO_|G~c!q \e]q,Qتk$U4_UzF\͡ʿFk5"Yu^EEvFjzz3I@݊#WafVȒIskVls&27\y+ ', qy]e8-U/1u͹ K;V 3ӥM"˨cX qH"/l_9~Y}Z9eQoA$h]48inz[ʯ(}q*Uc%!&A+drY@"XG݊$`t p:Ã$![?>$![更:CCBA5@H^n?>$![1MU:K^K "*HPzi#f?/ $-Ϻuh#Hw!!zi3sZs֝1ץMݨЇ>dE[Q]ЇͽGuA*c LtI0i& :@4`LtI0ih|14=iBF[vDvoPRK5&8یNG9]\N^+AYN^Lp}g.^>3QzN^o<8in{W.[hIdwQIR.?.gz4q-Lfd!^!?8%2gSpA⌸}-~#[~Ń[&Zo&BR[E>nuĔ%! ,O$x϶zo?ܸ06=O2Ǚ8nۮE͛soՙ7ޛ/bFR ^!i?Xa ߜ7v!ݻ>ys`piȝU??{  ZO F4xLË\+0=дpxF}dsl~Х{co=JhyV& :@4`LtI0i& :@4Zۤ:a-04y{DyB}මw1e& x[8#.hD5Piugw {4i6h;IĝOx#rLlFM ؅ȩߪBKE_t6@SN_}^<*6ߋ {>($/݌I9~Nn7zuo59i;wAA>ȿH6ğՊ N7}R\Qή"HV>4DsGmiViP17K ePEuCJʇE\Q~=V|``!$|z+weJۆUWazˇE\Q~= `Hʣɲńa%eTOˇE\314{h1^ۆu>Mʇ\q(7_zCeR5c X,$Jy*#~}3_Q=!~ˊ$l=3Gϟ)!y).SKBFB W[D^>-zm#@͂#I0i& :@4`LtI0i& :@0iMU@5{$+M;f$ASPQZD̯Ǯ!Ua-;)(݄4:iEɁVDSaFqC1J1&'gi쑃qAsoZF=烷ٟMX6.[`թBO/IGAs$H~>XQRjOy,+ODV%M/yݝ q %$nr"d`=d%|sVwA5{$+!أKigDǓx/]]91'/%}z$‘o)BB4X+#i-#4fdy"~±ri bClng>u#"c/ eh #EOYQz_?/l{iâ"B'Leds? HUr|Œ ݼ^ϓb͎P_"O8lKq o~!iѣgFgw7>DG"ceg +O"BvxxmUYT%Gi.hoбD_ؾrsv?3DpNo8ru B@2F(DG"_B%BHTVTT9Gq^u4`e&=] OgV_wVoecV|oe99p z L&YtrH JIܔ]3ϙ˂]:Hsk]¸V4֨Vk K $x"NLðauϐBM%Ys Aw06\U6?O u̧"ۑK\I+!w q^#L>m)fR=XlQӬ()_Y!y7y&#{}ڦ[[[+<-~Q1ޜP+-0t~nSPPD٣OZڐCyu7A=GO+@M!fޝ\1J8m0瓳diѣOu;X6D汫Ϟ\@ur5Yf;Y`!~t=g!͉Ȅv_\2׭J^;M[ng͹7 fC!D湷,OԷ !o?Gac\gF|ܰ)KB1ܣe_#macB}&-PZ|zXzC?!8lKq o~z6g31mek,}_05 Ңljid7BҢéFSfc۴![*fvQJ#i GuߎD10=TDi7G:_Db!gD ۰#WfזqgICϧZjۀ UJk .H/*z/ >OÌ솵x^y-|aLo.+5*OAb#_6ʮw*mO2PY. TbNF=>D%Ϋw;A[im3gX޶НW^KVd&o_QAD(&0}>&κ'R GE񳪙RaJd;ZfTR@%or={RJp/~ @EOc>UQO-4#K cf#f{9i흎˘2?+h[yepLmfeKbХ=̊-9Œ/0sn$O>^TrZV}bQ{Du>'MiQppMFը{T<)Kr}[IDAT#"C11G0f@M"]clOOO{@Sfl=6lU4 H$jМDL]]wͽ1Z23tuA?wMsoӫ7L@+>B 84X,ss,6UMѣGsssoh=LLL&MTB^IENDB`tora-2.1.3/src/help/images/sgatrace.png0000644000175000017500000020772311303312237017541 0ustar michaelmichaelPNG  IHDRv8 pHYs : :" IDATxgxUɦAz{R" A>Rґ"tP[(def)}y{̹{Ν( Qb4eY@ ɣVkPՄ 6zbF3b@ * WWWz(bc?dYl@ WZMyІ&l@  ȲLHp0jf9@ f,9@ LGRVRfYJ&"@ T**KDaᄅ(2nF7\݌:CZb@Mqkuf+Jbx=\29Tvl@ x9PT5=:O>d2!2̑B;w$g_lr$pܾu[%vw1f'IRl<>;l襇J(^&v[RkbK:Yˏh=)T=?f `ѠƽP]Axjsn%?يTQsdĥ>JM~Ӥ"}7qdB/n`U^o|Q/[d*V^ʬf6%kҲz6̇>n-0a-fꞪ =.q(v,VAOnARtܻ{3grOO/r΅Fɓ\呟U*W`"HvK/'dEҳgϘߐ0NkfP.,~p~X0os>_ȖȘd64-1gOcLXLM(D'&./mo=:# uY%VGnog|4kЃZoa/A`EI_SXaߎfŬV8#;%+̥_i~љL8Q3E4ΩqPޑ|ӤQB2ۥΆo I٣HvlF.;&WQc}Oi.`Nx½2wbz|r^p) @ VKh'OC:thOb%pI</9O7K18̙;#G!rrqjٳ'={Iy>6̗0x`Po>snX;1?7A~37Qr8W׎w4hАcһXe&FnЅSYirQi=_=_ϙBӫ31vCL݃q>kQ/ !Ua\,G5hXﰋ?`d<-JSƕ|(dpƚɣJwRx6t)nػuJGqjY(ہnC C)7 gޡ)[tdM'5㿏9mʱ\5DQ .'oo ގʧu{ZtOh*QpS~eF Eۊɏ[` wA𼹊 '͘/voFv }n.[ТǙ5@ϾQ߰Ҏ[ppjw) s@ h4$Ľ(^(Oa] ;vr!*We9?ɕ3gLOzi9ݻu=8p ;wb^߿C."TD˧]X~*&GSF/kpj/'&$D [ˈɓ*6vOm,g{B%>Hiݞ";C捣e68Ӷdvܷ)*WrD7Qk,zseo\4],.ٻ.yuj4jtnXZԺ<GGt՗`pJxhPi(T(nq.Z$IL} F#'O#1 Ç9} FoajV\hqDN&MbGkܨarbdu8Ҏ\G'᎐nri5ezJEBrE M}毙DO1O_^%䈇ڃ/sG)7㢃 ܸA W%Gf <&D?{Vc9T៳z %?D)_jc!'w5~Մ-_o~D5ʸFeɾlLI:V@](M$kv'8~ގʧu{ZtOXGF}zO/l1{8GҢmȉbiD߹aܦbSG3k^lՠCVXqIU7m̍?~(6"5 'TI τ͈8@VVkp1P\yFWΞ;芢뾴lтk ml9ϜS#|#Iʕ ^&)'d7KOUq<bͲ'< 2A_[ бRcW'KW%;vzjOF\(Om{}1MYf{GV?=y\ilNQB.x ֤uR(&*rL?ȄRu*Ú|s&]@c̏oqq uF$܌n˗'ShQʖ),+=wJ+PHǏɕ+X$yx)ȕei9EqTX!F/YV(_lrbTC3}$d\)[!7^UU1"2Or}"ohSPi\p7b4^ei-G yV⛯dNoZJs}9ɔOJ G:fy cN˨ci9mE|X }Y^_߹;@٬XQ͆=EzEX(-JFgG嚿듓{Ŷ7ߵNH6c1Ws`6KeB?wI6z;*iݡlt^{Haw8a?!jS *ܞ6'\$3&T?oUc5^իWf*ž7S=Zc5y=g:\\s;0d҈_8t*\CG%/4 d-1tF?ҹ!8]QN5w_}UA*Y?Zry8 ::n}a79 7qc̊lEҢzf m.,Ș1s9_FۏTprmsKGU~ٺ*o^qʐMRҨSo;f=.*0wdɎ[m<4$/[1_g5z硌[3]Ҏ6:(O'w^twI3 9˦cשk<{Qjk y(V_̥9q+Hb5xG|ȁ]_j6sO :]'{3ehI@WODG)~ 1{Iӎ%8ޏQLY3e¤p/qd rjA6H2΍⽀@c00\8rݣfqv.?G7SBE6+v-\z Rl8wQl$Dtp~ A ̯CQ'ܤ"= ^σO `^=@ܘn$:,ܘ!7#X~J@@ Fxy{#K2} Sp!rʍF3?|H(_$IlluFCxX8d$; 9 v;FrcGx{{'eo;Ǻ9kOz Ɋ}LܥEfGS|/ke;6N wC:upM-5&}n.KAy %Y&$$9r`Z@QĢB%Œ UI&G(_K骫\ZHv;Adjt{.b!g rxJ#=LXfTf|dվO,/~qw=H\HQF()ɎN!%K@VcQǙ&zqg5z4 z2w~KPd V YQP2[BjJsN[xL hPQ!}O^GG}NJ$Y-Xoݞg~/Tqɀf#"‚"onkbm9k;Π7Z7/@o±.!5m>4͡;b;^jzkR<2NOˏsĒ3v,'ur 6{xH|гLv)aax|so*(@ȿm՗!"aϓs56{*TIE;YX UL.?łh:d*ëݤ2r\q ҝKf ^f!v-T٩CWVxZ i~XQϲ!*;W?gܥ.Z'T¯fN tIUBMJl$'n[3 'G6Ċ0M ƍҶ|,?hǷ?bC|ww͢׫} Zm(r}_X#xyI$Q;;{hD{ڵt깯*šիQkץK2NGw %)2{Eӹi)Hr hY;@6]`>m\[snDOV\?Հm?eY7d/LO iФ-}Msd.Kl\<[ԧaz1V iS~9-ʽ#ծ 7Ml{`u@#9w<'X,;#QWmZw<jȦlAf9ΞSSPnU#iYW h;DP̝E3&KIWߗ֍ߨ }'mɵ}>, lHz:IAyU!E,UgYt&)KS}[ Ѿ!0x`Po>ϋ3 E >=hݨ> wd=I:ҨN#GɵcoQB%j5qNĖ˗b[|+%KXbE6O :r7DΛ9aYw\CEp0]aoMo [t 8f8ɘfմ)i|Ұj4ՕaZKm Y!|ݓ ! 1K}'J3rv_ Μ9o <+=d+sw5)wz*C݈ HMA<8ːod%sA߾}LOvܹsc^$;y*'C捣e68ӶdvܷrV_m(AP٢E?Rupx rY(Ac,NlAD]MFuA{+tgV֡.6NѺE*U\2~6; kYH%s 5JJ,'؉nH>A@=k|`#w r ]WƋ"㮎,rv|њb.jkgxuBwΝ(]Jxk])֤>AyjQOە- Tՠ75RPk`ܾ-[631mӊ&5zoQق"noZ/Jx=oK>E1ZnwpDt=;YGHn:Lyn^jU*Q@Θ"__.SqW%OKf͊?RAߖs~2 cSaV WkdLINr˫dj;%<1ilْs! (@V8a"A 8oL uyRS.{ZlΊOo{<+!ة|1ݳ4V,Y)ȫ ?U̫Lty$^Du{<o\c`{}/Ryu듖${*c ٍUL`.čy+G"u4H9R[de(~h 5k0hjmI89gKt-B J#vKv7:Ms`ʄ{Z>?d嬁71 `Lc/W&߂WwK.c̘at#؉ 'L!3M9sdWC Nt8݃s=KWGHv9L7X1w'݋7 s0ZU^X0! *Ǐ'"5ñ<pd~vYWvǙ+Be/G <γ:^z-S$tmC7|eo^zW~۸dE"%K\b/s7Cd◔MڇDi=KSL~uvB]&9tב~XG3G,>_XLy'ND.'Os,*+\ N.f1?rBobM-4Ǔk ɎCc9)SŌϘɓa6%SgYW0⧙Bܱ;e/w#dAYi\!! 'cV]~l:u%a(AYzshWu4;wӲtط\?rɁĭ5ޕTܟGDIV8idL(9ijK'by.&3 /cǎEQ$fa(Qzg4kޜ?Fi"Ѥ(.\hd:~_ZPkP.g|߷iX>dӦԖk~iq4M4@J"Kbے_0=Ip;KRmN\>b}UmVI^߳zxT6dᄟayhS 7*7OH1;O}d,V+fEZXg#5{mJAd:d$m <Ξc*u=PyWoefε`; 2'9zfT>Y6ӷr$!ۃ}jj_KfV_N>0$o wU|9{c`ŴE]&srv٬7*URP!UƘcZ-UQS[M(~mrnwE1}J fZb@NǬ > ߲]B%Pp_I pj1 i l7yZF bybIoK97~R.}Xԭ)ugX59i1{[Vqˆ420=:&HtȗCX֒Qq?w/nߺ~_lT*ÁbI%[`HRң*ŢF_v%N,* Jw^5$Y`0 R98(*+[fb۱ۓ sdgg90u% U)&~Qyx!Awq&O:R|V=d A$;WF͛7(T v[ָWd!eYFí[(X Nh4?6lۡϜϭ'8F>'ͺ&FtB.xN>>QZ2*LNeIB#'3i{Av:uN@@2"@ A#"5;"""LJQG"@ Ae+vDɒ% (Q¢E 'lvw1=Iw L !+h_۝_xǜ6e&D]:{&B…;n͛7g*T`sOetAta-S`gX],OdXQFtr5?[Kh<)T }|BBTD6:><ͿP#CN12UAgE^-yTeIM+b`0^1mw~SǹWc rU?nOd= _Og6C}€FH>J艮` 3e"-:lX8xя0YObi} [ǘ Ɖ<63?gB͸8L)oxzGSܹ   $$EбS'6nɓhܸ z>A؞pi&~~ٶ 0]<ILpj#[CԚI+gNs}'HjRu:%dQ ʖ٪~m܃5 ^ﵓ0.N浩Qug;X/2& .`4]є]:hQ#_}ߓBTNN^?GdTdy2O-)??U&fܓf778MSj_gbyQZ@'>( e˕lٲ1 v4!!T(_2eJ'`Hm*T6\ ?Yn[}$]dO@.:Iov◺9r GFWs{f<ʱ?|1 f@W>Ʀo|~ZN?Er}'8qw(bBjDD13[1]eՓu[ .QoN7:ިez?e_V#ɉ 4ݐƭ~}<"[;}0n3ڙ_cq f?ck&mφXyكA^U( ۃ1La=Y%E]ߌ`'<7V}ǎ$Q{#dwCܵ$nJ%3꬏tƃxбv$ov)$Ȉv9~jGvsljHeXImoRVľcܩkdq2`'>JXhCCM%YV$ʭ,D{K<MjӼ޵r#q#k&ICiA:55hJv`#Cp/@Gw;ӏVK9DrZ /ZԦvԮݘ?$+]ҧo=h zj"xt6O%(S+MSޟ]*7s'wzѡ^x><ӬރZRE.{ >Z)Z]]NfQ֥J^A'xju&V2t(Ӡ# ݨٌcq|0 x^3jHa U{Q3 q^!nKp߂X1`A G*vY0d+rAFv}dֹ{{F +NJ>'3F'j{ m˾*+h{'TIqXuS$42W=L*/Jy&18)=W'}%iN)RXr AW%Gf <RaskLi[cHto#?N^H2>bQ;q|8>)=E(G>o>MXX='t [~ܕ`بYoh&|(9Gp: No9Y ˼n)HPիӢcHNz.xTIl<[ms%H"Rg+ڌMG&c56"ԕOc~';j{'m6N}x#'3n1]$aъݜH9v/!K ] bv^z^ ڬXQ͉͊Sٟ9svr=D<߇ý7a7W<3;\r"r#$A<2uH*޿`SPi\ps z=?^Uy?Kv+آ ñZܽs1\Uy?KEp%&c%HJ8ڻ ]?c"44k~JNj|P&%3q$CsaҞR;&GFwzsOaMy6+fF #xtf3[Ν.~a1Ln֫,aeߒCW$@ CqEy:|I,@ rHlΏd'N[,1KEw+Pp-~߱~ǎ 5zg,YaJ w?{ HWS-ETT,ػ&Kb$&cc5DXc=vAA4Q~9,o{wΛ7otK/͚9C{(Xa.(A}]}{wtwݾuCwu]˗Y-_DoP]dW|hJM^A x8q\qrGˁ\Ւw(M%_˨azУ}ռ3Fԟc [;Sbi9!?[b@Pkd_C"JLeYoQgWs?+9w06i6fG< N`~%ėt+9~!\\M`~Ff׷Jz]߾Z^J~zN?$^׿Cʀgyϕx7 = ]r%^OZmF0AX)Ec߅{QL9EҮJj?r}x,^ح]c9@n:ӭ?J?ƜmQZR;OU`_O1*.WMtQnszh3d_ Wc !% +Xo"+ O 1~o&Tn=o)ʾdҵM7k%/NTq)^])& ]Hx՜̃{ ^G~~:Em+`oNg<`  kkEdYhѪtfPǚ%е^тYh[Ć)aZRb ,pǴ_UXN^םbg"AjV#u(},of"UQH/C6ڻ}umw H8Ӭ;׌CvJk&}[}π9_@Pwk!b+Ž2yz@>yy/׷d^$4W34["l55{!'??=ش%7V]?!YOO?ۗJY>W Uenż>tw,۠1`]leU:8vqIV2pBq ?0b&-3,-Mg@C{_㮟#FCh4Y8F%Kwc)>VwNIlL3o9=kP5y@CN{JĒrE_h%O*K'̕ՓgF]]G?] r^+y\pvD%/r&CiƴhSͪZByS "e1S1c}E KE͋_1`!s{PNZe$*Ia@1\./لv ^^f7xT^C׸|7H{Iy 6`3ԠVd)#ڀ :dN3&G-(ހ1k< e ɦ o y5x=ɋD ljuP@S+FI·2t#Rr FlHAFؓ1"e(I\f22XbxE&yH,Y߯7Fό6>THJƲVzŤ(Gyq w@*ԈBuŚY;ݰ1fFɌX_e84/Qɋ'S_]Dɳ=: Wlat"H9JV2;2V`i?6+Qlx6MiMH\^_h++kS >= kXtOqc썿ŏ}!t?|LpiVбz~]eNF91ғolG@P0}W_ד OZA\Vԃ6şxU0 ]:?cáGYuQ\p]h8?E^fP^]&*SJM- Uf!LYCmʾ &թfŰ잇䥭=6&B+ʚ̞%6 q}EtnMIhz;7#֠"R^Pp9S'm=ɍqz K?Jm)kFB[vؗ5FSVIS ٫ }!剽BAm0 q|]*8G{VL?z 1V6sl@gc1btd`..=Ahsp"K7Q+hQ*ILLޔJTc*0-Ӈ[Dm*2 &cKŲg4-_%J$m3OvLcLJ|l]"7.Z5Ǵ&qN$XVYct;']ao~X̍VF{ҢҾȊ[.P6uΘ22(8 \Wݔ h=1YN!"WbG^f~j$R'x jOYx-Dfyu!;4k\_й NNi;ofLe=G*e(xwK2|S,+ ڧ 󭂋#n8^s6胝T͋ Tu+ma\pҊ͙r)2}}d1 d2vŋae",ϐ9_~M O@~cYgUQǠd's|EIn|:_V'iqD\ ,+?]>|^ cw|UbaT9Bw#|\gG|2ؘhUeÆ>"HIInP[Gɛ[K0WdBQE 'ڸ9٪A1mRj"6 [ @ L&i8Ld&d+F@ ddR={8 \r "Ȥ3#Al)éZj@ (R)|=w֨^XB"Ą"EPļHep$;S[c4@  (^ܞeRtiJ.M2eReRLY)aoiu.'@ ;%fBa@&!JH$gKҌZ+*bbIT*iϸ%*Uo{{w!o!ڻ>.Xf?Z'^|@ OUAl( &AV*x5=ڎ䪾ϝ @ r;3-A8_.eGsѯ}c=<ӆS6r&u]=~ӁыrճўF^UI#>^M-Oc\YnS-{ =p×a^Kӳm8oAyF-Qehf˳NfH4gKh,ǽ5k|-pX;MR4%f/в0f Gm@ =<&kCouy=_KqM:r(S7 w&~ѩ50 tD4`9v"'Χv#&%T XځEqzxJ%'mUA=&yN93O8نBRN\ٗ7+\K\x m,{!_Du<5_cK=rş9{gvab.s#V,'I?&g9ą GXn.2~W~bϩ?sS{RJfPn]{ێG;ބ a .0m"_/rF9b_y!`\//O/6ĨUACh^;ٌWuM_e}7ui×vMlЙ'f$xDzl@=zƟdVMNsoctC%`Z8K-xym3$: w`ĤQ}ugto/G5NUr:ahM{ t&=⹿s>l捧wsitI3]p[6b"]{rK/?Oăz-q/C|1̺20l:لnT4A^ F^h Bϰ BuU"x)³"&vtŐK/˕}Ơ8u)E~kȿ@nW璖%@"Ŵ+oԑrG@VU2 JlFۺCw=y5PxCΙ~mbcRs|>hMe•H/Ja&>?۵O%#Yߍp:/a;gdh_ }>u ]YNdN/7,,1m\GrNd\K :tfƯ8sf'+fW3;XʾIUڟGqrԼ0QIDufX?Kp_^B+$Tagvi亣٩ŚX#_gs>搖ck[Q\F&nO2Q7Y_9_Q]vL'fhv(?dᣬ1cכU[8[́ %O&7 PG&@Y̒eXWy9•˓Х%H9Nj } Ӡq;νXmj.>;Ke+4`*x ;jӯ_Zyi׫'hG%/ꏃ8yo 1w,a++yZolb xͪ㽼DڔyΆ?ҡ{ȱGyt<0*ɖHM1%gi0rjULme\eضT!DQQBz9F\bM;~ 7kkT243 J6󡒝4>}[b3dlScj.C^܋ fNA^ܛ:{~OL;M J"FjM:$ybUeZ$4}:49o}lܰJɈS$̑j "zܟ_mdڧE+P$Y>iomNs ;߲Prp6#fݢf($JuM+42[2(+⾙GCOG֘\a\=X+m>3]G~G^T+ݷ(fE gP?.Iq-eV=i7y¦v̲]M2x/ѡzq?}ʜeE""x/>7l0tϼp 2~įcsSn:YMGS?>#V6f/,y=r@Iv&M^q/JUryD񦎯ˍ;/c lCv:%0|SݭSPXWU! 434D hO) (ʵb²VL@MȎpLiS,|*Yz tIg$ǷwR!Fw IDATftZ ZI'z ū~H֎ H9=&k}^$G2KmMz6c1LA@TNRk%2cNl<,lQ'(A*DN8Ȱ5쉯{q9m ѩ9I:?y 1ٰ8<"pi@6"82AsyAʢ|3o'wc5ggT_b2#Quןq) ˵tMIJIRNETT+˅}( ;q;/ѢCrMs3P֋#_(y WǣE*[:ƽNfWpOz~}q|!J6*x1{yM`㽉MUAsH5hsj!"m)_xKeǗsC<1l}f(Mf.fb'5g}Z]2_ ++NWݸbBβn Ӎ'hɧ]lҷ!}IGt\1)A{Z5§\?}\k,bQTjFiSZWYxLhar⓴n~MI_J=XUcPLjS'qmӖ1}6##FhuV ^ZRdڸy -zҠ\l?I5 zxz6;s C`zakSbB3Qm6(i%}eOK|֭1<<6Y6R5/'F;ʦw{ӷ!yJ owvYR;WI]+ۇ?G'/fۜzo9-:*x1{yM`ڃbk ݩ׸}㇔_xHuϞ>I4QP;w % 4{cwꪠt|.n?H_;6CoV抅S q>7 %\7 h}b@ @x 9U5O=38ɕLmQy€NZS_Ү~\)I19Z_]-֍򣦋Nn 1^1\x7{ԧ#2xi"C7_k[J|qeO>%ppt'j|p$]Zu g^ 2nΎ8VI NFA-?OM\qvGۏYt%)УFJSD~!ǮdNNu6 uyc'\Ł0KRc >7iͱ=b {_{5ga$:Qp/^)(l^ۇΓaXST8^@Ğ:%Ӗi%ʶ):ʭ`_Or jXg˿2=!IreKMpSix3 #<ĚʭG詯,W%cۘ70o]H 'ڇo..$j=Lv#XR dSxLPyVw a܌ˍ[?XI~?J7~}o]Y&OD՜&( ̠\o\*dP|oҜy~kGfY}]DqI6+?umWTÇHbĎx9R6mon\֩}.bdkwĹ|uFγȫLp.!N͝4ͺ\q5#.n9RNǝ5k9.J˺qqtNOaReʀֆ?Ư+AHt[Шa }d\uТ+Nh7W$d$K_D[ӯ]ӐqYjʠUtwcg[ˋ1>XQ{)B#<&;Z^ >@vyw. ;Jb&MU:xa>-m r-?,#Tc\(B]49eM֢dW!,mH>bBb|Y3m$n w%,  Z ;qYv؅#,(FV%@"ŬT%MrЯP 3:N,)ކO CNޱ5k~ ]_ l]L{+.raNm3ߢׇbng } e'YЇ {CaiU&PdHLlZE"9|(#F wO{9Av:x*6[TCq gD Թ'?E̪|cnz֑5skg'FF-n;_]cm_sKhrm*ɤsm/*1^S_V8gg\z̶3 괘/[4a^m-©:S,ӊ9TM><(ѥPԑ׹hOӲ2lԡH B 'fKG9G޾TQ TR.7p+w]6?,K6h ث(G',vpm݇~o\$k s!ͣQe"ZUq¡\mʼM#pN}Rijc{Sȋ{ev/=?,Ɓp&>$kyZn *$]wަ 㮟QIDf)<ϳX &Ԫe }yEݨl%CfY&B{p AR36 ˯㓯{RFĎ u+c%˹aڗgY}ÞOJ"2%|df}wm!POmP"5;[Q4TEZA6ͩZTTQf:`O7CI [yN |< H7dČޚIg}ms  z.dƬО,VzeEH(?QW X$gVJevh"Pj K6]@,8ȣ-.&}&%;5.ߺǍC?޷i"s؀+փ:vRbZ?Ts,k&̒9(|*\F<^kp gy5i~N zvkVŏŁJ$|Rz[_c}JVNd"EŏFY}F7#u!b e%;h~H0e"h^FFS[y WHĖj99kFDԖ$WHbL5 {$IL &Ց4d8:֫LgYIP+T)CJ [-_RS{LI R2(MaYg}mu^Kb'/p9si_,7]o%L+^Պ  [$*M{k#PP cZLTDyل2617!-y}MZVNb($R6bn&( ۯaѥ>ō7?Ё;1[uCAS^ܝ_Crt-_ Z\aۈW x>H ̩nf{^$CLG^{B0:"ҝ~%_F_{k 1>EAXq9ҎOX4{ƃ vYp6u L/о&.X"U,1p2/Y:a}We%K+zrx:d&t/>KǸ 1 3N5H.exVgꒅٷIƺra_'#3ES,k164s&Bz<=C_Kl DHttvyC;Rm *)B9,WW܇L:1mInܿύ[]TjKY3ҿܒڲǾN4g-(Ca_##{yb toPLl,;t:5ZIɤx %}t"T$ق7EC4߱x۽NM޾cQI*${RĤ֖f+-ڀ^anG-ϯs`i +-VYvnGiЩ#yp\νlߌ岢T5%" ^*˾>E8bO}T$jMDCTܙu?~,>YӬz"3묷M2"u rڸJr6Ub /I߹,+33p3FA~ UGb/35nItJY>viQ*IHTiQ&&T&W Pr7BТ#IVLٍګ|~Zڦ<4`ܶ&dYU"Ԡȑ{xYԛYƓȣ?vsIZt(ax<w ua,ťG1hM}Cd馔z[oHxzŷI-ɷ¿1x,<N|ơӨ#N5p%- 7s@Va>򮈋Sy<:OflCJnZЫ 1|mb`RW0׷"|u7$LtY~ TՙJ q6MyF阽0)݁]%ܼ?Y"$nɓ u-FU:pTjSY2p~^}^&}1'/Gu 6Lͭ1u= uZS.E޶~K&QBaGi hus w=,׾Ȋ[.PO&J"?NY;4oD_9xy]ᒼK-=e-гMqׅ,P绿s*v5}/F*e(xwK2\٧ 󭂋#n8^s6胝T͋ Tu+ma\pҊ͙rOG||֦Tj2\>g>J_zyy/߉L^q'u[7nzVnjƵtgWk P|0o ܲT)Pۆ ]? Ibb'Z~&j*>4}Q֣A=9NҼ_( ^ٍBg /<8~LcцkvM>*0s*o!ڻ>.Xfa1M?TBa@&!JH$HǦ%YR"&&D-jFf ;ocRеxQ8t7 [ APkńV=?dWo3N7ԃ1Q.Xf?Z'@ H@ |$[K|տ5>^xy5ea>P-{ =L<褲fC^cLzxz6uq۲עfe4u=߹'\ɍ ZNh%u__sVP//0ףѦ&Ԏ<נʯ[ nxz].,ԠO_B{8o}0`F.Ҥǯ_y=w<}:0z"]zv#˃"igB~݋>rk_˗a^gq:^4D]^ϗcwSǡ'MkO%#e/gr3Ex%w>F̷$Y][i,nZz'oVZI _NV1չ0'ȎnIyrm/[eK8). ]Kci%NIќZ?T-Ov픶HaW[i}(Nr-QdЄ|[TJK[Ag:J="wqoF(-q \Dl0|xV${ń%L9C{pO*Dg/\~[#@*us[/x1e_1dY$BA4xog?6,W%mq/`i~I.0m-寵UR=L_*lv.]ne;dTA˳%bـ\!? 3AVG=ZUV,(]m'#U>0>m*c'evg¬8)>m,LxyzѰY'F "%'hE-;wƳTAۇ&ӣ7%L XTfhm~@B Hϖ Q>򵼦}uD60^~ ҥZ aɕf}5nas%zŽob|Ʒii<|wx#9ҵ&ۭy]vg[WxCwF!"uH=[n- EH>S)Ȭ+zH,,Ϧ#ZMFK䥛0lDi7p* _8 J)XWh/7"<];OtmWb%Ɨ>cFq{ "5 Ou@3V|˄oyygx%wl1w,a++L#48$# u~/8} c܋}}bq)TBлDڔyΆ?ҡ{ȱGyt<oBmOQ-kQ/ XQw ψÂ2oyL,a|F\R-Y n߉ן*Z}}Ħ3hu{TqǿgZ9vt(TSlL^AfjLRc\n_EY8O"y yo>}+fm;āc8k0jED?Dui+w mi(\hng]ܽ;2^kf[ify1B^M4*> YJ IDAT cd>"/27ӧ̙J_Pr<';c4%1,^VyL%$:MjtH2{?EfL+sdԵFH䫻ܐS֠hH\JrHXS{D{GN]4s\wtJ P()"J-5DNLVctHv픦>Oi3* R4^ T>&AQtˊӯ4+` Mǂ(2Y1gㄵnAXvO9㲭Qrp6#fݢf($JYM+42[2(+⾙GCOG֘\a\=Xky6@Z8S%Gzǎq;xE" <}"mFQ4?̀Ay X:g^|zV??bWnl9E8a#͹%9   ;ɑ Rbr 2 'l'@`ƽ~X4&&[U%IuZ*%JeRO2"wIyG &MY\8dvr;I񏏳f%,[vT9tƟ*9Vz0N8?J hI͙H0Y8> ϓt8Z,m,sb4s'ϺA^r#TrtܒEy?Qj%>)L>5p!%XS ?ĺDW7Jʍ:/49,cwXTn\SLfD9ju&τxw՗YJrs\u[Fkǰ7}NJG60o8I7 ~6-W's#ނJnOsX ^ljqs_ߌ碑2}Hf{0i|(71?gq/.Dc\>"w6_Bf鋛u{rB!yLΆQyfw4˅M\\ԓnxVLgѶp-!B=7l1>gRԨTJѸ`^| IS%)_<S2loLRZAɘuk!oIXM%U'y)UTZdNAW xznbYS~3 6GXo#SL*PB%wzbmOԯ*WrtyM63~0Gr%aMiU3vIJհ [wMZ91CJ4h Y:.=qo nP9k*~oLY?c =[֢J TFgdc]_<kb;p'R.MWgƃ-YUt`܇=DĴQiQ /gi9_>Y"3|\PBe~n/C,s%fs|\gK'| R8\G񿠸d1{:C"-aK\8掣i6mv|s2/%?.aU;\FW3a}x_ֽ>:_z|w4ykqɂáD?*q楅; 7%}Ox &8Gjeavm;u2U.qA='r`#zt=-cE-O1x\M5RԎ\)!;{w]uvʣ zĬ[C;`i T-ݙ14 JKZ67:s%N#?a7,;k sC9kY$'P"t線o !~g~CG5{<칣虍/Y>yo:Ri3>y]_WNp|vϕ92 sYҎN{9sOVms#JS?)Q h^,niWGȴeL_zTh1?~*PEc=h\֥ߑbŇw~ TќARrLy44)hSTJg4yn\NogpT-3g?m]TS+7_Yǵ~n 1]^ѫOAD۹%@ߙbmLXz.gZ{(h,|wf'&ehϻ #iaVl[x4oM?ԹۻTG}ұ@SEO @}EߝwgeLM:Ҁ66Oqĝ`6>zur?N7Udgzjjm8x7b>mjWOQaЪp _^Ul_>g!8p+֕hA3;/N4; Y[e١T?$0q #yΟulxt5MvOeշb<cӘ,[2wsT+?w/,Y#Hk_ [ku p/^AUhk ߜO; mXU2Yױ&\#A񣜏lâ3qPjQxswv,Zq@]_5Y#QKEez82w%5c\ |]4o?`e*12eS VLR-E]]#cVrŜ6{r2`?X}:D:E^:xj;t>&׭N^s8֞2 r6yٯ>U+^U-vJ.$$roIo&.sY>;yfs|Y"G䅢۾ J.᧠/وAO]DA\[)W#_e(Ge~Es<:-x$ UZO4)u$ٚxD~xեwnfW}$` i?h|k2txLp+FΊ_odA6E RD@WrQ[ؿknWNDFZխ\ %Pu:gžz'GΜUs8FS%6p<Ɗj܁ZA[%ckG୍MaOP*y.!U x>B#P9{Wbh# wt|,8 Bp#Cbb|&}EC[cysq,ӧk5} 录͒ Tr0x4%O祥{ %`;`H~U5vJ\9.\6#0lP9XθưyE`Ɲ˯&v8gtu wڏu DF:jT,f<^iIᆤTՆ) l.rP?LG" P1^WltW~rz#uejl_>YGʽо.٣jQ흖SՖ0T._>|X9;QWHk jHt Yrex'hn7Mzqg8ZW@*4:/ڒ\GKְ2Ujelj_QO[[Of3ZxJ`S^҂cO7VQFI=Jv^zvFuJO{`\n,c<ѻ,>-ʣ'5&ˏ9M6,GѴVuz~#i\EOƭi^ox͘V,i*>B9;#wfюlu5Mrl -\ 5+y8)JGtm62nѭXy܈:P9OWn/ _]3!Z":ʀ;ǽ-e5LŊ5y`Ak:1{R U۽k[_ j%_-YZgΞxC-*W@ϱK|^5nHbTH-n}tmxis,DQ#rh_Wj,m6lh4ׯ]M1MTYQ_XY7v(;'n`n@:@ÆWsx7Σ}ݹfI%BF?r=ٱ?ezqf> 3>"w6_Bfҋ١릮Jdwߢ{jh4 ѤM+JZ$gXf1``nFDeTR rZXO ߳9TUeIc,_]r9,U5#,V^O\\}B!à r1QjvxhBk =@C@Q<ݰ!҇] !¥Hj֪Μ&ѐ ( ~ -Cz&AB!@bb"DFR|yʕ+lBUGي( oNZ?B!B$KLJB|)rWjB! [!B<~B!B܋NW4f_^rzNv5eBuNCyq7sNw-/vK5\./!Bĭ[x'Yv-ÇΝ;.ב [!B M{ @pp0L>t=lEmR&Mִ MZkl8g@ִ aay|lRknkB3z*v~ M~޸_O~'O\NFᕼP4kJf6qs^3oaIY\M4fW͎׵dJZ4Yfԛ/|'e!lrVcLzo. oF3&ڏ֜C8'oY"|3wzѡySZcd 6ecRԯW?uz=G2oBԾ6'7yN y}~htv c秹ի-6e.&bҹy{JJ7_zѶYSZv3#]YXnmݧѫMCɸ8Ki:Ȯ o}fp?KbZ ^12`]mb_?bsu2^;zP=j# zFAua=km+|x^YCwFo1z1M}jIY.nvz{ej§['"? hGۈ9c;@˗.`ټ2Y +?oέ1HL`+ aB;o=sfaoJz$p,߆r_vޞ2Se~H7_`S3b6|Ԇ|To]ܮűkXZ9WOQsxy֘Dyq\_M߼R ,jo>ϔף(]A^Y4eKFsg\Zl|>lw;(EBfoZ] ,ܾy|a{ IDATx (J/#*<|(Ͼ59=ߚLhp>%'y{-t֗;@ <y^kvAd9z[|dp9uQVYye狎v5lY\w-v}qָS'WL\nW\w썆zRG;bivc#|o&:>merO~3=衠,Mټ ?Y*"}Ea-}/~[vbۉ lD1F;ز|whQG|$ۅH?57B9+7rH劉;w_!z笩8Bju'MӓdUCܺuKzU{NŧL5 믄ҿ?VՕlenba"*zjTNZ|i){?ͿNu1_Zʰva4iҎWg'Q^ǽqJBz.Ћ/&_\o<0bFIƍILH >>fa6|#F~0~'umNa4 o1f͑h .1(>J-iټ)M;e@KGڍ'f6R|Ⓑo=Л|)\]mp+Zp*_P<71|rՎ> CÊw5Z~iUnʕpvc2q0^e+"_NtrZ{j1q9-1Dŗ2ގb,m/e<|eNB wäe:MKi̊'i35 u.%]%۹faxW)Ŀ߾yQff?yey)v#|ib,ooūLQG'ߝaP8dνAx;}a8o|c;}zj֍t,Ĝ<͍+&ślԔ@ua60, ɄlN>_YZꇉ;p*X#֌ΥnG`m*i.Gp]k%* %q~¿7bybm2^9Y}\_wOnSBv?!a#(܀7/*.~&\'ڷ3s{бIMzyב4B>oj-R,>GQXt>֒/O/pf}keds-g|i˦s%ڌ3Ja}>깤9]|i #;KkS' hp_.<4zJU;P #$e'Gufcv_LJ!x& |לWFM/zmڣ链| pT=ū68r24. ! l y &szF?f҉_&Qҿg ^x|@߬w9 "A;yJɂ۲x405.24>9]CwBWVnnÓqA}A0v?tɧkX $(وڷ^̍x W(=5#Pc!_0{uQ߀L3(LJ7|) !^.lq9^)>yY/峝~e]s~zT<F'X1o {} x&h4ׯ]M1MTYQ/D~9ufy,C-~?iu/o:p n/+jWCB5V+tc5(B!5kְf͚,WQUU+WfZHc櫫ໜ{j>>Y֗ +;;t1B!4Əϒ%K -J׮]駟R ƍPbE6mʴt,lRQB!nqM&sVE;h׶ȳW͑lџy.B!DQSDws5J{~a [!BsG!B!B!BWҥ%eN*鵒Y %ePeZ$/KjI~ʲM%C'݁f] ÜL#J<%]LJeJO;泖mG3St-1I:?e>WSK ;)榴VIM+~iYP3<)@jN-:I7O&IewjǦiUUTL&{%22 B`Tbcb 8 ;::,bc4 kwnƠTEUِCܦg6]u<[u<:NiXoڄxJ-XجV:l(62y b[on:NʠA2'lxzya$J-uX^jd6g'B!g*6MfZ}s?V%ϭ ;!1^{{鉏[PlI<$J-uV$B$$hNl닧'6mۼ>cy],\wa9s@^:xe>|fS:u=e)3)(W'*Y$=Km%ҵi:Ջ,ulZvi1usAs5]4Y&i&m峾Nz['"iKgZ6kBV3n說~cW3/:4 26/J2*5-0N[4~Er?HMO7.9-2J=Pm6TUd4ra, J5_!96"X=Nq營?&;wvewFQ,ѿjAUmưgnL&STqoQD BdaiР1Za48uzvD9q(WDQ4(íBEb@VsĂ.VI Bbt뼅B!Ľ+9( o&11K;yd !јzBMs!>Eht:υEBd$["CӋXυEB}d !Bjl6tQt:ZuB! b(ʔ)z52D_=ńB!"mdj%66zcZ1@{.NhZ:LE-l}!EaFłl!44`GbbbN0:Kh2XVwbחR߸NPPPԷB!(||R[VQ&F@QrN8::jوn$$cuD (QӧNV)}L> B)K22GdTdAɮeUm6 #&͆M Pm*&jFShVQaoB!D!N?2|ElVkAˮؘhʖ+::jSe$QU6ZVQyj~RB!Da!N?2lXZ WjZ3*M-F>vΧ]E ?l#<ׅoY BBᯧlV+6[mYj#b+>?anba~EN/,f฿S[]qq}wdmݑ\-[<ǿɬesiX8MU<10Ϧol> BamZemb~X:MebD/gϩ<)W }e(NMlZ%s'wf.7~ŧ׫,Y:tØ 6>,΂)~Jv''QQ1Gl.0k_ 6Tl '1<ж9[ueq6і-_zy8ZѬUG|Uѷ&o"uy"r֟LԔVy3,kϟDa4oۓ USZ>};dg/0c3Ztʚnˮ]C: eFFv1ri ޚa-:u6]1f{n0^&F @mՊdƜrS<}8BQX8 m6+͖a:Ys(T_cCœP͆jϟC2mEţ?ϋM/cYmif)*i8Qn3/ 9x*^gtck$;=g] }o-d'HPAbKϰ8~?( w(K4go׮uLꕶ&?MeÎuQol4|bϰ<%lcِH&9ƒ-y]~6-eҧgJWF}Xݻ1NMKi[<xk.'GXc)ؤm,:Zs!pd[mXm %ɗ0K7G`{Tqo~]ՋJ=juMM_y8:MǻUGa,l<(M&gG0{b=[#O}~d{l7p٠bϗǂ=755(TW?mH׶>YO]0FЄ_6pɘweOΛ*77MUNeo]z1[6Z:z](Gt6Ͷ׷2 5{_7n\pCf}Uu&[/ ơLyc6t5jEϦ^%ouźoybO|%ou[aJ*Tg&}߬ϣټUəR˲~|TЧN1e9BQh8 E䱷~\4'F f z tD)e]O(^ 6E!uM hƂ_kWcJF'{fDw(?zսT,q牊>[ҪeKZlI1H 'K@s2vX/P-5O IDATbU6]">y?5IϵhlFl6Z`ZU1+DN:czuU˖t+񱘭ߦ;؎V>WyEΛ -=L%kQcù @Eo-b h]vusZ^עԣI7O=TjFoϺb%oOOHT ԡ՗"_k^?N{n1B! fV@!gh <݂!#O,SPҳj"_ƻY1jQRUlgK'v;54#[>Jqe\vI`-ZU+V"[byD ԄZՄњM!5 rh|r&&-O㝳$+<*n*X9m_r^HԗϒVf?@;߰i lg1dwݞJ,Ҷӷ2 <|iQEf5k߱% AO?]jWP%H$/󧌷G3E#(k.)|&TՌAVYI-BNG#]tܞCDZAPAX/KCEEP 6쿅xKw$߬g^HFOؘ!n_hto|>]zSNo.ɵW70\˅yʹ5/)Mo+fmf|8o๓4O(>8[R癢/aЕGl[N^ۢG3i׭c} ե-8Xr9-C!Bl;lQY~' ( W]oB +MbKHU-;{J2hl-8Ub=LAGr4uiA)<Û祗;QBHgg{r^1з=ZoL6mq:~5<ѽ ;b3$qzt;uS3(0CѺÃ|t֐VNzy/׹5ѣᕃjW1Uv1W[z'󾝼-x^i%<_;G7Qa<`Y>m]ů1/n)exWϋ,[BUAWfd4efHN#/KiIvLSԔ&sUUMzTϷ?yy4^T4c\E &}ϓ-46)_|fNp}۴T">ZC?LΏƈJxf_ m熰6m{6fRZpO&3?]+B! 7h4ׯ]bpyڴi͙3X,^pa^\yLR].ryR*vJ卋d2岼:a?[Hx<==^Moʼxx8,BZUUqC7g;y8BZ|WG7F o !B^K3Fd@)|Kk[λ$ 'B .l,'] o!Bloo/L,Oi.R4ƾUTBQ88 =l Q0hnpc4ILLuQpR ?h4If,eBQpt:Z},^]yfDܼIb /s(n @TTkQᖠ>TԧҶ2Le*S)@TT7 |eZDFFRr 7{`pj4(TR$F ܫSi[T2L?jkpjd'&&l͈Bd|B!Ľ`0RBC qԴ Af#>> ӝ~qN$G&6.e*ST2Le*ӻ=nݺ'RM%8}$h5AFTRԻ'FEEqABBBPbB!C4jؐߝF #l{Ν?OŊ]VX!B";F :\A !!!yZ0!B!7sdgB!(2rok!B!B!B1 ٻ6$m@wKA6AET({ SG=JKwѕ$]&y=<އFwu)/tzvJz+ U2)/ǁB}cA:?+Zt׿rUW)6h4}{>҅!4lҖ>+L4To$f|$ |O>ݕt_^q,63햵s?FuDC2$txmrDcAv 'Aq{$L} !e*&K/Tf~ŭ ~{ۿgL.oUIoxhBģv>}Iy=Zr<TĦ F|)x_H &$uctVu{ZZ8zWI{j;)EaҨ(ϧi˔ טg~J-;}u3?dyYk ׈SxP=QGnml=+jw3JݎMmiySi_-Ȓ{zZ}Y϶v 0yΦWN%q2%r+nkHsW78:|[),?F$Lʳ:vO͸1q0Rih.he؃7|{~u{ۣMA>/ΠԹ5t)18A&I겸՚(iѝV18f %dX*Ú̶i-2&f!462^Xnlg-%,x $7H~ps*2oxy̫Qڴ.6u"ХD@z}LsoRpw=ܚAs=Q4ǯ?H~=d_kGwPb`3vw G"[pVd#8늟(=0n$gNh0|v_#9d>WWTa[6\ޭ "Y>;5-#8OIB>Ow%JgBr.2g-Rzէ,8&},WN^$`ܭԞE~Ҽ6\@'spKer *=ӷb$nƈ.0?Ǽtӆ{3?/:>^ugeVlh)^b/pTt//DVX{M}U41pYF/If˭иXVzY#**FϾeF܌M0d.&zWx'?oFׯ)'L;f of~f4j֋Y4qTzi1eMh!(BE}>-.獢{`U5s"UqLy}#B);^VțԞI>Ҽxw4 5>5W%P"kǠNk^l҈\'ʤc^Y:F=BwS]5 &Q[O߃QSJ8Y):g F1ݺy^a4mڄ4 1_Hwe!fs{ةBǗO .|>`ԓC< B 8::ƾ})W.;A(!B$\;Gs[F!d !%| t G&G<ƊVf_U6ma'C!{r>-,j^]^)Jl!B! =%Ke:B!x,_~?,PbB!x (gum-PbB!x\'dx !B[]L~lBacV?OreA'O:MH uedžLXӄax=ن;RƓ/a&wv79ťhi&wkٛq{>HŌ܀T^|W?QCO`Z9.'Qy=9k/ͤ_ (HYx"dk`e| fO)ʔ5eL{f<2Gٴ5x`le`i:=Q=Пe+Ҡ >_Sdۨhssҹ|uo5@aeYPmJorGk.kGj sƚ=cLqʶm~MѻR%+p I˼=랖ͨy3iRy.MVH4U>\urxY:$ BߓȚĮ_%n@c=aTÙ'h0aწ2*L;t{-`U/c!4PmϸZ+\:]`B=U/eѳek-WfQf`F}2綺U#-׸r5)~ q\1rGt} W.`/o,s |۰t'`mG,' )0|*mJ@bL8/Ǧ[)ǎ+W\bί7hR~総|UÎ[G-M=p:U2:8cN5iRYԔlk2EuU1Ӵ%R=ӅK.{(lpVOIxr??~.caށz (_v#5p^iErVnH7p55+s,UZV/K=z(cgwvӻe+4㋣gYu̎fMJ*p&CfI&ضcx75zUQW)9DdΝٶQyPcM9&N]ɖ)ǎ.;]kV3{{NeRxn$&o!Hd6m3w[аx!?:1gA/5Y404_{i&Mwd٬hWU: gὮW B{'~xN.zuP6J5K)߮X'G g=^kbdǂ q؋舽g M =Ɇ̭}Od1?_-ENNpx 7 zGq|V<R\maK&CZPG/'l#TKJ9X?vG̏]{yBNǃo,S{Zѥ^2%߭"|s0I\7yc%OFGq,`r䙥rf䖷pYi|S,Օ/rfc7J("{t?NNJ×JFLg$ۛxwq,<+cZCeeaɟӿ53?f'QScD[Tq4[(R{WOϿyg;}j֦ҽpq-knY2Ӑt\sڹI{ΈC:T҈w9'_ ƩLWzy_foؗ˟J_A[V._.j;YeCMqKӗ3cORC΋ cAaG=B])#?oDܦ%vwbv/ǀبG.ryԿ[y=R7`먜KlFbAILJg)=>OO5eh>)1cūtdui3G6:UTS曑N& }qs;2~ѻٌUøϱ`9U?Cծ$mԌ|FG!3\H3[o؇mlԠe)5.(~3e_Q>tqZ.q`m^rX]/堏#Na^xe'PzԠ6] rYVve ĦVlkSdO{ᛃ2.®rw)]fsߜ$kh @8;POE`͞$v,7ٿf;c͂M0]d-DJ.K;e0o0C,ޱvsnvayWؖܜ ysڭ:? C u1q9cnލ^;9_l>GgUF vS6q)Ɉ.b?9K8W)]t0~v+wl(;S) \H [W)$xBƧWH.?2گ#pmyd jƗ+ױv0'(u|}­*]|rvPE8:rW8#60?Fl^F"Z.b! z9~!,و~MKTj,2?'by38Ss6ZI}][I2.r/[vքwW1ז !ģ ALg^)!.AT8MZ;;ya>9݊IgJ{W-as|VWf,~2J<|=^6F(_^z%竔3yDB"vvC%)QDʟouz B"gބk7x50Y v/[S撚~o<Í ux5Z6&)[?ފeJ3OUNj)/ \f _v#`W ?y6ݪPhU Px4C8V=ſu;KjW-tV3eEWn jjʍܰugy3^v%i38E۝ O`_q/U)Y +H˼^6>( v¯K \3QG\v Ҝ1r"dzv=a$97g+RW> zdge~NTi?GpWB*X< eչjnmUlY+ߌyd9T! Bјnݼ^06mBLL P)_CNj<̌+ .ЏVL$=97)C+k;ܗ#72ky^;%A'EK3i}?_3{Hӄ]Jxx8*T777Or٥tm;9^[R\urcC\KzN6?.B< Jia5~"N$uO!ț*.\J:]]Bvr6m2~ /Mē'ٶ>dԑ'I;V !`s}ΝLB!OG"9ٵkNB!y-Z|IB!"O1ٻvWmJ/>f/MȋFx>9. FNb8w-je XiAXL{p*Gb-l6te,+*2:|S)-Eo8 c{w oC3c.5Y)ϞsﰔH)C3ǡ,xJ~ tOLqG"^Ö%T&p!r¢*.†sY|lXP/e7ƪu |ʪ͂MVۏ3moe5wjh[^GrY8P)zjHrj,mþo~w Wj=?B!DAngm (CZ;eCyU^;Fb~w胯mE 9$>+[){|߸o7?a]Et~lU< Z\=Ϣ]cԿ~kX/{y^/ޝ8yxHҮƖDV_=џl]}d=}wTaX,_ !);[73$&xC%<(| 8).2g LX=L~[HWٴBb켂ѳ=/4,4._kyH8+V\6ɏ'26ic)˸DQ9x2D} z.ߒ)p;͚)ӳUC _j0-s($ ,j $uIwHRPکqlJ{./_q[ uNT[;Ɗ:"O۰/՞k2כ<yB!n*#6$A}_7=Oi{0&"J;es)z@EfDn %Asg4Reߞ:? t,3GvLvղM;u cȬijw7)AAI 2-2%C0w_fQ~hgfhކKwu[+h]щڊگ7J]<_!xȊm̙ҹǾ/a@YvwY;"s)skaюR3ן6sYJ;ҽ2/?T9EE#dKTO0EoQq@#l}^|''n&` ^ؒ)aEɈVEMi-dGpo|u1[6ո︒=i7rr*[Y~o`[)W_$$H'spf?{u*N7sgVnp8!–1rosn8 ҝX6\Cg_c7{4_JL^1{>n#0iɆŧqiSW`Cs:Ft:-Z=&VV+܏pqǼj:q4|i"<Di">Y61:ueړRyb2U},'*31xY ڕ]s]gw~yo;$Rݱ[CPj-92Dr`\]Hg:,G.HH,EA VmRe0/mb@!(0ӻ+9[߷^_,K>˦̹4.etaґt,mָ{S?РNԘv>oh#~ ƦsH:򿾣A!?BhLn@srM6!&&FChh(B!x N ptt͍}S\ vv)Op!B!aB!(ݍU |a:YXwWOGv B!Ee޾;%Ke:B!x,Z]_>$!B'SdoNB!x=uAv~zwR4*?qEBe$bFun@*Reo>+쉌zgTXm|Φɤk^{i&MJOZœ=Sӏ~dfZD!?oDkLcسT֏rUi5fvɶer<ňseŴ-)x|1+BXɶsJי4c eD{Cgq^%16B]98¥1&tfwlSW ;naS\kC%6;+'"SB<78ܓ7T9{k9|bL0 s`2d?ߎZJ|^5\9O!o;<7b-WaSd]&ԯ+MVkR[n+~.hZ'uν{[;Jt]P ^O7/x$_ ƩLWzy_fo7[$)\uJ q125l[|C:/Ws´6oR,eB랚 ۧw4i?RXYޜ?_ ƸasM *Ҹ⹖C$3ߞXu<ˡ{Z V#fF!S,IBWhuS_L NJ{R\єU1a2g3Vƥ˩gzڶm[ɃEWaSdG܋&ǐY_ %xGT^usng0rr?v,_Q*]wPTk'x:2o]bCUVf4գMVEngF[1-۶!Dxj1jH1h54ZmqΏ}|`Gc qٺl ѾRĮNS *Gqj^?+Ñ/ O>#pHٞ;snvͮ2}6,?OC C?lL0 !kBKzmY& 0mCŒٶ=@)|*onGҔ둽'K\-(_yՕ_=&qAw$?;0nymXF?\ +IQ[eBvw/mJ_e?1ɡ\tYWȮȴ->wy4lܚ>o}şW4鏨Ky&6 8!mg<̔x@ jڅ7 nnl|d4z4f]Lywd.(O#EQ-dǨ+0ꓦ0n";g+#>e_7n>τ. l/^yK1c3u{qoK]0oe5wjh{e\ä2fJo>A!lfT֮(b򂳄a%>y2>k}~P&kŔ%oK=%=J◶q3Oh;$n-'2v>mS aG ZH'DN͂/1Ta2tAU{WOڟ^C>8(A^C;7,>?)h.7<;?< ;=>y {dDfva3زȊם!*}u;3Bܮ.qoKn: bL 6L7fvJx)P:4pS]d7'&yPCsOUW;}[_BW^ (H'AvΘl-'D><Ѽ(= Rfԧ#"6;E4* ܓ-Avh2=ж;['3bZM_N(rX*_<2ߦ1z6#0㮴wO j2qn+|H=/%(}iśefaΒ6ǟAE])fi۹_!lyP@a2d =&w%dr%IDAT>XjW)=Vp} םK`h~^ڇnuAu| 9/gR2遮ұΦn&=sONNBChRݱGKԠD]""-IՍ1 7< u1q%Z~ oM|]287-+F< 0ŞdHN|JϖhѼ ^%6^ݍB]][r};v!Ƞt.11/4$:)F`st%aO^q'toW,چS2D*;Lq[{CyjvزsJ9{쿓:@l)5Ļ a0%r q0Dct7ϛܱ/ّO(ߟ.TBN)+~F;'0!LUpze~dtd(֊1 6{>Ӿ?q̙ꣿbZĩKLnSqBјnݼ^06mBLL Pqus/] !iDRw1tȴ=Ml~z޲N3feL5&WLl:>{E$ۺ&)9<ߙgiy3yZH_?# "h>%M;ǂ)s7rbvn˴\k2HNNDEE.HF1M>dR ;&&lku~26V 9@=]Η}>m{Nsd'&%spvquY1BNɯْ_ӓԥ$B:|TXi^^WWؼy3Q|:aNNNyJ[쨨(ƏŋcsϑL9%F)uާyxAm-| J>Y_%ߧ-)rX!DQ*(JJ R]l_y8yc2a<==mN[[7o2qdEDç>NZfhn"A7?-<>NAW$ BRRrQHdKG s|1|Jٔ<ٻAΐ!CQLifާpNX%#(y0y*>]BGE~WؘԮ$k4ۻ7qY)޽W\ݻlڴ''j׮cq1W#ն'>$_S_!xT'~MgJ,Enlolgg> ΙMxx87BBbBB0q׃i]C@ɯQ+}z+^i9ľ}رc...+W^IBb,Ml^ObB͹BaJyngkjٵkJurDǐ{q"4x07mbǎ899gZFT&9d jifEjm}SJyY}_YbNX%EǬ*Y_%ߧ)Z!ăbĘm_ͥkӦ-:w&*^[>&{t܅='..Ąj{{$s Ws{ *RN؊Rä@a&SƣMR+`26iҶ_FNB<eeɶ9OϿ̏BLeeVi|ާ$% E{הrH/Eu5m EW瞬,d_>s܇ߊ +̗ґ"kŴogķi~i[ʴe:/mlsR'LsMsG۔^L&gL˺)>yr'1^afOOoy0!#oF<My41ӶL@L&Hj*YV'SX}V"KNN䩓E|Z퀃#Fk񫹆!!iVC佈|@UDPd Z:&ظX܇V-ȮB<j5/^!SB{6q9F]bajқ6FaݬXcӚ] ʜK*9'NO?*o}~7"ݏFݽV--v$)BybvBBv1FB~e*zu}Ըeukׅe{&JMDPz]G#=>>IOZ_{>1*`x,:ݞ,+LmQ\VVZ)W \# ]ҏaN%3{X2EeYr]Wf''j4vAӅu&uvc:* Cv{09NEV8NUi*cEQ1k%VRmۋGi~R4Io;"xrA!I 9I 5 _U'IENDB`tora-2.1.3/src/help/images/template.png0000644000175000017500000006356611270353652017601 0ustar michaelmichaelPNG  IHDRSgAMA abKGD pHYs  ~tIME /~^ IDATxqlU*W+zU[6tE\n]Q"N{U'v{vY-q@DAAƮD$B:`kWPѲ#E *I'ر=N2Ih|3gyyLLL ŠT*F ,S8٨I!jX† ؅ن m vGja X1K#0D!My &TBeB!P! 3ceE8CV5d"{WN/TtA^*ףK=YfU@OO A#Ϲ-EUBG8%> #BFMݚ*ÈdQK\O ܃AG8`h4q};|Ad! JxL\22("6HF)%:APtK+ڜ{%IzJuuJn.CBEMݡRD"I$Ei5 V>#F*RT*/{+\D %ZU*'=|$uU#DlƧ;~úzo-fnc`&QmV? Vɫƫ--dkɆ ;fABwA'2n[h,ĩ̻׼,>d2ac@@OC-ԭԳ=Ke(̔(7_ ׄ1$ K1;L&[λ(;gi"Hy9ži5 a`h`tt4uĸNQh. 3%^rqUUgyM~`Tz* { N]Nl1ffphFR rJ#x2J3 YL跳/ȃ ,(sL#XfM#H `cDx!QPB zy㸋N(BWBrD"Q<4kѠnN&rq;:j R>g;N9 kj%]. g-6|QE練TJϙ)\O0h.wJh=q윘CP}R;sOB&Y-V"*7*%5H$潳.(׮\]!H6e{"=r@g?&*\NK4 c7bԝgU:]yW; Dn4Ʃ=U*d#-Tv+'He>!] q:yw@0PFl6J%'''՛fӟho5Y[=ݕBC¦^sĹMuפڤ޸7:SU>h$a/J4㌊Wmj aT%Dͣut; HUl EZ )#S*}|ςsѺ+~N" "UrP*'=|H$/h#%vY{λw[ԾIr Qh]g&rk$- ˙YyvrĞr|c_>X˩96ݶUUUHH|Bt۔Jn|>Ѻb,R8|"wO4O>BLM"p_ v^T@ۘtTQ3۔QwwpѺ"H,Rfdfm,J"Hh4\p7(R\^V84WnTޢf&X[. aFD/z̆S@󘆽(BrYhDZ͞RQ"Ȃ"j*$SͣZEcVrSRi~*,@LrS Q"TԩdA*U"T" P @U"B"T" P @*BUir$U& |8;hl L2,"UB-ZSE2,4"͵+*I|c M7RAZ͕Vâ*#HyjkYBīZ͟>s̵,ZEAjAUVDBAjA^AUVDZEAdjc\/0+R +YwĤaFI {Ȫe"k Q GpO8Vr*ee NYEF*<Ӻ?9eN Yi,j Z*ۨLJ~JqJ]Ax)jjbPZYMoEV9Q끡uuul^(KZ͟]xHER ZEAjAUVDBAjA^}Xl/> YaBA q4p bxB4$ oz)Rd2JQT\A DEBEiZyxC%L*TB,P+%=U*d#x<ۮTJtuRA.]"MF.UjIDT2 p( K282co3c7b{ZJPoQ[Zi>b6[֛7o*dk]]l8P!BOPIj*z#:W|s1!L&}>61~L&spZdL Dsv Ex^H!.iS#CC]뱺>(LqѰ@>vI[)xh!@#[.jcVkk'ܿ&88X3 i ^s[",jRُGRY_q9&cEEBb>rp"X /4dWXTɃAcD"Cz!z!z!z!P!"PH̋ KU4!DE[ͩWEE[tBl^Y|ʜt %^jH$Q>իF7>y7CBU+O0d2ri$O}/lw!vemomk|UG#]vM)*u22XZ3w2.Bkg16^ ^mim),zSA˙k5[2ol7<#~ozz16ѫ4=\.{նmv5twogG=[(NY <[08qwz{GWCW9{e|F#+<>jP~SDM~sf]j&%^ż5͚,,ԭ셻Poo8Aq" *{`ghBhjun[p$ld2=J<`(rrdBlˑH8?Ի_qS&`aGF!B6*ɽߜgU. G%PM]/ܯ9j%f#;k ּ,[XUQZeC-˺usmۦޢ&ל dRQu8/]tb6 ddGߙ>N}knncf2>3Yو"*oéS?]j5F{O6OCJP5ivx&k`SV vQIw:9-ԭԳ=Ke( rBpu _+w>EQTۘtTQ$T?(ϴZWE/ `e\8/ 􆁡ב"*dE06>mgNv[{û.d MqNtT*2^Mz#YDT#GfJ8MFNDZw*T\,)r(b)iҐ6J=== k<(p < N:MF^h"ʇdҼl=hejb %;'v+. ]L&C mf ~6AHy^H M/49_tުڤb Ey3 )/b uY9XQ ]b653^oe?@D ۏΈ^)9GhD fF"YY'R0RA! / B"B"B"B"y!V|5,DZe^pt4MKT!XTE1j"Tٮ&{*5*Jvd2%W ZBj\Boylqcs2T>UAA+RPkekdlm2vȖ#beVDZeqAbG*.ܬ IDATXQЊXT0Vr>ׄU)VK98tNqȧ#cWxKEL?)QV*m=F*Y#i}phA" jvlR뿯_ 9bd9^A^A^A^A! /GP AZEAH fnՎ\5Еv̐`]]h9@N9tP,ԖH$rJ;~kPRXȺ GޢPTJ"$ -*Rr! *sW%4j~CP9#D56? ? 6HEbVs=^cfks\+ѳ}}5#QM{MK'7Z>23")Z͟鄦icEs9e-74[4 #D"Hy9ži5ZT"vsW>16ö8kܿFYCDA-3WU*UUUM 'HEr] >:Wj{zF-FE*R.DZ|჈QVF-x/5X by/ Qx!Y _o" p/$-,_ z|?4H<>Wzg? OC\^?|PӊϵsmT*554r$[1ryu(] wIfqF')Ǒ842D'f]ew1 yȔygfw(dxǔu?]p;I/#"F׍H$K^rm㸳mX}6oWy.@fy\0~kZYSܯV@quLкGQ"mWVjo05Cv9N!o2dݭqH؝L^ P5<;yrF'|aQSTɧمӼme3 34溤e2XسkK+Բ` >$n5U{*1JuU~cw^SUHjZaQÃP1-^nKEQ A!^#HXQ.Mn2r#dES#J~BPZ!ɥQTI;_o|R4xZi^]\C|-·2eF&o;5. OQV*ǡNF#f8Tִns!܇:`C?Fgͳ#ŧy;,uxALQ.3f%&Č-4>:y %w%oJ)/Q>Xniz/,8=E|߅?C%<*N$^=#!{2 IJBjU._q|\\)1zJBv4D"';K>zGe EnJtK&vRoQ>Y>Sʠ7 3415d2u4Y0Jc80l|XKwP4M0'(]+%::tOy+ 4|-ziN}7NCҤtz80|ɌvҜvp.p!DKINqy!ox탵d2a[ o=jzzz1fod3W6lv&ww3;4{+w/&H8^r؏!+?(L)#o6(|omRxi2ri4x'rBv זw/s"U몚[IaǤ~*@fbbTsJgLi L4M'INtdbb:RZlWsN|7ڬJh%DDnD'R%!N@%f  d@/ X-^AB"B"AvL&vC^r Y,{/;sU/ٓq ( YdY3B Fe{)&zF|B769_viz$0BembG ~84M_sw7I\)uͪd"KD|X9tag2&ȚèbYN^]Ff8HݡR7;qU M6KCQQ#ŲASf}#a|Qݣ>s&1y卖j^[ X5m?ICLG3]r@["HBe !@/ @/ @/ @/ X^HR%A<dQҠPtJ$)Oi*9K q,\/ J*%dmkȥRޢ4cmFr[vav8yT*keBir2OLMt|Mmȑ.tl[rx$I}k{|hX7_/UU 4 N L1͛Ƨowgvav:h^o1xx7y#!/\"&A\'q/JfEQsiH$o{ڤ^3zXEݡ_wUW3w&UX#Ks_h Jhy UTZQ<͑b.l`p0V?ǿL߰\v͎[C8}6tO=!UUU~ة" $oUIĘs ;h8WG :옧9RK{f]0 5i./3}44M4ڤ PmV1[^o h\eة"=`Bv޼M4=cU8s80e%dvȹ+pMӹ:C0s/@)Uy!{x±B2;H(yGZ^aw9)J!1BaTcZ:ȲC^('%A 'r"Ȓ B"B"B"ex y ed 6WtBv,2K q,\}VJ[ԡ+!΁ uf W9G!>OB&Y-V8gak$9v!HC86 2L~NHȢ! /+F.cGjg[+I9H #7bY^o ~8ݬ n5ݙf"h5ut3YWrC=<$q<;Gy|  OR?H8q3J7!{WZB$|y._!s,sdhDE 0l5(~ocB#(Jl,发w̶uGW꧔y* |VcLW K[\f+@I5T{nph>KfSH٠AH!] x]/x5B%]{y#/ED1 ݧ ӓ]B g/Wj]NJGf u2ҵRL;%]+9 t~օ ]~A}xšF[/mto4*dq{!Č҅Vp]gpvEݡj74@b<DI!j6BZQw(bƤkEƀXP~>ysIYG.?}=o6X$k$ ZleOUZѸ^r1bXձ޾^Z=fVzM|22 9cΖ )./{yWWWW]+7r})p^*@P4pNp*"~VC`DUD̈,SB1^A^AOxd4ڭ9m5,YB-Zyɇ@P{!Ңx;$Ov ;IhvR4CRWK*lOz٢~{c6~Ou[m3O֮wGFF1xPrGHJP~Mݦ&pOʌ::)м4 d*KJry2R^g.q(+I(O2]=n6﬏4!P`Cy |/\y8qwMEgμ|2RD.3[{"dQN/Tk⁥[Z43[{"ƌ\/ {A+fsK_MMpz+exִZ65欪E]M& ' lsaxhSRBw7g iZQi0?Fyh+66.? vI*56Y,0* S]$+#p~JB j]Gn Y$DZp0 `e\ HRgy&r4׿M>!B#^ժn.n#w"T L3@)/QY]YMW߈s!"OrbÁ AJBOש 6{,!KVDZEA,ҽjY,{!T"+B"Yfkj#@/ @/ 5y5?^FRޢfzt8Kee 9^(O9pN}'^>S1 yY/Ɍ AD.-Tv+'@"^vd2c~n&)*u vL9Z2I)\QԒJR$9H$IzJ]PǽO=flڭZ}@)Ԅ&''՛f`#quMMM2417lp ]7Qwe~dk]]l8@l07Uɼ sn?5q1y3D}8" MU>< d2a[ӜI+Y~OrrzzS}A%LOO'IbWofjkdV̉NJ=ܳT"d&KfGp$ B8n8f?(L1Bץ'i=v<=F[| a`h`tt4u# lC4Xb7bMgŮǪOӚп M5[k_٬)oV`2D`SW+c*Pٰ|I $w#{Fa(D TᘱE-(AV'&T+T !CA`/> AJQBVAƧ7%yz` |8p-z7\\y 9d/:&<.&bȾWNN퉉 "gHO]v΅#v#Fݡyz Ar-.lO䢱h&qp? eS?H`z:r>r±9-,C t%d>j)Cv8XZrnNR)m%~H~J\>taTPnpD~`oldɎ3}plNt`j~编R3nop:zjoMN[Yb޼y Pn ʞ1t)y Hӳ=(Jpl2_&IyG491W9CmWݮ\!s='0S\tu+9^1#pT{!޽$q5Ϯ 8W' KJi˫H>v+(0:Aޣǎ;:>xmdCQ/'}&rMCwJzvp`XIP[[;04@xxv>rvyD P٩{S±<{N儚k9[/xx\*nOw:s7;htt̓5\ 3奸0SH;eX {KVJݙPdz6/SSS$|X9tag2Rh;d#k~6^[vljj*gC~]4Y OjPvNmjPBEg뭪M*(z0;;Jլ,rve1WKW^cXձ޾^f'`Ѱ@մ;|T߬a(uxk.M+653^o7]< *X{bq !t݁ V{\64B"AU;37QiLVxݠ04>8њu5owZ΄$~HԛccowڏK>)3ȕk4>]Tu5ufPn';;J~O}PԕFI2g"W`kR?N@BSl!*GT7{A8cB6l(t}{YD 2gBh<8)\9 +s.i~BAĉ+s!.l| 7ҲD B#\ ;B+BIW]&rhE8)\?t B(\k'՛Լa*6c^AW +(0Dy9cB<**AT7qJ },p@@)ȥ 1ٯ)'rSxR! 9)Sݎ㎥,8KUd!R8# @BA,$O?BG/$j⡯BGovʘ dM~ IDAT\]C45Sv?HdR -1xipjj ,K;60~K! /3o :fg+4>HMԭCV[|#i# 7[~ͭj=ɸb_j%܅ԭTqm0?gf|SSZZKHJ5>?S0{0Ko?8TFZj/fBV 9|q427בt*841gWI5848_ d~Ό~:fx3?gL&n"Ka728l/#)Urijᣑ#ccSn ~8 oQ1hkokomn%,*l6x?f2jdgj:ũf11S>lpP= ] 6}k2w37vSzf2hSšLf꧴Q@tP'AN+SFVs'sj?U~:;6vۥڤR<Ȯ4RG4*;:gkyhzi1{պ*RRXWDV604@&` Jloͮ yFZ6JncF|w$NLߚ65oSFh4t?kyPyN=rT* 7⤷gf7l? 7@N#Ʀ6fM?ohlp7^onU_YHx='nUEbDS`q YdJ%OH6~rhdS 2Z1{1|3X6>"NЄDhB" \Ae"X `Dp--DBtyXN7P]4{هE-%Z VD ;y/TRry|'S|" @BAP߉ 2 nkms6˾#t%X q7W<"Nȏob#߂G|dÈ ?F.*kSR5j /A>,ܨCD,Y2s :ZHe8x8ٰaC!!<&T)v˫`cLL%R)9<W*9rqwǾ3>mLL&"1t]L >9ԭ?Kisu84tʴפ\r^}Ao$mN뫭N>AEV{z802GʍJ![|2^S(쿅HsqrjrO!V3>խROu_m.~`iY#Q(G4D?矷Fe Ćj] ޤV>dO"c]w: <Sr _'NMgP#t!/" tdfο@P dW㝼;+mXQU[ ź' q;TN7tqh3.acc|yX@M$~2T&OLdL*ԭԼ#,ԭT*Hg}L~bw= P:!8-@*Rw)Y %ITy.NxGlt. w. ST |HJ)XBh,RؕJL% d8n6pBWBA~N ]=5.U@\v{ ]ET[T q êK]K6^ \l&rs3aRQw\`Ǵ*ѕ2-SsޡC-*ˁ9^d5 Ór 1u%2(=sQԐY߮JPivw4Mje^ 2!u"5<8脞> hȹv"B_ǜK=$'hBƸhcd, ZQ͡ !bfM /Z VD ,fLH"иV+|C LfX)_E}&~HtoOE[2zКH$=J93FmmyH$c )_17, $T|1b89NG{1I7sݧ6JT-qs~xT@Ti1磿}4NMMٻ9 *S= |SΡ~w^;W]B\i6h2鼨ʢnUmVݼyt:]U5+ayfο_h '8_莮:?iׯyL3xhhK/޿V"BLyaFڬ 3/o2{xC_tu ';vEݡj74館ʢBBEFfFP20!Ewa6;-TQJ^lS#CC]yw}zNyÁ<`S&Jyy==;ڥkFS׻]EuEϦRE,2l?|S|E# 4=Ѱj *@Yezd;li:cIV*]+53lHaQտ_ `k\^f@V4uUP}t:M']xlgYXƿnB*:2H? 0>m$brR鳏^hV/TsaȒ2 ^t42;MzzZE-ڭ zc1j ߙjABA ! ЄDhB"Y77ļw6L GA&ۏS6AvL&v5_A._q>…7J%9p$,HBc!HRʍJN}<;d(*ɴ-y*}Ԟ5A݈1IAC7unvvrYwN6u_7/ yF#gAbݽXiRȉ62i)p)漳'Ԑ2ڮQ$L6nt"#U=kBF[L&mMOw> Y2t%ĬZ/Y<=~tu:}2n_ȥP(OuhqVH f2 w q>]Ʊ1~|8Qî9 T]ULV)ZYMݳVki * mLVJRjYOuw3w3C"rf$ K1۫Γ{/N n.n.qqactC"r޴ZK}vHꅆDj0`JHv`YDj5ِ:0^(oH D34wkRqFYD4M_UqyhqA.9Ba69"evuA,5G6Kl':.llSR9w\k54.4RgHW2lktE.NLr0ǫ3wf<я|w}53- S7e^㖾>%,J˩nY,6RBXIMgȴ=0L?UR[bP.bcA5G/o@*΃몞xJꂓDX!ϦĀ\(QX!/6ȡ'B19(yO@ CZV m  lg]iQY1ꩍ_gaSrD6(@C¡CSWh=fDFkW6gm?hvd62}6(rVe5ֽV.ۏ i1er-2O< 7/BjGkUXd @5l+#q lW_j>'^ b )q;#ECDtqRbdcQ H+ DEQ9Tw>7 n#qr"WR8P&aW'GJYIaw d =RtakG(Hȣ$E!>! Z)Cú}xlf9XpZ<茌Ez*Bc6'NvN%ONL9Tjuk+alV}.U͏B:[/> %N㸎:$L&3mmb&H!_$ AlK I9RqD}cHNYH,[ H""L/G!+w=TkjXmmT*ER#TD݇m6)7."~qh91' =DgήlN/W ^)rN^͋m6v[PԖ˄&l^s]n!],S ?l6cSJ* tff=wC&Sǘk̨M_Fr Ie*Wj!x1|a8NwxiM+cO _h's7܇Ç~lw^CC37. MrTEce>QETT RӡVjٮP6ybi*:/G#cQyg?eSWtw>v/;lβehȮvX6&98ߦ[i!)ˉx]@ st&4 Β33VTrbǰ+*y+H +S[F+lҿ_X,*= rJ+l6K+>Ϯ?)2tqDOBC١7Q)[=੝FEVj+darӜ75<$2 rN# (sV( yjS@]]HS5 @!]@.fvlv:jG 7B - UYiϿy^t~RƆKh{'^lJ$KKKx\;W$@}tqqqB(y|Gթ]f [ˉӝHR;v=+t94xa0GQwͬ ьca5~=48ۏt(s߻S]Ym8̶hI~vt/a j_׾}7"ݪbPJm>,Kש.qcKYɣ2)n+Wy"f'>d2 5"d656 Qh{a-Ipۯp1{T8|-S6juٱцy Yk7ۣ^qF%a>Ο,d$S'-iDm|Cճ%RI6T"X'C#RD?+{05 (y>XpZ<茌Ezⷊ&֚8ax`*#*5!9 ygvf ;Mo9Ǧ&ī׹w9D#-gݻwyeI'Ƞb,?pd6!\l[(y`MГ'Qy+>!"~-Rt85IB~6qQ$J_級Ph)z*ᶉE9DNPV@CCm:8mjZ% Aq|)R$jBULlnnnsUAC_JBE&D@W>e%Id,2qeEtIDATB{;栿o?xa{+<@&. u!1i1m܀z'N9&L6PJm XPzt9Bvݝ@Rc+w~ .PTkr]gĒyl)3iMۊK@_ ˖:~ldllZI -qk Ii1ۈ|-.w) ɞ={٣ho_'V+Bj&ՌsfX .'un&VeH |8n }CT-+ïˮC.gZî*DG,{xoV9c': U~H~М'^.pO F0](5u+ 5-]jžwz|;I0.H >"2 E> 2 q Bo 8d2l;3;(e7V,c3 q8Hny~ Q(X, p}* F@8cvf#CfZG!Q; yZ<̽wܹ{{%'%4MFAu&Ia׆Ͷ{v>I2< 0$IJڟ!MDӧ jP Vh,BOTd2 FQՆAM899 --J'ϲ/ɜ]HW(Ǡfj<>)#UؓǏ7iR y],6;>.'EŶ} :7oڵjjrDG8^ `89;+\I|kkxm8l[TT*%EQMA84EU*RESZ88"ɺ2i:,JkɁf=:;IQ>) ֑U;z`UJ$:6H,IAH^K6V)ŗi6Mֈp};38ӻ+]z(TCHjЈޟHU< wW)jֶZtRM;mr?rj3k*촹xڿ*B٪o'1cˮun}י-"bM`ЫӨ pwWU]ٕ jP/ JybZ~ж&K48ϡaЈQ;eE#D;r]h?n[M 6rF&|J/!D)l|<:AF,KFFϝdM-zs`|TLjȧt <G.i𖽃*jj3kiKJho]{G}fGB`mՒA`hI;3:BVe7$Y{&]ղ{*CҒ`My:I˧v7_'icoKt_"Ǭ%)Z`X9^ԁhIhr<? 8ĵnpwh_xO>B Z%IGll]Xu. G0_Zhޜ\=!S?L4w.[pPV;@o~W4)"G=Xtz[ D7KNmh.0RR8=^Ls󡿮+bUn '}rނI)'<~WթWrBZ4 BH H#>3u҆/[[㈢1k`1!Utq#^RΘC4i&Ϻ/&'3;_WY&4-; g:mC28~߶Lfy557t i-"3…%gjCTƂyӶ-3ܼG)_Ύmy ;!2с՛m(AHKvg.Тqg+T-BYWW8[S?ݸpb~I#6zU9;8~p˂tlÄuYrRSi6HRpۍ(wv?~fٲ'Ny|ユݲO,^!9j4]|_!ap,1]&eɘ< I"CUoV)3IM+,Z>d#.w4B4|x.dC{5]x *Yx[@4mv>M9$,f+ҹp:LxL/ubH*OJ@$,wX]`tɡ .PZ:OڂahR-23i0 e v8o>t'Ix-c+ њZƧe I#tkƱj1doZ-Ql|9l{)I43_ZϮRkŭ~nu]Eeh?ZeY[^ )?os[!8/yf0ʕLPyߏ䥼,p(ݰ! 4B™<R,!DdZ1O+3b$v:qkwdEKkׁͫ>x0Rf&F ݻz~~.K¬*4ڌ'ogi0J)OKI#,Hc$콙ؓb!\X%%L=8%Op#ಉrU9ۨ܇GOތP-mi0&~w&مgbl;6)Ht5%-2őm$}D9yɼv?]2V3w!=)]舟oMG6=OHHn5˄ʆo#Yg.8ؕg^S!¶#Szthyܣ hİ0+s۠;^=f¦0KV;1)*˗8cn_oͅa&ʫ3om)8CIGx_.ЀSJࢉ{"M1TOx(װ5 aˊ姾WT~L!,;/*;h|#AiCF$˜L&Ad~[@a!(fº?C;|dpl=1y|C.Bee8vC mZ ?*Lu:* ʁU9S!wnjn[gMɰn:a0O6Bl&4%b [.bW6R=LnӾ;Ax d(_12BՋ/N->m ^yV;9@HGo}p4Ywcdã[bC؇;XP4oDǏ7e爑QǙ, !˲RRR~駗/rva = @A00SN=rСrrrqvurJzEJ#BRԎm۵ZQF?GRܹsvm$+>uC [ץuv~}݂۴ jߥ)j8i????!4m[6΍QeG>0(D/ f$3lΕtu OߝmG̜ۧNJrk7S6 K81wGgr+ÞBx#{Xs!' +nnft.L,G']cMK!$eO59GgM)菹8p01vrVԯ%twcׄ {7]j ׂGV?vOj5_6G+3_>7qXuZ/ kUȴmڐñPS#w=κE6ׂρ vBPz*[FCa^0!HdX8nR(!\zUn,n!jgI_)2ܚǤ|~3M T2%l:-YoD\7 A ]˻e+&u_!,RpΪgI1{%m+"Pۜ]MBX}j#{i%O]:uvw|7|UaR;ljTrEK!jG/%X~X̆M1Injuo\>j~VWVb&C!-Ai8=rG~,!ch8|XA$wԭبRkn ߄tjwc$ (;PvU'@ʮw"f]'l{*S ͉2-<'눥zioo?C$i}cqWEEG IDAT]i== s9UlLe4h3.]£=fwxTEc G~{~qciBQ߇;e1b''7N/lJ*NI<;$,cr{g4O\Y*0_(Jðn֯Mރw!ԩݳ059n'nӲR!u/ܽ- C#O%ƴnK,cf e)b.ڜӗsڱה#%d9T h=T\tcgȽ93/βncƑeC H7!qq -"c7a QWSxM4RV/3cήjXEMϒ V!o/إN(\ӆ?nֽq.|Z.Vhe!h),W><-O'3lRZ-?MpaFYҷQ^|T*Vj44B8V0 !fq4jCU3~<ºy_w{kJ4v=yW6"lZ}avLmU0?DaW"" *繤d'/|`ǡ@Yw3۷މ߈2*Vv5=r_&5tYq kMW|ηb<^1٫Ԛ(xy*h_}xÖ#m7eGڮhCoa=9[- !|Xp(JPXZZu9$)(iR|.Sv&!0KOm u_O殻@[w\~fkݣ75 _pF(@<ڟEmQ~\b8$ =Exଦ\#V=@ AQI El6.&Էi"H*+yyy*j!R'hQwMjR.d&VΝ;+ɑ KFCSTYeGS4N/^^,ލB莅RMû0 3j9;Pvggbk} PvywOAٙfNzgp]X.`])Bڴ==[N?xQPC/ h#A ;gtv]{¬#b{ `ͭm,VʹV-f[xV>$D:֚k-~P֝PU,G[>x+K˱MDT>gc!Ϯ)ݩYHW3JE(10?zR};H庅E&n?0I!yy7y}n/\ Kzy71  mL_l}iZlEEmmqr;^焸0C'I ))1uꝱ K&%$&% 5+;̤//~Ӝxvt2Fuk7T^< /scPe=w7wBgF ز'~X=θˁ:FSjJ*ZԿil垳9(!oz*wsoG^*Z/]8![[}' iB#ˀMJJ"o3]0^;;0T$ o e1l|˶~0;BG[֛2,okXx77;eP3j*;R[APWAQ7Bʝήz;+eΤ+N}{~^"O#SP!mNiA^^>]G,==k\nfCɐ:am7fSHiiݻX53؍^FbQG;iӧE]ʂ<`3ETlv]Jrq,FlĒP*Dž#wEJI=81G47`i8έ0H8%UڬFΡ<Sb xYjrR̞~IJ.mgTqJ8%١ !-;w:IλRY3%TvuRٙ:y?^ߖ!'5R;)gaxSksOܸ)4eI&/ 7"FzGԞ_ hku@MLc5X)!svٱ %d9,'a6si {dDs?EP暫<=wEى]AA]PtWY* /Ԑ4+;2m>&p㕞 i $p@@UQqwN+{sH3/OFa[n,0&hC1?}fKRB\x#x.x{n!(T_u-olqk[=rGM_f﷭$Br?J!Mn꘲+wĭ;.?Oy/wubV헞 /=̝B ~=:>ȳYCՔkشx/Lp "w2{csv{OݽG.l͎/ݘ0,ggBQTiW+yyy*j!R'hQwDjR.d&Vhpܹ{-MQ$EQE4MSO&?ZaggX, @Uv&Ru#  @XcQO2ue@qw&]aݼ 2V ekb+U]Q8OOF/;\Nl2'WR^լmOeBHvsQ7sݼ2X<;7;QM)E@й7F7upl\\̎wW ٙ+;]D7h*" 6+)h{_ٝFs;Zb6׋sg+gql*9|8Eswc52xyms]]UvcZ7|]%{ܪ88úYn6yjY珶|Vv%* Tm0,?UB{sbIlM{$A;0[9zϮ DZxvŘf(]gEJrթ,L0 \ƦUϚ0c.u#X1 BRvdWvFbUf8]ٷɂ4 $C (e-^\F6iFLS) ]p{T 9\b* 3뚃ejzhG3VׅO -,.ɺfjpM D "8c8BH֨V@<;j5e]xB`bܔe*knOx7pvePvePvլ6FWN:XQt9QY^A9gW甝.q]ѯRb/~8|̑4MvǞSR)n%w$-;w:IλRY3%PvnU00rl&{5pvЩ JҪ;G/pݬ4Ϯ8d BקT:< 4j]93(S*DCIWZzEʴ-L} t:s,[ڲ6m=P,'" }G[)°U:˯h'w+B{cӧ{A d!)+ݻyį [bJaZ cڅL-dJ9;8Giv3a\(Dٙ[ye[WYjߺp_z;[We+/c.P_'>D] unGKӴV-3`00 &ʮh4DV|>}jDh`(:VWfgg;::RPMf9'33ޞ@Pʮp8E)rFkzQ4M켼<IP]Vv$IJ$KP,m΢,( % I&cMG-U>^zgp]਋/ tqIxH]iQ4yO.c7>B=eWi(*((Pk44E#XRRR֮^&UL#h (ʔQۑl{~Nr#Tk9\*N=, *NIyv(HnejrR̞~IJ,ʮPsIμ9sg2'Z||o-mMք6G(j;#NT.]X&stp h32aѝ|5&i%O]:uS`&nl]9+izӆo߈-y9;H/ZEn~mXȽ93| 9NRU/ wS!ݪU+_ܐx:h:+#}Ųı#ϟ)S6A4],>rQdl[[9anI I /.ObIJ|usU˸{apvs̫>~rC⹣n޸}kú4Bwoݼ7Nj&} |]2Fuk7T=m&C!-A wv5;F4ݱSgGGFk릇IܮCJUw7wko\~˚JNW hJVVk*Č9#׃p?>"k[:8:.AC)u}SAY{;:p?rrG4qqsuqsuqh9;* /py4?1tZ}cd*r7(.]Xe_խB6_sh.Ff FXwc Lj.vG[oą'u+x%nmn08OH91+k۰߽ٶ}g6[ʹ ^NcAY,&\uvq).JMM!wcqII22YrR@ qu wpKL/qqqwA@-E"o߾taKK |IP]][8[[[l ^OxBAdveWbNWt0psPWkvFW\ƍꭳDH]@4Mk4EEh4H\ɺF&lY1 +3??_&YXX0@թ4VVVl6[+|O6miija(TW? cŞQ# 40]ݨ069KGmF^~ҥd|c<.acq kC '+7Z%Ӹ-=|F7ͩ;RZo_iۦo-ƒ|<|Xz:QI7Aլm. `MVHpvad9vnL#huI ~1<_}qz̻g{(N~yw616 Fl 2ʻ(|q]ѯRb/~8|̑4Mv UMlE5gʮUj0 #-|!ZN0yCBѿg2 U⮥7o[H İpU_'7)/ *e:༓{7f`8ǭčB~ZPI f=VW ] a,|9oҠ4ۈV }MʩA@<2`7񚌟hyHrթyc€mT3ݘӗsڳZ@Ar]KJHشjuL~)K[wo2eJ ?{sg^ կeC%BHxr^#ˊZh(lܭu!Gr"m[4EDLsZX}\l~r M|e ~ЖE&S8RĪ^kU2eW],Y4ܭ93Tۘ*N,W?\ʱ"Ҭ11f6, 3V!oW0-]B䍦CVܳ!VnSׅO hZyJ˵eY~u?ǪZ@0bOcF0"xp/ͣӷw "?[GxAX55],c"-~ CFLwy })Gi{t>yUH]}[j, o_̃z7b9v [$oIDAT8̍[s6|ռ)&IH+YP1!tn緛Ϧi3%,LrS/rVEof[ l*k$ʮ~+]4ז:٨[1B i 5i5þS+?]ѿWV÷W. (]= 72^ j]_xx=aUSVI# TK^EݡSFQhRA8 q9\1d2Ylׯ4io1v\LA]6/X,Xl8zkjF.]X, Pv@Sui=D!4>nlKՔ<> icʮ0(OAaLK===! #FgWﳋUH꿲C@}"AFe> awce*;ZZ]A`0@(:YWH$Zu}jD{ʮեCttt(J Ip8 3u!j5ZӋB.iZF+gWHӳQ@ˎ?SEE]:䇥]h4qba@UY@?ѷ:}hWA1w-qTe6EzSfZc־P[wc ХCdXEs Hwc!"$~:ė/_ez tήP%b}A:D5; tPo]KӴFQTFb#5h4LfuXi0|Lfaad2a$(TWJʊf+rB0f---Z-$eWR3j|@Ju?T*ŀȻRNXͩ;Rp}HdεHޚ:૓:1IInhl,2Ԡʮt*EKJJիߤS)!Yګ+ο+3xYjrr{g4O\z)TqJʳCABܪa΅,QywE=m5ԕ]0JQ"ə7g={L| wi˂7kYS]H^%?uʮΈS)K,IU.k2~幟Me5#"niʶ5(j Eӛ6Fl)~g>et;ŋj]+Gkѻw/on ueˠX )4鬌e˺ǎ<sLۤ*qT+7Zӌ\ӳV xEt.>me^)tܭ7FڰnmFFН[7"" nOW5/ktk+/g˵DEm9K⻯[=oÂVݗkI+jLbiD;uvtpjԻnzx?Oq:t٫j !Bv~l3'"ua矯dr?<OXU!D#dmk7vTGG^<40h0zS{)T.@OOOC~6(\y4?5 [5b%u$XBR2/uzudB( B%yh.FfGr0L&M!ؕr&3uB/^X,'pd+hEj\.S]vcXeW4O 0C$ p>@ލ5@JU)y8}h4R)@]^_@*Ee)(;T"qqqb'R}v1H꿲CJ}"A*Eg>bwc?T]@4MkZZmb0 ]h$Z >jD"h40]KHQBQAr26p233 5 N]4Zi֥aQف3HèNL.26.myJ͝"wcaŀA&r,i(cihOzh$rl>lҚ*Z/ӣg`IK"ktn:f.]x9"ʷM*]s9[zyxvt.nVgȫY n]Tl8;Pvfa~⥢4,mⓉrҾN?U5c__a aXqJյYCx.NI 뫳/Nyc/Fq=FsºLI1{%m+֋:܎d؃MMiĶ ۨ*%!)p!|郭5c9-pvtF\FԳiJhY9iq EvjkWCT^eF7o!;dU} Җ~_/tvjY珶|Vv6 ]ԩݳ059n'nӲ!u{^kU30YeWuu,|9oҠ4ۈV }Ma"OE s]uT0+RNl<:aѝ|5H%.g 2a€mT3ݘӗsڳZj A]>T]쥢dӲU2eէ.nݽe_ȔW+=70+~2^_HK+\!'i8⾬f^¶::ܝBgGr"m[9"@w]i@UQhKa)go)bU* a~Z?UsvVun싦v֜t*mUo܃~n@F r]#a!J= v۷wd|3;/8̊ D$diOoT< J[<꭫kNח?1s0b#W&oce{Kc%.?.SʿY't% >[5m"iE$m{M(\>0LK(d 즆 \;2qyQsy C$A]Y9&>yo2 !V~]5Zu;Ҳ_^wz.jfL]?Ts]jƍ?Ms :7[h'b.Jc$#lNll$!PwrbٯXXڒS B)!(X)Fs^--?v }`U3&Bm _%yyfRssU[myx\䝍⊏nvվK'O핾Gzg9^ܺJYnk$t:%|aVlPIP(t:NGU)~vT"Nt:bAf7{hi5;a0ҨT7O|7Af78 Vf2ܼaiaa[[8L0fq\r&!\.dv0.oPvww#N܍& Fxz=CI*ӝ441%>3Mѯ3O& $\&OuuJD{MOO/ؽG(⸲ 2; NЈY+T*l8{Н; ?9tmXIZBi R4DIP`0j`0,0jbb/x/ Y"J`&ZӾfg!r\jZMvwpz{{FVkK5c[h0L1$$<e 2:D49gV5lY#&h P-ذv[B ^NFzאº[;4[n]OSmp;ŕV989|l m-5oCĆXUlp(--y˲o6mn[{xA[eY%!M^Hdw5˵SfKYs26}#TԶ:?>P3˲ht9gJOfC3؛:0sr._xۇ}!*}N'1{t'l=敄魮N^8T*jCY%hZjCOsweЍO.D_e8gQye(us4o+wYvZOCHE*=K r,4chה̄gӯommpwScP'ăXVoWRݙ a;4Z6O;)2TP쮛˾ug U)WZYFmwhhDcH.δl\9$gV(ƾSaE9  }Ҡ(b88ҐVłh-LhHyp~D: ˀ:Q/L asN {!u{esKMe==qr7~|W?_s{?F`QeJOfG_p YTrWjʋG%fx?Jn|){Jia;/+fm(`T\F۵O.MDDȔEѱM9\B3#6b!éT';?^uS2swu>Yq׋{X$z_qtyb\ܵSmƩs-Y -!$)cpg֐Ƨkn0!=JŲd}.j)˲$ Ќ2W*jw^q[Yv .gLsm*ZWMzEch4 >ZƼGa i}<7\∦ +G/&DON6{L*F@:]G/l^sZٺ{Z>;7e^Ge(ǭM?w~Cd9}$֡ߙC{bM58yuܦS@~sӎu~ˣƉ$r_.vTp;7*ǞUQcBCC1tЅƕZ$꽗u]/+{YYꅨ@v |NDn +?|uxϝ w۝,`[R@ldgf8ݽ}-ծhZU#4$ 0Ų]D,o#)=Mϩ_(&ڡ-˃bpqؚഥ'C5|.upkKS?=qrcmY, 1 > $!!DDF{?(I>>Pw·>\7cV>Ǘ*˞S;n4 1ժvՊmݯ_[/rAտSVV.ɒ}˷ͅ5o\k&/µ7еuL;;'VY]о{TOvʲ˞s}^݆-K=yI4Bt3Vĩ<+:rc,5ѦK8Pxo>l#T)iuQQm~θò;m\ʝcΗ+wSn'7ėmxgc>[JQhQq1܈@jBVk$I";'NGpI$w/&WZZԳg)))zjT̬,UFZ(,,`0T"JEhh(p|bc]٢\sȲLii)FڵkSXXHqq1ꌌ իGaaF$ iР22P1@^O~~~ 1@p"K2A!*@7v^{ߺ ~"+ZxA hQW@03Obm׉ßdіK(`:Ic9Px_WVlӊm:]Y9k7?}䎄 XᲐU~OCHG2P JdWU.WK[ӥmVGҴsyZYc_Eיܣմ*d:0e>Ixz9zL"ж+^$F ׸ 3Xi#IhO1S6dg/=ze,E2kqҶ 7Tt`ϊCIЎ פ#>w[$Lїcv(xҌڝ]M>e'V6ʮŀv5.{/O.u/cиũrad/绯ޢo{<%evy˶}ÊA9lxu+CnchT5Kv?mdR}ߜp˞/|<&/;NٳJnT5:rŌHK̈́Lюg&^"%OШѩфu#  hAq#f37f}-iБjyIKy8FLEp mT}?˖|CGTk8w2{DgM/Lف'2r9[yPb.zZqSAy)KX"Qlk# *M8*ɀ?}RF:Qۄp_ُe׎k ?PoR@]罚(!WaMt}M?eҽugFJ6aX˵^Ԣtc&Q10HsȘ2eŶ_W:"6i1%!*]vHY2 "}BE|Wy%p㼺 z YoN5R)~΢k8~ UilNlLeGߓY:Fbm7Gط7RLV0K=w0LV/ΙR s~,8=v:R.?-ɷ͞a3s0&G;:& `h2u(|H&TVM$w3 ܞv{2zuyr\+NM38tkg轆&NPfOCN~t>YڸxM 2O:;_3&=ea$y,RZ>͢1M hg"B1y.bh=e.`Ύ pƷK )C㻶&=vmMI)T۶mv *ߺ@UݻwÂ%OؼӪUKi))bMM+tGJJԫ[Ap"A"+ZxAU)$ -{A 4-BEW -$'!57ؕ#W81R*cރJ% V6H r+${dX~W&gJ)M v7iۿ N<ʚŒ+RI ?G O㜮9ϙϘ4xxԺ|]7_]GȲD4q4/=Տ᪊z)Is"_BYC^g ':8g~oîLY~B1q0{[|P_ !7;а]m/{w'3Q ?ΞXnly{̒7gk\w_ o0M ={p䣱9nw{@T|3wDZS ') Oa[^#2fn.@G0#Ȧ^>7uCgȨjfT QǴټkۼJ3e?'$҄U=<$c fٜn|Ї jӎa55fLt2[<1Ac$tλgO{!_D:uJq?opH?4;176D0xh)m%#}EWնm.]p\`R*a=bHl;@-0 q bLO vIUEW !^A"+Zh +UEW * =#߃ec2\[J~;<6-^0C4QBb=#[(y-#-X[>eoٓFX/*T?T hn֧Es7լBq f;%cypzaH1 vn~Ȑ>H),_)eW&LәIy$Nql^LHjJF*6w ƌv'Yw d[e!Ͽʣ)Qֱ/R^xU'0sv0Gf'6X2fڋlR-;Tn=?Pyn([_~˞ky k]qo>*foG.?/<ʆD{;_-JBn>kyO=[MToɩ*lĠՕRIe3=hFOMnI@=Ȇc ߝFatqd-)ڹ42$Es&4u5].ưF<0=ׇф&:iuHmJԅ.Tw&rt^?EjjPעkXn~Q@C*ToD8fSiuS D9 Rtz{.:ogϢa-{'4l.Of-]uF9eґڶ2M\;F%X`{`ɩ8j̒s׽ ]<ʛ)yW+>1lӓCfSvԲɔ=oE:oCBg._ԭW={ļ &` m۶o߾@-0 q MxŗU !^AR'U\W 1 >lR= h-B%`cF ᢫W_Nz^SJ{CN>ɯc.[Yd4`4؂P>{,nf[5' |8IYFՒ|NA`8/I )F0ʳs~e/'1JaDѷ]`#nC~&ӵ|]s=gV\\-@E3j#"h<{KV1wyp֍UϤah ݮ)}-:̔i~61F}MڶmЙ3NUu]߰~xAm6{UoF+D*4m-BEW !^A"+ZxA h-BkJ]>i@/[Sߗ@İwp=LNI$={]i vmp.~sQܪuqm Dw0mf|&8ͻRXPiXF.lLv17cRU~(r9<|oO{dH3ΖVO=Hs?O-vMxp->3Y27{=R4gG&DkTCkj Lksb?א_޻[ѧOBdk^䮿幕0X29sgغin=+OUB71uC4' ?_d\P,#ΩI߶5 UE򏾷rIێj xKNobWaC!VWK_*7z }+ hbȄtHyt:Cta]l+NlI񮯮x~qIf >'^c@nQ:ϾɖGM/ZC ims:s:ވ0c*W蒪j9WPK9J55sյ#` '?gQk<g >N0}+[m9J4杦$.z-u 8QH=MiH=Z@C%0%C&ew*T^ꦉ 6< 97fێj x%r}au{f+a$o>;M @i*" a=w޹'7&6fr[zN $ߤf8;^\W&6mۡVxRUI iզ *Yz۷bf\ RdLtZIݻ}8y4UVQؤ wiS?(6HLD IENDB`tora-2.1.3/src/help/images/sgastatement.png0000644000175000017500000006362011303312237020443 0ustar michaelmichaelPNG  IHDRqsRGBbKGD pHYs : :"tIME 5>X IDATxu\ltJ#tEgw?ݢOvb"v%Ұl$vaI Ís9s̙B@ H{KabZz( @U@ E<AHA?Ad eWUj0.#aB@%FCQL&E25$kJh1V9x$X,cX!}p2)JY`VA)SVQPSSkVn(h1CJ bF's WxkP5 J|&MQ`8oq1O"@)Rt:g QZA|, MU9iWT.h&b5R BP8Nl@H(ZA|y:0T́@ _`8p8~OK1H24&ˎ8#"䴲ZA|% *@P Kȯx' a(0gQ p&N=8t›ve4t~~f#\L ђFWa 0@~mSc78gRsa9;~v~G%E?X-E(ƣ^]^h ZUӓ~^a,nn90zrss(KoQmCQCi1۽\_MJl>klKə /x0 ˝?k G茙mT8A`0_3< #a\+4R" E15d/`e=SCG=jTDg2xVS:lb7cF<8Uc$]ӕu[뉒n}I<g1!D 8?;.Dpq]K'8-| <۴V6y1L˗I޼c UVz?dU PX’miA[:3 r^?`$D̟<_۳slX3(My(k2Rْ4%aSiq΍sϲfn{w){-NO$p/g<ذk>9ȀRQrΗq\[eXzڞےTkaȊkZ3r^55[SYlE/' nEwNq?.mZ{Mc7)@RE*'q$zfeV*t=':ε+/2)6}-Ⱥs_'~٫2'd~tHOCNw t.:bo!v mݱR\9=Vu=T%|6Ϣ HJwOcWIW9E"2uq4r0iݶ&YN>>+&He 37w3@?~Jg֐TnYed*9irMކ/e _a,{UAZe[D^k ~N88c8VG&fq)ܮFh~༜aБ4!d^+1sLj@[ښABU,{L#/ /#f2˴%'*gb4FlN'QFq)u9UHlGU ݼC{QɕLO2#MaywT,酢JL 0SfRihe\uGեXa(7R K=|1.vsٿI|T?lיKJug/uD"۵0Vk^-quGOnVxmgsVx̣Ҧ eW兩xx8LkU(lP@yt1N|؍YN(D rI T'R1YB@RW(ve‚D>ը|E,]o6wT1$ws2ZA&=h.}1yr-W6 R¸ ޝ^$B,:c\㜗N@̓ZHm|CuMVVJ'"PA03ILsE)*0 dvHd VNY~T]2Dde=K'=K0!W_15̔*CI!>#%6d(8K5u0נ,IH%*OdWor3iv@S5RA㥆z_K@ _ l0zK2r.]t⥈+')Pu^r"EJA(OWhl'܈H-<߲usV/v1:j{׍B1A`qQsjWpdǵ8|Jeg|:W$LqhJXA[\_ܣn%1QnMo4V ȒA=(թͯ+TE<I'fAljd%WV5 JowouD+ZJQۏ~̥KgQ*[l%_Z󬅽h$qZ<"k#%$?E2 "AY4T)Y}Je+8ODeR¬ 4u\$N 2$AV|:wr1ǿK(*d *eYL\)Qe}eZäeoy<@~m?l vK=\7Ԟ}أ.B6:SD XᇧoS E*14 U+$'6&x~.:_rm4-IbU:SԈrBR:#'r( ;iQTgݴNh|H9!^~Ǯ/lB:;9קcs| LǙ-1d{}5}uhaAvuGGwm;ƷVRP O+uvvDEό|h6-!猳ʏ׹FWyCHqD "P Y4G\?Wg4\TKBP@YU+ߐ?=)=|߈4+xq#? *kL TtRW]Q @] /+)CC'!("1!0  ?8@R¼CQ]fIUBM%+!a51AHĒHL0e+e90ɿpy ?_;#;Z H^ժw[7շ.p&|؝B@4sl Pqv$ e2s 4ۿ:,.611'>>N"iF%)O>377H,**D-@a^/ǙX]h4eeJ lnVn@hCJhEVNئr83"֚dxȁ@G@OTr%k׮Ʒo6'񺐹7r]rPщs^|,w2a`Y ֣ nA #e@``wnnRd@FVp" [0BRkuC54"._YO-`tpl@ !kXX6Bn{Ԣsiϻ8޹k%#!쀇gR;Y}e aзOdŢܜl%<`@ qVXz(?"...%\"H"@.c6{mmmcB i!9J'&%B@ i1Tp$J"ikkC@ i2]I @ HKx @`@ #HGzh`&!@7\Ti.SBA~G䐰)"JCW*"a:dt>]Lv+Ex +?SG߿m,oMWEW6nG'jF'G#ezq~eczutws 4cbQlZwBtfvgQlLZ֕M !;)<ݫy' Qcd)øN.nnnnn~=F( ܓHٹxcz?Y8EGXK"W5yy1l$s7_f}IBBzziY\.'%kUj¨ #bnx9g9gX;מMEnfzV$g77uH_|.MeyҒvo=&n.';ۂ/=ۨ")e3+f3}ipfUMF+8=bM)[g[Mmu~ zع tr exqFuR(;=s`^~#n`cs‚|=ܼ^>~_RnԸNnn}7Qcfc܆颲~su mݐFt1=zr/wwON}H IUʟ8Cݽ; \x=SAϘSUvղs{6}:{]'ʓtP2Ls.IK^z6IAɽ|<Yuԧ)(LZE^no5\di/>~!V]bb@dC%qF4ݪd:bJDt6DžwT!oQ?[kX܁&H(|_ QIJB `x)g>1t>bKѭ+8R;W+|#f]ݦGH4d$%gcd*Oқ/x}Y(BV5mӚV+}JήJ73U°⫎PpsD r^0>_X1ܖT68ͩX͑SLHMaTtge:իzĔ1+6Æ \J]*K.Rx<5e}_=lP<ۑceێ8[՘05H7" pJ!,8<<.$%=e/ (z 5+4 ea O $va>~JtL],=)K"׭<0.OH">[,^DRbI;B4[Ex&@t.GGM IDATAvu+vglUscw/ZSvҒ$ BeSJQ\Uy0.̕tdT6/)hLk5k:uDqLTP&E󬽝gĩZ?q}Xݮ 3/{b J3W \N H[&!|gҒ7{5=Go=9GF+yvPTms&Хىah.{/=|LwŊIRT"TF]rrћ#M9Qj]$hf-Td .#VI]M̎] O5VTňj@ 8r~_iOMb9q\'&*0mYnwxBܜiw{^oVZ]~DaDe'rUkʺˑAtU։SohL`J?jpTŐAƕaN4\ CVe6LY׷=o?sxXs*Ɂ^2G4@U!)2pvLa¼bq53\y@z=;A.<.ooף .7jv O*rΎٵ(kz|]@4Aۀer&eB('L?=0qj{} zg)}pwv3#0%#Os, ,NnzEeD$5vǑ =Lp!!)d*|vDI[ /HT8G\Zy;Yo|ޔ޲ܦ<._L (D3sߑ]~-N"L!sW灺_tWxF݆fwxT!.urE霻e֎[l1 m%Ǿ+LWWЦ=~aFC 49pmTr%LT B]ì-< #(Dn[q8Ymԩ޴9V7.Ҩٱ3CRQ zhx~ UH<|Eb6<@4'`oدeg74{y^Txfzw_wCֿ2~hK_مi7n>]?}Ѵ˳zy^sE{%:3cȚ~PynO(ݙ]ׯ7dٛvswJ; iӋ#L3CVNPv9y֡<{6maUH(4UW?mܜ-T*L܆~u]|: _ԭ!EU=]߅}vVWQ|ur"ٰJ-)$>.611קP(ř1t qJxW]@4>ng8BO?=d gvh_b_@ g漴oʭY6ȟvLӘo^X1a u8ͤY,^Ղ@ 9@ -ٯӇ@ #woA@ iO.AP5@Z um@ #@j:D [|ۄ4{A%YuhQ9 ~m3z'x`T[3>Fg\v6= @Zrs<*p>{:!. VP=eQw&a~!G<0S_'5751j;t8ˉٽܭMZ6DLq㸼xƦ/f9.+IkU~~Wסۑm͝oJwL{;c}7,@g\Y3Ϧ;#g>Ya/'yKёR~͍ͬ=BD K%zxGs0 ɏ8cjG]zx5 CeU.i}.*b^ԟ۷n2~''%޹}+>.4&^!.Lz._L{{l[gr$C0~Cr +FĖ_9r*"cdqnU羛Jm:L!L~soz;ېKY 9,K9gK^iD_e6B۶$¬5VK%14w=UIBLqm1Q EqUKꄬi~jI婑 Oܝ5z!R`J4,S''u2x~(0Qa~~trc{9ii*[;0jW:[ʴE)]W%P vӠ꩚v;]$bTXa2+ޭ @I" %ыWPøqY."0 #U"(٫)g SF(L*MUZN8Q¹n~A,Bۊf;8T> h4 ` *KR%ٕ(i( ?I2ȥŒHY1@ӲV%fԕWOu2!orb@ H9_0xK=+} 1|@fx[/+@fWv8R&}}}IL|cq8/[vݼʙ =*Gƽ/(Ä~-,OSL3gP* If2ˍBˑT7jeYF奍xuiM^x8ɵG_sEBVf1J$ 9]ʖ3?>/wﲼ$MNyV ;7.Ht=:ˮD'L5&Yrwߵ"9iVڳՂ׳%MI"Te{ݕ>.ywsaJUQsm W8O1"׳i@ \.fjzjM^4(ag0g?fXDtJ "g:/)lljbe|@޻R$駂MF=f?;jD [| <%۫NTώjj_!w7261o3c9tP'N43p=7^* : =4_y8 tكu1E#\6XPw+kI:R`y͊t[Uoϋg_ɬpPFX O]N( 3l[z5 w}Y[9Bu)52/Pe3<¿MيRKQ?\8-!0Y.N.eGmi9O%h!v.V#af#;۞8r[G5?yqhcF”>!e?UϬ߲ ,lۖ7-)Y)$@U rl/iדܪ7<0>[֑iuKjųITÞӎ\אfH#=!43jœܼ_V$ڼb[`v+&hksܶ5̬jUÔ.ISPZwT}QҎ_w>yJq#vbktM@$>.611קP(řYizD:L3gzm 鱞f&%pUw^}4k}+_4~ew7261o3c9FP@Hx |`@ x @`@ tzVVT @ CSx=z@ G<!41MG*űV- ϡxZrZyA4xfcUȡkkBPKPBGZve3XV=.Lѧ9s&jZxݷkD("(4 rwe_YkqNk̈V{ﻺy3AV;׍5;~͉83Ґ̞a~Govȕ3]^D8y_1o٘p@ꍤ>BJ未P-U)h( 1.]> Sw}%KL\{5)ЄqLx$P0a[~g6\+.W-5:>Wf5#©N?U my^N5JUu`GnJv:|kͥ;֞z&.QҶ0xڜΪe">}_]Zs#׏[8ܮ`mE'͚ycw];hFe|z+)8YVUF1K"Yﯟ[y 4VC1a.{ᅱY*9rDyvk/8y(i[\>x'%kUnd t!ʐ+icPf}\^;21t~ 4j[vdbOY4jԶ=҉)@M&}%T;Q3v%T3VD(V: VI 7{^YT-{Rչb)1{ƕU(&> 97/r&^[7el{z4Nl\şxwϖA5A?\A?| U;v\8{3jNA9t&ԆF~|a/kk%]Iw& Xӣ#jPUl9?4 e;}, NXsCeVdDwf_P24'bg  xw#hy;AՔEQ0eP@@H4sFF\n$9w֝dLj⠀j.sB/r'HK 0y:k0´p7S`^<1ӕ$u'=ZOqA\\ڏZsQ~{X^5JUuqp<_{(3v噚iC8bJ.6JSE1xya~>nrߎW^M|X0jBWSDyU,>b@GR*'͵sVW2졞r^X^rB<2P'-%@/0jBwWǵlg@ +Y*Jb +NO FGߤ~O䝰UWZNYӑQOLָbNӞ:F\W۷g]C+]Oaaʠe!&GE<vҍ҇/KT87ƄFE[̬ ;^ͧ/lx ?;Q_D=<(c9nb$.ervAq$@詙~yӡZcFO1BE*³4fmqEP{7ųˋ㏟@RS&x?RGwUO !LDdCU6ȼ[SV#c]gg@zQ:WT\,h+q֝5c~qhk:h4]?F%!?֜,KzƉФ h9U :~ TݩFA xYwv(q9UTkIFtcJSը8g>ia*ֽFnzj#sìo =*[K>z_~ boAwԢg$p GHt+sEx|z\{.CFO9 $D\esT7Fl4;UZ@r gFߛa9Kx$yO+J֯mtt IDATUؑ~zn8mόYU½밿u(u2X#_T}LK:U'cڮ́Q۸iKXb3jѕ ?a iqeBj;emVό1ݮJkEʁ@ -JSO  eģ U@ ;s-h0@ -< @ #s<KyZY~m%lmSaS9i%駂MF=f 90s oHi Ғ i77 r21255qT!D [|tMM;c;g{536t2|DQl̩\Xys՝.y=$Qa_CCh_ ~ ҵĝ_{Rչb!JlgYaZhaFĊݽl͍-z/Ms.[p;vFmڎTh2/>WO /3e_{Rչb}!~vj[&m AZǙ~IN}yto̸Kn>!|mo:Qڅc9VI.7Dz9S@.]zh,V>XwF j7jzUY&O(Ԃ#K{۩τ];۰5GO՝B4 _hBuQF|ŋbçWc w > BRҳb}5JUuֆ$ ՚8(6 vÊF|aCp\h>j1{gI-Ow m8ue\Z3OGv{k 3ccR7p235OgFyaRa #3L|(QvGb89v:9|QKQ,[0IE/SJC5 dTj2xu/κQ+/eK!Hwꤻ3jzvٳ|1xqʝ`dZ!!zyV&m]^BЊaC鿼sźC5߫WE>|y8SMeTW ޗBVtOƎHZ>zZ}l ϕy~ɱG?0BwU.٤gyc&msF [Li C Y? v/-i72_BQѳneKvr޿nuYyy_?GxTͽ/Lj d>G kQ,;:PؑHDY9d04˴?ӓB@okeM,eo%>{'ܘXoy5K8" Rյ4Mp-\;G~4 îF MLL),, qqqfff-@ Ղ@ #@ @ 4dߞU@ x=z @ xZ8!O G8ztu:b7X}=cGW7WNpdF vo?=}!.me\|zZy9Q@Hw[Nr%\]:N|͕{..ݣwpWqI2;¹O-ﯵ$]y8ǖ1l!QRjѾGR*=iE{ڴ+T("ʾ%;c,Jg3׹9{;rb#Rc]T4jzqޕ"vZk;D#6]G,O٬s!G0zj]FxEWraT1;Sm)ZcZ[Z:N[}q>NAÜ'|9f1[;lQl5gAH«*M>_K~@GA򎋒khusl~Y0VEgDn>bU!4B+vƫ9t]+նq送>B0,&PRj$?40`lm1eh5ۜL95_cTIԡ*-bN5|)a E}%4.Q;6k(t/IFV#"$ \+HT+=SŸVdtW<CRUlʅ HUm4 EϻY1mU@P6ZOlWsr^:v~ OzGۈ6ݻ&0D Ÿ>ʓZ=sEI8ňKOKKGYPϕ4F ذM4I'7/x»h(mhJ_1!#tdKg]s)G$ϝǑ%02(:82E[&69KVu0C R/L RkagnW! :0,Y;5 X\d4$+=2:Fyh7_UCU.4FyRWs6:c~aU&p_I~@@-+_RCBk\a! 79'!Vo{d"s!,'c$4d/s൩^i >+uoZ0t{_п_v{ѻ}/tԟPPg+bAcxȇ?qWDĤħǧTEl{TIm|vRX)5)Qa1#|Wy WA>7~r9N 89E/fqo8 %LN8e6:p4CP5mB-&Yg5T?ЗHTÌJfU%J]J|yISv4" Umtnd!¨4_@ %`V9,EUwrYLǻ?E$iY)qV Rμb,o1#t塊iagsWXPq}Taß3/3i_Z̭N/ no3cSڏ&9:bvXAmA킶 d?+a.pJo&_F*UBVN`Rsd L]we9¤!A⠁-"&@Ձ^ێ}Eʞg?/R.[n=^OR' ΚK2xNM/sA: F D#JBC ond$G%7Bz*J JDB+~p+Ϥl7_.\k26Ñ^!@ 菛ӽx=<= ]fASUH q歨nE]؇odV}k)^H&|C<6.:֏8}q 8%|<nT>{ .ܺث1t5[U"b9_i;2\/K:$z~wxY+ [ڐG9ux^[!G'7CF .$b9I@hf58cX,6,$&Z3-l$5FjUxS a^GoU&7N[4mĿQG6jm#s8F,O9ida1<ޭ=.ڹu}DMYG`u_Z,R_ENs0E<9g)`޾X6%w=1$K;{JkY >דr 2ίbLSMt'l\pzل̂씻[6ϫ~e¢rsNǦ|0-n]^MyaqٟnuAd[Uyރɧ oc224*Iehӓ .5Wq'+lÂOQm3faX FWR_ՕC2>_<̧[5o\~+Њ=>hz](EihxQPOCTCdx:U?b× ^ qRUku@'{ǫiTT\4^ o/7/9uW 9a;^:5J/g4^]?(L d-FOVXy} P&bNl3{e%ԭ˛d7FScCmo{:$b=NTVOܜ1M?n2i}v|}c*\YydN{8e-)kK g [.vo2B+G]f4k<=lm4JR^xq]iɶُxRiXĕݼ:\p?ޏ;gEU6mBzRjqch3;sKd {/?~Y䵴B.G.:nƜ-<`Hs01*(bUw{`}|3EnU,ˊ2$Vi uKGm96&BQ=ҍ)S:SeTS.ld&])\@hŞ[Z_:5ܴzEy$Ԉ _o ⥵$٥$j'7IDAT)U7U7UhTH.yzi<)oQ$^HL8;R-Fٻt6R(~L-nCqFFC VzT2dNb j5 y;o"Àf_mjKÌbUOCȴR U~Ehg]W0Y2BIBC_W7"2-+_J÷}8@M.&yzK/\;+!#IX46FRдvPsY\B+x^mј/cfrGg#Oz͆-ܷżϪ 6FT:N}Q#^M~i).xRhw2OU)2"uNJC b4p@1P%u^㤌OSb|](d4TWT!$[')2ڬ=pZMYPGvu/ I3yUd> &˷rDQNFMíxy%%umOKT f V\f5H ZCfD VR~I8\zqZFCaѾ?~'i{Z}έ8Uҝo:U?zmP"BSÁL pr!Zr苲kdܚWrH);Xk3F Ql*77e,Sزvg[WepG82 KF+^xt(X,fX,vh1Ry)r"x{b629c1L돮}]}p%*>\oC" أ#D Jc^~.kY=L 5dGmܛg3ꦋD6쀕 ϱ;uB /IƭZ9c.Fo`g\rz4鱓 ki~ǂ>N\7\OMn1ZD-أw}fF%SX0VQe,ACM`{r\U!}ȺM\FcMψ[W-) q+-l7N7*"U/X FRkz.oĭu}R=ǯp_ei/'&[Oo֦T>XTiMGZXG@f74(G[_Mm)OZȘ{\1@qIGCƫ`eX(\#$ p,v0Ɇޱ.G=QɵRSSd2333T:@ (z 5(P@@ 1.8b]C6j(9u(P@A /x )6ʀYIENDB`tora-2.1.3/src/help/images/contentfilter.png0000644000175000017500000021626711303312237020633 0ustar michaelmichaelPNG  IHDR_Z pHYs : :"tEXtDescriptionWindow Class: tora4G$tEXtTitleContent editor filter settings IDATx]wݽDAEU@L`@$0g PP 3g! 3a3wܩュc5R &5$%)IIJRQAJֽ/A*O|f h Iw&@VN#\,G֪ԑWQ=d:-Xp?PS|i}F @;PW)$MUXH\m<ƹqEhÒ>};^puwqܟEup3`GEo׃ Ws8Hol,'/΁LB_qۊ{/  (m@tV&1 O$rփ[;閠:`JRjq/!Ֆ"u :lQF6[$A4u~MӬឺcQ$NŽGGm8x dXYlz{DaN|+ΊhL{x 2K\}]_MO9w2ME#2b]# juĵX,VRZF%LXJKK"0g gܸT[a`C!QAAaP w~r CZ jYV8޶m}UUUiiYyyy[Hϰ5ڠs)/Bp]T*+dPyՄ$Jl:es\YV\Uj8p 8nNanHR*숤)Y&~GGPl ! yX,Gbz #^ Ƨ L*ȸf\` F0UmKPʋ+(OIP>|@qs^ svL-qH+lFgǑ?"Ԅ۷nW\\^^\~^^-23ba&HDg7Vb?셪M}6,)IMi ) !@`=uoVTTضMIOOСڼYh4@2`B!\ZTn|WD[TC|fˋסP @E})boVC*Q/Bz5ѕTyH@,K =R"A`QnuDU4R<$+q7kgeB4ei'g(+B̺p2YPR ɹRH >.ٜ?6b.Z L2Sϐ:nOQ& PJr\҇LBTK[}(]ǹ-UCZYXl/)1GBH0ܽg srh-#A`, {a+䐴X Q] XzӢeKbmq+-[6UV5iҤ-Z(((,))ٱcʕ+{qđڵbObR`h ( hqí^G7q(ezqS\y*AGG_m+R L\wd&dيf׋- "թ(a J }]PF 3vzx`B^nKtX.b6hQ8ypt #0aäh"A`SwRD1=x?3LQ裣 i%ggQzBȌ2hU 8R 6oޤ‚⒒;wXs;ر`(Ecʝ;H,VU R"pJ}hr8ʮ?X ee?h͚57[nQaaaaaa]֮[?GќܼFe;/<X71;S\|'C-*a,^HtAX/#'e:>Vp[ 0߽$mP7\;<pTÁΦU # pm h3 m!̌xpAf]-6trAs4:4(972Ȱ:F@\<[_rO' n@~͢ !x0,Ne:^u8M[wԔc}SJqiΝM5+l]֮]Üͦ % LQXYXP04T_8vg1Lq(ϯ̎kVZSw=H;;nذahVԍ*!iŘI|xu/Iz#xE@ :_\6u}j ѽVX6khպ<=aXJ^#ov>2`+;)*[)#V;bPӔotw ;%w{0{?o{֠f)hE%(a[)uh/s!MC+w9i w6ۑCCY]eGHĎVĪH X hvni$bGh: X uw P ?n|K&C^z ykּE,8HLb1wP 9nc%gp/^%i A0l9ġW_}_Tx)/…6n8a#%k2kֳ]ee;wI폱9K>ثCM> s_7 }aDc1\{}]st!psC)Rl9K9mpӐxD=m@(@gbzu!iX/o^|ihG %Dۓ}!q++z $q[^`>ZH";iiND߭6H Oyoͮ(y!FqHv\lĹHt gZ{Vc"^ E]N%fL+DO#D~Z hgS~F\B6,buA8h ͂N Ο %,,rrɧ|2TVT^ݻwSJyk*9GT$BnҪUklm۶l L31G}W\q%/L )4k+zꩧlwy//pbDTZl9i$\rWΚX5ڶ}eeeFFT"ih3R~mC{wu=5ɀ'_ٯ0 >=nض/Ȥǯ:rYw2̌n>{Kų~Q;h1;.$%1|z9~[q _Ys-cHvﳷ!idxmE̎Z-^rǥ6I4Vbͷ)y*)@xN96;2nMWo5t_կ0 zN[r_'>yW=;ǝfDm5;:ƉlYvtr[^yVFbe8I(Qc}9<C@)إ?NwT Jij /u3 VDH屗N?޾gƺ7Z:wœ}}spРo߶/=\{L^eSo-a*zΩ%?tאַIMmrS_6Twd(k3ː(L|•*) a vǬ}=4P|-m,Elҍj1̧QBԚRCBbck ! 4;@#7 ?uzQtb,-*E7ޑ2!-2bL舙/|Yݘd٥(㈥ţlYs19}wf9ηy1/ڧ0H;?[) [̝uO2al¹ *Ӕwnxq/)*AdG7LyA [|kE"^w:{/VaswfܜWU#Zw#/c#GL\Z@#%Th[|<~3Ƨ9>/A獜ϸMXmq]•wpx''H~͊ 9.8hQ 9sc*xK<ЉēM;c^YdK#@d$QS>*,<4"L b!L8SqF Y,z9z*E_Lk΄^+xRy)pGZ XYx[a n.=pÜe) SOeeg_|Ŷ6Ƕ')b&X/g}R:nܸiӦM6k-,,t0J-sάY8C_2Ec.ZhѢE}9쳱 'rw`š۶9/ p8\]]a(-%u`ȎID222Bp8l8b%|[y=  vFׂ@VyU+KK}_'`yi$$zCWJ !oyc=ARkMKb' lNsro*NnȐ?=\9lT/SvqGvy˷?6O865+`vP0󱭟|I+zѥ1EKy#|ˡ&l_<&y뉸;oQxt^ՊRJW~S>[mr;wO2i1G[x1bI|N%Sc s*ϩwrNZ%cP\GG \s EGLg.ڱB]ȝ Lyw==*8Rc 98U aQjxefĹl gH%ӡk%3X;L >]"@,wÍp8 9:8`(L O\rZ:Gy\E9l'REϙ΍ŬڒJ] @V\.8 'oQEx\;; ']7g2TI.~lm)s\MuM}{lƶ)Pj;a.%RSSõ8PJ P{̹cl>s-暑g+}iӦcCm=ahFK/hѢz挙cǎ w߭lذm۶P/( TVrr^CAT#@ 兎9urg͑J,r'4h 6tzh׌$`NiF^~<  @Y{DR!KlãnWS4m3^5 SJ)Ԧ0ÓW-YoX-3izgNoN!6]X)8'ԎTrS,3)m/)_?;[^++?I}S5*ӿ#g\&C) #M)E-i%˯2 xJs;NNs%/S rB0ޗSΣnr-R"ʘ#aP7YTȘ!rķdxZ+윊)RJ**ʳQəyyy1jH89؜IeEvݲ{Ғ9s\p#F1WTnfMϟߨQ#jG;z C cv,nOң_~嫮jȑg~~6njHM6ʄrS$m6tٿ۷7m4;'ڍ^E"~xA{gLt}26.\XH e@ VONysavͱ(DYEv)gؤ١XyE! ez76᨜5r[?=oJ UƀR\9e{엹a'k ܉RJYXYE (@ Z=K;_tTnhdUV8Mشwl,?SNE}řOk/|QW!pV ++P$ #bEXyJf}GQJphߥGQ<6k9<(u(Uk _c>_!JP+ P+1 vi &SBq<"H<"%:4(RCGj/;yQ W-M¡2Tv54#09o+tԱ\EG(1ItVUV^qӦNMMKL0'SD" \|tAY]xJ=rG$~?Rٱc/|W8L;=j_2xpF>uN%d.*z7Zj#U0_~fgeWWW{ 5?'S{ʳR:AVJqG}3&o3sفͺkYMz-ѧ;K9pȽw) aMz>mܭbcWE 8{f}Qd IDAT3 K;u(8zlwsjvz38&G}G{w 6Io{]'zOFvӮyR jyKl~ChT!8a" !ҷiz%@ 9"TRG]c, =Dp>@7հ-TΉ7QT_ނc8^%Xq'JvFu&E\)6rzalL s^GuT#(n/hyDѪ ԕF;ė XE4|6BXijo|xe߈rYKIM P(9_9ŢѬlclסCakXYwHqӦ+lԈr9 4(:ae ~δ1*tEV`ʩxm۶ݾmnTBiazeeeUk,Yr]9HnC ZIZ$ޕ Sy м 3 e~䤂bG$k@Xؑh0#dE6y}}ڠF(ulB+cj;qΩhTj]Sq|%s*@ٹ?TXr'a@G9{PeQe qHcYSzO`E 3 ;B0).<^pf3jIBv`ND$L$RU+tPgGĨRK(*c bpMp3Tl@841I/ \ɸ랸fG~4zQ&R˲ܕGʀڙAB;~Ά} i鎗;-AN(ePZZX/b%K;a. GQ¥%@+ӔX@X ) w~ "H(%#Z}z衝Zn R8Ǯ_]շ_; 3"\M9u|0Br]\vW*Kg ASmk\9ز쾟e=/}`J@ri .E" "ꗬ-n?)1S hdW?=bzo`܌?RcΚv2D$p x{ g%Z z34&SE 8*k3U j=9d80tB˝P0\C;l:55BmGv;soNZO$+V~9FτZ9nP9dfeW_}qz۶BP۶+?/&T 5[jtG׏I pe) 0XG\q q4·MB6T.crGhW-l ^nIu힕O* 7w'=rwUe!hvCZ(OR<Zwͨ:h$kV/HC+W?V'3j[1 o~(Mېb{`;,t햳ZGʠ%2F\T`S̐ļ43 ̔xa.WUUa5--s[f>TeV04@jjjfV4VWUUWWg(/DԳ%R"x^+.,ǭփllк 4Qb cD&@/,8j olvFt+c\?|!?2G?6 JMt  B(Y$exSPhE J !?4aի%NO(^5AA쳾Ren@G0TS$QtI?e{ʊp8f;uTDiZZZb*֯0R YcK 5555pZjjjjjvNNvND"ᚚ4(iH'~)@(evDGH ѱ5 ŒyÚs›c9L Ɵ\*910*s/fK]3)}R(l9V n.v٩i/p7} 8-]XF"67Kp8(M?I(1tAUeD(%>y*\Jb;OAtXnyX׾!(k*MP޵L2`A)uM0VD|jV`'P ښFBH9Ata^tY e]Х8sT. éiin#$TUV:ߞN$,l*N;%VnӰTΫCűorikkݡG>հ'x$vh1 sJs. *WS3F: \  M5?cf8pQA^Q?(vZ.$B_qZagkfcزx&E$0H[<\)]&hDN12{}&"kP*\) Q8ZPȢIBڐ#<ŖԧL ΍T|Ljk|o9!S<$Ȭ/[.)TыrJ0$)757J`zN5555(s*ʖʧ^b*0]K8PKp gHDq^aHx%8J oc!cԍ1<\ԧO[j>YdշDx({aaW( TKQ{WxϙHtl\ntT, Za{SQp$}$58Q>P@h;~ݦqI(zxqueoN#$6u@c@ڶwu뒛-ܚi$:# W% $` cK%qcBd`K@0V>dX1W4`F("MBR VbHRW9,^hnb|$\I ֜HTG1[j*Wkɫ@,W/qֹaC+wLjB#UkrG'#bY\c9 m;_Dp]Gm[ηYz7=&adV^oh=}rOqÑM(zZRipP߳hWj#+>G`aQSURAaoaHr9N7`AF:rҿm80AS buqtZZ9(}1>ƧXɰxSH)6n~b:r:mH<4MuiA[AJeυ #7x߉D6EVy{,C%Ϡc+yGħ(5DϩGW3MP+ȮĜU*]y 9*eXW}# !GQDWbbtH5*WP4^ɷX0\&?QA43ڸ\Btx3SRc9H/" ם jqal舕1Ef'TRYqPn^ .6Bb ЉE5;)Ė*+Ώ$s̖, :^`L#/<-M\Yū+*M\CqGF>I”D* /_IZ}*OEtZNMQ X] m->U}(Dt 3NduZqahkDx(vQyBJExnF(NZx0Ԉ[T5 pD"4.0( eb‹jMT#/6'k98F8FL*d7D*0گ>ǰj y M5!@MO3 $Q%~)PKK_rT=(9#HZ5@rB8K9t>}n0? z(-$)}.&_ WHEo _8OΞ@}sJ2ZN0 Ѵgqk 9,fT.X_Aj XOC$fJ | 4pe$oB'xAI/ Mcz .2׽\tu1䝤>񌸁sc$ՍH֤Z9OgE~].8\ dB0"p ( ]KdaˎFqMG-'F!$ 7IO֔tI!kn/"P& ҈B(I"pk*fmRJ0c*`7-Gzv%ibQ I4Wj*Oe4 G  0H `ɕEm2hdʭA*ڀ%Mp[ T+J"ZnN ZsO\/WLnw<߀'YkfD/-*뢣q4h*(;rc0P..ȉ^]"4JT 3- ~(A07W 13"h8ūTS6$FlA N32<@mBE1ndɺ欰▍0 'QLDMI$9ĉR,O"џ[P;e7>J+Ԃ⛌F "՟ 1:pMAz$Q&1b0ЗG ]Z~F!R6J\B| :%9Bs P(ڊpT6}Љ M>[qbLj*u({$l3Qj*g-tT[J"!9 A\ LJ{QM 丫K}>AP^wzj-83@2"F BtBٯ ~h,M kG2GS/Kٗ J7ݟ4eE` O0b`@ŵ)KAх` A2 =Yx}cMe49ߚR،@u۔gM^IoJ"%u5R,V`lq!r^Q_QD85+E+A@3.”(}t%?tD5_VzPKtPT۾bv%cMi@`V-} MXOe9 ɍ(+`?¦* Qk P1ETXG Iu$RgRx! uNC3*+qkztT#E)b'iL+8ՏS}t1eRN$}8hЛ yX;eSC?_tSm[;a 1{qw?B/T YLaX}#"}w8}nEF-*^EMT9].6$:IhD* EEY8-'#Ը>bD>UG-"N̂Qz`X`(xmx|(]\&UpkMi=9?+f7 wz`H5t/p n%- x-OUsyTIgRP0@!AIA*园xO[-;Tv٢omT"ł_֖+7Wҵ!C'Ԛ֩/tP_7Hhm:#w)sZa8荘 }@6c0C3*%N{ԽWϖd3*giRrIQJECA<A0"Dd)[uil +\9R>L;ZCь,%B_r'Z·EcIw0SI oCL9-^l8 2V0\ x FTAXV|ڍ[קvPmhr*0Sbl-d$ 9usKf*B@3j!n@%&{+pIi  #R1[W\_)Έg3sP_ &xA  %@ĕ*7(~K/h([^,O>i1_V- GFЉD1:+΄R`jxQoM*IX9/㛤"+b'E6tK~,[f:CCR|+q6G-|gE|S:ʊΈpckvA%˳Nk@.J#bZ11Ķ€PTv`$U_ $1.;م \\ @c5a; vVQ7|R.9!pcFhGrh%EM\&3P5xNKpr=CΜ3(b7G$|0A N"dvs]# rlOK z٤B::af5|E)P,I򗓄1t-_z +{ݩ摊+/Zz(sVu&A0c]u%^u, jVN8:qݟ&w/Bě#{aRXU/FIыXJSaHx!=mele-;ICbC9X.hg#,/~#D6x?lQE4ze<6Vd]H5B!lQ󧔰JAYH(bg?,~كS4p%}- }泎ċ,-ӗE"^:qoMm>_}Kg ]RO1ln[-o}Rc=G娊6e~]G3GݝPv\X>y@Ɯs<3nٌ YrZDjf€ :vs`(VrA]P CMZ@"O %5g^w֠cztyܨIn V}vA/Vz]c޽ױ9oM€vOo9^ݺ,zzս hkXb)/t^7pʱ. /2`S'ۭ -ٱ|ֵuqX4SzsYRb^iqGޣS/!LasRgPJW6/| c辎qL'6va7/ 0Mi-! / PYG/!C+B([t/]Ere]hO߇jT]L]/Ų {b}}KUß|/?z=/^*ҫBlgO|f~&<(#_ԶQ) yWOs9D䖛/,eWO[[<*_3?:rڂO_>s܇?ֻpboo_~6mpdH]_նS)-Ii}]~՗nhݓw}'V+ Bp^^0tܙΛ.L,Q؅![A|\F 1CSYV,|Ϣ30QΔ`5%jeyG IDATo~wnlO |⑫A㲩U?:eyje2&FgV^ջ:8P$c_EΟt.& ѸPy欗>z+Ȯwϣâ/?{i< %٨ħ1uL. MxeqLl>Uج%>l&>ψmb:fG_D=դ,~"+dvaٿ{zlvr'\1}f _skhU.^2gEثO=(;@vn0wmoc.=*1*>Ł*Ə8"7v@߼{j^]w^Qp^=(enj:c~ 5/u|/v֘֒Zz6x -VNs\<%]Gha95@,e7N3}1m@hAEH6i}:Hy1sߎ4+Nhn {[k0vӗ_rĨNr[%1}Kfݰs$۶KK^[U8ۧBz{lQ= BY'uTA(~ vuDN0~yŋvP ))Pc]@VNMgp ѧ42O0P4gM9>S䔌 JTu #.1sP=}\iSD5n)D'5Dڟ%-x=+Gnj{sTl(.Yu{cYTḄBbK9('VNG&I-hI3 R, tbjC.B93ٳ-ZÓ_bj c" Z._w=q-⑳я݃㠯rR,]Bc+'Etg2ՄF`gȃhm5m1t-la=2(ʭ9d,(r?wkPJQB&)3W֡4Z~_~efUD-TFrb[-QZ!f̰GJ`V(%;?HR+]HB{}ԃ}M(E/]`kVx{{B6|nPfZ gHo$ɍ R^ U@\sP8l]hcJM@CS^B4RYȶ|{$lN>T+>f<0q=z.q >_/Cg{zl ZeB <^}za֓Ա/\qȶHeff"[pg@WxcU,oG:%r(%g>X]4Vo\eKnv;Whkˢ=jAg>`CU,{+/tjJdwfgӿ#;b8*{6 ggZl<.vU_L"8+|b(冾P/8016ƨtn^+WIiph5;d俘jT`ͻ)իK^55 Mzz\/ sm/(ǞyܵU}&zV>G>6̺ย߽럺C.N.HzSfMfXޛ ~7%B"EJ3Xa{)m߯,%_O=zÊjt4)>wed5z`Aם>}O}v_xbQ7}}uO]QZb<{~'9gο"pL {s7.~ozsM l2Ϭyހ c9#&^mCrO4Q j5c/z#sԽKgupAt5B6Є#A FuX2w)NO4I<1b$Iϻ jʬOt_@a=`򏊛)]܋W[~oh@KV^:Q=Oa%kKF$4"pHhvyN`PE$% ѯIHHMPXlȌ5tq b+QbFBgJu@#T6 oLy33&DmzAk>%^syOCDJ)Jڱs9.!yvΩM+T~#~2.jӉW]6AYG*Gy^lO$;Ŏ|9+çGZ$I~%s'x?նEIﳍ·!w^h>Tb#90 .3QUZ&PR+vb/ĭQ<#ݣDs \:(fs$Rc,hE{m܉K$ϒTI0]4t +k@]%Ĥ׆GJ/HHV\)lPd&M IT\i`8 [P3Uk.4 Հ@)hDz}ˍ)]`9  AO}rH;^B/^+*WwC,%>X$ PT_D*IjpJpmᔉJ2 x*^+*I&*SCxBj7F.~DyY8774@O $(vT+YgߔD*IɸK-'Up N~+DE3^ȤZ@%XG%]BZ0`apR㣠qz14؟Hgɯp 8E>&\^ ZIJ_E4l7II!]zd\,GRDA:1+P[oRh:~U%ȿR>0ǻ<|n^K5H$/%19$}^RuL{U0cD*dxC9z*=2A{/T'C)N|@՚θxTPhaG }M[$H7' $vVn}^;&J|oA?aA_BRj%h%Z. ix x_ҹCND^xʚԚ?% X{ޢ_/QPEXR#qJ] ruj`J”$%tPٮ0.՘;"8)Aſҵ]fNW+&RSdKgjYD=욟*ⶨlz!.-Ov*_nÜJ`oI?쁟7.,~CsKx{@2^:co9ωOYVfWiw/t1x_Ϟ1h>O}7VaE[U ]t˟nK޻7u\>']6uΕsnq|>'^Oecr;/<آ>U堈 vŪo{bߢCμfƦ)tVd 8jݼG ۻ&FF-?BTq%Lެ>^ %s*s l,r(/prsd_8ȪA(ۯ]3_s'<(D֛YNyCWO[[ä|?##~pgJ۟p`S>/^> Wk#}tVsTy@e`n?>\8__}2}|n._;?| NǫM|r-6|܇>}s/W /SLߪF!^OŽ,YOSheH}zJS&_̽O|:cm~{릭ѢRFQ43O?R 8!=6b.zq4oֻCMyd̦=.y]nz7j|3vwYYY-|$𥳐OФ׌ٷth̜\S 5ܬ̭blҽY'KG2qz>zsK^%;N8;݀9 SY0EVVFJ OJx_F8|"4{^068 d'vL(h L>'B3y>䷁ ^rfҥpqh asPf(wt~P%ݸ3Wx^3E-BV 5joT-}7W 9M$Rɲ7V7sِ6iVǹv}vz#2'}fW:5`/,o' 2;ti?[͢@j TذiWe,Cs0ަPEVysNrځc.=m,~uGU~6 Lh*7/Cǎ:vlߡܼh/ToH~v9获=5_\t翟;I?wN}>q坧_m(_v_lkCL?}eFXV^^ D_|#m-)#![oxݭ/lkwՙT;{]jϾ-_\Й~SB"5۾Y|'PI +|`דJ6<_׾.ty v}ÖoÿBvxd0 t^͆wµߺo5Wî`Xn7P8$0 V-CCp7׾%*'-.q[Kw?F,vhzν{מ~ۿ;GIj Ul)#9­VNGOo F H d] zi[_)_2O>'b[ R Ik֣ dbKV?oq^pJ{"֜hպ`?eg s; 5k$#iѐ;t萙YYYQYYQUU733}eeeXkQB/WUN%Ǿ˙[ڬ@dǂW64:dXEMUɴ581]s/d.P3_be @հkkj6:cw'6RLݹo=qх@Vn[8uuDw|<&yVV?;JtsqoӨ> XI}>A^4Z#W@Qر64N ^4pJ{{S`6  n B]>{xy=r2-2^!gm((dL`lsٱvڬKo9]: 594 "q\h6_j˯a`@DJVWlxw󼼼VǿfgY"ekKI!!W/ CAq1KMRb粍@rmf8z(Yws!6섺7|dѳ- {ee[kb5&*lfPǞ}e$w6$/ЯkמÞY CM;sԨO9"7 KVQ-~֖ht/*b=jD=_ڎ]?wrTv:ltO4f}uXTMg{e]ZPC001PQ,TW?QlVB;~ ,:g{Νs3g)`AՈtb\SvR2 #OzK/kMVؽl¤?GoRKX C$TPV )aX/"߀3\vi¹] DF5m)/PUQa2HJLCUEufVVy+D߂?/S ŨőMC$ \xFqO 2w~f;0M>*Kia k J|D փ#*(X-}&Xؕdru(YK8~.R JS0xA@f J0<_8yW4n;%@XȦ@ }g| 1U*>ʼ_sp 5 1FQiHa!0wIUQ޸-9V)^ v4ê ݔ}J 4E{ Y_3 IDAT[ۀ@OjŪ\4k7NwJw(']U ]j8hN)]CC逨n/ׇ&Nf!F1b}g߽5A'{p$"O0||phf ɴ=5E AgXrLΠ7ueeEEy,(yWYփӛxzQS߅\9(4mnCMb, ,&DV[lZdSj[`ާk>{;zha!+rl .F>+`H$,*Ϲ"z*IށR]8g.@c*k?VB+CNk̎G9̜wjе19u bL=ơ(DBmҪ*πXhj $\׼!o5 ] BN]c dǃ82f.. \&VR#GRͭ]jM1ymS~s+fʷ'§.#뛹MYW[5$ 74nշ/40yuu'z `D5 @RUbdNsHm7S7ά%qUj:{s)V*$Mp$co4ṫ4]uy" 5kzj8)HR?nOņ!u3B!;yLwjD^]?1L$l{dQ&]:>t:Z +2%>JБTTx* 44`5=XC wPc*ǍvLr$*Ñt P`AU?̔2$f#c&UbOnӼ4N1ߘ'5g1ґk{jo>2cw~N _kn8K]u퇕9wzW,AC٫VǓsRcpuV?-ʽNs4|:`^#ykf>|,ɂO/Vιy\yWe7'խ3Ebxǂ$^Pn9FIJ!H8Ӛҷstq2{Rx93|0+">..# ,ܮrWWc$MХG uC޷zm/M`o77GE tz^@)Bpuu;6BO+h;OmUYK㩠f~2`=} lEB3|7> qZh`<`0+٬8oIXL׍7 G8oawَ"{\xg}p_v"Xv lo)8gx 4i kk?xginm u׀Vp#Gjf@U& +rݖ`~p0yc6yJl%',.zk)ՀfJ _x {H<^Qӕ&-cH~&@lAQuvF_Nw#e10WӹMTn4fVo$EY"@[XT.|҂}ujE[˰j+5/BgRjc=D*+.yaռ;y"쪌*wh%/] Qv6HnPiꭈϝϸS9,n*fXe;r-{MqܼAMb(7xSF`(e+_WrY]f 4g}q.*A](tP|3zĎ{Z";F-#ut~k=ʟ֯iYWLZΰbvW*rڳCWU<߻$CmFak"\yt%%>Ltl*84VJVVVs 쒏eL‘$ @aX4@% oSBN Bp8VEU$WxNpi?pw ;^L1V@C26QI'. ;b ų3#\ɩ.*.i(jr"CvL=FY4TSiڟnlK :~)VD^h:DMA?,6FU^/ֻRGtm㧼Be%WO cM3q()ne>5og2ʮ1Qw *-zq=.꽤a1$}9{{0MFO'"u>^4ۑB!!2& DDǛ.zdN+m}6[9bيX@,#7ya6*I_^[Ԉr ?)."sZ6&ŧFgҸb^[XwPd KO)g#V+@6JƦ3&d ̤7Tjjjʊ/DL =:vgJΉz3_v /`BV5˜[NIA6DXFjTHبbX*S?4©ʪ@)wmA+X6ڲqAcCă7Ȓx;Kyh$2bfVmSx˛vtG99۰Qsö[b$UqSަ7p/,Q`W0Qq2KQy<|è ih2jTVP3beV"s׋c荘l-Ar T YY1،ulߎnK~vkDnMS1i\I[(S_Һ|Y.2p㶩=pOmqUv5Nbj%ǝ{:2+m(ݝW(2^>2#孶/q!tcY󱙥lI"FO{Akus{뻷xC6j!/Iؓ'Sk(l6;==͍FYq8H|򥡡! ߢv;$äRBw?HNyFva#]6xE]Ӝy˪w#K/o]`1/L2?"]y~CXEo>pL8?sr*UWXW~bk{!˦CO F%?Fy;{/11)j] Hh4:==J8ah~*FHrqrKjǥ->nuZ {EҾ>/ 7 dOk]`U(h0,S< /&)k ؍[[SqMyVf5aBBze >z"m8 /W%,2ڇy^ON՗ ^S_6-pYFrI󺅣`XvqI!b@Prr߾|"e0 e*~*+' i%mnNeͼCJ$Mm HSeE m*-)%*c[όyhϘ̖*b"^߯e(1"kTN$X jHQ^,16ʹo*x InY&a ou1P"# Qǀ]n=ܭ8_~/P6m`vuݔ>n'QSɮm=d *<}SYVmdOw>okTU&th'( D'%%q߿pY&8*%a\q['̞"{x]ɪGBeffo7m*!~/ E9a\fK63%V|*az)--lњpKl:NЗd}Ͽ zjS*)~{lUiF퐳Xl-zbל9KH0%nd0նFPIII 'dd$Li mrf6W'FθwL\uoԦ­xl^kvI8y!Cmj:]}f`oڠ}]nsx'#u5v!Vqo:3,M'!-)^ϭfMT4#) J#n31FJ*k56p+O21qKT#_Т0^5ԆoPOĜVڦSŞWt3571}W̭^s[>965o /Q3  pjPm/duuM٥ޤ(/Kh`oR|:,:e$Ng.Q!q6F'K髐raP`I rV !ZlS`;{IX 6\zaқ?;&^rk%a{h2LP--,S(2 T4+[b\41 ^:ͪH[ꕕTyW& [kolv~^Ƴ]Cհ03GϺG#&_lE=θN ),USh zYlU=»)S7b:jnf\0sE49Tr[iYfL0Nvcn'(bZѯ33"pe͐?Ӟ<~ūa3#7䊝3"kp+MfIvI7f0'7y7JtnhYqKzc-0#,빜ͳ5A'-GZ<5L`޸B@3E#{zκ$;ju!i>H dq84xjy3-12;5uS8PbxX!4)6= cyۥ +jjQh<033tU=뗍-˒3i d@eUv~XR`{e,]-qx,նmsjx6Z)ejh;?cO,>2aK6~LmsO'b܉6ya5B,z -1?I}Vc5:_2ɵ(/m*Mzn܉xX'*EyG̫+TF$d9ؽƃ,whRwUhQi3P(t@H.|a/ɴNTX(ʂ쪬jT^*ȩl>=FPhpؒLnTUl =ϞɠN\[ʠ8'E.-Ear-WKLJ]Yſ]ŀ'&pOڹX7 UzNKLMٹd.윳OjXהy@Kk)6=/ ui!h/2`֌ : odS;`U}wFش(vqz)5q}٨Žͳ.T8y2RD+/TVԾfI&+C.A\fSB_:^&O5|W#pkJxxHč_3DV^C~#Z'oB&[lUK^AQ-OEq]@ ޳χQ?w+" +j[5ׯyeCg\#gR&vZtu@ 4&QC7B?f|@Vǻ08ޣlN㲋c}Kh$J=4@ޣj|Ed_X9}UVD\>EP}t'VQapVU"k P$UPpYh UK!i#Mѿbwwڵk׮]ǿ*oT[*lVYzYyxietx. (VyQ'[JO_7^ڐ.&6cbg UHN"j&v+-q:"AJf́T u.#i `)'_"i%졑=ZT>qu87f\w]u A.ľjkaM1 ؉kx&dQWި*4yՠ?$C࿌O]cՠ'RY"*c &*****j2v2g`Ʉ9s@ 5ޮ!^] kü?T*v@<eKLD.I@?};-8)SK)T~85`V)6'TM=F-#mWo-*}B΍_]rЦ3b<^dL{| ( $BIII t|Zj hMEтɮQ)rʴ]?SVVGu55}2Ǐ6 -:5j 6DHOOR(]t@ tkkHSA$E-ʶ iuUU?DUURe?&Tx6T EVVx@ \K@ iTS6@ @j5hS@ +밟wF@SA$?S m*H˩=q60 "rsW IDATqrc٬l"hZ$Ƀ|G/u+F4mޔ~>+*?cVH[+밟]w[{G'Wo KJnh.[0ʪJf0+hS@ 循ѵSdtmU$KUKfffhD{ zZj2݁n'oMGqc_I]8/?.%R ߆x۷o^?gjS$۠ZyC^]a$....!6SP{mX)M( HZDfy7-Ny߿i͢;@lֶ ֏K[,ع0:6mONy\>e6>ӹ:=%<N {^|_u,ѩϔ+|˙{8e>$sko` tnMuAݝ]]s5M| 6Efp T w.mJ53{ۻ ۝ZTja8=k}+:=vw=nݍ,O.ߤhݱR@ ݛp2!nϦ~ s qgYɷfC{>c?w7&a0rfy!1Q9m1q!9.6+I`28@P[qjcurĖpRtڄDپ2h%nd3B`A:w).[Rɲ'4"ǯhsC+uzZŸ־z8E{gr7uǰiTӓW>iX5;LR-(4|oЊ6~(Y'!Oi)Dz=6@::픤],%ԏđO@ 1ҧS}zNe"2J|@ OV:FeS;=ҌZM@ 6BCS@]R[qT#MEH@ -@] Ad  ըY$@ 8<óc{ʁwP:)TM`]|g@[|(Gb?\]ÉyǮ22yW)YiuN^;d\ ҾaǛb7l!;_tϕ9Y9Y/:P%;3 !'lz"}7{23ƜZ`eZ0DBZz|${ ֊dedx4F[?l5><,N><))pJ=g;6ĺ%˝VHD0p։S$,lJ( b߉/ >TS6_SH{*DNZ{iEr*V.C\(.S+Jr}] M/Me[\L[0nƞ)u w!˥찿VHG>> ~މȷa+$5}}~~_mɛEy!퍔RT NIWVcC˭$=F(,"L`=?/8+Z<`T1}?@皍6S'!>9->= H%Ї +w[5+{̚jǚôٰx@! hS@ FV[ʭ|cd吪Z *בB9nkB+/A?s"E3SoM ?XFk5t<ſNS"Vg{/|'צ~CFZzVvs.gg}Uk"bH'CJ5 `<S `((YRua^-R[z`(ܒ ;ߪ$eO7GKb@u 8si=7CMW :b'#=$"1*3Mo>H:#nk;C:)TMpLF.`0" z[) .sʘ+6^=ա93,\aKF$°>dE[+?x4uQY3$x=I#[4]`y+ݕڡ4$BD+orh0U{~D/bHG$ǀ6SzǖCh7 G%'S F{hъ‡do7Qȵzxj=|rũT ߦTK4d1{A5COh<>VQX3BJՅdOH"װqu4# NŌУQM#\)2N7;tqڃjF|V0w R@ YA .v\y6ŝ=ø-SU[fH#_{R7nB6EG2Klw-'ApX,rcSl=NOxue[ӄv$<'\}[rlu upZ.t;o:Z֎Cm߾yzmnYL9Lە$V^е "&.1+/:2lxCYF'+noGjՊXV>8|CRMT ^Ԕnfj4M}'#e<Qsi#뢄C(kwfYkE ZB7I|\.'"[`ǐͼ{,^u˖5gV^ 0BqO,Q}q`䴬(bwSNܸӯηeojhCDtJh0fK&-eT#ڏ_0<]KE2^t])tR@ W{ZIMSQpgUU/Gx53P]FX>=rBO~x0T76[tL:QiquKW/:nh{ `m ɛ7}F1|-m u>H#510,3ܵ@rɗErjN")CEh-.ZV׌P7u#HU0 alw7:OK K˧e0jLVNL9N,{nvW^Q$:?\ˢeV0*EG/^|vOra7,O&愶&ZoG^x3*Du -p4K5iT-Q" T:qQ~1:C "& (`QMt1E,+m*@ :y՗&4}ԂѐAh,Rm̮Akb@P`6BZ=d\8X#nH7VXJIVU:5is^}|z-/dkZ9M`X5ko^Ǿyu̅QSиob.M !QBVA*d"(փ"-pt926N(Lゴ7R@?0VLܐk9 <1Jݽ FѢJF2{Ģ&euIܲ򆝌"E 7"Xվg|e,DŅ©Z O4)Mi84u;IGյf@*>zU\i0/wOqDz+Ee7̻KbF,X7#&1T$R_!mj*ЦtVv 6Ö,ԧh碽Xp_r2 OTȋ?yV(Q R|rύe,1Ƕ$ CcTf䟊Γ 0A7ȵ&a8z8U1Vh5F-Ȋ=zuyR\ѵL4҄О/G]zkW[fZvBj  D!b^%] T*AJG UWtЦtVn:sd/G;[{;[?V*VpZvrk 일>CdǷ7kxc:&`m3xc@{^f98Ӕظj.Acj~ucܧXT\>y8YUc}mmL>\gZ8@oqsppQk̈|ع"(or}gRTk07~UU%o>'=ޢoї.dޚi%vYz2T q4 \jF/{SRR ~,0)_Og1΂o'[mKM+EE;>l_IeEyffSQ?WwB8SHs BRM)D`垟0j[ 9ɢ \g+@zk*d~dm@ -y#>p:/B3 L ; PM@ 4Dߟ@Z4ܿ"IԌ+hS@ "HG-S@ډĎnTҮ@CيTSj N{xvl<6@(b(RZq@?@ @j5hS@ ΏsV3 eTS6-{@J1?cfsﰊ^-@B13qj.]м!N&VƯN}O0vYV4TL}JL馫} o{Qz}=E_b9nzzT}ͷ Qˏ|nw/o鄜n7;7җ5yW^u0*,fRWu 6ZGX[ePM| mW(>xW@R"!a_Nlnodf?hnR!W+-_C)4 %j44vbvo+=˸JxW^o[V)TM鴠e&nKzvfۣfZ#0Q$ee·$-]=decR>Y뜼v ُ7ŗ|sNVvN%Z>Wded}L@җ̌'2|8+;V/Y`ފTE+o%jt-=>-=^B>,ǥ/9Y9Y9YY_9IMyδz*ޞ-y{07+I@IdcLWH^Q*+\[fvۓWr~FWDž'=T6V8qǯg?e<,N><)Bf̹|<$d—/꿢e oH8Of`$ob'4ˎq'"MSgҐDW BMŏd3 IDATL7 0 ]JN޸|MXwWu|+E-Zx걖Xnuz3M5 .)VV! @ f=]:3*u)S=KC@ᔾQ5fûEJb@v:]W|b`~BKSFc%L9g> =I݇+&=ί<'}|k`o;VIJm Jf+I .x= {Nl1Uػ2~?9a^@56S+Y?h>Sl!V()$(z;F6Ne0QW//n٫ s7k2XbSʬ3`8V!TZj*ЦTmǮzzdgg}%ڔ3dE[+?x4QY3$x=I#3[6,o}"<,鳘g17v-v"8Z}{KGE9GLPzrYn%r vE%Gf2oG}'oDj5;UaNYg1NSUܸȔH]EYwk{{n^j<ŧ*J?C.A$rB r KYzl67EDh%KOr5էZ Yģ]G);6Dߠo+kz SjwM>;#tPHT3$`5|ٔepN᳃H~Kziעm{ƽ#߫J6f$VYx*fJnBuN1b`f+%(P/\!-|ǟA^ٻ=úQ ׉"[eDF֪Ye5^*r ^IUE@Gj,(&k w`[A:`IGj]~^ty"l  e޾XYif@ ^WѼMIM5R;hkli PM@ +YE_bX65 /fm*"{I;?M#MEB@5i)bݥn @Apt2\@ Hm*@S@5<&HE 1D(8JJ5@ 턩Ym@rRbҮ@CDQ^Vڊt@ R@ @v9+ZI"SA! @ V1]U)Wwr^v.wLeV pst9w,F{ݨZVf+3Ϧj%Lneiekgkogk=p?[K[;;;~{"^}8V~\9𩛞6ֲvGP׆+Qa{;[{3*a|r`>g~;kes/)TlҮo{ҷiPPRv;..{/y9s>,[c<ל~B+Vo-쌛_ L2}D+}\2Ͷ߷Pmm!"UG5pOK+Ux`wo ؝srq6cra&Y8^r"ߒ:i==^ܺ! Ȩ}*H'T%̫xsE!cb.rE)*Z@qob^\Yiqkٽ|)6o>/8Oظ[j8J^ľ{vxhNI /jS7ܥX9e*F|&]MSz+JqHq1q1w6X?j.:_.ļ8eF {E}Q_ʛtR9 VaVG7 dz5b|,5Di -Dҙ%ʬTrV׏]ZQ T} ?n6%`&?{Et컨G;?=S87j>^&r0Jgt˾V6n2j@ ҩ=}Ea5E;{c3e7U#Kҵ|' aJ8CԶܹ9đO:&Pp5v,dru"ϊ yUFϸ&kD=!W=`FX*K<\LːP&fzkvϼXp)43fK[S`Tff>F[n]i5Z%~2AY^h v 2Bq"*5U㽑6(@(3myo.%UNteww*0o/7s(Jz~zmtao!.f忎ѰWozSGUv6VVo9>S8I,5G-9XJw3%!%^0dt2O*cd&>ORPF!7|y?耬##ɱR \െ⑇:I Zv`;a)8m |ՙӯO3a4 dv_?lP3wQT 7;,t+#4q-Lvc`y/@ jk'}Yf;ګ>i Eә*-I//hL/2Za"G2J%ʳth Mv٠" 8JO*q&v(4bE3cڧ(J8:Zlvl9r}<4^/WPZ_he' jѪA/ݦY`^mZGth)C6(m? CBR'hL]tāN6GY.`$28X .VPoIqәp13ZdtS@:)7Y /{jfyU6sS+Q8zjE<&$.G# Fsu"I!us_3 { ໘RS̒J0BвB<_`>D*Nw?Qhr~D(W.ٯ L,yTiiF\h Ur=eKlZ8\E|!8JȂέLMdyL5{q/D4uޒS@:)xwnܺ|lJmgw12ןʵORj|9_3J@A~k^PDVziI{Ilxo{ fر it]^g^\iVgpJ^_.꬈JMG t><|YNPio5lB'Կ3vSKKάn6/NoR9? Aw.v^2Ucy[Cn\[c\zۺi:NX #@ke+^ݏZh%b7:m?z1(0.`ʃ&_.$pN>Aod>,Te%nf @ _ V^Y KPVUU!"Bc\t Gg ;CJV"ܙEsh_6V[ p>3 1g}лiii~ <bNѣ dEetw{y> Z碢4+;Đ Fo@ĂSq6FN ӧO*eh@ Y9y_`˯_rZKi[*@ mCSމNzJGK!Hol0xE# 3j@ YK@  *㫔O@ ,u?Z 3j<HI"Ȅ vV1D(R@ AX^Ew vV1D_,''@ Ȭ}*@Z*Чt^X54>k2'ߜZ:Ρ!Fn=dֶ_kxNiiwTgnQ6o>!IνNzZGU&Ө4}mM M`?I5X s<<^!>iX!g*ߟemb@50n2qݿEJ3w_y-6/É ԧ̦%2sCjiL7ڣߘ0f[KTA ѕ;"GT* dv=54Md U/! @ 7ssrs>"^٫cQy."9;;܈l^E&97)#SmqH}=Oq]~LqrϹ9 8Pʌy/sK¦s>>GgP s@+x)p!:5'+ý8$A'ٽ:|:_>x͞h7b3rRVքǗ59ePZ*G*s2?G-훱F+-S9͞eu'&JO~7SiX&)Mz!J! {]B zP<HqP}ōm>+sumš=UpFN߂']W) fCJN^HiEwU5Uv>~~a%5)g}.Ika.}2cg5|PՊ^/Q])3+Q6%1Kڠz*.s,,İSvXY.¥# z/WM MF1ՖIoJ~.5x5gfVuIxOMbֵU72k%;_MchԕFz A QWCn'2Y\B֖@͇E݌ T1M[+# IW]P˕R6dJœۗXPh[ҩQKT F[j#<(l,X Σ7:d:U©ft8A(A+(,Xpwc;@^DX[wR궿Oei;Tv'ڼKu_ފlS;*eg?=!ZqT Ҭ',&*NѳgVsV=\{Q:@Yn=)URk: ASqSj.ܚԪf.AirȈ8tv Ϊm:f*0*޺qaB5)VU1DQKT N 4<Tk/w2F{gF^ϘJj)UQrOT^"B.N'Nksf@3=vW+{633aJ t,t,JwW};P_ߨc$XyD3}Uߠ{7ӼSFէQMF\cwvk\_Cs&NomSNyD3A~ꭸy{Y/Qd*M%"fMSd IDATM~v& ǚDiRhMCd dQ衱f1md+3ޒA *g>~Cqz7--VXTCax`CD%;;HbHAi Ч@ DviMJopy*Hk-#[?v΅n,?d_@LJ.X%}*X@ R#|!|KE>@ AS@ "Ȩ}*@x"Ȅ vV1D(m% 4S vĴcHI2@XQ!Vџm1S@Z 'W@ EPAF=p @ b.)M>ۥMt"D$2j@ ҉Ak3?ں ]i(;kaS|Oؠ ^#Y9'̺~uf젹:C5`gku]\.q YX[X04?*X+s+kk[k[׉o6hbPFA<Ə$ń*^E+ e}qb!ll\sY mV mY꟪L2D+}\2Ͷ߷P m!")g<>רN=.Zk MAFA)MvqDT9%uFzz0FdR>) [83ؘ7N7&~*\0q똘 xo8?P|WVZfZv/_qx S:<.&6.֢N_4W"@deV*9?p+]GG.-_񨅦\x7L%B|LFXxݚz(-bXAkή4" @ Vnɯv 5Rb`EDDfLmMUt-',ICBv>&/>tmQ)"&8Y93"n2?7 lImCdլgWusbM67JN$_|֠j-Ā(>_g@N3DX0 ~0g|7YEEI7hG^{کAQ|7 uFeЫ&dR>-KxUF 6cS?a%UDVХ*Dny%73EӉ}Oa>"mLJ26SiD ?[WmZ~ uo"ge c`E!m(̀Pg\JB7T"`fߺ_n8աQ7MB$ ]-j:F^uNeWR5uSRsԒt7/y[o 8XbCFW)T N *awwh~f϶7wQUxB֑oޏjYG G֓cѥk #uvYRp졃@q3_f Ɵ""0y/@ jk'}Yf;ګ5mEd DtfJKGR9F˵VXQR `4]+V(C6hc2uӥJ\)s?X),fe nêd#D%,7UDqZSi>:h@ DP4Y2EOW61$!<0F^ShiК&V [-AA+^@HcOP,ż~+]kMt;-.HcVѰU>B"dwۨQo"{Q 9M9^XAv=>W49D|a[["كd4MS2f]5hנn,U06Z->MB!6⟅!!h삧;7&wj|3!Lͣ  *q\2ޒ29xU915H3W8OztWġV@EU=HVt3<*ވ(jV}5s" IOW\xYJ> D /#CfRoEDbݏb_ZU"قHe]=u A%U6wq/;9C# m!b>q~;gmO|bj"W_"IHGW|qdAl"nej"Cծ~ȈGKfً~!QKT یsPnec}ˉןʵORj|9_3J@A~k^PDVziI{Ilxo{ βvqZX4_.3S/\HnkWg4Dd MПuƮusjpyə%%'uIݷZ*W3`;nܺr;'d W75Qz_GO-͸ѱ%!* _.$pN>Aod>,Te%nD42j@ i7]:,Q`$MQ_wpyұN6c5ͪ{U\eXu3 p񔻷rYG7\d"zЧtAԝU\I5(;~?k96xŵf_bgm4lcݪ&JW6HkM3`e꣌D|!]@K&a*hMl"jU.Dxaeyo;k+k+;7i"=nWB{hZ6cz&edjvz£-)[ܽIq1yEJ}X((06_nMk-I}}Π"b}ٳS?u_mFlFnVJtJۚ& J*lINAKf8ъ迖6/ٳ,88d^if* 79>[5TȨ}*[ȩJ -E {qfj`T6[ɹ6DaMF*8#o_QwH )虱JV}n/&%3iBfߗ^<͈dqh- ,ImC xn\uiG | ũ jPՊ8o@bMAdzKEZ>S~wYD>*֙l"ý"홃A(3myLI"$y 썔g}zV%ǘ/<2P"(>}X@mC@2p$J.E~"ut󳟫V TZ~X̼TQlbH)Qg*e N6ӫȪǐ_beE0<j>,8IrMP%+ǎJNA~H/?T|؂_<:8ªِh@ ݑ0[s X Σ7B:d:U©ft8A(AqKK%33R_z&+*ZbD@9cfzFfzFfzhM> 'ߥ%X  Cϫiʉq7-X8Mz=l Y05sU|r_lYSNZ*p ҹ<c/gVzx# 9J*}G o@V&C%,+\xYFPAsh8W0d);76JǔIW|ahUBϸ6TWI{L~)*oQ!4##D]ICKjsCdTO԰8fQo "6sۈ-;~)cc|{wuߧ2Pڴc*w{mThm^%º/[oEAVqYѩ?ѳ8f`wp]}iV Q_mҐ 9߱\5UJ¶Dup*2",4sjǾ/M%bT_u\(ݭ'JVjU pdR>3̼v.G//cyI!1*w;3~TZW O1.Zrmwθ{wirq>pZ.gC7Aﱻ\^]ٳYf f0iX_:_PP1Ѭa/8>؝]}?אjhl=:c6&˶m%*hF500oھX7o/%.ڝ&KSAӲBaz=tss *t4ȢCcՐ<)PޒA *f<л4d*]%  \s71T .2jy*D`\fx8O3Ӛ" vA)7k1> jLQOYSC;ZȦTdI.BhG~h@ 2ky*@Z*Ч@ 4Sk8Oi'^Ew2!]U !=)H;albڱ$p b(J KFG<@ @f-S@ ) ]2aSle+gJ]kdI'B$ @ n s8 . 4{)yNylMГlf]?:3vUIdqw]Ό.hllz[[XY[X[ xfQ7ba1(#YךX%!h!kD]F.&TB3E>R&.x|Q{]z_!\ý{S8-:ʩOo^3zӃBF-S@:)hee#>~X?l뢏U"Ta11aV9qx{-871Q/8^۰7G N`uy\Ll\E]5οy~Z%s/b߽ ;<4'`OڤIvrRl7M_Qxje^ͥX ymT UsգэC@&/>tmQ"aAfVރ%}}P/+?1*Vz3]M- J6H^|5PV-+],s&91K1=\!fowv6] ͸ClP~4/+0KZǍ9,MWkBfR@d`K 53;|=^cpkAL')sƒ_+",(nYRi]I-ODcRFwh:/:,ee ^D wғI)4ӈj  9e~6S6ڤ0Y*[ }z\ |S:VWPgV_Jmp+o3U\k Cx x6Tws+:FCuNeW|5m&`Hz&b(謴ūx?'e&@"+PYYUp%ٳ=]wE3 #m~u䛼pd=9Vg^x!3xNV]00kX N=t8._c1~u Z7IYBOo K9ʐQ*Wۊ,;Ł —s4&eoZ#@-ͮ 8*R-Ni^gj7OQf1 pͼ%҂%*عЧ~*OgL!!C˼M9p$z+r^bɵkʣ5?\6FN|gpũVK"@ @< Y0WKu *ٝ{6֊n _S` {()Xui7[V} zAR0n.^}\V Mu̪ۓx*ATٛȐ[iufw<b+ Z}gf7!c,UdZIa~Q;k\5<%LDH+bV Ղ[%Xe37EѪ7>fnZ!)ʓ+o2KRr40A\cE|bHLB""V斠 A%U6wq/;9fvF4Q>ݽ]ճ_IJ7H\h eY?k{g((pSxã%3[iB-+)4d>\oo +WOZZ|p')lx?> FƯRuphj% 5 X("b=Ŵ$Ƚr6<Ʒ=q CGX];=͗K?5xq2W3`;nܺr;bYlY;tGO꒺o*S/[Uزï8a-$KS5Qz_GO-͸ѱ%mfjYY,yPPm 8{}OHLZ HG!qx(aXrrr-ЯXo5cG,gaH}F?IGTWZ:vc%o n7o^mBO3ȉB:ἷyw& (1[@Uܼ!10۹h ]T)T5ZO͆YzhـTRf1<>U +/''''O @gjkkKJ444\ mh? V1҅fo3w{y>pO%E99F]J YTMhGJAaAm-COOޑD"cqX0X,p.<.C#߼/P(Xyx<jɡ!,SqVGN nqk2KBiB^Sa0t uVR_@QAK+۷n!p<.s%9[>S܂Zy )w@ /T\޻bq5\g2<@x D"l8[[-Ꙫ[?n /x)W_Oh) 4?k0-۶{H$*(* qAJ_Ry V H|(D"ᣇee~~~\i,;g())^f[eEEݭW1CoɄ "CRA0! ` RěL50aDYa}?oذao,Vnuu[YVZpaq-oY<D6`0zSñXI3f4FݺeKaQVX @ [*o,B=ĸW*E ".0kWJC ))@iII=/Xdǎ2䯿H޶# 2@Xl[*}+,,{7Ø > h@HL)))ijj#p?%)^Ew vV1D_?ZH lٺ‚D"?~]0pkm( b|*@Q4*:ɿOdr>}lJHA,OaeK۷/y*"S|]  ٠(5Yc,jÇo޼`0VV֋/)+)p? @:?5eϜ9p@И.+''bkk<hOm-p%Op滇y O^Crַ[&;Pz>Y&A@vSK92hݭvk )X'DW ~йwU~IOJTz^ds}UOէQi?tЧR WȷPco\)&edjvz£-)[ܽIq1y?zBnvNn˕ڮ>ff'@@Ĝ'6jMk/ܫ4b&4fs{̡"KaHrZԊ3K鏅k.U9v;- *;izy3A_m ,bf뾾%2]vj=QDܙzʵz^-NSNNlY#+:_G Λ=̼}S}ssXBɐL@:1--1\`F{gF^ϘJj)UQrOT^"B.N'Nksf@3=vW+{6[`xa SOhecUm,VfpO~RrFڽƭaKSq/1T .R@ s. 3iPЧQi&CsGt8p5 _p:O YvnЌq;ZyWNlZe2('@dZ*/v.cWQ BO~AܟYr)CۢLq~>w@ i©HJe,hLHZ=V~zح58^CWw&vn(:n0„~7}0םxƍ%GW_trJU\΃7!'PO2erH]GdK'LԹwu6}\%Cown]ƥtsgE.7Qػ:r,MzP[{:N`yq奃;7hUy-0^7rS7vz|||){+p r|I϶P)&+hZx6Cp^%soN> ;;QXi60w+{ Pk63dAZj~I,a٪Dy"Ȅ vV1D(jm:KbaA TߙWo2^y5A8=Ӑ[W?g,z0DGLUɗ3\[ˈ\qmy]t=gH.y}pɾݯ*ȽEU<+"$&{fqK÷]##RMnr =Tg<`9|{eѕE>#V]YӑgƩ3r x:;^dǝO+꼴<ŦJ(;+1S?}`Q yϿɗ|v[I%M z"#-RKQ.1pBjSUNQ ML;V.]U EIQabn!Q wt<& T)a},C8 yi, *3)iS 'bp*gIEO4k[W2K26/4.xap*}'/CY''AHkMYj0Jic_.M`)ԞdXG6ã*l0^Op]}1_~tw3 NT@"kbBiփլ-p5 i(iE̪U"iϔZr ;i*eo~.M~rjM4S]y5J7E?+^76Wmq{3EҿE#~0@P6Pĥ슊C3Gr9d[WEGt8Qyf6^P px-rGEiTL|A%ă#1 +*PI+P`l\ dES Qk u]r0GWJ1@DT.j .]Z!N`4{E_&wpdHJC!ҫ#Ì$.G 2]@A҈=>Y iƳ@sFtbJ!m@ Յ#(]ۻ&>2Iq+.e9p Yxk:uWY@U[W^U$y#$!W>y{n<=otME;r c='9کpRl|AREQgMOdwФ[Fwr' 5+%ͺ؅c"S%?:S_`nXK>Խا۸ A7xҭ{O97v1O1w+V~~___@i[]mxYտkv;M% P)qC|:G_FݷuޠXթZe߿,ԆŽ=GE3(41F}D^dWw{'̄2#)L.!N +K="Nm ؟SzNStv n_%볚VO8ۨt umׯ(iW+\zG5ܻlnKX<'BQ޲wi 2l뵆nXK .yg !F5YcōFci}[&i*o :T:IDL>=T7ĚRR|CtS#i%Ii/쾒a3?ұL"$M _CǑ &8[kinI0ɶRVMGuA ]s|&zcZ\9O3_C3kGN?i7py b^zG1GO;&+vhl/Kb~pHڳiFK7߸|pRAFٍ~vIn:wkWx}As4BHuɧ1MfǒGrjOvgK#G^7L!Kn:w#7W\r1Ma7r,bKr*vo1ĦƑnT_0ٷvDdfB͑mIҙYBJ:'kb5ri+k1;M?^l*n9CFZtoJp,X.{xNBubR^0-د{pHSw259! o×dT[ ©ݨ="Go4wD8/u\ϰ>v愆p!^<{bЈОXuȁ3_V={ jF7!D8w!=41"bh?5L)bB$IPb)iwºG\x-ya㝸h`Eup-ˍ,[|ep'9PI6C]Nj{GCuAGmfrN\~?_Nf]n7n?ٝI]%g\=5!BfGŒ~8!|԰&RGӟ-=:gm!>>3}~%KR>5ptfVc&۟8:z2 ί/?!D_}pCy?ʾH1G3{!B֪[6$rw̞JDa M(=cz )^fq tP GIpg9Tz}>lPN-m7i$&ZX15ҏBJ V#a'¾ﶍ,ܒ+Ψs!hƠia0nqy^`ѫ" o;>l/ì/B8~[ M\whb#)nP bEF%n9d!EZ0à#vBEMv C:xvOO6Rޱˡԥ)WfsL&j&ԟ'$[ 2eh{z_;uLvEj":5ur1:*n:56tַ0A}%S_2ڠeO]ȩѿu#Gn\?scѼcfFUc'1qc۴UA=kH̄* VE4B5)DFY\ =Gc*6J ɥ?p$2¸i52p1IDAT皹 ܷ* oTQTk5a,m|nEk|6&Q•n8ɇxzpOm.@~3]sI'JU1"JNi/+Go-Ckr.md?HP늌\j]^wżpaGscav\P_;UW'x*:2H疑c+@#ŏ}ȡ#;8sJPser f7}ux'!+~/-Kp$M=;!PW/%;.s!7L{'jK>L~qj[b L tZbYFju:!$jIÏsi]ʅM6ܮ$1hfpikxCQj^Kv?F> Ic돟J!oHӌ5CQu }=sSwJnG֊Y;qS\R(4&x<wPܡdؗw5)B4`?~rP\!:Ņ_N]ۛ䜰쇽'ʟ#(SKH#+t+RD_-"vߖe{Cqnw߀gq}{SS d*[)n|ɧ]Otiӛ EqNqm?͌KΎ]>A~m^zo߱Kgn[&;%_`,^7z~+ 85—mFdQk_tz&E%j:z%2Eq\:~R~`냜ҽJ`,LƕE=&v>G{nwBFxi(*]5y*~AZ_BÃ}}usZ+*3ȚCis|F ϑ[2;&e\@F;Χm%704N0q]N'Na;;qkh,,L]OY fG trU+rdĺufdfV Y0U^ԻS'3jB_[Q{9ۦ4 mƻ^5lUݿP)*/Kuz3>l/Nu Kee w7oy;MJ 20t␒G @WLd*lN%''W*q XO0 ǫ[ClW³|>M'ټ֗x`R>h1SUN~QT*mr!ɒ߼pw:sttTT.8GRa\TmT233xz *GT*^'%YT9TB![;Xg B777W/X斑^b<WPl<,Jh P(w(ཀ35ܻa|P9+: PXbXfp %A(˗O%"hj+:!y< <*eZun*:Tժ.5ڶm+B80 qL߀BeB,BB," +!޺Q[!o?È|ȏ3 bèL6X-ɲlXdh(8l޸ cB,b1XM"YIJlޗa_ chͰy]*3nNq\H$Ts pHfXenNEǂd*Tsr\"QRZ]oϙC3>M3PNl(m*mG>O'2ꍢi$ItTxbO M+V<ۑӦEEEWU4|aVcٶPg*q\:HA58‚`;pUEBDLHR}w\L=ahTc̶j2Sd*r3}pD,x=++s޼ye,2cIYgw dBaXwm{[}K1}ٶPe*\p11P6@ H Ev˗/Λg_w@@+23\\\ۖ-gef*d*K̶j6S x^pZmO+|rw^uo޽n ˥WtZD"3fg&kꯤ|mwGmC*mTs@B-7?aի}m6f*%^ h" ׈:9--ȑ8je3ar>k_ub-Ԣ $*:VV zxoRյf6)!xgZT @ >h usܰI^*>}!j_Ap?~<==lL6oFmC{Ę=&EB5(JPռYsdDzkΞ;r5k6cLVccy㴗6S!0$y<b1 #8V:N9)vs_Ho8|,1g1Z A0AShr֭[.]qu6Æ {ZS16f*$IfӨÁ]EeٹZ )z2bcǎ;wN( '>_QU*5ǷJOl(mB'RթU$fB5N%8* e8'O,T ";PppHxxxj[T'AUJJYʎ(Ma޾IկVFB!׷x:-[xÓp ! 1 -p @((nc6/,5f`|`F E ?WT`$ςB:lF-[:C*/o&_X1j˰,0,B,|5aZͣǏb1<-r ;h*|{P))oߔ=8@aIM=Q\rDPq\{D*x (Jײe+ @e2\^C) SZ+RȲ7lr˫a!`!|:FM\vdN)6 bX͸u'=jʿ[.?DI%֗T%T oI5rsC3Gݳ4 (֥S~Y{"K\ɔCouJiI 04hn߹WW+SuXPY9~T}?,$GxԈY֪ģ'>`cՅ}e츭/2nN9xh [-B }&nlIg2BxOFm q-2Ծ!#7_߳ÐnӦȵe "edbg T-X}֭ S%SL2yO|zt~S۹h@1WޡXɃKzfm)Am-?c{@g06hwLoq{g}9 u~k8'[+MG8;~gc4b~gNN3ݻg cqA ̾}*.Dub^tnK~gX Ү!Y{b!Nc䭚޸yBL7(t:> Q?}_Qa2d*8m .iR^z ;wOO #t"6 sx0C C> 'HC&(Ϟ0t/7tX$N𸅧Ft .rjc1dl|z>ʿNm\&Xh% amR"!ZqIu*^dbV QUa"7>^'ftIwɛso,b4t=Gа['k4,{a̴M8FH{5Y&F4ᄰI/2|ʋU&YQk0 cilYb":/f~|kءZK,aՈiJ2̃V&Fb}11C}6AI!"BS}V{/&fjYVS\ICajs 4O a4].J˚`V5"ԉύL*fS}"J7[>IװVe"휸8qFC}BEree?vah4eKSb`P ṱ8gl3\&bdOTk;C$ڬg* 9/h$~xdW?lR_X[$m:w:Zu41fPsG~?yaɦmپ^Y1A흒'* ^FӞ0[.!Ϛ`JAHZpJ|jZ/ſn^H,y-\qOcq!q9)q\>uԂ7V$,=yx]qBOdqA a} s6^Yʱ*2aӯq/?|,bo^wG5ܝ?ұ{vgWͧ)hMzBb _0sIʺۂ.aJ"нBqyN<:Ի:iֳIʾ}ۂ΅0W.TZVQsz(F8M!F93/4m\t\_"r=N_>u':2[VT0@T,oD+>Q %{qFDFQ{|RH`JY kXp{O[aII63lCҦ_ݺtt"3!d~buLS#K/[5paʊuLqjcQ xYH?."N01bԳKG8Ȋ9Ybw;a-J8xх L0=@eeJIg.۵|i\R׿mzT`1Q?M2v)eVGRc]mڹlEGKQ\F|QqzmžE!obf ,B~n1r\R̟ihG:tY/[xj)j$pmҮ|,az$*f/!01 +)*)uED"d?U~='<|Cg'DB@I(YypH2'7;k׶3PA UXQR@cwssp{W^ܱ].5]]|MPٕ6}/_V Tl":$I::8j|HaTaJ˗;d'Xc&|~a9 J/w*0r=TOeYx_ +*rG|G5(2K=Ld* S@ */TPyAJGR S@R޽Qk>Sa>§UޭH9BL T*gRٝĊ ՝Zu;iLq8BdZ-Zy{T% BӿRu{5^ DD*:ZT;j&TEw3g7gr*.BTw(۸;ćAIENDB`tora-2.1.3/src/help/images/filemenu.png0000644000175000017500000006410411303312237017546 0ustar michaelmichaelPNG  IHDRS* pHYs : :" IDATxu\ǿ{wG " ؏"4؝݉݊>vPR*Hwc1~ϼ|gv;3RSR߀  ȿP L-RPm MPB6i T+VL)֋-2ART+Ev@hAnRۋ2D_ AAiZ0ZE iW{2rQs0 xe/Wh@g-*E׫ MWdG婩B)aRIʪ ),[%t<"ҫqaPIGigJ @PfSl64 _/tvv! " iC؃D9(!ŝug&ŸrE-Ǡ9eYm#p\5^%fSW zl @zxHYoUr%bD".>jqH4yWc^ ˞$U.GceV}F 8[{Z(ۥ4q[V#_σUYAZ ש4GGĭ|.A.'$M=Jk,Ǒ&nAf?pvIZ5܌^J*,SY IV& ~HhlB6U%UBtWQG\ʭ/^(PwTM ח(ISvܱKk$pAYͣ{7A)smMx<Կ{˰q$̨Шk̓qoyӨYj}^sb6͛ y"NDHִm5A ]5%]<ܛ{Y~)px{y4k3蝉:)q'o kڽWLMBx~& -Ym<#:9}J'_A7<0 e?4gSw=̖BɎ]7mbj!,Jߠ׳p V4n92CۯUTTp=U |:6_Gsȣ 4e[:cZٮ₧=GN {]xΧ7^ٛ*6|G;(m̬~ e>h׮Z"x;DV{ҺЬ-6ì鷋 zЉ|9UҌG/d5mKfe/O|k˵Ϭl񘭱=w>qrPwRWX)RBpƌ2Lgf-oNsZu;;g]r@G~pm޹s!N>;gxBiZD!.|Љ|+OcݮCNHǀ"qa"FmuXs+enX r޻1֛~]:uҩs :ޙuc0O}-Y2=<{x4'8b U%I^-Ϣ^ K}0ٺSPe x΋/, v1a25 I۪;70ص_WŹosj.x~UչLU NІJ4k9Įn]s}.0-0ϼ/~Qڕl=oK)T5:VՂsji!x.!9/~wx1ewM,x rؘSѽ+7q^uk黎r̵ VTz;{s͛7kݫ ѻ^Xn]Ôl;s*I91v3"HoU?HS s7Ua\k$KxH٠9&%cf5,}xHԋF.Wkm|\L *NOSާW iEoRL3iZfw3j*Yp ?HiÕ0+/Hp`~F5ͬW9<\NLk@Rk5oev91f s"҈2p A.Rq4 \klҜG05ƭYֲXofɴ>Q!f{ÚWԨ &ļ܃{s 9xn]!oiC]6 *ϋɕmJ9Nĩcӆ>;f96eMMNQ\*( *WmW1+Orq5-)ZL'0WOJ1 dʼn8 ds gHʊd7j)j8k %P,ь f#d9rej 싺 OJ~Ќaިk=&Kpiֳh<<;^%éҩbŇskmby:eX40kK2\ã{)bωUdc_:U.i޸K͌$qiӨyFJO=͒k3*T%*Ԏ|&{-/pzlV F]]4 捻سg1.|os^@;{#`Z2}Nָ"HVfu?[P]‹& 4AZ90 3o<-kKR pQڻwDѥ[2)MWv^g3vv'εŃwحW?rps⛌eh~M===m n]UɱZ goe]m;&0uՙ2-=9=gf-B->[@m$ߨOe#`1탫 5,EK$58EIk WR~o0/wG^en!I5rdW_rAcY.>d Ż6\~G|L}_4DFHIm(vdYyYۏsjR{.:'d_E`Z_{XjJ2PrRA7 J\.VVxʈ?Ϡ젞/1)o5PzRP~e٧NpL#eğE{iECͭny'0\nߢDZZVʐ=:DΗ"X,9GcQ˒fg89wŚsׂN)eh+['o;*C0 kР]^:V*KxA~~a ϧx (1ݣԚ>@ 9|ȏܫ8k@PbH_m=tjH p+XZ:jĈ_F p]tRGZ.|+CT^t?(o(z".t(z/.bl*URlv5<8#a0 #???9)I.[ZZmaaakc# % b ÌLLL~kY lMVV)ŅBIB9 BCbR#77I$?'"),x qekH  ? CU+W,A ~=%5t l;ՅM(%/QJk_/~qԍ)M֡IHA[R6iӨ96oԽeW+zg!M)Ƕ6E(0dٲu+.Ńм}[pBPb.- 14ߥ'_2퇏_6 CC/J_RUϲeU $k[/pxzf= R*1 jެEP9'b 3#S8nu&d@>. :Vraѥ׭ƬX˂ ^g,I]7 _v)Eu{dN͚ox' 乯}ƅ4ȡ[2kڴEز:}Q vE(۶͉$0xp ~@_R(vø.=z^4[m(SfiTyΫY6U~{CΩ0洴vo2@jg+/Vl\J ![ƒz4o z>RʲW얋_eFEi"_Y;FtNuv5W>͠ ym>cBk21_&4<%;Q0A'A$R0s 5PviT׆KAU9-X\. @:B̬2%;Qb Ls"" 2~j|ё:VciP6'p.ʴhm6 `i1نM""(P, _Hi͉LMI`Zy o-7)Feu蛱j+192\5ԚTn1:Bgâq{֝ Ynқ8Z@XULu۶9s"DD(J VߞDH2̛Nٹ/Ď^-Z Z~a-NXlcZ.\ѓqxDO#1"BC@vm\w`ZUCF/t钯t gES:c]ҍ7>xpjJ , ts(VJ+˗J(R<{p@:8u? *? *J} ;{{_I`go^ğ4m۶o $rպE6z&n6Yɻ|p+WKJnܼ3'R70" """hKm=qcYV݇[: "μ8QRwx}g~^ֈ2(GA*"#####u\ҁ޷؆WzY,:njjHW$reND!""bډH/a9fߘ@[qn MܮQ.xgCٕ6kT`U{ pIV, bNZ,I흹!9Iwt[GCLT Ww+&Lǭ~ք ٰw.logȄ6~ /@: 4p{s^Ȳ鮫DʴGnl_|)c9~u޶-W)M@*#G?5}čuL5$G =-Ҭo{[z!4k% gNk4tv5<󬍃~F4qÒP}a(%9I}eZ.(]tUT/}3*:ɶFW$Kc9Įns;b g>ɯ2{:E MtH Y<'4t9TB:(i(UIR"O2j)e "e:jbw73G I;.7%.j2߈w''KNG$w˲ z+1R /ѧDK*`5\##jÕ"\4js_۪f=(63b`ffnp)F #\nP)"@1F=dY{>&OKs_ eF ]& KkZ~v+=A~tԝ\mRXV;Lj,-\1]ׄ mw-w31XX#X|Jib0Tii < њKTaδ],mQKWr[wlQWlZ/l l@?i߾QnVovcdcs͒]&:SJ(spskHE!?b8LBQ|& ?H (BB| 8A`A`@A@@V h+{' N@*CrG\}? U2"4J(aV? 0 EN0S$)VcFnƊ$0'PDWTS:C3z-Oe?OZjD*'՚@P<(V4L+:?'<Ѓo%43neC+#M ,"""rDfVTj3ct#?[2v{BQ{0l[e0q v:R̰;s NJl|Z:Ⱥlpe{cK/~)j̭[Vfm7fM[uwk7q)m(1LPz37nգ(fْU5HS #^;ꑏG9ql{oBة_Fl~u_ ֐\7yаz)I};50gZ eRₗ{-r3yw*^YV)ʧx- e:׼24bxxMYkRC]+22R%[At0D>jaT2r6|, lRɔⳍL+3 bRl$e蘡 ru]AHr)BL)۪PA.cxHT#k`FU=4SWLstͺtЛW}KQJ'''LޖkO*BM5Vd/6JG$&ļΜ}^v&Dy?Zèm; McGW| c[kݷQ2ݬK`Z2+EayU%W9 IDAT߾}#""vuM2vG]qkn(RS}f)\N526],¥zmS$t ZI%1*3k5kӦES ]wA!FG(5Y , M=$c˛j$Be4W_}) &=z#5TJ}( NSDIiDIٷE +aͭ[_A7OyѮV v1.>˯x)И-I -g9;o˖ޡC򙷴;/π3Z}ÂUբu=V2Dx#{zxx3ƢPے鏝fpإK|||}'#8888sG ~l+W.~+)*IH1ovrrJ@oƍ)ß={V"#;%o߾g%oh@@@@@@@@@@@@@(sZ} 0G''ʐ4=>' @3^rtr"}\666ݻw/4iG#^)Vʞ4eO_iHGkE(ڪ4ig[R1&ݧMYD+F gG6l?yݷҩQ@T-=>vd = ?Կ5ܫέ"KjJg =sBV-o#ݸyo{k_jexWG <DŽְ`| hu%]cr*~d[jYy HL{2Mkx5#iZ{ =" (xD>- \t>IPFPϖm,<{}(b@[>D\NPd~ѹÔŚWɕ,G-ժ&Jc"zTP)M%x]3yz%: \{jѐ^m?/"}`ԎOFlm͍]Z$G BYÓM,rcgi0J)Onܱie)?@\}uSk3gctpCzl87>m:'4}fAc2k[7Mx[ryS$+ܺ}.5S!;:}. ;:99ofWjJ);#ma9ǖ_*b sKԍV6ys:3 tdŻwol\J~KkSdKN_ߪ$Bˋ"v jSw+x0WCk %%zܧcB=[:0'^LU^܄J!]zme,1-d mXlf}MVx΋-zjSÔ1UWhɅoL{M3hW.Nc< -z#7gq==,2 qAh -&C[Υԡ6հ6Ǝ}yH 'wLǰ/^;_@J23 d?DIv999zWficiPaFOtg8y sy yGwj;9Me8 h4 9LLq%cBH6_ 2p NP? rcw[IH|=vPb~KjXO'0zlJQ!EK WZݐ%kYf-2M4(ҧOI: n; _s?ϋ͓5&%E{Z! &WȄ9 " 6E7^x`cx>8jlddomUCE} N= hmīR#`M̎ڡ$J6հ& Wi[tM#eX7 iݪEY]5k(=@®ܫJž۶\2m$eYOzkcG')N}Z"b%9Uw_Jӳ'OBe%ޚW^ h@@@@@@@@@@@@@@@@@@+q/$M5dTtie(wWs\g;9X A]===b{Ƕ*x(!s=·G c{Ytʲ9Kꝋ6ݣ,M٭e;=T.OႧ+g}?jR~32| r90!@? y? zt6 Izx3 8 ai{ .?Vrb/"˅I`YϒM2/J*ҧ@OaU,GP @rv4iWaϧ^DQV{]9zͤ=3y`kUa5>mu.&M{؃ΝmOWLY8fL/jFT7o-]uaUӇTE⮦r@.07GV:x76L[^>&5lx;*P>j#\ðP'i1~Y@毖@ =6kvM>{/]KYcG2DICU%lv#9񉫗6Z15b9O-]~3+BOI+3t97vik8ZA=kgǺ;)=_>aJH#qM Nc<) Cqʁk捬n\Ju=pu :(vgU1)c|/z=i?o"g[c}W0FOzi>`X`u>s o?*.ګ#G"W=xNO="Ŏzu˿v.EBN Nc}}#B \* eu8 ~N['VNbBV񇗢(G -(H+V~G ۬OyO˻")\ /3G^"dĎĎ( 3O^,L \* eu8HzEj뫈apՁ&QՖ}43VptźtЛW] ջ vM (G`vIV@kkzer0JrwZ P4ڳOSHJ3uU5TbG \1ٛttS( %FaIUgn&~40Uݠ>>ϔv.ujyK.b b .(̊+0疭z+jޙ맫w^0W LYaʝ4ZJs>[(> ULsaW4Ʃ}hs sOj=e=;7jcX4^;{FR|9yLPh!ASo#z7_ {oZ7.ɵ;cBN5lA EY\5Mowde 2zp :wkiZ\aK$tRf4q9W:VN[v wR=+?UC+ b1mSVޑӖ/!h@@@@@(? ? *? *? * R2<.6@b gt0 K*g0 W!Mխhj'կ׿ҟO>3RK·G kӪ}1+ex igz4rCw iwkɒ_qf}ly_ g!~~pሮ}[u0uåxAh?]b%3 zֵSuojHnM5Z`v،&z٭c~^?|ƅ2 Wr9c骡3?p׏n?yA#/@YҤ]C'!@]Is! Z4wTX5̷9׶nV ̘ٕttw@qbٞ}yv !M-dɽsk7xd1NeSYC-SXQ[ ]q7xHgs086͚,~7B'< C'@xA}}Zx:A+l=9_ڗ2>?3o6=&I*Erj- GXU\CGMhIIV3 7lQ~L=W}(cUpm`rx`sn]?!Y'n]J+&R}4kGfq]<$ɧ/ š4M8(NQ<,ͭUW0Z[it"(xÅ.;~کmvԟ?|UZ4l7_"/H\Lubt̜8ӡ{ǻZ0adկ- ø*dFE¬hLS91+zV+*TD3#n9tF.-:  (HN^rL1ܷXh? [`bl:A)l6#aXJwN;$ˍS|+Ë 7SXg@ȅysR [L:>O>޶aF/f09 BJJB%HggbVg֮TO+ۖ#Z'oOΚ2Gqe`L?$+ X[ L\WҤ}Fv\tZ40 l20 f Gve=s2Y~7sVFjE0['qik>!UIŸ4/E }%1}QQ>EpdB1EcWi3Wmkq9ϹkcX} fsY”Q3d@`ndmv56WN.AHI_B\Nv2t=N }un"<Q=zZlm#1 b.1e0[%Oq,MbjށYU6m 7ے5C* |@uV/G;-K]F,P]L*GjjVEY~45Y1#n9tHBTh9f0;`:iA`^-m_~`VLi͌ܤ-n_,8M;_adܦG7maTpj-L$B5/uXY*I%o$.5js ðؘOe4Ei>#^L9@MulԖ`[vf(g$qk{Oʈ?4W+^)6Fze'P>.^1v֫t?6-liKKj,aR'O_m HSܝU'|_5)pg@ %C@_\@AE A@@@@@@@@@`}ط@egK0? QVXUzɻ{T"ic_HS 2S1y  ""W5j֊r/i}&ͺNҽɯ/qt ӬZ^#y^mk^%F)VS(~~l?KF~oU&q  Jg^={9ӿלqž)H5#d\7be ]~Q ?o9b4JjCf_緟WO?7g(A9(r`x63#\wf~M@ڄ9]2 S1'C _0rwq6J빕xw6cb #FfE4߾P(|: YzTSxޛ#s;m:`ݝtL[^%r_Nm9|l ʮ#gvPJ;ewU:mRPT MYUS3No>VlRh=%G/]9u֎i[>ɘ1G,8z:oKFpOy娱NnXp;SF9Mnx^܋IE3E.xw#˺{EJ|_3>&! sC|X?uWD~9=[s,=v9a.<^)9X5^sKQÜ8*rήĒSQTIH;I;n8yvS+/KmCKu"=!5jզ\ ٸ|}[;b>M})&܂xp><;ռ24 .RKwgsmۃBZuW͈lmd#32tl4xUDdobT`?cҭ(W-'\}E]LӬZ]'>(8ML-=DY(e:hf.xQHkt3AA?`x gfO8|wDAnkȭ\oPc*%w4q܋˒Ti"I'"'Tp2eiOi\R1F#,3ua==ZaSJ:eߒe+D(X.ɟ 2&[31=s_KM!LP,`(3,=kݬ%WO܈˓)5 ufҩ(5>~ uf(^ƪ fWUzۙQEP+/0yVpiLf}=k9fI/݂:\u>^Dq9ZZO4k.:q2NDӪY?omNhM^3j?bFw*HbilC ҥKɉǣ1GDDѽ\ &;]'NWsuz1?((/Hq6[FP44 j{j:o\gHh1fq1ڠ%.V ~:"!*P@@@w} AE!(8DQ@Ne+)QISANb2WA~D ܦXmu 00c`@`F`|1 EQXmUeFVfLh-P?}S-&=CШYP !h(Ζ8>3]hPAPPPPPQթW}r?@@iz5t i]i^!ߟ_~(|o_RS oyt 5׈~>vTSK4yo~;`l2qj}nPB ݔ,-^s,|}wIQ+)$n0ʥi>P ȕ_@jٯ{,GG6T>!5^EYˈ_lȏDF-w`vܿԱ){{y;9jI}˫i۹^y P)EH_u7hp?0mܺΘ8pw^3?QU(kNCK+^?4,8?W:4yoOEEmתU_ qч$f>/}$jO慇w3e_r٤L3SS##GDDK ~HXIE< Ctܞ.<$BLl INF%3&#yͥ{>9|sQ41/tЩss癙yv֬Y9&~rpDH|j#\C]LӬZ]'>lBLZ6N[bwiRV-3Ahh۵UX1祥_Q+3FL:|W[j#yAJ>fbaLtl((k/ۏG!:50E.ǑYn!Cݳ[")|Qv"?zLǓ6< ?v|z\M%J(Tҋ2ql[٢/!yw:b\±w{Ξ177 uiضm?GݳF%0wZKpp˕x祼KȗL+aTzId9o>ϖ؄gz? >zte>߰aȹs9l}}V}joZqjӢksּUk&vZVk9bd'>BLLfJI7q,iFYh"`[844REx ͭQϞ=I/!:>~:wpppڷ\P% |Ő?UA JG@[j[= @ T @ T @ T @ T @ T @ T @ T @ TsZz@ߒCP|@~_ꍫ ,HaORo\GfǼJ3G5c_A KǷ>sCzαtr سc~?̌&/!|r^e||+Ha}vDfc";[0_^;q g؄\4y1o'G-WY 2i>5XLm Hɖ”su  Bi~'+v]AD(,!~/ݱ6o&r#ƹZ{gkvN7cP`SAJO9BFV:ubv!S%xڶӗ/dYrg[c/I(H8/ý#WSQ J\Nu&V-!51Ǿ,8|ZoKVj0^ѫg1xjԾÆTjق`4eAZ!*J<-{jX:VXB?8Mlk\=ٲL#3#h''0*='yBk"l ǟ]ླྀB8Md8bv{=tO>{3%)'01& r0lӪ<WN~ E ~e{60i`e6t> ƶݪ߁/2ar,QnVx†ޝEQq^K\<Z\*f(%V^d>=fxZ&(*iY=r?fwgfv^۲;α;Y{޸;WC'мHß'v6Fz."83)RI.8T:^{/U;ELk/]2ҚG;L Bo^gWB=s륳' , ۵bkȬ^6ɻ52ā֥JTpd>OEmq TD4nc>n`oyꍧu/ai`i=C"R}=/vio!29lwk K{1C=0?Ucp!˕˗N3)Z`ju,mټ#=jup !B,XXba= z@ !B,B5K K:ڢ}_]z+,킗L0d"J cvy5/)XSFuwjv{etlQrPc}>#>v0!S0:zGu^^}m 8Ok{vzs([ϗ2AZ7cGڜy5"RXby~WJ[f=4]ouէKXV->iZNߤCGݴ> MB !\ 6]R%9N%?mvJR h*z-LK[w)"_*IM=[U9[+.qI¯igu.?}-QJlh[f&9okhUkdt)L=>!$tO  &G쩘sZTE?3H1K'tn4^vQǼbn۩ڒ_2rą{3:9u:t{'.R<@cReϋ ::~Տ>}}M$:.*rD͟1m! /!T[O SP#j=jD !B,XX̽DB(BB&S_dt@(BoM"4 A? "`z3̀Yp#mE"C@( @QO (B(Bo@P",)зghNhF0("Enxޙ<3;Vպj}ۺv{=yY]RL׃)t8'AJs>kiBu^7CMXXba= z@e/ůaGm-ۇ=\wT xMÖ6Ž)R]{EN1iv|$&T\/vCFl# x~b+.̜wϬ(:9k.ZĪu5uHL\r’唲0<:Bcn3J\8{f|1=[bqλ3yvX=YT9=썹̖/ej]:)&{VTG{JvL3w^ xd&.6Gn}/qv϶-'RgNq=Iǽˠ֖&yՎIGNVh{Xj-,T@IɽŮ(ד9=19sus|vKf2[+siFڱ;%4{"޸X9^-jOʦ^Z}p_XblXnso]]G_%Jkd2'_XU~ȑ޺ِk{~#]Ӕ߬;KvIG y2[LbyC`9^9|J@DWܬHv߱G U6R=[*:mɂOMz3ku^y*ZSz!kAClס+IkQnM=5%3W_pP Ì6bǯJܾ_X%r&b|΁?%[~Ӗu]fkU_^T ^^˅KI͟l]ZPdOG2qkn4FqH2'CsgXbba#UI@܋^YJ˺lXh,c =6[dԮ//c+=[)g b1w|G~}27:\0v U3|-ie.> D)RI.8T:^{/U;ELk/`֬M=aZh'JU| Ǡ?|ۊ~fTIkQ?"xHBX{+1vM}-|Bg8@$OEmq TD5/J&,&悱K/@APxj՘% !%3_eS2shPbwba= z@ !B,XXba= zh[&nxDxXDT̤+(}YM~2‰#U+6-Pyu; 'نh S'`֘V4Ubq{|57|CK'ŤϊhO3grˉ;(1N@nt%7<~jOy$^#'y+ yq3w登^說p߂2'erD+[yʬԎkF x& }wMWYNq=I}k<_ ]YgJ4oAX6kzЖ_lOIُ.4se ~'>MynqڞP#ET$yM\8,f@?$oZS|3B=21$us'&‘eqH0h-ȡYwŧ>L2M@b'/IG3x`TD^RW|no:rϒԣZZU|*_O/DM(#vt HSњ/8(M@ɟmVkt55SEj<$cڒ6o;qP2xx9VP5F.kz]2~jk2& ڝF;z)$ YPY/ 7i7|<(+VnyliPfzL`Ba= z@ !B,XXba= z@ !V3ԃ@A2 {IDAT?hJX3)i{!1c7;Wo;}a \} xsnsnf.}/vCFl# l]~s͚O^9sŝ WrvbA/u^aL!x",##H2mS%^/]a2VfܟV$ID}29wӒAeT$sK|׫MX}g.)a/i9#[34jՎ)ѥ+վ]}r-L!$",##H%=QUk$28h0 5 v6FzqGQe+a|RI\fV^޿vIf~'/S;Ȋl%AB $M$vVJbֺ.-R{?^)N:O+/ %0 ba= z@ !B,X>& !!@!@)/2wh @7BEQ E Mb栟B0hf@,d8B6@-} Q@ iPPJ߀D"Y Ro#Н`rOPE 3y\g vuՈuy{:1^ SVqFOnX }uҴRo=oPba= z@vRWc053k]6CQQKS% A>!tА𡣦,~m:/vCNjǨ>ϖA{E-xVV΍vf@,ϵJ /N۵yC+'DO4cITIW;ν:l[*s#H,׃CRRso$e9'~,s&uǙ\nmT+T%!yb+;6#&`%f);.ws PRy&ύn/cHE2 ]Ⱦ?5=lmjsص[R('OTp+ %!iy/gO<#Wz%!) 6ܬ?FMr=2Uɓ'O*ZgIXEda-]qX8MR@ L1أߤAү"Gĭ>~`.» ԪYo~b@m],_3OBM@CU\Q? z@ !B,oE`~goEZcba= z@ !BUx(j^B_-#erTb^fLGbR K{FY55Atť8Zvۉ4B! YVshzhgyp^ȭZILy鯎sފK?Nx΃r~zdX]QM]'K }`N)vW*! X"{/G,2Yʂj=W+BNz˻*9[>k{.Ӂe")E*VW oEAiio+]{,B DUt~ے_y y*ŇS[~|`!U!T﷊\W%Vd}exwh_I^'ʥ{\2v%u}[f8um| 5sTf&&61[*/eq]^*T5w),QZ5/X" D@RjjmBHMM> B,<{{rN{<5.HtǃP[xO*$>|Hzyx:8Kx:z,jeUbDz`ddd7jjǏ7ynuP.VIENDB`tora-2.1.3/src/help/images/worksheet.png0000644000175000017500000011250611303312237017755 0ustar michaelmichaelPNG  IHDRC~W"sRGBbKGD pHYs : :"tIME 90/@ IDATxw\Gǟpt&"bvl5v%vc1ڕbo1ލ-X^W~ǵ}8@;>}sff!"AA,$V RakG4  @EQATV7lϨdb)UJUEZEH=W',J$MYVWV0 EQ* {+p8,KBknϨd"IJ"*?WZV*UvffU#/dq\6]uW۞QɴR+2"wCJ,3__Z4_JP9yȬ r֚k=^:r@.ի}US%f5)J& ycbb\`tzUJzČET %, ݷ5\xQ# AˬFdrzeRKs%QDV%8(h ?NN&LKVE y6U杙ikgOQTv <*mlm>l*{QϝɓV%i$ҖΤ~bFHJI"e,O4Ý+'g<(咧8yYȑL3$c_0vyօZs;ϿK7۰.,$wjRlIӆ_xY[ۙphHggsĸPCFӳav ta| +KːLDt6¡)A~;, >>>\xQ+=^ C$۷:}A͛K|EkJYPbFZ& Γ>lEHq0ޔL{Y2*)cEY!g]jS&B*J",ZpSE>l{ ei۹7z:Ɠ \-6CrBRL1u#':puF(U*\4Wb7Mo޼yA@>%(\./Ç\qY`Ѝn) +|dLa|>_sEJM*VѣFg]AuzY9Ő2Vl1+RjyޟJs :P(>xسG̚=Uى~&dC9LRV{X ;ahYkc2A J~}[QP 0 0Ҳy+W޼ys%PiӦرcɒ%qqq4l0MVa1cǎaf<_ֽ{O^ʯa+WYdIޔ,溬s( U u Q/n_Լ G҉.21T֫w;̝;wΝ,իz_,̲U@gY9_:alF#L޶ 6E#zt2J2eZآQ:k׾S!?V\ ֮}_dE CĮM};y[P%;Uϸ1y, 'A7|>' }shG.|||J R5k֬Ys𡼍_~իe"f[_ܣG'zu}_ϭTǺ `vرrK.}ip b} n4dɳ@+r)feTd#|f~]0uz`,_#0LLqrM&Nxԩ֭[װQɿOKr|+v%?eOXg"삟f~pƄ8y[= },qKi /rk+v^{zW#3~ `Bjbi9?ph̏k/7Ȟ]1 ɯQ$(1[s86Y̵gã2OS 'oԳgssJsIH[nѥ}1QĽyyxr6ĵnZQiJض^N똲@ȉƍM^`zum#xAJmbN bL_F9I7jM6- ĶҥKmfL3fݛ6nҥ˥KnƍoddT@gƇ$īnYZTU}kV*J[꜡GJK= 0 ߾Jl6C>._.95?TCٻgA-[<7;v5jT b|~j k wy=0Lp[r8UB) ŋU*-3777!?Z;%]bFʕuڵf͚ovpp޽+ 13wHM=Sy24 7n޼١C:xJaX)J͍O<54_%@(ΈhCqu1##gFJ";ۜE(] PMqǏ8N:zhڵ-ZD[~,NP/Nt[cQEwwlE}*?Kum1KڍaTi⿳_3 w①Vй$$>juxqĝ,KVmieZ<wriJ%?J$>md *9,E0 !5I | ^^b (Ne۷oeff>{ש7o4Bߐiʖݼyf̔,^nڔd++g"d3u:sUfEwA_G4yuڴi>>1=Xٗ5JC?ۡZڒnhL&,X`ߙ%O (f|_Vyxx$icc3v'O,ҧO@Wx&wv|m^qڥ'|oԨUBb%MF6ڼ]On7jR˜7X%O3C/ZYOJ>V$ǫ dB47/\}0۔ǷUAk4=fԲr%S{ZȞuv{ bh](gw޾i5v뚝-3O/{i']{uT9v8Rƀ"S1 ;fj6-7߹=wIF UF>~#9K ,CN-,ܩoJ6pho!p=֭n)K^̹,a]7u]Em۫0ԧI;hͯsڵw\'m6r=^ F{SQ*:vUh6Mfܒ%Kt.-+SCـݝ"cg3-sa 7nV?v}˟ae8nВi6]dȈ/XX1|SGR^4tP̊!cEuD}Ok׮իwŋ/\P&%%M'OdJV\ټE6mZAՅWچD-= )l; prE8}SyM4)0tïѬfr6k6|tF剺Of+W{1t]nR׭[W..~8n޼i؅;[!+~/U3s޼~7nLZ~#';IS4åPQ5橲`C?6*yg"2pJJOplu:e/.ֱw6 #RAYcoܰ)ˊJ?ǹ)^Rvq?W|-R?8*9̮"vޏy267ނ @|ro(]RCş~O]m Y67T!%/7sY p<=?z:`oNin}-But3vNnRhvP򫄘!e|ۃ38/mڙ6krQFSgD.x7u9,(Ի[_}pBޯfϢ_igL`Yϻ\3f:чia{ H_oԱ]f[:N:ڲ uȤ]do`D0i / Jg9d'2J\&M- BQ_Aa#>;H]foixda8ՠzmc)CeVdu5?yL3SNLlۉ>;hTo=HhEEŎjˡhԡv5"_iE)4cãI4)aT}V[w}4RĆujL&Hwmgrf-=if{D!xj~w,,[{YS rEb 0 |e ?+f ?hTU=ZvU+v}5ZN=6l۵ϫZh\& U~2Z_O(I/ 4;-쌻Er,Hv蜿W^'jmI\cofΝ:}Ľ.bXی[Y dʙ=2׈E·>[ˌڹ4"ܳ,-̮1ӧȶJeg⭇w->˸I,͖joHΊc)V5hcF v݊Q0%.Z[tnJ!N}:;Y|ӝLR#Ez^]48Γ Z,9cס?r'C΀"96!#yIÕq9#/%WtW$}ͭrֹFݾqoRqFK([O,Ҧ Q>$jԱGq/7-}uі>ҽ]ץ,q!*YdtV:m8GmǾ:|+NM{ȼ̑ <"^Up5ET|CV {)'" ·mR˘xBʓ7y ,ncFXG?,T@O|MIS2_-韤ݐ3܉~+U2J.V1 ɲdw zz2&Q7-YQ{bZ"cz'#{3&'(6ߵu g}s%ӼH= Rm=|dΠխoъz2A,k߶YwuࣣE,t Z A*JΌf_<eTX~pi]z2Aİm/ reM)sK)z2A|=Y>T1gp1Qɏ A)_O'cq,nKN+Г! ɔO2hޣfKP['CAۓQi_Ɠ;ZuAdtE8!d = R,+tss7z. = RJfЋcF# ߅ 'k 'CAPГ! dAd ux2Ue|ޯӉ ^ A:ghz>ɲD+ A)SHN{k^ul13{xڋ#sǦQB?Jx8Q~yZ\ocYYz`N4ֳsJP[a5[ ylQ+N7;cm#EvM"AC*S}6׾Q]l8Dܳ桰ӄ&3Z) Gf0r~ MTfy|mfCH~Xl8nR:Sc,p?;}x+ e/qcۙc1U6Gi]mTZHz*^"zJJ{Soֽ>6[Yٙcz/%;}yXL.Sgyus-lvxx̑Ngmq}pmPFf;4]wgqE(kmǼ_;e⃶;#j3Ӷ)c>U>|ލ^Ejz'Ӑз^F&ؿUԒ%)$A{qH[2[1sETTbUM-Ik;{Ml :~+F{v~_'ΐ,Bxmu΀U-9w_7 +jIH- H  ;ךwyheN.v<9F}860VG]Y`:iH/ ح{Ũ@A9sV\J0NAsx]~&@S (VқA aґK-*\Lba)=6iԱcn}ocJ'&d$/i׼:¸a*.ڋБ^O [Tad2Y2XXkiLArWExڢ/u}S nS4:vܭm~lF,lK-KzimB4UiB(Xe&boArdZfYyҶ@iy27)4 kRh MF̓h>v7չZ K00D"s<^ƼiQر~^.%S%)ID$a<evF9f lRWFO Hy)ͻUuy Ô"N:w鱯9'S2+s Gī YεrКgUӖ=L]!߷u DW,[A$M5Q!O]7dd ǖH~=}&H.QKULΉ4J] 釯O>I:EieWs# cZ ޤif2iI(!RNJƶv|jFw:ɘijG}.Ny߮(KKkPǶk.DȩsmUfАa#>;Ȃ>>sOO;c.'䛹ǟEaKK7wZe$X7Y[o4Pi7|Q'XwHf&=Ro)ORo)tJ2z2p{Ks3S8⬰r;㥒)U¿65ŵ;xཌWG>mmLZwv 8f<_?#0wj3q l[@1 (/-Il$Mlwi[)0*6&ʵB#}6Q}4N-}6Ѣ* {G'tq$$vaC.6<x<gV:-yqHC+> 'ն=/ARC'I$E+.LcF# 9hxPƪ:Lʥ6|mX:ω!Rxɪ:E rAГ! US0>  AAГ! dtQ1?;~?,| nf -1::{1L*/!UZ g~ݠ)%E#%wNS.QTk[27eptu6 Mo zp` u+_x]'|X@u2<1 ɳ#ʠ:9S~*i[ ]u⥅^0d\Γ#L6DXqYS;cm瞞J q2l [0Jeu`~a{u ㌍CddgCU/ SXć6 ܿ;éJސIWKeފ^M=Θ:b1k :cO?uuE$tlњwm#XSΖG^$]Zުg٭'wϮ7ע,-!t34>JXxz0d'|XOĬ.j 3Ǡ' 4֣EfnvAos7kcƎɲ^g{noHV2*kb]_UOO+&2#Ѻb=뛿)I:钞uKZrZ|ˍx,͟2X`#NlNÄېi rIr 4 >avc(f;n2'Bh~9" σ - ΍WtgzGEt7 JF\2ߪTKO+&2pUk,f]1uz7M1єQGŶ֝^{,i˩wLjbgaǿwFۚ,Ɉ~-7l-Gf8 $ tX?l<@@9l/Bx5r2H>X `CVpOg9Y6Ed҇^>UPɨ;˗]5ғi H~Ŭy/넗WJm1ꛐb=΅eʀ`m I-tIʩgLj۔z8:yu#w xO]=L|>߲.Q`U=[Qhb1!p:0~6: OK?$IaR^  ÃQ6j}WdkHk{)'z}Z{5iҤIoNx5 O>+&X̺bFo9wF"!>d}mg钕SqΖ^y=}Zws.'/g`bvW"lځi\Ͻ+<c <GÙ p6"GSPՆi= '/sLAnjIŷ,ח0܊]̸+w_ԖV&\dفW&-YW,f]1uz7RY;F~o%mW钕SPsO &X%%j_lHާ@k )hY6fV2Z&v7z0>, _ ,+' l ?N80܅?X .HWmGO5@NA9[T= eh+r}fjk?HE]Xhџta3AEnbs[d:c"Ŭ=fz0 <滺RĶ֕^G,i˩_Lj}cgSOV'EvMAd R=}jφEeJs$_ŵ|vQ87G vk|D璭j*t1+ Z E1:AkV2PLF`, @~VP @S~͖^|H+ʅt#Ѭ_\}cO#TNܮGvf~Q=vga*e(gʈK\# NoE/3k|s41iO'3FVN6"FV*iWO芭\xLS1oiA V2A[|'Z4xiK {dm8NK#0qH5r4"dlEC[c43W d\a7ر67uw%Xl[A-dIFw>c++h/fD)[%c (dcxǛ<.բ۔8Bz"d~8Oگ7c3 K!<0Ѵ7Y@,N/nxkHhlƓ./?fmAV/&{:xH{~QT(0߆uo9A`$l6ƌFA'+㡌! U[] z2AAO 'CA*r>^ke2^!A= R zɐ:ݚ֫So;zys)=^A J9633N?zrd4qf喠b*fݓAwy]uő6[74*(0̗bfOҹ!zGƋǴe%u4}幍:Mxu|G{+ 惖\y%"7/=mSKsmԠ;nO[Zb z&~1AOݮ:=i=hРE qč9i)](6鶖so~wMlbyv3R \L,65=ʰB몦c#Go>}9PFL- H?bґ/ ccnᜋ.13<ϺmdW+O3yc3{Yu,gŢo,氌k3!X; ?cCYwzxcKa-0 R4yÛξ3h3C̓q-8RH]uM?,=q,ض6WfL51S&J/bتי^$;~2׆2E XʉlZ[ NP# HyPd,˷k#Ҕ1!"22 zff{ز1W~!HbKAFnz6P."602 H%d\2ΎVy%5 kyVmOQ{5ЋߩQMk+#cg#F, Re5&GdPΈL(,yM-!%w排E jQdJ2)lo d`1mw[WtZz۷0Ip8G]vg:l|;r탂{ZCٲ݌pmJ:;>z CYV'{eM&ooG%YM!c͟yvnh%y22h6Y~ޜHUkk9 g]k"`Yvwthg-W[g߽k gg65y R>1H {s$4>Y4klWRI^l6*ɴ' RdReČW}.) ">3f׆ EH|J{DSUk݌WΜjܸ1&TKJ3Qqs}*AVOV+`{>mܸWiR v7q_:OYMhp__/ v~/_C'vdJ.JՒ:]Xʝ 8 Eu`-_5R)d}fdk&@]} IDATiT2$_D2 I3{GLZ584Nښ4N7~E4&SD9&|c׵7f4$Kl37GJ^]!0y^Ə̈趨O_ōDu_ҊMj`l6v[ϐԡv019xŎEk _N#u]gb?AOVŌ%pL.:^F4\wns_FjiϚ_X;latХ0t9 łT0tonӃ.7jZ{[FQ;U=>9雷~NR5uGd(J("hСﷲ0υ 6'+_P.V6ӛe_t5{$|s3J,Ǻƴ:#S>KIZZOi$[7?mZnfhPW@CVAhjiv|&{@L<8*옶fUDBMe+Pn2*!zì)Zk"+'㘘1i/dTƙ,z̻"JJŷq(ThB'+rI8"SKck$H$ʈE0e  Y2ٯsHLIW[8JT[%C˯d̴t9s3oAYB+D{0+l1-k|L8:3]Bi`H&QQ]f5xv4&Hr 40gne27e e.# ~YQӔ!\bVć2 8|QYvXYlͣ"#SMД,S3Jk_MkkJ~M纺u<[va"$ $5o,][prd1?dz“%9;]hF+ޝw|$,gM̌?14N~򐯄=QW0> AA*gAɾF.Ӯ>j@=zr!T.%COV O? APГO:!'+,_t*C2Gd9 O:!T!%COVTT|2(*gA*ΓUUP|"sFRJ0"z=Q'+2gA6 I<>㓕c|2!ʹ7GO Ti%yr!RO z2d *z2A=G"AO AAOVd *5A}ƵXkڇ1/ѥqՏ2hЯ$ ɪ;Lbɗ9bҬ1<]޹ǨtLIAГUc*2>1&:[|4R&(t.AIAʘ~2}f*0>ĊG1L-9ٴft$%AfJ2 Oo- H9ddL߂IA*'Wt|2} V%A) OV*ɐO'CAJd8OV`|2A=vAO AA%CO 'C` s` AГ''CAOVd@K_ԭq-g':mz1s𺐄ۃ88n,8=b8?/7G&>,<ϟ}2[!SAgg{iǓШȠ{fYFfěQwnzgyݛ/&?K@|-AOVdσ!qY[ܨrwsHn͎{~#/t- zjfɴ /^|2|Q\krih,8X6oZ>nQ(tIYbwb~Ona" ҹ. g]wΜsΝsz1Yi墂=%.6'\'qy{8O" kpԤOpuCu"s!D $æ$*C,M,^Xn0&dͣmLL-՚k:4ׇm~c#5P֥8#⯖vlѭl~57zqO= >c2P1O~3 ?OCc|X,d@mu'>DZzшE{d O !ܓ3'\1_@.D:&#֡oȖ<8ж@`X_Bc(7$(Q? TOLdC dpe*CuV+$따po̫~?$Ow@&;Iu.loCRQ)WL v#~"TtX5ufʰnJ/ͷ^xPryx2=D+Ϻr?*dqq񑑟""Iԕ8b3̟ga|;m4hHkj s殲D%bi?N_Ku{MYur'3 E]M_Ԫlꗡf"Pzi] lP!O/z{k 8C8ca 1%1! ⿰19X) /(D$EQ( !.I#T7PсZQN("I !$I~hHHffYLV|'{J'[VXtBnL|2eP ŋd2dbD$cB'd#+CJ`ː;&˖-{b445+@D7qLV\$YQvHl?q>s  Z*O&pZ߃{c/j=o6d@'^tǂ$>0o3bK'TiKzNs}/lga6? e>'٭׬ט.d Wdfee`pѢ=zw˗/xAOv… իΆ^N k'!"dɒ֮_n``b͚r܊$)T,~LQz2# a[5od< gܸXi(JH+zz2qefkoGzu^_ꐺ߽[LCyĻw>xb2 =# aX]T ` 3vlB_p\]MF BDu%it:'Qܮn#_|Dۼ oHH2#=ǧW򸼂qYO__$|दa8c.ݶԑSaWڍpK+܊E.× 7*HHB%=#BERt*hO*UP xf[=4ދy2)YYͣvErOBDue&S^=;KID&@5=!??ԔdF~WwA`Fg4OSCN'5-0Qdvȿn 5ȀtςG1/ڶ 0>mNo^en8BDvi1 Gci6zgHg2N.ʄ<ڸq$ ?IŒ܇LPb877aÆ& !;^ (+%?Oâw>9|YA}6?1tVһmIz :i;vc2㟕=&PZE>nǠŗ;X$)eFS6 @U<BH,~VSF)<朋B|2Eafoe>0CY̓TF2)L'S"؏_|M B8??O6}("B,B FqͰ?uAtۡ 9ɔ c&ye',{l?z M ׀E}@II$ Í54^MczI?IKdWIq|2;dA85mJD~~>BCw&enn=ETs<: )S2Nܒx [: <AzZjESS"*2xJŊʓQ$)EBI$B")P()D8.8 skipG]x|^U+=%SKտbE_J{Q11+I•ɀ:L5t6ۨtJ!T{տtEh87x2_)8qa~9dT)/[8pH T;*GQܮC^ڕ]m}r֍ Z P5t )jxy$b,ޣ:F;PQx^*vi;iE=`9haedUYkPˬKdt !q?tPK n ӗka鏭PeJѠL YLxfcI`Z6K܋8̤䤉hCR- U [=Y5d8'*̊?\Θ !D!۶N~x"yQWުc$B"?Y4{}g!J`_QQv&(Oe<ŵU1Y$QER(z{ I!zie)w~ݚ[8y+D!a]ZZ>ɓv53jc(%?by9t?sjM|snrqb״NNz?E -Dۼ>"$ា&M}- VTJ%!1YQ3E!J hُ<Ęas,6pٻ/c]y0;'렼 *xU|P–_oɖ7}$ Բgie]/㪭-Չfp4'-ďоObrH9Sa!2ӵ<"Mc +N w,uH=`Y;GY|&!Khh/acǫ}'y/>x=;ߤ2{/ڳFGɔk|2즛Ӧ!2#h_?vJkO_<OKS+ę=r+V?1:&s̚5ӥ#az ٸä^ wcJf=\o4ahZu%e%g45&B%̿q.Na8°dZ )+t3@)Zj!'ʩ߲}ݺuG'jnWu_>n|3lR_"/ɹ"w?E ~bp qw74%N/Fmӳg1< uZ?qkzYz5WR<**{2_2ʃw} 8hA͹,0ac ]Y1*ӥcڛihG/RDx5Z{NlN71Ӥa0Z-sPx΀1LiLf&;%1 C ;CS֠#{:5q5!D+S IDAT"O̡\qMI^tV%֖掽% 9Yɤt39!$?p!%0p h4L/(gj0qLJ?V<}>ވ8ʻӴϸPe/sEgKR"]PaPX װpq[m*dzxF&i7g_\8g>K i  !DDS2Rf`Cfks,ȗȲW R1Ȃļ/ 9X;IhOalK-V"aʼ9(LSx8ۢ09c&—`]CAh27]d66oOy(37 ^g˽=wև/n@F]NZ滂W;rNkadI ,*(R3rnƋ40sc`TE*Y8h$?i9KX#_K\FqR(+dTYJ {n{މSO8ORB3E$մ4X8Bh{, ۃ%teFd)! y!T'Dww8yDiix+W._ vfi4Ԡ $er10J")1T4 C 28(PQ`g>)CDat t6I:[M} :x3lT\L|ʑ DSƒ)YUrrCHied@% I]Mtܐ6*&gLX#MH*V|P@Hϗ}L2^~**Ew;^ _s ڂ>m[yzz DҞ3W5l0vӹS[Dhc[#V!N mZ;AK:("rʒmoOh8͆8<5%ehN>Z@!"?)lFX989, Fcc܄.@pu & ar6&NjMصVэz ;cZ.;`L67t\d)'ʑ*fi2Ca4ð36v6w깝;` JQOP%LNјt&CK^d՟$bIK$زq1ͺt&4YDo{%1/Yq*e+$i|2KW|H:cXOXX#,Lz2dHb:'fGw6ܱ>Ə:vBpT[v@ u <l9i嬶tq~GB24l:|}%eJVN{|эv{p"}wakt]ێfkoˬ~ltFd* N~ɮhֈ)J|+$2plf/wvΠ[ZZUS9;<"rNnw}Vϡsg2\a!u鵋1KWBCPIOKj ûʾךqP [0g?~/@w :Pg}x999޿300015 qp!uL%.+S!ٿUḁHLCCC] br֓x2Oÿ'3/-`bɟJ(X:* غBpD1u?wjS{1 l3|DAgh6r8hxE1ˁk*fRw)KnPqvu\N2ۘBޓ'i+[7e?L}K׮#ux;>qƿ~~S2Dc~-g*!J"Q G^;ВYcv* ,{K=3~cguFFF 63+.!}u[[o/p$o{'N:YPxPef@]E)%bճɹv-Qyu⃚6*ʮ^W&&j лGxBErPy;/B=|X3 iijg)#,:،RR=p?3fMpc +?mK'?X׫31n7Lb塃|E|ŋejX (t%A{֗Ȭ ɕPx*W"f#ONG qNM*)]6de8gz-[6۸LbDe 혒ֻh sRqel,A666G8q\ ߿֬YGB 6&ѩF 4]8'A!}1'o@,]ݐ%EwvINI(u%iqٓ3fҎDYe^5aʙ4Ӕ>tg\$^1aaճl혢E+w5+~gUx"bnwVPm/X<}lxc"uVNn٤ɓmllʺ}Oű'jPI| TDR(`jHp\oN`کKgU"h%痞EznCKuBR"Z=QF^=!iR=QV٫׊*X )^2@ra(m)JB! C!ո8v%xc [ވQ-&_P5eǔޯ՜]t? Vn'lNW|/B  8!siLXǪ4ij*/[ʱa[.\ê¡[W&2k[#>(rJDu5{όUUeASr~۬^癒lED喔Qch1ϸn/3D?bd Xf´'loC0qv#ihh1rȑnnB!$[y6|ĈJTj% qO4W(aJةeOՔ]vhˡҮRԊ8g(!L 2Jk-u1:^m;F :fl9bHAN&j :Ƨ1B$?M1f!I#}T@ D?:mJ**+[P5dǪvZxtCp#? ~} 9 (5}FQTB|^ [(ƪ8ugsEg>:{9`z= ;Ժ!> M+Sa\BvхC.228|Es-Quec8J0'Wõ=xvǁy}RySҭ oޑeǂ^ӄC̭߾)6j MV$r%8S̵ߖFlU3v?zcQ"B4:˗8/ֹB0::\KK '"33G}̈_! jPDPU|n.75yN m(4xZѰ@EEvhLB,`OdD,l@@ P3TnӶfQpdtԵVO9uGz ݀';Gumhh;E*FrLOO; K[^|]v KQnfqn2olbljblj0a6BD3{@o@g3:7576m5jSpDu- &ݦkjS\s#'^I)Zx⇄~x.tݙ6o׎ٚ<^1f*=] .|,ߎ pDӶW?ṊĢKRo%*l[!ܿ dH~#tf.s78FņdJ"Jz_a"m)TX}6ν$Biع^-Hr£IqҴZh?Nhi)զa:1!D愬Y}ĆuA[|^7raHzGz-1(yXt"[DhiU>K7f:h`Qy.}s Qp-L Wk=yxB-#פ QP[: $S? aˤjiA f;瑋[JQa|с-4#6-dt+"c(DI5> @mdL/YjوOoxTHH(J( BT7VqhlIN[],)ٔaaf.;_g(5(CD0afꈡԊ[ TYFXU {;|΀[pC4!5i[_{sGdvƻ)vJݾ~hihHOihLzl:B 5%zÖZ᥋#jI WNWAcP9daK{PG?.{Ub'㴾i}56C)L˹Onr2B}lwUu200voؽbs2v O< j(Ƌ e)@,HSwW'mRBYeY<@(ds`v݀';[giw׹*GnHnغ}:x6rѱ{[xx0pXytpvuq!xy0ͼ/9N>_2W{Cs$*mkړQBv[/{r{gԼ$rˆ[^3Ē\O^<*B|a@gP9hlc n\&"z<w, J'Tb״'c 0ր#ǦZqU$1t-h10UBifNe~3ݾzIu]f_!PAdy E Tbs2QʓLle;:s 6+6fJ:E Rg@SeHbE դ6zLZldGfc cPfX6ɸG/wz^sI0mϑGIBR~yǿɼ\Q1Ycf, zbFF 1g@]1 %HH$ct״m-:l=S{Y{xF!z_L喍_]eyWԌ3׍#{gu [oULp L*)%.cxL5Fa')ŋ:fPL%'ҭzDž];Ԓ8̈܎BH}#ӄ8ԥyӺ HRG^9,./{ 'vE}-z $GFNyZr%+fũg̽R .7&.OJo%7-OD6m~ܒ8B=SKuѮ}$ Av8>~{,W/2:3ݴd"נIBBHu/p}FIXumcF42K Yz1^ O 6.k!ul^ѽ>p5byt'βd5佚T y7/O\ljy̆׮l@WaE}@/_⼼Z hss$w@*.=ح ݀'x2O'F%'YET2@Z 4@eW'nӶfQp@,=]j7."l<$m< 9!z55713v1uOHY%ֵ_g-(`73Cϸ%˸àٔeBDѹmQ$U$+v&M;^}틠T1O`nbjje#|MMMoPXx )T!N440T$iwav foҡݸ!D{V7uNeHEDq_7&_0#2&+")Jp?+(A6/v'(Iǀi-\H-J89УWEuڱϲ8_V_/vu=W,L* ]mqi,1Iix@Hm֣v]] $kIbj:9Wf喪qҹgT@vZq3ݿIEe MBV$UQr[iǻjd"1|R~qNvÎSDA%M:*FmuQ> "JZ2jr4WL}[K#6CE! W3HYሦm~[;{I+DF:]oq 8PZPogj-:.w_Mk_q)D'2X~ly?G}&h&VjQKUr}6e+z^vL Bw-pNዼ(E ;9{>˜tŹIaatO颪@ G{ښ6qapJˡS;7hs%@dAḽs:W8'swkiibf IDATy䜷oN}4{M:ٚn>'jgjn@S̘X!ymH>y6] *!w++;~OF䓅_G 7i۵H&TVPDF;W8NݰW7 v;v  ! Աc|ԪVrFLz*TG)l"LFpnkydSԑiع^g)˽c5\˧~,):soGŅKo=Gb"eޟ=boɰؘgo>"nNO0븸;ho0ϺA<^D Cr1CTG=|ƿ}^UrIk֌{|0oҘ!)^ Eo{wл?miyȅ!9e<615FK'E" fKM2U%HKaZ5hU~T!\3VTBc4h۳^]85׾M*i~ɧC}RY4_G#v0illj^D};U.@uS'Y?mQ_Kua5enŎa3LDY<כM4E]{|Df|?mPmF׵jلM񃆨zB#Uyzbh,t頁!D޺]ύc+Xm\˪>yO^C{v6|a aЂl MI/NqM&PPf̀$+Hh 5<%dl++bgyVg=ejTBcYչˏtu (vE1u̴ J򢳲?,񶶴00wu.T@ I~qa!OV~Q1Lu $ G..n]x +N{0>vM2U ʟBt'foOox y><뷄<8ۢAɠqɩ/>Xҽ^Gi/+m%"n.^CX}V{!&CHLdӣZ=V:i3VJcV(?&Ӈ01EYo.\ɧеTΧ®!̕JemYl엸/qq߾?᪅ZRTLTyO&Lrw(QJѕ* "2is <%4r=,q=5LelH&?_zC6L]j2+~{U|Bގ-3)-(𵽹Ʈ)G(3Y3Ci滺GEd"/ήkJ-B=RZR$ "EBP$*=E!_h܏%?O]Uy+h6%B ?u:2tZb_z-A$7<3^1.mqRrhūqV37n)GO ϧ9Y5?q JudpuCu"syԒĊSӫQFu05ndjoy}BߠACҗY1/,>Eigfbƭ߼e"or:NhcƇbUzz=3{ښZ8r4,㽳ۙZ9wrTIJl٥(J{\AN^=EN#^pyΓv=)̬TU:W$yz46hm\BařOʸm/JWW e[*Ir ^KtA8!n֍Ml.?أܒTD~E[ٚٻC>IQ%yorfff\IQ8΂.MM-lڮ*ڄ,M!)aQ"B4:˗8/ֹB0::<)) ]:е@hKvj7d Q*|T+m-/BTYz0n@]Doioۑ!=~b};5ܭYTGSl=ʧWwߥ^J\%a&ڪEr"եݤT(xy0ͼ/cw\B0u^ƫWx/ի̽9'7Gӷ})V<׽+V~8av: Ɔɽ]\ZwQ{5LgWg~W 7wkvs.Ur'mKqiԴlo om~&l [E<8ښ =M ڭ&o"SN pu!Y؋;zXsq8mC_ {2?XUHc[opŐs>}0מC.ipgɢt!r= { Us+V<ս+VPN;hIff~'$6Blgz|-5eiEʽ ػosJ\(udΫlv0JBP`m-VUL~oi\8*542a G4Mݵ' Bki@! @ZSGk]ܬ5 CüvZtQISOfHFצ#\kP'י"*W~j7SVt_1%0YCVΉN7_{Y#"3gʉ:$I_!"o)$پi>^.=' "*ۍ8wxѐޣo}ʷ{N#. }wz..n,bg;#Fޡ!bU*P" UE)OB {0Gquvn3!f7ylզU??2sEO"V]4zLbo۽ab} >roTZ;LK+8ezdW||/jKS6XSa}8'f^Y|?9Uĩf4mK.ZxU{'qFbEy6Cue?Y>BC듹oH>BZ<?|u0[MMxzeV,)GZ= ۹3*M]hӬca~}J0NO׻rk.B4k/ ~r]3ֆqSG99UW7i461nεG_k\ )d\LM(e)H}yõG5/˴ZA[\ 2 g9Z.>_O-Revnj/经RjN9Uǒnfj8Cm7<-MhӐXLkɳzXih6f&G1srh]J? Z=~`Nb~Lzoo?V`50rN4s4c`8}ԢδW SG90YsW (馐lV@"\ä!$ƎG|ze˅V y@+VPA;ldΜЮq?#m`BI7N6qgKE|ȳRG νThFE cNaYzVmQX"?.'7j}֞}Ry" a[<-VY]CIƳ ;_@\df.FL][:y{6β) 1\>fu,Yv@hED]؅NS3ՔeY0 #Dp?38Fk@avh]Sn$:ꕲtJʳIo$+َC׶fߤQɐ=jgKYL~2$3U!JwZ麎1_5Kf,]aōavl 4Mk.RL I qfBKTba?B5)3nMkY3'J}m D8չmAS5(qhdD(w%-UX,$EE"XL"9Wbt]6<1B$?э5fZhXTX$.7Wi5`ըBЁdў4D׶7O#A 酠zLʗW~*7S5oG9a5-'"~yVu[ _r+^ Xds| Xoݖ;mҷƸNˡ&$Yag&2E=HAڧG  Σ쳏GP|aՈX|@-D͑*kkM]G8_1uT9b{x궮4)A['pHȩ=s88B ;` feyn8B*u{5K.Bn8paYސ C!zwn޾gCbhYoBbPnEA[k5J0{5˦ߜl>|to5-Gk5 S9i>)_ۜUw9W+NUfvB(ݛ2b1fS'X^j7BzP7ڮޛc㼞SHGͼa{uS;f޽JK{rkF7z,KXQ{mshZJv}k]ћLO[uh]nUD[F :D vdİƝglTF u0L_x:@]fd G%>GExU PG PYUɼ۴Y<~\e:е@h*Kf x2by7"vuv2DbfEOPIENDB`tora-2.1.3/src/help/images/lists.png0000644000175000017500000016550011303311412017074 0ustar michaelmichaelPNG  IHDRr8qsRGBbKGD pHYs : :"tIME #x IDATxwXI{363N1! *3΄gƈ`a@PD0 %(ArX6ǂM qg{kzfQ̚2U>@ @:zv<0TE=NyAI ] @ "_].˞]m}ɖ]4@  =BK9(Mh@ H0Fi*s,4@ s`1X @ 80@ )h?|޳za'/Wj*}FZnÕSA~@Kh61N\O^ 7'Zn,MUe8GGQz^ k~FW:p%=;7؍-^}ptB)Sm˘k̪wRN+ޫG%6d.;V8Z^,4~T^fkm-0NOl;~4 ZoteS.S28]iɟ]SUtiHOd[CЏ^{Z…YҒ?'ѭ!;3Hii… #|}} d,l  ʔOүUp`ul٩`?#L:Uvd.ɑ͗m4tgnPF/gg^=apGQ󏿭iuo F2v1ή:~즊H!l#E8=V[spXS"0rz'5m%4HJ|@L׷2[R/{GW{94"D֭.|\auiZlg3D.[)Yp7hޜP&AG_7xe/_G4#pJ/;6a[v>[_ ѻ{l+`oGTy(Wd*xԚ)g? Xzi망~z~rqWض s^GP'&P } &d6D"qƆ!440{v܎yG/c7'9?N-;ykLۑEhU`-w4}'&<{dnZVjQ+;>0ꟑˮF,{i(}aU3O_͟Of6h/×CGc$ŐG}bJ"N-x\{:]H{v\k0$V\[}@\׋W[/K XMTEjuoK7^$%%%%~||*U] 'ŔǭTjQ7~uS$zrDEo &4Nrzo ?ܕmF%J}E;J4'1Ja/&Sq$KTo|(P?W:m-7(q͕ϻ϶RyDbJXfKkp1!8?/1Ee MS0BDgL(reR)+߆&,Z5H7Z.oN?pLLLvmllߎAv i.4cyvW"FXPh4|$ x#s* RuWr,0{àGwy.84GK!GE! L,..Hح> }1Q*+>gESʿetG'OҝtI,Jk]Yt -Q@u~h+?,MAfwPidvkxI&ҀY+/|Ѥ3枝c2XfpS*V^ q 8 G^YD}CyC +\^]A-ZDIp%f$T'8%};BcwFvhY-Y+1]rvqARln ]/Ve^]A-JHNHS7v\SIU[bݻ4oιMհpPU<`UqZdu:gN9;R,!ڎP=xu/Ml, &bwĮ2F^_Ϊ VXZ@S%M"ե-چ̰5 6@%픇U23~_A$Th?s?KoP 09ڃ<+b ~}aKW%XOvHujث퓆 ܚ;yfEHozKlWp48nn7"C#TeV~}mcC2Q,@ ;FMrG uCâp|Sw'Uϵ+;vj.Obv }999???Gdq2}̖9e[ ܲ.=67j!xѐWdWsDʖovT$>~YAPYEynh_bTjRvؿ |NYҥɍ&:܎Dt%X?5uG}o[ :pw(Hح> l,\eF.|s*J2@qIHgj/hQUe[?JzSFNJ,Vvz$W#탘J%kbuR5ρ (E_Ў_߅d/nܺy͛7o2Z6GX m9DZ+_o1mop箧߸hAӌΟxs0?۶ q4GWr3 bC%+@";5mGLɛ<jz1u/H.:RkG0t?vnOAv oT__7h6-K='xeHΣ.퀏`\ğuuv=^KղRu~2ftC]}9K acl{e1v^_9nN.%m8ظ <-s8k(he.YyuW{sǡ]4e;pVK$[9Fz~JF)/\e=;Ǖ>yѣdP(1%y@gjo9Lǩi<ۮΠ Qկw:yAk7f?xh|Ңk+{u1]~ u&c `? ضF"CI? ךW|MqʎkwetvhƘˏObPꈫ:Md*x۔- 4IdEGPtL%SmF?\"[@z7|idY;4 >袯mU5jG#⪴GݡL{eȚΖ42bo(g2S;3jaӖX<_Q_;r}$quWm^pGq֙ #ݭg`FUzs"߇zUό{\A d,*\a~y‰V I:}a%)̘@yk?#⻞j 믿P}OW]]] >g1y:KLh9Ӏ_f'\|z*kƤ}N;5o"#pK#W&e1>>=B-hv럘xФ5Q<ʗ-|.!+/'52 p!lFX?<9MmCQ4v~0ʖcUk؝mK[yo+]cAĢ2C?ik0@j>3oU~ܰ4:J y?.1 7J7oz7^_\,vj՛2A d |Б2^ɳ%CԚ#t{Cw=+'tg'x*a*ٺK++HY,IgbfjCA -m@ X5RK 0>+'*e=(hm=tL0W3ғAIa4NQ h gV*jF-m5yj!z4ĩ;9|}3KYҮLp+>D>v&tx{TgH(,*ʑ_D#M7]7-!~CksNUyZiᖿ]⨎6 ==pD-d-&I]RwZJbuFFׇi!/dl///OcjiDWLF/:p Sc^C?% /q,H* {C1b%Z+Zk4eW^feG&dbxFcX>`CnEQ:[~ CXɗ5*Х71jCZ}tKt >9r<x5Y#+uk$'.%g ϭl OOۻzϜw+i(?bc㵛)|%fa9#z*=[ˆ#:{縒V,H ߹xѣ>ynuTJ՞xk 턿Z)ߝ[=ΆF"M>;*cX} ˅6ZV^: /U yOel'c2rxͷ iuͷ*O6'Z}G]H[٘buDީ5!S l|D]m2~P8PKS@{3R.}iʑQxCM[Whtjx݇&4g=;$z"^# idۺX㍗!*G<Fe#̜c"_tGWZI&V?mE @ͻ[T|x%LI4j9̯;g5 F^>#'q@S;Z4`9yى&,Jeڳ1iy/N[p+'~IYyOO-GK4}b'f;df<<4)pMT)G&KI >{!?n@ݛV+" f(xyxp2wmAN>b9%6foX4k2XH}ƅ# (6 ȯM9d*jb8[.zoS*h53ꑮ[)b8uoMBuM ,bET)Qw7hHZy,#S-КowhmOVxQk륝|^Xա3]5(QKB(X{D, -?tOV*;qs6Dl9]&L\Xd+5߼yrn/9kŅ/[X{S @j2".nxXi:@ cv'e%6}_"N9 -m@ X5RK 0>+'*e=(hm=tL0W3ғAIa4NQ h g?8S~}vg&EN;8-;+nYUQ%Iw yİfj!Eww?&r*/{P_؛wJ+ [8BemT=%ry5|m/SYq$.T$riKtzF\ZufŔ\fI/} CY4Nevb&Uky=&^w)eNS[u2% 4SNuٕ 1X^[ҦƢ(z([X,)z60|ZW6fh@34{wUpe4[l}J3? 'uUuRU9#= M/cTT)^Pa(ÚI b( jy}>9s|JZzfI~;Q:17v$TJߢ>>Nx̯ꜛ^!/L( |yosʓ/[XW@0^vn9oK>`Ⱥ4{G7j oL1[[VPt8JFLS+*TÏF{&oF!7rWhy\imJܚ]ו_x]&-^^MbTky#Aw)ҫQ**flGB*84]!1DQY]y6ZZלjUMip,V-wzv=;=z ]Z^yOɌ;өOΎT|Tg6Q ^S4/;s Z2m{a)M/ONkVFF=c(H_(1 RQ"cUZ;N}&OTf_#&~;t K9h#DeЪY4No'6)t瞹sr*b`Up;Qlq{xpd=i]vYa@QWW5ox%QkJp ~d|vSVNzM'"YwVOB ؗXqIp^ˤ*PVsEݥ @Sj!@[ZC@#lYuhO- $`mW^EOkDQ\ZIپHuJX"b7^Rڬ1{03ٴ0׷=!RSRaf6UzsnųF뵻$GqᄌVMhe+wٴ/90#xR?+9u[DD?G'EX!CF͕q-m52+/RR#Vqz2]a1yt{ < `1g,\f%\o{˞O.{f3җ'Fm7 :e3n0Nsl?*#"EolSRh\:AYPwϭJ.|fQ\&eҢU暗w|?E9OtaYmY^J4K)Zym]ӫy2'S Ox P %Ŝ BEQ;">؅чZ,vl6E>b-WoEQxʌ{켓^HCaK4HêM /!@ |6iWq$ߥCž}%uY\ؘc}!:eUN5s(fJK$;OSExa5zvH3R% |8>a:U)<ԶEPӺoO*]*t,H]ڙ9v%I-fF:RyŒ"}L/ 79Qbc LƳNfI/]d՞x̆c,&CWvuyy{xmib)]O];%&O ^r+x,W2zj#`GrB|'cpOЕOu.ϩSmLzM#׎tRghfΧw JyV4wZd7FFk?6_1͊b41 7>GjK/ձgÕ'P׾vUbX}˅Vj`奣jg{ 4XN g=<^+LR͇F[k-u Ni*뫼:dI^4O4R/xzPWB7sl.x.~$\s=L9&Ew}5pd2lS]TԼ}Eɇ'Y$ DIF,):ߵBʷ*>v4 lܶWP*C_xuf>zg3I1D*89KK3ޟu7߳?j7K;Մ@ e\juVp.UT@ HowVB @,i@ Ǒj%8@ 䧀Bm:^Kp@ Hߦ@ J)W+]}[n>j;#k.U;N$T*z7>Ӟ[r9L39kݜYE"725L"SL|#> ͯN>j`S*J56KpK:s @84^Hމ-:5eȚΖ42b>=B uv'[to-_G \p?@|pb'f;df<<4)pMT)O*L^xnrq"AT=9Լ-6*g$Hq_b ZY%|nѲrR#^c W=u^i''MV+ЁkPZ=Ĺ"DF× Ž|yo+]cAĢ2C?i0E&V 8ɩlo"U`Uv1`I>,aPtb2ٹahl=u0d]b@oo),Q@9U|ElXI,{]'JEU軿%>Ym@#@(9#ŋ[3<*+ՙ5R܂,R#WՐG(1OE >,ՠ8-:D}w24d_Vn=փ wh34[^ /q,6i̱FSH#,S%$ ӘaZ!/d$*۾D3=& O^K. 3hr}YDm B|]2N-#m>q^ L?p#_Lӓ7YXH@eԉ* Pԗ=I P v &?7+ts‡RFϧ =ٽAG^z.ܽjӹNj޾j9gpED c~eud1Pv!LT#+ƔkYs+EzZ E/+gWrP2*u+ Uj%2~B=N{$:)Ona]+D٤qQ:17v$T^pEo} 7/WצYed>^K6#xٹj-$!|NvZdiXL.VY@Nj-io% Zvpn^7FدpXJȤ[_؀Ւk*LȠIߎ9RMm"cUV$)۶d32* (ˎ`>d 9r,oe-io)͋Ҵ:B mj=ѢqϹ2'0D;/a8-DnAV`S ^wD%0t+KBD#FuX/cK,!!1%Ufifany^E[*8B˕$!DWPK6WƁU6|<ɫJ[٧~)}kgan6`ܡYCF("5++5>bN>0'#&mVGQ AX<]8ZWs8ʉJv[903>,&/nGa <%í(Jgˏ8|inQ]z6dUi9G$(zO|%~_:rrbO{EyWU4xʌ{켓^HCaK4HI Eʼn7+Rn#_W}>Rg6gY ,.,͆]B)}@l66>rG[ˆ#:{縒V,H ߹xѣ>ytbFZS{&yl/- >|:U xa}uzAMD6[ a o ! Rvf΄_] tRnp #)z/mw"Q(fF&+ƻ .3.F:iԔ`"ߢPvg<"Wz9)d?AXYC&BAXIZ&_W#$B1t?Քj^s{c+M$p73-N vP} }>O&8#"Ŋx\ IDAT^.V4>}֮B HՋ jM^/K^ ԲZxsqOn3{ ʴmZI]w|Gs*L14*`׵0O5}{4j߻(KL3ֈD9y.?k_}(cJhKgFhH،YvmUckSC[Q&N~{}_>Idm#/5ciX-&̌}~ì ($=Skx?O'T`$jU28aIB˷p3",#mHdߍײj?BȒ{i`QtOC }Px 50.m.e\Z@ H ˅{C @'8@ JZ @ TF@ -2=Z W:!@?VĕNvAk߄>샮3k~]h)]]<$dLX<,/6@ [\3t݇In3>։'W84cvi܏}E_vjDB*$MDQwOnt"2L1xr5=;0| UbN\f-P&C]ΦsTEC.]Ö-|XM(x5B&QH:ZZYO}  뛦5ƶ#WED> ~j U۸9ڰ oٌJ6t{8'M}]lLid*x%`"a=܀L64Zy@XA&Q$Ŝ7S7#u T2j٢{kbd6fٟ)]&aU |P ddDmwgﻯ`ܧE}ȼ$/Sy|#5IԼ\ Vŝ]y6We͉r~rcґ[W։UצY2fB5v?-h_vy)f4`ܚHJ-?ٔL1sٷd]wgN"Q\w}tR~՛ 4$S <)Khɬ]8͒b`7i*8Z»Lh~:?v"?jzKx:t%jPxO1j)V$s/]`otaB]|},7գN܁a;Q;([uWI.7J7ozŷs/ G4hv(ob)mO*lɈ^@3ba t=tL0W3ғA;}/k.҆߇4e%XA.Z啢l^PGZFD T. j `-|VNTzPfv'e%6b^H0#*5oh- r1@HEnuOb䦽覊˞;T&;]sJBiE/PYAO\)z^cve_[g|FVf39 K)(\pR22R-SDu[uzgwi.lQP[LVh neJKclcfan'WW"H 8(Q@3t;(yoݜg9,ȉ3[X9r_|OmvJLJ"WkiYmȾ|x0ۉ*!Ofr(E :q ̿_6y/CЉ0Vcd:( ҡ[LF/:p Sc^C?ANSփ whZB_YmҘcя6'GX}y1v-I15ô֥_fHT}yfk{L$\Au9gۀh.;گvD4<\ML0xM;kF$<#GXw U?br{; k$h1tW  3kD%b>ZufŔ\fI/} CY4Nev"rKj-.TթwjKNTƠDf"LqcVWk[j"c/<*Mo6;_J 腹񛨟m|)^h>vQd=`XׅNӛj,x²r*Q4+oVf{ Q_Raʰvvƙ_K>WᠦW~SuR;P^;rQFfIyiaJō~G IcI ?/ˎ* V鮺P829kJg⺦{DOjm3u|PbNQqגNSrTFDC%~zR|u46Dja$D/-yXܰiQ!Fn [MRjQU(0D!!`IQ!`eh 2ᣃ6&T n25mth(D'jvZUUjɼ mGO9-CC# djT"Ti ns40q?EoG_,l/2n0:"ٛIJ'I Urn=\0I;$e`` Z\zs@vFڤ,F:^Xl”r:rd.=*(J+|2؇|5t_e =sg j_]/I0v|,̍'kH"P8é+gʽ-!XR敏xq ή~4WZԞ>tϩ{ %EAahe2](<=(;|iH؟8{E^xCNóz6@+ຖN|L/M[*ڐw|N}JD3[ +*>08.VH u ! .(}+O`F"cRk9,O׈^e(%jȄ{Lv]hzW-f:Y\Y,͗B=Q_iWbKzZyf. Ί0ߍLWsQn\+C<  > ܃|qIyǣWoH yvirBbRBbRb҃M71S6%o]uIu/΃/!=jq4eX|'AaH %uڎ|\΂x͙]DQvd,e7o1&vvSyٹLU/<_Q !O|_D9*|-D(1s"VzT.pAu@Tą({n"!7 s#oc*5;hKFȞg:F# fq3g~:@iԾZ1&S AZ^,47W?L`>?'y*Z=~⁛ތ&$})FnD-%%8?R8L`O0'췽czPV=oSͺXߦqVh_H|=9cY#r(%Gv\R1Z.*%DZhP zPADcx`dE#0,F}.8!Eu\jk(PX5M e4n=vT2l?'y Qx!h u#NvנeZ>fϵdjI=&T Rp>^F~ѐ//gHO?v b9[,+\Ui_S ~ݝv=<~F·|uF0000000#Ȓɘ⑱Z!fonxk ;lY =A>ԀXe>ڔLOtH"[Q& ьB2t]X>#e|'D!TJm$4vՍ$mO/dq*$ʺD$$}-]YB{NQI$x%D2} BZ,=W*37 pϯ)oV~CMp!RVvov-kGbJJJJJJbAױhtDV~c Vj={'fEL7 ``d15^sUeEdJ~Iaޫ/썃ryj(/DQm7%\{SyYDR^IIQxIO4+oNnSϛ$E@qދ~/;+ wc}f=w w‡4W1 =Ij-`xxH}STV!8fbFOGm:;88y[H[<չy5e*-2 lOv6!ëW^-{ QlTXZVRh5= 4[s4uAiIJH F^{!kO6;ZPZrR٨mc. ӃxHc^PPV~ z#wxOCh&h  f5UM=\V"7pmF ׇv{࿂2C#|E59VX@)~C9:}Vf<&wRk-P3[X7v S}2{lԖRUy ?a[@95C-#JJٶ[;7!x%g JHOR^TEiur7Ky$@Zx4GnyvH 7B߫zoQG2ESAV@DKr/9+on )S5FYy紷-|V釃Zlꢄ|ȑ,U|r& p*`?hvncƭFxoq#o^uz˾YeUf?W;"jG4z6ܫq]g+&\l>&PBSgJ.wqZt]upc m]19UXIL#7d%l;u1Q\m~j9H0cٛDS2U>Ihuё3z $Ժ* + bqA,{-n'/ѽXݩsaW8Yu︄(DZȵ=(\OLm(/SV2R FSC]9V}˰:g;#y(!+pY #eeGJj*4.gv}GZ&Y&"k##( ͙ynV9h(IZ^9Mvk$xgp:h9H 6iij' ?%wN/, s7'uO\XESԤ +-p#+k;"c/<* _MDe_F"V> 7Ԓif`  _/{]>9I zQ~r Żq0@ب):|Ԡؓ*ȥ=Y%ӯ rm!#JJݶ9c ̴2gX}U=a4}# dJ vvƙ_KE| (렦W~S. jX]~ H}"%#+ndYXw_&n:hn'R@BYYW'x)IcFC7U̷VVyhU]xTSNe^x63Qm!$>|Db#J}LʋI֭ FZhBm\,,mOћ1t7Rf9)djT5 ^Taڈ,?06`n4qw>SĐά IDATig&'$&%$&%&=8ht|Se i8#)xtQeh7.'Q!u 7|BoceJEITrHm &@gv/먆ʮy]Ed]l fNJ.;"e1@bTą({n=֔Mk;~q9 5g^>t3vEA$b6ƨЫM\(yw\LT>u@އF*#&{~Qyw߉j,+I zDuw=q<  ( fD.w0!Q-gK1w#j)q`.Ym콬HgO0'H1w=lu6?g7FhJ"xt;?HG[mR>,'mh_OvNf[?$=Akݻ?QIT1>ϡ8ITrhmA=vT2l?u-u^imH"lyB}^J0 |XH kI%$"nebRE(aiE#0,F}.8w/M gOLU{ GC~T|!j>@ہDXPc{fԽ iSIn-@x& t%ea.\*4dXO{ 000000000_W+a````````#՞Sj% ̷ "K/Z t/+cNS[df0؅ǜmjjȖxOִcLdK | e[=cwϼpi;ްk%u5!fSmD2m?Lw҆7$YJob/6y;SITU (AvHBYqMDR{V?PuBLYb[=g2{3(S ?6gO9[ξ]'3qF}o1?%J/&ID2QOG[K7녉o`ww4,]W4uH=ɆF%Q&cfm8ȓ5ӄoĮܐD2)`D[sH&IZﳄ:c.HH&7KeD1rYz WldV\k\HU I*~V #\/LfAU =/7o*f36'h9YnZ؄вӖ 9u*+"SK 38~^}go4{UCIꢚ'fd8|.bJ"6o슸x{ěӯz(g']jW8o[au\+(jnëZ͞_Zt@Pg3~ 9ť^zjno()-+)zud9]$IZ %$#/!r kO6;ZPZrR7x茤J>]LSk&!مǜ,gFojch6z E];m Dr kp?j;;kCD2#6eH!SL| 9wxQƣfm Ƥ#Ki$w $-"xϐhtZ~3f6"QnV6(^}{P 9Y:ZsG_VdA{U3[F}X´; rky>qRO's-,BJP wV?$/"GW~svi]PC#CN?|_r#Ymp܇!l M>(U˙ni ":}Vf<8q!0jƓ7X*hwOp`h8i˃w[ۃ2μ)()y~U7<޲x o ңYgf0j˭~} ~۽>/IZ^h;BK-9:Th3iUׯ(CTfuT&t'%6ts2`>/⯋)XY#l5K v哄V] 럨JŠ^cyxY41["ߵ&>#;u"JZ3PfV2 ?h|o7ڸw" c`Q4T""V:%LC`f7chM\c۝KN5D@Gy~AVڪ7(V0E(UN!fg]Y؈ B:DɩyMlIgϢ'jܿ4 &հhY].0?=zLVMɋFQ FT#!vH^dKL=õw1"wv msFQĽJЊÍR_w';)ziFr[;$1TD`d&=D|Y'Әv[ޤn~[BϾ6oelRqY~ :{Bߌі~d\V:Zx>IZ9r&8iI" 'l>8E ;_bRPYMGIlGM"x#YEm 'i-͌˙m~~f8r4΢6(>k;ܭyl{moll"<.UW2yæ-ފi 4ih1=`Zq-%^lߙ=HQ֒Ceh~'9"H,X͜Cj԰(Iܢ'jܿ8(}%vI֠Dn_yTf mwN/, s7Q? R(?9}j {4[3^ Ze h-7CYXe媋UziV,xب5Z)FG4rƾiej7Ϣ.z r`4}# dʏ˷2yn dUqny;LbPӫGl{:./aU,wM'+ 1vK_G99G}]q#0%Z#y,zG<%vT~v*3U GV76wv9C\W^mJ)*Zv`?iat]ÈhO]Ox"ԳQUFH-욄%6m82a WiC]J8Jϙ[ u44[P%X5mth(PVyhU]xT_%+nA˶h23٢QPb&6C|z xHdo*'ֳ+ $TrSȹr$m쐔’ۥgYY)1zet( .D dɮ˷2JX_ϝ9bwOTWHj_]/͡լU1wdsm{a<_CڴxN]9SmlqLjZcIW>Ƒ'8c,Rw\iQ{Э>yد/<Q&V+%*÷ ;)Q74w\] .hشE;2 9|ԧD<B#Rjp\gGln 2޷Jo6"gn:1mdq!fXlvE[Q-_,yAϖC+epYɶ*}!.;=f`9};ɗ78#)xt !/>MNHLJHLJLzpТ^7xǖa !GG9Ȇ #qkN@iN r1kLd1޻.gM[к! Pj7_ЧPawfc\Mh-S%.V#*r(\&_8an4HȈ4j_VEVd)sOx-/M ̫cO0Sn=/7ýLHTR݈ZJKpV2Y=e1#q>@`O o{25 lmjY+>h7ьNk~ǧ'h г?u?"M*BO\r a,FEU8V D*(sqϗwlwxQdY3Gd&/PGeֆ$˖'8e9[Y>@{V3҂ZRID2Hy$QJӾH5`/Khx#KB{'&O8 TD,'~e%bYy K#_d? _kb<߾düsEYq(wW/eWU-wǿ_߼1n%*4ѕ;YMvD*V>**-.|un^MvfmgrK?{)/|>:2ZMm 'K"{K?xl_oW9#ߣh|SuU0|p咕~sٷ_{3RJ8iYlJO5 (~hT}50?Gied!`w>}ZD0Aل FaFチuWo 54)O>Ֆi }ư+.֯Qα"Jo'7eW/ԙ۷J5+YVAĀRޚ%&!eɐEgEH6O֩F*(ЪF+ EH!RtX#~ade Ӝ7^7V )^ֱh{>~ke40mڑ"LfjЌ1A@ uMUQW-wԑGOsT wXe^{t^'SU'ܪ5ܹ@.D?':rF>Maﻶ>1jf5I}6$֗DF;u"JZ3PҚlu2anX\;"/r2m -kBN_N6ts2`>/⯋)Rv哄V])韨JŠy|2uT&װDF"L7T,9߆q=tJ{ZK>sW6 ,FQT#C!|j껯x^[zV6*IL#*8]0`=~{jg›8@v(`杻B[堡@Qq#+H^4jl)fg Vɋlgpbw%&eɐ#jۍ㌍$Ͳ׭>ҷd:Zx>IZ gns$pӁSԑfpxLhм&6od%Gϓ2r>d=::|~Na@{rK~ּ~!>0'e-+ZɆt^/:.e|Nc?nU0<#S gMYQزRKS?OSXʓE?xhJFMYס@0ΗE"zan&*'O\XESksZ1qJ:s1?v2ۤNB:@(E}E} d=`X22xK􂂼wOTBr>R(?9}}fl)KO4T> z Jv_>BFp! #>8bհ*uѯ9G%奅)A7ݯ$fN">kp{It;#NBYYW'xpն;GybHBL՘u< IDAT$ ļ%Fp)3B5; 9}J }.Qm!$ ؈R3SbR+#-4m.f6:ۋ٢Q%'C/!~K+ # V6Wŀ޺ yriX-,3r[bk7s߶k:iˍĘe9@$ q$B`,Ģzq?{ZW }O/ d.=*(J+ EFl@J ѹ⾄GproY^kA|TCo0KHjGŞ[Kgˡn2H d^~7kvVy@@|6-pp/k#ڀQ*O!C^"}EӍyLil( H;] }9"dHC/G]gBM'xeYRQG ROAlݴ' ^sCw9cQoc*5;hc{Lv]hzWyUٙ}wɰʮy]Ed]3'bW@ T>eύYns+<^yxBt@M]r~< C!Dbps[fPD#yǫ<.&`AI z^Eu"p#0#m ?poFrrƾ}7LVHgO0'H1w=dx[Xjs;|vcԪ$/Hgp^tY˺&#Gfs]+$2eOG @/=h-7{;*j:'9t'# )ԇP9b 3˒l42/ꈳ |y8C"||ˉXҨ}Q[bYM=⡃*46q>['~t5H4I&9$;BgZ.[Pw_8'3yDΈGE/8T_`ף-m{/pPr_X4AU҃꽌w]mYy < .````````=1000000000'8 ̗*+JHuK1Z ?Ȓ V+00000000 |{+J' v1g%Z巏sH3i;ɖpβVr1qO$JOgljjoصT97Oɴ ?Nl0݁Kߐ[d~(ɾ9CoI;7{ BPLF.ݔu@:[{Es[^|oM$dQB녉o9~%dũ-cNMݪ F* mڰ K(6Sք{O詈AѳXܽno^nT駜-g߮|Й8}! `Dؽ 'Ҩ$w~ <1^QHC+JYbL6H) 6ξ|FN64*B63kéF]u#`!dDS&XL"t-g)Kb{W~'{G3 uUpJSsEFηƲs)D._R?Ah*rYER3 Z!t(޴c憿koj.q[g-{,J%V_NVs%l7!* Aֲ76p ^S_Qq!jtQ!,<6**hd1ЇN WGL!#)fN .8l2jz@'WM nАfEj3AQSWfz-2 F۫ǹ Y|7%6_|.{{ƛDf'23d}Ae As,~`BPgQ󏲪;xrޕ*T^r7Y0${|r5uay'Ӕ~vk"\#ixScy6$*m_njzv1'˙Q;^cCNmB%Qfn\oڐlhrQKXC~[fĆ )dOp;>3q4 xԬڡՖۘtd#D6A kXgH]:͙M3F(FVS7]!aMB13};2%*)ԫcNVŜd8zїa'Y~?s?s2KuANXb-'.YdEXpd!?4uZVDsO[o4e)+=m0psǫRmoG{p'"RodihmϱJrzkZ[f uR yV?pFx򆓑7YcK)?^E'Pk^\ƵڅݿޮQq200CE<|W/ FV8Y|usmH]e[dv!Ӿ4#=e`'sR^T ur7Ky$@Zx4GnyUU7(K~=i:VnrH4v.'u<ёy[ .1XbV\A]ߒu3MAM/mB‚f ~po?/ ^vؿ<}'iȭ=(̛]Q~-K/ =zQݑfˣgt% aQAWL*+)Hg(v)qW\O>(;u"JZ3P?6;$Ғf9;.]ld"|^_SȮ|Ъ#?aUIXX^:/P2%2rG/Z,ߘz.Kk޹(bYGtOSX$JXn$0GղP0ްk"5qmw.;ULZbkKm{)P8c;M[~˳wy) 1ZNԺ|LRj^klu* V3m>(B֝#Lb@R *ګ@w-2mw5+7>a>A1]g(954-i=@Eǰq=tJ{ZKZ0GO܇$ hȐjdH52BgwGJa鵥iu^o2ET 3\{W#Rf޹-U E*9C+sj:#J;|ݝ'Xm~4PI27~WGUGKѵg9)^A+3 L6ۭqӒD N؞}:p:#2QyQFZ·GG'}) HK }gOmWrY~ :{Bߌі~d\V:/]Mqqפ/s.q扌xcV+tf(qDn[q+o 8B^LU&x J_9̘JQ0jj]#IS,jo=ûl気 Ʀ=&IRU{%7lr譈@NcZ Kނ[Eƽ @iMhZq.ݔd9}i^% 1X9U lN>X<9]G6Ea%]dQ1pE6ۥ Q` )? o;7Yh2/iP_*ԫ@M UM^svM'mI=E9YTx|Xms4ײWx0(Mr@[b$f&%EWb߯!FZhBm\,,mOћ1ۋ TMzvVn 9]Pt200Cfmu@]~ iZX g8uLFib2 H6|kX_ϝ9bwOTWj_]oA KoedY"#g$x9$[v|Y,Ң[|N__(y, u G+Gq@GA[|NCJً(r%ֳ!ZQ׵tT;.\~Gufb|q4l"V׆CsS"5D +*>08.VH u ! .(}+Oa#d31"=GyQ^ ltcxG+,ֻj|6Bbk,*<n-kk-cMuߐ%jGŞ[K+qX7DN;49!1)!1)1A}Mn.J ߺ__ B({hFi:.֭/4O:Jf릵?3/0xcTA&.w<;QA+&;Ɍi}'GY|w;n1EAVFUvv>/"| 9+*_: p*Br=74$KB& &@gv/먆9JXfvc<`RG9sS^Ӊ[^!ؿD=ݔ @~P?ͦ׍52w+oёeΦ$Hܚ4Pӂo\*hKawx&TkZ)Tݶ W#k`T K@iF\|~j `OLUEp]?ܖY6T"n*Ϡ aFקf]Y=q< y'5h?'ߵB;d#mzsDzG 4'Q(K!z}0c\YUJc5@20'^ Lr#0,F}.8!?hȏʗ3$Rͧ?{T5ICBGlؑb] +UYUT|"Vt]?Pq-+*X M^B ~ %{./{Ι3;LP{ED3űnT%tտܫmHD3׍/r&hx#a9#%tD$TMQg ,1Sh%Q)ǞJ&O!4Gsyxja)Wu)y@J3vs}o^\*l-B/DNY.Il_{f:B#.v^56 nVj6 [S܀S~>Tv ym+}s8ڭQtg" QHj#znܒ@ᛦ9YQId S*05MMvV"H۱Rym=>v}$R[6U'u /\ҾQOG[J/eK#WLbF&R,Fy WB$%4EoaYOj H&IZm?D׏ɴ >n.p0"i=<2^oF(F֮b -/ &:u=y1tQI)kN$ph-CҜs(D2[_wp2ܖ&YWye.-ֲ]ʹzoPw;zVJ9[', y>90?_!Kaλ3Мy /EH^)9Ozsue #ww*.սطdt ^]UG$e tjIjX<{e9BVTPXTPXTP^*^G^mNTM*({wwn“^s0::0?7Ĭma|~1~TR^DzʕW|򭂵KۤW޳pRlfz}Yt=>[i[J?}-WO]]| GQG  ա!zkh}Cfzo_#k"-u1g~z|e+nsxes b(w^,X?Vdu,"bhEiyϨ_$Rkʩ{3?uNaA+,t䂭yXZp갓?7N>yS/Cԑi]vOģF`5Fr}v n=^MFjFCJ[1>蘋n<ښ'mҫNj"YyAƿ4XVe`O]؟$*"eݯ7?U4~ sي5oa[. IDAT+CL\[rYIoU ]3T`UjZRy9~Ol0c$t̬Ӗ:j*z;{Ucl\IJU0 `\D.9V.f' 8}mC2_/UxFTc#b|- :rJPʆBr s8g0i]Oa)xg$αRHf^Nۣ^cS* oV%Mz}pfo׎01H _7IK_:^ާd|J;nY8Lם߮yˊdH4%dX AbO] ~o۠[~IZDr˚ tֻx%n׊?FV]Eױ@Da>rM4z*x B C2pjI @X2i,htф[f\<(CB\s蹙xY448+99Y[be|˕O_$2L V2o&zξhZky&jE$դ]Iƻn^OKׯ2YGG?0{6ݣJ,뎷Ѧ\.RtYhѿuzjͅHd#[c.YFt97 HG2ʁܙupE>vz_Zo=D5{=d,' {W_yqlDmI0a)=lނ%f ﺰI+j5tl`a2>w;3RB[QID2H_#Thj11(=""Ə} 1BxtpVi4s}C},Ҝ{h1uCHEw˙Vd!W ~q+)ǞJ&O!4GsyD[OQ#=(fihbgs3Ӝm/)Ú,A-Ii o OrK` @ _O5!@ \@ J8[ @ TJ@ =/Z(xl%@ /Nvg}Ava[Tאrd)ls@ H+l%I|hZyem_oR}e5E03.oK%i#|ZN߻Lt!U(Y[4땮S~>Tv y-HGڭ_JL۱E\6 C/sZо#D<,S9g$}1(3^+]Oo³'\U%Ƃ_,gVD c336D2H&hf3ۯd(q"*-V"v"$"I_KײBcL*Vv3pdL闵r/7x QH#kA1^H>ٖF%QȦæ9THsv٣hTn_l5W| ɜB2r[f]/_k[zTE) Ԏ5]I+R/ ݾ!e=7֯qrkQZ.y몋# rS:} Yvc,xDU!N+*(,*(,*(HrTR]AVOћ~/"-n쒘s7'_𺵐OOO>/xƌݖ09(kNV [_u<-TQ:]M-*(,ʎ7s3 W4;[ңǨ\ ա!zkhʢc l>_󹧗QǫgO)K _zP`e5F88yZ^a~3*7Ztrb6̏xSX K%8<9`#_eg=ӽ*.l^8[f+yQF̔>]>ֈD9&?gq|!tx[#7*,z CL$W X=HSŵlFv[ kL=f`# bfo̸kB50~BYD ~i`Fnpq:7:ǃi[^z?ba>T`Ԭ&k4T 뗪,vZsc, n2fj/댥/^I HCVLڹ_Puu0H V "F"r~ܭtf4՜-.-gj:)czWS H_&XO_5SŊZdR]b ilm V*]izw94`7/~IWyleV" # Y8V^}=xxhRoHf[ק+xq[9<> w{,-eN˓, B*roo y~MNA~nG_z.rNա%SQZN_WG6ˢt-fCm1VT\QRJ*c.>2:=+1|2ZxpoT7T?_hH?&'Ԓ@xg E9OM5|ﰝNjouՑxӈ%T"vt3E ^ymS(:hD<#GdwK o8vZCP0Y0T;W-ˁ2&JSyy3U0eYyQ&-t> h@gE&}]J@4cAaM`wP`u'$yZH݇SI |兖BNՈs"\2gƾ9aۆhEpm9u,-i&@yE9F?m.aeRLV`3S,!I* #q`؈jl1>΂siӾDȽ3UO[ꨩ`5S3Vaa [+Z&Fc8B՝̆N0nRu ia$u x{)-OnKbf i3]3ch8c^t,Cro6;Rv|& =gi]!4w4`ux{Vn,k7]{Pk&ۨ#Qc(ȷ~tT67ģ.M$GwzR*4=o(-F ^YLo'`4grԂܤ˛+wwEb7hNT&ZPuUDa?8]&.tlmf?upW}5=7eǒlfƯ?+ Vn80d^]f]q9IH-@u!O3^AwoZk3Tj*DTxI[NHxEWɉ V>XrnA^X&-V02$V7K)V* @wS}@k8x7YxBoiȡ6\>x^,p(ݿ7 le uo9K|FyE9FZe;ԧ^zO5^pa^߇*|U2o&z}" ʺ6Z[Zz#=/ 6HbL4qICmMZIլ2n?Z8Z+a  N v [0=jO磷jîx|np-< l4~d7qK, " vUP1%>^yAM1XR><(+k %'mV=?Jd*, tL){;Мsf^ku=ISPWl~43AaUۦN#7 >p#\467iK-*ޡZ?' |V]XAW[*RJtZeWktf=0R>6pwPP!kF0[6Y'PqꃍPQɕ,c+^~UrP6_5}F.$nZf8cX,6[pTyE9Cϫ[ @ZJNmXgyPU{1nw:ffY嫃'\K:/1^urKsO&?Mx`e͋YLyʺӛ^Q[KϋA( Ow4xWЗ{,Q^dud3 IC7`lGYoSM\ߚq/{t򃲷cm>zVlJP(zcV̏rt`)9 '!L #o(7 űnT%tgXz %4:݊J"ID7Ey8lE#TAAgUTqxܫmHD3׍/r&Ej-C] "JpEtw{*l>e{moba)Wu)y@J3vsrՎ,ewmc@ (x˗J5ukYiG2RI Ҙyư4aN @ ٘|䠫'j!Ÿޏ|v h͉ѩ@R0@ ^Ae < @ VB @RJvg6N8z6 nV_ǫM4niLU8%(zKdq6Dv;YоHXjCc$ j7nՙ -Gm%K!&锟D50v^ v_#m_]ڝKL[|OMӜ$2t؄A^*t̔*<0~g1vząDi;]x؈z::mUz,(1$;yoa?b32bd1kMȽB"'DBBm߻Lt 3T"6r5 e҉n.p0"i=<+FeVYOj4gG=F%LVjW/^G^mNTM*({wwnJ‡3 5>Eo H%>I:gزLlŐs}&ӶF+|Z$ )].OZ["r-)ُ~ֿ~m PQe0fO~=lōr(E\zupb6̏xSX K}Z88yZ^a~3*7ֺc¢W빯)Kd䂭y90/-&rB7 Փx@sأޗf(wY@ %t/.{:yܤ}[:ر*]=\s]h:bv3[$T@v}a4kM< `H _c$'z+H0jV5RڊIn"lҫNr"eN+aE%vjxcU X5c%=ub(uWcԼ^Zx?ϛF7iAƩ\e9bEV:hQqj*KE8rd7MPxMckyԀפfXZweQgtzu)NkyJֻȡy3O.-gj:)czW&-?/m)oyOm7 d-ƯVp!-՘.u6R4k3鍠޹kXΝSvl a|["DV־Jo8(bJU(Eb&I?[ׇ*#ͽnV9 A1qnrR7Q6U9ֲd'ä18h\L[O>gf(1X+V%VDn&}K7IW>yô2y|>72fj>scćMldŌ(]^MKuKJ /2N.M ~n.M`iĒSR[3/}<7qk)=a03~?#q`؈jl1>n?cq%*1VфuzRGMCygv\5{,|y]e?\V .H3jb.|/Ā@j\D.9V.f' 8}mC2_/GW # l(h.f:=CP3Q)$3}8MMz}p>4N i.kF))`vc*duRں(y0rXn-+r}y ܲ qR:^ާd|J;[kIf- 5{Y F#d -,NS#e5s rZ47 ;zn=7ʷ7pjI ~#i0͗;hsVa0-$صIKiJ=v%VJ'ۅ|Ѩ4u=r GU4aY-O6JV #FQ_i,iq?e!H .W~<}cۤWI;,oW9q($R=VZ1"T1&*PmJ~@+ٷ ~g_ nmҫNrҭe)\j2V뚞bI+n`c/߷ɭ|4Y[Nvaѣ6xq>z(>%[VB P";" BIҚ[ ~Oz~dW%Em+fS  Һõ(%F7AS[V`El [dTie$U כvh搷䰗 $?M4>ڛXpWP$N <6݊D&?$V&Sƙn9Tvp+ DY鮲ꈧ, R_E g۩䈦;~Vp4 + oaV|I+ ;^Dr"vw#w;8Y۬u}}PcGjp @S<6Ogn!F @ 0WEt#b)j5iWe+ =]=|-.[XԚ KGF>?Ǣ]lΉR.s7>Vo[N^ڲ$'`˯.H.M)gՎOxzsU0:: -QK0::07_D>[%1 CQoNuk!pi}^G3-aqsP(WI:xZD PuZTPXogzQAaQA5'կh(7!"Ԉ.g-u1g~z|e+ns '=z: 8U1|OrG),H|zҀ> V-~WMnEy Qs_CS[(+?yUq@Ϸ8^=|rNa^ZLҋlV~JCT<3eC5"Qi3ٹG&_]3| .bS*j?yVvҔuq8#֫D*SϮ4؈B813.oAPMOt9 _i95 9Hds|nOzf2;$"a5lGDݥ ޜY7i1bl=~ݟe";E)|l2ZˮڍH 0;[jA22˒w$QO?^c=K@}=6*XM[ 2N=ƨy-(QB/mXOT8˚hY*e.~S9nKu, -o8juIßn'T< ʗf5]!Z\Xd]TekRgfQ8u1kGP{g5]g, xiJZ@bm֮mW \/@zU "Bu"w+y4Y8M5nq)=Pˑ4U @5 Q^f/ZB뚩bEjufG55*ե|;+~Zn 8<ֺlɪvXV]^ _tiY`0Z )jEiC|C2z>\Wě[eѸܜ}~ø@cn/sr^t}gQRS~{K{3or 3_wxՏ6?4қܜws-ٟԏrZ:^=5Gkхm5{rm财]tR*PvɖYˬ":E)E9OM5|ﰝNjh k@}f$k7畟Z(w|.lmNxu$e0RXZc R {ŪJD_i@3ӗ ڷU-ۙTm@ShrZoC/CL\jLMI \!4W41R.~IR1kLLjEwJ4g =kz|/@׋5} A2q|c>yô2ynMʣjyX)Ci<7F|h[-DCQF?..^d"/^]wKg?7&V^w4bɩk)խ{>il_g+4WGjϧi9Lv^p;?(q<?R]VdhLL3UDFũz *0r8;ŪRԱj^xy s FrVD^lT~sI˫yy.]{m:Ym` ]J@4cAaM`Du(Ss"\2gƾ9aۆD˯haH- m8MŎτg,ڳJ2،V<v&Srkْ D_m.aeR$LV`3S,!I* #q`؈jl1>΂siӾDȽ3UO[ꨩ`5S3VB- 1tNfCKrcm '7lh)4HI0:|w 5} A'y ܲ ;XqS2>7mI p˚ tֻ^`nBXM>X-GnM%UxEgQ_[=lGx?Ӑ]SŔRTFz.DSÊQMGRJiףVQEA;np$3u2k%8q*ZrhSķ}Zx"d@ 8km\V-H /I (+!ELN4 :SM4aY-O6JV!\yGͣs3cQ_jH\e'x&Q{GN=`/wD,7Μ|o-}eWz*[ad5a$u "BMBЀLvҙ V\F+؛jQhyUb#W HV@4̗G DO*(B (F<_PoaCd]&ix#a9#%tD$T%o%LyqlDmI0agu4@zPo+߫ \2@sO1"\7>n|ș5Qg ,1 DbR^P;;|d=B#4#Thj11(="VrP' ia՝鞷vda/.WW{dO!(x˗J5ukYiG2Rɦ@d٘N]+C^\*T@ ̦Jjh'ƛnv@ #UmФJzA(@ ^>3y%|\ @ WPZ [MT>=@ /AC@ @`Z @  z!.[T\?<@ FPdA.'M(//{EZI nqw 29% //'5 )K^KKKuMmBB„ b/ʲҒ&m-mEE%+[:GA Թ [:>u+ @ B@PW [7QKA~@@wT7t~@UP݋ui\@6B}k/?mv'5.?:6-#Hv: aGt&{O B VOҭͮ?B?",`MembHƻRD %'! tQ@rnDh`6?Gx|{nt1%u*k ]]ר%vmFvDz~,(#\|'<^t+о`CwҜ"FUUfDx</ѾȴNMMMpKcC:byy.G$V;GTQߥ}?Eyx2CKbd~2rG} 9VB p<.õH3']<|捀3gvlojixr<; Iԁ`R+ ܺcmbNzY;l;1UTr[O4KڍV&@'q8?pT~?c௕},l%4C3l,b( a @czQ^jg=-}wݾuܹs_\xL6;::Q[A+h`+aa+fEJJZ6Z?  (NNN&X i+سg"ȗ##T;M0BH9\iEӰrWjv2T~ bN[4ǤX3!Q@+1(ol~Νۿ-,bh4ja+Wyz{{؍7ZrJZ0 ԳU|V@t*uó8t#[]]ztk^4ʟsp8|'=SX//k4עz.eQٵhJufiB[[}}~o\n}̪{5({KK_>A8xvyIP8| bllvrhޑI5\ y(Ś`K{J,˒eѢ,k/@'k~~~jjJa(Je0[)r&iQˍO%b&8fc/4C3f/͘P<@G~e;v 67#0u3ƥ˗''&fffj&cKNYI O%$X\7/.Ѽ;4w4C;5QfhsW ےOjɓoT"p# 9p5 lo'3Ziy`K @a۔1c/hLep.r\ĐƵ/*錖{FMx5 \v67>ќ0iV=,cˣo Bka%Ag4IdBE>.CyMWdOjY2n;+GbNMǚ7)ݪnujvlH T2뵢B.UhoՐjT%|92VJR>nRd0*H9UtG _~׺?lrRER+*́6꨽D6_EI BCExg2MXxښe5BPk>H$ooL$RZzt+J)||>Eh$O @rS35ҩT&չa[iE"ѕ?x"2&xPJ>0&r5|[x6u7h+ !>F=^,I s~Fi<f3śk$)ąIENDB`tora-2.1.3/src/help/images/oracle.png0000644000175000017500000015215611303312237017214 0ustar michaelmichaelPNG  IHDR_I*Q pHYs : :"tEXtDescriptionWindow Class: tora4GtEXtTitlePreferencesJB IDATx]wE39$ b\Px1O=O=ψ9bœ0q'w &v ?U=U{U~UtUV*-RiJSҔ4QIF=G^(ﭟXAtS^{Dg-mTT+i"+T{& 6cɚWz7,7#'”4KJ2// Ο6qF$81C1tJACXܪ /FJ)!>[ר0OB6U D "$[$ S:Ri۝u*CH9ׂskWa2x1q)MWY߽yfsg8WyISŶRT_m+v*ՄR:3Mt4Taűwju3R:Iӕ{F4}#1J] vk]5T `AQQZZ Y?T2LB,BH"c˲)B;9xySΙuB1;\1pl0:וjFJVAf\,<>(Q)h:x^SJmŶ E;%Մ0kJ"t"* Z:`Bqtɰذ{,?az ,5LW7ј&8H`){\⨜;QbY!x,VU]EkUS`UP<Ţኢ=WiVe &B #4&YT< ۮqJ)*YP ϔ]v C_ne#D ܹvWCCCvVVNn^qQQ6mrrrm/-}b _qC.x0Us%Q ePԑ.T$"j8g) U<i* YG̍IJJ)J%" *i@)=OSKwggTqC\Qi#[*s̶%S(sJѐđۑHd;vB]vy 9B_eE"ukLڴig۶I#˲"T&EEmڵx)Nyxta ˆS';#y;au|ʅmx '7g( ؾxeKٶM.((ڵk=۴iŌPG٦^ M %#Xa%֛Cj؃ՐJ tK&&[)oaއE)JY斱q5^ S+-גBMƃ"EpC7<W{o<Ӕu!Fc˳2.R46!+P !Fh\0ld0j} idhNN\4'%}ȴ!ԪH0n>>>فeY۶m]WOڳW6mV3!ڶm٫Mx\׈lYeY۷o[ˤu6x\ !F H{Jĉxx(Bs7WJph2(d۶"VTq\%xSf+у;CPW 1HGu*) JɃGOw8Qj.U 6. pQ#ӑÛ ]q0 1gɟbz>dhT裣h4 ^U`|Z۶m[RҬz *\knmA*CfY֚5,PsuuF?w֝,UfeYk׬^9yT,@0vjqfܹK"{ R"p,{憷m5ӍZ͵}՛7l1|٬YiTT,hxyib;в;z§O`"`cODr}4:8 q[bE8'TYvO8Sx#p౳)߆eQK"q0%L0Rp!'^0 ڌƒj2V,%܌xpAfA9 ,2;se{%H\s+rL< வM"O@j'cҹK)bT\\3ލ +Lϟ0#oժu"P@p 8ck׮]v]f͟4ꫯ> ۉ8ql޼#L-[6B*lK^ 9K/Wvfyk{ ޵kӦM{|CԡŸkjjڶm'$Ep/wLJC^:ډX#i߷'</۶I @D,,OLE|I @A DHQ-ވ,ȯG!Q LG勺 NE4NMw[vEv,i_$7Tnh6 Og^ak 4TĬYRt. hPy3[& B67` PkצMCuĉ'8D ۾m[qq18C.]xѲ׭[׮];ܣ(qsK@@az?NjC4&`M@ʲjjjqۦwޤI&Mx 7$ G]ڴmttQ`qng?n~@Zw,-.-B3Ywdff&l=@H}m]Nn4+33+="l;ؒ4_~f :,k?ذujFE]ƭ6G^vG~Փ{Z|Ny<Ԍy_8E(8찬,cֽv:w^yTPlgcYr]Uf`Eil󿟾@>}M`ռ{jFE]܎u_Z:k3W^xTٱ}[ƪD-c;綾^ضO۪qW;KN+ͬOZ~/yF|WMs}mpibfx5qD @bתu{W>nM[g?iD @v՚oOkN{x鯟ۖ}{8靳gxDFl7=uiitg7^tg}lǗ·?:E ^[MC\kGYwdx&2J wg߸N_䡔MP8[BH ?x(8]8/q@Ÿh4D %DxpEe)@,T&.pJfA5u4(߳t\ %Y3%Q^T&ĬFV@9z(A>Z0PҝEuJO?6 .Z_}}`Gm4/CR7)ϏFpFFs@̬_x1ʰ XNNNF(#H)Usn9l3/ HUULJJk~|g\'Ԫ*> ?pmՄD0% y]7,C]?}#e4]x5;`A?O iXh4c۹ C<8p5"C\;5⺣3b>88,bWP/$bl+E_㋏UwA(=!Dbe(-;q%2.@)]MES0-өCEhЁ# `m[׍0  ęRꎅS(KlvݑYO6pcVA좩iwub&w!80FʑS?B$ f":$l)rCp@@r<ڹ}󷎝: ךFeYI$ Bp9RJ~y}w\s駝.0&X4 | )L6l0DCg>O.7*k4;% #S7o^yyW_}5ũ{bP(#&GdztZŀn͚d]==-:wH'vo/:_3!MiqI !.+!]y4 yy^q!ýsF@NbMsz ϗ1rG0Ì qB  MmVR VF)!iY6^O}/|:b?,ySc.5 8 $P 2.0wᘳ{].b19eh g0 jjrn:/ɠ܏.FHywcBauAð̅0WEv dQ?F h1W/d+P$'+`\k]]( ^y"yŘkU6T4<쳏;ℝp(@ 0uVA /LrUW~鯼3>cSsd.?y~9d~|#`r.bmXaaaV\٧Opd7lhٲe~AA F5w΅(>hTGy/ ;bթO 0Pt  , N}JNG~XVػ ;#>^~ݲHn{")'%)=s5 -l3솻˲儋h "VX©9&2 N1֧02~OG+]"5~a :P mSLc9[C9[J4!= (:!{V.1X~ 41ڮ]BV3#3sIPHiD.\x "0!nr]\X(TҵkN<:L & h4KN^B;pB-remVfc8ml;4+-sk9c9> N^~8܀N"rGO{docaK7_ol޲:-B̬}7wyy҃u ߣgX4wKq>HpV :xdM--ʯ͒diW ;Gܟ1bM-# D p.zbp` ѸXuG rb\8ÜklhbuVD H) 5˓m! 6)ZGg,ېR9ϤAAŗ)X]"=e!p-n޼+/y$`>sx#gCPff`g%&"eBPVVgRQ0q奔 IDAT`&246f7U@4vܼA.dNeQ2O yH"<7ew $;lRi ڕ~H/pL!-PSi"zSVhGxgɒʒDᕨ acS5r}MlDdOC5%+؝B-ǢbPFFNNmFnhb瀌223sss}Hyp]4>yy^LѨ=gE2,Naҧ%qYtZ؆wV 4~>grˆ FH$_P_P@bdF  KafBRbe<3:bCI*N4fx 3-©oF~ŁS<=@MtWsQYXP9nkq'Aw0ˏ GdSYEw_:zQ*:U >m {3XU+4+@ 9:R\&,1K/c sa)rna D8ICXy4YYYܵH8HRVvH,910!I(!$Dь,ɇa+<Èhtl@u# DѬLW#X,V__D 5JM#ZP0RDlHwON3UP&<C]MFJpQGu ,AK7/@#syG>2"8N192~ҕP7. p4VRT塡uNO&|P5, yGs(uoZ;3DO1e+SiT.1w$-a 3 ;"p4q#Qp⹮$Di8f4 hą;/T킧\Nr4 c1fHʷ_4w$Paݖ v, ғ/@&qwk-< %1/?!򇣣ՑS`'###Yzs2 q*L IS-ӈj5unv(!$ŠN+@*'̌ W(r %< h% +jJih.M%<"&D\YEbe9^@d,z+,L i*BW^Ldd$MiO,u\΃[D>ĹH&3;c=|ɽ* aܚ{e|J43 !J)eiπ2ġr5e/O$J5ig )^!"XśX+6פq+ˍ ɿWbWP>Q͈ ej5㘚pQճu%\()axBUg{L<ĕ#5gb" &nF\RrO + bI< R;AX7b!Q7\ Awf& ÒC(.[j_+rgBTHiޫ՘f4k:i1ޝ*.6*l(ET4ʳWH;Gh!~&WZ:;DygS)^5EXɟ:_eA1{&¾*ȍN`x8I޸9QtbД3 ,-/D| l(8+BZV(ADa"" f$D OF&nCQ:Kd }@8I )׆Z&%~7\d7#TT…>`*ry^Jt񑗇8p->pP@[D3l8 Gzy8( h;3NW $!O5]5J7FF{KEyUGh4ȗ,@H~BBo+eْ4@zx9|:6.]JēP]phY!sy!"Dio־>(*n+(Px&;1Dq.kiudn7&|HѰ0ɾFJ^ܛذiJ@qa~1pnf(gQaz uGɁԄ$o": %lSd TD dU)dG7!$z 8 کvʲiBcPaVTt! ĻJre/(^W%5wM]< C? \"YEymK~cTG4+P6+b FDJII s!ܐ )W/[L,Nn"D.lgfmUeQ?[Eu0b|7}S]jX5-y*䡆Ԯ)ġkk4?1184^ (S R A.aPʂ4?zن_D1">שE9>0ZX,|2T#j5Lu"))O/aRD{w^i+U* d9r5YM"M/A,N]@ȝwPo\+c¶R\PPm ]Xˊ߭)QbMP,(%xLC慅jBpjz4  }AY)¤ߢQA;b.רv_%w4%w\VۋٛD+r M,RIfg T*5r'A}yx|@Bcçf彉2#z'B\Q)ٔ,*a@@dD>8{pR>%TأIjR%, 10 @T5|`=IEv4㨘u!-QIj:#M#" HVQ)#ȩfD|plB,DRhE5Z?5pAե@t+_W)[\ h~uJGB)@Ȫ̝S_TCq0mȧEx'L~HV~R|V;9ϱ}uMw N:zR-EDV/> \21ah|:ʼnJ% qorBaw 8TC39{KD"OTDe 'ɲ.j4:~ `Q!84iI_TI)&,?t7L g3d4B+7OsM ")YI)7RVDxF7.YL!+pB1ҡSqwDTNaQrᐼwM5\N:uԩہCOny &X|Qv^=${ Gi V֌@,e /9Rx8;Aq"r (E{!)M~hO#CIXC^yuS; ׬9c\pHKI%sI"vqBk{fLw[B,SЈXlaIEG9Gcb?9g<߼?7hr*X:!`*)l[>ȏWkX بor{jI/%K\勑xr٥IY9_A CBSZSgrnG<@ YyR(խ >6J){fwkRvr_J9_xd0DDK^~t;;7WH{`e_xPlD;7oq (a=u^au*z}ui=?mͳNݾcfmwr'<24߱sSaH|1p{ 8SoP3kN:wة{g?S}( rda.J>D͟ ʘÙN+LJ= tR 1J.Q;?ߍF x?(U{cJ)*#0yi?ګ(Lx1=R4& pӺLpwBtd63}ځȬt B JYivBwƟK̪6c4K>䢩֥Rt}}٩꟞X^j6yUO9)OwK$:;e`c*N\9MI-eذp]u\|c__~)s-_~Ϡ]^1ec_zڏި @FzvG]Igj$cwuðH DUyYaIXP09o&{$L@ϯ"h(L3)-S*ܒNٴnSC IDAT3*ϼ#ckWzd5YYPqbVWh9GײN:fx/8:7~´_V:ͼWF!kߐn]:u\{7y$*gZ@9)kW"= ͺ-G<ىwo8OCG\9۪{H됑/O79p*ة6 ?vdS *zx?G/7TJ% C ')g6 g :C8SwOw#1u J u (⾈4;{(h$.^R.45vK&|h_?CF*Gl-Q+VVXYr_:$,&()V/o_^zoOKyv?4#"ngP|n&,-*{+QRۖS-dsE :Z5*’/Uӌᑂ^\%My )3 MQoTYL c^(jXa0F8b Z)/:2.ÖzœM$| Ahc[L7#t~mz_8SX]gNxCԳ=1kk]qU#[eUrC>p{væ_~*;}YU @:'d~ʰ>}b>r(%}cr 5֖;h)!ϐ{Iu?K= (0cPƌ\Ħ%5J諑)<+=X3%ԥe{l-ĩ7vW,~_#>eWz\6NOo 8koeS=dt;'n/ۏH-nD:_ո///o {1wwί'jxeo}>HM&ozY|{T,yt{!ީNGJ+ >LʧU}$EVٺug)M[ncǎ=՝{9 WYv<~~neZFWM>KUojQ۶}걵/9krDä)0yn,5ut>Fum Ycv^>M)R.w.xKF +4#N8?YQgS*AsFzr$2.i=/-VO>K0Ո^te/sk2%Q(+t7612ء}[hپCwsz'Y֡[ߣϽC0GoѾCN:=§qG%~Z:ovRmsvԠ:tcWDW<2ߙvwd{K'{q?];;~eC253,۵w75Iti)$cW-WnW{w|7?{r{jC=wT'dѿP\N|21PR:KMFɐT\DcmC@P0ͅkWYkWYz[ w|;^z ?kвNGVE˚U?M=_X]"nw c}ȋ>?w򬥫W񽻇%fgxkWYzիy}`Ar>0~{mt^>:dj f}ߧѺ4iC7э(k5$9n.݇]rW_q@ mS!^-}?]2Z4~^01|hp+Zpc4daC9϶(W*F}|)#nx!j}8|`qR?ӏ)X~IN(PJol?3ne<}M׻/{r۷=`ᣟ\O9zSn9uؠ?.J!ur G*>GG}G5OMaӢn=lPK&\~w̦qOa12it]3n{ծҧ{>VE׾֞~~/O)$U/IQevx_KcoC#ߺ[6rʻQ,w1%զ&LY?SwT# $^ۯ2Nֱ=>l;ӿw5$(7$hO;~1sx֬Ϟ} ,i mW'=ɬ9yӻ ί+޼)I]e P1o|1{==rPoqMo3'~>wn3'/;v&Ϙȓg.*+=t̹sgsU wNϧlSh7wnce5ߏ2qϝk}1QzMqJίzJɏ}<{'F*)vKea $;kzՑWS?Lܣ[YZCɂw̚VC[e@xūovF.Z7}bO9{hݼ)ߏOtݴOkØ޼"Y ?}%u $ŗ~>)q̔ rҞ {h 'Ccݰͫ)Kv} ٝ\T5[;cEW%7vGس?\~->!PЩw<6b_^w{-nmtǗe[Ͼ]ÛKseYVp`?!6.wj`vEGxzj<ԾNG .nK`]$30kS|ޘr \L2ƌ>$yy"`W8‹T>ܞ=}}`.F&;$`z|mSy~%k };uu fW֩CZ2!SwfFnrJo'yrLnjt.9ኰTc ܆'[ {Ѫc(c_qDj3?Z 4vV;f=t B{M'oۈ޳uߖoxd_|cvq{J)~be̦ADu`0$DUU=t>4lx]$[~*? |e;oL Y_]r"k␨[Wkt/ B(̒.5aʓMlfUA"[aV0%@ݿґC6ubPV`n(#HܶcV^(/////vrB( /Z 4&ZignKk]ݐց!oTrZ2%@k~hfAF6_;=#rע!oXʹ {/g3j3&͡N2O_EEzZVc6seCF Xm]wYѝ+2:( ?RL8L5Ml=՜SǴ k=_g}h_xoFFIѱi*4>(dklN(?Ɨgnr?Zym3jVn1^xgR#ѫgz!: x?-k_̲siow_&gLmG;}rrl+|w .?tcgX ,h{BF_n~Uq;kM[ZVA1T֥sZbxfϪ6A5k~YQo'Z#'~ಇgP ^W? ۄlݶ?W5$b2a' 삣{`Y5s#1rb Q;W3ߛJ. 5 M0B'E@Dx#k?WŁ=q3]wAroG_acVnֱg_Y_ǽv?uiyi]E;cvúyoҟOٰyouǛ/4HYM-2tói/nGk+wBG,ݯ@Q)2ZǽIV7>޾i~фƑ 󱱙ou#N*m4;އ =~Cv4^}e^69[GqtfS"/]x~7<~ql۽uzLM4&\؁:_wj.rVMSwҍGviقQGxHdEŇ}wx~y;=ϭZ5fڛ`a?>Ou?R̔ʋ"tHrmgCw^j]Q'w8Nbӗld +c!Wt#N?i7|p⑏:gZ\P~~Ôoqm߿t=շs0zq$INϏ}L}'@xSZ1$M1RT<@Uu~ 74be˖X_&wX%? ۱m_O+݊~okJŭ7-QJYWcmwr[9u)MOdkA0fڻ=ٜg=yWr\k6~OzY>f?zP& tnI=dfo}oH@ 1fʈc^?9C:sS<,kI;>|^_\kYʻ;iP$)(,,--*[m[nݵ+#"nc펰?햻I:)M{233kwbyyy@C<%h$Q4:鵎iJޤP(d'5տ i#S0BX(={K4)MiQ}jҔ4)M{BayҔ4)M*5 V!˭*!r%Kx.nءSN6{Ǚ 4)Mi=qWNoyg`\?yG7D^[~=/ݣ@l"eey!펿fgGjK WVP|sW8/d\|Y hQͶi+==:BӔ4)MYtϼ0(^r֤k;X@cu;_9 Q pE;9qL,se(~CdҔ4I& MyZj֩;,+תǠnxg@;|?Yoĸamցf ]_rG =U"ܸk& ٭ y0豇M٭DŽbax8ws3~4!D-?@q{v6l|vqޛsxts1pf˼G&*TRβVH_:sAv>M>ѽ]{L+o -gFHTƷ%üL;]hfX͝zVݢVxSsxi=c,HXKG :H2EVTUdSUѲ7{GsCഛ 5w;TqsycѲ.LeݙJ2 :(FEG^ypNVV-{WY IDATYXވD{!&?#=xI>! XN9}2R}3c}WAsTͣ8,7AZ3lJ7\yaĽcɷ˜K&+U;? +lK?>öGXaLm?8䩇0p;oܡn;< {b +w1Xkvyp܉SY<Y9f G4xrc-QH~ԩh=m8I)7S?,.]luXB.鿞j ɏ>7z m7jnQ5Mhf\1{[qv) "d5flW#EHVc%Pݻ!NҿwNm6 &ab9}>|t [UPFVAMgÝm„aŽܰ1mԖ!垣D"OHk%E0(K7N3zԀC'bgmt$:^){&dó=.1GEhVڑ4ӶLC^-yj)7:%xM{W -bo^_ $CPDB+kǺc駱9U$E)EF%X?4iB#;J-2d1FKך,J4tSj+U` TCGZ1l[ ;jUC"尮C_ mYMwջ_ L 3."stmTe|#%PH8=SIG^FјK_0c:wշz/Qh<;[o8lXLJKo3,88)尊C  ʛ(S&vK5"q% *0Hat>9%)9%Nqpz]~r3xMWh%[WUBBe6U TpvfE2>I;6u3Nw2#tq_x*W ?gUYky, @?$!)KxiEfFidaJaC_".Hysv㢛A33fl܃q$ _Aϖ/h$N3v$ԡG)DܞR/MD;˂nks`XoGG_"Tkz8|h)'*} mSv.h9ƻw"G<}p:R]Ѝ;?wP Xс7l%0tQO08Ҏ}8>lP#S”"'0oLw'{:;;wsS&ؒr%ܝMv3%}v =<4"0ZǮcкOͻz]'pw/([Ƶ}uwgOc-MUDQkg96l(8=wCTy*6zߕ thOSPS_GsKKK#3]pʼde[f̪w(dQq8xv{[v£,)%Аsz23i=x~Re&%Qu0 }WMBN;^\ ~4˨O5K1]t慏ﱾKA7M0/?׻ gyv1aW[)>5(<)=Ge ) (Xgĵ"g v8¿X"(&&NQ} h:fW3˘wb~-_yp{VtЖԢP(!HAAT/:5C4ldW\𥳐xT,b]_;nǸs9E<R!|PHq88RH$O$bL<ƕ 9D1z?߉Yie8TvS WS{Uc EKSz?'ZsT*zG;5BCD"Lf.@*Gܹ]Krrr"ᴴP(v- yz@ NN-?}+nZv-><6noF÷liv} յ-ҐwrD"b,}RbaSֶEQcPE]*GYSK>b %D"ǃ_R9JcRcaퟜ3 r.@>Ǯ.OKk1@iYZ@ Rs "#R9#{1]>SMi2MpLRd1i%X>yc F=imB@ƜxOlNQ6_\@ OVtHpzzEJ+( sRZ @L9ǧB]j")YŒzx/g՝pe>>7T?GVq  r yZTmߚT,rz=!aof gvF|h:@n]~| dY0͊ߟ?pd@*MuzG S[P.}"tS$!UP;1Ϸnd"VBә(?:,ؠ pfv; AIAI 6ÔҲ{.YU a<`0((J&l F rX #/XJiٌ6_\-~w-Y R41"ŧL @ IffumK}!???1)ҒFUWktP(PH ` Nd2 4l22LLL(J]R_r4-==cY'Lhs7GG}-OT@Ц @ L622umHwH(??GetQNNN [E#G>p0gL :V׶Qꩉ>?%Mi M^y34$ ƿk2855ȑ#߾000(B0jޑ@ Y@!c~#2}(K t9|mg+]t+5gfz;H L8m5ݵ:1-vr읷ͺO4EaqɓtttSL>s?2\;C?h7ܾ&ƌGdfIY_tO,I)8.b42cڭ8_"lڸmذֶ`MRK; Y;SV@A2}r% MFGvSCg¦iB(”>~PYwC ذ>3 (ذ/_>»kYG3.޳ß D9c΋.R_Hskwwq=vLj{Mtr>^ܟWqwڣy'o'q9dƮtM}4Xbw/PXwWj"]2eG d~Ya]9zLn>I(JwPIYm]>bd/~E+8/EqsycѲ.̒gy^ZDS Ll KKu6lu~:l ;( 2۟rX 3 s3 3#Ffff-BoA4Տ|,3#.d;r.&}Wolȑ:7W|a^/ǚir/bA ]howϽ~ 9mKIr^|F/|mU@aL-;}.>~~|`@Gm@re}w<<-l~}w>}tvGi@yK˧hI m͝}s,>(K8Ǘth|T²**dy`~׸8$Ѫ) JGN?n&GCkJֳLViDwh6m۷- |sJRrJlB;#_SS>_TS3!uft跜׋ڍҹ %4<ܝy@0jɃsffcyDZ@vv q)w}m8 Nۢ5NrخF,NjwbR&O84.M"zm.zx+UQYe,/'νh=$?t4o*Gik3f_i:,FM$cmGi]vT*۲36lܕ!.Av䆍i 1.E pZ:xITQ~'6px77777^ne2t3hˊu( 2FQYUm# U}6!Z!pEt㬈rX""١87JllllLlĘ?cbbjǀG5]&`eead~M,s )Iǖ>?0Ի[t'knH]ceeIk_TINĦQm7V3bV4|85b@{#;vfV|T$ͯ+Ŕ82RiecbkW/\!tń d xDs*^MqK3cUYj;]9k;m"W}tNГ{EE1'#nCDѬ\CQTV puWm"|$1.kH>5-zQHͭ$g%P0} ibPP ÇŮwDr_b0m ; ب۴ M+M/#i^jlܯ" a٪NÜ7nt׾}ʠDi>,fφv6[[#r*3g8cRoF刅^dWe4B *|/hTVH4149sa2ǤFaY9HZX:RFm;yr%`یi{G&2*M~Rhd>"f8V!U(*-HmArݻgO#>8`.v$@k:{gٯaZiͦ40a`ׯ]\tQ&M1(G5 qabٌ)}|bHM)/"% }NrxAHͽWlX m3p^Mw6 |禷-t#tftz4nbDxQ8*Ҧ\mmlX˜ˬT+|qkL6-; [5ъ0ڰז]{n{ hCUR\Q]&]:թ,a̎-9KfE]Klr&-jth˗+mMRmfnN*,-H 8QG_PVhp-3 {} bgcl6˖-MMK ޷OGGj̴{pj͢T&u[N.(d.yh[UנA&]昅F(NI> rNjK%yPacC.DljVK>~&NHZ->+OB"=׭2V _`~ɇƦMn۾CKtC$P)*Qc>EHgU(q7ܿ:^\3ܒ4t'sߊ-D1x FjF6'^3OB"6nܦM[ vmظk,fsuw>`Efm|7Y@V^:[ = a@ HC[QM0憇+ .ԑY$BE,&NLZkC HU(lllj-hCѨ# B6p8ZĚ2A ȿ@`BN $b1L%x!@ E"annM6D5GV!)ӹ7JӅ {<;Ϡ0T$@ ОF?cWq+jV؛3r$yqTw:lym.} @ H{GaʥSY+Vk ~]@tM;$D]Na+j،fMWXҷS()dI-[:A6VV{;TEHۙ:[Z5q=O\X=zngx(X@ |֙ .a<8C 7L9˜wg[.&KK:^ok◔g+JEb\َKqMƸK/-~c=4|;U:<3j7wԩwYo-'?zw^w^=6_aUiȼ#t{Nzd~CC@r_hڒ6d,۔tp(OW*H݌quT۞y/2q/f,}vʃ4^l#/sky7pfK<&S ` ]\x\tҠB4uJ/5Q >'cZP)wZOtը$ E qz٢{2(*jT| e:+% bs,s])MVTJiS#TBJ @ `0%V*p <3JHNt}9;Q޷2;ղRf@?W^G< x4feG}+RȍɒxCP IDATZȲ"3xaC҅ef[|g@x?G%uxq]gQNdHJ_&A S}A$Y?_t1,V}o87}\qaC&bW۵K]ũ"`zY}aBJʮ۰bb<@1j}Զv=GRFv&_[Do>pI%p<`0((Dd(,TD$F p8Fr Z#gD˞5o[A> rGo#^W?AaaabRv]ROOOQj3bHddl Pwyy~"wʿ9>RdeٙP(&Kri4ZZZZ(H-[H\n4:^hi !H5C&t##T&,qzz: UjtTDy?az(𾳢 ڎ27zn`h^&P(&: @__(' 9&TSrE YY U P!;B J>>{'W(]:{חP$m6W?L%]twuquuqqV׈jmaG.ҭmSE槣ENliefae5]Օ @D(hCwxZ5tH'.h iiz\)wh^Ν1H~o$[?:*D홺>maO<<)qߴw2v{nEG.ni iD,~֋/''q`گ\@Qq|hneH@5UH&?[ jDCrh<Hr_Xh]Ozv^n'n..N}( κʆx$N.{̠0 %gҕ+q8ZV\~sxPoW7o9{/W=j{d0im^i<Fygmո͈Uk:LJR(DZzwc~ɫ[rͳ'弛sxN]S‹u`ow77Hࣕ;rM ʏ\m @Q`v <?CzkAM.0v0"SR}:GjQ][Cl'V>pgFȧ$gVWU kBnf,? ʥ8h+V\z q/\ Ό|dsTDOyy֯nȑɀun>%ם :_j쇫V\{уE?.8ƒ n_sp J 1Uk2'ᱴiTGYmVErCw)6Š猡h!PaƇ; ﲲv[NtX4Bݞ[aM&)޵ lGUꨒ嚞n`%&v03u|ٮ3S,@S`f"]vhMz)VY.b{g- w~yY_U k;2_l TAŒf~:='vKuD%64̝E@0rqҹ3Y3ɑdi2Ž;j Gk;jSѣ۩ۃd76lٽ+![v%w3wz[ QX[8zxݶ#f$ (Fd87W u2F*oWjwgOp&='wC^ܒ߯QUPfb׽G"d0$&Avqt<648V=jxI%R:31ġZIfWVD5Y۰vUE7+nlxTϖM^QIAxd@K-PD.$,b|C %D"Ctk/%VBoRQU ^a1n+vlU:_4ŷWw/1x.Z?Lؒpӊ0&tiO kMpK08(pӊZu,ho$T-00Jjkp[bQO iqz=z$"z`f_JUf](͉ g,^&Oq**X5m,I|Q O!-/C󎣪`P:(*AK"ZkxaT$)/욬mX;{G +ucTFqEr/G~;.۵>嘽 N>7pU!"D"ſ8..)ۋ3 ]uگޤj)ĻgPl3’u8 cJ,PPTŧ>|t'׈ kEF払ԉbT @$M&*ooل$pJ2'J{aԖX ppɼ"S\ up5$Օ7_Ne*)P١h-lBc8<Ç>|I--ȕ=M+,X^(*F0X -숙ῤiU[zAǒ(;._T"̍i)TH%6_XV"38AX)G5ڍ<͈XX @4woS!咍D"18*Z媪ޤ9XFŁ{l5)+u" &JkXfAH bvUhZ ȓT"xa(" K}, ~H*pnÚHS1Ts6ZvY%vbrztܐ0Gώyle*"HrmckoK:Y5썽B0-lfS\ p՗wQ-qClsC/G+kR۰.dJOæ[8*-H1^HdZҔ(m5}Bů^%Rs7]&XA$gs`>-vqSes%`ڴ} fվ4M;j$k`nr縠-)Nk9@k&8+{3D )=j\W^w>Ozy+\vFݻ;w6dOk{p./rsM}`Y}]]]]ݼ~rqI9-3%*y+hocvxt-G|נ遷ˋʨ=e>Z(u~afv.s[-= :8>pG [A5]>*nHҽü\AMf~9eYh:4aEG/yOP<1f806BĦ&鲜mV]U8pVJ[T{m6yzM>sT|=5N bbbZgbqBB;B HO`,Jby<^S)Ji7ɍX3vytѝL\CI6#y~+{) ܀MlV]D-Œo8 ~:#WylTQE$ iLnhp8"qx+ CW.-AIj~hVr)7=g{5nThq֧f/R%~=>w\@Եug=^ѕћTXU=cN*~,H8Qo\˗]'mbW_ڏ*ŰXVP(/>R(THO ~h;Nb,~lcdJ=V-F9ſMvAoݟ oa\,Tf92%@5ؤi-$2R岋HCQzV ouiV?hgQWN8OinL%ONyDQaN$ձ&c ]&&/V#L@ t>WFLJȒeT$$KJQV$ٜYxCɦCdzGtEeQTrIUbTS\Xn],WgRa9*)!R/vT͂u&?Zִ2.Ob8 plY5+uQW?!Y$μͯD\jX24VYy94K:3_ԅArb9bU 3 @ zGBT&v{u[0!*5VaNѠ{f,58lbtr,ȿ 0)1Kc( -/$BoE%H? @ p8OqR}G[ @q=I7yUjG}л:V2 @]GskΡkW$܍JY^Z׆@ SRږK~~~zzF*bX$Tݼ4êĒ ꉾ#R@iw_vj-NywE$}yvH-kgggbbBPږ ˥hijD"rZK$b.Huf:ЬYttJUթs(d}xol@|$/2pqY\1eߥǗHYHdc&t:(''GmBSS3Xfd $=-:_G'{7#8>6!9-v#Ώa}Grbd9хJ(mhkk^&P(&: @(' 9DzZ5';*v*Frb[7WbͯK`w:7۵RQDBB{Z55mjK*s+ErZYY6243707h1GIfy-: Xx6*6(qkA|P$BTVC|w9FE. q)+UHC.(tw+Z]it?80֑Df[ܻosz^Dw~]ny|s @1]ú$EuJaT̅\[V0xQ|0h[':Ai///06n5XUeZ?#8ז҈.`;Q<ޭ[OBأmС=Ą>Xc@9LrUlr"@vp2aAu[يN AlF%vJQ ![ pd:k̮xT~ժAeH3Opiu'ZOPGop;M ы^`쳸R*DQZ'p'+k sV#NO5H騭,gpB=*RYhG.`U;Q<߭8-NJIp4ഛ-#T,Ĵ--[Yp>/=ÊE=ʅ&_ֵSrD-kCG3mkPG]LTRL rWuӢNiж7RaHZT$U*eҮE7 V}y neJ~_G4m:j-80ф!{uTnٗu}a}<=N- ੺Di,x2 oկZ5jWRω9gڝL~Nt( \TB\Ϸ/~|9xĎzX@45H9qbO\X:*d:J`'%'E޵_Ƒd9X aӭv{k;jqޜ].lw" w+NeRNpSA[5CNc8ueɏ븸]W *+Y(X(DZwc]>4 NH_-zMlLQ#=T0R׫#3v}фQ_e_z9MZQ^E(Ry~`wqI^Y[HATȎZf~.\Ŝ d' &2ܧ[B[->yAحCF/ (4F^ =\PP4o̡e} g iYc% j`L:%MCx?^=~3D/`U;BFݭƭs5ng6M~C ;4wђC~&j 7d-K0:e]›@Ȣ2G Þ#OokyW< +F2O.hݺ |T)G͜ŀHC5q\'uZU$X#i^jlܯ" a٪NRݷuW-kugosG' 1;(ko2< IDATDϽE{dNwv#t/v#ǵP,_ݑȣߚ@ N`^g dҖ@8\+o2x65lt.9bL> شة;oX7G$w.l8p4ίLPB$Y?_T\'*d%Y7hiN4IݼܤJ95Ɇ6wmӶM7[VtGVac[fiweEO\Ȣ7Dzjx7y(BN;^\„O?ww{a .sB#٤r*G>|:uv|\wt Xdqodh;u*OW/\U@)Gjp8ů b 5_ð  eYrTÊ_g H dּ񠩞-!2G@RQ$CzYg.8 ˑ_v#*d!)CuzGe/jD@iX~G67D/>N(<͈XXR"@ eY9Rb>ZdpE!hopFPΗN쨇DS_WRDȴD?Nױi+B @.X[X[9M/Z@ 2s^΋L!qN?Vp <3*LOLBDvܦ۴ۯ `!pfLfM@w&(GyrE >vS[CФ<{^j$IT*%l ɤַZ* >O3y6M;e'ݭb#)rc+j:<*8vfff!$1 K&A1 t qa݀ܥ|D-OAroB _7Pe<fcMW*PײJر L&F?xqiˠaO:2(]P#RPEbJKpGxYppoӍ˘SRI$R-qH ^,/hּŠ O}r83u(/J%K)[ZX&%>4{$" 2 ?8p%rߤ.;-4;--*D\.S(IՏIWP]ϩOBJeAѤ"+KKRA"ʤ+,-- De,V+ea3:m( : Dq;#Gl%lS%*Q@ˤH;(^ nѬIc^^^^AJlu}N}p" ^^tRWUe_oW)'E"Y(>㸈=>wP_W@ !N:2bXHz>{}ln)#+۳{q ~&2}度.eQ];uֽ[^',;P*ܷ=;ᾈ,V6xOŤ !:{ky֝Yu^lt=d׎HA nqOlÄ7v .Su(gꌴ9 }ٳѹli3)'?f vS_y)-:aBB'D/DzCc.}tQ%l8?`ف.2'mӴ%3) S1/Yg婷:nR~z읠9`bhOgⷷ_2\CtTDwqG~AFQ9_^yb!fLh!~{9ݰ[ _Y8I>=xd6~~Ey!!I"Rj[y k9*|xܦYy\aejf807ONL-iƎzHrM*ɖ/[**ȷL|P^?RsR9k30- Yq˜B{iOva ѹ6w6#ϭ;aEDWw!Y \&u׶$a.lҹqȸt&I}\1AyO ω:=4w1OPk|VN-ҝڑ:-A9TrGNx^|L͐ K#*ѓ}zz}̱ܫm t4e B$B,+߸wlGꅗZ,fv獇wr*u Gj]p\-9hͥ;w/njdYR`Xz"Hro߽I7 #ήb;GI*T}Fvd06z.z׹^*>(xz%ײ0~-㫙 U+^%_YD|ݺ S. mP]J]UFGu~;_<85~b"?nIcɯR_u K1x41W_J<(:kjMe0l"$ϖM+8&vgbtq仙}u˰ 官 =T[;;.UwD|/,8ɟiq9A6m~y!+.<ں)xٶ6)]Bc^ZШ!-i,,E;M1mΏ^4)Rˁ_ۭzn <@2086TE J!#^.~tE5_p~B"IiџG9I* Qb jk &Ll,F\3rHz)R7bo$%><}u\W^!}[ !eคu6u(!ʉLa!Ĵ8y`;fN=H l]ȹA#yvq_8{odŶ䒒wR_SIlRԾhע)ӿfqXtocYuizb_/<ۂ*Pёiؚpꩃ;q4RLUd~/L55[y{քg49c׍Z[oԑBc<(D8>bn%c0*¦49нMvAh QF7fhlV%D$Š@tc{Y?Eb:Ԯ֖DS&Ls}NgAmQsQ2I=W!yNc|ZNJXqs$IvqHT{;}R\Cߞ)|幌o[*.ܲOws|T )vicdsd+ eسQߑgM[ئrXНlt"HUXva㊪̲?:bֆ9z;-D|G^w(Toʻ>UvʽiM "VC94eIKۛmDN܎DˈȰ\:˪}S JTJ7mq)I>8pKy%`&7n8<'!|rjDR"'Mޘ .[@YF2i]&BPݷ.G^+EGSs SU~Y6ݸiӰQ^,˶󗛢OgBG!<΅dw$,ʽȕB7O^YXb\}і^Tg>8_}BQRP*p[[C vwQۻOKK7 y*KUtPw9/D{sů .ICQ`TfҬEcFҸ8MD43ƶD;".ط-3,ʐ,FmfŌA}~F3 ^9/3{/ː!u㶃~@2z ;9=weC$00m2{pkHDj_&"4v}Ne/%|ϐk&I姫:jH;j773>ޝJh谑tĢ[,Ӻ`ha`?Rs`ެ̥!6 D08ij\XN~=_b@~S7.9eVgr$hjԪ0~]4M gdNXFg1mih^tΤ]Cq=bacF˦xao]CTB.$sƽ˟-<ZUPijbB*M~6FGԿO=){ujE \CPsf8igSecKoJLpT!Y۱27r:EJ(nn]|oKPC"PA1itzJ &ē/CF}yʖ`H r}' !6t嚱9 sw-?ֆPJZZv8ע1xAvE5~1nOɻ6cQ6_Qoz1y~O4&vژVb{^R˸3mf΢f2[YNSB>B}(wvr!}Uy fa 0.ܜ۪ &ST(Nx,Ak-u j߳(OODLܜ"+mlk-YՁ<2*l[:TM,pfTJ]p<\ Bub0YIῗ/;88XZZmJ"g}rqu){/SR?N0wttre J)~fC7m:iAӥH` @AӅBa~~s0& Nfmmm1-1Q\ܭ,mlT)52 }GO5 LCyCF=h4@d2LMe2Y3lf< RO ^a 0f˽0U(:xЉ!@gp&!cGi5ڞ߱ZU8#dV;V.7$c|amS~݋C20!hҦ]Yyk:ʮ~YbH3NFQ iܨ~j"dφn^nn>}V;-)k WUFGE`kVx'9KN}8z+/gbuFahbo͝.:JG+Yp'4mf9$OR ,@Ot`,+SgT _?{/g|JdU;үBt#BH%͐j^^+enR<ȕϤV@CU;j-{cVCLS_7,`\RƘJJ&wD!鋭OH evKb}PUet1D!ޮ~ֿ_2]m=|oTE>0d~G{;{;'Y ŗjy;prmkQF:BqLֲi഻~#QUY}YQMz&EB)6QI4_gNSpq.M~GB.B$r ԭ.ko xMwra4B(Wx:ZINqot)@myft-1( #PZQt$Ix+R7to=ꮨF Ֆ߱hkme5JF봘;$ڭ*QwOwǔ&~^{T?UA؋J=(!Hv/ƁZ;"D&ӿuF!3?%Yl{ׯuv{N/h^H y8UYʞY+-EHݾE7wv [u;(6oBx lf;qN@}Tό%#Ky`x֚??*H{/N nm7nIDATq(~ 2qՁi=v?t{mvCnlVK#Bcpi 0cOTBFB3лr47 wnwc<T2"úxK6p:!jYݴr" + !yvrAuߏ TG~GYVrI!xt5&M閝&8^v_0d !=5cڄ{~ش\Pf\q#@-W-=~s BzZ=W2F9_}5^݊zYrm֍a+{zzDȡU\Q~G1!DRx]N;d~lxLW5pFʅaB(/uWሔqQ, 諞gZبgIpw"x5]%Q_^ӵ`ppf(M3vlɫ4xdaVgɨ)_)4y5ny6d;xG\봔gƵ2ȋI\e3lfRnȉ”i5P @_B;ڐ΍:x*SuBgo7'&mp!-[&h{aMHәaQk8n#CiN"TWl];sMֲ:YbԓS:2úW//jwۉi%>?v'<%5bF._NJyq'N?ҝa%9 wc1R;wEۯmuHk*X%S0X#2"21βjTu,)e׻k33&~tfX,+dI,>coo|}b$o!/VRUTJ&`HՒ߱8MD3ifoɕ'y3k$%O-~ӅLI*$FJBgE7׺lTބ)cuiYUdrJdq&yL*wO5yIy6UY?ǵ2X˰)[a25ejJW {Z+F7xIlHպ:bԒS ՒߑcQe?S"fm6)̺u-^._˛T DP_ΰWHi1хU2\ՑߑamV_VT{RLn6Zۀf.fnb/Űd>F՞T{Er@b,Am }ubj u~ǎ/#v&cͰX+TLXk3,ڊ:vdͰXk+XtkmTgV 9\CTN*=VL2ǎ#_pSBʽ|`{յ3Pc>^3MvUI! 05]3*2"yW QǞDG4@i :AtJ(#IRR)*M1L:aX5vN߽zNnh**qq9B$I j_PnN7 0KEkg [ _}T2*J"WDRX%@ h+x\.n TzZU$:bGgKe 7(9ÛZpվQ[@HDAR* Էx5P喖I o;-@ Me \P* $IWP]Qŗ@ q\F[WZO3Q[Zק-5AwW~[GeA%V$B$YH;(^AOB:|?R&DYCj|wlo)򈊶pLz-uǵOۻ۪֜O6G[jݭȎ9g;_oo.aמz.Q QpP':(b/?)HU'*%Kҍ}h;6:GUm2Qpoըmgc?=]zdc-o)u[+GJhftyƇ._Y=*sY/9I"$ ]<{?V"ŋ(R7 ?ܰ>-; _|2MFySMjgQE&3?z̚=Rd{\NeuB<OG?t8QRۨT{\$s|9sBe&|՚Eħ%)sznnSHsUMd1wO3&B4y?0vܹwࡋN?[go2 D$I?3whg_ Qy:3UTnZ)}ȽVMoMS?! %tWMޔ,vYu'yڑSn#5kYxM]esՋwrT$B龛.#qj|ykGɊCLt0杢hKI?go}kP7vx^|L͐ K_8~ݳ^R!=?翛XqS>hwvͨ&\Z2UXe;RM o寙ܔ*C${;|7F603RR5ױS{1Y@VOQ[iDO?/7ag/&CYVS!D 1{o~TDw!C\X5zNǵN*; s?dpw%HTm^gY?{fWz݄ٲi_|Ŵҡ ƴ0ݕ?j }M.MngI"Gfz hիF]'&}z$_w4eְx!\27~?kfU$B & ,F\3FVZ-*äW ="[Hm;{;;\>('I bY4!Dx+fĸD_S:Dzd%^΃Jpus&W;ˢT~.B"I޹C/ĺZZ+eիYbͬm{={b9 \SaFy8"Y5I3|Yh\ H[1+pMYCwv $doZ;P"'Mޘ fofjLܝgTBtSeTf(;"HDfbs_f^!Cmہ/"h>^J!7~׈M\ܣc$^?;[p4Dn[?9IkS+utD=GsznxY0ٿv?diB~3wE1>+'Mc^3C:L[g}eHHy6}FO7v.rD&{ `~Wsɢ>w[&t|&CtW".ߢS!pOKKҭL*qvQ~dz?]dWbLFWSSqt[׊<U%Ϸfن[Kmn@znh**tݑFL&T&_lf tZU6=^@w74 g0fk=]4._Ql@^{ x]T2Tqj E@C=ޠ@w7dum :AtJ( #PDG@C*#BR4!\&GH 4xǛiDL\L$*5L*l@nѾiafJMW kӪR4>Ŋ.i!~;$Ge24K7BaiiicObF5\Yd2 Ͽ_ƣ0}j;Rb PCL]&~![=IENDB`tora-2.1.3/src/help/images/rollbacksetup.png0000644000175000017500000013471211303312237020617 0ustar michaelmichaelPNG  IHDRIa$qM pHYs : :"tEXtDescriptionWindow Class: tora4GtEXtTitlePreferencesJB IDATx]wM8rE%($S~f)#bz(ST| 2w$H6N {{$~oWvk\[}y҅%?!BP"6oͺ_jy/+ulTa_+, \%J)(?@Qb'QnsS-jRzV{ׄ. PJ$a RUEB *)R; g1ȩtuby!\vQT\I bM~b[ԻH ZtbSYVKɯ\뺌ʮ UP,,k cq۹RMI02zZwur+1]J [VVA3GBJeBKmGCgѩǶ Af4-l 1mUfZ%*!I?(+s>IQRJeR*1DUlJ5?C b/oTKahfx0gVHաN^P7YLtUe$K$\G- R!P9j~>Fqm @!0!0%>;u"!]xZ^܃Q[-ų!w Jݥ_$$HSRS ?4tPI`Yq|.I=|򲲪訨ظzʼ˫I:!b˱kp:iB(J !hXt*5TPJm6[UUՁEE$SRR2231 [A$IB323b"!ɌH"8ddd(X{Ks-̜VxHT~YY4x/~MOz;I'p: Ch'Oصk={nwEE"YtttBBBnnn-խtj%:C^`3 0m`PYVЍ0Bp#L#ɰL͋BjF;!c(5 ~ X]]IHİB# {„ =[YA4,‹|B:SiJy!U7) RsmV&٢E`, "IwnUH-332 M]oJt䉝;wz@ѠbxTH$IS'C#U:u࢔tqO ITMw[WXrH`1z(oٺeݵjպKMM+))9v׭[WTTԶ%Uհ|дsRYI8CkXrdn6VU' qs[ܔFIǽW *Z! E$>t>YA%mux ׮2.V2{C*0\SHM-xNRݾ MI}ySRRKKK=MK5mL$m[6BիZRZz葝;wB7i*L*l6[X!]KSɕ5sT49XCl" "̱Gvm{IN\e/BlvZA?>xbh׆ {=qÍU.ݸic^^^>Wuؑ3lպ ?oŊ@ 1)VzzP ]%f3T7FDb, @"/ΫXM2xd Td VE1@  U̢æ.R^ZQL>9ṊI)e316aKx ٪O3B{ay&C fيNmذ>//+ةvر:uꤦj&?o)&YNu~BV`JJ7lܠbV`ԪUKf'VRZQ)DBjתŝDM]k ʅ)+sohT} UbRZZVBa )(3Q<Ԕr[ZW-2 ӆ1OΆDNcJ%IJݳ{kN윑F|^b >hNv#X@A֋kU %[>0\6١`l[[-|YR H|Iij 8r~Y U s^)X;v*y\@~6d-KKK]w޽{Ȑa۷~qA/t#v!99FSXXB*˻wR}4n9̮jvRgn=8` sM 6Z0Q7u::x@Nvȑ ?I\;"2ES[N]ٶ^rpQM2+_0H.gBz܃È,IRiiɯҸqFH)tݱcGÆ իϣ9#K{N(cێ~sꡆ'O̾o<~ !>%7uު}^}u:pJȅx"uǍ{w\.ngBb,` ́VSC=>yZ5ĘyKz:o{dey}6O[rXO|K{کn} Pt읧j9G?s JsOxxe7%e#I?}nh\&\:٨&$PY$;G=‰ ?4#o+,rW}S%@y uH%A؊lYfEt=2'wqBHyx /n(NcPraBl챕 "h@T7$ nΤ m@%ժO89dG22IOxW&N7*&l /FU&$(uֽkٳg˔; ,X0uT (:Ix#F[sfϦ| V=8 5|e̘17lظaCϞ=Յ#ա֬ON\Ѫv70cLw.}~Dk(*9n. 2E|-!~ 111N2>p5-ɮ=2:DJh9[-;\'t Xu) LAKdǯ{I) J[V@ݿ~` kS$} >kRw+~ϩFS5"@ɭm;Xu3UGSA\=ڴֳM}Te, Vwrw,U)P:9q^WU# *5X9RTeX L:46rUIfE@PEWeP& 6Pj.WU"RDApTI(%Jrd{ߍ7$1PJ_Q+pILCC*1aUS… 7nأG5kּcܢWzu0ع4V:[;85=!M^sL,%3vI* e99%RQQ[ewu oHȔJI=RXֶbdmۋ{$!7R?SLA4F5 !R]fO^!⴩P$ R @9)LewLx"!Bmo}=h֭f]:TZx=*^ )+IT55Մd1{zd7;JWbJ4hRm{5",ĩX>+}1ꪲ3`k-;_CD$,8MfO K,I>fϪḪGUZZdɒ[ooQ!DžԩbŊ4qQKNIA\)>":"2@"nŋ-Z{馛}_]tѸEyE, pW:nzyt׆SlZ <ĶɌ3 $&&ff6طo_֭Muõk׎OHxrMi!V)RB3gm@'wKYS2^VwO(%eI!Jl˘9_Z>w2o&lmM9wKF6ErTR2_V;vϑi [ߢ{֥?᤯Oj439I TVS[݌u-Puez@7^T]QKZ[PNBc0zD24Ph;[ 8R[E60%G\$B:P[(6"Lz! &%%ef6(((h۶-jҤI.A9 pڵk'$&ƅiӆ+;ӧO&M'` OBRuϴh#GpԀ8~?ѣ-2e _/#oy^}uZZTh,2X۩ 41!CM\5=٥q^Y幩cz1c&H@i0ޣG~P?##1QpW׻m~''x^`JSnÂ8 {ez\*9@Fe{nzT:\)C_^ݒAWv禷IB Ϭ+'Ͻ&Ŏ77O<0xm^>\7kF3G^SdŒ6)Roo3RbKQG͎֦ !3pDV]*ZV_3W;Ym *2Yd 8)zt`R4&4aQm럐qDm] }L8VHF.rI|^nbЏB( jQvO>$-=- *{F<⪫JNIھ}{~^3%4)OZm.o /,s̳db{1̯&JvGTkM7oѣg\\lٲmv͚7gY@ x%@\ b0PNVHBH_5XWqUqUBu<(&NRcWUw$5 P}X?"DR}$Iv4d2k.S|*Ì- E%|y:%5~M$n5tȻ/pPeo(p HPYX0T CLWh;L5PJ$@j[ӕcf6n۴q͛zLqdze˦6m5oтR"p8Bz􌋏^+Ļym5oќ2"T&@өb^g39PLv1d(fHebH#..Vr }hk6~- ꧼˡY#rӣe* `4jߒ Row8.i^VENKN8k׮^^(H`R=8S@ĤN:SUWŵ6Jja1Q*V{3/^U%J RTS6ƊKP-C4 8i7(LHikC݊{ӦRB o6poW\oeQqpjHLȥ:5)IWV-B T@f+&ߴh2#3rIȔ|&i$$P\Y?`voy!G+D"Cˊ>fEˌ smUK j;K.i'lVjѼE}EXJi T$m0i忆5&PJ`#r5\tJD}Qes8'OXz},UUU9.]&'%*M,V6jSdl`Bg : ͩk *Q'^5WZ*M ]=?-Uה<~KQ,> `2i&K? mzQx XC°[긪 {}>t:Uz>`dBz].JHHHHHBQPHWGR(.Dn qr!UfVF'VyV5m$hmp$%B-G&a$S,vfë2`ΣCO;Y,PpjE Rl4GKO-e܊ĖʊI[*) e@RM~'4L j{)z)E`o4^׫陛ae`2,zG[1ukgb7P֕1SUxuB%pTEHA<Ļ  ? (Wr:mK |TƎSs(!j&6RJ1: gS(4Yg @x2)0"0=AP:8.)]JD(B2ofX:!ljWRvSC.Km2\KB4/ (KvթAW^VK0?8 2!n0b~y:fLXMf ^BhCV۔aUpU :\GT\:u+.\nL fd"YeH$fEf#A6c0_3&քjdcʠ3.}u ^` !LUE-B.BwnT,bԘ(+ͷW&fB>qQZ& &Y2b;72(WdOΠEuDf섢 6A79O֍B3kĿD=a!E6[(2♟@JFѭAMĠx(E82W4j1BמF@Ş<+?Ѫf+>ÊRNʔ4q zcMGSÅ5_՜X[= }bgVnQت@m9~cgDQк[`as6'ȀSYΦw8OgW~ *WH~DP1DSC:4Q5a4'ENt)aR [S׋*VB) UT<2)sD9GU0A(kFa}07hZJ2(B=Aӻ?p3xU O[.4`)L7Vǩ ,c#tЖ] ;B2kК`R3Rlfգ-P|5Ɗ Bc-/=S8FmkZUd@׋ˇ:OOyv@xH ,\H:T= n0m (!U@ڱ `֭?!RYˤnPӣG)U--<,0*l`*y2`Pg J^F}wݕ R>U;A⩥QBD\r@‡k(Z2ϙ (E۷t))DfjQM8D]POR IaC끉&Z9(O׏aAHSE[^p$EV |)/MĕKb`KLQ4ad#X`ʷ21/'?Uʠ^RA"9r_]k0_|r%YeNq7{Mp2rPֹjO")?U`G8*H]܁|8qoWh VZ!-}vbJP B؛L:ׄtZ\S_%a` Z)waA^D-"O:vԋ9w3r$QC,VceJY(ť^ym xJ Ə6)+$%\`[gΓZSl5CX٨}\O "s\WaF.2@^u aI:3KWM/_Dv=2CYpX d>O:E+QˋPB ͳcD*0 ˊTgsH(pl%9&ƣ,8)[s̭XM^PxS&, "`+@uzfթ[=Rs`eY:ג`rn:sHHx0pX<h0&fvGdY2I Ui;!+#`5kK*P@7(G:ADEx*X>l  6LK@To6%4K*%[N q) h ߲+ֈ2Qk$^wI۶)) X,8bե8o]-|$E!I'@h)_%aKT#o ק)(zhMTW/(j4̬~[ Pn)ii:|fLStByƨZRR믿7l\j Kj::D=z{6P09Sq_D@<[nرcbb,ܬwfe9(>t̥)tSFņRc-HFi MNI[. ȷ6N$V%q6.wii].~:lMU.d^ZRB)<,ڀwݍ4 nk~MKDkfKygϑd#PoK]"' ,n[TK1119޵+!!AU5"wjP_ttt8?p \Sκ榍}^/FP.0Դ`0X^^(& 'Ru˄t6A5c!1_tRp` ҜǀL\4!11V'N$%%E@{΀o۾I̬=9˃4 ﹶcӬYYoN}/l}z3o7m!U!?9ApP p)))G5Z̿e%"*>GT3ԥ'9n,b٧,*V_%p?`d4{0zRsq0wAYⴁA XG';4Z@*{HU2554 4W !9_ϼQ--Xl_ 匋{#^-Mu@R=SQ6Uy<>Gx{HP:ΨHtUxS@EI巖N)1xg 9Sim#UfqћިQ]w=ImSuSIz<>@#J0[FͻF 6{b^㞘>_69 vO̴r[l05|ϣ-{g7nyhv_ָAmuIQj+vMs/p{{*)Tz3V ;yV[}/l5WnݲaNa7*ڴAf]nEvk{2|w$'aV=GZ`)_M/|3KV_QmᇒKƃAM8QL*)[uIfZՈ&m2j.rYzݐ~vʪmÓ|ywuч_|y'Z^>ݽ#__~bƸU^2׾=uxcՏ7Cb sSo~EI>՞m7>QY9?` OT5GYfkVM)% [fR~xi"jF0&,NOD)M0JK 8ʣ𷙴(!6IBL#} ).T^ijV.5ZA ^"3FժU$n Ise7hf̦2G.Zh{dž59ktK Xν󑡍c$GzOu+B8"!93}`o{k'qY6~ldV9}B6ِ2lq-nxU5)䱝]R^/UDK>SObrAyG+m&l ,K{"^!I ` "! t="]p"(zY՛p޵Mt7{e㷖s͇y/m=7@OQ] D{–2ІPݥ9"&+ lYO:SE׍Ǫ`vogf@2)EHTzr:[$+JkQpU~ч^[R_ro2jw̾SSy[._V,x?p` 0Ύt#B|IlLm`l}e Q-3uI`Up4cVrg.CD$f4 ˔z?$fL+ 2q@Ͼ{rlx V`3mOv3$2K"ͷ m>rH/h!(Q!&CbtWJ2uoTݺ$?vHCЙW$`SQȲ5Kw{rO+'N(~jo+;_N}~}?ܷW5p#qjw~>{\vB%+,WXPxowq#{\V<-?V83?gO^7w9S^;|Is^dg͠. >Ie} "+ QUm[@qĮںug;K(TZ /?Sכ?e֭?!8JEP]!eս4,A_R,reOx{? @2bm)Ƶ8 d=.v(ʟ*j\;<+ +qgYyw/r<,/J^^RJ)OLaٮ\ulۏ E׉[~&)f =ϬQ5_뤏{LB\ԅjpv$ZK`еE:'eVMC #Y'\{Q7̿oew _̀[*Çݹ}+n=ʲwoӵcN}FL[~اT"{Wviߡe7<şk>10 Lvy0>$Xqa;}_ 0#SxJSj$Uڤɞ~ϞoCe7nqt O,u.X03gp&=h>Jh;wwtjqw-@h{݁nNY|M]'7O(kq&;3Q^9:h[կ.Zzk u+d{+^ٻq࿟ d7{ر6n=3%ޣfդAÜ7.uփMz=/!od2@d GV@C"! d)̼ƪdJ{@ KSYt7]1ͦgPpxco__ w8ynl0OVoذتnYƵ˧̤<xC2fᏛ;_C!MC )L)@X1p*_C\" ڻwoNNNVvvSk?>/4:tƹʥ`0ߵkE ܔ0xΐ1UοuCGkGF}7jK?M {"cgewM>_yFGf8@{T?ow JG-Zc+530DD0 ߺ[X`%QqMN9kw^sL'{Bc)|{_bɶ8@J8e/+ @էRlf?gsiBJ07g#OmRes-È&'2k*yV{j&]~o9qiaOmMɪpX^|b J{zZi'g]|˥||kG^3W rBҵë?kR({td^ӠW(BvWGٖNs瞃`o#-o~{u"m^%?%ElwvϹ ?yh?RFV]t}5nVAj (((?AwJ'pZq 6M׭< ؋R0u/`E:*]Si^moXYWu_fkB䢉w!1 c8C9kM0:eVitލz0ͫV I$iYx3Vf̆ʧa-OǘMO"Ǫ֔(=ʟ j[k1I:AYt XgU_ @ȣA!]S; *%#\\dTSՏ'Oԥ8$ҏh v64#ǪU٣ð}b"h#$1Vj}ڼEMXil)eȣ GY_@t"fM9O*'EzfU_=[;je`#Ǫ֔B7>RVTD#ӑIu$^ k*򣯥bT9rKi.1P*'"8ʉUA TT 3.8qi/n؏>>gn Z9gk!g4ri=U|LO0\n]+6l(ZBgbNjqؒyC.PPMw.$l%_('QNvWV蓋6,Qk#CEKl Z ¨p&Zg@ ׭ܭR"yqY@~*Қ&UgRVcUOLV?ML̏ X%pqdwG Cr|4B3:'qU{\V<-مNuk*ՏȱgJ0r'<4?b-h㩱|:^mJ蜠u|㯽yG\ƓktZMCjAcU2s_nEI!2![#/$B9_葔tC+_A ڍ'm^w>ق$WZCg漳1hz3F>O{qI}cy@ycUiF{rsrβ_tQʩp߾: ޽#=9˹nj?Y|tEE)/`ڙ=DeQ͵߱P?EP5ŴzzŖj)"]L*F(BPN4U#Elixn3>$sBkI"'ZgUdee5i}~  4#'ѹ|)|.5x*ϦwGNhP"t,U#9;g/-{g7nQ]gPVykҕs洽yIPXujrʪHZ QJ@UO%NޏP.6:Ob]U+k+v~O(df1z帀f=wC~/m-3w{QRFNh=s*|8;= =;='JB#{L( 8"!93}`o{t ѹw>2qH1nP1g6=4SV#'! ZZ9 ~YK w_PP5}sTkGhw}赕;{(Uzu-Yc=;.fӣNa9* iE\='5JrZ{Ki2@IW B:t}}zs֏/>wۿ8T5 Nt6k+;alrԩ)9fDN@.C=~͜P{7>F,풏H5Bo^3@龟71J+=>);jG| U^\^P%O}cژkgE3ujuʪ jӥ*𝢕ۤcDQ{eee@{mұSc"w# 5>_[ dee5q|ljh84iuԏuvr(ZN{ujq*ZyDž+:6anz]@%zh,n+_0۷M?`aju𕓷UZ 7˹%L̚ݟ:M]sh=[ʥV:]ޣů S c^cRl{bKI]^[y amkǮp9Q\싅(@e{xM }~?ϋ`׿aw|n͛gD yg tJ(贅?Ϲ{|W˻hPOhw:UXtL)w[$tyEHU-μS{?Vy'ܥk4h~T,|>t]_dwޯgݮ?X$V}u~W+q.ڥգoYAAbntgE|5AhAb> M O].+*w'7֧S^g/MZijy^(bZ=bK^Ç n 7=gB9q(1!nz(<3_֍>1?+sSK_Gr͜ߓ\m?n;g3?_xWM.^3mUCg}o >59uo_ݰfM$ jPlʇ~uk=fsycZ߼;ӺݦM?/7ץKr2Ajx'#%OϿ"uTNwmÛ ˍ[6]pgVEйSJ`ɻǏ겏?ܱ&On޼qpoط[ݺu֭7s6Ҥ'|}y&QȫpL[-9R;~Cŷ+"˗K~YKwȍb ܛ!"\9Zxe٢E;3/V.ٲtOػDioyC"UpʬG.Աw͊Gٸڊ'[[ݙ_@lJqkK'y3~C#% $HTjnowExU^2]E !Iִx.dƁz:.GÛmN5扁|tʌI_vN$*|^c%Dr8a%Au$W#]\8[t]Wr}WJDsݾGmU$mYmP9}9(K7眂Kcw]QE=㳙[uFm^\Bb]\j DK(pFf+b롳v(N䇍3Er{[s H5iVIrQ]2MSC]#dFjg|~8$g|"tQuo}#h?{gQ vb׵[_* ^[QD ҥt.'?t]Xp~gfss&~SnA%09UӬn#A dڵ'+5wkng\~$r[1U(}(^ K㟃ڷM4v.&U@ ߅_MD@/0B . *@ ?:EQ!w@{(EQPTł3<2qA A8\^~@T*D"4C _g/ <"{ё}]"cʞ ֿ@ճi;uu!NҦug*V|ߴ6vv<Mm[s0E֡a=gaB"c_{#ώNj(P\s޺W>X7nDK*6\4Tmk3:%%5-%5-%-3lD+pJr{T9222nْ W(RiͽoվCGWW7}zbrŸSw ?bE~'ԸNGV 6]{)4'js2sa>h6eўu(Ll3:B|)&ɍV#8OKJ/W]c cؽQ/l43dҤ掠Au~#|2oEon*EQ`i4`YݲGXQ#^9\PO&Am:7V*{D:4[ 81vj]N'W߂MTeR52c>Zg>zmp`b*m(<䒑]];yu?`\%úYLta^nnXu!')y2-лO[OX/:/nF-DJN̻3Xp[ML K+|:sw$ hpIU6T{RS ړ P_kUU*Ϙߨsu61-nK4KfCi;|*I{++;2~޻SUsd$mg؆:݄TD㻠>*fjqٽCv]lZ UvR/ʷk⼶8ҊDY3D0TL0Jq2m6ԋ|z3)pU#L/Ϟ#ktjz{vaƭ]q}_ZXŋ.;Y3ZV;51VN|6l Tm-!3ѐJDǴ|1Jf[Tnɰ3ӌB$ѨՑWI3۳I$Ci>YReFcQ6 X7pgvHQ6E>z3m\cGXLf@^OwѢ"b`!_[og#u>z$B4eTFC퐆{ GV304Ő[7tGgj3_= w|{SQbN 18,ڻo;UqH$&-H̒o=ؾh,(yyf( #y,";Ľꞧlccmਓ)[Fmy|ޕ[1$'OOOW. ii^b )))nnQ/:YjY( NmggG&~'\|Սw6B T*A6w,H$RK/ n`eTQT"vY%m$RZj<¢p@͇~ B$A&s_igA?<:9c&'/k5pd)[;dΗ ,&3>.N@`*u͡PrQ|\MM-km-/l9EleNL Cbh "h~+D1,s+r;L8zplOH$ܾdemU}r\x.s)&m;>ߙ9ǻ,߄ RU_U juSF,QsΡ95kRYt;hA 7ǫA ~)T;U!D @ FU%p/HqEQ@*B"UowhSzL1]ӿMlF ~r~R\.N_'DͮȯWHkS Cy*aSWf!EB=*bMY,P(DP5>A km C+{kωH(426AQT"# C"cfhd,(ȯΣ<eb<*l 7wkbiqզW4?788)fV^˯ԖDKЩM_̔UjIMl[iЉ]8Xڴ>L 4<Mm[s6-1rKۨE#+ O)_|weLёszq)ɑWϺ߀/5VtoǞ$>9` 1j6eov>MN~f:~fpJr˶[l+R"@m:h^8:Uo~OGQ:ܴ<Aq o|P?=8hQ_;b9e S!Ẵ#D5 Z&|*MØǴףKT])Dߤ޼9Dȡll+[~~?w'vvTz5I-EDǔ5n~ZI֎x?_zڕ:Vq;[[fYy&#V˲3@>QBqYU.ĸ vr  j{Q֑ Yr҄O⪀f؄GhLuRR DLc;:X7?]T!::-%∿7ߞ0$v26}Cy6/EE󉰤jsuXjT dR52c>kBY5ǃ_["ñ֍0j1pKFx{y0]^n}iϦtqu3,=|]=F-8H߿ ;$xU{'YhW:5=8+` p9lTwO77On+pES^ +mjg'TRt>A;w t ׮H߿ss15w/0))3X4GI!/XU.z}#Te^24<\N.-zN+K;y*MFf[sJqբ4fRAo18".5͉Ԇmk3:"ef=ڞ]HQr"b&~1>c8{ׇ,t*S33~HYGB#W#JճJn0}B% wp52 ۧL!m ;$ṙv EU>zxOmTޟZwW>L}:|zŔ|jWm8D -l1Y7"GڹF4%=sx ڍ t4j/{g!;f.)3^FΡ6ȥV1ZޔEyJzAdxow)x$Q:9ϦiRLQb?;h@ޗVi)ժ (adCg @Cwѡ்K0InLĝtI8!I޻rSE_ѥ_ 8^{~/;. Ř6}JVuts4 ^y͟8=E"zyc@QczF%]k>PL|=D.sa3fHQjU@z0 PW45wƔ]EMm&h4J_7jV#D ٱTZS Gu)ێW$~c5:{VW(#A-xd'yaEw~!o}u3ذ߂;[o؞i9!u2qt 7R9.s{Y밚b=rej]R%^9=w=sczvCNdulju&. LSuUܖMn ӴʣJU_eQGq1f561zdimBh+bʅEӏҹ_zinCnb oeGoɧ9z1XknU$6XBR+5giq}Дd#a-MX= Pk!Y" ~߾ZJ+'p*Kq6U;YT"HfQdLi@b1Y9>zWhF2p5q@$Aד1];-:tQ'TVo.S) 6 Tn\KV{^yJYWF!ra"/tzw&1S_38p7]P(8Le]z7]ig>>sYsAFg:8+vhJXiMl\nUǷ7<(D4o3ҥ"G)"y.V˯G" jv£{f0E۟mإӦ:WFS* 77cx>dCFDTl9Y٥K ^YݻĿ$1}EYx4A~WU!$};>-ܼYŋ;RxyNGN \NSZ'٩7M}Li5`/lm^{Gx=(޽qoХӪ:t~*5NȪO!m}:ʸ *%''[[[;6qAtĄ {;;"-GIIIuH$s0'+ȎfeP(4:=:*ΖLYF /TdFFFhsD@RL! D"ZYX QEc %55DF_U!@ 0w LBQGBDwשּׂklժZʛׯu.mmET"~vx<;wQ }x$RQ7_W;IA BmUyV?ߍZE&Dr5̼2Wߨ-k0Y_XQ5>{`07&II_|Q1133555e0~Y](liGP@&UyBA$y\.J500J$ 6͠&+߁oFԦׅ֩SxvdD̩ZZT"(fԀVV֎=GHU;zI!Lм.  jV>"K5kxyrܥ>uMZڵM/3Zg.>T+r,(ZCɽ붪D4yDTNoA%Nר]ˬ.:`}= q*,ZC@Ӏ$;)c9JZlGRT=^k/ :JߙfCjmکT5[CQIBi㛱?{&ZCd;tH=;u=}Rz^5^"j֯[+gta"Z ZI~j0oo잱)Qex^z@~Vp\"DUQvjm`fj~ߺ>y#RV(]/2˦Wϵ@~R7odR)oUQpP3 +KѤܨo؞usis`@˪len/j])~!cک43yoӘjgw_%81vj]N'kA}ymv.hQ=|(s`0ZjE'u)G]Ww;322jUW Er-U _b1>|D"S\jH$7=pb8BQv D"U_e@]`T4Adr18N -++ˣhPY WNw9!(*\\\Pk7fXvqq\.f `U! C((i^- d+/j1Z;k(ZVVfh` ˴\&- P'^M80tJ](f@wrTWYFuU)[=--,-lZvP*JԿJըV!s҇\M .q\* ?غeKvf\dx%|\[;r <[Хm[vݾXi?":Lޠ#PޯC4@mk[b3S^m 8~cKJ=8:U߈oz׭ZiGc%%ŋyի׮|R ʮ^ɑ:#*7.;*ue.pT. 75$kWã^GŅޚUJz-=_]UieS)+{oZ@;KkfXZ] }׎$Ih&S *Idiqi} Ф5U)M`QxɤҵkV e&Ɓ}P[Jw.] @ϲVm80[80`SF6h 8nݴϦvuwKEVq`s8~>=ƬZTYu|Ȟ<ݽzYw5E< ٿ_點qIûy{uZ WM+/ϐOwpHW՝Gj}~׉Hw UuQqRJ"h1!LKK ߔͩ*Tm=r}D@ƁSU*f=tݸNgW~QjhDr/M:kfbZ92Oڟx Cvr._ejfVkLPzeDz_ lΫ)@dž+gdW>lk"ΰU z: %>(jDč(%nT^+yqn]P˖^N8r?17rʌ 'W/FNzؤ '"NO1v{'Z<Ɖqa!߁j6-ş{XS袂ZHeO'a V m#zm8u Wkt  >ӽ>H5ԛu;GZK8Pɴ "} OtavpxA^~j^8w]1mtgg= ꡚtD\QοۏpҨ 2(m\$1f"FO`"X=`dK_=2}Xg·\^~oGPW+:nv<!ꏩlD~ۑsۈ]ͪF8OC:߷R*HcE* s>ɞ.WGNr 4ߔ_QIۃOWh*qqKo\bB9VC U%"JxNJX.m-P2Oe(atԣؘiDG=xb2zWZs">ٲZlI]֯ =4G3 kUe9#@KoiK9`(UKR.n߱BRhyuVr 98 IDAT>0dI.@WUW{O7OQ:) ӻ74 0 _Zf x9,qp;:ȪHEo?⼇ gpj-lk^XpR$\&yu3ǽ}| Ca!=_d0Zn5Jwjqo7z[zSN[O4"J S k|& xfumY&dYpxΓO7IkjvXʶ$9$ l2@^&T.$)ՂE乆TԜC2!_oHZ&SE{֝8R2AVKU QkhM+ewî}ۯ֒qSޞ-Ӥ(к z 2(۪zrU:P@ aَMUhy.˯yVH^H{O8DghnDGKRkר혖{Cn% 0iAbl)pXY<I<Ҹ`c{f0ũKf{'C!%/Nm{AeNSy}h(_:HIeOI=CO"kr0kTMuIMت7ٴz:6q oӹyd{w_7=c jצrމc\&2D$2D=avl|Iz]rJ(lޠNβdKdω)z ݝ_rhڕ:yzd1ٸ>c:]eHY٨,WqԕvmxqwefmdOy=J}U jbmmC[?~|c=|o1sNFqoU}}}B\^8 Q/:YjY( Nzlkk 5V ?>4bED<%$WD1,g%Yv-" C׀H$RUf7;hYV 955H7[ mzn7$ - =sL7@ 0wz,&Kc*:JDbYY[TYmӺu-y_zB ߖUvs$^fW^^|%%<.˽}Uq &Lx\NE /_գ_}ca%(؜9~%%s?.t:e6۶uy @HLL|y6Դ)>U̹}RFVԟ7D.G.] nO mD"RTDR1`t:nUz>UoߖD\D})M>3"U)%z-,|9mE,( =NAkU$*)|d4di۪bJ%DUf[|GPOLa닪{`,uK`+`EEλ&iς9|ydJ_@$BTDRn}_ @_6Za(ЭHÂW:^n&IGeEսj+kls;N 0e;3j _~ڔ@_2zTTrfȐM]:ZP0VzUK٣DC;09FeDy%(" g^2ZX2쿣)ElFz%Mr"Tܣ B)02z,AB{&}хUldBn&dvb4ǖrzMYM貴v~-ʝL\`Ež?.KڃLdldjv+g3|3F _YġW 8S7M8*-x2? !';OE7>hae< 6^{wvXaJS&?783+H( Ljcsktf!VY4bl} 2\=ER{ڌmd"RﶘՍ&mY( Ӈ^/ˆ+]鏣jucΥ.1:OikA\ O,%^v_&|x?[e74izsrDEn@_U^ 59^(pxňwY<-KynfAv UtۊĄrDm~gR}9mڙRjmi@F&Iƽ)EpD@`D۵ 9LWs~ΡRۺs=PO *?2 oY>I(v-)D+]-/޴'+O&Q²K L TfX!MVd`ڈzPUH҉ۘ!e%/^uUaMm*J{45pϬ8\LbDWXN7RҪ/䒷"ÐCAtw<%ͤQ ǥoJkg͘$̺s+W$-eӔMc۩o>py;boUdAR8.}W%+,*C+\US2i5B$(ECqDI$#'ry-yDz/nj¨ |StV8(&?2:ҳ;L@5Whz,i@J7׫4cIK zGSnm*M*%'ϵ s<'뻫/Rk NĦB&4T!,)-yWQD@|rPGך ԐQO2Qy.,<^pCS&lB ?_U5VLfwپ5Lbxs?1 U 98lf 1@!ӉXqzv0`XA֎sj dC}.IY&|_~w ޛNj,VdH\~ϩz9iV)zcs=43҃$`Xav;v bdܐTg5 $oLpDV&DPvzfէߍ7qIr`SlEmn>ʼn-{{:<1 '·-,;75K,vwd'( >w[g+"&ڵ?IM6S 6Ib9ݎMt~Z >;!}>3:/5@T]F$7y݅{^O$/72Vl@v|'v1}-pGQTc>,B!HpZ+7B_^NNIriz><<{f_iVbXckn`FFZA; BL}ƍ|A߲Ҽ< U!? 4:fGDXkJ"1d*II(U8)~VKŭt4QádrCZ (D"fPk7f\nܻw\GyA *!m\׬!+>Z^LB$Io6KmcLdfLF% BFPu# d)/LcbppW8R,k̿?>| yĶ]XE͚%b\[r0))"/Ӛ)1mo8VТ_3;l nsi܂Z0cȯN5p8Bܱ#`ǎD(UjѬxK+*dR\:jFf? v>{#/-3+C~T*nP I WZRxyy &cm TYFw1j2I?̆۟;KoO]yȤҵkV e&Ɓ}k>;D cv~b`˜S+>r*2̃O{%x=7< =ӫs|i'NI}x{u5fݥTI{GK+|ڡ7@yp`q,÷[8=}=;usn<"yaGS)@5حg=ݾ&HS\_qqkyR+"tk(\[&+AaoXr~\QRU\h2S^] ׎@ o;?sSG[С<ͧf<ځt~[Y纝J _hwYY1g]#(8'Pp̻7,cNkLK|FOoooQDzPL{YA {ܜEXq?frduS;V]^XٛILjE'ۍVyKbeO`"=x㏮fK;k"F!hT M(d3>5Hi>ԏ12W>V#tf(=l-w5Ksf5m-6[ oO^ًBKEWG5_UQ2Vn:6o\,HݟoL^ɳ+p^s= Ul 3~Ƀ2(7}BߴߢXXK7pV>+;m&LpwңȇQbc͚klb(2 ѫǧQU_l9ŎO,VrdhyuE˳UPl9*J/-{y_př`(U24*Ǽ2 ;[zjح4m՘\ܲIE2WHu!x=dȒ=Tm(,}*@ Ӊ _/hCKn1S6-hʖ0Znٔ꣥4be>-f9Ԭ.><|H z!NΟu?A1!'^wa R汉`EfNYtEB)nhqw-*8qo߄wBPX@/2v ҝZ Lb7Z|ʛO",dҎ!RBJ X,Ni&%iʍH, 6y߇4Lu-{$%Vpj5P8- _݆Sm CfW%x(Z5yj(\@˫C`]w!t8ѥ#|ٶ4)*(!L$(ҲŨPx8Wy@7>=8}HSjֽ>H5ԛu;G 'a V m#zm8$?TN2hQ7Ωt-(۪zrU:P@ kSҧ;=l2ü5+:1D~Υム,BqD.\elIȾg}T"`cadR2͘š{o% P0iA;>4XHtl7hFt4MP}G41")rziY4D؝ )<%ï9Mc&55P{uu~ytC[u|i1lYr@b2\ZOVgwg[ b*wрeU"X*ߚ]docݴtQ(M@7WYKbx94}Cϴh1f﷮[ :k̞CKJഘ=u׼mm LdW* m!Q@@ce:Ikԫ yyu=ydICeec9ml1wS? ?;_O,}b;ZҷO(Ǚ赤k\c*hcSKCw[f>v6Z]Źi:-ek; My%ic~<8Hc.OڹG'#c݇*鱈gޏ\ڤ)K~}<>B,a]Q'I.ߍ>VJ{&߽h=Ŀ̴U]S'@ ^Q/:YjY( Nzikk 5VTѴd.%t6 D0Ec"t_{;.;vjDf3~{iP$! <%v= 2̾GSǦ%Fnihdp| Cϓ.! @ ZmUsR2ۊ!UTGiV6J>;g=irwA1#)=4D8`QL3h4eX @ : tiR_ _[3~D7&6fpQV9T6ADr#6-D4!R)J3l#Ք t#',VSi@ BR@5n=pF?r@k㱻8qA̱hNf[sҊdEkȮNb[qJD1͖Mn@ :RlR|)piNA-SF5e劺ZD}q{6]Mb¨Wk"21Т ImK~)LQx'C!NtU6-l,,Z1R_X{)_1n-BΜ`y7IDATCY1̼yc3s˶sߖW)fU-8 3n6{n hY5JE uk>o߾?X;z~aP: |%An lc'fvXWmּ5БW;؜Z=DԭWVV*kC9NZ*He.oV/:Jo~4]_UsrmY 90#)kDWOf(jvJzi1lYr@R\Fsʒ`,j>[jLD#r) $WR!SU5UQ*ٰ)e@ 뫪{aҶ\赲%Wn*Hn"EQWF1{ k@Ϗ۷hWKˢ]<aƔ[PTyhvP kV#Րvr0ͺx_nnӾ| oٿ;Ϧ [1Wf æSZ0s{7M_>P A25Q>kjSE](9Ȅ [%;}k[\׵M+UgE_4ͯ'55o(@!UKT@Lr_I86fϟ/cEUqU) rt^W޹b pu:]R* 1wt/\YNcMhƾ AYԍz oG + :V}Ml(d,O!$,d2Jc_ C'X g{_k0nY#&Rta;@SOq ,haՇM@.jKҳ:dzrbexu.[lT'Ubb#PE4ͮ@BO(x@wW-xବ[4aWxo=$>:.Klbjϰnޚ :`}U~Ҳ_#څXӾ츬!0( !$`"<Ϲ2VuU}f~B^}EF܋g&Y筳y*R>}ގ|ξi%0Ds%`cAeo9\4u74MBc@hڙ ΆܿQE[햵T/UQgrZixmpZkE{#袌+?vx?Gs4^Ȕey" @8'GU˭irƳ%~Dwaդ7bt4vNJ[oGΝf^D_SIs30 ;xڂ I0aȦQʚ[s#B*UUUMwRo4_͖=o}xє}{}ģKL.;:JufebU4g.LXHx=UYXq+fuL˜/~mRm5uTlJ˟foqk+Km;:J)›N+vs10ay𼷏e,X$Q!<xj9}=}4F2u8b`!1PF#:֣[e:*:zHc+~bd i[f H,پ,Yc]b[?5%]ڻU9֯})`d%j3ޘ幤ꁶ63moiA4#|vĩde{LH7g}V9+{9`'> &tlKs5J 9MRC8-HDXJUSEJo9!M4%k+N3@y/x}>[}+ ~Lխ_WCDRX~~flټe˖-'%m_]b_8y/./τd("_];o̬YE,w4,Bo7{h""j;wץ"3ɟfMJ-y76_7M0c jZ峷]r<[w:[ R!\o* 蠎Sflo@^틟$u L*C_:ޟ?Rșc! wȊLKPYYmc#BG3xg7CQpH(*+gݞiǮ٫L(߆Ck~罡әe;e9Q%R lѪϘ>#{uto<uP^/!)K`eS|{\\@ FӧqZU˲yyyt5,+9>۶5Yrr_cccp`O^3FnX9CB:E V;PXp.j[pn!b(,'7"jTYʚ# Hi5M''Rʑ(l Wr& Ve۠A{eff:Ѵ2yNv- 8 ?_`}sќklߗv ɩ[|}~V0工w%ދA$fº_MIENDB`tora-2.1.3/src/help/images/exporttofile.png0000644000175000017500000011056311420556127020477 0ustar michaelmichaelPNG  IHDR,\E pHYs+tEXtAntra?t?Choose format@tEXtDescriptionLango klas?: tora"0 IDATxuֆd7.D qABCE "WCpwB '=$:>;3;;~NwթSU[5]=C8 $$@RQMCb1H8֪kRk))q2$_DVd${\O[Iӌ)p]HR[AJ:"H-]B J_D?iUhuoeLFE^mӑe M % fSM 5?-Nt)ΚԄ6(B(*H P"I fZ\IB=7AsI!YwPPPI4>Dkjjbn F\٬oȺH6 B2M!iaa$XUF_ۡHSC̆#t4Pt/#!PuփN~_VsP*uW"F.z!zkŗt?gv>t529B+fQn #iS3g Bo"lˁO'I {ZcKBOߴ o=W6i-I kx@Ga ijfiؘI%7%-rq$=Cb`?SAs 04I2'fQue͈d|I)ו@ 8v׿Fô'O9wHt'g6]+i' +2S;b8!IH4:.&$"" J,kD g`Vk\.0dJg6{"Ѽ@(*p DcDu"g",$=~KwjބAS9Oɪq^lt h'Y aɣLm9֜)l:<b-iӡǏm$h#}u`c5#m!Hnm0UʼnFd&32lGˇ55m=!u4zG$a9INA5N:;|#UN&Qc4պ7̿Н^_lHӖ`K%" M !@/p"=)Z%k$ 73ۦVα!;3hOjhNrɦʺڝM܃A0և:,3.:: Yb`Og'X c}1Tˋ:aN ͱj Hϭ.bQ-da U }O=)yU-{HZi+(QA`#w ٌTdykɝtr @獹H f"6/42nmL*Eҵo[ *KurL:'I tXڟJ8FO.IZBF.:h:M)\eDbNoDbxHK"1 L\0% #v2/,eɒL5Kf=yBf\DI~ז~q,ZfRohfC]Df9o/uz5" -n/to?yktU1ݥKᓃ.>7([X GiV5uG5ކ+{'5|&_= >\iƳ4w~!7-! +D0 ۉ\Ob"!H8Ė݄!~Z(9J;^=we'aRr0#\2#(bQ@ҧzECKc@(BSK=W@pU&[ g+.5rI}r' ɖ~ImS7P@C\Q;lگ6mB@]E3{]BP+ "\*QSR4t0U>5Na̞Cp;z:}c)…,%kN$.k8 e>I8 t9g5Ɂ2Inp I#Nfn=l*Z|bmۺuAR7:cDt)E9@8Nz57VPjo (RjɗC3b֬oWTg"J 6NE1Ĕ4dZƌ碕2[ޕRԏPsV}пN7aOwoudSb!F;eԾDkd#d%BH "^xL+i(BuJBlԙT_e7])2a)eNX(z;׈DO$rP+ȣ%2 =jZPlnƲX, '=gL,ԅ%BVb<O^4R4W DLgF"u. {DF32d/UԹ) wlܰ JFK\u'WVT0}4>S¡0+gq׭d#P#!D̬J۔ t2elgOsq{R^~+?8V52jIܯ1Wne ڕP0H8j tuB$ӆ8Z^^8??` M CO亻?,y:vwsw.GjKc!1r2g6CD}~(܍G7@iקdnCkT{pXb^D>!C'p/,WG_r]~˔G!V3.:1CvaȰz[ՄW#.ѻ1Y_vkʛW o1w2w}˿]_0no.k?v AmEDX5P,b;PPәAj-6jP4m6uE c:cġWď\,a3|j:SIc H$OdI۔\;1ݼPL"1hDKC& t?$פHsL"&}d֠m꤬񍚒)$$A>nn#v2c~~@ 1cK\(B1pPWu~[n! O/3rHH8b{lm'Ϧ& ˯z\tETVVg(f$ӳ}o[oSNaĉTWU2Q'\Dh#-%hjjw_]cذat0GFH:9Y UĢQ¡zPb1۽X4JeFF4 l"(՛b\;O_@S\70j.\t͡R  Rg~EWF/ =5Ar#Y/RGՕ]v+-JYؙ^s8;~yAO_cmj0c jo]Kh(.ibcP!Qt$$ ]-;5 Kx͑>ZQ;*V-iSb&Xzz\E_GȳKA(*Bi:S54(15U䁤/aǕA tdIC`.cш.tb1ID AAUR"C$sיYMV KS5=@G@zpْDM~3f ~q-W_7SӑeI/Hyy9wgf֬(Ϸ:پ/ V/гgOx!V._#+Bٷx([krwVӢH BHHU[]@A2oίlW:?{zw}3]$U/oJgV&k-qjc*[i,p9-N#o qH]=cNm4a#k4 ճo8K,7l[=mF<>7e ԩS(ߤ:\^ ]ZԏB=rh}t!3nEN88{ill4dVĖWj֣Lla{ #bDQ-[QWWKŖ-x~DWj)k=bm7Cfyy9W\y%7/Nqc9{ʌ.ime"Z,H%//b7j9bH\08G pyd|E2,]$ |eCC,|uGvq$d7D-f7/JE%4SW|Q]ƭυ)x ?.ÃGn+fY(,߮`Uj k~|)2UЗLmy$QH0UUgퟳhj~}|xEof[ΫWa䭽rH@0٣WG3^&O7ůXG)]cW|xCe>>]}61F:y_3[iea-;u3ڮ)3 tSl4&`U2䙤EzcDIֺ[i"~&) I-];a?fJ愔%-vhw-ReeM-RN'ވL,uBCfCC=+W,c;P_GuuוF0fD]̪ ~;C37Ge[rK/C _K*3Umї">C(W{Ɉoێ.{~/d֢;m{^rrX^r/ØD+g f=|8/\`a{s꿾tם%!U?G9e8,sO_:!rszQNÍ TNCXN2s+s@HEw3\Oދ݇ egڲ?C|#39qp ӗ #3|톽Yo P?O5—_}*ݟdߥen*juZ Vb8w=+NO+nJ8Vfq%hJ@)HV<.DÄ7k%I",_A(Ģ .D8B.n,$pb|N^tP+cdԨGkN-=!q Y2_g=33,qR"}Xρ'#BJ eOZKksڏfy3mgiKmk1%iBOKYran-D\\t 6 I mIć_yv IDAThUlXR3"CsK% )6u[uSU1꫃T7qi@)ybBs*sQ9K6J$S P eTfCf~'?nK++a;"(u*Huy-)\MY]Se6%8R/iRIEXjq֒FI5қBF4׆ "z/![BŪf.pI(: :q6X[drW['IDÿ1ՒL,N=Iag&cH7-`5tX01}MF8˚HEhXa}xfQ14Aj^j0#dZ̿XMB։}qb F$ Uh l Wd$[FDo' i2b1\._`QU`=@/wh f+!e͖n#IBQ_l jV.%ȏ어HL&HOmCz@~nzP ~F(j7=sC M!EQYȨdgCOAwh=D)XՒ2NI+^RM'Aqe4ZcKKQifNHB6Vu瓰tnZ\'؎԰xǝSUqz"2M'0 ?jMwia"2$rFhN KI2^6b!iE S)4$K9YGDfVwZwGLee RPø2ťN9(dY~°GcMiP.LQi.E1(dRa7K f dx$ 5wU5ŐkLL%OHdN5[׊6ܪ<}JƮ^X zfpaodL aA<0dƱzafH uia)Ûu35^Ҹ@.-I0 A=JlùZeJ2Yu4z@LO7;?C)'=톙'c̖aXC >H X*sg%mӵZ3eyn4EwM'-è%*ݻEj;Y @c |jhaVYk-g s{9-9ӘQlCheieT/M I`l,?snEDW%sNA2Xvk# %S!X Zz{Eӆ[E;F+zbZqm!i&!H hh Xd\_T4H֍t[(hSf-Z0MKEean qa1 V0:aB9M2E}褅dMtWcf% gTBI0!ٳ`42%T깱?7u2 {x"譗e2̵&Hu5gTlS`M[2e-S+}V핑/1ӥM[?es̸^gs]u.$v^-1kciM't% _Z;ɧN+On|+me61?\?wMh>W[Zs CJz  R G()%h^*Z&$h .PR/D%Sn˦NZ"VO%~JmOiL&R>J0mq-GoiAB iԇ5d:e&}2)'e]íY&.v!"#ZơV2vgor>^:.=a g)⦕v*MGy&hCCK;F+S>M71QKz<n6noe䠳%'gyu$ H$1zRFn?>~Zk4eda_GihcۘD!ᄢCgˆK{[IH+%~"3MdM?6!aO+tGJ!j 5Ze[NE2~GBRI/2$-*H#4lLZeltWrڒDڒ^Z239`PخF+ 4Am#Xg'(6i-~+rZjc$YFRio:p E&!d[V&&dEֶ"Fm"x)e+]9)d%I#v7 GE2ָ[x"Xe(]bA^Ag&̧[[wڔOk[:Ԣ!'q;qH"+ IBv2Fd6վ@#- $[q]$ji\Z\3JrHhn%:D8HiM2` &9_dUZ^f}H[MKHt]b\i,zç-@|lz2+4K92نD9tsVJZ*k;&&J<.vXhEmd%nk& ⦽JFZI:Yd |e8 ++AD$K}`<[BёLGl3rQ+ݿMP!E<2筺2]q:I;j)I` Ǜ"^8mlJ(+;rAÑH`'Y'UX'0QD $DTiKl, x}SؑZ_=lmn=͸-ƭrfY; 殰Mˆ#xy 19JUC:? B CɉfREu.1ۣdUU?))]5Ը7 aC?Rs hȉtBcmPlZ#%wRIDT E Gv na!3XnŇ/RĎ;BIZT*Pvaqvf\ *n`8H4B4m=X( ڗ7D^{(BVG-@#k2şdAD+y4G-8>F7iB;;JhԢ4+lxI%-YFB/]H4!h{ץMY{%1(t!=>}=m֥݈yΞ f2ֈ@m/n̝-~c,ʠpyqyI=z (ji*~$BÏr˿EQ{6VQj>~O~)'.裸K9x'^u?G:Qtu mafǝ D4nV?/WS+uf-@XfΚɈAn ޸; = ׸GtB qC4N{ٝ?aaTVPߜrB&^?h0r?{#Wr1W59 |8pK 1y(s(.ȚG8ri՜8y.W>‘K\1bqQr|_@O_IN`̨L9moC̸!VUG2jܵ8t0E.}ܶ2&Q9s9s]u%|zj֯_~6`!$Nt ]y/ɧ39|u_\RBz<@|+>| . y#|3?ǏK/xOx*^l6E^Gp㋟2׹znc*}1 W:g7޴uK/L7tu)iNĻC=o#v\3n#Mi+O7@?Gq˟37f7r"k.$w / YQ"f1hO[ٕ+m5(Ľfn\\]_=r k֬_b't7qZ"3>gR?iS1n8ƍl$( yaI'κ`+G,sȸ|:LN=y$= 8`oJ$/0^T;0;{:`- \;H%_7~%O!cYU!(KGۺF l".{?,lEdacaQtbtyy"0??gN+MF Ҹ 9hl8:4h?>\r {/\r 6l3s*==zXd:[V4j|B;G7/D+>{|иHfRtD,\ ;BI\*pwvKo&l Գ襅vB7NN۾\\_HcrM7O?qaO?qM73vX"H8D7} lU<U&3-$w_6R㊬g?b6eV'nd[hZ}vU񗍡H(Mu԰BOD7E-8f Z@|͐*`SFBmXg/|H] yӓ9{.wR(r=wgeHB8"Үp˹B!>hN? ӟ.c& % dFw|+gO'R8J6?Rj]ףݘzt:-^s\:Э~.LKq1pd=rO:ͅޜyx77ݵD>iӿ皗kuEh^r2<~"Ⱦb:Ew@(#[/7Dtɽ<,E p΄Q/rӫ,lS475\ǟAhjjJNd,GٵĩdSyydm}W%&EwoN]m-Bg(n=;Tt<H.,iU 0 x[j!ť=tѦ54 D#W̏3K1~>p8r8p@#`θ]6]ӆ| )eU="e}BD*'@mm!2RQz}9|- 8"Z#^_DgO 2d!,V_ v~䥳KsuʶرOޮλ?pOBw prDBwIv6w`4t-!!!K.RG&:B@B!ڻ3;l[8$ %8cp:;pE_vm흅pC(~p[+8p +pŁdƔW{6!blAzq\,smm/5h4J(¢"@m$9Vhχ۝;v|?̰$CbGc1΄B!ۥ@O~Xd ];vG? z.]BmVlYҲ2*+(..N^P(H *:p hFo/EX,F]]::`(HN#% g`OƁ`z5PA!7lAc8;v@E:58ۆ8pAV8 Z(c9֣p~PtD5d,/%ꈬ~cu2fppp-qrD4LMbu4f$&ʹ} a3?ZB˹W =;@igc9r4'ɟf9,A!1z=xJ<r98LzSvsĤY`>"ox/=r9G3S.6}G2j}= ְWp~}i#t$u, w3x|3z.\F6C;[wѝٿЯ}{|`_u/q*A!V#Wwȣl;C4, ?'fS Fds>gNvpʸ#P7 'a t)X5};s֟f@ Ohκr$MxJ2ܳ4-apRb~ѧw?>9 |x Rr[c z3dH6: J`3RsɡԦ판ӟsOIgO>CߋjQ6Þs0<_JjgNvp#P4?˼9o=+ilZG\BHy 954E 1wzV}b0o~w7S|*o:9u>tyzn!t%W4)bv&٫%ٝW@!2AҞ9md!;9+ ,k0[Xz9__<y; or<SR?k\a2Ǥi7䫷u&~V88 Jͼm%^ضUI )Xp {zl+bsv{Y=W9~p%O> 8keTEr=^V@愫&Sy߸F@(A6~w)औm^+k/QI'z洑]Fي/=3pyso[9[9k4 ZPOw??} ˻i7O ̗Kq rE 'SBh<끿pi{(q)]rpGMhY/p(i_;}v3&Ui# 3kBm2r(Fk>'dM_en=gJy_7=;4dWرl^}3+'G3fX&p9O܀Ϲ~tX< !I2>Ɩ]P(  999)ӈl'QdȔ'x|1< /HXzHi@.iof{i=;=6s /24!)/!t.-zt¸/[Ɵ.1Gs%jJP(Hiiͭw_zХB<5X17cFX#kfr )Ț=M3(xs8tqp xͿir.L pJO<{i8~ cOkaKD&,*,ӾV%ky(L8ءѡ( MDl[n b~)wy4&%E3߉cC(\4_Wf6g_@!C;{ۙvB.W|}Yo1!Ѕ+#cׯsY>/<:{ox4\Vf${8=M: sg|URFAq $ֱ裯h2.r]u%/K3oce)u 7fVp?gC"}l0ZI !pSB0Q,_~M?p$l+IPE(IR4xsb|ݧphZd$v4U•Q?~?~p9H^2ek҃/# ЋCM[ʌ,E%#\ { ϥY'I'~n>[¦w`,;?ծӱ߇Jcq/g?ۙ?(6-%9҃#.əW Y ܥ˽˛iX1agqbOv s8~{iy  ںm-6H0k^G# .JΧWbɝl/,BD<9J[p4| |sϾ4I 2Ky 94Gb p c1m8w.M6ѥ Ѩڨ\}x#N.fbcy9.J?*ooVEhɛkOgzsfpN=?VT]"0!?ĂM~nL-m#$\ɧuQFdZ |,exoǎaـ;#:ξ/>zHx>%!yXVH2J +[ O6bh=k^AcZ̪wн(vF()q~(g\uA~_&{goTK XzyVR-Ytsz`l]A}86$LϾGaWpϴq߄oIt\ :p>>y[Yo3>Țի2FYrǏ!h4ʺuXf-ڋ]|siS9?|=}wK޽J럘w\? 6<WT^cL#vLȲL^n>s̡~Imwg鶗dS?Y;_ltݔ7[vb@BBvɄA3WWޔmF.{^୓6Uձ_Ƣ]nrr֭;KܹH#f`f˽`;pv{I-CdgH)))! PY|-^G^8hc{pٲѭ>v?{Ep{{B "z.+vUP/Ei`CPQtHғI.6_?gewvvۙ|,g~kcA)$I{!xMUM/pr6￀CK͖=yQtaΟRy*2A%߯xl<|'FD'v/:1!mUһ"zVg(Y1MEg۰X,HH+.-lw6,dǙw^ѻvPI9G_e?e >ߞ+g ZN&Szl^ǼzzЈ4 BBBq}x9vBBC(f/;xz%|?$"\:h˝w}ׁ<;N +eX׶qW|g-'mɩ/^Άhs]1o8g7On"1~{7}9@fa;һCڴVs̖ wVf?ӏ;'gvz=V?ly1f4-wߖ{pWQ|3&UEDZ;_91KC΋?SiY5uKƍg;mW=R3ψ]vq!U($߫uUE!=- ???.Wu(%ؾ=Zb\?~wjmĸVm|Dx^em6(Z)_EjvNF-V'A"IvUJ9;tF؉9 w55C&?ލH.OK26|Iǥ2Նz$C8w߈u.-êf_ H9niBI]x,~lR/e!zU.TƠe$In@T _m?C=]pgy ,C_T~}3Q/H8~i׮f2i&;pa7ގKt@mf߿xzjFPҏ|:^NZ*d("Mo<9Al|3؍X{d,IgF\VEFWq,aڎǶA4\n˼J$-!CUK|xJJOFI^#6607X:] Xd;pF@ҿh(o͕ȿ+^?p's$-ޙQLn%uOջ_2U0i ~xvo~? /C>~8/E`T5bt |JW[K%yH-dRטAXG<=繨(CvC7 /Q*<7ʍc CPcz>؍EOm#9pqcUG)nZ\ڨHfYyNKī_O#19$˔$bo˝zLo}_wml( . IgD'tv{Q풆Isexys%p>HMxy MH`B3w ޜYTq5Z0ESwvNFRa/CUәY/2㧣Asc=Gjw a]EƱ;,Y @I?o7z!&qoɰFI,i ;#]YI$:]D tx{s9Μ>ED*0ӧOaˠjժE߾"e+wmN[CӲ##gNT`~3Ia?NLIm3ލQ^3,țk}h'&<ԑ~< $o݃?RmbKY@o`G{^Y@BIoq)<599 yV/L3o}qKO3nVXo`Dz uB|"gRF?j)}7Rc :_ο;{L%Uf|8^AwXL7 ոwͩhѲ%a݅7 ƞeԨYժUʭ+\'1dƮpQW t#7kzk9dYןZ" -oDC^iŭ/S>_(hf@Atz=lvOjծMz1ͨFfϭq߷TV`t ɷ?ep`W$7}r\yϣY+-w= :+œJdZR csaBBBȼܹXc4ZUZr&n!߻=/|k^r+ÍWJiP2O|E|ERRR8gn^j%,, Z%U6GʜЎY?^9|r+õ7WJԕ$ ///f3vɘL&f3EKjWA/[niwӠ|8Bp\8"uD;o**iV%l>|'&6o]Orb2uN;xJ,yQH%3>]oRE?xrk%YAyq!p*f})D֭9uˊr:zfiizlAp: y|,$X1!RlczWI5ѯeE:ϳs{L*S&A2(ȫi#;~^0222r2{)w>1SJxvtkR|=y]<7D 9򰬚ewГByzmiqsxL˝>7mѹ3|W">u5 <ӵ.~: -M;igJ{<cڽ{?]3K3kIyű JhvyUWyUHOOUM@@騅4(l:~ƚp<&eX`{_¯k+3^}er_x/}`F6Ոg>Bd|o2eVƍ[߇~#?u-7PI !oRAfH9g{iX?ـ$VT: $$z)ƨҏ: x %պukf}6(p8dTj*$p8 yηdmfE|? сޏN4@MŢ]~x5v#wo'>ɓu;JXòJ)$.KA]V%ik;T࠹l Ţ; vC9k ^$4$Yu <v_$3N|,އW'jsb RPŭ/غu+7>ϊ%,4 3Ȳ3gϢU CMx _<[ۈ7ͥs'cyockʢ38:a2 ]mKˡq,^u=v}5sBPt:dq)tz=y|N>IFz:ޅކE[QG{ն KtЁ=WN>ӧU+q ` 6,۷mzTVU܂.Qytt\_t:شi5 Ʊ \ϊ[_ ӰM,:>9/=qʥn?S. h6* #Na^Jժ M[(-Ct -%2ǂp}+f}R[VT@ X4G"4,fvsb9!^OjUʗ7y~zs|3A}e|!et:^^^_HRJ PNJHhAA`Z9K()ٿ-t!uL*QG$ad6np d2b6X,9A(KcX^PIvgBU34 Y 5MʾQA>P}%D 7A+F4( B(,/Ax%BRj EA('6K4Ery^8`(8•,vrRuA)grRg1 Bc fy8nTŮ/Txt+BzzM6tZu34߽{ T4ǂYz%%5jժt:qtU8{,~%̥p*[8gu WUq]hvLJJJ>urC{=îҭ; I/|]RWzޠ8v.W-Z`t\w>*Q=|,QQ m׆>o"M}z $⸸$Xʤ'QtJ_aخVnL9zAYZQEnPːFYiinIeJ-Nuc *tLՕOrLSS(H~OԜoj|cҁ]z[?. |[q\Ȱ{|KQ1!tH߉(yWmX3 vDǮxlb݁_>ܠ#ݹ?PIu4D 85=ݞ {2+Qv&%+c/ ]8{vS瘷<徻;бݓ[h6bVɃСs_FNSr(\'2\&BQWoH.tЉnc̢S8=lq\pgzFS]o@g!><=v(ՍEs]TQt89tFǨ}];e)﫶>\2\Z4uĪ~P,qfꪟLXkIy% dzA>gξ?p6ح&1,fʟX{ܝ0W}y)O҂o#Xoc4k/xYp 2> }~=m$a&38cKpSۑ,<sٙ\Zg_f|{űWek'e v/?7L^^~qG#~ xwAxk?N9S" c%eBuPRT<\aiLU{ڂuxV>zg3ʧp+Iiٕ*Z"_j\tedOtԼ6^%Ԥ,?İagn/+ 5yCRKZ#BݲӅ(xt/VovH BY!%ÞmNuv!7M؛#g'fºP\~Cxc%d䁁-4zQ+N%#ݜorfY`Бid3;N;YNH FɈ3a'`SyWaC"+ゕw$+3&%-b`!eXm<߷3;z<8▉vwPOl r*r+)U*]ދcf[),ȪU%4i/|JJi%IP oݡ̿'9׍ h W&}Z1mtY3}CTӤKy#a y 7NǚEʾ4};sYp Oz/ F :sY_/'#3*'/լCńWS9=Sݻ l$DDz% yޗ+"KD1Xp(6}ur!#7s\ԃp\VMU/^\vl/j4UET[Kh^Ӑ Ț;3 -FT&;inLÑC;x6d9t 􈞙^aە|?+{ᥦr4%7 U*jF`WO3m ܫ:b@nчaGk2*jߋ*~4pprοrreNJ6#\zA&٧9Flqٺ46s]ѧE|vW܅C54MƧaǗ7TElHITsYm\X+]/jߋ*ۂ~~es򟸓>ډ9*3)KJ/[TA6e5 T W8.8Gv\x7%٥)vbe;8c~Es]lae_XY& y?WwꃧWKᴲuyɒjf.K>M*7;“_hS^!zx7ɇoIڈn"l٬44~,'ޞƣ= 6D,>|e sf0v\9zƭ/o/˻4OMMݞaʈژtAibufIG@G:SRʠ3\1-wp__1}Nجʿr Lq9 džC4^E. E=Agx f/ǰw/ lIl {f*nKE,s)w1wg=Yא 5/.k}$(#%ZQUUΝ?O˖_2nǏա鹭} Ȳja㯿)n'$sD BKa4cF^^wSU 4@uDSJUܮϐu;v I֕~p@ղKq#X(v}LW˒}NBհ޹@&nwtzv;{vjjjhU~jۮ]ys%"$4E2xP1YFBt:>$xݺhִ)"Cw>.o-#Nh:uZXĂp $IHYL&aaHHٻ-Ymx{{LXX(&T}ITTU͉ˆ8OJݠhZ4M*Hzv7 a6Z1Y*mnXr"œ2 :ff% łl.v$1Q4PyE 7O4U"P[P3eAGӤSxOD 7ԗiN@*:Y8Kıp+v}@_j=EʉlcFVRr6\|BʜNpp%dLB%/E)ӴaYQLQ$Ӵa œ2"`{&jdJ@ıp+n}]^+ATWʋ8nd%/ETV$~+$W)hRfzzcFWI*jTPD 72_E"(A6# YJAAC B4( B P.,/$%%qa6,{b)~̩f W:.J JgG,iؿƍSt//A('OQ32P˕Ύ Y6f'NҸI2%RȲDHp0V/qv"W!$%&9-1(_ZJ&<ɴi4xza4J^2[,XDFZtJy~h-?]͟qaJ}"Z+sʏRxi/~:&q|%K.g|C;7m I曋m;+rr!˛;è؜ɋpT6Myr?&/^Op,/9ϿJZ onRSGR0[$ h}Q5m9ۅƬd,1&$!++xv[('xL!4h$AA, t:ºx| gh|`VRN[m]OlYF3G6%90rG+jꑍ{^r!{]su 0l4"{Z>5ek301`dS26vA_3'Fa#d!\pz*3$/jkw4p7g E17ޝ352TOল I)%LkJ<†=:?CP)RRd`d(֖ز}哻y_ ,h2܀fъIti.Ɩ({",yjCŒ!P;{&]Y.(KF8Isg>@g ƤوUPRtR7mMr_ MjCR)~.A/pX0ԧӠ! :kVz0w9V|Z7M3GݩĤsRq&nUjL|ŲX6 n5.cUӈI/xs)wmj8yOiDx~ؕR2X^iaSМ@cA \99 J,܉8i({$P!4eMI,ZT7`?ʎgY3 YfN\I{z^m:nP]6#Zd Ĩ$s"ՕOEYNͪOb+sNnvIĕ!A¼I,CKCS>XʼnsEYfB;$g|m:u4Wʻ NzƗ bs`_4i[aA*PwRuyIz+L[1sind/՚vW;ǓS&=1qN0EҢۓ4lՊycPmǙ?jbn#]7!,]=[bPh~tE, am'e>S?_&Oyq l@vɄm Jq~n04_^Â%av͈fDN5Ce2=U1|SF7w U0*$s.煱x|](bG3b]xp͓=l,㩗wbJ$?gxEV>\_:$fڙӈ!111oP!oߥ=6s^WB PGYo6>uM]wuL*mLeFm)rI"cKʐ @f,jPQReF~6;& I"p4 ͎djP`a) fh4b4ta+H4Epb ,sKfIIKME!.(XfW EJd4b2 hz%&k B4( B P.D" Ѡ B4( B P.D" Ѡ B\)/Td>nG$$Y|$Y?US1,ԯ_??2qѠ"%%Ύ YRS8x75 2%RWQϩwXŲvkn|%8lMiFUG=9D\ ad+/?ɒS5:H}q^=okoj.aإJkYpY]g1XyA;f# %ca77 =ݜ-?:ALX<~sAd [2~M'kNs6e1 ﮁ@RC |iAR؟bjTS g" lp]?9+?.IKxh잒J?ΏL^)]/z,3["k?H;CМI[_}Cm͚x},ҖK{h>9dKr0[RP޿17cdb~{?\m$o룤k Ws· ]"f(c 1q w\+ynDWxQ%a4j\k.A֕kѝS5u?2lD52%NFݺXOͦ mn}z6;u (8ah0TW"Nxs;GvB࢓, =y ݼnΛRmMcY/&5cm| az יrlPݴWAgO=3}0S F)N/KO]ZT$/;Jm~aW";7OtԞo!٠`J^6*0oJ*s8{h,,mAK|Uβޛ݌ oSߔ_lx8.c?8*IMdZJlN &3dcw82 ;NP\ؿVs67jiԠ[2ֱ'2km:u4/'aƋth| WҟeΨʼ%MIO!{.mϏ'eLzc`E'iتʰ6ѓ2OA0ۗ;vn&@" 2>Gߗװ`$F~]3_Q}bME=i+fp.͍lZӎ9FbEHmD9lgII`;24.|8uI3_bbbߠ>‚ T*GYo6>%HH3 3ʣ(hP*(JS{Kp2-mvL&Ty imv̦T h, fa41t:Ѱit8l9M%T ٌ$ˤ BQ,f3+u"a21Ņ5pW9 B4( B P.D" Ѡ B4( B P.D" qa \AٷpݞR݂F.Pϡ!? FԩK`Py$@HdJRf%, pcJ9F4(p(ַ* NJgТ-l/$IB+o*FI?Et4l3)VcRN:oˊ28s(hPJjZ!!!8]ΜUXh(;oY.xPy3>}% 7шV-=cppӾsDJ*N˅i:{O$%5BS֗pjى%Kv  Б?L{%䮻ƲXIi_zlMѠTQqϨ)ĤYxR2ڴ1M[IQSYcGsv;{chѶ=a=&3o:a疯xQ:#sBgY;vcD!Hw6(xG=8?'Oo:Vs$>Bhl7{\2K2Ϭkȇg{wmڡ+Ѡ|D"78/[{>aOOnQq|:nwi:N͵x=/]?Hn{h*?vf-j?c| wȥޗ(ma Cs?q3xtz"0X|H=϶q< A/Ż`MPׅ}g3xFB|CBoʅػ_Vd=|ƽC492'VβbL9׏=˭oL*AI'ϲ ,4Y1# jJgyt3F=[*ScRXiˠv1Zሏgߐ{wNOz=u䘘"T2b0֠Ԗz$cmw̯gmBO  %a+ 4AGdӺxJvn瑩lOg:tKUFbڰ \!]%vx{H6K:5zPQcٹ " R\66;M UKt[}\i±<>-8 xҷ{6I*پɝ;E#O?!,ʩӸ&mˤ %&}܎dâF.b@Ƒ_8@Ӝ،mp*Yh&Ȑuź΂QT w R%_/۾;IyWk&lG}< C ~g(pGвN0G'-5Tnjw-9sGeJSmBנ|<μSS]7du]Nê0תUtLs,3|k~g-Fr̡r4dk d';/ߦl׶8ւӭϡ A+?M5pVTMSI[>Z5oX4 Uj7f<&ɥcٺ5^\Q5Ûo&׋{ !1T'Ngx; .0mG9(Ix7̪1NĿ<~$8c%￶ o?/d)6-Z3[kY  '25Nq8n ɯ8BleIljAEn5cԏΉc hvϖpqK'ELNgy-nSO>wٜ|z[qb?*ڎ{:?,Fg2Ѕr˯v|ʑŞ#~2>{wfq&&ŬֵuXJ[*MӁ<Љtġ=^tc-T!N3s}Ҳqdap6&'gYVu/ 3UYPDJ+d2<AL|_p>PhkCk}tk+rdY})/,wq쳯i ޺!]i|km&bV 9WHspS5jRCc"ϳB+T=r_"[[msS~d?9PW|77oaY/b"Zض_=DK{{Ek72;:\J chiq:C8ӔFlSlYr9-gia" 7BQVP#'[.'ײ<]2бn*%W6X8I4 g -3Ăr;rW-zL\ֲR쓉pi g%\k$Qv7!Ng5 c\9J47ϔ 'QzIUH,zTh; ]dL$",osr@5(&<$cr!X,7;i[p֤ br5TNoo6ܿq _Kې}Z{w 3jMlG?gW֟w"~7j\-wMqz\|8}Hs`sϒt7sDjFuÆs[1ƧGбOo]0֞94oT]ad/a/drPdaY" C}TzΚq9#3耥KI ,ASo=[{ou hH8F1yG>ɶi˖hñGQ&eR3 Z0Npbrr|Bs*413dob6m'9iL^fޓ7A"γqR긓=aDB ܵ+p筀Dɓ2z][: 񙜎 [`h+!QI8QMQϾ8*-J`&A:%w"*\C;ʖH؄kcCU2j#,+G!`[@ŚwpmsDU0[z)0qCdJ?*xicd%<2m2XIٓLq$#r2okDž:HT3N9ުYq61ژƔ-X=Fesw ʛBK T^ J 9~0$,˷C5B;ڞBO7i`JǨ$4HFl(n#%iEM;V 6CONa? mLcʶZ9o5d cʂjt$5|m~L~8Hȓ18TOu ~~yScծ1sb g~D \D&\81%S(qO |O^a`Y5g`FNuy|Xk]UbU0=!,x.+OE`AGꚜgv"ACm1TVl.* Co? "@6Q]gQ^Q=lK$ \KM^I^nT)ӋN l_\NiFLj~77N t8a&E#4 CںfrCY5{VU6OxV_X$B,b'%/iwK JvK&5dte ȳ7!*GAU\٪4.,m8%POPSYm݅kWfl%M }UXQPK"b٨ʚP{qۙ]¬~BYd9n7`2L7z"BopYdEW?8Tgl9TBhUqi0TIԨrC#Gϗ[={ʖwZZ(TU F?ޮ}*)@8Hw2kʔ+2.Z{59·_ko(i5~jqTeZ),ɗB}kH5=,%l2bJ{q[AY:|{ }Bz%5Ӎyv&1C\Sc  *RȦ,sY |sэ i' 9|+9on o,=6qvD4 />CMnEbp0E$r[;1ckP"c`H$[gq҄ ˯@X"# .h Pxffr;4-ت8trZA)]É->cI_zÃUӞL~[ţ5չ9a_F#jeҼ PGY -!S${ }y\.p`Ux>tTR`װ_ya<.76cL2/52' mMd3dvm,Ч#@A*i*()5͚>]42e;uRuiL 0&׻itJ!9?&p(U!̍Y)i>(XaWƕS!R{_YTU(=Xk7XsgX7dwb\z@kMZIp8̇~ԩSѣ}~  ޅe H j‰$x):\%L+ضG&\$χ\H֖[WY u753C .x@JP]VDfKe]ܬ E~v=;㆞z -՛= 선!@$I {MuY$R DdW[U+pq%O&m&&VSvy TV`k _sxb~A9:NbfD )dk_*X*'1]Wp x智0IL|$`mV*{߈<&yMl>?˕؅-c]{ńVj۫7ٶ[. =S<$&RdY.F^>Ou`=&V:16cƨ6CT )ݑ>#}X Wh1NV1AwO;jG*=}ӂ5c 5FkCgcjR1-zS={ ~ x|k;67j&M 5^~Gf/0zS{gsA=iUgЙ 7g{?w t3m5 jjk}{6d-6W? _ BUtUcITзh D#Ѵ[}]K DIPUAeňWWl\v|4Os:{M U'0ew97e>Ʋӱd}h?m<&ї9]~Os͘ȴcgpl\Tf&)e9[cr* t8d _q40Y@ұ-,APlC7c z?ؖgIM(Gg[`' av6l%f66YK *||!e[}_zBsoJ^Ȩ7KMS0ɓ)u\[ZoKvct5dʗ7v1E<.9FQTOqlc^VMNMIZ~kj2i'4/QReܟ=FvWN΢o6*'6}1=09u|{M%*NXrA.{V%~Vx 8Z'cB+"RS& i0 may lYi 49/3%Й^x26n«_M-s3yanl2(sJH{S~+a9'j>lcx\8zMvjTU*DK(n:]6*] ,_f6HPJS&{ywv'-!Ǥ{ɳ& [XqlXSZRvU}?Jgk@^JMњbIF~$͛x7~y?k[Y}h~Ϲs?fө"7pUW3OXDKOx4Ng4aÆz)7OK.툅ʾ5gbW<{K/gkkɧbԨQ^*&RlZ*# ԄcX'+v"&+..VcYKU[b!;h,Gخz}#Ģi9Tm"wڟ ?ځ v,Qu JU,<7]r$kc[oQy.]?yozs2Ԫ.V h@Z̺h_x * zW,__AC/QL)KW'nE]4PwXe0?̠cfEB,VnS 0uR2|[F0^89 YҹfTKRgW l25.T[8e2KhֲHB8H)ԍeT?<-l 'mlg\ pqlf+˄mlv6wܶ2l -gA./mg$Bw̶\e30s`̴5q-muIes %Gخ٪>QP>!}ŵmuc5GWQc2<]1zZ#rIXa"ؽ6{tA_#}܈gAX?B_#°ޯ/1*Q'f7}CNn❱l=eGܤ_W[}رo=y?'M R !;O8il3> j6nȡ҃%ⱸ3.Kzynڴٳgs衿ꫯ3dgX,᳍Q橭uo{2g9XOUe♕( M$WRgW.c#ܧFf &+wGt}V)'Z, ʪ$'a{edRlCWSc3*Gpu W.q|`/k+8䌙 \ί&)>BUlNW4|ˬ!g\@_T噕rUbc#qO ^?dJǽC_H=\96B2{Ӈ)ѹ_s0%廈,ճۮRJhp&jB l Cxp@zI”`̡DdY ==>Jrlr)dr~#HSe,۵{ЖR9_BB^rBzI0eLP4j:vdFmMĒ1l I*HJ `QV.e>|8z*7m$w~U) v-Y'ϟScx,M7Gȑ#y'YGb}-^6i =ׯ[I'O<.f̙߯'}5$YV3o'|/`CUcXPxQϗ`_ѹ[R& 6T&1?A̾MZJ#R- N.}dI 4* /xSATi\gZڎE)OᷗP۴ ^'d#, lIs~ ߡ=0 RLp'c2b3eMRdt0X膞t#W7lmʼo6VT!9U|Rz>:sٲ|-\q\yU^z%0$&X~d 'Ff*lj*LJ8lfG )qk``udb nfx)0^|CfLa̘1 )M=l ,15?翼d>k=CEﷁ@V +SF0$bO,_-⽯-`" $%ATΜ}6QYQ%ڜEԦ5=U"<'o K?ⵗQJpڸr%$Ur GlkeTWUqǼ+k~%#5M40D1.x0X296[%gyD=AS&d6zW'|@;*QJΉPcr٬PFU61Z҂2 R m Rji3Kv:mW#F۹$fKOZ*PY IDATnd4U3=nO7RKh?Y?X{_eM|@gB>45uOuA*' ((WjjK0[E̸1sʄkyiEX+*X}^NayҊ2VO6)Nu<O-(b[>aD8xq7S2vtNzSn?f`lް\hc@W#ϴ˦ /OH B;9˜g3 q9I*f#s:l^& Ĺ;]@& &(UFW%L{9v~W(㱪ܜg;3Rë|[$1Χ O_xm#cL}-w!8Cw$9Byo0Ws+`bBV^}<>bu _,CltsmgVuM"+BCr(PR1TS*?jjIIʫ!.Ϟ xs9J`ڞ5JeL0D)( YTYl7b9YA,vںxd呓rз !@/#Y)alj4q-lhYXA^B%wWI{^s]Yzr˨R7u/2w&/[V~LDK`Q豨>BGb3nRCV")gK&YKfq\y|DžLj?Rr td6PA75yI4Kp`|3uN/lc ltsdoLq94WBuY?|O( _ugJa:̈́)4oiD^ `b:s_\0xgM󩏛M//90NR ~0qIX1v9KEX]%"&-@k95Jo"aSՋy|]*QJiBloٶ|]-kUCAiy~Y/mWJIB!iM@ z6O-u@`Pf'\sHJ_//k`~)~[ԡ8)V1}b^lͦZA}F݃~%<'h jTǥ5ER]B]%ң4׹jD0Yp? L 1ưβy~ݓ)}Vk>5&ϗ]£QkyI2x~NKvZ%&#{]&JO= [6nSJȖIB}I'EJގ^0iX@Vc Rr9`BYF _ZX6H,CO'EPh[:z 猹`V 7ıc6En^%eCIvuab6[EAq{/Ȫfړi/WFH$4>/ M8 ֺ,Ȣ8ǹWQUe5J"Xaa гw.viBX,T(X` -I.n!ψj]?|BR9|CU<4{'XOpD 7C6җ X ^{N:+h.OTD ^ 7, ,)*>*EeayJOJ2W?loL'?JPPd]5 _F0c+VmUH3i34"oN2ҮtQIx)15#*e㭔&[hBy=V2BmҹFhkK>):.9F̴GBV$H{ K J1yJZC~%p1}?6la޲"|NfN yj [n ATO[Y= f)]@F+P*F@N\,BУV*'t5֖>'T P'aX-k2@dR,e((' :vZKɏH-7Ǐ䚱x_ A6i,ópYG, Z r^qKQ]SpКc8.d])FcФsZ8Adj($AA)+q 0q26VKU5IYsmb!xkCxX]4%?w$L)S~iu%9g_,AT/ [kOM3Td&j}Q40/I1Ty+TAxf^SR~쭺y%ʓ4 %Oc*fIP"}{,jw}7߅ ))f6lk5ˍWg ^'=m?jy:ۚ>.Y>Myu\'RfA,+ǹ;FY]s3VJc;x \fk{[S!Ώ4w |7鳃П{gi]{n?e XWЫs>U֫|Tʣ?gmڗS[)V޽leB kMȤC|2O#Dífܬ 2hO:S_#'M31 86 `[kKdΧQd&I}i?ږ2ۇgj-ӗ (/vVSKrS#@fEx+fI(3g3<(5KLA2$Zˮ36UCn C[-|2٤S[&Hj9 z:آ eJ!M#^ 2F_+0Yde'M'u_w: ħ q~yΔʿ[|AfmA`nv e4Z>Ƌgmdꗌ:G/FkԖj)=Þm/`up3'ei`vfwxj~>>gϖI+#~r g̯1MN)@saY22?KjehqfͬՎdp_Wz m^6IRkWY][ti-J[ \tlj!K)9r[BQ=OEyjX}k;50ko[.1մO9 9o+޼H 3 1r *ճU=VuY 4Kf{'%oG9tWڊ~MRgU]^G7VWߠC@WkAQ{lϖi&uh:IՎJMvꀪLlPJ[m:~Ҁͤ]f[ 崨v1@jtxj~iz&{6ֶA~tEMU6Ӯ HvgH]Z***۷/C i#ꨇ N[]]g 0edzhW!xX,*RvP{Mÿ]ee nmFR:BGN6h^v~] b?zl mZVXСCi6Q;w.˖/gi~,#n:JΟ76G(GZ! ҷoV+M[ۗ*"eDώEm׶-+ʁG<Δ+#(//䫫()-%ݽL)NN@X|(&TqQH'<ŘRb'Hx;Snr)@^(LII v h#|#MDF Ȑa`YDT/?4C1dH&~$x+ncG0:졿?M%q())!8&6־Jx[+!n_cڈ ZxGnHvb=Rt*t)>څFWH$BII UU$Vj%9zs:s8E|I>h)lKs;}qJ̏;[-l!D"D?ݶtJР4fBQ{-pִ$U@2PR'|+S8&{ZJ ["D"3ws) b5Wx0S@DŇq6q/%^c1xx3|#482axFK,׳Q f6TXn_00tx8q 󏺕e2x@/'} xO]ql[vn0&ƍ]9w=h0c\N;fa g*XTi/[J}P 5λ~.n[7ƠjmwGKz}( RT2]V:|#L)tߗߒ{CC!XblQl||=c;Ͼ%-uuJ]K4o@зE'F)sٕ[*`k]^&l,K\#g(\:e!o ˹&xGwG:"v={~Ѧg%$jCP9`@t:gOč78`Ӱk*(c $3@4N*+6Fqڮ?cL]ܠ]P%Rn9!Eذ~]:/YÇ6I# >:̓?~q|w5*X<gL#7KOzeaUт>ݔL3v'v]L|;u'-~ũmEW w3+SOH5-tq8p YTSSSMmmM 8jx:R΢5q7uSצV-y GW.2p@m;Ie?Δ.ێl!2d$w?KD&iݯO٘_̧jj)ՋX4J4M)h$B,**Mu-߾M[t&wS[gٽ7Zסt}}v,jQH%A0wjVo ƫhɡD"AUU%%DcQZbh4JiI UUU$[3~YW)~ ت9xS,M5][s6$7NӚ i1W^:{uuvo)<#@)<+>n+)#d-vSgPO=XB?QDqq;1z`L;?wnպ/8[Y=~ Go$*>S`ܰA =#xv{0|+_~=k%Y@m&aJ|v"`SGap,Pi@/'W'Uq]?o-o7ayUȟ8ˍp{i~1dF݅XAgk-ph,֬UYQɓO'2q}4oMuKYN [u~i3?Yl56ܹݱ-O?zkKV+X퇭ϭ-GTN/}b$&(UUAnFWȋ?D$!採8m5qݹQu_|6XɕfSWq:3 .[~u.s5Q:u.D5_ǀ, *?{#o>ewx$>MѦc}NE]MsU<:s@玖KʼS>nja(vcT~쾻pƵ;Q3)VJĖ?~7sШU8^㊾ˎg1᠋xne9;/ǝJ9#Hp[d_췞bUK~l=g<F7!8Y {:^ `.94ò嬫K*;tGz%i'9_eN$Xp!C ȧ1YRDmە/)@r>w8O^燈Mu,zb9I8UDDW:gVK ,}丫*,9Os 8rwݦ&N۟s/?=Oq9,jMen9|o=a73)Z1~x0q)|V,q{%yνZ=z1I'ns=+O~ /~dڔބZަysc|xW ʊs^;1yT<֙w!n=p讓og$R{8xxދ9riL?56!QN+ɲzrLgfAM򚍮Sk$w;9CvĔNGc֌IL\Xj }D՗]ʯ_!osi& eW,#YW#u-fOcb+Oc w,V1c ;Izu $yԃytn1s(ȭ_zÏiO,ʵϾǼs㈏w,q<{!ߏ)td|*!y)U"p90 @ $;^du@, #CXr>}%D _&?ןK2^݀~{rLY^yi'mNnjh3qaSჳ!,. 7G8+a3w7N]'gǐYr҅hѳf͔0N9n2 X9$b>VcW|ʣߔpy0(*f3ȼ9֔/6Sc}3`vOeD:r[ͭK1@Mb-M\'/Q;e,݉_o{0=n=AsSp 77/Բ{2~`!,筇^rρ@tΞz5#<_ а݃{ !˧_0l[^egM|} {Ncʧ0 ޿fָk;)s^~n_{}s 7`Yvۏ^"B@x|?Wľ_CmQEF5"R`5k8 ރcϹ&'*fYI-N~x u-"؋Nm⻇stD]"kJ"0o!ӹQ ;SҐ=,m㉧sإwk*؇'޻^1mwQ]~7JBB&R*tT"E)H."EA@@jH[# l';3眙s;g㰕Ԝ4g ӂKosI)J1`;C*˒bcudYnO'Ey-rEAקs(SAD&};);Fp4cKr:i4,sE{Q6K]JTG\U?+2tx<$ʜ43~YU~1k+/(Z8J743d^K_9ώ৾Rޙ@ۀ+4=Z[/3z>l4~͇+W߸ɼRm ɪr5b X3K)W9`:%/͵8=rM^eTRo1A㹕 vsye32mߐs/Z[geyXLȏh ym+x.y)q hɠE TSHLZ aL0}hd1~5ZmZ|Dn)D= 2.~mL8oUj*Ð1:QhD|sJ^%EQ5t=O/7^XekY/3X?L.ՙ&ں7FEgi0k{` G!W`_61q=ZyۃqmHhf6 { :KE)sEѱWO0 9QWá =d2]wUzp).EZd8YŨ`R8VdޏMСCILL[ :4mZ1CK=zWϺſfB} sOcצ+ǞdϱPb2-̀EҌrbOq)Zc 2l'<9դx͛ǕriY.w-G^Kzr ͒ſoLݻı7H@23)ppv@|L}P-~șlŠrL]_Se/C!Vn%cIزrMUQ[oI{S&~m2Ʉ^CHz9F]'>kք> .9P:[vg]gߚD魳%,/Pk #OE?\1[q}x=`J_Y0k"-{ᱤ[Q^ԺBaׂ#w}ŲhD2s|IB^XG&sEW&2WGNZ$YR-sڠhwea05q[FөIz9D޸*YĒnE{Q. ~C;/YH_f܀ͺ2~Khzܼo dGܿY^.)om0_Ⱦ=Br1*nߺi9G\^%$Kʅ)o R0|̙ٟO}5FDP% 1@xx84$5%%C  x~}$%'3w>6rl8s4()(JD`+idIK"5k2K^ WWxi?.Γdu|S_=NX znnȘ艬/$Qk49}ʕ+x,*_"k &!BUNJu"YƮƧt-FɌe<BAdd$*T@4Ɉ=, 9)}J"22BQK J R2D|u?]f/6op[O忴^(hY>QÒ񉒝'ǀ }7%Sa3(?* 2 ;;;B.]F^ј{jRSS 2ٓv7 >Zz8?=o/9{2zqH'D;lzϏIGd־w|BWWGP` ^^Vr%+TPggggܵ9Wz7=3fę?7)GrM?jqV>8G=$ίN~xPfS~`1SE6B@|kaF.1g.Tמ xySepf6Ly&MkxB[Xpͫ{W;sN?XmϜzyU>Y3Fp2ѲΥw<<<:yxx`gg'5@ <5N7h^Ï:>-"vUٿ>*{ڵ-w`9Kx.雍7fMqY Aa3$MY D>XҐ$)ͅԲtʕjY6u>_&*rY0VToˀ3cb(1,)0bplAِ2l2j~[F!wd2 \Txh26U!7o`kH$QLPͺ_βSűO@ O*1I-##aKhR~a4W#<%f cp_1mR48,USXl?!X&KFr*(|qr͢_HO׹Է[lzF#YS^M9?>8J\jPlƘ@ J/%r [S&I֤{ŭr5Fs% \RX1GSM裏jQ:Myчuu2N7{5fT(|KqӦ9ρ= QXՏtb{"| X./9?[ܭ!H3>1ZY A%f.~5)qU 6üӕm;c<,ߙ}X۱ #÷Ճxe_fL'5P99sZy.NYeCWa>UB=how[4ⅷ_M^]E [Fj63(8_ʼu[Bn+W9`:;<'`._ݛJ*9I3St3찀W^V>c}B gW6ߍUoQG|7Lr-2* 6$ @4 pI*W++y`"bӆOjD@g 7xQ-UZ3n@ xV)<Gߧ>^hj~ĺI5܂ȕti93[d/#9%|z6.J] ;P? G+ 1^K+~|Cl吹D%lGcՐu?}}m8 d~]\pˬT_ECN1Us|qظ 6)mĒ\OC}<K1KMM'2匂'/JRQ%`W"ؿ8lItgY*^%+ FP* B_&OIP5Gi+/$1b\>iv ٶ~/l e-;54HFIg9DJ+:l*OwuTĪx#fm~c#꺩6 f~ysuBRY&'ZcڄT\IϷҧO37'\6y8m1E:RNדۣDq lǨ9R)}Jzf}׌_CQ8ͧ!+W}}ٿ\J3qJz?Hユر7o:Fnn|2tQxړ76l )ˌ S&ak$)||~{*ۭc^fl!O92U6ί6p26ʧoBX:}dA$t?iA]s˦>΋1yAnjo)BaV5YF؏-Znbvh6=?n`r3֥2|Yo.MOo#!kwA!?tѢR,Td(I%}vC>k#>ʌ3hfs˞t$<΂|[u6lWh=py|{%CVY6OD2tR2r%{ 2{?ڕMęhqk\;"=.y`KK c7kgkl3w)dUjw>=Ky%z9/xn,8'dN@3 +Lߺcv0~AvK=v0\`~ycANCt-_v.l#iWhȪ?OsKl\zGƳU<Y\J^*`[9dV\_9z~\̈.M/1^'kEͻEJoVu=2뗢}9,8V]Cr/\OC_:_@Zdy } gR*a[1hc^U~q}A8kQ8l##{ou.:ɑ)Y(ײ U\UѴokn6u [By{dkmdgt\횿 jJ FmdnV;g%6v֧߇Hm'3?Zk-kАP:VZ5'fe(f1w=ʨܺ)25}^sb\T ¾)$%ۼ¡{$\e-F$Y3کt /7(ҳ(bt- FrOM13zU]1&sX:۩櫎(cRRyfMA5PaLS-<\)R ;#΋aY5vmq݁87ZWMdaPSFIIcRqݵs3țc e:rR O}-#U޸y$s1n8(.-&_9Nx=-ڨYeoK$Gܙ*aS[m#7E'YPxgodtޜ{MQ)m,:ȕN~V@߷Tyտ\NMyUp[rҮiߏa^A(>MJʉQ2"Ir_N{P#e8<ƴ/[MCb(>ߍ>ߜ{!7 fBU8;Z~{_AGe{@^2`&l`(0UzyWX)͒KʎgbfĀAқI&'=n3 /)-\tq֗%n%0g-C[ϰT]ri2v\K$b4+H$cϰ!ecط PӨj2[R֔"ԉfɒ_ MH5^ ܵoVe]& \;F$C :g8^K]^5=˖/OÖF&KxުARתD~DG⛹gkO (-3ڃDc-[{BK8]NvlFMh7`?6iUlexF؍be֌hq"R/VÜOލѲJ۶Mwi^mn2=ѨiO/;ix`v:dx6̩cGvchN rqLAG& ܊!xcp*ai⋏~) r*ۄZɨNAtOE̋B96\> ^bɆ$^ݸ^W˯SYՌBeJ{U.xdƱ_)3K8{EM5}:{yR_IdfkNiā(2O\+2kc9ae t.W%\wI@s WҰa0))HRAH$MX}b@ Zr966vIS&=XXG$K36;[}eK*0 egBV܋^ME\4uWQ>JjɣNҬTgMQ]z^{ed0R!Rq Y,Yɓ1*`K,@ 2P(T&{RVxJI|]gG;p;w @Y&ÖJ FYΑRf",{iHMs&0$E sK;+CfLyPc E0RQ%QsR'6L IHT7nHF;d8"6:t͆wVEo8Tg lM}x>NU֤jh8I;sN',+]ʊsСMhO!I,:MqM])yFM]Hm>y8Hi79b#0fR=]hMJ]Qꮱ]x)/ӈY:{.% q\=BbY3[cF5bg۹gL9ρ= ?T $I*UI{u mdB!0&rnZ֮Nm|:"ӥ $@opG&ǔs^%RJA$H`66=.A\9.M>eW+>&wƯq/&O7Ou•>?n*,vEh_AEY:._?w ˝o?oZ6_~K ϭT+_ߘ /"" F.rCA.v,Omx}0:? 6]7Eb[v~le> "卓|wPvP8{Gڕ,ӉAe_rvVP*^NǛ(YC6?heT7{E u1>?& 7^f,3|^,,GYrg[!*}?V΍Yz^pEpL}-n|wmrU$LOP>1Xy]](z=*w]EsqPP[Ȝ/`vߨHo GM%]1 #^jMMyS:tg,Ǧ9Lj1Jh.]p/]1nMq a=ΊwФvMj~3wqC^R5zM+ѵqjnƫSfg<+}19SЪ~-j}^#4ń6|!ݺIx15AW WylzR<_1]a=jŞ~]^BxQ5Aͺ|5ǩ,^>ot<чY85kM=\4jRb8y;I>:jm&dLN4}ONēQϩ ɘĿ_g:<_/4nϐhb^}>u)KԎc Dz׹qc/-MPyp,IH >꣉ǭs/N;=oQtG&Y9ˉS4.LZf Xy)9=hr3F,~K] 4pW6DzL>}vZyי>}Z< J5.I93)lCG! "2j[ IDATR)6^rgQiDewk#CV~'yv"r_7ƞa]ӟ?p-5Fk˥Sus0+rP8S{yaWQU3(68[i9vԻ6J[ZK ij&ݮ}5EnGפB'e>u/nY ]g3gFn}GA-q+*w (<^;7>41&H%&MDZj*#'&&IQ0 AZB'UlL$̫YH!^'88O?ĉѹS'5k6tl}#фcVo/O=Sl9<2>| Z [g}|$Ǿ{;5!βHܹWϺ/wjDw$_9]WTgIcNSض<3։f񢟹G޽I5*rdIRDzvO\I0`w(•oҥ3)ppG {p4c יim*Yg^b=\K39ͦ'3hCS5 ;u>[y3hOç1c^ŜW֙@am߹)](өnEI'VKxHLLwFҭ{7ZK ;ԈobfM4H 0逘$ z ^fI?nҗ]$$SFr͝ǭsl*)Jjv%ј$& ɱ:1t~,_fyJΗ-ӹ}27rd\jܞ9af wķ,2Bhnܧ1k\F2I(ܚ1֘JOzL{1KLHei?g&W')ȟ+}Ra]*:ڏvxQ$? ce \̠EZ̭;\1B&1?un[ӛ̟+wo.{P{HINa)*UHNN6{^ie_!9hȈUrcddN<^ʈrlD8f6='1$E(wK 56Ai/|<+rY0VToˀ3E̲=Pl$q$ؠiK6P~sh-(vU?`o5ڍeIHz0F&%<$9G<AxÔJ`&GG>.gHgɞܫask&1i1;^IX1;gE}.!QJ;lS H2qh4B\@Zr @ ȉ!V?g(&>YwLs}u>wҫ'͘l #|9yؐSvp]Xpͫ{W;sNg8Z"M||~ [ޖlׅ>צ\N2~h/ۯmj2TŲ~ab2k} R !ksu6Rf"l@ rJ~~4[Z8!`KneOÆe \w{gt<n,^ 7v)AY?0acۅ.zG'w%p8wGm½ ;̠L{):h S`pmy=<)ΏEDa'S7?jײQGc4ỹum*{ڵ-wj*oE57ru%ZӝKھT{-9ƘI=rTpF m1L'} Ѝ;9*& ވmyã~Q7,JfsGgYsral3㦸r#eoyU.A4,#u%:Ё!)D \ThqΈg鸵"Ig-GGvګ$e΂ФDCnJ$ktiۯ"2)5/4c˹¯>L?cS{Cb(1,CWn" ʕjmaEGDU–Vf屵w+)asGgYSLs-(cVqy-<),#^DqIEǥ6 OL-ώ Yr(q4s)>K9/AG ~a4W#xJ_\kxC.:f2c)_:1+q@nx=}#&QGX1;MZHd&%.(u.n<ܭ1D1\3&RHR͵j+f}USbɲOf W9hlq)psbZa5]~sz_>@ JŁexZT.GٲeSt_U\L{_-shK͎_У'^,(˾̘Nj7r`sf^9\ɛiKxUω38*^nLڎU X\6_~Hf]N`KH'NYeCWa>L;Hqت6üӕm;cgh_6΅kEY+άag@PXX}{e`jC(sXX8>>VVB _@ˮG6/]ڵkT\91@DD$M_|XL&{1`R)_Bq"?G{t>e@p-9v8ի=^.‘CA,Kɕ&d4p@VG0 B]y Ϗyb<[әO@ (O*Q(A_%Zt hw.b3Ⳮز Z(L]Лowew 2D>,Jn,h[SY1 _@Sϲxzy❙kۊO.{Nnc1 ([Ib:27PatzT٘.Cf$OJ)|&~µwҮLg*9R݇6fײKEؚѼ"?PJExV@69צ\NRyuotgΉ!SW ]m?|}R)} GK ’hub#COYZ,&Ɣw[c?{_?pugDbdG$bo֬=jRv)E'Fڳ/Zџ*EFH"!Fyo!fH:>>Js>|Afz`]F n+}*szlL;@ f.KkO<ퟹSUDȋpwqUYpK%?YGMqұ=BiVՓ}ɓi;\90 ws;~-gwp4X0}&M:# 6` ھ!8*5|=6;Z8}QCV |U~8Ӓ}|RGs?֚o\u?\@ף<-9Q-fu]b:7o(fRu0.U %9~ \ҡ ~:'_捘27J)2S–7P9*KTۤ Jq}`Kv~i\75%̥(tf'H]_/+T L=s$aZ}0&62$r;JV_{R=M沔RGul q0>}UU!<}4[Wv'I_[ELj{c#\n(Ҥ`ZsU0q+mq, E]zَG40ܳGFbR0z~/Z4V$V1 %rsltz9b(>0ǴIXl/o%QU4GyZTZ@yl#)WkWZd_}PaW.%$UbKB"M_C\FWiҍ(jңHcSº O^m#rK7Ʉ$NpT%E:B,]ҥRdx`0|tɧYYց{}фatX۵dU`7#sܺ-,;͞\~e_Kb}s(aJH@sU>4(*QOrVf~]غPzl9Xe\ڸ,'v3MEi8.H!uH+@&+eGi-rr8l9NH4J 56y7}'ƱDdȉ?ź`1hnUѕJȉs6,^ˊ޻Ӕ̋9g{I:bpHY\8p"j=9֖[=1 RIc&(M%®ʅkr[4)79~&ob_ ]p-{=4?<2k[*{iNLjŻ Iբ$suJS^ T:9VVշ8ylTԾc}bY对 lYl@)|*t7j`3ooF^WrـH>Br^ĿXaK6Z7 uQ_ٍ)9yM xd;>_6]?ZE ?%ܒW)&; wWOǮ/^k#\=K&wBV=#HKM%%%4$$#ָh80IunFǘΓm'sɇ|[u-kYmBeWc!s`ڭ)+-ʤ!dV9I_^ogˀFxw-%>mƕcغiwA$ TL1"H:䧷rU1g7BupDD6iZMjkWu6jމoSh4DEE HJJDԶׯҡ}{psRG,|)aK8 n B=AAAx^*akcC@Iܐˍ:ə~ۤ-M%<}yDML\y|PƉd4Ɏ> O#1` BMzΞ=:;3oP؛dUY:EfgeU2hNiDpغO:c (N١C"n5kZA0^gmf?Q=Ї :+<6/~~ @/ p}Ӧ"窞@iP(GUNAxqzɫΞ=VM5Zr}<-lϳ;6Q'n-5ښu5u7in/#1p 5Ůܕjw]+P巵gjxOg[зU&<ϡgWkqJҦf!QX^u&^34D/C#'?u~$vt/و)SM[QR(ԌWKSh17).Mu[n=jAtwx/b-ckl=n7lI |]96ݗ֞.y6?s?"OXlބ U<3TʁmadhsMzZ\;[{N~!/SG,Kl[&ݚjKRZK?@pt/tjUr# _*Wnȭ?K%wZ&!`a麼 ϳfi?;T-蒒8z c)V͋!!-ׄdQó,s?Q$W|z-7>=SC? /~܈` $ucudMgL,ij,Otb 9M_GחY'`akE =/,(ߌVke>YsR݃ ??xa5;# =oRjG~V߆skRF57o\G{>k 9[tf:$Umx Id ;I }&M:# 6%B*]faE;Aq]!@" `&XZwr| `Lp9?6p5rdSljcWI0qŊ׈`q>~/vgk26mݜrİo?֚o\u? P^1p]jǨb2_CGR~{Lҝ:bWq~ed.L u.MxLI{; ~pu?hz+:EqQ*F=Aݺ-K6 x$`'&\hv&`;SiWՀnG?HG5>,ߊ1qt0 ̚&`}ss ɜ|vӹNɯ0\|<|{8|%GE[a<ޔ!]EV^ݏeTlloŀ d% x& E\")[a377/#%Z%0; }:漻z,nJSY)Ef@6o0P:toQ'$.1o왵`8>V2dݑDe. /Q4!ѰVF/W+u㸽{ҺNuk%^TD7a;wjވ)caooN*8]b [By{`<̤(j?DŽ`/X [VGT^zQT[)rNU{ R3)$$q⊒֣=>#{=󯗩=߯K] 2{z|jj׋+c}BGN+Q=YIZY~ato`z }EgLFA2^PkQ}l$H Zb*lRl֦A- S|10h.`86f^ה^舃Y;-Ǣϫ.[ER+9Ws1MÆa%>oip2 $ 9] V ß +5Q SgA,UE|xaʮbK#-nI"Mjm~'1 u|0W^CFbR0z~/Z4VЂ&=T-MlÙܑXῃUq9yw!e׫4VaEܯc.4QIlyoZ^X/WP>}_=.#B"TP]UETA;ZN#[^w$ŕ654v Gk]\_2}L2%EQ:0vu&&/fh^>[;e_}uBYX %E/,]ҥC缀E L,}-ݱkɪ1ء䷛.k^BUyK'Vg?aoi _dgtx:;!/Vne'tJBhJY]0R5+:֘\Zv'RVJZa^F6WEگnSM|:¯W2+sО֎%ML%WLy0>{IQeim'u5Ar%C;Uɬ0p?u}AV)A֊9܌ѼME>93qg˃OnpWSm*~^ˬK\m`GFN'lr\TE3C~tU2Ncґub(܊}Icjx~d #+ 'DiNLjŻ Iբ$suҴ 56ɥRzx|gvo@cek\}puԾc}bYDfIdHV܏MQuAمѥd"{,KgKk|5G0RA^v,{A.Hdp׋+cI-;zwTs`q sˤY B+sHjҽ^&sdұs$ɑ&knRCLqQRˎ,,=ɜ0aqqtl'4@UQCk\iKj~WS>D34H2LdaZkQ־y b;gZ tzA5빙./m ; #G.fƘAղڼ$-^Ȅs|y~2d Xs㕖Hа'|+^ݼXbw)J8cޏozpLЈ[0hlO)e'ǰu_>=xMGZ0r){`rr;T҄Kc7-rnkFPJa+LgX['-CI4^7eJiEGljBr([zc_d32ZnnAPV{_'Kq`#&ci }uh56v77$]dҌ))vmiBYr I[:Nr~pD:KX7ۗ2I:;X+%X-iBnWرǖ7ZJGguY )j}'A,z-lq!c})lNeϱ <+kAa-]TLh׮upDM\]]hڼE5e(uvSP qLzRNLWv5QIKܾ}i4nݢ[$&<@xamؘۖp*l&&Omhh]p%S;ӈZ5*΍@v.6z#ay60#XFz!ҟnU{L'Oܸv2&l @mi-QQWȰhL.i2މ6h{¥kP((鋵D99wH>/Y6*Ѵ܄?tceuRv}REF>{fEլGRU>K>ó.AtNcl|&#Ͱx{D'&r`6kMpҐZa3&P(ъR9OBg>|<MEO:OxpL[*#L|ҙA0^0cр(Q(£[*, )|*>`4uc,NXx]]0}a PGj쀳 n.n41RyW^ёza77/Zw OPC@ʯˎnG@hA1YKyv&*ۆD-DUrI@ȼ+IDE/oٙ=D%`S-m$XwS ϊJWyxDe64 $Atwx/UHGI6?z5գf\;[{N~Du)v_Z{ٔo ۏ]XV$'j7 nYԦ:t e\cvýaKNhÔ4 YJG]\2mO9մ?۾ ]h=/rqxu0M)V:WAZ+ޤ[W[&0|Y?u/r*jwU]Ǝg Wm%plVds_/241Ǐ[h$W~?spSCء/?]1{,x3ws*pvgk26m]eK|/ͭKp[Q\;9Ȭ/؆܇К  a:WdrZ҈U9~ \ҡ ~:'Elf ykKxKQO:SR_O|HNxs6ѿs7t gX~ ܎}ʿkS5F_{b%mXg-/1tkA;2=K {f- /#Awd'QYK dK#oEA G捘:9(؋Z&Xm_Ī?W~ZSƶNaW'"@Df Y ~-Z%y}gnToX 3uSWAGcViaʮK `i:QIm_@iU7I/oMvv;0EvqL7|hF~JO!GHR%4-elzݡ$aAv'Z 0 Ow<=i:h3Mzi| -`R ‘Š:&oTaĆZʇ?u埫xZ9Ҽc9bW<|h?h 낒+їkEJdLC-)(4@+ qʬcGt@Wd>Z29匕.љA(&Xw?IZrni⎥qY OpfWH~ck}2!ɥDY} OGXʋsIP:bԗp8uyZ*0[mn]v tJBh'Z!坫}$ĩ;|$a|3uY%4~TeM|H9?۸9$%r;#UR  =*9=yؔ#s e!'^cґub([z*+uK8Oc>08}N*+[+[]{y#R:1E&$U^ I+hbԏmyYx4cZhmZ8G ^wꚀ9g{I:bpHYzw`O,l9 lYh*\ekV3m7؜8p"j=9֖OZI:W$}MpI8ɉYm P=sޚ=e_7uAPlݘz.`݂)1' NX68yA|8ڞ-я?{ ?90`Vޔmᕖxte2brm#XBGR%ѿ9xΊ N @VW)&; wWOǮk|J/w_NҐ!8I_޹ wŬJyݍO/GrWfŒ ]Ri92Cܭ^^ա$ܯ@oAXc6W.*&4+:͛ТUj޳BOtʎ)X?{4 nݢG=.hœΘ  5Nا˼"~9Ig%,  6}j Ư$ifnA[[&0|Y?u/+KhiK:%[Lqgwp4!~qʩJzNmvq"fA'"Rc)í.R,\bwؒ Py^h(6eYhK|` ݚzjFh%Y%7t/޼ѱfNQ&ǼSY)EfDzk@tǛ٠K8`MldHv4l탕 tA|dϬ!e>$J~dPVL1!;a"vE hS~` IDAT5F_{b着N SlF/{|uCY躗q$nŪ-LQē-ZAE@рp;ŕFkD^9nGY8{ 3>ZbpBUɍ0;L:Ԓ҉A#mj#JͲmLf0 ho#Q)@IĖ&hHL f~W/<=p]ϼGƳrC,<褴[)[9u@8+^El4) J~Vh 6mJISP='5 $Tvꆢ.lOSa1r_*EmLlA*TUzA<C+FL}Z S̾5=lR'_`8R&>6n΀o"IHcH<dgt?Q\m" /rKwɄ$lÓ[cmגUD܌"os򷴳4";πM>l%N}='t k囩olͲS}:Ɩ2+mJdWaE.4K=K:pﳏ8jcYY{[Nёq;Uq|zJ 'Nr-?;iNLjŻ Iբ$suҴ YB5+8EV9Ϫ_RHX[)Ų۾pie 3scT+ 'OWjDeuCȉs6,^ˊ޻+2#56yLot~Έ-l B[ U6wgg<[ goz':fgKrwQ[^ݨ,k.c9d=qpp59PȵM^ogˀFxw4_|][ySWZӕI[CڼL1Ʉ^zv=_uCK xd;>_6]?ZE ?h*;ٔItQs{p&}ƾM1A:Yz=QiѢye2kر :V-Zx2M :'FTY;W#þaO.UH' A̬,Lg D 1<(Qxp1jkCJX?LAxS GD PH%RS8'AA(WbR2YzzBP܏%33'#AciZ223CFWCj=3¦XNak-bz9{yyVĤ'AA(֖"[ez [xu C n-; X'/Ooe=xvԏ0 UOt.l9$&%6遍:tLE:"?‰^t88fЧѤ"K^sc[l@6H$>l3퍍rIjңH>ViUx+ B+dN.AЊS_V) kŠ:h 9wէr dZZzƑ[aO&$T 7H5؂')2`@f銕.B>%Kc_Vl&6߰+ԮcNG h9SP2z`R?Ǣ}!$k@}w ɏ:j*UަVS־#o4c#2[G΃l/ LNf߉qq|?Y:rO3X [OrEE&6_X%Sݬ Kt73sܝl5Y}_"yX:y9҂_ka -|>qja匒'M钿y]4 ],;|E5P7/<$–6loF3j)A ꐟ9xQGFFL0Kz2Cu~|u/;, 1;w6;wV5FѼا11t%A9LFG;..soٺ 'iM\JyliŶSADg5Yo/AAש_ X|i-t>AAkꍋsĉ֓g^/ > =MAx69(YQbnWAANl  5ct^mvs͋F2xW!:HcwܽE쿙]4`aԊbܹ_Z  <=`ӧ2oJFl&06Q_oJGJ cp:Wq|PbMùUy"KOr,Z;x9>hn\bUH7.}Sfe >uUV'Q&6InHZG6,޳֗v5w۟Lu ,q(9%3u4g7aDzּ2әɟt"vh0A{ $aAv'Z 2XӉ6Eio%@(7=e rSkΤ77I]AAfyZ JVN]+չwGc(S]p2)bEj L RlmڬYb1$%?LQpLw,HKAi⏱j~Gizzݩk(]d0cѾ5ϾuS;GVWScR9eXvvcH_x;+&Apݣ/M%ꐟ99Yə:U:% Y˫aAֽ섲:b9=S? g:s;wZ5FCtt4}{Z) ¿L&ñn=~?uoӮ='iM\Jyl9ADgAAm/HnZ>|  LT.,EFbR0z~!z-d?TfY([6/nn t.yz/ODGͣRG, Nkt"䓌nj{vIH$rrrrb AA&#<$]S7~%ӷvt\ ଦjk =޹LMŮ[eH \?fM3~h UN&abAAxZzt:=2?ЬG9V1nps6yEyٟؓlkî,6+'t ^nBtiҏ+ߢws|!V"rD^l텻;[#'MqoW|:GөhΦ微˸كi{Ö2 3 r`[Y8\{﷞VAZzҴ?VI&xҠ},ݣH费Mlb,nzS)jwU]Ǝg W=\q%?Vx &oDI'Sp$}GQlKِ1B@(("FAaÎbNP<EjSl`?~p' zff;2d(/srS #%.%i)34СGi绁2W±,G]+OhkoJ!!!!!!a*LD׵Ms0{JSZ{F}KScFD$ &g1blޝG~YaԖ[o?,%C ~<ڟ-̟3JԱ5:>tK-e}S,X|'\ZrُǰeL]~7өAŕQyʗẮ4%I߿.,rDL4#!!!!!Q̐5A -mbZGo`6tp8M{x3Ezl_߸=I(.ٺ= MW%{A( JT[mh`!~Eط'نgO9Z3sL8vpz;ZmBcG\ҬISwLjf9l꘿Bu6- s5M:.eʕKNSCNz8[bs`a %V8mS5Ʈ9~)/-߹7`u$EK3wgӠiC :A=zԈ(:zՂjQ+r˲oغm+-[8bi2;W!/t9?'z tKkn5!>nK{.ϘJ˅!o"!sr&Vg=E>ʽCot5IN֡Sor53fhO߽ǫξ'^-<M?jGٿ?}p(0\x!v*dCy<sg_){uØޜЏ" 0g };gTZ@7۰'p:͖w!-TeҐ<"ܿcqdF]Ԟ6Pz"s.'a;ԫ v<=(U3;G'N;&,(٣9wgr78xp cf0T%S le712 V~9A{'s3k(9b Ĵg2Irzm5z||g?~I0Ż\՘(eiU48{}y%:&1}eCG_ ~=\qv#IWtF[힃L_kj5+}!yZu}{287K%ϱg]coU+ct%oz_.+1ol(.xU|=& mKfp/[ +N.^9N!L_lj:zR[~.o[ip<.Nb6nKv5+עlvװ"KDAµ5Ȑ4M蟾W>o5uҸ4œ%{+5Yp[#r?mnd'ZfI:v\`NE|?m}3@?V3d?F Tu^8mm~I֚%G41ˇKEf/CQ "[]˭V^ȅ@j~<'?x]:lM{Q%1W;yc.] [U7Cu|e_;Sg121}|8iNͅ2?gWmfvk)blzvYKהC38\ܠ*]Zjn輗}J\_Ny!}GK^㗁'u]=Ї.$k|.,d< %.WEAQz5\nO<͎syq@O!QL{km5fǃp*93Xby^ٲe }]"wo6o˰<4N ʺ'++ 5lumDSFumrmCߘJ:diKH<"z"k7^Zs u +:.j%ʦ}u_0~5]K&y*bE8뉐2Wuv a;0 ^{'W5kT-Z} ,+U+WѴifGBxPպI.Fٛ{_!UսUsjY$OEw=!QRo:wLvi6n￧aZ5?Ī_t Է~ѯ/*䩈'* ypAff4]oWW uLFFM7&X;[Wܗ\uITĊpVPοuӉf#-- r"ɑ 9) Áʱշ~ѯ/*䩈'ZL3a#{)ZE_EmK$y*bE8 U a uBЩo_E\@TĔQPBB!"FLC 6!BhSVEB!NA!Q؄B!M8B!D0+l)#fB!͡dB!DTq\ &BM/_a B!"wj@W R !BD$0-(@h[ !B%CBI̛Y3^pSB!g}pR4 S )D˯1J(@i2A!<v MY ( kyIENDB`tora-2.1.3/src/help/images/searchreplace.png0000644000175000017500000007530011303312237020543 0ustar michaelmichaelPNG  IHDRm5sRGBbKGD pHYs : :"tIME  0/ IDATx]wEww6/9g$T@ 1c1롂HRD1 g&tw}t=]\3Օޯ^*1nXH$I$I$(/yxUOdg֪@P0cgҮB̳)/ڈ\͍BFJ$<6DJ@5.4гOfb*FTrV/(nb9bl-Q"5ZF/Ѿ5*ykac獐C )܆p 7 81>SM KeP9@wтb~![Ǐpߘ2};PΕ2\zoc%a@aͥ!3iD+1\ל'#scj-iAl(.*Y)rrz\8 B)iZyyYBM(,.Dž#ѫgF^YU%Y>ɂn/ Nc3yD$s5doҝ8;.bw5c/-7/DK?ܖ`QK~׭c9酘.+pEfX'usRǮVvEp(nuT0\ ;NeUMq[ɞKI:p!^$a(6RU4)> Eb7op.MJJMFF?# &CPTW0c(2g9.6(#`8 SA+)on"rtEb(/yPnnn֭3tM:vlV\\\QQ0 M&m[ZerXNEk8ݾȺ$İ#_7v 7Z_TQ߷jJ7^Z4M~?I&=kժJߗ 7<9 썖J*~kaU(Tƴ#ۧM2[,Yx͛7?[/--ݹsʕ+~嗢~w܅IMp Ty~ $j?xQ3ܺij4,%5RJfA$&CwǙf嘐I`fL7J0PÍ8p`tL pk!vF'cĤ^h#/r#ǰɧmh:BqDhF0Tt~Fx,"8@ T3T-ho%uynP{ύIk q!/%ńW69nV~ Ӻ nټA%%%v\Ou ά@ gb0];wNgblݲܰ^ُQޣn[ 5g +b ַW\~L{u_^^pu֝xȁ)~?jVvNA~Q]ڢ L!U;F-7Qkd% ܶmYʩŔ.LT[$A&yVwr' ĕ!=H8X[.DLd4/SDĖ OwgVVfYjAј) 5_b9ҾO~oHn dcx@FΆ]*lWOg-ŌbƦ3\E rCPnxI43Hq hD CA l4h|]-Z/(ݧ SPo l3Q&/ݷ#3a) 1@~~~ }GIaݨ>YR2|={xqebmEU;4Kwѯ-,JbvիW{uM:wtŗnܰ>&h&]$ꄟ"M%, H`I3h=T\~&iR.V|FPl7{S=.2d9ed >ZMsjHs&&X X94NulR(@@[Y Nks-l< ăܪ w-D%Ǖǧƹ EG xjIt)H AH,!X :2BV.!R b[d{B*bXvի8?u#F W\kZN a Wik#3F&麦ꚦku02C 3kniiaMӭ;בjSI-73|yͩf??ޘ'k n/:pʘ 4)^wҒ` >lwڵs.FnnQGbŊ۷h@=9^;wR.Х#U&@c5*c5 űZq'qQ3N6CjE1-GK-5@$$bG>f 蛸El'h%Vi/gjB\)z S -UUc薱YB=+lcL8//AڷoѲu!kWM!:p$,Ffdb32]ǁT -Z4Ȓ $X[O=e-z4ӦҴi_|UfR?ikTOݫ*۽2B:EC:,A_V^k׮Q#GK!-wi0qr[ f-30%Xr]x|>_Fy駝vi@Ue]wݹo޼<[ik8\`DSUжm[۴iK}6 ik|e\M੧7+nN֑ܪe˛oɓ⊗^z饗u]yyRRj3B܌gKwߪG!"&)JyYY(ttjRP(N;>|ՍJ^zny6SZ uMoE=vgaW4_8K.jXՄaR1G] R08j[Jw FPhrOS8%e>MuDJʑ@T%+y'4E%La̲2 tFn°NxS"Qd=ž A@eCv`\K0lgV)<({eBP7m;k*v5(& 1\y5+`8whsxщe!I0;_y4R,cggc}Ƕcǎ񦛮rc>}3>f͚r%&&3O7CΞ=;-=/OFp2:֟~uwq\`J2ɥyijߧTɏ5W:Ө[ΒjE$Hdff"E!}OW Bd,]יmR%yo@p7}gxƙo}䨾On;Y5 /4ҋ~|ʉ_7T'3xɶԩ&:DMMc]Ĉr, zEEt"M# r0AY]DHثccńv8`1H3 f1am^˷e8;`m-AH)tMt:Gt}(-<&mJBHp>RB:E~: O9Κz4fmNi^9Bq"Tm!6$bW+X|B])4&OD"^wn()t2x t2Ѵ-[pS^xc|eM1cƌ~{~~Q &t䆖L .pΜ9F]vYrnXb\k?~ ,X0d/쮤I#:X>-bZk:^ @QE< cX ٳ_FW5HOOX̻JZUu|Fe|ݞS}sT \',VǶ 9N8 z*1ű8 6#,2H6O WaĘM$!JL%DMm#l(c)-c`*m~Uɹ&cAY 䦥. kw JxbG 'l#@H/v$`p+l&BAVp $ԖxDJnG6j,1fBtb9R[~CUaa ع!{s0 L[6Rll8&>݂ f/v45%9`ֲ·7*# B9U-c 91ad~ن!|%܌Zj!*).޿pǎu sX,f7fdh0/x) ,Xpmv5MG #헮|fM`pǎ3f̸ƍ;_K/ũSǜwD==T%, B)g> YLtNF7ABp k`5M@VIZ\FǨ^`/+Bq0TGX0Κ;wnNnk"c +L*+|YYF.Ⲳ_}„ wkF56#=uM3kRUh l>x%>ytn^k熩ϚgϞ={֬[ne6w/NXKSdTJWK5 nݧ~n}ۤ=jvvvv ];Zh0K dj M_}Y!jjeޢyW}^2a\bN ёB));je*AG x?5G.v-|P0^̦PޚL&3}ů̆_ʄ1Jpοe`PDC_uaڶk 7ݳjaߵKWu5"/|Hm#xEQ! vuo 8^"p\]z'%J#"R$c3yx ؈Ѱ+T-VTH@ C=&Ü!$u X$d݋:{S3:FdG0GR.D9wSsFXtv+ TC̚{F)>$ S T`vD"|_}Uzi6 80ۻwժU5M#TՄsL18YfdX34n0nٖF7.\]˨!SfA$ B7nu=TWWN:}19X*u3/oX8!K4Rp,]fȶ-G^6 <@A IØMiYCt8 bi"^y7Rl0SddkԿ`Name25nR:As̟G ԁ.>|+ sd\݊4Sc.2Md'_L uήLP`s { +I/b\ĸ"=~` H 09Ѯ$&eX9,"=## ۷׃*/e1dfZ02LIQn+ҷeyYOӱk NCP$3Ӱ4VWGѴP(KQ IDATJ^RARg_n)Bt nKhD6=49‰(9,֡:/}Я*B!#Fx<BP( ~3D"J02/x#qǚW}w+8F7*^E˫ 7F9_efn}1BJډe& ;G!Yq9d.Q2>pa;aTNLNH}ELCICtVX~FHcf$v'HOQ™;9bxDžEBa5{Q0-A܃dRqXnr djV8XO0KF#icS)Z0Zh'D>nj&l"iVLtةs,E[/g1)%wkpnxY]}0N$ع Q}v &q1#n0_//ӲECxl 6g10!F$y0&ε3pV'`Y #Q蹪qr1F:mug紏BL4?Fk;}6ѷIU=JZG0JUX$ID=2f+dDo aie=ӑ9mp"s'\Ґs0GC:!H!LƂXfcM+濄 (>O"*L~ӣy]ZsAzNor' `k KW DZcEt?H G%4 v1?%S!@(-=RѣTt=Ò8#"=e(cT[\ Ʉ<ڊ)!-ř| a=2q;8 j~F]I$qY{.CG!)_>/_dfv|dJM|w.jSXneE%Q0[ ǭ g-ryd۾4ܚYWJ*u)xsˤF&p3d0؊zAw`*Ԗc$!4$m)h!y.Դs9 C2[KkĀ5+AuK`bݶpIO꣑:s1LRrأDFS6RhLYV.LzuyIH (QjOn5^ш^+E҉ M|}F 6B,xF3uB/E #Y-E1]cs %WlJ:E8Z;PNf\Ţ>48ΡrffBתR~aU`gu[k$IA@$]) %[g+i"f)ۘFΪnl1q@.h*w֠M .mLc6 csf{7brql=,8qӞH 6cdqn"0=q'tBy F!00b;۝AV S\fz.H hPj!N.(zJJQzcpnYJc5 D%p~nȨ n ~j&kKO-̸~+XhOw>N϶ΚX94d4Ę]ɝ u]PG+`r^crkoȲS>dLZa뼰/zIQӑ,׌Û L\;|!ư BT`̋h1P- 4 op9X΅$s% X>М>Mqp,֍0׷M)6ozb,YtBht>60$ k՚C^&"2);28/xˆ*38byʯ`ƃΖ p Xt !ycr$rLDB}'?&Wh Beh6% &D|oC bV[ۅ\-+Lv8`rPRO!7R=;"đ0;u\10 u{1ݼN"1,x4N]޴f2;OD;b7tMƦ<&/ jK7m)C]z[q|K#RryH2Ӭ{<k*z7p9c[2e$;XQ`2Rݎ[]2Nmh.u)80sq'3GRRв,,1S8I2o9'ss*7s]? ?k&ا=u!.lĴ%"un Tf+EA?l&uCz褎ICYq6@c"S\#VQܝ>vx;y֥R/ t DR)O4BL d חc pQ.[0w(XcᘯII"qk.+o Q5%&.xAL$j9_v4ԖڡDr3/Y3у<<đ+ISN}.n8lJ[ mL92 alu[2k'x;9ͷ0ض##ٮֶ"td:MlMd,a N1޲%L{.~MKA9aY} (C8%NY wbi!rgeǤ ]XSzb c: Zr .\C ]|"xBm1-ϲO7QRuq@Pg8 P]N`4]"cA5O ]_X3ԙ rH,LJfNkЃ`o  UY1&`Jcxn+_frYN 0O~4adq"yvl0<0EIA (t 9=Lubm>@PX"vX`l]2NWM2qȀɓ2 wc.S{MɼH2gaMh )v 52V ` [5;(^u+m =38DJ4S y8: ' qɜzsVKW,PdoN6p㤐6c+'OtFHuKSq^) {F X.'z Fj=0H#cR af QC@f(1LmhH!y~4ix؂z"%'$9 ôP*ڙ2Jm\:%wA<9TcʖقWẗRxagFN\VOQ1Z]T N &}uXpͳjX'e* CGs@LDyј&&ĝ|lṔC1xwOi'G?WH+?{q,@CRQ') &aI05L⺬T^ kWH_=3nGl^0+L8 æ$Vm+1r ǸOTD2 ҳG WRO3X#1;AdW)q]4@HHm2c yɱ4ȑT{aPKܥ#swΟĺ0X،c(!NuR[|hW8T[gNMiP܎բ:̛˄5$}+Y[aH)HAp.0 _xgn :/`6<&X#s]tK1 f-d;81MظDw䜳@Idn3~At͇'JDVq|m3\ N[BP0\3@"$վ7e[YN,A&!JEe4.u$t͒-2݃)o m:/_@%( F`E ]7Y贈5B 4R[tAy)o>B)kDh4&5/֎ˉ0=imK-NiUpGE" ;bu42hQ D'$Or SK`YǾL0 x'^i`!N{#"}BH'4L^[ /Xݐ9+0.2CQ9;>KJJM@>w-1ݺu2t=Ŋ|$Hf͛䐷$˖ w쳴t@ 8D9E DBb-[b/?ϒݻvA?%)E.~nJ0r={_=t@ӊl#o6m.;;[ K$ITZZaÆn]D" RUS+*zkZUUeh~$##kו+WdF">ߊ`lqmJͯΌDw_矙ϗ4}AG-mg&j58XMmIud~St-,wӽ{6mڤ!(IH$sǎnݻ ee-Z44_U[ٽ+;;R L%[lĚ_ޢeݻv7zkWn~e}XYٯGn}VOyf 1CӷHKKkժUff$IjlժUQQ9biVZZ֫W&Gc ֯[1N>}6/%bf֮)[}{ >W,]'2ú{?U֭]U#ArPtʶ9Ϻ$X-?e)B$IKI룱h<ЭMO'hqAXb6O?kT4dg<BܼܼܼfǍ[D@y׎'LyyyyyyyL2F- =z0N䕝-.{h*eKfzڠw^ ᙡ횷k߮סυ7<3ﹿZhپ_;С۠Q?w$IeJYߌUNa[P?Ov͒g2Ee< O>}wag1r_dyA B>SIE4?s[GJ AYG "3oqٯL\qk~/Wضes;?{L DYp{[}U[?lgN<{?;JV$I:uI$j9G׽@a_9l脘4YC/򠴒%/^v=A뮪vT  x@ ԣT34w> Ň_GŽ!YNrluSO9y:gc.^UW-7ŚI՟8%SOz!ъ{3oѣɶ% z5K1h+_7ਡ^70zg&c UÊϿ6?[1?ntnk| ?κb~6㲴O?W 9*⾿?1 }%[x^$RTVVv{=SN/N<WTT[8Lnp=Q}Һ,/V;ys|pw?Mm1~gй?-[;J5[? xgg _-yHW#[u~R]%m'wr?-?:|]7emT$h=cʊr%?MCsPufvVޢ [6z:лu̿ _8==p2vL$Ÿ!+Dj`D٢[O1bĈ#\N4Æ.d/vdxѭ-K/dM*Pd_(kٜ/ާNa|1%?^пSΝt少S ,dZՎ*i$IeeeM0C?}G&> W_sM$R+m=l-Fr)m[Q2E\2_z3nޖj 8Iw櫯xfO/bǪ7?*zG{i]6 -NWߊ4+V@.a%ԕYLgZR cCJiۻW:G^ /ЀΗ9߭|5 WշS6Y&|k~%VAV2fU v[(aOp|woWw;ӫ[@ΰ7S`iZUdI$!IҡELzo{m6rssO9'K})y )yyFgܸVl,.Y=c5ijdh͇D IDAT5?utqt웡^SQā& d@d- .4%qp/h1mO:nš; [*㭆WW$hEi6G>C>'cEwsMkgn_:y{y*TWG\ʫFդ5!_z \̔YK6Uh7 6pgyOn4`k?Q*I!F>ߓ=zt۶m??]vcƌyAmEP]_۝wm'G}3szO췅-Zw Hǀ^#vM~""hP炆F`u$g_ ~ް?ƌm$rSFeq#~QZf43zu|nJtϚ%"G.K{Y8}Q9ax}Y@=-m݆Fp ׾B3M{:cm!g=}χ6^y|Qۅݧ}Gj{ ^wOd|5xwEg}ɴS hQ<Ec猻5e8}&}y >Ǿ?O]>rj~Nn=w,իn]v׫OyK'KJ(qOϼmPy}Y"ޓyw0@lmuX볧}tI&}ҌO]98ԬгeP.$uw#F6VZ^Mb?Ơ8n֢sZ~;'|ywMqY<캑o>|.|ۻaK @sȺ"+ uiǒۖj f<>6~CUfg]Cfo%I%MS++*7m*,ɳ.\RHVί77IjZZZVZjMcF"-[hٲEZZZ]_Sl~cufi"/*|?![u]OzEBD-h1Sa."xd+>>=vC `pe\ǢxB9KLq *R̬@0V7 E"p^Go~cuFHTHrE&գ8ͱ=M'Mvn"TwvJo%[" 5EI/r%^MKK M[}57bgJ!IR oa-} RG# j$ M k$2WRU!,%%IT7[~ݸ1N٘X*EDߔ$I\杛4B I0Pmۃl0Sɪ_>$IFHJIRo$P%|!I$I$I%) $I$I$IFH$I$I$I$I$^`$I$Ijlk8\6 ϗAnk~v恣j20bMUѨ(v )?lOq8ԡCfff*땪 UmݺMn^;o߈yਪzٲec:0bmm۷ΖHV$I O[mؾ]FFwJM*kZUUeh~Vffv^,[|4_kBͯ_ؙ̌ %Csݻi&==]AI$5֭*l߶-=(h۶iUMjfm۹&Mv9?Q8-UV)%I$ 3[j~d5k֬'bfWTPk~w恦ʪe˖e XO_b+uY9n!_Е$IR)===''{5- c pſ2m1htFQ]©'|ayCWrS6P8 5Hlse3w@P%aw^zB>N8O1Y3$ITCՒ Pn'8ev'4>ovӋg>y+ @|g*OW;߽l:g#Z{Pjl%Fͻ:s䏾;a>.]r$I$QD nw7xUw/YjP|*/lOy6b~hߋ588yzehjҗu1U+KWo;e'}cF!hug1klki~|ۛM8g̉':?7+~Gx3|˽*=g\r;tw%7Č˕+_kQ=:v_[SŖ@/]4ƓҾc>#o|og;=niס밉rY$ 3fΘAZa_6m̙Ȗ, tjۯL2Yo}(cW|o̘:e̷^YsjOޜ5m Sgո;~S_2uP1`qֶ~wr*'^/yt8^8!g/xMQٷ;1|l =n~=w1`q_lGovǝgk]~xӮ+Vǿ1g=:k/nm_.ȗ Ko :`j?Y>o 0QZ$GԒ?f~ZչSZigrӿWyٟ y x?qʺ(]hYi'jX߿<;vo/'/鑮EՋmzӳ׿^p/ k;"@8lK#q֨O8冷i+x˯9K2l7v^}bpt[(|1]JGvowҥoʹSf/}N>K]hƼGfԬAuwVj^-Ezwh76U(%}ȟ>JtPVVք =4wydp5D"Z #RْDΟԩ/{{eƷ-ٞv;.\Y9_ZZׯ2e)N R"w o,W1޶tw!=Pn ¸ڭj[ͧ3/%9*ZsvP|ϸe{[1`NW=o/w%0Y\m{0Q 2>ڳ}}?x[ tݳyLGUrVLg0cZl}Uэy?m(cjXV2F|dMJ"Uȴ8ozl]cg+x9Z?v)#*5B@(,C9sr=$ФG&=ZRR7w߽۶o 'KhR ܰ83[)W|EWG~y꾘NŅT-kb%1XOqܽ%ef}̌Of {k缵~yKVO3y@^8e&o,Wt۞| '߉̹8I=#r?gcSw[=@ꔅ?XUM" $I|>߿'?w]w]۵k׳g'|ASaS$ȟwqޏ tyk^/ @*R}Apņo~ j4o~1`C52W~ 拺BIz}=7N. kԒ5##m;]/>_>Wƾӵ2cj/,l(.㕟W=8v?keUソرpFE ua¹?o_m,u nZ@F9뛭1]-YΔǴ X:223|{= %=Jߍʷ,@[}qY1Eco>j㏽DЫw-MD)n ?e;4l\\%emc$鐠p8ȤG8b` 4IPֹTAdvU0ҿUo1D-FD○/VZ}O];9zB("l+ )lM%[/c=Z(RD#{j&wO_|dmA޳: .| zx':]DULedGĶ_rW߻x3-tt5@9GNp)Ӌ^}8ϟ}=J>ys}Qakzj`D-d#Vyc =UQE>K%q=)nڮ'>,."a$IJ$Rs33FM!6/Jmff&HIc6Gq`cK>S~T`_iM((h[KtC)^̒c;{{5wqvuswpw}IvjѶkōjITj"Z'BP#|FIDATU~)%}_>U6|,XdwɪAz3oCM|IiDŖ@d{ؘ&m8M]|s#.6.ioZK@_k5_bғ4q\*ޖh@o[x=0mξ)G!8>7_;7V )Fu"DQv1˧P}3tm'Uu^ܗPjѶ^|Gm/&9(DQ,o{y~IrQ:>6>Q9575%1=< {l4>=L\HI}, k*(jgy@!j%.q@a37_~GQ5u,2ukE$B* ^H(TI농.RUՄ&O ;(KZ-~o^{:{"l y5R_DQ+EX``ȉ]t+taT'4ï<Tt8lck !,hQ]1` 1߭fr1E囐Sͼ݈wg'V(3HULܹkʕ+//QiճαD9"/hܠbl`3m[}:7lI.$] Y|D{.d#$1p[\rBsݖi/?h-GŷW?hąkz_;QC H}%пEX|ٟS' V_Z .D"fJ{ ~nK=R /H/Ncy]W8G/??j D4Xi }[w5 2,1= .g+ 8 jiH8tlT|'OUE!DQd 'psWN+(D1X9:b1NCox^cǎEYs\3gN C0VXݾU0ȏ?PuV;ץzO{C:ưhm[*أ qn hn+89GKW[8T9iy -G珞oqC/U 88E«)2UΦȮTwl8HwgIq?FA 8+hzKy7װ6]`'_}\Sht;O%}qCjה]mޖ g18xqlXݨS[e 7hRDvZl&bCS$[lo|E̎jR1Ls1Rյ7ʁ(I)*NaUZBL[s-C'ܰ]9܅K{ш6ߖGGG\2+'{}FFF-ZT*ߣ˵^1ܤw, :-rН9)g7\(ٖ|~B+ϔ ߹3b`!H[-sj 7ۼ=&mc9t4q}R&'{Sk~0ͼ#32erx]r3o:aiuuV+)*:HcٱՉrIJjyi\,z>>Vm \"rCyB} t2yX}#FT\6G!]mÃvNogF&/zZ3V\`AUS8Wob#X8H}*skVu5h=BE x"EWWא++ހBV/a +6l%ñذPNhWxmVeB^:hU"εQ~Q:窢-eQ;4OO/Yr_v\kuў]U7kb륇bV,Ns9mLUVMx4T%ӆK8?S.>M,lF=ǘVě_PS."%!8,X38>L5_Iy|=LyuBPgimzlt}vjBY|kˮ {DŽ,G 6gk$C FlVZڶifej~h`^s׬_<ɛ#P8πknA!eJ E|dRJVT$uϥ-)E,lU[p/ڳ'*EET'޻RE};,bqG'U8sC=*(zttK 7)hpoiG"-\?@(`dH(Gb :y`FQts[4{aA>V,s*oaF!W \D g!.\_L񜐮A3޿m82˱"QEð3g\vs.IRoݫS5g9k1Ӥ BuM}Z9|͙B.Fo2hˎqZqΐRgꚹv̚Ɲߙ-ο/4,)_,#d! Zs*̾MЍ&1![ky>&(F8Akul4ĚpG:!Z[[ho1ةS5޼q `FF#xmHq:/%ٗlZC0d /㸁X,8.VħO,n&j>lhfxU&FH P W Z9r!!Rޙ`] FP 3%I$d%Z`|D\\XR9cvvD"a3!@>aiefP|\ lB񅒈["IR.X귱}dWc{/1X~JIR.!X>u4Z*NxsJ]ts- ?c i*DY>m'8Te_ ƿpmhZ;PQJ8g ь8=zeiB zۑ}%{R ;PG(K,06cUL;|W4WR2?Vt)ϓ?NZ08&k8e5um7_R8.<b91qǙi[z>>’ɫZ@ ]x3CsZdRG2%v\ Mx30v 벃7iQ} =t5F-!J~0zl.M GsˆSz6]g}&4X5fd6(wZx#~6tR\>Iđ m޺,oB:̋e6LtXDBizy:pBڴ RNaeȥ@éJ(zbFV4FfxXi4LajTB"4$Fǫ0rcue %ɼF)#41{1%}@CqqNei WEtݵ\peWJL40kY}rކ1#6wӹSo0gRR~{dфnL ˘6YZ=Y;G9!h[;qEs8uP Rm<͙#Di]vz);FZ5ir;[DPUfJCEP B}嫥'Rɴp^eRǗ|"~SAC ƴHzF ^HV:C8H{=gBuCQK _T~o44vu܇nOT6qO *mm@mևXҗO0~xP[}XF.b/2c_6NZJdgg=>!Fp~@?c5"eOEhز׬Cec1Qpe.[-ݻs]iu>VDhd' h"p}yDgx&+uriJww{[{s() $~䀖B[{UUL|ڢuعtUyŭ&掘 iEqFI,}-f ~~rRᠼcVBDΩS6sQ'N40hC+\,[4H~Sɡ "o>nzNRҝm]b K([7N"X]R<1^7Bsj?I_#žfɘgFK lOH#WzPo#Jlc8=ɋGR,y9qu2ktf@ imB_~^\i?01Qvvv1m6/=9&hܠ>8y@'.08iwٿD, g"31)[==H dͦ,ř杦{KOyF SqWpYkaW(% ;$HE8n}ʖgɴ(I|FL,'ʄ'ٯE4ѫ\Qr(9ET;&B1,OhKMƣ}aܨ|}L]xʔ 'nwsz;mǝb-=u1$U67,m6s[d蛱0H% Wd _s Z1?e(=-. )sqY^U(!B,R+!U(*_͍yaW>9?^i4Z]V,f]gZUPކiqo/g;1foZl2=ep=[}R",uc "xvykV@T_f~뫭)IM}!7 #s5*_U,T$]PNo ,tFۊ]!7t`nDniHz:YAj n^r'H~翍7uuGSp߫5c9ua=yէ&"@Jt q~qT1ug,rKB3 9E,( θz9sL@@@vK[]Doe{fp\ۀ[<^J|yREVM\ٯ_?؞PwU듌^@2ŷ QV!'|p89Y=VبF G ]VV˅8 Nj\HK=KHP 2+ d0{jhQQQZ-aia @d@>GA&&&C8Gx!IENDB`tora-2.1.3/src/help/images/tuning.png0000644000175000017500000030347311303312237017253 0ustar michaelmichaelPNG  IHDRCܒsRGBbKGD pHYs : :"tIME *3$ IDATxuXTYϽw4Р aXݵv~"kwwk.bcXtL0uDbP@sŹy̹gA` ˲0J.c0 aRXH o), Prpܜ@4]"q0EC H$r,@qL 7P/4m0PrEjaO{D)|>+і(2N/ _3 VTQe&!$J+V⅙4˺dYHwًO߰Cr Jo TT*{2 hThv1Qr-{܌o2.t @]DSxιz7y8(N+{6%x-ڎ;Qwn?:b *JkkʠGX[+J&>`W?Ϝ9ؑn+R]\Lf9!??w/??\3fiƿpٰWVJkuB_ ˱N7PqB%kt d2PN粤˙-+/4N>طO8$*Wꖾhk2Iϕ6t꜐pWo&`R+1jVy-p8#qtܵ%c{6p`#שV.=kר٠صIT1 NkBY~Z6ҽ{o=zѣs9;|c (\9?L1O3k+8YfM)baֺwN8 5"v^GwܾyW# ystЎͽlglKz7'*6l!Vl9}Z5WMeG۟5r]&Q!TeNݻodzS'Wa۶S4n)d>cff6b5k^xƍBFH$(Zd|'K&Q>۳VcbdۖB^?]%t<)_>E{exRǪU6QÜ'rn*W%PnrRWazkO{!J5D b؋jGo)ؤEs[%l!<]n=wnbqtiSCwt n IӇ*5`̀}q38:'euxOzbd~)U .\p]onݶm ,PsŊ^壄ʕWVbEnz9qgѣիIyRGj._a>~Kc:{P]sVNR)*̼9:7&& 2VSCR+>!xb3S"Xzaķ LAd/7/99ƍ,{. V[o:.#UA[T*|?WLH:mR`ٽg_eNuMa4Nݚrӡ2{P+q+aJ!V~G]9n^gKM8Jłoe{M|'ZE8Z\kК2kKi>v37.hsΆ0-G˙_GosQ2ր2D>!LwlRY0B$P>FȾvY,_2uի˖-i3FJ N۲s3j&Nتu_դ2 %W%#={6.'鵧.2VM+Ϝ`9=Zz{2v\~%;ۦna_~#]ϖ^`hc @1q }k+ONa Qn]iHK"ӂ`C+wB ≤ᑰ~݅!V*Za'Zu.DŰݳ0pywc ,{(nIu Vs~wmg WOf2!э/(`A:uի7`QʖTN#dh$5m2 2ok_r͑S_e)aX0<ѥylK+۷zy'&$g4jiBCZ yrZ`ߵysd[e mј&װPou-ܚ5oX]s!Vzfҝ?!]=7xe1,w3\\[ΖDt ljv?m>4punkOn":)`ӜEb]a0 u떷w3>c3 I|۷\y<7[Es 7J(32W[s\eaF}T5WF-,߫߰QrRRIJ2:6KC/5mnw-b.fS3,22_:ÆK~a$eؒ8q?2YiZm\!&/ݩ+P|!M]}*/ 9!|-kO KH𞌐$6 oKO>ePR0W2 gZ/,--%b EKB$R_xe{-ۮ8$BI|-1df2˗/W ~k;[[LFDI,@NY!%`v!$ʔ)7>@IE"Qɵ,@Mo.2[YZjOH(JB0%Ȳ7]8 a"H(oȥ+${\- PLR#?-8 ]|u1q PT-h$ %?1ߛ 4Mc^LYX:cV!VqKoJE3 RkԬ0^OM¹~D ?{ff&ss\x/X J@3!";k!T*Ca4))ɽhK$v1Qr}ؤFBSt)!slcmi\V:f80 cu:=Dzb.-hX J@3АT2L E%?akФE/E8# E~ \e;'<.[olFzK LjȽ{z*F,4f.H-UJ_~Oj7k ScEwyl`aH4Sŷ}gdџC=j<{չV͘#K~6Mwpu{ۧ{ic 30l֛:}ε|[CgSNݽ$\8ԧ&cu3 !CcXٟߑsE#,&l!V} D}<8z?O4pÆ-|/LC'oRQ(޺ݐ8̱f~c7+Ǿ_&m,`oB^f-@a E^'FA-\Dx+Ͻmc5 f=lRZHA'l_=d¡)mHϾ?FY5v}8BHrå݅S+*U?[yFEn9VNd?s]3^{hXalcX#p W;8ȮT}N8;\fQϙ5ǦT?`: |qІݶ͜Ey҃8WC0t~l1,|˅! s7p'Ri&AL',S,;  Yo} QfXc鎥f.&_W #[.3.R&ٍ+k}o2Y~1,"p@mĥ<[X2\$F4ðɖw ɫBU󗝮O4\"L1 9*98Ym}ooK!YA|gbӼPT,:Ec/j+0TPQUĉAE.gY$_Iiғh=jcE븴a`Pw Kyv1ISO^_茪<!՛C1#7_\dlPk\@ 7tX%fUZȢ/F4S=Ի?\i*N>X2>h|asňu# qH`Wͨjtqwgo8s/}ݥ8>\̣ɌԭِY'OsWgGK[W^H 'Xl#U,)y g7MY[{]Huݻ&[bw2#|>iKs~uÝ_?Hqy%f.m,NLx e8BH~"vIF cԧÿ|ܢdĂFtÿ|>iNkO2*B.'(GpS4x/[Ϻfޏ_e%XmMcR!FʍgaV:2qg>mqu bկlz;%859Jsk^64&Z>~ه4<*-O̞Df֕./@QɯR=pCJ }B)oVemE۠ 9~JM!-.҆,^gZ%j vyAy &U_veE6?،ߺKX2#K's{ΜͶc*=>7\XV~2iLC}ʮJ6cP,!dF_2D__}3Z':D(\xݷcSw Ӯ,8]e2}l˲|,N3Kڸ9҆e 6wĊ܆Bgܤ ՘iQYFx/~J O3賅Ez[{!{$DE]2=l?eF`׮gt'&l.T7eKqкlZ51pǯ0r>|xQfrEfLˬ.JeD7yBꭆH;^ֻ>Llk =E&X>@ R'43_"DnF4-CbkQtl#Tn;q=J}][{X{ڇ\NFN dH\e^Pð25l_NNmV;®夵SE6^?RRZk q_g=u%2`hy;VV( gOrxZiO?OЗEݎT[[_+1*!1 {E6ךYŃ~yZ섽|nFlԩ:Mq8 No0aLc?@wAo0é/EYvҊדc_/xs+4Ӿ82q*EI/<迻(SX1 k33IٰE;htC$W6dUoܰW:U+W(+'qPVW?$k޲$yƗ/2uVD`YAЩWǪ2RTq}yaߦI=7sToH+ٳw}{>A80,SpB?%8L2JUKRIAoz:jFjW{"SUpWǃe6wصki*ô>5j$2U؄ SO ճg=Nfkii3EHk[U!^DvL2b{!g[t!iS<ac -juU "eP#Z8OTEB/T=8eckn_z/m]:$2c( eu\Oۄ )iTK災]ݽr}H5,٥CԿgI4SХ8,<g] $1dž&|τ'#M 9eZ2YUVH]ה&)/-ghfDiQ-oݠ]ԙ' C)oO?xum(4RIueNzi̔9r9MYtPVPRnÖiwޅGEF}/״|6×^-[v_~91Ls{+ctHQԯO7x{޸i"}-ߤ|T7,?#c1L`ݠ3OM:RБ& XajC2%dmɦe, aG5dcZicu,&%jc<[1a)v4jUJ^ 0waZ`fXm7sK ]T꽅ౘQz#J k%NWu芹 Q4B@Nڜ 8OBRy^b:MC4qF%pTܣVW[=6Ξ;Rς2ZL5d$i!c$ƿ_BQ`n9s{\;"Eynѣܮ^Mޟ @fRh&Օ:y1S86eUNd@g*p_2lv'#]h>YAarxb q񱱱bKn:˩;/g8S֧gN[#ݲtln[C8CE~enܾV+0 qf^gXUk7^t[ABnHpiWZKS1ܼ$|yNxbAEWpM|vXjSKO"2/}Mvop͹Դ"wCY,C1,Bķmoz~xU<6u,7iBBfe畯'<|*NXÒd3%!²Ȗ!8*N۰"V;8Qv`;CT62;XM3Vs^< !Y%/y߁ BXYcA̩ߩRBȠ|d)PFB4lqLW>! :潅gHJ-{5;gILg *|EXIZ*l4ՐΡLՍ &10 oSUCͻqTK0{m!$'It|K^B&}Jz|2,aUzaCU^aɃpYq6oMF+7[֞|Y91YElqFXya/:]V_OI**pɰ b7~6NIܺ0alPhk'7RyN831j mlo$VLocnÖ1wBFU/%PkGZ&&<{G2ca!Mj`@ @ "R[Jt1n˗iK6۳0"4d*S?[8v-\&N;pM8ÿ|>i꒟ĖVND"sE||MQy]+&ހr'.̊ oXݰWn~aSs>5OM ~~X#psԬJtU_>tKY+Nndk?=x䝸`P"k̶:"œ#&~rdf!-C3rxJTpc&u{T& : 䵗emy!DE_;AVxIr}o 5~q&L+-f5eՔv-H uzLcS &Ăa5j;hɷZKAǶټacߑXMGߠI!кq<[tuG([Wjmʧ1ۺ6xtǜ-{ Fcz48zO_|U>=0w@& 6iw߱IGl6fj ǷD8i!! y<{(og3!s>S~km65d|xbIyȀ" k֔(4F}ֹK&wboO?e}գ3BԝWG4fnmb :Ԡ/^!G!d0 d󎖤";Ƹ3g3F[~'V0N+RJbu81nɸ+6fj6tY֩-ضdԮQ*ke&m  }J:rvn"n0df]3M l1dJ2㙻Ԩ %L:Q6fj&9kǒnҗ-УEcοsX&!y1C&o9)o#Wֱ` T Nƍ4n>Tӧv,(Ev"NeY.3HVYkE94Ѥ~ǓG`<DNشZaV +< Y֐Q2'qZl2)ոy%YrfLhUAdxB!&3,#؛lj?.a8 8*>fzo/rX$Bg!ĩ컩0G}V{]k3 `kӎ%2]&,j5\u~BN978Iki7fx|̢c8*JB0RtW%RVH>,!!qrPe9; 6f~|;og\`YyfkcA ]s7g١[up| `+-װl`b!mņ兌~qE=V{.28-"M/W&Ҁ6m-Z|g]c+ Bu%-w 3si1c_)i 7ggVaMQ1;vqܥ~y+:!U?vm;9!6;0W6[8ۈl7EB&.%@ҧu,BC#<=* ^==MhI|>_(qss!B|XppK8NL2@ .2@ .2@ .2@ .2@ .2|JMKmG<;k53j$4 #N{1e]p0`U|>AtU=?b_ӛY41P P2 !8R@![lf~??P44魭ryjaQH <޷?&]TOۡjr<%*81C@@^1F */U++ʕ4T*@!XF&}sce:ioU98qrՄZdW aT^npпa#D'Cb0[\, 5"ݢ>N: wxͳ L4or۲ʧ.34I]}ooal"rV~EI@a(7%tpr Ktv~T* Mj Q(Lfee`aamGxuj ,Y' k߯;^ K)_k<14ovN:|4weӲn߽oO,7~[ǸZ7v#\f<~Sp[BY{ksw_w[$6IfreA㌸w 8v?ϝ;'gWjލxw߭1BubVR( aceLRs֎%ݤ/Z6Gƾb~$=})AH*u:!Dnz2'nͽ劇q&?:b5dBg!NZ54<lrБ7C&su!3/yϒ2se]jTFʇPŽ۵dAC>ߌփ^8t8FĠtn&p3qT|ӗp8Vx׊4dhIMObBOzCL5f^IFX7#^tQDŽVD)Be>1_4YU~0ޙztm؉8߄fAs?@1Mͤuo q/<:Ӵ7oJB(J'L88JYe/#BķZRSjs̘șQ($LWcoTmذ?{w2?Svs ~w5][>{$lp1TI#b_߽Agb[1aϦk,ЪIeLh#d•BS)a+:Jܿ"H)ZbܢjI{֞U1|f,ϟeB”{gt?Y\JPo . Q{w?x{ ݖ#~L6Vo;j{5]Hf ѫQ/>1uϦͲE7oڸf{g5KO&^=E.[S{O#.~=f[Qӵnd@/{wuGL2r@1o{j7A^^8ys?"w[:֪VG:uyw8u)lsL|٤; 8v Gui]mO[,,4$<<ӳBsOhN-j) nϋ>/~>@?  4Mmؠhrv5wO}q7QaͿ+c\*7<VP>/=p RF]=-Y5ȟYZ6[^N4 ͋y#7UۣAU, zZ6pk{ԪQGLjB۸n-xC!6}ׯQwqޕM ](}\:G܈#\?N|pvnŀs /M]<~pnjEQJǏO+Ƀ3]LRIMc-~ĵѱm A]4䚐.Bx"!cB|^$/5ͨlV +lrЎGS:VRIٛ'FHaxfNR~@BhmqпxS*3ON~Si50S wŢ_+ܼك." IDAT m@b[` lG#2oLn@Ng3y'βT_Ÿ-qgGNLxyF?5 SÑ1}>P0dY&)`?o4 y ;>jVr~Ú yjh#Nqa}Wƪ̮|]SƷwb95'r#{ qHV0ڹFS&w"Y(t*,AEM5w/_^7qt0g>k&y6F߽rΑ)S~Rf;z ږp/ '*Ք'ދ7a{g{EX]AoQVl~'̉u:m\T܋f9ǥ2s[Eui]7_a3*"!]Wm Jh{lJf8Ҷ~UEWDcU* !éTX`#dcoy0iC3z tq[Yx~Ǣ!JB.}Zg[^gED]:{B|-WfQiuw_si!/ɲA^n7^(ͲBM%?x/%)[ߧwb18*?C+|:mdU^Ctvܷ>_Vu|lJCu&őaM޹8{S"1Jo:|Be1B)uj*ltMA.tC)e{Fm>1Iwwԙ3/0Bփ]`Ltt B<G<)GȠK0pF cZVЎӞjZW-xXOR"$Qm=|=:Z 8x(iiٞ7ŕ"9TVVz'w/t|jE! (>xT7Iֳ R+KA~N9Cw'Zvju'7OE#[ulQN!r86`X5sۖ-GNcn"*ZT܉@gJH D)i!R*EZuZǷ_&H!10T0cethԧܓz@'Y;rG[[U`]eرwJ!gu+{EBO_Ep 1BHRc?O:S9JϗՆ({++cXUia,7LAW7s`?\]VH{"V?K~/FHj,II?GBfi=dzǑܸ߿\ҦoRI₁j޸{!>ӇC! '0sPoT2BJb s\KgBVM\Ep)T;7, S?RuW3p9Vc%Hvu׷pF80أ~2[7Buf$( "vNEMw_M3FuEZDzS7m7UΖ4߹-/Mqm&}ed6xت!ڡӘMf߽CBS2fMe[ߣrmx*{vy|%8+׳H#y߷..vpue uG4AMf5<"O hu29yBnЩ=fHr z?O9Ё/Co:yɕr]7TʩNC&*F(S=͗-~ɇe[S!Dzig><!hyeHS'k6G!ddm^e -v3iF=|u,,4$<<ӳBs_KtjyVKQhhB +[~ ~n>@,@8-waM,]M v4Pѫv,(XŮT)"H'R6^y{c2;3̙3|~zz@3S|؀d2I I:m@ @ e@ @ HK @~8^e'/aat@ 2@ e/A3 ^ 1qÇMKlin:x,x8KmV| f?-xu՘UJ@'%t@lG{KntԜi.צ6!95% 2!r܂xg7eLGȪ_컘T0tvt "B61ma͟~wOi 4ĀbmzeH}p0M>Q/2sud.JU`#|N0ݫLU7VIÈbh]ޑGavǁ?H @Dgp Id+xfe=;[OM-Ǹ<BEqQǠ eq}uދ<7@E}9 ݜ5g"pvƕ@c1_0EswO;,fr,.f& $0e;Oѡy9hrgϲꖳ@., na;QS=*S"oZLf}^6};þ;oTPtMQ*lvZжsOsI=̵(P]ʾVKP@ Qeiu=?Z\=RF5halLiܰl, մpvs0ef-H2mL;Ŗ`}ԂŵP!]S*hf/?;/aƆ^׾~L/mefhj;aln=թ21hr:Aէ532215h4밳儋ǚ&ȟ͙̬Ƭq@z|*A+N'Rl8f#E35;=i}B&M^ydN3Jq:ӅO۱ol m^;ӑ"f^[Sh ~$akP 1 b3h!+jKÆxP(D {׊֥5a<5Q7X4q<ըm0 @3Xtd;|A|ڽ%*b7US&j+It a 4U9.57g6=9Tm2Z5ZvQq^ȦOO/V?GQNk8ٗ.}` D{< Xb}."+о>ɴ-ZPK4[!ZLJ0D:6]ު'Zp8I?z'P:ϒ./=, Rqe}Y*9CIM'lV,,7eA OR~/ZNl_q]]ܱ#4&(jmlYf%K=u!\MʟoDD}ƅOPxF|-^EUu tD=I"$.:mQff%x^尟%Vf@68ݿ"K%#-Cb*QDYW:?xOwWVVVRRƍ 8***h4{˾nզ0_ |{yx@;aCE#Ykn5HbzjD@U#չ-d e&7wΈ9R}AҶV׬]$#t9mC;՟wudY}$V&%eͯDa*233+ߨ~!6M] ̇MFԂi/~"[VPebNi Gh&kfW뇿T+)z . C\YKDv~TzBN:^jz8 ~Ai;2zx'zI?$&ciY2i+| IZě"#0shc8@Si$uUմkʼBRsNQ|>l ${b w؄u$)&R/c)#jVy4'f_0K߼.FuU}1>%I[mdUFFKm()stZ%-!S8cSڙD*+\?3?ov6RMCOj`3aFFR4V"HG(oNw)2Z:J0q={+uDhѱ'x)]:m\C1"l> o2Q߰ޗ 3+mM=V]_`#jWbW_9,Sxr'Ud~/vTڲ+^<f8ukkO<}XqM|s~شrв^?IJX '`Α/ٶDD-iįmy"MiӌyoEF<3>af72w27kn 18e2s dMmy3٘S߼*tys+C]NJdݿ?S.jkؤ l&_nYYI\,)X,<ϯdA@HEeeeKJJ~Gm}]%Ծ]·џYFHU26 MF}Z+~KfmVT7&oE{k_>01@H 'fb;f 22h A+؈LMeRMUmMӳW7wMhCZ3ȠὉGJU 7_KyIk ^BŠlfr._~^)LT p2 :`0rl#7l;w\W|AWi7ТItu1V*518Z[#K n +Vx݂l}?wеВ8pXi'>BZZaͮ^Kdߑ`8Ge mAIf}A+ǚk3_%F5CLb'79bG}_V:8Z 5>x'#@C'ػS`0eXr` >N᧧qe/=M+ТR&SzLea8"mz%Vi_RQQ~ϯI_]]:8s!-}e#ըxÙG]ΞuW$8),#_)D!2!bW_FX/.l}l쌤u׎4Ϻ)Ss 3|ǬWLgY=g^zg?_7EO*7ÙIHB־{*Y{ F=yT[[w-C~nOOhfCQ>=c2I I:m1BQD8h$V|o5/9J^}uT};x<|mA29!1QWͶ S/] POLJo?7)goz;3Hyoaɏ&MQ ɬfpZMFL:pf #|>\)Vn,!muͧc3Dq-vGw @Uj{o[e:AKyEVO\!C!dΩ?舑>R,"&ZհJ~MFGR,"@(bHkh&_Sw 1{A x9'r #ND{QnW(0l% @4}"cj^JZv&fY0|}_S(&cM|Gm:7QYQDo+ s$aE@0mGi^_=S>OK*MPUgHG IDATx!ԾZXȕ$Q5DMjdV~#=DQUJ4MQsIITUfR6/ 6=!2uHw3]P]ߋ@ 2(Ta;`IJzvĀ@<\'R$5MtSBV+X6jw豺>:m:p#UBrmߴ}͆jl_|ti5 閵 ]y<@ALvuB5R;Yfa6MV}(jҬ֭~.Zo%WXu@.B':^]G0g/|p4-s^aϦv|[}4ܞU㤅suEᱶHzK8;eqCouk䈆պ]RGίK̫/.7%?ʪ',ְ)Bk+3|/lVCBZgܸXۧ{KokwYHD08šYK}ϙ\.*>VIR+Kt'-`jWQ)<.rԅ] H[Z Z3Oˡ$nd4WP?~l8:>cLO긫̓_M,`C~ M)`uxgoCB$QUnA;]7gV33222{͍HnWLlReA i)7Yyh,~ܣAb-8s?RI5rUZcD6]( p^~⍘JEa P\8O[9/0ei"$PlfmphMR,/y|S$u[W8tevKQM*.pI7/:0닻?N-Ŕ ϶SֺvJK UD!(Si$${o$xB+~nKN ҶxD[I2!xRqnՀNB̘P,ijg+iBh@o!3%'=[]n/Zib I^ PÎ $ l&-[pRn˅ =47-L,9ɉ5t֌ci/]='<X3¥N4pZw-;u;L>WFxMYׄů ``<&$ۑg[S ! &^ב_>93mϣ愧hLݹbp#;{7PAL0I6φ<"Gd^)'"OBj5X!n/*66GQ{n_8y>JIvZW#ܽοfQo_M\_]̰=^'tk[T<:v1tmxTT=d =K)Rڢzw*xMUZG[XJ4 Ƀӌ!P(U\:ʸ_~FCl~V. 5@wkB7BJָ+#GDҎ ?$zC8PjzʰE.y}'||e@m!IOJ?|NS,DsD'#kYE-gy?|㰂3Ǿp: K-~Xy~$6t%&9+Ҙ *J?T X鬺el(DU83oݓ;b>&`p2hySWyV`>jh's~N1GP]Q/ b쁨j  ImI @QqКqh¤ Rs\cB&`9cl ham!Q %^݇oG`\9D SAǩ4:_#S"'E'd8DcRnN?sw>c@{S.9@8>.}%bZO$I1%g?I$9RQЫGyhJ ǘ92:C]#+ߌ!M+wN֮۸Ĺ# p.lHflݸq_%Ut;Y23]vvW?2y95  ČF1b`ɧWm#P{^d\F^&EcPͥE\z} ,=d=ujZs3pߦ<PzٳX~>"O@d{>%3q "@=la*&=Y\1[S9?K.ii F~Xq%(sXC1EjYt=;g@=ݒ7o*3as5"gݳthƭ߷\伝EӴZk6G]+#-m*`* (n'( m2IUk?q=JHOK2t萊 .|>&}uu5XٓwŦ~-bUBYYfp;Cfa5>+*"ELdWGNQx)Zѭsˈkpkߙ-* @bM#gtj`%px^i~:0#*?['wSEZsp/Pz9[V !L+r P+< i8_<*@Po}e߬2y|Z"ՙo+Hc^ @_CdkF>5#SL) GRi޺X2-&*MmQeIo[bޔTb,Z'%@ ~Gl|"f]k6ii{7 @ t!HO5lt>[@ @ t!@ .C @ ]@ @ @ r2hn[zk՗ 8#=HDrOjG<%NKY SMM`Mo˳5(4hiypԦdF?IKG-@~ @9M';2"ayX G+^D1Ssia ]Ñce$'濎~VBS.$4[%X&O()d_ <1T}ax}.::'`H焀Hh yϮ^$@Pzec>m!m<;P0rɯ onz:& i,8R=40pj7uއ23g/-Vn{qȟQr?r޽5V^p'6_xwW}ž&<:;~#20E''|r}DŽڵuM%J5Ֆ3{R<7^QjjW%pn` /|aօ}4c&{K, F㞠[[}iO ;8xC%Ab/λ/^&G3X]@:"J4~W_I, . lqr8@Pl􅎚4""c6u@ R.{龮$YB.(ZH"DDbx^l>U-ҽEΞ=BR4Ъ*>4SjhArqej\e> <ʓ;P5sKBC/9=}FHŋvffffff.}CzNp8Fo_Wcd1޽%*9$9 `7Z`|Ɛj `U9qqm8cAG]:%dLj1yl`Tv}wŽ)Ϧ۷=LG" ˎص?p5>rʍjk3ǨGT3z16јqm6}°{;q3BHFbzkѬƟ 0@}c}LXbQ@w`gLiP]]L n j DM,p51.NefV(C-(,g=NPtgU~|aE\Owq4$v'yaˁ x_2ltHgwb%/Y ;'J2,9fZ9 pGK_Z41Q*i>W?e/ +cuMs H֛l]ⴡD IDAT^;_6{#(MrV902 ;|ނMmfŵl e(/j㒽[(ѾȲs_>xYm™E+a1c1ϣ*x@DFxE3zݺy%ѳ70En1dE+L%!ƠۖX;x` Hq?EJkMtǖ/CrG(BE( F{䩶 '9gd 43qy|>ff HBbN[d e)4rp,h'  hbqp1FA3 ^C ]1qÇMKlin:x,o7nAA&&6s^UBIt˞ ]*S.:l |֟~]`})`;kܨ3{:wH}vɸJHV.&m ]AN7%o !xOeڜ\5% 4wf67p\+F7A,4ۺjl ;x Ik;U}_N,tp:*CgE%N`:n`ϓ9<X/ԩ5pnߢvnsAǫ;z9Y hn1?9Y5 `&:r@3s֞J^ggF`1dإA]/hj=;u"8ZI!ڬ rݞ^уMl_w`8K\]o:pW~ۅ |-LI4A.;8BͰB}v@r7O0'R@7YRCE_ [`GDrf;{fhލt+S\QuS@ rm'x%^KRpџEئycK[[ȖVH老Tfʝ=˂SAGDRl[0uk P<]FJS"oZLf}^6}IMg?[/>B5-Ld?7]u\-H2mL;Ŗ`-Z`y3kڏxf>-&|w YWA,'@҈JFQ ZSC=4E;-h۹ZYUF&ƐeLL~Ň^eVLJޔg<U3۷f(H[1 $4q/)*tC8O@`Y~d<>vzTQBXeYGHM[4_8[NVj nn҄G~^j$|e²$wm*Z8yAy~YՇ@U6ta4}E{oݺm<71w9(yO,ڸYj6,:SEK>}OTET@6Mpc!dh1>dWTh_RXqd@f_}#\wDE1&Tj2b Py=),4Mֲ$nV}'lBj{xan41'5L, 6T6 5|КŘǙEfOy}e8YE_@DA].aC3lo.T(tXUv)inj23+/xbA@[ FeA.2HbjD(2 ʮ@\S8ަ$JDe]1zemFuR@tv:M@v*J> +7{AYʟm4*ԁ/h*:$1=5Q" 鋑_sUہrg"mC;՟w,k1ʤ (9RDwޑU>pYJϖ55mQ~nHw><)e˝;oSUݺ8v̰v (t)x|5-x~z 2#Md1-E%}=VRD 2"ua n} f2CA~ȫPoyi0H@`UY--V_-AY t(-Ny|;*%-Bt^ZVBӪ Js fŨJ],vQՆMv*;O[ n!Wtr2#-A_*6ԟ'&JJ`5M?*ZMpޠQLHI:˦:PNVp?㶦[+;zh܈}ڢXE ׸悾$aQDh,8J+F-Ex;eE'}ks8o 18e2s ͤix6<ڙlԩo^ wŐtR"<=qޞj4ͱ.:GRѩN%K b.M곲W7YW}X+&Ue W5̪~ +ZRȈ3K cg%%LMZ^|5}vUqvvjwÖ:Z: *o.ޛOy-.,MF}Z+~KfmKyIk ^V}kZ w\lDm&2\&Zf䭨~oM& 6#7"cj,{[(?MKNVT,\n}Kv@i Q.šӇ&XhGW?xW8ddP';D݈+qT=)#=y0]IPڅ+E.hN=cC/zn܍[z &@Vn0=q^U6dKVc}<-ghYvw}Υ-iI QDmc5qׯ~Q@kYKTYUbb>;)I{">| ٟ6@}X/+Mui +q4Mw:AdzIr W"mS~MS#H  0t,hjm"M{uÁ*Ҧf`A(H:f ڴs!P /s; ߐ>kY@ulHGA z{P a:JHۀt1-/*0Dcv%T$ "C[}c&H{/A0KA\.KXS B`%N>5߈ʸ =E u0$f?ƴS{_6EgQp^>` >|j[;b8Xך:$># %H$ >tIw|ќool Hr{?boF4܌=N{60lI %B! J ^o߿M-]@ fe.4CoeU}v1NnygDF#]I)a7t9+6Vąt!Gkf0@2 ?&_{zܑzdIf{[קWQƯͰi&&,`P>C;@:g(jhwa$[OP:7 .C ]C%m< Ά%Lu۳71_!({vl[+^ T) 0GU8wDALPH姏l[a($k?JOP%TUEcWN3pΟ) tV/Ix}V> mB;s+(@$30ܥ6d!Jfl|_s { 8Hf %u'xo9dq-UV"5>^w`˩)yL0닻?N-Ŕ ϶S9!/pf 83q1c*YO@5lZk<ףl#fvŧ׬æ&Fr4n' ?fq8ݾMDg XPxk_EmnyzٟUb}a@-@[#yERV|{!2 7&at+{n><;_uXx+}aY֫14^W$~* O3_mYu!JL|sUcfKeFEmT>'4gov~[;YHM濥H_lSa.'Pީ< %Q 3!3tȀ$ey ݇%=ʀ&h ]&w1ՁcV9$ى̄k*W6{guى'|vw+vԐj77zmn .W$WDRt'(fFR> U\{N9V W+:wلߩbWj&Fm1Kn]{in}Mcذww)k\~ƭgtJۻr=o@e;V-; L%VddkV׳ӷҖ)Y.ԵUM@ q9 P">>_4БȚ=z潤fbE-඀0.ѭeMʧJIS!|u], ײq \UyU31|Frվ m{#o?G|hվFуq ^gw! 2yՇ\c״Q`P<ϹbXkp)AWdDfyzL.vvԮH$ksҮ.d32U}˯'VTĪp[(M}`\F{ןQ wma@`3ɷL1n|-9܉JɋNm{ eh\N [M2v߅gJ`Wϰ9mښwD]NtPƥ)WG,A | + &7RFZZ6){7_y#eW?nֶ:H=Kk,%|U2?T^M첑+o*LRbT Z,?,[9q{G7iJ''P7#2$( CaƺIвCZMMg֍/ZYG!֢!\,T3=y}Mh:>K\##(4.3lTkC1U*ïH'WUI[.y,³ۜA3Y 2tF%stlFd-t oū\5rl=a kPM/IXbleRdxVp\J2j-q͗5SUᶀDTWb222d2WgP(srh9x<@pv%9%ä^1ʰ݋ u֏vyJ"+zg<ܻ{bM芙WU<}~k.҈H9k..޹{%cJus@xqʔo߻WX|,yWSֿYEׄ8p i ev/,"9v'κбp4$ԣTb7ș.}amdub.ڶӏ#T]-6?YqN6hO_ΝKSw޵6+[ο/paCD>9)|M2m,l~8I{4Е$E8Mݹ#;5hw7V*{=1Wʷ~$9L}$̻)Uv>6FHQ:vG7anp [YH{b  -'n>q-4*a;R 9땨n_K6S=C.Al×t\~ [s6@$FaVEGl먕v?I춃AULb#2wps +P?'X~G `sÁZ[iQ\#f]<{C$ky1z&ONx&H (-1,ud]^&XVkPuG:y2+&-Ţ^K Wo];ݼ6X)2_[j)EߑE_RrA M+r2\. ׶ 9v7]ۇ/07.bqe_ҷjeE2;.8 !0ђ=lnԑ 4I4q!TEcֻ%{52u+p3fVt>5N Z-`rͅlfd&&,-Z@?2QKqlǾey܉}tYa%85fGaP7 , >Uu Vm*]NjcE\`wN9>>[A~P;=@0Y@! kvX۩ע\ЯGjW2/3 KϬEMtC4"=%g¹M{YIBFRBr@O͍2u+mw3fVt$a\F*Eʭݛy;TՁ!dTogUP,/.bX& 729M^VfzԎ|g5푅mcO}J{sT[]{m#a-;{5Qxbgi "*W1^2`+ 994Mc]9x<@pv%7WWW7162,Z EttT&Svx¬XWϕJ-m'P190)]}pe2X냽!B0h07! y# PI>'Op[@פE.X +"TB=a/ - TFp0B!Bja2BM(MP9!B!BlG{B!¸B!eB!0.#B!q!B!${mꀎNu[ape`J/<$lCZ{^ӽ~T q6tr(Ϩnq;t+{[;8:888xѱgNCy[J)K!IJ EQ ^8닪Ζ`k`*#yC.:5o1f_8hƱ]^w.^\;ux<&=tΠYg)]o_kF`yz=7GXШ]3c2Mt\ e W.Zć^z`ĜycWߐq}՟\U΋Q{&} DI>c1`z+I;V=poa\F}+K Nr.*+A2,(񡐱a(?V]s WxL+kus901$*WgӾBFR(lf|~ƅz+Nvz}?ODUmI( *jV~yҖ}&G>~370 W61t%t$YQ>#<"Cq!Ffe$ `Y u+c,ye$ 0PY\cb zxO*`rIPf/.˶blY,}q&Cʏ k6-:oVE)9I8O(YB`h%}Cn_imB@@cXYWR&3|?'h3h?i;ZpqV)"SH-ȴ;W*#'(~Ɨ! IeY ( e&Ȕ]. $G%rms"9HRعڞcobj&79R _.#THc-ZJ \_=':V,Tj Bu]42ƷcY`U]m%)rkf'Nl%0tFMzR+xCAvH87hQ:̇n*&M1~nG6n2s'#'޸UoR ӏUp8[I/ AÁkv=B)%N훙r[R61"]w}(I@W3KB@Z Z ԨgaܪtKOcT͐q!s'gȊߩH]1.ҍ{j2KE IC EL[qsy[81rԸ,x^҅\CK>ǏP¤wжΝ;5i:daNB@IУ{C5:Ѯ BNޖ(5>j|\E|wbW[?c]ыq)qeSGoҩ?\u1'իoo 3P(srhjsx<-P++KO\PDGG{Ke2.r|~XuI1V{MJ233TA %M(r8 񺺺%2n J+B\aiM'ѩ :B,0˲ػX4R MhbE2BAQ Ǔ7f! 5i1  <-!Pꇣo++B.#L2,82˲xl0.#Y(e,߈$a(f0.#ȉ93߷QBBUdEA ^H4HXOC2B Vu~#Ua3BgB)ݏ%f&!!*.D2B!B]F_o20|ΩmN)yq}eJu xԽ!͎7%AZ54B!T899U,F9Fc\F<7vjVícfjt8WB  E"*2Q7K1eh*RV ,,P-}>xCcRZ^:Cuzk7z~|[1y_i>O09/XҳF׶ŰyS;[k,Bџe 1.#T~(ҟ\.nebCl ;b<ߗ* ѼC|I9{VXǦqB:"]> 1=܌"BAa-pHغE&̼u=^Z ZV|rIz~9gi9zC)vt"nLmK,pˆ\fb'SF=gk/e,+5Uw ͵h67Ȓ")L*-R*t(B{?qЙ&G?%7qrF|uG3Q+: Qi tj miTJt3Bifǟ^ rUXHoou%^X?eÆs F΍8)BSuV,7Ͽ.#TpLZLtvfz-{?|4A,fA6<PX!aAyWss'5rlƸZ 9!2^LseѧImNӷu^x-U*,я)rF1.#BihVB<~sP<~2B!BeB_;ZƸB!eB!̓'w-c\F!B2B!Fo1.#BabƬq!B3fe!B1+c\F!ČY2BfGwQdew :BabƬ\~ Lz]6%IrUl\u4ȿ x\-% lm",r*gS+yPV/_ bm'9X:#  ~cP;AXwVEBeȱ&fMTc \׀:^u?)0@~ojn^GmO4sxǴnn w*V͞=<\tr topSWDɘNٴ *FK-m| [s4:բ9}jw_O~"V!Pf##66C5'+.#,˖`26o2-~Rߍ7i#n~h?$e. Ow9FN1|~.&_[8`ެ 2KcxvV$U$=q祠{YtU[Gmp%}lqQ7_XTQ0)g|z%.RSq}B5ߔu3C%7Rnm}w! 8l22g釘%Gdno/;XR}zsIw ?;ҥآRunu\m2’?@oX!Eصلq"N?qOU.IyC!T?zQEiQ~8/+kZ3U_N/OP-}avMzһ.Wl'檦Xk^fܨK"cYy.!ze [K@ǐG"Â2UzƋŝa+: sT9+6z~!Tơ*\OseMq_.7\b IDAT߷.I5juaOncǂYW/?VB!#0,Kh0Nu6=?[//ep8BՆwl=Y1}GY;B\( XXbɨN 0p¸P9!X m! OdTɷ׸m,z`n.=uxi> $Vl9ң+<џZuo1.#3Jd߲NN읫nXo׀rQX%R\_tǙNB iV&$H`Y  Dv,I`\Fgqy]OHH Pf>:q=ju|{^H}tmb :u3(tI=eZ՛,!רo܈6Z__սy^q>q+2S`tм]Kke-ΐ7}Q)NOxj?")dӂ3c\IZ^NlfTh.1ac:M۶kVSc3Be+" eе\g`Y$H*7f1G/?0ˢQM,9|'|ĕ_djGl=A]I5 ;`DϯQ]̛^wjlkD |PpvhV @crmֈꗕq8S ,yO_g3ͭ8gUPˣKGw0hVoX_*L~gX`%q0Bvw @j[u[5.,OX^5'k>MV/Ʒo{Zk B TKeY` /$H=GY,=kk69Ǚ+rex-{uc}M|j\\/ɊXssGI>M-{w95_og'qԿyn^I,A_g_Y~Οgf~ʒknzv&N~q.zY٦%J=$,K``#w݃1.#*@h47^cn]jMks>D q㑅5;42=u]܉3ŇDd|y ,>EܱӛZ_qk`P8. Կy+IС$-ue1N껄s0tW׮4ǎ Voҹ)jZ6(݈,>%HEG׉ 9uAGs|-͋e7$8xjRn~Y\Cg{qڣǎ^WfjXpssMFwz4Yo?YeL[Fno쿒'Fkwt)D_GFc0 д 8*23|QL}k=W(94Mc [[[c:[Rhg~udf>|)<%UgL`U]l+6ςǤ\ 춹}}j4mA7a  %0X$IE_nqػP#{}z@D˰HrЋvzKRݻwͣ3?\3债)c3 C#(_gRU KYAyCx_!>sEũ&lzљNKl*gV~&$ZcӢǷqp0K[2vvjV ^H[y- ~<+E!F>QIV eE 8U,%@&gi[`Ĭ#/y_Cȅ^u2;5ސZ)۶#|*nM/ղ[ nG&Ipa?[[iQ' h/b)riR1U8M>􇻋Z1Kв]KDAN(#e ~諩(qY=AB'6#1rf_gXҹU2'.е5U|k 9o S<˔Jiaǔy+F'" Fw2e UܱElviH[Gx[G]=xBL\6EYz"34ݛo,z=ll'cԈҕKw=b wK:ṐtQp5'kn&)m#\Z1>*$})odVZȭ$K'|~&JS/;}5\!$*i3f,#`RCΙ`{i$w`njX;wrrF acrɂvzx5=߿*s[-YE;aNAM^7ԦS[3 m8[ֳ:ӄΑ[7i?fbW2h4w]+PaA`^Čcvd[ˍ:tថ)2`w2L#+ڙH[Be΍:tk$\3nf収S4=~r*[s+"|^9PoꖎSh >52ω=?>6x/~̻,9% Jܚ]45m+B~0#>\(Sm[]U]`@mWc,"?'u[sA-\gD(e;2BTYQ?mXPKJ(֡7]I[Gp8aYXGep8T7ƣ;ҡ^LOQHIByqhM5j̿o丹 PRq1nd|pl3]V}fkSϾEWoS( X0̏\G(2_ 1U sD6԰QUio'R&Y׊A8` RBKM1gEl6Ɍ?4>PhB%*d<;Zmϲ?rRDDAt9yO@3o跱%4>$ى̄kƊB&.cv-OY eSY +L \^g*(]. wi 12?惋W'm}߽.2!ٖHaY @,Cp[˒r7Qu>$TՐ a6 >p9w^!RˤjY eY` 4{ן鴴6C= (CC٦\PwoO |WFcYVTxBxE?&eJ+.S,˲,C1" ɊG- X2LY|3s532!qrU/I[.y,³6BBdFzzzLHHJN^F$> x @û -O1gZ3VdMZ|*zVVfJ$V[Pdg`hPՋuEw`\Ftr I 0xeb*oh7B$KbllP($Xi]8%%Y_O2BR Uqq}uCTffdԪ[Drsr c^EDa\F ,^w̪xDX6T*IHK.Ja\FtP].U)eWWW,o^K`r"ƒWr̾$ аK2y?Y,ޜ_dۙX רwqSs]y܁%φ=y.?il[m"+|PˀOܪ]Vfԑjޣ() "w§y pjsNt_*AݶB痔[BFe:9z>m}71q2ˢc?PRЩvK[f 6-e\l'(Zjc@ezwڤ˄I2ZJ}c%C>NNu]ڮᖆJ71T6%r}`wc=۵rIsn}֌+So/~֘Щ=s 2$FuhT5oō=̘WϿĪʲG?T909/kյoGr~Q8MCgxpqMܝ]\z]nn.EZa,߿w,&?z4swqqlnĶ.'.fw@{OYͻ8>xasEƯL@wL@rH~x6Vߌ}7n7Pƅ-vYU| EGi4@[2k;p[yFaM 9H?Ug$U$)tة:O]u&&] HS"%QYRd<|CbeI9k..ݻwus"u ;HԩwL'Mϖ y[2ꖕW4h0WתV*?yȵ())η d?eśM1rL'vw*.1s5b@e"_7e˅>Aeߜ@6B &&ko` ZYHxqx ֢@cSî!R沑D4߲[I<}*&S5C9ܱUʔ?m߫  0/=1cr?ry.44t:’튔;O_8+(kq.T`Ʀ n|1bi-xů2;6f pk:ֶ a!B\n]͜ 2<:nPFG'Wwu$]l=Q:2qȞQ-~|a%y{\B蕭elB\K7ﰍo`y ,Rlſ #P;jYϟ/=\&+e)M)%Z*X=16t/*"iÙX,)c^B5tȊxk?,RD mE@ Ҍ}u:47i+ysk<ܦ{#&dwegai.|e@44b܁.v#.A^:_k +;w5KwԿHyؑ^N\}&j N W$B!LUNL:r_||B [t!4hBۼ]mlگ$!@I7*lѳ=(JSN-lgsSE~R1!*FEZ~V3 ZYyrySJop'jVOD ߳nEsq3#8<{{qŔ6]w{sqѻoߍ l| %/!GV"d9̉X娨!B.Z$iӳꛃwd3H7_sɕCZ*s.1Pfg{ON3QFS“R)+ ,[[}ܲkq1AuhƠ28{ jɣQ誆MT!> 4AM(J O3ŭi,OoaunʠXL(J ;1Բg%|m7CY(.G C/|4P24mFϱQW tTU` u{g_&הKU q,g42@mxb@2(Jޗ?DF䬸jx-d`2Rrϑ6, /RT[5K>|1Z%%^ nG[;<=dBiy%lizzN3T4TTRB /(X&<|=(B!LECթ[K f )pgh; + _?`ug$~NvvvvQ9R9n*臠0dF<[-p+bDS&B?g9o#7-G詐TA7>ʧ:i4YA\$I! @.ս8zӂ^ 2B!Ll`lq@W.ne 2NɐҔTH~JqxeP]aHGb> ֧&(wܽ{{W7vং~fL&)u`IJ45恫YR超{6MIYqT"meg1ceT5&{ΐ(#ՖԬr)M MP%321fDム[w{3UrXۮdHDA/!t(L:LqZ{'?q䡹ŗ[hS˹T3ʁ(|S3fvѫ),X|)/Ps_ܻ{~斶K-goz##uswK߱qY{V5G"\;ur}Ui#`6|o9Qu+{llyž=%uzmX?PgUg?Ol@u3բnͺ6Quׯ[mm'!>Mp"m.{+k.s|+#Ru]!kI=V \Yh:_9i#Y@Ǫ0ُ(tKus.[{a{Tw06y|-#hjg6`^G}Ni0_T>\qz$?~efse0*'j6"j.7p}O@r^k%OyqjŴsZExpۼ~K,#]i{WATu;a䪈jvYtˢVΥm R697TH?F'XYn^OsߌQA!T%9N ok&Y@p|Dĸ< o.#>#/N1e|ݦ-[+cPBg!%A6z2Y7ۭLBح:Bi!}W(}uj݊+'-g¦yxP) &- D.#Br?'2_cHy}r[Z׆siΧN[/4WA aeI5O!"yz/'1ݬiJ&ZW~EI{{LLq7tƴ64%&?yݲ}^_GLB!UU.i5˅o ^[[?e*riw_,s#fZ >o* eB!T窵]~,MFo fc+]ƓD㣳.nд[9{ngtO v@!BeB!0]F!B;j0}WCmi-) B5eiv߉ݽzu,M=|ʺ%0B!% ue4iv-ćýWKK0q#@?Qwxӎן|,Q05M{: #cg- +?~O$tU>~s&5g}K=~]*7?5ÄF $6%z+!i0 j'  @aip @?ުQ. pnbbܵs屷seզ'=wczό3/,-H~V3OD!~wU_Zr{MLFd[c3{Zc P Ort{ЛX^͏\WYrjaZ= 8ny" 4B!ez#+? 80*85 x%~>.`Sy90> p[4WDƞ1!..-+UlYF?BUJ4fikSJDZesW%20DD!0]DWq杌Pp-d5i8ibOQٺdIH:3fR#eC x[$SDaIB!?*/I/&H ٱ>|8̃"9n臢w誑u^ Ө롙}fNeofRxM B`VUn?~6Qsglf.jJxx ~@&4-r["V.'ܜ'ɉZVF ȿ\m)aBCkfyǗKqK[qsu ;,l~lS]x`]#=,,AsR>}܋Lܢ  Nd 9~Dޝ O' SN_O`Bs InDs`/Ňv̛s)_Ǟh e65JƠULc{ >xPN,CKʵw!.Zz7Y)Q2B!BTnKKsq|)5,xLFeB!t-E05O#0!By!@;|G >|SOJLMc#f rW |`cDzB@‡irb*xj^[C̕@VBU ڞCd1BpغeR8ٴZI_O䴞ކ[~@7k:j2yf5-3D"B.#TQٺdIH2fne v-T޿ʳJVjRv B!~9ޡF{yNVlgZ㚲f̟ B!2B Co<׼ 37_zUL(O4IE:8w |]ͮ ވ7.^F!t_.8{ё6.>knRu*ok,hF %2OywoI”kQ/VkBh ke>D|@mEχW) *G.~6z߽nBeB=פ_9DZH߮7l]F!ϑ$)˥RLFP( oɲN]ٍ6<cCF?NAD2dTY @ `Be2DF IB/E!;{ ∬ᙼ{Y9SV5G ,^Xg@ {x&\¿u`Bȕr@ЪuAa@2\Na@?%}x~wW`EP^s Up ]foo%`\%70'gO7Dp5*--pbI[WW<_k}ٔrk>ʘy]7hMĝ4!QLwo*{B8Nwy-ݧYط~eBP i$|Pji媩a@?$I?ypz6yz6<&mm,L, dLB]\ B0t8x(U %GP6)+ o.1eۥކקMͱ05w+n>Ksg[$aYwڶB^AGW,g]j 6B&ˋ555E"FU**,.. WC,ԕPO?M( >UْGU ڙqѨ7 W. ي=Ijzh>7#3^{EI/4}i -󬄗OgHjLlTAe4vуFE[BHR$1T"$(xq d:{‡MJ2^K%07 =tc$VY ~[TreR9ߝ}>Y[^)L˗HQ4aK^ԸXl_LJ$"t!TH ok&ER*L, ՒCŤ%]z)>TӨ%q $y+p'oKe0faB7ϖ.%H@ <1z>':U˘k} ]ahoUc{NnPpm;CaGj"0p*B"(_ UjaT[Jڬ@&X/bbxt\\?ڧ8BU(zF@4iߵEE{R1u̶$@on;YXwx?8 ;k r(}ubv:ٺ[|2UDV, ,mgUtR<,8n.֖z7T]1t߂Ӡ_ێ2B?(B԰K[U.wת>l`kdVkXZ^\TL|inHbؾYq.`{-;q3 Z]Gt^Ym8JnZ[N v޽^ۧoy.Y9s#y]?4V9{n,4i9g>Jv#nT`wH@VpEOwp܁3lժ=jufH[FctTe(8JTAe4vكDzmZ:Ճ_hLe̦1}Y\̐q!@*7%JeptLM hTe(FzZ?\jTq_w?Զ`ǃGݹp: ”kQ)XJng &J$Yp)f$n7aBՖ.Z[gëvCbDAvOo7-y/n?e) Be=j^k !LB! IDATgH/B!ꂭ}gذA!;eB++^A][3O?{="%׎tѶې9a ; HhY׭A-9|d/Pj*SP_;4^^j4jGM:S,S%/ovlos&Id:|vqBiؼP,)N;Ű%9P|t1Y{<"+R̝#+ߩGN7fbU]Qa\(Nܺ}JUFI=Q?m; K4 +L'LUs.}xW=T"Wx?"׼7&H L;׶[Drn7\iփ[,~+i>5[&Ic vDA~*4\R^AXO= lՇyj- [ۯ|[/ھ~@ccNV8Jk=֨ӧA'wŖ?YJqӶ;C܎lhĹڊx=Y,'2v@0T }Vl,>"Eq] X":K@^Vr.zKW5BiKZGE_7ވk˻C5kizVlȹ'P<Գcw/{EeeϠÛw1d7NdkcحIk/8CVx&R-y/D+8„C<: kQys )zsj7Gngn?³K@̲G9ZzQ ';ZymL{USĵV1>]!2 \D]5װ}p[sK>Ε5Jntfjt&:, >( JD>'[oť|bc?#r93$>vSQ~ꥋ-W2>HpO6mLX)J^ҬK#PT tJ' ~FZuխzRV-3cJC(O XZJT(x/he5_OK'v,X|=_^6*må JپLZl 93;,4pŠA)sdx-3,%~ٯN2?Oe`ڌ?i3\|*hA\/YϿ,ftjϊ=54qRaZL  )ҵR*F4n^wf|CMB Pٍ͜zt^$=Ib8_,sTUT(_J(C*[6̈́:җkքHu\[kl ?tؕTWtw*n"JvwB**smg֥z{'^W%ކt72*6@tJseyټ )8߄qcO++E].P}WBoҢۗK\5gSj9-dˠmrq[9vkihTU,!I?vd6mobT{trfU.PXM{1;/+/\8fM쭃k݈ӎI--66<4{NT#}Rx6nZEs?+Ғ{4&\;R^;Mq\w"`j6^A̳ ;ڙlϴ_)jXU>\m'Rw]{~͜-4h "2(L@ck2)w4P}b+¯zLo$*kh>Dt#Ⱥn[uC~t/B?LQBfTmv]f3b0Ftf#vKiYw$0U4.e9(њG-KUmvFRO 8p<}Fjo]V38F.VTEQ3Ͻ'޵R~(ۉjuЪbFƻj&*k譏M9hrצǁ_ȩ>uMިo?J?:ou̕Wѹ*Bթ QRiI佼}KWo?#L{Mۭs 5YzW1P_/Ud@apЀE c] Tn+]փ#% )8GnG\,%6Z Imb(R)BM}S}dYRةuk)bJ i9Np՝t_L2~bE۪7g _fj>ϣ);g_4.칈Vo6l&\MFjЀ.~ɬ?~̯mRQPIW}Bn[.4>/ȹe`Az_)_-Uu.ɗn#3 4}> =wkV/1`,;\6Iٝ.yw..ڹ^'cZBͶֺPyTu;?=B+Yz6׊Wo://#/H}eO/P|Ͽ%JepMM[ђU>Y=.Ts~`hXvVt XM{éSsR*~ӵǚm\鰥m HZp|{G*_Ȼ{t\n1*k. Yc~X~iLe^EA}azEK7eTn#&O0aSJCNxpT<߲K?7GN맺c'47in\Vm9uFK͠&wѠ XMg(*5j=񡀪ޱCة+/Qw69ko>Ȳ =V5E~Hj5vay}U(z|fJ$j'[e<|򴊁u,ч߲͛#ʦR)~&f߹sȐNn2׶b  `2d޿[6cqǺH\%LGЃGg(auJuDhu r:2Pjo_b0J,ֿqxB!P%i^4D1@}UF`1LB!TbdL|6_Pӳ290]F!F#%{=0UCbB!t!B!LB!t!B!LB!#2 59YYiaP;hgaiթKѳ7{Y4?QP1,PNCҌÁCz9thҡRJI#˿qov6f<,NRO.ѱ۠YqE5^M^2ocnA+eꅨESkwWm۴uwck8X`:xJ!mӶM^9ƫyvVMTsW"zZ4obڶ=nىUW[e5'߿qz8m~cw]DL^{}rЕd}5@­Vi݈e<*;_j=>7,}Mֹdqt^x~_q+:rWr˧=,lK)O~V3[q.^^ZZGAoؼ-ۮ|$moX9ûS,k[,T)XPߛs8I79 ^;{/<YB2K[Iwp`glhĹZL7fS9UX POW ޞ ʹRۄY^,/N㙐ϊƼ8,l̀ҲTXO7f{KF#3!8]Յ* cws.d˕ z6Vݷg} l&J3}ݭL4hWXt7eŞJæ/xc||6a5lyI*튢^ifȦ14-G0^=)EQrsSHi궓U6VsڭQcK{jHR/nZ[(*}Ssnȡm7a4Jz$)zƊ+[ȗ3]EET7Rdʪ/Z&4RK )W!~{DJ#;kF`DӦWP+-fgmcu 9KB׵][Kwp"=[֫W'|{;kY[>c'7Dm!^.#-i\9ȋftlm1nR"=ԫ$Aޟ:v}dPTη1]Fg_Hvi̪-ᅴ/xuĞ AF/4D|tϩv~::!#^N]rA3fN4qkR\Vo`Z~$͊Nf8hN~K#_=[ցފj@Y)g ч`QwO c7iY^)FL> f ޝW$g6YD$+OԵZ9:0eVɾ(,~c͸T*̯_3V]y;J Q^@;o +N'Ң"f3*q*7( ߈zt)7S!|Y8m5 z^ŸjVOʺ mӳ7;eap~I-b݌\=T60$P&Z|S3Lc_=pRY\z.av0w\晿c@"˽7waI޽YQBtBДTY ?e - {#P_ߴxѲ]o4-ljt˿&^`3YrNˡcM랥!}gHA|4 ]Hnu<ZDᙍY8G|ҹR:2DNϵ!wuשTQ~ժ%&=-jN^=п3 YQґMIͪwX!+HߘьT5󡭊n*r~7%t Np@VGhUGX+5[=۞0S3(tUv&*uąe r8C(yoڸiLTh4Ǥ.3(hL\а:Z"F~MT EG^jnĦ1Gϵ^>X`䞆l*C9%W2~|[wQ U a=Z*U{jo]qSFIÖ~5mE#^$OҬ;'`4gqX}ʞ=p-CφXL^3f=7 Y; rբMy4Іu!sE}Enѕ: 4)K2wCW~'AAc ~`yw/G6ڹ^'FJTqWy5]| _ɨRd=yny7Y @lӫ?*atLxؚz}<|QT)mo[֮"? BЕ,OkūjߞkRi5"i=kPyNby֪V2g5X h.Vg]?c5paQy U k&omby5*Sy.xyzsu*Pu{h;vMJ2Ֆo#ViPq]2“Y݃@jouK8v/K )<n"X*e*.1K ߄i–(BKCTL ce2B  *)Q1n6 j3ϣb` ŀ,Z>YeHL|yʞ@q3̽aioGQw7RuxuP-ׅ _x0닫jݞmc]G6˜YYsxgm< IDAT/;0ʹ*.g5BQWO2|A. 3&꩐)|SR۩]aHط1='5c(8z*m=C4N3Z@Xq )|+ײ *"(&"fsʤ!VEO(E|#bs~3!~u)#V0q_2iS'NwJ^Y,^ٳfUt5=ۦ36o+!B0v7?붷-tȨjc5]8G]+)ZkEM;O 30sh>q&S͹zF4M:W? IHH `]@X4zbE'ck㚲VUWBܼ| 7 `]@X/ڭMkj+l]F!BubҜX9~qxB!B.#_!bʲSwF@hgaiiUc2!Q@50Q@i!u.I5ǻUmvpZF!/쌁%/gi@.OKp"j+j%rj" ΐK4?Y!ϴZ~l'x? MW- $_r`ЯK}9kx6CfT}sl V E9ÔQg@=6OF!?쌁$/||BP&#F|fKY: @)`ǂ{CE5j,勽J4b޻PkPQ,}eǂ {}vzfg?׵W>_h Mu7rF\'"ʼ3Ӡ3J^$+Cyd"7wZ+Wo% z@ ˉ$|qsߝEe2e";bPµ9BP|FNޒ7{S_BMA#K`D-unOfMZsyHAlFQrgψz돿V~pHwFGF;@8yxou򹤏.Iݚz{|)EOCթUݭqT 32+|aѯ3iBY})?`_f>/ѫG)e2@Xϓ={7왳X@P$:b`#+1OhqtSASMC?1`t*jjͅ N |Is{kqV݈9h 2Uz{Hpi6KMs;X?QCx~a|I%3z}66%tj";@ R'3|mi6߰r,SY s~&AO0^C&-sө9A3m0]T޳پf""6qgq9'Ƹ}""65r0 NT}fujwI izRM:dZHJՇ۶ݔ mЩmֶnN\eԪ zÂg*wȮe]SJ#y"9} F~䏞.3@qvm2zK9ūޢ{݆mNXyS>_ۡac^g?^R7֍KV< i[g.cN]ؿCڎ5k:-li5?MG27N:37쇆ye?d^y_~ADJbȻͫ1]ٵkW/i|mqHP?#,G{,r@ $+'NG- m)o]tv⎠|""}[Ϯxqsv2H޷WҚܧ$^Bz>|M NVPPJ\ K7$B rfb'Gr|׷#]ɷϥYu1^FR U^7n]}fjӧC-V;~^f\DD|ϰ[:!PJ9:: ;w`whx<GIJjLX:e>B P67rF\'"ʼ3sЙDRkz|dtpOT?V"& mtDzuH󞺭cy!ЦȮn3:!v@noᕴ~ Mf&8~4 2տCq ;2ms r5I8PiH79""QG7HGI Φ4Ӥ+W;tÎǭFWFX?/ѢUm>YLtNZZz|WRsngVs#B\/h8K i$~otZڨn?ɲxU1GvkAө~BwԈjNuF`N82ƷOcŖFMPnS_uu:k=Y$ޞ?wkYǷeDyuX$,x Ymeܺ9 ? Ue#hP׳O݇=)U}oɎ]K@~ sYv?@8xDZxJ1J1S* E.#{ٓhF2_>|1zU$n7^!yU }!2ߜ6yT`?y'>"b,`^yA~3ٔ,m]`ۄw;iں#Ww0Hu􈥷Mg9gK;Xq[G [-񯮟t'+,פ]a'߰-Z65ҧ6 9"حy;e{O3X2=u9Cw~AZMֱEk3@ɥ|>Klh?(e"x?I"](fpo=0ٌue|G:Uvku]MveRa&rs6+Zd>XsǴIkz }C҈CW4Od1軷C{-Ӹ_q񿵸9Ϡ)m,Dl{2NTfpֶ}Mm~7թ9fmhX%#]-N|#772'6af9nE7fV0# U/ůx:>wN t!8b80֯8c4; 2@i# w#( #(0Oa~Q*/h8>:c|J˼_I<',ms)'7L^`j:_~#{he~tFcΙ5u*ؿ潅5쟌A\fi]JN<;{޲:܍}Qܚk˿*]Xbͱ(jښb囹?}eQiP[s@ PaDzMI̖983@>N2%n&ap'6~M%<}t5MF[XHhmIvo /0(_D@$(fOSל~W-~+lvSO"nUIk-QP08uvLœslq(4o>|ύ#M(=r0xt^K@!}:}֝qG.~_ 0*Qf:D}5-ZU:|>lBPUߌUV'Y`LK84,ރ#W2HMѰ\Zeü%aDz,q,K èYCe˘98].}8" 'bC\x"@Q> ii e5n k9y}fmUSpUwh^۱fMgŏo.NGizhF$kveRIlؔoH|K~-R$EKw235f c R832@q6Z=Zzq}݌xE[Kv&V9Wԟܐ|SҜ1H fͩR yE\l^5[TY|{e-@C PͺpWNgzLf>z4ݾ|sgOtrߺB)O-K>ZF w Q@ .`TMq-`Ù=\x$leءWJD̎4j'OskΌ3vTuʭ*~*tF}b1~lK>"1ִ4hЬך}@4K*D>^D<~C]Λ/Ԧ0lJ? 4luej&-ǁh|_0\xLkUN k!EZ&__wpΚꄣ?8hR(屫z$M3M@FkO'dzVի# w*(DD.η֨aDD; PI^#Qž g[jhҳ\_42ߴ/Vn=`QV.Fwu#HBK$"RtnP9"Pğ  Lk0S&=iVylSfJ1t("uz7Yjo]öŀ|eBD[T)'>NVr _veEJ8ww)_0M kX@yB8Z2s?R9 lC2eV!+xЪ=`SNbQ[`jrhR,4gGRfE88E+}I2If8'ß cY \H~jç#5 h]<G1e~ՋкqC}/788Bf&6gtOsOC:w\nܞm}DD\_T?(ڿd-WYGiH7짡wʝ'o3Uwe# ߴ/_rD CEQp-?7_8. ]""9>NDĦ\_G\@QSoCە+¡H,qmtI8A/Z c9#C/ DZ tl PMVaOD^\̾hkujnyQ6$q ߻~`;mIc8#"eK:2*wоa)ߜ"u[ːWĵv^O}G=-Cl$|8#Dr|>nSt4En76ܕ8B]lGPV`f oraj1Uq:5~ZzZt\*r6䱡WŦ'fgOI0

OBK bYL$t[DJ"cɹEZIC2P ׊Oj_p7B}T 3f2N4{/ro¥]ݰV-aQϬ%""UJx{kϲ?d? ؿcwgǚ~gc/ ](f)/DDĦ\_G\@XlڍtsūNoda1?y>ERԽdCmC@ PexÞȉH-}_7#^*_uXw-  Oҽ9>ND 58| IDATze fͩ-R yEXNs,ѼKw-HuqfnW)h" tLͺpWNgzLQֲL-A X:SED$eRg=2@7]=w-Z*K*\d~H|Ƚ]LaƯV }M8~d`G4B|#h&SZSZHl :NhgŒ郛Uo=M$U:Ulzblxv c'|U%| ^kykudz̍fQ9cWwP?J",ԁC_ Hh~*(½'Hkƞfx+mʷT]D࿂eH. ]@ P:}䜝OF~tuaLM! E!21YH;u=<nFcQrϬ#n` `xZ}fy䶦EtjnyQ6*q ޻gvHJ3UݣR \D$Q¦|srKSZCQrXy32j['5Ѥ]go+"ټo|Gۑ2?hY!ͽO3EHdѴі w#ny䂦,+I?80VbB aNk|Ц}5e2Gcex$M{[{j{]Iyb .Urλ=p5Ct:c{_Ì_[K kq>An`g4B"΃,#HbeT5SZH! :3z nVE6g9jIzCM[nBaW{[ev0 $k#`/h]@ t2e1i"Pu[HHLB.BڹծմMe,鷷NݼgU,DЉz8;9:-~8 ](=Wz5ȂFC~|c֘T.\qt|QIQ% ї 2wB`PEô on?PZwm^PH׵ü7dݳ~`;mrgfj鸜nT)wK1p1puz8g=gcl%MD|Gۑ2\bvuHs/#4okC7޹}?^e8jX%߲@ X*y@˪QF)w/;w%:4J&U ԏۺ!f&~TU7 ?,U2ܛz,KNk.dž%fIgLM0Zz[fL[o:g}܌U5L^(ےݳ~`;m2@YN{,ɼ"FR3<ӄ,Q¦|srKSZyK={_~?_ۣh aZrQjU@ `UoOV:tkp tʘ USEnF[6ܕK y -|9]rO6Ct?8%8҅#e|p ]:\ƫ,?T/3m$Ի媿/ץebg Ŋ8"Vf8˥,[8B(J6G߰;}-ޗ2rk|`MD֝YF,;'U#P2cxIJ Gzprq0rX GL%âX19#pj/5K @I1zĒe 3!/ Ee2.ct .1, 0<>cYY"x|>LFL=]B2EEg!]:`ӳ=yj':g(gw2JI׶.{ٻ޽EaA~uxȭ~ޛl~:c64zLf=#;97*=]BJ .=C^7p԰a˿[([M2߄{>^`zy= +Y8.Vo{E,nT}?YP0cf\ 1˄%âv&"0vX@bǼ&nYN@DSW"e܆GtmRHDK>3gL\zLWIau=~-eчcX 8-&%k~;zo2Ozyꔛ-:3|D>f[I̭ ""eڞFFb&C\hz+컌%pİ2*^󞼥cy!)5 [xX ڸ'&t,_gnyUX(SEEBe0 ˥@2@I1zd1 .=V q?Ov>n5 wa޾rڔ/W䃌'СW*?ZU/B  P쾲3FOv .GNv,8.߰vc]U/kvoCќc3  P*e.â4 OB.xUM,;O޳xʆgU,>".;>r~%<6toX+'b.X2FO .Sw/(JPSwͣA*x_7Y1xxk8<\wfNQ>uYq?;[ӭ)]*Բ]LTb|y5)6FOsA]+=1ld"Xأ<ܳt~o:p|K%k" W]˘Ҟ. 0qZV*ս |" tJJP(-,, ([%7E"@*2Z-e8:9)$ѩP;@ %&==²RHIMA4JBadhTMkCCCP? 5˦fff"MFfiZZe 6)}|zxny𜳉*"峐nN׿Oť]q pDtmôm{yxxz1zGUOC'vjRolDzry"[yBK'E\.. ]RƆ^+ҽ~nC-S MVrcqUQly~=ysWF 뭾*"M,qeUHUJͫ ZNl:1b3>nF\ZbǼ&ݲ!NNc(*d3{;N ].d7vsI6>h]ΞbDŇ?*wԾa)ߜܒ@s@SnJT4c2nmv#s;l(B7 koZ)USm|qf'VI 5AeT@FU7ٹc鯲kw5clkk|\ӮF[6ޕK l֛,ұEZBYӷ/ܷS_zCh to2|?Z[noᕴ7<oO|JjhUۀOZfB"- HQ¬e(pJ@һ;ecsJw/U!{WKURN.Mr5Ipe-qNS}'R;Û)V.z Ov}$"~yx_\dZ_sՃ91t1c  =<7oӂm){{et;fקn]fyO^pvȮ-ӬmasOJsFy{{ݯg]ߎÖ=|auR "{,4u(Tn!ȽoÌ_u߰vc]U|oL2rT7&4=" حWĦ4gzttm3Ѷ_;7j>08*}ߕB3)9'{ZOIf}֭׼ݏ>5:Z.M<;28U%_ gCnӦh`Ğ^utLQ*䄻ٵEs$Td< :U(^LNDvl^2Szs)ZS5nsvMpՃ[uRED,jR˺>ݷP&Rǭn?dΞ>n/zMy]#/3Tk~Vƭ x Y I@\Tn17fzcUÌI}px2nwGlm6#zǫbnlޡcvfDDʸ Ti߾itqʤrj[ܱe;GVLdYVo:zUH-{z.Dy=<#x,aQUM,;O޳xʆB+dyl~:VN&]2r.!k_]W-o$#(7<|j_S.;,=q9ݪ021{V=6 y 4/'h(fd5qb"nv: SFfuXrcIW^v?㏔OV=LU'#9k9o:qѐM"Nn 9xe6Gz{wKg.e+ָ}nv?޲MBΧٷe s^IR L4P|sv㬼u+j7v~p_gL#˧x*a$ջ{q{ϽU'gvM-E&nnBUݫ ٤HL[_RϜDZID|I  qCQ3F'ԙfW }&y?Ov[bwPzi/T<{) [ IK"2sr7Ӵ͢=ǯecO{ɉL=Zn.$eܚC&-s{$8~-W,{1Q6Uj$ohSoW "Үwy!HJolgwC۪>)5ejyڍnf>/jtMb^4Zjͦ\ZeUe=>Q ׍ QݡMIߍ-+iI۽:?k~c#~|+y$v>=lcup*/Q7 ΍Ne:6nLV Lpʪ4bCwqՑ/ SV䌭ԭ1v¶\/R>ttmXȎ}gvnfVϩ)cRiY4* ;“N&3O*|E-ltϜwܧUׁOzw9_=.4R[ 2rJ<"NPL{"Sǽ7GiW"ؔԇs::ҭ.3dCFaԙq2T|-#;=}"57M=ءap/jUeT)c)77LU L\JTϜM~Zmw/SgWq/k"S-X\ۮŞqN?t'*wa'*ZMS;/=5#Gn'MeӨ> ̟;L@\e t۱f gM\۩хe>k9Jz+iI7rga_+ X3iC-ElC~v{?:5AD*==ko>CDIױѣ#1JwIѳ w7˿^58}[0+cgPcM?퐧cǥǤl4;qFWH|k=:8]Y+IEf6 Iw:;9!Sz`ĭKt*iڢU]?jdV'r7%6耆GsDmZv3QPVfrd:0S˦֕q[CS8ΆO IDATD/`HK3qŀNU/sy򀑍=l2_?y#1x̚ͱ(jښb囹"qŀܼе1(xPFO@i7V.zxR ŊM>`ɵu5 Fڸq7Fk$/Xr}J5QszX-Y8K "" tsqa- Du t2wYSZϸq ߡZ'oۖ\KV;2هu*%:Z%u t 2nnÐP'] عձ|rF\-QNW8ETB˖+[Ϲ$0kQ3o`Qk"{cWj;3+Fx029Y|]]GWTq:(:M'|!(9"Kf}tC1rF[X&5 oݿ{ב٦-LZYݖOR"=IDZvldq黂F,_EbNn!*0wh5̖F[M?vQfQM9Ԩ}sKaΒ[_>O]g?*f-뜽c/S-RYLDVsJXû^ޫR[4//)ޜ_1Gft{Lb_Cx\M]{8I>.P'\,;Xh… .sVB6֫ISHStB: Ի{5=j"e Hhl,ԳoPN[7XJU6vLPuP̣<T*q! EQ?~˫nfFRD \˗W>_jii\Q]Qw0\Z/U57?vb LRğ8ME\ kE U~0H8" KzQG'ff՛ j]G-9<[¤|k߯s9O;cmӥSKceҁݘ5nuj]rȺ)jIrB2uH D¦XG\ 6Ɵp߹'6u}瀱skP|mn_L"qeԟnnn|7"##U)w*V7S#KMKDZ6kU:1bs _}FD|waݟni)$"{c&.dtI^-*ݻIv-e;e"J&"v035)Y2{֊kT4{)Qڿn~GS[;#""ucW33dՖ=I~Ygg)=nbg=[:c#Fi|{;Ԭ^~3e.*״Q{Wwj^a).ek*\h>;gX sLe=5_CfcBKS0Av ]fFɑ |#>ui&ovOxk5N`W44}bE֝Z^Z~>Au/ЄV9iiSNJKӉEr먬6 ]/t֫ 5Zi^yR^ea%2a㛧5fј4q&OZUϭWz[e@蹯x )UH_Ek%b!myc˾Mq5-]h3$z߰j*>AŚLS-~l%q+F70<U9@Q<&^#'u"87;;6x6 N/^Yqվ|"^nX͒u:*$BaemuժU^]]T؄ZJ^ևב擒u:LUbGimmUcwtyoiz "&1P2v}jڢ&aܹ]/oTXzB265:ݧTqھUTDU<,\PJ$*7~9azYE{VSΡ=Z?`I~ϥV6R]Bټ* ]x{h} 5oW6h#λfq$]"}Y'\0tmmV;\ܮfu̹(55z.~7l=DD{{Ov y}}a擷Pm3fo=T7g'GT ]0Fhgn M="2^t˶Um qM9~Vr:dWz_Z2.-ݳ/ \M?B~ce.d~`?I9peބuI>?_SG-&=y^;g`2$؄lH}v]oJ""ݓ_|Êse"j̳UkMoصZ^Sˉ$۲|P-˼ =[5ḥ[+k.|YU_ i,g-{md~IUyM͸ -PPؐk#*Bɣ/:gAVjԔC;cPte'S6rZ`7wW"{_~DD,BϤ:/-ggLboMmm{KvV\g[,5o"߃wUwSPP|ğgʆ+c>$Gf )dLRN cWP}a]Vjws: {dGIOA5@qe7LY{g!\k7HO]5W3d,T{}W}$Xo,e݃?{y$s/2{Heֽ'ih/Qot ti=xjuQ70aUnS* ^hfrG2,E9`^T{NYR_ɡ3>|6|)k,1poxǡfnK(~b̽T"sjg|b:I*Qg֍]Um7s⸩+풼uo#ȝ~J֥jztҠI3+g̹,*^}fjZR9%(a7N0#<^/*ԕtл^ NDx6g""RVݴih%PqAW/ϘdE틗DjWzOz>,sP|m8'"wZo5P P л t2eAdr30u_]xUӟty_j|ޯ.3T.$"h\)Ȯъ}+2 ڙ~9^d^VgՔ 1dr h3txD'!˔k/ }gB ラ+?]ZZ qN\9~o8A""݃5Mݽ-=K616X 1R:NsIE-xP@$87xhֻI 6m۩gc ?8gAXDž=S\U%{v[0UV.4 'NEtx8 dZD'rA Caj"=|T{Y2~?Ϯ%fKMZ3B  ( 29qy\ٿ4vFm"On}ܳSqH˶wm'fIaܜ iUigȖ "Ι ]ŏ( s"e.ҫՈV ԥgc:I:mb5ZR^.3Ήs8{.3Мl;-(1"Q}~Gd>ţ $Isy1V~lƐV,Os!/.4`،_#t7!!p\4»1$ ^%y<<0{[ƍ[|wҺ/кӌfWKյGuƭt{xb7W׆n=Z|s=*.-"+B=w1٪o{>c/旔{f=m{D,f&`1A OGWN@jޕr]>ؽ$"05GdWs>%?a=-.ι(7u[^]JWu9꫆f-<ϱ3)k>쑃D I'>p䬉 ۗW!o 1!+~{o.wp{]nUr]$-8B,cW ['eǐϿ4mK˹>x` ]( HcO|L yR5"^.(W"CjQÃtF+!\V3%=3P…-ٯz2$8qmKN*((2b$~ xrTJD8#"Ms"Q!i>TjiU VQ|v:PT9ray!{_zeG1/H Ĉ#)6iLYey+Awz(IH%j7()#ݓg;5s nCDQUwP7HVQI,5:42a0@}E}~Fc8T.cBW%+3?ߏF߃l\Ú=nӲ\V9?wyGTI 5le]գ7HXqIYa  t]'(19É\#qcUZM )˿Q}a2GOPYAK?Gl@swf:ʜ^1Ǭާ5%6Rs?C#E {J~(W0c[KrkEY6z匿 Ƈ\n[Ҭ`B҂g,b"o _N<ԯӧ2r睭:nSGwLm|m쓦$7ar8_tu8r2?2}ɝSZg9*բ߄ɟ8nJy[N- Y !k"1ΉX,p9w@G,W)\z YI)dW'jn;[e+x -|lEWмBdmrfO2uOۻW/)^R|&WU+ 9'AT:WQLvl7{yjhjVuRÄSEHul6հ 3Z:-6WƇZݺ" oZ]A='\KJS6<0+IDAT4`s+ׅosSifHry&P]ޥ$N^س?|YLͥeJ:{>ooh2߻2?Ԛc9Do#}$pXɠK$.~?tccz 'DitvV_^gβʹl/9fvdV|r<ϻȈd|D.!8L pb.^']E_8bVsPZ v2&~ArRThC>yG ¹bF}xJ|ዞ>Y8V.| A_+cJr<ĈKo3)W9h.n/*u(/g}۷nݺuE-?m*J(Dkqmm׻vqQ.rZ$9 b(I~Kih@8`1qBhhԈ/ 2r*Z\}A})wvϟDXl_LHwd&lw2ӻv)!GƫjD Uy;NmMQehu?{kL{qvw (G ;rB)Z.W*${/  4/|_)D(BP"tP3cW"klv[NzfЁ An`d()hg+ Vzjf0=#<[oh}#U-{k>`<lv|:Y n¬ՐVV=AjcUU5ڧa}$Zvfc*STC (y$< Pk5jkcw8m<\a;ɼAS@ uõ #2J6R9!%H-dJ0cS{Ѥ C)S6̴,Z$ɪ.f1ijj YGDc$ :A_3(8{g5~1R9rW[vʞ ݈^1j/HKtDGE%%&֮[7&:&f 23lt OۡM K( gbK%zuq?@$q#(),mT#N0VKvRf :lGgpʚPyHϢ)u{g#!˦g5TيWttuX1EL!N2i\XZTDgzEC$I^E\KJ[n\\Øh#EEB#ԉIjI|>ߡCMUdT#f,I4 [BڵkG`g.B ߻ٞ+ ڑ;`ɂgU۷ڹBQPttnذōN 3V#1ˈ.ʄ (4EA<3 vVl 0wF=eټ:*AM4ƫ0Yց_ 13).Mqَ-ITvB[c[T;F1}9`Z`=CG~ q0ٖuTUr&@!]}Z;*ex0¶Y0>/L`V8eX\Q{rÎ? @!3 Egl'nb7nRN]YY Y۶m 3Ԯ )C-$I6[AmU^YM/!QBVy e .IRAaA(q:A6bKv o ّ0:"JCE J=v8?vQF/Vv䔒cǎnݺ/,,lٲUvvCx՘0憬z"E(fõG)$4םKl^,[]8AgVZ"H7k9ڈ# xAcLj<⍦28 4D=ѵ(: (petfpDOևC;X_8D%.R1]݌ ]Pɀ;D4b!G0 pP`|0+)^#>[mbcv{^?ؠnݺpwm۶UV9.ÍF@\ޭv:z#LiL:`xԮZ\\l tXJ4>u3rm6 fiٲUr0(x#B6z ^Jw:e>8/{mҴSKmp_nW\mٔԔԦ͚ٽdɗ`0!!1--MfV&0Dg6v@n0%BJB;2b"%f[c x,*b =@`(aCSءd L՘eXlh[-MHHm]B|@u@1#;7I )XˀgiZT3R@S ˆ35bS/+RwqI0k kg!Gs2̬7Y! bOlu޽+{pwرZj6kbϞK" &$%׬QCe}L@dJJJJJJfИ5BY+d]gB^F{li9 ` 6k|OUwBbZj*+ u';\|3?Xs[Uv-;TXTpuxm^'%];wqZnȲ/+#rs~O8iIK̼K IlV<$Sy,IHhBV!UE ͸i$bC횪K>@@G^Y5gpUM}€IԒk"50c-{%K5\1vS **?¡IBƚ (e/ 3p~NSC#zwf fBd}0y<^V,ÚaI$kF WtPvΆ_kwvaCoۦrUvܡ7 ʲ2&Sfc~8=(ΪoÆ xٿ 1$I@+(  6*( 2_+eG xp+W xL\@yVBq'_M"r4+RBA%$u$MAwL]H^fRh Z)0Fc IxDPU>f57*;Hk ѼOkv-Ac*ZIaTǠEE@jF,Jh&8Q4GX"K};4cb}$u"c`%m 6J @g{i} $ D$,**T]vÆj;~D'Lyg.$'tI wUHV$1z;ИYƒfx7lЖYo%%TxϓdK!J!IJKK0'z@zY~ŊTZ҃As ϭW6JXOw>9C;V %I*)+;vX^#}v[6o*--[7p]^|汁#_u_v}pj>,`q)K`?j<ă )h;F`#,怙SbE'dq(msjy$C!hLN =Oj34-(ӣpVdfXBυ-Gx&6cf8-kӇVUBMnb=`bf @kTo `cDGv&l%ǎ*]ӯ5''%%@6oXVZjg3f;v7S.0rС:u"vo޼N ڏ%(I$B}啗.\x뭣ǍG icxppcB Sf{^X[gϞ5k֬x0%9EvDڵ똴 0Ǻ.{Rۿi~Qz|xd׌[VVZr ٢2&&Mr\1Hk5>0vYKo+t~+-|q=A% ~דw_Xظ{{9()3fي׽Tv;G GGCG~{6CL7" ъ]`7+7,!fRFׅddĮT $`˂Yt1a@yF*TEb!r `KdG3#mOPPiIiEzJI.W?e*$Ik$11(>ܿqƍfiΜ9sYiiiHBjT+ބD*ɜ9s.\إky|8k0+au B: A@hȑ 3fXvk'!YP%|Ԏ1((+v */CÔY+իE-8ZB;c /Ik[os\l(S<~(GR`OO[|ϔ#f}%>x˚쫷_nP^>9r.)v?Ylv$lߡ.tMGgwMQy(xLZt5Ir>Pb^E2GtφD;G?ɛ|V_z臿m:JS>*oz&# V2V;2h'-rØ0QuY2_Eapdh\۠Fjaotƕ4K1pLz|Ԙ`lV ,Pk.=gfM'nqaa4̭3,< /[@B+דX)/,. Ns#Ռ![qiEÝU^{->.cr5$=+BJOgΜ(ʨo~ߞ3gĉ)))jS4ffDDnsU+7q!C]3"4 ;M=559bĺk׭]ۥK"hĒXNd/OhVmmY09㜖3 !w|y}6劚?Pdn\@LL ]j҈%U粇_%wӡJ_m>X<@xhuO7(~e̚i#TesM2B.I0Z"7/'B$ESn] `P<>{͢`ͯ7IOnԪy]ZUoVzGc)(oױ $XDuVDqD#$?")0V0kTzD_]%u, ^b smص'-pq5"!H$[@^*;P C(Z ƀ$iߢ.꘲rЮ9QnzeKEyGvYzc[qO?V'Ұ*41sE& ͥAc,! (Z/  uaFTSzƀ1Oæ$IZxN'y(***g3331pt&dx>#F֭[~ tZ#g pK9#G=g΄ 4&EV|>}u B XyguuyժU 9r55eI`xǚw,!'%5Ogo5S=ۮoʥHz(w^val6{|\:rLvHױH#V i؂y&p I@yt.IHm@Qd:'It HN$k.>Ήd)d>;k^r#tEa1Q#HMTós˰T}b2լFJ$سaZ_ך;5+$UC[3!_>2 `V-FG$fQ&϶w#l t Ӡ+ߎ.([Lh(`(XQpgO,\nБZ4ܩ3Z]*+LnUÇ,\p1 RXIj~dIjj*8lW]$+. h`ж.B aܹsνw z|M#F@7ш'Xlzp5oyk-ܮ wQ/;z6m^79LW@ !!!#޽{7oB8rp͚5`0"-ϦI7K2q%Pwڛ6 vlGY-RXI\1u;=ۥI@f'؞ꚴirhhI*QI\_wl% V'wo2[8|GJ7OK(623EVu'!,e_8 <4Ke P~bdp!̇$1GS=lOX6U?d7L6RXg%'2 fY3 QF\1V>L!\`AhG -kLPe L**rbBbFFܽ{[hAxR rЕus/4Ov#W_kK4>Ͽ"šw>`KS^y]x^jl'gd \HSMy}B 3T0mDEʺZ$K%Ͻ͍`IQʇm-N]0bFC cDWdO jp8g5F|?H/"`.`}k& $ ♰t#]9 c, ybFF̳Z[rR|`h!aF\n@ :ZMo. ä$ 69fiY :a9  za\C&e? Xqqj*!5{l.+|͛7_uUx#[iLLHЛU1>-[|̀*66;hcyӺpB"L5j|駩o ҳgϤJWExW=)kZtoӬFmGw.2-ZqA\ ;Q׭߰a}]b9^lhٲō~zmXq EwkİpPsHm&[a6#`a=ߋ^}g: ++t % h @#!f&eD"^Є&iVW94a%K+[` q5p23eA^kA`Smڌ}Eli˜6Yc齐4T[ &2څ.2/0a$ @]c<&W7TߺUSIC1c2zsXuj;m~HN1 ! a .z 6lٺqƲ,˲LZ=;N6gEz7)ժpN` >P3'ji0t6WQ. , >N#B[o^211h_+f ivU B5}~٪Ukf[&p\jOؾ}{.o0٥I"8qɵ^ڇ21T# #oM[nR65hEZ Be#Y^Bhg,hת$ aO3e0T݀T)fg@n4rfY 5?082*6n*ThpdeK>%-! IDATmVr JըzsfkbV*$ EYڲLteh2fX1M2L7+uẎBHu١6#!BnZQm1F 8VhIӺ.S*q=!eu{E"75RS~6fJ2\]B#H^C#`P&I 挆աvF$WΖ hܸjM(`֡kT#s}a! [g2y,`}iјcbc].W~_u_^EQ<jСcǤĤ@ PYY)H]ZZ1 vu-}Пt2fK..Q\F$TA$꒐ȅ0c `828uELb vh!UKtȼ͐`m-%Â^PAЍ@Tx|7;&P-0p (1?01/nTY{2(vX:AcV111 z=p: cڡObƣbccUTVJVƟ4jcI8.{ySoYRcs\1`0x^otLeSY)!]\3:&pvaė[?ctXf=#W֜:|f̆Sy l[#6q72g  h'Babf6[ؤ$D9Y\˘(0jv _ؙ ،!C]MlSE7=b r(1!<O;ΘNglly#O @f.Īt?|R~SڎK*Jl쮠n8ׇZb{7^sEEx;FjxMEb1!D`f2AN*N)\wbZl#Lc.l\~~EڍvddӑIZL@LˀjNr1w_U f\B+D;ڝ"4Hf%"v*"=֟x~83bP'$HľV4 t1Bf0`edO0#Xj[B.ҖN REhE.t'$nP0yjP̰R7|r9].NH`0z~?X Òڈz%)v݀P0X|6`cdj7?up4Pw|^%H/x% 0m؍jw*,N[oM[*s֠ VF]ve |4dMʆfT{wqV@GzVҘ x 38RM0+XҢ$A2 6HXъ/#AQxXQ`ftG!!J4,k{ eC5?~K*W[P "c}^ ~Xhb݅X>O-Ejc~&pUka?LAuxl*KcI>>16}|%{` FH}mR`X3qSka;`k#Fu)0@h0cM@!-QճBWlmEi~ʬ@p-4B?Zj(֌qn0~H dG=L>@W!-|(AA> I/(˚0|!6HKS`r {`i2H$% VlZ3VlÐTT~*/ڝ>4\1m_LapS7{*DG6KRy =02ӫY0EXP֍if(j YOJ2kUg]Oj^}8hZv LYA*6c_ufِ6.U&,f1P_uH 0,> _5R5 MAJ`r/{ukTg 4,W0P+klAck oIg6UE:U %[HhU)vR-ǃMHh0IKEŁ nsͭb(0%BR&T!IqsƨTsݒ4z(P1f2)\E!~Baux f\ՖA0  S80UF! H$  thTl"j xQL[S!Lej7b=0ZE/0ɨbOaU&߰ɻ5 fDƈcO`4Sf5yh` nP[aK" 5WPӑ<XP'`3(AjpL" äB2&KT-‚F_!TCL_]r 64Cn6NO3XXDWbPK+sd=1i1:*92%BLj!vCu/"b\8~PV Gra&s*hXKaKvr 8$!KΤrNYx 4F`Lc0;MtD(1l^&SF-{1ຐ9 _4(V!ɴ'fBP?rq N"U_V7îCgHb^Y U*TVtSq1³Zr?C?CL^{Znmt^\2z8ei=$ /AxyAn '=DR? 30 lzYFЖjLfĻa ~nb9^f!Lhor\W 0FwU|F ИF.H5ֶhp6E)67cK3 E"V:Rpeg_+1d`>[.Ө 9~_iax(rV6e`֍D;-d>*__V[foEge?\MlZL5B~ +)Hf HnᪧxUD$3FWWIivt-ٙ;~}ԙ &Ȧ2Pz+ie'a^H{:k2*>S?JD:9Y0OlГEhD[N2_V%MQMr_mEg.K, u+`CT$ޒd(i!oIh!X }8 Ӽ}y?'v\!K - djfeD_Q+MB{lu;R0xDig4VL_^s`֒yNӡ,fA|< L sp59  >QHCf.r*v!eBfcl?otGD_?l2-P54A#FZk]7$iokF'y/`c3~̟<'6|\ fj-1gS.Gpg%-%f]M6c%IŠ>ZP40#$Ukv,*{I&0[rZKS$/Zkm+,o:vĖ~"I_EQ [zX?>ԺJ+HnevO[gD >䬎Ƴ F32,> .6EIII>X/+uIIjg!&$tg,D@c6Tnz?,ʵMbXN5ٱШJ*~ǵ2[tS+---33/hfQ}°DST/7_KV! c"<+-1.׈QC-_آCOy3z4 $)lg}NP"tARtttlll8zW\pוo>Uâ/zɪպďW( ϼ$-%}Tl/jت}P>fStxN;noS[i]]ݚo֖? |iHNjտà}SˡoyU352\KA%Ă-n˴y7]=rpk{v+5?Cb08 \Q\{pPK/m4-y;}ՓOUOl[kY5u2b[_xKO ;R;S>\nIld ^ކ=8˷2ޟSOǴ=>q1stGџm p@<μLp֗OxŜ {vKȯ#u/clvڵk׶u.i׮]vzݜtlw!kI\۶fv |HfE(BVDQ8p#鮱dQMTuWYŠ%Ǯocsr3ʾ(OwN#9:}SW&Y~wk;o uo|aݚ5h}Cy1Rx-I? OF.sUߎ@)\3o{ͻ Zr^:.*4![ o+/ (`A(~qS?\aW\mClwaіGd7nլߢG*,j"9\ {x }e("gJ`W˟=pug0{P@1;/m=ڵ{\Cӷڱågq_vajڬt}ix`k{nޡc1oU]:s%:}wױ?0[=Ǽ6B?< AXmz$Y0DՏWJqjm+&*]YqO,šS޶woo GqR ~;{\;Ռ5{rؿvq?F"y2qN*R~Dgݫ}/wVï3eLM3o~5$~zj۞3m_[ք;uz=O xٞ/C}ӂAE?O/Ջ'5}?oqހ;azwq ^Xm:iy襻{y2\qp2lɝnir(z~3P3kʗ%PV\383 p§+f}oy3fr@.ӻr|'_zq 9y0Hѵ]84In|Uk=J@ޞ㎋_" +3}l Aw3J׍թSN:u3RO=m#..I9tP8xI`i WӮL Z\tj|ip0gΡ G6~pw{pwE|O@hHnN!+Y$Gk^oq@r%7yE,՞jV}Kv0A9{ijfp须/kxbPcSs ={>{+w0{jSr9$vlS| l󨢢2'WL+\yd5Wmuy+;':n?aK%?Ex5JRb o-`&x y/]5eUSWxr_p8'ֻя= KV߼ _zYiT`t IDATo5v-6#>+Lh)Y)7a?۽;Ҕ=S#tPO<qw۟w{07ԫ PTZR[Imom]. (;~_u@v3NIq+8[Я8V)w[: \zv9t{yXS5A`OzǕY7vr[OϼtоU>jfY爪yө(nsďFtzͣ2|йӼWݵlu-7!XIK)ٷd\Y"t~+~}VKK5ڵ+;; E(B<o^^^NNNj(n+|o^#t&HXIO/S{NP"!J]OE(BO ?wZזCוw:P"E,.52eW7bE~=cXg_3W2uUdE蜓p+[by>ӎ3$iA62#: vXa/i񗲔ϙtP.,ڗ=(;/LwVAnNqW{|ᠩ6ː}#5x[HdФi}{s EPI}-dXW>uIJŶ4M'ܰiwHMzkW4W~i=]1fLo/?Y  VNgҼߎoo|ƾV}>||c"~̻sgyyN+ _\܉E肢U%h$ fǖQ;oWz[xgc[M]ue<$>3WO2fԋ{[9z oVYD9R;Sؽ]ց1 砝 +PD-Q~;twZ|s@FŚ#o9kzPok^… n6P~Ld" G>C¬¾L*Kڮ~sgwָ벣%2vrF[W{{ַ7AL>ʛt64ޞN %Zgc}cVV_  1{Ep^%\3yo}T7 1Ovb5$Ýٲe-w!w-/ߪU+3 E_G'6F3X]ױ{}!R/Jom-۳q=ߟ<=r:,y-*k6Z}/y'F5}!BZfUB̟WV-6m**/qLը?tů%g5cE~P٪ir5f:%ZFTBTcfpQ uzro7?i, %zkMibeֶJ(}ux/CCwf!ѩtψU:g،E}?8׺n_ꝓ7(<^ʉ8vɾs}&:OX^{{V(qs'mW^eK{\阓U?uP^*wzqdO~=;'yiE^-bڨ^͋wQ5`֠80(ҕ,Rjr~wN|'~Ju_7|՝G6@ "%߾QeECֿ۠C!Hqc޺zɑӨIB(,Z>m\c_*q| R]j$Gw/, nUv Ŗ\s*UzeeE)Q˭hF]d瘶zl::t\UЂo[]^{ Tݎ,,Z|ee# ]dR|QYb1{jS_ݘ_>hkB(Ei'U|;+c"Sҏ!t#)bՏNd}i5j,[Ҡ)o1!\ V#`GD3Qpe7[(:K |rm.2i.r,ߩW_[}Ңȷc}*x{X*E^uI-aFk,@ Y1{iYYלc ٧$ P{1Vl)?Ycs{=cSQ2Ew0>o~$8y}?{Dۉ'&̮x?9.QϝG6W'N5|FNĐ|Wֻ;nهco; +7_\x~ |kԺ^W}_\ykC-`~es-*hϟmL_KCVG,3o, }A8?~՗ؓ_%T=؛vqdu{ť?y\*%TN 6 G>):QJ{g=s+doVwG&ۓ*'G+|Fz+e3̇jr<ު[/vn/fc}lGUyqX 9 k§0X lK,+b2E/=~۔P|%ggˈz>mcq+w;Y* Rjx{lҠ\v⃧91&;$R3:&(Tgc*F|3w ;(|y€wǒZQZ㞖S۱"?v`GeGjNyqg'yCqQjZ=Y/]K2hTVv{ZTN}r׮`*1eZf"9*ᆮWo@v۾v,+.5KDuHMzĤb;20|`1?ZI1Q6PVT5K?(JKJsK%+EآR$TL+V)ʖ")Й?dCoyni1k(@\{&Y`6HKNPb'7y52wt'))7j|Hg:]쫓,^WYhX]c(/w׼8(9ɮ'zOs)M rأ$pS׉~'`dwOvJ)c&On< pL+ e{bdwΤ w 9/ H.@LQ*v,|ssO4u{ngz̙c+-ʲJ[T$8L-H{Õ5\ Jʂ2J7< F{_HpQ5'FcGZ]/*V)փ_w(BQR Ic;変j)& SYwʗ l*yN&-+#'6w\6B#S1I!zܳƟg].a0;uUQȿjd=RԴh݇};ߎV|iWi,xxC_u? \x_o?]{q(}={|ʺ1Pq[,IWVp|˯|&iR+4\ Q%FF1VyLsL!Xho]hϸ@ź~J cs-0c؞gxﻧKS®>O|U\,;fuk%N7U6Xo.Zp^ܚP|4|E X[>tw{ ZcLdn[ 'Y^i}C%x|ϐaRXQ^'s_~rHqI+ƪ7){{5bb]Ͻg|?tԧAH0qpvMYWc~|⡥_f֠5]auܞ[Yҩ"Oeӯkѭq0{ل=n[MnpKe>'ތoZW?/ڽAVVVjn\-w$޸b=S]'^~9Wai,х@nWܳ7wx޾}9 ~t/6f}пώſ?w:*#&;V/|>(94|j>_}QS[|XwqMLT [{Q:Rh]Z:pֽGq:m'BGH $}Ǎ'ܓ=dm9ʢd2J [MB!n]dF(/AQ[iN!Rz~7$l~yU@wt+H K?Osg*Y~~fd0iJ֊QF$s~؝SJ:b|S?qUIeڿy'|P':buڪ`sBHyN=AAUݓ&ϱ-v3* LqDI T-9Uwnv`JܐNlh:*H,8}:CFLuv4`t΋S:1NJWvxᨔ N܍5]ޮ>L6dUJ=ipⵣ)<$=iZBŒ=}u+O6DE*/dMTvFBeKiF&ivA3wϊ%|4~煁Ø)E7 0#"͐){>KB{SM-;wYOR> *R޶UgcPl @h^AjA-bͼx$dDm$AxQir$2Ĵ7Tt Jʶ d^3#"w^5ɪ[[;<7+G*Domf)N ٖCIc,]D5Y~=y`泥퉷8̎BNɬ~/;#bI+OB6G^8wh:Zd~V]W':5ΩBTq6yB1Q{߲ _DzDŽBP(1θM B ycXzِTmB%h, M^w͓,x_\-r&r ,?ʣuNƘLR7QlT煏֜=ͬ3fXM:_(!;BL7*p/*л# ШOW;IP5`+;Tanzmh;%bxp/Tno,W_X{)믍ry0v;i4dvl9ej}3Z F= [B2 hK#7j%ЍPCUs,V?+Ƒ%k:y #pLޕn7`Y$Šb߿ٻ>(vvXYC;.L.TZUZ0plja$+lN̻+AH{-|nϹ{z1 =c9/#>mk\wh2,66{n{*D^"ծwCL#,}/-Wyd3Fr"X~1 W0"cJip.M[jeRZqiF֋QMY̊_I'VB.Dž" KS/:γ IDATS#$.I/_l Q2y4ps@ ZW-weQī^cS3\jNR _9}(*|H7jKɕS\$KIP&!4@iM=eWCV*R9fȞm$4dޘBȽ O=h%"r'&Et9T~U{f>gc2 cx/T^$.=swvD]0MJG'~2ØI/MU6: @GڝNM[D+y.,شtӅ >ݴ`IrD5w9mw@)X Mu^U̓斔M:/|!l6 I@W"` cc B$,ȑºFL~־][{ |9ߟJ=7UB /Efȑ_뻬ϳV3y\|zV:%7 c^wzI?tE]C*/RRB/2m_>tiVWF:ݍ*yy+D"?Q:RRmUNd\׫T@x`M0. z[I6dI]6Ҟϓ>̲7"UdY}yݭՕ&tR&)q=uKف"AHOKřym6t%Wsb"e~ ;6sq̦ G xIV$}yhL<1=FzTVrɜt -gGz\,ܺ]G]zDK~+qsKPY}EQ~ ZɝcQi>r;b/,6i%}OxE#BӢ*UH@6Qc|G iJnw<;om]+zw*!V>x,'edاM+m(h꥗ W']v>[,xkljFzKB/\{,ݵP)> g;;m o×w)V3>HcчWtck\9ŕnI4jnFڇ\xirبa~`DcaD"1=,9ΫФfC} D3@w)$dcYaU>jNA/jzuGMc~q9i\NTq)`iJDAZ\^B@`J(SMYLK(BQl{~!⒔!~{ˤ)FVD b| G$!{M\X<ǣӐ{c JVz @-~Udᅉiyof ?!1Ģ?'81)gSV'.yjk 3f;9~XGQ/WIrQ~PKk}杧ݵO.}:QinK-!H]&{ >=޻?!a,Zym=v7r "wӆ.&xI穨Qޣk? qa̤UY2׾*8\vϱ x4}l1v]c?oxhţ9ٺԈPWg}'-h~Lu'{9XoYSB~W>" 2nci]َ/=T2jE!nN>c3X._&m=\(*^z%Qe>+! 46(آzlߦX,wM\*@KF>HY+qa\A: z,㽪*=E h4=W*YSU*#ۯKY!Ь)UyWBΖ`;KBOkqOS}Cgs藼uΑ>!%M7*Ƴ iLIMIkZ^!f~žOk2JlIilB+},g>_PX=XKtÉ׎Bj!I3o{W݀g2HU9B{,.~S7[Ij>QU;cK_]ohIU̵UGIIayc$'?M~gH1Xˣ@~c380+bW mw8{[3Fe|N3Z,̍>Yܗ%{PE > gxt& V()*,}/-Wyd3Fu:4"f̋'JBf~39HUdY)ˏ>hCDeiunJ6M ~|BB(xYtت%be$.LLM٦ m;rEeu+!rPYVJL6EJ$3YFxQr1!$K}*0rPK^3JJUlѢ ]%KpqaBޕRD͑΢VMEeldjDfwP$Nٵ:}+p @4+uFI,V9l'G0`d6ݙy[ Y= 7{Q|Nr{w~l[  H󱺻b"tBS7t`="nnxQԤiۀd]r{AʲPMMXm=P+91A|,P z> 4V}aqemM _5 oO.#ΕQ䞣Br-[{F<4=lB~~u֓㾤 *۹>)6YcE/AXT&/hR{gkŁGZ9|K@wOsU9mN-RnWqFV9mb{ +~~p,˵}}7wt,ѫ R ќcK󱸯>p%^tчS29/FL`CUA׀^%˓qrtL_ڵ*0T0\xPSI?&5 Db h.OU((,Y:89&ީ<#7>kʪU9N,GOZj 4Z*x}nm-@,yEv$IMo#)BjeU^txڨmąMtAK܉f#o?I$b*JUB81RWo.wk˦^xOG]՞EUHZjz{Qī^cS3\jPI X~l}KMhSRG ˬ#\DU_yGCTeIf܉.m@z3`=_[1>۩qx-\*B6gjW+i:K6#++z \ I4{LB6f5r;4=VWܴO*VVjuYE!?T^t|@6k":.7.3fV:oNDطܸk?~"KXmvvb{9}DiVeQeaZDĂ*1\ JCgɅŃ|<: 7PRN+Wa맒έ˳bI R *H-7`3) ionN8lc0fƓYv#Ge BFa8WXmq9i\73̪("ɢj #wjJolL橵Ehy,p쾩5K/u+&ʋ::18ESR,.K;Lǿ,v;şޱʳR B;Gak:KEVꕕ%%{t~g!N 34 i bMy 8ŎW[ 8Eu(:'+K>w7M qspt{9mw_Y>4KRIZ{N-' Ki7hY+J+m*rtjRZ7NuI$BUX7kQX4zcɍ|O@w@UX9s×-tT~-[cehB9Ku.Ⱥqzn,ACgETvVoѾд4y4tK~fw/>F|{9_o=/wk :ؒBH}`i)v> q3qY!!gK";mQ,AdZOsA#ܨ ^{q6&!D6qj[Yw):Sە+z-^lcI=T`Mݓ& ?[:,B@y|ɳSm5-?aԄìIjh[@iR@%} [I!T"3w*K>t}Jg inuuB sS$vVmUtfP@Eey2lIj1‹.hADT!c^ֵ)Y ZVyZ]!d޾Ou-zg[As%T\h3 nd* .pK%IʲSJ$!,/zW ޻^Yph_/U*F=*D^:ہa|ok}~T+K: nH(UwЪOl]Cuwwgy?X`?i΁QwK)4w R%tvR7(w_ bU[  ރq{kN`v@U9U׀ ~ ~h =%oܓ$it'-LSc!q~y;e;]}{O\{%/6)l *Jlo-rwtZu4=ΓX'}4XXQbp&,3|*Ѱ6:V2v,iCps@ rTMiP $Hf߈ !m o×w)V3oCV+F1HT]JJ,-:McUcpasL]956ֆxiVTmN\#291 9=0[B02t7!V4X93fėJsHs6"j/ IDATNR2k71!vd_ W?W "1Ģ?'81)g仧&Ǣ:[?k/'ώ;']N&DŽBP($w6w?|L9G"t[$m!D223woW8̓4?Ӻ5!֡ݝ zXsnp>^gȽknkG{~snG8Do9O R%++ͰJ܃Eh;%b ښN97sc<@?@@?(f:E=9}X/Tñ U t&{,i>VC)W#t0:o|۱oq~`]9D*䨙rYjC5렘yU%iJ+0CZ]cX*}!%!$}UL$%iKt>Kw]0& !TtHN!p,xDyQVG1h-@~>tᅇ2y#!I0}s/=cSJ!cna^-nKWkA tKE>V!aX W>͏w6cR=DPaٕ|,\6hS|,  ~hP>[ܥ0v;==V!wGN4w9(Sc&bkj*}c`hg:WT;ONv4~! FH$] @!Hhj*=i i>V鼓ї̈^>|"keD&5l$eB 9[zx zF377xI oF@c`,,,껠&{,i>i>b ,_YB;|Ibvǻ3BΖCLyvfux?̉WKMw?e7ܿ>VE(qe7査簻Ӧ=p;0c%&9R["B{~*0;;ҷ="N'eedR 1R=&@Νh[q9[>cyd%WB3ݵdPqsOj%9eGhIDIG%:fQcYrrOV_z5{1Ώ=զ>^~ve;'N4􅁁Mcp(#9fi?ΩtB!}DJm=`uʁ< B% QOtalCv6{RG3k>suˏ>hCDeiMh(^cpasL]95tے!?I%be/,fE(}&z災Іv!m$@f1>[qiz ä"j՘[POZZB+qpml͡ BIE5n{)f12@SwYՔGa2‹D])!A^JqS _"wӆ.&xIW: .ɪ4Ǭ[~yf4fz,( Nٵ:{{@j|,e685+ѹ𥧓ʔ皐sɿj6һH_VQX An5rΑϕ3pKat"d@c9B7:e&.pKw|,h.!eWcuoO.#ΕQ䞣ZDwzIATķs'}*Sl|/;ǰ_공]D"z PBH$zw*M .* K,Œ6v!  ed2!4!v777v ^cH$r]D\^^ii<}^xn`HLF{4.DRȸU*{ޑ%y<^st:MwY&&&ZF{4.\KG R\_+<K3Z*rY:ʦxZ۸{u0J$ʲjH *..z=pO2Iρ>9w]vu3Hwoם=|hy?VprN,'˕ ipⵣ)<$=iZȺT%r{

~>|U5g:y>%M tvwlTVoٸ?@58E1GM׿CȈYnpx7As DϏoyXvDtV5yE܉f#o?I$gt;pKӏg&?tBD"_:gqCǦ&\fM"¶M>\qoͼ/?kf27| 2KJ夾 iqʮ8gR$z`NW9$MɚzeIyGSY 6vi t9w 8,2C̟Fr/tGGX~tS6lo(vÄyWv|٣?vlfjsbb }&hvA8B2#<@RQ:]g1"K}(*|H7jKɕS\]!z@/Os j!&YeU&TՖzd/s3/( kLMɊT=CKCkdWQ#Gn D8Vtn>ujrL1p`Pة=tkců]ow>+I bޯ]`N#\yhhiH+_ݫʸr\VhcnGr8ğIwɌ$ =:m:vLAU!.տ};b0ɱŲI?*Y6Ἕ*p҆MRvF,p!w_E]<*$>Vؒ=G-3G:҄tk)x̽\ #\Ϯ 7N</MG>S<:D=kJ5{cEގ}ˍ' sKKV AZ:+<.l׀E"LiBB+򷜝Nl!?/Szlk]|D䎳SܫFP9ehi` j>j~Ņ/"_1ko]w>wDޮe%o Žt|Tgo.ޣcX{"N:Y5O~-Qm6{<R"C91[Q66CGO,CwOM3!V@u£اpڸ'D{|2 rݟE U!u㼸(g[+'~Վ{iI≜>y|IϷsX0j?ϞGi;(unQ͟vӗ3;ؔ# ^.pkԣ>qpqŋ/:W+TM׍zjj,"qYFXQb& C}l t*Br Ue+ h'Irud*-"(5KQ㜫T94WFҟM ? p D):ӈTNSu,y1SlzL;/Ҥ1_iX( !Mqfώ}ʾvLBŮQl{V!5~Mt c> d_gm_oZn }92lC'O$3h墊=ޭ @Rvz,lʢFDɄ$V7h`9ܜ21iiB֍vA8^ǭ4~CO(q$)s N~dBֳ:RZ&Ǣ%yo E!yɞaOpHxLLŒI?JW,dssulN)L/ʤ{1WW;ZRVPnH:t!x^N! ӂJ"PTcSg2&H\YJ4q3``BfNfy":O\xAюHz+?ܑBm+\ޞ]9_׎Aa'JB!AuֶU!lxٻrDQ;>ŖNF8BjboHU,`.k%& Zݸ~꯻ȳ"n $u|{3"NmoeB$.(%TŘprԳV)ֽF:瘎ؿzfS/hǨb)Tg"Î-=i$KQ 8IV!Zg|yu5}P;**RlDNN4ʑZ9ɧ;= XsG&"ݑ/Nq!_,=qK^JrӐY䜽#'yiELFxۢ~!APZۑ+_áeV?kv _}ժ]~}(8 aϔmA>D,muX*h8J6b+P>[XyW_5Z~r‹&]H4lUe٪bWmΨj:oF/^ mvyw\wZ4ՄM~l͞$7g͏r!i0_wfPأb7@8BD.3 G`qjM[jlFPR6I{e1쨨3&*`$C&Qw> ]Ne&ގ}R~\:kZڍXFgq5|=efF1 HC00ѫ`?;B/LdbP7 ^y@s2ih@+.Xψݷ\ٓN4k+ʞS(GLOPK}}j:P0\ό9qdmwsvM^Z0K}]w9 6'>ULy ygФ;}*5Vz~@4 ][V Q|:wf6Gx٩q]CH+Zݩ`oWw45󳧶`cEй}}ZpdۨEU;D}CѳcǠaO--MϹk.w >@E9Ha`GKK K KkN&luh_v>n_ɠmh uY n쒚Wk ¾='Ka$oNt:[05՞A,{bM B5]4q Rj=Zgt`#oGNB#+FK]41g=h.DIutpוMYmJBBrPNj iyLJ5cip"豀:N򕅅a(&+XAPKJ_zeggGϣz4Zq RzXm\jA}:K*hULdll\TTt t%2$y&ظ^1w4Zq RzX}.' WdF:I,MiJRZ4UV"1>>.:&,dZ[[hF{]41UrE1F#jFtxR-ٸyDB173MV/F344h NM=.ט*E t (Uj:N'# \F]4U w^ih4nv }z z,z,z,z,z,z,c8.HDu K( DjtT} К: %i!=X,%m-B8f!T.L&֒jz'ggN)[̿ì!H$r]X\^^ր5h  \ )##c5 К:PSX,XVb:ѦݻL-mEV1s5'@k8hʖzXX[YxH'w VVV oDkHN Д-Ic>c&"8B MzZ5`baX}Nj@^ozNh٭mWMYߗ.7}cэ8_BAb yd+c͵^k5Ghm;kh}6EUw^ Ȳ };w1k .kM)̋>~]}}};o%Z1nFqwkYsJ,(_'L/(jހO(z";n0Y7K>jEmKv.fJBDjI6uKl;wW = 7{̦d_Kv,aNAH 㯓XA{tj>tKTxj]ۇ~#qXыcK!:諡ucB+kV5+bѻ>}zo]%̀BS6_o~W _Mٯ\4נ!&G|RMGGT~S>ɗI'zs7>jmK\wWݭɕ FmjGxu罰bp?LKudX'7<1AV:XwQ?WFm\~!P =>V"K>aa<{ bR|5XcR/E(zzh@٫ˈ]\>B8zf:k WC"6lnޅL.t9hyIK;ݾWoM?*OVSm!'|V#pl:Mǟ%8VS1,j _چ$Ȱ $?̰ޗp#$)y?|Ye~҆b+#kb3ݔL ?=|XcqfS 0"H&l&QӚ=IɦGH\VPnH_eJ2I:qTv-j$nFD#?,h^p2͈8UO_]kbk.]ɢ}sc_Ԇ5P D-/{W.h\,*{ǧG9'OW J$mx7R|l祜[?o? p\ʛzIDATȣ 1#(L *GDL ,`nЎjHuLcԈe NUF^;y.ZG"aG&!$duj#uj>\Rjh!\RR\~bƷɪ*VtYLMNу$+l:t5U!{9{?g$$sV82Y9iGmEi67%įsQ ?J>YY-tR6έ(őSx[$dTՌjHhejUAW*I08]qrϪ: wj?;}˥\|ʕ+g^?ZbUN[Ioܘl3 Qf/m_Tq3P0'ǖi|?&AZ DǤK_7D^/)cy[o E/.F,?-+`$C&Q;])Y^D_H:ګ1s8ǒ+#YE[[0|Dq2'$TVh,::5\$$?hIM2ɔJ+VE +iM߂HMNZG[6?tr9~;Yp$|`krN06yS7b7%4%زgqKoncx2Ҋ^ci{ö蹮hî5LR]ӈ!:Ի^!bqzzz}0@iD{e XxǏevsgf0 X,EQ@  A&Sdryy( x<+@  $d  qܜ,Em @~gdA @ AQX$s8[@ \.G[[`=A&%5%@ $IK((k{Cxx|" 4XH$Lqej,&`U}BQSۓI2DfX_&y2E׹}OE>0afg PVfP`>T^CZ:TѭلA]ѡ:ixj !(S3{jShmMH<2!Ԅ0)CN7W*W. r])~}xABOO>TսC[y?F.(8lژL~%^3SPNfm;~7A˦w(T. -֌q.'H?8ڮ}i{ޕ9ULX:N)䔔 LMMH#_jeddD*Kj 9{mڴ-U]\oѮ/$"EH0ݗoou{f9| -ڝ@wgm\3[&e _|&Xmt}{F:=)_S`گiuԎگ))^d)zi1B>ƄQ>e~3pkIe йu+ (7me1% | -]'|0L&DMWK5oiH-WVLϱ/|9Н=ͦyxeNtpݝ)$u?xpW=G@ro/ j07ѹy㧨$Zۍ[u yx:k~ՠ»,17/:F g 2VQB BAHƏ '7o^qCzG|||~fDQTc,efj*ʙ+@g0>l訑#<|xƍ׮?|x/%`}4 ^W;N ˩ IL& :frKgψRn;&_50ղ.T$(7-R* ##]`褓SV6pI,jAy즦ڄ(&!G\yƱRnxS"U7Hӿ E}@B]Z3zTD JiB_tQKkޮ^:_o7[6\|hѻ3ߌFLfRhƾ#ݾ!rVGikI#S42od@%,v$ТwgLFN"S [ Ҁq7fa޼T7UG} Q_TCp{Rz(֥≐Hyjq̓CDu (&Wcue8 >wps=ɂ(g`Y2)/ik- 4 L2 k1_V{TŠL.͢kLT3J򥥳O^L lUdqSW2yˡ;nKKAν-6~mf(gf!t_* ~'qՄ(j)0F ˵Ka`SHEf9YYZȑV!ZjY$]ڲأ| t! rn@PnոP_ .4m#:@2(4߃D&-7|0{bΝ<󵴘2ԛ9b MBd2 CBRKu$w+HS7e؁N2YxLP ":9N Y˂ }mIg.>\NʝMb{in׾U$,3Bbit`I۞[ls) i]ƞ${?#&rfԯnvLl[+vy43װ1PꦫZB ь= =6u`daYiB_]*_̡۰*ۻ"D]{b mTD+M.СEwcy(2|–~).QL m,@Dmeeၢػ͛5pwC$;;LGGɗ$(7k*"b^$`rIDHZ&ZHQJ@o1YݷKPnn‹?2P(Z:,E E30'9^ŋ:Dk8AlVa,eƩ.Lͪ݋wN*A~s"bEi^:ҷeV)n^so_}'Hz%*D B=T B C|>_ Z4=}-{f=`Ӌ'oy+D݋%^ڟ4߈B Q~uRP!‚'@@_bڔ.s |8}' ^-+$ZR)''glмcޱ3x٨Wwauc\~KnpRwA EIrA<,\]x?IdE9x8;).z{zy{y~$ ɻV*֥`jv| lZ{pꊭQ[_LSV{woy\@ӷ>(4ɂMiqf ~[J' 1R~!=Om߷\>YצE:[duxVڿdЪl0r(y9-MfaίtZ2qd oi-{;ץ0% {eO ?"?eW $gȔ}}޴I.~xZâ:4hoWQP az0nY]1,GP5q5$RP8!d6Ȫck2KdoezZPr׬Zפ.k*h&^mU襦g1![HsFPLZrU$a;Y!(؟ƿQ .:B iYl.0 P(ὓ_W\J*bfnB!/OOORbHg;(X|tH$R )yoX穓vlf JR⮞eY;^;|ڳϙŘ{۰cm-mys_]W쾅wEX X1iH$C*VP)>>;'L"[XZzxxҒwVW.׬W 8ĭDر*@ GRQF"~Yi)z/~#@ qARi4mj ,p=Cg @ HcG(➷J @ z_@ J_$ Aܓ&PպiDV7"U!D$ ©`0?W*ehh()_pUm@UFiDV7"U!Dx,**zὩZJӼE`HU ҈nDB *ԡEP<R}JrJ(.bSR|7׸(\U,PպAՍHUQ~)|BHMMM>SF[[TDL^ ګ bşGT/+Q]UJԫH=ITW)E^vLVW(ժ6VKjĒR=Ao!W|5=*_DDD ;fR S$XY,SKKAs1SKKevO&# WU(J&%?'j*Od~>S|*[uUGcUJmPQUdDjV5:""`UbQAbUE]R=bv=SE|q[# <<\4T\{kUUwG_pjHNEUQD@iREU!rbbbTe굹ɋ}/ZG*<0@Fa5 HEd$%\#J@"Kј҈<7` (%RbşI*@U%<v?eT$7%=Jr v uUDu0^JRjy=kX"ZE)PU\fKII5p "Bi*cnjVeUYT|2qJmTTy-L2UW9]c>w%J95z ok_2LT//J1T%Yc*8*C"VrĈ=$\3;@M=3%HϚ]@ J ʈ1N> 4hdɓd*uA9_i Ӫ$,TWS*dtǽ$}/D10b чH.\D:Ie|/QTL'3Gd@;eee6m#F>sggXgwd&⽮W~Y]UdסjģԵcdd2Ľ4{ˑ ^JoE֭ҥllluvZ (gB@KDqMVŢiUZO_>dBG"+Rw@iܰV͔W&\!SVBQI_IjURV˨*"3W/!a2@ C\ȾQ Ғ[6o3557AII|6%|-zѷ!R~4u=^&7X 2Kx10u ,*GUeР+58hh uDyP5a2@ JkԦ^ܙw0˩5{ǏTU~|:(-̌D2=tDW nXpM:ulԕ_GE?o,˞ .RL HB|ǖA9sYy yG!T9w02L4gi9XR<2ѯڠnK$U T k'k;@ׅ()D*ԏu*{dU4n5i\3z23I@(D) zUAt:D44zR$_?:UӚRrm/*xI\H8ǠZ.Tod{`54:p0ܮ;3a<ׅ(R{Kjm@+\|S_huhh}Hr JՏkPJ [R|4"8Р7kU[Ҡ@ MMu~Bg0PV-&S(RUPҪ Q6X/pQZ Gajpiu-p@ 15cRaХ L9.o EQkjbRpUm@UFiDV7"U!DrAh3&$eee⨕B`0B j]ЈT F*R @ RXZY#@ D~A +@ W/ͼ}77C RÀdbXGcE^@ (98m!Nvn A l.yev~ IfV@ -$\}d{Roa@ BPeΓ|@ W@ R@  Zq~/71]Y\ yo jFsaY_bPDZQC'pk&-_/A޾>!^jWOo@'~fAuw~lwi}XҪ&.E/@^r^\\\\ ٺDG8DᷦXT\ܓhz`{F Ⱥs"C)wE ǞO&KG:"|Pxy6 _h.Ei%ЃTxzmL'{t9Ƚhi}=gWkg^TPp"_7><لlrRARf"c>RnEw~it+;TN} نVj;DV so,é{ޱ :׮UMDT)iT{A&Bi*ׄ% _9zͥ&aO'Aޣ7.zuAy Qĕ< Wޚ@z`oFSڣkO2} ~O&0f3`TK?f^.kgٸ ̽dJF4"t?%*n1ŐFY K4Tㇶ48v 4$ч j!_hۃo &Ch=qi$ k.@zggg.R|tu}u>0_ǀQk! BHdpT T]ڼO aܠf4CvůrH190)4Vݼ^5hE#St2P29^JH棜leŔ]xM} jU]"ѢקjE6!2?nrVTJt/%=֕p_x|ЧJn2OyΗrו-[N;g4few󪆧0 |.^5+EtyH L@*7ѨS0Բf?K{24ޫX_;m7!Tc\EoN|3Jو&5ƛuk x~C0ϡDTmc:@zb)K)*NX7hcDݦp zjQqɓ]\\\v-,,LM$xP#1Dž ӕlXnq|ԱDCI!N#29rS%xȜE}jKOs 5$0c/2T*H #: 1$n\:'QY8{痸(b͕@ֶAK h^An]y%NW(XCḑ6h=$'G5/]<'SRP -Ҧ'm$ Z”2@%*j0s_YstIUU}>!C"b7jui't=<"3g]gb8MYB|Cx|{,-GE]^"|}( 7C0,kGhߊN6C >b%$?9p懟HYwJۘIT -L*$i2.z+A;Ͼ0U˧b;%pԭT.*ȏ;5s/2(_Q 4A C~[ſ<ƥ%Wk,نVv@~%>o5٠ ûPASm&JWLJ,qg)Q TjTj\->^endV+vݻe  r^}PmXFyʵ\-pWfk0oF>n ϟ?'_?$*%GAh,ZlKś v4@5܉{@P@Ѐ䇒dga+y[?Q>B&b _5ձմۆ xgQR$a[R ]Q d֋lTtz~V~nzL4cqi)SUZKZ5(~>]Jo5լUsv mq.]hH SR@[ '|֠iUk$]qoȆ*HtSoڲGɋZM Z7MM2 بgGhwDKO|4*a~O7)|>yeCLh"6F5׀judRjJ ڭBv7@J^ng*5֘^7Ὰ5u+8?YLVs~K꒫i+?-4c.o程|rp+j& E5@5lZ5~ Q t HQ9s4SN3R^3io \|@ Ck @Gs E@ ߓ2 ׽;7K@ βu:vR_@ L%ޯ[`l @ V~u cc@ N_H5?;sؘ؉y }^RhkokߴㄝoJP@(i` bwڝmvniԪɕgZ[4S4:p(EQSuPl A}<ٶvv-;Yuka扮ca 7;vN~(<5ZJWJÊ03wM} Qe3g>mcgkcgcinf^Y{\x76Nm[0E_)J9~s(1~v٠l[[ffq%bpgmu}Ԧ&@blʶsn}jTl1G_Y{^)6v6Vc_DA** )z=GKW{[{WŤS/ x==5?[Ƶԯ:ʠ􌴴SS5`*_?3ޘӒ>^g̪3Ҩtu~@TwhŶxIwԾG ii.D g ?jW\A9U4$%ᯙRNMeQxThE z28BjYz?fg|2􌴏g47=wsN]}х/D%᪕ +uzd="̍9bpOL&IF.y7!5鶶q ^m:f٧I/ώ[laSӿ<23~,aHKHK~eTW@X' 4;xqFzEP&o?WSCknz-ĨM> ~bE%W0Zmuעg}5s8ˬA~WMWZ˘Nm#W3u_|~'y ~jjجwQ|sL}1sHdשm *DnyW=v\{nczZP~BTrpǠ+zQnD E3B0TfÖ/.0 ${!Zd@3^\T a**MPuܯ!YG0/IVZX͗sy> ?)`TR oɵɢ:AՊ:&S!&MяzTE4b[WFI8k߬{ٍj&t٪& ہY~*gN5d*Dn)o,+)lQl]P|G?&|&vuuvksb$W1W})Q]l{yAE{scCI3I (T"M3oZ| 4`[Y~t|W_Ȳ^>aΦT$(z<9сvtݙ¯Llƶulɞ64 ,:6R> UǎQ^uϥY\sʞ/;p4b[$kνSl'.9ƞ$ncr/+ TZAղ595CIs~qHږL ɑmktT\dEjkǝo>ݷ#S|g/c2f" 0Iٰv9rfy!Gt_R>][lrq~b)IwQ[[K,=狝@\'DVyzyZ8Ϯ W_&ƒDWB"0DN0L2 HZv]fn9qշ1,xrzt62}J|9Ba@aZiceRaYޤ^F6?{8cV?r?ku$Q@ 8i%Rm!kSΆȖ4H H}B1i蝬1|< k"gGͱ~vϜ5(RKB1jG92+Xћ9ůtpo#*8ɔưxSŸ4//s^PZ!jlteMߢSq:(J[*[gP i!ra{''gZfM0&DId4rrfE{8T4y%5xv몍 7$Ͼw#vP?S::Te3dbfWn iw\P{- ̽}eHiC1E,emLMDjEM%@ nؚ^%ǮH0nf8['Ób$g"J|@ƑсUs"ƯPĪY;|A=xᣛk< /N(WFxj{Rdà'Ο=0QbW BDղu jz{m/^JRT4)J-j;s(x]~Ej=/Z/hM\?xR!Lӗr`_.ڊ]˸p%.?HL9詅eAfϺ5{ 5F3hDI>PPN#1F͔C/E߽G2L po{]b =i:s7e8W-V=%~kRT-jJ@ d.Stptkg[g屎/n#;"ufLbwݬXY7!WD:pB6l=aƵush䠦 ?^Lg߅~dcBCi#IhS>E\!Uղ5cZMO5:m.-GF_季+mQ@ mζu ýxF?e{hq}ʷsl1C a֕?ܺvb[Ï}a y;ڸs@2p+Ͷ~l[;[}]-Gu?DeWɠ杓tOn`v{Ȫ}&{YH)ɢO+h :k @ `ڭǴԕPџVVG@ z@ R@ H_@ JE` @ g_zx^o]_mI[ {YLJlF7HhZfvv}n&GA @_Gg>伯#4i\z6+|xFhSk@s}.],\5V}[ڧK]5aA}ZmM;Zu9pR~@kf3`EEllle5vr@[{['|SWfjo1qՑi]')QAa䊾&ne(ǀ<"efuqfZ<τszc~OKx-"[D/)҅]R;^mu7hw6>=5)Q]?jW\*#!5ӣs}7g8̌e +p7̺$AyOw=28B IDAT33?XbrSFZzF3zuP!= "̍9bpOL&IF.y7!5鶶q ^m:f٧I/ώ[laSӿ<23~,a,rS Cː:NWAPiXw?<1=9>fՅ+=MQ-)}80E :ز]yQPzv;mjhS /%zbl[OyxrVpxZ'o;f= CD>ڵwmI"qh zrg;5>xBYm6 ps~^=V.s|~4)h"@_޵Wd3HT/Si--|.ny&w?AըMS#A5t7|~<ƽlj}U4K/,9!Dֲn;e箐׼ל|Sv,5(R(BJ+D/_>N?~#fI4CSw\x8Iti+M)6,He2D^MG$W-si S [~Ʈ4љ${!Zd@3^\T a**MPuܯ!YG0Y~_XiMy铄Y&O%f%#|Ғz|Ro3 a?;q{1Z"-P~/v>zW.f]}Wi_lDw bWIN 4v j+gʔ%|}lzeIZͷll|FZn,%ȉ6fw7)) {Hw ʔCJQ.NYai&c(>9JՈ0%o.䗫ìdHr-Gu HzޣZ^d &Mя[ 1wJ,M:~y\f}$DaY0ndJφ$]ޖe 'Jqڐ_VH&u*@ ''w ~_0o ok5[˞s~(&q~>VbOngc_ǧ˞yAE{stO1:/ N-Bd>&_ɷ@)])jѯߌтM-¢ (|2E4\f )Zt2[u 0'ϸ%r4uI_gfvJd@ٕS)\ (Z =W9Bճo̐ Z"Ѽet)KO3׈h̦-$LDV؎oJlWQ+l;i+xSHTCnRGKWV)eE٣0 H!_ٓq5udm)c(rQhV=\"E4g;:؎;Sj *z<֥%{FRpqֽ'h* +|#NWr}`tXzK)7^׶e qlnműE/S|g/c2f" 0Iٰv9rf9!@gϸ%-ӵ&G>/ryEeIe{;OgMN!4K򴵶qh3s]:)s5%vv  < DH2ucD<^ކU|=:޳۾Բb*%h0q& R{F=9[3v(B~/(#Y4{KI?y[еٽM~^JVi7o}e  88Id&AׄQH)d!]s.vL2gԸ0f}U7/u~-]Sh&# =8XL_1Kyuə,;|١" 5Dy1?HOqqr1d׷ދ7+%؂EN-R\y%T0t*$q"9{O'esQo  [wuϢ{eFܘTaϓ*Gt4-U^+"a4ulWQ+[OBY$+ c|Q$dq+Me ]9~beH&JU#4uNVub%|šHX`c`l՟9kPf݆O9~RXћ9ůtpo#*8Ջ <.M,>lO7ed}ONgZ3*hޢ> TO$U1z<$>11>L ]~6d0LȕrrfE{8Գ`KjU7 7$Ͼw#vP?S::TetwݭQX]/'qPA+ib/?0A9RiwN8 ?v_x,+l~AA_ө|b'*w _or0iK6j==g+)\T/IBiD T]E\}K |-I 6w |#\q;[vɀ[MBySϼL)zG7x^PPN#1F͔ڙ¼'9-ۊnT{Fwi;EˏeaF{vDKN@ ZN~d; _w6 rstPgL(&ol;ǖ}ZjL[}3ۻ_%dfuF$Ti(f=Mڜ4ЗjFJ IE?jzVOWk+Mܲ@CsMOsߎ=ͩgܭmHy%=ՈRj$u ٠K{ٖuy򋇆ȎH9<%~Wk'bW9:vp47awƾ/e"lz fª v*%{pZN3!@ ^@ @  ~A (0@ ң|'렫7umqs^!'d*ja?=SDSNiモ݈^ϴ'Q$ @OW$~H2LUߧ.lT2jcG<xe7fxF\iīÅ#FڅӼnhQɶV ]7y-LZoT P-J#oA!QM]|DIvi)~?kfXdsQѕVU^4rؼϫ&rmϪZFE-\,id*|Wkކ`I%SM-Qt=ڄL68qͩ|DfɀM~`b[|3{;gMm=U7{GTq^>Zr^N=uNN=*ܴ_PU2rvwѕB.Pz%)?7/?#&FJ~n^~nաss3b ~맳9Խ ^tzڹ7y9Y P^jCP@d A $ M$"3/ssox&L)N+*Gt m\~_gS"&rN۷%)5mgǮdacM?T^m}"֟2^InwLT QH`~9@0?{COͱ1*wC6hÑ k g u,~ )kn_R(:hՀk>3^MR:[g0 NIA= /KbN~xx=y)*!@4RVwH1<F2fuH_I/w?D6d2\[ӳYi+ivɶ fa}K>ex'Nɿp\ka5HizU%iR0<H:ԞDK (` Ns{߅,Qصܦ<'rV\-3ycbgАoer Bln- |Wѭ NqdǞXm(2?Gkn4VV_{ӄ?(Y_?/+E )QTU)խϺTkpT-B`RuqrBT¦Gٔ}6I~YxG Zsɋ"Gəq x#.:组qZC\\@P}7*>oQqE:6ũu즉Hǧnݷjxi,;zcۜUeX)pJoB (0#@ H_@ =J6~/ fw@ r.ghoz.#g@ '~ucrn)~nj?F-9oW)zZC=5Vnж9[E}tzM&eB. giAƩIk)FYwم[e+beEye0XzjeËwe*>ӕ[*׽9/Yi6kFR֎zV7\3ô@YGjt.`sYX=?n!z<2~nd[̭Lv>& !Xy*oɹMyLŎ-}G412 IDAT0cUna06e.Lpr-zN/Pt#7eچZ斚/jb@y`ne2;xӇk䛑#[weYݖׂ)f:[ՙjddcAC]^]NTѻ wM+LkL:"a uHޕȘ*29z5e5^x:]qؕ cFwЊTg[ [ )?(h޽s x~"zIa1mU"hjq%Y{fF$39~g_\?`|RQ(xϖ|͍*ߌֆcqY䳾Oht92UﯜqN|姂-u嫢NO~,7[757a c=CY`3fPG bN'`W,%L7U]Q\Wi'nM 斲{F$ lxV& 2a+/vٴXuToaThx 9"61€e[&m͙E+(q* ĶN意uv=֚"7,,Y22DS[0_b y.TO5@Z e8]LC$W1|d5Yx|MwmuȷWpbVUԈ.x—$U k v<~m4$ đnJ@NS-/xqi%_4a,@ ]e4N?~|\ƪ/诊][zj+雪KV= ̆-R߰7Yl)ʸn`5/ľ#^tԭ-81&Em yۂIՍQ4w91lϺJM^ ٖB8% y qV}l~po*ڑpKsژ2Tq>VF^m < =ےR>/_MM[6i3dGz[W),4.V@8>ds5Ǘ׵ qXXNTq9_~Ԣˣ%I%Q5)^usn=t0ay9  xsd/A )Y웟5hQy fЋ@掹sgQ8MK}U  7jԛ2Ɖ Yꫫ2f(~)AwC u*jsBln\3~Uű-Nxfpp'#n;3naٞGQXq`Ƴ YkVO*B݈Z}+Hp|<ѱBEɹЛMnIrͩ͝ m r.:G_f&~˹e|@PP4|n2%4sZ3Oo .d,OĶ8eLM4%s_eU ]ڈW0FIRIqM&u7OIpr x^[ TSX"UMkU4ص_Y~,E){U?g7K'U]V7pY0rZ({UvK,2;x;^IUlh0kfknl0V4J)3576źؼL2R^@ {f#ʢs[p3UK0*}g#HC>к4[-`;z'/)Q849ˎ z6532Ys}抆 'b G_For< r_00y]tNz/nB^m^4 Q]k(5V5Mi[N"\vR_}n"Q^j }`IqjA=lQ]SU`iLWCt5۴2k1 v"M@veԊ˨(=""|NQ}HC4$&&Ķ$4iFH ~Eމ$ l-1=?)q (UrZ Z~Pt(kPX7$PՕS *r)igh?j"۴THVKYC3qXYlQ+AywW`tTEnr+3nyIAa!4T Ķ`稂#oYR>Ca1 Q//ʠک;&l]{gjFA}UVX+zE6^oMjq#Cr8BF" NNR]gBMq!-0C;ٯIGkg- P5='^[x:8c(-^ـqx(7o3[)e oYv(RnkY&}ʪ0~pLQZ^%f2z@ΐb>6!pZjVQ}Rk뮾7u1T/L/ۍ4Fk!ŭc/ZsɷUw%)cg4|m r.:sOfm|e1Sc~*J_%)V\mXO¢]c\{¸&7i J2~|=~gu&F~OKot\^F\CQtT<1w3Ϩ(3'm|~9H|u$ mc<,

v?W'R1-{|XGϲ>\}ƵK2.>6*ap _p/\Vz5E,7zPQ(,dC Y^?S4MӐ|@z-}p$,R_٤M9,3k>8P_jչ=wF^E:y9=E75;- y7Td-D+LEtBkn"N{w2%∃)<%`r¿vhNє4_ΌIuwY]i&@ }s9Cc 9r {ttX͸6]tnתw @ HE @[@ (; @  }@ Qzݾ_@ mCL{L tHdLx+I#D~S:jM8ђY y`g9'8Y"d*8jό` Cidèd7%,dt5w\ikIE:\VߢtG$[*t䡶42b>`k_XkW>j`0X໏]PLuxB]X'և"Ǟ?X;aݲ{'urO&>j_2D5vYF$z!HV 9ԊJ68WݴC&n4WKJ10~*E[;Zɦ'9Pͨ+LIdC}dkfXdsQѕ|͠~,dݑy /աWs3b, *i>Zr^NV™1>㛼A ]BPU2rvwѕD?;#ZUw"Au6%Uyxs'ųR.p #;cޟxW%K.L kٳQEoO[#-*ceނ>&MHW<\ks4S5_!JV N։yXz˻uQ|*Z*9;/'+U;S:d荠Y4֪X6&5'ks-YGvEm4ܼ5 <[*x呫N憽MyzjHoūHͫ KVN=&3/;92z?(M &s}2gٖˇiKhpYN }N^[vh1XyceOx~ٿ(ۭ]yNd3BnA-8cpJ!~=Dɿ~z/+3tjbJBpj<5 McD6  k+Y_O|J&_(}LjgndyvvXO2UW3u[cD}CR, ܒ;e&Vyas]駟 _D-KS 0Xy} ڏ"9O[=y,yd2)Ew M;vp$KUL%xk# WS5H9[myNt:%/rsNanQR2?>݉Rӥ!a/r[~ ̇Bah2qGP;l }T[Rc֥U>-32ӉK%K4W|\/r%ه- w.hai])1靹-:LYOStH2\i(mǡcM![O2j Z i C]O%Rbj|3y*IQtxgKs׆uXF-bJL*ӴD|EK5iT)S~”> i /2i>&KgEJi(n((q 3S0C!xܽD7 U ~SȪ4Ur)QomGb^E 4&U(F1Oݨ5_>Řeߨ2-5̤W5| ^3_yn9[1d؆TFjJ^:Z+EKAr"=+MJ^\j~*wlR"YhS))*!w'3hzWª0±$˃A ɶ fa}7H]ɇ,ŃhF15RfjE߉A +ٙ+L丈bQD EgSk[\4uMsH0_s88yi^ZZwEUN䕳18e>^ˑJ,p3ƵsKku"e wN0os}=pEZ p8&8nLJEv:$B.=lVs4ć^so>y"/u!%} Y.DҴCEo}^8;T;ahزS:N$dʊWVSۆj` )y>BWۣXR,hACz @VPCQ*>+[/4%>)`#ڤ+{s΢*˷"ޫu3\fj4>;JsL"5/۵la9Ra3erߝC "`]v>[`9f;v{[_v~-S ?@:AF{$ڂSX)&?Gc~V4TOW䠁gҘ2膱K.zk.8݇9ѝض}L0xpd'f1 wCR\JmuQ(V4pHQC֕q&dڧ-9 Eĭ$bK#(dͩVdq&`B Y3Y'RL]Q<9%FC?5y>?\Y0ȄD;sv`r¿vh&@ }K%h`hs>B (0#@ H_@ = ~A (0@ ң@ H_XRTy[s_nH=n8byugړ(ddGnc?ǃ$ݦdb7M'렫6Dn΃H͋]=9%@Cidèd7 fdt5w\i8'8Y]kIE:\ߢtG$[*t䡶42b>`k_XDlT P-4LG-=(íbdM*m [! IDATVpѲNJ#oA!QM]|DIvi)~?kfXdsQѕ|׼ ]=Jعהua^X@#Q,&oQ -\,id*|$ @љS|kPk2r5Ve"A&Q$M~`b#AN3ZQɦ㪛|%г? NytW;XA#}ԍ7\_ls<ASyM8Fn0m]Gkۜbj3mFA_~GXڶ@z~n֞oTq'Dpal'FrNޱ{|#{oD\lA~Ջ֣T jVUo[ ?2|84,Lxܲh-GE?vV$7=em'xYCnM拰s%ڥ%V]4c/qQͼU v®YT *d5XLi>>«IXd;j-mo-mǣF>:a $Vѕ'}L.$ɹΎ;&i1D2ףM˭oPK>Rj^qfJ|pj<5 MbR"te{HnzvvXO2UW3u[cD}CRml¦Hr;c*`ZvFS5H9[m9~WGhzyY(BԲ45P!` ׷Pţ;3.Փɪ  A6pKblZi$ū; v~VӾ=d|ggs߰wAK-#,?O#JrsNanQReB =r -_aT|,Ƥ1V?-SW%sB@-Q~zbnYV;NAWNt`məCx՟#{7%89S-ۃ@Z'<15XsCmge~U“JyΖV& ^I'&Tr+;94EIJg0Y;)ǖwtC?6ƚB2aץeT"ɽ:;^4&|c?狌F-oRv](enQv&N6]7-iuOGIOM~4S 8iI4^dbYne˄@z~C! (INK0ڟe_.$¯/(+Wݭ `3M+LTޝG32aq*5iT)S~HC:ղ]9]CJ77` pb)Lv!P;:"{n.FЗiqg&A3_yn9[1d؆TFjbSȫ'WszS բiS6kڰMރ[UDaQLcS7j͗O1& sʷ@s֦;(V%\N!duKJ|`)cV?|x//֩aq]NgeӳYi+iy.5N ?r;6RIF NP a{xQ >p ǒ2/*[&$ۂS4TD/.~o)6IvHZ =KHizU%iR0<H:Ԟtl%jUmPM۽shH2[IyYq!6>,Qص&jN؛Z$6oLLt{mtnS.i uI F"!q91{KeܺPl Ns8K/ڽYDjBcj?wv>FG{d5k"ܵ_6HC:ղ= 5}jEUuA¡Se ޱ1ҧJ+g!bp&^ }IJb5~mzmW]9h < i6=bϦTs׶h b=4/Q&zerffr\j|`1HN.!E^#|g32GG隝 V-2Y9{|.};¸W<6_͹[qgGQ–"pMp8܎e"N;m!R_swR w9g<TߺΒ>4m9PxNLJ@$|!j :rE[elYy)O`'MISe %>)`#ڤ+{s΢*.3zb5rY9D1ب])L>0П6vcz][*? VeS5a icǙnu~.l'rwy>И3 tC+kסA-X=5|bs4!gIA#LtN~p&) ygFD@/~!te wjz8}cLwۻ^Y!1se EgOx`ԇy'+ hcvgx>D(~~N,;ȝS(O~$-Џx { YWٛIkҶ\:.ހx#qG%5 $ DsjٯM8g0oSsE+׉FXk09l_;ynr@ >%~4049!@z@ G/@ F @z~@ qO{Si8Y$2ѷ)Zjpps AeY@ ^=eg 7#Y][qVZuK5CXVy9Ha? 4Էɫ2װ~M=V; N`I%S=o}TΩ~n»#O սiOIIt>I7u"6z'KX?J:\|kކ`I%SMk^WԻoQ -\,id*|$ @љS|kPk2r5Ve%(dPGߦy?0Α ΙCdS[qM>rŸ'iW[RsNt^C*鉀CRd%mpvS -8Hg-=<.sdQF@ ]4c/>«IXd;j1mIneo~Ct紕o9}_n;4Չg[p'r.ᩖ+_&s,W:x f9xϷJNAWq/r0pϦ.ߜF9[%ݱԧ_X1ބbJvI]\A3L,auVꥍ>,4~]JGW[^ՋsZ)VgyV(AaFHFv$o_j.V@PʱMTS;7%3iP8'G8lyAJ0`OoUNAWZnM6?Ϸ' !M_+0~  hL[?lyj2*%%`_Xn}{ZRbf# Y}a˪0c ArTa##=~ݬwKUk侐Iad<nmrlG <*RG֨|[Az(BԲ45P!` ׷Pţ;3.Փɪ  A6pKblZi$ū; v~Vz/%37'ե M@PdCs/L U~`Iݨ-eIk^k*AX_ zï%fnRbZ'@dž.Un5Z*hb~8헑r676RR[-Xh^ui?ܚSrrݬE7Snr x5IlF¤85k'2^T'yp ivr6D2H>e3٭ ZnqaaQp#Ot pΖ:/w0Vvx՟#{HJژujyiOKRMzPv4ĨO2`ƾ)炆{ZS og$/"-2HWW%<7lin5`ڰ 5TxjB%? CSԃYk zj_Q&:x^1E Li#$HCQl)N/VVWNXA՛s:+MPu]WʸAxX< ^訁@P[ۦZp6Ӄ#̻E[A۳)+}Me;]37M)˨|}*QkŎYj8 ^ìJIKb9r>@j?Sg*/VR ^ !XN[?DzR6pjyuB NNϯH{Dw2Z:enQv&N6]7E\q#~?`ErRS;ԄfjB3:Noz"z/z{2,? eDM,GlsJ7zRVuC}ie*h$-ml@8MQ%O?ˍ70mʈJc4<}Hl$A.FЗiqg&A3_yn9[1d؆TFjb8$H[0-Yֆ]oj& "BfL>u|c"8| =wom#nU¥9.:G_fr}R޾iNACEHәaq]NgeӳYi+i#^sqrHܱJ]]'zvF>/.~G;)R|!j`-, OXyx= $gD*mOTM.UQ8{5e/? XQ68p EKt.<?~+󿕔[bskI ~"qycbghs)k?=VQ?Ք]s˷"g~ό,&=P@EgH>F"$! ((` *~ v<;v~b=^6qc7دܚVm2Y(8Ț>#l?}Z;δl­[2IYXI3Ru:%YD:tş#+SmNr@Ne_&rb/+BKȪwws}J7?n׎|iAxr>\*2"&R"#D,òqKeV$pM5.CfPv͖7-~.?|(vkՓiLLC&3*vWvs[sjp>6БBv\ҞEN:[,I~4]K}b&-VV#Cǔв> ;!*tWO*o}b 64['RȥO ¿),걕SV }yVU6+O3NuˠZφXuޚ5nːKBπ#I#/Hk=jeFPw4NKG#$:8ύ`<-㯽*'=ށuh)*7͝ IDATm"έ#B )666.Fmmҕn,J4bӂ:4Y*+r#Qچ7sb{  wbp~-cCz#$ jFHy~Q/[ ٱeg+S9 _fPn;(d*Lšɵ3Q oEe~}o{ @dӳ[wid:^;G qY4ޥRc=^-@M@9wrC_-Y_@u9Ns8ԻTjL:u'@ E3ŷM~gk#K?5@ ́ڽ_=sv iz\Lmj) 5hvo>B 4_@ ; @ Qi/<>l(66m.S-s?9xrd?ucL̝CKO5e@Ox*Z-kBl!'KB < KQlףYwmNL.VކzV$؎= Dg9Mh&sRA4tU:ݦB ǯڷA.YQ%SyNצ0\*?Za@ Y[:ࣂf$3';K"0 N!;B2so-Ө\I2.Z G04~A_ҢEfx# 4̸] OF{F_";(h~0S'K2#3nkWΛt8}w$3yBÄ.^EFWδ-^4:uyT&d!yo)۽1닼 SnKPWEJ^, 3o_Z\qʧ~[*HFeh?VכGNf^EѨf TU}]Ոf/(U y[!(>K OTRẙ;q E|FRǼkk4x#oo9R.}_*epgِ$^vE998; 5I/G[[XѪEesٙj1^uP-uA(AzvD2|j w[>/E]FM=NKEffڱʝ&XbuWJyt xj҈XLO֫:/L=hwITF"64;[-%d?]㩅r]U_}k]9ʺ]M64{g=!)0/ űߡKm *lً rU8Sf^%Ѩf9uCEճ=K<0𵷣Q(c_U(Uں_~!X{}b;:$02c(dێ RP.hE2!Jͬ @ͺCxsI ?/CUuoԔ#GE,zP5h%}랸<6+I U'F lnee 'Wm%(?Qy 3aחdG~A=fG3=)vݕ_^xCOV~TAf OKT{P"Ɓ3YԸz^u@.x]+]2VKm{GH{ucx7=(q[}:tS8"xur=x='8IҕD Uc1}eFݹTejRK +8}{o3n85*X);7D\Mzu[E#'J)MHu1EaUG2!-Ӄ#z^Fxu6J!gwY>],uْRbbn2җr uҫ2BRA(G𫰨XvG~!2{Y-o#1aAٛ]ܜ]]-teV/Z6xN.uS3~{vxNt D@)rd|u_G>ϨFXˏݟboUj9ȷB?QN6=K7cٷ@Pi}idkkg؍79N)~ce2G-=ҽͬW?vpP)d{nq0 ;{bL9'n|DE-D#fq!Smݻ^%j'p0qrթi 396&[SD k0]]D>?2j.4baߧPuԲ0Z6AsQx 4Y7vrnԥQvM{ٓ6~aS_VKbaE. EUA.65wI 0Wdk թe2Y"*v8gmt[*5wS"0*=fAX[;2ֳoqvwʞq۾O0 c}<B IS@'m-MW"-weqHGcٷ#I".dӳqj.|jhR@ H yL^ ~k>B 4*pG@ F~A 4* @ Q_@ @ iT3ܒL!STQƓ>cEK+^4⅗;[P䈧\[Z8zY!9ņJ> v!UO/I88g Bs>võ,b̝֭f=%>1y"eP ^yh*ա}hĆ^r\߰Բ4Ƴۤ娪&KNݚ9p2B--ZZx Ȋ$ʭ̙5uwkmdG`vTVWdJ)'gxTc=*HoFp]]bK9ЋRP\5sTdB~qŰNN4 Xe$,DP/D* ŗL)V\ǿTb_lCs ;TdEN6[.7^z;_LI3w\[% -{9=EscfC^xU"]QµܹhouML<#'.jTK @ Z|̀I #'d&\y݀%Ho~ӤVT\.h&m0H|ZNNֻ+~Pt]7sj7,r-,F?}ߜGy l̆rr.r 1/'7/'B]A$& n‹???ȗ}@.BWV=gnG: ]dDԷ@Oʬ•7'0vqGd~~yjWiZ}U8=0vv2rs>?4UAQN)bŧYٙ/ =k*ʊ/ܼۚXOwWb,^Zvݝ^-wPx`Ǟgf%.h\U -6q&k_VfB;+/hͻte FHԱ={2YZLBЧp0\U%mSw\S)i`'Wko+箧nnXZx͆P˥LI lĨDչ }9Ο7/I``@*Ϻ\7IjJ‘ߣ"=e7!fN͡럗U ([|rA$T/h%}랸<6+I+@aefQɶ 8J˼K#e?{G̢gf3Sf҄J_[[4uBao3'u0uߡy'H*ET䨳{.zNpҫuW7wӓ*_ aXayN3Y0}r_R͘" uZbUn>ʯLEϽg?ӡӟ$5Y QsԧrfT8wR>RCH˪o 1pxc8| 0Ytܷ=vUq!N[N~6 H&$CszPupDS+fW>ZAl.|EDT Eb/w嶛"WNRgwY>],uRvo,%73!9TP7*,*.,*.Y{Dz}o}U13l~6.śuᐺ*2x]n@97k\HSCR]H66.X7qӵR(˳NI!3(ifK")yMӬf j\3k0Z;/>R^! R)Fer6a(p(@yj1+];]7+0fʑ}y"?#;:ӰfkfW\3k0oy7Bsl~ ߲C_.BjV&Y IDATφXuޚ5np&36+O3NuˠE/+JoNT[wFAn4 J!Ӽǿ)'7U@Plϔ  a_;l]%G&1wwڵ ?o<@y}C <-e}ڲ3q=HѢu䗱iTs5;>61c|m4҃7W Mn&§M֓ @ xΝWK+8 @ ? @~A 4*0@ iT`@ Ҩ @ Q_,LDi @ jntޯ 6j}Ql2&BԘLbs;IvLť_%Z+]?꧐Vu-$jT&RT5ϊI6eedǤHn"sQ|V*MT&v.sr=1ֿo-F ON  A^#('_%2cb2ߪ (~%044@Q@$ Pϥ:*++322Msy>:A o4*eo|X-0n~֯Pf(o,rIDRo"h iT lUOjFEYmzꕥK2D^Ů6*&!4Bi5mO3&jܮPIfH$$!Hl("FB_}۶C.X+9Zjgϴtjg@Q2uInWPf($: IC &AD?/H_OOKK)).^nsJJJ֬Yaddd޽{3++%!@h !4byɠio)sDu7Qe?PXfuD!8YҴp(!8DxY֘AIh$a:;vltuy }ysQauxyˌAׯ"sDm;ɬ_458'j_C# ʁRcUVlժvN9W\p„nnrO04DhCYui{*Fɩ\7QkܮUTO(3YQ!/WӦ>u<}1 70``nNnAAkhyy{ t}* 2iHnּ]5 emeVGTKfh$DZ122hկysΩڣgnnLKL$%#Cx|JGTE(9uҡ\7Qe?P醆zrB FEQ>fs|ϗRI0ӧw!H.../Z"@NϯbVΙ3S߿pԮ];^@/#sD_Q)e2N2#j45yէPIxգGp8w1cSQ 2J#ƏڵJvq8m]bUK)a'wCtHF!d+'ˬRT'vi9)(@kڥ$4 L ֧OIq'_mlz LM͈$REEy)L100|pׯzn::Rk! O= Da8$xCQU,?At(h2"#$YDKR ^H&] IE"J)bYH_tC65e Ļ$rnؖZ8)SLWʷe/oPhճҍkHEjfy2ɇ}JE&'IUm5ߥ5bk$ ݒ_" &NѵP+]%.\Cb[X5DEi5PLZHJI ! !(˫-0@I`VVV1J:$^Q*++T*DTs@ %M<idoiIJ5"|WVVfeeE|)8@ mmm D" ,AX^<PQHp/jo@ !7|F/ágeM-R@ow{G/HҮԢA v+VV0@  E@ Rr%%**''~6'@__ĤI q_ * @ 2?|nȨ!ϥ rӽ3^; HaC(C~eT*ť @ 8l6;NϢӽ۴q3wv ڒh _Ҷ_ﭹq/[ ]`םI g} 85 F'ͬ㏊:9Pk2FxUXR/ڼE֪4pu=-@ssryrrr.?@GG'3|=g lyN qܸ_|ԦIc<]0y/knk^Fۑ#Ohyst ]]]m+41:zzzJ2͚5 F.Q\m;<<ݡ̔3 :w& 2mlm639K04jtsG!z}tgЖ$&ۅp/ߥq J?ԝL-ױ;{5%ȍj=h2nl"=_G /h,xeA^&ӵ66̤E2p/`٫Wb&&&&&&׬uG{sG}ufƻ# ߜTQNyzfQ)gDZ&d3v1ӷ)ɽ0gCv+wr2tdul(OM.埈.D\j|[3[=mC"U@r < efŝJ @~(z>_qc9v( 0hCٺڏtxХ=иl@Z%=S@02[HYN]D4;t.$+WǏY0b{^96:Ί1!9 1-}z26F2Ī|Z3-3;ύbM eLeb.~A fTx9wa7OJɝ;+mll֭_f:*`QX8;zf=3+8r%6U}e ޢopaξ}g|4NHݘ7FbS|"̉z5{+rl kAkdkXEba[#h;X);7D\Mzu[E2j&UvЩ9npZ19|: A+bV׷C@萩Z{5>/p^||}}/9ZB,Dʄ7їX﨩X)1ݦ+:Wq *WAV}&l;MJ;X7C2[m!ׯp\AЧ#G>+1L;-ܺJ*(.^GE\ !kjP.1 r8.W/ @Ks=]]^/[|p:tş<ر"[P#'LǏ>dQhiψPV΃S%~-ezȚA˿ެ?t4" 8-K[3NqJP8 N /pncYkC}|:Mҷ@T cjZ80ȷCȤ*+F V}\;n>> Fn=:M=hD>!5xȾOU볺E?_SKRlT_ngQ ;,ȸ<?|thG_ߎ݆/Z͏]ޯt62KUTH_\,//puu7K+fj~s(ǰ,r.}OoxφXuޚ5nK͗+!?ԝLzqgłx-ZLqkA윂"3;<27}kx]S"xI 3wܱqdK #˄_h.8i,ƥs +޾дgu+~VR P7;k3eS#O>Bߣ4$ҙs\XBT-tVGaXK.ee@-[gZt, ~Lzk=!cWIm/d?UU9pxQϖT6=~Gzjn2Ll^7Y[[7w~Eڝ]/գvC"?4:ĈUzuhGIKWtiocP9PɯIU__l=l_j .wRk[u+sR $B`sKg:%5:UҪ#$)gpIv$͗b(݅s [ ;T1i'na34@~'yk%G'm:n~^s$y9EAXTμZc!k)sU{P*gS-$YkU7oʌ{6=.`>(oՋ@v0/#me e=h}HIXU?gFѲ&hxEp"Z3Z*17uh#+G' MmJUu}C߃>qi͆Ӌ9e: 0T Մhp?14f*%hyt3R6tҭvR}o}˺}[?f{cЈG{ b1g3VzDH&0*#'Z]쬳hKwjATSZUUV@BӇ_xc {5TXŧK0H]gdtfnehSwbD 6+Eߑ"PհXW/_fgkWd:992K/^ +>|!p3鯊,eYcD^:"G_n쟬}A{}_:cfD J5\IY<C"S"QxȨ-o[_F=d'|dujdש$¢9+]^`* Vx# G6ERtWmtzMǖwP-/ކ@  hDAKB*u+0ZO:݂NIJ۵ Q{}>ribq ^e|zWuuuGa,VG3ELw-:$)!θ0rP^i]/K 4D\-,o~}_E Fxޗg}WY& w,>N6k~:ڡgQk:/پdz6/Wξ+}yYz C:zJHWC YE&řZzbwlz$e/;rև|5U.$5.]t˗W._r͛7?VoK5P)D釒RG7:!\,:Gٹa:A!Ė$nZgܭ`݋d=4i{'hO`N='lQU_nӦM〪*fmxyE|ЏVw?tkv $*!e-zɿ[=ZkSIv'8D}BːcY Eu$y[pN &{iuN3_L&sG[=\2ѨAi.bg7G< Ȩ b}; OȤ ǝy&yOJ0nri 19)ײ26fXU*+[3ܒL!S)d oϊ^oʟ FXrZ:JbX''}Np'EN6[.7Ċ1rrV'Lu8fۣ&CS=;-x/hĽXU::=$Y v%?Cq<:Лwf)IWnf]J).[hg~i}v-?83[kmykn^Fۑ#T vyױiΞTj✥w7[O02mlm6jwYs\d4`C?=)pNx[k#ʒQLkmlIB.B{ 0 C-lrQ\We|a;Qҷ$} 3]Sܨރ(RL9 ;MygҪT\_qp2QҀ n(ax0^ٻOC"߸g]Յ ρ>j @?pJ 'S'MLO{]T6@P;#{_tzn)ͪ>4xnCct߯-z|uFNv3L]P\*aWqAIbqzsrpnw(*d 9b2NBGt1Z8[q/0T~U|:zq21WߥQ|r٥|h񽹣wU>:3oN>T҂{wm5:# l283lմ_ En-jj) "8CQ Hd<ц(7AV w@KK6 G]< ¼N3qs&.@Pgnђ@Z%=[;$ڬ[ L>ta kXXY˗>+S3#9܏4rylY~nk0<* LqemcHe ADž_͙&CffýMpLT"|L8ݞ!'Ll~;pǁI1=]u4H?+b^}$ڬ۩xEoNΎXݝ$`4k-r;R#sY99c7Q xJ3sg]NV%+刱q KXh?uVז),F \^w 5 vsBDH&$CszPupDS+fWJ jRΗ̄(׫*ɘ8eФ͞kV AvFS۱ۨ 7V0"8_F5ïwo'!@;{GEp8 >[`//.1j&;x\5Rgz}hW;E w֭n8}'O^+~r;߹AP_[(^~~^y{Yݒ|~ ~@43/ -I[3xCYܮKaׯ@c!{hkSvvÖ+X?L2n>fٻ&;@9.x!}]*XD"b'jVU" -*7lAAH>ϛlݝ| |xčIWrz{ *27]:PknfҟçD1pzjR/GVuǣl>.5{<Y-kk=jޕl5@ zܖKqFP_hݲiv0F߉!G3u lF&gn[`Jh?<4[ 4Sw}N12wk]w/p3z!I\5[9|Fýw^&ly&i }=-2^qYa-v76wu{`}mT@픢 B~ޯK55/#BNLLן8q~̻6ԥЪK3\X}PǼˈ. I(wy]6H^=%&/]a+Fh}֡Ƀ,&ev I[>aENg#bz iۑ(7}3bi~ 2Ĭ&0G66dH|=`2-كxe , " HMsٰv~W_%o΋[v [C.lbƴYӕ봔~ʑ})RԑE'_X}jY3r _ԃDd|Ú ܗCN1ms١b3iԩ"ћꌘjvCTgH0?7nz^\B̈́E.0kx\3Cr _g8W!4=,YAn:sKOlKOo!H~Sl6*|u/W@B`wül5G¢ `i4̣s}B'T}:KK_$dtn~.JR>AX'ݪȯFX:0(MM0o6vE'Bk,_(>SH# 8 5 a&<4d-@u]y$?J(jJ3 psI?;ri!'*:O?-2qLmD ;ّucttov}ͪI 8 w=wN,E7ʗ_Zj@a=YR>%Cb{in /7w=}U;eVZ'q7py2pxJP9UBb%F84zjF{P 7%, m4KȽ>C$N%7KMOѱgbcf7 ®‚dUhUߡ3~=K<]*~A:4<%2p4n=w`ck=-LM,h]H#7F8.IIjPoO87/qЖjˢWV_9K.[-OcB%Aj!>YEb0S`f_ub녲DK2'=nZE{ ];gLqB[Uv兺}7fξ{m>kC|??/d<5 APgZ|y}L;Hf 1 )2E@79>`IfWTIځl@!RSH#n(#@= {9  Cf&lSa/'Z!H{ׁ)O لvvIh$H 1̩ Vl\e׀)ߌ0.F_tfjD6;3vAB{w{9נynJ1z%;}i/#&弄 Qj5| ߻肒s~+GΒ/1~C}tjg轻Ǒ\BAv/'|3ϲMs$ 3-EM *n.h0tdÉk\K Y_*V9aI^g kҞ|Nw.6p%f6m㩻yy'J@I_DHZaꖥ+hYx* Iᗠ*e 4 6%I5i#Wb%F ;lံo\D~V}_o]Թ,:Wrò(. },į׆"'0x6=ZMx'_4 =lx$gxtvڭi׏E_L\ч_ A݋eMB!cCйk1.ٳ/ 랟~?[U7)Mb3* URyv6nl%,+v~e&AS'=HhO_^T't\gG7#Wb%F@qNZo)!Έ=Vaak+1 mNT ъFS c.I؎MvѢIsd&Β rROߜfX Ѩޒ#8Kș^HrJNgh'mqަ U?f5 jNS&' R9/RRz?rET5zȻ Cdxmj}RTACAA-:n%7](/4 \P- Am/R Wߋ/|X~Ý׎ K'u;Sn|r/1cJA*I#~5Hzv'DPW_wu)TGCDt"AҀ`A,$. g!Hy Hi{ H5~x<AP'8/R_<^s~k"C Cʐ}4ޑF(.=_Ir*G}Uv*P _0XtPQiRjCD N) 5@GxmOVO<#AI|Qc_l>܂ 9 Q2JⓏpF~Yv54]V a1\5viqS{g{g.諓yz*HBAL&DFVb9fTj]f](?'jtn)ŤۼbֵcB.SG5KO#t%ԑ@-ZvQer)$%rv(4LZv@79u5 :#汚=CA6~sMXQMO"|#%7nCRS%gKTgH cjQ5O[ih[[dHᵈop% c2| Ϗ-~OIh;峠ؚ̓E¢  xuW5U[Aw+O]*_ A_NίFX :0(4MN9T w= ulq{3$Vz iIf=t4 rnxrѓ!u]yOuۓث >Tqm7A奵qڡa.::l-(a }ɸ̯Eg:2Ȁ'݃*+n]X.ݛF$8[V{JO[Hq}zAݫ `8R`9{ΰ׆C_݊꽒BⓏp /j)΃ s`݉:˯4}!av&\̭⡭iÕS}ͩ+94ơ1Sc_4+* ©1AW#{ ;@o M.e}T-2#535I;%a@\Tñ3L~;Mo\E3oh}{'K yk.a{&:lvP,uSr<_ڒ/y _zm݉d޽gĊp7́[Zo{C EW0ȍN/ -iR+54ơ{.{N KEjI4YXegSd˜jˢWV_97əf5z1ML-\VL1J(#< vM.iFY'^(kYZ iB_uلk)o+SgsV_CGz˧| {9=iD@3fAJ/2DLuP֍%H -Cg BAb FdG&=ßh3 ^0L"޷5C:~K\'H yL!+2_s9(}znysnܜ>[9GڞU;Gnhg_ aH,XMf d`XQ<7%Yfm0,!e1}Ja-I] }ҚGHŽMfTH>k~{0d(Wb%FdaF+믺iI,'ii/j.-?yU9MtsMd~}os' {^41)yUkj߹wF[5a@ŎszJ方{RZ]8q۷If6mi@6aʍ>s{ 93ǜ?JI禖| ${i_~i E M׮ v!mї^iU)1]'o $}o(r.ob%F ;l# >\÷E}.}QʾuZSCYt fP*i8`u{vٮ)nZr1s+[MP2Lit"oǒuzQ>ՅBй'1eIhMp8O_~XO0 y~&O ]MK%HꍲwQٯU_ۗD[[)e4]+ّ ȕX(Ps_l8#X͆-h( +9Q +lgzf_t~dyhȷi~b u{4hHTtqb+7.+NSלC+N:.]j![RKa>sɺ6clJqFI?*N^M[@Bo@8G Hy ވ>暛kj`Hu{N rҒ{(ƵQc+ݞR,*_W5U@픢 BZYY6ĤK55K )).PT(b–(ևms}}'h˭p R^*:#cc]6(_Ajӝ]]k~ ~◘ۜCF@dǞr #~)c7٤wCe?OVd HH{| ~i >KR(L %B B &X +!1_<=]A T RR& 4) 9NW hiJk{M$AA"GRN>ht;{Gg\UmVP9WXe#>*P;T~a*1XJZmW)E$) 8uA2`}(wy ]]TC_h}֡Ƀ,&ev I[>aE@{,½ߴbDLbAgQ8\ IDAT#)oGL66dK A(7^LS3f &^ziӜa6,_tzP&_a}-LK)?|hmYnls&zФBIPX-ë֔stXsS3[9/>`gTny#+n *Av+ۜɴvN(o:اa,&~b9_2:)3VG:[\bߠ$"mn\WrJ'diĝSFI5Nꌘj 1m&-rM: O.)*.)*~8A 1Nٜսhׇ+_:?SX: ݑx/Mqa~o*,=~~УTizYdzܔu~T)N z6|s32m =k%J x?+.zz0V?X}s8#Mvj~Gy_<A*^ʯFX:0(MM0o6vE'Bk,_(>SH# 8 5 a&<4dɥ"H~P%ucttov}ͪI i!-zNq9K 5Um 0@ hK */Ɏ ȔTb"qmΔzu*amٓMu]ݣS5$=K.QɯEtd F}ɸ dR% zuŗtu[o{h+GP.mN}Ey=*lY#;9Z*%ߴeOur)A|ͩ`xB71ľhXsP5ክC}ƢV@}l5E;ڤoTf3mC#RH)vn;Ɵ^x?NzỔQKΌy*Rb_zԣ;lC{&sVI(hbVgOL^9iQJn̈́#:huݗI5;og` G6Kʦ-ib6‹%uOju~ffI[!hzX* tJKkh uلk)o+SgsV_au.![lw_M]y˾8p'kOcZșc82ڣϓBY7@Ҷv`h:X)$6`tIvd3 ~l=M&Q茨i5ZJ {FL&e$fѹ[&07G0Rk'HyO=l(}zn{?Nz!+2_sfmT [.B^ĠT#M gY z NO <ƕ!v((њ|N¼Yl'˨9g:P9E*{[擴ݽv-K- *'2_6HeJsHcN=N,yV.:A*CJEa.>uBaAˋ rss555ŦeƏ Ot Ro\5f bQ93H~虏"& OW)ED-,,m$IIjk֬ /).PT(b–(fׯ/"'N}KB^qrs0 9YRN;!H9Q- A/8AJDB5]t~i6|Y6Sn|Z/1`fK A*L"| %"!Y;yEQ%W]]/ԅ &q _4:i! ?0LB= &B8AJ~A) I_0 !AupIr*G}Uv_)WgJ{0 EZ?V,x6AT@픢 D)_GRp HY`uu  H$?q^fCW0WW uZg R~~簾L%{>%>89b,GxoI*ny$)i0/:%y9L͘-c4]KcM9Gu075cyZ %=^M4-Ord;yx߭wk2΄2x,~A X]3pFnqa㋑~z =oXs_!r)>bwN9;BAl&-;֜:U$6G3b3(J x?+.zz0VC|tFtVNacƒ*"`߻ogNZͺh13) _݋v}r*!@{%E%E%Eo2w91F5ODF{ 7e'UJLSSiaQφo4}QƹuT.{rᗞ=JOmoܓE6GP~Ao'~uV6Z8ՁAi2p̡d@d ߸IxwMcCk,'SH#Hj5 Ĥ\svԀW{ilm P,{ bS}C3gh].m\*p# Qy2=BEѽiDn7>@J - wzOUt~Zdɸ?6GBzWP$@0XΞ3ݘ=*/ soNI _w}Bn9)IV^n~ 4;<Վibj"gz̎QD@1_corI3ʯ:BYS vt1:렙&TQOPZH1BIj_uلk)o+SgsV_j{B]zrAkӷFyoe?"#iR[* ugR{AՍ Z8PdȄk^m/~dyhȷi~aS|z/?*N^M.{r' li }=-2'L$?~򱟃#!;"}577'(vסwjj$ʭhY}d604JqmԘTI)G(n-))U@픢 BZYY6ĤK55!`(*DQE1 Pag31e>/pAr|}:8&aA\ H9#A G~AҐ#XAPǃ_"d xD"-A$"{TzuzOi4:}rqWv[AT_aT@픽 rzAPw&Ǔ"twL+RV }UvJQE~ASAA#| /$?q^&\D89b,GxoI*Ig{9D[L͘L㞆 5RziӜa6,_tzq' ?6Hs^|Ϩ/GW80nnٮls&qLH;`w6ܓB6pTD'Xr"#XNDd1v.IܗCN$6g.q申C)fҲmͩSEi12~ O$}w$1 (š-4nt?ފ}e'3.8@ E|_/+L=߮=ςGl7bk9eGp[+ғSuQӡG-YiaQφoFǚ߾>`'Zwo^7kt xRH'!Hetҷ:+a-@48qP]2 2o$<ƻױ!5ΌX)$5tb\.@ȹy ;ES HBnG uٹULGYd{PHMzLr_q"t4"Yqj؛UB*/ su*HKM" 9^/ېx񻞻G&UҾ7Х%jI!yQʍu'2i8OnU;eVZuopeEh_sJN! qhL/oʡʁAZY:s%69NJ`f&}9i'j8viog1My($Ǐ5]`EmĸoT~k_KYռd˸J4n=w`ck=-LM,h}UtGnpzy]oIX)$7sރߞpop_-#LwiV*%/ŕUWlΨCYpxvLS 9cv%JGJIiBO{KQ~u։ʚj!~yZ5{,cJpݵs6Z'U*V>Bn9)IV^Ox;B,~A9l|pdµG 'n/ir'i[;0 h2$Vj iC6h [u&l;a EQj@vLH(yԔ>k= g+H!WJGbXMf d`XU;Gnhg_ aH[!+2_ﳡynJ8`XUCb&L fjDpOCܞp;I!S,SR}¯Ƭ]]FL&jg轻ǑQɕX(n'~ory7,[5̴51*nle->% P@HeJsHcN=N,ʾO 93!m&Tif6~2بԛy.,̋5MI{9߹ژӦ@$-kw]suRrʆ׷&Ad>)puXm Rm/Ka>sɺ6clDc_8=[/ҠA"QzZd $a9{gO%3t׶8oSo_uUq-fcrdϞ(I|g?)d A(,x#knn)63Cwn/[e`hzڨ1UPAb!Qg>0D sPS* [XXhee%H$.T_CQ!P–(_'NAݙ/NֻS'v$ 4mwc Owvu! HqE_T$_h߇Wˮh.ݷbp2JOe;jnHT9-e/?$i/#^4$_tequ^QT W){!HEX `A*&B){Rp HYGRr~x<APǓBj/ CEVx;K)^ u>*P; #)x=AҐ4 Hy;  Q2$>c)N C!YL+zR|‹( Y{iňĂ*hGRH#ߎGy!-;jl{e6$?ʭ֢߬HMZ0S~jlٻi/ӖY olcCvH?;=YL-I<$T9/>`gTny#+n \EIW]]X֭g֔stXsS3j IX}jƐ'w2$"mn\wOrJ'$Ǵ9v;J! 6 lkN*_eMΈyfϐnNgOv54$8eؾk 1N?ǖ~_$AURO^XÓl-75aؚ̓rxOg6m&1֍)V{oE>{ "ɯÕ@&N5{էE=9@*kBgzW]_z:(>㖦'Z}L7L!󚛩T*#L&$)NWge#SH&'KDܞx:6ҽߙQq+=4QNL:97aI^,mg@'R?λ\,.p,BM#uv+Y%W{ilm P,{? cz~AȺ󼧺IŹ~| NuٹULGYd{PVSP$@0XΞ3<KkC\t>vb7"SM-wo9ͭHDƃ\<3 Mu~ % B5$6|!c]V-÷x}!av&\̭NuopeEh_sJN! qhL/oʡʁArF[ # hx n`ܷw*y@X;y夁lkAS?k5?wu[}ƢVV}FY'j8viog1Myդ31gf!Q~r#|>yɖq=[< j[ GUw82H$jjh\x䩓gN3?ϟ?…[n:|#) 'ݍG3.?|p+qw/> ;0O鱵&&4u$ݑ#^^GF[Ҥ$Vj iɍC5\'sܗ8h5!7y݂9&1L1_corI3ʯ:BYS "Bn9)IV^m֘}luLS0dnTέrQֽ|^߭ ~\NsCƱu![闙*e 4 6%I5i#Wb%F ;lV$=?U@%[5u.֔pڦs?ҹeA݋eMB!cCйk1hkܳ/ 랟~?[Z˒~њcPlN3 0^K!sYjAx<CLpvJq"Iܢǒu{QqɯyNhCަIm4PUW]Zrѣ;nN~<7(b>ti8xeB,y2%=}@A 39W ww1˄HDD/ۿOZΎ<4W F&V" ig{jju΍l8#X͆-h( +9Q +l Ov\hEϴZoL#4A;Ka>sɺ6clDl[6;16TqF ]cVYf4en "gzf_tg:.]j![R_$,g_Tq}6pmӯI]gw%ҠA"QzZdF#CCPO3ux y ވ>暛kj~HcuW3ly~lᗁQkƌRwWJ5zȻ C$C>*P;yVVVD"ڵZZTD$ ǏG~ccAƌ*8 #cc߆V>## SqCZt  Hvl~a/j/>DAGحK1M⋕:e/?Aug: Y :(L_NAA΂  T0  T0  Tr_<AA$#Y/9?5HlCAAbd}2Fw(~]NmSi|U>RS*@XPQiRjCD N)DJC N/…G;lr@A/>PAlŲv ^Ԥ-"G JoZ|1"& ڑ#Qn&f1EHΰ4?^y ɏr7+(m a,&~bZ5LIAӫJ/m3̆ŴN~(CSѥcM.wޮ; m"&_a}-LK)?|!?a ,C돵/d~i/Ӗen`s4ihQ#9/>`gTny#+n \ĸøkg͙Lk1!}?e? Re~akf-.|1oP~ k+p_9ǴYL)gRH#ͤetۚSDhuFc5{EZjyoV.;ZMKTgH0?7nz$?f)6S^p+UBhzYdzܔu~T)m&-rm9tFtVNacƒ*2ᗞ=JOVH%E%E/G2a0;,kmJgAHYH+Kkkl1FcAbEb0QQTc Eǒlv"3%>jsŸԻ2ֆNդiHC_R8P^w?9ڬ;IeA<B }+I30 WsGЋ7ϖMSYuH#(jixWyBK}L x])U[n&6uc-M c+:6fvn H⇣^KxJ3t/SUI(izErD.m}p̓}jU*#џc b ̪֭PN "z;fڍ#ђ-z^P9: 9 o,QV! {FT$dVq{cw?@[_ 607A=bߍ9S(_&cy>L.Hp(:72p/_>(9{~C~s>LZkfcem2gځcM.ғ?un۵$bثpg"RR}ߕ62D 5f5B8WϊϊEqHJCw̲|A"fA_yx/'7ʞQVU هuZ:ÊBw`N\zDyc#=n:2,>|MAjnmy/y|\ۿ#k,>Gi1+"O_oOYqUc m>37c/ĹH;Pp C!ԸS?eg:7/1cW\)ߖ^~}t"J\xrYPLN`ҙ67.ȼVl`W&-5gl\ΛqVE22"x9:zwkN#CcRQ.F,r1D>ZFMPʫ}۳B4s+Z5H4ҍ༑{R=oaнӿWK"?A>=FHai&=$~v_KHDe?tA6<^!$}Q(χc9G0/|q(M߻u IbXJQ$! DQ9GLbקV 7j/8ݻY72ȼ|"ox~\ +7+D$/:{9|}HJӾ1`wk%RoRċ[ 棵j3'4s1%}tzɐ}]Tth3QIYwq> q 1q ?:NJ&SF i[ƿ0B{L量nY4b}bKHY骃2Ţ՛\MzVCfl92ߺ%,8*ny@tz&GI˾_v ӤĔoz6${lzd_L1c"~t!DF?y8-Qd%{lkһe^`z0)yߢ+mb:S֞kK\xH#Z8°a'˧ETQBPQ0nR(G_ F|yyEEEB/]ho81 p9Nz1AOZ8ZRɐJr~Wr/ᣬccbtCijK)5=Wa5&IID疥llmm'+ј4=~ H5"`0`z:ţ_laMX6(O@0 _$I ==Q>5>c! z:HGc1 js0 #)͝Ђ5rrp@&wq70|'5yqC=}3sK.5/XpBTSccmmee%ka,ǰ*S5Ey Mo| fS 75vwlU1 Mox|U5=*@(v5"9;FL :v}-v2otwo>t)HE$r-ŻwG_dݽz;m|'ѳ]$j2Wx{,8_!W~6rc%D]hgFh(He;@1Ѽ3JеsȝzD$ u%6 DkZVqnpgKsj*gRY~v6|['Kߪ ]o/m boco-FP8:!YŵO3H˿_0f1}`f|Ia l +> }9BlSg (B5gѥ r]xqnf\1\{a"$#c"\?v^ JBx!18B8np Vi@՟U&#ɣH~mݺɉ@hgN6t舱3^)%++5|(ջR.ɫMFm+?ZnVPYuH#(lP݌ÏG˽zT.1Ad˄j_G{髃Ba2X2BL[.Gpryo P"z;f6n]e* E6>MOHU; {FT$SucZݢY˗/M7mj/wL.A{u}\;3GY_Qj=bߍ9S(_&cy>L.Hp(:72p/_>(9{~C%!"n+ 1RH01yG )!dqE]zR\սέ|T? !ӇIkMl}VL;s v<w`N\ze{{?BmunP(=uuvv3gBݽA2Ѧ_Һ? )ɮFLXgTsg7Ƶ Xrnnᣴ '5oa30nQFFP8LqSJ&.tk3QW"Rox3ܮ]8ۘĵ P&2xlmyk^^aMa( xf\榋!9{¶V{TV苯djǃ"pSJr'V-=(<9$`C ۟ 65!:'$44l.,MX}FM, E68}fc+sv,$ȼVl`W&-5gl\k1cW\)/}r_m(JJb8ц(}!V'EQNę54O wFbn\yW_)ᆱ۝Tf000@%MLOOG+r"==^05k >?YS[+RcK,}jk~# *FIoEK,8N@kuq<=lmm7vwPNFU rBaޮ,vVc1 L`0LfVV֨RL& ,,-[HR)gZoX16$}iWʼJ߮2 ð  @~ BHldd$Y[[*/ LxT*p8P2:IQp|AwOH;$-DH$5c^ IjIENDB`tora-2.1.3/src/help/images/current.png0000644000175000017500000004711311303312237017425 0ustar michaelmichaelPNG  IHDR8sRGBbKGD pHYs : :"tIME ;e; IDATxwXKgSIЫt Xw{k⦆^+P"*A"JHPlB@P><aֻ'7҄yS}4N=::*===77 gdhhmckbbJ"̅)єM"Ihsc曼xIi[׭SνN[uVd >f}zZw'ILٺW#;"@!Y֫S ˻S1n+\aYÝ ܦuo%ٺ3f!i=& ˫}֜UR^K;єWV)jLv^^?/7(M_s:5ɚEm=_͗i"/ܚ:y{y{w=lֶG#b̉Kf2_$>yIjZ6o`ӧOht/EM+hya Amz* Qԅ?[t8}rj͉] JjbDWUl{*t1}X8tLJCmY(#QO`0r_|7()%%ʕ/^d{:6:eJO~?zD\J5 M8P:YG⿿˫P1!qJ;JD!"?슱:x{1d^`tF!ٖeW2 ch[4oOBүWNG:t6m>b՚6)еk+'_@Y]ts̛r5=ۼO_umi]Z S,DN ɏ9Lշ&ivD3p5Q+VeU=hRJ9I6!(p:O-8ģOplnzO% Yj1ȧ.!:ջk]yWQ1~dz_.٣wg;o z1htZlLll\@[;\##G&&&:ת5kVYfVZ>=tAsiӆ2. S˝5i 6-n;3Vv1amݿWEBdn8K:}RkZV74:!{zN{X/`n'Mw35*> h"Q\tqQka,~ _1{젅*-ӡԍ)ƥO Zqr"c%/2$Jk,}EW2*p=lZWw˿WO92B(/l[|An0KL:CIcv-ϔw6Ww+٨;˗цg:HၢT=ei+Nexҗvv_q󦢛M6 U1!&TƊyk "]O&GUdث x~kcNߞ#/h=5f F5nn\.';.CsTt.]\]222448fQoŠR"Jgn"!cllb- lt:R½r\ڈbzOXwίrb8Q4 S)Hȓ1xNVX'_R;ӥqw߲z@te t"/#]:*,)8v ]X^/̟wvX|Uɛ:l;w5efz4BigOwbrpDS_Z"ztWi}yܱv{͗!DRT!J%HB*%2$D*?Y~s@$d{["gOٓ{IMiRѝRm={-*>>v8t5Q+TXu7q-/e$_x]yY.xo8B !$~bÞr‘'&YS;p}zYV,A`tӗdAqg'GcSdž q_1Vb.;;y"W՛77rsul]xx۷esQ/zbVim'tyŠGؑcT1ow[$o]:6WN@tbç6;qŖnnA鳧Hp=k>7`ݙ=X.i[61.f2aAq.~O&Y|h9KMl}]M5bG9ϧwnS^.r*\PxР3ff)rBhj6Hi7\clc;f7ס!akt!+pz@t;ٍ,D179GFcX7lcoSBpaOPl,>`Ӎ_q󙆮h$gNm{ 7ݔ0LWWdfffDJhff.:xXq[;߱`8Pݻrx˱W.(0ǍcckrqchG\2>.oʕUx>z >Jd9Ѵ|UxX>kB\l1ٳgB.zM-IgN1CVM@Y-gJ׾}{9GUPα}B\n+hb^kuʡ=a]ܹqGO.Vyqy >@?$IFZJ7 [zppip@P)D$qJL&N}iLa4sz.WvBB۷$ 75qskqX"kͦikkxޠ선Y#@iZtnn9Am-L415MM[Q*jxyCNNNZj T.9fG8A$Ҧg~@&ն&< gaA b@7hjjONj\€4I"X"AD-s$AJbHL ,~V0_OO_5]MZ=<A:7MNqquk%)zQInNv= ˨ϑߚ0t/4)Vo>!$HKz}MT=w˕W5%nT87d8ט'&IkFDةI}tγm7n_Ý˴x,W%T7Mq8E|zƢ7hVAiNMiFP練N4RvDH$BЕC8oMי V_e8bչ,/qT{q(S͛tCXyr_MsEn:f4& $IǾbl:FӲr2onܟ9N_wjWk L|z}ݺ,hF6 zK05kH=|z7j""ݹW_&3 }FΔɧ/|ѷ+OS/颥lXQPO$%懨NZv,ٔY;ėmR&}{{YEsZEvEwZ4aܭRf!w-')SdhoӬ=coUt0)Fj:NFmк=BHDݶv{W:1ϳnp-Y>)Sj"" MKv0c+bĵso_BJԻV: Ǫ4şf\Ujt/@HJξ:K53pyn*vԱjY/bP^- cnAn܄L !fIIAGyٮ0sF=6(0I_{;dZ4.pY^64|4 ť9k[8;# $պ+"~FĖsjbxƋ N\y1r X-3ɞN Ak5"q<Z8͙biN$I87^d3aV=#HRK:nY,N;{(#r19޺fvwϳd>ݿdGM7xk9BxUQNL?kwggOZs*\7Y\5"m-uX=C32i!]!/[@|%I.`WM)SⲬ-kX#Wl$GgUkBF>z.懲e>Aag&qCQ^,p$I8^j߃4Q ŕl)gS>yYҤ5exzE$BLQ@3'z!vV,_ ?ّ{hq4aj IyH^)/kEG$4=ͰU֎issdd+֐ꄨ$4--i? g>ՠG{#Ǡl4t) a9ppKSf1l&N!"Z x 0a027Z:Kߤ crMN)6X \=&CshJUR6Cn.`2 )/i\$"V3,]sDoS)dj~fDbR ! CHULG# M>ҬuG)muaϪ{V1%!irn]Q;nnZqFgWj;SZPThQ=E@\]/V"ea![ڤbɂ-EJmQJk=}v 5{1g!?`:5ٱ{ 9]haZMZh4T??ΦoyT_px겤05PTEJ͂&V\\ŭ~a; j׻,V\7eI IDAT(ZMݳeSҹ\aQ/Rխ+kyjk ?ЃΔV6LIH0DH2D*;T(K9cL6W۪&+t#luv1e*MjX֕}۵9q|!0aM}#=;9ݥH/I{0׷gigVOӨt!ԧ~ lKC\'NS֌a#TڔN膞69^-YKCup6 ]p:0uטʚG9DAh,E#:3R5e[XsZAhyF4-<&mͪ֕MާPu:E P7*sup;=9Va(d8O϶yyyTEu~vnrb'nUf\ǡvv!yKdd0ktſФ5ZΔ_H32ϴm38UT%4~RT F.*FH{Jg5vwkեZ]SLZ+iWnTgDB*s5YR9\ _]sLZ+_OT8 IyŪM#@&%4YKi-mmP*x!/NsFk^sF.&))ߴ[Nle!yZ:No/#!SSX, W,H$DNR0Bڼ #޿W|.ND"8wQF&޴MG&GFd{,F/lm644T|.n݌ T+194;MSP7R雴O^W0O`uLdZ';t 0c0ϡfC}Rr90 e*o i:থGWί҄};N~ fY `1}}tm=n_ÝJ#i5J*lv7r_M;U.BL,!l& !<3m0UI[!%_q )]ӴG3wǪ64q/W^9ZhнConksp/ $INJPQLgpj7ŋ{ŋ/BV[~j'/gZ'xIO3u.z0t\zM:ط3sk|GtܷӴG*Ou6Df\/m\u1FX0dYOMٲWϩOoiGarg7P)P 7-G 4g"y*ΛbX4ՏO τbC4˖Cd=Z9됰C80g'!BH~sW_"VDB0_ɏLCc~#PSOhk"r>k<>l-㤔p~xpiߦzt%g(ۢ3^\R#˲aGouvõ˪){"Թ(_*3*sOƻϟNd!ı?ӜIYE0M: 4ePSr(4׺SfEk:ў $Bՙ(q3:[kИ-m%a=^ɧ8"s>B !4lfˡ1 ZZ\pj"i"cAGK{pogv3eAIcy E\fpc&׮noVnҋj?kpUAg-ingvL Zbʔ()sN84]S{ו. *g(ު[n :҈>`J:Zi.*;Njxn>;iYd4FT !BIpD4f_f>y*=P0&9Ƕml2I?ş;^DH^%sKv-'bYEeG' pOyTK]%W44\T/wvpiu+^_34ϾU~Zq]Oâ?mqvhۦGswOmQ >a.Z{sS GfoexM5p_7u.J;Nw!`n'v's^]il:4OCPOŒ_%鬡q$"_٣:)tLv -`vj8s22s;pB/aS}EhwXߌ=pӿDžo.F+&q2 55615 +ݽ4*;v7 &VSצo߆XکbmW"6iX7cѴ$f[>Edimeieo Sl̜DžA9_iq9*[Y6$,xo2CgswmШWbAWiz|bn;>~JJHLJ ٚɇ o%6^ n!0qo>/(xV"~xcF%Ą__yu g`+ԫaޣC<*z1I+߮ٯ2 $)Du{j t>3$z{bFvV [RtZB>oc:8j钱bŒSK/i- \Y4,NݷӖr SnРRm17Ḱ'?9w+ת\(Js\fy^ !zwni{Sz)iSElkd%9#v82&:6+a\Sum U|7WFw2-Vxn[a%a`A4Y4U$!CY[Y7ጝ!$KF}zetWN)i"3y|t-AKwNי1{/nq[PR.L -K29/xꈛ624EPEJdmHLX\LlBbӣw !2-4IJ=()b,Ptμ SO9y4]g]yhi9rűy mYnTf?ٺ>-,t[$ +XѠs5ɼ.Y ddn:{F %^ Z 6Ʈ1Vd"K=o,lG PY69-7]G?xS[_Z,8υ𓥵MWhCOV߅M嘹_R|Ї<:gv3?muqh;Yu'8qJ8).>=ѽ}~K|Ե8\gNuk/֥P嗎dzx.` фU- @-uM@4 niitFbkemݠEkkU*LHWBjk+Kkkaӷ̮bimeimifblRm0޴ipUMY!L=PpdBBl5>xTiyBʷIW'&%$?Σuh뤄Ĥ |.D$%$&%s`miipUqď??Vw5`ai>jivXyB*k5޴:4|y&ʗĥU]]5ЛVЛ7]n:k>eޮ$nY!]U ml:(5zMS .oT7MsɼjIU@:.&6.,e~w@obMA.3]'ߨLoߢדijJ-w{](5P3&M M1X6cH[=aÕYRq TOn5,@oZ]@oB{Հ^Ʒuk;>,u%qK *^(]mmeimհd]C@oZm@ozЛ{[i 7+i~h"qZMShUgEQH+FH|>r qЛ~FyׇgjƦA.S_Ī )V wBԥ.DDVȲ>SvZ(=?ţOqFH w~F>s,P2ђku_ٶ$rS rȜK&Λ}z/a!eNe29UR+M|n^N:'ǖ7Ax#ph=&BENu5L(`P( JV$VQJRЉt{eyKliDeѼ &.Ieek JL$It͌ a[^V@֭1bAۣRZZZID)E-#pvNVvm{?ʶɀ-ϳk7 nF FIŜ<`|FZI!&{+?o9uyTTr wmAXz7fs#?wߐre>_F'x|ra{}f70>>)!:d@uS1Ao#. O=f`…#ӏ-P^rzm4J0$%pcIi ՜ 8}U^<εx`8e#ڻ5|\b_*D(3ôdqDfi5H%*gl7+uDW%Eu5KaN{XwgG5ʗ4ꊦSUPiI%%qbkbYdxQ{+Ѱ:k[/?Dž_[dsw Ȩ,BM⨩MD7|N$CXݤ]# z9=XQ%E6bB46c* DDͲ+MhQSU]\BIJtIҲ_kԨ_\vܩq?,a,g7x&tb?(]uI[OoGkB!E~~zrO߬-BuBMW}4.Jc^$$u*O=u9|?Zu)0/ʓoOWIy8Bxncf+K\~!0lZ++?MnDI3]{\|u1RTwAotuDjVZ0Zѯ%.,-9}"i]XK-7}ȣbBUZDؑ9=ZZ7, %URtc25~D0sҞ*~Oee[G{9XY۹ >5q†04k{ ۯ֪#RԠ7]+AoAHtscs i` 6z@ ?~@<ȸ50^gua7f4 i O;uqC4 P;4M@4 %P&R*ӹ`!te 4UP9˅BHtU@U]n^Jl+6}&#nuTX+eǝ'[jWӯI-Л7Ѵ\>8kQ1onBGA}RBbRBbRBʔ)Y!L=PpdBBl5>xh뤄Ĥ |.D$%$&%SVj  J ~=-M{7oxsnAj_e Qeߚ(R7-|4]!fjj;5 ǻ'vhdge۰.% &wk:`2?"f^jlWôGdyTvB!b"g.2?2pz'7;k=Ljq14B~ypFfV6g\/L]#g0MhB2jRғS&Ҧ \4T#U͵mÎ\'Q(:,(\o|lYtޮ%2ku\\dȁ .Z%5j ip?MWH2TP>|zetWNg9aؖzL:g=.8\򶨕vvS[n= iW2mrũ?mI\Ө5y)v14$ `.:tWvmyuMVM]Af*$SC:̋ϥ:h9rűyP}cpieU.Udä@r_m{Rzz2aCMQaS*`.M7 nZE4fLʙ\ҌZDi-϶RcyUjg^ Zr%T.\Ҭ϶UAe -[/u 4iѴZlEdB$$q,]ulynt}qi7]+hjΚR;[0wy]EW KJfZU L <4طc_K(Sl@oܴhZTDY?u4gnQªwdJtUe?xpȯC9Z;扥j2/~BmV666Nmo}i <}ɨ y/,Ow=Wm.^Ҿ~sYyT =L?:הcDIeHQɠ7]i6 qϴc5Лj7D^|@I `C~H:fD5@-~ȹ`iji7 juP IDAThR?ZmԥT DV_K.}SV8Wϓ q~\UJSQi@+)iN5^XmNS%BSl̜Dž+* :[Rur֠7vAo.[o_bG? ۺ>.|GFcM8G]L*Oé_ÿ Rʙ?/XݳѰg9JR^e;"&eJHRR%%Tk%H3mi;VL;4lu︚G+ǎ+gȪȐ8ɟ^N>/EdJ \hȦnOTy'VnZ[:;>,-Ūl569 >.6WA^[>Zy?oƄ-ʒ*Q*F6ժ]zv~]"I :|x}7>)N8G??9raE{*R zӰQk4vk6~1sT?tO+F>ժ]eommDĜ<`|F*+/]uKV*(MW Л7]5Ѵ-f[;+,RbBM_T2$\YT7KNKJN, H\1f$Ih$kRX! 5QWhw]gm: k&,ԠIVK sM%pڀh 4z5WB;76>w!U%SPzz \ݡNM om MWPoOLxMdۖUμ/.)SkZkYsTAaUٙXi5ʝVt 'snG}k}7F8ЙSRj#To5~G͇i]XK-7}Sbb06y^+7]@oz@mMЛ`у ~H M5Л h&iXht5Ge%}TqRfo0n?7<ؤB/h.öqpkgҢE*4+k[Y;[xTbu5d%vg <4*1>['Ǽ>5rc ʽY!L=PpdBBl5>x~ "717hhTBLWp6Y hP媆c7Z`!?pZ*S~i{ \(S-P*fY&|gP[|($C!73 E6EoD^iݚX8y#V.9]A۞%Ovm2`l`Л7]4Zny;_Nm>^)ir}۰cn&䰈BD`(N~rVUWsdѕ!(^QnnSO.lO," F|<%6c &\<2 5)ipMS ˼8gaiH}9z*4U_ BYa/V֍m8csQjp;J,02*tC9Gk`t 6~&<ƍJYZ4BqfMhcnثƞ8]Y7Qje7 nZU4-NTj~yj1L|X~j9i 5կיˏwfR(E rWQȜ[ˢ `/ oOek4~q]>ob#_g3Awzބ[ɰ–8Զx/׬Y&ڰQes{֯v\3Z?,{ՀC붍o;竀d5?e)Z}]Y7<1-BuJ{zK6| .:w|oq➅ 94W V3m_t?YOt_Uf#j-~%g\oc禈h:vm-?MJЛj#Xp\wCXMT4lȼG-0q f.,wf|x"Ln7 n7 7 7 MMu7m!Ԍ2:?,^>LG鯗9Sh=w"Ѽnڒe01VCf,XZN4ct(kkXK*Tz(tl N(:V ø\nOzzz<HFhhpr>`VMtݻw5 'ChSG g rss恽~2ZFf4D4h<b E"OQJap8`,Zׯ`ߓ/_O&&\MM FHR@-b9dK4IENDB`tora-2.1.3/src/help/images/resize.png0000644000175000017500000010076511303312237017247 0ustar michaelmichaelPNG  IHDRVBsRGBbKGD pHYs : :"tIME 2 IDATxuX[33K҂b+ (z?;ºv_EJvٞX]EX=̙;3;3l@ i)98N8.GDDR$=\bjjkg'MKU* @(0 &,6mkgK44 aBR*`2B!W(.@ BR m\Q, >_>C(< t0B_qעiEQt/O0 d# *B |pII*LNpϧ٧hL9Ʀfxyym>LteԞ!c^N޿'|LF>qJY8A$'&~LHHd4MXYZ:92ɟSJro/auKӡ;"h{ݷ_)[f{n^EDdD>=v뉐,:܁epS^3S]#2ɑ OU0\s-z[QE0tk!/G3^[O%̓88Bj-;)Mi/BҽI6% IӻBe%v,c5>CJ E|h1:m˝w1pƵN@[ -`\k惦oq0='Us¶wCƞ:=3D#;8ʬ4V$ V?:x9 Bl6;2˳g?X+>>chhLll:u]\(,\ٳg^)3tucօUXM3[ڰB37X`%19#fw-mk|ٛ}=濿zx҂k%GO?Ht+zQ&}ylytI+3e&,Z%KzqJmeV@!ߨBo7Lݞ}n+GϙwU%a&VQ^/Ze ^eȴg7/5MCx9[&>>ϙGjVCQ ݁P//riEo#D+FȨ=|+m*=~A?sHXtO~ܹ[%=}ԣ'M$3332Gf~J*#G6޹{k@s>gZ1Lt0{ho_ϯYԴ2ԢZ7inӟ Bъg l۴I=&]Qҙg&o_:y5k:M]4HeW# r3%0k[Ϝ>lxsK}$7+oY2&!_vq{;qީz;w3gɱ2%Gحŀ"b` Q|:tӡ`6<6$`M ._׋VCȒeԨ%mҎ{{zc[O"{-l~d"/Lly靇s6Y[7m1J"<0s@M^x.Zq&{uhvM4mxix^ycck>ugn޺vp^ww0W<ˌƄr.sw'xfʎjXu k~\tۙ_5ٟк.Θƀ ""\]>}vҥ)7o߮S4Mg]ks-k++ݒ 8\nkݫ7oݺx o8`@Ne0_T+K_=ط¥40MѪ8%s͜yX#}9+ jL8+&jմ%Ԍ}Bk50! S%*V<rGn<}L WWke-ٵKN;f͵5-[i޵ :3 RĮ] :!&Gʬ|a#fТ!~FOQ$[Uv|L/qmc-|O}5$dž#gg1J "ZŶQ_sd}-Ú(b?NuaSפfgRg⯯]k) -f!dBFJ&[C"UH*,K.uDmW7ՙ}ƽj{avz{cb/,Q~:bۡIjѪ8^$(ET:fnJ-dzĸ ݨ-4!i5 T 7')g 7+pX3WD iCFVhn?kaeh]5z qqy5</>àC[y֨䤬>{$B(*EQ!>ommrWX,V :5:AdRm7un\XVSb62gWk7x[*׊8ϖII5G,(6ջ ZEص6y0hpnBKzSӌ8ߵn5wf%4IQ<<|Ǧ^ϔɛeTqa'=Wз*51|Q_/ReTO5N~6'<1M~[y&H UHlY©SMkRybX씓tk[wŹJICI,T&峒 0:5˗kV8kkkHLe~i/Z d-UM3EQ/t[mz?`ٳgڵ+k{EY0)MeP)Jx(=)Y[{7wgasdQPQc7֍8-v30f4McQZTt\!(ʣZUk[UPV*UX\YdjU+֓g^z]ӳF*Uim]C MC;{{d VtBFF y77aCkMgPKGmۧwdz@҇Zd붻ϩ9}K3h7 !FAz[n+Rs8q\9)Pe[$(9GڭkCφKR.vbB_!UЂV o@jʡxvJ~|MUcJnfi8yyWUrof_B1ˇV!(3_=k*-Gqyg޾R:k=sQ;[BH69;s 7JY} jpm$IzͽF)xBjUV\Y7YJbbbWԦVcfK='''ggggg={:شiӟ@Jl)ǙGtkVQa<i76͘Ԙs`]@9uO8plurs*t?_{Q'*?e*}W^:;YY8k Ϛ5wW i_v> 5{{8,Rwz6OG:Ťj U _.;d~fN-wy"]ݵb `)(:a8OP03Zk/gNyTb '9pB o:0|⋉z acŵ PbB&^No+5t5=2̉]J0Ymԁv}Ÿ„^]'LVUgfbVgEZ`%q-rۮWf8b2Ӊ֟SB&kdW{6B M1ƒI"s7_kԟ[ط7\zPw,RIL 8N0SsA IQdqd0ۣ̿D4~aN._I{i*1D;8i [dWC]=}zk]ͽWJ#ՌG9*<=KR4#xbO~#T =+X jBF?{)Kq.Yftie2/d@,#4|=ِCXaƣ0MwA,ji091v‘95g;!PZ^廃 g^&bՃ:?8;qkp唃ua !F=8݋hw̿VSZTJ?`ڨ_V8LNg۵BhYٷ78'@&︋aM{s5$ݺטm.lw>>zjTc_ ɚ{jK,C X<!D=\>hV6,*%dEٌ4 k&gߥjh[Mm Mξ'l =ne4[h~zTDIW}ξb`'N![`%iD*<Ifm{vnC~QS__խ.ڣ}MLzގ6:O,533;iˉ_Hh M-YVkBT=CS4ЦjѲ)"ES6E =itf)f6X:lYެ'Nlv;kSy(7-]5ŬG<=4IӶ=q]GM Cqsj vXU*.{icZK-/BKSu S:qEJ(t,$bњD&y^gdo}t'8浺0 a*:IŰD* &,'UT2w9,5L2]%D#}si!]2q,$ Pb `CVެnJO$%1 0k 9fZwPk+4Ofk\bdsS?lZ v~Yw޽m Winj/oڏ~#޷MK//*[YY0PBQb `$ص}_d$њWw<lr|oHR_ע's"*㑱 "aRSc4 ܮRCc+WbN1@V7"jc\;ڦxߕINX*bAk]zlp9#t%G,Jt"473r;,*Qɰ͜jto1=~=תXfUGE7!,N|خ+1-:KDՆ1{ŀʁټճﰠ'u?bצ5'!D5{~nXv7ʏdcQ q+C2 1ƫGZ6y[:OYx޶gzf]+i? I0kгʎV~hՈkR#Bp굟UmPľN\q ꦜ}~A-l=޻#a,OEcr wg5!XkKb N+aƙ6qqNF.N$I~84#I Fy 蚉bVt=WW5q+y*\J=[V5Jw LF &!Bbfۓb9BҴ4Pjj1Db215%|K9555.6$l·vxu^! 95G.'@ApE 1' 'mW Y{vǼy  I!ߨ`>,^7zjK]a:P'6>?&B@~uTMF h]G?oK//3/k6|[fgs&/~c2GOC~Άxop&ލ7'%B ges#{w\ʋwn;>z/>wمoWTy>{bW_N{{N5+1ە\sI'DL wԚ߽%>B>|ძ;[xknæ@.sڶEo.%'hsj!:龷fƷ"&0HV`s?7>ζor]37,}{W&[^Vl3D!to?}t a8T1a_Ka43nߪALd%AYM|sv%S\mHG&ULc8}ئ3W? IM&BOLا]R/L M }"/Z^e=M]$OITJȒ1 `!/ )mYvzm'pKӴ y۴h>Hl:峒 d#Pz"u7ǼC,Lp/h_:M^ǧoFqOB8( PL2GxhW9kRko+HٽEW2*"՗}|QњV<7`EgͣS>I"ˮMvܰ_'yÆ$he»# ҤF(Jp%ffBb$)SSRJ%# IJəh4jJ0 aAREEF|S@` PJzt;tF(i4uz pJnr9IQnj#wn7E:@B4Mˤ2'G'RU?V)rppIe4M뉀흽6lӤEן #·wn1izň0kj J.02wk6)L# 2a{7ogҚtNjq.RzTJ>0VdpتGQSkΐ/ic9eꉽ"`(sAdHȭ}ܹspW]y['5H{p*/)aBaieV 2jZP0]kM}hvd#J{cj}:X~9Zy|ӻ4n5b3YQv[lި_׵Թ9woKO6ǯU BwgۧI.cwkr6jl(W: ;nA*50_/Or3GTCxm.->Oz&8y.8t )ہ:b!XĹbFT*Z2v2ۧumݸ[ž?K3oFlz.! 4-MMMI[;:DjID" wjU~+Vpyƴx-:>q[C3rZ/_- $b; =qus]kYX6|cc+qs`|oRۡ\Hȥ퓷LNpuַυܿw䚑$ڔ<ȭgUƪ+HyT:nnbBWk˵Af\A:^+ 򰔴K/,PBo9p fGm{=NU$OTJq۩[i U>',+0n-Eipk|ы_9Y/ .qH(ȹ  ocJ$Yo`av2KHw8Ne0 X,Vll I~czlj1, ðoD<ٖp},&峒(dP"bS3tf 0&>6}¬^G: wUIO .<*`=H)uo!Đ2~#Ѫ)T|W:l J90<׬_VSwT@`MW7)u70уŷp*g!.8{uscp.{YĿN>#2Gimɤ?4ooV$yTjX7%NڴRDV%{p'J 2?B FEn2L(*Sy-=|ѣG=zlTKG?iM=3OHM]wtsvw C^4u٧o1]'7MZ5uÕ$B*5} =0Sy!ccc"*T OӰٜRQ=>7c,[f#6պ2!XV--Y|H<%˲FkF*wX󣋺7YvcJ™0o2gmeS;,S!W?k6FHg-q<•2oD%kVvoRvwP'EKT{ 6z;Y3^2k9֎EC5:fn*ަݳ) ܫTr1 bB1pSi;\eJ81wm[QCooG*SM6꘯!$?mVA2O5Ma6FdddddDD:ulmlIRf~}Qy 0wﹺyukQ] 0 MP LLLJq/_Q$IX\ `\~@` PTMS4]Q A C# 1E BǕIT*Z( .|6_e)w{; 4 D MR B4E} BH A#329˕c6~/a8#tiY# ~  ipT*8Q 0ߝ>&B4CgE4 D0D 0L)M"D8ha`1 CJ 0 !NG(0w%GR 08Hw3/ qgw&BxC Kg"tiP)шhI aa @%F{@ 2NF<(R҈3 |/@ '@A ]z i@% C \ ̈́%> dH(4H0ߟ1 pa t "~hͺD%1 J1 b_@H@R )@  H@R )@  <>ʢ3oih Je -$ @a(jНl 0 +x$,ܺ&ht/)*%S IV"1ӥC K!pXZßl>@` (*=]^Sդ$C_R$+WyX,"bj;h.;f}4iğe2]V  JF1H$ b,Α`,X/O"iTjiiP(1+䖖RRL MTjZ;Q*J@ (*mmwPkF^>A}dBȃ`Ɵy.V@A 8BOjmv}g}cǯR~.ɇ-#\,]މnr6*RTjSdWnrx9Cm5-{ǵ0ЍNLwbD,5 ߭O?JN3{6e޻CҦ)b;t]^DȖ 5 .VPA ,Bm֎:C#6?}or瀆r 2:64M-ao֠O5ca,Czշ`*558m(ASX|kMH86|+qo&_oƪTm[׬S|*1 ۍ`nT!:oq¨ak:,]SX~[])a=]K܃[FXzm (!El;oV@ߘl7 V2m}5 { RV`&GUNTzXjE<Sƾl&}j3R"i'vbF>ܫ55yuuxiU*%VT96Xvl{+:tEaeY8]_w.BiY?sR'j݊ ̈`B6 dx~oWb -b%bs欌Ys/ \5ZMF[20N$-G7KY,mŐ mTk IDATڲ,>q{ƒ!K~ŏR!ZHzU-h˅'e3`"eM=ڤn-y߈]Tޯ-J[e\#ɲn1`??qfVA]7{jR[?tFTʭj+Вm5qns/'`%3꘯!$?mV,_H*PP цo6c2RdzNmLmY#mC_>(I T@VdCxwﹺe,ҥ  cp^*eŏbq= 4e۴[ީξÛYЭJ}]V+b;Ohvv񰼯";ϰN^Eye-`t恦39\ ӫWYR` 8A#`NR z\vU)AnAY\W~^p9 Ev ( PdAA0FR 0 48_FU*V0 Tŧ[y 򛳭{Rݿ7iSk >EdxJ_kG'G'n0!W+Xz z۰љWqqtt|դ<7|Z뙹]m܅ɍOPJJd^E"΍黑QhD[y ~5ѧ& h hHQ ˼q>}Yqr^іn%쾞b>ho7ߊܽqggn3$M{vѹ fۘ%[jNnzgb:lW~+gubB cQFE+u~YD5Y PFz'R_W[5G!DV#HZQIZ9/15ǶE'G&iZKwoAK rsi޷yoWx!*?IWWŽjvwz3|$?})9 ԋ֤j1qlMpXTBѩ/k\ຏ1bG>vܸ9B,뮽xk˛|XwڽԜ_Hx9!D)cǥ6mbW r75DTW(vTӤ$v,F,h蹠GFR0=]׋6Kpr|'_GE|q)Enu-8Ϋ7bA[_oeȤ<\sMSo\ Vv8&էkuՆ(L+uq15%րf/7 ͅz.KY3F۹LakE7ZǣZڭWߧٜJMKq{5`ȵŠVgG(!>^oy ,32fqoe 1z+eG6~NF4 @~Q`a'4jdZV5!$:%~a7&#qy[o޺}e0gkTǖt#B7{B"Z~cϹdF&ڭ*1;[:K6ذ6܆jd΄UG^O^^|^۠gsm|Zin,(B-'߽ZJMzS tߦk=k87 nC;B[YgB0 Ň4tupry8pBT8:V t}ƾ徙G갃" s%1mP՝*{X2n2?3;o/otob$w5YVcF#H9׷qZZZ +Zq8>w=WWK7f.0;ïѴx'8h hS L+Z Ap>/_O_ S@  d~ƛA m !F B#F}KԴ> 1 c<4-*@\Rih觊eB?}&ij3~f827 ʕ+WXQ ɦW("kLLJET*+13 ,$I\T*y<A]z`)HؾO߾5jx|],%''G$I*JG'gѨU*n~;8ToÛ6ɞ4M ](ek X]EE"*\7rA- UEO+  ZB۬39) S$d9sfF,8~h4t%HSyB;$eZAx;-[6h'OQ0(C#;(B)U%< ;tx4BzM ٷ|5kܰwXϼ}dU{iEskh!--^v7pd mSBw窹eʃ~"ˤ]d9D0r"(InRz~!F1fE;Z2'>=ujyW͡p)SSSSRRcjtכݶm۶m>}kWì^Kի|dM_ҧ\LvjZ;sD+btYk=~Mo}O(iO}˕qѝo{vkeϽe}>6rµr%%m۶;oޘc3799U+.111(҄*ʼ9s^^󳳲͡zHĘXǪ:!aw !ʩ+u'~ Nv{oY ղQ=BT/}ΫY*{Ցb6Bn:]uBGw!N74FSr.ݴq#!d1=z\CٳFB֯_/bxRJ^ott dΝk1B˾CrPl^~ی[?`]]};I8t^-K :WϜZYP@=y gi+;ޮQɥ}Bm%YمJW9`633!@ʡCtzA CxC%IxJ#RR\d6~NqqQ!(q$QMU+zx^,[׏}JTiW'Z=Ħ]'uaU yyMK`nPd(bw߰tW8B{׫3}t*r2܋|J}>a$ԙJJJĤC!WۡGof09Aj-oٺ퇯_yߔTY3µxʬ b05 EJo}~1&Yg}+&K6=Q;_ѩM*zoVN\3Ϙ1}EU+,X0ss3W,q,y>%*=l-={et5 '4 q5'mkrm.> N)ղU=9_8;k!d%&Gx>4fqqM7;3qү_ߊ:ֺ0Uz@SҴ&E駞:שS^~~O0͵٢ժǏ?~XeCa<{ĆʫMF-[۷oWҮ { y(jѵ?rE f =z\Su5۷gE qF/{vض=6..&&éRm.***aZ=1mÆ  a&)!!sbb (JNgQI)V:1)!U\dUhN 3flɲ, jyR(Ek@#Q*R@qlPQ_PEQb@I@:sGx^ǣG6x.75InsV﷞5C'.U}Ē}s\rt={w]ev=sЌɝZ뗏)wΪ+vKc:}[Zu;YJ4"")2ZSAm;Oݩ jV}3DЈ f[}ј[j9'y*2yꗪߩ?_zwC)_wEo𣔮pWYlw֢/ Zvu 쓨l3 Ή1 M~׾9WmU_ws[N`HTt"G[QQ!I`fEU>5ta˖۷ƹkHPwݬ/`0DEE@/.S4A#ڵk藽{5$@#@(1Us4.|@D @D "@  7Kb0\TC@/@D "@ *Hc.>^ "@D "@4!yFj!@4 .#5W"/7s\C۴nM_QQPjJǨ RJ`ZyWK^DJ9[6LͲ}>b9QTV*"NfYȲz~`:W@Zju1=${[ӥK׳GEEja)˲OJnIUN&1QłnjFF8ʫ!) ţGݱlٲA}/B+lXarw,0S,wu (9~?555++;%%v0?ڝ$yA/J"#Py+oRZ)~H8"IR)kBUk>cjtכݶm۶m>}kWUe}WRw*%7Y뗽-5S1}wZρ_g5Jk3tSD!Dre'BtݚexCYsoYyp\aIIq۶mΛ7fMNN.**hʰd|>GL$J42oΜrW}ys$1&&jNgH}GDBrjcI7C:8[z,uT&~>k⋇djjV4^`uAB+Nn.s"pbwPQ9ݬS Գ z7mH=zLBzyǨQ׋^R-(ٹsoZ̦вo/~)m6뭡ߩk=6s$X~eiqWEi`/6z4]=WRG3'V<?nfh*P}Ϫa^&rlh<lʎkszorP;ch !|kVva{UN={GPra:^^PDI#泟S\\z2q(I1C7x}Պ4˖vE{7jիɵVO:i9a,<;{}Xh@^g"XT2Y6>7,]&̟x_;]ʩܼ?=x077"RG uZ IDAT%1))GvQp_mNZ{.f[nG~7%r8իezgp-2२@3@kdCQhRn_lhpIGV>:xFʣIMgTWtvkJgS.kƌ3fL_xQ ̜܌x<qFq:xEI+JOe1CK^;w =B"Fq\ {/x[r*OypS z,uUO~lqΠW&4$J2c4 IR @ !No}%Pkv20F yusN38ʥk;eΝ7nڰqڶL_'S 5:aBgz5!O>ΚG4yb z#G9Yrk{p#?0qG3;|to,wV,v]8իuzK?rwU NTS1Gl ;%辟^j6sgeKx݄7!s)iR*1BV+(8ZnSۥ8K#✦3xBg2dw֔R]h-9oI/k~<9̊T $D!!DÇ׷.LU74 DQ|'u饗_9 sssmzǏ;֭{xYPFu:O޵;)9911!CzѸekHstf\|Q!**=A!;g~$''ge>,yAv&&&&&6vmYF8B8qd9˞];mipzT[JXiOL۰aàAwdJHH ;ܼG||+A/YTRzJյNLJHh(YUy@nӤBCbcƌ[C, B;<[VFcKKK+*\%{ʲF9>>phd2<4T^=,z2un[7;RJn`q8B&Al~($( uz`4+瘰9k\c8B/P4-x=@0Ӆ?_b6FSyWOJPdV(]͵b2qj 3Bp9@h芑BÚ p)*zT@^"3F Gnhj4QX 3BpM@9PBƝ@H^ s c!A8By| <B)BQc@)1A%c""!JYd)d_}s z ^ z*׵kjݻlu^`03A9@ @D "@G,pbP| @D @D "@\C\ Tz@@ @D "ЄhUa.>^ h\򊊼<6rµr%%m۶;oޘc3799U+.111(҄*ʼ9s^^󳳲͡zHĘXǪ:!aw !ʩ+u'~ Nv{oY ղQ=BT/}ΫY*{Ցb6Bn:]uBGw!N74FSr.ݴq#!d1=z\CٳFB֯_/bxRJ^ott dΝk1B˾CrPl^~ی[?`]]};I8t^-K :WϜZYP@=y gi+;ޮQɥ}Bm%YمJW9`633!@ʡCtzA CxC%IxJ#RR\d6~NqqQ!(q$QMU+zx^,[׏}JTiW'Z=Ħ]'uaU yyMK`nPd(bw߰tW8B{׫3}t*r2܋|J}>a$ԙJJJĤC!WۡGof09Aj-oٺ퇯_yߔTY3µxʬ b05 EJo}~1&Yg}+&K6=Q;_ѩM*zoVN\3Ϙ1}EU+,X0ss3W,q,y>%*=l-={et5 '4 q5'mkrm.> N)ղU=9_8;k!d%&Gx>4fqqM7;3qү_ߊ:ֺ0Uz@SҴ&E駞:שS^~~O0͵٢ժǏ?~XeCa<{ĆʫMF-[۷oWҮ { y(jѵ?rE f =z\Su5۷gE qF/{vض=6..&&éRm.***aZ=1mÆ  a&)!!sbb (JNgQI)V:1)!U\dUhN 3flɲ,cXi~5*" hfUdžvD5HqE}*l4㋝E6 o`CSy a 2L)u\1G0 T%)p\ xʗ@7XD DT@0Hc\E:&/@0(C64/ "!(/}vE#?PY o\Zuz]u겟]To@y+G_y{wRsH=ן4yC#.xtٌJ6D D~ۼo|҉5_{}@-+Ȗ~^0BR3B8Eڴk0"{ymӷh  3N]芟Ö&\\4rZSywK7kD !Lq|SmV[iBӇ2! _H vCcox۳wxKne2瓕78d3ϬhJȟ~Mm,ԕ BS~]Yb;aῶ^Gj_E ,B!ֺ??YVg}lZE5wpQN !p5ǁ@V&Ep~p_Soeneq?,;-δ}DS;}qimz[^ěoyͭusB p9l˥[7PdeKG˖ԛXb̍/qz=ܽ=F#B 1#yh-?K'h?n6G!Vy韞YM.+w~>}_;B[׶#ۇkCkW*r$($Ȳ|~VTTHO\E_rV߼}v_`CSK -[VD)c{1Z"!!R?|PRb\m<;w\_/ mhamh|kr,""8ɴo-Z0r0P˓< ɸw<`CS9!6XD D蛩`ZQ|͕WtNn׶ѫoZV2\`)F1!!sg'**>h4lh*0,""yժZhS `0`5ho qh4 jq5?6XD {]}h4 @D "qEIDAT@ @D "@ @G yyF͌`<'7L&(k(^< FWEmۖ?G Vm]n]ZjjRR2 YVA*~(:NA)uENɒۃ&!**>>**+Bߏ>I1Q=_d< b0FA !s;V8ш18( 8x0>.d6Z 4W`:Z;IENDB`tora-2.1.3/src/help/images/security.png0000644000175000017500000013530011303312237017606 0ustar michaelmichaelPNG  IHDRdy$sRGBbKGD pHYs : :"tIME 1IzQ IDATxwX$ۗ]z ]QYO={/gw"aq;{E"moI~, .y쳛ɼy3wޙI=sڥ+ɬZ*ǣ(H@ Q1qqThp ssGGQN\.i @  a\.WhnI$1LcjJ2EQ;@Thd I*bX&d2@ *<<>_.#w QP(|>AQ$G +0Lb kY((I1T'@ RIeR)>\p2E"~֭?ޗ5]nM,|Q[1a[N3w䯑3j@ 8AdGGKKKE B[W7w{{28J?vرc֭[կg/Ѷiuã ٱmv~`7|7O-ק]P@`.g^u[kѤy@@`@P_~BBhZ&ܻw{)i&3+w̥QΌ;V Js~4wҚ ibĕSܛy^{&P7E]<~~gm#̪Ҵ˳U ( \6A54s~ؿP8kGZ?!vnֵ!XbKI%[_2c7 - _9gtڰ-^,Mw$ }YfܹľcXTNBw }!b`0$O?}'ju%''>}ѓB KKKFSZzWqc ݸ$EUtd{Y0Ւ_wƥ?) ϡ<Բ? lm1r9:XVAm:'AU0^Aٲēk[5,\'SK~\-tѦ8WPsa۰q 톶3,Fjx#GnA'Gr>04j%\_2c7ѡڹo BJ5\(qԑZ<$b&_Nտ)v82l![u))vWΓs:f6ׂYڳײoTh_;Ndƽ<Q}88oh-Xz.Qi߻7c`P [Ŕ~>mؚ]r; {=JGD c̓vA))) dε`q&w?cǏ߼u`"ݣk׮]v-skkMn]=2]~wѴO]vn]hү,ɫ7o\7%Ȇθ~B϶;q!{}{~8z1I d+~jŞ_M֏ȜWHlXˣelbéXߙd%s{iվe'egIS=6aaӈĨ9pr;92TF-1KdL6۲~j3"2UKef@f\?{3o\9_uvԶ+NwqK[kmONh/1dw}yZvNsy'MꍣރN-}_=2Es[6g4}wv #)ɴ ;]Iir ( 5䇏<=<>}v}oެWާOE&粳զLKKOMKnf5h!~  맟 *Vd9m{E 79c5>A<; nKTYHKH 3Z 0RuFV(|+6{:?F8K^dRȁwcpreTxJ-ڍ9l=nq;uH_"΃_eba&xٳ/_?q+͐ .2yZXBF^` HMX/1%HZmZk Ԫۨ~Tƫ+v. 0ܵ ܑlab#3Iů=Y@ӮU_C/3>]<%m4dc{Z0pCIs!}\9O2TSR ۦ*gXkC )V=B 8I"رJӛnk[O=xU Jqp.]>{Գn EjӺ66oAs廔ۍ+W"ޭfm$Me6qˑe#ץ80_+AI_5D!WЅ  KĜ;mqhY spk7o8`z3~T4͍SuCstc kh HHC-1KdL6Jx_s淳jF>J0auaV,3d ;m[|2];P-sݼV5ߌPҴZjѶl|+SJ6%J1A5A,̈&Nb(.8as|}xu2228nz,\t[d"Irfk0¹`uJF\̄}nʗL 6EmlUˈs4^akUNTg|'M- Ry6Vi'}@Kޜrл \n32ԣ2m$ͻV}82fŻV/ aMwfTm|G_*,ZZb,}IחȘm@ºv!,dV3lFE8i i} OցiQ``{KXz?qcp]~N`JWOcĹʎޖb3G!I999$Yvm_ȈHky$bgggf& nEӴ.n EEdxDm*862;Vܼк[\"̓;4h}MHiirv*)=ujNCVSm$[fuZP#'x1;ta+Jq6tx%Mժ\jMO.jRiJRguo3ЪG^Ggݐm~PC+y:NFSޑ9acKD݈Q4wM6`\;4vvk}32HۮNqk40$/Wm&giV3,7]C܈qJ ֞bE; ^ƆR#7>J/.ڿ$QY :[́- V3ºբ)+WOR ܂~[3σ/2=jw,yYM43u ƴF{f6ezr!3jӻ=;hS͏_zXE_mb@w}@|K y*>mҴ lBk45Tj\cbzm-/5jh{jhȤ:uT*>{9f_V#E϶O7~ؾV(?'t`3=CH z 5grv5sc A⧳,<ـ@ Iݻw7**Ξ􌏟>yx8.c.ptr*b*a؞{Cj5:`x,4>"+{qę6~JJLC@&>3JC3x  ,,,LfffƋSRSp wpt]PT)"ͥ{Ftˡ9MjPٷ&Yд ~$s옹pfdxrb D9h:++Y[۴nӖ(i jD,V(=Wc@A Bd2iJP/'LEH(>sC.-@ *9H@b`F7*hQĞ JEQT(_b8b!^@  BTAK*hQ":NJ/BK o+:;3ȍg/馾ުb @b{^ >lh J*ezi|bEѧO|"J8w ]7ʔ%Fǀ@ ew={u2%$$$$$H;pWT8Q`Vi.}A?AM-WN4^hn G RgÇ usN D-݁aEQ#u/_\66nX17^jjz K H,~AHEAÆ'HtcպiTev:~~˴v',,,fnb t``_)~VBXXW6tq|(+!!ň= l4M9|g0W] zi8aV@}u '%f/ڔΪ0 #qjgŅݸQFJ8Dj*PU]gލC[׮<h/֌C_)!!!IpppIqy(ԟEs%1t!lUF4_p uHL<5!T׮O t'^}#Gܹsڵkwyҏ3Ock 6Z˗6V ,0{S8~: +.ݗzxvv QZ, 14=gW[.%5m۵5sVNN~bFq.&T>$$D'+xh7-dKn Ǿğ_]Oh*>@y^l}捛...^^^!! (=9fop굱;ſ’^>f`Аm.Vj JX͛ػCJ@ ={,Y]:bQ5WgdN>C$)}N)wn)Wr kqo1LoMh@ JSǽ:a-r)oݺ(I -2n:iY?{ˤO>:}/{v~lǟTz-$IR$پ]{ !I`bEnً\q/}-~G|^&s@ Æ.XeVw;iעh ӗL쵥?1W:IX,ʿǿtVׅo@ KˬVT()_<$Yl^Ӳ^3i,kìk#D)ޗS*Ih<^B\\U77Lf:e)6U7l| ZU|SQAqtr*[g٩vvvJ@ %}+IlVhF D(sgVgbDb@ H (US^#=@ $@ # >T8E\SɰbtNYITL& ϝF E%[DY5h7j;65 NNU$IJ$>lwwH rEaסuTD󑷋ideTsus#]`MTrmFV۬8t+5==}ҤIIIIGt钕ѰD"L& 6CX{F 8T*SRWfno^:~O|TՋI?.rb? %^j1(BR*( &4EJBISึB°}_dr~C҃]Hvlۮѐ5j2d޽{TJΝ;Əip=MSD.r`(AY~l #o0+[ |z[}:wK."771cz{ؾ-;;K:t4)4M86hH$?:+*9yۄ\qRڣ|kzLRVh0 6hԸqm%FZ"˟>y }sqqr<{?QT tm5h4[i)j M(/Y{4-\ .š/,F %.Rv7w1M>vꕨS[GaddW#6~z[}8j>6ʕDxE J7jbqg&ޔCē̼ǰE=lU@➜?qeV`;7Kt$IRz!1w`|&}N74(I*E@I_ٸ9,̝j3eg?3-b>RMѹ ͪ6?mOy"otKՙe| s"Nm{4Cv!AUX`zKz.q-y7h&ŋ\Ρfv+ =z˯2HaBfTvs ':;U1y::ăjfGT,{{w% ;nֱ +E6f'@voo@ZD_NL*ȟhC pkoZ\ 6Z=8ءL+֍'YW7LRXvwf%U"I^+^CR}fTӍ?WaH@kHRS ËFrXsȮՅ({6s4^xsp{:^< vb贔?FMb}ag6/l"@K7y<}VԔmKkL2՛Dcut,yڶ:o|P']~dh`4cv;_f4Њ+6AΫrqm0u l[7_[O܏ߥ?L#핻^f}Uuታ_O&.tjϙ:> ]vl#h 7ڇl6(bRe$CR9~)=_ĖS1',P^şzo=׮YFLZAa;yp M㡳H.NP#EcFBbp8HQמ ۥƍN T,Li]'Q7O}P\|͙\9T{ ܉l&LVkX2pCAm'+]&$ERB4MR$~sҮ.[v#'֌8@\?&Êvw;7m{I)R~σqDء- ǧTp)6LX+vce*Թq]OgI$%O=śvq& xߒ'N8Ġ$EҸ K_.D._!ƫ*҈^x(4-9]G/7Ǵ pfNFI$g` 8tًr&N|euGXӗ{z9of[wjhV$%IR4-yw$o#wL{}TR~s0e>qfWW67ar!uަ_y;wGHi)$ՆuޅIطcV}}tM bao54`avyH/߅u}D$)y지f͚5k֬հ)WL /Wg P|<שvQx{?DQj_ړ= XFBmϡe z/=wQΘA#yf5k=L?߭!:s$5`æqO94؁]FJϵلǥ_wK߭E#s٣82Kc]C0njҧ_#AYx^Lۦ-?&;hمgOΤ/YPC0-|{*]\{n0yM0 0s!AUӲn1Ū$ũwG8C'&VPqba,[LeߨgsGY q&GPšx'cW3jVciufԱSs<.:oo N׶t[Or->?yovmFމՍLPf\z. A]^LXi.L9ծ59๘^xx_cD؋J$3l|hm m赽某ot! |uo]Z| -:$pS{UXq1r ͅFI?1ߚ[ E+(j>}Bo`76|l:fZ6 c;47i?Y۵t2zWuQf‰#Kٌ3 ifAwԹ;o: 6IX>(KvE, >S3)y`o|ۆKSfyB$)OQ2xiwٿ 8^XBPTi1YY B4Ϋp---]8lNsI ..M\ K|#!i̼p7wW cܙs7 (TE|!W}~JZ_{&N=yu=7sǃVy$V0@`:S|Gе[vh6VwY6sg7HaZh7(, zܲN,ax[&ft+ Yy~>cyenWnºQ7g| b@] q(#&H5f P>Ho|\X#"G:_BKߟIלn4XμVJģojWBjc{9͎ @01Z0T `<9ʺ~ 7-wYV9svf7m;<4E58JyJ5k3oТ8U¿FOMФq#E@^MË U W M(oS.+(woٴEf/>7VA;y$&&xSNNB.WrY"e2YNvď11 l>Z^cNWc:6oua5w \aAZ~`;Ḭk;ѡ-z̻܁]#MaqH8~׮{n%*i2;(n@;'甄n:݈SЪgU4FDyqل>/Ƣ~r7) 0Zu&y# ۾3֦-ål6) &M,O }7.#k>$,tH9rhk^LB53$M8;RDa 1;[F@urG.yiA[Jy~z{E* aӫ(l׵x) ӛ90!o=>k 0)QK{Kȿ/&`TvpSv\p?r\sges:: e6crc:ndjxţBӕvqb@3sL0. zLŕ]c6R [$,o)>ߣg}| Ǚ sQ 3 lO脾W9Ԑe [t-ym3:\m#º՜Vog-fS]t:Y5Ԏ GU|ڌX1}ޞxrGQū$[ $ƄLqY;Lÿ;.gT͛] 0Zc~^3FM'-IP<}gX8VЎ#\1R)Qc>Rƽ [[N|[1@(n1?g9}0 =MjʕV:v։FmѢD"){6ܹ~hmLӣZM|v{.V$rѸ?m*7zxhWm_Tަq'>)vN[;7?+nʇLv{!1/h4.6.\WC^:]^=cyYyiÁ=tymk6ZYI >BYgidu꺚)Om" t`beP1(r*A)O8ELQ9QdX2mq+| K9Pċw?5*gwٴk߾@˗.} ӌޏd6-/}fxWGQ∃ W/RhV[ Q}$r®xC;/Frr;{F`ъ|캟W._> /WbٶJ_o_o-'"oo #+;8"!G!DEBT*Jkľ$Qwpsuﵓ/)37y72:NǷz"Em8/T5 #D;KI>=}MD}5Q܋Xs~'s΁'co0|E =ߑ4NL;>p^DYF8|@ a $CV%|jڼ^0wN89jL΅a(/Ş6G HmmJ|=O=!߇Jp _ȿgtjmҖ$F.3իyWpv$IIJ,W EHS8-=J|=\U Yjai/w3&;N8V?;z+o,2sZmr]>iQ@w[׊ {q"AXNۼhd_8θ}ƫt1xB3v@qڊ'^ek(yrԍqB E|m%Qd@ ( ;moV1%+hgkMP+:y XV[0&lگ?$cA+rn8/+#{܄{@bo,h4zх3y_k,˿ڴQӊ̋:G2SVOCT,LD9É=z64M$@ *6w(E NZF{?}})ZMMzig2 RaYݺ/ Ȟ#̬ϣ)=}O33[]5Jvpp ?\GNzԩx???Q4Ncإz3p#y>;;;"2ֶ+KDY}$%Ijd2)333ӗtݻFFfI$tK0|}]v|:71vv.˳y<^Lll=?#;8:F.Pij\^ӗo:t^Lb qo:)%]îBˇ=6X 6A^;H _f=}X mYVIkս_ȆH½okkg )J$بU*iTETx?}}EZI˥$}v?]Idt׳ rX4v=gZ8q|ՖC]hcV7jG<:;*|@!6u32+ Zۄ>tzHؗ^64e C=r8(@p9>_&/vN* ǯ=;J]:Oz&;NSBTMh4 R G @P۠I7rSΌB^,˳gj(J. Kl1cOfnm[35%oQ y=N vk<(KxjR &_ʲ^Lʓe٫vk޴˂g:g.S#*x"-}{nW%E'9z3EEŷG+A)_eS|cSsbDG6]Wfυ.P ;)o}^$55zS“jttԆ4#zщ+IX[nWe϶%M\rJze歛-mk3Q1rkR[hbv+ UuLY@NܞݒFj#zMcz߳`jmVI: (I+KJU}> 1J|P*k1LVKs{=Z/ralNTP~~+ۢ@,b2WSlxUkj{ 2xP.kٲ~>pan^;4 vgHXMƮ4AYղfhv߉zܦ> FWdDddDddD V>85Ε 42uϲt5(}B/F;nGFDF>:;}޻w6HKP"n|ugn-%;nkO.3W\]CyNr*Nc\#Α H2=no)]aȈћ6d%,Ƨş+fN#o*H7~zǯ1< XE 60eK%rN#5Aܟ;v-"7ѧ]P`n#7r j3RǴuGoˬߦ%0ߡN@sֳi0c#엷0j ;:G<ہ cG_A kYqpɷaQ^@jB<-fW#ҹUQI sKzO\w Tq[xR͚-AkF4 40Z _gUH DW*?9^}AW;gjbB}GSn MQ{v޿CS"{{ً;iPf}@6ӍM6q(ٽů8 rfR&b 7|BJTc4 y)NRх"՜=?)M+h ӏ1 0h HyN7j ua/7Vy{R{[灂۞f[Gfx<ذz(36saKC3gn:wak/h컋w_}sfn7yy4rq~QwbL:gg&Hjp$\q7uL{Ww BY"K ,ۖ Gޞȼ/9c=~uN@hj5]߼0|;2i;ncf([n]=4ڕ];=nh7 IDAT,@ʸc<_}+&ߣUsK`.~*'|_ȉ y\u\fS[ֶ0n89/?wc;T#%)`Ǚt@.]Q۬tz<ڜrI˽{mAY\9uF5_Etm٪]5. ܑl&d{k˄\i$~P-k~g6/d38luRC st 4hؠAf}v+l>G5M СUjC[[c/\ȑ#`h̙k׬cy|>+p9hۀͩ~/i~ߓ}g&4o)>??~d TYq싋Og3Z픱b\ZR&Iy4& #Z.YR/f|wYkS {?}U񞖉(I'MF\;r7um-j734Vhf2V,p&X0s3(%E)[ݿZ+VeHP[6`]q^LjkuU#ʴ˛khpJ-&q>}/Klڎ18J~xĻHU9> ` MѠA c\|M3?[+_pzfy ЙjR(ŅՅcUz++<5}[-ORlB;ft?;ZqV=פշiܱCw]GI7 0ԟK00C=W&hc~pvvիW.[)9i]m۵7oB(o*e\M"8mىV7&>Ӝz>{p]{+hf]ՠw݌K)x1#j]`IIr}dA#NZ:ԙ]8EDF;gw)cG&l/'5f'6i"qcKmj`CŬk\Yy.fZlkV?Pin:rhJҼu5}K} nVWZudҔo&b(˴(u3kɂP'M=9Z0^OJyڌ U|oC_ z}0l[O~1dT}^mz7g'Jlbڜеs{/OQֳq>ߦ$O|r$yQ6,O.ڧ0D'͍;|߷e$:x6nV0˟˴<[ QsoZ$c3m%aiiQ8r[3 }3v N9[ _3jBp2[=)ڲmmIrViYfZ7y|uMi{#}ơǺ^z-)Myf``MQS1R)Qc>R}kÓ'_8qeժl6RD$$]43n]n Ν?`J){)2;E3Y .tY7OĶh<''GTVb{+7h48OOpcbbrFo[Zfs yL&ܾuãX"#ܹKT"5kcT&Cմ4rG7X+{`22))  9 "4Vh$B~9g2;_oז >Sooo6U_R}o#/m?~\]r5 +E]fU]j(d<0̘Ukm6>⛂L, )cx<.5b 6rb8*L(\akcTQx/[YYx|M~JK$ϟ?wuuž:\f#yp҂TU{7(a1LR)U?腃b8.HPp_Qzf}'B(k"i>NMzhbGrQlYNųgo`,;z w? X'On̾ͼ<>/**n:Np>T/i3j|~߷V^䖇G 1*aE+E1Q+ 05V 4?x}oG~Ovn{W+BdΕ AcrDs2BZŒ"קtqXI2-{s3P}ջcMyijƶz茹Co`0q ðRRT?ub2Y?e*㵩-ݩZ[[X[/YFS[_ w*Bw/N]_ͧ/kHme7.֙RQ^\{4fnG8pNAOYڜ;Cwuu}"W2lbVtfv@5 q3 s33B*\X\.b}1G#2kjغ[uV'zt2{7K@ o;{Oi^6#=IߝGCx9cO1kBBβt4pBA.t]E52P_np%0 c, nȯ2ov+v£ .+AM1 _xf--j0VF8^i9N76Bj{r2c3=m8!JZ۱' VG81&E)o/\Zb"M~p cg_ /~II!^lN=y[;qlk5uu%.ή.ή%|L[ @kCSǑ*c ӔQIpuғ3-Mw3D}C_?BQ7FG !);:q/^3 VX4f3C馝]]gH.*s4)X:ݢQK_ݩ)=hy˳]FgBKZԭUvkrOS^6u1aH~yE`d\zK.} §G]Sp +>L?Ӥo;<۔(s.P)#r"no{K\^'؎rnF9e˧z 6]Nv8L_wϭ55~f'2*5fղ:#- 2?wRIDnD=6\osu` n}yq;OljUMǦn׉M[6X|%HnOrzYq1BtaGƭ~7i0cx9ܶONl"rb{qqGVY(rp|WV _eZRY"y\ &ՑɤJ*00'zެwFz7>en|uAsʋkώ9=DD໡(JժJ>.:NP;J. h4ڱ9]ǏaX~޽E9rEd~,V+ׯje2BC &G<x68ahT)TjmcjNi4uz;PXTVky|~e@I$4:^|8EoSك֓D"^???~A[Xx  `ԬUKTU %ٳQ ݗ $#_MȫV8Ts=o~$Uޱ^R|&K "so1Ts_{u|=ޖUvp9kxuҭ䣗+Qa|fuEn?,E:CN"''!Ӣ35D{V$ J Iԃ")RP(),ϓ!9_>#??Z*1}J|VXmQC~mW^@N4a`+wF콘ީK'ǥ$7s).{{[CjOKBk8mIUȞHRoR^ʗH*ɵwЍR y_7q}g_1~н,*W5嬘Y]u zMD^ASgW4S}S:Bkߨnem`~ QgOQYrl_mpΉ\{Fj+5V->JaRPF87>B0]{7\(/TϾnLnqP> G2ơ(-̏gp^Ld_~jr:'6:TզN6nܤIӀ<%+CO?^Z-ICz]⤆˿/\PZH @uzzrm" pi֓ rblҕagNٟxVw|W"UyߜlieEמEaF nزf['[47z8þz8#L X& #7rbKCv-c=g94ZD#&7.;bѰ߆m1 '"z,ھD@›= ۾D/EB%I~r_BRؿyoW9jSz{y[cZ'Pz 0ިY!aT6PNJUNH|_߯;NS[%K/SYX,uyS(B_.nlӮgu )Dm+[?'6ri|>}Ug{6qOr>L!/-nbLf=[s_MU6m-:<{ju-CդVPt#(Q7O"s_~g] uFM,9{KLQz q^V:3#%M>Rexoͤԙg'M:أ3.Bi+^-؜̌28=Wn9)%e/*Ֆg_WEIꌘ}Sd?һcnmKRhά0G]qU"IUޡƞܿhT=_H{whq[8W'|,ђ$E*S{]]VizL94 8vۇ6J_}tc ) x}voܪ7 +r ~`d_N׼z>V#D濎̛N}X2o-hdGHJY@Rm4p~ OFoخ&M'ȴi/c۴,7 #ERF}Kn˻Ei7j Ȼ) [{ 佽0@wIIϾN> /[4=?._rӋ6"6E7G6Nh2pb#Yd%Bl޶t`ґG;0y_'4^%؃(d Oxo}6ǂ> =vh@;٭+fE:sv`y;_֖xϴ5`*J~νKZ>MՒZ*`=.e(侨OoIks)=//\:_:9|`èړ(U8`5xe$9n:/OWfuه~kVɣ_/VX]r[Nn~o{2Iً/wekogkogk/j7[xrSCk]wX3*]%㶍kWճwocO׻%hVcwԈn/Yu˧w醽<0 a,=X31B:٢fM9 êIon+7BۂE`)^, գ{..x*~JT G60>^~wj ƴ>MM=VO~UW9n*~gOXu'{+}BkՔV~D?7u +B!l2laz+b]}Qy-|F6]\t܆۞{ydDgE0Ui.]wɒÛ[/Wt= ! !(uÓ\,l6}g-lxҍO#J˱3/%&<BH g8t]ham 8&E1R$JwOCX<lZXmw4]joy6cu6Wa"HF*e" <[6 +Z9cJ'00*Daxq푛I9*R+ V|Q}1-Y"[Ia&8bלqXz`YW<.K(`ӕ#Jk0^o*2E*J*QBT$a7WKW#TٷcnRgq9L!dpA? 8ւ[e pAÞnwz%תٽ>'=t0g/;7$+VkK7荆J<*]!Rh}km C 6aG>zǎ;`m#0Do=5f= E1O% 0Dp9,)O+T&+]4$Ya,V IDAT3Z =߼,vp98 HV-1QjoyuTW7ޢO9}wa(Dn܃Ǭʆp~r¡[euWݢ \3YhZ!{C??A[mٕy{e ,%4nꛮ# lb-F0-ZIT!{+޵k)!JNxm[=j*04w]TcP3= %tNlXv;a"#!%,~9]JJ+~|lco-B7Ħ*)m'Pψ!}hɏ?|пC?_n[x0BB&fG+B !Ī5홺2D.=ZEۀ!x.az*u }0o+kkf w=z) d39vdM+ݾiеiܰͨڍuyNX lBC|712M+nS K-;/XNmGVPNQsS2lʹfyB&n! ^"ω)woSuEnq ǥJxK5GU5>QQ<.d8axE#*Z&*U5MbbwnnR_EUd**R&p]˗/4M:Z)xS!-X,Wكٗ===/}A%[! 4W}'wwKTܥJ4,(XPYLt}b_~ z|E}'$o ڑ=n|@d`*aC5AXë售ܽM k@~MyEҦ8 TȾ8aKf>ΞR8%n˂7 F"$$$8C~q#y&If|8EWO>{]zFB8#O_ #0Mγ ub 5]?GׯTQjp͡ k?ZOmϯӦeD װ)))S^ylI76+| n;M֞-pޞ3PZ-oCW.X蛴mz9yMpwvoe/: D矽1|v߳mgiעMqRR4|̶Wn۪%)y]Z8dD9U6GvЮeZ}k'G{aS*"ԡ_vv$ub2qmW17BK\Disڿ_PQ+ߪiw6 Ǻ9c}G4&i?v{ i>eK޸"{%Ԅl<Ȳ4z uhllmwZvS+;do1^^381М&[y?]n)K4-y W.GZ>Gz q^-^ztirob*8 i3cfL?YwS_-AqP3uٷJ|/ة%&4W1AiK/@g=0.c;!X hl'?oG3*qڸzS B,m862(dhռӭi{w5M0@Wər-k_͛4&%\RCzBYjB8s#[; y=e1(K7|aDH@Cﭻgԁq`_;c\+S3ψxuM8BqRIʕX+`EVk╯ |{ Qc 2KIQjDE3lϩ5!D={Tڳ\dݷ'=Fa׬ݛϧ(IMk~. jgK7^چ]u9:54uE6Vլt{^Og_!2CNej)ul5DNNn CEgro\ɌЉ9"YΎErgt[BAC}/hޡ[3k?S߆p^ saZ] ,tUuV=ExyBیV4ʾint׾Q[{B~sMqr=cw>9~2!TtW5s)F",; Zq-8/xvt8-¬OC] `0RT_|~D"a2p(qEgOpl9,5_5i'&.~0ܿ{/!zcʈ;MƩ7:ls jaj=t]Zw*ZZ >i48w e ]x5B}ؐ>nmfOZ.%`t]:t2Jy~ͦRdZҗ1OmZZPeww“:do]CR?ZO͊>+Y>8Bn2ȸՏ4.m\W|k{c]8hƧ[\3ROy_,t B6gh5ik:{"{"{@dP9#{U j"S ~ ?DFX(r92qs9BҫV[{! ^TWn`ʐ:լj.5#pGRD_B&zʮ񞉋w_آ)_.mzko[_%9%tuNm7_$JxprƂi ͅμӔ˪N΁u7?`3l@-W^tM@du_Mrv̻]2Vtom{/KU9 %'vkjV0a޸۞Kү ~j 9BHqqCbߛA3d{=t*-A8kTEPb2ơ(w[!S>K-Z(g'59g7tF-kXBFsH$ r9Q?$I6_*Y*JKPE!$@*?O#s- !nG7lYsS-y=Ym;Nn6HJӀeضluc\{X&3Lkn#t'&ɒ^wpp4Jnn.N\.0ȾmZt)NxׁקWyHѳMk44]RD϶GLۢӘ-qڻ_3J>S! OB̏?8kP~~- ۑ_Hf9$Bĵ]S)/sm!{ZH#y\H_`?|@>jrcW:+_!I{wހ>kSF+FK7OÐV+~|1Z13;{/ ۖPp,&d㩨-GEf߽cEgcccc/Xt'Gm 4'%Tu]:rc}'?KeQ{zn!j?sW tf,-Ҽ?p.\uh-yy)rɉrby@n~62XQ3uٷn 2;v/%.(M%oLPRCdʩh# ƱaqڙM)'Er]@c;y se1!i o:N0=M\Zz"F t͙(;ˠٷjˣUBNn֧4p&)^%gʵ4}_H7oҀb\pIQ@ ieU=~$~xyA"N3kw\#NJ|oݥL=CT$ZAu"k͔ ^5/٣z֞&8?8P|IMuU!=;!GMaap:ܤgt(b2g+bMY,tUuV=lsPgB^& 7&y5]kn|{JXiyP6mmۥͦɾfU0KeSR?7LT{,zt &UŠV]/vċOsk7}.Z0'ʮOu;3̂WѱWsTA*GEE<AcxTjLTHJ$&&x~rN UFH*˫Yfɯo(ye8\pun#S+ \Z5ϟsM`êbxk׮8hV5wu& IDATͻ:h_T{W!.m]e,5ڔҪiaO 8}a)h4nh\K֌siUh0P9ƧqXtEWqlk5u>a0RT_|~tLO`¡|E <ߧ%bJb$ZT*Q* |x:ը9p(CF.K4,`߾f8R;T~g/ROTۻһ9V&Jd|L|H9T?! D3/U{8sSBcBdΕ=ʔ\ժDB:CN"''!Ӣ3U9W7?dn 9"YN UΠ';\zӗ cr϶ảjcISܜZ6vcM\m Z4~jt,ӵcǞ9pfFj;{Ù"OvkuUN;7#DpԌpS9K}f8|& pd ~<4S4 EQpE{5 VOb%czlՒoAa _?:șe24J:~ >w 2@ű888ZTaDt=ߙF6ZptC_Ýs0pBf-7|M^DGj2Y^5M&yyryg.ĭFM,O¡y>^ƌrf肽 ?b@G!z}Qw'=>5܌aS /nMy^VחQRF<_NT*C?>|4&ϋ^lڙcߑ#<{ju-Cu+o֓D"PTP)DK_=7;t(jmurDy@UVyfFNU^umÖDͩ 2v H2f)HkkTE RVS$ JV(I"/ՙ)cbkn-{wTu#xN>Nڳ 0ξ(:WB9~&r.n`V\|Lq.deVw?KxKƭvkgU|k{TߵG}MZmjA`婪:;a?UUӏ9o6"og~D?B?Nl pr\/+ݗ7u͡ѿ\uxM6̤[kqz?vʫ|NFܟzhm~]طVomkzyrҝei[ 1 @OJjz O<;}[I9[vc 2?v&JH:ڣED =kcKSu޿_vdM3~38Kvvejs^Ѝ2z5vç e urfJDYr^:lС#L!@s}93kⷧ}4g'GIxt/^){~0#pQ1a坖p[&mڤV51B~KrkKYZyngÏ]r9aM8[jңSHwWxVoilH3cϺZҰm ʏ2ϜHD̥ȭ8ϾU‰t=C^G@om:e=iu;n YF;qY=ΟJ) rv BGq5!Nv#|ɫR2(dhռӭi{w5M0@Wər-k_͛4&%\RCzBYjB8s#[; y=e1x0?"Hifk$#;{*ꏿYxCjn? G"7o)yr%/ XQ+,s<؂ERRZh!aj722j||,'{o[>˰hW[˙Vn<iSp_~iV=/hfÊ! x'Cd~hd5{=tꑺa͵fsBir_H4 4J$gsJ|J8pgh^2m q[ȂL\g+Btk9~:i Yz 9WC-lx"閛=YrlMHKR$/l;Jn`.":{dտG!R|{M͛㥋.g:<}%+HU٭:&.h8#{-B"3ֵ7eOHiU$a7!ԩW_LW!F|5,. "Drv{x9`ZY3BгG=%+HM}+p6qڽ|?:{ k܍/3o-m%foOoN'L4ka:qk p>W&nc ue!6Zg֊ܵ+v_Dlt޼̿7Vt;4hV@fV4Re^{ =ԙ(Bds x ss"= Z[|Ea+ zAX5|UT*߽Mg=ycp^XABV g#٧hyo5׷]#[M,d̜\XR% 9N8B~-Wx--=d*1s3iԠʹ-ilRm+UaJʷo$ut,UPAQQ<.d8ax4V0Re2R " h4I>>޹J'nP~~r\Vgt:źp~bu_bxk׮#6&kܛ baۧ*?ʿ){˱DY'K>dݾmv迗$V#}i↓Ieէ$+A "F]tZbK@*yc);fucJpu- '۾S 3 (i)a {2ߢ;gΛMpA|` ]4TAF;7~lBk͎:>AOg/OC\@:U4 3y*S#f166ҥO}_Mq1)deΝӷNLɷhopfa$bV;szsE6scٶ?vݲ+x\kkkkk6 BgxPU{S_l[JA{3Lh!M'}A[3Lx-Oxm]#TɾD2 1̭a"֗IeGU`s?7|>073+2`\.ł1|go ٗM=;Zu.ڔ۔g;&Bq8z(ˮpA'LxU+~Lysal6ή쇅͆Zg#HJY@Rw,P83@d_e#{g;{"{ˤJX㦤DGRJXPA$r9o5t} \d/;o򫤇;:' *]d_.n3,hr:'>{B2a3Rʔe`nʀ /^89:tPQL; ?{ #*aE@B<3]Ϻάρap>355  Ŗ=urr$?&|I;ώH7+ >/\PF  ӳ<ʊgw;p1RaվWƻ2t0nl6񄄄p@x<5TiVcΟCW6apB3|>073+p@rY,gidp 8TI._ygBa+Sq}FtJD"{@d'Wlt B!2CNej}Fd O_ɑZDXg_m,av\rGśg;{Ù"Ov 5~n|ܬżEMFt~5t@BaD֐/?~Gvbw#u]L[wd_|S^6u1aH(x0쵙Sf?ifw]:`۰!Qsr!-e(Jժmt:A_ )]%Oicg͊>+s>8Bn2pqGNρe h4*Zhj0'yi 7) qGٷ|MAǟ 2Z,Vvk|< `J8ᔮ=¤RVXY[ p>) ̍@HR"XZXUJDQ?CTZZXH$- ށSN!ȼ'u mrRѳ/ڲ|kI*JZMR R Ni8  zJ|)cNZxw4+MR|kՑ92>s#O=֓[T`L?Q"RD@Al((hh Qc#%jlbAb% ipPQ{w\Νyo.#8[TkBZU/?W !ߵuݓ_2}M!BtS<.q~u,ߒ].ld!;zLecznw[?ˆ}=Ķd-1&}/_y75hj*-|WQ(ߗnN_Gn¨C mC6erx>!;.V{nׂlh$u>!twx nmل$3]Msgps޵;i3jiL:ݷ/ xa6F>8aIbҜ'qa.CƵgL'[p`@+Eo؈,6w3\'*CW0vWxe厛{Jl\x ZMCPBA$2MM9xT62aY&2tҼ!LGnT׉gS%=b8o, CxةDA@Eس>'@qtȚ%Ƿ+[ʒO4קǀJߍݝV0oye֟-`3JTuR6+-}r{|-E>:rF!Bv|w{w ^}6SQB[gҖ& >o~#g*|ws]V8jݽ}4Zq*zLDžG&δj#G&0^y;2_w ̹Q%ooV?)Fh~U$Db"S77ސT5 ߗ'zX2Hx&n;2*Ux}|K3swH+ߌocckk­V{*V$suvd_[˖o_`-6| _6P0lzP3) o9 dܕ3+Qc;)"|Im/`N¨p5.j?[Bjj̞hkpYi&s?Oz:<&Os5/:m?r3$ykͩ1zS2}[ 3M=|XB|5ΧJ4]"aϤH{)uqm jIŏ_-zQfRɳ,(SHmapx>Gd=~p{ꚡCOV-g<wNGgedf:eO222GwV 3iiK|h<Db6ƙly5qo<2NԃF*'g`ԏm8klw3YF}ups3e2Š|Lwn: ~nz# Y:6ѻ"c^x`Put D$^ [']ю\9ҖRp?/- 0J"7ݔ*WHͰSJ}@\'88!v͚g!8} BdVFm} -L3ȲQG m[;WP_U‡IFc(ƞgK.]Bt1w$׫~oe(&]^F) B<`ZSViJnOi E żH{DK:mYvj$:Ͽr|p?Ju?;{ QŻ_Xм3irשּׂ'o 6jō#o!eֱ.v}=I pԲ<ل#4Db+v)YKͰY E\O.TJN)o5=ST6:Lz.y+ju|w#rFQ:rW֩@aT~ +O@ɩVͶw?<ښ"[ROS*Q "u\ae&aQg`aVr;@؛{ ˷yuUx]$dP([zUNaa-Z$+?:Pwjja ˈ#p B(忓 -WU4R1CTBT5TU!m͂^|?.&* :=߳Ҟ*싛zڵuM͙(mw|Oc?מ=&p s➧-m\iXϢδ r?'SE9.m%oθZu>YV}`9 |6%$b/*ךk+w>\D9hz:BTP)4!˫u:HZw!u ڃMF)i25 3B e>鉅sm'tMbZ QH!ס:AU;BIDAT+g:0_ؤ )odnp3Ґ]!XTzDBe;v &` D uAis5yDGyp>kt.HJJt"wvvu*L>tЮꟷ\iҊ,NQoT]Pv ڌr.v%s#Z|7~I_/_6*ʩinh*ٗO3gי'"?(ftU\S-i"=󟹎b;W?2͋#clݻbEnWUlB]ԒX\I}'~ftRѓ]1Rq[4~"k,jkbui$ 'LܻMؾߑB$î!Km\0<b6o?h[gT3ɦ=f Y>sϡi!zDV cc w qbȞ[ց{¦ԙ3BZ4Rc'8+yzꌔ-@(/`GGZ=!Ev̀bc;k"{YOqNb.Uiڻ'f^~Ǘj4.A sIWz}VRL\lB5_ukn1>>N&թѫt%[]y>oWa^@1ukg"mDCxUZ)W9e%Wm7^лfS+S6|kc՗vud=Ip#eOu׫izo\yD#zF\"'2<Dk7,#6LW> 6Jpcs),+*DP*{ӾQAZֵkB}>-թi>>rLnkR$F2;gQ(*~#>ƾl9&Fl5AAk͊Ns87oU[ZY5pCYmlHV[QkF9m#[ڂ{ﻲ]پ&ov'^ݺRh 1p_"18Vj>?qei≣"y<TTi'aTs.!T ڐp¶pZ1jɻ{olɐy6ߢ+ FVBBO}xjj FjOPȔԔd B6d% g\wΖ\ TTye|=YY޾>,&KR6PR鵫Wn*]?p6>4`r9\NLLL+;ۦ,񹹙K* *]DFpyMoa[XXXZX0 PPiP7@Cq.KRdryS :ft @@AF a N7}w0Ҡ*x Ҋdkck-pallN.?'(}mPXR4cߐۿo.72 ]Cw{tAl!${mfo|aPzǰ5?B*gٸ-~~DqEZ*Di;n`kC B$77Yŋ/J̌`M2F@# xq{J*ܾ<ɞB@0v\Ȗ#I 篍"_6n|M&͞F{;*/ cl_OEڻ|4}IݳGYm#u-O˒h҈/8#nAӓ}Qų)lͳpQ.7 I0|@<&ijhgp^=x@AZՆZn,>|jReaa34,3) r_QԲ '<{+@H$NN,6TZZ*JdY-$F:VZV*} @f0yx<@ckgB"ډ}[n6)S6v囕`\nmnp:4y*١尋 m B~R*ՊD"SRI .Bajb"4&H6ߴL;0ƾij<ܣ YIk/oƄNGgedf:eO222GwV-d;Mt`J-#g 蓬̬̬';w+UB;T.'+*2?D"Z?,BJ@u)U*\A3|;WQXk&#Tc<{EjXhê]$B זn bqܾ߷`\_-Oe"ĉgDnS&t׷I;L"fRՒ?ؿѳGMw%{|Q D( ={5E/ ςMXG0.+uD ;z-8,%UHwP/?I 4:]Ep !DRizu;ի 5:5t(c|Z㨥toҘj5%oM9~yŪ*3lX+{r{|-3ub_0!O 䓫' 1`Re卣3+Oofl]! ɳ^#{%X BILiƦZs]E@W1{,~ï[-4%"yL,ύ{DfiA|XwWn3ĞB&mji ôe+W2~ނ# Eɳ%ڻFPS2?B1p.]̿x1b!|~j.=9 #Oh(iTp]I4 !˿Vkf~A-neaب/F̰ѓ/Ԇ^t}OkΧJց{¦ڗ? #If/|,T}ȈdUzX"y@ yKgDz0"CBrCCCPҥ׭ϩyD"q\ʥζf{̌{&?uF۳Wִhb̘T(7ytaeewk‚`@g1"Im#\ۧOz)q.KRdry-3:ft àw>v1β[fbgcغטSwuAG~ 2|>_$*:lB(!R0 c0&&&͚111a0`g-t|W p1Pg郃eÿmFA!ћǪ>&9j(cnnb!$JڷkOphQ1 +={ef䂿ؿ niHpu|{"!kV,}"QIk7-]_ |1,ƚønccdCOT*J$.J$RxphF.I*rq' Ոg5}%9<74pϾu ={0llGGV}rXׁQ7:#G9R{ GFi'QLnws#k\="H֭[Rߍbx۷oC `2J#6ŋϗY?biOA@(mڴ)uޟ444KJDكgSR"\>}X[[_vZ ,=@S47Vbe=<<We"Q 4 x7Jg̜oRiͧHxҋoAA3^HU{={k+Z}c%+lVʪ9 FaXoDԐaL&3sCCC@.A|qtDmBx]G0uߊ6G&ddT&H=Q%CTԢZlannccS.&s_Te/R_S`aQ9ZyVůrs_%_mjffiapp|%KOK> rD"_ftz5|-A'&9;>  <АILLI8m/)*Y.! {hand 4 |(U*T*BJɣ*IENDB`tora-2.1.3/src/help/images/editor_syntax.png0000644000175000017500000025140411351715110020637 0ustar michaelmichaelPNG  IHDR9S pHYs+tEXtAntra?t?PreferencesMtEXtDescriptionLango klas?: tora"0 IDATxw|ǿsw,p` f B3=I^'&:!B -PB% աƽk;SvN:IbG<3s#-K,_!Ӿ_(.b ^d23o7N啥 ASb-Q)RIJ q̶"F{]Tj9.9 VXXH>dE>!C %=Y^tWi@ He|:mqx´o²)nV{Cc e ~=}ƴ4F DH%bCf>…!j{a>pLO?kH)]!]Sf eO|BZm)S-L،7_IdzBuT|^]U&%^[HeVBCtG.&( |$]XhColJ<>`qzWNxBJ?)g=7ju%0?[|xhtupSi'v5Ez)o~l(~W+aUpx"uoXi[w7m1"Fu3abo=1}j~54,^9`E/i}2Ws2\Z|#H 8TAydjV3op8DBG!qL-'9%=pޔdM!g: Hd~\]8{gmV/PJs3A3ہjs<"|Ǎ#nVJ|KC%)򌓳 Q@T(BzϪ<|CP^g*tuQQ@9ŏm<;@dAQE=45o׺], RCXTo[Lh{j`nk@K +S# KܽVp_0=&*٩qX*[UM/NЅ NS@S 758-Oo][#LiE)n"yոW}e^Ȗ"޼v]߂jL]8I5V33ux חڨ[,eL]ӧI_m)Axe{iZ]b6 ,` c(?)oqgk\m#O:8Ϗ"xc\kotW[<]Ֆ=@ࡴ68(r˿OZ:-$pVB ޽SښTl^=AEU4-J#6t$ 6O[Sg\i__Siاx$(  S~J/YFq^K2Z ^geA/r㺆A`pjCx5s 4xX B^]lp(ێ.kg썽M1m30MdÑ~2syz.$;N[6UL؛<%d # ߧH2&H䧉' D6`[M$WTUC8%œ BR eԍi%C<뒬wyWu:++J} ȴ$@,N=6|_7`q#SYrH8>uMe5渝Yp | V @LXAiGBH9ae;.({m7)Y@ _PV?xv3$u\j/a2 :.pjyLO - uFT3^[w=.f1YЅ`GiyH!<%_ H^NeZQUfp*JZL`q>9UCUein Tߊ3'?SHml9n7/aqmC@yJGGu[9EK u΂84Zv8VSJ!uFxH6 uTckT3o %< a.t) Llۿ,rҲ'QCz+]_*KK8.OOߔs7/ /%C[tUҔq`쳅۝bO=Po*JzC%o]^gj^}Z.8VmRW59Gy3=Q`+~tL<-ǾVtˬ up/׾(fL%*c?YMiw Y_v6*}u܊Ei}l[HuJOwmgu [ `ݓL$i^%8f{X}kuhZL: g"^o sͳCTNQl&N%NqAHXPZfI~䮬\Sթvf6sNRF4M@wǜF  ڝ>]ʒEsmeO/ak`ti3P?< <Ч+ >n(cjmJԠ!dKKG / @cqav5tR@q+ jZc@3tm1|=V_kHwzYɌVaꁹ##puմ9h/ f^ f멫wz WM-w @߅E+MM>ay6@#YZzJ?,u<@ k>))Oh2Yl[ZKTqgD2 o@6sZm~<x|'֒|w4*8pq8o ~yv+bD*f&) b?FfXdc+FF,˸1jqV'$NFr)ilLʘFߠseI-)@>#qF"}\% bRZ qVGXYJ됥nk:鍙4,fLILbI`dar=g??}Lc & Y=Y}ޛ}cEvms=Ģ1K ]yO0xS#~>ȱg7Nr x|<2={,D^t wNL3nV _@amsxy oPwG |Srm#-[jug6Zg/Ƽ ez`Vj\YSO]iw}aڨr G5vG>_RDwBmnBI/FP.泱Z&rDZkd|e_1c.3r+c,5t* {N%K1SɑۓlZv֯_7_/ȤIVd<5q ~{r)'@,.Gy83~ l053vm9;Ƅ:tO=4<0W\q9W\q>'N윧GfGOg]TWմDi7uBS<$LjW_MkkkxdX2+)T?S8]Nwepk Qp?rQ&>o_x)$u5շƉ2f҉~nT': #Cc} z!44.?{|7I6ҔA >ɲvev}!WYa*+I3Y`lԬ?dyNCuo] ,uP+p+}0Xdz8[e9ל$^t1IX&1Hq/uvq[J6)CGH]GzWҞv-&x>PFsTp󢗴}V,*[@IJa=O3wm@vp O:B:J-pi6j6w<8]L[J=' yKRYWUǥf=9*;h6([ =֬yHak5Ԙ|=HVcW?b7\9;'D5uGM^/G\k,7 zl[L3mg| gLP״yZeKrZa910|!jX&@R>EEW>%uAV8ԛM  ~o cNyPO/KRk47s]w1y>I%(O۴dќqq嗳vZ=[u8S8ӟ/Nc…ǹO?Gè#iϚg$/`;'uli5"*WvBƕ$ b;XH8̺D r&;UHDrmd?Yq+Ӟ&hQ姦oS QؒMrSHȉ"Dr`6+tH*~E޸koZCḳ/SrƷ\ƛ:޻W+TS:nOjr.>vP a嘵V:9)iMwE ֊>[yYyŔ/ j[ nA>a2^cRj8d)O2ZuYz 71|`]5A x^6=SA{Uim\Ra-RiMŋv){1,=C6ii2e0ِH-mWXAwfyra6 ;iςtq5JWZ74/\}5,.5H﷝~e4A4AcB Ԡƌ1!/L`Ww=_M;T}|uhƍsmO][+u7h^ʁ+fj+,-i Rz.7251ΞOOEsfb5p%~Sc1 uL]lĚb,3ds3a &0g֯[K"S0LhAoxks=:7ߜAVZI< y^O<N8/YfQ\\̊9bDx\w =P$&ys87s{Zeay}2|XMG,4YGq^`)WyŬMyC5)Hx*rKqp+.45h^Gh[pa㞗DQ!8 j*7LT<>S~y+;"(N(-֪*]dik܎OuQ3xL+'f)`C k@[6EgT㤤)>)㸵R`e0`z~s&GlE/46с vx k< n6pV wZQRWa_~4DnB<^[!}Lx[l>8 nl{ۮi2 ͝jͤO.0jiq3 (@J {KF5uA`ڨGwYz2iTϞk\f I Ͽ9KE]zpl;D 9}A=WWJ3.=)F:Ƥ)=fc| Q#6E;zn]XTpk^_dȦT ¢_c-qXd1?6c--X%]w=\r ^vK~M; ~ :sw,Y;H{{;5wEѨQA'0Gw;0s۞_⫎^_t}T~E$iJ?{ \rRJaꁱxWٯbTv3K, UGUfkmo#ϕFmGkY(5~w%̈́Ek/^++e~hZ\,o B|{)XkƌU\!\bKZ73~}կYxMx0y>Ce*?m+yjQb03˞fdWG׭b-'=1mٜBw[g#M7pgLa]92靈,EIZ@!dRs^ޔQ B*8_xNT(4)~:X F:~YZ?(YկKfxU]MI"({ICLnqGWAkQ~d裀~ :T A>+[@⮗E2}})$Hozl~J k[?:mOi if]ǻgK |uAe=QY1kbjc5ؑ7Xa{cTbK>x>5V2}kiloƫjOq<^e|D(暃Wʂ}Cfhk3/Cq OϧOWim[Bu^h{{ߏ>LoIibn=ZA>0?4b-Q {%+Âew#)Xk„ bq?֪wS&{CcCc[o` Ar b5ֳbr5Oq?O'js'lUm?ûnu ձCf$ C("޺S^LH/no!nDFK<{3G)*-(BHt[hiK@:i'-%!\BEE-$RdQ\$ID**"7Օcќo[KmzɈe;c+OMB{,M{R-on:;U }Z/PH ߅%͸RIXZ7d!ǥ6 E-3L)슿JXkm{eULbkb>C xۀ@3j*3XUc7i[FE}_ʻul`J>X%~Fǜ{Z԰>Ksњͭ'\d*Ov~6 N oio,γH[7,ڑ*kἴe{Qg񰃍5x9ԮnvV`gu%#G:Vo,O _dɿ0e LpH2&9IvjWzA3%#)/9ZGk*FMD2UktUܟzGk" Hi)H7ԠKO[9XV+y |\jhfiiPr@ |NVQBK! u0{z) }Ƈly" ,tQaUYg9;0 -2G?55L U( Vl] 6‚ c{luN4`X$:xeQC%]?HKLE>?n 9Z/,]ZmtL-~4zd `){gcW۸{XNC=/XY>Rj,k?*;IƚvV7KZub GVg.HsJR(bh)eT*''\ME8DQ(*GB]"ԭ^m,`POfYPoo9 TUd*#;ω("G9XO 4cw( GD\l)Bl Ϧҋ>ǯZehe)%xfv"q  s Nc۫AYw$@p̘pu-%Q6H](`{^0LqխYMF?ʞ`n1A v}ΪPKT[.dsY>ӕ>s<7_ (-v;P=3I`=%džSmtqaf;cZ^Î{ć5oXA߯gY;Szv*[}x05W_0+i5TZk#ڦ.vǶCź>MeI565MiQ:;)}G6f\e[L$(};< @(ucEk^ֻ([oZ -@r]6B"3aZqa=fύJo Jۤ7yׯn4LTt-ձq_i1_ h@2Ts]b泰@?clfg0Vǐgk׿NX;cis{<]5U>?olZJ4Qc2cKc Az'l چK+R($+k[oOk8q, [ˀ2[|OIjN(v=|>'|fsd\la*T[;k m*BgP-UQuItge/iF׺:lY=fn˥bJU;Md;l 0^ߑf0SuT:w,~d LViJ"S`5Ӳ 4uutv;e},<K)kqOe/' T_++}"10"Cǰfl€Ou~5\d.3˒BCtJK8g{W ̑^:d |W<>PN`ޯz?"B/v{O+vid kc+( ~ݺ}2|S]'{ʺtvZ2:v_ҧTo&Ayv-=q>] Y#kVNl*w]5ko'PWOZn=\Ճ{y}r9S Xv0tr+[NZ;]_]ݗnq@7ywX#Эׁq/Zv+_n'zHv$ zoYDrz6u:clˉn?]$CngKFgnGඋR- n墝0UY>)zHv Oy:{Ɔ]I9k~ t{mN/WPG2%FFzjwMT/4G92p2媽D`GYIy<b4{w 4g_k YۜhKfWE: ֥5S(%Y#yp<)"ZaɆ^nof8Cܝv*'2;С'aWt)gmG:ta|syA([|Y_ʉQ:g tϼ!:9~iKvdʇޑӹ>}(3O=|&yCXѧv~t=A>L_;&ݡ,ugxw/'RD]]\) uP=6kM]בlXv`<;F=α7<| 9߇YUd ԥ Al; dWkBr"|E5睙}&b0УzTIͫo#VzFox}qZ9} /~X 6g7p'a_>]ggѻ,+գ sɻ)/)fUu{x@yvws0CީIo6(vE~;d(A߀fwge mlIgs iyf_߬ds^Yd?<0RAʖ|YQ^ߌjhF λ>Y<`)$HdzKpE*(( tܿ9--@sEYys[[vzW.d&SjK̕Nym1pm e&Zy#K'  lsAI&TWWS\\!6=@4H$BAAAe8x9d6m-zirOgey[H^Ty@U79FrF2RJXLQ/difXqCCmd_dKD1b_-ZDee%H$w68m~^~Iz Ҩkofe ?-?OO=uTNɕ.yڀiHdVχTWWS6lafQ;۷P_Oqq1MMMTWWL$H$xl^nl$'q‘++ijj*`%#@ܯ̚nP4G Y"(@[;f:|*rW6u{JŷpQ`A}+?0cV8HcEtwf]2 |/,*b,[D"$I;nX,@L"0!d"Aee%˗-p8!o2 6eZlh@E< l_ܓQp3a^bp9OړO%?f,Ko矟%J㦲߅WC/'  ${CMMTBkK K_,~T(**pwyE<urOYgNWmcK@HI2N[{I'I(}Rڟ,zLϩ3Dׂ^tfXRtt3*O+L=w 7̚@l`|DwP{]&4zr Uf:$ SL&ihh`Xry%/;lÝ0bH.[ʠ $VHw8\K)4[nLpVS(cվL+d,oօm'30 @ yPSOO(w_:~s;g30̄?kbdX{|m7-fKdi* [S{t _em?6glBvr,4N3u Mݔqc1qn":oaS_HI{{;X'ږLzSK-$m 'lHq}97'e_f/3o2Iюfܺ?[ZN t^Kg#.]갅Yo(<|TC+"u $k_q!dM機NO3>s=,|etyAѸ_XusMv,`NXZ|j SgMq{X:~x'MGaاzU +޾|_:lY9'?P_~8+x~b>yL*7+<97|^w¯08olۇAlIdNdm_?5$%-F15kt[ߓ铷ai<$xyW'Nc'>Huu nAK[U_uiue=zug?S4WٔLrmmQ%kSw܌ 0fy_ީ}?:S/:a ƩWLX8ؼ4D]9W;l^l]]@pf /{,}qlG{q9iS}>-nGNv5g_t[ .ߚ#/祇X ÔN@UAuo&Gp/fӒCwaΥQO) %IbSTmP?x괣8pY!?Ғ^[9A=4hzj.Kdز։AR6.q;u‹}CWԊp?cWǾMOe;hۀznGRw:fCߺfҭ_uJ׷ySPArd%m^*l;B>י h^BS+[2ö4G غʼEh{e+_w&ؒƏcbIsqNHPAvkШl9k|zƵN6)S7Ѷgn7%']ʜ)u8j&z츘x%rGȾɩ?׭qMXZ?9|_C~ʝx9|ʉ/ٿ9G??}X.ψ5cGȾ#~/_BKYL F/[xh}>_cĂ{x6kqQ*A6[/9. E&$37A2Zpl?W+ [<,=)v6u@14).܅<{1I ²OД5w[叿}Emuor젣Wj[zkres)힗NAľ_wOm?՗&!T2d _z==[ U[?vx[7lyg^1RQ^<#Z7w_F"쀭ژt|XD񌮞Ƶ>˳OŜqEW#t>w[Ҳ&妃ǭ/6ɚW_3ʼn+M&m9SO8hשqe<)%aMrIJOBWb3H fIe[ZiYk&+#Q~sH7-FAhnCny@ r0Շ1=%9W2p"[t*) q>3g-GfvGpӪOǰIwo+=Ĝ6g lr^K4US\7|M{FF2pJFR*9bKh/؄N/ \p]<=\:>t46NLK|qϳ|h\ #veXA: 5#ea ұKa$kYTueZDb__^dU-Koy!7Z~\y;ok[:&2[O:]ᎃJGv mzk+-~C{aEJɺpl>f6|;sd["ub/WpД:>z:~{4'hkʶ/vIccgFPPnLޞP_ˣxuk?>d23y:>-..!\LYI!!:^[¿"eOE)S~};\yl.D9[ LV֦C} !3!ҴQ_}kcfQ@W~%ݎK/ۇtj.}~-E̮]NW ʺJھlݵSGK.l0( X1yӷr!|x_ߴ)<&1aO `Ȏ?C#3Ó "2.7; rSʫjbyqQ 0xv /F[d8<^w??Ćd~`<ɦؓy%Y>¬K-&+Z*߳b.~ᕌ "vS iye bwLy`.wQʨN NRӎӎbr!w|]Z Oi>+tG=~#ޗ}8}2IF0ir1+En_wxxj}y>i 7<Sz| [sMTM&)xE/.gĵs9g2N~(.L]0l\8Ϣ3MHCw{򈖰K*~*U}V{:z/HNa頽өc~{?}<)HF@mlsMd Al!\~Y39\kQJݤt2qBvwϟY6s%yG- 3hHvr6s,^/:'~-IAbqo{Sd^ :Z- ~BD7uG\ :)o:"&em$q88, _""5a9<-?^Pu[dZjt꩎J}+=|?g{(c0m2}m{͡dI$I?K\ʳ4#6wN"!Nw9g.k[,_䲱*W⸑kxy:Z ʙx NDFC|8}0/߶ɍnD U#)-DPv5O19m-rS,N{DHh{|pNP6_.콄O?#}KH[ʣs^W[bU{]x[WwYZ+ VyWRƦINAr"'گnh$B=h4Jkk+mmmD^j|{ h #~y@_c YO?VD3{uD n 2NB:P6Y\4_́+x|m KȒw(^< N /8F&t8_;WNNJ_`tl0EUap_nQy5ǿ ^<:ɠ'r̝;ۄ_oqk5(C\:9+.dT@)UrМj#0bh\NMT.OK}$%UxoJ"$XzMЊlRƻJ5J&1fXXn]h6pHMo mYv-е6 10'i`7i)Oy=*)-eq,K***z5z QkeY9?؇-|k hl<8=aEjL3i U7Zt136UJ(f}qD0IԱ#!?8bP)Ųe j@쭐v\nltFvWz:{p/L#m<8S<RU]ŋ e)gIߚd TWmx%j[.\CSI+K )L.JRƑU̚W,fEKؚ<:!U[|2,o;Ѳp*8SO+1Vis 5m+)$! 5 B. (Ai" "(J&HHB@z/[)$!e 'ٽwΜ;;̹gfЩ:'TΫ욗S1QI=(c"9} LZbU=D"2K0b^ʬL233(lj{O-Hf|˯Iq_5><v;Yl36_` 66Mh7nUp?OތlDB/mq˱dp>Gl\C`UwBB+Hq.f\vr$uGn9ӡ>B1$RmaWsf8a$N&3+ 1nO^8|K= x}}gμ!^(*Mv\0[Q ttMm蓵p4lmC&2RJ6>C \V Ϸ )b a.vB"~V}9Q>f޵ ܻ˾)IxZ { +[9=T$kR[֡UxˤfOT%_uP(W>Ve,L6=*=ʘ[ᅮ14RvscGkWjz#P[ցf\d{th4Je(eq.^/@;)))\xF>>XXXTX>b$/lTyoܭl%^.j5XXX`kgW䑔DbBƥ g]puu%""L*ǎJF*,r' us6Z ;?|?b<lv\?36 ca^,z.K>!sЋl_de>zʧ:>qvr<G]8ę;8?m^WuaDZiw1w  N,\tZ7uZ>FXf|\~$TՍu[7ykshna|W|kـNnVzFU)ҵ2@QGzY}+pX7@L{^gY-;npRaONҫSjTu__f0fp&2 H̨0fHUy=ɺx6MH]ȍz]lxPplO:I0ö\L]f"'Bm}߻gj_N>K24{=rzZY¤ޣ,DY,pR~%/˻f/n,,bʧ g^UTQr)F_!$+MM=Z\,~ay^^?g.=e?I%CNo3enW>uYoF{cL[0@[..'t f.)O,l]F&t r#k [I#])ӎ'Mƒ9=WfH=D2id;-?@hϼ5ZO.⇙HH$Bdt& z7B'Fo $#~ (2dCNzXa$3ҭ1}ݡP-R~_:kw#<,VwQ_^PL1cLnX!GW"ڰ7>-rk}mnLқA8B崼υri#bǐWI/t2^g/ٸ wb $ϤP[ǻ7 ^0s[;АN>qDK33@W|=HfL{$Wn]t2i#R}|uߓ'FseGsE1dSIcۻ[Xէ>^D,xVtJFs?Э+ŎRYy)O}d ws=6$mG0sUn\E*;m"G>mLj- p7r=)E5;Oq@{YvP lC+$0w r/g+\{ ;Fdf~U'rZϬIG4$8MHTaRY݌rFŧI 1 wBJ 5s~}K64ߞbgi*AMW' IDAT+E`s`e~l Ahe"[f+R1G6RfW7J8,ƟbM{>ԕjFbd6yz r, y<ڸfoUƚΌnk-kɤZE:)wvvf`C"UKխ:^|sJQ{jk>]jfy{0rs7 IS`o-C"`iArhcKRݾ G} p/W>הpճz ͲKĄ ITlW3m0.KC()UuDx[03pegiYQgѷq5\tӅ(Vh0{k&oY趵qsC3VВtro7~5@tq4~;b|DR@CZ>{=wpQ%40]\y&.+an^9ĆV98`om#J}g Tsza,_>ݾU{_\\߇WC)åUr< Ъ^.-  +KIdJ1`T&~љtJ PTڵ2Kj!$:*7Y$/V( gsg& טE&: jVi(=ѡĖ0/v 啂[HjXVpRD4W^I%yy!P|Qm,5*-)WsV,JX8סoi]*b5}c_y%&Xӎ/K:<$gE֌ )5Ȝ7k.+II ?jȐ;(t$g3Dҵh5j2}{)._ 24Kn_*ƲIy -"ʧ"oqR3+MeC'ߪ=x= V2ݟg)dԶ_l`\wT}{ ϗ ySbtdE։Kn [w*9h)u1N<ϣL62cpG;\Bgڋ/mfVGqƁQNׯqg2fPLnތH~q3'ߗ{=2~~EKkHo;BF\A'-^b1"z4c;CW|$2-AZ6冇04Y1t ˌ1|q{^J?et[OikcDT)oj3j/GK<*]-i6zﮤ1x cyh%w ɳs dd8/k5cP:؛iCyhI]zJ.lR}1<!6i#_o…K:Q0<-+1TidiZ"UFNۋ0q;1{8SҵdmfhQŝ'07ÒӪ⎱Mb:DRcyTUsFưLTZ2]?dӨct6OEhRBǝ$ViA g}[n|ofjQŝbckJ/uUn\x]-,dĄ*)*C-Sٝ2IzLwk?.MάVq744׿'߄$s Ђh,L*Qm{mp::@otf"IԦ\fgi.s&,k&Ms_vas~|ia+/>lKvRvnY;4÷ |ɫp!6B4oǠ[ 1zO) l ?hӃ?D lbXKh-`XzRulIPdI3wް+M'D_&!~2dh󼂪gzk'],۶/p;J㹨u)v#\ʠȍ~kRݕ!drۦԐGs 45'}G̍@MkdX4yrMր +sji$AF[`#*i 7 jRU9}dԊ:m0f u޿/ue̼ZKz#9}I?sf[['IɌV\MG{rԮ-cYG &Qp ~_ R!+L@VKߵ _:FĆvG~S/]=h}2ӊ4b2K?IzѰKxMW)*sn$Bϕh>ܩ+uH=-V>40ły+%)So.t=rGxRL[~!{c6/#Yf4~=ȉ[yfKd.;ҊJB$;/~|&S>姬,{SG~ճTLf ?p[Q|FŸ>_~1$=m<}Φ;bqOdUCE߼M،Ѭ7s|߷t[?g~h~Yn?}C-ed3W{WТRfFUVYJ^? I[2}vݿ1D܋/Y^lv C܋֓F6t%0nK㌘OF!מ[m&3KVzNeu5<#*G)uF*>k9~3뛝+M+6<ߎ/0n1n݋э|1m;XcMlrv ɭ7nvÐ}>oq~Yࢦփľ+˾$lλ So>dqsz.b8lN<#C5Bzh^0G;.Hm贊 iņ9gؑnٯ81o}eb|elI}Po`!euXc׹|rpc? b?%-\"r2Nt8Pv94 +o3jYS~; r~dĆ.Īi5&JpfF=+"C~v3*>Nc[݉.#<0ıi[h0So]&-QqHk[?{Q1wP;4/Y^1k2~Lv)M\wC/BFcqf4БmeKR ~Mx*gwWyٍFdƢINt-n5ϰekin?p }:ϰ8AW0B&" 뽬69}}8Qmu?hȂ%X5co̧r}bL)=e/vl-#ް?XˆNH!͔7޼v\IkBMۈ4Z/>,cDIzP⓯q #}7l$d8~I܅saݒE|>&nkP '" H,7!~| a.{04B'}2eXfpi\3jQeyq PSa}~iTџߗًܡLsC1X2i~N2kS%kӾ a?_E9ɥ&Xs'M!f=!@A_0w!e)ɐ7G7ԖըO 㢟|-YSzԟ)+YW{L(ڶeE cxX{KK̥K}ɝtw2QfWvM^o)$`&xUu+h"'N57]t2,J1 ߡVf[nz&ˬo/3w8q'D|^ĭWC E J]Pĝ_cQ蒹\V|(rWL2BȐWD|yI]Pa8q28y3РԆYx*A#f+ogA(~|y"#' P2a=p^$C/7CV9u1~ذ+Ӳ'Ys$5.[,2ɬ[;vhmlh6#RN'K+BD?&rj ՜ė0"bĖT;uN:!j@bш}DdjQŝeԖ9αq9fz0͝쉫1BKV^ݼco6͘sFLRCxv+=tfJV1'Ac¹DX |V ϗڧ͢kBWJ؉A+M+im%_M;^2D"2+W.TZTV m7R)'yH0*:Ev.ս:/Q(={b뢨H+xO2+Z8|05pIZ/aLp>A}Z&JtoJ-{գ9l V~Ef .-H-_Y(O@0'=6)=&yZO-碑7z4K>!uNYKq*.:w>S3iZ_ˉ.0WGr)?ELePyA5d+M8nڊ +|0=ѧ^]b]z(XA,P<r/\cXWDoxxxw›Ż[Lv^tGj S@@ E(.-Q5vOaպ;|<#M4WQcd;/ DlOki\ג)ݘյ2΍:+_ySD1yӻ;gD uX~?Oo-NS?2UyU7KB:? l5ʈ[q.D"Qki.>yO>F` `^лd񿫹 X#Y( ͡8Zɉ؜R搄Ck`a_L%NLV ?lඅQw/IdYx㋑nuӊ~lb{ f G=:-0!ytcgXah_OJxC;W]1tcOꕕ0o 1w _?} ӱi2ϗͦ!HPbtq W7ޓ\@@@eCEy}7퐥׬a|8ڒ?vǾ{\NF,]YFNU/W9Ò+tfēAқs8xp. w#KӓdKr=|!.x(N K6 vG+x̵YYE5 np!%pTu"G.[oj е=odܽn|z+Ab䈉.iO[2V} plx3bi$f5ALC򰈷aE%כ\u ^oAh qs:[W6$AI4XDvP3L_%|Du̩b&)\ĢHml8E=>Xp⟩46_wAkQx?E¦bFQ/f_;Ɗk )9"v =qljVIJ!oFGؗL՟O&B@+#Io]Y6)z7G&.ҙ8iHÕQC'K@jsZpyc ˉ@A*yP%ҐkD`@5ʓ% `?7 Gى,|3T.Ss[SԆ. H wXeT 2WaCcy[L=Ό勹:-JeY^LLX%9pjc*)c9օ=ɢ>.:&9E8GRk9wϹ%x@"8B*M5! $(/^\{s>>5Ed $6ywboOHT!6ӿ/Y ًޥ٧IN@gӁٿmd{>tazt|YHXV@@%ў3:mペƔ8'YC4ˈ#[]`r4bcdX][칣 }gUK>%7Xl'+I9ɰ ҀQ+xJN'2y.E@@@@Eyga$ݗ̘&fb >LP$ۗkp).@SHLmd>i׉@r u\L3QMqXĜ~M@@@FQ[E?j &Qk%?L)h ,!œX""ht6$bCA5r!A\2'u9%Qdh3Z@@;[Aød֑95-1k0v7P&O9x^Yk_b+rYarcT{ œ"twydzzщ/t(x@-Br&Q- [EK(͹~]B+pF(AI}s︗sK>غ=[ޫl5*S?6]LIr^kXŔZgyO6PB=ZV9W33$bfɓ/W3k(g5JY IDATNo'"?#̉pB9l)$'ЯhNSF@@@52ǹz|: TaI{BFrYAI&f}})YFϜ@j徴@e+^ dWsUNVA\k 0b/[N{4Iۣt^'YKҩt4-DFS=2vT:Ǔ<,^1*>&YySD1yӻR*Bl߱M0_;O.;DEHިW]Xh{UwvoYyIXa|<Aii70+5pl@O7p+]T'Y@@@dMETap[ EfN"sks!vnX!GW"Zh9]gdܽuAQD8|2%\(!6/ Yp.KJY=: Y;˲R/}))Տ6{͛~T}p MF$i(p1y:+#e0i/o"[I;vlC&δ&o#26i'YuɚQQ\Xc 2_|{ڊ{QTԦ,W§֣Q]ϕ+WHIM[K+ P(_\_ *ۓMG`% Ȭiީ+ZhrDu[^H2/K$5_$En(E)7|x#ٲ!oFG$B՟Ϡk-Ny7PToDbSϠe;ي+1DR;f X7]_Q3+-+[WcGJ#V{ `pW $ruG m\~9U'9Kvdo,=-!{X_w,~v"=̻l6?!,ӊ=z7u)m Gx/ -CٗvIcġ?T>B`?04 ;9;] fP:$_eߡXbcV$^<= -D]BCR2P paMU&{'PיGWLV#5w#%-]NCJ9'Qm7M껢wI\!U#¹}Χ/vVٟ@ت] , + 9(L`|vy3 s991r/E: 1jX)Ęyrc245&$r $ ,z)Z*%:X01fn)QZEJxhJGG D*B8%;TY+xԱ1.\i};dw&&Jҿd"#|jd!ܩwIYRɺGp 0z=[NS81p24sGsG#2Zr~ɰ {c,Ǯ-Ċ۹4#wc6oȕYXX!YbZ_Яh"C$b1rSGj61cYGײ.ڸC\;o3ҳ|Y@nvn8K0_aǂ+qdE#"G)*ɐ7%6K Fo3j&7oAvָo HXQXs"Wc:M!w~;k u ^v,s#o Y:P0c jdTM9Jpʞ"aIG-%M>$ W¸r찱ujU{L Gph( *GH$4Q}L*>CO#Ki%8rZ4zȗbg[2ss25j$k3cISvsNFlMu͊'SgGE)9T 2x(܆zQ]LҮ)-"X45ӡJئLՋ{[b˚SBIU!4(*"}RО@XFS2 d3Ƥ0]MJFd)y>]uc3]=%F8Z-s8JKFLx<!GaEX#9gX>ԾoVajaZO4l|GV1~y Gv4vchv.>Kb&=1+s/"[3n~bs _opaOgHjCܲ>ڻl{L2g8Do-<1-'ӳݴtO' oÖsp6컂&zap("abp/v.wڻ&gB̊'nѯ[h-ʬL233Tjr>k0߾OLRiDǣ[4"KDi5;DWHYޫ}#R LrzorZͣ4 M&w+R1rs+3q*bI RY3 N&==t1;"2DŽrZR~"[kyyȇ Ce25o4TjyXrȸL^ PX~ rviTjL 3nG".˄Zd$_fÉ|-z/+fN_>N`[ݏ.#ړr,o>g0=iZ =f6;h[XB!e|3|p,0m4D T a^8L3u;uQ qx_x'[>pZe&j18f$la+XMN_O&C#ʙjc Kͪa+ g=C90WOC+Wjw"BJ ҞA}Kͩ{I`Mۉv4p#캬AbCe6hIkq.D(qp'f үʁWH&; H2JʰL xcJyI{b3F?C?V/5A$2{vBfb"#O-MEE˗;`,-QwQT_~d6)F{/J M _)"+ETDJ!@HPBdnMI6!!y'ܹwܽ;{̹cC:ps-L+ ƮnQ/, X60spNÊGĶ1=/1&Nt?v4jAԁ<_K&$^_0,'a@yQq-=ܱ*͜e*ixeQu섛@tY׫wí#PZgv\Ӿ*2!cMaV'),]CEl9KfzW+|j@Q1 dbkB# bIkQpO$ߎD}o[0]D_:kߡ[Co jko0tKc Bv|sw25@ϤK4ƵӇ>bkH2"(mг&-'Wgjl-^cj|f`MԹ S{臏G Cy[Tr[$QU}x6e{ I6{Vm̊(j^OEr-¦\eK"a ѓ',(]o1JA&Y3w<\BMpShrSo|7&ZD趰Ȯ  \X4#Z<Dɹ*uQO: 냝4{5-$Ȝ2V$I0%ns?YZAvc@A$ N#YS q("IR6KDS-,I,\KoV/jtz֫Eb +̧nsjNJIj8 lq/1Cd#GJ /UWel^'Y"J7=.So&EF[iy!Y'"D@@@je* D"Q“lЙs׆!2:!`bq?t\NĊ7SC.̡6=?gp1mYry2N؛7ɋdpj yVZhR` 2 *Y}kOA7B 1[1N,T5Nfi,{EaVt>O 24Ẍ́xdGF$ŧ᛹ӛaFSMLT93Hl믺QM9F<s-Nc 5&_f1?`p A^/FBJ獴f9 6M1oޤ]M<1dq>%`(Kh R1%va>eU$ky֢yD%Dn tnݩY1xS;Nrʲf;iI`ݩl;-Fr7SBȆ ;ES,E@Q:ىlr#u"aAF/4 4Ͻdpj d$iAwpkw '+la@O8 v"hND"1>Y9"ehhTDnM3XVRsmjҞq3%uˉry?ގ߳dz7T_;}[l8”:RHL_ez0KM$ `LNc;($)Nm;# @,̓/|њ)콋er'Y"t|qbk7vN#!_:et썘qg3ŵ5:$pr꫼{/+y'a\Zk([\2GnH[#> 8$~2OB46q2[O_Ar{9BE3.B!)gAS_s}aJ0c`zCXDJY?k 0;[A} CtbƽHcMPs6ly0L_S@ɩ?9VA 86N]]k8V_ BTQ<9>>.eZ$;ٰ0[ TDTyiGizKP )M̉$;1s0A"`,UwI9_q꘦ du1T1x<4u{ [Mhrk!mךnnή9X ɰsvձVXw|ᬝjXߔ 5aRx78UcU{kE< ;UoƇðՐ0k W6H62pv _ ?JSF̮G3_ '{apbRF:.y; ׉!M;|ɺaMv'UJK0H~x/Ns~`N8D ģ|M O`u{qx:`!hXK@]c4x6ǔMhrwt Ļ>:9iCێ/BD$U5 gC׷-"y ^HTˢ{hַsA.#˩w%D{Z|ԺFOg4$Me Rz_-ud+2w:yܻ' !ڹ\ݺ Qp;\ odȬ q&fԱFI.`==6ַK/%{ OK/K IDAT@A0$ 싫Ȏ.d%Od{pG A5k|ϓDz#|3wYcՏ9 aa􂫤wKXv]Q8s;1nK{~ C|\@J?J&2> gQq߼Ai$-K7,H^JբJGC<4!|y?ە^B;qiQOSZ=3z|O- h}m6syvmj h"p7& 3`*X (H]hcBq$\[Vg"ܷp˃ ݮK`gd}*AE*)"9nO&Bf۔-DL L'^]pXwqZf|cp)Ʊ5β=S^cո-DΪwG5DEo<Ti2؝plfu*O2yKoYJor$-26CaI="yp6J9M1AIΫ.z m%+S|m Ξ('p gT jHH[eRb)"d5+ci[© 8΀@-E;/v_!M@ '#@X c,b1"4Sgw^)rI-Gy9V1棱<#ؿ7o7[=}rPIf*O^V e5>bSZ|=WܞF~/P5xAvjwģW Nﱎ2 o'Z a\޿ʳd\\ N//uʯQE]\6.n@&<Ϗ_wa mjz]~Dܱ3H`SHyͼkq-i\c@s-JNF1oeI΍7Y Yxش-; .VÞ .8-:S,1fںEga]I/BFbgge{ I6{Vmg7ؒ9]AKYՃ33XMD*UԒ?}责?;6Yj&.Dl8 A Yvc[Ϯ@|%V`}ήuNbiIM`C8^[X@lYa v0lz^'-<@/G@8dyK!)4*~T*^'99t=>gLK0! ϲ3>ꇏL;ʍ%[`V@U3Hc YlUKuIȨ޽3uMxcyO3W"-o/jw^[q֞jV@}p 3坏g!ĩ ?kE9 `/, PBޓyF$Z@ 1=؉wrqK Q2H,X V36fKU@Bϳp_\MC Ŵ#Ƭrm3JN$1]L, `$IV/ efzɚY}$tݧ|FB/lxv 4O4ֺHoLt,^Wѩfgh(۸K!9V;g?};3ّy"ԫL*6 XGFF d"(p 5ϬU>Α8rG`~'J}KԎeDɌ;y'yQEyطbtXV}aj2ԩ -R@LZҌ(nJIQvɍJ@Mꃫ= YPw Ov),z} UBQhHnݺR@eDg%V4?NV,R$t0Eָ݇ =$ƺf t]àpV 84k5ݾMdd$ v:uoo׆T(X:HYޘdAoWy; e)NI#w V4JH%Bf2B lAҦ ?? gy JIn_m ֽ7kh=@ @<1S@w]zdr{Ӂd}RYi&p H,^nYA{ lYatYd0t3Cp <}j0pk *;'U*(C `7OI7PA̓MaNKîxaDy]17LB?Uxvb%PƃYt65ci_Xx.!ɮ&Ѝ'x),YLFbtoߡk}ojCC&Fb(.9k]c:ZC:֨5$F?BkfzRրNQzC2p#.sLd}; ^=.i `P:¹jG3`53oX p-o3j挻>O_C'D@J6XhDz{"6{r*nK[l|]ͷW0aÅ\/BR0۩!°[I.`[}C{!>mLrPh.@caX9^^`Cȩ@^@ snyI40k< 2A$ksC+rԈXTU'Dp|vYm3h@26*9,P1ޛoh%HbQc[$¿WD2m ] MbT^Web$f2C#u?OrE6;,  aԞdc5>Gkfs~ݾt!yԂ~QX]'p mE^[emPoئ}>a{Ym->u8 4&! }w26U_ ٴm\դbܨˈM y-J4$x ')3wu{o~ʽd12[3-P-icL$ƬZky D]'9oT*~f֐~X6<H@Gȭ!IvҐj,"#l0`n[ w,O[j3e>!/ PA)s#9#l1mݝqp3k0#4d^q&YVId_znG'&4URKP% /b΄"#Y5 N# "ШKeYJI6G WR"0+5ІYcILu/ӵ͚efbP6.Z?>!,5adϛ=yi h& s6gyEh{9* Px1d|h̖XQ G*@3?ȽջM-d˙X2#ؿ 1B;YKNGNpQj4?8EfAx)e& v[j@F:WW1As>:x)RAl\6ω8}H:ŒNk8ˆn% >s<E)cd`-U[y̺JA)d띅ts,9}7K3LM~_ԏ98aKM>bӅ]B2"uY]sfG1cԖbg?`'&@M 2Ll!"jj@}C.Fء+OV0 ;KuIHb)ܽu* 4}sT- 2 x_,BB˻'6nӘ]6@%E =)n:`bێfG(mne"T&E(֯+̩$eŖP@0q͘7_*}OvjT(:(%uެ^WO'1 x1ſ!F?4 9i0Ґ])ٽ,(ޓҐ-Ww'#JזR*`  _8P1R+SnQxfP=D: zuBI1FnbNqQ?=[)<βxskAAp6;q94İbBBhwwEdddzyV&x \[2v,_.+tNjXsWU4&H[1l|t5sNc%]:ٕ)w|N8wՊ]zk3@-[QjsƞC@@YzI֬r$ )ԕ~߭dH׼EKx6p>sF QPmTo<{6ӎ5㫅=qevc嶼 7iWOz gܲ{Rג_p'(MO@ሖ5IcHg:"#‹U7?DK!e=™m8I\J%mӆ8?DŽӤqSRS;t-Px{g[+ $7sη_SX.x IeJp""#-V=H;7R9tmL W$RLr7Fӳk h韌&WdQp$-:Uf>}&K$9y^^ޯ f}8LEIY'#?n5/DTT"d{h(ЪDI=P. 9wMC2eu&οC1IL"^5% PDMzˬ}X#@.8KQk:xN&hZSZLD^485k?_h`>jٚC|%IvSXrM*a>ͮM@V}p<%͚^C*SP3Hl믺QM92ᗬK`$ T]2ˤ̻7Ik[YC`i~_F/J 2jkN̒k;"ۘTD$2,'0xx$Od{pG A`Æ {_5:S=a7 TQ֩Ws~RFղ(uy$kҞq3%uˉZ~x;~ϒe>7\?TOY0p ._`뷙9{a-H4+N<,%z;鎳 zd~ iBL*I1Ryt[‘5 ͓,撾a17iwL*uT/*UP!Ng20޻)$%dFs~* WP?^%Kvs$09SuoYGiBuz(Nz5霜3v}z=Ž2`]e ]Rk C#}wQ8(10//TN\%>8{_̲6dHQ\;Փ3NdusnvNc-86 @`;鋳'Jjߖ)M?8t⣭gy'1oܗ,$yicLdV~w{TϮs2 ij3d'YɜvϚ#qDGqziM +Uɓ)U|?rLF;5*cx 3QiTz{XH%ϟp۷Q(E)S1"W&Hpttĉxyyx6/CƑeZ1AMRU-k/ĸ3Iho!| +S_\n{:ggh$&j8A94NDTT"vWI4|UY@@@p*VEd3ލTqcQÛ_9]o&?̮eyw fHqkҝ-&O(ܹ0E'h1eGx;fW' Pm$K# rrА,X*HƢ-"cvߎɚ#SI7=L[f,(='f2BOj0E%X<*SdCFv_;ƕإ\~XR/Q0J+] ޸j/fcu2 ѿqM{345i{eLF* TcN4<ʜ>b֞1OI"g։VZѨu[+SP7JP Zuch2giII7RsZ_”"u8F=% f<fn)iwI~aW&PU;틂psLQ[G$o;Wvُ8{I>^ xd杝FEoNb5<=0z%<4(I6aТBXl)Ηan8beoX o+Py|t[#qAl+Cq:[La"y<|!S+뾜3#Ɋ[gQdfvg5QH@<ƜbgC5ͩYk3w +* Ka NS#r`՜\uv_hhKrUE6z yyUOOpP\,ͰٓGw&-mt%fˉzɒQ%u˓捾uffw& @ʭ hY s[/:0KE/-ٸ/a\YdGMfVQb/FG?jsKH!#m#sEWƻBj@DG^̅myzk2қXk;+Lp0Z3yQ5xȪlEY Ҭz؋cٗ b df^& OpJ Z0Zky`Xgdڝ7+nݘVNH$5&;#`Apit1eB[L[wg=~[G:I/"5"pU5Hj2@bB,Q]g\mdf;7"Q 6Y3"aj(+lX!d35lIO0[IVx%x,UD-a]o~lLEthR8.n@K*y^^4>_rU'\u tKAohl4?Jh/T9!<4x6ǔMTB’tw,:CКW,uI_T#'?y_&!8U'ٜjA'f#ogtX'n`C !zspvmaVQKfaӎ8˞IXe6SaWK8BBȆޚv|@nrbfXAhָ>N9}V?#Xj.O>|^,53,s4izg7%}//޲ |-N;roY.)\R][[2+h 1z0xvKi\K4g\ɗi2 m:m-5GCd>S9qUZ3\w6edP}Q}-{R]K-y-̲Ҭ,,\R4Le*j H*/,`afAs9z<147y<}@-_=IiHΙTrVSvBfCYvHt 6xC'K6*߿F-^ _!tt gLo8ad/.M>kS_RˊiYR$&44<7%KiUtz(܋;#Fa6L[3R2lhA\숊[۸.yҧ9Eʃ|3!c#>ʘ6vf?44vz mH/A*sE9CbE 7ŎSҨ(rrfHES/gIBs1Ƶϧx0w4>HwM { 6}[ؓ=[7'eKsGl/Fޛi$mv6x>6֮26^ xq~!4i'Ys1ao#IHBPhug?Ä=YS2*'Lp7bbFG.~@[ľrXuos p4:Z J y@ 44ccM\] 8u*WA%Χ=I6X 9zyݺLtC׋W{> }Nܣ7>t4%0(s]NIGOG-&߄UܽIsWVͿ-'9)9#cbIk8ms-%>ɄJL!js)jNaUlk`fmc+\5+S I,B&m8hucd-J D8Nj9&6pO͠Q $Hl 6e4";\mq$wdv9b\D46,Jx`0j-_W(3*k-4q˶\9Gfr;ڹx@{ȩP ] ZPoY B%!'" r9\|EUmDЋaj дr*;L`?y|7!WmXmJ++髼-CUH<ΪeO*Cۆ>QQ Xd7Mt~ytݘƻY} ]ҊHSe=y*I\.%~"+mӿ|Dr灵>$?'wcɘgiDrwܩ{mo'!"g~zo`ᓝ!Ew8;#_:mf\FcaШ sObѿp!ϝϮ9!:9* D e8fIgl"__#K}w~)3 IDATm#g聜,*%휧,IUdC:Q"ѹ[|ެ>XA3bGpGކv22l$ ,W>&9Mdc4?-EEYkjpHL& 32p_e*=6ˠԹX|Vg/^jh|rN8<>?scYd?O).~.lA{'BF΍*>Q@ܸ'/Ocl/½}r(ڄi|n^"WNŌn]=Vbo]⏋v5 v5ݗԨ Ei9٘=Cp㨰m 9A=¹n/2@o9RMmsĖ./q_uz[?` }rqq|u9J6}e3 t o_-$_637h]ڽv[Z.ۈ%-y+tHG~5{Q _b_h5Hh߯]j>\} _DƷ[_3_0-ztE|j+Ν8gz#5.8gW6 mAa ͋nCWmw' //n"̓13ټa^˂#i )' q_}tV7.#J.&e /sg߀9Lȷ!눍Z|Jԇt\-SC__}V pWĭmqe$T* C-tcDlU R;X¡O8|Z}L _e-ޗOK^X/ @p%2ׯ_'00>D;~J n+SȾ.$B;"c|4ーR1Z/8xpi3b,[((3qlB, P#6W_RG(x0&Rپ TeMk_)Θ-?{G2lզO0LP;U|ƪɡFLa21w`;DEb@t<Ν$dfEp6#I<#> #txTښdEh2]f46=E{MclGsqL(MÞI}, `R):o{>j茥Eb|o1[HFQb{F hOasGh'FއiE+6QIhXrCiaRŹ/w:ϳ;7UPEg,*c㌟BZEuB1xEvuEw\QR!,YL*93Ӟ#$6A!:^օ~>ө%4?R[HK:-| hE/?2UU2[Ѭs˨䆛uz㍯w3x4Gw't@ɛA( L\S)B+:ATF%QKf6GIEbX$l·NIâ:9b:@R ӮZUF.Qyf=}N)q:pfX՚}$2z5P_ĺIfT-E Q6vZY;3]ϩDfotq*yv͝)Z3גHzs{%8Ytvwu1͡E켤W8DKPx*o΃;u h9fU/άX,5ZU^!d,ycPO/ⓟ/PvJ_$r$=yu +?C\:KD l=BQa<>?TR:b<*K~r'Eޣ<żk; wOo_$K,Tkr07$\%PL%1Z$I]Vb@]RArQY"~<7.2@cdWx x5}4G u"s4-y<$ͤ睈\q;U7,`&2߼:n-~Ctv+2~6~1v ~6Ttƚ"1ҦJꈜk=<zώD&PڔkV䝏t 1cz*38?o><4~ig,559Fx9y`KK"ntw(,FzBHùi"sA7ۥ{} 3k 4r8Ói.\7 0Con=qUH̊d͙l;O ncᕄ(ny9   v"m&#&L6o&Xͷ86FI|Q^.+ݚeOxlH\yh^-0n0/o8q2}wȼЗ*٫O)Ӷk7W!̗{`4Fey3wi4}wN0~V]RAY/'kҟa7~yZ?~0ʗ$UWweZ/@ yn.^D""2 O!P&$7ZA$Yk՛&^cG|Z@|7ܿ D>O} j=c5v?T d9e |qڕo!5OVk 4("1Bȋ+^u8"ݣ̻2e=k ߭"W1f\3&r%м[_:*mhݓ>! rT7A%DbFJ}wS&I fisUɡ#+%,|E*t2`OiIUyYNYZUv w#7i6nCiJnrLCܺ܇}%>-p!ajR~&ܢ=KRKJP`,¦n6BN@Jjm,Qp"l<:2v( E N pmSg6,~K!<BVE<[_UeU8*qtSq]׽~+*}P$F:/^ 7?~?x!$ȼCK(~qs'Hs 4,j[zkWRj@ˡh֟r@yy?|xrԀ:S+8-~=oG緣s.7Ego*]{1[*} !EJ Li 48ΡHY@ı-?s׵+n65Wu-)D! Y,S9YCM`1,9uHq9?|Б -Z-Ov]yň9l,QsRZ.X 7ٷLoeJ`}2r.ۮx`Q-O۱5][veRړȩ;'5~ZӦ(>[ˋ5Gf5]Dҟv>طvXXVj#m hWZAD ;96Ti%~=)m\ ; S&qKf@P_:ә%GxB_Bu{OLrUm=i.$ ƪɡqe,3{ C/DsY8YVs5y=Z4.wR"@uӦy6㹸o&wԸR@ձ&@j@Ct ǃbn<(D:գ˗T(,SqXN؛ia/ƣa {g+A1; ⥹#sʹz6 g'v~&ׇ`'F֋)o0\Ma߂铺"s x=B]u<;@;12>L{. x*Luf55ww?3e/nOTh8e۹R-C_Umδ.)(#=koc ]J n-q(۰ WYA/NG1EN88GC79Wwv"#![dhWwN =GI0Mήa]h烟_0=_R UG=hp;yv!{DJ^)oo|_moVL ]5l-KYpTvDK#M&QQbh(d. ]%OBf}AXt4KJK~4fmwZ Yex9b}ε:TR ӮE^p?$kr9s;۷og#$Z?8O{*ԭJj=Hfbϸ;v=bIũyS 9{'m ":qnϫ;r2%[2U U jN1>DړZ=k(J=O8lͷ/!?K6"X a:M6?E1?)vΤ۬' 4bâ㤛j̥͝J05Ů=xU +Nk5@PW3ɺ zjU;pķXKTS;܇&Z:/M%p^ctwWH2-oF1wolT֋Vr>^Y5xo5Ҿd9^y2ۿDo|JA(ܯ$U"U|)i-M5^п%OZ2d˕M2Sƌŧ*_2j fRe:ҶVAF-Kjw&YMNB,7 ' 'sGY")6HPڤ-5ѿ5,Q!'-Q[zv)^_Œک=wfoj3HSd^il7ք3+e|r"ts$t-{C·##pԵ9a*}Xr"?Ce^+dELYF/NjxJV,,ch u7+H \3i-hSo1]@Kf$S'9W̗{`4rz3wi4}wN:?/ƽ[^}ܨ[J$)$> W1j'ue%uY~&nRn(qi;.Iۇ~CGaEfiY2#[o~%E4؞_dwG8p:]ZF!ڶg4[;Hȅ}hĦکsIK mpjEN8K-V!1o]$;kt*S:s[Y(Eҥ/ =HLo;5& W3vbyzs"qkECŕ Th)H:#sogp̢J9O~zaH\x;5<\3"ntw(,Fz5jieCڕ RY1!l\>x8Çg^4z,i@6ڹkOs(gS;!,2'ΥaQsG+IJ@Gylp/*}+\kF1oKg9Iɥ7؟So-ggqfԯIRmI#aUuMI%Yi_cJ9ՑbSJQߍ |BW}'۾7pX3ƬzXVCRj8vg(b!9%O$""r-p%x9ԞN87qAZXzUc#/NnkAڃHb8e}>}pU8쎴vbYma*xw {fhVL*i\I7q PB%z)ĤIԊ4r CF$ƓS{L/̷o'pS1E1uщX1)ʩtql>|1z\h4v-}Õu=UҾZV)m *"u e|WOӼl[N5ڙde lhޭ/E9PG랄$r=_S$B*HX$B*!IF |+p鮒Hl58H$ ̽?oZ2!)М[Ϭ!&Nxt.8^kFq=iՄ})22&Ogf_ȭieUXi/xlL`~\3J ʮ޷a Pm: Lk A/u,qi.G$!F[:ZX, j+>5e+ۺ Rr[ EYl놽(g0.) $AKQF&*35eM,%'Sv&٪ۈ3k^f"q'g۵5 yɤQHNG%Ǣ[\FK]VKqW <o޶ IDATZx6C=\e&¾46mmĦIoN0!vZq|6f ~`vkahUj"&bTS>Gj P}_|…@ Qd1af{K_ 1L(b^f˂,jgZ=*?eyDo cڟmD|ѓ؊tZʸ }[Ti>}.NDԬ;^>﯀UyqoQ:?)_& gϗIǑy@IY_ϋ[VLj>vHYʀᇘ[$#Y'b|/lY3:?9G#5鐲#3e$Ѧ3/ȜNt;fyjj_l -GT}u)?ޢCZb̒{ l#ƭz3U[п،}(٨C5}+m/7! B56aKL5^5{! P'8I.4i5ey|&s[1}p&YՏUc=/W(0 [b@t<Ν$jh/rq,;|cᄐ5Na_$VLGcPτy\01޹gYcV$ngÙX.0-~xq*>2c9b.OG&YQl-s;)Mo|Or~g?:f}%P-*'Y@@@Rmd!󚄘_MêdJc[t5hOiWf9F$<1wC[I(~rkKsGl/Fޛi$md*A~ QM #sŔj*d_6x>6֮26^ xq~!4i'Ys1ao#IHBPg'v},W K¾'uE@Gq{ۅTOU~fM{I}I0GMޯ+wt AL Peǐ~7y}yU;ڥlKd*''l!Nm(Py#S}<^[3S jQUN Eiذ8F}ir)Hi:=y}+ *KVW6(hƦO7w 꾠Z㣮N +?zB_T51EqK~r'B_|[rLS6H6ԜUEgTvΏ1.CȖ7vGE*BlEi+X9 /$}3% n'É/Hԗ~z>m0io@{ %m-}I-Շ55V̎jʓ;OϏV'/^~Co7ٷLoeJ`}2r.ۮR؞-b@LH9uzpyf'ZɟP6c}kp͐1o;&6{\0-{?4/KUyA ˋ-S@L6oWDzHjk|65YT51E T1` {has@WկY5m/$N̿qVO%P7-*GЊdFv%I3̗{`Ӵ_@Kf$%T_WZs l۩+/>KΡȍ.swqN~>VV GZyQפQY{69vB?5N]$3ѻt Th)H:#S;V|PbQԂN9Sv6 ߾2mZӺӣL]vZͮYMNB,7y'sGY*Wq -)! pۑ[A3W3$)Ab牃6$#*:ҦWAʬ=cTye+Hw#Е`/ɶoͶ8k h>wHiTY<y\%S8uSjYYj7'YL%1Z$I]޶|F-)'MBEGzCu1i'HQĥ#d[7Y\|u-ich;3EoVucjXطY޿bOL&),?}|?DmA2gaTej5(_J%E?L;7;(2L`;uW %U90fK@@@(xS !K;IjaU3ZiyyMܐ'?e}UUb]sGS$Lzf i7ǰp׍KsB~X3썗O{~&-L)5q1!x5׿|:3BnSIƆ#̏dL3 _/x?:j$f*(h3 }cy< D8J?Il2PjL4ڝI֠̆WDlG Qo-$ 4tQ-kd4;wg֪2y a,hɋZӣWq%g)AyR{ay8Ɣ2;d_ʸ2irP}AAK_B?;SL٩?JmӮ~s !$Hyb 4o`gRW\d~׻']]Jlj,B[hO! y}8vbdnv\%US6-cFv!ׅmto-r=峇Y7/GәdUѱ Cb C2~9CGk{̓{myjp"PqO!5MCH Z5F)Q5]DR{Ě4fYMЖ!EN8iBԶMq/g5miT(" P YC j~L9~GbApAE[0 30fsb5:lN`rmlgs|_̔ϱ+4㏩>*w @Kf$PȪ`DZl>(zja&Y@@@4>,RtfѮULp Th)H:#O5jæԷpOwj *Qf&ٚ,:mDbF fErMf`JSKVW5It1 ykkOc6lAu {5++S&d= ucR, =IydMh7 6zf.L*0, А12|a=%DxtdQwT,R(]JZb\/{FXe̪!TP),d_ ͆*[ɑ.H_}=]$RB@@@!P#,_rPXmGF4["_0S|t{ NV\`PHiTY<y l-=c)'lM6ܾӥ{}<70H>3D>&pG9mQnQPQ} 8sRW2s5vò _7/֯ȗ :~m S !6꒒g HnQW_Σݞ֗!SC`9\UƘEc􀔺v'гecdUWT+'Y[ȉ_3Ww'1$(_AVa9Vځuu\L'7tX /Jv[9p!$)ƨVĶw)eyݙj/LSVՔW+!X2 Ļۘ.b[ʀ|r{r b6~´$k\]ߟ';/Ɵ!:כPlK fڰk$&HFH/#]X9~~^twzWA0rzһVP\&o8=.n;*A.!UA*iOW9I.LIzf&~WoFMwgev=fϧPZ/5/ڱ .2>ڷk~)R9Ax5Nm#&'É;O7/dj*?w ȱo~M`:؆G䫛3#zS 7=C_kGFTʊ)i}k7zWQE{,>"Mӽ.~$·$#tcOL&),?}G-K>H>ha cs <~:K<|~5RWN9OpܹD"zY9 gb<ũlOx}B爹<P{r,GAao-K֜~+IB֐~.@=h@Tw]ubMEl|l ]em8%BKv58B$.u VZhtvY] dOK`bKsGl/Fޛi$mF`QrH?HwM { 6}[ؓ=[~ƨi4) ),TECQa!"9Sj$|y{;x'wWqG]372c;/} gw# PKr5tL &<^[3S jQd_OșPg+[Y3wͿʺ-fŠ[K .S+F`QrT9 di]җ[ #u~,gz?U2sKpw'w\u9S%l*- DC I BA(A( U@PD RD AHHew6zlNߙzq393sξ| nyI:wOwy]z[w^ǝ3Zb҉OΚ;Y״o"J*Ud =/pip8ؑ;i]4StKkPJ#6& 8N-m]O9nM=Aˉᾎ>W$6uohM,u[5׾)7O,Ҝֶk'WR?w>}:fNn}k/X.>Wz/B~F9!{iu⸑up8~>OIѩO1CEd":idOw!;Mvw;~s>kPk:x%VO>LWB|Fn~S7~,=3z/ʞ;wrOG(m$dUϿSW녟KL$ qWyv$nvn?IO&WoN.gݣSOxQٺoj|Lۺ1;=51fLnaަ<.]'=yӘLJ^ֺDZdv%\@:.c9*GeLڶ5wdl \3xzWGݧ;z>]+jjulhgA O f;Ftָgv!#nQ~|)⇴nkkw{Kw#$ڣ fwȩgo$lws ;=m =]ַ$Ӷ>9%x <}cB2xd0#$QIvqr]뫎mZ^2'k"Syey 73t{d *` ^=mmw?/Sn t'ז@˸̏%-$2jT$!_wE@0>@O2i[\>h+oiMRc}~۴UKv-96!2DZvN\d2I t4H$P@# !5z.  nO2dyw eJ2tzJ2 -G%:5kbT2 -G%:2e_ (M7~ݺR@7$@gnNm[:.Czw)e1𮖥%Lڶvt}J2,:vlg͚X?vϢ xdmՙ D%:xd-P&ekTd *` >V]AnZZ)p~1.m. 簜\1knKTr$Զܐ+gʶ\[T`FHbd0#$QI3B2xd0#$QI3B2xd0#$QI3B2xd0#$QI3B2xd0#$QI3B2xd0#$QI3B2xd0#$QI3B2xd0#$QI3B2xd0#$QI3B2xd0#$QI3B2xd0#$QI3B2xd0#$QI3B2xd0#$QI3B2xd0#$QI3B2xd0#$QI3B2xd0#$QI3B2ʌdK $!Tz8}mۙ:J8DR#W8.ъJ2YK.ŋ$9"r萑SE8P(}~]Q$QC}z?:䐃{`hA@3B2Z{-;t[Bjm ?zg~Ӝ/{`F%}koQ*hh8 r+^$>ڶ{mə~`P+Ve_NԩS>QI3*蓞|I]wu1r~ 4-KLTtSj>˶dٖlQﳭÇ멧vm__k=g L5TJ2qt]wӾ;S׶UY*I-zU3o~e)m>([~bXy2>ۊb Jzչ瞣3fhi۠ fTѧ|'zTWW[oMkv ^nSO)tw_~z>+z;*`FHF2ydu٪NScccǸTgukjiO7n_&L(z;*`FHFe]p_RsE_+Vt^/uG6*}vtR]|Ś?u:쳵u֜QI3B2+V蘣]wPCC.b^k P[3fhe:"a_x,pEEgos[OSr.,i}^mTةrmn{u9NUtiiSv_vN뱭͞3[555i϶']?Jlk1^J6ndQ$*`FHFe-Z`P첫|[6_oQt/  dqmw2}mb J2AWI . Zxة1cY6+>/ʮc5uT\#D[d0#$ÓѨ֮Y#Gj̘1!yKSSG׷UVUIJn e۶V,_M6xdB%h$J=J2Cw [!Oez(eJ2d$Hq4b(Y\וUr]546jٶ~6{gti d2H4&)H(zHY{yG|R MMyh% Sui-\P+pJJ2Qf qmڸQ R4M9>P5Ul[d0#qFnA袻t¡gMi[p4X׍Frzi5nfTd%lf*pZjd[>}ξ*M=wIrezԁw-Eom$d˾z+zWuat֒hOpA*؆J2d,`ukQzvn '{hωUw#Z̥:[B%@\*l뺎xfwnOӋӿB?Ќ|Mc+7i'kUim{-i܇/yя!(NQh`FH+ oC&oT;P]p7K6fЙ~EcklI5r\]IMt僗Aܪ`FHlCR)4fEͭ\W͋꯱u])2_?Ҩ+Ժdbwv$qn+wTAs7ĺj3r~ybWd0#$XtU;I5jM܍ 9 Z`F%@Zւ ߫~\p(d2Q(2,L( 5zO<=¶mUVTS] J$2 [ϙ3CL+vm'.^P0VhTkWe׭Y%뺊D8p`Q_ ȶmhƍz/j9jdF'E[Νٳgnjjj,VSS|>_^*L"VJ2:˲H$8)A0Ԑ!C$I|x_%Qv4n `(2f|@ q(,EHFYٖ; =)UMV0HNzHY CR(yu8|vyB( B2ʂer\בBP,IPVH[q˗+#*ήDRVԂ 8kme4^up\%  v zψQreɶ-9K><+ɶm3Xl\.Q4LymOB{\Q$Q}}f=Kp@T0d˲:dQWr\h$_ߨX,A|&;ui|ٶǑ$$%ɤQ2T2P$Uo֬Y~8r\W[n-p `پJ됒Q~lەW][5q$I/--:eٚ8iyiYR]@yJ$rIcR( >,Wc>ʜT|ܛ3gyQ]iƣJ:I3 ɒ L&ǽ YdMmaUVo״i4v] 9QreI:Xɕ\ ٮ%'HVn[oU qR"2$o;%KHPP푝͙n CV\ ߾r!$\וmZe-y7SO=?əo67oެ;W_?O.L+W4_Kcq' @mn ;Zl.2-X@:qTaw:#@9,ng\dґjllO.Lk֬i7RtcbG&E;d)ma[VW\M6feK5.QreNkLLNr>mԚի.cc%AIDATk&(n) )qT)-@`, ׄ z'4bNZ@],t@Y$m W~]wݥŋ;B555J俟h=ǫR@@@@@2 /?N$J$J&'JS'45i稦(3|>UWho5l0}Z|6__qg`v:N^-Ԛ6oּu= i1Z[-[Wnl`04hBPA:)vma[h46 =z< -]C*( eq>ʞ8EibDj }6wj (P@7`@}\ٶ/yh1oetm۪>С:/QCз6w4|v-׋nV(BЫF5 \C?:}mF7n_s1 h)]Hvʚ}6Xچ(`0 8U8? i!lK?Hy!Ji y[U%j1| }m۪V PmmhP8JB[v'=²,aR -[@dB2!耐 tP>ɮ*L*H)K݀P ޱc+t+HHN$r%_IsuI~58qz~=I*:m';$755id"!u)K.5z}W1t\ε_XO%#@z'+$;M7kb}j:d{UWW˶{ƾq'^:zbwHE*rwS_|HqŢQ9S\+2;֓c}y#zBevf-C':KW`/=x{5:kmyލmfzGeo~ sCI1$8GW*Q|E\C=2$K:tmWhҠ]ivQe7e=^2\BrԲf0t} Vx}M>d`A{aXO wշ6]/Ro?+ ;և^u$S*}9:ʛ}_@V-{/zjc42س#b=+>Բf<'J6}m>yO:H\mq:=Gt_#3.WNFVFKa.cghٟӺ]/ѥ'K̖Q2Ւ'3_V}uѕ鈟VS?9]'~t$+8\ϸ^=hnmt>s:ztV9~}tb)YǮyIuަ|AkWhI_O~sFZ4G!{k{S~Dm~~uoOu4%;}=0dc[SbGz~P}AOU7&En\IsPmo Je>:R)}T?LLy;~E_z觻.IkϦЫolУWY+b8/5w[oOUeaJ?eH2廒6IMtF~nλXeW~xW[CQ(5*l?p~jzi-d[H+ocqjGi=VaG􇿭R,$C4mzuJ6y@蔑rc+ؔغB[T+|Up|Cr>|}_%XG>%VJv74k_V`ɮ}>Mjs^|u]%6-POu&D빭f_][0FO9b"+QL|n']~\{:N3{VOKdr2g~gyUOX\e/PUMZ>5L7/U$0L<2_?Ҩ+:?C I+$Vwq" w=kr?4w]TTŚwSJu3*d;Q%W͋꯱:#eb_!3\s;|멅QյO>u,zw|z}!H|m Jv V9mHذexc6mN8R%7i㖧ŧ/',GRѸu[>S[c#Ⱥz5:hݤOx_ְ_o8@,]]<|QP#g#ғ^/0SHJ}Y?]Mi͜U[VoNҴqy_4wcBN|}4OgSvm+u|.:*HCwѾ_R{n8嫴`K}n9wB j6\ Ӓ{Ahc>/{ى;x(i} کk<#s,'fuMwPbvF}.y߶ݕ+׵T9LzS\_tݫ0P]y` M|E:竵 nds4|tSu_8}hxhez6@@·ߟzz/ae=ym۪w֠R0R2豻[y̙X,YZAG) +8tI6ˑtͩ>L?1Ir9yfޱO&g)m4:zbeVXBk„ Tj??Pjk۩":q+` ^:zV-K8СCdٖ{]?}ʒR]] p(Tq\}]I uH.l۶T[[h$J)RPHV>m䩯}I uH/In2ve)+Tk!2>W$^:W :\$@]a%\5|@z'ds.:yP*-d[224*Ie*$SJZZv $rTfNjVMMM-RdQI͚5KHBRsHV)SKlr& (J)k%eIҍ/&gR HTpHHDsS| Gcɖ+S,PEZA;}NZ k*Ѣug_:˕kɱ#r\Ѥ,/k9[Rq-Jr8T;xIENDB`tora-2.1.3/src/help/images/script.png0000644000175000017500000032331511303312237017250 0ustar michaelmichaelPNG  IHDRg36sRGBbKGD pHYs : :"tIME $ IDATxwXGvA:X@E숂]cDM1QcOLl-؍%1 R^/۾?rb@s>3;;{,8)M<#Ba&6i`xq ( qgW\̇XqJz=('WIPk0NJ4Njާ6]-$+{7;n;p20}5{4 NC'|Ke5 GL޵]+;w7C }?vpӣ?X3ma9JTSnNvTc[!+%|W0V >uAc[ S2ÇwkDŽεێy_f)yA,۵P6{|[{GvT晸gO>1!GV= gxYHQ'o܈OHP(l\\ |,3>!!=#AX,W^5%SϜ9jHX)aeyT+e*^Q>ת~믣DEk׻oEөeA`oۃͿyTS^!xzY%ؓ]F%{Vմt1xe$Ij4W#?𭌌_vUakkgg ^3?'O ;fL[+Vr>qSYN+*L1 3E=ξ2Sdd+9}czkղuבH!1Kt˖t' }uF,1RcEm,w&\|L2v.t 扫WmI%䁭jR-9m?~A{'-'jޭ{TyNb^{6t∐N|*XLr&G;wkȏ\_a_X_+1ƻ ?PZ~NXcv>]]c:Z@#<;=}]qɩ_vg㌡}t,5=nm[FFu9`G}k̑]#[Fw:3Uyɩ_vwCB;GEl볟 &vdžotl٪맫c|̮GB[{kpG6~mlmwl5qj{79:2˨?1 H?Y_HwҞ}ےאۚ/L-zK3SКT@xĤ^zE899 8(33ɓdcNٳf)gƍ\=Wk5ob*QJ2͚5Eqqls'w_}1os<{?nbHX#ʫ.c'rs-ö;raC7xh:XN=#^bu'3LE>Oh8os+#S 3妶̅4{nk} /:%SclbTM\EQs@mQՒX[+T ebF'g3LӺG:zhf),7Ev"yYۅ9 588ki˱^T1UA,>MywG>tٳaaaiiڤh*g''YYϲ9²S 8`Ϝ9|߇9{na={(rhМlVIII6SnYG)AH:L5  !,=K8CIni7oTW'|ղE~ݙ~f$%s݋Af:zȖ鍓~XQ6/)[_}ZݻxZ`|(HVEsVKbmίPa*W6r?.QQQ-[>!tp)Q,~ؖ!ʭ܏M.ƄJK7|ppBHri<)fZgc=! 'qO 9jC}ZF*hIvV 6~vHЯW}ߊ\=hl{1N781LF,m`J@V$!_2?~1St׏J1ֿʵ^klZ648˲*C"\vsoܐH$zd48^:Uᒽ{ᇅ94U֭˛FG)f*8ygÆ >>>el<}TЯ͒,XVT!±oSV?,a`d&(v.4ML0{|i#]^3Yd Ox?.r6!AЄK`@/X]/\Mu1Jj/B)9## Iڏ'&'CR-U7Y9BM5cX`.Z`0G䰯"!ιwh%_|9k-TTW8!BCB%qlMDa|BCCDa\a7b D^F*eBb!$ sH,B[c&VƢLQk'O9wrwl9m36Zd(ym!j`O]L1wdѺqkoL֋Qޛ|h"q_}CKcQv_}{ mYG/XI Qɫ%Tο S:jI-_*L2BuwK;јAHIw^ݣ^bQZΙj۱gn.02^bE+ܥ:A])/Q/X6Mܠ"8ފeX2V?/)?I/𔐖7D%X=؅CNC]ˡ-z-3;X%23YSvظq7o֯Wv,fff:;;dr`ES<_daǗeظ8Zkiq]eEޭZ6l̙37lPXE"6?I p^u,A"\I1ɿGy4"DHJHԉ3VQV mV}$1t'AbmRͪiˏ?R7f^6kQȊ)Nݓ6A&Y'8CF_+foK6"s4m*@*86M sdwVsMϮXrSO9m̲g]Xq}9L*RK3%"X:3fúM %|EW0V3)_~zyi=5-tvܑs[<1cesMoZL[lW,y!L!UH :S&m߲pYՓ;Z+ar~_u≁crn醤MO+/ (W !(TI2,ɐm͉'ɿ]<77h cbR97uXM[ZgxpDZRRS:-˲ktqqvuq̲hLMMp-ES,TV͠S]quCCj׮U34[bJz*Tfʸi&9,CĨ{lf'3(W,kAw!Sօ5s<6 ƧYߙAMn>&j5 c{WO\ek>˄˽tGJ CuV,=ߴZ˾s2/NSHuv͟os |W}"31kjۮ9kucWdXL\%mp4w>lFs6_sa(g1럁b&\0jn̜ƑDiDbeyTjeR])pREEBȩNIYN<Nڴ~ˡS7G9P݄-Ϙw>k?LsϘsucH/|/Bүܫ' !S܅CƓ~+*juu_%(kVY8)nen6᝿ՕDYLkbKȥY'h{xx\pIfBeAan݌  rqq5ѦShg)G֪Y38(|cfp0ðu) ,:y0oooM6Y])5k1}Z׫!G+oߝc޴ ӍÆK!m]=c<5HW{0.OGq~JyɛJ%6]x֭~>N.eg礤 q\Q^5Z۶J|5oʸgC*y{.Fn*~ѐur߅]H*ewQc%ڑsg8ծ]F0jMU2j4QcjY͠ UD"$Irxq6ijPRaO6 I(!d2w:"0KPFQ#@ j5TFXF+E6#5BD#DQg?NJZBFQ#53 ARjQ#@ j5D@*,?,4 UcFQAAU `!H$aTק!'Iv^q ZN_[#qd4pKQ<ǛFsqsNϫuvvEG`E!V/j,!qD*hb9NRMy̱l,Z|jZRa+:jyJ85&o#iryjU>}75EFYaY,˾hEjZrF:jDGDH^rFAܧ<.n#@5pϳ1y/ذ(T cɧnVm^@vx sfv['ϱ|U;,n5P-ƒm݋N8L1 Bb&5@ʆ9$kH]}yGqn]ΤRC4vA5ǭ!!&m spRf_3i Gt>n4~v }O~ws{֯n*;_0}wcV%e3nS^}D̽mΤ$L^aYH2n8:a?oGKhcvc.BIJʻ@={ n Q #%oM'2LNYJj'eA d /Yrs^!&歭E&`D^6q߿> IDATrPX.FF <UwON«(cEjZkMkmhݡsEqW'Fr!d}ԐPEQSB)ՏTtC2%Y MFGg0 {^06䬕-ڽ#'IlRk`9--FV?cӨf:d[ -M+o>z0҉1L^Ow?VpgOPAL2\uh*Ɠ,R_[40pa1WLZ#muĘȊȴpfyBχ3d!ny]E`C]L,k1RbGB!91NbsCQy"{WS :7YVh6.nDz+l(v lke1%r@q&# nJ9D&<:ؼGt,\iPrA%g>$e]X"P nAanA3=z9STyr!Ī]q k'3V$V^rxu;K䁓V,+-pn6`r<|ph%:֓01a3*2 |!-s[Xɿ ͡+*XJdKH%$-SHRk9j9ܦɴ ҳU-:|9iةFhs֍ U,^u4ovg+lnZev" C⓰ό i&mwj ^B"Z|ܖZӷeDTe }rZi,/eE0 a+@ϐ8OSgPeg9Ɯ,0- 񦌸+dpg󻯸)RVV0ěro\0s#YiB8!DAl䁥w]e0T$OB(dUO, ic-6xѷ^,=0z,mN˹XAMh@՞ZxQ#0&f(Ä)L!(hQ G,j4ڐP6BPH$ҏpԨV]iχ:2Lvvv%- ɨ8JZWjLՖxKAofP~w^8y3&; P}-0 M! j8UgffERw^8`ntjQ#=IJNA5&H޹-U;/Vݠ73y]^;/B07(~c5P罙u:-yU*qp8 jfL-3Fvmմqӈ&|4XvGT:y͇G_W#Uc䎿חA573x FKNn qIfZ j|Щib ÅnΝ藥ԼMq߾׺Yf3#ݝYcV'e_ݺQ=ݑU^Y7OfFvH !NݤYVPs!N{A5iܴE% jUXsH'p&ٻ>vD9S-قcbkvW'%ufd+/ *Hd:u>dɋ}zuUF[̀ߎ7o׼4bZ}Ţ1=}`'maP Kyc϶C&9 ΐCRwqƓROcB|+)FCkh%k;_'?1A9665\s@b}P薶ʫY&B2'=~cIW6|[g ٤q&-:Lޑڎ5֮]nݺv?~)>ĿZ>J7"a{`gWK^߭צx2*1Ϡll "6E) c"~¤A#0RsFGS:{gO' >o:G-MsZϰ$0YPE=&Y2sTuQD"lsx\VnS=|dtCPN!yzA )!\)TjBsRښncF[|/M2Hx0^ײBRQn/Hlh{Ltu;zψ3i Gt򚾣nܿNΚ>oTׯQm-7jY)arXE`M/!^:x09.} "jQMٷΝM5"\ w >tk:gwu6\۽?94D~v wۮcCWXe?'nx㶑݄3Ş4Ƥ[5 PUZCn<{Lk^GU W|; ucx/ǒ wuWy &rqy*x/(gӊcιe5In^B˫.K!KEWܾA}sw:6)bX2[~Y%GbNoO|5q#=o w~uK_=׉odcN*kxÓӇnе:9bH`#i8]kY5 Gwl%(V]m%]~Ѩ~M틴[^G BfTa#GOT%;~u[;|yKThT;>ҢqA zOXFBy~vK""GFHN[7zn~܃O|]- ]rnn #m|Bdoln;zBAH|ŝx'RF:G!=6MܠiA|*!Dki89 8H.Bu,Bp!/P?;9zM(xԋp7%p+g6q@;G M[ō?^{rtN u T=xFgșQ#Og >й.–`WA7djj0`E!&)_`AL6!x8FC)`̎ٹbq!\6Jy֙}OHӈW ;$3 o1B!riFGz}09rfE<>ʥjaҦN l䆳YZq!6.=fyF|+A"ܶȰ+ǫ8ó>5@+ x[82%5x r7?Ѿo{1bT w=P9FfoxeY%AANٽ;!$hkRbW6Y=&YK::n=Fsv& O䬥8B?~/Uݴb !ĩ-Xt|>FM^1ѭW9Q6; G"Vu'&QҬO@)B­V37igbn?ͧ1spVMQ094D~v wۮcCWgi&Oܻp.Q7iGa!ޘq|ǹ$iީͥ븃bVkg_8 yߙ1 u:^gju2T&kZa`OU댙w2׵W3ǒםL֑SwC֞xn߷W_o4N ة }v;A[坟9~11Wtuz}⫉=} Iufd+/ z2 3CfA^S\$:tԈ-]S nʻχv<{4C7Z1sʑ4B%s4qQ# q(V]m%]~Ѩ~MW,U-jdYV2 P(j{yՐ hZ}\aT*D"j5ZFZJ$_J#ZL}Kފx`?xpO!oDz6/jL.Ɔ붣't4gQO ˻ݰ݂FȬp80%ϡ!N^; %"M To.|}Dtky&oHM7hh/qCP#>A!f^ G!B[{x@; tz///@`2 = O"HH]VXt/:H$9vvvr)v =b7VmB!L 6ךHGaX#rq eu,bO5MpAe^V TFHh nIeDBq{6oᔘB'1)JLcv  hq& \E]E@Չh4 Ck4b_,k2BߣG 2YU*UA:G:`FCRRB e]wYxρV;@q]h%\չAK=e*^M7RP!c#[JU$g̦Μ[;?d2^Usṻt//p.MI@!9&]H ].M*rWstb{7(Ȑc,KG];qj˫CFh0,VwsslnT覍7niğ&aH yX]ve={#dijavl+X5bkV]vݺu7R|/[Uf@P}^2iч4B!ƾݜ" iűdG\ٲ}7/aEl YpA3<Sp!6.=fyF|+A"L$U'[q}᧻xh{2NEq]JT2AUnKӦ鴍 -]5Ù:^߸qb Y4"jt :u@B ajrE|i@b&=fOs~lf!rts{G.!={j[@9;gćmo]zl) G@RRЮĹi\)ܞDqwt'åjDJ=jE@9{MH`ѩ@\#]5e~8)!0LbbRJh4_\N<"i%)@ee=/9 d]a1CwBl߲>Fם[Ϥ†-yo;F觱4kSIzYpO-2=rYEpq wk ?;`׾S]csGaAʃaGM654qTX8;ҥK%>+7!*P)Vu;ќ!ɳR5m Utή#A.{t]r[R-6PsϷn!=xv{8{~0  H$ˋ._w9h4666 M<*ЌF)}gzdm?=~r}ܝ.kCuf 98?_`N(>kǩ ~pqɌK3m:,9sz}{Gʰ X˓/oo)-{t}Ax>TkHe^BoĨyH8^4af4K{1>Fh@۶60ȿR0ֆg踎brh4dJ؟O!KAvNE j'O;Q8ZǨNʰ P;gϜQ֓s IDATŘ O$D>rf E isې!܊jm$[`uW[*czl zYXu)%PScmPA6?K4B} p:>&9cn^6,HFxn߾}Νnݻ޻w7fI 5 ?_|;LËˤ2! )`YH/ɍѰ*Ǩ$ g'gyIDZzIZq*e:n(BƼDBlY˯7Zgm#'.^c^Ĵ2,HF|HHHrrN;|PxxË.R0a8[pa 6 8bͅ<57נ3HeW2>z UT%ޡ0L$=~8*{#wf-v_T{[<˱/mkJ d2YzzzjS7ww(J`d^1>G$4ĥcE!v_8m*LUVyG)=za@cX K4V.&tm7 $m[<Ӹ%n !#A`L=y-a8%wmصU`:e׆,k` T989ӧO'ba$Eedވz quƁ5 o GEgϞݾ}nh]G'R!5%,w҆CoGA#TvFI_t'( P q,#! 'ppǏx֨>DE'%%daԺukPJJzD4(*=JH$=I~0M(g9B]"ՍaT*wD"M/\ܻ{BOw&jq\P$)JJ۷!IR,9:::88H$QޣT7A66666Ǐ] w=wss,˚^v @eA l8s;6PhooF#˲ABX,ޫzbG 7bo\.pwssxn{  FGGG[[[0?*쬷|NCUgZ$Id2TZ@û8^S&b= fȨRkrjBK*dop!(Qca#i0L"b́xTYjɉXNeD"uppͱCQPF!x7,Tzݫ* e2 EeP!ãFy`0hF~uS.ǿ7wxo2>\ߓ5ƿU2Ѵ`x {%ɻuE&r4Wi\arno<{!|*('Ox/9{ ySŝk6;s3EIw;|Drio?u;@6|9KbBrVgYW#:KVٝJqWd^}'9̕K9+LHva*KPo{;wvV 0w^>ce3 \![[3m]Mcn'sJ45SZE~Z0He^;4MѨ\9HÚ@Ӌ=$[ԏ' Vp5l4*b´S>StB.?owSΥؚ+ lúT/]ӦM61c6ĩ&}89#-Wb1e!tvѫ:LYI:Maz͔zLy_?4uqƭ{elV_`t3( ]ذ_gئu@&lXP_tiN w:og~FCIf88U?`2.)ԧ[z˵_CwAij3C7zETʯR EQϟ0,hNyftt4ߟ$ڶkD  _@rKgJpB3ni0>{cxF͛)x Ew8dKZoG6&E͉ZH4w L5<(74 ]t~L&q/jZq X-H^~+~\Wse%O?j W^un_U'Br^I A*xl5M25Rdfgq'8aDX\NB}4d<cοLWКBIX03A'iH;( >ÈxRL9|+ Nð@Glܰaf2| "E޽>7vďwk c9 !9[xw|xmcd!(= prV55RFB*BCPŋ >0;|~X5",f `O .qYIH;X;Z$}?X#6"e y&d}^95ҤY uze"yaǶ6iǾޑ"4PFTP/տ LKs{>P!$}j鄅ylJ'/+f1DbB!X_tXe#b@7ٳK-}mV={Ν;h4Zk֒ B1o?_,I8@ݫ.{V!]ڸ diqƘ]aM|<$82Ot͹:5K ğ x0dq4!e]WӍմIhχvk ŕFX# qy4&TGFvAOLLhbbn B߰na Edt2 aВ%ֈȄL|k7܌=6@ v|ۑVgn.P .tCmr/k'￘FQq/P1nmB6+~/Y %wݢmց˹SF7ŨC_Zm^AT_I$^d^t@ Sg [ZHjZF~{ݨQ3OT>}Xh0+^o&_dB t9q< <1Q51 R> A:({j1d'S~b&OA@LTe_T17)t//2^Bͽ4W&u v`l8`KS&sXbDĸUMizjޠۯL&KJJ徾}tuc24m:AghcW Mt:TiT*iu M7ZBG;B0`\{,A@rD_H7@`*vrb H*fC+w!=l7t\$>aH6fO$12zVO[Kr|cݒ6_u;3>=O( G&Tr`'rd01r&2,r<ȣXk.; n$*kMSXB@j9D0XSM|Ƅ55Rƪj}@JӦ mؤIv}`D!PM,ں]M3r@ZRL2,8$y%StiSеkצ[eĕ| d3O@p,ÖU YBȲ,r\=h3n_|̹4tޝ/i l*U,淔Hڶ\zkMʍZ6*n]kk^#e 7F!<I*JDt"6 † 0_??eiTyf>q<#\V7۪"$I ˞Vo0Tzawh00 K.뱎=3\ӎoqYF r ~. m<;}0{@Q1_N;a2!1ދ邫߰ 7i?`Sz1M?_e´wo߽fɇNGF_U*%t/#&}Ci1=\/.-"eƄ5S?;c0s^}? 4K^q_6E!/.%X.3IҵȹK&UM$VkjubM4ڕ8+k׼*m$Au+O:v>-Q~xbLB]ԏuO߶6֡S:tcTZvpswۆ7LcPiS!FCe={ ƱqipPKO0?W"[ts@c OQqjQ>W{+kuGaVԇahVS!i2QqRT*;,˪վz9QeogD.,yȸVVC?36oÚN9WֶD|oqy-ef9[Ag49]PZ g^3ϫu 0ro {& \: wNѫǗ9ɑ@>!a<||pu/v44M& MSe+2R!HP(p輿>d.0YG6XڇF.kj|s)ݷrU8i:tXkJ֪oLܥfW{~BxrrrcU#_\t =/d4aDM&M jPěf5Ra@@jJT(J$Y!_e[O?gM{NnvKM^>#90up7Ҋœ%ORC%`V]8fmZt ߴew/o~_t㛐S( P(Jg|}7Au_]\ E|aLFZ]SAzfJe'J:Wluy?^KkAIe<˚Go<؉c0.س[w~ɸφnlpʺr?MW'ܰg |7]\];=Aٖ3=iٱ߆/]]j&ԜbWT_Wݭ?Jx|WS?[Kraaܿg/|?}U[?Mr&=ӛv,8`S|wQMzB7)iSEuRV}8D"777Ǔ'ގE_d21+ddo!( pp0(˳8;ė$=&ts#?z5 ܰ畈<ǎ N:;K=d\Ȣm1;m:WFpouӰss9s=ɇD"h$l $;Bo䚆;j|u\Q1;{7@>4ӷ*'3 IDAT-%hZ3O)[ht\^Gvcv{ j?I8ݒN2UfU:q(O5qBA`@T*`xaZA- 9^ r0AA6;tz͔h|Ŗj/WK/X|b>@3`iZ U]Kq^u{qSg|tI;wPU-)#q\KF<"僻*ўc$!zB cZLS DG:ڲ„C 2Z*GuY#5m,OG[N 0L,D"Mu/"@4L+]GYY UFfc5lӪ-ӕ"5LcZ"PxROa+zy+g-[β%g \b ðSOt]d۴lVc2ũqIZ2!i`cgєiNN,ǜ<~T(:`ؿսpcGbhS٭sm{mx&肛(d ֯?Xs^J7ªOG(5۱To>FsEt3W h"X`5m*diO@ F R`|Nx:<?##h0JR˟_ؽC)]#=͍ZZcW}0ѪEr]=? rSLx=?W72ˀэ;9¾5}Szw<{2B>jmB;[+rHhT6׳e{?Z}1m·}̻"\!<+ (0sHѿh+剰`X]:u3nّ:9X>}l.Ώm叓L7~%CHI$#MkjiヴO@ jVwd&===55M@0|~VVXwwwJaǏ;v 6 eW}vŠNa.n|PxUo//5ZvD ޾nZwD VPo; x<pUwwoR(X 'ph|p?.%%QcCCHN~XbKºTnI>?cGi OjKnnn'%$:888;$E UƮb?_I$񶶶KOE=Tk@ eq\$I^^Zc#DbX,n^Q^ ӧ|K )ABbKlu@tCޜwg7aªoY\2k f`0PŲA@$ 5]O$8[^2͵N:@ ۷jsLTwtfW;4`T+&Y@j 53xRT"p\׷87Q{ r1uQ&f?fJ\yF,b3f^:C3iseB1"0 V/r,̈́){DfWVa.^r" vA_0$흵tVO8&7;Kѩ?{qp}]x& |A{% Á)׹\}ç-3ZQ^1;Sx )uro¡̊}7H{HB t/wl33/~g[valuԖ-R5sݚ\>Z oBbU݌"#$:⋶Bݨ>}G*ˈxC_7m۶svKDO>?ͧn}`߲c-{C_y_Y3lQ7p3w)惔"="s,|cha7Maˁ jnHiƍk}L# =UE1_J0o 3nܰ.W%9 5"7)i5e+NpKJ \᭝m|6WN`<{Ko9";/T5(v[r⌾REn,6|idOٳYjDi`?27>_<f nupɖ4?fy6͜]HeYvljK8i>,fJ3pgcFhb]`|gģiV^&E^u2@U@ ^)h6n~8G7sŗF8ҵW^<0(M.R?Ze9dI-Kܖ_; ._|b>@0(Ђd WNEq~TlB{KC8_D`0@8Sʋ޷J p_Es2cC ]RTlj Qs ׈@ ކg'߾Eq?g"QI:nXB*/ڷ}:yg~;pIߛQ&@}z뙁i)#$0S8_N  8Op=˭XxB:P#_ڲg:VLS# pf+QB85.l7.  1ᕨtc5B&SOt]goӧI֘88SQ'&JBLxZB>A*.0YcBIdtyj:QCH3 H+NXb:D_7۾(fpR~u/_֒eSz-`2w\;Ƅmׅ?X9l#96 qB;vݡsYSگ>ұCpQ 0sX}[#$,4ww;$((s̫BCҾ1ܨ4e4.Z@Svrt8pU0En~k|^4NYv)qڠ.:cVڂ@kH2g\!!t=/ᬩzdOߒjB@ ci> Ng|n޼~T"6gw7֭v ('OJeym~^d!mZ4kbG\Of᯦~ߗ" ,_2n!?+Go<؉c0wfg;S֝|GM}+6 &A_GOZv,s-,#]!f+5ǭ\c%0|nmSuU]]eJVluy?^,PsQ2sO-m@.G%\|mk[dcZ5$4dgJ$y3 aEQ/1Iٛ{=3ضt~*,ii]<>GH:u.F}r! WDcwv\^x1([*9 >. Uk5BanN?gNӽ9Ё}ݑHDMWZs%͝ VG(vOq lEgVT2uOύ|Y4pÚVR p3{3Sr|ZT͚F0HW(~OZ+ rEdPVPAΠì7~h4j/ Ì=- cF]:@:rŗ;G8ꒋԏIX|b>@3f|J\r>M 侊\Bx" 5QW/_7uNNW/_xD,ۿCp'h=$i%+jnc.#/)"25w2)ѪJ2=/XkQO3fȡeqqU(QH$TH.׍LЬvGYY 5oծ]߼ef-͞2xU[}<qc٢;{ٗds.X~sIߛ-!n,'2~4,Юahn3#"Q^}Lg|E׵kIFXc5QIb hRQ&X2W|kd[s0zf%l⒰.;0o6m5x}h4cX|N, @ +xkqaB0%%qsp cF߷1>>2@i —K[vLjS)v v$ P~bΘJT)'QJ:, 6m#nXLqj\v5_GS9:9sQH?xpayy捱#1y)֋ ʶýoM~nt+U]s$Q+\kw/=ZT.cM SōFt c>ɈEP.%rV(:Qwg}[d@V)O!'O;wV)JLL0"<^i6NNwYYccU*{_Aa?1`00eizڍ:U(BkWVԈIB0:G坪ޙieͦ^ߵ=ey '̚]`J8hXÖ@h-0_=r R=_!X1:FE<1'R8z$!bt5,NaoooP(/#g7_C B0NRR5V;8<O%lj'U*~LJQc'5Q9p7Wq7kO7~[U !@Ķ"ψAAۻ{~>z+ *bಞ2nj?h{"̤xa$ KAQzJ,a"ezO&]]]b1 Hmmmb1]^|xxz"dDuSE$3.AX8շ{l'0T%)%v 5j!pǎ9jTigf//rXEeNe5 (۷[.kcqhӺuXA{8?H$yyj:'.aX%ήvvvvb!xEA( Byi?_&M*ϟ !1EPZLZXu܉<]yC#XgvC2FYh2ƏoNkVDDDgŮ] k[ e(:<a@s͛7$Iֶ<9 $@ 5 E,G@ Du"k#\qKLJ2N8Q"F/bӏlX2i?@shD7.9:Y@":]vŋ2ǧG.cǎ$_VPwǓJJq8P(H3UBT*4uvb3/*.w(:n>%kDc7ٳK-}mV={Ν;h4c*S @4]WA#G >QmV$ e[w z}bbbTFsK(u {h[k, ah0X,*0/";mBvpB̓}12>DSArspiJxReVk"G@?3 L+nIQ^קo?pxnNNRR\.wrr WՍ\wD!4oQd{ղ%{67,9ywk)V: %4mZp᪕f~D7?ae &7&Nr S1% D'!<<3tZTֽ;z ĿfB0EY;V~>PImוW5Q_P;wF7 DtFTTThhWq*?x3lX!مɇٷƜU9'q/AyDV`n'%yy{QF.ݴoqҎc-}I$ٿ_qܛl7rKzE¢`,WVF^|EEu0 +"@4+Q#W'$O8L6X#xjQKRPi!@4@+@^#x)Q$'$&fZ ׈@ ^%%%VQd2L Y!˲F4H$-x3FGDpu2DC5 PeoT*$aEyBAmՍxFGDƺF&hPV|zp. IDAT5~~~,t3٣Grri@ @ 5eYCF㕹4#ml@h:ebD8(+.V,S7Gtn=֢vC ƺBh4M4 9X#55ugCL4m4_4S#}u@uzrdk9geggĢi?\5 6b7ZE hN.N~!'l՘734w;*<$cHϡ)f m6(CǮ?^{)-?48S=6XЊ)a@s5{V 9֬[-_#'XSFw {?3L_8ySr޵I;uCB_1(KӷM@^cq-,#]!;WMc1DKN^*{rGm&|K4dZ}ҹ-@~ltW7lkI~y?Mkч*.,iK׮㇏uЩ߭ɜڈ=}&"V׿2f޷xVDzF !07;ko;swD4u4?+.á|GXR}#˜]6c>##0½ cn"vG}^IoUN $MOEI7V(7a̔8߶-m|gW>NHN:qK=d.dQ/ H`LNѳwtrz $bqx;ҜkI0(O_>MM%E^2%-eU# 1ʦ[VZ\rACKOȧ4`{Ce 2Z4zUЧF ԍ@^cp!0k4⭛6 {aH: Wx2_qBX NReG!MqsJN&d|UDÖR4[wg/{Tpyd lbگ\&'Wr e!]&.邸>fc>Bԍ:uGpٿS~Q| 4ww/_\bztbw}mwsyGw^F k]z60p{9W/zA>+osw#DKQ90up7-Wv> 3}MXY &k'oJc&vK/~>I R[= zCU#eKYbܱUI hʎ}7HGpMeyuX`1uX_gpƧ1.=abgVJ3.xpy( gïhv{E4&qm5Ȼ҅Dǥ1wPJVVk+Iq[Ez`堁^ϮDN.N\ZDo 4B]ON#;Lstrb9BÞt|i;Y%jX%iDy捱?bhSsm{x&肛(b 6?Xs^J7WW t cPR3zǓ*%qq?ٴuQ( ƙ4L,@B9W-ޜSsC>aW,ͩS9Ϟ勇mysM%h-}tipO7%^&e%4>_>4Uqa+G_rMEGpb?9s9na=\s!v" '$oИvx,>rQ}} 7GT6Հqc:=tV~{)/@qcwo{8V&e]*n#?hܰ r9 oH@^#F pR.Ja# a+/[37wHH'2>S&~'l-\f_ҡ% 6c/~m肵G%8Sqˎ<.+\ֱE}r9Gfu^Bϱ*Fݸ<{7 :d݃?%((}&{@㛃s س̜ڝ6c>[9{̩,3v[u>I۷e4{(t=5CEl;gUW?h( h$ 6BꙞИy7Oغ=c@dKV{<jvĠ1vm-㤭O&0Q1S|Q />][J{)!vmlzP5П -*.;8QԣhFic7pW/u EJF~ _7ptYZ^gt2ϋRފCG>Lptji^;wTڙ:Ot"e,IS9Ԣvas [3=mԻ95Srͩտ4V=‹ DG:s4x>W`%te4քW?cuEt&6 )2/D0@8Zm{a :YR'%\Gۮ>8^* mlɜ ^3%- R\#ݨ×u<&-:pF#q{'U*~񝰛JQOw 'O[H2eѵm%c]ں&7jyNmbsj/ͩS-3vQsjqq#)$*xl Kg edH_^OK9e+L]R:S4QO$od]I n 8d!?h_|=.0 M*HC#V1|t&%A֘_F&<T&2e2Rw!gȹٛnC;!!mTu aA|VDDUE"N D"ư7}iZ.w~-ik>&oeԦZS{$&6-?v3isj ̩]_fN핗aMv?j;2SvnA*.(DrQecH jg<5nHʧ8 H-f*L+6߹D@V,17yʄ[IyXhbٓ| 1'8{m  \<}_&OP(MLN|ZaSd4ky?0Y/>aGdP26yNm5ۮ ֪X5sl#9 ۺKۘCWPϳo'{ fc=g]l=Ԯ ]kM-zk|G'4қأ{omԥ]2R'#ۻ}O+wifWw ]:.qi#U.jnv(x;7.N+λgOmTh\'І طI?[TCywӮ4'E@Q_[Pb JUnl7@ވRy$sNjD\/xG488333;;Gb`L"qE4$EBateOϊf^VY=iGw!@Bu E63Z/ Yn- e2Y_Aq\P$iggg0+, RH$zMP/n*㣪@4L ]GH@5bHZU0/"@Zli%..RܔyԨ] lWMЧZƍͿ|o:СSg^yol2awqM]?77;(#@κ{TP*uԽn~::Z=jݣVAąu`/aH "~Ws{Nxh@]ob\~Ѐ@ 5j@5x0+BB0mWST @^^ރ2B0?7Bn T#uEYywmUR!X; Ki4{ٹH\@B*޻wCB{>j8PEF:qu G,)jœߢ\]]=<<@$111))C8gFNZ-E! C F5 P66*\ͅ9l6]Svxm"@Eʇ@ή'[KZ$IJd2!ǣAVfqo8HڬY3$rYՁ\Db3KK @8Xx M8ǯ R);3LFR)4&R233\NQER֖$IBQ˵͵c|4>0A2ÐL&h4$It:$5L&qL&#77IEE6"FeGVۈDEE$I{i[L_i41aC !Q/|~s+~&4(ըR ժUjDJMX*t:BSN;LD(AQJh2jOZZښ_LϠh*/p7G!{6|˿b/bSkjh4?5.*mA_L'w=Ku?JvPXVcbdUT*%oo|W\Ý/:ΌESQdsg+3m7 ;Rx{cb"fwjҥcqhPCgjAsgщ-)to܎O͖KؤwG7!S0] 4_m5RP(lll*u#jVPT^M?kNpt^>>~G,>gezvT*9no50'_eiPI4p )97't{FSP-]"-*ldg%WuW]}pOw2d7QJ[#D͍Ӿ kژIF ^j)n^>!oK(/TΤշsHMt>|gp"Ɔ9SxIkR*+So!9Đ^;{uj>lF_v嵥b\Fں./VOE߼qeϬɫ~w@yUqBec7}~̉ d$h=DjGh P(ɍR82 \Mߪ RF=gS+|WόLT#r̵ [YMdB*>;꿣90s˷n^?:?QԆuXZ_\,vWv sWZȜKsݥ|̍kGWn­s眰Z̥]cNgͤ3mF|6>GHaI]omD8br7oѕR߂NYM{-qgߩ`UtS 6&K2ռu+ɮc"JڱYi&Uڬc+߷aMtƲ4r?wbevuғij^ȵN1=| 7Eͷsg.}]xȔtyOէsgo.}mM>c=7=JdvhF;w;M36ûnٶgʏ\Smߺu۞>R%jՃGl۲eۮ×d7[:{˖mbs.ٽu˖v:W*FZ4|(ajڸ֔n>ޝM[շ{ 8ϳ״ ݵ*BlבS$Cq/LW#]A܁gQ߄qpMQ:ΟH߁9n;0h8YFRׯիRK=|<gi͛7CTḍFJ5H7j&8FWL6vwaNÿ$ċ4x D)o$Bܢ^1q3[s&V oXŋHWw0vԔlúoGw Ęƣ\ۺ.@gDMߢ1}q%z}޷;8wc? i\9Qb1G .[WO+u(Qp]0M {urQs/Ou踱CBoW PJ8mǎѳ߷r!"=zட \#Ǐ73;lǍzNbl |8>F) DjY1 S)ehyȶx+)JAU~)FG|Ӓ!߶X\s 9fYrc9g a)~k1NaרQlLtx\nX^}$_Ĥ!0:SS"2dD3@IEYzZ" ^nrIF$hЌ,y@)|sՈ(> 9()=hW1`͌i$ڙn\ںN2U/)w6yNlm(飦I844bVcNOe{p⾞|&o{yl5zOxSK!k+BH[*hBܢ\Ձ!%Ò^ƴuyŧ9]Ц!ck_'>/#(/tiͤ!$jE^֚m6ab B.rtm,X[[h ުF_zegkGL/_U7Ƭ9/hn6OmB„"mG BHd D:(ibx^eU;P>~$m5ǸNv458י%׺54J!z"Qx(m`ב dΕ%:N6'B`)^0]T:e4FkgUiݘK_( dYvU!*F'I9LnHYJA᳕}~.$UgH1ASK5mCW-Xo_ްv81nt-"tNSDJX}εf9NSRDSȪc:ۆeSxn^=#Eyj;..i lvjj*FAB(==fW?QI.ot짱2TzqJݳBJͿ]Nb…yZ!MkJ1[\Tu|=e]F8nҼy٥Mk~xIQ0pN6]8d=*@!`]/euڼ;O ;5eRɞRlBpehR3["/̨_kh7={צ+j6?Z0S]TU|юgeWћQeՠO,rm:Lgyb AO]'˿!' * o=zU^X!IvcM9y|ϓL IDAT@s_RvnZHe2h Kˮː|=~LDcZ*W]cp |I.F&|Zq>T23p:2 LW*U|>6Z;jzxD͢h{&yBt۰~9s>Z?^!mPF@k>;TQd-1zҒa[  i>k6!+ MoJZ̢uĔ {ςoviy C}CGn}8nĄKѼ8_oC&˛4ҬVGxpD``ם̮Ǫe=:bKanl3UL%X1ͷڕx%/i ~JEv.@՝= \L+7\HUwz5PӄǶ]DyzXw";aDۖO*".(y*|۩es?77s:DfQSD[E*_U(uF0:N4$BTf%g*I ,&`)! S juBBD"_iB՚#"###=-mv`z{\\]b+M2p읅#*nA$%%y{(JYc+ދ }f;lE]ºbuGddrc$Uwҳ^Q鬟;y y7xl5¥c1{1 w:iش| W^)NV!w?iYt{%K1 .Xf$)N_4pӶe+C(Q0B9G%zUl󺽙 CF*3޸8-GA`LC> =rr #Tc)x<emmT*j5Ipb8nP8%$&ݻWu` {{{s@=:p`v@5͉N<t@G]i4@ `2"HTU'1|>4ijԃaXir8ʌ-s@/uF@#+N)F!)qy0PhNSh4iAެѩeƾ]Ǝw ^R qd?]Y+wsOw9ÑNpoB@@=dq8owNuAC~nݺW=2Ʈ&bI+*yU+ϟ?wssٳ&MBE5]n|"Q|(!N+'kCQm^%?p.t0}p76&iMUiXBȘPoK0/P1רJ۳nw !ABl!C\nRK濳]FLRe<W2ѹVBwwg,FP#ԺE}b{L"ƎSs#!B0/7vEMHa5]Fo!BȽ3,qFLe(U?ævb):#|F5CVtv~Cӟ-O"%iݩ=G85k̅9deQcFvRyz̢{6ř=KϑT20Bq($IWљL&㰬#IR:BM*/敻.S9B jp[I,gJ`@T;#2yMFu3o)rBfMBZ aEa‚l6ՠ>lmDf䢒cJv+I9JZmߪR`;q_Nh/͸chwfC]Wo>Gy{:KZ-q_pl0qłk>8?M{"jT߯>>ƚL??R8K։Xl嚝QE-{l'G#P[JBQJhz?ȴ#8E"h*6mqwԞ=1N#.7v7]D?ֲJlv 6`j0#3"X4rN[T) @R?|D b~~ߟ9scm 5$i [C>Djޟn4!*ղKEÿDTJoȨ?o؄ :B:}Gy{|Q]Ñh"i}|zO^W:S$]6W؈%G2>poNa4{f}ғ]F6oHWrH#aRm1 ʟ7o@h4Udʕm7ݍݐskbW탊mh*xt攜Cr l5('(|¯4U5q_FLh䣣 x!p~8Y bжw sՙWZK"v=w#+7~"⼹'\~iX3k,U3Q272be>+OEEZdIL\>2#]ϔ=;Ql*M(+FqU.,3ѱ1_;GHR6mCd}$6^o޼y3$W۾&T 'G>2Ӄ]Zs6|׎,h}g7jSM x?)iF QTWyUC8SMk޼(s9n0al j&8FrW7cZWpo3QSi Qx8ϳ ݵJٮ#I84/LW#>kbE1ZJ]R bLT<BYLzFAN-ZhR G1!]A܁gQ{qpMQk/p"]m?%xc:D?z8uF]F1QWqa={uJBג|NMQTd0&hbR!,=K-'!RZPlU_J QVv²\s!2Ow]}FF!c ˲@(a*b mBW.\Ǒa7 ͬ,MT5(U!D*2 c<8g &/ P )DQAO?JGn̉c\MzLg:b>UXHt2ΤQ5B*[E8񨢄B#R'Kɒ-ͦJ4QhWsg{~>.qM)%I4RCc48>x(mó]4NY 6 )uQĢ$%әhHFP$ш)5"uv 0tc֪͛;מNQ0If Z:crvDe!D왳k Nww. ;maù"!*ilTrT{6^HSw Uht8_õQ.66Ϝ0oQ ̿})61OKa8ǂǢUYHS)WmCnۖO., .03g׆ i*6qܮ?ʅ IZ//(nd $oUlQ`mޒ"Mm(/~۾>-%..^mGbgؾ]\Z z0}"/fӌ>%֡#H.Ux H!YF'rBAp5\= ?4op&( FE1'#8Zu ݶ{m:jgp%kG3O 9nՉD!V~nѳbntәM`#D #<82(0|uccȜ0oQb&j~^~]' ]:ɝm&S҆h" !~A&LϤۆj.}ǵvA"ok~LjB3++ϾR.?j~#\{ѥ!qi jbrqFZzF?}v._$%=<>ei ^$#HNN+,,T N/7*WF.Wh] "))WT2ZVF(/`{ Q ;{ݽB)Œ.&ᰯ_qsTݩzB-;yr u$'y[VuP&ߝ۾YKB _/9ޙ{W&_<2؁n,`gnԘ ' vЎ|z&keWXݞa<?&;:HFFzrrJ&58 HMM`Xp<%9ɠ.(0j< #99ÎQ&L9&uL90<[=Nfۏ m\6l53vtULPw+ qOer'<.3D n+qwbW9 Y2zn׿2JMH w̒#~j!|&SN T#P=8 KKϞ=#u?O\pIhe%nd?v֋B6"Ï2KIJNIJ?3J?Qs hN P\PVͿ,Vz۾}Uywߢڭsd T#`4M d2"HRU#1l>p`xl凼V jm+.0"{Wq9?8!s_la+3۱p/ݪX2tycY\@d1o%ψ,11FL0 rnU @/_ݼ+Ѳ >_(5kApr!i$f?Y8_|!XMN۸u|hBe#7/eT4fWV>/P[jGP0#FT> ;3]_J7ðD7)&`ڀ0E@P=kP=kP=k?%F k?%F k~߽}[sɫϦ)IZ/;]φ\%֡#HVQI95n3FU.U.GMG%xCZʖT-5K>Yu ?4r؝w Ëν6|D b~~ߟ9sQ)Ө!)O+D-mн "K2noܩ\IG Z6LËVYvI(UV̦S.yF`ivn2'SYښrqϲ7.? ONv񏅱C\ !*GojGS׷t⯦8?m*FQR-[DZT.a#MRRF8q IDATpx~^G.;.^r.c=}|Xz2SSC 4hSrnN ?N{xJe!D6kPOP_ei@:w 7}[2oe-yC7$ܚչCbkJ6Qje_ʾ$Β&oZJ-6೒ܛa2 S}e؂v WbϦMե-W.:qͻ&s˕!kj11jʯPInybYYuyBf/})W0Q6;HQ"3C`i9w"{s/mx{Ug@˽4/bkʺs_zrdiOr>#=aݞ=w~] B1e홞,i_{ BH=qS˜q[Ϛ,N/gbܲEW|7 BgތpF:xe5x݅7#mږ'^d̊.4(|Қȗi\IѬ},sF53խ/+ͨ)]4NB{ {xqkjɌʓخ#I84/LW#>kbE1ZJ]R b uqFM6F‰tq 8T/SR(H:ߩE tMշ&&5ńM_}wD#BBQbc=:#®Qؘ訫ܰ:Q%!kIECatM(D*2de[41Ȑc%QX)O-(|_/%b(+O ?2^/DW;oQ[e={[.Y;ybVxqN$*[vsm!]hDA n)FOaD 6IUAD [Sα]|.k;kD9м4__IxCN*^XMַJ Fm[yu ,5%!DDrr_aaZNHHH$tza0rBUjAIII>JЖݲ2oFy;8V`0XlZNMRq}>d81nn;UYPhst Q!p^u]YŒV`w{&mV7xX  )Mx, "55Ãf[XX_cmCd&nXgP{ʻ0$پF]Q:6uuvul<`ޅl!MعdAφ鯇y1fn.qxDrl MV_*9f-4Ikv*XHs}}}ZJ]\<;vSE0 a<.I|ȊUe02I|D"1(fkb]6co6V4YQG,ay[|}3h^D֍s{`^2& !:ˣ .rPKH}t^0Z$P1pB 5kRu'ϟ?olX up@yq4K[[1B|=hhMs.lj;MZSWλ&F ݰ [ pz-si@{T#o!as8%$&݋:O/1l;̛>Ծ-i7dB1V#;I560D0瘩Jsɻs6FPFh%D*f|`\;xt㖵v:+Cai؂?~%a#PAඒb #X+,/Op4Odn2]95lu=exD*^(07'&4"9 rnU @/ [9doҳ}y:;1BHp$Be d[!KSsq0 HŔ( &I (u\.%RȲp@=ޡڑV HvNGP/ +RLv_M+ʽkfU޶/w_zU UpMuo'6y.eTg~uɰ$#g:ku6/^{C@[@d_^ynD&^qƦa ]^j̲O Db6Mriʂ "߱eo\~A!" c-‡V n2'SYzt%V"Sfڿ웍I*h.@5|Ko̞%b{ _u;Xpmg%#:77@4߲} v;9rʡ_'ݼk2 >.m\fd*2M wY8+oX&.n,H i̪&:k>F̍'gV:tΈ0a0em(œmyZ05_N .4M-"aAK s \rA>>f;|E-ێ-&:ȇ5ԊX( EuQJI.FS|`^G Zmkk+ (099,Nk?%|/ITr\.S(L~xx &n4h^UWTcC&ڑ$T(-QGPt: k._$%=<>el*( <(=5/S؞18o%ԿoJiiii7U;g_mMHOMwr؎h i$AdaaHѨ)DѨ6"Qaa!Iw6mKIq2s6?7KeTM12v 5 !)_ytq;~ǰ9M- _&}c9;ŠN~oyE:\вG4.lsit =Ҹ om@;uCVQ_VzEQ*JR: QOZZښ_LϠh*k1o%ja?{>Ǯ9fȾk7.ީŘ}'WP -k$̶ژQ&-[=6G?8}q}YI粪c wgyVB i~*z&¿7wgΜ:u$B%mHyZ!&jaS|DjH*/s.M\?Ͱ jpsH9 #йlkYM&qou}h"ÏG7kpهUd`k@5ohB4UeKH مXyG_Ȩ[ 6a='>7D?oСϾіR3 &on''1y"貱|}F.9dl6ّw7(|4f??oxw?o~lKӔXyvT:ʥ CnHι5)˻sA1VAMƞzzXz*SNޜssR_/Qjg0v;Էdr)Kp~JrBOF~0R$%$%$=8U4v>}w<<dhVtJy1-|ta/23.wp0(K8A zWyE̽?ôᑗ_=՝U3"}a'?r|$aq}V:ɚo7'HдqX)Mxm|3ͨÓ\Y+)|+GEWrX-88zr7ѶyE4]}ɩoQz9 Fx/^tuŊ1j.vW{i:7ֽСX5#(*yxǏxӦ5o Q\IpN}l5rfx  \[7 xf3rJw6!4"}M]8ϳ ݵ'rNWwhnai.HWSFb"˔7 wjBP< v1%L¡1DG|^~># 8ƣ0}iE1ZJmʶMaT;k.2]./Z5f'TY1O1%V>)~۟Zncao\`mƥ4E嵑'fHHi ?76if4YsNSt`СxI4"D!u-6&:é3"5 ٫UҼ[h!Ρ: fTML*2䘥gI%!DS / D|dŸ#r̲IA%h)nbq}? iof igBt,ABk2HJx>USF!t7ѶB.‘&[vBOƓ3R^34:SLAR<8ߦ#[A6~G4"D!d%z4FHq)6ݤy~# +X0Ee$E?L8肖.X扸\&Q)h~ {|v_c*ٳ:p}dBgNvt۰U?W7{mg~nj4o7u!ސ3-FE?Mg>#S ViI Ƞ1b3|c@kJfe2`6}[XӒݶ˻Q4˶#ߝxOϣ)! S juBBD" ޕZ-د A$%%*JB[v?HlX! `ٱ7+PvM2h7̀dq9c$Uwҳ^Phݩ.cc*dk>Mve]KZ*YSnnnb3dd''4iY T6maaaTHmxrr0Pގbx(B4HNNqXo hXdkua}/l^lG&>rL@55X8.B 7kRu'Ϟ?oy\033=!aDTQĵulm굵j]hnjѪhkA(MHB;$!.E'ÙsΜL9sF$AwLO-vx@_#@q\OO/ ne^δÓBӁŦqUDLP"D:=p(|oھ0^i؈ޗm=2c3doډk_;$6}uځ0amS"&7?Dm8. Y,N. AGcS_0|ﵒ8/z5gE~EI[ CTܟv LhÃk_{mK^fsK ft#˥[U0x|ʺ,1>2޵7nKag숷BF.zLddsN$#<X]Jv, R//*.GzImʂ|yAdA_#){Tra1-Mg*5Ku7B&ğ l'{n8@x [\C!Ӄ#3'nޑh~/'*DN5}4e0#ihFr3`~nE?ޘ*C 1x|) B:{֝='nܐ!xݾ+^p@/6Ԭ䏸kBlR랽bďUs烦id0'cXAPD$]\\h0 ѣ26`':C Ɨ:d4TΝL&Fc=1Ϸͽig'd0h=q@ klkjd2Ukj)rvvQUtCyq0& j|L&Rd0iD2NNJd2=}E?NFq_Qk~JGӴN34E#Yy]Nq ht4M?MؑAC=}5ESV}GiޙM& =|7+FvQՐȐv@T!*s˒F IDAT4WT'ȪsS}$bX"}OΨB雗ĆuIdCg8,uyFz;Dm,)V8 F]k}|eT-H%!7dVQB`wE-XY2@~Gk|_?=Ee}.P5Rż5t){9nߟZ>r2NdwơΕ ${/9׮6eƧr[."Ϋ}T/&BqܺVS46BTE }]a6^Odۨotk|~qznn11m-k,qb[ *+Ku:*",LΜM>R=B4LioRR)O7UlqƇ'p_|% y jK8qzS~8~j˄}7ڐbZ4'_9|*##"Vp=rUR깴?}F{ pY M=|%֗$W_yH̡E̾إE$~rxؖ Cl:)WNUGJ}/bW#h=_oV.cwv|'4^yQKsf.dG` 4OZsE#|88өϫ#BR\qY`(A.Hk(e枛N3%N}fb}mL ubF:`i!5*~dCkUja jM w׮"}&]-&=\L v~4#*7d{ tQSu &C5u#I;6dUqv Cs8h(sٚ:pQ)vn>U[Af5g oWQg4f8BkrG6,Q? ŎkCK9B$BʿOeܮ0piPV~/_4"DU߹6 *۴r #B(yv1ӤD^pRڄIu;y{c]3}eLժ9+~ +M߼xѩ6; X Fx"IǪ@b4i'GWgϳ y\)36NC\=Ȉg.xOGiV ˈ3bӌfoQ]#B8llw>`UGnk)[cjU~A?^<J!S䂡& p/or`wldFaGVlIq2s΅}K}=u;zm]Lueۣeb_Hܷblʹ&bů m$n#-?}ixzE l1XT7_$p&} %?J9B$I 22BTb7WUOΨB雗ĆuIdCg8,ސ_D*!jV#DUenY2wT"d FK,򏯎kh.u:+~ UqaEֈ]ܟ]RT\RT\RTs|&JKμ#⒢k„2_;yc-~‚ _ -J2r֌G-5:Z[o5k;[lMM6_L,0'~pHl']xc߬Tx !6*QYs霘`&B;t~0 Q#}koIhx2%fkag*!D>cSi2ceb2C ]J*mtEWNUG\isX_N·xB^Q#hucCH.荡DLNX>kbCS{|e~2.6,fb6j. ߤ7!hȺ{ȤN1 ^7{t1An.ь ߐ/Ѱ j&pnth__S7[y㸗6Е~W`gmf?`ϕ|yA F2LZ"|Z]ir .fyFdR릶fJ8>#I*~oF(gc=+p[cd2jtroשEtյ]萱^.FSW#zZf`,אI'8=Q#|k$\E[iC4ǒr۔ߌt&,X>WT Ѻ͋ XQt[,Eo V$NK8|DmBȤ=I1ѐQ i$j/$[ z d}=~Z1Ǔ#IR׻# 4awB!nY4Xl6MKKYߵzFk469IChYОy*).t x$Bcgg8=5yh2T*_?j4Ve~*4@X=XmMRLjHry)u$3)s.EąH8BD^]yխgq8z L˿) \.V݇ ugaw.T "c|?Og*tѯOtD'NEL:{GP2Uˑ݅7 FeY㽬s9% #w{`_?!.VnCI2\.Vnݣ(ӏ3f݌ԬJ=܃ iO.@_#7F[_P=;̧HJR_1v1m#;.vacE.m܌WbV_OSSVʳ5æ~u/G0pWgϊpsLp8=s+sΎkOZ̧1ã+C̞5eWd˲6XИWfϚv/DfY_S1_zyc13^Y{=?I={S3$fϝ;sP/.cV}dE%a]dY@Й+kl_)vK$R4x UTRic^[y nS4>A2fUeށRT+*Óe$|e9RC"&#=;o߶uDgwd8˱So ]|KUpō3}|8{դL=v3 |ؑc;ؗ.REi!ϞLz0V׿`:JŽljj0@Z)e†àjFJi-wtzʓ#L XB&m(S* Z?2?ݨN@kMU]?}%IPhgڠTyHǬ ÄgH*Շ/$+&rcy~qZ/Q&L簾ISԃk{/x(r@!D !0GOwſ+B4}TZ"-dgkbh1&SrMMA WȇT^(W^v=,P"b]W+Iڤ{}d߸;&,&ۧ6h. db|;Q ԩ=dRIe =֙Lu{|e~2.6f BsptaΏfD}o ƧBmJdaygq*z`yB4n|os4rPrTr7"ԁŖGGkR)y.#{KfQzvM9lD8[4()k.R[z D {.fyFKܽ`j®>nRÍC4XÐo&8>#цW1o~H`2QD B!.c/LMB&R) akb9^bfߞ5DD'2O1س2YYϐaq!b|oZOqg ۹g2{n2ޮSfzv#Uv]Cjt1wrEiRƙLtcLZppi7nm2EJ|P|ѻKIsdԕo~!qދYe7>s@{WA"H$L>եsgȽ.^ƖW_Aig0n-[zqBlɿf[zdi3 jq\O// 233'rtCi@؞8. YLNWm=1\..OC 5э\.Cv5a/ F!Fhoj@{&PFZV}dE%a]dY@Й+k m_)vK$R4x UTRic^[y GM5I_7_Oд*d_}RƝsS}$b[mV'uB>Q Њ]]_P!-KJҀ^Q,#a@xI_#4vmyE׎}~y{K? kl+44ZXXqq^n('R,ak%E%ygKNIQqIѵ}B 9sܺVST"cen!誌e󾫜5#05s{R/k4'~pHl']xc߬TxzBmT*I1/\mJ/VPe>'ȫFIBƊltNL!B:jb?GQ#%}G/v)+&r2h_\vR]kY䉱%3xFƻǶ<]PsNg:|7'.)؟5^Vmh. ߤ!hj*RI%b\%"6hϋc|3ե) P`1֙!9N7_yX|'Հ7ya4]QA!c_a@"i$I$Vg}5דOK4M!E,H~y^ס7vԚ+Ԗn.|yA F2l![k3oXX&[גޓZV_4$IjZPgN(j$ >)kNKQC8{N762֫udyyO?0(J+?iTk-A8E, 7l%0kȤB M&J5ZFj|OR"4K IDAT&4Pj1UD4}E~*l&x"IM;*) #GN< w:[HYVvz]K%jB&I tH%FST.n&Z%WVKQZJ׈G5!VmVXDmt凶'dE/iU)AT%b/zݸ)Au*JG.%eza'VrXn" Ϭ3ԕo~!qދYe7v+SڔdR*;wVkid7Awvr߶#~5/0yex0,ؿ^*ml7 xX~K^[Z9}uB-ٌX~Kϖ,m|&VB,Ys۰)klS4Mt:HS4׃W!htoMK%ضm]Y63&}ރRYP@{})|DJ_Z޲eKee%Ù0alꢿR; =۞ {o>xس0E!^f)xYCm,:ng7-v4\ \?@,ō1?'&\߿?2Is(".DB%ϫc͌Wt4AkP@&fR^HqPzvp>dX; fvJKfy:TX~}#:q*Rf*Ա0.h>t2t @TuivBҕ^>}Wg0m+x"1%΃Q#xB>zXee])V6S=;LDJR_zo7E.8BXK7ciyaʳ5=GM#0p!Lm#g ӫ~"+L>ͻPl!EF4T(RKYYY󿈦ϥq81cFmԐg!d,sώ۷m}ѺY8!}Y8r[BRupō3}|8{դL=v3 |ؑc;ؗ.REiS ).10i&[^ 0k|NA#B4B9991߸q=jݧwt]JK0B,1]O]sC1eTwRƚK8Bg`4I%d7fWH›jZ9k4bs̕HXJp#dV5D6A4TTTj?v,4sL&ϿwhF-ƍ8ś@+6pvmҹf6 KꢔxhEƁa*K+RZ3%,!+' Gz1(`\!퐨UEQ7׮qh z^B!Ȋ-d]/<~grƙ8γsKL&k:@לMk2>J۲rWJ%0bA~rMMBish^sF*~Wa{TendzQs@檱`[=ҼȺUִ>;pyejͷڀQJ].7e:`SЈP8zhPh4321 //4Bԭ"+w BQ]^iBxt^;BO!DG*Bv&&c8**0(}zBmY HT}/|)Omh?pvqa~#r텆%Y;|d[!D)3>@8{[z^Qc%3ovk `|u^, Ǝ6!p'N IbEEEi+P#'23.$%*t49yw sf"q%F.ڛ!9Ul )1Γ9 ٷOhB8Wz QиcÏ0["y~C+Τܙ]YUoFs'B9bgOQю3 '~pH'L; o ^ a1/\~Ԍ/N&YkQO?@!$ž`[m*Xm~D CGy[!mvn Hfe}Ck (z{hƭܕh;jЈBvveg_ bE2 1e160RQWBBgؚ!pWY\>Ulz5~Ãg+ M5Y+Yu&+&rŝLy0&>/FR>̯y^#Ij(՟,אI'8=4^=-U-KjRgs0V^ޥL<<<===\.4P|,EM&}G6}eL9+떎""KmSK 18!=_{h/q ZʽVM v$Ea󞔃Z1zy_W/Ձs]~z6+lXExP1:XT')<bƤʹð'nJp^CQcǁP(d2YNNN:]+sp8\@r4hsnKzx}'bů ?|Ya";A\7O$!p)p>VOE!vV~h䔵E!aG~ol βz Bۗ:V@])Rq5[y3-WԲ?izl%!3-`rIryAddRyyy2hS֧Qk4\'xZ4Mӭ 0 xy켽&z'Du\ܷ׫[+L(fv3L-*_9En]fIQqIޙw;yDSRT\Rtm_jN W6$}Y6oHmGֵrϞ"}M+26^94mP> JMo؄`is5vX4M$V[$L!m:c0GY QQюrB $9ol}󛕗4tp);8[AY-PkQO2!ȉ!/ {8A=|[nHmGq}gI;Bn.D4dZr`WY犲7}dz:ؾ9VwWK;3<$IV+, "VKt8m::\aϹwdդSUQld|cP5L}f_RRe^<:k*.{J3 u~ Q76oHmG!ĖC taC7.zLd=ۚdRT~~|>_h4VkT*M:6kTN)6̖RN!J:$.KxEDR MPbhi~2?߮cv bk-i~s5v@*d2Ukj)rqqU`@8X&p~+o}tݜn|fIV<X]JvԘf7QcGc2Jmˠ;;9)ghR^޿=͉w{6ew?%UOzժFOXtZzo'Q' d9 iWUu+_1`\kxtnAl@[ !$Rd2dN}Fc0@̓ I2??Aoh`ΝKkv7rw .V݇  r]+!4l *ݍ<ƃL B򙴜d_U50~; Ɗ܌Wt4Ak`@&<nQGs9% #w{@_?!LvRH"u?eסZW]D PQN٬J=܃ iV6r}}-غ^k469?͎;W1Xlcno!p-___CEOp$YXXpg@>/3MT3>iB7;T]GUF#-^8?nq3ܻ|"B$ei"N]dH+O7y/'2&qUx^euu)oufc&[g4ǤQ8ā-:{B?B()QBOtױ!|P 5L2|Z;TJ O|i` \~^1#m˶ =qGDnv'_''l{WVk6SOpg0ONm,t?' Y%t-l]3{9}8 0֮آMrRo[GbG`_H]s!Ϟ<Ƃ&`@F)e†U߃[G>8|[1 <g׈39 !pI !PGl'c'ʀNu! u`BQӗۿ3>ez,2Tu` 7YJVWXy3=5ڈEަO8rڇI6RqlgN>wsX)woRy\Y>&Z6U}NE0IF[<{41l-&4tĹ!ԩifX"ib,'$btW!2Xq& ̪J2hB齩|GΑ֋cP?N;_`_w]8˺6˹C?*H_M3P$3lD8[4(@_#70Ny44d93d^w`\!퐨UEQ7׮qh z^B!Ȋ-d]/<~grƙ8γsKL&k:@לMk2>J۲rWJ%0bA~rMMBish^F$k Dtx!_ۗe)ZTn UO6~GlGiϑn"J۪:UBz>4S۟f'>yy%A\.ŤѦțdSRO;ƫ&Z}%|eg,6۾,Jiܖ>,=ű1Ջِ6V{qq]Z3ETeG1g ]cnN^Yn\Zyzz7Ԥqffc2NdwơΕ ${-`?:vTOM6.+LYv5) x<ލ9jp*zua0t m:c0GrۨhGUf!Cqv|Ձ76lKUMƏ`L oR㋳7Z~LrbaK^lB_ mT"3 Dx1o=|[mPƗA"H(%'5Q׍7. IDATE"t7M5Y+9_%+&rrg#S#e37Lk ]J*5h_\v[,0U\<( toO\+SOo[ EYkk\. [yy23'rtCiS{8!p{fKY H: z'_3Tb~%C5Ԙ4tVlbyzzmNmlǎ.h3L~\sG[-:|dǺ~W(ݼM3( QqPdtVp8\@r4h&pސ~&.Kܽ`j®>fs=DC"Q TUΠTpaFw4I#CyhuքO8'4ޢ'׈x͈ň6y][&ͤbc/3BtV3^zo+5s\BB$^$L!djjUS}Oǐ*{7"{59QD:Ƃ/| jm$Id333^X.MN٣A{*W 5y]4FM[x5FOry-(KX8vw6 nX0p⟃:BiѥȑY9 D$r2-zMkꀯ*>w?OrR|6Yᄓ݌()q8> 5YYO|9jeT(tuu֞բPӌhbUk]H.V![$gm!;we;t;!IJXv0뿡N,M9;rBHm>c]8-Pk5]jCuIrJ.ňظ GOÀv}}S03336MP"+/svl6̬XޢӗJ {L臗EH-},uޙ",kgFTU(Nֽ}R?;<7#gkmԻt; zS| Qnދyw"/$f) @B->09`Qy7ltuuYLf;x++**.\SN+~b2lv;z[jI܄/<\sYs$nB71 |y.ir8|ꩼzg&8TKu-bSm4jl¶tuqqTw'jeQJxzQc[$^7wg>>æ,v6й3wfk76R?/Y  .[kC⥏b>zСȓ1jqd28uZGRDODW8 _%]NQ0eH7vNllnEkn#H2^ A&&& 166h~uڠw2;MEZ{j:yD̋کHizD":Nmg9ᆓؘIvM۶i.K` sנLoBQ?+r4cu7HS>_oPBH[7pzԾcx v˂xjOJ9 +z8oG߱۳uKw;nh&Grw>T&Z>yאi!j|q<~^6,#"Lݧ5!DTd =ӳi?V|`H] :1*ۦ8l(UJATV*E"Q]ܠ[#sU !JpDVY8?a*P+jn.Mڶ#hڶTs>v]F!w2 B'DK|-uQc])az^tq(lʞKq׎rNIUd'{rJ5fK,:a/Url?/%@vYkдKnFN/ZyFW.}xѥ=_yR^ύpL\lR?\-Ti|I6{#)zIrsq7F廓!D\O5:6ſ/X)BU,!X6@aQVz8 Pw77&)qlWϟk4v|s,KH- =CNJ§;][}d.^zaݳ#87&ms8gP !R/"r\l}yD:|>"C( ӈ{GLlˢ"VKGxF<{1!IJ1̈́NyI;̚Tr$ˈA|&1{NYzMYUGU+gͱ![xZ z/B,c] hbx7G@G=*B'Qr0pT :9|'XH@JU] FaPV[H{0T*-C2+++*'a4S@]#nō<60^{AS2ѮK}۶įeش2sbT{3QcFaȊ _?QclR=Oc3(! MgUJToe~Ǫ]#>aTk kNǾ._? Sd%4Z+%ԕ w5Y0* #Bξ WR)ת ǣS֠aTiT" AiU$ICt \G")0ή/-:^#[=vQUУ!T ߙPQ6R%84JS9t~sB!%ǗvOcur_qWr z7v~lyቴ+ |ypI En!%ie"T%Ef'Vk;CR]PT8;9kW'MBy<:6=<@D ַx벝$8BD.`uЮy^txs6:4cjJECBxW{bJ/5IR/s9IĨ,[FnZ"h6U]p_ OROdgd4b}Żw""*%xi¡uaw ij̨5:::zFI#!!hǷ˿߯D6lz?I1xx9i2~he,?~Œms?n>?yNؑS%{8clȐGQ[{뾲emkHã}}WzQMI_&QgW+(H}n8,dzOas6yߍuIr۾}ٙdILȸstqپ߁Fhm\QBgYYR 4ZVҚ42L@76⥋E-,,/)){ovԩ޼okS{+zw 2ڗnJ {;uJv(Vw%b6o-ikkᄃV(??O$988]bood2ꦇFZ;ulRC]#65ڑ$)-ԩs~}$v?1 j~4y_@gʋE8B-^A t-&%#U/9<~Gf L~us7< y|C!QxA`UqIowy\>By{9y\>iH9ws=m>%^'8н'tp05tNU x~~Qg 6i#h4zmÝR+uͱұ֜XcfF#ږdo8jg] 5҄島O;wfMxްoT8/_K?ݗBqқ7q^^Nʉ4Wχ aIGykK;Zu_/K?_'|q^^Ɵi^]X$qITR873!bi/R B(KX8s<2:Zsԃ#E;W?'}튋4!߂oc4V  U/u["f>Q#BQID;( eeA0A Ey;{ZQ]p1#Dظ ۸}`1E1RF>kG900Deܿa<[J|<3 2vxլH9!qv?f>!7!ʏ\q]hi]~6ޕ֭tg\~/^)W3>FyU&Nx-PОX Tj B__OG4utS^-+۴0ȷgnvfT:v7Ϛ4νcGjec%up+/Mn$9Fbuo7/_M3EVX֎؉;O}]t/MZNd[g⯾1̢;1] ?ٕQ#d2pڜxtbjRqiɫw$|"U7?iHU6Dx:wA@ɮ瞍ͣ-gB:ϝC>W`iHPRu3@88|QR ݄H)Szq }dΥYv:o-` U [Nk/m֠ ~Z+jh>QHkMZ9BR(=z fCbBH'QGRD9yy~jSqDյ%eoΆIJ3\wۄ6#ƚ7[(;G!ʲb B]w%>y$BT5z,<CU$i}$UQXģ ;Y[ 8+mf5j^ _A G,T!*G/HY@rENq8yT"q!픔$VXvwqtvLHĂP7xvNɛ!F#̞GļP׉P#Iu꧰;MEZ{ew K5E+iҔ?t Zbk&}f:=VFȻcM^DAkR2 %n& i!C R5Bibdw޹6ոkc]{!KɃ+Xᬕ}V,qE$ 3ʵQ?)4@aFȩ{ΏqXM~/4xkdns㱚 ^JRwD - 5!R/"r\l}yD:B4Q1ul/6r-KT n$Kݿ;[@Q|&lxɁy|[5(.qF.0ײ:jiOd Pu|szG4a;NwM[?Uv1e/9eC3!D1 9( v:noMk6wW  hZ`7Y9C@kuFx75A]#6Яs%ii2($+GEnFFFU_zL?=`'~R~h==m!T[lØTDѷկ[uǫVT} l__owׯkIoDC%m:x1Y%c21.ݐ&~B%1|1x͈OwNQ#H${fff<\&ܳGTO_Ȱ{2G`xugj~&> z_5iםρ&U1aߨeɿ>"u"Q6p~?l:ba,?'tx۔Τ4am 'QdOSq*{Tu7 jFV>oandk+ ]]ݬ'=zr3,ķ *{?:ϟj{g^mJGH%>Qy^svxyݠjubiQ#W,} !DzLwtg6$9C%XbDGql܆hwjNbxЯ뛂l*^6mffak~H+Y\B)ѷ%'T!Uf>V0_QAw_yY"=4-:Fj'kJ):^w ]։W~)BbV@-1@>:oߘMycuuuYLfXL&ngjgn ~X^JNg+s+_\SeFHxLwM@IsϪM&:/¥WBhg+uSz}߯O*BH(#]TOotb$?VMqu,JTImVT=/oU_}j7k-Ag"E:yԅbTBXר {c5Е.:,ǒ4}v*Y!R炼&İ1L|Xl}$UQXģ T2E#e?@x}e%L٤L\?Bey F6M薦I8(BaL#/$eң bV9T{T@VLSnOl:w+ک Eƒ2'p T'43LZi_N;̳ }ڠ@:cx,D1pc=8}h{_s)I}>_ IDAT~];u27Q(OQm1iB,j/}S\G=yQ;)MH$]wAT6_(_ZKe9Sȩ 0w Z8ʤff%]*mw~P{ ^1@;Qu2t_OϾCx2[A"mQW5ʵu&0XɃ}gQ-!4qGxx\VI ?W}9ĻO~Ay?CDyZiCBm5 >" oX>^{q >CړB57j,*&; (tւIA!4":|4fV!8(?#p8tUu$^8Cw,FDl߷KˌuaV-3QCaϹ3vM+Q#DT]ڱ&A/`N4iʟ\:-mceDF'jDu[ccP]_ɞ=i$jӹg)%&Tᘸبv [Zeͮ9B^/ݺ_aEEVf|Rއy֯< )!MK"#y5*t|G]=j̞~Ytx_;^7 *eaA-I).,Sԫ{0e(gI7ڭՒ,qtryиCo HNǃf]rhGZ9$c|vqz)!%x®Wۭ>y`2B4Q1ul/6r-K9DEC]\똭6hSձ ޒ Fi9Dea%Ʋ`RB q{؉-ʔ)slǦ"0l~߈N?]IbNb@| '+[-p Ok:E}!<' }_x$ c'O9ie >=,q|UzUGU+gͱYaM#!BH"ΘfBpLr_ԝWq42mNH75߃Gn?%Ùfn}{0Del!Ķv0.e1BjْE|..d>Wh:5/_03cwf\͖u75H7N޽o߾x IwB n$5f ~@\XØG#Ѝ5+NB7߾:)Ba8.6h5^{AGF59gۙ9 >ͺK7ċXݡQcFa3IEaqHk}J#s%e|~&% ǣB[Fc3(!%tG2IE_B#eRH]p|4r _Nzc(t@ڧ"CZӱK&rqy \e)Bub MgUJ(&)q#MuAFQ}jL]0uitqGք6g*EBN2tjOBL*}!>b5I^^;ryFFӳ}5ĀQgj䩿Lj@?lA#L<~P>oK\`ꏻ{l8ÔEژ6R%84JS@3ݪߜ~sHuI߬2;6WD{uլ֋t.,S;a.lfrdٝ$M&@g0LF>#5I aEBFhm_c b،_qx\c\Bӿ(޽)QY(UkbbRP4./!1͘RK>"Ĉ^r7rk䍑i;IuA0Ű.l?D!qi~FLAExSjB4Htj uiFi%1K ŽdQD+h ;t`3߿}2jPFMu-zMۋιC-XfI!̸me;~]J4w5<_,Ii~Fv<-u#h&^sXP>f>$w)B(FL׏AUx#,$4H膂>}eDM']u3P0W72n+I0u`Sb{:dǝ3]DЩ.iÚS6*n_+^A4]#f{6$e~>>9vveɿѝD 5\z%?-@6xSJnKCX,Wq<'GYVVT*B!V/I#T* >|Jn9h46#4=pԩSսy3'/i7f'*/kӘ딜Prhݕ ])}oL[[[_'By"={{{&W7=5 kG38^VhoKz@ kqq]I;s<.keanՎS<-^\s.' \ޙ,%ReorJ"" ޑv \|ۯT_ǎFh$q R.PxV,*B{HfDJªR~sWЯк]+}}C#n"U e"/bJ|0fɷ*Qv(;G!;*zU\wѮ>SIpNBgQ֞Y;ո{gG9[~;`poU֬Z'kłWD2 B8#\_5yG5Fhh~%v D3z״\)4B4$Iaph0DҪokzJDQ( IXB$IkTeorJ"U/n%%{wX"p>cW^,µr͹N+yq1㜹|ϵ0J<.A%{; yBSCNT5Y7d)Qw@ѹOeĻ7X@{ h0 $6$Ij>瞟`]HJ& >pE4%.VΰouCFO^qؖT[F'mK}e kgsxx+RspBzȦHui#뗍.R !a"B$"a6$qwZ_#i:%*#:BTېѽUjuqyrqTG8Y~.F4´z.GBJwfэ}_z%(IP("I" ,muV<BK5b~m)NE7użMM ҴNkJ):^{0S{aw MVnL>4jDQ(9TX`iˏP#Q>~[_k0O'vOOcd'[ˢDU $nB;[Ю"UnBc@)\zӢFEqz4z*Qv`_VjG)x@o `-7O# ?H86ǡaoV-]VS1n)J^&Y=PUle}$E#e?@ȨZ*Ɋ(,QEӎʲf2qUX](S0:TEM(Y0w͂7R@DHM$0XBPAgcN]dsmåoa sנLoҍ4!t5jM0{B]G$;41ۊJAy/8oԈ!m7zh6 Dl!;5R&52Bfz(YYgūݱ,'6웙G 6n$T*eJM11m|ҦF$q\\A! C_4Eڹ<`6nرN.L .9#)Q =CNJ§;][}d٦H;։':{N%f6>N6m:X^wYrE9!srD^^eeeJ2++K(hzg$Tl A0@[4Яx-FxkKw.ΩiZŋksCߗW?w m0i=<ؕ Q9(\>ZY[Ty{Ɣ+zR;&Z=VH9ws=m>v) j"uDYge[瑹.pњ R FeR^5Ӌve~l79nj@Q'8/_/]LHiYJ'df;yf>Ϯq4]/κ_yciѥȑ< 2DI®{,'#:Bɻ~_;'W.Ip\#LXK~=f'Fh-Qרʏ\q]hi]~6ޕ֭'tg\\\ognd;oG҃?(yu2Q$g3\Q96nCF6}sDzH>@i qDŽx{N9!qv?f>!7U D@]ޙ",鵡^z3=EH-}ZnLYLW~)BbVL;YeHܾn܌mu)IXOmB} $hj9NSV5j59p>i>KH'M2߯pHgn:RS aUc9 en?ؽwڷT\as? 4GfۓRr.bsxV,*B{HfDO=FU*^^+BL"y9hTmQ86MFeYIX#SU{Q3!,Ѩ5.o2f֦-Re7.˜A 7ZHUaJԏVq}n6G+#sd57òb ҧ"'-~a>Qdr'ggZUZZ6GW~F5O*Q{\G=y1fMU#5)MH$]P14!tցk=>]U䜈WԁChӎ1]9f꽢FQM<;,|vL$~3^q79r$`4RQcrK+kZ-HT*#C# K˗/lgIsfo_<^p8,>福kfpvoP/ˉ?qySh~}oՙ s\*r@j~C&?ȿr T43^tyGuMq#Ϡ vnOArqFV9<@ @{Ԍa4!JMMM+*phrSSST!V{-2^#3TX$|Oux'LQF .9#DرN<@s/I6KXܕUL;֩zDxCdT\;1[l7ц^E}1Ewގ:8Ta;NwM[?Uv1e/9eC3n5,Wq<'GYVVT*BkݞjT(( m`ܼok+|{ƚ^&UjVtp>AksiuJN(9eb5o-ikk V(?/W$988]xnn=ӫFF0565Zmju5m\>wW]x 7Yۮm 5o$3Gs9`| yʷ =f71[]#@E4y%g96q;ʡ%s hxmkAKQ7]˨+1h)߹'J8A]#@ZFrbyYXl^/ GumWB޿_{&>؟͛?{<ؼ(x:pkF$~Op{g!O2`jJm/U/9.gLuW  =~_FK_@ ibL"p>cW^,<4\>ZY[T<DTo3{G>W`3`sJQ#x'yb[=Dc0+eL`!B7R73PZJ5e kgן~nGYG {q)-8*Ɋ(,QEC+ *iLjuQv(;G!L0&͑2E1S7򤲬XBBl]O,c8< KF7=-~xrLO_j1]?U!{cُmGQi*j4ra<"Ř6UՈ4="tCh ӄYF=?wUs"^iS滾dEM320w Z8j焛9P42!JbWnI;+cI '6Lw3 m-گfm@㲤bUS 3.O.F>kG900Deܿa 0m<޹ѦлRW(nd;oG҃?(!\X@v BH>l>!U@ r!cSZ_F 2Ñ{\W8\@BkKRO_*1mhJҴYEҹWS|,7Yec%3udx8Bnދyw"/$f)iJ):vBLyj/ntlhk]1}tT6:n#3w!!c6-?;r* _icQzǢ+FZQ7 }'\.`+q71 |ykճ cKm,[;۪߯Oc&g3MX6A&9{=S#q~:{~&8ٺ_%X/wTEqz*g 4LJMûh0M 2ι௶^+Ҷ3v柜1aLhᄝQr{}X뼌5SFmk-C#)'O9}FW6a[G8(XMTQNVFGaֺBzIeT-//6[Ҍ=f6 ͈f'*Z9BR(=z fCbY=@Ƞ٤L,Udh4 &]4 jغc,<6}׫`Oq#rܞd+YNl !DaêUр55'c.j^Ce)șBN: ӄYԨp!6)I}~];u27Q(OQveapIF:YR\G=yQ{4="tA<͸"D~PB4 U{_&\yD!BqY!Xqz䡤řRD)+c.RMt*z4DQwiǚ4xk2pݬO?(U#D(&Fwwvℝ)]{z ]JO|,-=]Lɥ+߆#jwϟ 0#C ʂ= 8,^妏5t;Ć}35M P걸چsR,$Qr N{kb>sM* nhF]h~c\{_m'~["va/|3aKۺDk4]ߕ\˪먥=>Vr\;1[l7F[)T="qQ =CNJ§;][}d2sGZ9$cx_l?kuEdT7jgkSz}罓tMUܰi9^rN 9ABa'cE @rB8䈼<ʔJeVVP(CI#Pph ɼy355wL.W굘@g}I6|~VT[F'mK1)9z.Ք˾@ff-/By"=sssL^?D$-j ŋ`bnq\*>SB h d:j$qBQP(  f1g 4q-4Fd0Fl6F8.%RBd2TN1P s?\`TJI1 neeӧb]ݓ78]p~|jdr[;{ C2YJh4Ah4J)S[[;Lmx8/uQNB!D2~??8Iߦ?).0u SdH->0qxpsl> r)jeEYh46\ny^h$Fqhۅ|% b6DO{=]Di棅pq[.3"lƆ3>ҹ3֍9~65_xg.s,-<.Xz88S=e Y<2</9;)(ìV^ {%?oIA4Cf=8=k+mNMqfn[$'_WٻvlZrُE:/e$ g׫ ?)ɩf-ZSTsWRJq5}ڙz˘ y׾k3s7N>qc]M6-1|;HN9%ok+yhƸs(ٚX ue#ocΗg#_x]e@H wuA{<ݾ?I^b?֖ujUu%j<tF?u?渰7ܹ{Y)O}eOz7q7?k V}ʣoضwȆ]x3jёKwVsnYkJG~=olX!W[l`Zb"\Ѓ/۴m7h÷g|rbsmθ.pF5,/|xrwU47NtkOY QySj':~')RQv)'G+kfB}8 |}keF 8UḏM%b,aq5j*r]$yސ4鎑56Ĕg͹}BS~K\{cz5j\Q>9O /ݔp:Wlv@\y)w_~%!>.!>.ϸWspV k !8w ѣѠ=ML?QJ.( ߜjSb3QVEY"%Zߋx=̕Ӌ?tLdVx/EӂRW\Mj8ȫXrňgj"lHq-]g*1YĠ3ob՟^endDcy2Rs!̍&nemɮ 4}煒|>}?xP{ :o~?qBh ƅ|Ic"ԄjީG1acKը_\ZՐ::RR_u$3<<,""RшX\\|LVwQ(..93͂  ƲeAU_n~ %>ͻtH FrDQT8FZ J jCd芩zIo4 [qGP\(1h5tC)m'BAMΡf͸/xQ`˦YΡ1ԧԺ%2? dXhu_ !D*uOpW>f n@j :wov~˶~8unol>wG݄0[7Un]a*.R#kXhs&A)_!҉ K3Bf̈;<)H'U+H~5h-j:jֱ{*VnĜ+bur퀸>^>䢱_K6׌}|C6wɆ=PHYB} 5'~>ɺKwr]ޱ/t2|žCkS7PU7\6]vctzI |24@r}?N|6AS_[;uyYGwkǚ>vj[ˢN`[OF- 5BcLe EV<ߵg1}N94yXTqI3Coܰ;x9.¼lܕyɴCǍ D՜A# 5+66w2FmEr=A #g| ML!đw 65LmM؎Tx5bqWƪX( ;y"nQ:"VV !s׭Lw9Ǐ%|ƈpU R#@K3cs q~w)G(W2R&3BT! 5s9?tuR@}ЈY9dx>&#cez#/_'5fAQ/T=LmV­0\E{\+TE 3,nwVXL//~jVsͺGBxMPmCTr6%K*O E,T~>^m$XUC;ml:|@V'7-sK(XҼY͸Fct8uF{xGB8YRQVQԔ&XzܿT:X5M螬#3 7Ȯ?~vΘ#B 6|ӓN&#P9RcsƄ-2k:a{š6~>QK$Iӝs2rrrT3Jy S?nCVs(.;<<(z!!tȨV?ٳ'jjty7/5&Fd<k׮s^؞`ݳ<-(( 85BZVEYCG颣)<{NF&)2*2*29#5RJAe'@࢔3̱*uhH9h4jZJi3(#Hy1fݭ&Gi5ZM8R -h0E3H92Eg#|t$=2 jH)G9(f 28FB8ʾ#c_(QqhH9((8B c8B ~L<)Da 1xFSjPJB|wEpfd;8N! a@F?R#!꼈> @) EQp S#QqQ_R#!yag<i0zhL! SBpF͌`\#+5RJ9gBp%@ ( xZ@k*\wF/5!!ŗ"(#_,ÆlxO gLH6$e)Qׯ|kǤI(UuR&NTTҕ_WJN?ս6 C4@ԓKy_nLSʷ>rۮi/}m]^W!h_؊۷z P*Be||b?latC~ ^ǖ4㝟6wu)!PPC~jϞ)g?MQ*r?.M4פ;.V6U&NTi׍3D$(kԤ|sS!gD#_3FX*w;#?!r+tm6[,5vܨ~\|#a҃_ϧ hf=2cɴVoUdHuʄ0WKx21K*'U}F"; 4Y`#29Bt"SSBjQv'oc\6>N7|rco *Y]yKOb2;apG;'l;~!"6\W-5\M83$Bÿl.t3$ #-ѺF&r[Kdd&UȲ(iFzU+~CR;5RE2r+7hÆ]rYN!|܂iжMcoʇy빕OI1YN/ eu'M7?铦>%B˰]P#RIrbbzjGt]1JZ޽.**u >:2#@W$Jnx<,+"˲#6v$IcAx ߝqݿFo]1}vc+Koژ[`QQ֣Gn0!EYwlmzeλ|tJrrKg.x,Қ4p6? $PQEJ9F݌0FH[lZ[nt -;_?z;vn);)P}I2Rcc/K1&E_Pd[˗?O>"˾?;,t:kW}{gb`%>zЕ CMYxo~B|QgW:ak{m[-y˘iWUUfN24eyHCfy\ޢeWO]:?RTڹoXJ!Dz#nVqg<5yY"!Mକ<4clȹߗD*߹G 6rm/o?U~|c|Oc@&F}^jTnwI^/TڵF8x`ݻ}b no("5Iקt֛o^w=u}\kq{WԷ%~7s۪$j1SdömOG6u߹RE&<{ٮS2!؏| ?}7m*IS{wyԅ?u{^"5M-~wƇk|`y}poi=֝lR,\cPgo,Q_)52r>'SQt<ԼtxNj}RB)E7Sz8>R|'sTs# -ͫvqZ/ i3ǚ\;Ayes a#.ZKۡeU~+UABcN{zׅs zUuh-bB\+xcZ@y8#lb5T2C,0uJ56Nc<6i_[|蠟e\A9 ԔCaɈ&$"aczO~k^8sozlBg&H}tzn~ܔYUTJuzdE[;mzhvj7{@?~n {vy#9xQ;1(qc#5Ҭ,M*`BQ UȄ-mݎS^Fyɠڮ|tz ht]G yA`ΫMHꝜ؋{QTEE.h46vK:.(SFKNӳ[4:qW߿qti[ggǨޘ>"mկه/jY1{)iz c[0;5._{]zXcT֔FרH u 1u’'&Z:sx9o/4/yNly+F KNwJE&h۬ՙ1p Oh^n!DJQ3334mUA$I*,,,/0h`n5DPJJ36&&ݏ{t7|' #c'Vkt:m㚮ӭn{>nwHYKٛcocȈz@jEQl++=}nQ嘘JQ#ЁCWƸN ۱$_+({0QE4v&B(:)ɯ #x]9jM=T-W%Ms:aaV-ƚ~j:Nƚu o']a'#{⛻O~jM!e_wɈԉ}]M/K҆NT\tۛ;o<,ʗ3oc|Wvmo-9lᕣNy>Bigw8ߩ̕S&^8H#o=*b?P!3s7N>qc]sI忼v#S.|+|]-3w=clڰ s@P:jjTpI^bq8lHE~Gy䥢Ou#D}ʣoغ%x 2!r|(N{m7}z/9.,;wlDMg~ꍟֽ5IJ{}u?{O|W%"4u-^q\ۮyN/lɷ%ހDھCڬ)V|ۣw[ʔ7{"|˲M~0Go Y)޲'z7E4wc(<0)RQiiif~P!D5e?,WJsEnEeWx&rˆdGLe4+[!BPRP;#N#j43 Ey5 swN*+P̷Wvx_r"m\ށƭ7|8#JE!!Ȫ2+]֩E~-.u=ru [ƠlV?=f˩.COyMjٖ@!RZ1z;@LFO94z:_h+v ,|Ko,:= o2ޣ[?%r}?x,̤?2p\l"j[ zTE^:;:ݍYU![܌pA'-߻*m ݊|֍A{萩yv9NTEEnh45~K_o;ƨ٫n~|ht*hFkONs=&-—ы{ iz,#Bh7v54 Ey>>g :ܤVIZd= #jܹce QZQ􈊊Q悇$!;76N93͂ ʪȒ ^o RG}߻UVZH VrDѣ(2Ziu:3'c@= 5˒xh4 8ŠGTC=t5V^VeeeL黉c xs<+듒8NUUUYYݻ,;;;))d24 ScIII^z=9NX\\5mdd$g~b2"##O:9f~1>5~>U;oFHweo03!J[{QGLoqS=_]~oA!Όо#ʩWgycLP~"j(3! ^,/52ւIS<4<)!>.!>+2M^yC' ^ QߋGe^^zU}}x`iqbjNˎTx !\H]CO>dա Ur`<#޲l:TaTЛZS>v$s'%,ߩdް؄SXqءBuޫGl|5{yao]3p5@v_u3?N|}f<ŌN5okFh?~kT } Hn}IDATRP~"I TYV9 oˬʊ"+ %V6p5Э fkjj6Mp^E٪t:ޟ9B k$%b 77ba\[5Fm 0vRFq:%`0<hC,;vףVqEi~1FRoej0F(c 7VKJnB- ~kȔr#B}{Ioz;Lqkj:Oۦ.565 Gpc#Бb0Zբ ZAkR#9'-B9((u[=oQ7pFH-Va1ֺ#ԍ6XFa( k2565 fڂ-<)Da6dPeӲh5N+J:&I4ZMֵVFp4yC[(!RθDV$+J:,r7Rc#M4Pә+@G(鴆I+hmjlzxfmaqRbԡRgFB4H۞YK5tZf$Iz^ѴI+h}j<'-q\N$/J:U0Ҋ~&Vj5(onLgќ-R߷REQp 6Op{à @oLM ˌ9Z1C[\Scx@n;:MpDG#15R#@KRV$ ХHj[BC].((;.BQm kFQ IzF9GjyHffXQ !ZF{yshuG2y)z>`9v&VWUYqPϞ=O_:5H}f\#qfYVn@פjFV}#:HSJu:NCa@mcP Є¢"tȈMo0U* x^QR\RyC"LIENDB`tora-2.1.3/src/help/images/difference.png0000644000175000017500000013431411303312237020035 0ustar michaelmichaelPNG  IHDRiAsRGBbKGD pHYs : :"tIME  U@ IDATxwXgwBEzA7P{{wv{⦅]ϮgCHQzI# 'Od23wvXZYd2M`rO>br<%9(h(-,qqv'ٸL&2"_tpt |0 |Be#KQ(]8)+a @EK& pOg&]()f8AdEFFJ$B%z=K1Ռ֞|.}~qWQV%?:u腐7sHKVo. YOٸTdCh_Z۲Ba7758Rg>9e7I4رncz=|ooZ?Ex"huԎ#bԫVs',29c63~b_CB_%E6؜o*eV,s3Z´jgڟ#X79gtˤcWz0p©N@C۹-OclsfNt`u7+ӱv%L!Oa=S# u`WGΉWFUϴ>v;ӕmXó@yd&>{<"2R(40'FJJrDd䧤u9:j*,b3$V-r'޹݌!M ~h&o΂$7' ώ?fbBJ^5n- 6|fM]FW.\o!pn>qgV'vҡX6)CyiYJʾQݕl;$!kϟpp][SB%f|3Foz5/Ύܶm GiUݿ>@$"컞=ȬWr\rGzoF3؆|r~е'{ܤxEn0O?~ѣkOIIIgϞyP$222RkIWMwcyֻ!$E,9[*0pj0]شG:9JA",ӽM歺 _|6ZF#ܡ[6o"/S+e=X9ٴ+G4^Wow!YR}<*oںζ7`¦;ю MEY2uůmDL \kngu b,+lzՔ#͐6IrVg+ɍ:znkWw>l6|e䑇^K/gzї^(о+:e$eiZH*KUcc:.R\ҩʻkuŵ7i?;l3jL{ΐ:_z>Q7ғ<:ox[v.ȁ{XVwN߶-~<}7G`˶=.;[ҋUHVdG+Xr.^GJ_rSJk_'YQ4@Q&?,7/èi}h|¢߬Z]WgyOJg l:yG9=ظV:~c̿Akݺ}Ȣ>|~3'7^c ߖK;:){ω:]=NF!Zy."̀{KP}ۃROY{;e_}%Y#9w#-:S0}O!t BE3}k#Vu.El(}e˰]T1MTu d‡'O]|Y[;/\tΝ:u|LHQT8ڥ49SSRRS55K o𠁷n߾t򅋗n :dHKҭHFj-"&&Fk Go'KDZrl'ƧHӰ~s5$1!~ru/ vX{s^g%O!$WJiNxb~mF1*E/LA*v4pr_l⩸ue23d}~dY}hDn2HkM/1Do,ε`TܯyI΢v_T1:o}u[://9 q<'L1-Z4u1pe~ >MR"*ّAvv5 0о_O/{oA,H_kl]$x{r͔~ZvPkg]MTIK$V5jxO ;O=x65ldrRqdzޭ[A -ت&lˀ:K޹`m,}988vF-XKڂKƹ"L[-FKe?_a3c.Yq u8nflg~&RfY\s.-$#A E(gZa7\>3{Qs$DEl}MM{X7չ~y)7]%r+ 4` DM#!HXM%7\Ɣ,Y0eㅇ&-Zr-pK'b:?Oюoڬ_ݳMa mxѲ3ku'2]A*9BdL*M913W>W'1,!18h<[^8{oY*ę|&@ȫ!keSDbbϯ FcD^4{{~1W.v8as|}x<<vmxLOOpĬg r" jam]J)$B\.!f5) d); ˂˜<[s4!Ĵl>b#_:]1"q%BO;, U֛k!ܘa,N580hz*$p ?RkF:u!D`rQ)nʄ^r3$*x #3~\s‘D7aD_˘rUY•J{sˢnG^bszgGOv,^;yƐ,X|-ԪK=[Ś6Z)Vsѕ5DJr*3e,[>U&Ȍ!{WaGvDʬˆнA_k\ddapQt޲eۮv'$I/6Kv98K-bE9n\rm) lrdX|8UR_'TwLV".#-"sHǿꩄ~hx9x|x3^`g=eUTK&B1k{y娰8;)uӣr[uag =~m:#t>Ҹ7Xz˖iPDi$I/O sK ww$ Ebggg ]A/O7WK=yW|=ݽ<=|kxyXXRzlS 4jZf#ZZ?p#æν6{='+̥aי>MR\}1 7ґv=lkz'QX52\XoG7cq7q¶mJ2 jn^q(񗙻ۼ{VE2mTmfHp\;`y3Zj/L?e Bm2فN%1yk'3yjTk5m(j>J]J^V _rV z[h@IXӓ3=<譼Tď&t'07s0rp1e}lK-uꁕۗ 2 <O` d0E!p\RH$r2ұ.Ju,= ɤR))&NNN@;@;kgɧh''|S4LA>z''+ p-Tvfi'  P> "TH h'vh'vh'v #`@ITTrL&AN6j íkpyj$P(BBt5zGl ^xa`  IܩVU*PX_.SLvPJ\HDbieMdTZkoaiI$Cܩ{x( 4 w bJPUbFCf~RJ]ǪL˽ZƆN=qf+ʄv) Wkdd+T3(\T)hw' \) v@UNbO qIBh#gװx U% .fdPTNBt@u΂ZM$ IBŌ̗W8c[|y;IѮ+Gg8(Ykݙ~Jo T,"I %}wh^d,[}v.ɫR%?ĝKk$+[6;i0B1Hh Eg06Lk#Gvt1sq8B4~oC8Î$ V~mL;R;IG'ꬰ3Kk:kG[Τur- !B۟U=%lʾ>|DX/j+$N ywk)F`1Vu3`\ܪ4E#D$}wvjIH;0BFk@ٴxqNIl62i̢id5MXeh5w N!jjT*Fo4Ѹw.q2$Ion0϶F#$$A\ F";5IшV[2&k(hYf UfDȽǑntaGLx,wBLCfCM5a݃_4'5WCnUGjٲA'3V?zٞkoIk۱ fvwb7[sNl/۰bQW6.hDT?vR} )?^b4biĶj7 !D/mqqb.#p-,HxdG]ϟ1_~|,^JGѤSo5y~^a&5v,inGx9qRo>R%?DMⴇAݬ{d6~Zř>M"N-0v2ԳvV'7~JR&;z)Rgb uyM-Yљ /">f+ʭ!Z",2Iq&رACW-}+$ݷe"'vpD.W+n<ZWU`&"odnHS<$ɛ;!v0skTq;|1f_BT杹btq#uzI<ɠN J`"Ϩ2Acw?k<97_͉{Mꮁ a'T_ER$ETٯCL"D"IUec]:~tx[Q$IѴ4}~6ocЩӧO߆ESIRo._uMo޼)M 4!Fi~=zdyS!" ?e]k1&,c[ڱ*)Iʢ;X_ &T&-{mv(PPZyxyݖ;oۢ)^#K:С]<֒I;L4Mލ]lFwhܝn$S;-Lap-٪T9I LּT}D" k -;g4Bqhf6qXZLS@sQT%Me>ѐI] p!tqlH jwb4J&x\#(Ѣ9?YCǶwgO!6i 2SCi07ָDqju^EAb1 a۞}X-fM!En)[-LNKELgv:!LDIYm;K2bDʤ(U" +AtĝZ$aƋDkꜘWY5i4BL \Z64B$t2,~DPI6в49D,)7ph.8"*Z0!ψI`a4jα,Ij@lC[>9̌! 1 ~<,m)znVIgT `8FST25]%i&wꢑRi%Om[tΠ׎C~I4 ]a%Im]swذ[^|feKah)J+#}5d2WL& bgۨQÔTc1 w*,U`8;!YP$2BU;;YYYIX,xINr<99 !!D{wW 'jr*v'x@+AŵS& *2-5tP?X[XXZ&'}Dļ/)J"(W*$lSSXL毂8[XX(T \i'eGa!I@N70dtF^%|$G ;Wл@622/KnnPqij/q'vzVVV؋0333;{{h%8$99a/^544Z3Wr A@EZz"v*11^>PѼy6:&o>3P劙Cw3O5,DL̠q;`ffaͩ+1x&|Zq<@wovh*ng18X_0zn g-\1;X(#WpC~_\l~$)2qnn1]x_ꇪ=wvg]8h`h'B :ʎ{xfQwV^ZM"q~b$eKB baݻlذ!ԵkPYnI`吙o\uz.K tThj[{8 |9[ilȢAY=̢*ngזK`!RIDf?=w`;Zy9Q7jб=iդA6SХ#'߸QӶ矊[3lנB2H)@eB(1!f+/#_8qQG"Շ+L^;CFݞST825hfs(1;bjՠA#q`iC[?n{ۚҩgƽx\HfODBB/mfSwK}㥐ko !N:kCntA?ٳъ+ؿf##}̞=%3˰TǬbz!MׅGo =5ޚ75hh׍GBOMr+Z;kV*4CP~L`P֓#C% ̨sl8C&wLד^=WJ:lSј]w2>s&Aߛ ΁3MPD@W*R銕+۵kgccs:tX|,KɒeϚq@ݎˢgZ h#x+L-KR0/b myyu9B㘸p駱G0Ent6v)KI'sb×u_7 $" 9XAml@T6r WZfff6utLU^$#A v@=hY݊HWдRj*x>Swa[(8F@#$B&BH%c5~z/V7`"2])jk}9pFmo͛ *B¨v+'b^ P㐩7oz`Չ ̨5=Ĕ x>X8SS {Mj$*Q![Wc*_j$V{pX9|6o|)BFw'AN#\Tk*kf' FǎNQ_ӦS7^yBzvzݟcE}[\% ՇCדTy!3%VR<S`T3f.m2:Xia r>]flAH2twF1|7 7eoX9d9⚻61?B +_ol~.TNH|gXqx]%,N0g_/:z8 6S_c^W>~VO!_˰_RbcBj:::ϯYvvBQ΁̫-Ԏ>j  6ډ*XDc```0< h'0'~˞wOwZXZAc@|~ 9R;o\m +>?{oZ6foUAD-6;^1H{mm[|v˜DܩZ뾸qA1/@ w'adZNvzy:>ѹ͡iA ]|;N>Kño>k"w_N靖o(EЖhwDtf̨bƒW 5p[9BJoҀ>|~oa^o wͱ͏J MIg 82.MȡDhKAelܜn L |Դ5{*m!!H e; !pn~) a.w,S7J+Ӟ5וo/u*w*¸0F(Uj]:pn׆+zF%}-Vw 7wx%LBHߩ6MIc P!Jy ;wol҃M"Ӷ>2snRppy)Yk\D tU|8ݝ[`8g `1!Z,;;[Ph˼B8ܾ-4T4{3c+h'FDD8:::B@E⢝p BBB ;vh'vhg! hg|@;+d[|2je t^%Hͧi%'^Pemml5/{~Ti |NV#2L_{Txq~񱵷0&>wEggָ#eE@u&bƼ ƲE͏y}:+z\FSB\|B\|B\ܫ#խΟy9DT%Snz_ތN@Ya^&'DܚfxuB\|BcHx~wx 3&'Ej`ݱJ=5M8"hg 6}zZF.-i/"J?dU?Vv#|(NLᆯM+1o,lg$] mv~; V~(cX+C3JyrϹgSvRXѣ =kȗ`C2\ݽ(|ۍA"ޱ+vְ'aZwY eU\3 Ykٳ͖rO ;,9%isbM6ALw],q$[˯%367T¥] 3E3ݰz?]MYH ?_tmRLiQ˳V11YLchҧ R",vV YXbIAuv5]$S/Ϛٍ YVWʹ0eͳPO(#T-oߺ};\YyzT[_O^0g'iJTTဪɏ;FeD=a?&ϺێqңIi'V6_Fy5^gx󦫮!f0iC˿a1+bd/]t%v`]o:zƳu,BeaO ߼qn` mP;Regi T-y>UO;a c^@;a wq'PNX;*~nCV#<S|V$\^9]]7{['fA[s1^AN,\WkCqgځP)}0ܘ]c6O[ȴ+M>No(I,mCik@0!X򴈯). v^}rg!],rk@%Aue%[+xz=˺o#DR~ wj?6Rv&\à^&[w]sBy+RJՆ_a@y9B]\K @ [)re)$V\!Ƶ}%U28rv)?rQ6?cܩY2I`DGnwZ\+.-M!įa15]OzS'N͒/M"UJ} ϻ.a\ǣ2J.[O_!뀵r5.|,qM#ft#&D&E k@;XNh-m :m:_ֽ 5obE>RJ)Mtl(l.;w g UM;!@;!@;+k 1+T]ˏ;ĝ_PiZT~a,``sǝ**33ST|>+LJ];juZZEQRiNlIII133AlCQ4'GR4f`114H]Zǝ$Ifff rFtY^rP($ y2jObOwVu"2_;wwspn1`xBHrivݭ-?,] =?M-G[{Vгk50.YβCQL&ST4E#򊋋[z!J%(ǘV{S>HgL)ѯr0}x%B GK ױV?3|M >_2tͧOSƝZjw~ T8733c.s}^q;ǷlfO"aeZJr^_{_'{7SH;9adZNvzy:^?ݨvNu{~|^v=V>֜N(Cӂ;8v|(<+Xþ kSɣdU ?j0|{8rӣ{GT#N?snh'U\;hg;"nCP8V֟:{;۷!1\z఑CD'):ԮmTA*Wfp,sqHш'MX[`Ck>2&+`)szzvԵ#~kc P}l{f igctn[W2{B/I5S;U8"f^Jd򳓶< C1g$+>hײbŲ/85Ag(XM&'~sOhS1&)b~Z¢˶ɓ:x42a,xU\W1)s4lcq4` MXyZwWg'Gg'G.G?~jjg2_EY=pq/>G:=j4=<]GXCYEO,)Uy&jˆ٘1I1 Y̜9 JkЎbKe5#ܻwݼamrr2нлoy4lҬ` \: zUr!HY,cX6n>u'ݽmA].C>1PoR粝e8 |7ޏ{q /պr4W!>ɕ7.'ۍ6:U)wnFU÷M[#c|X)>ioy@;+K_Nq_X~m!JXY u?oZNr!"xF,ƍY!JTMc IDATj Bb9=q;n߹(A1 !֯N`V~pzhnq-,HJ}.ӳGȴq9|kg; 022237 {J{.4>?c܉813:99|%>K;>rqȈf斞 Ba4Day<0 A= \0s@E*w w,M*J9T* _uSRI$6si tJ$xw괴4Hf4'7Wfj% K;۸5;;P%Qԥ994Ml}*c6i8Jhqg_$i(2py^rP($IKP ¨~>QMjʨ~vvvnM?^FMw_\,ѽhe^<}bƞvZ^t6ZNΡV[)=볪xuV^Â/BMޤkCQԡZ_C(ba;_TM>y_y?q)X֞pOL?=s}w;׺L|E^f>:OBYEd2JESt'Nyŭ]C|RdEU&+j~UB\|B\DF,HcaX!*n#O zyqA 'QU|lL1'-rV͠L<;VT{QF.QsF1Nx\\S ;7e>:,,eX sBH0Tit-EOa1X.~*2sN!מQέ^ߐ(mߵ' q Y|XV[ BU333fϜq¿?w+׏iTNJRnmJ~ ^R(Cӂ;8v|(<ΫX SH;9adZNvzy:^oC6M-'Χ7unQ9/w Q 8>cY48I<(>-n7/#slݲ5%O' kv4<-_%6p` 7|n&V}s{0DΜr֭ma;ŵ r^]L#DKϋ}ƍ2z.Yآiћޓڦo^)g<}tTˈ!סG#cF9ۯ|zq=\h8<(k=qsC>b4y&8܍O7iGE>?7uհe/su]slE"p:3f~|W1m:W?}LW'fِ:5a;Gž 94= TV$;vEbκ;j5e\`B 'Ǥ篋-,_C2\ݽ(|ۍd5Bx|1z`_Bw 3pj|?Ud &߼)0k$ݡFx_Q3M7}WF* Ng魛7}`(su?yn60b]۷1 IV uBI$ove£2l~`;>`w9K}1Q_zxYeYc>핸Dvq8kÃWL"96{v7ls[Wj(ZZyc?PWzOxv ##EFOFGј\:')Xfu-"s̐qN-Q&g2\F \djh7!Cc~vkZ@[;bٵe%;cEǯcY]3tŋtyz<=B)z 3,vL!s<_M{qS$BLǶ<+mlAO_lOU>rLgfhkGlዷ ֮lLxa}!㗆u?e?}#J1{q{zsn j<~u؂>Z|؈F|&]ACnٳ;Μ5dޠ= ![IpO;[BeΙ?9wƄIv^k[gϭU! !gs#"&tǎ0aTD50{IsyklgdtH`qˎ%im*g ވ͎ ]4~޷J||Kڵ;}EbY)1ۖxa듻"g;͕EBoŽ4`=JcfAWy=Н%+˺ =tHSi*[@MXn] Oyt`"peSw/L!Dg>M*zix>>z *f#%G8aجyjfb1NZZ? 1cY50TTn/b* oooDcoofL&e2=QA&u]')'N8v V oA/a0YYY;BagQY cgee2N`@5ڋ|>_!5j.Ǩ.WV+ >OBt'pvvvnIbOg%3<_h],t:=7779%̎2L(ڝDtggg Ayy=kSp\.K0~!Dx<˥s£h0/w `@/lEa4ֳ "f2x MwΖ~nq\TFg~qbh4*J;~CH( EbqKTP Jv8.8@*t{ug2*"AVI$߮_⑆P^n \r !K1L;mR8IZ7FCQa*yטy`iwQ|[Xڶl4{߉\T2fY~qL9`C6.Ƽc%N&kXo9FAk7>z,)XNΆCN38ER*ğ-33sMO)8Hl~)<8$4vjL,w D&]jLDkM ۙMښ/n9ڟl5BT, Ν;!tMʛ[M&٩,Bf'm}?|"J=Ho?5}|xIx_?Իȏ'SVנBn>xJtj]b_$meo zMsA"i Hy=dķkȌ<~:EgUfNݗgdfe>8vΨO İQvd؝y> sLw!pl1,'.ug|0~ke*w <|l;H_p"Awܲщz? XwvNQ/|<˜,[ʧv¯ayy ٙi+}kK}@D2尝6|\s>6'| > QTa~ޱ(˫'(g022 QTSF;:=h7!Cc~f;Ilr5*:92BP(3K&I9z(q f͋U3,qY,\+@ y9Xc LLMMJ^>SwXNhR e"ñy3N&2L4 =5|›ݎ7 &U t'Xg`006B:yxnYY Ƌ|g',61YhEK{I|~Rb7u0NZ+-y\N3٢ϭ M b"ɺ[wwgg+=t |ϭ<O,䔔3;::d2P*>~wIj5ug0)((pss3{vf;[ON;;;c&r\.L@kw7ﺺi Fx;vGǎy<Nh ߈kL"]޺]fLٱ{-s욑ꉜ#%ߍ-jW"[z4EG!+uei4>j@V]A3333; MˋO5߯pMv%_|~1v~ @:. -y EWtf8TrlDŽ7jY۽a.p]|t'EQ8kq GV6~3-h\ o+.X.=INɻ_SR[?_Ry@v@;E8V1 3{REѬj{{{XZD6$ew BS{H+>Aü.^B1^ן7Y^me~k]'w1w\E%\K8Z&26lw l@wVaZFՔkmbXTTD\%`53\T=nKE!3+,ݩj*kv_JGl1ݲ6ZVE;N?%;lgk~nq'pMPeqom5w~T=nnߺ9??BVe݉RMY&}#ϫ_]7֤JZ;jp`@Q*ja3hXS3ueѝ;-C0dYhs98B,#>tW]z*OLZ6͘K%]z"FCF#`;ۢ|yscН!Tz}r@ ~#XζDΗj &Lv5/wNA1/QϠwW+1k=<;{xvG[E^W):ބ*?$??ώk+/]{ʲ+Nj0dLz9%G\pD~F.S7yW ReShr ύ(ZlA]]\ߞ5*73jٲndGJ2-{{U#"J+ƓZ> tgxnuЄնǝ;޼'ɱz-X,aiOPyg,8u1Y"dz̙?>|iL-/*Rxfq!{e*<4Vڵ"8|Ts̶cY%-|W|!>d n+&rlAHĺ3Gf\&d6*Hl`m3\<~{KԊ ?pa䕣 ] C'iO&{wgXhUeʶV,:@ tso>wBPӝ8n\C$3+մlD!BZL@/K&2\fq][f~Y21Ks hoW!5j.Ǩ.g_`]lg{n-,*.,*5ͽ}|=JTU4%c2~|./JK+tsm+ge}~=/~[s1Y-оt'Zm{]P(A.ٳ3lH{+|ܟ:dzKwW|ՙע'4vTRk9.K쀂nn@;ԝ`;k?{6yU)FN hfwOǽq޽Oe%vr\̎H[ltoΛ$VBCbॹ:8hW@5_4!]|^m\@+ҝh A*`X*txh>NǓ|||:ATL*K|g͋U3J,qaU[eɼR1Y&JR/oEQih`5P(-9͛q2dG|͎_wA;bqܙͪv ; UZj; ;^ wН-j.=uOJJΖH$DwB]lggϖwhݝ$IVSwf p8777glbYq;~-ohq 7uuu4;ϖFx;Jcǎ< 'o5o:vY]WA"pIwcK-߶E7w}<T$2tֺIZz2usP U*wyvBdٽ~O"H|zNB!lQ[2zP,NVZUYH"t{}{ed]I$߮_⑆֪ngʨvvG q"[3m229~|ʔ7RiUsY0߯p͸at"+{} regu2?}XI Di'UK-Uۧ;5O!!tԪX;CfmҐ wok_aO}cF]Ǯ)\~ؗLutTVT&ߗ"W;~:"J,Y'.;wl=kjj/}r{IzR~wN.B<2X5dtC3ġ€+g;&QdFšV}j|W6 1x|f=݋cxɽn,|#&saNoiA#-,g6MoMGCwHy {M>І獚).Gϋ}OL]髵Lȫ=FA [O?sOrJ|!d*{cF{ f+*}9#[B:v5U,}SwG_x~c\ ;qW*Fx<.kh4*JjިZb+.1sΖv 䚱b.<֜JBS{H͡ vȍ4~/NCz\O!d+:Ϫ }vomZU]*,3Cذ<_o:iM';[ 0Vj˵~1 stt,**"/1w[,n`K%쾤ϕ؞c&e'nyaHwZ8Qh(2L?T9ma}gn˭;-z][tFϵjHu@w nU#G+#:^PVzmf zN`kcC[Ċ8|Sg3xybw>Օtg>/w˶ [ʝ}z3Gw6w7xsT߭Pu3"nᆯN&׮(t‹oXdhs- VBOث׮_vK&%3׍,X;g+qHݓ;G-ڕAYOO(c۞3gkLiW;_鵎&u,i4*0F9pR(yE݆Pe\c|69C0dYhs9/Z֝ -33sMO)|ܛ> q o i+pw79o@@U݆N5>?t돑ѹ>R+3ix e]s- mcX^׼f:_۾3|EbYq]ȶ!Tz}rOE~#,>yG#IB< ' m7k=<;{xv$ժj>^?|@mKO"H$}}sɉQAv N]"KS][FP3Ԕ˗.k5Oss)U;OvP\8Ft*֖6bXX]~]Y1V4EqpCHEn#Kבc,xwO (eNhWPwʓk N^oyp(CZ.o*v2(S_{" Ų7"N*/S) YBSebW%)L.]*} %̚5<[MvUӶ|Ĭ?ܓ˓cw Q?YPw|:@FRݧ3YPYQ|Ω*>Dnm@ԝh3<>v/å,1\&d6*} -b_.-X_}\ȒyYn! ֆ86d=]#VM rdИ޽o;Z !byֻY}Y{Y%v0;߻ɒc,^8$!8nώˆ|LIo!+k> ~{Q~ B ]|TtG^F胟eIfm~֏nQʹKsu)p􍯼avxiB^9bnvG~Fvho߇Yo^t'@+g Ȑ PT2*tx$NGHYR|P ͚v?fXlbYL4o~}\ܦr3!OLXb12155U*zyN~ 깯AA* oooDcoofL&e2m^w6egfnjq>D*5~.vKޮ\Á֦;vH֝ /kqOJLtttC=0cq 05Ehos^x3ZOyREXϚl6d@wH >/@w%݉*}tznnnrJJݙe2P(wh1hNV[Ϛp8nnnf YQe^[5<>ChUfh4ر>:vp@s#n]zO"Ⱥ |!Da~~7 ty>>M*k%dU󳵴 ˿C*x޷NH8LraYF7zʢ>9с]~V?#O3]<؂|u'/@R*KɅ Ν?[ϺD_E(:n*ބLDJ^gsq|1]LƮ^d a?3^{8Ej3|kU u{A>L6ټ1'0`(4aqٝGpM{l<5II2v1 jg3ЭYx` Pvnx,b}&yXIKqljU!Q3Ӥ4ښzX\LjwM7.mIw㝜0 j5Z\k0GGǢ"W8[E *t7`֩OO"fRߋ^`ԆYRv"ۉ *b&`8m}mFX\6|_lQ/3f6;- {j4E[v V淂}q-tu7 hSϜ-_>nl/ {w6TLcw^}}cө/Ss1*;n;,.}ϬWS7w 6; NuZEWcot_]3הG[u7 h/4_ ]а,nތ]'+ D2|K"F@Pi4 F#[ݻ׮_v$l={|/FG1ʖM9 B!o6"6mIw6yP+in=X[?F wwIcTmDLQѡ>^~i|f ֥YoP٭)^6$^0vB WvjϤ!ݎN"y} ޠdn1;:7G*zeܲcIڊm|3i.o lgkНM1foVT]F~-⍮2%?e)dyݤukd"_Iʪt#J=Ho?ZBr"Tݻpx//īK_Vs"IoKyp *]WaC7N" u$9ȃ )>9E6Q!d7T$9"LC>lzSI/.oϚ89Mys:N9(1n7^zHO2}Wfeg*ndrp:<\XT\~e^Q7> :K'ɷjr(Iry >ULFJ)Ⱦ@lgН/?ތ]ii;?X=3҂Y:SyߛwD<9vSe3!"G.&_xV]L#fO\kN߾J:=sN|vV'$ˮ\Zj.xa@,aNMu9tzFwB4L2ub_]NF~_]c՚/DUCW$Oj( ;[Xz6p, >9wLn՜oHpX1` B"W9*#$~#AIJq^vt[Ȃ!ζ_ŷwX55ȑAc:{oTpo>,0߫6ZX@!s^uc~Õ͝l۩F!1$ЅEg{>cOvS6M qGwZti?\yИF;:8n\CGFU#*F^Fs rb5Yn!Dcr餞jTn5IJ:˞9+fʓ}[* OQ᤭ñ: { rZryry|>V ݖ%[rvfŖ|ylgӝV-mfGW>.x4cR~ŀzIU2[Qr9&/J-_x20:eԛBȤә2{[dyVݵTp1=P׈#ж0Еdy񿺷BL&!. i;?ǃ4?S$o#}xT}/ CX;߻ɒc,^8$!8nώˆ|LIo!+k> ~{Q~ B ]|TtG^F胟eIfm_S1h.ҙU|EP߄561tB""#C2@R 3V.&Cq8B)KqðY"8vvEX,㤥XV_f5?uxb2/DzkaR9Lꍵ@j-OzZBLp87odR&c1t6΋ml;BagJZV Uu`LؚD˥;V_/| /kOJLttt1g{Ex"K49p5lβSYwlD@;՝?N&ԝQ& BکDlBY\.;EyhwwAQAFc=l& hqRi4y<ŧX$ IDAT_ѨT*qBXwQTTNV;3q8NAAyBhwSRq8$ uoZ( T*U1}[{ VLnUHIːQ-mnxV#@-;M&Rttpu|u:GRi2Zyx>Y|uML_S2jz`K]s1?S?F@w6,I:ΈIUeffn޴IV6u:IMn!EZC8:Aӕ4 NV:RYO.\8wڑU.#FWX}Ԓ2TEzЈﶾM?d 7}L$7SYR_O'"Nx$Uw.K$𗧥ONͿ>P=$Uo}|xIx_?Իȏ'Sԯ†nHɏE0H.Fj{xD,2ckAۀtyp *H Ԡڟ5˖wG*Sf噠ʓ<]wV6LA_Zu] ۠Cwŧ`JQixݴǧ ;H_p"AwܲщzwvNQ/|<.vpO.O5'o#>'dgŮX)e ZMR>G~M>ˮ\Zj$48EygG?nZKC]$(>gg\~"GҞ﫵ZzlLW~xTyi!=kn$EmlG a>\:mko\EaB6a"VL2؂ug,Hl`mx-d=]#VM rdИ޽ܥZ3ǻDo`'/F^95h tORӞjMLI BF sQ7 F{V'cĐ@1ٗsuGi;7leϟ[>kڰc?PW%:OQnadd@?(rt/u34/BN~=(t@'s6͟kմtusmX֖P(3K&I9Btu/2EfKRݮ8A} 7|u2@=vEkO ^|"#EcrhZRw{VA[iYµid4f|g];̍Hs;o@)Sщr{}_YGYQX~@~q؜qܞS6 vMI"B_YIEs&|F[=2}%SFhvt_^1: c$vtnTʸeǒM+˺NݶϮ-=֟Ʒ^FZPzK(_It4<TBS3BAddCBT*`c`B:[<ӝ-$NGHYR|P ͚vdXlbY3o~}\ܦ'B˱,cebjjT*TBmpoތɤUZ_'g ou;߀PcW юw2,Ͷ8P8nN[0vVV&hg:0O(Yl~Cc6Z @+N:--~gF'Ug)K4[ãAsv/å,1^q}# tJnHpX1` B"W9Z9FJ 6Tr#߀: ւs/8x>\7 `H$5tt̄ʀ9[ӭYtVQe-YN QTa~ޱ(˫'(g022 Qjd9:W(O1yf;I(t@'s6͟kƲw!:˞9+fz`-K'$cvmaeɨ}D/5Ph}-lfYXT\XTlG%:o^wcBn^N4oUb~p kf(N)Ǥ Kl=\_lOUي1Sq ZYl{a{_Ivl`cBllgΦCQ u1fο_8skgՐG>{K۽Lċ㎞*5pn`ίΤHUxcdb;mu3M ^|"#Ecrx 9[J}6t"D!anDD.q|&LhFNCH?ʂ?V$vf{>6P;_7FC}BW F+˺NݶBq M!@! Rjfuy0!-ڦ$NGMYR|P ͚f@X,㤥[:3o~}\ܦ'B˱,cebjjT*TBmpoތɤL&8*٤k7EbqĩǮw+PvG`deeyvLƪBagJZ cgee26F{ѝt:+rFj\t&l@w`8;; qq$bгIIIY'кl˗l>Ub:RwfGGGL& QNNwvv0L ם:88p\uCw"h4rT}N4 &u'EYhwwAQAFll6d<ڻq\TFg~ih4*Jگ$ݝ$IVSwf p8777tJp8$Ij5'޴ EQT?Fc搮n+TVX4bV 1o}5ttdR*z֒7NT*M&Ske1Y|uML_S2j2cK]s9L#|u'I:ΈIֶ͛6=ʦ2N#I(D5k)B`0Vu=BuhMd\p&5?L"v 5P]TߣʓFU&u }Eޅ{y$^]G #I{)ӀONͿ>P=$=}|xIx_?Իȏ'WF_VHoʚ_wֹu~&}v*PF|n2?Z7WoU|CWaC7N" u$hzݙJ.#n$!^eni@6{{uE{-yP]'mCwV6LA_Zu] [oO"CMTbJЊk7ʥ'^_++ɫ~k-I<9uY"vNճ u,x~Yzj[ltv9݉lL֒sOV|G`H$5tt\~x.6`5,kĪA ٻ=!1$ЅEg{>cw\$~{KԊ ?pa䕣 "Kn$/4\fGguxu1'KnHpX1` B"W9*7\&d6"k&Dg7~XB6Xי-Ǚ梼o9oW?D,eGg,Xl)v leΟ?J}a9)DQy~ /Jt<ӣ<ȀDQN22˒Q]_ZO9ЙeghpDhe4 'V'(T4bB«o%ԩ%ʄ Id.c=-՚Qi{qq`"QN{q U_iDn"|s\3*gb[/+-JjLci\g>U{7wxoF 4MKiٲA@Q? 8PA=xThA ҖVfLB.)mzIO"BHt?u޿R(:zB6̻f{\='|ѷ}Ϛk:;t0&Ǐ=c~1S3n!C[E0i:Ἷ/xㆨW:˔R.vYsyuB%JCȵ&skluث1CD}63GrI}_E]> /g~|~* 6!i^UʲKڊ9If^www+ Sb;c9 >k=yۥCAy\;Ntp?z?ٹmFrc]xf#*65:JV1i\,IsZҽ s7%5GkR zg/isliK>WhNkqC%[E!j{<B3_mKlM챨ftwoL)uXc"_..6Cfw;mIf5E{NXO-۱^ͻۙry0v?u޿:xN2a͊^bQ~[y4l޷ݻTU]v<}H[ٙ}5K1HwĻ O >p߮Ϙ+u}B:xWBwʵ">!0m"o6x~N*!xŒ!a#^NԎ~)7j2ԦbBa򪥓Ͼrk縷roݠJ{J-G |]}#d?;ҿ/Iںޙru0/SǗW/`j>dnt$5%YaْS _VVV}E{nG7y;Vk\\\hhhlU19GZVRy*Eyxx(pVZ3?0nw׆:D|OǶǕG Q/LHH0L!C9>@SKJLHMMܹs U*^sg勲>z߈ 4#P5ꔝ**>&,}.Z~H,:yKp[2,==]PTrJ'aⴙ:vR&Ziύ^2s@h`@'g{zzu=0GR9~FG7죢-NrVzTRVi=eeuyT SSRv&!Lc7|o|,%|_ܥs'ٰd2^/:'O⢣k0w^zzzFTz'k;88`0xzz,2BHR^T*JJJjXt:F#id2w !$Fq!ZDBj\c-a·H$ҺWGp:V.V餩µ~j-,,T*埞u:B//Vx6>sefQ*EE%%~+Jooשּׁ,Ƴв͝*p٬NRϿĒְSc x~|snJK5Nlrssv;O57w:lZg_֛obfp·sgcKZfܜ|b/ܱlGFrQx`sB?5qB7o)gcc]zr.'>~|K?S/ndoܹ_7WU- v~w?;ev歓Co~%`lgso#)1-h#B8\/zcsţ?sŲ :vU W&91o7]42߰nۘ&<%2RLHpC/rc6wffeW:;t0&eu9Gw([Of F<}g{ӌoɷC{a?Wc-:WfªSʵ&wcSSR~pMj^,ˊ/Qk=)NK]!S-~eĩe ވ7ײWxNp:oqj\ܶUV~1.ZwzurACڐI^e|J9^>^rKھ;N[\6/k[blB8gEM5YVfnW-f^{ 3TC]$ucykYWK !5QYDiUZs1j;B8;!?ö{ח*K׮IN!PWzW"By ly[FvRöCʍs!'>)b'.[PǏwU !O<ܷ3&|33kx@cpڹ. S_7$)B͖2lcύ6VZqqqfVgnNVUT=oJ}Qbxxx(pj+#2m!,_`2B:r|ڹsT*//ÇMrZ;+_FL[1eRjj=* ":uY/`dYQ*i2o.r̝RTզj4h4)ZV*D\ssL&2 o=-+;}eh4JӧOǟ%a=T-dx? K[GH8I&le{fYP"5PSe e;5HXOz\/<0M{x#:V0wKNHKOg7*ZE*Ֆ?m}| KwWh<:Nxo웟eXx,sgCg?TExdgѩ%w"Swte\4g/J$tڜBz!!# 8dûZ 4RVnٱ"zl33+;3+?TEx٦ض?>xaR3ݙ^h}wR^#¶e'U&|eCƾU2ef>+M 8sv@vY*xyeۉ\?lXdq^ElM8KOEZ0_cxXټGʗ?=*$mxET-%on|vC7W~و;/YC笝3K1핎^!">84}s!m]{2򢦄w 1Sǀq^{t2đomXM]}¿AaZwgk*.c&IMIBlaÆ痕]9E{nGsG Q/LHH0L!C9>@SKJLHMMܹs U*&\.8 yhm ;;d's'̝̝Φ[Qurzh0{Si0~79zQ(ʯ[9k333ҎoUn'23,adg|ssg3itg_E@v6rq+y*οY{+gmq)$l :jyJymlgͺM!1ONbS~پdNo!"Ԕݞs[Nx?է?*U;S;]mZs͎B 7v6:A}6G+Ӓ̮=7j`O`l Mnӣ?y H,o- ڏh_~Ҥ? scIS}W?gt{>Κumg#'6V'whFoSP`~O!l/3W17yͮ5O O'0w^ w۔.XaO'Sx"hs>-|o-%9V+B8 ]>wT(&Lkn{;/+YKݦDgIه5J=g|l_;

nޭkۖlؘRVV4}sg3km2yw3B ݑza7$Y~D:o:x `/wݺ.mh>}΋6Zǯ<:`33K޿#{!H߼u7}e_-rq#>) w͋.Bd̝NNsgkI,4zr{:̆wm^JK ~E1570wuK45 ֦Yg6ku333Ҏol;L}6?eYjlh&l-sg=;/moϠvZ3ڵ ;¹3ЌLÇ]l 6t<.N ;ilPB kJbb;ߝFwm3|ӯ)I)I)I{4)xY=3j7⯩yrM S?򑾋_L~㼨)+8ytWPʀ+?".l=yD'Ђ 4/;[֎ ڲ@v2wNN;;̝MnSw5XVy~>g9fP誹s4 FC?zNMǧ=q}ÂB̞LNK̝MnSwnڔVUZGN̊_=Zs[?9p`a#?##-=#اCtn:>k쉳 {ɝALBzj/ۗ-̝Mw(ݱ.,ver^8'֜-A#z=i{}?9;?qN/1sʪ Ʉ{ iw6Ҟnilw]Y%?8UdMݗqƠ܇ `lr jO P5-gvijZ&ſ9k֏SςOse8ـK(ۊ̊NyZOY|lB>+~HQb|;w|)}gU9 g|j_{M?ysg2yw3B+/or|0|9ًͳ gU }~:{CBC:upr/Qy\?.8xB!A dhRmC/>Czb^y.:乭k4xMEv->:)ԥ]kwVѐOF'Ђ 4/;h @kNN ;;`ઞ;eFӒְS+-T`rvڪ7dgK;eѹmBZv\C6F̵G-"Š 'B *K ,٣YK1˧NotU;4Iy|s] 7M۝iz޵\%*1+bU];Z gCz4ݨوY ƴc_@v^!tǨֈy!;W`6BUlLSK_hǬZOl幣F̏^謺}_hǬ\ !w-@j5.d'd'd'd'd'd' ; ; ; ; ; ; NNNNNN@v@v@v@v@v@vd'd'd'd'd'd' ; ; ; ; ; ; NNNNNN@vp3$HW@$S%jͦTL^cᑲhaN:#+wm}}Ҕ$&p8vmӠ["!## 4 Ͻ>\V%RiQQ\.(M:tj4jRySCsp`&HR ^%fL&=V9(TQ'd YDhczλ@RI$S&t:na]9^ĝdbb{N'*Ԕom:3gf?_XXKϯC^^^U'm2T o6RjJժTl%ĖH$j P ӧ9 SƟKJq5  5Ygz(򜶝 IENDB`tora-2.1.3/src/help/images/toolbar.png0000644000175000017500000004775211270353652017427 0ustar michaelmichaelPNG  IHDRHۓUgAMA abKGD pHYs  ~tIME )3 IDATxmy{ګ8$ @!)&]MfMB Z/lt7@ sq}IDL {%_x##@ >kHbf9Oz߇AuOSsSNB!x_ B!w5G !BHP%B!UByB!T QB!R%K+qqa$w>,+VZfYt]|[$p8±$KhǭVˮsVk߾}٥.c|/0 p8lZNG\$I֖-I^7 6^h[h4JIR%rqlZXfټc.NjQ$݌"vZ@r0}4oOBb+yrBbaN&W1֢2Q^gke&m̔D&rwTZ^obcj3)&F6%oejNZYڔmhpE!VP#mt͕GswM [ADomn_(e%iy`[ƶ-> qr[+hLMۘӌDLQ9;|OS?a=rc8JvU \zDŽaHRr7Jwr So^k(Pfq`SV'{8SP[C0u?o+I2zn92FA?*U%슐Rl8B6EJ)I'8XθBf؁0%⒭2,Fx$V7zE@m&f ðnO&FQ$PFZ!)le;]`E^t:xծn ")Ǝ?}RaI)!\&IөH_Bv &cl=PCƘx\D$f FA{#O>켔 Dndi}mM֧Dk^6#D~|`rhvq4 ͂ 2@~:HvTA~+WTHݚmܚlmјDLyn׺oB!PTeg06[ʍ!BPTЅQB!R%ԏB!*+yt/?BY .Lv5{}Gw+++>2w2u B75&uK^dog]ڧ,Пک/R[(k/-gΝIy'eE񼵹N@]5ɝ+c^jmE-@#;LVm)JbZLcLS\sB>Kt+ScRKOo0ZMVK^},ک'yڥ^9t:Ma{gg];{ ~820\8~lfHGez{wzE]q+X魔['_Jf1Ȟk^ܕc*}#Z-׵ݗj+өyԟBKzkk7|̹3{}.sw%ovي<ꊞF˄u[슢'\~GݗYYnF?J*\>+ŦܾCri6:}Q#}95CQ+Qq[WWZWiw}(`;[- mG{wbxt7=ERz dZ O^|3̿^x=aVv&JΗy "Ǧ1Oя~]'sk[G72{+BM}1%.&WW|ʫ?y{=t6kׯoƮ]_>kGãnݺ:xٹjp*N&+k_[{'̓gZJy^o/O3Ƹ/Ϲ5qmUV$K4[TqaԖV:sWRʩn#^R֦Jެs[T!@ݿūTѡolܚxܘvڵ5׷7# Y;fr[mbj$7/]8vS;\3'1#c'oؔ22 hH}aw^]~ؿ;?Q]_<>rji~y˫?q7'+++T|K_?o\٫߽j~i.={b_^<[G]3z>hٽk+=qK^. Ͽ(t[O?q+v|<~?{_ɣ~}w'?Jɣf"un+kǘy睟o72oYaǵ96 dM+*PDv1Hz+N\̹3kW6{F| 66W{9y㧗޽ [>R4:-- Q雟ᾨ 5iCSfپ,،[,(L;so7w~?<~C]~董OӧpjԪK^ZYYho1OnFcpꡣ=s陳O}Cg\97nxKo&o~>̥g0zxж.Pڋz֭[8Ca^tz['Z'N}#=r+'Z'^zؽ]S~ۙ[o6鰛<C8nӠɐ+++jyùHZҜ&WiERolxrxH+5cj ZUbW"뮽N¯-HMίg ċO7 S@$maKeeҾHm E]9Njlg.=B,2cD_\8y$nt>ltj(7K6cqEzv7/ac̛ɛW?z(ͽ~ǎ?{>r==#k6}f[F?wMrݵk͟7vs[ rޛMB1~3Cg(;nkV܂s_1rؘ-¾EHr@at$p^Џ›+|ҬWߵi"iW?QD$ulqʫnMʺB*̾YVVv4iʹ)6?MH9X(4]R5^0j=^ʋ7Mko1HŸK}M1gϝ1׌yf"UY *͘Sl><,8Ϝ:gϞ/ׯ޺uܓ-{AH4a#|=O]kׯ]zvS7{7wڮƁ{yƍ4Ɯҩ?ͷo}{|ۈS_JGw}_?y>[^x]yʽ{i++RoyTԥo^r%&KcBJ&"-~#`?.^yFMa&6w"y}n[Q޶pZe}ˮ6y{#ߤWyml!F͖Vy{S{ׯ=V^fn=w{q,]f0e]\=qۿx;l1ا]%=G˧;?ro[[Ƙ_9//{9{,f߽z9q'1|@{~[>skvCo#.j txŽ)ά~q~8XhMwƯB H*h.TI>o7̋|g_}~%Pcff4DVm1ٹSvVY;_?싊;6lV6T츇y ʆ[RY)? Gg.e|Rq[x\8ŷ]q+[Du;o^𵵳6SxP6,]9[>:K3 ‹/&Bɽǣ/|zC{"̱OTj_c}ge'1ۧO7u!=C/|ԛh4~~ݩ[ޢe}֏O-mmO`&|ȝP`"KE{qڥzM;aJϟ)[JnSGYl>|m(}dGq!0,qϝҥo>Gǯ]|U6xn1 Oo.`wA M/YWvP^_r"㈧)o"U׳XwHtljuѓ=ovZtCw8;RtG2Jϴg.N&L;QkCgs ;~ lCl[rw U*5ѺӔ}ʧzPzW,N!>dm3?/M/Ʋ5qEs^JB V`kR-eԓ=y.|cQS4LSRBUɴK@&j ٌe]?u]E} Ve JMkF2s,FNSe ө/PC*- /K)hv,əEH&/ D@e^[B|řLjmm+akUTiolgz:ς-~%~Ao"BȢґ愨@(!Bo1B!̉N&B!+@!Bj(B!*m߼3igw^KACeBDAxޠV^rJD>6i5JoPeqkNQ0 5pY~I}~cLd2 `<oAR#+"v`CQXRdInc(w:өvBד+/ x8SNwnqvQGQqղYEQ5Vl6=C  vQEQ84}}l6:5xޠV^rɢ3p˭Q5,ePyh+c`0@mu5+a#]}~?LG_2Lph4B%`d2n!wRo5t]_mx"gjAaH: clll`NLbcN' C;kke%K$dh ʉRP=Unv;+alh 3q0 Q vJ\IԳA`+$`ZTWjH&IIk`_y[q 0DO)Fg"i!F(.!`V+/} ֬̈͢`[SEVN.(dwR`tTl/r->W8סr*^Y)Gkd#_I&S-AzH VJyO,ڼ5vx&kqǰ _^~ ڀoXs IU/%،Ԯ,,ވ lC80uq.TNMld7bLAn}6>qxSn;L$zrl(׍1>AEhXʖ Rk>|c8ffl4aU!~߷%.nz3a'X(ت s۹$IRe(@]&`\/A~nd S@ v ;P1a6@ðhd 1du8?/h40u7Ee\Gr:*q5ѳ&Y5-DQ%;_m\(.Ee£=+ڱRRdU)g(ZTm}:V@?mdLW(GEl.?KJٚZͮ5L!deٞڡNBęi]Cw ^mV$V@< O$ә":$Y}z&Ps CEÞzS1;xKU+5!a|^L#Zm}}ݶ!r.{qV jﺸj%B O3haf(0*RZN؝0te?2͙ۏFPTGGVn<0 [9[ yI[w @ra/u[ 蓶'US, gk>ec6h4PYbLrا5 ܣP8ƈO^o6'n"׼Al}[ l!5oL*Z>DBLZ}GLlLZWamՉ ' qjFNSXoONٖcR>maXHyijc CP",agCݬdەh r+|OF0rEna#3L&6vqx4Q^G"ϛM=>)@W DZa] Bu'cɖm|$IvClV4 άP2h4r%@v$`*0qw;>p#dԪȕ`f~JZ{쒵׋q|lis}f=zv$#[r#ɂ=,lܒj ^-CˮE|k[-{OŬCgdv趸l>u67c+Cu 6mj͍"? _E8D\bO4|W+=^ۍfgDٴ;ٜlWv?Ᶎ%T"C?-AlBr;m(є ? ;HZ0OJnq,ē>14 WeHMGsVp#dZnIBk0,6>r&r>| Y,P,n2HYId3l>zRrx0zS0aCJf)q`"[fY "Ac&M$ȧ덟Q&*z^l61Iҝ}:UC?HkBJ`gNGe|cShcsip [3s$o.K]BB{kGo8T%{ [ \-vp(k2$U6M󂇆9Ȯw,<%mm(`h4pkڵ,zj˒?Q7MUAZV>MjŎU:Qt5RVBE~,вF|S0Z;X/UIs,۞Kiq'hÇbGa1qGh%A<7Q`®Z[YR2T~BKqb̾)b:JZ"Ew&Vk2WZqZd6a8-#B[dQ75 Ic BGSuj*er"6 !iL)>72c }>uqGx#vn+ֶjųkhMZԟf3'ŵOgjM6E^iGPd= [*y(j66RZU>8GV9[[j4p8eAř Oֺݮxײ#uJp#C@ȿm2k{4[_˿ߵ(1&^1蹮8zv.~|x{!ԪZvET{ίbfE|½JH4(= RZfݶV~UZ|ȩ++$[xE@T 4>VĘc_vr %uԓl IH7B=|)f1ȥZpc{# K(R+!{#>6[,A b%CUYSON'Hv}90!RNGU֊מ`Í]VY=GzDkOp;/[tińl .|%I Y3+VnW4seQkHBp,%@dv`1'~1Ev˷ٜpgͫ?+BQE n\RĄagnkfI husf) rG\- ԧTsbV懊`8??C-L ZѮ8j"IxeR}.xhz?خhIiAAdžHTO@}- =IghJ^___ޯ&T@Puq3$JAlqTny|}Cc*U وl#.١y^UN?e%:atOAEt#!>&s7nWlkH$Fԛ -i}N?/}6WV 8W/澹5s uk>lmRhn<:L2h4 9d2w a6MtrͯˉY~ NF#53qG~ 8q Rz2} C`04>r@$+gۖ(`J/*{ek9!{rgӻbttm~z^nRrb2LS^5+By!#6)^3eJDAHv(VQϯip^O)D}N5=]t:5)XD>-ldgTLc aEp>8W :/ԝ-:);`wŁV ;d (>?va,Sbᜆ!d)R~ nEһs_r|܃L,G-@?h4ǡ2]vlK*P>PGԮqvesCҭy*e+&g4;%L@Ω5+B(8~ ^!eE}ƿ>(>`p[ǏyUc2}^>|A >Z)_!@EωuM?Z>`Q__!y~:o,E$VA#s˾)ZjrF\d%)Fjˈ_ZD+ָ@w*~w$Ip Uqv!}bS|{> 2qZ>~=+/Fܒqs^6u6Re2_diK6{ M)rG=:L!ɫEq*+hvJ$t3LuܨJ>9gˢrޘUZ͕6o7OT!sE?u#kZ ;&^ҘCJOu*l8Th0X_(rƂxm dy{Yrl?R4e ? 5rG6:Yi=^E`rSnҏB"aN:yPEk\8ʇInj(TC5Џe_yѩ>zi:=$TmXTef~2BNi$;Be[O/١huTPLidލKJj8}=}p0>Z- 4v8@k<,SqcF/ V'ڪݼjB)vMsZÍ"c[pquVpp!խgYruZtO6w}a"L =Y3e:<Ut3m"y*ZÍ"ԏ! [ZadLB T>'Ux^jjBuzM8\ٵp=C^T$* TZ~ZtShϙ$c$Iv?F|K*j %w`Uaa(_W'TPkb޹+[J<#OS|U]I(Y!>Qӝa͕<,*K?p#d㙴- hC nz.eq,$&~ݿld skZpѰ$d}nW,Y#ks7~^tVY9)R*)lSQy?$|OH&s\7@pqȗ̀sOx8F:$.й"q̔h4Z=BD?IomЦ|=xđVu:$9eS}2XX[ہA\TSaFQl6#=412}fhקA'I TV<"P:NQeڲ5d4Mw!zGa!.( 1l˞\2LrUJɵ c 9p*+}JOrzײ5ƣc666R' [KR ա-vtY 5#I,VX񑡩H2E2!ZbZf`76^Ǿ{찥nj%-[K0a>=?@+EjY]Rpw^ QZ-DzO"l9 R~FQ$u)BsukU||79_tRZ;n EvJ` dzZYqAS͂u:8-x8r9PG+swJk mf)>dC!sE|&Bd$ lL9lv^F#ʌh3s/V(]S^æ/ԙ0 "]UrYw=:-V/23%fhhq[HIk7~vi|B0\a# eE7ʚeQ#<#ǵl ðU+~Iz=z8"Ug;Ëݫ*cx+'InK&}}]qL> ΄QR%^y[L]'Np9P ȎғiFxDR3.VF#<#lqZpZhSBaRzMqi)JqQdq.P@Bwv-z; C{ذhd,0 /dҹ/  !vK݂AV|/r"ėbɞ4;O}rmF-_qsig* ;!^O6lZ#=_n[õV g #L5WqiU Q(鍓^o߾l`0vQvx)׻w,_Z->R1qf`1da,q-MZR8tM8/^] (6.uBs^O~(!y2 CG H+Zn\t]nw)g$[΂t-BRP%@JG"s#勃INA VT;ɕқ?P۷q#_~㔿o%iSq~rlSF/_D [Db9X8q}9XO\QZP+8SƘV%Kl6S j.c0ęaXB Q إ'^ʇkekB/;R}U;)^o߾}qV?Z" h%fV֭j]5 to1Bȼ  жz]Idl-T4!!(YGmkFHY9Z -VK ~GPk g7;r[@5Tdk{SR4@G%I2e-Z Ȝuх(Y$vvŎn,8DK%*5U-@PCX4"ck^A׹|{Vsir!dP%K]HVA!ybbCKkj[Zp8D9Fy-?E pS̒$| wyrojEs!dP%ˀVbU\Kkj[Z|kGB,xCX6qX=]5I&ra4;KJs-!s煒ݘhbV 'IeGl=tT,t]QGE8=!jXVjG 'BO8YyH{*,ѕ' 6{ΧXTJ 6R_B dyrxlԎ185hӣC. W6!@I8jja5{j'ק1S)~Ǣj5" Q };w8e%إjHH|Zx7p󟏼uZ @ՓZU؊ {6R_O*(et:0-@Kg Њ>*WEֹ~Ft`*A`)y=n^}K }Ʌ(Y:|T`ABp6w65\l}DIWӁҷrDATJkίBe0SH#-r߷qZU׳ǢSyw"$ʣdkմg?GQ 7(?.V@jgr\1nkfBa4 k׸Jyl>>= Ee|=P%aAD<$I`,0BN4:b~!U,™qG\x$IvzmWL&G_aXpsV0cQ-<\(eh`"hTQHկXQ/ơ-pLn Plk9V⚹-8^W/ܮԢhcfA\+U@Emvy,,?Jp؞mdUK&6GQ+{_8T>ʿIM<)ulI#u?ȣiF;U[yJCk 7d_*ÖyCy,a6MX`O,[B@RGYvU 뇏\I݆\+/c PA+B1 aٲ[BG2h4$UCնZ-Z |@U B+y H)"i6[& %QL +GEANg:B `0h״hGQm<w\]\HJ !UZ(\6z^E82@zdkz`0#t:h}..-< :|7= -V0 Ð&߅Jsgz$dP?J(өٶhЧۦ״4>{1Q9w;aH20^ Ʌdrزj5ZY`(\ζjN#8Ok1Q*an7$C(Y2 3_,,S>{Z҇Av![d]AGG2*(` zr%ZzE]:r=3 5G Y(%ˀ^@md{ԩ qrT%;{FO [p(KGx D0 k3ͦOfۭjK%'dq~BYDaO d1!G !DFj Irq$ ;$YL?J!:Nh4asE$t8ҧ,&B>G:QR9N롿F@{=! F#C^^P^O!,-(!BB!*|Bv]uE!dx&Bf<!zB!I`x&B)A$ ðBNzB!If9L1Q kD!;G !DpAH^W]#BP%> (*!(Bča0J!(!aBH%\{}$*RB)QBA|OR !DQB)"(!@{=!ȠBthT] ByP%_n$J{=!(!RղoʣRB/Nhzb_m!d+@!;*=˞BP?J!:4V z^!G !D$Ia$!zBѡg4c(%-ԏBnw2$I&ILGJ!E7\u!d_uc?;+! D!:z={^a|=!(! c ^W[B)BtH_ ! 'z^́zB)C^1 %P%v%^O!:X4^$I!FAL&G ! '~uш")!zBa<zt: x]XuV | jGɰM$GwxZ.I6e P@A(Gg o"Q5EQ~H6x"HgheM$>_?j2h: w[vUɶߟ8GYQ;S{#_g{796aHCh0qZ "O{w3װp?]x1Iء?8}eq9bM'ejBX/m(Q%"3Yw]Yg*[ӒIWO?hdld]GP]mj?ݼ%LMMzsǾG9MfwA7MI:?Ȱ7s3>>*P.,_ κ՝qZik06)\O]P8͆gx2eڬkeԬeh{-0ǰlO|XP@?:,< | ?}?KO_jbMK~oY>vQQA•ODѱa1X>>*[·/ݼKɄ,| K/s0d#cD;DDv cFUG2q%_|k=~<"*3Tv5R56P@YCD@<ǃ'8"0$|ſ k֡ ( G<ɿ~k*tLÎl BfYvq>H*)I4S0Kն*+P(˸!o\`BP$oEBP$oEBP$oEBP$oEBP }7eKp`N#o":{|WYm @BG66 XkH|ybu=t**JWБQ!t{UӸӁOw J݅YP\@T*VzEU*UٖFZYXYF^>PoxD*t+a/VϤl  v`-uT ߮c~DyRVyd4U&I!va 5P8DDe2ufP|<b1Fn( m5:"bYV,n0[;z%8V0іH6Xcx1i[lKMl6~P^#Ddospn:ȶ,˚~j?w:gߞ4E7F[]""łN͎Ddo'6>5/^z$=̷Ò?vߵ%r wD|]P;O/twe&]Fd4Q*֭V1}qgʩPIDp&,z~!Pɮ 0yֺJD4ED4st7~$˃TF[(Dvұ:6*#Nq-E)%ODԵoC$)`54Ih&OToj|I9c|(,&\o틵CWcokD$~)b~qocr*L&k_&lOݮb վX+t^aikni/h,Pr*YTø;0.{9!YKvEw[ryu_ u1x?f88 sz-=nS'.nNZCB׭[{a|W}5*"wy"R^ZȆ<<_ 4İf"+@=8uTcCfscjrp.^ى`N:rcɩ?߲:6UX~w ^W91U%㱷ZP>ckμ=]~%H@Z_X..#ndڧ'S bSBv!osq׿ZOD嶙>1l1鰉LFA"\1rĢݲPf=%KnK,u֣@1BA5E[m;ujjxx|Rw}QӕHeYr Y(E@2 f[ q2gkJF:x|ת4XtNDUOWu~J?ɡq€摒e Mz6c{]Ɨ:"gk⨈(J<>vJݣL^ٳvڼ|$O0kC>pq>RUpq~:i!#jُήCP$oEBPUzI gVռEVyB÷3YhK$eTim[W֌-,2a;%O0dc"uA'AKAl U-MԐ1?4OB\ +5)Wy2ZIO2g@Kadc("ddVv6:\%|n[myuӿ"..GϿMian` \](G/A[;Gn'{?ggj]q}\ɮ~CMTF 3Esb܄͂oٌF26nϷ'b}/sBλU2 j?ofr2l3w""J8`bWnU'Z#%Dһww;Tuo3xiPL8`Y7 ͺg)nIfQV.y6^}aFFY;}WOߋ'W"نZa]CPLT*n3gW-)noT*ǡ2JC?RT6}=11ݲg"_GYAֶm͒ԣV{V2]+oO oUTTܽuͺOi>ǧpM?R=3qgw*[V.=Z#JǶꙪO?2xƽ}rE2Z=>CFB[5ݜ؍w^CAX 656!JG)HdJ;t^"r骬tR&6q+R?xߜ7|;LeEZsOr6*W&RTN4I5/۩mJWvTŵwA\eKÏ7Mn.^}l6}nUO!lCJiSp4H 6o:yVϹsƭoyMFlq"wZ}&}?w[|YJ۩m 2UIO2Bt㦗LLfp9Е=؛qm2m'yE/9Z.sg(OgT*UTnLXHDmj2Z:Jj6RYFQrDwCwk_22h|jRlE:V,X>&fy#yc$ɱy ݩm2U-q]׍|mUTTnEN#HezPK경g܋ ek_sll]V!W! ޜ'VğAvTuw>OrX؀4B`*AvTFKՓPφ8Po FzUTԧiѨuY0k>kW[xhBB`٪-M|DX%6x}Z9|^f{7-A; j d߲:t8!fرƄm}xWA@^#udd}@X%y ?W=U%pƩj2x1]͙^Gl!G&d~UhWoVr>˛}6!l#Eu޴~^klnPsc|hwqoQNPI#KA 3?œ'ٵh?R's笟Ϝ'⑯|R:牬)abﭯx≊TutTFUTwFd[xzj'K7#PX:=q[ UT-d=/`<3E 6k3VdRLٓHy]t͙tM2_źòl;#YOVFp/ 8BB iq:}p4L ]hJ1J[!S(|wLf̜Gz+ʝ\&cquiOӓ9w'h -wq! ]?."!Jax5x^..#yDZTVV6Z_oʘB^N M"5#1׌tl YI^r$ɘE\]ڷxkI!O2$[^rmvOLLkn^f{Wkfzws'x{Kly՗I -5rgg,FO'gDzHWTTTTT[0x٬k9" =e;1*#akYzF5JK3grxef@Iҷ(Y 򻡻:*coџ 8&<),#2 O6lؽ!OCHvB8WC-Ml4s`.40A< U=66fl_BY֤&Rbwx]'sa TUU(x'{fW!e`  7UoC`'NNi O7=VHŹuun䉓+f`h}UquuM{fz9~cGYlmoq O5Ok`nx@ @ @ @ @UMg2* "м2O "yyѤ*W&e/j\j5Dq9|mf[j"ekd/jq#Qg`5(r#_:HR??xyʨV^S>E6n5z>$1>o9[[1~`5(r8'w&uÚukh^.GQOH@P}X"!|(7"!|(7"!|(7"!|(7"3|wM/җhxsq$)Z5>>>L&hk܋Q=pqlo]䈈7l3U7\B%8j#"e%yT*5;0u FFY;$OpHa/}KR98ol-\7wklh5.ml +TH_":DDt<IWDnr-σhО}{U}=udI=kܚaDq[PCcC\~ qz%R5[j?֋/yսRܸz\/SQqg5*O,< eN (UPX"Av#+[BhP$=XsPNB6u-^j٪Oݧs2@iEBwR |(7"!|(7"!|(7"!|(R·tb?VmD M~42kf-cg~;iWߩdžwكm϶P?z_PJeQOSɊ )6=BF3 c10>}eYOMgV@bOm}jVʈP냮H(ruҔb8xHdh'@.řqP NYZ3f]Hx}VY/|f ?weYo=D:ṛ)̠*W MjG(KVYA@A*<@,y9QYi־Xo<s\8,nD"ߤoۘJ&IYfkdM!;ÌIr:m mcX`AZϙuAT@z0p}\{6l>x{&ťY}Vhu2wo5l323p炇!{b?ي3fK;?NMBBO&謴8B9h;c1W_hr<非d‽޸u*+J|SU,TE %b1&PA^rƆF[m@>kԚDr&sȘ``E*ڜ'%67&RT<_n>2W^@)7]C~6ax{+w"I u;H`VR98 9*$all̰ 1l1BzpzCD}7'6aoZlsVX1t hӁO>PUUUNP>mekAZwgV99i92ǑR,nΎΦM MR]}utwFM'O>Xs&\qq+Fq5tA"b{^7l3uun{ka& 8mm&'9:Vn(nfKӳyU͖w+R3nׯ\kΞ=;te2*Jء'Lh`Bgg?:ԏ&PS`(;|Z HoQU7|-э%WH0/<4[2lfiF+$wOjM ^=o7ю}tO P1,ߍ|#"nS!yVwBʶ <\DvP]}WTT+OT\ wԜ翋]@[9[NWYv5٧5qj`^{7ocׂSZN;42BD/Bu/o q]UV36z쐅;;dp4Jhcb-G{j">𱙘b'7lf:aa`w0;ظMF`h0sWF\xm; DuGDP]}\%b+ՖZCϯ3_lep]QQ]_ߐV顩Y GU7#ZZ:8Wly<U ^mk0OUR;`nkx.PhK5TFtˆGnm:*#Qg~I7fW(%*wGqظ׶k"=7p\nk6kdxx,V,;z?F9B#x:ODg|W|Do5@E(ZoX,h<o7l3P9ۏgkr:|w#y7MrhU*U{Phu ]8V0іH$:`N" CmUʰ旽YGDs^\weM?5;Zp bl-_6$ ;ng?' ~fk&RfmMQkR)>>Uw~=}6=x3zchvvˡCD4;%WȄ,BC]'3]JH]B,[kXl*_:Zʚ@ ShI|52=$|5؛+:Dp*[kη Yf-^']o/K ۴~"9+5Ya 3MgXH$ Dx1_t blmn1n?`) M4p9".r rYN͎iit<73eq5蟝y͝o; yha~*C-BeYp8>RCd  ޴4SD4X&Շ8;t;O;_ .$'-- ]ڳoσ<ƢBkʽ  _z8ۜ3#'ͦ7=ߩ0,@ -oq·/[w:==~0CƭFn`VW7Toh}suK_:rǎ7z2*`Q }R-z1A| ʡco;9l~zʔcAeHoR7l&愙|mGۚMM71m7r z~Q3-M P$oEBP$oEBP$oEBPx<,uJRwaV)YX > KyZ^S)c2ೀ]B"UK^YV)YXr0 KMQcYXxp]Js+&rPS,,@ @ @pTWWez8XQ$D"[BrH?w<8EaoK&ɓÌK/)($|Ziw"JBwB՚5&i16m_œ9bb`DEZX<<,y]ucjUr*YQQj gNXYw1K[on9V{sh͖_;a7 :ݲvrl]_ػtwnin Gb'"OMrS0_Ww IaOs>t/t/xyvE' b,u{a" 7{dyxݱݼ|;jw]9p664z/{]G][88In+>qHuUq⠬S]]q wwOA"X`Y},;tuHI^(uז3 \ݯ2e,+Q`8qVaV8Nv3?z2oxdp r~1ṙi`ΓlOA1< +H/nX,FD獽zi ww65[jKMwRyB߬˲”1n!N5[kMz45q r2v-D"íO'%on*%_Z O_ՃW;Q{`z`n"jlh0`kQdhyD>4PѯF+6sp r^]Vo)}RTSPfK`0(.c5Y}κed4uZY;ٶru2@)v wv˪ _,sXfaS񤈖)(B^[\}#xKe.Y[bga%e%i[Up▃}0+z@ъեXW^EDz:cߊhw^ѻ +Ʋy!Q-8 RN򢖰v;8՚r 3) >e8 Ag=ߩY%">3 )[pd ߋ45o3w7|7K8m7@ @ @CXYaEqq"E7XEYqbXG9fC@M!|JVS]*|gơ.Bf07!+Xq7|gm(W H HK!EZU[Y_ե(7]5{SEYg}:)MQӿ7 `~bQ/AEXt3n"k}7uL=!TH&柙{>)e/s*pwny㝎R1"V+TF3,žƄ No[vZr|S^Ô16z}GӿۏWZX.Z:^u?y8,bS?QS45]a#dB֔2p\^+[z~Μ^6]M/qjinCsgNwM޴/oE:"{hav"7ŧO ʢ۬ D2a2u}W}Қ"1bmը5Ao~w#-q`YvZT򅟾TT%cJNb9ӓH&JUpxĩ;k~Yf[ Hl]%7).p(0 R00_2?O&DTQQ^f*H$"v};?gbJYƭ[rI~BKsK֚w;:ekONW^2p:sfKBs !|,lw 7酗J`.`kٚm%nit8*"*v737eNĖ `4P$oEBP$oEW!^z߰2u<,u/-χYpaRtJC]P$\}Ê?.'oXik` "!|(7"!|(7"!|(7"!|(7"!|(ҬgܥtfYÞ8(`-Xx ɔBzj-$b@ @TDzy8YD"O$ ݏDқrIENDB`tora-2.1.3/src/help/images/browserfilter.png0000644000175000017500000011661611303312237020641 0ustar michaelmichaelPNG  IHDR0cG pHYs : :"tEXtDescriptionWindow Class: tora4GtEXtTitleFilter setting IDATxy?|63(젢.Q&hby?c|E%h4Qc5QDQVeGma}nUU};js9N9}og} ( HX-Cϓ  W5#$0j/grX4 s#'6a!2t>~l`L}a\т1N4;ܺdNs Vdn 88x<=Kja!3|Ytuq1D |8q!H "NKь3\ ʪy!=EA P_"%1 U/̓u"xHˍ)G"Bӗt"t]T!lug=6sM"96,dWFp|ދ1Գ \׎1M1:zG)&xjᘧh1"X;"zY[剭\^uT߳s3LqȆL$u2 dV+$BkcCc]ˁN5 U@^"jpep!bi--t0 ~A5&1{ 22ArPftxHFj QZ}i@dD,c$8y,yq?hig !L*+JTvt3c"RKaDc¥ sqڑD~ȁ)f* CTNcUw+ ,{x%yZs4R=:j'NYD bfbK`}xgi64)L1p>W 9 P(6֖T* W<Q'n&a@N8oNDxҫچa$ɽ{465¢򲲚^ )*~,l97HP 3qw,vM4^06]*>23>dj ]ycap["厮W%Vkg MQ[ZXHΜ8 5])nN@];Ļۀ S8aGN}3l˳N:1Rف?wؠD}SJIu~0D"g-|ݻZlƘAH2ܳgkz*,,ҘhkeLR=0eeez/p4Ďtòk3LJ!1ӘFma֯߰MZZZ)A0tXMueY /B `<0CvkJcS'q/Ԛa:l# 0<pdVWȌqsR^ъ'_BQeX7UT^p ݧ[]HY09v]k9.a\)z B\>#۽:ro\xG0tݺ~g}z,KS;v(?uLիiمPLx 4MO. .qgm\YQ؟h@  r MuM _W[㧝#jݻvXbƍݻw?i555Mխ[vɒ% 'xd)66U \}cJ9*um[l~/YZZVUUe aHAVq Bj@/ec'A ɡl?@ ]gaDw\&Ԕ,n@;\߆(ds"{-@_I[v7L.7ñ(K M.`~;cRY]Frv:b:l( T9mSke!t9B7o|3NJȳo߾={Vt6b-[6M,-+ѽ;uEP(ԸT0q/I|뉉*¡PsK3g2}IEeeEe#nwʻWU"F[22%G"֖eQ2 UUU)o5Ԥh=vjϽa>ٴqY=Zo@W\1o[nIS;reH ⅁K`>e$Syk"ySdf_bKx֜1NN*G-QM"Z#H1Q)0@P@I c_씹$N\.6\eHY? UQI>i9qh̺rb`ru)nw{2SL'rl)6nܰqٳ=Z֢E̚uiͻ ۑgޕ۷o߲T*)98HM~9[6K&RS$AL,ĤdTPLJIv1fcwܩkNmݒJ% \EPM-aMZ5xK I'L\n]߾}k,µ׬{沋~ѳ&X߯-_}ß/n]:wf( %\\f&h_=mY=c@[<.=G^_Ct?$XV2AmV4a%h2ah&)?d.Ώgua!>1fFÞ>ۆvAÊ2>("m"Bg844yY@gB}"Z7<o'bO, "2 bO r b' )47q>2a yVL1D" &|qbHD A 8+`vɓR İ#-c.9r BAf+u WB #jh8#Axt#Gvw?g?}хPQQ9a$yz[bAUWLWLk#jjjt@|r\WXS˹--6Z hiiڽsoyzz7KazI6 ]᫫XO+VwX,Vuίi?k[MjzrFف~ֺ]>ȖuM߻lVA{t~MO_zտf(y=L*m]ˮǏɿ/FX0f,b!V/cELm dR9A\.Z@A}-u |"<Ǻ%9Gv };6M2B XClATu$BEPžE=E-~#X\YPyc-<(%Kp^z٥!)~ @n[9[x̞~Rtqq1w#ɡk}'c\RZB),HѦ=< ms5]?7@z_W=)H{nϯZ?E:4?fV[h$]~^?O Tݫwpk#_0랽fOjT!>?x,iպ}o]>{MZrqjs/KTsF&\5Q8;đW-iQqx-*fG¼_8:wRy˖Ɋ`Ø^ H 0tRG( PЁ *;leʤT@XUu* RY̹#aIC1Ĺ[MܦDiGF_7EE7tHXDGc2ƌWLԶB3߿{G4ed i~ݒlHϦh=50M,kj]^|ƔqNͳ[5S̴ydMiڬDG"ah# zs_>*{N27Ŭ_Tx\>4#!Ɛ&$N(-P\?3DNry  ui\1\|Czdkb6g< @ iD6/3i`_!h61fWÐ)ؗ2@RfaBUps\ yh$"566{_~8D-qcLD<FQ.]tٲewνRuDcTJF[I"Djkk̟mߙչԢW^yc9ۭ[7$$SO0>t)S,^ꪫAL-L8N=C\=#sf55uZG BH{G{q8 kYt: DzH~`(ѐ#n@YﱅS ԅH0l &\؀+?ZOAYÔ2'/ `L@!R̢(}OP_ؐ= |-(GF [u>9ʗ\(bϻxnbz3QNgD<#$I[vTl&*H2#lJWTE =T1f㥥%z2u=Jّ0~fL:BRͻ驧.2)(G/ݺu\1oYg]^QnQK@P9d{8!MXp…Ν?=eyT6ݍ x8(jԷo~*uAJf:]ZZڧq۶m9r{1ۣG⒒t: ښn'Mm,BH(\Z;L/hƔlhUig/Q伌1ZosO9mx;?l,޿|Rt~*pQjmOQ( hIF0ʆOs+ǜV֦߯8 _rJrn.9n.oY}+aV29I8;.hAG!Gr Id ^ hBkOХoex{vR NTUy-Enl fSis֭[G%o~>(0ѣGIi6M۶曧q!C1q&%%i:Y)!CgR\R`s0,U z뭗\|1+.Q5cF*, AKCNc൯n_][I˲ 'O~F˲,o,J_G`y@ II-dK[BuCRT DvP(>#B8ן_?"HBG5-*:s-rDۀr P3{,ʅTbl2xCyzgyњ!lifQQyDb̟DȳfͨQ'X[YTT0a/Ӳ D{J-JgR\RJW*0ҩTQ$?, jaRQ4M_tŦeq.{#_vQ'X43]^Uyׯu{WIVF yy˖.[|ٔ)Su8HXG0teJ39>,e=h'В3AS<=IhQv={_̣3!Hkl4gj nR,߷\;ȝLQ/XAgym Űk?=ėw29x~џp )GH{;!Ap>:V-zñQ:#A9#ܹ!*p~uW7Q >-sCyD3 yMϋa ~9`rC,.r߮χ '|ۭSxÑȲK/_6uԢbP@"\|٨G6Rʯ0>I$L2H"%Ũe&;D"XT@ &(7Rp?0Ƣh,[L Sh"s"˜g@^KʅdVPiZ&=ih#z7 ֫wX,#F*?Æ zڠ BRb Vx]_Ux~.}7\pѪ( i G"'cBoưa{Q"ρ:0ҩ4!2؋7N!79ޱX#_*:/$0a:M* #h4b !`YYv!Tt:3tX/T*|kuHBzM^OݻWL#zQQQ$?ؾRZTT#H&LX^VN^<#q^2VN0P#x"n]AGN"\ӵ.U&έ~ IDATH{#ZDώ-Br|*FyFh .-x2fN a &Mh0iqEO>aC =\PP 2Gx>rٿsBD?SiH6R&ݬqBVv3ȡKrYJf̙ v*(S' )W1#r0wyR+n C}Q&퀵@AqsZ&,@1# clGƳ,["tg|UҽkY:Cv%nJt*N"H4+)--)-%J&SY B[{ T*L&cyyh/L&dm%$gf3bXqIIII bӉxK.'ğQ5c2L$yyy15 ;:R9{NH6xOD%!_=!jcGά J&dR uL0g/g)-cO*COIm%Gm5u*ZHu%mt7ƚKDۇf^Ld3l2Ke3$Z |œ8o}dX>S H>e@Ama`ͯ3wD&WՂxj%-|e8xҥwy(n7@H*NRz^ABńI"²Si o0s, 3#;fpFLjy*tkL@>3&ePH"6A~%vw.iqD+aH4Qqf{M'vz,a@2`|37ȯ&f Ģ1-<Ez&S`VMEb̢h[ 0l"yHl({lz9^||8d8P@G|އjϸCtY?ܪ+{RɡÂ8ILU^+ 89~rm&gPH 2ȏY95sNek' X~<#34S\yk^<f :)CǬC3e`;:G6gmV@ 96[-3 ~J\Ylࠂju§9$C|!$3MHer (ߵ YZ1W#Fi/YbۍP< =/ GA\k쳫KpSc/F!LϠ `xbjD4K*B:HM NХ &fA,<#2v|ϝOcJo6441U@m)w`%>5Hث;vt!̤kōy|:/j9yy.QPb_*'<`NF] HvJh99 'r!"Z 55458ANQU9qZ"lau5"N(2P5vZ[wSOBRfPID .j$Rxpu䠎֪6x.tQѧHB@?DcQ*%}̇fTdTHi̿9;=N{[,Npk lȂ%ZQBHk&W"QS14u:\%gXw݀8GpGZa1BahYCZILca?tqEԝx"dKΌ)wzW;p}"t8D ~LG <|?Oi{uT">ji oΊ"S /^S+<ݳ 8kY83" ":)Z&?]~:N!sP'P^lse'"r)JqU +&mhnA~V.TCD3e#G#]y:`W]٬67Tkv#^xj(5+Pk:P!81hQc%-u'hg4Y$j1WfCl?ɽ(s_p/ys Ypd\*94XvT^8Rz@k,C`'΢Ʊ|Pז#'ؤnO)= #8t,k?ض B\6u@B>ADuL|  *cyyڇEE3$nŽx,L!ԧrJ_œfnP$^mSU]p[AOQ%@ `xe6ymdiXE!ht, CI=E^ΕT:Q\LT 1mӆkI.pq;eJ aL]MYce+ӹL'h 7.Q!QyatW&|s7C O +&kxDE/+?>  qm8xgB D+x2TM< ETbQ?z Պ*@9KX9dKZ߳\0R;n[MVL$7D/|7e\@??Q}2hD{-PF]M`ܥךSݨ2n\HEDXZJKW$Oa5d d[ W=thseepo:(@|j04uȁ44)'j`‹E:Xq7ӬPUu? $T9{ G{E#o$wD!O-6f1b2X*HzUm Dͦ3H̩TqlŮ-aP++%I#ǥ @ f۽ztODf\BQ$'PO'ylx}J$d;|ܦsR9';L:ے0Img1u4oM ͘Gt F.DbnϐMk$-J٠1T[Hh]c3qQD*al}*-C0$N5Sa/cjʂ\6`+GUa/Yq֋1j]/1Ƕh3/NGQDymRrYL ߅!eO䔅a4d2YUս 2|nSSsX,>*` 98AS ȃ|>(~srV[*W^|QPm*ߨ.;B.& ]p89{ʌL;rh{m^ oPEY׫D" uEb=Jڝ zR ˆZÊmT+0t:HWT|minnhhϋpϷL'Y$Nc7J@qJp&-*nx'2FZ"&G9R8HRq4>+\ c(uQ;o(QIp>tӲZ[[O:̲̍ nڸ$ uIH$8hr\^TWOG2#IȯE(abI_r{;<\Kj8sMށRd)hb]@@3MT5R;́N! TA hD qѵ__~Nl˲UVRI0n/iq>(k̫eDR'3#烎 QCV]oDuL+ML sъ)'wr"X6jT$YDwa[? ^R50#D9% &3ۋYTYQdeEEsse$hۆUlx\ΦϾT;m5yrJ{ɣa`< NE[Vi_P٘/gc:Cg 8;Q兴2:+ ?PpMKΖ_tUc)bڶU.s,C*k'QfyD-BR@.̞<{{&y`|u#D+wᑠ;̀# \9i^N'7FY~Dž J.ۊWI/)<HԎJ jQ"őuxƕ˄2>A|'ZFspΓ~\ZۢXNԨbqN(EOݔdS^aeޫ]ldy{kL83^*JGet` }qT{"X}P9֌zuuǐe;?n9:V]ÇmX5}3[xɺMijS , ռo/>dӺES/>pհmOcNt<go/xфA@ ղ?oӔъO\dHׯ];`Dzy扥!nm;`cMZpb@ZHlWhg5;Q8qup%h~)M ] " 0&]y" >K0ŝ#G_1jYzFZ>z=.9oi=_jk}*=}в0wYa͎ЪڦQ2r+¶X~͢EmoH-ye`6lXG[,V>ӧ u&nA٠biSN hjސ ѲΞR+:?C۽sϫK}{kj=~i|ŝ#FoX>jYcc.CrSXUVD\Ł@u?>9$|~nDhǶ{sYW,N7Zt&6Om[+o2{x1tl{ ^1Ԭ[[*3@ξtZ!$v/zm1Mys&VEE#z9ɉP9"߹ᄑWŷ_#Fm@rעWWg_65nzחu3**œ;eͰ78eoU(+™oU8V跰;œ_١!4~9{;NyX)`jH'Ϛ7㿽hЋF zd~yΪL8wRְ|ui%S$״>3_=m1GfΊǝu|H6l޻WVϹbp4n|럯-dJw lAE"cۛwμ+#fHԯ0敻9ڱ7&wt݊WxmE+ K{WLkoX,مɅS*I Z5x+ ?؁nM:}!UÜJ|[X0abW_'υO#fDKM`ɺuGT1Q[7)uR1!Hx_q#<87fB8lX&o ?ڶ ۚ:LfDuaƌ\5hŐ}ٮMm&cJȘ%)LXQ2%!`YC-r,{Č۸ax='B,Z:ύ6R  EKֵ(0qumH\ZUc& *2۹9e)?iq%!BBq'%t{ss{Ҫu叙8yw^x=\o# B IDATzX1{iOtܗA ლh%ʼOnts * Z- 0ah9㢯TJ#ƘQw̴coxxJy4vl> l ȵ⾾+xg@^{5)\~Z_.-~[dx՛!N;އ@QlO#ƕ hX\D⌻x!E}O>׿%S*¥Xi͖<DcU.3@JlHX5Q6Kc)@!aV 0;ҡ*Sܮ*s!{De@ <pKH]߶b9B$sXE+_Z tzXEǚeۚMFk>p| IĞ+omHRfvjjJNm6}3m1E ں{vJػ}OCbH$d{m=;/G(J8;!NB ^;Qm3"ʞ,"J<"mj1"C G.|K!⻞D_kdI \Bztώe6',ƨQgg7l߃Fa%Ԉ[Ίns0A UX|A{v65B@ztϸl`vbUn>J4}ڐ Y1aap5b5+:>^dVGEP-ku/湅蚾orZ9Ct(G_mC3pӚ~'=Pݿ^(8}z%/q**zqF3g-z|4 L>{Lye NԵ% cgc@."x٣NfU4ͭ[N2%t.]"H,/o80Gd7_T|Eʏ:N2>v@,b)[#yp0)!2P͊=I?Af:&'wOstuu-HB/~+VPh۶mp8=l۶5[{ٺ%uFEOЪ`*:}' pmď@ z F7˽&msg@&d\T yϊ ot _ZȎّ4h>@Mnx1rdF16{'G)~gqr[R0E7v(+hԾҸ4Pj 6__QYQ_緵m\ah6|nU@%xC/Qm6l.: ?*OI}p&:~w" (gܹsߧ=ᄾfn}M6ٳo߾&*b<+u=E2";ysK|6޾c}uu'lޜ52k)e> :Lz{!8^~"C(ml Ջ'7X2sꚚ.$Ow[&5Cq-ZE #\Y2ԤC2T$K)??WMA-[VZX\\\ݳguMM~^wBx d.6x):;@EDAJJ#HeeE"8/?(?/oftU/c m 0~dC>8L3)AђAf BU[^gAa\R %H"yEEEy}V،ؙκN}1+Gg\g=O1u2U :V !yyYS<t(I3~[~Γ:(Gq{DxeHrqt+KYL-jz-.{xzs>sK c~ $Zn<o3AaFȆv/=ZK 9`6gl`1+HuϐLx~dhͰFZwrIY\S7mٻahy.jPm[d27΂9'fߏII@_< KDpWŹx PWxNtv*HwHndhqwBs,m_* # nFy_1 EqxfuqirCX 9\8,5_pS.[}9):AoXp.tlYtc'2U+UC!y W> (3qX$( _~sʏu̱p'ed ^VbP׉;TPyt Qh{XJ.\.!ngOxCA(CZ,JP@SDBP3.iT{eee vc5x ^+477X,,,mذat  (:T?pР חd%7uO߸U|X=7N;yٿޒϙ2~3gvӮxfsϘ8W7%Z|3&?+7ս)1дyޅplnI<v=qǟ<ҞjyǜSNV[O;~zP@2x0Ga?xUg_w}s~߽7}vC7nԧ3Ef O_ϒ+xרe?C$._H_o?1c_%WhY>K^o֛v˿%/ya'o֯/[3?G/;G< 37͘8qĉKmM[Yo;(*r-wG\w)5#JOo EOn{]IeZִ@5Gh3)fԾOA3N)'+KHe;U ytlS_rywdjkmklS?3,7} :no׷O:)pր>DYZ`~xes @7,Y;qW7TvC >ɟ(1O03ҢPzϢ?ϽE];:•tfዦNzovvE_+SǏ|u?~qKҿ9?%ǯ9m” ^9yp^>sʞ7uW9Pb&=jPXɎi۶m};EqxXH$"hiiYAaa86M)B|?d-FIذA={uۓұCncO_Rs{5R) _>};Eq80M#H4J%8cFkzN${# 5BN*l~̓ RI˲m񞤨W 3F}غůB9lhx{5R) _>};Eq$"4ͶT*eYԲT*  hmk3Mm#8g3t.=!s__zاenW}uTc[yqlw-kMu>|_Gmt8sjUSfoHN!Z i.aJikkkt2tzGDҲ޽RS f3W2c6.ų^Ka=N,T9=qQM)V8%7/~k<nI[ϝ:q̼s켄](gۓMN?~0敇|+ eY&M7ᔳ/tgʳ /<:v=BJ|X={iU>˵smL&XևR۱sG~'M/(%bL&X=g蜄VfR92zȪ0"agkR;,cla'%ǿݲnM/Tb|.k];_<:h[l}RfZ)S\2a9&ei?_xhHϼA}6):̞_кy3g<{CH'E96֎Ry'7rlL)ko-HCԲ瞟Gq0 lZ1i„SϿI*{/qqǏ7SoY*X^Ǐr7'sO4aY~-1HX0+y9_l::28cd2qR^:L f馵S}Zf9휓B횄-;K>eI3)]) _̼Ė2vM5R`M?: fMO~9,Ϻ񁕭VSYLSs5t$c3zv.@sO9_` g(󗟿Uyۯn;0aFAnE9:h1վ|&M~-Lk MxMܷ;>a\jЀ &aG!ӦmHg b KΛvv3/݆ ˷8GZ;:㪿,NXyR{Bzk;_pg=/d1< z2y[۪&u7z"w7zW^qyCM/C|ovѷN.6u-~^ m9F_pQd(dPawQUy-g RIa@BoJQiwݵ-/(6l((@@z!!PR{$!eLa&~y 3w=s]\xK0U!|䄥PbݜXylЅLWq|ذO1l^_d8bȔ^Z$PkE U¢{FFXV!fPJn@OM B@%J ԝ^#ϘR#ƌL 1;JwZi-|Ofmw >N_6(;[+u-`ൡ *V:_&n-5q߬L7ui/tRt^EH/UUEY$Z~[-[s_ƅ_?{qkW)s}M'nx}YV.j&?ҾAuO?Wnu~ MEFFPoBdC{#E];&]z|l϶8ҥK,:BphaGr%ZF}۽Q}qHg=5Tf|z-,Q9T7gͩc}^v}ۿw[ި=5qzk*5󵂺:`YDBQ(hs5edan{rpő2[۞?w>6(^3wRMa31QblȰF;ݛp5j▫j9uVU6zy ,4pLȥuم/F Q?_mٹo.};_q io>Ntz ϯ]}󯓪x9'瞊Ewv5UhO=6'Q* u,0 ܽx w]n+baRd !pa#_x%B!sV\hG>}zDQF*W !lА{][bc^@dz"K?)eMuz-S0JG<|n>Yb  lH7(!l pݟtɠ|5wA}?l-W&n :7l;[ڑ8\俐oWVsScz IDATxyvB$Ki7o4n|b4b8@5;e8Npѧ!-|C:/iaE-pv bNj"d8rZRyG3<'-"+|Qv'GypjoESJ)^I)i# !y^V\|lhږ㳦bL6^',36=k_ zjJwJȇl嬬Y 4Y/_$_ԌQ#2.^.C`VW,4츒SWGx^"̪gi_u3'ޕ ~(Y0d=qK f<7:VoPaZ"ylDŽ)1>nnu:mJW|`4#{Kί'V9*c Sol?veg>|e|9akpgw.~[2/Rs Kz5ْO-|Ąv!wr7žvv #,{qշ1~&Ndk"vu+/gdž?Bvk/n*B}%}̑7qOow`nz{ۃ\ ϟ4Mv{-BQQA##"^fd.;_ۉxFU޸Ē\^.`M3V\dnoTeI׫[nΡ#O|$j^|书#rJo߾K{V^<|xxxxDġN:! v0 O;t`Dddxx}d22G=NuΕr§2=N9HhTeI׫[slvȯ#|T^Vуa¢syݺE)rvJY\޽Zvwɓڽ&$y$HGI\.3$)EK@m,!u7jI`*Sc:}HW[:b細[Ī+rn|O`(&l4 sJ UmGQcyY~2zqNw?]uTeI׫[:i˰Uz͜Q EHplZ$q,P(T*RH.BZMyJoVAy2.Bdkt~BN,zu vN9Nj4kY ẳAQ@R0K6!,%*V$]%yoTeI׫[sr3 ӹj1Q9u&KUt.q  ܆nC!x:T'NzJ0R<xƳ !:n!!!~o<\(m.GEEőcGãcۣ!paC9^ƪUlSFFD(UNn^c1ju޹CkG;ވepFnkh4p^.k)<\!NWU*e;ϩJZὕyǭpo mC!x<mmūJszn1=pa+axE VZ$Qxgߵ5ypKDBqu?p~Jy2I`X""?pzB֓geX"I !0M*ZNRpM(e?lQaRJ&""lHId6[""" C$*ۑx.0x rt+=y@nC!x<m6p[+ݹzR*no@Ǔdn-Aݢzig<ϾLTZ*xޓ@0kE`40f]VVҨ5)>uRպxo΀^ޣfpS;l6[pppҒ >S/R=a.IRuuuXXdt;FcXXXuu$I~֓aZmV ŽjZa+h<mp؋>GO?3=pL ԼJ% %6hiÇ 5na@menı1]^$߬Lյ $  zp4o%+/|`[U2{iY陓u]|j/3m,S:SggMMj74v}숌I8opfv>~ɣ҇O·ŶŨ9H˘.ZeⴴD2O&fHK5G/ՖgMfsiIgMH1g7\79oAwK[ӡ{>/g={6wcI՗'q'ֿ0V3Oa}=7ȲGWYogWYådS7nR=㯫ݻoe[M|ҟ /}{|ӯ?~ n~aW797`zPfdb?>:sZlnmvs^^T}ȟ̌1 ֖|OMGǃtJ4IΖv/BQ%,Z<rG> *N6lSC ?h쁁2u謠WmNXK9fdrEe5^Wc ʸMWСL5nb\iV!' WL"'fڜlZ8Hq ?Q˵ssEWԛhPYu﷎zo*  V;ꊦ"#(#(B{lgMkC,!Udm Wj>+/#J,O\5EH/5T/5WZ.|]Q&gwhvmr'M $ vwW xo1>/|İc{ipczXuO ՟!kfyZl+m{_dž ν~ے ʫuY]͕y_}?_;ofmN7ͩcdӹJ9/7|PJ6h=x{c^@dz"K\А9Ie\hG>1m &k4x?]^X >ygsEW \iȻf ҩ9[MT|?E*T_te+geefZ^z~"JO˜zϲVÇO~۬3&=떿%J7B-A_ʚޘnuBgQgf=ɏh\.~[Ge_R66>bMsa.ˇ&edd̚sfx t7dҍAp¨,d4N 3{y7UG.WT=wǻa!yvnCl+ont)<[ih+jKZV>(t"{s!xj0-)!xr k!x<m6p᩺zKk-8rg=pl6;ih%I$nSBBd2˲,0q;+,Bf'tHMv(EPk4A0vYTrb@G@vVhYR* X7{ 8\nY-3a\3:b_VxtиZ= /:Q4 II C fEQ$Qm686!1`4 ^7scWu9٢[w]qҲ}l>qb!u¢$U1nX.dXEQS׋t[{3'.9jpcӭ)!TqOMWi?ڭeGKxdLXzV1pkTA*Ja+ʲB0j~BHoނ‚LǴbjuU* F?.Ϟ\ur9uشqƅvkـ{7UAoްd2[-Vu((_|ٲ_z%QteZ#"L&m~^ޭ}fȜzB?s JO56^~k/|ھPqGgfgy>!ֽxژ) ^:0 _'>ُ_^kڸ-8@àoÃc#ryHd2%Ibbbucbo1 c1ZkB,!TdEz& 9"Cȃ3x*۳xJ6hT~AA,ajƒG΢Qo!زt΃y75C~Ã0<_*-ҧCۿO'r<0vY4:jaY89CVBDHO-ΫhyB^]U`%zӋ'L^o^h.vTm4.oY;rnۊ7d̡7vBPPȰ0 ܽx w].^,T(n rWU8gP}|C|`傭hG{l`IJZdkG?px}ȢAtZ D\=s`Oo/fԫ_w͚k֬]6㪍.?4.*ם)OI;ʲZtx8NәMߊ8:N蕔12!1xe&Vs\ؗq'ÓG{מzĒ:斿4;GN=Ô=s!YYP[33Ft߿=gjKv3dž:D$Oz`ms],z8m\qҾ-[} #1 .)ꋇdž?|v?^rU@+f7ni؂ \p!;;`0l6?RTTTt" xRiccbcqв]BPUv튏wՆvzyX,KOIJ+(RB°kXNrBap|BB<$XzժݣC 慇uT*,KW2yQQjʣSȼjРAN_rI|AnvڱeC+Z~&A/X`Y6 yFSVVVU]})AxWi"jwOŹ!퍋в4h4J288lXmVIYS*RR!+BvVhYh)9j"eBvVhYhq1 ,BB}+ihD JI:p l+W&.+,sWƩ׮])@aRg<xngBF0pppG;...%97SSwV Cxx8vcxSjZRuJh:b#N!xG2VדO!V]R@ٵ#޸b3mf ժP(jQߗ BlE~ݳx5@hEGTҼ:D&lkٞ/?WIE%jƏ:tj\h\)]MKj+Q)$nnsNkmh1X#\E?E)M٣Gl2QgcE7bʫDE"FljfE儸vr/7}CW T4WJ GeQCΕ[%B`,+.(Ϳ/*7axӵ94> r`nU5cã'Rl{[[$ v[rJf9'!o [s#ܒ2-'$+V]NH+hN"lP-BGLr}"UŎb9w绌5!=7*20Ȏn6IDAT&c66tӬ:~d?|FSC5G>}+زf*tޘ/QBAPP0zh`~sn^^B|J{#oJFϝ!tefBAARbbK* Vs8w/q^c\.!xS\e};1.p RW~g4nVݢ!.y/lKc!..!! [R;~w6yQ3Q3[b2-`ٳ[K.#GGs0ONIE7}rϞu%~;]Ku]߯~ܒu,!|e !Rձ"q#sULJVN^@f0G!|~[~I<6n2,9CV~X0ᅱʖ1m.'=UzqB!q'3hl[ןt_oK%V>tMՓ-[dK*0T ½ɺ/ufX .'6&Nmӆ3[=6~Z_]MʓG W]{XwJYhj?2;!D2/ȈS7{d؄BMDhN4-V;`TP2+=?,r*9ߴ[s \dRf?8=ZBeG_H~ע ET0OZIxJ( B̹ @í9Ob,r9-~q8^+>b^:yš~wp򠐚^3NG!KW ۠&x@8+j&\MHC;f̘j4 VNpɅ.Uj;v+ihqo+/></></ 9\\ؕ<ڷV][ ;nbd)#g̻㓋mZs*£T ]oe<i}j+! oK%z}.eȕ?qc]|"xσ=6[1`aQ^ysrXNCt|".P9KH]ʐ[f91,w" te|pqC2sqU"D:m H5sq3 SSM\ЃKZS"ͧ_4qûo)5P[EMCdu)CfUr u+t1"?]p d+ëM=8 32nfYw~ܼz;TaqfˎɘIʐ%o$_Nʑ#+^F>1cVWW[]瑗Ы;@۝?WPPJ>Rؾ=έ|:hðׯ0ֹ~xD@D@D@u#}|Be硌s^'G wUz!B9!.œS6&' &n(O [y=dӇɐ<"#t6>q v>7Sey/[XA}ό*ܑ'\E}ƃ?TуϜ< DXUوpsXʇeݻ8Bgø#ք[)ڣ'#G ϵ :Rt$T051Hm>k|NvF0!&yl^J.'1l|c5qab<<@+=W yNY~=HAjRtd[ƨߵBҝt~><ϣY֭B!mQUF>Ĥ\r\fxGu>1l~>!@A q%1+uuH] u>1l9&nE>4?4e7Y*'x '|eF/></></></></>qy;`zۊݞa+[X%m 0 ЬQ#wH[9[R%и#'*c\B УߨiB-qK6)EK nvًL<@'}z,'~ѠݩlT4_8Xtwvj)5yOR.<7wp`C/ڵcl/ܰfu],fU%.J,!ޙnp*3|bت}=F:±_: /?Se'Cd۱3ʨL*rCQYkpJ;{ t-en8j뽭j}ܳdeLRyTګD,o>YE0/^p!TYEU` QxJ:z'<*5]O%JhF=PXRmI* ad2bIqCV\Xm"*T7w2PPrrք79a+y5]2u6>~-LvT(#G_M\QKBڣO !c(*T1`Ty͸kNI$*rn*T M۫z/bKy\5db! Rym>O(c?2W{EF\FVIjo&5tI>qxl{Ìt%GN7İUy0d .!>,i_VA4 99\=y8Ϩ#3pqy{xa {OoB5 '@S>1lEn>2j0SҘ@NVJpE <Ϩ .h@F]ǯ<]@WGyf2j~B,r b3iT4`Є_BXU[h:ɺ힬&?쇟{Q''!$)nCuxP3^DRrm90< (Q*b2,z9K$Y$AygoV,Q*B wR)U,3 *Z!r|RIb9O.J(x0D$.EB B!`CΔRJ)~x00 òDZ_|T zk؊aDIԅ5a$z(x,G$J%B=;ɣϰD%t<%T0xx`HPJ]D)D`ƒx<(LmσA9&=In Q*QJ9 [9Nե(w.b@ *yAaJRFD&̉#x8fW0a$J9ꭳ8N%kG(R40D(ԣp>q [,KD(PI ð,K%?G)!ک s 9 [y[~3驺+nC!x<m6p͓R*nFe2[7 !lִE #gHH( ׮V\<Ϸ~xQl3!ĭ6>GE<8u( &ћsF8%Rr!ۅ5u |`El6{yӂ T=z] laɚB B k&HT]lR?Vkxxxu^ i1ZME$b%J)!myX/޽OIj<ګp֮Դ9_j Чzϗ,|`=Ȕ8(%ܝ]-|J ",q_:=Iq?]GG|k?#79g:J/(d͜7;s؎U,tTł,_o=959#<*m+ez^5}J jG7SWڹ氧?5wVsȬg-Y ?x1H=h%.9w:z#URf2pА=e%J3k|ׄs&z]V; U6EɎ^dt39VjE~ JWV΅RmVf8-y̗sw&{O[B_Zcs+>;bُO?ێ;kR,Rg|t[~W˥jc| ?Eshz/J{N %DԟDq {\=΅LfFd%6vTJʢF͟PB %D޹xUYZtS:'jY*UyhЃߔa9u͏v|u\[viC0OcVMM&aXXluSB,V?RfCV/Ϩ,R]k9oϿ-J,ϴIBdP9K !"%P6`8_Qy#լM#Z0<3r3oR5;/^?!JF D/+KoҖ+v~9J!vUQ?yt=|dy=zIPʩct*5%:Fov8rM^5m|K34I7U DZw%,ylqYuEusK,^n%ʣgϸe4}g]K?۹A#k*V?vSzj ս'o ^}gzgvnjR֛>'A ʛ;lXO5_ZXS҇MX7yFگ 1K71_V^*ڑ cO͂pnu. 5w^vJM3.L64|lF]sX?#dO>-{isylkw))dLY2ja*ɜjFZXٳu^&3 'Oٳg Y*oer 5mQ&qPUU Na-HlyqAT*S榵ZmDDxHR7:>eYN'B-77T*5Rlu$]^S<1 RJeb*dpM!xj;W<m6p ܆2͎?<%fSV8FT2BīF |lV*,Ӱ/ĕ]$QyǘbιrV!~@caXT*ՀԜ8nV>8 .B7+,(c.[Vh8c撺m 7ࣂeWDD| IENDB`tora-2.1.3/src/help/images/memo.png0000644000175000017500000007376311303312237016712 0ustar michaelmichaelPNG  IHDR{: pHYs : :"tEXtDescriptionWindow Class: tora4GtEXtTitleMemo Editor/O IDATx=wE3/lN,y %J\D="ߝ`>Aɨy@<$(*1aaiw_鞞-fzkzꡕ9Q)̃oW/+0! a#Hrޝ~5uDdv6O{_i9At@EåËF K$^pkhc]a,B v񛂡;~uuC#vZ_i{LLձ^% vjR`x+U^\}Zb&8.!c@QAa!rH["Dgku͑#k#L2W#A;  h͍p@lکח EQmpHer(:VнF^?b WՉm؊Ͱ %E^)B)!|M])jD)私DSƶ9h [!@ţGvI5'JJJRRҢvܥM,fn8E1/D2VBBm(۵{CҤI*N[n#+ cA7q T?lD'I&Mԫ\ZZzL~N7oA, Ͼ NkAQFǫ4j((߱cGnn^y%{\/9}G]g$'$6hЀyԜ6#G5c4S3c~>Ġ- :i5nb#M61-n vG3w6/LLխRl:j6&[FMQQ~nUP2q Bq۷8nH3g4j0~;O%IJHLjܨL?IŒkeHss0o԰!3b榴d 8 ѣ*Ĥ (m-w5Cc[;pTTińv;=%IOhP$I!l1w  C>|D.]Y6eg:cGs>APxO ro,T 8?Ev[t1Pem8 ~($c]&ZtXQ%^S~`UBS+xy$Zc//TU){.MpcbB ¸͗3zcEСn+Pd>th}Ǝ},7l>sqN7VH #>0hС!dd9{o28W" R0(a%0>|0ㅅJffdu\~~~ޱ~ڀf/+!p-[l\6y@U=)1{5i:"pQC:s闯\KnJuY>6jï5cZvdbp&#my@Ҳ3g |"IСC U? G{Z^^.Hb4ɓ'SRttɔ)Н AVd r)bYEcʕ&L4i+ve{~(/R,$ySE`0Cs9D7nh/"ʝw޵xE=cY~MSRd\*ء1K EM̜9'uI+V1:+V3EEx@rOʠ:**JAp#$+1WKD.= I'I5tNJg^^[%)ش' \9fc~ؙ3fv+d'T|gƓ:}zld@@ܳVF4iѽU5 8v/=ZTMG%tǛ3䔷yEр \S9}DlWwţb+Iw[~-E1Qf`0Pe@#!E|$žL&f_ca0.,(!nw|B(<][lY|yǎ$#Qp#@ &P;YO:5tȐI&y睤ŋ,Yf#$,#@ \$S%\O>˖-;@5$IVt%J0Y;Kċ=Rs /wl#3Ze@( I$"gXBm3gLZX{oYj"AP8cxǣ!.>NQY ]Xx[͆-}ʣlxqE?W}gЂg_sN!<یpz'=]Y+>'b="?P{w>93*Ub|Æ :dȨ_[6>哓v v69{B_[{/ta֌-Œ;ϖnN%NYZ9` ٘[0- vhѹ{c_Wo|{= m_|(ذR+c@r?޽!c>x6/w׳ eol(PV8S5aS5cJA8 $ XXJHA 3a A@$T,~(NAPu\t[%%%.\xꩧ3xU$ x u9pmc۷عsC=4zGElGzJN:dɒ|h1$>6(u̐8]߯zdi/-FV^cToEF K.ݱcG^6o޼|oF*p~=1yMz0 ={ FFGLBUUqq<agQt0S8ѵUwSc|`M[f*B(7mc$",cElU4樤 ;ܬ-gV%L\1D'F$ƦAZqlpd31Z õeԹ- P zjyQdNҿ:5xdMRSWG<+.>nU ~"d0%[QD# qe+Wo5a2O8 S$UqF^:995wm.))QRdMqapi#̛Iණ̍h˖-[l5_+r- ݻ*{AN*H@|||jj:C 6ho̐6_~?..:k~nO|A!cfA4 ߾w+Tҥodk+?x;T!$Ʒһ;,Ӿ̔B˫%Iv]"':o5rS]ĘCJĹv%pzʛZ~|(| H&~)ܩ xʞㅱ" ͎uؑxuaÆq"1%IErdĉ hժ fHdI-( Dq:v%%&^bB)! G`:0Xmm c7>}zٲe&MyHEo;+ŋ \Ų[,uŇ9hh"IRttL^_\R"˲(޽{;vi)XLrԸDp9₁ǟmÇ q+?\d8sz\wͿM~i7<״YKt0o}Jfw>}SCF. B_zu9(r1x) FtPt?\$ B{D 9&:=!5.ĘzNF-4,Dc!YXhf5I5m+7j5F ג,k}L8]n7p8fqOPhe9&&VyNr38>`bb┖ʊ"cQ 8qXa9jxülRAو4lG8rDh1&$&V{S fÂ] A@MIOO8}giXTNgD{ΝvիwLLy^w]:uiӶ,I2}q@ŭu?<`RSЬ.<5%m*C=6puU*_Q쌿\_v6@1q І>C6s|xz.Ftrq" m}c9b(kDAf2 *8%X! A!X#L:#(:۷ڵw>f)zvرK۬,`g&9ap8sNw٩SYYXQ*ncr9 ^z%+J-D8!áiq^1@ocZ,Ni~~0t5U֨mVTMZ e fzdS|@ag8@!~(ICy$)z?,yA]R औlذ^CH pI| bcdmuJ"8].ڶ҈W}vJ2`MSR>NNMEGG;] yx<ә#;;1!1 I^'QD+M{p)'iS \-y$l&8ujG?3C/N*s&[];"f[]]5)1IV#1^Dd(A$&$ʊz;$IF#v+劌!x ݓ{7XOޗt11vZ\]UERUYr0FwU\%S'1&/Zryw;6..6.!$>6HL!MfPKc ;)(+q{B@4YBgCgAj `ZjϏ1QJL\ ~C=;P Ͱ>1F5?e`vJtA ٲPh!lݠK10u>WY oZBtc1,zy^ Վ/4z1K7J75@zP7>ko0"2}mV\b2MjE|>  ?:23`7l}> j,5UGv`Wx0(h&Ch2 !3ݑ>z ")RZVc{ۭ6Qs!c%2 X ZD93z{/0Sa&EQcZtލȲ,[ xuK.D}a>MK-lOȌuXDUTjY;xO) 89Rh`A8=V! 2RaarM\Gg4:CbG vM?FF' X~gʲ6BL#D'ѴŰkehȏ陝TXIY9/unz(1#!*IA 4O{2WAk|[Pu9Nbc\Fr33+IO@7X]4RHƉUg !IJL1( A0b%5-(Vz_M .x >?^tYm46fC/R (r18k }#A<^O\|18-A1V٢_OTWpDv!s%4תiu%QWaahfP!z05/̬ lxYxhe 7RCUօ]QR&=2_TR4Om]'Hyx4"r ˿t:Dd-vPoP[};~ yl|^fX0" kxt _ |4Ld@ByQ#,A}^ $͒##}QGeB9X"Arѭ'O_Nа[}qR#5/kcQjKTڤƥ#\/fJ^jbf =gm|s&75 65*ͺ6 |^$ >~rrBB!$gsw6mǓx_~\ѥ&\8[\\ܮ]X^WWZNTOaŋ5o6zIB~ ;, jE>W!Q%YbA>i?5c >Q3$M۶,WUWYAtttl ZfޅXٻNX'3KٝPHㅅ,?Q^ 3 .`Ѣ=L|/X`à'ݼK+W[^~%RxѢ9s_.!3pʏ>8__а:2Uի&B\p|ƍnd ݑ|[#pÈ7ͷߚ}iS&Mߍ#G"!Sxٌ,%׫̱v?ϗ\^YY0m~/ɵs☷TY6\_M4&iiAMv' zN=ck#0a:u*!'xgxgBm-Z{:-2e fM-z^uB(??Y PQYYXXp8'M6# p"#!<[7ouVnyjjxm۶ cxƎk `ݺuC;vmfƾ,Y$""b۶mlwƪ)Nm͛dɒ7ܰo v x@O#F|ihرb֬Y۶m󘉲B{^ `xokJpMWS%PpF¥7^{ϕ ޸ɿTApAXm., N/d 2\8^hلc#c,.Xer*Qsa G(f NO'=7-܇>Rٜyi1<a }yG3wΜsV 45<]EQ~i7`͛Z믿TVTb׮Y0/F[ivJ7ـ1Axߺ dɒyy}:% O!GFF 0୷e>CU?YYm $ }z4\4T ^~刈yegg_:!2 71WA] ֭[Yf۶mg~'OܿNwSS#LA E c^\paӨVw.ykhUFyfΜ9{lƂ3g6K QYR%6yyy4qB!8*`P~'xyi$ %](&>#bf͝;w* Bo~jϡ###%ȡM۶}{TtdAAAWK$r0kԜ_LxyߠANNo#,h)&ά6vKSukmwrn63g˾ZR:9jE6;,ŻnG-dqbt@K(H()HdDwrtjK kק0 !?a|uV0G5:̵ю8114x“'l޼y_…[n }РaCٳFDYr&f rW3^w fz-lep<)7)6lx0[(aO`|ǺÈqx"##Mҝ?T y(*8%oksh0`b-lvd{0DZ~*D"+i`gEeBm۶m۶Y  g;<c}۶mM9e?G_X V $J\o|ېL>% VB47ǀc1D)E/7f nKui V~ե$346`7)St# :e3:u*2gA ҀrV^ 46(N;ŕgekP?nGf +>_zmke׸j1yoz|uW^P.U$6XQҲm>\?No7}gƃh;\>;V`ӦMSNmD}fbgnxm%4 uP;N _k1[66#y3,#=G\Z!^P=Ԧ\o(iǚh &=`w"VQQ&k]a-Q9YQ,g(Tك!gϝ;G_ mOW!1::r*~.(HNO&At4hPoߊ#AkK9I l}S#s)EW`<|MȐ5SMF 3m5Pyӯ_Nǣە[\'fkҩע <}fo߾4Êf5XSkusMhw65Ÿcf1L B" ~sȊVdkP;vZ\`:(VtKyGCۃvc)1Ȃm0@Ll}P/-BVBU~.޳1پ@sI():ݨqa'E 賹 =7;;{֬Yj*NswuoAV}iYZ|Q~996mke'B'RnFl@ d A~VZ6V.1VrwfQ'Q@yyyRSBӑwej9^X,-\q x[Y.YGA.ǎ|/'w,#%"} !Ynf3Uc/?uT xʔ)bw fz3@[6:;SsSJqC+V)ף_P>1ӧE&oA-}E#"݊"}䓏5npn{3?'GѪn qh@̐B2ӯoN<:gG}I-/}6S,,mx$j% C>O/4deYrGD4u`@MFtUTV߷|Bq),,*r)4Bޱ!n©~DJu~1,t tdYƊN B&&0P]B%Aǐ¸q'8ƌ:n`vp!|rc\YV\14Saѐ:ݨj;a}xB6YmvjY74aO&r)g1F _~mۦ'jبa|\hJGbqp(}1,+.[U]#õż2nWVFaYk3|xd,@"{0spvr9ׯyZSopYI;0#0 "G݊"3Ach17~#Ul98hY0U +n_]И:L1R+cΘ2<"Ȳ&|3EFF6mDБ#wޥqj`17jܸ4&zAe-r]#Zts@*),,+n-~u2fhw]X99TBɝdgx$*]tÈ+Y$+.w$kh 7C9A، MAh,gD+#,iq~pbRA(Z CH,Z 11))Ĥj'jyo9e ǹL0`(I$w+*fEmYXAp;5+ [THMdB kRKeYV7e5rӏEkżӤ 66Dځ1Ak ԨI&@F<[J"##xL?fA cQje'd: \bPwlEhn%N"rT?oz6)QOMLzͷUm` ps%14{=E4b5(Eb{% #0L77ڱ BU6ƪ%%aC:4km4}8c2e2,5/9)~1g` ސ ;cAx M b4%XngGm3MѢve30 3/h(;,BcgJ HükXg@oH+no W%t l cevϿBqɌʇuXrK Tތ 6}=] lwG*f(~E Fm:W{]Wx1M$t0`ikXH&#tX@Z3n}UPp ٱ4쑝)Kp1@nũ+.$Nz@ dSnyaFbsk0fju ar}3m-1UA+ʑEk7]2\ڵmr9HxbqV~;~O=ki<3K!}[S f`u]J6ձ4FkO3tbF[.;M{hvG=?uη|wbݚ;y?vuuq-cs_LRŘ坑Eύ*y{_nor5uHgWO^-,<Jux-ٔ[xD_VѼAQ7A'V>O=_yxWM&Ye[W~Ȝfc?oV ]q]mm<+fV`w'L /woǟ*J0O aA%Ѡ)+ElbdO6Nuf%hGO&Zt5̙4s4\5gL7+rѢa{gt ϥV6ܠȝ:^@wL>Qa[.՟/=T#?*k5AiP+ QtTdH0UcOU!& c1jά9vʯ׼Nup 1tvYwd!pIő[7h馯.VVT< :'{xq/?2vs?>c4B.ƤŪkGVqΠ=Zm/A+H h)(zD3ʼ Hhj|ϥV6ܠ{ >s+۵H83js $var\o_z@VC{`=A$ f=Dw_5|ȨirJߤ:cSmlnpWj=c^[Pg}>4 ?#M we;i?ঢ়Hm}gvoG9b\HG˚5bYp-/=#r9;[DA6e쫐ɍ*iI3 V+s=SoV8}6KU߾>}yv.tf ѻsVk2 U[v]z^靣PBgo|v-'|0Ɩ~Kl qo4׵4br`ku!Lf>7]3[_u{у9mkB)"sy& "BC&AAbZξD-݉dtwiYgGlHچ@ZZZ-j+׎5ܫ0/҂?O\MnEQѭV ufGd#R١5o|Sor}St )a]qQCR$BnwuT~PLWܙur8`̮ `ldT ORe9Tֻ*ֽ'4 BxBII'cwN2JpiWԐBJCg]ݐ]*B}3\}h!Ú Ir :ƧU]@ u-yrLDr53>'^o}lt$r5{GN5'=`R~M#2B宻f6lcܒO+hҼ_\>U 1i1#θT"蚻s ІOQg]`/KICHh0h_vUIKWQ[P- mXB`vМƔtReA%ķx3b`]Li>셫wQR|UbjmuEv x [jO9"XGt Nu]Q鷤G ]ܹo>>diwֵOyB$cΘ'UlRU#2B̕K~9W˥&޺w > @j ǫ$D.Pq$S瞌/yW"as{`sY9A V~.W ܖS5Ze8m_fqHlN|eE'= upx0I3 \nag_24r"[. mB"P9e n4է ɳ4LjJ|jZB_݈LkӮhκ2Xos_>;[5p̭-}jBq5ҫ{K8uvvjF "qt?"B9[yc@Q7VȪ]組]cMrK;?͇k|sw a (CP@ZWՊֺꨣZڥuuZڡU@A,FDfuG $$.}͇bry{}]:c:IǔF9yxxtP}$RL8o?ØűsHώ\pSyCӐYgWIu;J7Q~Pfqtpu *ʚ*Gھr@q(`宊C([wU]#`z6}Ȣ~@RlgހjN0yb[SPk4@ Tz Zmi&ޕ$̜@ *L*+(?}I1$D, D D"XDP:`B0NՕVQF)OăU"s`<{8EkкB d2wwOO3hX"m]:]bYUbMdƾ#89%2O&'-*OX I34+U>rw-NQ=+ĒXN]ǐqnϬBf>n.vXXJy cO(bJ?]?#PٹGRRT=csCK{ߓR[j,^KuI]E;oձ|eUcwH4}#izV!|,coqrź']g.gްa!|*+OwM8u lD3Or[S0Dk+=i좼(6nG 4ٶuZL u2y!CTWQ;۞<`ԱL|kVU6p|wVLjW^%j}k#>C"$|eY_حx<MfgLCw2%oR )];F.;{%⇾9䊊탾 z&r4:҂[l+9e,q*ZRhC`X>`@ΰ VI#g[mgۊ 5\7Qd焆EFFɤR5c2,(0UD";죉W vRߞUt-vZ@+~豃۶\#&?$?h|GEӌNyp 8efd|x,.8pܺIi?0{|]swNK*UZkN3E7^ӥKyTgϞeJIaȍec޽{_:Z 2zy:+i3JWϱ5~:IDAT6Pr~ƺ{mg vk#>nߒQQR_ɽo[9{f5l}ںÑ8M؜1 *'ޥ$?3' }wju%**C<|ϒn5}o{Zc _ΰ:&*{UkNPܾ}27O[:izwU\%>,4k=K^OdGgU+]/QYsiirK uaaɔ wcįkxz^l3I',Jea%̍F^%D":tذ @ʏ2tذ {2NqŒQ]}vgЪs6dϥ>Vď)g!\ZyC?Ӕ~PsϹ~ɮ9 WVcq3k@lzɛw nCn/Jg{9EϺx"wLD{0}A3ȱ.scR:AZw ALQxLݹfw镊t\upwޭe@xϩkOF5ij M_tw;5Ti ]2|PVT|o=7۱.sWO'R˽WPb ׌C81\y¼]I2Se2XFY ݲb8WEEOXsAQrHLa]ު<=3g4w0C[Pbr3z YGsz+ẃcVQ%wu Y8qdcѥ:tMN?O:Liw(>]_*k'ɆW16+,&,,=أ2 Sn iZQCiY孿:is9e37aE'`1IXwxvJ7⇶o$lg  h;F߃›6:<~%aΘ< TfMx!ɳJ&HLa_ _c&?yL&?'<$⣒,95.51n)gLJM^6sIoS%؅g\n{QW7a\԰ݐi=s.e3iuܧE]5e֯|Q^{?V Կ0kݿ%c?1VUdI3lly( ;s8.?1@ko#6d=@S <|ϴd}l&ry,6mEҦ{tm(`~=vxoߟl9zE1@?\a_bέuf\ aC]]>KT¦/|[zܽw$CS/&Sw( _ñ6Tdn,[2qU nB!-ޝ--jGUV|gGWGz+k4+ '<4嵱w}Ÿ>z܂ \褹abM4!奍)/$x tyqHɪ;/lyKB>ݾxỏLCT{7Sm.iXv|4Iæ.~K07K %NM@QTmt:WS6?ǮZis:kY_]+Wdq@#{JoٳgN7.F$I %\ F.GYjZ+M)UYUWN:d_~uݫDR~@GYjVS}y')ܣ?FV=Tۻ3r|̘1[n]~}z^]u=q!݌?^*ZS27s]4MŗyyygΜYVMɱZ0@M9,^ܳgO__K.k…l,3w8@QB2lPuBP̝;/22ϯusU*6Jڀ_w~.5u9UaAe}2$Ij]tUQTCK$0m+DMá[^UݘZD2>J쟬 wlX+q6 lE 0 M C8AtHĦӬB a/gϞ=~@ku"!B@҃D Mk4Eݺvp'3+SQ{{{o^,F84MӔ?h("IF}ҥl\Qyht,qT*\n##0 j4a Z~0<"2eҐESϯ)Sq1EQK.}5EBH^!e{Eػo_+VV^ 8jz…W\ 2''hjSnq >79ǬW&*NNB#Jeٳl+(E,JJzՌ=w7z 4@GX1q0q=G * 8c8f=GqE0pD*[|ٝ9s̚=فf+V(rĄQlXSmd$8p&8)Ni6F~b,^h R|^'/8(jp0T%_aW4*-BB>\.juq\iza{_󴬬CxxXhhd _ m btvvߧO_z/#, Hǎr` ̃*a h# }oTڪU11#M|e)S#""pxo}  *BϨ C}۾ܼyҥK8GE4iRCo$j%I2;3cĈ]tL H$&B4Kx<gN$)ԓzRO$'z^]Tx7 u8F C %< 0mm6=zTg9ݡeef`fz71Ӧ#\]<<A~ɫ]*>|$bƆ@ "HpPXfFfQQQMe_4@ ^YAa&Q}6:`(^_ӁT9|> 68Dc z?@MKM5v)G[htQEPUVGDFU\\<$4R (M/@T-~)R{+(H?#$%>|S]EA:$bg 嘱W@ *M*UA=OON[rqx鋊ΛyHXJ /;;k#m_;3rdaj*rjj===U&q*iViꊳO (V*͙#kbР<ҩsݻZG.yCWڊhzj54M@T y()<;r$5O? h H |/ }A2+\lBz!-h=b aɖu5?Q0^v U:#}cEC5BgNJ? b &[.շ JyeԾ#[Fc#ϵ 0 Pw|`V-#v=aSaa{ZDD΃gښ8D5QaՠXT'ܑhβ2IEox* Cf]m/3aC >؜o<ϭn`hYl*?O~{ŕ栌@T E/^' zHo/zsč{d yRh^X@1inQI o?T ~4M4 yYDd>-By C+mɧ8! ; }n_Ku7c: 0 hH H} jI! <1q}1S'3qI(wrfDu {XMڟ .KeF9ӅOyےR(R֡xCPi8q %yp{mIȔ7~!uuds^z=`@oe친MZiXaapV=T oj?)߰˄:wȲӷ!$\Z,>vn<6B¥ 5 X"QGBs:ޫydz]/ys[G (V~}yVV -g?Ckn_'ڒpl[{]UC4]Hq<^(Z+si7e8bFZ` o}ͫش)P@ЎOImǰuP84q|6B"`Nu  @rnyݦRrԏ@8niA=PH^yWDQLzeARB־J]"@Rg yWvSH7 W_ܹVs5hj&}I 0>uRm+*"WD,X"`M%`CҺ>}iE mB_9ۺ"w HJ`"5NxʌW&ev!)Au@Wő*AiQ`W[GJ -paE=2_2뾻NqIw^p.{-WҬ7Q/&n9#b*J[E\ѩ+ ȶH% Ru;ז%Rzj+UxɎ [ .rYH9\(Cx/hAm VK(m[MC6 Õ#i} tB!aڒf ĿҒV\R*VQ9U]B3.=r]R5[5քw/ J~ ~K҆s4ʹ;Le8xCk]/)$FSЀ>dg-ä"dSIpq/hQɢ1vjwd,>ptAb.^? cz *,W%ќ\2'8C5Y|74IH[ 1 0 3minʊx?@v4[ٌA )U'LjimdҪ$|~q!F|FU Q#i}mm]Pϫ4q|_Zδatz͚[%ҒxYyuuuc߾Ҹ%>yzLxby<!-_vw#7H9^j7F@m/F{\W9/( .+PYFP0BbŕnwP-]A22|pFGai)47=Xㅄmjn䎅RVԅ @>c䌤ySƥjPݒ< x:hݕ`H]\Jxsͅ:=ym@;YuTE":˳p0RԚի6mmkmxQS]ݷ_x /EE!$J}z&̤o߾xde]d֬^֦abeJBq(>,wMlThqB$BH(ڲe󗋿jɒv˲!Æ }>lVjD11>ͫKZe אgPKjj+;bPѐ;ܡsvNv!x`^7K +qCUc؍`$Dlou{nx/QgG.A "$©|p2WP(r7 xѯoںu.\NjCA=P8onw L` W6/:2M tFÔDHr>d}⹹oЕR=nn̛7wҥv{oՍ;nel.j- zwռ* !b xG^!wx.\+X|y<ʈ6p*p#NuW}`# wOl))"qRcb4)vMmS#\Yp{*)S'nƜ?05rϑ5mU-8R zų!_N#H6ճdN x?" &M!xQӝwasaHu /Q@(nim;>֯[׻O1c-[ƋꆆްG"--.0&PW__W_?fx̤bKK [1׏EL*MTJ}0G}0{Xo~}%k[WoZt`C陓ŧ=_-jq2MߐAO=zel )mRX*kյWPp<%Jp&:L[KY$)UЁX>dhqSm=ْW8fZ5: ͕PD V2O0\:(-J尠uFԃxu>1ikޗؠ4EjasNav@+24B_?vE#"vM`nU=U o|ՑL \bפtɒŋ/>'L`sqrg~ڗY9dN;믿^|Y:iZh@gSL6CvB\eYi ˗e2iE0o[ F}sv‚͇ѯ2={y yqe=Ϯywc]-5y 5Ϝû:4lu7_|H]>bY`ABLlI+$d+ie2L 20V:MM~||r? T0p(YH-Rdr]ʺPDbݡr+aDʫ» 3kv AKMg@ .vnj#b80;Ž,'ɩר]|bb"7Rl}e@)%qĠ$"Be^938~KH:'@Ӗ02 C[V^(IyÐbwacw֖C蝯Vn! r aSvgb)OsB3 3ң 57m㏇> Ǝwɥ>SrC? 5u^ طo?71La-M-"&},06D^iJ]& G+W_r%#¬YϚ57444(ܐՆ9#2b,?qNѪ޲[#yui>־ە5XJ!<A7?yظ\S -;;XT&P˲H( PvA! ~ͱJoF)&ExO&wC.GL dS&ݮ ']R2W˧ao>}Q]> )HU&jBj!l# 3,nK+갆yQJt[#N9OR2֊e[7fTue7]|`/ax됧^jNeÏUץX;pPiޟoeY+c=䧿^wϜv?L)hK医>1⌗r5q>]b <==V\ WCi^CWG|܀mgD/hߐ^ fH}DY<^G7>C\k'%I]QZIMTB=I\"s Ϛ }_Bzw.pc{=3%HOUhw7v):=qmh)𢪪>xǏ_YUi"! 瘉`&߭Yg3g}6|^khhLL,M1 \\|pp>>켂\kD*u֙Zw}ׇwܹ_~)b #QnȯCִ!#nےIfYC9mJx4TTTb:s9'bzeUeYX[Y'WiMj27qߓS"Yϫc?n8'o,]37wV{gP-C\rv}߬f'̧_:8väwLwH9k#"Z_7de|;msY4DÙu\u3f=]2k__s̬cjoVM}J *cT%aANݕP0y q0T'u>.Ƕylv,${NV/RIb&̜ (ԮA[`O(!S0Dҝ %#%䞢W%DsXR4y:Ѐ"H#u4Y,`3u&EЊrqi1c%_բ3@N`>hZU*.gG +;DǂsAvv|( \DbݡrY>u\gSF9G 9KAP&J)Wz'HTi\~ynep,5n !b;T|Aun' )S `& Ҩl唗.&,@rR~~Hov鎓%̉6 ?o猓 p_Lظg<yȆR{&  `.?%lH%SMM[7o| 74CX:d7$&gq&{;wy.O:D#T*0I"D[ mw<3чyxܹSN}3UeLƋ O>Tuu5 `:RvͳgяÓ~i haLz_Z__vӦM1-#WBN[0裏>#_|'Ow}8 FsC>^?3h}tޞÇ/jf m_;ֿ}׻wJ8p|;{1M ޸|Ih;ں䅏7y@o6^Q5ɟHNS0A=Bz씲^x˞ĿFېK@|ѽWSxoyՃVrFM>zcgr^Sާ?s^U!Mր EyIQITxNоoqœ1[#Qm_IjWqW$Ш Pd$ÄU*X"k;>pVɈj$̩?ua'{IB*d]'kP'MЀĔ8|-TTƒ|rpeU4>q(7 Sҫl,~nh[5w|TY+V73L$?袇zf >Y /C1b~"?O6qk8LEښg5_ők׮}GfΜOLSO>ӎ<>'B_]Uqq>QCEt𺫞#^>xLrԩ?l+@S:/:jzEyE2ķ$ *i<oǷ0ؠi46Ds Fn3fS+ܧ8ߖ札^}%Z4=⛾'.a͓*U!>{|֨* #?4+TQ7Λoc[(~wӸF"$V[D%@KlqĹfTffh.TN!fGV"R/D\4Ё1 UXAxQ f Jz9Dbx;4qz S&K\\`qgl9> `bm/K5U6_Zլ[7։R C/ERW6w]b*h`f+*8^TUUْDcY<D#iTƋʊd2Gf&9:liM!IRxyd2J\UYA" Fz~L̘qGTv$C~;Xڀ q|fْuɧ.߫!@$Ο7oySL-/<ޟL%,XFIW D<*g{//JF\ (j"}nqxl⽘`%Lʦh6 M9Oj&h6CI|ѷ75]"r-[ iC8 /.d P)af^;ݹ g9gGذ)/_ nyOY>>MwavD 4e6r̍FS 9{_w !ȿ_n77ء51l璢 P/ w |[p-EZ&⼫w ȉ IDAT0(7BJhRX=.~+J=(rqgv(VXIlyϛ:u=^$ ̷f 1( by82<-vGɤ:{JJq(gM$"rْV!0,46g>wV޻d"{N0B9o5jtcј=ILz _~6tP*}KqbwRWY~홡:zf <*`qA0Ep)G# {#: 0YuU.$'P4Ún UȺY5sx|r;5zb_*P>Gqe/\q)'An R@ \G^J3J <،H4t:L.x<:t/r2IRM.DхƦ????O' *)bXYy94&d2Y/JBe2kQZ.r;,K@Xm"8ȪY޷sMx_2hҢycuE'WƳ! hzs.~ ؄j+H5hwWp(ńD' 4ϘnVa#WM PPJdS [:r̘:a\9,1ԻB̊4evTkuK_-dԻs=f%n8\Z/v'Hƥ6TA%WX"AZY()R.KsG^-e\v୧۶깪/Dv:X 9 X$3B!n6I&tZLJJJb  &L:%̄bX, 2. m}ߕDi2cZWy⵺ + !WƋ['vnbXǮ 4aD<&J+HZЊމSyzS1)՗bWHղ8}fؗ_Q%:c+/ʄ:I\BtHT4#@c$JbBqAmf %N 춒 >!uߴ(lqe5 5EJ/קf:$kI+)ރ *sGD7}lPd8R8ԡV$d2 h} й7(p;+m\pN}WBN$v j9+o0؋r;)e5hwJZ47AN9gA\E89]Pjq>'`;cV) akΝOmB<ؖ{ Pm+85 E^L~[%}~ޱFlyo&- 3kHNȚ-7gwtB[B(p8̿V਑ p(lYS?Vp2c$pu*FqO[d;)O"r$|0q6ԕ[e+ +qV[ug}]5_y有,欫Ń$)/y;VP:{lBWS&( qRO _f*RdrP¬a )2Uq9rQjj:٣`^K,ӔJ>=P0ɃI~hlGAMw,UjrUv@hEaXɪK#8CVnipC>)ϫV]&(D(` *W?~:m N?G`cc.pbQv+0 #j`=H\+uo"K5 ֝\i$7HJズJ֢ . a}G>)[h1xsxڏ#4o|_~V.C!хԣ1n T\ɏ2ʽ?Oih|=xZuR K(f,4`Oy<^n8;E axir4' 68O kǚ KpBi.(C&:L"TG*4I:^[aWlVN%W@0 @!Bw+f Q  G{5Ls-iVE]|\F ԅ`*BIvZȗ_ uz_9=lQ} \a TxxP%zPg8g;V#Rg#}"|0סH j}wx2S8N>s *ͥlJM5+AS/*EQpnW[U)8X )9 ^A@ )H (`J.xϠ<(&^;jףb?IPc~+U<{OPC~~0t(.O #N+} %JSJfYk5bX/?i'|-I=NૄjSj(!Qr A̗Z?6T47&*zW[5EEp7uA4+*wm= Lke+5}yPЈD5j k we-aLsۊHOOϑX l 1/j+ߝ;0E jA9[lLRlEc;z ;%*'1-@hWZ`o&Rw҈/"cc j";sԢpc;1'֔fD H!D*!TN4PQCڣ ^N%r)GCinCku3׺ 'fAE22 Zx}mMi6yP7S)jm}WV^c)0*//k]hk >^+R|ek笴ukp1ÿJ{FyG!cߓ) 5L?E=KеD w5j|׍aitоp*`d/ aeYJ ,8$mg7 fDqc5+du-6T BWR7d jtK+ŀ)*w$? [Ҽ#@%W2 M >jyU ##]H`Do @{]^}!},iBֲ=]is nf[,E BDkhi[H cKE)!{寝J+Q%d;,~${iO ף Ⱥ^lrkUJ4@)%/ZBH]Zg+G Œ| z .W4eT 2"P&ݞ|׻f7Ū{Z<+;HPH֎Aap/X;R4LH(>)Ky$]S%<}='oIF˽=hKϮnfITt!97w:"Yml dž(#:oNe7ʙZ `7+S7 r5<,Uc*9ͅVF# =v$ $^M'gGg %~>mGm"\o $(HuK~ȝA|Vf!۟MF(e VKWdޓ\~6MR kA0_hjj޴qC, :>E^GCIդU[vPg<̚\j˟;Ga?,,ʴ1~JYd։!j|׳;8'. ^c}#|h54YTk4Be0r4U* Y10AkF6H+FѤZ1k4e{ sl5[V*40O05RG(?mȬi52<[UT ]ˊp(9w$W`-8 =|7zt (?!oNc,iL!b9B eW@+)QD 4ltՇŴ:лV~5y%eޕP] 1ܹt-99"IA?uu— ]pU~1e-OВxIXc|^x>> ڭ! ('m zHt*K 6oX]]9w9y9G#pӪWh!ʮ %}.|S4pMV'Q%S!иNVNyt,=p C6^'g*bMw(_K08ѕrTI؈T-a¢ e XC)ğe%`N نL`ohC7bNRB^ -`ajr kByl @I{cyI.̣- ?#bfSSȑBN:[lYyyEH ǻsb91$g[mJp 8젖Cxac猡[sn\w'0W Y[<r[})iE8|& ZKQhFdImB4*6(wEKp!YR^P_ov%r=`qF&މ Ԃ8In 6Í?R*X'|#aCvh<^e_aӑdVk腭 wy@v_d2df@! $I/{MiV\mvՆZXv4]̅+-̣Wz@|fJ»ja1DӔDS|!~YOʣ74Ax9ӧ+]v*C^“|U3]P$ 8LwXIu0wN+O鋿/X2 MxɦwЩRT3K-LO.P@^u=G >J{%6ە6|_oH HB}%h[`Wr/uԱW)/vr t5Y5xF$FUaT\+ &ue$7r  2K)}Yqy?˅b|$䌠h݁w0HvXoK2nIzٳ7o,yMgoz챤7": nNn~D8R]+W<!fY8ڱyL$argvʔRKp CnB mkHkYZH#@l<t)}g\=Cq_Eqe:a%uv\=#gn׳\c_E%Kä YE+ u猑=Iwn(,-6r>a^rBmPQgզ'+)) aBE2=Cע'L>EiPj9B'˴X5ND|NxDɔe_&aY+(Jr+Z&XB\c?a.﫲i]">tT1ЀƂW2d>nξ!3IFrފY6m.;?q:3"AN}]X4?xKׯq 2L?ںǯ &﷟zH_u N1 9[^8<nzߕԧ\-w q>$V2=3BBz8&^<'r $o,GNBju y1ϳ<"YåcEmt'ID fzBw/W7458-?=I.dhfMM[.E9y\YMx_]M3x5Aأ_(DܮqVA*J{Wb"S>uN&^p k漫Q#rXy G⟧ A\Ee>MAsFԙľ+k_㼋?r{ (πXߵ 9*\CtVBgGdqZ Jn}@=@]$4PXbLAE"+B>&V6fuD=.(Jv:,;! 5#ElД$W螫S\Ɩr6|hG^^׽tj!.Anؐ*AD97uyo ,ug;ː, !x˅ kkkeL H4ֺhAy99.!m?v[YrK/:k5練>hm<@K5#;-Rg Pj2s"ڣk*P@>!?_ **xQ#G 40φ}dɒ>}zWUUi߶8%䕖8^ښ^Q֦%HV"*&Mraz9jMD9ϓ}N4| u(B8*yQm5wvxP.r[1g#ү| V}66n{ugqrzyw^n6 0^6ZS tj ra^su<; kYoD{xA>YyP7 2y~kNҒ}.?lGu b]m">%^Sk8^g&J%S TxiiiII!$}ڱ(g$:j6O!qfI)3vTl aj|RHB7$sJrpseXk(g`Od:?P|noĩf|YBQwƘO5-NRQt@̧D8]X ;P@ID }RʹPS9Pv r"S-7}Cr3 yѷg5g1jF[ (Mxt GQ>'аW޲P@=Z>䓽ګjX0ڙ6f4;ۻCmChtA Fh :𠃶 Pw~{{Mm+[[[{mf"L&xW7lv t&ӫW ֍6D 9P0PO:|s={qNvWlʅ^WؽH~?60oϊ M/_g4D/گe;`P@L{Z7Ϛ-E@.N;? ::'M ()ϭYD.Ys.>ʽ-{veE!'i6>;5gzOGWlཌӟ|߾tחG0nģGͽZlE+';u4͚f=y37ZlN=!dP@ytܸq@{Z[cZ/R'ontΖ'LB @^gə^K֥/eg<6'N62/0Kt?=8?`}mһwgo];ks=?RC$?}b2-K7/Zi<!"Ɉ-8lκ'p{m^XXy9 . C?k;g]5e␪H({1M(pBiU'舡!#\9`2%tHl)Kv ЎMހک'qlT?/wӴcza$޿j%OE'Ôeߌʿ@XPQ5<;%4!@if_y5N/Gx@ LhqIN: hf77 suU-+NYW@f_oISIFv#L|N*TAp&jV+iK QP.zO{IW׫~W=tDu(מ}WO?y-w)N׾ďp@Lσ4X[d;;ymӆW _}l㆙s^\>jCe%I mBNfO:k>k;ޯry`Љ?>uZCjqB wm5,w:%]DP@;+o|_b[ OںښA&b2IxÛ;qϹc %G|ˉ9x^ўW}K`ćj?ȬuuN}u_YaE+߹w~l/SuiG"Ͻ IJMS%'iz≷i-?. d Uus_~ocx& U?ax VwKMPP_P@k>5k475%d"pu$M[Yj+W,*>R?p֬?KuDCRto[uùwmJAI Gl>4Zy}'>W9'ng az5קf/Xe]ҞOP@`?La/d2{=1eYZ}L&?^#s Y!BBݨ;iOiIUاSԇ9Uh[1ī= pD~"1 (v<2-}ڴ",5[+?nf4qLMžg0=hjQ/ (bB6-)-5VRZ5""A]v0 ( dE. `cuQNA8DĀ (z2@~ȐI*--F (z8@ vQR)=4#T*H$.zB@H$ W&P@]B#'Q+b;3Td0r(BȀv#PJ{ߣO2ǢQ3l {&G1bss$ u/-oyEŰa-ZXYQCP'a ]mST4R޽zoذz{K¢`g2$~w@u 7fۓΟgYJdr'x5ھ䟺/0Z ( (F].P@P@=rUXo>CSdʾ[ hg&MEzAҶ\i}"wsUW (H+cO~zN+R޸e (vV">_vF앎_QydW1 (KdL ?󅻅RoL0zu4赡2(vb( #Pbv E?1P@(l ȓ{. qy7PPM#"l/mh(/!ڛ;H+G &ۊ|| P@=BFH]Ԓ}~>準Lԧ>kHN迾Y[ﲶ)}liw5"[ -Ӭ^݊ 8.ްx̷xk_}p;.a@NL67fW^_Z}}׎ߴW_eڴ-]JV󇷞uբY#jĚO_{79lP@;? x-B@2:-BwQK:Amue+}*bZ8SM/ g rtN˓|)~Y­s.{~{yp3-k1?ңESg4>k"θΟ zSC'~7=ƗG^۫ZJr7|in5HySxǏ#mPc:|lU76V5"ɓK7mɘonw铵-1qq)_R)JIW-1~>W/_+o%'HoiH.oZ̒ڳ>4z+/b9="F!V??czFG?`FsO\ʪG Ր$~͆0zt78 h;=RX_[QrʸNx0YmvJȑWol{iު}8k{>:kTaCuAFiRڱ6aBf6jDA"%uJӋpa,q1۾nj^rjflJaןqۆ؈OM=چun??^g{?^Hڑ-v~ҵ-n^6#{٭Fo({.(E6ϖL֏&|Ef C5{Z{_>|1pFYreikfbeR['}mE%v?lc|^%;|>񀑽g8h/f?s"zu*ʇHk^E.Ȩ|RXG/r&{}ﯰÆC3=y;_Zq?;< ϯ?w[_=K.;^<_:W}>~e}Yw5~w2SNH (zc9 ?wQם'{;~ﶴ&q[617*0p'?j.6Æ7#^^™7N~'x_+P@PW]xp;N)tNZ^f\5mv8#쟷j댇?˟|x=c/[Z-%CpS (Zoh}][Qrq.(~W{moߑaä́jM#췁*_Q?80iG{|/ (.")?q@#ǃ֎̝-Oy} Ho|  ˣLE`؏~xwqQ;> ;\m IDAT" h⾛iejiެj[z[,m12[ĺ/i(*( ̾xg^90 *ߚ? J;t>ߵFwDL'jn!Pˣ1?ncH;!{w-j=9>`'QoB#ŏ~J>Xļ_-磽`Ka…:web\DSC7|>2cWf G|y8 )dOz!"0!JR#8:O0吢B>{/B?x䫓p.p)Yw.͝w݁nnF(}XUj֟@|Y">{O.;TC|/|BE y$K|sX8Nl\PXˑ򹞶Y ZX">*S8=EsDojG;zO=IoGKW?/m4,,eg+`h.^n8(>n#z.HRc%CH>CgwתyE*j6!H* D\d4&ɂr}bD|r.oX6 }6ND~` ԗ%} 3o37{5Cʖ7{rYla}K6|6p{g4o>3d;M8i}GM}B#wvŹ LJF TkO7,2qf{sR17w㞃5ʍ B|Oz,f|Y(|2 KraL&(u6?F"Ѿ\`蠌i3sY浿?%[ 2covS0?+6YoƳЦYyYg~@|UO_-5͏PA}=5&ZKtbƣU_պswͭ՟+ 톅 ~]P՟*Wp 7`Mn*%n{f3=i|:ә_1\ǛæomK*HqESXߪ}:!~9l$8gL @[P7bù zk*ZA"Dpa"}y1>7.l4&ދ~zGف -Gq̲C}zO-HC:G=c]ɓDOgCp 7l(Ek*a񽟘<q6dM&ld/i1zZߪCwHՓ:ȿNL[PU)ݢvʒxuVTgR?\ax&*DL%|$)F~ X$חy{u, ?X>/CchO}=XR,ڊ̍˖^Zo1\B_?鷛 5$ځ=<FJgt%{6tpÍ^\aޒ\;{1O&GnF%ȅ)brQS٤љt l -z>%&RY؛()ZAJm`_ى蜍UN˾TVܷjצMEF23je70(hn7<%&6m鑈1A_XoH+xnPr' fn_؅u0o#Ѭ6Y(^iJtu-U=LP[&MBDNH{XwuѺ9cgظ vU}G-?~ruc.k8_>t%/d43cgD]M XbM@> þnƽyIؤCWξ^JC{\35Mu:Vo)WjF<<=O-Rj T7-Zc|Q˚5q27觘A\Z9ޕ_^21o"kʬp_ޗnqAlI@NrcG->{9[ƊF "1?%H1~PTPӢ+RV(5j=ֺo-ZC%~t?!Y߃q8_GN'8^O /7)Ep 7ܸX MOo= o֛Z?ٜB$C'N%+kT^iR4iCUM}/Ip1vK?wh}'s.T [`5Gv0j{ȯV ,?ȃUO*u'?ٙN}A }^*DxBJW* _Bc[fW*"?>W717Pr6 XT_m'obdo+}ot6]L'k=(ر#Fۣp 7bkaչioM :2c] :iJV`í`EkҡR(mA'&B%"lll:l(!-'V*K+ |_/qX٪+ydq`kcK>:H k-,O>5`3u6Ztܠn)LXlnsO߻M|o;En6zQnǿ{jxNvÍBO%O-'(o <]Xvoo q"K_;6hG*Yh)) N'< "m>Q>HK57~/;RR/7APDc&M1ӌYh> vc>|y =??K@cǎr YzBسassn!`Z0,E+qܡI>dcGo&M y\ˉz=I \|.CM VL/("~rooEdF=P3oqG/}I=﹭aWPݣ vVd-^$kmw31-d GKD@/)}"$}e6>` c';xh TFENL 90(4@.)ď(P O,C'8cp }Iz-c(E K߾ش)=ٯJF7n6j/_~pdJڸrhel̔a)S_S)ŷo,Z4*)ej)ډY}wO68uعo\aou!_贔1usWc(4mciԚԜՋIKN6ez07~3Ǔ->dwԏoaӯFGQ5|<r#ɯj]wYg6݊ >we~(P{]߉I's:UIP ^:!aGȷi$;xxh>%_O1|m'G=j"P~Q+ܺ7{ake:˧KzR;]G6Eݻ)iIoڗBN̍'ۗ;yi)S .Wut<K;/`޳t-sC Ɔ]l_ 'cG oaWc`~_X7Z[ c;ɯo9ЀQTTǦga{Q_dbٸN#>PLpy͗k ڜy`f${ѼоA~D֫}rHީ>N >JѺJpY8@0=Eǝw\\ |[ meIIĕ{PDOGh:UsSEO<;>Ly%?S's[Hb>;GF5 !bS_ztwt(ɧ9>4n/^H3x%uCy?*eԛG60de+R.;i)ij IK:j/j5ݬݹ<LMFqstO>]wÎnCU2c[GnxЭ@호r(eṵ|]ű.H^| ,>QD{!;B{|t@T?zu`߀B@x֗KVX_$ӫVYo y6OeZX6K `Qug ?r#/B1j=ߤ5k|,xGܐ kĪ ͟|UZǤ\9 ݅젡w>ubŤU%jI>-tzM;<1-57a}j7ldјс`Fh.K'J0l7:6P }_;unw݌ݕ]3cɚ}Jj}|ccq|*YFI 9A! 9Gn?ڙvy&]!{LָRUXv\ hTH[;>G~YO5ЛVe׶J})!9eȶoTsnt^~|#9򁏭8;ۦRO_ˑ2/|Þ۸9 n\QoKc [=_M1™v-~:bvvE??MBClB<3wtKw־!2ltt]S2ٹk"w*ʬAYbvM2Jbn+bշ'"~\Ta+$~x'Y+SqHbWm0z6I&Eϫ̫D$' c5z Z6#G}r;sʞs; ?nV}}Ց3)Q2?޷8^Kt`Š,&٧lL,[zYt]$ysT>cA,;6_nA\䶘y}.nW5{t.ϫC}(Wɐdl@loPiIU( qS"Z.Զ0ύQW_1|-I/1drYo2@ xaMAQ="~xz)N}q }@oDk퐶̼JD}Q@T83wn'U~tz+_yc}|Í6fVX]d([LZi{c em,sԼX/SI_-XV*ƣ0:S _O[ {"I|& *%Q-Y)ױ>/ IDATO}*M?_E ^N6H'PEȌ5r}N]K*=( q`ħP$>W1š]9eΔW4`M#>#ѷ~lrθHPNFS@(|΢UvóoSna\p5mi|ϑu>X^-*E6^J35PdȞ_?`sq^#@65kէ6jlD>b>dO!x:럼XUq8"oW1ctZ_ۅӅ>ŶܶR?pr8\S40\WxOODy9F"X .@vJТ UG,%>tq`>1 +J7ܪgt#HX=]g{W@퓩z]Te0UMq炸|zL FA]DC*]u{͖J?d3X,.+"q'j?p`+/hSȘ?<@sѷ6W{Dj:3_gǐ&76d~-rQCf-{"ۭT0~\Mt;>@8 />%yLd5,{92!ݪR!oGCEՠ($=dO]+{QmF0(Ru{-JO!"+8J|F_TgSN(ͭ'+:ikFqʬ3`,^u{fܴq/ʾE BФ0 z`ۨbB:}1*ka1FUq#7>O>dG~s27g9ܜyco^]6}f9Av[nIqp¯s鷞} 0m 0*)*#1Vԕ ^b}roo7\6)ю#NH\!I$ֶ\9[NDti/VOO qdop]HR>m2+P#`ORpQ+9BbXlz|)_a e)-_>3q`dxXxL°ku^|â?f nڧF M} a}'}q#qQ[s%ZϽyJz?ǍJYBL&5?>߽!}e=,0%>S3J eH;M8i=5$ʍ{2ջt]YL+`S3GG: ܋ VrHI U M)p9p\ md+Aspp#&{xEfҋAw!WhǿU'QTd B_J\$:W@.Tƪ_^/N_^Z_ő x+{7Zh {OJ.wR+s?dP^ͧz(qړ7f֙T:ʙdJ~,ѯ2֥ݏjbj9TP|{qG~~OK6n D;I#izs2dfD]W_n)Lt_GNJ/`s#?(%HS̒/h*s/^T[U*cz= Yn Ej=ޤ fP/=)8~;JnILSbP״<]Hvþ|sF:`$>#jeߤyܐߥ{gƈ9 tՐd;Q yq!|608V;yKLьQvLq&ME+HC$v)4L/lE#bHkҘ^1@v__u F9z~$F%dC~/9f0[oFĕ$?k(J J o0PgbtxɅ  zY٪+VXKb}C==XrXPLϩ1+q>fN2t 71'$֥&Q1͏CdG/ΈB.Y յOu 'SKYw ȶoߟ+)f.~?O~~iJBnn-*"^a[<7Nb]c^.8×T|}Jߘyl0 Rjk1\rHuHwҗ-͆Nhr)?ʯcjP#w2.>/,KQ+ ť4(|i/S^84Np[JThk7<j8C/4@>*76+F!mPgUȫllKH|AZOͭ<Z>:tichɊt^k7.掆T-P`?s~ we>mY3Ik׏8H98`ztEʶw#O|ӝ/<.[}YRi|JκjA<+ui-/i~\3qoCUmS2)KjmC2Y\+wQS^7zT2l9).ZJٱq.(ݘ?\KjJЛLż&b}^㙌SMN734T3?MFvR{*D}C=F(5:E*{wL\8a}8WYo2ys.⡡T{cNYcm(`\dm})3 BO復;e3.Rl*Xb4t7QŅљ]7ԟإ:˥B=eD+Mx y")֘ n|dp&K1M| p^T2wg=XR,ڊ̍˖^ZZufL!Dt*\utRc~(dߞ:: uC~7㷙%msbS9?١+>D!+ގ>?{XNX7Izdh:|n)L@bf4NEP2bʦ9`+O+IM V -{+OR$o]Gs5Q"&!H *n&tHG"[MJx->+\gm/]5cB",}j˱"]~?ÑQ#+VǵN>"ƮX~Gr4G==Ɵhڏ3ڵiziѡ}'̌Zc! s^n7<%&6m鑈1AF[OAEuy]!usV禑1C)mڽNr)Mg( NB3lEPPTRju0ñ"!7(P6h(ɋUrv>!ؙSD{s8QbO,*D"|/Ff&(b *9Ob1{.|~)G-O~Emzo>:W%龌_y0 Vض$H0{ "0X ^ό<ȷzLH)JFt[ʿ|o%a?J7=7rP b#llS]Xչߣ5Ar =֘u U^k[ }(P|^zs8%>9AaTי@-XJ:ҭ`ܙr:cǎzE /=2izPiE*>/t=don_wǕޣ@Ĵ vk+ &S^YSAQYwLYэ&ra\'Z=pzI~2V#Qk NJe3tbygQѭ-=YSo,iyZjyD=Ayˍ;tQ!|D3)iz\sW٪ 5P<*=5dWjsr*Rn(zF*@؋iK{t{UE<Ơ7 =V`ut.DNM/ʑ29EwOq9WC|oV_ N:v?k,%YF% Oֺ?tCkF7n6j/_~pdJڸr kl̔a)S_S,=K.*F%O:IO*$KdxDII BT<-p ۘ}lt;{;l[%ɶG&Bzux$Vvph@[]t3 Oh^R?:{ $Z-ۇ[֥@9e߼xrN+p,g[5΢~I#u# t2HИ٠uffFhV5xBC.QxPC9=囵Z!CRG?wMs[Hb>;GFDOGh:UsSEO<;>Ly%?L b`M Z/Qȸt#(_xrCQ4-Z5Z߿cǢ``j)ij IK:j/jexRo>X۬3[Z’Y]hHS71rt>K[Jj}rOC8؛]վSG 4̫Z1.VFWsDUnМ5_:`˃{B$U(w)񧥅y˄M:vU(sYu#K 9AV-0-(9^XvpdɦN]YPh>/3asM5G*o'Ofe>}:ځ כw$DjQ]UYik- [,5οI@J^ E<\7I$S(kl?wR|ib+͏qԶBYyN `h~na82 ~%}qoOfb44_Q:l,B%<0~kAoܓ^ӹ3cu[auv `sX? sNs$S '-rޤFo1 -!<|_|F \b`+L=EJ#Y[seZ D~BSc`lEýk|~lh}&rlI߅>pE>97l3:Plyh 7dr(%{|('O6wY,&]Y9~ĔRNx ϟ~_rJ觷K{wij)Dԉ Dkp/>)fp|Ƽ\gƥ "wEyD=|t] A_L%׳KZ4㷙OL9/U;Ӷ0"?z_|ėBjE~ex|Ao2ا`Μ2J#E5&sGc){ !b1:N^\;r# ޵!4SsǾ5gV5|ȏi]XK}<-adV~}XRR>|xccNkLjo 7/k>\,/w|s e<˅ׯz dR_9l6b3 --*^?z3-V  _})諎,Vyb9(Kk5Xcn04m-h4PF>Jn-؝ ;Ƥp,=в;l2m(=T>E3FaOٶNȋO=%jU߹#Kp^MwcuyŠ,ϗ,@ݰ~H 155Foe?'CrƣK|tMI.,Ds7+oBKݸE X~hepu{V#/Yǧ@zߡ h==$sP >"gZz7DmB.*Çͣņh}^2Dj }S]z,LAX(']1V"cXIuTjá "SzƲg~@/Iu̻/Aad)~ɷ5B'[u=N9#(ſY|'W誟#n NꞘu9fFȊadbawmoc1!hgj亘?͟΃6ՙ-<0@`LM̱>۪1JhzתTh¯7jBȏ@ + kp(=;gFGdLPTYW]̘N9X#B;A?J6 Ch-Xw ?<6Fd7ZJ:=;GAo9*:Gm4 &rH7M|NoI"|;܏Emᤅz!ki¤O1;JM,d4ӬSBhi`˰*Ѐ[z]n k 5Y\[ű.A6hբ~iGB_|dS{B4q Tm+iT) ƌ '?>#oEdvG]c!h|[Srnh@E&=&nV8V?P֭r0r?z$-:,}̹fwsK֍<7]lG_QGO[gq4Ơ- 060RR_SG'}J*~{&]}&b־YP;4&89 qz{&?w|,<_6yNM0# ѫhgʻ(5yćAaMx^Rhv{hgh@4kFUTpLH͘5~v%RniGrTZWg~w֥Kda!~!!ah .absѷ6W{]fuwqxr]WCHNDy4G8cMt Ѯ4::zY;OcA4ғޫlŠqxHJ־N/z,Su-D9ظOƲ!vġ)<*sf~$W Lqv@pFkw/ TBfSh.|I1P߉ħӭSc {a|){WȨ*nd&A7AJ2k8~S~Al/WɖEܴ1A7(wlX|{@Q\e*YfUΩ fNvNU:%S<({)|wDzB|l9Ya,rлH7M~\Vo e& @G3Q!K~oHȫo)555'n6Q!im\`L42M <^21RUA1.̭}N/-s[>^4OhYή8qЈ3Wj6G LAv܋XTǬ~!a-#c][̰^k?24"63n@W\>>_H)?%Wj.L\PIyu%/?(:"4"qu@>=]gF +iCWjǚGĆť>uoT׺կKWcDL!2P`jݤ^y>P`G.w!mL?C^~$߯K?* y.U2<ɐO-붎ߍ„n.r<17U:s>*)2@@ߘL < }"|$=c<.psq@/%F3߃|)k'KUA\۪.z -_~_xcN_=ݜ5O+_R^N738oօ?kn7\ahvŒs.Ob/]z?`'fnfƈ9|aKW QuuJ7ty&QvBuI vU)˞pRӜ9hF~ _][(;l<9nTuYe9HNLtwzAFqG<0㷙ٍ rq. @Bgw{+]<5<\꜁N>#kzz}րwΨ'q6_BN|'(d߬3*t=%boM\$>h^:42W s Dwa[V(O߶S;UE :zm1eZї'͓hm{6O5kbYk_m8S?/^z'W(UA }cKW..%ΆԐE]ذFkՂ3ssO 72O9_?k^ɽl/*}-%*! 9Q2gVBa(seQJth]Rk'ϩֵ.Eo+TTe*YNY㱂ҥC#?˼FfY=z&Q\-M;Q>lա"(uHk @J|2m'|O8JbGShߢ$v^h$f 뒼|G]W!@PV?{᳽/&EQǮĨ[4M4[,QF[ (Ҥ;۾? (}f޹3s 3{l=Vwi;ƬT|L tvv P +cT޾V mY?ǵsN'U~`*}u *]sP67lt@_Xn+dJRvCXJhuʂag7:UivײأN=`f[b_< 4|&=_veW?)xq+0URb>R.C?0 s^I5k] *{ޓ+)>A'x]!C{U2|ci Vߨ7&}\OCtA6'=W7TV#&ݔo7{Xe _ G>12Z 8{_X_J{F,E~=ܽO$'Y.aCB od,7q X`βʌ{g70iX?.I I ;FuUܻ)l)X!4MjjjNJ8W:`~zWo #-VByF6coo:a:99߿AXŒ[WK}u`nd9wU:!#~"`¸2#1en gϷ"if!p:?cG:/eN3@,,:׮\Ņ|j{r~B0،"r˅D`0,I@w3ef`Wax^~y"1(`:ϸcE\ -XӃ h. &IҨT BRPJxcZ*0kZ$s$'،c>G rINV$5"Ǐ yZ-)ٙo}ULJ|^u!">{W"WC#d|`Wr JT܉hŴqOvF>.}'$TmBQf$:$V3y&r!Wb DXd Bݗ;? z/H֟}o;=+5ZB>"V`ʽJH-%RKzZCԸx=4Zc/7uwoB$růBCR 6$G|W_-/w[:ݐiO^_8 :Z*uSi r~{V#k!) &Ӳ_t!uS۬> *$)W}iz} -0.Fk?-[D{&0֍{Vg=q,b wrZyY\#E2hc)A i֬͆_Wْ7%"w6mzœw9{ :Ή40qu$מ!ZDwU|>1_ R7ˢD*οu"g~kߴT5ZgJ<ǾmݳƇ=/kFxYL5{r̕T)P^Z^_U>.Ӈ'K",L# `6Q?ix=#'V+?8 l"67*26WV'&ZNk-QO yhJhK^Ψ2o}'Mف7yڍ%N7X͜~q:Qx:]ur$q [G6uMϗ:[*l̉s4%Tfg/C#`6\!3jIgѨ`(`NoQ`<],=TSSS.q[nMF@Xw  9FmW;G= uڶAݦ#TmurUݱ4įb5Fh+d͔z+bfA?CTojB {7< N8oH~{<''2Iy}0/M*5r+&>Ns1x+ߨܓO6K1-/QiFʉe+\Cm"J@vHj/{kbbJ[uQE>ܺeTT#g7YY BVAg67{$u﷢ XKopɒ9#*JқA/J,d94ٿ4- _ofÝ ?<72(gvl6􂸪7#F/kh>B1V1rL|6gYy͊=@׳9](-66Vy$bJ7Yy@Ud=ߓe͓YwuxI,۳=+vc) RرJx`[c5dkƎx_ʲ{!S5iM?\%5`?s"3"7 kFeeK?|W`z,=r,&~{%ŢdfiNج;0i@)˓}r^.Yt Ay:$UЁu&ݑ0MHboָRb=͛8D!Hȥ_]pkz Z V"m4~{:v;74~ԭI!GgDO-l튡ݎehM-4Mܹq|ըPm_Doz?>7dj͝aw9k#;kLR'B3h۷ ]rOaw+&rOKԸ!l=Ljtlm5Yea?m}~͹1'~ց -a#K 9TbC@e\^ܻ _&Аa-*L&J-fQ)|ԯV{Q1mo:sOTNj3[HnSv\k,̈́\N<9Ʃ(u% ;'Cc8]K.q'hfvh_r3QW+}4A׏e*AW|ϧg (t;&|+)u{(峩=TcߴrډTtھh?0;&We^8۟Me8tN򂾕4;`>*)ӹ-dOdLXIM͗kp;:XML'7bԎ3@e\_/ UX/-_:O'fZHJg"\#^ T. T'PwBM>q˞{0trRy;g-osæo6K+[zwr8zYB 2Taayu` tfj+wlJSKJ_|$b`fM#{m~cVа{V$`vfztrcnZ+w)Jt#Nm&h!,(;/3so'tW՗4 _G^gjt.BXF/!'|d`MS\}c-'4ۙ$@O}=SCOËwz*Ik鏓Zp\68`3T:uCH>7}'1oǧ_bIX7>rdH3T:uѽkj!{V|>MSۿ@w/N*R)4ǢZD=ga\GӤ }ۅ GDx+0_^{D79e ߒ˵|supt+1yzR-af,bLkƙQ%Guk ZYOwuC l2*gcm;r\^3LN1w}®74NK7O`ݯ]6'89w[~ W=ZGw8P\t_tglڮMRNJZ޷`㨶W//6C`[]'Bw9k1:ӷ ݵ6jۺH}Ͳؐ|͒N{4,>m{3tBؖ]}v-~~ɲ)Al!{-:}Sw;W]S yLZ5WyC󺖭舩}Ss/c8K򼶦8x0\dL^'}\m4yĻ6kp79weʹw V I4MjjjNJ5Z¹mΆ^|oE[ ++c y#ñ~z@@^%֐|+:lz/"p7X\:'p^Ϯأ9bB|uk:eot|KFΦ,J0I߉PWsp583PۧwH!q{⏮?8 WvE_d1iTJP(TjqN))0T*QaX.]Jb6\1e(eb_:=+twNE9͂^/k$fܵ* /+@j?2eA|1}[oilCpnQ;ng{F_zo vA"{{=) ܺ*"(` xLG#Wc X166æ@OG>sMwF'\,1n|0~(t+ƥkZHpM҃O"8ă $;:E|77GI[ u=͢u9 ]gӽX&TrgfA_ktqv$$tqDiV4Oh?/34>΢jt5/S+b߽um霳ioa3.Q 'lO~܅L:{waRx,r))Q^ta`z߆iiX D:b3߳g:iKKأ՘x %EOu 1NnTt_ADoB@|H zA3@at t:  Shz:; M<䟇x]ЈNiX!H ^ψf$|,e]{W___Hb$̀%0]YξLzS5 #x58N ح3E7 i}PޞLJ=ťQx:ħӬߔ*5*mY]|ˢ#=oiqϩ,Yr'?= N|Dxco#] zK}%26WKV}:-~i{\Ph+.IJ1ťkU~ XʺnCyU٣4nѠIw:QC;M 8gAڿxy&rvmnreax {F5\OVhu/U@.q{ޱG+7C#.gtk|2=`/ /; Mz~N ]'t "| ן} ܲv&7!b`{ى7{W=}t4%n ci[:5y_]pNVug};U@pB^fjDV k߷}Wbyz7 oФ ).U=W̻1O~5-aR-d՝R,cy{~@PܼCR>gdHo@>O鑽XʺEpqE@ jνB1w#WhzhkzZPj0H ˖L?Q>uupR -FcEGqFz_،\ቋE';r캗@*^8%kn]ɯOKI~p`d~~,M/4ǧg 'CimMkv^rzڳ[Hc̻x~N[=L<=r1y#OR_E1k͜ ڿgӓo, 8zN$KmD*C[+ja(OeLDaҳî4L~$ű2`aUdp9yG}6NI|Pj@MJdtb%Z]A}w\pUmKnl@2B{<ޟ Nä0 bxi{7 Ӫowg&kˤi7 Jtz@8m'~Cil(^'%4j#0>Av>qrvH. ,m7Sg-  . r`P{84?pN%SȒ߇goFq2MHC\Rv&űt%~'n0,3#=qRi˂PT_U ֳ<?8F],%䱊^RT\]^>鞕#\1*VHXHfd5ZgJ.-:pё#"'t C)܍YTS(˖+JK)vts0##\3EE_Hg;h?oV^Q yCU{Ů:][K`MýxojvCh$IEO]ȴI(vaDx!in5m[nk‚e[[2P54 >v 㪞Hg}b C¢Υ:ŁU K3e8F`z=?=WY]f/ʀx&ި1R)FB|0ut(tjg> 6Ѿҥ|f^/z_\+ԥ*MX)UjJvq8C>8ű}}>𵣀=gp~m"$Ĺ mxTx5kF B6$qvHXޭbz=ݭD;%9? ԍKmtvN/З(U2@%Jk=޳Xa㦭’M tvv P +be{%'R)4]r]:ֻlz}w+PqhmY?ǵsN'tǢ1@U=s8aU~5D"QL #ssx==$`Z AK惗 .+WH=-%<8OkzupЋA/\&5<OI[b_m};nG8thޫ{9͈y0(QWF9c>擆|u/X58KI~KW[" ׼vZKW qPC{"ǂV9LJtUeww-YmaezOۄ9ӹB>4ͱg?DC|xZT;G+zYY;Jœ7z?[*8,bBfi!?$2.б3NecF1RoUvv8>xD(7r<Ѿ,̺_HS d0D=K*YHy!b3_KsU < 4)Lsad+-=lݔ&z@?N0d@rr_Xpb[xUeӣp5~la\=ϛ8 m܅|.י a.|0{7`ElםdQJR9v;Wl6A1L2 NNK΅\Y \:^# [h/_LFQ BMPRʧ%1L-JTֹs*M Ozud q6B47-w=9P|XX4V`۱ vz_*@Yɰ@_8͐<~%V<LmpTVTui\/rޓBgVTes<IxR_H~}KűkM_ 0ܚ~4M*[%cAut۳荼<+(dshTax4X?k V-H`9y_iܾ2twYKO_Zף@)e_ +zUJeޛ kn\=}@YY"W*0%}'E^sc5}.ՠ#Iu*^Hj˫ ""qo@ ̢eKytj+16qLHhbN/2%LlZ>o|%ïo: C 6؏֩So@ ϲ'd`m]\&1-sUt(.UBe10sQ)2UӚ'/G ɱ6^sD߯HE߆J6۔wDfY:{YT$+Γ\2[En^2mn$6UK[ԂN6l½E'G * pщ-ͥbN<|f h:TQ!{v P$W8B +[RUT yr5>s,zSA-6دV j#r^Sw;hD胅UEr*g>;D=k IDATb58cbI2tFwnժ]ׁSwamNN:m.co3sTtZMqoաkܿ۔L|:۾U,'EQ@)2#"0ʓn.s)O5}kUS~u7z;coPR~Mm_qoKvo3_U6Z'c_o goGvoWn >4= &n=Mnr :gu=17MMZ\ЩAb)KIhtj,uG*:=.@K__~ ~Z*ʜ|. 3~VN̎ ѾnCI.MǦ2[Iw]I®/f hv_?]^8۟Me8tN+rt% ;'Cc8]KQMɠXLj@ ވc))tj{?@G^o \C]Fj>o+1>ޕ t X̢(dK+W}KeP(R=P(4+ ՝^i}~/AlԘwbRBPu*L)E,(+Hr ȶVZRADnݺ˸y< )E@H X|,SJ%v9tv>2eD!Y0wQ"΋)ŴɥJxZħQb3V>`J^-*Qcӣ˗wt^lN,*K%e^IM45Zv;ܾs/ʆf<8I\޶8ŤmE:%*ϛ$U(Y } :beY,.[6`3p e{<WitSlFka.rdh%j]{aIEj=XUjTrJ.hbɧڷ\og2?L#C woҩ_kܖqekSjٷѠpoӔ:(=op :3/uóYZ}vF\I|Vܸ\u>17>ڣ_+bS ʌyzu}B\:aF=k5J׬|aj-_6`/Z<_Lv,Vƽ]<.Gkw29cK]5<%pDY{+F]Duo>𓏼wf m3rWYNt&6XN6XȰo7#x8rdݑ`Z{b.˞@9 DbtǨ* _@rnƝdܪLѤuܹP$R*䏖WEVszCyo9:'8)Keg~/Dr))~~ [(PUhB)c)otngMbz;p;YE")d`}Mz87ǒ'>{JѮ\, ,&JR) J-sRʧj1L-JT֩Sg,+ē6߭uo{vXzU]y!G l"d/ D9qĞ "eC6PiKm`Haw~FNƁ@ j"dω킜ők1="^f3](U=Dc3o8as[E < tV<e/1O(dQJ|lÏjlh|:i@U Aa!{RO~vFi6*YTXJ ޣ=~ "{텴Xf ٫"9˞'cYw}cWQ+hK옴\E;<-V|eC26#oHԍF]q7`:([G"Eox Z-{RqʖZJJ<eC!6wKY׾ɰ8J ~n͈L@ j"dQ1zJ7^%Dz/PnAV>@Tšx^@ghil̅54,e:*eC5ʯ:_nߠI1RT$KY׾q=~޹_`!4kFExXvT=ڤwXt$ݱQ=ϛXw!4tpzӬKE2PȱX!镘aPAV~䞘a}NrqT;&'T/:`}֖}~%Sv_z`Yܦe([ɁxAkߠ_n&{_ wDl/YT,ZN"Dav G%N4ZvfY"^[lF6bBc@:)9Q DFރ`(ۻ[y^]n_ȡ0{udv.x-LyC]\c1Z KG9K1mTggq C-e_-|ܷo גmw^*_h_VnSbԘ!paQBRuJ44 .̮S W @ ㆺ #4Z"y(C!{o芞 tZUL3{og„M[1fEՃ}ҲT$*5{ ;F oGS¸HuXDtzF "6#0Osj;^9#M~y8lPn&̙U>:ӝW ݵf|r9Zu#A eGBeo3sU*ˤqjM ! (b}{y`??'w[w`N8T9֌/ǻ6 ԰{ ٺiH^!M+8ЇCTg}\9$(G &{'ӊޫd@F䊕R<ǧ8 Co>j򆓓M3 ,4ò.ݾ?|{}i@>àiB3K{.˧U<9*L[ɲG΢"6@ ¸(dQɷq6B47-wˮQ jC qrPGS$iV)*ϔK~eűkM_ 0ܚ~4Mxu2QM|.zq:=*wʯT~b|n'/"5zһO&[ETgJ9U . 㢐=D1{{r Y ;jCfo۴E  M9Y # Y9%lÙx_R!'6sN"',ӏYT&_z&| >BC+}lOkn\&tԹNZAs̗ ܌_ݦm6ޢ#k,/P7'5 VČ9R`۱RE]YVKdɓQM0cT^Q )+Pmur`ˠnSߟ;t:fjޫ(/{?g~'ʙ/c.ϤzBzh+-2$Ry ܲ7[7_)Γ^{9Bͬˏ6m.]Zr!h>zúIr|Ѷa=ײM?]H!@S)n_ۑĖ^ၕ]}Y.n#I,7 EZahiTm61>\ N-L҂dϮ^4n5aYhK Svl dK nv!96#ukk iǍ5IL!(tAt\=kşrӃ䟛;7xvMZԸ_m3|~p4=GX>9_xuٸ% /$Mz~Nq<@wtɀDi#ߑ,d Ҳ,N)1 Ɲ=Ƌ@T )T 9M=>j #1.-F+%|SO?6-G,Q>uP! ο]Y&y2n]ۻxS85&WsRGOI.kv)>OW@F$H`ӣfa\ٛ5cw!ؐ俥(^KN=h@\z\_K>]jyyD ;1@q:NZY"eg9iόeH(P!hioW$y鞫I*S0۪2|ff!UғKU9S"XG@6}ˈ}\-P|]ɋ ]%Jx `ztrcnZ+w)14_/I*z%՚+ЋjL^^~䢣1qwU1-O"\#\9ύ,QPFsh92l '#Оx}sתS|X.!e##౪Doqp/]Cߡ wsTTԢYFbSxzv|u̟s }(W8E0`…j@ I9b JPCWm3m3_st>k6Y?磕*=ο[lPcy_y>Y6% Jzsjy+F]Hu8ݵi˾Q=X9fqEˆ[GjT6# uGX`,R7lu=ě@rnƝWGѤuڵ@P?Z.N3zCyo9:'Ĭ#l9;7r\G'kW)))~~~፛0D}ٓA4굫bҨ4*BP2G-|RDa;tjM ['\-rNk@ʾkU<]?/#lkiKm`Haw~FNƁ@ ro4{~n@ SjXjC?Q'm3X@ |.ߤg…u@ 6׳盯y,e]&Ķ?@ lZu3>jy 4o|T@ 6W V^7o錿E8Pܸyz贷5^#  E O04u`- i?dv@Pf}Q>gdHo@>w7{W=}t4O {|;2?qw}޹_`!%3Ӊ`)7wM#}{( 9"=f$|st+[}ݤU Dg~}RY泟(,^z|cyصfǓ ^]!Ԕ[K.N40=t wdP]?oy! [n{046D=pFv4 !82L@+g|һc@ H>MaͺyQ%j8~^^^vH;@،sN"[\߳"Jz:uBs̗ %AXG|kPJ_Q?ljZQez0,5kCuV^ c3s퍕:m5%|8Y&k)=XVm&[tb{fD 5*LM>U_V|8fXWω|Y's ].@  ژWg[q7u7)TGԸ+;$oHuڶ]s]}dJ򧋿ؚZ7KV_0 4~aݢ[noYurx{Lܜ NѭZ:p4s{x+lFo(*iK\RQ"ޜR..;ڬ:{zekflMVq-eKc\tWnc_sMOݚT6'I:b̞Ň>M>m\lݘMi`3D]-}zjvj0SU:qX_E{ 4w48 & 0;aC>~ӿ/ S8ܸ+*<3anþZ'&Si8~CSmנyO| HDB$n |zDVM<]]=B#{ t{XRab.9ryr ƒ0nj8Qmqlщ/7UIN Ѐjw-O.:N̎Athn6ʍb2'55?'J',SФ҂GW]ߎm[5,]buISuyQ~LmFbҌmq"Ҩ4G97z嫿ݡDRf ѵG׎<Ƈ̎{ze* >ƭW9ow%kn0z-c.i*ơe%e%=yЁ+>PC {qp'~9;˲k%ӝ?0ؕw *efL)U@La;sT;3NL*PhNͥ%Cu|ڵC߱K:ko8pҖ8J?=?sSյ PeЈ4&m-2?*³:@{C IDATՑ.飅 K>>k_FuJ`4y]{;f$<}3P@~ǡ7w7[8җ) /T7_'I\`&.8WSopӋ \f_ '֝Wm*豜/U\z3xɁq._n;_)ڙ^`嬿^)L;ݱܲ^c\[9O߈yaς>ec?-anz?ܼui7Cs0~?bKhŏX~ +fG ~\ɚ"dIAq*nٹnAѾ(Q،c63ywQT_;kI - ?(HR"MP)P( 51! fGzI6ȆyNsfR޹w|F9ʏK?9=iW3) :v߯-;,k%-Nl֯,[h+|⊨dw2/EݖjgJ|yF Sֵ5 &o[6;04uGy)ϡP|I;|7DF^C-3V2)ښCI#lێ~iOoO`1_{Q1fǖ[KX|V*VcOZ{!#|\!_o-4ŕCߟ$NL;y A%ͣtuq&,Xx3|v=-R֤_ڌ~mŮU EH= `侍 s4xُ.;az9*] Jrc~q wqm,ֻӨɾ4 }FEU7op?Q+ߐ~7OakWmͣ1مQqzS.+]?Q7~ÆynXzW3s]zNjSshcGA5ju&pɺ FHx,]i>Wަ_@Ph#X0*XMV+q^Xd×)ǾۼGfyO,ӺפC''}}d$zb$WU^*=(L|e߹jsX6JW&iL0? ]3y'}m˨mqj`K8w`w {L(kv7' W^nNx1k2Lo:X-Cbqsk>]g#uj)ld$˚H^^3[c+rOfwOzí ߱Zk<2Խ\8My#̕xK* JFNz7Uj$W'*(K\G2#=IkOL Gy[^gd<{1}ԣ iN|u/]'@|Kq&:M+yVH̓#ݽqVla&j7f<?, %ZӂeQ铏E/IҚ,*yw1*vKVV@Xl~qdP)c{Q8y6`{k>iR4DM!Qǽ|ggm=x~fٴD 0ca]uvkNT IUMoo^^6*([/VQT 2"(ܽ|bgB6߇~|m>Ic&FNɻ 8tѮ#pQЉW}`9[jc=3Y`צt_f}ztlVե;cݢ`,Cwڱ ǎݻϳKH=Òͨ7ƪMIuE/_l󵊢oטQfDm*./X %k3o?'OҚ㏯(ױao;@#1+F iБ[ZK♬A00bN|s صSHB,b5k7osCQz{GPkQN2>aD6!{6y=Q\9`z-v6M]-oxU2_+\> <6IB 0k@עX{¡Gto('2=e\V%n6'k 1fV֙v0f{ p ~z6u3'>d5eIe5CϤok~|&6 fO4NudƵp2 NP:KU%}&,3NvW7:ۡs-)k&K[eAϵèFͮd%Wq\y1;DV:: %pkgT>,z!z&0d9,F {^J+% ['{bvF]F koڮ;y&Mn^|\Q"쿿~V^!ݟ!ܗ5|io ]xŤuibKF T򚲇S*NsVeKBbɐ~7n|-|<B;ee&YMʯM/ޒbkS]Gt)ѳd۱ir .{܏=3/H[u\yxLt1F?H|yDoy؛:eHeQ]sq?98iv}w|7V*xNέ4o''FX9non?s*mTɡUY*X*$^,ۣ3Vc'Tx(1m\˽2%k`̸9ClY}w' ˝ǰ/ln?y`6#k$eØ׷ю yN'/{hw)::{ڳǴ6l\pJЪ,PEHCb|ދ}4pd^͛˭fB?Y^~Q>Դt޳Ws~ؤxæU+u3XcTMȌ$̿'A/VDp̩+sXrۦY &Z+S+my_spUZTHZ*ɂfCb;jM²?|ecAp͍-u !Vkvo}~wt"_~;%?c[p|ē! 4yr}c> fHekOp*uD\a][f:p+Kɦăw%Rc삍;y|:X[,*PK+yyn/X 6 oMY%곪o$#eX<Xͅgs䒈ecIt~Ӕ'i-c w*|cqJ~'7'*}caR {oL5malӔũs_UӭqUZ Ktg58"D@{BդڌWAY[jslq9?oeo`;*3==} me參8ն쭯 p\^76 v>lR7\ث_O|>:,'tV3O!bM}uDH\_nݻTNjN#_vApvNXɍ"S8!8OOϦ!=B I'BjoKNꮬj޼kBi𬦗BbVv {%l}g+B!䙲:^y{+9Iњ|.@fͭ FB!oQ/_z+t g-%O;.B!:Xͅ3d_2chm^ʄGUl/`T~Ȟ۵mש$h˵L!XI!MkRMGČų7M4l/ztᦘΟ~C'w[͙"Bi̘uum1S\vo}Fq`EX <G޴ B!XA n/lA@dOj+un/vl㯋o';X1!R_YAʏs(WYMb̽[5*[x^g~Yɶu}`XF8SGEd?݊O0!Ƭ ۶kiMPu闿[qEk;EtN\3BOyg8]x\IwQV{$f_=+>hخqC|Aۋ/kO`xޝFENաBͤ8`5=5+k? nM\ſ/;eVw~\IN~J E;t lxȋÈkR) }t]7Ʀh6^XpF> A@܀2 OcH0;0!fcF ly١DT c޼m EwpOe四ʖEp#| m25B^ GPaV^F {AcVv=ҐXMʧ5ɋ@"w72s]6NG>u?w3 `hXl#LR%!>JƐy0kV1 ˣ2 3I2X}xr.&4_q< i74""-!XS WBQ)${wal'b!o#I Z.Ř9 v\E>O0ac4>\NU&*s|~s Xo,7QE!-B\gLW>WTFÓH0c sً8x.ŁDd@H2!b󧴲Kj?b^>i8X` 3`XtrW>p \dl[}^D|#9HP"I e5C3 Q!W**Ão2taL^R 9:@A8;{wK#CΘ?]b40u<}ٹn,2|kOeBMQ dF6[4P!GvDťxu,z\G`qp35MfU> +\0KE5KFfaxP EΑBfDtm@kuحƠ#s!v^Bդ޽<ƭ k>R.k{{r؍BR)qe:"YPGHlg#|`Qխ ?Kh%,O``,n['1{+L>^ L ]jBT&4ǁy0sL`B+q#7B{!#@gp|})bX_;n3z}BBBRSUR3pHOwROtıcG-ڸU×g.ò,b[}/3jƭ1ghW uW6`ҫ5Fӹ=e[~GjoaS>#ˏq]>VrH$)///x,..ӳiH賉-+ 'oE0 }~bOK6}SR6ðX,&4V}VPj.a] %Gx˷։9uyak~|&6 fO4NudƥFDMz8lzR?\7>OG'+Vsa6 [5 _vCitѼݬQӆ|zX_XmQysׇZN 6nU~L i9x삕O2N>CgK×J˟,[9t_9Jsk}'d(6$Ta1Noo%WrLƭwۗjd& [{{x;'UB ]E:Hz5f>HjAHc5)uy^tΊ+{.NaNϮw73s|0jMި^aDc(8nݸo}$rwNN_ٛX;j4y#wol~31d^;:Kq% ݎu嗤qֿcofF9q3.̒?N-L&BIՐufD o_o_o&6kus=1dIʈ ~n̸9ClY}w'U7+]d 8M5Wp;j3zݏ#| ס,[ˠJRB..5Ñx }˝ǰ<F}{42<<8D$*R}~ ޳Ws1۰_|ܭzsb[Ӎ4wDž^Ȍ$?BȀ=*X+u3XcTM+sYMm z|@3+˲ )e/l[HlR?}NkYE&RcHmylBT[M/W-wO~͙q8a3COszp%_~ޞm+A7 O[;9Cz,:xӺO>oUBƲm7V{{`(w3]x#~I- BHMjLesGYa1e>EM(+[!ĊYVnw666,œVG aɎⱚ^~I:u'KtbB!/H(Tg+Uo-Jώ!ʑm=?:{ۜPBHrCBC\b&\nRVjmD!_Y ROʤ4Z D(qppjѲeZJrڧO! J,//oFc4Gΰ0'JZS'B enO)4O!(Bȶ' (IDAT!/JB R>!&mp>yKKhI#N}KLL\z{oR>!Ϛ.p&ԖҊO137by(!±pk6A"D 6" $H CJ¸pm^Ş{f0"TCzz?f،ZF)ˤy .C(H&q ("Ygml&V:0|;eHhjŋ5\.呑6 R')qm{B*"A}Cb10d`kp#^]B#| ms+76ށN˷v/ci xX僞:X8`^96 2 <;bu~ iF; Fc@@@dNc‡UR>!&End"9 z##r$(24?WlOB ?H<*뒰/ONp4@GdHJL; \`_gVtMƄ~(^Duِ\`ed|4O,|4!/?NT(^^^ --| ===srrO:U6)YlHRc֭.eL0c sً/̏[^#L0YWqZc1CWH!@/ D30|y xPa]]232<܆  Zf{<r0Whݳٮ E6~RtaL^R 9:Ңc:f/ţḹX܎"MHPP! Ʉo0y%} J5NIH$FbXM23djْ3 M̊^>!Gv"&őBfDtVKM  /|CgLױ:&^*oBl{ u7 ׾-] &GMx+!h4d4((ϯf t)8 ` 2V&09+ntX!$Cc,9w3oc t+]۩ [zTZ7`ؔ{ I2;p5m  %! \NNvNv[rrskp|B% ,B#$SE-`9w1W!8Ad)ZL"އkjz?vF2W9ZZJo*۷!Yɴw^:dHڬ^>WVVIQYjzC+܅So! 5huڑ]6o _߾"Q f=W(M jBYpRGd2ٸq 689wرc~ĉbfӌ}B!~13g~uɵץOrg^3OOOKY4cBwR|Y>}ϝ;޷oŋ8߃R>!R?eϟU֞mڴ7o~fzzm};sJEO"H"}.æq~BH09OrٰaYFcBUbDBvvvJ6&K$[1 O1`0J zu{9YORfe2T}&M<=j{B;oݾ}A&KwT*1 ChbFQRW^Le|j_,sΕIX;D,}JP(dFTrt !ޠD<޳{tF*r\;\V?:@, t|>kw ԤbBPX5 !"!BO!(B!/JB R>!BO!(B! Y3q(B! J)h2=!RBa͸|.Ɩ#bjwHB{*J r4rOJB!u&>J^0ٔ ! ?ӫjPجyUgu-e^N,QYŻdnH+gҍBb+ X^Z,C[Kv\J.H&$-c33FK!}1;#}ߪD" R)<  H! TAL&d#sJf^_ ō$6N(`lFJ\=!ح2>.,,,--ӛK WϐRQn28xy0ћіWZL&Ӟ_O`cO?8X~j dcbX<<م,3)-?a?k?o4=o,.-vcd22=oҭV_|3L{;ݝMgZ5kL/9{UP*'|3tsFoFsndT-j-=}/{,KfT|>{V˸ĠܾxR5=o=BĠWZ͗dOySUll)qX^P~j F:Zo5`Uߛ2__g xu꣡{~\:gF`?D=]f6%S~\<<硥}LOݡD|"}r||kGyZ^mQSw<\¹y#x1>$a 3ju;79{UP*'z#tssndT>5vkŦ]=xP|9mTuٹYgOH\K=]V:Ep^fα`jK$ DoD`hc;f\Ӳ 0$_?яlJ%LO7ǡV^ws~~\V|p|33:< ~;- ?`4y3^5l7(5ZJol{of~3czndT-w—>!-tПFãM;554[ؠ}jpp ؠf8rrNJ,(95D#O=zQx||~αwϼìt}6Y e,eL(G)O|~c}НL&o_ZZ]p- ]et3䴠BN̶HBPH$o7^uK}ѶAR<9qwr/r䢟G\lUl%XCNA%OaŸţ#1(x9WTK S.];'t:֗ϣ_kx罕+͵`ߩT*As9qu/r4 {l](8rd}zW&)|-|훺٫ w+~@%^u[1غuƨJM )vW^ވrMܩߟ}g6ךs/&)|#|?H *٧ySZX'Aq~aWi>1e]G^&6*$_ .~镗&wO*N[M?E'^&MyNAԩ֞U$fP|镗\\ hJd1v2q (]Qt2 NWl A RQ``CA*깿m R0ŋ n|V-[Rh' b@ @U ?مXuBJ wAJ4aw}{C TAQjd33w|C[Zxg0<<]z n 9NO9D]D_0BI%]9ӋDγH8L& Y -Luz#G׍^{BA/|:w>D3ޓ|n-gsr AmYj25RR0%FqgcNCћ#ϑOg×ɤhtu蟄*O|`{6ͤc#CzNu'!E9tyw'4% ;p2DlljT2>uz~e%pj\].~tm}}cx}Н!Y:c!T%L˩Dtt9 !0yɈ %c h6m/kjmP?|yvq×sZ0>g9 4{+N5LLް{Б*Ƈ?O/-/}KZV]YX _c1+Tjusn'7|yB>JgʩDtˆGoF-;,Ӂ O/+6߸63tbd2ykKZ8]+XvX`g=n0ՕzaxˡߦW/gaތ2Ŀ/8 k-Хˋڻ/]ԸQe1`.X;yyYt,ӎ_\^1>gϼ:e(O*pp _wϏ^K / H^gvtipavcqMA"RF.^ٍ]sD !yBJ'</cuS&RӸCR&bȚԔط %z#&=lG|0!O>cC5A*BA*S?'+8%%+jW ))pKJ=)AVҋ ;tW^|dž TABn=S̪ 3V=]eyh4fYO 3@UUUmބWUk']Tb#8Jx+:jWG*iw/..͐MX[褚aHÙs,555nOgߞZJ83;AiZʧdobGCT:J܍{WSS#IQAJH4 B.f&njz<"S_Mw##C!$p6lsH.2ϰ0;7K-1]M|D"#! }r>BC!zl{8pr Hh(d{ՖH$WeqZlx m8<5=3췳C8ByBSSZ:9-[ޢvT:DT(P LX^yyBȚ608@7qmvVHϺ+#~BYqHxBy<"$ !1 BH&ihhC3;7kmGAGļÜ|P^k)Dĝ~^f::Zj+g !djz}M4-Yؘnw|&T*<wju B"шyA8{f`"B5Xw[SwS\Gz 6^}bڧP;Z]?HᚸVޅH ϠhA ^t #Q lP ^tLƺ?m!fk~l]u[{RRhmxBHO_Ot&v/IJ|Ds@M<mD"vK{ts @WiɜؘnxOx###WF;͡OBz7 ٹY^O1Vũu:a$<`Ϻ<2;F >}EAwmRnG@݂R![6"zNoQiح1c^/z/œRJU,u}Tdȕy% TWWuJ@ 톱[cd2]++#f]*,,lm_k2-SJU(#Pݟ93 T!*lA]*멫`mur *@ hC>*Tu Iz`c[VОW\!:93 T!lN* A)xHRSW3JNzG3D:3ĝUsrK%(YVҞW,YjRD5#N"Nདྷ?##+1;7+<"L'` !yjPgfV5qTN!LeĠ^3S@u;dcJfCC!A{ U;@Iu CԕHMGCyZ}0HJ:3zmN5L˕t:?=(Au%Z췳z`SG]6u=ult:Nx!~'ATۜJU,96euyeXRue %4jum ]p+]5Q,P)WPݿ@] U%?10A#_F? R!? R``CA* l HE A(V\+] JJ OWm$DkJ׍F#U`zf*>l6k| CT sQ yA5fx^<"=mVv@HEG}-赃P` $Dl椿 \JZץsT?VRك'ɦ6朧[)e2HR<`4\{TR fW^|$V$Zt:*)Z@hJ{mTWmK=4Vkk%`uw6=U&uשr ufk~l]i$Q\W'N+W62ITҋs{Ox###WFzok0pCiSHK,^/yD#tt6:V3$1r>`:&n|_u'i`kk% DGƶu\׭֑+#> ¬Ԭ\pY<^Y+TW$T/9?:> :\C+Xk3.Egd" W-OQjJUD$HtV[FپO3A#&JnK 4Q1u\׽'f+N'&NXyf%jXi>KӃª9omһ7߉$Z M޴GĂP0F UJSiʟI~^GO_%I%?qH\+];(S+1J2nz^?@`V',oP_8.*`y!7puT"*5Eeh䭏܂ruPxtSiʟIL&t^f`Q/L>S_M79yg%-;23v#2vkL,ϷMRWGm~DWZ܇ܛEq)޾g: T T A RQ``CA* i`OƫCmzSؕ߻>uu-+yu;%@e:߱R)ΙOEO1ؕru¤RWk!lN* Aǖ)ЮQuQ׿|u)uk 0$E/ +՛jiCnϜTLY}q~vfh HR@A=/ ~fqpE]/emEH x/d5q(_S2ϜTJ[InlxP}=X-mz? D]u'煢V:$.Rluq6z=8ۜkn^1@uz TJ!%iVWvjG]rX $<PWOM/51e ig0Z~>x!HJW4%-B]/#P)WPݿA]M\TGT/kPs-W?A A  RQ``CA* l HEئ^ԽPoOI33?TIOӖ,C*¤Lg1Ӎ/6V=]bmER/eTDIPR U.6[d߱/яo:cJqGPUIOM֑P3K5<>yMJ{JEM/Tks7tJ%9h:\\Gn*;5kՋgJz"hxAalU V3K9 \_e1[U%~ 65%$:J0Z{OnHqn ԖєgFFw![cT AΚx9+, r9f$S%q8A 8OdSH\*u7ߦyN ÊijL_eɳ {/Wg.ȗd+9@Xki?xAze@@-y[1IDATjls(͍߅@؄H>8@!Ɗmzq"rtv6HV (Guqf'!d 2\P0+Mu t? {%T|Xw[+y@@"ORqU}Oم@ظ]\^OnZLR)*-IWX.Bf%x$_N_b"/<&46_(\'tF$D^~Xb!C n t@F*<ϗ.D+]# ~^ПU+dJ8}Эqd$'e/1Naj[B)|۠*`Wr|&F$D^~L|1I n t@F]];7訕.4V$R~L=]{߰>2_b^}VUG~ hWWUl.q?0ȊgIENDB`tora-2.1.3/src/help/images/invalid.png0000644000175000017500000012627111303312237017374 0ustar michaelmichaelPNG  IHDR1, pHYs : :" IDATxuX[3(a!(؅umv^~*k^D1؞X@bv)9睙3g`$Iܜl.K$u0eee:x<^jJ2Aq @}!"7'r o !qs}. _ +0"/_yyrs89bay‚‚|$XL2̬dW]ܒaOWΝ֥KO~Q~C*,e4`S(YC_|ϟ|24$$%9pLZ?V]Brd*8qw/) /*I)H S\ش`ݻ{1cť ߟ]3}k>c~'Kjŭ>!$zw3psqq>`wcXl‰ޞ;t/]ҨKٯrH0%psqq>hʚs9J*)]5p˪Fz|o7|-i2" Fr弋N1~iB3,K|^- aFe`˗)ilvfVVW^)z,%ArKCC(;p߫;EYʠoC-H ytzq/. !D(&${_?3azge)nΑٽ\\sr K!ğk|.}'((_Oqw(;༡]\{UV7Frۻ{nrMH/ D䅞ԯk|}/DdȵHSȨK=jtJJJ\\W^j5kYɩC`K4t%Ν;K-UTcS3sR~>#CEVV(KevM6v}7 f qoɭm}3-(_;[tP4θndF{lρNh~sex;TZx>=N.%EN-n,Z&0tqc{w5x S^.qҮpbrE 4;)!Z*ee&]P0 U"E~ }ydM9BF]~wjDݨ'=}|~kJOiM;!w+ݾsA*]#Y3--=5-MRQ#Ǎٳݾs XDzIBVzɿ^8׷YfDF!v'rOMӂE0-{Ow!J! g/9&.+ب˓9aҵ;jRr7=Ҟuibs %[Vl!"x)\W.s4T&s%߻oqw9 Sy =~iS%c(|N޼yS˝}nF [GW"y"Φ,l8WX&?,]P0 U"ٸԨʦ92s} oLuT4N#=T'KK Zc{+T9UxTzS2=Tj5߾[2Y"ù/cR`5;sV٦|b87/OАd}?$!x424J2{%5TYd}IٮnRK(Q[.-C6@kWqѥ &'7|n[%Iձ@m'?a4Ye.H~"2E%4^HY+\`D K#02N !`ΑAYBݶ3"׶G  0-@0W|-Nկ7Rg@eą Hꛥ q(1Zld*|d2I}ժ]FFr$%k"Jj040X,F)++s8,RKIHV-0,왵>BZ b~&tId-I8(f*lUt*Mujɤ0|9[hR L6ū/lU<|&T~BwYm(niW^TD+ufW6h;^x/uH[zJ&%ٝ]SڪsOTv 3کWG˼YTAbkcXPX mmuu9z-Zb>`aa*W)]Tf [VzO[nƺUK!!KW۷7sfʓ',j9OϨn;FCjk𑲎Ӏ:#$H <{:L; L Qh 5 8n6NX$0<i\Y޳O+EDN.>l.4w9]徙ٹx8}ڦc‰s>.:5C鞝ک?XsJcpM:A G(?lӁi\񙽎#;O+Bj%@Jmg3o=w3MEȈ)c}r Ff5@tag^w=BQu<ϓjwe$(nuϦ a6}G28Pa^o*SȲ %?"@/e}7᪦ne*&М,le``tk.!X,B?XZ5*yJR߾}nѼwͺE HdggWD{+#LLLLzx[սT8á%fLXF>w)q-q?p"n.wj;~䮉.{.oo0+.h7 5uuBL|DK?Zjݪe+3'ԌXbnw4 K!Y6}GNQKGPkKl3qf0 SWנh?}JIM1\O_N y[ Bfr2/:tW4aщ![Ɂ ,Aa2*l*J"I DžBA~^kd4FT*F `RJJNo3 ANP '?dOǎ053;~Vھqs}R@ݫ8~U=g'|}}+.d_>bN?p spƱ'&Nojf3qZ~'&:ǧ&'^^]+AB}}MJ%d[VE?ZBU(;qDkZ_M<… aÆa&YBsp*ua%U$}R153{ ?6p$dh4%d+MBs;flQ=ǎٳ!d2% kԽ{_?3azge8EUUuw<|!t]IB6eTUbX%5òJuJX -ZZY(NiK!K$lkhhl۶;w:lؒKH,YSILYت+XL_f:$ݻARGU9+''{=z?o֬Y^֯[]zL&Cʸ$kkN_ޱgEԽcO^zO' 0RٲysFF΂ Jw!7/ޒ9crml!tu/7obKD*Z@)b* E$[?\]\V1?YYKXȶ PRmCy>>5LȎ]8yۓ'!!@c!5)-aB'u9O32v~M_Nd}BB&Vzꡟ Sd"dr29@ yx^ms&Q_igQ"[ U0L$QTwϜ,")P-.]6cT;ƍBp  H$Xÿrʋ=1`_f#jB5 r2xT5ƩPh0Nhp EJ} QdB"1*aX}GQSrܚO֬Y+uU$ Hmeǎ@JL0R EP*'[f>5} HMdFmSiٱ'J1 _____*)@ )2)I:TS߿2@[O&=8c 3'8>bMy ]K2訒*0 Yg+IJ߿O֙MhDoO=kG݇~?_73 |K(*x҅ۻڪ(֌ O*ŷMpttttloߺu[GGGGGGrZ_ED^蹿ɩC!6<q:L5O$dNVN0&o'ds2"nr뗏O-neɿ4R$&yq\nzJoEͨ: sNOoZGWC{~᜾o=&U#۰vGJ $jm% +@U闍0{lFpu~.{vD^$Gleڋl!޷u}l c{В];tcχ<ۥc^cV_Hҥuˇw2n1Jv-0JnGeJF\\1̣c'ϱknHzJwH !D䆜^1ګSg+~^=@t)GT։V2a©ӟfݗo>k²c{Hd_]$*l6Fڽ:Qȍ;xD.;y @eWΒ-=8_,ɩǠهcWiCT<کSqh׮w~XLf LA&gdj=-Qgx"Q #^" ^~7@kG<9>,[B>sq"ʕԜljm^<;MA!ʹB(7HxnSؖ&S?Z18{׽39e43^gɨ<0 rGAa4`'/,|etF[JIDi|ux7ͫgw.P#Ӳj$dEJ/)U;6Ó:tqйs_ YACCڕ@WYNF @̵T0PhKGm;iڷT^'zB)OF4ꪞ6MG߫ORBa57˝+^yrNaqU*B)Li9]PF\LV`DֻS5&߂Mj,U9oV.+긎1?*S/z 6e $}oTvt~*wjA*asܺq u=4נ4.=?&1  KI-SUڪUޏ`^B&QL9Q7oO/_JHL^U6$ ~pEs5QAǤ"02oz-,Uo[7Sջ7W|QYZt!QqOHm HչPBnJ9#9(!DSoVԉд`i&+0qA|ւM!nEhuoZn'CU3#ʎ/#.F|'!RE,6kwzT;N܈{'IYHT4Eo3knJe4w1ohC~naMrڪ΅Uq3Ò<& ©S 0GO>>ݻw%]eTUQۚ]usR ޭPDKz;wy;[ZV`n/uВ jLN?ĥː KBN&hJrZT.i,Ucwhk/iež<ύuqy. J3Yӭt\o.NM=vE(jrkcT%&:WJ~dXVI8LժO*ͺ$OT +_E{&2hU%a!?\NicaLCG c͊MAP2Fm$ab:.˼rD[>e6'=4r_ܤ)1"K>v][ @+.i 1Qռ%'1>k>w ƹz`0RSS9N 8#bA%ʟӯ8hbC;@, 'dݯ8hЬ`8^- IBH @FWrquCIwZFLL4j(B0 U~U,iT$}WVR |? 7T?&i_}PGdOf|u0\Y sB(;v࠸O[gy.PsrܺC*JHʫ nJݙ";?# YуܗÝA]#:<~(:_i<`ʲmrG6B”;˽?/;V5'ǚm}MPT [{O_>1%ܮcW#Dbn\32Bþ?[t:gJX qu>h~UPBd=Fx$c]40pҶzmx5`W'6[yl[X-o?aqW9{kS_v=>֘ YyT;IWFP):n3[:9!7{{UA؊{RRBުegg| 161 }۶jjj%0?M۰-=kѥ !BH[\+EhLҾiȶ*f$0ZR1re$O1Fgަ i6+u>et B+ozj$;`w#DnE؋Kte+M~as𣎮 Xx'Bj.W @]uм.CPWU=X5Ј9O߳{יӱͺ1e&^8M]<|a鹧Xo32#CH{|mvZg/8uV{BHb@L$۾R>pSShss 9]&&&r.,, d2_3k]jmP\Y 4NJW,x4>!g1Qft3&4D۾)"8t1RrXAٙ|8qa ٯh' FtВ;,H~ˋ{(!qևiM(n5 {w+QʵLtZE}/Si}q_{ϿPP[ɮڏA5 04JDhI:(g/z iPA/ȷaX$ٸyFO %C>}3˾Qx) Vl-GWmڛˋYA]_yWb:+#o5RjkD^艅tt-!ٮ3l4#=(։y|1B⼈newՓ+G$2^y{~gﯳͺz[!tީ_"Dpޜ]Ȣͤhu[sygृJYm5'×8:_ Sx )HyL5-:BtQM\{Ksf>ZkQNΫEQQ8ݖw3瞥hNY])2@B$~@(탮BXyN_nTL'ǝ>Яqsc_ٶx/sSR%zP 1}yRSg\2JVЇoLck`] :/oRS祆VI='soߊ3gT,|IIIIM8C܌Ù/)E"oʮ,s"'~cg߸Wy';1z_jRSc_VtRڭ* (nQۆ9֑ VshQBS~X錋5?5559 F#Dd>;q/oڭ䄷<\8` g$ehFOꍮ1~Bo{_SgyO`Uc<E/&qȋ+c.7 6<8Nѱ<{2hf&ƒO'4"ȼޭ͚5=#hUׄi~Tnv; 5\87$&wV*գrznwsV>Hkxym5w7?Pu캶Affۏ9D[JE+v Vt\uS:BWw^{;Z\hJ8h+ ]BKetþXéN35q{K>B[;,XPvk9JP4 hFci%2 ҷlNL:18^ BU7TGT"H,^ɫ{N9)>+mlX8]ٜ%jq'˝7Ο]o9`Vwv*$ cy/Xv^G輪woahul_|o&Zyh V'W[n *5<J!Y:%e.3W8%˚mz}|(w]Pe@ven~KL7(nJŌ*zPٞ|PEoTT{ޑ-i0&&)O&HϚVDwLF|#w@xpI6k12Yj/w=[ϓo}Rʎ3*>Rw_zE $H x7zuGvۆ;]?O˪'@ozZ";xj3e$}/# nނ"?ϠL {+;цC/ܩM,%_低7bv3 eg6'g<EH:LRI=.!Tq&mOMxA;U6'U XPu}Qci';{mᬓvC08j5wcQC$Лz2/ ǰ:ӑ 6t_)\a p@ojVTT[P?C4] ۩UىW.6ZC_%dNȇw$g%]J'9VBU¥#! M/1bAѕqv͜Wμribvgg/a;㎋0sddNwdіjnu/J dRU"/||AhNv/T2%GG2'c=Y5_OGˠ;NL1#B%Dt6!458θM!6n6aرUoV;W7Wچ1 tSOD!RfeUԡ8~('gHND^x&_Htv$_gYz;\ˇ =:#DkmMM#Cq":ʼn|cSUA4ZL~{d휰mYi=]ڳR~ϫK0]ݕ^.DtviLo|:_Aʳ^ۉaқ@Sb[_S&GrS̴c>{jfaV LD >4웨IIIwHZɬLJg-duq9(!lJ3)in9a4·o3hEORhrI |OTc $)Hp1)_['y•Xާ@ށy 23=jARe ̎ĭu_”=6oV}9,ZN:$>/$> ;Ǩ{4Z#$!R[4Eޥ IRŗ5귋k?xҪlzf[<1)ʉKoW^Qצ#L~fGu”=b(}|Ia[GwUĩ%i UO-B2\&%/L}zT0Jb43Rz?|kEt3K2_ RdB ih/z^:[y2$!w'ȏQR6' Ba/1~yqWH *h44ܭs ۾E~2&9h~lPbJ/$dH(S^^ȸ1##kۂ B3j7lUp6;)aGx]u>7Tm=ղO>̯LJ=ʞ{zO4a;wS+)hFư:C(64s^UgyFZikѱ͑<]o~j;S-d!N9y?8#ۂYn8ªn1\˚csSߏ Y|ӓ9.I诶Պx}}C?2BS=Mu ya{yG6s+cm]5D3fՁVF CC?=Gװue"O$F;r 3sX)*‹ͯ8me1R0۱7-:*w/i|Jk}]0Mc>ԌgyŤoQiՉ8_ԯ[njSj=,7ܠ]M ]w2180ʜjxo#DGIZE{&2eI'9uX?squ=RVR |? 7bV لdeOM d hpB!R,Hr{꫟L6R-1GPن6,4'ҶɖF=y#"b2 !sW Qj`%Ygt( 4B5.*)d:tig1[B&W֝-Y8QIAQ.7(Y-ӧ'ƓGVu%KN5mkE0*'GO(k۵oe\i+ $Y'k0j>),!*$΢Ev@P/HBՠEd˓\8MFSݜYqEYZ"E`#NZE<BFI #D"݉Ti(1O2vFeQQrD !$)Lj*p:!J?{]b'6<j~} j<B%4&K@ D 3~$JNDqaԒʢQʈ/BHƫ*)ÔZh >~֏ŸeW3ar#$IsU.Ib1AEгo $V Ǵ>}85x5.1f!/|UYcjϑ-7%t)O)u3Vm7Yn|HGzgw EZo~zOKg"LxPG+*KEceiw•\V/WewJ. $JL7ϩF?0;- c9f(lKvmTuy};S~ b~VϿ/gDޘI;baѓ4c?^VZ}PPwD)|^U)O&{Ywӫ?] >=. >9Y_//M>85g?&NWDutz** {DI:ȌO*̵2]K{U]yydJ%;YWEîCLUUTT {<,inV:jlf&W|q"'h؎lM~VZE˄ \Zh*fi^FhJRkj;l~فYvPp EQJSDiYZjj%333pKM{K_JKIESTLudf@Pa?9ϙy9M8ʌ%`<>TuqsxMD˨ʦv4ߔ oqM(YkҙRW&[4 x+v,9u¸7oUtD_w; P9=&/`yZ\UTo8*lAF/r>ň[JmΛ!soƞ^/⿠ǥ1@!>[8M^_Ph`vf!d-s}W$Τ:뀫EKB|ĊW[2v)cqړ?2Sj'f.;+d%B#:#BQ“%I!5#*k\4WJ߮Ku+ c@[prVGR*r/DKD._-!) 0G&4I]w_iNQe_M]ڊ$ z8z^gNߝU7M~qʋyRٓ+[;5yg~c9Kp%:qU )&S[pbVĺ{* vE8G%~:9)_K"D/HkǸxqʋˤWvsh'g>;HꊊYȥRi<.0Um ;~ȏQ aNuhK-y…x4z`7O_oƜ3$̃JTAݧwm20BSq(hMw=Aw^UFk*m/l_"Q=V%K (  zsQfO)$͉]DpHgUrž'>鞑[{ɝAP>yԝuUQ [:X@Nmm׸w~$۠)ӻjpv!0%Fm{]Q 0ϧѹ[N%( `w _^e"PQ}t Қ=.-GP4fUIs(+Oh0'CtnZ0}4O>q'\X (4 Z=FZ&![Uje9 ּ0|;RktHS%UٻB|>W*isK_- T٧LRDٰtnp З̒j@)[7cX=T*]C!Ls[QeBo ߝ׍?۩>}RY.,*&t14g{?WVidڇ87xi*ɮm|f>؇*yQxAKѽݏ<~6{gяOUZs2AS|n~с>>>'|ߒ2u2*$@VK\!T.5g%g|6JٞL`fgv/h{J@*.L-0lC*84f2qpͪ!QMv l%ӛKm ->uB"]pZ ˋ[;/RIe-5T F.L{XRӮBu{ dDJ"]]]8y=yX8vb 5ЅYEKNYBœ !k`u_g SMG͕/I\#I}IrZ\stDٴ!-۽15SAjKswc rh?*GW(.}ⲁEN.d9Izhm)=6!HΤàzJTkIRV)zlÈ+믮ؽL^[vm$քWKt3ʼK;W+jѥ=|(wˆ,ix"N!Kv\.P$L\nSs&Yȗ+޳WkǪtsnv ƙ|3mas@KMoqON̓5}5>^A2Ž<-M<ѩ_bwt[cw-=zNC4G1D:9K9Ta}&\8 fMVIvvnW&X\-lǣ}|֟6K}/q(M4s֌4'u$8L64? !2`'M7u8l6f{_&\Og24̣31Dnasp,MSי?M~Kc>oIu '\6_O>Y3:Bei=>LmB/LOOmN*͏w7~{P,3Ǝ#pmL_Px̌tX, Zh1BȺZ^'ô Qݱ݊5wGw+,D&aBB IX'l(nF lI!P'9B6ͯBȺ0'C&a !:IX'CNs2lIu2EJ%lŶ ,!w(S_14&#c;!iz5X×v[<*B0'CȊvvbSu504zg p>B D&pu[~뾅z[7e5pO\Ok 3>}y3g@OyH( 2yldo*RE{|cqv6BU xi+us*#/;TT把)iL]'%~\x$uEEhib\) uUE7xWׄ!'KB|ϧ"gljhOHњCdY +ׯ޸}GwFtYu2;5EMKuVzh 3ʘ=8DHVnU cCEz:4aEwm~^pFIUBp>BVBea9%ag#j3 @`#vT:HVhܢB8;:z|m :_׫_K3=y{{ɚkɮN>>`!jdfbHd.Iuu28ޥiH~.@[Qp_B aNM2 Jb$kJo߃{ !'C&-<9IO|B|Im!jX'C&T'"jG=wIX'CNduP>>>md! s2:C6̥ ׶0!<&S0 Oٮ·d]Ɩ#l]"d-+߾794GG~vѵ|||H|Zuųt:8< NH LIڴ![u2CNu_SzeYD#70$dMD!I XuvG`sos)tXwmڙ]5>B@: 0rha:N՛xllET+=O7pBb@\0{`m}|q>Bœ !8ܲњ VדL& hvI[ pS;w{iOpjdyHWfz0P s:RX8hrr\_:* gW O2-KfiKKU,Lj1*?]g޵P4+ɺ?zon9 hl%=H|n3IdCml~mQKV_ )pޭDŁG1ʚXP$?!nB6du,ui2yݧm ǐx=S0 t>6]. pط_lduP$a:Bu2!dL}ԪK!㏐M:Bu2!dKd0'C&a̚)"-]^lFaNUnҳN6 IDATnM2?^R(m>SG2㏐Upg}k̏u2dNi~uy=٭u2EJ#zl:l2*1] ,}y3W=dd ۡCKs#}6=óV)" MWċn,F f\n~;)rCII՜l6' !.Cbuvٰ_)m T1'B6 s2L?u~DFL^8keR+[9~\x$uEEhib\) .I u+^-οhF|WıB8U) v8*6"^[$#@O2\ϫW\=黳n6.`<ɕ㝬9Zg_RCFZ~\X6Bœ !Jxh~Ua1΍:%w*Aa h-*c!vZKf v/?}(&.>9_=#;}}&X? @m@B/Rr{wj0VQ'cڇ87hFZ* ݶא?z]b4 V\:7kB0,=⸍+ZT+U]!4ѝ0,P9BV+$j-Q.kԆ:W㹮1o~O4ERԒ$W+&X7FR . Pg+\hs\p7gE2s{L̶v;+O]"d=_>Mn~v9.Z6Py2=)T6 tsnƱg;E\[|y?#G9m' 6m)27>,ןzR˰AG"Yôo{o!8 ]^=t___>d}rDOW[N-Z^ZN.oL7G62"3#],D"ïX'C&u#^y~2wLj9㏐M0ESۻIV9ﲣ-:膌-o/l!(D&aBB d$OB d$!P'9B6 d!`NMfL/r=PH!œ !Ingz3d-Uf:NHY.rqj4+ pbRa":%}zR~'|TnWW|^=N s2AS~7[=kr{o(Q:pO\7e$%n,F uV?d.&n?!mvٙ]z-҇f=+n0gW%dd1zͯgqp^AlHU4*>wk#t.{Բ -K2lW-!) 0G&4I/r9[j~g"PG9BVa}U'f ޣ{LBLi 3ʘ=8DHVnUpl7͓42؋> #.]UhVuJ[x˫9iTvϨ#u %(  zsQf˝`:xL0'CȪ/~3PÇDg?diJ+t5aJ.34 VWf$`u64UR+ԝ|qŪBvsK_- TٓXN)0!1`N5 .V>B:Au6a;'4NF y<)+$U*tuuƓ:Ǒʚ_ yKG/h{J@*.L.aC*84f2qBE9B@B<>{Z+s/`&heK._Oʍg=4n7=R]krZ">]Qn]e6=\r~=а]M )EJ=t&$hЫUJZKzJTkOdNs24vo ]})~BVdwI<:cNT6g 4MeYto^ q:<[p z:9ӫ?$@y4n@T#?nٱ4a:܆ 3Ҙ-}p7;oJ_s "Y_Vj\FB,OaZ߷Ƿo~x.^Wazz/nzOf.oL7/)bX$~:B6^ǿ}wG-sDŽ !d: !^Eq j=!dNB d$!P'9B6 d!`NM:Bu2!dNB d$!P'9B֡J=ITX^={;o=d!`NUTł-;}ȴMƈ[a !:urs ZS*:Bu2!d3Q*kENu2d0'CnsVkZJ֙d!`NUZoŀ["4]+7u2d0'C:(ӥ[oG*W6ƍi~8!P'9B֡N+|g/}8d!j3!dڗsZokҤ+wg|ci+}dt^ 5T\ jz íg@̽}Z"m(l ԩaN .ɨALIW + 77-tЅ'Qow5wfZG%Ⱥ{QDq={ M@# (OV U)tnCYHzz6; h޹p牸Hzƣ鏲\dTF`SAȿwJvI{vRS}r`p=dt_xr{%xxtu=kiGi\{t!aNilNi<-q͒y[ `_+Qu He^ҕt݇MH._MLWg|P>lhg&Iod?.2ȈĿּi9^^WU}U_7sLז&u57~T&] :%g;PdSWe^0v451Q7Hc1?-.,;9P[6Bv.L`yzD 8++Z&ToI:T<*&dۥ3Y%H^)+$svaCzzv-y9(@ q]l*Aa:uEY2-ʂ2_g; ŞDl9[O*Aa:z;1Z24?M#Ue0a Nd%c0tP+\_?vUjearnz3S-7^-S2.YSZ=w@?ٷ/ݕ휺 egNvAsj N!2t%³kIЫej`nXIA&FHZgD4I|r ϡ#xX%CÜ !h5ctǾ]hGijǩέ8dk妠9t:ر~ב.CRUו;^nCk {@j&zuP:3[%h4([_QiP:W s&c'qTr@^|rL{;\># x%B/#dqzZHԨU*F@p{~qAN]w f{ҳj>a(P>LWI^ahN,+*u$Bս4,j:Te/qعy+2 J3S(.~vn@xWo͏|JGUK$!E\ <.Q6WjJ3]6bxLza` !Kݜ=lJwOkBp (/K®ːa;w/Y'hv<.?nߪq ܗ_.AyS aȘPrTLJxf5)laʿS~ -{ Dip{7/B6c'kcT^Iۻ!ưNMzq2zA`NMd!`NM:Bu2!dNB d$[)REۻVW6ﻗvJݬ߃|/V[L\2liK暈:kw;߅h t dYҦF "i~yN,K}4G׆p|o~q/M/(lk= Bn֙"%^s·&;5bm Mz ! #(lq 7ZdNU)ib,w͜W\wczRu{ʗ g;uVMwzמK=l8!'dYU0(22|{Gdxu+Os|έyMEJ#zl:l2*1] K]9i+g#qǰwN|W[t&6g]Y{;o ̽Y:'vp79w; h7g4XFirCvf^lkڙ':ߙt +YV{p׳8r8\GW6**:L<-ݼd_dL}ErSк 8w Wf|5gdo/yx{ːk"zp]Fm61dY8l T҈"%^wg<6:_'o|gkDϪ^Δh2yߢ1]8l{]YcJΙ<ֶMYNӕvn~%L\fx74ףב&vF琤HlF&wNCށL}U7>=g k+J$I&e{fȈ|5k+f5Y+/.ʖ_͉5#*k\4WJh'f.;+d%B#~\x$uEEhiba}dO/G]/Zh'-|{7u"yINCc2\a#h NΊX=HjYEhȥ16$|T!&hD9)_M%ya ˡQe_M]ڊ$ z8z^gNߝU7M~qʋyRٓ+[;5Y^%'KB|.WıB8U5 {s7Kti㪂? RLnĬu)U&튬y<+џ9EN=g49.]Sp"YţÓ9OcphuIRSXj|u&wNp 2zQm ;~ȏQfI!dLOf'\Ȟ 7xVV]΍:%w*Aa h)8YȞ;w}s/e*oƜ3$̃JTAݧw0˫9ۃC*9j.VZh 2d}gG].%5c,翼ʞ}QFeZ=R0h**νFl*ʨoSB^MҜX ]yMdO Do\}v_Z5/~ / PM\}r><@`ސpl7͓7=;Ω;/=t0sۮq ̃ILASweն'`kl\=aBϠOIMeߞzM۞Ж( ֥s"B_2K8n݌aB> ;Rtu4y'A(@Ph ft#ۄBwu>'vj$acgT I]m{48.ZXN4cz\i-wJC{;ylϠӘ!dLi*k%}Ԇh46MjWILtG*n!:WnOY!HVI gȁzqJ+j&4Q $ zRll{oA@:7 ڞR*1ʫ jQ:tﬢSoJc,-3ǰ7 F.L{ gެ? ~fjj?EJ7#3[|^AD"ɻ8`tϗ{?v^ׇ & ZqfV?Xl2&*V0riTsɳƟW0zluD@ C'9RӮo Ay‚%T,>`!dqzZHԨU*Frs\'Sޘ ey{& p0!-Y4w<"/I\#I}IrZ\heK._OIw/߽QԔZSF0@&Iݣ̣>]QnEe6=\r~=GS{lBJRI' :A1Ȫf\Q/}e;-F8^Q]"cƟ3zmٵ=kX8^-.\(.\y/@s_"ݲaE+zLn'}%;.HRS|&.AS78.t j^ݽ:s<0AA|$+y#+=6:4fK_q*~sX7܍flgŊ kXgߖk >|_Oo%ξ8B{&y9{E`n!v_Wu+{Ibq>mr;i3~uyAB6eMar&_Vj-qat{/nϴuC9<1O5%4zv 3FWF7zluD{[ܓv4qsD}=әyR]ynÉ Mlדsƌkk[ Yôo{?cnxp9ꃑ/]W߇ߘ1o~sǥ+/-a}?zUefbHdDY]dxv@wǶw+^DzݳQܛMPBaQ݊Ü ! B8L}nB !dR̮n ̮6 hp?B6 d!`NM2KBd$!P'9B6 d!`NM2Nfڕ[@A>ϗY, B!<! Ӗ]ں|b߰뾏;HIs 9sy )Oӫ5QB腆u2,-Sg\:\0ryp)ߛw477'C![9BF ǣ׿8Eo¢A4v/U Ҭ{^y}O}ݷp_yf^=7sC>])]ΜMB>z ,籑m:H9Yl?V!ds0'CTO.Ry3?D ϩ|PiS+*2#1uYOq}vKs$FCC W}.#_].I }>8V9'~=#B/&2]b(&섋t4W/Յ[U-*c!vZKVڂ}@Є]}ձٻ vg ;3?Ю5wI_'#F"=; |c ,UQ4RIdW趽^mE`u=]M+jAT FRož! s2FonʟE8QׯүF=M4Gzp\d xts<wm̑K?꧸P@UZB%BרU*$IZRk@V?:ތMoNdS3,o|@s-(߼^rzTN]{՞Ԗ4hևB2Nn6z%ۃ;䧿@g_&T3a5NByfnj2MS|~V /@<:byBTp=wH>9%ag#j3 @`#vT:HVhܢ Buqvu0۷Au@?BbX$~űKlR]0wiRvK:Vc"Ew!PC!d b$&7:gnt)nB|@I-y Ox8rҟ,nBF7_lR[&d!d٤ڻ!Zs2lB !u2d0'C&aS+~K;%jGV^|绰xSx:>0m٥MѯuERX|Y!{{ਨsSkV:qL\2lod6G[S81˞[ֈo./c!aN|[KPClNq.YReVNf[*+^Fn~~Ohi=z>pBi! ! EFщ)>}Nђ4iL\n~;)rCE՜l6' !.Cbuv9] ;rROWw;ezhXIR,֔49C]!;KEplgoLk|hfh&L eh?^zC|9W+RMơ ϝڈ@AgKE.`P퇾w Pk~!s2GuҀ^=C/ q@ڼN&O;XYVquH'cU+ |Yus7'=u @kU$xtx҃uS^CwH^XL._\KIUUVH4e|~G&nW[prVGR*r/DKD.~8fކ*dc Pm$>̽-5(Nm>DpHgUrž'>鞑[{ɝAP>4?hk"{ yػQOoňm-3>zx]<^%4&j y=g!z.a_ZAa@UU 3{r5{*N!&iNƖ:]S]p`:x(", s2`zhy>4XRfI5ǭ1,SaT*U]̬C+ˉqT+mgM#MTe u|>kl\P{={.y|q3(Syf2IcRKJC6 uHFYd RUjͯgL4Gٓ<[@{d悃vO+H$yg6p# 'Kl2&*V0riTZZ~Zu4gF6?4]:7 ڞR*1ʫ F?_.UqMi̒ef՛UgA\_K_\qyڵM9BרU*$IZRk-|̭*⤃wo6Qm^'SdsB-gmk‚Ыzřeޥ+5Y{L]Pיc8 3$Yy >]Qi2u=Z.o/F49vvi ,ڼpr@'ICl{M )EJ=t&$hЫUJZKzJTKDN 7WT__CW}XnXdu4!diS~oT<<&rXPϞ}.KnG XFy?d>/ }gsy=i؞L3WЫZƳvD ?LJi}߾ Bqxz\龾4/BmW'S,3Ǝ# CW6?=>òW^Zޯ(h8L7&}̛v.E"V|OG6b7?mȬQ߿;zݳQ1!C ! jMmV Ü !Ԧu2>2ۢըEz1lB !]".IX'CNs2lB !d:"%^z B9B-)Q<z퓟fgVѱ)E.#Ζj?kC]8l7Xb;w2G ! #(lq F.5-ytt/|2R8ػ2yY/R9yXޭB!œ ! EFџBg-]ҟꭘZ'W>9+2fà-aɤ].MBjvٙ]z-҇f=+n0gW%ddYқ_p^ِh"oު舾vrzL^2>󴸪՝B dYg/ ,3N#+*rgEK#J i"gljhOHjɞ_^ɵ> O,JѻοZ$/IzihX&/umY'I-Ƚ-/vy>I }4\@m"Nʜ הޯzHĜ-m}"P{œ !ЖįZ6 .TK3N-*c!vZKf3 v?l "+n yI ͬpA,_5,s6K4*\]}! ,g{D A~L3< 'p};!Rbuǀɘ|c1J'LK" !-š Mg6E4ωdKv7/kW>W::mi޼o'OͶ6kM˘ۦxzP)|SO;;wd2O`9s3sK洞钰7]T XiFӎOոƃ$b1O$[~&9R!3V=q*j(96^xk>뺩<!~̈́]i[J ?ln3vA`6 i5EcCb;y@FjٓI#&w1/q6"rnnݔozپ4HXnN9B SsyJMpΔslsy=weYyB2t俩/?=-m[W dXOLn#b:2ĘQQ1#N?I_^3tE*Ȅ_^dKY2ݸn Zبk}Z'.x~!M o$Hfd: 2aڋǼ/󒢃*]X!\qO9w|ZRT{ ^ۭWEzhlg<|Lh!Gwv 7^tyRYׁ֦d.ǟ;6Tԅr%^=Wz_?x|d+=^7hACOГ 2WBO 2d^ = x%d"LГ 2WBO 2dn-?Wtŷlơ)U =dnFѪȄ O%~oFu~OS\HeD C$tRV7'Г 2@}(r%z2A&p;l 'c O!~wt|a-ρ @dp/ w3cbB5h; KޜG$OR + :.VUgm2Kd"LГ 2WBO 2d^ = x%d"LГ 2WBO 2d^ɓ=%kgDU \YDܞ[d27c ثSdxtr_=uvJuĕY]q O?Q*2aSߛQ1Y/7zۃZkyÕKܕY @dГ?6)olVFUZGڻZ'%5HaUo/U[Z19tojj0J 黻le#j5OčN4e/:naj&i[ǒ5%Aw Wv,c_z]SJmҾԴ޼+&>*HRvzם̿-5JOd2O`OZab;t%Zjד =jԏ^>(#Eb.@?2f7`!b7.Kڒh^ʭ#v]T3f{y'7MfB ϾyC_-Jzc^~y⿿Ph*vSj!/~'yeCavKgv$BxA3iY_6w3/Y[Ԥ C%g<2Vsaa 6KΈ]`Swqs~ZdG- %qN]tg 0V*-yF!LnlQJJlfTu;SF-($4kc^K+f^ްm|F9_ZmW\,%FNzsHlS?о-M꫹㦅fܒ((J8vf> {fyqy%~RRGh$|C&Z+j$SvnӵRUOK?t >{lrT_iMh)M'\h-5eESKOƒ݃u:Nk;ێyeӖ&ŇDǦǒiZj;A)X1~̡=Bu:.$6#L#9Wl*>-{<S!xL׾7 kՓ4ZmYӌ1X~2u.kr!?)V8+Pd.l^72y_O^4h[SNB e;a/jUj˯}lnh`yӆ*b:fOa.Ykx2fc8AfgxB(m V,w&p%f0Q|V=48brg3 ""!z2߻3^>^ w3oО{/qLjޓ )}w%Wz|c +a= x%d"L /IDATГ 2WBO 2dn-?Wt㽭㣺)׺ex3KLeᣯ]yMp7 (Z0ͨ]?Gc`~3tc#8@8ݓ7xdn&MJUzؼ=}_F,dŇqF^PГxo4E+8דq/}#~x Y%Kˏ׿̥a؋g֮ۤ u=' Kwں,r{ω7g~ 2-=vܹ3|dw @d<v QG^_D xn1 f3U= xj:yJ]g?XpD xn1 f3jޓ!xd2wSǥW* b0M@ 28w @dz2A&JD I>J%˲5;z2oDzǧCpR@*i~~ZQbmؠAd2')JfT#e}} (> np֓?d2su7n>uyOK4EQ@ldrsp!ԹWϟ#٭}n"d2:{Zd'J_hDBE;P4ES֢Ay^yǗqe,ғ'NE i2dȔSIU G=rDPU~sOf2Bd2QTY*߭BزeK0{Rqܠ`֬YZlv=2gNWy"d2W޺5w6l8{܎+-/'Qe_Q-E%U/Wb64Yhs|ܸ_'1p0#ni4_Ԯm~CB/)+5<B:v8~DFcedT~ z2W 00ZΝ;w~?JC| %T/vz25<;oۺE6j/@O*?_߹>ݲe#G*|}/ 8I*?!##cm~~~;v;w#eoөS'{g)&(zK@A;YT/w4ݥK̛o]RbXː܀BcW_ի!D-JBJ_DbxxfH E;'|廋Us/3ώ9Uq\Sem; ")CH_/Ͽ{^8hT\ZR.movJ?_Z"J$iD"%4MӒ=8.88/e9Z,.^Pո?+ʗ nݞy6nV3d񭾓q#-4pǧ $?Wbwɋ ,"J[i+|`^g{'r\+  b,tY*r%fsiICWp)%92߯&d2V=we=v-$EQRE,˪Ԛ{,K]MT1@]:N",G@ZS>>>d29MQb)ּ֜va4 S3L(3:g5IENDB`tora-2.1.3/src/help/images/rollback.png0000644000175000017500000025430611303312237017540 0ustar michaelmichaelPNG  IHDRQʎ pHYs : :" IDATxu\'#)R T"u_ݮvWRԽUԽ԰%$DwG d7O,3o߼y3vvv8l6a@ ΀ TA|!Gv&O$ Jy@ ;P(`0L&H$0u@ @ԁ HK+&Ix%%|B @>qX,/j[@ D+B> P8@  B}ZG5 0 h(a.הd-O@ P( ~ qLgXl5Pf. Cij qB|MIF4pgwmmMg!J8d̩ts~!I7h9'b}TNJK@ ~AP*5?7711!''0candii\I%4Frtrl8#Zw%$iuH2⒬9GȮhϼ آ/,'MHhx!cop!!!m: {8őo}ثɅ_uVXwoô"[EL}ïX!2:Nx\$976է}}]RN@;ښ $ɄӋujoڮ2hB^)Cz:# ӺƋ?!]L\out{@ /B߿=zQVv!cjf_PǏR*s!2c#U i3/0gr ?ͭb'}4utVzӸ9<b(zursDWw' D8SjPFzڲ݌wO못nT-:Z6CO*bNQ+fWN=&jhRb![gJ_XІ(s*&TdrH q(p{V ׫g_jG#cJIo:@sh4߿M={cllbb"J+;x47vO[00\r]ne<`,ITqĽ_sMI"Lxn؞mBu|û mީOVϻ`1}1  ֿ7E_Β$/zR0-Z*y&1lGDNfo9lAǯí|^-ʇ)ST8Eh\Tkq!ؿ20@5-G l=="KÍ\nT+oq{\LK_(0KYA $Y}>sXhp䘣fvo RJun;5IPã]xsSO][a2ZpÌ~s;[U:\R,082`ph(WR! Yz]뤌NBʩX'J7<Տwb:Y0h\# 68ՏR@l՘ЭZhgL1 _hT m|<vmՕo"`O&nLXzNC53;mm{7}> ,׈r mm\B@c@ D (r6d__Y{^lۆ@,#KO^={KИ+];YzY޶ams)n^,a8ǀ zoE[`jnɂo;!r3b%m͢J>Zсwdps Pʰd!k?(0,L%BUiiDlj9M @/z#07as/쏒;&lP7v* nHb)R*^^ʚN$uڶ{qdKa_Jިm g(D CtnD8.2@K(r Sb:L_Вx@l2ln0K>^2g\Ǧ{[$O1t1,SрT]ߔ>ahL/NDNڬ3Rh,a_$lw5 Rϡ Pz>l6l6 QQ>yyyzz,R66jr( `X 40LKQie*ZQvυܕq+ktQ|䒈C1S2"zV,ʓ8$n>̑zPPMs<)Zp3oqV s}+JL=cƬJhrxh'zlZAh܌A Yz]뤌NB(S>VX\ZdÎM6(-J,L0l4[uӹGnܽw}Pٶ87)޳M\s7WQf^Fȓ*>^,W+Oi͊X[&v@ 2(666YY(z{y5}훷o6iEѬ e*q\R.pP},3~\Dd+]=s=0+ F͆5߹F"|~緟&Hp Uπͤdyd]745]v-qbQmM 혵f(员q~18I8&e5mjͳJ, 3\]|$UI$R$%0D,KqbI$/y" ߑ6j$5vsv׵F75D4D.B[.%d 2kB^:)C*D+duzUO׼vJbG6bw%{]Ozd׭4!&-|ylKV.LKKUOd{,1 ~z5(7->__"lAkuN]ǺʷCGoQS۠ M{O>P(L !͊A  a*[Fg#KV<˷✸]V~c~ѿ9*]1㞁㚝XLmh3TRR6Oݹ3z-#v:M[KTV#cW'b$K3M`OlUV]^Y6QNk]c} ]Ǿ(q;]UR ǭof9Ɓ;@1n*_Py5B!, F\2&:opsO $=8dʐ ׎:d}iƴ_VB7\f1h4)n^ϕ_Kݢ&E`nR1E2j޻%3S&풕YN1tl3e2RaiފV4I0a+Z_0uK( va}8[&TbQb{쵴ov@ !"aC[_GqqA-Z2`R7nVbX}.F}}|k1Ɔ4 SbO؁g>=uG2p}]ŠQFA ? qWΆ菸3o5=2W@~. ؄FſP+kk//o#G$s hbptr|0ifިݐYz1wl!Fap W\,{G-@ Rh4: eVH.k9@ T*ZcB @0@ ?j6P((R(5@M˯F@ H΋R%&8!? bD``cbbQ~ @ RlP1x7:*޼}״uj́8 ]t:J¡tXKT|BrJez,NNNIkT: TJbm~ 330  @@ 25>+jNTyQ}}} TY*jխ1Ȫ(x|__ EKJN#{CCj}D@*Q111#ӘP%"1)lab{_Uj0 A/?TU6O|>Kqq AImRWJ,*+󇱱qm@ H9ջVQ񫌘z TD,#T !lQTkJZ/M\Tc%JG.\1NVƏ?o9teǶWΒ}ƽs"@]2ø\ocxD"Y'|lԗ!Ç9:9GGGWXQjttrB#HAbHpႪ*& s ~js#py묤$mߠ;3( *@ Z3wa1'OewkCU0P$H0ǰm=^zuW3!N`%PcQ,@j.11HFd5G!,`aL*Pe6 Bi\r(RkpNKsoY㟗@#wʃB󱘹[o$p [ ZV&u'ߨ@ )JCXbbR=~8_~vp?v(BO1VkwˑkJg%cT:d#a/_";ҹs'Fn S^[P ڴ2J&HY2lgJ C"-y_NX8SnY+||.mCCۄw4\ Bt}bQ G_ߎQv[?!6/nui9R@ HpprVn[f͚5k/[~%%^!bT,z +V\8W TzRAΝluh ?_efdzK. ϟ'e+9x}gdA+[~AsiC3w|F>0< ꃛ{Z}9;"(YHso-ղw߻~b %]qޅ^԰p-pfػw w3:x?ޗ} 6|aT!m6 G&_ ku})GUԟe.ׅd[;v}Ũ{92MBc!SUpI(LaDC b) ߓRR DZ{_MݻOj=&gߙ֣!B9 8Vf#trCf#IX.BM p_GNȤM 4BJ;իV]| e!1c F@ .! a53EE+Vl߾{:v|rh|pP+NP X3F[.\@b EU5Wka9wԘMqzp<aVz*;O㥲@ (t.)?3wztۛdP\C" Jtj0Z,}+m9{K.(krQA0R~j1È(AO!F)L3WOpD(TE0L]98Jk8`au3߷Ov:okD(g>Q=6a>Zsv "xs5HSEOTAJ_G:m5S<'B@tJf oq1 & L&ǕoԍJ }4@շnX֥a%_N/)EP$ JJ mkp@PHq뎮1O9kF6-ڏ*3aAm{U ,͸{fA-~+_4vgJZژz}L=o&Lz˯O00.[uӻb˻9,j| Qc?/}C j|c{o2jʈ_ࠀc.| O׮e@!/M9#[hݮ=2?WU1jت]W$Ӯm\q`jDc/X%-/Zl-B^}-C tT@ -&Ӑ̇5QctG^ ntGGT ɾ8!:j7uL3nj}vr-v0SݰYiKk4 jDI"2&IoD=$qym~Rm\J OJS;mg"cH l,t0_麡婵i u=;U:Hv ev`QIIUQܙٮ-+۸&\uaܥ-?bc%QLs#fW>w~בֿK4SN= ڣ'ϮஏE&nlV B;iy5RꗸTLOR^iε3#Cvy/#V@7 6,!3\ @av}7=;{ۂ 6_>9E IG-~VWFiaF~%on[ni^`Us6"Pѩ(mJ՘ժET! t,R/j*D}gPTQѭ^97f>׃Gwd_M%ԚsIB Fu͝<>OyRW\Wwe7gEO'VMծeeD8X}/Nj@w# .]G頇Mh"!XΣ47DP5}7*|#&(8_#:۹mqms H$LJ ޅ }V6EӷՓ(y ?ڗ?ۂ#}~-~kў p >3*؆P 5 v&tn<(nks6  Ͽq!M#S0@#kv J32*4Sc/Ǜ ̓CЌ}] jEڸVvP iyբE(/n*Cv&+|qIYTyఙtS@G j;3ҭ"M~$Ftթޔ} ȟA<3rj*8ߗf (lV淨dT$VX^^N+6zBUUqTBt/f'wCfCW5[JBCGt+ i62:l$%7L_5é_R >Z GJP(W;7cyzw*&pTHL@?"zVl] r VlL(gњ?d[ti)]lwCYTqu>Cر5LJ* O\nBF+lXnnT.lg<bT1/&)3qH1NӋ)F 3A"qmjS5W Xd8 >D LCKSR\YOΠZ@P#=#t\Ѥn訶YjKxͣ0M ܡ0Ͷd%?(0B oUSȘՊij=$K*rOdu*ﴁP1@eBbBB!( .Ѕ[چPPG}Qgx3nedZy/=~8ʼ­ &5Œt G>+Q*@I.29/^ޑf'tc]UşN}Z1lG\ڍ8rǝˤ@1m=DII%; XsjOؔs~ʝZ}Ѭ5V,nv;RZV2m]?m/0Wg7,8KVrbZ5J,ƥi]@WQ&pŏ0V4hݎ[ sۿV?{rm*=;iX,=ῗ.]%w3gN_rǟ?V\VL] t},AZFޕ5i[F2MغeːtZS[}zd`2Ϧ$FA]N0cEǦt j;hs))7hDhgQ;sͶmuA= 2_k3;nqS7s L1q{ s=hx=Riħ09>>eО3'`Adm\m-UUF1i4C. _ȴ%+o*E:RH\)HjUa-G MA6QFFەKc -2qyFA.z@QS +#bbUǧu h1bep*.D؈)bcVVICҬ AP\O+i]-EtTE5]580EĈدƻfaղn[nnn^ζLMpn'_06t ~BuН*eddĿ{QQP  %AIIIQao)iii)" ُ'''jY>;vۙnp!I>#G׍E!DK` <ׯ\zE"0t0 qPwP{>bǵhřw%q}wߪN a @ !P>Ԃңk۸_b&|T,hSOH^6LjĮ@ @K@*بtZKOjbYf6zeB UcSZ@ n R Q(lP*aվG6@ DGԲu( DV52@ ׃Kg PԮkE)ba{*@ LxAc(hѾZ@ @ XQ,:u@ T'fU(6* B d]}S;WruوO>طcn Gu٘ OpX93 jn,3KsG{GGfa}ܟڼ RYG}-X99j}]ҟv>sIm¶w j`1iEUzdtZi~܎=Zx:;5|r.VM&S"^f%i5c`_C6jvˮgqI@3m=pP`O bONbI3'7d"4&gG0'pK8i}ODŽy;8ZGA(8V]3<\ 8 zV}kޅ_݃COC=KퟌzolXJA]Σ~^,Bctzsg>riB|: bճc>~p'ĺ;}gW<H_ٓ?ߤ.Ԇ? %kiтWrFXR8C)/.e)Fc]Zu+i" YF~٢ >. KGi0>oAA=SkO< JF}sNeLI M>MBĶt}k_y;O=5:eb% n;|^Q+;-QZScg98oP_'SJ'QM.Z lĦQ.L )|N.N.N.[SJ2l:0{uvڙ!sԭ/MCPN:-*; 74"C:ǵ!Bb`B EϘ^j*ӄɱXBClxV\! kj淰Ec0&t}u©Q+F IDATZ(r{[`8M15%,?.*!&vqg>a<]6mu+uRjs\uU/TO^Ȓ}Ash?qݑϿ4чˮiT[cCSm$&8딤䔤䔤7p*k4|Bae 5B:T>KWR-b0@;֝4a2 0QT**RMpPaN<:C77fbbH(8&Db1GZ1\ѮZ^ R[g 1~kEiGZA!Dݤ3Q-7{&(tz}x+ J?sYF pq}1Y7۸7;$rJ2.m`&>#NWJ-vj@EXH"t);ٹۺ=lIntJ WWFQ òY _2WWYJQE[/9Ga-일;̏sv ;g'~8z7mhcϷ|U*Y-O8?v1zmڵ)#?+Koldc){+>̋s{9984&hӑI-?#p41aNa96Qs\;(hx@M1jhfy̯2PqA}L453koMݽ\ >n_X^1?T_X)v^ܻ @ MĽ @ -c@ ,!M>-m= Iօ?7uq%WI}< Z;;z.F_/h*}grnν#.?yKWK. /MLXJ"D*k0a2Gz5X!ƤWiʣBp?Ր5l)Nʭ,$b¸9}{8;:54>6.%ML,{8;:RZ*oclh6rS\VQ_v6V^#ԜWotD ?nm, I;:85mR9;1Q$=[z;;85'~]blLx Uwtttmm̲SlYy%3kL_5G$ʝZBYWϘQPXxM}>NHº͍IµaEO&ʧqucav]^6|ݏMĪ/HS"lN>|5Y'ė%&>6zK^oӒ_xyibIۆLh_??ٌWrPr9ԴԴkX0 Mߟm.'?>r|57LUfơ'ߧ&i(OLhbY]Q  \QrړkH_UG$JRum|/vѭ ^A4.Zz[y/&֟y$1,A=K4[i hiP4ӮkX4m ?츗MҬvsfm%X, 3kClwq gΡ&&,)zĄcM䈁$l2qSv#cU("vv'WZ9Xu1@M[téL˧4iZf ۷hxjܷgJT޶_$M\ێ߲cӎ9k0^&4 gzmV/{bLLdnsEJMD%AN' CȫǤ߄tJ2Ry~awPf.> dJvqڂc%I>اӁc¼zzRU|`'kwΡB zuPO*M{uE6ϘQPXy@V4!GT1 YٌSGi<1`ľ+$߯_ ᤅ>,6L5c<Fn/\/$BZֳQ sTsG$a.cljy' k9Љ-bπ ?i0ÇHncv= *tA7oiy2^lF;&n "="]J;vEOAEީXN<{lxv#T^ht0T-ٔ}HMy@N[_Rg|Πk8t}WzS_5\fF#Wh?ot`4`DUj;SHYZcЄC01yÃ_ Xpբ485V]+qV((:ےLӰ ΖP,W4v gӜhi8K-5!]}U!@TqFQ_CY v7)n l:H*#bϪ1y|!> bͬ"kn>Vg_{Gr~֥미Ub"Ϗ)r3Wfv'KJ @\č"t4>[)(<4hx WD !7%h 򂂇|Fs* ='NE^^[UWPT DP=eÐu& WyaTErDgW KS-vFk*:ke[nX"(}p*Ri3AN!k9 r7_,w X=%.ZR ɻ8.'(?i* j6TJcn)[8(0* ۣ1:C1~=2^B"!ef&[ frhڇSpdpW;OMbXѹXW%U.~`Œc>. x+W q] ]R G(^a\JcX3l 8J`1rZ氦L#`Ͼa8 QTukB(:COW @Y4Vhu%kIN ɀSێ}3c}v3:@{}7͕p,,ZWlvka=4d&!!!Qa}yQ%9ܛS5 j$4I-SH)I閖?aqzqQ?HOGbX\3/+.Fmwޥ7xɈظ5"i-=@aIHHZnewk~uH"b<9]Ҙw>(ZsT-D-XE!!!!!!!!!!!xEXBm QIHHHHHHHHHjhŠr.WI4eGwmf#o}UA"$eg/DZ1euUlkW٬t I++ 1+.{Onl&mg8jaNSnV}8h&QXSP`LXˌDM``=eT+M{.Ɔ2FrH^f̘f,iX /׍wa3-=DK.]m͙L zQqI:YslU!sF-_+VڡAlCA+߉cƲvqQyGgޙdgf>*zL6oVrSMdut$s5 ( Gs,UW٤-e(L6mM+),>8ŖXu7yT ({>ь4ct0q {!8e(IxX''z9ݍjpSBN:b5ɴrQ(@v"V0Nȭ9w kU6B [Q322R_n0cR;Mx-ӦbEo4(]C0ޯ\ysh)'8*b;q< x zQU}^&Yjy\/%4^i D(qx(Àe7r(_x@׵0ҠIv5`eÎ/ (/̻fro`S_5~T逅$|/O: Dc]G9h~@2F)}](cTZD71fN+o>z.5ˤ{昷 ?glư;g?-d-#TV6uo6)_Zqof 2Ƣ  O5-iGz\=Z D(E[=P1*%!);{E IDAT9 9k=y7LX C}&s;hmL{p A&Ĵd˂||?s:6>菝P_t[ݗI:Y`붺Z2k9!:~aJ@ 4ouNWwAY=Gy2t{Dd?xTn,w-vLNfFĮ0rN ed2aI'~_k)ZΪOD?W)DEFilxe>?w9ИpjQ[_<&{Z7E\,ZqSJQkF4'6 ' f![HO/zIhjR_T6P$bɐV6݆-8\V zXZK|Yb kǗ]*xkeގ+lgPs{mdڻSz5 )x)eO$ZږAQ@4E1*7 wxD'Vz:; :Vw.SC, T{O}q}~S;i`&|~KKP@3㭗uwDO,(z{zUne1RoH5bՔ#:gČ[K./^S*ƭ$z&2MMEA#"1ܷoݍ{0iЬ] Z|#J֙ciǣNAeߒ'uX, hc* R7U+"[%qDž,ya 'jn%P7S'7U|$X}sGHyn!5q,9U^4a!H)rg|QuNuYŲa&&DaE)Nl/kwgԬ)~h@Omk@!MmiNdFq.Zm(eZ},O| eyaw_NľrƩ^iՉaR7W^Lv fVwfBg E(VtV6i(%&, %y'y%myߩk ^nPh<{u[ =:\_?Nym[9rMRAMB NЍׅ[`e|hia_8VOnj;EԌ̌ᓾ_txe&EXV5ot#3N`}xVaG5PZU*Ȩȱ' f rhCjTKKIMKIC%^i0R̔"i{r:R2q7P=6pE`Q͹K%HJ Lm{*R4r20眼[WZ{%= .rvldڳS%4j? yI tiՋD뚩 "w&B<9؍8^a a!}Ú6͡2"> #34tua l4>[)(<4hx WZpxuNY%ee~֥미Ub"Ϗ)r3W!<=OG=zu nkwTVGf@ صk7S="3"Tzy!tJ("b׀ $) |5X˰ *2(K$J<\oLXuh3ZWyY7 /2uÕ!@y~ohEWyH+rF/>r XkL m\c$[ ]}\eQf2a)yyl5# eV;R ;z_n<r7K5x)E3j_a(Dm Wq6e.>dF| ˖@8m2m)2&%4O ?i4p68)80ϻ56wF&5yGgޙdg5wL6oVrSdut$s5 ( Gs,UW٤-e(L6mM+),>8ŖXu7yT jfd&=~8^cnj q,C3a񄠕 1cYM9gݍ0;Kɚd 7HۄywBnUϹe^3mbYқv}nob6Кe&.4pc knHoM`VWS/--yƹ.]pW._voߎUp@lX,毀Gb2S] M3zfٽ"@u3ځx*9]3͚E1ߩ80dWj]ϣ/O̸M")'i>Sg!,U ay~G_%gf?84N hH} kzmmڽI/P5m9x Kz,JO<[IO|~?2qg\ј|8SFFKDQe"T߷rD SfCqi̚/hNHgonMz̬s؊=f(Z7P" 71-)r񥹿hLwgyF1jG.^_ Zj@NC.ElqzgGe&>4c o#46zz&&&FFFFFƵ0JJ CbEo4(]C0ޯ\ysh)'8*b;q< x z!?p2 (Zv#Lk>[jy\/%4^i Dӎnعz&@t] ||?s:>wx/[}:Nի礂Ҹ$N *U7ٛQUSX)Ph (4NB A1uJ(\ySգt1]&3Ǽ7UwX0pύHJcX@2Ö]Vv *+޷mޔqQ,8^ˌRX4* #QJ7O帤`[ F4slQSGQ1*%!);{9 9k=y7LX c]_qX3h\ͲmiNlx(ON"'t:]]]]OWW_OOzt:Fzs4=˗n 2_wn۫%N?Jϡƭ>B+ ?y]tUt5$r>M~&Kt6lя ncRN6b\]Y=Gy2B*;)ݰ(3so 25D*4m&yŸJ'jl/,p5H|{â|sw˙^j=&Tmfֺ-_cܔRpy@TZ~u M=77|gV0웅l!Һ>M8aI'~_K)ZΪO0/I pw-vLNf˹ 4zXZK|Yb kǗ]*xkeގ+lgPDwfo05ѶM'uJo#4Zo.RҁNt0wt>fEM]X(&@7K=fwThJ5bՔXh}ҶEoOoʭ,FD@TS]zl؁ чG/yV"= ;tjhڦB5 yT#t g-Nsr=5!m㠻y9: QA ރOɓ:s,m\x)hQ s4MjcQUvnݖC[%qDž,ya 'jn%P7S'7U|$X}sGHyn!5q,9U)@ڴLQbPE/9+)y>x'Nztܻi]^>T޳'[ϵV҃Վs3hjV?Sꅢ?iammȐ?|0荛[7b&:%بo#42+Rf vA+g(V.usx *j54.8l9ijug T$(*D,5Ern5zAUJNnJ0ءпS12RΠk8t}WzS_׭A_G&-tl1kPJtyLV{~/f|L<#׺.t#uaXZڃؗ48>-9ӫګAN8>-%5#3C]!^IQ5VE+UȌXb@XQ )bVd +2&j#rl þ%Z7RRR#ȕa6 K5B }V#L<9rífJ6MC_ @TUXS>4Zb!'?&FaAhld~v16B{)sEx?wp;on|=1^a)[%n hQwHQciFgJeR姅}2wAӸyFYe@e8jѤ^`Tj(QKg 7JӨ"y1]QO|zjR4<|o}*ke8Hu@\¥~nOG7.<")q&/0}%K|ˁ&ʀps~n]uhYɗP9V(PۑB& U۱#=Q$Ezuh?re09L#/#} !nKWCQQ'y!Kun5ax Jb3QOOv{ ?azѱv6Jɏk.2W̶MgwJs(o#4Zo] ro*Dʓ#(1kY v7)n l:H*#bϪ X=%.Z'r+EErOXʀP5bמ/|TT{vMA*57%h Ijuwq\>O P~Еׅ=&UbB#|>AM bTsRv'KJ @\č"t\5="9"Tz9e!r("b׀ $) |5X˰ *2"K$J<\oLXuh3ZWyY7 /2uÕ!@y~ohEWyH+1#/r Xkdޅ%XI}\?0W|_7-   =QfL<ư5~gb;@[V*Z'Ǻa2C{}7e<٣Œ~8h#*z{ !beزSk{1`ʞsF-﮹iUsRmf.]?"V3>z)ftʰt _^~A_O/.>52S@I TX}x:clkk0\mu0ko1}Av%okԬe ݱ"u39gWe]0M ;K<kor(t). syKFʄ8vpcF~x 6Y0K~k~&r$ +- aMG}ͻ {͑Xx '(tF <%=:쒵 K@ŤeҖ! 5mmˤ]l՝}f 2 *D-UukE(:COW k&ӆ"i`4#fFhzow@|>?'+#))XXZXHZ$eOzo !!!A/Ej-1ޜ2`ixV68h'N!$'[ZZJa;t%:0Aз ڋTT_b`dlܚ{wQ| $$$?newsӅ s t09VMp5ʞw4c1XfF $=~8^cǤ q,C$ є~MAmn #[;!I2DT,~c>7qmq4)@:Jfo.ibѲBILOyw-xZ7- zgeՉ{h3aƫvgdH6kRXgq)/;0w]ίm¼+k-w2S AAsL`Ŀz>,O;=c֚u-L!pya\`B1.ޣ4[f*iDׅ2F5@tcꔾQI?cG9!@QcLZgy `@#h^+)awΞ㋏Z$ [vYG1l>{~mzS&5xa !SHZcфC lJA<#w:R]Ðfzڳ̝Go}Q*D%O0w mڅSpہOwM m֛P_t[ݗINu[^-pQڜ0n%U}_ٷ:;!i{ڲLmDŽlBۖJUQa% ,k"y3EYIdXTz'o ;~ǭ_T6P$bɐV6݆-8\ iLq"!OԢ GXjDvO=-g4V&*&*z}뫱ܛR9[ƶ"e cܔRpy@TZ~u M=77|gV0웅l!Һ>M8DҐTCY=Gy2Baw(7jhZ:EyY/XkI/K \~pͿ \oP48ڢqn e49vB`t-Lszsz׍LpbРi5(:}nxO<5$B0A%Tg^:U1Wtܻi]^>)(j^Z@xS#%HYV#EA#"$z&ƍ;4f[/m,XPƫbD[:,bٰO _U}[ɓ:s,YLӄSzo4EUUj=B3K YTUeAODJnVOn:KRI' hCjTXs,lK>DҀz)@5 yFѼ!)'[ϵV׫wgԬ)~ EF?!ې!4ش%`9^foaJx?Y}9-Fj{9U'K^aJx2 }N0hZݙ!IRn0ȥu[ =:s$_>^kTP"~ SZ6x1\=1,整aCGvceBŭ3d4gߕWaU n.+CK{pqǙiɟ^=^ "vǙi)'}ݿ L*ZjFfMW*.jLc5"UXQM7Q#c+N@.!к!ԨA 'tI0`uKg+]:+x4#i xިCt)4 }%QUa1Ohɋ-'s1;l?i4;\vXI[єXɢr;87JY0]߭\Lx4Eu0~AB2Gѥ  )m>oxPؑ(G2PTJW% ȏz|tM!R'ڄ PbX{i\rr\t<,q2nT a|+S %q3ns Pt >ߜTęіR/E-( y~uաe'_CM丳BmG6r )Kk p&xKRV jdb4=oHR(V_|%3%Ex"UV$6e4lPl(wChqi'N!0v*_+BE+- ޺XaACWdU'GQb7+,##3oXStݦ9tcqUFĞU1'K_qEr]wSg)A<EG1L8ٳ~qԣQN`v v~qGe|1J@A;V2 ͬD~ᣢس[n VQ'_$7Q$;܃ CO8VVtga !sR Q$$|+ {L`cg6|3 S 2 hPzxLv{ObFkgsP86m-h|ڇSpӁ|_7ܴzbaC:q,xeW VQ Grn%vwΰ%v*V]2ќiֱςeƴJq~ʎeclj;6 ˷-y2ڞ4c18S_W:ҙb YgH|ɐ ~ʐ,.~gm` )hq}FK{ku|͇}ZvB)D8flK^><沤cScScSfE+k7_;44Ly"`O/CXTܙʺ7ŔD80lMpiX}ÕC#KNqbrXyLX=fL*B6Ć}_,zi|xU)HT|LO[i8j٩|ܵ )& 7!nk\wuy)Cؽl狦;Z.ڰST/;অds%$%%q8 K+II5uӰ?ZQa}yQ%9ܛS5 jv&SH)I閖?a{]N)0 A5PE**ү_X 026nͽHtEO>CXրg:]U'mgU~-R3 B.s#M~fIvMiȾOBBBBBBB6iX}{G4fOvh򓐐(<%¢((MM-A eUs))eFFT/.|ZMM-12/>&i.}zNGBBB#,xonh'Ŏ[.ܠWBX@|h}1K٪mQH|ZE1 aŕI*J.SMo޲ <(:ĸ5vnM=a=u)X+;{W҃!S%[7qUqm+ݔc|d^uKm'I#*<"!!8^w Z־ϒ*h&X4MBj̛*HI7uQy#H*5 G͙nHW\6*.s2sxl͎F*9>rD$3:cl47H&A% .^8E۪¾wqe.ԇqݼ@W*.Ip·6Y*{~:U#ٴY{:U/woۡ#Y/ ٤gsM1y̑gNKܿE'gf7 ͡GK;/@}at}^%7ZkQn^IKB.<_~wٴ-'&pWm yva+5QNMA vՔ{Sq#'cR!itC)*!^z`;Jkm < K-[{Qgʊ{XҌ,DK;q~XP,Y4{TEZMZ~~8R&(~ЈSYM2):\#phŢxaP[M* `6iEF%z\Z|eyp U%>ӛ)|q1ݵ`%*{$n0pR!:Ĉ]P:0Jt{Ҵ,LԨ( ,C ifu3ף(ng/*LB9<4((lmp?7BU$]MT! C>0sPzѬx_*YTHX-yPv>Z4`O15_ZTm~YtZ [T@`wyeGb(|O+ FF{c*Q"+1G24~jlw㤂9)O':-Xԛ@b!&)5q3edSbɗ*k N"ю#ˏޗ7/ehmdډSd^ GÏ|״2z]&IWx+\,T.vO6//XyJDŽ[v-Nh 0n%@7Tj5*,-XwqЃȨ *TTvWVg;*#Kd u^u\nP DWPnoOKKbquam\|O,-('E=.E#pJݿPAȇUtSko?Dq3֥o6O9vॻϥUZҏJ:Xh/,r&cʔ,<L'T 8ELC}Z$^S2<317QvklG?CN?S ao]J[Ty'xCd6_"5>}c EMhD * z{׼G:OkFcF3~܅lDCD΀{"Oۻ93d  E<~eêAO.Hc'D4/Xq*\/R5EQৣ@C1Rxͩ(QaښeY^A֭ YSgf{'7-=ڈ)KuOSd@pk2oqg<;e}5[@N1iҖG Ϧf!-G?Lx[<󟱵Cs&vs̓cɚ?</h%\ [=vc,b8_xɓYSbR# ~xNgv J BXmW0+uMFr(Dk9c̭f_,Ù$U:ve%Mb.e)(WVHm25ݿUi $yr6C[R/g? I9nj̿nxV6|'&X-ʣT_i8_;pc~A;jW.?JjxEQCqQͩhEbq'$B@(ʘk_qREdY'?H29G8C\o8 l;>=>F&!:ȰfO?%9#Ԟ IDATOՕ^y.|Y{Xڜԑ>Wvm&EluoX.yB3I!O_7ZbSkhyMg_c~QuF8IG;\¶[oѺ֤r"b z^Ob zAgbĝ]ihCc"ݻ7%M.˯bSX` y$4)I:iZG@yV՜|`+ o^塓n_q5dzz߮@j7 3922ļ/U kQ`Хzb ;>q礽7SXMkEH$o\XŨ?9=wYa$~cZ쟰k%>+xRCJd{9J)⦛=Wӑ6UTMz_xlbvet3}Ϊ1])PK$b*mwg}iӲ#euVshҨZ$q׬vyټHi=vu:-}߿')Ve{RE9uyСGՓ2.(Գ&BTE/icNj`X`k'c6nLtbVlc54!Ʈ&/w*|U͙wY5 PVF n6?H|ڼsk!ͿS2HJkT|PT3\,[%R25T3 (tbE0ќfp1h 1`#G/ ">>^dtzxxToQ.^|iTZc>no{wa0M0~K() #=!pキ3=ݷ LQ`c|}J S!bY"Eï0rA`0Bn03[dӒfOzG+ ~"=X)/6<<944${pY& `0Liëb3 Eff]0 `0oBs~ر.]T\Lۻ `0 1O\\ܸq?ޯ_31bXׇƵW~i907!ܤ6+xw#./߮ "4/g7t?`35 J;vΜZvܹZɭՊ* Xo^\'ޜXsi#2m"8uk9uz3{f J_[cXn8Z{LG,cZ4 M+]6mg6/k6Y0c/MѬl>濵?yo~Mr YYvĐG qw/h3`>U^ K٢Qa/nX=ֽ4.&ߛuIwB>c]0i_S+;8cώ˹7ym.Y=-+/Ҽ,He\gQ mMI;z3ۆ J/{{6n,:סaf;|4@Ǟyfo>mdu) [ .^/W˾jW1qf^X/GԫP0-IY(R._P*/XЪU滹%%%_r3~b ݇vik׽~M g֬Hm&0T& ߕ<7TL̟[UЮXU(9T<4{-[u;`A?u15exNעOc):;~ihVtQм @mt#/OnslkuiU&aeEAhS&Q.ܜ=s  uLa.m3u]5&uwĽ n%g ;ku[AisW,~GqfM5{^FwVN)W!sњ|$1M!XZ. ǐ-E$Pջ&'oyDljxTxF  ۽Y5sTS@*T2bQW{׍jY٬&̃" ~-.P)_/ h4Ǐ@^]\\dO={Çz;| ^2}KCcuaL>:z1xLG6 еW/T`|gkz{#WT~)_BئsG=Dl=8ހX+{.<$cV{>;\)}']|֙6gDžeX6>S eçwJMtgy.KJ6NfwRd4Y!BRuԏWI0B${4&ɹXA-2yAG#t3H#f}]HJ>` )f8,ٸ+׼qJʺZIlHELm]u;MTi3wHuWG Oܐ3NFqhy0.<} `mRR)9_oIZEQ"H___MJ ժz~@/U|XE[off>u:N;:*|bW١Wl&8ujb>P6" ϾWWW5yd;I&l931. {'/ag/n^}\>HzTט}eÖoQ\t6BgLlҝE#/yahĥkQu0|&B~QؿjN4$w[R=*z{ص/ Ǥ|N!xkS龯Vh/̓T 05XHͳr?\o!-:IRUQZMax…2{F}yL ȆڑRB[gDjN):m]Vz\g+k7ټ@̖!~|WVeoJʵ^:ժ4 ^ܔJ,̿KE*RB\Fի!ġC~|FC4ȭϫ_z:iWg<^5me 2|"gbՇ77VEqg@YEF@fҪR/;A*4#u{r/݀Iм\5`Q̐?}x{gu#/11?JViFahO:kd(晔)ˇxd>>"6rSQر6~0[Jc?͓ΘII$HR^ļH@Mݻd@Dhy" (>fXiUFPAj"Vl/ iLZwao_]!b >|P On?$=)H tɆJdt4e+ Am$L: sE7fЇ /+'$IHVqhQ?}ue(xEsSJ*%ǫPe)VQ**Wx*2E挟_qRuz.vLobS9)F?yZvѯbƏGJ&c^$ffؗjǷ_\i!%H}ѮcgON*hYÙ5 liЭ˼yΑ?Br c7{֩^jy/3 Dɼee2#~dJ!{ avUnތ)(%" =Mpkٕhrʻ;Jm*ө\Q!ųQ,kB<=;ciA>` ҅vx=[<1E{ &ՓQ͚?@`3ʫe Ŀw>DzqMl2$=\{w{x(,,y U0o^,{mö>FʞILME5ҶçNyk8'vcO lJ_gߓu.}c, ]~us e*co"RX@4)MJԛ-'IՄ|Bf1'!?4KN~*BG>m w-aR> q7/nWw+ dFw_W943U/J`BR I/l3/ oys"-}[`t&;j=hv2$ΊeCyDFOW&Β.7Y^zNy꓅BTEXPPy:_eNm`Cg3Um?ybW֭cr֪u^CLc~7`3`޷ǷI?r/Ơ \!ai(6WR)&{ Wg`[B(VQȳ<WH ''HaJz1SYn)B`2~mߗ8w(QZķgL ?PфɷӌLf3i:o$+vqpn `pզQ AOJ/1E`&3Ž8pG͐hyeFk˄< )S.2RJQ۲v20zcb5귰dGblRt ѷ˜#`=:}sH&Km۱hհF>\ng8iʼHiXqlǴ'J$ʡ)'W6Vihm`blk\ĥ82(v2@N`s -[* K̡0_P.iϖ{s*_7 _r* 嗣ݽiDȞVl(֞g|*.qXV3}LjxGY\gh!I@.Ԅuy [ͪNmX (K_LeD+"JphīP0-!q(I:.s+y}Y0ŏu^aD`0y9ݩǯN!- #}pyGn..^bW (x&*U*`>NNŹw"8)؄`0_ ʮ}jq!G4/6n:;+akJ3ǎ;vXy#;~3~b vuj5U/^}1k`0 dbR5kh ܳgM͛$s|G'praɼX k%]~ `0 L6|]v_ޡUV.\0#GJ9Zȳ5 0 `0NBAA3_vCڶljiI9y `0/Orrҥڴi|Mv-YӄlVH,\Ǿo 5kr`0R!ܤ6+xw#./߮ "4/g7t?`3ui]x)hLMT*Λ[ݺu̝P$.Fꬭ$YJ`0 |!XMNV"iC( iҸ M{G8G',V,hu:N㕤1 `0_?4M B0=ByaRҲp`lmm9DTzCu5a0=u$ V,`0Lfa|6%* X4ìXPV14]XЊaĤ!C6obI($Ei: VGxBaۄ`0 c؜1hrA Ln' BE~0L;@T*RjcL&ϟ#lmmkժc%qYAhAoᣇ*^( `0eٔĤ$a-J W6G'wMH'"\W7BBz^5@`cmSlYlb0 |EдV-_efb:j*E.Osb!*M E2HFHYS IDAT3?`0 DAxbw z4c *U1+ Crr M3Zmaˆ`0 D" hPɧs`rύ`8t$9/0RnoK+*K;x3XLq޽9/hL![;v̗%5 0B狄"JK2cpk|)`0 ʰh-Lqb`0|iAJ"|>({a0 ]i *%@W_gYDF~x732zIH K\`HFVxɏKD=:tCk8.lMd[ؒq4NLJnsʟa`0 8Xay"G~ç?M{5aBT#@ Y<;) C8gn4wy- ktz:7hѲA~Wa{ϡ!`=9Wgl ^R#wơ tHc m~}Xn;0"gWŠ Ú:[@D4j.|֛$VomD!"kiO#-'d$_W@9JmeUz&F|[/rNycܔՎ!s~;=Nڱx@aҮK"|C}ok R(ؽQ$8U<#\Xll㷽l¾6@ ӦO~ֱSmxg/Ғ\] `pYeX&ǁ x~w6.G,k(oF>ޱVmò}VO>ZPh;O}|WBa{}DO2MsӰdWǘC^;՜O2Ђ}!MQ!cb) qPy "Cd Dƶ|Cl=OlFoWɊ^5eoEbkZŞ͚$?g&JG90o8:B9tx#'>A $)62,,&ɜWIWfb_oT|Y6 ل`0 Maܤ K~ (BPa]Ok>%*A>5N|\,&HJ( t1"ⵈgTK#+9R8jcxKOE.UݥA@鲥^#lz i&ejr5-@6u2EAN9~CK)JbP}ը4MKǭI8$"{ JPә -ALBMLbYMT )LIlEw[,XbHd՟w[~-UkjYȐ:baQ-OĴ:Tz|::94P׊w(uG.e!.ݓv;ˬ צS,-Hc0-inQȁlf#!ىgorzEI)RQd<%\%|Vq^i `0n_,q@&]wGuq爜q-(w-$ĚzIaj:D<)U'$|SdA*T'%|n9)D5y׉SO>{hvuIL]Ţ,Nk4ydb%cVFNK5>Տ-:9 a;vMB 1WwC>jԩiB =4[;K 1Oά?BTݕtQ^XrHOnhRd%i+nߦK5>U%-;9 ,JI[<`0 F+lK=%orIM$?$u黗H:>{SmF !4*_1uBoe|: cnmأcI)ktYݾa-5>I)Z lb0 15 /U6`d?WM}\ոCXQ 6A |w]& pə 6+v7In[~oc nolFP̆mS~ؠVi1zAw!!wQؽdx=dεZ.!?qr϶E#6@hvl9~p\Go|OȳCqӷv% ?uy1 uɋ5DO0l-=-4#7o?wwBR6u<:ݹ}ZQ$'NW< +EՊDժɭKB3>3>3>s ))):*R ds`e0Z6:: V\gif ~$%%F) EzLUʋe2+M,VF }\lL&LF?`0Z\y{{H +eYZmcch UF^ėlR )+ʜ8bx>05 `AeˆO&SdRZV,Izָw64B$`B~ SO4MTA,gh"#?BCF NBN+6SmK6 )R_x5X èT5k2 R BgOfVSo;S1iXS ) xXFRtptb&E.1hH4m02 ELtv 8K)Mi|s(^6ò §F͔5ߧZlYy`FpUu:^F&׳Tj߿;`JN`0\@,:-˲,*>+(<0?8EJLcMmosSV,X bQqbbR]hOY)6j .Fg6|?`J _kkӹg6ֱҢ`J5=>{vK) vi`f/h d8R؊Ŕ:,oӬّكԯW~@랣ވ ۻ|?\:|,?8pl1mxv ۻDU⚖T+ %EG::5iP~] סc FYFAmիWa#ވSdHz׭^ "@~[G|:ӯ\ʖ0RV,_˔l uR^-,wo; ȫyٌCCnr_3?2)g^?[E1tg->|?(_KwZ\.>|]VZئm7#GJ7a@(y EMJWG-כdķroݚn6uR3w,oSV:ү7"5._;39А]N3LcUϋwrУg{8r;\+_ӸyV_L$v, \;<#x~/ =có,&h2zISkpҺ HҪ%2UߠEzžf:fX$lgÕ.Ͱ0tQvʅxo(@ӷ3(?*J֔E(2 QrSjԊ#ܾla֮QN@{޶3?tYptI%?]0zm@[/.gi:ʶwz|6wnӃx4v¯ՎO&c/)3`H ;M]tEP@͜5+))WڷwmVf̘mKV,<&/cʏ?I`oAdtbi6y[3ݗE8jn:A/w"G;N Vx/Kę-{qڴcw\~V<:>[$Pwr~WBVgm~5J랷{b,%'"0?e[[}-:6퓩_\/+۪*=jCH;WePԹCYN0DeEU3qL8T~jX&ҎnIbe&MDzuv˶{ ui0bG~,p)"of@Љ;_{³bЄaM`8]:?^jx[e6vu콏IfآȤsgLb<S+~f++ P1{}'f~$8vv)&4rsWK*7vAt*ۙE=MU1u+re~]`J J#5\j>rt*Ic@VE瘉= pⓔP~lғݏmFdEQʝ6C7|k!ڸH]S|MZ|Ŋ6m8;;_vť]v˖-ftڷo^'HacR̥zuk0Yf)V'ֻ5_ټMX=l~"zIߩ/V3[6ё SL<;եrzdYCk!KX*.xKX&M׍f׋_ek0Rc йٰ\mXSO}ζҼ99wp 4h6G`˗H8*,)7r6Z"+SP2e؊#:v߹խ[wZMQҌ LBF@TwgX0Eg`L J7<&[Ojt{<1XdThK]gLoȮX֕H$HYb՟rb8 \Áчv Mx"@%(%BMglPEhrb2ÊgqpBd ճg={;T$MV:\k+Dڴ^YJ)5c-_֧㰶{<+w}ޯVW}$kJ"^t@YiVlC2>ߩ<bz|&M2qg+6Ԓ]|hUcыFgǧTP%5hn)s:L6?CLmI#0WيU* ~r>jnR~>\ 6ޭbNĶZH'LMg~wm}[ڻ]ɐLէ|Ga5y-@_Z-qϮ~jf?rԩ$X'ݖlK͝e$Z`5)v"9KD2]dx Il@Pb"߂'Wh&֧%4i_ܺ佰D=BAg,)t8rPٜ|Gd蕚ɓV6i<꡸UgSpB|קrލkY IDATC+IZwvfiE#߹Vʍ] UЀtQqH`my[Gl ʌ!֮Fhhe؍ 9uJi򺋡j#_ײ2,Shd>ҥw],@I%2ɻN >|CK8I2LMgɁ#X}M ' })U''$q 2LP=!twށ]Łϕgi)_9¼qmJB.[%,bI}qt΀=U]k<`k{nR6ƍ;r%c9Ҧ ~&<3cx._9aSFܡj;0j1i-)\~)^-n|0w"5QG%(p`)V |+'>ִ UyLÝov˗ڬA@L([K~k<ټHY6Ď~~Ffl5͊O7o*~潲` Y,Q/a_7M +]y@Nٹ.M5hfЦ }]Қި~4Dq@`\⏿6ο7MbJ^w7•,HɃ(="(ݽ'wF>A|Y DI! 4@P²BFQd/%#bLܸ ``Kt`H1x& ȒhQR+)~pvCf\& 3@45#a5^]J)5X:lH :|V?':)zX:{}uƎ3rjpܖ9bbBle(y oq9s %\5薵+Vϔ?mԙK9!{^z|xP϶ި5'듽%[:(S&tQ&%%(?%1O'"G,.RBV{so|H`C$*\;["ݱ9OuII@v"])Z~= ῟o=T*^,Y3'-/' %w<==(Û74]0|:Ӵg;r-<lѬ@:3+K(vбEMP̯UVV~ `2.٣G[uC3r62ҙ][QxR^4|L'^}S}Vdm=C[>UGYnK3*un nN.9>2l_sXRy\wM(N[ڝ~k*HHԠ#~8.==*z8Z5,hfН¼q_O>*3eZ=\_v#V(I% wiAO,X!mybfkG13D:@@)=@Ȁ86P ǎnFñpN/VzN׺2 ݢav:Woc-ښF&|~k<[!!o;Z7y7zј>B]̇9NJ-N',{^JONM} ,|~Ot´ v8w'~rauv1g*]7zIU[}DCHG:ux>_K3zG=N]Fx݉) rx=y:lւ2*DVp*׭&:Z!GJ醨G)ZMqqo:d2ּy6{Ś`V usjv]qQA_BOX#s3?O$!T#V]LQJB3UT%k\`E? =ۑI ?]uu ޱ~?Bzyɿ)!r7hٷ5g]9GйWshm S}t㚘7uT}ޚ`eV2"Dwt[`iB+%ZuEW6bN`^ϋ/@P;MS0VHlknD*5׻>zƨǑadkUbUIORT2lUHZ,ܟ[6Z_m]W\בi*-BȠId2fZ!oj2 2x\cQu 2wwwDRЬX]~g:%G6+Dka\T`gQ,FOv;/.B?(սF8N< q9X?Wҙ*GR,D!'ԡ uMP UP܎ 1†gL@6w^!u1+L}Ժ퓭=wriWf52Wԙg) tvy6 Esڔ0wfX߿{\O^.-+^:z1Qd].< _p[q=uriɳ+)=ZU^!|.BCs[ݥr M8CC?'/7=1 !:g5-94K}rn}? >xsw4^[/mѺؖvlV-yv݁h`澹!=>!]~E7"=?x0fWwksB:}3 +޼eL4gKeEٞç/[Ż zK `],(VM;:8~g ;,B[,3NAnrB)78rAϾʴë^RqgO˥S1QXoG4{0qVbaCS.%)۽>ʳgMUѻiҹE9;!]1ٍ?!ʿ}Z+ciZ U(섩$ܧ΄s_9?9)ֺz-fz[EN~2W!yv6yU:1:ה +T=LWU}x|)f$(qK 96?Xe%)A#3sUΏVv;^,(?bտ]Q\t鈂TUңN_^{1U M^׬}cpn4J^zGu}^tا}+Lu}>1ĉ:61OՔ d[.VO.?:8lr̸B/#␏&G-3ɛXsd^x_{ 7;y[t!Mn[%tdoQnvycͫ2~>cǾg*:ұ^Cgm'ףtb/1䯺w{q͹-ގ>nN3ޓW (M8xe=|GϠ  ‚|V0 @&EԊ>x/^+ AZ׎~gy2M;9Lͱ:kA1]6Vu}Äɻ}w?./Wg ҋ >}nA6_:6 ?]y/`jo{f2mZ]WR7p'yВ~`ιm*<@LfFzD" b%$\Ax !$pr2c.ɤj]lăw\o5XdP[Y5'a dd[Hd KE v & !mq֦kC"㶡 ]u陵o?@=jBbg lMB$f3 }j8NݎLծߌec+qq MёQ?POg1;PBVΦX{~6ܦkΡ z61fpa$\ BX3RN+.A׮vt:;OUwĤZ.uϦ{΍prxIJ1,]EJmHNi4&k*d ՃSe^}T\C@Tu&kkٕ[6~`4w+?{8? ˼._#:.wc| >Htiq=UI t\:ykZfbrvSUլ+deE>#ҰY*c\*oF☡bٰy>qm #!ֺZ ې~L.O =Mwhx9 SܙkLc(nֆ -2$J  ^VގݩkR8Oz*˃:?4Bps13FT*iӦQ62!5j Ah H!FҨ-]U.(h1ޣ wUY&;([;z8`IY ]Sk6KeKk<ԫ+TߎECK[?v_UЩO< nu3TeƺUؾ&}C]?߈&I?t]54qĜv^k'w!s\4ЎƓaNFmL+^N|ocwFSKZziWͺXZw_MN['#f{Low΅隚PmΧ[7.+U")Яܳ}7;?aasoT.~:6fkqLs>8ueg՘N2Uي hfqL ]?S/`8]퉊nYv&(]G955`vwwpyM~`veǛ-Us~qJm@;^QZWexI v)bz>E A.%ib|-  r`Q,XX F%\l#ɑbJLP}RXhX0'Mճ˻[!+5im +$Fٶ MX0'=Qy[ݿ{1f~Wxb틷X0(̉.`;3H۬ċbU?LՅ8ǩ[ȂCScXָ(`jL\_z5 x,Hog:iT}E▙|mvg,7,:@irw~Jwg8<2ӝT&G=|3n4<^er+0.>He G}Pe IDAT F]x)A0MX'2Efc?9WHx4᪄wRbwDV'o6bЖ^X9s+:Vݯi.15 G +Mٛ%dIfWoOD!ddI\GV]mљS6򳥐qmKDڢ믱oD0c1/:2>ɡXw đ|L45^:?Z; tc^̪Ҝ z/̲)Q\[bUUz%R^ % 6~at[Ta<[OSΨ)oF"̊/j|I ZU?idM/[=̰gBNB:bd HtD'aF2h+'o8ɑ~4*z.uXm3XM*,Jy' ͱPp!nHO DiVjdƭ,j*ۓِ\"5)νCT'PvĚ C|~Kk s2T=be=ׂrx}쩒kղ*=ggӐ*EkAz-#ʟPF cVP%Wc^&65ږ7Bfx2M"߻x}t'>TE'>gӥB`mN68cJB4闓Q3|lq} jNAB׸MJ3ۂ~f(,Gi̬d2AQ@SWCxve_Jה{{LKKDj[,|!ecQ z@[JmX)F6qg+&Hb1`X W;t8^=BA  brzսS!'EeU Kb1bI֡2ui{,; O7ѹmX yvW&4?/8g<4r`I #bX̺X03b@. KX0(, bL~V__m,Eg!M8osVɵ,ǝGUf:ߝDZL29Rlh\5Yah SKݹStZSa+hbzy̞6]]:7o? wUfi{K&(-84&uykrfOnDjOpXȲSJsΔ?/Af@H[[XHTڈwKE7S !Ŋ'7"DvH "04U. 5k< Bso0g !{O5YJ[u집=z˲TvlOgCrH*:QٞCٝRk0 !Ԃ ',<sV1"0ҏ^B6d?xA fE8}J Vk}'[xsU&NjcO4]SU<{>Ty6/:]\+J JN„1g(ڒ1KӇN[^]^zmқV!3<&K]zR B:y΍G* "mR!a0h$K< wg銯H*6\d81(<'/:5d?xA fePf- ˫gЗ_?N+z-(W4&t*M4u>xpX;:o 9yUmgq:iv|I}S&O= β>`Ҁ8Md4[mkZ﩮pP5љ{GLx=jWvedzxMIǴ4HDod,$ațnr[T4۰ğS.l/^B.^IG!L6B͔eI$X`0X,VBD8|OPB''%\^u~|A aA}>AwiŊc߉Yan(,Ŭ%Y=k+XAm6>E綍be\^F؅H_\АV<@K\dǗK4S㜁-ۅ.f[u[zr`I #bX̺X03b@. KX0(,kU&G*ZXx)Ԓ]cvMy\l8/Dh |l[}2 /X0;vErZbkuX\'щr}+ٞxB߰ - r`Y61vɑbpȮv bC !-A*[fz9l\ͤNC⊴!49;|Y%ƻpwWYuGen݆b۸"Ei)MQ,ʟKf^\"moɤƤ.Mșymoa!Qi#-W݈oO1 :3:to$ ~:ju;zpUBrl;cI)[SLW Y5zJiyٙ5%TȌc,'\)B6jɍ]#B?;!Z;mō=岢ă fF$Ye7֭+|M4b<—3I[+*M^=}@':@i Z2V$QWWC8\knl؋Y"S7\^s l)dksR0=?'b)dGvg>hDef*4wL^^~Q߾Fk=\5F1 ɺ#)fUZDiǪL#aN"$ #HZpyey2+r\aq"!a #0t&> C1 m}BSQ,I¥}a\L֓3k#_\Fiܪ.R1:pL箩lONi qCEju;4KIwc|lH.UE5!ꯃ={+8G9wZw @ bhnųO>}lz;g ZP.V/=U1g(k[޴ ɬU|\(V"mR!a0h$K N„\Yz>tغ=.^t_b!<ɣMAtW$+j>r.XGN5`T >xh#Dfld:`/ܞbjd7s901:wCBH(8ځ 0VP]qȟm7Zcen݆b۸"Ecyeq1Smi q-d eۦ.y{9qQԘD鸤׌.౸BOkʫ#mXH23Ѓa\>~V__m,Eg!M8osVɵ,ǝGUVCX0?L7]4bn/~rOdzDXQoECE䑗u .= ~p!t^USc8+%SMjI7<*ˊ.##D}x!9w3ލfizOx EEoGfOl9|P,//AT輫H[2hFiyơ1C_33_ܢmᰐeY瞝)[3~^̀𷰐[+nDBTWOnD Ea6Q,> WsO!kEUޣwh}< bZYĨ|+]Tw*Bљ4'kt|fUt`hDef*4wB2z^­%BDؒ&1=#&u&!cPHvF-)<7K0kX1D^鯊^=VKƊ$~m *>e,?[ xܶJ-:{湁Nt ;3x`&y;thCH AOFRnnz^bL?~)r{?J\+BZa6 :,~„lgeS C㶌ˏ8OzF4zpqq;N>kXi;,* !Ӥ_NFL(<ۉ:O\ .^.JnaA#Zmffր2 (j|Vpī!T/S%kJ=D" }η\K+80תK{_u_VUnN4Uwv##=M"bbv q{ 89A.,Iž U憉^d\V0MQ,Xv.Aq_UQ/r <ޫӈH[gm`}B*D$ž,]/^u/qSMSt/o|6m\,X7(FA [ (, bX$#b$hf6+<L;TLۛeZ XhAYTjodPfώŅ&hŶ!OnDh*oܛii FӻtJecmi;l#$5bJB "{ߦW}0KZk ŶqygE!"uUW*>=7fM7MÔ]]x8s,8l&g{9xw#*kz5 x,DC+ٞxB߰.cXָ(`jer+0.>He G}Pj !}E▙|qv=|3n"mmy6bam@W~b]p!*t`O\?E>_\Z;mō=岢ă Efm>A!u-wo@{=BQQxbpMZxr#BdDP(i%fgTI*k>r.XGN5`Tq{2s ד5U!U|\(ָ^-Sy|6 .l^tVnSZ/9k _TvWxR-eML- "dlTH '!Ө0aau;%Wc^&n^w?wK597N}h*|~ץa-(Lj4Gbz)1| vׂٖrzJKcZ3Nc¹9ϋ]i4{GLP+T8U^]񗩒e5%D"ڒ) 2~1[/Wi^B.^Ioگ4D" JHڡ) BHX$ի/hm ;12: A X$.dXk}⼿뫾Gv9]iM]k@ Wȶ]/^u/qSXpv  aQ%u`f%\,A r`Q,Xb[-”ɑbJZ(Akσ6K? ZVsr=hD`NSjtбorP>yyGܶ1piՏgs8:Q:H%!]l!j3z5 x,gǵ*lM0M1=hera&3o;Y Xx9T~)tzִX&glgCߊg+ y$q,2W{돔!a,?ܰ+jLՇϗ#/hGi~zy̞ZKuftI(? *tU kKv<B8Ƃr% ,?0i>Nkpgj ~ZX&mqKS<8,[[Tゝke 2G"-,QG6 b>:;޳)t qit\Nͧgx 0{##cy܎OtZp,fwwZZêۈ.'>ؐFMQXjYd2 ZѧRʎL,S)&(T3Em/z_c_ 3v-^̶6SiD,3 pC5S( `Id],md5lafi1d!hF`EXaX$m.,D`I  F%\,A r`Q,XD`I,1L;>W)xq~%=R49ofj_Wx0Ǚ42׌Gʿe s_;:ۑp򊑈,e'4dAv8y</o9Wn(OYs,'%kÄ-;VPQzї'z\o M&4s+{XRk.nj1˳~Z\zLz^ 1&1}'UuK7;#'tuoێykyp<.Ww8*LDD¼3)|oo?I~zcf!$Y7,|Z.t9bqWɧVJObUzGjnd\*}_z:P+t_e&"glPysG# ;ʨyz*;?lkϳ,d%=sz%)◌Tb/caSuyC;_HuGl6UwsFo0Sv{d/=K+_nUR\^S>2{OAYWXɪRuǹ:"y\DD +c񍍗IYae,XaU6Owres<.wqiŘюO.Sf犭DS}s 8(va~+7 ܞkwG:mGs*:o6lob-!NV8_ݫzl\ۗa}{&x<۩fbNo/rMc:UeN\yf! FϪ_zg}ǯ|uOVJ#zmZ|d:gLB]αo XӮ#;84MUFh8v٘SQU{'^OFN.:qGuOUQ}5Ӵ]Vz7FdI8xڶҭS:>Q#|fH<%FW iSW?#6<($ğʜD3B?50D<8ـ؏>3#\}G/)slc[k(z(hrK\ ~sZc6o\'"㲲fsdP.C{곫S$9-#jJ:Mf-so˿c999r\V;vcJUX,&`ڒbM0^=xL{4 XOHa3w'ZC!lsSb>P?.b)Ioņ.3ԃ\,@[\lsȢ~)JP!{ jʫ旒 ;X_ycjN[}77H2e?*Jc_g6rzK޷FwmRD z!\_ ; V |x͗(ƻ}̳w6yKZ?cCSǬ.:1ZR<Vu5zW0b0үg⢉y༟n`\ѕ< ?9&LV6^kklDʇ{mͺ5^~(ӄ;AnՂ5nYpYy_ti3Y5dùH8yHDDvov ƉG;ȼHd}㷜+7, 9wrR5 nXAE/F_Jq} M&4s+{XRk.nj1˳~Z\zLz^ 1&1}'UF{ vT.ͥq9{]i<0LʡAOg#YbVՐ3Dk-hb"r곾^bKey/ ׈!}nl/Szt{/>5Q:֕ys4.gϣY1KVC.ALDDRY=/9Wd LmVxWz%FoZ?] 6zj\,o1WwFJ2 FN Idka%wh-*^௑)E{koJKyCwJ$f'ڕi乢IKOEDDƌVqP>k~qJd=7 b7ё| X IvChIDATg-XAm+8S@ςXaǼWaFK['QfG{9Cڰy aӍ[`\ΞG'>|fFFs%#5s6ό='6Ȍ.'^751f9u"8.++{Azl6'J"=>?E2czzzDDXE~Vu~~>N=xϲޫeqxGku{0ϼǸ-+{Mew_7O̽-efDFFrZ}#T*UbhKZe]`z^hb}Pq6iUf3"5ܓyf?;#-ˇah+ aN_O@׻7էĆ&w&w{s`oo4Vna}72^7ta! ;Cgx7ҪIێQOԱmʭ"iNG,D\LcvC(ME/;|BYgJSo?D?Dn"D[ꩰ:WoκqBo- u6ǑbVRVUKvb3L_N~GgU~} b$с(AD!2eÝ}zVo9HM%{O m\,GZҮ1fL`OβjdCMr7hVw:k,)tVTc=[]4k;'b I*_e'ߙ`Z> 5UvQRNZ/?šQZwgmXJƆ,3Ys7lY]tbRJ yG' %78pk^lY& axaa_E V{| y?[ǍTՁf $C"ŌD">u;Ao&5z9L]o_aBՕF_Sviœ%Giq|j/ x7\iA_E|b<_J ֊4]T(tt&h\ Ȃ+_\Ks'ɲGdùH8yHDDvov ƉG;ȼau>/o9Wn(OYs,ꖬ nXAE/F_Jq=3^4VLXp^bԼ׹w<{엩ť~xQΤW".cG~kQES&"/0Μ p>騾,wY,;6^ʤ0)!,.񯟪U'tuoێct+nHv^Jj=8_( ZN(ɨyeTP=\d9TB&Ob]@'ߣPxr@ AȵOT+,-ȣR.Vr?K;6>Rs#=`UtV,<&\~LDdؚF FvXc+QQ& bUv\sc_u <;hΒJV?hL7W"*~H%+[16U7㪙̉T],~v`SZ%q7=[?hadM:eHBǾ9rD/u_8:H\ߔV尟.ӆPVVvu` [(z҈W)qɻn>z_-YwJ,DRޮ&ђl;oo^tXbe: ˭y3Eωuz[)$:!kt5!C3hC$Dİb'" ,ZS=N띛rt!Cg6*r &ZcoF(WKkbէUfot:][Vꯔ1>}R.|kјW_ o[0=2JM;h'f=FN4;~l}IuDZN" w>)p8Miﶁ[#h kdӑ>J"[yoFeёbrO[uO ̮b˜ԗ}ԔVSE;3p׾6]}~R7_)c8NU*aoZ9GR"\mU~Vrdhڞ>VՐ3Dk-h(0D g}6([-1޷w_;g=Ffܪ>7ۗ)w=uj:"7QKvy8 ѷ/>[f V(2F~%""*tiV! .b69xlXy"z~8˕6K 0OhSJ.x;K#%S^ENRqPYQW0wÒ\;}/Hɔwh7<;%Q3V4\'e͊"""cFuyKO+̎V:g>k~qJd=7 b7ё| X Ivg-XAm+8S@ςXaǼWaFK[NOG͎rOi-6\aK҇_SH'Ec""q(D=݇ZivO*HRB &??ݷsQzO}z7И57-UJ#zmZ|d:gLB.;桘5:Sm/lZ(7jFѵܜ ^N8z6rwщ;?g[i.+wv$Wa1Ƌ۳P%b9w؞T>&S+'b­թi֏6A/ңR|'gbfsDq\VVzlNE<>{pO}vu$geDM]s&b}zq'; 3{՘#,G {P?.b)Iw19!@3aU(hdQ %xq퐽y"|t=RB.-A `(-X;Dm rvbb%!pݩ g X;D#D[0Ycͅ\,pO̔)dΒPf~v%a%X `(-A.Q,@[\,X7 [f;,l&bGT'ˉә4ul{ 5Tn#`;D~>^ḯ+ C Ж  `(-A.Q,k qq2)5qvk|}FT*eI\nm Fϯ)FP0,k0bB܉8R!ɚR`e2y!X mXh{Sl6۵eYa<8@&MHF=.oږn(SsRS/f>+)rL!J8ϛL#G9U(So\7P|=C$C g6T"15ASccS~bZ]N &M)2Ux^*<(xmI+T*8Պձp/1G/{'O^׿EfQ,@To'd2˫~ؚ!{aXixëF*//L{+V( W(JJJ-[j%$=`~x'"d2o2fDIJ<˰ @wXcԩr +Vt.Q,@3߸EW|rIz1a+u~lQi00>,sÆ #"BY+*JHd2yss~IA)g&F*m]nOAdE1r9/M[6U]YVAalb)CAGhk/̡[_{eVa^I^um ~&0, W Gݓk;gSg1@D8&0"/~o_F4p!:Ⴜ/I16Q`yGwwq6tcRQ&H')Z)T<}#v}AA /'K)Es#H+[g82L&( $sqƿK;y \w`[_AD~$֭[f޽Y3R~ݺu2g>粻1?m&0\<<=֥4X8$71 L`+2\u`G //6~QZ**'  ($+mE8JOeɍ@`m^AƭǗb IT" RpoDZA)30# J#: 0# J#: 0# J#: 0# J#: 0# J@D=EAfتQws?*<*LAΜ#: L͎9"y H. c~ R~+? HQgD" HSȀ9A׺# J#: 0#2OT*JZn/ɂAr R"e~}Vmm 48YzxQ\RMLL,3}3w`X`8AeAS=uYv*u΢X'aOۄb´ݤ٬ȗ6cN<&WUU/F|f R,ک_/s\o.J:RpyCbu̻ 'fuJōOiѝ.|" RR^1-Y[*P++20p[6A)OD/>K<5;3m3)7)Q,Ms{ho'&&r݃_ @GvPW4뤋T**yimTuSJUХ,I[GSxmmR#z bADmz B::;G?=f^6GO[-{ľ5g;,*xڟ6ŗ7ֽfG uAH]ewr08K@V7ץҥqYJ]sa7_r}tAJihϡ7A^VU y>xxM(洢,G%Dq"FdhTm"ic?j_ s?< ] 4#]u-Euy"q1NԢ P3܁S ps:9EKx=K-z<{%KNNN@<izi-$.62yGuC ;6Zͻ͞a0 cJ s]T%Eu[uT%۪ ^ C'Ǥ]"R'i6agJfmI&clɫ4-J-fK**%Fd"R*/ Dwg7/{?Ō蹮/yB\o[^6YY~Rn(!!eTf׫"W"p"W"զj–=Qgю?u ;axusB4m7]Al3>-FKf*ciXX՛ADŋ|\)8#sZzx/;=pZ4gNAQ$uר5l6WΜ# ȣ  +GGAAd%PZ}t# (>:Ad~`AAVz ̛d٬)x(uY/ k̕;9{{z'L/=#ݱ[1&u[m=3_LMm ٫ո͘NYAε ¶NhlIzdv@n\wje?p;H&E&JZ!r%ݢ_?g /UFѦIХPݫux3k1[%FBdd~GuŲ&J31d ~6Uǿ͞l,Em)AKQwA9Qfk{iZ*ZY};ۇt[uP nKe2rvRoh56{ETD>_hr1DcQVUI;t$(D띢]Te8 l%mܸ>IY*pf&r{ 4G DV*o=cbb4M++ƿK$2N9tMm㠃d^RRVȗ]ђ\]3Z2^:+jSuf:SЗ` +٬ajԀB 2yf t07V}@V K3 <(>zWnюeIRzƍ_ȴ=ޤkV34Za5\EDV#nRX$djWXK">&enĦLghOn{N̖IҦM9mBXH+pXmz 3Rr%FE _]޸idL&cz7n垦{mM4mHf'&&i%%1[uL\%^R(\o&Cnb?/N^]H$Llܴt?ӹ Bxr9m<.~ yPk&sI@-(/Ky(p1b5.zˢDe]Xl.. J}9UG+==CZ )_؈i<Ŏ9m&zK s2 /sFz憴D oܴ㑏'&&xaW{5G>NVTu}޽{Dx\}3}>o?߽{W>H4z%tH-nL&9CڙC䶃B R^6V*^Gq!b{)+2bDt\kaǝ7h~TT8Yذ9=MQTq[/V+<YZ7+ccRayRGaJP=LeRԪU2 UIr|@%PSRivhaY_fLR!9C33^].¯ +6-Z~4PtWw 'u;5:g4?8>GL&׬Ys=x<|BȧfWG XwF³sT_?;48L&ǥ\PxעOꩫ_\mqTjտ^3)ȥ,S.} e9Y*H^emfc$kZe6sz*野\\zm6w XNiV^N( zQg*JzKr!J wi1V(͵ $\ozߤRd0gVQa5/טTg6+hh5w6Fn!38ܱn:k3Mp?tS(K׻]_VY3u;Gv:zZXd2Yp,hci;Vj ^Y}4f͚5\2"|6?:Iq}&jmf-sVQ3nC ʣ;: 2ncޞ ˦!rϠHwVLIVeE?'ҨM&z- mt:MB m-zO<=p!>VLheEZl+eZ8ZxuXA܎?:dQmhj\hh4d䐅~A)Σp8<>>.ɼgͶWjnn= PMM3nWz/IZY4G$;6ZSg# }?-H땢&'̷L"P>t|Q*coA6c)]ZheFcц= "-Z{`:vu::'GE~v)PRngGgA/>IN7V]0#CYS>6)y\H$hͭrm:n.v+FӴbbqa$RuK;eSx{HT~kzWnю5NxRIƍǿr IDATzEkVWVfi0k~cy6Q:QǔJ7DE{={RQg4X,c*v-:FȳOB">6#=zHh#b l{mP M{٭mm<,P8fpmĝ@AA)N[f&J::jwY;97bm1'eVHHZT*z=TJYcmNO<6MMVqȔ|.ChVҊbl ȲPfϣ Ua矝RE#?.1'qM$<3:rnd͚5 \uV]zސ{~Cu|H}!DTl>* !, V*,Arb+_]YiٮUn'L0 a䏩籑0>ݦǿK\Han}I&S ws~|d,«%.Z $?Kp)ؖdzm G-ھ}`]mOΣNw;en3*JYj,;f_ּaM:OY=-u]Kf#:h8TRz%C1;B9s0~~\pTϙD~\b$cjv"z+n63-KDnV,mo4ҴjSYDbMI:N N׽9c6vʐ#+ŋxOxJPz}v["xޛycvh ĿK) GB'0 akَ~<A4viyݛn0|f̥ |Ǭ;:fK3Nri~WAG2[im4j7)d%l?&zr*@^Zo\$k D"ݦ29xy\![+ĥ)D¾ތ׾ 0nk hmp v$nL[P&:ʈ߂H$d25AM)s=Wud}.(-Jzlom4ҏKB$5]gF:Pd=̝׌@kfV"7Z;T;l7ZvLL!]pUu wJE}"pAR蹎_1fΦy mٷ+'ָLNk.Cl&BJK0U?A}r2L뮳٘Ⱥ:p.k'y<"d2vAFǙ B߶+TH(ytAArQNkA)'EʕY\.>V|4x d_Hk.Ϝ\s)JKT`A҅ ;G? p,5%^3''Kj˗ _([}kkqonjیZ)شJ]PwڋkAxQ'q'۪gYOu K\;e=e`_l~.999N8tut/CPZ4p>n'!"*[- CCd8u%JG萬O\ܺ/v w @<*)K0Ao*)3a4MEA Ny}=pf=j+m *w7';c[,_g~1 9!ݼ[ϸSӴ4o$%cqqV#.X^Y4hbXTZ Ä?R__weFljjt =G{SW mdoOioc\.OA4)-zOF'TT'u;f"H ȅ9}m-h6?]rIRbKUa>zjN"wrܴٝ)=G.k%tɼl'Y- #c7G/vν {:;ɝ`[GgؓL&=LBSR QkniN\\0 8ɤbbg HiW::Wk8Ӻ9TVINylm'U;pz<TMU-k֭!rwQܧܞA:Ͼ;[zkn9'yJ%gS"uk֬qprs#Yȵ*" o_w2 sQ=QkH?AƢjwQ_2AG>Kl>mܲ2ykl=99c_nZh=٫ݢy}'9K_wp*Y,%#48ps.eC{? %w DhԚh졟yͶ @ǂl1v5͍/{W} /(>?cB(yEŠ7.yAo(MAeI2nV aN;.5 2W>: ,sG/n7  /. ,"s"#yW: :Rk zģӵ]1`Aҥ@9/QDKVZ]J%UIݞ%,f8Jo%b&fdA9 “"B<ZCUR:]y1j.8{ΣNT;oХ?._Z`Aҥ@9/QDKVZMJGsuֱ5֔JFw$WIQ 1ajoI&T%{ܓE/ ON"C `aa^O P+ibrcvc\qB'O(/.WJ\L|3148d?`\ HBDK\Zr]\>k]ђC\ӄn ǂ OVK:`  tB\^E0 ף_ {^BYd(nwvboc@5XxUyʐk~WWתue=rE bqno NQ&AG7Zmmx(yWd*n,D$QNiN~đ ^-٬?\ ;|[.(e"pm{mLbP*F`qD7L~z+HR0 S.bc0ʑGia2gupHZ2s#[- Cŵ 8y }EKVZUTs#ՒWEr}+(KCĬlMj\Qk7>1Y"JGI[4M!օq &5R ZZE<YS˕#ezմdf =d6UE(r}<43,<h,ڰ!UDE|LΣNQg󨓢[*uّZF6dkHQ2xz`JJA{^Y< {fQSXe:">dWwED>DDM]bbo.ff)kҔe'IIXd A9iݧaթ_P{tiRzed3L*+ qAYِsٜsIB(>z!X-'Uףmՙv"_Exmحgcc9vHYmVnŖJ6;gn1*̣bLDAGE)>:;f']ۂcA6h!R3Kǜ5ॠuoε ȣ u/= zCBWMNNDdcg85KBd.fKòZaN;+5, PXC.KRۛJ^JH>&4S#icz:,[ݶ/WCG+)l{Oh],fMyO c%m,6M]Xl⛉{%'}[PܻwOVNLf":;ۓ%f]jv07gƐn0LfYvxv\9,Ld~q_v3ޢ`(2Wk)}D%\3[q_g@LTQM3%Ƴ&g$ KlV5H}W߱>rTڥRiv[@S3=c>Jn߱>Ǜ1g*6fԛy·iD"-Z3Sm󷠋#R%F?en3xw7$DDՄCDxք `^gJM՚My %$ V茐iODQHd۠(ۊ OTVj]~s'څg9aWgeYFo; d~F1Fo_p{F~6w3E:RYzP{ )qی|©%׊YAyd ^ .c8/o?M./u[uT%EӴMLbD6fpg4색M\.OI AH$yΪt #/:>\ό-B) Ǹ'pl ^ 4qGyyx=ݝ$uڝs#<$Igm?`O&\ "U/UN`\50 -}fv'a)Lslb?`ⷘC$Iz Hɳx2\<$|B'Ik(Kg?hlb?o1->d6ާng~NZga"p{-f/HRFz-M"Jo8 RthC3ײq1v+ƾ x*39jZv[l-6snˎ0j>bVY*zR%Q`n1mBAguD- uHL&?4ǿ %#&&< HI wkvƢ4d&&&Z^oO^1e2kE[^\])<<DO4eke2b CsT@yMLOi/V~~g~ߔYe^eG/"‘kˠ7,fcN[mr crrҠ7,v+#K.ݳ#CCQ-Wj`A%٬bK3&jad(FSM8,XIqD FPDDi$xuOȎc r/ȼJ ^CdvP{mYv11dNks Đ >:   +# J=hfw8OivYbf4Mhjb< 8ʜq{^DmQfVrӾ"R jlve+:D"QT2 P dפ9{Vn3R4ZFΎC#gG,\rϠdI~lnj zx}h.cXtu[uwo:yIEH2N@QT.Z~J۸q*!}^;#n2OA gQdeᛕq+Rzea_^00484& f ЬFxMӊ/H$J2O+*c:ͯ4;kq{ +'^6Uw]pv;IfSF);/3Sso]`+xܲ{̽r2p1 l AgУQkJJձsdqË7ФDzΣN"yI~juKTRT)$bBSwrZxܠ7PAo Ê=}D-ҹy\'\Ryԙg[}8g0 dj+J땅0l~.''Е{޽{0L_Y"W"d+kV3!(oL$]̗' e >|4ڤRiަ?ٜ6h!,P8Tm6l C>\.OI )P8 4[~XVb<6&%T܇#$GUbgm&FBCPCeK2*x<C!k\x&Z?Z@d6ި{:QδäެﰗU&6כg J/4*mح &π'p!@<Þ6eb3כsVQ3Y-YfJ䫈IpŘ A恽nkLguv@B7f]n18nFQZB^A<.G!F+hﰷNnLbbh: .֬[P2XrjB7b3+>&J}g=Gvu?.'SQ&k+tD/"*! ُ//8Mӎ70=!cNJfG Q`?~{:p"e/:kQVEQ:.zmfwU pDzUq S+DNMT@ݳ\ze'CYWQ""L eȞ?0 h\煟+r@ʲvwtvoAO}'2S?ɤYpqu/ǧ~Qlk z{2S#,)g;s?CdP}bYT|ϙ9<6U27YrQ2\oPY.vݾs;O[M*`kuqR)qi0PMOGxqDWY G璾H$Jѣ6AoJ?.wfH 4{DMRԺ>48۪Jm uwtÞvx`V\ﻸh,Jt[uwɭ$(Mt⩮g!Ŀ'3*!gV-`ʩ A.aiկ^/bT uELrvSwg7s7rmx:GXu)>zWv CCD" D"٬D"A+ܾ}[}ۢ*bUƮ#/՛fXw+r%!r%Rm:k=p1Ύk6k~6Z-M-2yfj+fJ<2VnR. Ȭ_[wV-¬`ʩ ߄. t~~sªUU35zkncrmu]r JiQqŠe]›<9i@&5k֐2iu?8۪T*zR%H|tlP7(u-IRgгgbBEJj)vd עOꩫ_\%Q9JV۪tC.P8f1%4 i) K{m)y9{IL.^~P{muیD"Ý%x1+yּɤR]] {#0 = =G{@yMT^*o#z"R5.j=Qvs:@"jlȦUtM©ġ:Pکz8H&|TS٧ ](J[ [dG ~wƱ^E=yڳ3fκ ΛO#Ir807DVgβoMϛ|, l64mNlsfl>4'[#4Ҿ}qpJԫ kTcb>H/?hs8WTR ] ga-.j?&^F"F4oiN&z>N74<4L$Bۛo޸YH h{h/ZjQMzk5u774@0ﶿiȨrط٩6*;mM lR|`f:Z:-7hf-<PEVm1s -+U>mu9eyu*M4okn6.IBQTM L5k4-V>>&Q!vD׬p7rM9xzsq<ŠT*{frS ΀KRȱGqaT^BSad1h0N+2Kq!NrS襅pZ3K"j)a <:yTԊq6zzTR-2=,KGr! ^|U ]az,e{DE5(@E0 7C'L B/,2>:ԃ<5aPHp6bTQC*4Mc50sH ȓ;i $ݐF>4yClr՘G :?wٕ'V]lmxaxhu "T׊,ncxH  v=e2Lj,N9^u4o: jT#ȥdNI9 uu 9)^G:.5Q,V簇X6]YĢ@~{}BЮ֊~t   FTTXClAF ܹ{']P5~1F!IұQB]#>\,o5~>t>u O6xx @O!7QSKV¼ٌjP_)֦d| `D]? 3giyxF:Lx4h6>*Zc2Ԩ5 *nkG 3·]B[o^(z9jZ܇k񮷺&OxzsO2w2]{kNYNT1L~.D"am??܍vv|yukKgag/|v} &ׇ/ُn߾-H~z9=2̟-;[cÓ _LeYM⩟RBw!d:m<,2#}z6 =I{Z#̩S(S9,p$l1[/ZÑ0!J1FܯT.fs2)ssbYH$\Ap`x1;v::l6ش\ju,"߀hC6g6;C(p"`h[pZP*0dufOvAB;Z7魍yDͅ56oivqi7~HK1o6oٷ@p  :(}jZvS M '>=୲/Ѻ A[7m`#u(Qt"Q+yʡ|rvKF}{ܥy[sPgR䩎[}}=-T8-xtj7'4k4[6ܼs#eYXV}oc ] 9H>\ '0b2-RLk"5q-U9`9;›**=6h0N+2\>`\e Q=_UԂDn)TԉuY< ̲4[D-^>ƏDj4s%E'R` I4Z uD ok4!7ȂJqBMU6+N W48d݋JZX-v:"I2Oi6;<;R_G`|ebEoR`LRjY8_;̝fFt!&H'jJhWJT٬84\'cÁaܸPm_[*"jD">s,2+Buq[_ifc74[$JCo_\ }Bf5j`ixd$KrT I-F {N#ݙsM/7M|2Q\'!gϕl4HIU@vo&5k~ 괏iٙOZviS{(y+>X|,{7+U*3䐿XWQ3R&,fag4jȩ#}V}}GPf9y$p)9[XGr3<4}LKt2ԭ>*hDhD"am??񼻐P9֭۷F/G]X-Cx[]'<.uu;.5VT1ÑkB;2[_n,Aa\ւMG1zvh}xhŏkӎ=;jyq@I߲R}kT*%iJ Tʈ기1 IDAT)jbGt w==MxzA1G.ZyqSԱ.{*"R1p?#%x#8&j*H8F5hܨ2rquvwaQj+B@50O@K}".bW`8W e%'N %G1QS>jH&H\<5MERY_mɃLٷ^7>m}Gt|X<Ɓ7/L\((_ !xFfQ襅PEYE"j)a(py ăiLJS]#.Lx^kz1-8ohB{~Vw9Jʅ\IV\)_2a%G=Gt.>:,Gpu,멟R {J%a7%-K>: ! O_M\qϛQ>JxݺX}>:h4l >g8h47]h!Dy{3$WۛnPPW#j].8բYaM\Jܟ?.]7 7cB "?%"Ǹ6qp[y!fCC%_TtxlHs^Pn1/abWct񪣠,Z?L+kE'8f2p; ёQ^j/T8VԖ,c#' Q6,V簇p;GY"%s;#Is$^Q T%7 2X$9zzMI P{(F@#b7̮.$\/x~1zzTJ Gc?3,j M L #dǺL=D9H D"!-S&ERXFzD5~n\TR}>:3 BZ<5<4l4Q R=)H*odRR~5<4ߤG5HI?<4ӻa}ㆤcxAI::؅=G<"}=ACnQ&%q+alF5(8fZ܀GTN}7n3/"nN{ejѭӍ2. +iZ =Mhgt"==z!tah#e)XNV+^, J)!Jk61$1QrNp q4_nNc2LzL2p$vZ;jFxCϸ>0>)"z-:0R[__:6V/D5l6љΰ_Nn:0dR^=RFx?qoT=2=g^7o?goĹ(VbBvrM·}s[BQ2l]ou &rY̝LDj_ #TJY"kI$?Αvv|yk:5Q1>D|:n:΢?dpOFn37B\WX{^ ݙ~Jl~e͉ בch0^]oz4<2L< daؙLF!l|e$[7 aKga/|vD˛ͮ__f?}#?b[R?䈃䑛BvhcK{[;bfЧb1=o Y?7=o‰nA)dY4|'|GHͻ0 355ZV{O'>leR0""(0̙3k׮fzzV²W+d2/̧@W+2_\Rx*eV.ZɰoM0֗/Ym؀`e~ay OҰa)۷oW V T ֗@Οe+!\/[0K0  ;^y!J+0LVBP(ԔX3~OM,Bl3zz{ЯslZukǮlǟ#zR[a:^@uO+0mڔJR靫62=oof# Z:Z[YFr(Jv5Kx|tzzؙnOMWxu ukBsùaAa]-W&o6=oB ó[z2 ߇ @Ȋ {ZS o݆y+_`J#z֚`}v,O ]`BBhc #zO ~ 蕸?3PLRm k'yT 6þێɓBBCܪf;nuSZdw*T*{6.H *9f!| SHĹn([1N %!Kqh;bNY|LN,= 04,>:)v<:@EQ?GOT*n\>,1ߤѶ}Dxs>:LDلdbeB2)/QCȏm4aYI#"G$P0e>:KID 1i2Q2tƗF+xn@Fs%:JdߪCIϤdIi|+(OLAGNjju ֖-ѯ]vOoNLLʈD"8%߫Y:ؕJ||]333 ΀a܇RU,qϮ g+ɹ֋\~3dvԩd1l4ddBٙBOYA$^ ɯ&SX7 7S锫xaybd=}{eZbbnwp$UN|2?H^ H8V.2?RYbA!j#*kH»fjn>B]-ru.L\FR}N&ǴAC[[*kA$Ia}Ê~X T5c" Jѥٸsg>:n3 L&uuX\a;nULk^mV'M: on&^Zfdz+U84â[N0BHT14oJJ\@#(h#ȱocU^.ǚ ~ݼٜLJ0=z-ED!h#k1$Cl6[k2swfff&JoTJµV.Lϛ|, l64mNls\N, 6r2/[ϓR)꼛c(ZRϣ+27| ByK爧@; h___]jlتUȇ@ pu&UufFպ^s9_u Sv̛qm087A afڨ-TWo  ^Q3obj~M0n}ni:)%+X?I0߀8\ ϋv$ ] 5 e pc,FY!NFw`(+E_`8W:zia,P@x`(+*utT26 ,3yU >:Mhˌ/ 2GҩN`9QV$u P` K|tJiR!|,Pq,4)Cr/f˛)>MVS]H O?7};uTھ`%)#BDo֗~f`W*!v$~L(V+LGKwrKղP?]vg {0۷jDșOnlnv\fQ"puD1#I28fm-3wgfffRT` ?o>C>j:s}kz{߇fogkYlsz}^g3eY80l4̳/Ҿ}q{g3JWT J%7޼s~xNom֯/hn.v56vvlժUCd ~~KFj]: Ӽgs "x*880mvjN& 4V୲/Ѻ W+uUN{Gzwmso47"Dv(/qj?E7mb5k4{^3ׁQGʲ"U޼  ] 98D?!]ѰO  0"$H4oo&WJy{sV!dos#-vDg$KNZLIOAG!uEP>:+:x_<5Pn1/abWct񪣠,Z?L+k!yΎ/BHxM GŠZE1"c#Nʚ(sxzcp$\֪_1R_*o/ѹܝQ(ZO]aj/H*odRR~쪪TPjOr:CAJ%5g6ٷx 7CC]\oB# j?38}XbjIJ7Q J+yxN"l2O$)1"˖I@uq^BKga'̟1>3<4}LKdzdR^Z{njbdnҬ{B״1O"K|~ݜ[.^Z!wZ뭮ޜn.s'尷&UJY@0E֒H$G?ҮN/ 𨫫﫫oж?l/mV}FžhC:Xlf9N7麺ďT:e6 T ,/K}t,.pCfׇ/ُn߾-V?O$gFΤ~J$IE1d\Io3L BH_;TCHlg$b?bj G5 k**crLmN@V1T7qPٲk}flD"HɆХP$1ocܟP%1o6'CKϡ{=t>fQ"puϽ1#I28fm-3wgfffrp&"Rٟ[&>4|>[ "g:ۜl.͢aa}, R)j ON~9ɕu@OuuDv&6Z̼lȥHKafX2*G_Juo9i?Nz(-ʂ",A{qrJ@ڂX>'(սLu`9{ e 7FUՔJ|#rDfr%I$7'n%A`rJrB9 0 :,utb\Dٲ#nG5і)Bȼx+]dR}{-/XӷV*-V U}F2ocWcI;sotZV\ `ˎnK‘Vk"8`u1#ȥdNHNt IDATI9IJ333D`e2 /q!磧)L&U*?gYewNc;>aWX~E4!4x|pǏ{̫hHtu~$%95h<%K D ߤurBXMB j?3 ܇\7?!@D]?&yXomQmyBV{ǛyFZ=$M Brˆ·I*X\dzdR) S#Kmݾ5z9jqrǯŻ8?-2w2]{kvGT1XuډէPeR1ZܟH$ΌI;)9.}^zmtެ;BcHTо+L&ɕ$@ygdtmxal6Yoti:Edz?^4-FPx&u,;NP{($[FɥOB**cRf@TصI`6խ׵lk;333TVJzKsi4ٱm-juk<$Չvtul)O`Oo;;O7Ymh9ۜ^fs;C(p"`hg$JWeM%ymŮΎZ| ׯ^oK'tMƮ7d!$ϙ5kTx͛q5xMzkn+ZAt~ޑS#-#'Gx+! 'M+rط٩6eGK;{NA+IpHFA[7[e#P4<1Y`@!VXÜ,+ ^JCj`)Wxn,㟌ߪ,8:+ș|t(ǯ<4șE/f*{QytDB]]]]]ݒU>:v,_A|t(1Q|iDfr%I$7'n%xA`rJrb utX!DO6ahhCu:ؘ9<K™!:~/^}>Vy{ZjA/hmjl2:ϟZk? f%ƥZ::B`o_0a{ Esr GŠZEnZZe8.M>=Nѷd2R}q/"be;=_c 5<4ߤG5HI?<4[]1&=QC7CC]\oB# j?3 ܇D͜~d<@LIPz+G jutT ]͂YwF^jiBj"&o޼|NM]:_WϾݺ}krEQ>_w5q~ӛ;ӭed݆Jb2sֵAN`S1cZ-]>ʗWVYk G8FN(Vwsy׮];$+:$;TQ7I&J}6dHr.Ho/\ B5uOk{GNG"T*Ud@oYLϛBCAV{0K,T "%#O?uѽ)J#I28fm-3wgfffJJ8Bnt.M[F?;;ֲMr]۽s$Eɝw+XJVgβoMϛ|, l64mNlsfl>4'\y6SzZ~1#̖ȩb"qE H8Ks 7@U۠][j_ߤʏuO茛]otLggB$I3k֨Q?n{ۛ-;ɹ1o6` 8qnXAOþNQ-;ZکGNߠNσA[7[j?Epn+$I{ FzuCa±A$~i&===j{Ɇ«o8?MF!#+%bLύ3 5'?AXfKuuu6V|!ahq*ց.hM8G®+Q`4@~l613#gȕPB旲#û 83vFNWM$y+U,={5 -83v~}o-3˘Mf.{Ӗ& ɯ&y}CNKa^qaZ%>n`k3vՉ?};ͯ>eCYwYnnz$Bj.۽ǼgJ\Gd7%ĹbK0˞-!tw^12L0Ƶv񋋡BM~5) F5Cw{l|Sv^FI`]­9GNKK'j<] FaFNcJaZek% 7CaaF0hYۭbhw6H*Žs'[s\|'|&x?aAȬ{^e2qNb tM:YcN u?裎W'tO踟?+ɠ^Z)6{*#.֜ÂY//=WW ϕkut SQ;dkjlr+y9G&# \ytf?7^] >:,G'J\I6ooNJ *[JzӅfs qut*=-&$yx bRm7B2FF#X1ybzxUFCF[T~#Gkh7.]3,SG`Q*oOߞaZYX-HZ ]MF'̍YkZ'`q5&!R?L"17GFY*µuuGŠZ/Q((Ors4569)g~#G4(kx\0eOtE'IJc Ь2YlcRM95h<5l2BaV|RB ܹ{'#b%%^G-uAx*L]\oB# j?3 ܇D gnd<K6/e}taVkQAGQq95|Xi%K5%#_DVǪ\E4ottx+_^a#iP{(TZw䔩}7ΆJJSlȣY9lEN!t}˩[tY8J#I28fm-3wgfffJJ8=R\4~2:vve"T==x;m}n,w!V?g]q!Ir80lͭwtul)O{Þ;j]ëcxaNfOJG9GQJ8R.ur k,4^N%Npiokwq9~`2uV.G}XcV#ܜ@1U4HMx<FSl +SBtnY=;+r5iڙg`719}.ՁG!6Fo4Jj|`{ . ™%Ti+د.mwV("l=hkhݣ~ó`? &DTpp`0q99Ma3rԠ BMBX裏旝vɕ=^Yw2~?hu7w=z"f *rYG'tn?x` d!V.H%>& ii"Gur|D"Ѽ\I+ͬ/|Vy{Zj)X$U$7$ϢWap$UqHdt\aBCRN'r)299ijlrRFR?L"!)iZ&p$ĕ2>=Nѷd2R?WE@ {!"$vO*f?_|3Bwɍn9:F?*jԈce[|RTH,*?My`ok[T% b JѥcŸZFF\^QZw/x*زCDT^Ѯ&/f dzdR) hﰏ_jQtE/G-V;~-V Oon!@^qr[8ET1@uډ+u0B}ȭRZ-7$I ks !T:4±A$fDӴ~\I7XI %nqatʊf`OA8>%W2m:=mGP>zbb$IlV^ײe Bsēf?g݆݇g)Y_w7Ow[ Gñg^|<(IÁag<뤿lwgwScSS?.GQDffT*^Y#7AChnzŋ]ȕV}[/neg2}ݾ[| čYm>žPy8 ]^N|:%lK+W{BVaH/ :-hu8^qdds%=;fQvULF38䦯1-08pՇGXT*>flYfoCn-F~J1Qv_ti*v-:z?䉵jkhBC,֬BuBfjo6 t)ě{y~&`W,MV'm,P(?gLvQghGwgxZ| !֨ixU`JBHlؙ!j‚;uܤovI@O'0l4h*{zvvާ"$gM8gÀh ].!?ߺ}c#mlaˏ*˄`. th0el2O  BTnLt)Pztln߆ʐ$_ 0@ǣh!뮜e؏ DdPj !uD ao*XtٔܤܜxpWZ` TB_:tuc$ v~GjÓ 'tOB(8gE`{ֲѺG'g jmrzA iύuX,,h|f``r%)ܼj#T5Vy}',t@Rcy3FG ŋu^2o^t$3ˌWT9 `9>:,Gr|tVFӺ E5 Í$,x9=G=!lO)qN>T*= Y_xn-7už v`TċI+sr@hrKkT$WZH=U"JU8x+0Laa!YP>.*ne=]=zb] zCU|ʌ6;@uzQTՆ_:x&I6B`aIgNjI>?54U+zݟy]f`A&5cƠ7Ao`F[b= ab?ĴeZom1Sd`xRsc6$$rBI%LWM5?٘mӑkInARLʤ+s{㛍<)e"BOIԕBW \m'GO/>D.T  }>֕{ȗ#ܬܨOo秒nh~wI[p=[dƧ7"ȝ&d`]At912 oIG~$SkiQطc-[fͤL2G*8qCta\0*yRҕ QW=x>D[kzJZN4ݔ.-*T]ogEosK3[49Ɲ.$ItXkS˛N4YX{L"p49*wWΚt+Gu`НI.o">L>dzBr;k#\rx uvwʵ0:[b3L!N& J׎tra*l!amC{*+{|==<KNwU{ԛX-mV-Iȏd7?IJ2x+8k&eҕ9RNvJt xRo}9Do NLL 'H4bTW)E{7,,ndB(L~6מSEu]E øUu74ِmyk7kCC׭[G>Mvvv޽}WM7k9d[I Ap\,9LhjeYXm>CnOeiI-ddҠ~`{:˔(V}έIox0rk$+pxdd:@50ʌ!X8 0FV}_bXcM:Ro`BN L$[ު^V'''u͙J;nh˴Mh`x,c/fv8O:?muTr;I7Qr.d,srr= n_&uD"H$.qwynőȗ$S*p3J~6zFc;f?4z:SθS 8 21k|K-fKDSi\EBm.+\mz]E]Ѻ"x N^kU*08WhzIp;?.㤣>U6G*8q}^O|L5qRҔL"UN>*6WaD$IaUCuttn'prAs}5x!1ns3z£K%gj6KfUkiF:Hg_hS`4W,Jw"[_bnYW+rZv[/h744g$ϻRd3KՖi]?Q&$_gM0!Èɧū?̺8e @#' =gBVXӝ<]b?&&&&''(|;\|l>_]ޖ֖d<^ 784XT܏X)`vDC`Mt_;N h2Q.=5FCVX9/.ڲ"$B26neֽS+;@(mn.p=`?ao|\] lllvԁ I'Q05V=<fUbphPIM%Q1a zQ@4~\I+ojvF x*$IBM/cyV>Bȵdߥ>.\x z;`w?q Ȳ$+ׅ!Rp@. *xCqVaBv֩ˆ{zd`J3=?n[U/p=Ps#_crdi3|'lw9>?54UZTP&-kFNPޣRӮе4}?sv{} M$ؕyF.6wވD"#wFWtc.* .ppќ:|Qطc-[|Njdp[J_~> x/z[ٻVM&qq||<<8 LAp$X}t{'5=nVj7Lmm)Y:+7>)<שߪO6:b39Byo{:UMA LAN6xKJ'2%:@50ʌ<cdo/M?<5]1I[?L}Ul/%J`❚Z+>:$i|ŨZR\ >n:XX|>. B8 tj3Rz5K׸ 'E󴍦Q:倥Vφa3Dp 0NSFh50nXJ4%n~^!&?%ص$[צ88 (R}A+Ė]E]Ѻ"x N/4Z 𐘷8())a esCnoq<% /Ux:=RJw81UΪQwn+컼0Kr2Nwq  %;t-m|H\g]CCC}[{"$9;g! zD# plQDܼy|y-sK4&`9G_G4L&5m682ZVQ!c+YwBa!GG!B|}tB(`!GGHFg m-MY((Q Zv5q`1ͩ; ̜NRLFWkIr-Y8N[VgzF%y pJe㛍B\Lx.σ봋uƥR¼!&Q r$Hf 䥛.pvy잳/t;iJƜ *gK5w>zmMþfEI'>pHRˎ_Pt; :68$s½Qgwg(:UCq_gW]]5eE*L>,,,TohMĘqRjD8<_XCwgT'\;ζ^KYV/tW]] lllvHF9a9 $@:0(F$36e0LLaGZ>D}?n4VCCwa;**M\Kr[f,6DJ˕p_ޟ7O)'A$%ˮD"yԒ!ᯞ$SI.syy?@DPmN%gAv-i_z#kD2H$EEE0xjO(:/db$|O10NoA;~0GI(.nĄ[P5tǨ 09)}…k tِ$c skr1eчhEaχۺ/r+nƧ7էKKV{>D^_O2t'.Nfm8N+֕i~\eJ7f+Bc5V(Rgu"P=7Q*u8{* [[kqrq$õCOݭWT*ǿ0Eja :/t ުP o42ӏeL c^c˪J/C*W+a nn N [l #FѨGFF 2ͪTW#UPWKЩo)izǵ}LT߲ދf6ir4;UEN$Io7HhZY&ONNNieo7tJH.Ja:\eI==ԽM#VH$Mݕ2Z)Y:+w} SySW̑X,V8Ѫz=ψ pԽ+ZW-rn4)CVF/#]N("; .x"vy6o.6=bNYF8G O2nXJ4%n~a3Aa쏺/U K¡{C`pFT Y=FuSfmV&NyVs7tW[R oG Q]'[MKWfԝh?aoinatw'&&*SÎHF`0>OE(uMK>_ٮ{^g;fsq {:=A4탶-}>&ĂݞNrd=Z:@κr2 >zhm}[P[btQ7ŗLMj.r IFO.+}%1ӜkNBdphPIM%YmӑkɾK}]f`&;qw  $9/Q,h4R- U>k|B- :mi4 ;]Kێ*T A閾( w[N4$x״_REK#3kh> d A-hG[6|6ĭlA6 0 었`woWR$IY(n]QBN0wu&]C+Yfh(Fo NLL;_՞*m/0( \E@6ktl{k9`P>nii88hv ? l;]S*gcߎnICg8!BQ5T2j( %;OoD";#X B 5pe`t Zy [}bS3n CbjzrrZgm>ќIf#b2&!Ƣ k0 3к[v|Tf=uЪbd;n~~3i @fd `ˡWx_O~XYF3nXJ4%uGvy͕v(R}A jh5}t;rQ(}UD$|L-eu^6459w>t;@͞|+[Ͼ)ps_ҋwP o42x ,(o79tlGIJ$t- `()gr*ySuhG5S/o?.q C 9ZbP.1j'5=AG&b\;mszЌVvtQ\Eh8u^+Da 2h4͒%Q^k˴lZت-oL׎68]q{y<+#8A$> )RlrFD %>O!rk4=7{r*9pm 5Bh$%q^wB(d8n3V!Vk.sҲp[}t#26acuP.K _kߎ"BX-B,XM{e/PxK=zwSl=FY ttDRl\9Q:ЪRnFWkIr-Y*]D ȲW[wv`_θT*Q@wc?#/&|ݹ\]ՖiB[e<KT*)`InYdr^g\ޜ #j}tbc?&&&&''(zS"ˮ{'Pl"FN8e`S촵ۡH^};xJôۅ{N\qv }6 㕻+6|$]J]ޖ֖d<^dܖO8+y^saQ,q 2%ֆ^rr-?YZW^wGЖ}vVOO{z zJGOp!d:"gTpJIDATDW*Nb0b?:_}?HvvJE$}8ZǛP8ĎR7už v`{A8O:@snF9؛=]=m:(6]OWOKsdǓ jFyToRkIN}&-0,8pm j\ ȵd%],_x,T" .q5%dІ} Zr\rr_ P>PT qs5O@ƲtPGlAZmAYk zcW2ٗ%8 ݿwx #_0ptoԍs8]CS:XP&ӟ{Fyn.|?,>QwƗ /t7ͨ:HNBCwF.pp zm#jizmEҶoZN0ݻXgH$2rg/8\0qy$. %oە?W*twuevkmVTZ[QVlg/[ Z( oͻD6aYIl#/t]a z?l{נ7@Wg?a'IRW C5f!r F=/LF"7"jIf&Z/$oO/vyV&RZZ.w-5»J=x<^|pp|K?xxCL$Ǜ.@<d (X-2n,s˞+KNA\6Fqq|rd?ƽH&TV1$5<Κ7nnυ,Ÿ+?K5Ldė@ooI.{(\3#dk;/0^ZZpd2Y{r_BP$ɻO"\_|}~Q=_q8n,eVZqs[%'!UVxJ_ҷۓvvRl l[/[~r5Lrg魦*KOCrNW{7tW\tskӬuwuR/ʟufu}K7o-dooiiOo$%jՊ/b49\o*^Ra߽}zxQ'WaQ**?˷s_[#DxD"yU~cJ>J[/&RI>Jd<<a['Gpe*8r5k'W`۱ s Aʇoחo-g/$]޽>x@}wEa#DߘsxsYrM(6\T^OXZZ:66L&_y"M ANyH5573i "̂znӚ+[Qۚü;}圮39y_#F&\kvwݦ}@jJs%Trv{Qgm*{N8ni  6m!k7kCC׭[G>Mvvv޽}WMmәvU{ôΠ+za]2;J/&^5?QDx/zwm4,,}("<u1>cioRMǛW?#-խZ4)*ݝ?B!*8/͖Ko6QXվ*-ӥutЇ$b|W24Z 0]E]Ѻ"x N\/ʊW+a nMebƝFg?a/\FX'0ib1}SuፆQft R2w^N=\5b1 b^)9cV=[^|\,97LANV i*WIkD3?LMnY١r$ $t9|\9}lbֶ֥Ik~`c3b dIRDYL( L>` $,jC3MGGG\KgwdZr_%YޣkiF:t31)0W+wWG$òD`Ǜ~~]#|oO]g]tyst?ǙĿ,EDSs(åOXOp' -t5SgQ"k&{[-d}1!ryC[ C9DZz9qGGe GG(a!\=;"Bh7a!sgfKIZvۀacH̻͹PW-ܜ>$lr= }tPAã9a ӎs}se= uJ" nsx2-Q@h˴IU*)k|YGTnBwBm: t:ٌ9nr+!2f-,%]t=%df\,j@(+rq}tӮφ`arwfvy[Z[zzdOWO{-ܪt 8qp,|pއ @'&&S䣤댋) ?dYz= 7[q Nsa q*:KFI7d 룷mk]ʞ>B}gottt=]=--&O73НZBn( tt {㛍:b_a;fc] 'D: I%]Ը1Z4V=>*Vw=?n["~rOWzZ~;+p=Pqzս|9aˑΓmՒZ60NTm:T* L%R3mL7YJRo( 2 SXXVkΩ:HNBCwF.pp zmᵜjiz]#OmGmcߎdM;OoD";#~ႉwJbQBC\|=ݿP< 0y"<)-- ~ԕ*WARfA[$;v8 $9t/^?lmPkRKێ2Y++  ZkM&kFZT?ߒCO^AL 9=)W8ӳT< >BUaf@M@EErR|jXE'g@ʵFgGr.D$ Grw>X G[O 24K|Jn/..N+Yj7Lmm)Y:k" >)<שߪO6|dGcXbteUJ_~>KΤ ݿSCSȄQՓ:k魼b1+q̒KpIS7FQ z՞*03芞.bGuj:TQmn=*,P(Ǹm74r"{{lӌJ ªN9!/!w֬E f_ȄuĸMj$:NЈ2O̹f2E+T'hDhYL̙3\t hJ@(+8jzڀ9rg jsmL`*?T٬ٻ?.Uk\s@ZWPeF'V52*^_rg';5:V嚅p:>HdF\rg>ŧhB=!rKG(*k-PU2B+W6|!$C89%B{.=V"*ZY\z8ĜxU"ͧF B\3'hD xVh}PgB|5:B!FG!!P>!ٜ!_,,'DV`BˬX*ҰGB|}t!j=~9K&FG\Qnst2lb![̻VJˬ>:Bz+-XB(> }ǎX,2BB|5:B!FG!! ~6XJFjgvFh7oh!FGU_Յk _cj?`!Zs݋:ͳMa4FGUu!ZP\\lu&~J&''6?t/g.g ]F r(FGUd( Xj~|q6@ۙ6sZ.SV}jYfFca#FGUƣQ7T%&Jrrh&~PW 66F6nU jK㛍5_ ~9?V* Y!4ox4c~t ֛^L.˂_׉Ʉ`}iib0`ˡ=UJ/|?|'8FGUĴt'O_6BB|5:B!FG!>BeV,YaBc˝ -X,!rHMC#X2B|}tZfmTY Y5:B-?;B!FG!!P>!X#BktB(`BB|5:B!FG!Y`]g]˕B-DFWsv6B!$*5U\w ,$!b-:!P>!X#B7;!: ,w6B! H`P29IENDB`tora-2.1.3/src/help/objectdescription.html0000644000175000017500000000435311420561767020405 0ustar michaelmichael objectdescription - TOra

Next: , Previous: gettingbindparameters, Up: common


3.9.4 Object description

images/describe.png

This is a list that describes the columns of a table or view. There is nothing much special about this view except that you can check the collected analyze statistics for the column by placing the cursor over it and reading the tooltip that will be displayed. If no tooltip is displayed there is no analyzed statistics available. Also notable is that this list is read completely from the object cache if it available. This will mean that if you are modifying the object you are modifying you need to reread the object cache before you can see the changes. tora-2.1.3/src/help/editors.html0000644000175000017500000002335111420561767016343 0ustar michaelmichael editors - TOra

Next: , Previous: whatprivileges, Up: workspace


3.4 Using editors

Editors can be in two modes. The first is read and write in which case the following key bindings are defined.

Left Arrow Move the cursor one character to the left
Right Arrow Move the cursor one character to the right
Up Arrow Move the cursor one line upwards
Down Arrow Move the cursor one line downwards
Page Up Move the cursor one page upwards
Page Down Move the cursor one page downwards
<BS> Delete the character to the left of the cursor
<HOME> Move the cursor to the beginning of the line
End Move the cursor to the end of the line
Delete Delete the character to the right of the cursor
SHIFT - Left Arrow Mark text one character to the left
SHIFT - Right Arrow Mark text one character to the right
CTRL-A Select the entire buffer.
CTRL-B Move the cursor one character leftwards
CTRL-C Copy the marked text to the clipboard
CTRL-D Delete the character to the right of the cursor
CTRL-E Move the cursor to the end of the line
CTRL-F Pop up the search & replace dialog
CTRL-H Delete the character to the left of the cursor
CTRL-K Delete to end of line
CTRL-N Move the cursor one line downwards
CTRL-P Move the cursor one line upwards
CTRL-V Paste the clipboard text into line edit
CTRL-X Cut the marked text, copy to clipboard
CTRL-Z Undo the last operation
CTRL-Y Redo the last operation
CTRL - Left Arrow Move the cursor one word to the left
CTRL - Right Arrow Move the cursor one word to the right
CTRL - Up Arrow Move the cursor one word upwards
CTRL - Down Arrow Move the cursor one word downwards
CTRL - Home Arrow Move the cursor to the beginning of the text
CTRL - End Arrow Move the cursor to the end of the text
CTRL-S Save the editor with the current filename, if no filename is defined a dialog is displayed for the user to select the filename to use.
CTRL-O Read a file into the editor. A dialog will pop up to select the name to open.

The second mode is read only in which only the current key binding are available.

Left Arrow Scrolls the table to the left
Right Arrow Scrolls the table to the right
Up Arrow Scrolls the table one line downwards
Down Arrow Scrolls the table one line upwards
Page Up Scrolls the table one page downwards
Page Down Scrolls the table one page upwards
Control-C Copy the marked text to the clipboard
Control-S Save the editor with the current filename, if no filename is defined a dialog is displayed for the user to select the filename to use.

Editors support drag and drop which means you can drag a selection to another editor and drop any other text source onto an editable editor to insert the dragged text at the dropped location.

Also as a shortcut pressing the right mouse button will display a context menu containing the entries from the edit menu which pertain to the editors.

SQL editors

Editors for SQL have another feature which is code completion. If you place the cursor after a '.' character TOra will this the available columns for the table referenced by the name before the '.' character. This will only work for defined views and tables. You can also look up tablenames using the CTRL+T key which will list all tables starting with the same word as you currently have the cursor in. When the completion list is open you can navigate it using Up, Down keys and selecting an entry using Return. You can also remove the list by pressing the Escape key. The completion values are saved in the object cache and can not be used until it is read. If you find this annoying you can disable this in the preferences. tora-2.1.3/src/toanalyze.h0000644000175000017500000000633611270353625015232 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOANALYZE_H #define TOANALYZE_H #include "config.h" #include "tobackground.h" #include "tonoblockquery.h" #include "totool.h" #include #include #include class QComboBox; class QMenu; class QSpinBox; class QTabWidget; class QTimer; class QLabel; class toResultCombo; class toResultPlan; class toResultTableView; class toWorksheetStatistic; class toAnalyze : public toToolWidget { Q_OBJECT; QTabWidget *Tabs; toResultTableView *Statistics; QComboBox *Analyzed; toResultCombo *Schema; QComboBox *Type; QComboBox *Operation; QComboBox *For; QSpinBox *Sample; QSpinBox *Parallel; QLabel *Current; QToolButton *Stop; toBackground Poll; toResultTableView *Plans; toResultPlan *CurrentPlan; toWorksheetStatistic *Worksheet; std::list Running; std::list Pending; std::list getSQL(void); public: toAnalyze(QWidget *parent, toConnection &connection); toWorksheetStatistic *worksheet(void); static void createTool(void); public slots: virtual void displaySQL(void); virtual void changeOperation(int); virtual void execute(void); virtual void poll(void); virtual void stop(void); virtual void refresh(void); virtual void selectPlan(void); virtual void fillOwner(void); virtual void displayMenu(QMenu *); }; #endif tora-2.1.3/src/toresultresources.h0000644000175000017500000000452111270353625017032 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTRESOURCES_H #define TORESULTRESOURCES_H #include "config.h" #include "toresultitem.h" #include "tosql.h" #define TOSQL_RESULTRESOURCE /** This widget displays information about resources of a query. The statement * is identified by the first parameter which should be the address as gotten * from the @ref toSQLToAddress function. */ class toResultResources : public toResultItem { public: /** Create the widget. * @param parent Parent widget. * @param name Name of widget. */ toResultResources(QWidget *parent, const char *name = NULL); // Implemented in toresultitem.cpp }; #endif tora-2.1.3/src/tobrowserdirectorieswidget.h0000644000175000017500000000432611415711657020714 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBROWSERDIRECTORIESWIDGET_H #define TOBROWSERDIRECTORIESWIDGET_H #include "tobrowserbasewidget.h" class toResultTableView; /*! \brief Directories browser for toBrowser tool. See toBrowserBaseWidget for more info. \author Petr Vanek */ class toBrowserDirectoriesWidget : public toBrowserBaseWidget { Q_OBJECT toResultTableView *directoriesView; public: toBrowserDirectoriesWidget(QWidget * parent); virtual void changeConnection(); }; #endif tora-2.1.3/src/toworksheet.cpp0000644000175000017500000020060211363753704016132 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "tochangeconnection.h" #include "toconf.h" #include "tohighlightedtext.h" #include "tomain.h" #include "toparamget.h" #include "toresultbar.h" #include "toresultcols.h" #include "toresultschema.h" #include "toresultplan.h" #include "toresultresources.h" #include "toresultstats.h" #include "toresultview.h" #include "toresulttableview.h" #include "tosession.h" #include "tosgatrace.h" #include "totabwidget.h" #include "totool.h" #include "totabwidget.h" #include "tovisualize.h" #include "toworksheet.h" #include "ui_toworksheetsetupui.h" #include "toworksheetstatistic.h" #include "toworksheettext.h" #include "toeditablemenu.h" #include "todescribe.h" #include #include #include #include #include #include #include #include "totreewidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "icons/clock.xpm" #include "icons/recall.xpm" #include "icons/describe.xpm" #include "icons/eraselog.xpm" #include "icons/execute.xpm" #include "icons/executeall.xpm" #include "icons/executestep.xpm" #include "icons/explainplan.xpm" #include "icons/filesave.xpm" #include "icons/insertsaved.xpm" #include "icons/previous.xpm" #include "icons/refresh.xpm" #include "icons/stop.xpm" #include "icons/toworksheet.xpm" #include "icons/up.xpm" #include "icons/down.xpm" toWorksheetSetup::toWorksheetSetup(toTool *tool, QWidget* parent, const char* name) : QWidget(parent), toSettingTab("worksheet.html#preferences"), Tool(tool) { setupUi(this); AutoSave->setChecked(toConfigurationSingle::Instance().wsAutoSave()); CheckSave->setChecked(toConfigurationSingle::Instance().wsCheckSave()); LogAtEnd->setChecked(toConfigurationSingle::Instance().wsLogAtEnd()); LogMulti->setChecked(toConfigurationSingle::Instance().wsLogMulti()); MoveToError->setChecked(toConfigurationSingle::Instance().wsMoveToErr()); Statistics->setChecked(toConfigurationSingle::Instance().wsStatistics()); TimedStatistics->setChecked(toConfigurationSingle::Instance().wsTimedStats()); History->setChecked(toConfigurationSingle::Instance().wsHistory()); DisplayNumber->setChecked(toConfigurationSingle::Instance().wsNumber()); ToplevelDescribe->setChecked(toConfigurationSingle::Instance().wsToplevelDescribe()); DefaultFile->setText(toConfigurationSingle::Instance().wsAutoLoad()); ExecLog->setChecked(toConfigurationSingle::Instance().wsExecLog()); #ifdef TO_NO_ORACLE TimedStatistics->hide(); MoveToError->hide(); Statistics->hide(); #endif } void toWorksheetSetup::saveSetting(void) { toConfigurationSingle::Instance().setWsAutoSave(AutoSave->isChecked()); toConfigurationSingle::Instance().setWsCheckSave(CheckSave->isChecked()); toConfigurationSingle::Instance().setWsLogAtEnd(LogAtEnd->isChecked()); toConfigurationSingle::Instance().setWsLogMulti(LogMulti->isChecked()); toConfigurationSingle::Instance().setWsToplevelDescribe(ToplevelDescribe->isChecked()); toConfigurationSingle::Instance().setWsMoveToErr(MoveToError->isChecked()); toConfigurationSingle::Instance().setWsStatistics(Statistics->isChecked()); toConfigurationSingle::Instance().setWsHistory(History->isChecked()); toConfigurationSingle::Instance().setWsTimedStats(TimedStatistics->isChecked()); toConfigurationSingle::Instance().setWsNumber(DisplayNumber->isChecked()); toConfigurationSingle::Instance().setWsExecLog(ExecLog->isChecked()); toConfigurationSingle::Instance().setWsAutoLoad(DefaultFile->text()); } void toWorksheetSetup::chooseFile(void) { QString str = toOpenFilename(DefaultFile->text(), QString::null, this); if (!str.isEmpty()) DefaultFile->setText(str); } class toWorksheetTool : public toTool { protected: virtual const char **pictureXPM(void) { return const_cast(toworksheet_xpm); } public: toWorksheetTool() : toTool(10, "SQL Editor") { } virtual const char *menuItem() { return "SQL Editor"; } virtual QWidget *toolWindow(QWidget *main, toConnection &connection) { return new toWorksheet(main, connection); } virtual QWidget *configurationTab(QWidget *parent) { return new toWorksheetSetup(this, parent); } virtual bool canHandle(toConnection &) { return true; } virtual void closeWindow(toConnection &connection) {}; }; static toWorksheetTool WorksheetTool; void toWorksheet::viewResources(void) { try { QString address = toSQLToAddress(connection(), QueryString); Resources->changeParams(address); QString sql = toSQL::string(TOSQL_LONGOPS, connection()); sql += " AND b.SQL_Address||':'||b.SQL_Hash_Value = :addr"; LongOps->setSQL(sql); LongOps->clearParams(); LongOps->changeParams(address); } TOCATCH } #define TOWORKSHEET "toWorksheet:" void toWorksheet::createActions() { executeNewlineAct = new QAction(tr("Execute &Newline Separated"), this); executeNewlineAct->setShortcut(Qt::SHIFT + Qt::Key_F9); connect(executeNewlineAct, SIGNAL(triggered()), this, SLOT(executeNewline(void))); parseAct = new QAction(tr("Check syntax of buffer"), this); parseAct->setShortcut(Qt::CTRL + Qt::Key_F9); connect(parseAct, SIGNAL(triggered()), this, SLOT(parseAll(void))); executeAct = new QAction(QPixmap(const_cast(execute_xpm)), tr("Execute current statement"), this); executeAct->setShortcut(Qt::CTRL + Qt::Key_Return); connect(executeAct, SIGNAL(triggered()), this, SLOT(execute(void))); executeStepAct = new QAction(QPixmap(const_cast(executestep_xpm)), tr("Step through statements"), this); executeStepAct->setShortcut(Qt::Key_F9); connect(executeStepAct, SIGNAL(triggered()), this, SLOT(executeStep(void))); executeAllAct = new QAction(QPixmap(const_cast(executeall_xpm)), tr("Execute all statements"), this); executeAllAct->setShortcut(Qt::Key_F8); connect(executeAllAct, SIGNAL(triggered()), this, SLOT(executeAll(void))); refreshAct = new QAction(QPixmap(const_cast(refresh_xpm)), tr("Reexecute Last Statement"), this); refreshAct->setShortcut(QKeySequence::Refresh); connect(refreshAct, SIGNAL(triggered()), this, SLOT(refreshSetup(void))); describeAct = new QAction(QPixmap(const_cast(describe_xpm)), tr("Describe under cursor"), this); describeAct->setShortcut(Qt::Key_F4); connect(describeAct, SIGNAL(triggered()), this, SLOT(describe(void))); explainAct = new QAction(QPixmap(const_cast(explainplan_xpm)), tr("Explain plan of current statement"), this); explainAct->setShortcut(Qt::Key_F6); connect(explainAct, SIGNAL(triggered()), this, SLOT(explainPlan(void))); stopAct = new QAction(QPixmap(const_cast(stop_xpm)), tr("Stop execution"), this); connect(stopAct, SIGNAL(triggered()), this, SLOT(stop(void))); stopAct->setEnabled(false); eraseAct = new QAction(QPixmap(const_cast(eraselog_xpm)), tr("Clear execution log"), this); connect(eraseAct, SIGNAL(triggered()), this, SLOT(eraseLogButton(void))); statisticAct = new QAction(QPixmap(const_cast(clock_xpm)), tr("Gather session statistic of execution"), this); statisticAct->setCheckable(true); connect(statisticAct, SIGNAL(toggled(bool)), this, SLOT(enableStatistic(bool))); previousAct = new QAction(QPixmap(const_cast(up_xpm)), tr("Previous log entry"), this); connect(previousAct, SIGNAL(triggered()), this, SLOT(executePreviousLog(void))); nextAct = new QAction(QPixmap(const_cast(down_xpm)), tr("Next log entry"), this); connect(nextAct, SIGNAL(triggered()), this, SLOT(executeNextLog(void))); saveLastAct = new QAction(QPixmap(const_cast(previous_xpm)), tr("Save last SQL"), this); connect(saveLastAct, SIGNAL(triggered()), this, SLOT(saveLast(void))); } void toWorksheet::setup(bool autoLoad) { QToolBar *workToolbar = toAllocBar(this, tr("SQL worksheet")); layout()->addWidget(workToolbar); workToolbar->addAction(executeAct); workToolbar->addAction(executeStepAct); workToolbar->addAction(executeAllAct); workToolbar->addSeparator(); workToolbar->addAction(refreshAct); workToolbar->addSeparator(); workToolbar->addAction(describeAct); workToolbar->addAction(explainAct); workToolbar->addAction(stopAct); workToolbar->addSeparator(); workToolbar->addAction(eraseAct); workToolbar->addSeparator(); workToolbar->addAction(statisticAct); workToolbar->addWidget(new QLabel(tr("Refresh") + " ", workToolbar)); Refresh = toRefreshCreate(workToolbar, TO_TOOLBAR_WIDGET_NAME); workToolbar->addWidget(Refresh); connect(Refresh, SIGNAL(activated(const QString &)), this, SLOT(changeRefresh(const QString &))); Refresh->setEnabled(false); Refresh->setFocusPolicy(Qt::NoFocus); // enable refresh button from statisticAct connect(statisticAct, SIGNAL(toggled(bool)), Refresh, SLOT(setEnabled(bool))); workToolbar->addSeparator(); workToolbar->addAction(previousAct); workToolbar->addAction(nextAct); workToolbar->addSeparator(); InsertSavedMenu = new toEditableMenu(workToolbar); InsertSavedMenu->setIcon( QPixmap(const_cast(insertsaved_xpm))); InsertSavedMenu->setTitle(tr("Insert current saved SQL")); workToolbar->addAction(InsertSavedMenu->menuAction()); connect(InsertSavedMenu, SIGNAL(aboutToShow()), this, SLOT(showInsertSaved())); connect(InsertSavedMenu, SIGNAL(triggered(QAction *)), this, SLOT(insertSaved(QAction *))); connect(InsertSavedMenu, SIGNAL(actionRemoved(QAction *)), this, SLOT(removeSaved(QAction *))); SavedMenu = new toEditableMenu(workToolbar); SavedMenu->setIcon(QPixmap(const_cast(recall_xpm))); SavedMenu->setTitle(tr("Run current saved SQL")); workToolbar->addAction(SavedMenu->menuAction()); connect(SavedMenu, SIGNAL(aboutToShow()), this, SLOT(showSaved())); connect(SavedMenu, SIGNAL(triggered(QAction *)), this, SLOT(executeSaved(QAction *))); connect(SavedMenu, SIGNAL(actionRemoved(QAction *)), this, SLOT(removeSaved(QAction *))); workToolbar->addAction(saveLastAct); workToolbar->addWidget(Started = new QLabel(workToolbar)); Started->setAlignment(Qt::AlignRight | Qt::AlignVCenter); Started->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum)); Schema = new toResultSchema(connection(), workToolbar); workToolbar->addWidget(Schema); try { Schema->refresh(); } catch (...) {} connect(Schema, SIGNAL(currentIndexChanged(const QString &)), Schema, SLOT(update(const QString &))); new toChangeConnection(workToolbar, TO_TOOLBAR_WIDGET_NAME); RefreshSeconds = 60; connect(&RefreshTimer, SIGNAL(timeout()), this, SLOT(refresh())); LastLine = LastOffset = -1; LastID = 0; EditSplitter = new QSplitter(Qt::Vertical, this); layout()->addWidget(EditSplitter); Editor = new toWorksheetText(this, EditSplitter); // stop any running query when a file is loaded connect(Editor, SIGNAL(fileOpened()), this, SLOT(stop())); connect(Editor, SIGNAL(modificationChanged(bool)), this, SLOT(setCaption())); ResultTab = new toTabWidget(EditSplitter); QWidget *container = new QWidget(ResultTab); QVBoxLayout *box = new QVBoxLayout; ResultTab->addTab(container, tr("&Result")); Current = Result = new toResultTableView(false, true, container); box->addWidget(Result); connect(Result, SIGNAL(done(void)), this, SLOT(queryDone(void))); connect(Result, SIGNAL(firstResult(const QString &, const toConnection::exception &, bool)), this, SLOT(addLog(const QString &, const toConnection::exception &, bool))); connect(Result, SIGNAL(firstResult(const QString &, const toConnection::exception &, bool)), this, SLOT(unhideResults(const QString &, const toConnection::exception &, bool))); Columns = new toResultCols(container, "description"); box->addWidget(Columns); Columns->hide(); box->setContentsMargins(0, 0, 0, 0); container->setLayout(box); ResultTab->setTabEnabled(ResultTab->indexOf(Columns), false); Plan = new toResultPlan(ResultTab); ResultTab->addTab(Plan, tr("E&xecution plan")); explainAct->setEnabled(Plan->handled()); ResourceSplitter = new QSplitter(Qt::Vertical, ResultTab); Resources = new toResultResources(ResourceSplitter); LongOps = new toResultTableView(true, true, ResourceSplitter); Visualize = new toVisualize(Result, ResultTab); ResultTab->addTab(Visualize, tr("&Visualize")); ResultTab->addTab(ResourceSplitter, tr("&Information")); ResultTab->setTabShown(ResourceSplitter, Resources->handled()); StatTab = new QWidget(ResultTab); box = new QVBoxLayout; // reassigned QToolBar *stattool = toAllocBar(StatTab, tr("Worksheet Statistics")); stattool->addAction(QIcon(QPixmap(const_cast(filesave_xpm))), tr("Save statistics for later analysis"), this, SLOT(saveStatistics(void))); QLabel *statlabel = new QLabel(stattool); stattool->addWidget(statlabel); box->addWidget(stattool); QSplitter *splitter = new QSplitter(Qt::Horizontal, StatTab); Statistics = new toResultStats(true, splitter); Statistics->setTabWidget(ResultTab); WaitChart = new toResultBar(splitter); try { WaitChart->setSQL(toSQL::sql(TO_SESSION_WAIT)); } catch (...) {} WaitChart->setTitle(tr("Wait states")); WaitChart->setYPostfix(QString::fromLatin1("ms/s")); WaitChart->setSamples(-1); WaitChart->start(); connect(Statistics, SIGNAL(sessionChanged(const QString &)), WaitChart, SLOT(changeParams(const QString &))); IOChart = new toResultBar(splitter); try { IOChart->setSQL(toSQL::sql(TO_SESSION_IO)); } catch (...) {} IOChart->setTitle(tr("I/O")); IOChart->setYPostfix(tr("blocks/s")); IOChart->setSamples(-1); IOChart->start(); connect(Statistics, SIGNAL(sessionChanged(const QString &)), IOChart, SLOT(changeParams(const QString &))); box->setSpacing(0); box->setContentsMargins(0, 0, 0, 0); box->addWidget(splitter); StatTab->setLayout(box); ResultTab->addTab(StatTab, tr("&Statistics")); ResultTab->setTabEnabled(ResultTab->indexOf(StatTab), false); Logging = new toListView(ResultTab); ResultTab->addTab(Logging, tr("&Logging")); Logging->addColumn(tr("SQL")); Logging->addColumn(tr("Result")); Logging->addColumn(tr("Timestamp")); Logging->addColumn(tr("Duration")); Logging->setColumnAlignment(3, Qt::AlignRight); Logging->setSelectionMode(toTreeWidget::Single); connect(Logging, SIGNAL(selectionChanged(toTreeWidgetItem *)), this, SLOT(executeLog())); LastLogItem = NULL; connect(ResultTab, SIGNAL(currentChanged(int)), this, SLOT(changeResult(int))); if (autoLoad) { Editor->editOpen(toConfigurationSingle::Instance().wsAutoLoad()); } ToolMenu = NULL; connect(toMainWidget()->workspace(), SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(windowActivated(QMdiSubWindow *))); try { if (connection().provider() == "Oracle") { if (toConfigurationSingle::Instance().wsStatistics()) { show(); statisticAct->setChecked(true); } } else statisticAct->setEnabled(false); } TOCATCH; connect(this, SIGNAL(connectionChange()), this, SLOT(connectionChanged())); Editor->setAnalyzer(connection().analyzer()); context = NULL; Editor->setContextMenuPolicy(Qt::CustomContextMenu); connect(Editor, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(createPopupMenu(const QPoint &))); connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); connect(this, SIGNAL(connectionChange()), this, SLOT(changeConnection())); setFocusProxy(Editor); // don't show results yet QList list; list.append(1); list.append(0); EditSplitter->setSizes(list); QSettings s; int v; s.beginGroup("toWorksheet"); v = s.value("EditSplitterSizes0", 10).toInt(); if (v == 0) v = 10; EditSplitterSizes << v; v = s.value("EditSplitterSizes1", 10).toInt(); if (v == 0) v = 10; EditSplitterSizes << v; s.endGroup(); setCaption(); } toWorksheet::toWorksheet(QWidget *main, toConnection &connection, bool autoLoad) : toToolWidget(WorksheetTool, "worksheet.html", main, connection, "toWorksheet") { createActions(); setup(autoLoad); } // private for toworksheetwidget toWorksheet::toWorksheet(QWidget *main, const char *name, toConnection &connection) : toToolWidget(WorksheetTool, "worksheetlight.html", main, connection, name) { createActions(); } void toWorksheet::changeRefresh(const QString &str) { try { if (stopAct->isEnabled() && statisticAct->isChecked()) toRefreshParse(timer(), str); } TOCATCH; } void toWorksheet::windowActivated(QMdiSubWindow *widget) { if (!widget) return; QWidget *w = this; while (w && w != widget->widget()) w = w->parentWidget(); if (widget->widget() == w) { if (!ToolMenu) { ToolMenu = new QMenu(tr("Edit&or"), this); ToolMenu->addAction(executeAct); ToolMenu->addAction(executeStepAct); ToolMenu->addAction(executeAllAct); ToolMenu->addAction(executeNewlineAct); ToolMenu->addAction(refreshAct); ToolMenu->addAction(parseAct); ToolMenu->addSeparator(); ToolMenu->addAction(describeAct); ToolMenu->addAction(explainAct); ToolMenu->addAction(statisticAct); ToolMenu->addAction(stopAct); ToolMenu->addSeparator(); ToolMenu->addAction(SavedMenu->menuAction()); ToolMenu->addAction(saveLastAct); ToolMenu->addSeparator(); ToolMenu->addAction(previousAct); ToolMenu->addAction(nextAct); ToolMenu->addAction(eraseAct); toMainWidget()->addCustomMenu(ToolMenu); } // disabled. can cause infinite loop on some window systems // depending on the timing. // Editor->setFocus(); if (Editor) Editor->setFocus(Qt::ActiveWindowFocusReason); // must set correct schema every time so having two worksheets // on different schemas works properly. if(Schema) Schema->update(); } else { delete ToolMenu; ToolMenu = NULL; } } void toWorksheet::connectionChanged(void) { try { statisticAct->setEnabled(connection().provider() == "Oracle"); ResultTab->setTabShown(ResourceSplitter, Resources->handled()); Editor->setAnalyzer(connection().analyzer()); explainAct->setEnabled(Plan->handled()); delete ToolMenu; ToolMenu = NULL; windowActivated(qobject_cast(this->parent())); } TOCATCH; } bool toWorksheet::checkSave(bool input) { if (!Editor->isModified()) return true; if (!toConfigurationSingle::Instance().wsAutoSave() || Editor->filename().isEmpty()) { // if (!WorksheetTool.config(CONF_CHECK_SAVE, "Yes").isEmpty()) { if (toConfigurationSingle::Instance().wsCheckSave()) { if (!input) return true; QString conn; try { conn = connection().description(); } catch (...) { conn += QString::fromLatin1("unknown connection"); } // grab focus so user can see file and decide to save setFocus(Qt::OtherFocusReason); QString str = tr("Save changes to editor for %1?").arg(conn); if (!Editor->filename().isEmpty()) str += QString::fromLatin1("\n(") + Editor->filename() + QString::fromLatin1(")"); int ret = TOMessageBox::information( this, "Save File", str, QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); if (ret == QMessageBox::Save) { if (Editor->filename().isEmpty() && input) Editor->setFilename(toSaveFilename(Editor->filename(), QString::null, this)); if (Editor->filename().isEmpty()) return false; } else if (ret == QMessageBox::Discard) { // only ever called if closing widget, make sure this // is not called again. Editor->setModified(false); return true; } else return false; } else return true; } if (!toWriteFile(Editor->filename(), Editor->text())) return false; Editor->setModified(false); return true; } bool toWorksheet::close() { if (Statistics) { Statistics->close(); delete Statistics; Statistics = NULL; } if (checkSave(true)) { Result->stop(); return toToolWidget::close(); } return false; } void toWorksheet::closeEvent(QCloseEvent *event) { QSettings s; s.beginGroup("toWorksheet"); s.setValue("EditSplitterSizes0", EditSplitter->sizes()[0]); s.setValue("EditSplitterSizes1", EditSplitter->sizes()[1]); s.endGroup(); if (close()) event->accept(); else event->ignore(); } toWorksheet::~toWorksheet() { } #define LARGE_BUFFER 4096 void toWorksheet::changeResult(int index) { QWidget *widget = ResultTab->widget(index); if (!widget) return; CurrentTab = widget; if (QueryString.length()) { if (CurrentTab == Plan) Plan->query(QueryString); else if (CurrentTab == ResourceSplitter) viewResources(); else if (CurrentTab == Statistics && Result->running()) Statistics->refreshStats(false); } } void toWorksheet::refresh(void) { if (!QueryString.isEmpty()) query(QueryString, Normal, QueryStatementClass); if (RefreshSeconds > 0) { RefreshTimer.setSingleShot(true); RefreshTimer.start(RefreshSeconds * 1000); } } static QString unQuote(const QString &str) { if (str.at(0).toLatin1() == '\"' && str.at(str.length() - 1).toLatin1() == '\"') return str.left(str.length() - 1).right(str.length() - 2); return str.toUpper(); } bool toWorksheet::describe(const QString &query) { try { QRegExp white(QString::fromLatin1("[ \r\n\t.]+")); QStringList part = query.split(white); if (part[0].toUpper() == QString("DESC") || part[0].toUpper() == QString("DESCRIBE")) { unhideResults(); if (toIsOracle(connection())) { if (part.count() == 2) { Columns->changeParams(unQuote(part[1])); } else if (part.count() == 3) { Columns->changeParams(unQuote(part[1]), unQuote(part[2])); } else throw tr("Wrong number of parameters for describe"); } else if (connection().provider() == "MySQL") { if (part.count() == 2) { Columns->changeParams(part[1]); } else throw tr("Wrong number of parameters for describe"); } Current->hide(); Columns->show(); Current = Columns; return true; } else { QWidget *curr = ResultTab->currentWidget(); Current->hide(); Result->show(); Current = Result; if (curr == Columns) ResultTab->setCurrentIndex(ResultTab->indexOf(Result)); return false; } } TOCATCH return false; } static toSQL SQLCheckMySQLRoutine("toWorksheet:CheckRoutine", "select count(1)\n" "from information_schema.routines\n" "where routine_name = :f1\n" " and lower(routine_type) = :f2\n" " and routine_schema = :f3", "Check if routine exists in MySQL", "5.0", "MySQL"); static toSQL SQLDropMySQLRoutine("toWorksheet:DropRoutine", "drop :f1 if exists :f2;", "Drop MySQL routine if it exists", "5.0", "MySQL"); // MySQL does not support replacing currently existing routines. Trying to create existing // routine raises exception. Therefore when creating a routine a previous one should be // dropped first. // There is a configuration option in MySQL settings section on how exactly this feature // should behave: // 0 - do nothing // 1 - drop before creating // 2 - drop before creating (if exists) // 3 - ask // 4 - ask (if exists) void toWorksheet::mySQLBeforeCreate(QString &chk) { // wether routine exists must checked if config is set to 2 (drop if exists) and 4 (ask if exists) bool check = (toConfigurationSingle::Instance().createAction() % 2 == 0); // wether to ask or drop automatically if config is set to 3 (ask) and 4 (ask if exists) bool ask = (toConfigurationSingle::Instance().createAction() > 2); bool answerYes; // do a "poor mans" parsing as we do not actually need to parse everything chk.replace("(", " "); chk.replace("\n", " "); QStringList tok = chk.split(" ", QString::SkipEmptyParts); // only for "create" statements if (tok[0] == "create") { int i; if (tok[1].startsWith("definer=")) i = 1; else i = 0; // only for create function|procedure statements (not for create table|index etc...) if (tok[1 + i] == "function" || tok[1 + i] == "procedure") { int c = 1; // count of existing routines (would logically be 0 or 1) try { if (check) { // Check if this routine actually exists in database toQList param; toPush(param, toQValue(tok[2 + i].remove('`'))); // routine name toPush(param, toQValue(tok[1 + i])); // routine type (procedure or function) toPush(param, toQValue(Schema->currentText())); toQuery query(connection(), toQuery::Long, SQLCheckMySQLRoutine, param); c = query.readValue().toInt(); // 1 - exists, 0 - does not exist } if (c == 1) { if (ask) answerYes = (TOMessageBox::information(this, tr("Drop routine?"), tr("Do you want to drop %1 %2?").arg(tok[1 + i]).arg(tok[2 + i]), tr("&Drop"), tr("Leave it and continue")) == 0); else answerYes = true; if (answerYes) { toQList param; toPush(param, toQValue(tok[1 + i])); // routine type (procedure or function) toPush(param, toQValue(tok[2 + i])); // routine name // Note that if routine creation is not successfull you will be left without any routine! toQuery query(connection(), toQuery::Long, SQLDropMySQLRoutine, param); } } } TOCATCH; } } } // mySQLBeforeCreate void toWorksheet::query(const QString &str, execType type, toSQLParse::statement::statementClass sc) { Result->stop(); RefreshTimer.stop(); QRegExp strq(QString::fromLatin1("'[^']*'")); QString chk = str.toLower(); chk.replace(strq, QString::fromLatin1(" ")); bool code; // TS 2010-03-11 Parser identifies if it is SQL or PLSQL block if (sc == toSQLParse::statement::unknown) { // If query is executed from some text buffer it should be parsed to identify statementClass toSQLParse::stringTokenizer tokens(str); toSQLParse::statement st = toSQLParse::parseStatement(tokens); sc = st.StatementClass; } code = (sc == toSQLParse::statement::plsqlblock); /* static QRegExp codere(QString::fromLatin1("[^a-z0-9]end\\s+[a-z0-9_-]*;$"), Qt::CaseSensitive); static QRegExp codere2(QString::fromLatin1("[^a-z0-9]end;"), Qt::CaseSensitive); if (codere.indexIn(chk) >= 0 || codere2.indexIn(chk) >= 0) code = true; */ QueryString = str.trimmed(); QueryStatementClass = sc; if (!code && QueryString.length() > 0 && QueryString.at(QueryString.length() - 1) == ';') QueryString.truncate(QueryString.length() - 1); bool nobinds = false; chk = str.toLower(); chk.replace(strq, QString::fromLatin1(" ")); chk = chk.simplified(); chk.replace(QRegExp(QString::fromLatin1(" or replace ")), QString::fromLatin1(" ")); if (chk.startsWith(QString::fromLatin1("create trigger "))) nobinds = true; // Imitate something like "create or replace" syntax for MySQL if (toIsMySQL(connection()) && code && toConfigurationSingle::Instance().createAction() > 0) mySQLBeforeCreate(chk); if (type == OnlyPlan) { ResultTab->setCurrentIndex(ResultTab->indexOf(Plan)); Plan->query(str); unhideResults(); } else if (!describe(QueryString)) { toSQLParse::stringTokenizer tokens(str); QString first = tokens.getToken(true).toUpper(); if (toIsOracle(connection()) && first == "EXEC") { // put exec in anonymous plsql block or they won't work QueryString = QueryString.trimmed().right(QueryString.length() - 4); QueryString = QString("BEGIN\n%1;\nEND;").arg(QueryString); } if (first == QString::fromLatin1("REM") || first == QString::fromLatin1("ASSIGN") || first == QString::fromLatin1("PROMPT") || first == QString::fromLatin1("COLUMN") || first == QString::fromLatin1("SPOOL") || first == QString::fromLatin1("STORE")) { QString t = tr("Ignoring SQL*Plus command"); Timer.start(); addLog(QueryString, toConnection::exception(t), false); toStatusMessage(t, true); return ; } // unhide the results pane if there's something to show if (first == "SELECT" || (ResultTab && ResultTab->currentIndex() != 0)) unhideResults(); toQList param; if (!nobinds) try { param = toParamGet::getParam(connection(), this, QueryString); } catch (...) { return ; } toStatusMessage(tr("Processing query"), true); if (type == Parse) { try { First = false; Timer.start(); connection().parse(QueryString); } catch (const QString &exc) { addLog(QueryString, exc, true); } } else if (type == Direct) { try { First = false; Timer.start(); QString buffer; if (!toConfigurationSingle::Instance().wsHistory()) { toQuery query(connection(), toQuery::Long, QueryString, param); if (query.rowsProcessed() > 0) buffer = tr("%1 rows processed").arg((int)query.rowsProcessed()); else buffer = tr("Query executed"); } else { toResultView *query = new toResultView(Current->parentWidget()); try { query->query((QString) QueryString, (toQList) param); if (query->query() && query->query()->rowsProcessed() > 0) buffer = tr("%1 rows processed").arg((int)query->query()->rowsProcessed()); else buffer = tr("Query executed"); Current->hide(); Current = query; Current->show(); } catch (...) { delete query; throw; } } addLog(QueryString, toConnection::exception(buffer), false); } catch (const QString &exc) { addLog(QueryString, exc, true); if (QMessageBox::question(this, tr("Direct Execute Error"), exc + "\n\n" + tr("Stop execution ('No' to continue)?"), QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) m_batchContinue = false; } } else { First = false; Timer.start(); stopAct->setEnabled(true); Poll.start(1000); Started->setToolTip(tr("Duration while query has been running\n\n") + QueryString); stopAct->setEnabled(true); Result->setNumberColumn(toConfigurationSingle::Instance().wsNumber()); // it fixes crash running statements from Schema Browser - PV if (ResultTab) ResultTab->setCurrentIndex(0); try { saveHistory(); Result->setSQL(QString::null); Result->query(QueryString, param); // if (CurrentTab) // { // todo // if(CurrentTab == Visualize) // Visualize->display(); // PV - let's open really required tab for called action // e.g. Plan for explainplan, Result for run statement action etc. // It stops to really run a statement when I expect explain plan // else // if (CurrentTab == Plan) // Plan->query(QueryString); // else if (CurrentTab == ResourceSplitter) // viewResources(); // } } catch (const toConnection::exception &exc) { addLog(QueryString, exc, true); } catch (const QString &exc) { addLog(QueryString, exc, true); } try { if (statisticAct->isChecked()) toRefreshParse(timer(), Refresh->currentText()); } TOCATCH Result->setSQLName(QueryString.simplified().left(40)); } } } void toWorksheet::saveHistory(void) { #if 0 // todo if (WorksheetTool.config(CONF_HISTORY, "").isEmpty()) return ; if (Result->firstChild() && Current == Result) { History[LastID] = Result; Result->hide(); Result->stop(); disconnect(Result, SIGNAL(done(void)), this, SLOT(queryDone(void))); disconnect(Result, SIGNAL(firstResult(const QString &, const toConnection::exception &, bool)), this, SLOT(addLog(const QString &, const toConnection::exception &, bool))); disconnect(stopAct, SIGNAL(clicked(void)), Result, SLOT(stop(void))); Result = new toResultTableView(Result->parentWidget()); if (statisticAct->isChecked()) enableStatistic(true); Result->show(); Current = Result; connect(stopAct, SIGNAL(clicked(void)), Result, SLOT(stop(void))); connect(Result, SIGNAL(done(void)), this, SLOT(queryDone(void))); connect(Result, SIGNAL(firstResult(const QString &, const toConnection::exception &, bool)), this, SLOT(addLog(const QString &, const toConnection::exception &, bool))); } #endif } QString toWorksheet::duration(int dur, bool hundreds) { char buf[100]; if (dur >= 3600000) { if (hundreds) sprintf(buf, "%d:%02d:%02d.%02d", dur / 3600000, (dur / 60000) % 60, (dur / 1000) % 60, (dur / 10) % 100); else sprintf(buf, "%d:%02d:%02d", dur / 3600000, (dur / 60000) % 60, (dur / 1000) % 60); } else { if (hundreds) sprintf(buf, "%d:%02d.%02d", dur / 60000, (dur / 1000) % 60, (dur / 10) % 100); else sprintf(buf, "%d:%02d", dur / 60000, (dur / 1000) % 60); } return QString::fromLatin1(buf); } void toWorksheet::addLog(const QString &sql, const toConnection::exception &result, bool error) { QString now = QDateTime::currentDateTime().toString(Qt::SystemLocaleDate); toResultViewItem *item = NULL; LastID++; int dur = 0; if (!Timer.isNull()) dur = Timer.elapsed(); First = true; if (Logging) { if (!toConfigurationSingle::Instance().wsLogMulti()) { if (!toConfigurationSingle::Instance().wsLogAtEnd()) item = new toResultViewItem(Logging, NULL); else item = new toResultViewItem(Logging, LastLogItem); } else if (!toConfigurationSingle::Instance().wsLogAtEnd()) item = new toResultViewMLine(Logging, NULL); else item = new toResultViewMLine(Logging, LastLogItem); item->setText(0, sql); LastLogItem = item; item->setText(1, result); item->setText(2, now); if (toConfigurationSingle::Instance().wsHistory()) item->setText(4, QString::number(LastID)); item->setText(5, QString::number(result.offset())); } if (result.offset() >= 0 && LastLine >= 0 && LastOffset >= 0 && toConfigurationSingle::Instance().wsMoveToErr()) { QChar cmp = '\n'; int lastnl = 0; int lines = 0; for (int i = 0;i < result.offset() && i < sql.length();i++) { if (sql.at(i) == cmp) { LastOffset = 0; lastnl = i + 1; lines++; } } Editor->setCursorPosition(LastLine + lines, LastOffset + result.offset() - lastnl); LastLine = LastOffset = -1; } QString buf = duration(dur); if (Logging) { item->setText(3, buf); toTreeWidgetItem *last = Logging->currentItem(); toResultViewItem *citem = NULL; if (last) citem = dynamic_cast(last); if (!citem || citem->allText(0) != sql) { disconnect(Logging, SIGNAL(selectionChanged(toTreeWidgetItem *)), this, SLOT(executeLog())); Logging->setSelected(item, true); connect(Logging, SIGNAL(selectionChanged(toTreeWidgetItem *)), this, SLOT(executeLog())); Logging->ensureItemVisible(item); } } { QString str = result; str += "\n" + tr("(Duration %1)").arg(buf); if (!error) toStatusMessage(str, false, false); } if (!error) { if(ResultTab) changeResult(ResultTab->indexOf(CurrentTab)); // the sql string will be trimmed but case will be same as the // original. the code originally compared the result return, but // that class doesn't know if a commit is needed either. static QRegExp re(QString::fromLatin1("^SELECT")); re.setCaseSensitivity(Qt::CaseInsensitive); try { if (!sql.contains(re)) { if (toConfigurationSingle::Instance().autoCommit()) connection().commit(); else toMainWidget()->setNeedCommit(connection()); } } TOCATCH; } saveDefaults(); } void toWorksheet::execute(toSQLParse::tokenizer &tokens, int line, int pos, execType type, toSQLParse::statement::statementClass sc) { LastLine = line; LastOffset = pos; int endLine, endCol; if (Editor->lines() <= tokens.line()) { endLine = Editor->lines() - 1; endCol = Editor->lineLength(endLine); } else { endLine = tokens.line(); if (Editor->lineLength(tokens.line()) <= tokens.offset()) endCol = Editor->lineLength(tokens.line()); else { endCol = tokens.offset(); } } Editor->setSelection(line, pos, endLine, endCol); QString t = Editor->selectedText(); bool comment = false; bool multiComment = false; int oline = line; int opos = pos; int i; // Remove empty space and the slash at the end of statement. // Note: slash is valid in oracle sqlplus only i = t.length() - 1; while ((i > 0) && ((t.at(i) == ' ') || (t.at(i) == '\r') || (t.at(i) == '\n') || (t.at(i) == '\t') || (t.at(i) == '/'))) i--; t.truncate(i + 1); for (i = 0;i < t.length() - 1;i++) { if (comment) { if (t.at(i).toLatin1() == '\n') comment = false; } else if (multiComment) { if (t.at(i).toLatin1() == '*' && t.at(i + 1).toLatin1() == '/') { multiComment = false; i++; } } else if (t.at(i).toLatin1() == '-' && t.at(i + 1).toLatin1() == '-') comment = true; else if (t.at(i).toLatin1() == '/' && t.at(i + 1).toLatin1() == '/') comment = true; else if (t.at(i).toLatin1() == '/' && t.at(i + 1).toLatin1() == '*') multiComment = true; else if (!t.at(i).isSpace() && t.at(i) != '/') break; if (t.at(i).toLatin1() == '\n') { line++; pos = 0; } else pos++; } if (line != oline || pos != opos) { LastLine = line; LastOffset = pos; Editor->setSelection(line, pos, endLine, endCol); t = t.mid(i); } if (t.trimmed().length()) query(t, type, sc); } void toWorksheet::unhideResults(const QString &, const toConnection::exception &, bool error) { if (!error && Result->model()->rowCount() > 0) unhideResults(); } void toWorksheet::unhideResults() { // move splitter if currently hidden if (EditSplitter->sizes()[1] == 0) EditSplitter->setSizes(EditSplitterSizes); } void toWorksheet::execute() { if (Editor->hasSelectedText()) { query(Editor->selectedText(), Normal, toSQLParse::statement::unknown); return; } toSQLParse::editorTokenizer tokens(Editor); int cpos, cline; Editor->getCursorPosition(&cline, &cpos); int line; int pos; toSQLParse::statement st; do { line = tokens.line(); pos = tokens.offset(); st = toSQLParse::parseStatement(tokens); } while (tokens.line() < cline || (tokens.line() == cline && tokens.offset() < cpos)); execute(tokens, line, pos, Normal, st.StatementClass); } // TODO: TS 2010-03-11 This function is the same as execute, just Normal->OnlyPlan. Should be optimised. void toWorksheet::explainPlan() { if (Editor->hasSelectedText()) { query(Editor->selectedText(), OnlyPlan, toSQLParse::statement::unknown); return ; } toSQLParse::editorTokenizer tokens(Editor); int cpos, cline; Editor->getCursorPosition(&cline, &cpos); int line; int pos; toSQLParse::statement st; do { line = tokens.line(); pos = tokens.offset(); st = toSQLParse::parseStatement(tokens); } while (tokens.line() < cline || (tokens.line() == cline && tokens.offset() < cpos)); execute(tokens, line, pos, OnlyPlan, st.StatementClass); } void toWorksheet::executeStep() { toSQLParse::editorTokenizer tokens(Editor); int cpos, cline; Editor->getCursorPosition(&cline, &cpos); int line; int pos; toSQLParse::statement st; do { line = tokens.line(); pos = tokens.offset(); st = toSQLParse::parseStatement(tokens); } while (tokens.line() < cline || (tokens.line() == cline && tokens.offset() <= cpos)); execute(tokens, line, pos, Normal, st.StatementClass); } void toWorksheet::executeAll() { toSQLParse::editorTokenizer tokens(Editor); int cpos, cline; Editor->getCursorPosition(&cline, &cpos); QProgressDialog dialog(tr("Executing all statements"), tr("Cancel"), 0, Editor->lines(), this); int line; int pos; bool ignore = true; m_batchContinue = true; do { line = tokens.line(); pos = tokens.offset(); dialog.setValue(line); qApp->processEvents(); if (dialog.wasCanceled()) break; toSQLParse::statement st = toSQLParse::parseStatement(tokens); if (ignore && (tokens.line() > cline || (tokens.line() == cline && tokens.offset() >= cpos))) { ignore = false; cline = line; cpos = pos; } if (tokens.line() < Editor->lines() && !ignore) { execute(tokens, line, pos, Direct, st.StatementClass); if (Current) { toResultView *last = dynamic_cast(Current); if (toConfigurationSingle::Instance().wsHistory() && last && last->firstChild()) History[LastID] = last; } } } while (m_batchContinue && (tokens.line() < Editor->lines())); Editor->setSelection(cline, cpos, tokens.line(), tokens.offset()); } void toWorksheet::parseAll() { toSQLParse::editorTokenizer tokens(Editor); int cpos, cline; Editor->getCursorPosition(&cline, &cpos); QProgressDialog dialog(tr("Parsing all statements"), tr("Cancel"), 0, Editor->lines(), this); int line; int pos; bool ignore = true; do { line = tokens.line(); pos = tokens.offset(); dialog.setValue(line); qApp->processEvents(); if (dialog.wasCanceled()) break; toSQLParse::statement st = toSQLParse::parseStatement(tokens); if (ignore && (tokens.line() > cline || (tokens.line() == cline && tokens.offset() >= cpos))) { ignore = false; cline = line; cpos = pos; } if (tokens.line() < Editor->lines() && !ignore) { execute(tokens, line, pos, Parse, st.StatementClass); if (Current) { toResultView *last = dynamic_cast(Current); if (toConfigurationSingle::Instance().wsHistory() && last && last->firstChild()) History[LastID] = last; } } } while (tokens.line() < Editor->lines()); Editor->setSelection(cline, cpos, tokens.line(), tokens.offset()); } void toWorksheet::eraseLogButton() { if (!Logging) return; Logging->clear(); LastLogItem = NULL; for (std::map::iterator i = History.begin();i != History.end();i++) delete(*i).second; History.clear(); } void toWorksheet::queryDone(void) { if (!First && !QueryString.isEmpty()) addLog(QueryString, toConnection::exception(tr("Aborted")), false); else emit executed(); try { timer()->stop(); } TOCATCH stopAct->setEnabled(false); Poll.stop(); stopAct->setEnabled(false); saveDefaults(); } void toWorksheet::saveDefaults(void) { #if 0 // todo toTreeWidgetItem *item = Result->firstChild(); if (item) { QTreeWidgetItem *head = Result->headerItem(); for (int i = 0;i < Result->columns();i++) { toResultViewItem *resItem = dynamic_cast(item); QString str; if (resItem) str = resItem->allText(i); else if (item) str = item->text(i); try { toParamGet::setDefault(connection(), head->text(i).lower(), toUnnull(toQValue(str))); } TOCATCH } } #endif } #define ENABLETIMED "ALTER SESSION SET TIMED_STATISTICS = TRUE" void toWorksheet::enableStatistic(bool ena) { if (ena) { Result->setStatistics(Statistics); ResultTab->setTabEnabled(ResultTab->indexOf(StatTab), true); statisticAct->setChecked(true); Statistics->clear(); if (toConfigurationSingle::Instance().wsTimedStats()) { try { connection().allExecute(QString::fromLatin1(ENABLETIMED)); connection().addInit(QString::fromLatin1(ENABLETIMED)); } TOCATCH; } } else { try { connection().delInit(QString::fromLatin1(ENABLETIMED)); } catch (...) {} Result->setStatistics(NULL); ResultTab->setTabEnabled(ResultTab->indexOf(StatTab), false); statisticAct->setChecked(false); } } void toWorksheet::executeNewline(void) { int cline, epos; Editor->getCursorPosition(&cline, &epos); if (cline > 0) cline--; while (cline > 0) { QString data = Editor->text(cline).simplified(); if (data.length() == 0 || data == QString::fromLatin1(" ")) { cline++; break; } cline--; } while (cline < Editor->lines()) { QString data = Editor->text(cline).simplified(); if (data.length() != 0 && data != QString::fromLatin1(" ")) break; cline++; } int eline = cline; while (eline < Editor->lines()) { QString data = Editor->text(eline).simplified(); if (data.length() == 0 || data == QString::fromLatin1(" ")) { eline--; break; } epos = Editor->text(eline).length(); eline++; } Editor->setSelection(cline, 0, eline, epos); LastLine = cline; LastOffset = 0; if (Editor->hasSelectedText()) query(Editor->selectedText(), Normal, toSQLParse::statement::unknown); } void toWorksheet::describe(void) { QString owner, table; Editor->tableAtCursor(owner, table); if (owner.isNull()) owner = Schema->currentText(); if (toConfigurationSingle::Instance().wsToplevelDescribe()) { toDescribe * d = new toDescribe(this); d->changeParams(owner, table); // d->show(); } else { unhideResults(); Columns->changeParams(owner, table); Columns->show(); Current = Columns; } } void toWorksheet::executeSaved(QAction *act) { QString sql = act->data().toString(); if(!sql.isEmpty()) { try { query(sql, Normal, toSQLParse::statement::unknown); } TOCATCH; } } void toWorksheet::insertSaved(QAction *act) { QString sql = act->data().toString(); if(!sql.isEmpty()) { Editor->setFocus(); Editor->insert(sql); } } void toWorksheet::showSaved() { SavedMenu->clear(); QSettings settings; settings.beginGroup("toWorksheet"); QList statements = settings.value("sql").toList(); QAction *last = 0; foreach(QVariant v, statements) { QAction *a = new QAction(v.toString().left(50), SavedMenu); a->setData(v.toString()); SavedMenu->insertAction(last, a); last = a; } } void toWorksheet::showInsertSaved() { InsertSavedMenu->clear(); QSettings settings; settings.beginGroup("toWorksheet"); QList statements = settings.value("sql").toList(); QAction *last = 0; foreach(QVariant v, statements) { QAction *a = new QAction(v.toString().left(50), InsertSavedMenu); a->setData(v.toString()); InsertSavedMenu->insertAction(last, a); last = a; } } void toWorksheet::removeSaved(QAction *action) { QSettings settings; settings.beginGroup("toWorksheet"); QList statements = settings.value("sql").toList(); statements.removeAll(action->data().toString()); settings.setValue("sql", statements); } void toWorksheet::saveLast() { if (QueryString.isEmpty()) { TOMessageBox::warning(this, tr("No SQL to save"), tr("You haven't executed any SQL yet"), tr("&Ok")); return; } QSettings settings; settings.beginGroup("toWorksheet"); QString sql = QueryString.trimmed(); if(!sql.endsWith(";")) sql += ";"; QList statements = settings.value("sql").toList(); if(statements.indexOf(sql) > -1) return; // already in list statements.append(sql); settings.setValue("sql", statements); } void toWorksheet::insertStatement(const QString &str) { QString txt = Editor->text(); int i = txt.indexOf(str); if (i >= 0) { int startCol, endCol; int startRow, endRow; Editor->findPosition(i, startRow, startCol); Editor->findPosition(i + str.length(), endRow, endCol); if (endCol < Editor->text(endRow).size()) { if (Editor->text(endRow).at(endCol) == ';') endCol++; } Editor->setSelection(startRow, startCol, endRow, endCol); } else { QString t = str; if (str.right(1) != ";") { t += ";"; } Editor->insert(t, true); } } void toWorksheet::executePreviousLog(void) { Result->stop(); LastLine = LastOffset = -1; saveHistory(); toTreeWidgetItem *item = Logging->currentItem(); if (item) { toTreeWidgetItem *pt = Logging->firstChild(); while (pt && pt->nextSibling() != item) pt = pt->nextSibling(); if (pt) Logging->setSelected(pt, true); } } void toWorksheet::executeLog(void) { Result->stop(); LastLine = LastOffset = -1; saveHistory(); toTreeWidgetItem *ci = Logging->currentItem(); toResultViewItem *item = dynamic_cast(ci); if (item) { insertStatement(item->allText(0)); if (item->text(4).isEmpty()) { if (toConfigurationSingle::Instance().wsExecLog()) query(item->allText(0), Normal, toSQLParse::statement::unknown); } else { std::map::iterator i = History.find(item->text(4).toInt()); QueryString = item->allText(0); changeResult(ResultTab->currentIndex()); if (i != History.end() && (*i).second) { Current->hide(); Current = (*i).second; Current->show(); } } } } void toWorksheet::executeNextLog(void) { Result->stop(); LastLine = LastOffset = -1; saveHistory(); toTreeWidgetItem *item = Logging->currentItem(); if (item && item->nextSibling()) { toResultViewItem *next = dynamic_cast(item->nextSibling()); if (next) Logging->setSelected(next, true); } } void toWorksheet::poll(void) { Started->setText(duration(Timer.elapsed(), false)); } void toWorksheet::saveStatistics(void) { std::map stat; Statistics->exportData(stat, "Stat"); IOChart->exportData(stat, "IO"); WaitChart->exportData(stat, "Wait"); if (Plan->firstChild()) Plan->exportData(stat, "Plan"); else toStatusMessage(tr("No plan available to save"), false, false); stat["Description"] = QueryString; toWorksheetStatistic::saveStatistics(stat); } void toWorksheet::exportData(std::map &data, const QString &prefix) { Editor->exportData(data, prefix + ":Edit"); if (statisticAct->isChecked()) data[prefix + ":Stats"] = Refresh->currentText(); toToolWidget::exportData(data, prefix); } void toWorksheet::importData(std::map &data, const QString &prefix) { Editor->importData(data, prefix + ":Edit"); QString stat = data[prefix + ":Stats"]; if (!stat.isNull()) { for (int i = 0;i < Refresh->count();i++) { if (Refresh->itemText(i) == stat) { Refresh->setCurrentIndex(i); break; } } statisticAct->setChecked(true); } else statisticAct->setChecked(false); toToolWidget::importData(data, prefix); setCaption(); } void toWorksheet::setCaption(void) { QString name = WorksheetTool.name(); QString filename; if (!Editor->filename().isNull() && !Editor->filename().isEmpty()) { QFileInfo file(Editor->filename()); filename = file.fileName(); } else filename = "Untitled"; name += (Editor->isModified() ? QString(" - *") : QString(" - ")) + filename; toToolCaption(this, name); } toWorksheet *toWorksheet::fileWorksheet(const QString &file) { QMdiSubWindow * w = new QMdiSubWindow(toMainWidget()->workspace()); toWorksheet *worksheet = new toWorksheet(w, toMainWidget()->currentConnection(), false); worksheet->editor()->openFilename(file); worksheet->setCaption(); w->setAttribute(Qt::WA_DeleteOnClose); w->setWidget(worksheet); w->setWindowIcon(QIcon(*WorksheetTool.toolbarImage())); toMainWidget()->workspace()->addSubWindow(w); w->show(); toMainWidget()->updateWindowsMenu(); return worksheet; } void toWorksheet::refreshSetup(void) { bool ok = false; int num = QInputDialog::getInteger(this, tr("Enter refreshrate"), tr("Refresh rate of query in seconds"), RefreshSeconds, 0, 1000000, 1, &ok); if (ok) { RefreshSeconds = num; RefreshTimer.start(num*1000); } else RefreshTimer.stop(); } void toWorksheet::stop(void) { RefreshTimer.stop(); Result->stop(); } void toWorksheet::createPopupMenu(const QPoint &pos) { if (!context) { context = new QMenu; context->addAction(executeAct); context->addAction(executeStepAct); context->addAction(executeAllAct); context->addAction(executeNewlineAct); context->addAction(refreshAct); context->addSeparator(); context->addAction(describeAct); context->addAction(explainAct); context->addSeparator(); context->addAction(toMainWidget()->getUndoAction()); context->addAction(toMainWidget()->getRedoAction()); context->addSeparator(); context->addAction(toMainWidget()->getCutAction()); context->addAction(toMainWidget()->getCopyAction()); context->addAction(toMainWidget()->getPasteAction()); context->addSeparator(); context->addAction(toMainWidget()->getSelectAllAction()); context->addSeparator(); context->addAction(stopAct); context->addSeparator(); context->addAction(SavedMenu->menuAction()); context->addAction(InsertSavedMenu->menuAction()); context->addAction(saveLastAct); } context->exec(QCursor::pos()); } void toWorksheet::changeConnection(void) { Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST)); if (toIsMySQL(connection())) Schema->setSelected(connection().database()); else if (toIsOracle(connection()) || toIsSapDB(connection())) Schema->setSelected(connection().user().toUpper()); else Schema->setSelected(connection().user()); } tora-2.1.3/src/totuning.h0000644000175000017500000001360411270353625015067 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOTUNING_H #define TOTUNING_H #include "config.h" #include "tobackground.h" #include "toresultline.h" #include "totool.h" #include "tothread.h" #include "ui_totuningoverviewui.h" #include #include #include #include #include #include #include class QAction; class QMenu; class QComboBox; class QWidget; class QLabel; class QTabWidget; class toBarChart; class toConnection; class toListView; class toNoBlockQuery; class toResultItem; class toResultLock; class toResultTableView; class toResultParam; class toResultStats; class toWaitEvents; class toTuningMiss : public toResultLine { public: toTuningMiss(QWidget *parent = 0, const char *name = 0); virtual std::list transform(std::list &trans); }; class toTuningFileIO : public QWidget { Q_OBJECT QWidget *TablespaceTime; QWidget *TablespaceReads; QWidget *FileTime; QWidget *FileReads; QString LastTablespace; double TblReads; double TblWrites; double TblReadBlk; double TblWriteBlk; double TblAvg; double TblMin; double TblMaxRead; double TblMaxWrite; toNoBlockQuery *Query; time_t CurrentStamp; time_t LastStamp; std::map ReadsCharts; std::map TimeCharts; std::map > LastValues; void saveSample(const QString &, const QString &, double reads, double writes, double readBlk, double writeBlk, double avgTim, double minTim, double maxRead, double maxWrite); void allocCharts(const QString &); toBackground Poll; public: toTuningFileIO(QWidget *parent = 0); ~toTuningFileIO(); void stop(void); void start(void); public slots: void refresh(void); void changeCharts(int val); void changeConnection(void); void poll(void); }; class toTuningOverview : public QWidget, public Ui::toTuningOverviewUI { Q_OBJECT bool Quit; toSemaphore Done; std::map Values; toConnection *Connection; toLock Lock; QString UnitString; struct overviewQuery : public toTask { toTuningOverview &Parent; overviewQuery(toTuningOverview &parent) : Parent(parent) { } virtual void run(void); void setValue(const QString &name, const QString &val); }; friend struct overviewQuery; toBackground Poll; std::list Backgrounds; void setupChart(toResultLine *chart, const QString &, const QString &, const toSQL &sql); void setValue(QLabel *label, const QString &val); public: toTuningOverview(QWidget *parent = 0, const char *name = 0, Qt::WFlags fl = 0); ~toTuningOverview(); void stop(void); void start(void); public slots: void refresh(void); void poll(void); }; class toTuning : public toToolWidget { Q_OBJECT QTabWidget *Tabs; toListView *Indicators; toResultParam *Parameters; toResultTableView *Options; toResultLock *BlockingLocks; toResultItem *Licenses; toResultStats *Statistics; toResultTableView *LibraryCache; toResultTableView *ControlFiles; toWaitEvents *Waits; QScrollArea *ChartContainer; QList Charts; QComboBox *Refresh; toTuningOverview *Overview; toTuningFileIO *FileIO; QWidget *LastTab; QMenu *ToolMenu; QAction *refreshAct; QAction *changeRefreshAct; QMenu *tabMenu; virtual void enableTab(const QString &name, bool enable); virtual QWidget *tabWidget(const QString &name); virtual void exportData(std::map &data, const QString &prefix); virtual void importData(std::map &data, const QString &prefix); public: toTuning(QWidget *parent, toConnection &connection); public slots: virtual void refresh(void); virtual void changeTab(int); virtual void changeRefresh(const QString &str); virtual void windowActivated(QMdiSubWindow *widget); virtual void showTabMenu(void); virtual void enableTabMenu(QAction *); }; #endif tora-2.1.3/src/tosplash.h0000644000175000017500000000432111270353625015051 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOSPLASH_H #define TOSPLASH_H #include #include class QLabel; class QProgressBar; class toSplash : public QWidget { QProgressBar *Progress; QLabel *Label; public: toSplash(QWidget *parent = 0, const char *name = 0, Qt::WFlags f = 0); ~toSplash(); QLabel* label(void); QProgressBar* progress(void); }; inline QLabel* toSplash::label(void) { return Label; } inline QProgressBar* toSplash::progress(void) { return Progress; } #endif tora-2.1.3/src/templates/0000755000175000017500000000000011445450571015043 5ustar michaelmichaeltora-2.1.3/src/templates/log4plsql.tpl0000755000175000017500000003265611270353625017522 0ustar michaelmichael1-loggin:= See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.1-initialisation:=Description: It is possible to initialize a log context with 1, 2 or 3 parameters.

1. The first section (use it for log a code name)
2. A specific log level for this context (use it when you want debug a specific part of you application )
3. A Boolean: TRUE for use a "Log out transactional" features FALSE if not.

If context is not initialized:
Section: dynamic pl/plsql call stack
Level: ERROR
Log in a transaction See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.1-initialisation:plog.init ;=Description: A standard
Exemple: pCTX PLOG.LOG_CTX := PLOG.init ; \n

prototype:\nfunction init( pSECTION IN TLOG.LSECTION%type, pLEVEL IN TLOG.LLEVEL%type, pUSE_PIPE IN BOOLEAN) RETURN LOG_CTX;\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.1-initialisation:plog.init(pSECTION);=Description: Without default parameter
Exemple: pCTX PLOG.LOG_CTX := PLOG.init ('firstSection'); \n

prototype:function init( pSECTION IN TLOG.LSECTION%type, pLEVEL IN TLOG.LLEVEL%type, pUSE_PIPE IN BOOLEAN)RETURN LOG_CTX;\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.1-initialisation:plog.init(pSECTION, pLEVEL);=Description: For debug mode
Exemple: pCTX PLOG.LOG_CTX := PLOG.init ('firstSection', PLOG.LDEBUG); \n

prototype:function init( pSECTION IN TLOG.LSECTION%type, pLEVEL IN TLOG.LLEVEL%type, pUSE_PIPE IN BOOLEAN)RETURN LOG_CTX;\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.1-initialisation:plog.init(pSECTION, pLEVEL, TRUE|FALSE);=Description: for "Log out transactional" features
Exemple: pCTX PLOG.LOG_CTX := PLOG.init ('firstSection', PLOG.LDEBUG, FALSE);\n

prototype:function init( pSECTION IN TLOG.LSECTION%type, pLEVEL IN TLOG.LLEVEL%type, pUSE_PIPE IN BOOLEAN)RETURN LOG_CTX;\n\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.2-use:=Description: LOG4PLSQL log level


plog.error('Text');  LERROR  The ERROR level designates error events that might still allow the application to continue running.
plog.warn ('Text');  LWARN  The WARN level designates potentially harmful situations
plog.info ('Text');  LINFO  The INFO level designates informational messages that highlight the progress of the application at coarse-grained level.
plog.debug('Text');  LDEBUG  The DEBUG Level designates fine-grained informational events that are most useful to debug an application.
Note: error>warn>info>debug


See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.2-use:plog.error('Log Text');=Description: The ERROR level designates error events that might still allow the application to continue running.\n
Exemple:plog.error('Text'); \n
prototype:procedure error( pTEXTE IN TLOG.LTEXTE%type);\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.2-use:plog.error(pCTX, 'Log Text');=Description: The ERROR level designates error events that might still allow the application to continue running.\n
Exemple:plog.error(pCTX, 'Text'); \n
prototype:procedure error( pCTX IN OUT NOCOPY LOG_CTX, pTEXTE IN TLOG.LTEXTE%type);\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.2-use:plog.warn('Log Text');=Description: The WARN level designates potentially harmful situations\n
Exemple: plog.warn('Text');\n
prototype:procedure warn( pTEXTE IN TLOG.LTEXTE%type);\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.2-use:plog.warn(pCTX, 'Log Text');=Description: The WARN level designates potentially harmful situations\n
Exemple: plog.warn(pCTX, 'Text');\n
prototype:procedure warn( pCTX IN OUT NOCOPY LOG_CTX, pTEXTE IN TLOG.LTEXTE%type);\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.2-use:plog.info('Log Text');=Description: The INFO level designates informational messages that highlight the progress of the application at coarse-grained level.\n
Exemple: plog.info('Text');\n
prototype:procedure info( pTEXTE IN TLOG.LTEXTE%type);\n\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.2-use:plog.info(pCTX, 'Log Text');=Description: The INFO level designates informational messages that highlight the progress of the application at coarse-grained level.\n
Exemple: plog.info(pCTX, 'Text');\n
prototype:procedure info( pCTX IN OUT NOCOPY LOG_CTX, pTEXTE IN TLOG.LTEXTE%type);\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.2-use:plog.debug('Log Text');=Description: The DEBUG Level designates fine-grained informational events that are most useful to debug an application.\n
Exemple: plog.debug('Text');\n
prototype:procedure debug( pTEXTE IN TLOG.LTEXTE%type);\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.2-use:plog.debug(pCTX, 'Log Text');=Description: The DEBUG Level designates fine-grained informational events that are most useful to debug an application.\n
Exemple: plog.debug(pCTX, 'Text');\n
prototype:procedure debug( pCTX IN OUT NOCOPY LOG_CTX, pTEXTE IN TLOG.LTEXTE%type);\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.3-Dynamique Parameter:=See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.3-Dynamique Parameter:Level Management:=It is possible to dynamically increase with setLevel the level of log. A call to setLevel without parameter repositions the levels has that specified in the package.
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.3-Dynamique Parameter:Level Management:plog.getLevel(pCTX);=Description: return a level.\n
Exemple: PLOG.getLevel(pCTX);\n
prototype:function getLevel( pCTX IN OUT NOCOPY LOG_CTX);\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.3-Dynamique Parameter:Level Management:plog.setLevel(pCTX, PLOG.LLEVEL);=Description: increase a current level, it nice for debug a code part.\n
Exemple: PLOG.setLevel (pCTX, PLOG.LDEBUG);\n
prototype:procedure setLevel( pCTX IN OUT NOCOPY LOG_CTX, pLEVEL IN TLOG.LLEVEL%type);\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.3-Dynamique Parameter:Section Management:=By default a section is a PL/SQL call stack. By is possible to specify a hierarchical log node.
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.3-Dynamique Parameter:Section Management:plog.getSection(pCTX);=Description: Retrun a section string.\n
Exemple: PLOG.getSection(pCTX);\n
prototype:function getSection( pCTX IN OUT NOCOPY LOG_CTX);\n\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.3-Dynamique Parameter:Section Management:plog.setBeginSection(pCTX, 'NewSubSectionName');=Description: for create a new node in hierarchy.\n
Exemple: PLOG.SetBeginSection (pCTX, 'Test1');\n
prototype:procedure setBeginSection( pCTX IN OUT NOCOPY LOG_CTX, pSECTION IN TLOG.LSECTION%type);\n\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.3-Dynamique Parameter:Section Management:plog.setEndSection(pCTX, 'EndEDSubSectionName')=Description: for close a node in hierarchy.\n
Exemple: PLOG.SetEndSection (pCTX, 'Test1');\n
prototype:procedure setEndSection( pCTX IN OUT NOCOPY LOG_CTX, pSECTION IN TLOG.LSECTION%type);\n\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.3-Dynamique Parameter:Transaction Management:=Log in transaction have some problems:
- If you rollback a transaction you log message is rollback in same time
- If you code is very long operation isn't possible to view a progression.

LOG4PLSQL have features that bypass a transactional problem. This features use a DBMS_PIPE oracle package for logging a message.See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.3-Dynamique Parameter:Transaction Management:plog.getTransactionMode(pCTX);=Description: return a Boolean TRUE if your use "Log out transactional" features FALSE if not. \n
Exemple: PLOG.getTransactionMode(pCTX);\n
prototype:function getTransactionMode( pCTX IN OUT NOCOPY LOG_CTX);\n\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 1-loggin:1.3-Dynamique Parameter:Transaction Management:plog.setTransactionMode(pCTX, TRUE|FALSE);=Description: For set transactional mode (TRUE: Log out transactional, FALSE: Log in transaction).\n
Exemple: PLOG.setTransactionMode(pCTX,FALSE);\n
prototype:procedure setTransactionMode( pCTX IN OUT NOCOPY LOG_CTX, inTransaction IN boolean);\n\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 2-administration:=See:LOG4PLSQL : http://log4plsql.sourceforge.net 2-administration:background process:=See:LOG4PLSQL : http://log4plsql.sourceforge.net 2-administration:background process:plog.background_Log;=Description: Start a pl/sql background_Log.\n
Exemple: exec plog.background_Log;\n
prototype:procedure background_Log( timeout IN INTEGER);\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 2-administration:background process:plog.background_Log_stop;=Description: Stop a pl/sql backgroud_Log.\n
Exemple: exec PLOG.background_Log_stop;\n
prototype:procedure background_Log_stop;\n\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 2-administration:purge:=Clean database log table
See:LOG4PLSQL : http://log4plsql.sourceforge.net 2-administration:purge:plog.purge=Description: \n
Exemple: PLOG.purge ;\n
prototype:procedure purge\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 2-administration:purge:plog.purge(pCTX );=Description: \n
Exemple: PLOG.purge (pCTX);\n
prototype:procedure purge( pCTX IN OUT NOCOPY LOG_CTX);\n\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net 2-administration:purge:plog.purge(pCTX, TheDate );=Description: delete a last week log \n
Exemple: PLOG.purge (pCTX, sysdate - 7 );\n
prototype:procedure purge( pCTX IN OUT NOCOPY LOG_CTX, theDate DATE);\n\n\n
See:LOG4PLSQL : http://log4plsql.sourceforge.net tora-2.1.3/src/templates/completion.api0000644000175000017500000001712411270353625017712 0ustar michaelmichaelABORT ACCESS ACCESSED ACCOUNT ACTIVATE ADD ADMIN ADMINISTER ADMINISTRATOR ADVISE AFTER ALGORITHM ALL ALLOCATE ALLOW ALL_ROWS ALTER ALWAYS ANALYZE ANCILLARY AND ANY APPLY ARCHIVE ARCHIVELOG ARRAY AS ASC ASSOCIATE AT ATTRIBUTE ATTRIBUTES AUDIT AUTHENTICATED AUTHID AUTHORIZATION AUTO AUTOALLOCATE AUTOEXTEND AUTOMATIC BACKUP BECOME BEFORE BEGIN BEHALF BETWEEN BFILE BINDING BITMAP BITS BLOB BLOCK BLOCKSIZE BLOCK_RANGE BODY BOTH BOOLEAN BOUND BROADCAST BUFFER_POOL BUILD BULK BY BYTE CACHE CACHE_INSTANCES CALL CANCEL CASCADE CASE CAST CATEGORY CERTIFICATE CFILE CHAINED CHANGE CHAR CHARACTER CHAR_CS CHECK CHECKPOINT CHILD CHOOSE CHUNK CLEAR CLOB CLONE CLOSE CLOSE_CACHED_OPEN_CURSORS CLUSTER COALESCE COLLECT COLUMN COLUMNS COLUMN_VALUE COMMENT COMMIT COMMITTED COMPATIBILITY COMPILE COMPLETE COMPOSITE_LIMIT COMPRESS COMPUTE CONFORMING CONNECT CONNECT_TIME CONSIDER CONSISTENT CONSTRAINT CONSTRAINTS CONTAINER CONTENTS CONTEXT CONTINUE CONTROLFILE CONVERT CORRUPTION COST CPU_PER_CALL CPU_PER_SESSION CREATE CREATE_STORED_OUTLINES CROSS CUBE CURRENT CURRENT_DATE CURRENT_SCHEMA CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CURSOR_SPECIFIC_SEGMENT CYCLE DANGLING DATA DATABASE DATAFILE DATAFILES DATAOBJNO DATE DATE_MODE DBA DBTIMEZONE DDL DEALLOCATE DEBUG DEC DECIMAL DECLARE DECODE DEFAULT DEFERRABLE DEFERRED DEFINED DEFINER DEGREE DELAY DELETE DEMAND DENSE_RANK DEREF DESC DETACHED DETERMINES DICTIONARY DIMENSION DIRECTORY DISABLE DISASSOCIATE DISCONNECT DISMOUNT DISPATCHERS DISTINCT DISTINGUISHED DISTRIBUTED DML DOUBLE DROP DUMP DYNAMIC EACH ELEMENT ELSE ELSIF ENABLE ENCRYPTED ENCRYPTION END ENFORCE ENTRY ERROR_ON_OVERLAP_TIME ESCAPE ESTIMATE EVENTS EXCEPT EXCEPTION EXCEPTIONS EXCHANGE EXCLUDING EXCLUSIVE EXECUTE EXEMPT EXISTS EXIT EXPIRE EXPLAIN EXPLOSION EXTEND EXTENDS EXTENT EXTENTS EXTERNAL EXTERNALLY EXTRACT FAILED_LOGIN_ATTEMPTS FALSE FAST FILE FILTER FINAL FINISH FIRST FIRST_ROWS FLAGGER FLOAT FLOB FLUSH FOLLOWING FOR FORCE FOREIGN FREELIST FREELISTS FRESH FROM FULL FUNCTION FUNCTIONS GENERATED GLOBAL GLOBALLY GLOBAL_NAME GLOBAL_TOPIC_ENABLED GRANT GROUP GROUPS GUARD HASH HASHKEYS HAVING HEADER HEAP HIERARCHY HOUR IDENTIFIED IDENTIFIER IDGENERATORS IDLE_TIME IF IMMEDIATE IN INCLUDING INCREMENT INCREMENTAL INDEX INDEXED INDEXES INDEXTYPE INDEXTYPES INDICATOR INITIAL INITIALIZED INITIALLY INITRANS INNER INSERT INSTANCE INSTANCES INSTANTIABLE INSTEAD INT INTEGER INTEGRITY INTERMEDIATE INTERNAL_CONVERT INTERNAL_USE INTERSECT INTERVAL INTO INVALIDATE IN_MEMORY_METADATA IS ISOLATION ISOLATION_LEVEL JAVA JOIN KEEP KERBEROS KEY KEYFILE KEYS KEYSIZE KILL LABEL LAST LATERAL LAYER LDAP_REGISTRATION LDAP_REGISTRATION_ENABLED LDAP_REG_SYNC_INTERVAL LEADING LEFT LESS LEVEL LEVELS LIBRARY LIKE LIKE2 LIKE4 LIKEC LIMIT LINK LIST LOB LOCAL LOCALTIME LOCALTIMESTAMP LOCATION LOCATOR LOCK LOCKED LOG LOGFILE LOGGING LOGICAL LOGICAL_READS_PER_CALL LOGICAL_READS_PER_SESSION LOGOFF LOGON LONG LOOP MANAGE MANAGED MANAGEMENT MANUAL MAPPING MASTER MATCHED MATERIALIZED MAXARCHLOGS MAXDATAFILES MAXEXTENTS MAXINSTANCES MAXLOGFILES MAXLOGHISTORY MAXLOGMEMBERS MAXSIZE MAXTRANS MAXVALUE MEMBER MEMORY MERGE METHOD MINEXTENTS MINIMIZE MINIMUM MINUS MINVALUE MLSLABEL MODE MODIFY MONITORING MOUNT MOVE MOVEMENT MTS_DISPATCHERS MULTISET NAMED NCHAR NCHAR_CS NCLOB NEEDED NESTED NESTED_TABLE_ID NETWORK NEVER NEXT NLS_CALENDAR NLS_CHARACTERSET NLS_COMP NLS_CURRENCY NLS_DATE_FORMAT NLS_DATE_LANGUAGE NLS_ISO_CURRENCY NLS_LANG NLS_LANGUAGE NLS_LENGTH_SEMANTICS NLS_NCHAR_CONV_EXCP NLS_NUMERIC_CHARACTERS NLS_SORT NLS_SPECIAL_CHARS NLS_TERRITORY NO NOARCHIVELOG NOAUDIT NOCACHE NOCOMPRESS NOCOPY NOCYCLE NODELAY NOFORCE NOLOGGING NOMAPPING NOMAXVALUE NOMINIMIZE NOMINVALUE NOMONITORING NONE NOORDER NOOVERRIDE NOPARALLEL NORELY NORESETLOGS NOREVERSE NORMAL NOROWDEPENDENCIES NOSEGMENT NOSORT NOSWITCH NOT NOTHING NOVALIDATE NOWAIT NULL NULLS NUMBER NUMERIC NVARCHAR2 OBJECT OBJNO OBJNO_REUSE OF OFF OFFLINE OID OIDINDEX OLD ON ONLINE ONLY OPAQUE OPCODE OPEN OPERATOR OPTIMAL OPTIMIZER_GOAL OPTION OR ORDER ORGANIZATION OTHERS OUT OUTER OUTLINE OVER OVERFLOW OVERLAPS OWN PACKAGE PACKAGES PARALLEL PARAMETERS PARENT PARTITION PARTITIONS PARTITION_HASH PARTITION_LIST PARTITION_RANGE PASSWORD PASSWORD_GRACE_TIME PASSWORD_LIFE_TIME PASSWORD_LOCK_TIME PASSWORD_REUSE_MAX PASSWORD_REUSE_TIME PASSWORD_VERIFY_FUNCTION PCTFREE PCTINCREASE PCTTHRESHOLD PCTUSED PCTVERSION PERCENT PERMANENT PFILE PHYSICAL PLAN PLSQL_DEBUG POLICY POST_TRANSACTION PRAGMA PREBUILT PRECEDING PRECISION PREPARE PRESERVE PRIMARY PRIOR PRIVATE PRIVATE_SGA PRIVILEGE PRIVILEGES PROCEDURE PROFILE PROTECTED PUBLIC PURGE PX_GRANULE QUERY QUEUE QUIESCE QUOTA RANDOM RANGE RAW RBA READ READS REAL REBUILD RECORDS_PER_BLOCK RECOVER RECOVERABLE RECOVERY RECYCLE REDUCED REF REFERENCES REFERENCING REFRESH REGISTER REJECT REKEY RELATIONAL RELY RENAME REPLACE RESET RESETLOGS RESIZE RESOLVE RESOLVER RESOURCE RESTRICT RESTRICTED RESUMABLE RESUME RETURN RETURNING REUSE REVERSE REVOKE REWRITE RIGHT ROLE ROLES ROLLBACK ROLLUP ROWDEPENDENCIES ROWID ROWNUM ROWS ROWTYPE RULE SAMPLE SAVEPOINT SB4 SCAN SCAN_INSTANCES SCHEMA SCN SCOPE SD_ALL SD_INHIBIT SD_SHOW SECURITY SEGMENT SEG_BLOCK SEG_FILE SELECT SELECTIVITY SEQUENCE SEQUENCED SERIALIZABLE SERVERERROR SESSION SESSIONS_PER_USER SESSIONTIMEZONE SESSIONTZNAME SESSION_CACHED_CURSORS SET SETS SHARE SHARED SHARED_POOL SHRINK SHUTDOWN SIBLINGS SINGLE SINGLETASK SIZE SKIP SKIP_UNUSABLE_INDEXES SMALLINT SNAPSHOT SOME SORT SOURCE SPACE SPECIFICATION SPFILE SPLIT SQL_TRACE STANDBY START STARTUP STATEMENT_ID STATIC STATISTICS STOP STORAGE STORE STRUCTURE SUBPARTITION SUBPARTITIONS SUBPARTITION_REL SUBSTITUTABLE SUCCESSFUL SUMMARY SUPPLEMENTAL SUSPEND SWITCH SWITCHOVER SYNONYM SYSDATE SYSDBA SYSOPER SYSTEM SYSTIMESTAMP SYS_OP_BITVEC SYS_OP_COL_PRESENT SYS_OP_ENFORCE_NOT_NULL$ SYS_OP_MINE_VALUE SYS_OP_NOEXPAND SYS_OP_NTCIMG$ TABLE TABLES TABLESPACE TABLESPACE_NO TABNO TEMPFILE TEMPORARY THAN THEN THREAD THROUGH TIMEOUT TIMESTAMP TIMEZONE_ABBR TIMEZONE_HOUR TIMEZONE_MINUTE TIMEZONE_REGION TIME_ZONE TO TOPLEVEL TRACE TRACING TRAILING TRANSACTION TRANSITIONAL TREAT TRIGGER TRIGGERS TRUE TRUNCATE TX TYPE TYPES TZ_OFFSET UB2 UBA UID UNARCHIVED UNBOUND UNBOUNDED UNDER UNDO UNIFORM UNION UNIQUE UNLIMITED UNLOCK UNPROTECTED UNQUIESCE UNRECOVERABLE UNTIL UNUSABLE UNUSED UPDATABLE UPDATE UPD_INDEXES UPD_JOININDEX UPGRADE UROWID USAGE USE USER_DEFINED USE_PRIVATE_OUTLINES USE_STORED_OUTLINES USING VALIDATE VALIDATION VALUES VARCHAR VARCHAR2 VARRAY VARYING VIEW WAIT WHEN WHENEVER WHERE WHILE WITH WITHIN WITHOUT WORK WRITE XID XMLSCHEMA XMLTYPE ZONE COVAR_POP COVAR_SAMP GROUPING MAX MIN REGR_AVGX REGR_AVGY REGR_COUNT REGR_INTERCEPT REGR_R2 REGR_SLOPE REGR_SXX REGR_SXY REGR_SYY STDDEV STDDEV_POP STDDEV_SAMP SUM VARIANCE VAR_POP VAR_SAMP AVG CORR COUNT COVAR_POP COVAR_SAMP CUME_DIST DENSE_RANK FIRST_VALUE LAG LAST_VALUE LEAD MAX MIN NTILE PERCENT_RANK RANK RATIO_TO_REPORT REGR_AVGX REGR_AVGY REGR_COUNT REGR_INTERCEPT REGR_R2 REGR_SLOPE REGR_SXX REGR_SXY REGR_SYY ROW_NUMBER STDDEV STDDEV_POP STDDEV_SAMP SUM VARIANCE VAR_POP VAR_SAMP CHR CONCAT INITCAP LOWER LPAD LTRIM NLSSORT NLS_INITCAP NLS_LOWER NLS_UPPER REPLACE RPAD RTRIM SOUNDEX SUBSTR SUBSTRB TRANSLATE TRIM UPPER ASCII INSTR INSTRB LENGTH LENGTHB CHARTOROWID CONVERT HEXTORAW NUMTODSINTERVAL NUMTOYMINTERVAL RAWTOHEX ROWIDTOCHAR TO_CHAR TO_DATE TO_LOB TO_MULTI_BYTE TO_NUMBER TO_SINGLE_BYTE TRANSLATE ADD_MONTHS LAST_DAY MONTHS_BETWEEN NEW_TIME NEXT_DAY ROUND TRUNC BFILENAME DUMP EMPTY_BLOB EMPTY_CLOB GREATEST LEAST NLS_CHARSET_DECL_LEN NLS_CHARSET_ID NLS_CHARSET_NAME NVL NVL2 SYS_CONTEXT SYS_GUID USERENV VSIZE ABS ACOS ADD_MONTHS ASIN ATAN ATAN2 BITAND CEIL COS COSH EXP FLOOR LN LOG MOD POWER ROUND SIGN SIN SINH SQRT TAN TANH TRUNC DEREF MAKE_REF REF REFTOHEX VALUEtora-2.1.3/src/templates/hints.tpl0000644000175000017500000002516511270353625016720 0ustar michaelmichaelAccess Methods:= Access Methods:/*+ AND_EQUAL(table index index[ index]) */=Specify an explicit access path for joining one or more tables where the source table is specified by table and the other indexes specifies an index to use for joining adjacent tables. Any number of indexes can be specified. Access Methods:/*+ CLUSTER(table) */=Instruct Oracle to use a cluster scan to access the table named table. Only applies to clustered tables. The tablename can also indicate an alias in the query. Access Methods:/*+ FULL(table) */=Instruct Oracle to use a full tablescan when accessing the table named table. The tablename can also indicate an alias in the query. Access Methods:/*+ HASH(table) */=Instruct Oracle to use a hash scan to access the table named table. Only applies to clustered tables. The tablename can also indicate an alias in the query. Access Methods:/*+ INDEX(table[ index]) */=Instruct Oracle to use an index optionally specified by index when accessing the table named table. The tablename can also indicate an alias in the query. You can also specify several indexes in which case the optimizer tries to find the best on to use. Access Methods:/*+ INDEX_ASC(table[ index]) */=Instruct Oracle to use an index optionally specified by index when accessing the table named table. The items found by the index will then be accessed in ascending order in a range scan. Since this is the default behaviour of Oracle this hint normally doesn't specify anything more than the INDEX hint. The tablename can also indicate an alias in the query. You can also specify several indexes in which case the optimizer tries to find the best on to use. Access Methods:/*+ INDEX_COMBINE(table[ index]) */=Instruct Oracle to use a bitmap index optionally specified by index when accessing the table named table. The tablename can also indicate an alias in the query. You can also specify several indexes in which case the optimizer tries to find the best on to use. Access Methods:/*+ INDEX_DESC(table[ index]) */=Instruct Oracle to use an index optionally specified by index when accessing the table named table. The items found by the index will then be accessed in descending order in a range scan. The tablename can also indicate an alias in the query. You can also specify several indexes in which case the optimizer tries to find the best on to use. Access Methods:/*+ INDEX_FFS(table[ index]) */=Instruct Oracle to use a fast full indexscan when accessing the table named table insteaf of doing a full tablespace. The tablename can also indicate an alias in the query. Access Methods:/*+ INDEX_JOIN(table[ index]) */=Instruct Oracle to use an index join as an access path in a join. Indexes used are optionally specified by index when accessing the table named table. The tablename can also indicate an alias in the query. You can also specify several indexes in which case the optimizer tries to find the best on to use. Access Methods:/*+ NOREWRITE */=Specify the optimizer to never use a materialized. Access Methods:/*+ NO_EXPAND */=Never transform queries using the OR operator to a UNION ALL statement. Access Methods:/*+ NO_INDEX(table[ index]) */=Instruct Oracle not to use an index optionally specified by index when accessing the table named table. The tablename can also indicate an alias in the query. You can also specify several indexes in which case the optimizer tries to find the best on to use. Any index specified tells the optimizer not to use that index, if no index is specified no indexes at all are considered for access to the table. Access Methods:/*+ REWRITE(view) */=Specify the optimizer to always use a materialized view speicified by view. Several views can be specified. Access Methods:/*+ ROWID(table) */=Instruct Oracle to use a rowid when accessing the table named table. The tablename can also indicate an alias in the query. Access Methods:/*+ USE_CONCAT */=Instruct the optimizer to always transform queries using the OR operator to a UNION ALL statement. Additional Hints:/*+ CACHE(table) */=Specify that the table specified by table should be placed at the most recent end of the LRU. Additional Hints:/*+ MERGE(view) */=Perform merging of a view specified by view containing a GROUP BY statement. This is only done explicitly since otherwise the optimizer will use another approach to perform the query. Additional Hints:/*+ NOCACHE(table) */=Specify that the table specified by table should be placed at the oldest end of the LRU meaning that it will be flushed from memory first after additional disc accesses. Additional Hints:/*+ NO_MERGE(view) */=Don't perform merging of a view specified by view containing a GROUP BY statement. Additional Hints:/*+ NO_PUSH_PRED(view) */=Don't push a join predicate into the view specified by view. Additional Hints:/*+ NO_UNNEST */=Don't unnest nested subqueries into the main body of the query. Additional Hints:/*+ ORDERED_PREDICATES */=The ORDERED_PREDICATES hint forces the optimizer to preserve the order of predicate evaluation, except for predicates used as index keys.\n Additional Hints:/*+ PUSH_PRED(view) */=Use the PUSH_PRED hint to force pushing of a join predicate into the view specified by view. Additional Hints:/*+ PUSH_SUBQ */=Force unnested subqueries to be performed first in the execution of the query, Additional Hints:/*+ STAR_TRANSFORMATION */=The STAR_TRANSFORMATION hint makes the optimizer use the best plan in which star transformation has been used.\n Additional Hints:/*+ UNNEST */=If specified nested subqueries are unnested into the main body of the query. Join Operators:/*+ DRIVING_SITE(table) */=This hint can be used to force the optimizer to choose a specific driving site to perform the query in a distributed server specified by table. Join Operators:/*+ HASH_AJ */=Use a anti hash join to perform an anti join. Should be specified in the subquery getting the resultset that should not be matched by the IN operator.

\n

\nSELECT COUNT(1) FROM user_tables a\n WHERE table_name NOT IN \n       (SELECT /*+ HASH_AJ */ table_name\n          FROM user_indexes b\n         WHERE a.table_name = b.table_name);\n
Join Operators:/*+ HASH_SJ */=Use a hash semi join. Should be specified in the subquery getting the resultset for the semi join.

\n

\nSELECT COUNT(1) FROM user_tables a\n WHERE EXISTS \n       (SELECT /*+ HASH_SJ */ 'X'\n          FROM user_indexes b\n         WHERE a.table_name = b.table_name);\n
Join Operators:/*+ LEADING(table) */=This hint can be used to force the optimizer to choose a specific leading table in a joined statement specified by table as a basis to perform the rest of the optimizations. Join Operators:/*+ MERGE_AJ */=Use a anti merge join to perform an anti join. Should be specified in the subquery getting the resultset that should not be matched by the IN operator.

\n

\nSELECT COUNT(1) FROM user_tables a\n WHERE table_name NOT IN \n       (SELECT /*+ MERGE_AJ */ table_name\n          FROM user_indexes b\n         WHERE a.table_name = b.table_name);\n
Join Operators:/*+ MERGE_SJ */=Use a merge semi join. Should be specified in the subquery getting the resultset for the semi join.

\n

\nSELECT COUNT(1) FROM user_tables a\n WHERE EXISTS \n       (SELECT /*+ MERGE_SJ */ 'X'\n          FROM user_indexes b\n         WHERE a.table_name = b.table_name);\n
Join Operators:/*+ USE_HASH(table[ table]) */=Specify to the optimizer to join the tables using a row source with a hash join from the first table to the next table. Any number of tables can be specified. Join Operators:/*+ USE_MERGE(table[ table]) */=Specify to the optimizer to join the tables using a row source with a sort-merge join from the first table to the next table. Any number of tables can be specified. Join Operators:/*+ USE_NL(table[ table]) */=Specify to the optimizer to join the tables using a nested loop join from the first table to the next table. Any number of tables can be specified. Join Order:/*+ ORDERED */=Indicate to the optimizer that the join order should be the same as the tables are specified in the FROM clause of the select. Join Order:/*+ STAR */=Indicate to the optimizer to use a star join to perform the query. This means that the query should start with the largest table, then move to the second largest etc... Optimizer Goals:/*+ ALL_ROWS */=Instruct optimizer to optimize for resource consumption. This means that it should try to finish the entire query as soon as posible instead of trying to get a part of the result as soon as posible. Optimizer Goals:/*+ CHOOSE */=Instruct the optimizer to use a CHOOSE approach which means to use COST if analyzed statistics is available and otherwise use RULE. Optimizer Goals:/*+ FIRST_ROWS */=Instruct the optimizer to optimize for response time of first row in result. Optimizer Goals:/*+ RULE */=Use a rulebased approach to optimization. Parallel Execution:/*+ APPEND */=When inserting data into a table always add data to the end of the table instead of checking for free space in the table. This is default when using parallel queries but can be overridden using the NOAPPEND hint. Parallel Execution:/*+ NOAPPEND */=Override append mode and start looking for free allocated space already in the table. Parallel Execution:/*+ NOPARALLEL(table) */=Don't use parallel queries to read the table specified by table. Parallel Execution:/*+ NOPARALLEL_INDEX(table index) */=Don't use parallel execution when accessing the index specified by table and index. You can specify several indexes by separating them with ,. Parallel Execution:/*+ PARALLEL(table[,degree[,split]]) */=Specify how to split a query over parallel queries for a table specified by table. The degree specifies the degree of parallelism on the table and the split specifies how the query should be split among available instances. Parallel Execution:/*+ PARALLEL_INDEX(table index degree split) */=Specify how to split an access to an index over parallel queries for a table specified by table and index. The degree specifies the degree of parallelism on the table and the split specifies how the query should be split among available instances. Several indexes, degrees and split can specified by separating them by ,. Parallel Execution:/*+ PQ_DISTRIBUTE(table,outer,inner) */=See using optimizer hints in Designing and Tuning for Performance available from Oracle for more information about this hint. tora-2.1.3/src/templates/sqlfunctions.tpl0000644000175000017500000015757211354412714020331 0ustar michaelmichaelAggregate Functions:COVAR_POP ( expr1 , expr2 )=Get the population covariance of a set of pairs.

\n\nPairs where either expr1 or expr2 are eliminated first. Then the following\ncalculation is performed:\n\n

\n(SUM(expr1 * expr2) - SUM(expr2) * SUM(expr1) / n) / n\n
\n\nThe function returns a number, if applied to an empty set NULL is returned.

\nExample:\n

\nSELECT itemid,COVAR_POP(amount,profit) FROM saleitems GROUP BY itemid;\n\n    ITEMID COVAR_POP(AMOUNT,PROFIT)\n---------- ------------------------\n         1                    84000\n         2                   5062.5\n         3                   325000\n         4               4111.11111\n
Aggregate Functions:COVAR_SAMP ( expr1 , expr2 )=Get the sample covariance of a set of pairs.

\n\nPairs where either expr1 or expr2 are eliminated first. Then the following\ncalculation is performed:\n\n

\n(SUM(expr1 * expr2) - SUM(expr2) * SUM(expr1) / n) / (n - 1)\n
\n\nThe function returns a number, if applied to an empty set NULL is returned.

\nExample:\n

\nSELECT itemid,COVAR_SAMP(amount,profit) FROM saleitems GROUP BY itemid;\n\n    ITEMID COVAR_POP(AMOUNT,PROFIT)\n---------- ------------------------\n         1                    84000\n         2                   5062.5\n         3                   325000\n         4               4111.11111\n
Aggregate Functions:GROUPING ( expr )=This function is only useful in select statements with a group by extension such as ROLLUP\nor CUBE. These function generate extra rows with nulls which is the group by aggregate.\nThis function can be use to distinguish these rows from rows that are actually null.

\nThe expr must match a group by expression. If the expr is a null that represent an\naggregate row this function returns 1, otherwise it returns 0.

\nExample:\n

\nSELECT DECODE(GROUPING(itemid),1,'Total',itemid) item,\n       SUM(amount) amount,\n       SUM(profit) profit\n  FROM saleitems\n GROUP BY ROLLUP (itemid);\n\nITEM  AMOUNT PROFIT\n----- ------ ------\n1      12000   2200\n2       2760    195\n3      10000   2200\n4       1300    170\nTotal  26060   4765\n
Aggregate Functions:MAX( expr )=Get the largest value of expr.

\nExample:\n

\nSELECT MAX(amount) FROM saleitems;\n\nMAX(AMOUNT)\n-----------\n       4000\n
Aggregate Functions:MIN ( expr )=Get the smallest value of expr.

\nExample:\n

\nSELECT MIN(amount) FROM saleitems;\n\nMIN(AMOUNT)\n-----------\n        240\n
Aggregate Functions:REGR_AVGX ( expr1 , expr2 )=Pairs where either expr1 or expr2 are eliminated to begin with. Then the following function is calculated:\n
\nAVG ( expr2 )\n
\nExample:

\n

\nSELECT TRUNC((SYSDATE - saledate) / 7) WEEK,\n       REGR_AVGX ( SYSDATE - saledate , amount )\n  FROM sales , saleitems\n WHERE sales.saleid = saleitems.saleid\n GROUP BY TRUNC((SYSDATE - saledate) / 7);\n\n      WEEK REGR_AVGX(SYSDATE-SALEDATE,AMOUNT)\n---------- ----------------------------------\n         0                               1280\n         8                                500\n        10                                300\n        13                         3333.33333\n        15                               1360\n        73                               1000\n        74                               1400\n
Aggregate Functions:REGR_AVGY ( expr1 , expr2 )=Pairs where either expr1 or expr2 are eliminated to begin with. Then the following function is calculated:\n
\nAVG ( expr2 )\n
\nExample:

\n

\nSELECT TRUNC((SYSDATE - saledate) / 7) WEEK,\n       REGR_AVGY ( SYSDATE - saledate , amount )\n  FROM sales , saleitems\n WHERE sales.saleid = saleitems.saleid\n GROUP BY TRUNC((SYSDATE - saledate) / 7);\n\n      WEEK REGR_AVGY(SYSDATE-SALEDATE,AMOUNT)\n---------- ----------------------------------\n         0                          1.0277662\n         8                         60.0277662\n        10                         71.0277662\n        13                         93.3610995\n        15                         107.027766\n        73                         514.027766\n        74                         518.027766\n
Aggregate Functions:REGR_COUNT ( expr1 , expr2 )=Pairs where either expr1 or expr2 are eliminated to begin with. This function then returns the number of valid pairs left.

\nExample:

\n

\nSELECT TRUNC((SYSDATE - saledate) / 7) WEEK,\n       REGR_COUNT ( SYSDATE - saledate , amount )\n  FROM sales , saleitems\n WHERE sales.saleid = saleitems.saleid\n GROUP BY TRUNC((SYSDATE - saledate) / 7);\n\n      WEEK REGR_COUNT(SYSDATE-SALEDATE,AMOUNT)\n---------- -----------------------------------\n         0                                   3\n         8                                   2\n        10                                   1\n        13                                   3\n        15                                   2\n        73                                   1\n        74                                   3\n
Aggregate Functions:REGR_INTERCEPT ( expr1 , expr2 )=Calculates the y-intercept of the regression line. Pairs where either expr1 or expr2 are eliminated to begin with. Then the following function is calculated:\n
\nAVG ( expr1 ) - REGR_SLOPE ( expr1 , expr2 ) * AVG ( expr2 )\n
\nExample:

\n

\nSELECT TRUNC((SYSDATE - saledate) / 7) WEEK,\n       REGR_INTERCEPT ( SYSDATE - saledate , amount )\n  FROM sales , saleitems\n WHERE sales.saleid = saleitems.saleid\n GROUP BY TRUNC((SYSDATE - saledate) / 7);\n\n      WEEK REGR_INTERCEPT(SYSDATE-SALEDATE,AMOUNT)\n---------- ---------------------------------------\n         0                              1.02846065\n         8                              60.0284606\n        10\n        13                              100.028461\n        15                              107.028461\n        73\n        74                              518.028461\n
Aggregate Functions:REGR_R2 ( expr1 , expr2 )=Represent the determination or goodness of fit for the regression. Pairs where either expr1 or expr2 are eliminated to begin with. The value of the functions VAR_POP ( expr1 ) and VAR_POP ( expr2 ) is evaluated after null pairs are removed. The returned value is then one of the following:\n
    \n
  • null if VAR_POP ( expr2 ) = 0.\n
  • 1 if VAR_POP ( expr1 ) = 0 and VAR_POP ( expr2 ) != 0.\n
  • POWER ( CORR ( expr1 , expr2 ) , 2 ) if VAR_POP ( expr1 ) > 0 and VAR_POP ( expr2 ) != 0.\n
\nExample:

\n

\nSELECT TRUNC((SYSDATE - saledate) / 7) WEEK,\n       REGR_R2 ( SYSDATE - saledate , amount )\n  FROM sales , saleitems\n WHERE sales.saleid = saleitems.saleid\n GROUP BY TRUNC((SYSDATE - saledate) / 7);\n\n      WEEK REGR_R2(SYSDATE-SALEDATE,AMOUNT)\n---------- --------------------------------\n         0                       1.4215E-39\n         8                       2.8571E-38\n        10\n        13                              .25\n        15                                1\n        73\n        74                                0\n
Aggregate Functions:REGR_SLOPE ( expr1 , expr2 )=This function returns the slope of the line. Pairs where either expr1 or expr2 are eliminated to begin with. Then the following function is calculated:\n
\nCOVAR_POP ( expr1 , expr2 ) / VAR_POP ( expr2 )\n
\nExample:

\n

\nSELECT TRUNC((SYSDATE - saledate) / 7) WEEK,\n       REGR_SLOPE ( SYSDATE - saledate , amount )\n  FROM sales , saleitems\n WHERE sales.saleid = saleitems.saleid\n GROUP BY TRUNC((SYSDATE - saledate) / 7);\n\n      WEEK REGR_SLOPE(SYSDATE-SALEDATE,AMOUNT)\n---------- -----------------------------------\n         0                          -3.554E-42\n         8                                   0\n        10\n        13                               -.002\n        15                                   0\n        73\n        74                                   0\n
Aggregate Functions:REGR_SXX ( expr1 , expr2 )=Pairs where either expr1 or expr2 are eliminated to begin with. Then the following function is calculated:\n
\nREGR_COUNT ( expr1 , expr2 ) / VAR_POP ( expr2 )\n
\nExample:

\n

\nSELECT TRUNC((SYSDATE - saledate) / 7) WEEK,\n       REGR_SXX ( SYSDATE - saledate , amount )\n  FROM sales , saleitems\n WHERE sales.saleid = saleitems.saleid\n GROUP BY TRUNC((SYSDATE - saledate) / 7);\n\n      WEEK REGR_SXX(SYSDATE-SALEDATE,AMOUNT)\n---------- ---------------------------------\n         0                           4502400\n         8                             20000\n        10                                 0\n        13                        666666.667\n        15                            819200\n        73                                 0\n        74                            560000\n
Aggregate Functions:REGR_SXY ( expr1 , expr2 )=Pairs where either expr1 or expr2 are eliminated to begin with. Then the following function is calculated:\n
\nREGR_COUNT ( expr1 , expr2 ) / VAR_POP ( expr1 )\n
\nExample:

\n

\nSELECT TRUNC((SYSDATE - saledate) / 7) WEEK,\n       REGR_SXY ( SYSDATE - saledate , amount )\n  FROM sales , saleitems\n WHERE sales.saleid = saleitems.saleid\n GROUP BY TRUNC((SYSDATE - saledate) / 7);\n\n      WEEK REGR_SXY(SYSDATE-SALEDATE,AMOUNT)\n---------- ---------------------------------\n         0                        1.3000E-35\n         8                        1.0000E-34\n        10                                 0\n        13                        -1333.3333\n        15                                 0\n        73                                 0\n        74                                 0\n
Aggregate Functions:REGR_SYY ( expr1 , expr2 )=Pairs where either expr1 or expr2 are eliminated to begin with. Then the following function is calculated:\n
\nREGR_COUNT ( expr1 , expr2 ) / COVAR_POP ( expr1 )\n
\nExample:

\n

\nSELECT TRUNC((SYSDATE - saledate) / 7) WEEK,\n       REGR_SXY ( SYSDATE - saledate , amount )\n  FROM sales , saleitems\n WHERE sales.saleid = saleitems.saleid\n GROUP BY TRUNC((SYSDATE - saledate) / 7);\n\n      WEEK REGR_SXY(SYSDATE-SALEDATE,AMOUNT)\n---------- ---------------------------------\n         0                        -4.000E-36\n         8                                 0\n        10                                 0\n        13                        -1333.3333\n        15                                 0\n        73                                 0\n        74                                 0\n
Aggregate Functions:STDDEV ( DISTINCT|ALL expr )=Get the standard deviation of expr. This function differs from STDDEV_SAMP in what it returns when there is only one input row. This function returns 0 and STDDEV_SAMP returns null. The standard deviation is the square root of the variance defined for the VARIANCE function.

\nExample:\n

\nSELECT AVG(amount),STDDEV(amount) FROM saleitems;\n\nAVG(AMOUNT) STDDEV(AMOUNT)\n----------- --------------\n    1628.75     1225.85412\n
Aggregate Functions:STDDEV_POP ( expr )=Get the square root of the population variance. This is the same as the square root of the VAR_POP function.

\nExample:\n

\nSELECT STDDEV_POP(profit) FROM saleitems;\n\nSTDDEV_POP(PROFIT)\n------------------\n        277.077205\n
Aggregate Functions:STDDEV_SAMP ( DISTINCT|ALL expr )=Get the standard deviation of expr. This function differs from STDDEV in what it returns when there is only one input row. This function returns null and STDDEV returns 0. The standard deviation is the square root of the variance defined for the VARIANCE function.

\nExample:\n

\nSELECT AVG(amount),STDDEV_SAMP(amount) FROM saleitems;\n\nAVG(AMOUNT) STDDEV_SAMP(AMOUNT)\n----------- -------------------\n    1628.75          1225.85412\n
Aggregate Functions:SUM ( DISTINCT|ALL expr )=Get the sum of all expr values. If DISTINCT is specified only distinct values are calculated.

\nExample:\n

\nSELECT SUM(profit) FROM saleitems;\n\nSUM(PROFIT)\n-----------\n       4765\n
Aggregate Functions:VARIANCE ( DISTINCT|ALL expr )=Get the sample variance of the values in expr, if no values are available null is returned. The following calculation is used.\n
\n( SUM ( expr * expr ) - SUM ( expr ) * SUM ( expr ) / COUNT ( expr ) ) / \n	( COUNT ( expr ) - 1 )\n
\nIf applied to an empty set 0 is returned.\nExample:\n
\nSELECT VARIANCE(profit) FROM saleitems;\n\nVARIANCE(PROFIT)\n----------------\n      81889.8958\n
Aggregate Functions:VAR_POP ( expr )=Get the population variance of the values of expr. This is defined by the following formula.

\n

\n( SUM ( expr * expr ) - SUM ( expr ) * SUM ( expr ) / COUNT ( expr ) ) / \n	COUNT ( expr )\n
\nExample:\n
\nSELECT VAR_POP(profit) FROM saleitems;\n\nVAR_POP(PROFIT)\n---------------\n     76771.7773\n
Aggregate Functions:VAR_SAMP ( DISTINCT|ALL expr )=Get the sample variance of the values in expr, if no values are available null is returned. The following calculation is used.\n
\n( SUM ( expr * expr ) - SUM ( expr ) * SUM ( expr ) / COUNT ( expr ) ) / \n	( COUNT ( expr ) - 1 )\n
\nIf applied to an empty set null is returned.\nExample:\n
\nSELECT VAR_SAMP(profit) FROM saleitems;\n\nVAR_SAMP(PROFIT)\n----------------\n      81889.8958\n
Analytic Functions:AVG ( DISTINCT|ALL expr ) OVER ( analytic_clause )=Calculates the avarage value of expr.

\nIf DISTINCT is specified duplicates of the same number is only counted as one\nnumber, if ALL or nothing is specified all numbers are counted equally. If DISTINCT is specified you can't use order by and windowing specifications in the analytic_clause. Analytic Functions:CORR ( expr1 , expr2 ) OVER ( analytic_clause )=Calculate the coefficient of correlation of a set of number pairs.

\n\nPairs where either expr1 or expr2 are eliminated first. Then the following\ncalculation is performed:\n\n

\nCOVAR_POP(expr1, expr2) / (STDDEV_POP(expr1) * STDDEV_POP(expr2))\n
\n\nThe function returns a number, if applied to an empty set NULL is returned. Analytic Functions:COUNT ( *|DISTINCT|ALL expr ) OVER ( analytic_clause )=Return the number of rows in the resultset. DISTINCT specifies that only\ndistinct values are to be counted. If expr is NULL it is not counted. *\n and ALL indicates that all rows should be counted. If DISTINCT is specified you can't use order by and windowing specifications in the analytic_clause. Analytic Functions:COVAR_POP ( expr1 , expr2 ) OVER ( analytic_clause )=Get the population covariance of a set of pairs.

\n\nPairs where either expr1 or expr2 are eliminated first. Then the following\ncalculation is performed:\n\n

\n(SUM(expr1 * expr2) - SUM(expr2) * SUM(expr1) / n) / n\n
\n\nThe function returns a number, if applied to an empty set NULL is returned.

\n Analytic Functions:COVAR_SAMP ( expr1 , expr2 ) OVER ( analytic_clause )=Get the sample covariance of a set of pairs.

\n\nPairs where either expr1 or expr2 are eliminated first. Then the following\ncalculation is performed:\n\n

\n(SUM(expr1 * expr2) - SUM(expr2) * SUM(expr1) / n) / (n - 1)\n
\n\nThe function returns a number, if applied to an empty set NULL is returned.

\n Analytic Functions:CUME_DIST ( ) OVER ( analytic_clause )=This computes the relative position of a specified value in a group of values. For a given row the CUME_DIST of this row is the number of rows with lower than or equal to the value of the specified row divided by the total number of rows being evaluated. The values returned are greated than 0 and less than or equal to 1. Analytic Functions:DENSE_RANK () OVER ( analytic_clause )=This function computes the rank of each row returned from a query in comparison to the other rows in the query based on the expression in the ORDER BY of the analytic_clause. Equal values receive the same rank. The next rank is then added with 1 in comparison to the RANK who adds the number of tied rows. Analytic Functions:FIRST_VALUE ( expr ) OVER ( analytic_clause )=Returns the first value of expr in an ordered set of values. Analytic Functions:LAG ( value_expr , offset , default ) OVER ( analytic_clause )=This function gives access to the previous values returned in the query. If offset is specified it indicates the number of rows before the current row to look, the default is 1. The default parameter can be used to specify the values if outside the specified window, the default is null. Analytic Functions:LAST_VALUE ( expr ) OVER ( analytic_clause )=Returns the last value of expr in an ordered set of values. Analytic Functions:LEAD ( expr , offset , default ) OVER ( analytic_clause )=This function gives access to future values returned in the query. If offset is specified it indicates the number of rows after the current row to look, the default is 1. The default parameter can be used to specify the values if outside the specified window, the default is null. Analytic Functions:MAX ( expr ) OVER ( analytic_clause )=Get the largest value of expr.

Analytic Functions:MIN ( expr ) OVER ( analytic_clause )=Get the smallest value of expr.

Analytic Functions:NTILE ( expr ) OVER ( analytic_clause )=This is function divides a dataset into a number of buckets specified by expr and return the number of the bucket for the current row. The number of rows in each bucket can differ at most 1. If expr is larger than the number of rows only rows number of buckets will be filled with 1. Buckets are numbered from 1 to expr. Analytic Functions:PERCENT_RANK () OVER ( analytic_clause )=This computes the relative position of a specified value in a group of values similar to the CUME_DIST function. The difference is that instead of counting the number of rows before or equal divided by the total number of rows in the set you first deduct one from both the number of rows before and the total number of rows. Analytic Functions:RANK ( ) OVER ( analytic_clause )=This function computes the rank of each row returned from a query in comparison to the other rows in the query based on the expression in the ORDER BY of the analytic_clause. Equal values receive the same rank. The next rank is then added with the number of rows with this rank value. Analytic Functions:RATIO_TO_REPORT ( expr ) OVER ( analytic_clause )=This function returns the ratio of expr in comparison to the sum of all expr over the entire set. If expr is null, null is also returned. Analytic Functions:REGR_AVGX ( expr1 , expr2 ) OVER ( analytic_clause )=Pairs where either expr1 or expr2 are eliminated to begin with. Then the following function is calculated:\n

\nAVG ( expr2 )\n
\n Analytic Functions:REGR_AVGY ( expr1 , expr2 ) OVER ( analytic_clause )=Pairs where either expr1 or expr2 are eliminated to begin with. Then the following function is calculated:\n
\nAVG ( expr2 )\n
\n Analytic Functions:REGR_COUNT ( expr1 , expr2 ) OVER ( analytic_clause )=Pairs where either expr1 or expr2 are eliminated to begin with. This function then returns the number of valid pairs left.

\n Analytic Functions:REGR_INTERCEPT ( expr1 , expr2 ) OVER ( analytic_clause )=Calculates the y-intercept of the regression line. Pairs where either expr1 or expr2 are eliminated to begin with. Then the following function is calculated:\n

\nAVG ( expr1 ) - REGR_SLOPE ( expr1 , expr2 ) * AVG ( expr2 )\n
\n Analytic Functions:REGR_R2 ( expr1 , expr2 ) OVER ( analytic_clause )=Represent the determination or goodness of fit for the regression. Pairs where either expr1 or expr2 are eliminated to begin with. The value of the functions VAR_POP ( expr1 ) and VAR_POP ( expr2 ) is evaluated after null pairs are removed. The returned value is then one of the following:\n
    \n
  • null if VAR_POP ( expr2 ) = 0.\n
  • 1 if VAR_POP ( expr1 ) = 0 and VAR_POP ( expr2 ) != 0.\n
  • POWER ( CORR ( expr1 , expr2 ) , 2 ) if VAR_POP ( expr1 ) > 0 and VAR_POP ( expr2 ) != 0.\n
\n Analytic Functions:REGR_SLOPE ( expr1 , expr2 ) OVER ( analytic_clause )=This function returns the slope of the line. Pairs where either expr1 or expr2 are eliminated to begin with. Then the following function is calculated:\n
\nCOVAR_POP ( expr1 , expr2 ) / VAR_POP ( expr2 )\n
\n Analytic Functions:REGR_SXX ( expr1 , expr2 ) OVER ( analytic_clause )=Pairs where either expr1 or expr2 are eliminated to begin with. Then the following function is calculated:\n
\nREGR_COUNT ( expr1 , expr2 ) / VAR_POP ( expr2 )\n
\n Analytic Functions:REGR_SXY ( expr1 , expr2 ) OVER ( analytic_clause )=Pairs where either expr1 or expr2 are eliminated to begin with. Then the following function is calculated:\n
\nREGR_COUNT ( expr1 , expr2 ) / VAR_POP ( expr1 )\n
\n Analytic Functions:REGR_SYY ( expr1 , expr2 ) OVER ( analytic_clause )=Pairs where either expr1 or expr2 are eliminated to begin with. Then the following function is calculated:\n
\nREGR_COUNT ( expr1 , expr2 ) / COVAR_POP ( expr1 )\n
\n Analytic Functions:ROW_NUMBER ( ) OVER ( analytic_clause )=This function will return a unique value to each row that is returned in the order specify by the ORDER BY clause of the analytic_clause. The first row returned is 1. Analytic Functions:STDDEV ( DISTINCT|ALL expr ) OVER ( analytic_clause )=Get the standard deviation of expr. This function differs from STDDEV_SAMP in what it returns when there is only one input row. This function returns 0 and STDDEV_SAMP returns null. The standard deviation is the square root of the variance defined for the VARIANCE function. If DISTINCT is specified you can't use order by and windowing specifications in the analytic_clause.\n Analytic Functions:STDDEV_POP ( expr ) OVER ( analytic_clause )=Get the square root of the population variance. This is the same as the square root of the VAR_POP function. Analytic Functions:STDDEV_SAMP ( DISTINCT|ALL expr ) OVER ( analytic_clause )=Get the standard deviation of expr. This function differs from STDDEV in what it returns when there is only one input row. This function returns null and STDDEV returns 0. The standard deviation is the square root of the variance defined for the VARIANCE function. If DISTINCT is specified you can't use order by and windowing specifications in the analytic_clause.\n Analytic Functions:SUM ( DISTINCT|ALL expr ) OVER ( analytic_clause )=Get the sum of all expr values. If DISTINCT is specified only distinct values are calculated. If DISTINCT is specified you can't use order by and windowing specifications in the analytic_clause. Analytic Functions:VARIANCE ( DISTINCT|ALL expr ) OVER ( analytic_clause )=Get the sample variance of the values in expr, if no values are available null is returned. The following calculation is used.\n
\n( SUM ( expr * expr ) - SUM ( expr ) * SUM ( expr ) / COUNT ( expr ) ) / \n	( COUNT ( expr ) - 1 )\n
\nIf applied to an empty set 0 is returned. If DISTINCT is specified you can't use order by and windowing specifications in the analytic_clause. Analytic Functions:VAR_POP ( expr ) OVER ( analytic_clause )=Get the population variance of the values of expr. This is defined by the following formula.

\n

\n( SUM ( expr * expr ) - SUM ( expr ) * SUM ( expr ) / COUNT ( expr ) ) / \n	COUNT ( expr )\n
\n Analytic Functions:VAR_SAMP ( DISTINCT|ALL expr ) OVER ( analytic_clause )=Get the sample variance of the values in expr, if no values are available null is returned. The following calculation is used.\n
\n( SUM ( expr * expr ) - SUM ( expr ) * SUM ( expr ) / COUNT ( expr ) ) / \n	( COUNT ( expr ) - 1 )\n
\nIf applied to an empty set null is returned. If DISTINCT is specified you can't use order by and windowing specifications in the analytic_clause. Char to Char Functions:CHR ( n USING NCHAR_CS )=Get the character specified by the binary equivalent of n in the national character set. If USING NCHAR_CS is used, this function returns the equivalent of the national NVARCHAR2. Otherwise the VARCHAR2 character set is user.

\nExamples:\n

\nSELECT CHR ( 65 ) || CHR ( 66 ) || CHR ( 67 ) abc FROM DUAL;\n\nABC\n---\nABC\n
Char to Char Functions:CONCAT ( char1 , char2 )=This function concatenates the char1 string with char2. Which means it will perform the same task as the operator ||.

\nExamples:\n

\nSELECT CONCAT ( 'Foo' , 'bar' ) FROM DUAL;\n\nCONCAT\n------\nFoobar\n
Char to Char Functions:INITCAP ( char )=Return the string of char with the first character in uppercase and all the rest in lowercase.

\nExamples:\n

\nSELECT INITCAP ( 'MaUrItZ' ) FROM DUAL;\n\nINITCAP\n-------\nMauritz\n
Char to Char Functions:LOWER ( char )=Returns the string char with all letters in lowercase.

\nExamples:\n

\nSELECT LOWER ( 'FoPPa' ) FROM DUAL;\n\nLOWER\n-----\nfoppa\n
Char to Char Functions:LPAD ( char1 , n , char2 )=This function returns char1 padded from the left to n number of characters. If char2 is specified this is used for padding instead of space which is the default.

\nExamples:\n

\nSELECT LPAD ( '>Padding' , 12 , '-=' ) FROM DUAL;\n\nLPAD('>PADDI\n------------\n-=-=>Padding\n
Char to Char Functions:LTRIM ( char1 , char2 )=Removes all characters from the char1 available in the set defined by the characters available in the string char2 from the left until a character not in the set is encountered.

\nExamples:\n

\nSELECT LTRIM ( '-=-=-=->Text' , '-=>' ) FROM DUAL;\n\nLTRI\n----\nText\n
Char to Char Functions:NLSSORT ( char , nlsparam )=This function returns a string used for sorting the char. The value of nlsparam has the form 'NLS_param = value' usually 'NLS_SORT = sort' where sort can either be BINARY or any other sort specifier.

\nExamples:\n

\nSELECT NLSSORT ( 'ABCÅÄÖ' , 'NLS_SORT = Swedish' ) FROM DUAL;\n\nNLSSORT('ABCÅÄÖ','NLS_SORT=SWEDISH')\n----------------------------------------------------\n14191E898A8B0001010101010100\n
Char to Char Functions:NLS_INITCAP ( char , nlsparam )=This function returns the string char with the first character is made uppercase and all the other lowercase. The value of nlsparam has the form 'NLS_param = value' usually 'NLS_SORT = sort' where sort can either be BINARY or any other sort specifier.

\nExamples:\n

\nSELECT NLS_INITCAP ( 'ABCÅÄÖ' , 'NLS_SORT = Swedish' ) FROM DUAL;\n\nNLS_IN\n------\nAbcåäö\n
Char to Char Functions:NLS_LOWER ( char , nlsparam )=This function returns the string char with all letters converted to lowercase. The value of nlsparam has the form 'NLS_param = value' usually 'NLS_SORT = sort' where sort can either be BINARY or any other sort specifier.

\nExamples:\n

\nSELECT NLS_LOWER ( 'ABCÅÄÖ' , 'NLS_SORT = Swedish' ) FROM DUAL;\n\nNLS_LO\n------\nabcåäö\n
Char to Char Functions:NLS_UPPER ( char , nlsparam )=This function returns the string char with all letters converted to uppercase. The value of nlsparam has the form 'NLS_param = value' usually 'NLS_SORT = sort' where sort can either be BINARY or any other sort specifier.

\nExamples:\n

\nSELECT NLS_UPPER ( 'ABCÅÄÖ' , 'NLS_SORT = Swedish' ) FROM DUAL;\n\nNLS_UP\n------\nABCÅÄÖ\n
Char to Char Functions:REPLACE ( char , search , replace )=This function will return a string where every occurance in char of the string search is replaced with the replace string.

\nExample:\n

\nSELECT REPLACE ('Gnu','Gnu','Gnu Is Not Unix') FROM DUAL;\n\nREPLACE('GNU','\n---------------\nGnu Is Not Unix\n
Char to Char Functions:RPAD ( char1 , n , char2 )=This function returns char1 padded from the right to n number of characters. If char2 is specified this is used for padding instead of space which is the default.

\nExamples:\n

\nSELECT RPAD ( 'Padding<' , 12 , '=-' ) FROM DUAL;\n\nRPAD('PADDIN\n------------\nPadding<=-=-\n
Char to Char Functions:RTRIM ( char1 , char2 )=Removes all characters from the char1 available in the set defined by the characters available in the string char2 from the right until a character not in the set is encountered.

\nExamples:\n

\nSELECT RTRIM ( 'Text<=-=-=-' , '<-=' ) FROM DUAL;\n\nRTRI\n----\nText\n
Char to Char Functions:SOUNDEX ( char )=Returns a string that contains a phonetic representation of char. This is useful for comparing strings that sound similarly, but are spelled different. The algorithm used is available in The Art of Computer Programming, Volume 3: Sorting and Searching, by Donald E. Knuth.

\nExamples:\n

\nSELECT 'Johnson sounds like Jonsson'\n  FROM DUAL WHERE SOUNDEX ( 'Johnson' ) = SOUNDEX ( 'Jonsson' );\n\n'JOHNSONSOUNDSLIKEJONSSON'\n---------------------------\nJohnson sounds like Jonsson\n
Char to Char Functions:SUBSTR ( char , m , n )=This function returns a substring of of the char string. If m is 0 it is treated as 1 which means the beginning of the string, 2 meaning the second character etc. If m is negative it will count from the end of the string with -1 meaning the last character of the string. If n is not specified the rest of the string is returned.

\nExamples:\n

\nSELECT SUBSTR('Henrik P Johnson',8,3) FROM DUAL;\n\nSUB\n---\nP J\n
Char to Char Functions:SUBSTRB ( char , m , n )=This function returns a substring of of the char string. The difference from SUBSTR is that this function counts bytes instead of characters which differs if you use multichar charactersets.

\nExamples:

\nIf run on a UNICODE characterset database.\n

\nSELECT SUBSTRB('Henrik P Johnson',7,4) FROM DUAL;\n\nSU\n--\nri\n
Char to Char Functions:TRANSLATE ( char , from , to )=This function will return a string where every occurance of a character in char is replaced from the character in from with the corresponding character in to. If the character is not available in to it is removed from the result.

\nExample:\n

\nSELECT TRANSLATE ( 'Mauritz' , 'Mauritz' , 'Henrik' ) FROM DUAL;\n\nTRANSL\n------\nHenrik\n
Char to Char Functions:TRIM ( LEADING|TRAILING|BOTH trim FROM source )=This function can trim characters from both beginning (If LEADING or BOTH is specified) and end (If TRAILING or BOTH) with BOTH being the default. If trim isn't specified any whitespace is the default. Any characyers in the trim set will be removed from the specified ends of source.

\nExamples:\n

\nSELECT TRIM ( '-=-=-=>Text<=-=-=-' , '<-=>' ) FROM DUAL;\n\nTRIM\n----\nText\n
Char to Char Functions:UPPER ( char )=Returns the string char with all letters in uppercase.

\nExamples:\n

\nSELECT UPPER ( 'FoPPa' ) FROM DUAL;\n\nUPPER\n-----\nFOPPA\n
Char to Number Functions:ASCII ( char )=Get the number representation of the first character in char.

\nExample:\n

\nSELECT ASCII('Aloha') FROM DUAL;\n\nASCII('ALOHA')\n--------------\n            65\n
Char to Number Functions:INSTR ( string , substring , pos , occurance )=Search for substring in string. If pos is specified it indicates the character in string to start searching, if negative Oracle will search backwards in the string. If occurance is specified it indicates how many hits to discard before returning (1 meaning the first match). The function returns the position of the charater where the match begins in string.

\nExample:\n

\nSELECT INSTR('excellence','e',3,2) FROM DUAL;\n\nINSTR('EXCELLENCE','E',3,2)\n---------------------------\n                          7\n
Char to Number Functions:INSTRB ( str , substring , pos , occurance )=This function is the same as INSTR except that pos and the returned number is in bytes instead of characters. Char to Number Functions:LENGTH ( char )=Get the length of char in characters.

\nExample:\n

\nSELECT LENGTH('GlobeCom') FROM DUAL;\n\nLENGTH('GLOBECOM')\n------------------\n                 8\n
Char to Number Functions:LENGTHB ( char )=Get the length of char in bytes.

\nExample:

\nIf performed on a UNICODE database.\n

\nSELECT LENGTHB('GlobeCom') FROM DUAL;\n\nLENGTHB('GLOBECOM')\n-------------------\n                 16\n
Conversion Functions:CHARTOROWID ( char )=Convert a char str string value to a ROWID. This is the reverse of the ROWIDTOCHAR function. Conversion Functions:CONVERT ( char , dest_char_set , source_char_set )=Convert the char string from the source_char_set or the database character set to the dest_char_set. Observe that TOra always communicate with the database in the UTF-8 character set.

\nExample:\nAssumes a Latin-1 character set database.\n

\nSELECT CONVERT ( 'ÅÄÖåäö' , 'UTF8' ) FROM DUAL;\n\nCONVERT('ÅÄÖ\n------------\nÃ\nÃ\n Ãåäö\n
Conversion Functions:HEXTORAW ( char )=Convert a string char containing a hexadecimal dump of RAW data. This is the reverse of the RAWTOHEX function. Conversion Functions:NUMTODSINTERVAL ( n , interval )=Converts n to an INTERVAL DAY TO SECOND literal. The string interval specifies the unit of the value n and can be one of the following 'DAY', 'HOUR', 'MINUTE' and 'SECOND'. Conversion Functions:NUMTOYMINTERVAL ( n , interval )=Converts n to an INTERVAL YEAR TO MONTH literal. The string interval specifies the unit of the value n and can be one of the following 'YEAR' and 'MONTH'. Conversion Functions:RAWTOHEX ( char )=This function converts the RAW value char to a hexadecimal representation of it that can be treated like a string. This is the reverse of the HEXTORAW function.

\nExample:\n

\nSELECT RAWTOHEX ( 'GlobeCom' ) FROM DUAL;\n\nRAWTOHEX('GLOBEC\n----------------\n476C6F6265436F6D\n
Conversion Functions:ROWIDTOCHAR ( rowid )=This function returns a string representation of a ROWID. Use the CHARTOROWID to convert the string back to a ROWID. Conversion Functions:TO_CHAR( val , fmt , nlsparam )=Convert the val to a string the format specified by the optional fmt parameter and any NLS parameters can be modified by nlsparam. val can be either of date or number. For more information about date and number conversion specifiers refere to the Oracle SQL Reference manual.

\nExample:\n

\nSELECT TO_CHAR ( 123 , '99999.000' ) FROM DUAL;\n\nTO_CHAR(12\n----------\n   123.000\n
Conversion Functions:TO_DATE ( char , fmt , nlsparam )=Convert the string char to a date using the format specified by the optional fmt parameter and any NLS parameters can be modified by nlsparam. For more information about date conversion format specifiers refer to the Oracle SQL Reference manual.

\nExample:\n

\nSELECT TO_DATE ( '2000-01-01' , 'YYYY-MM-DD' ) FROM DUAL;\n\nTO_DATE('\n---------\n01-JAN-00\n
Conversion Functions:TO_LOB ( long )=This function converts a long value of LONG or LONG RAW format to a LOB object. This can only be used in a SELECT list of a subquery or in an INSERT statement. Conversion Functions:TO_MULTI_BYTE ( char )=This function converts a singlebyte string char to its corresponding multibyte string. If no equivalent multibyte character is available the singlestring character will appear in the returned instead. Conversion Functions:TO_NUMBER ( char , fmt , nlsparam )=Convert the string char to a number using the format specified by the optional fmt parameter and any NLS parameters can be modified by nlsparam. For more information about number conversion format specifiers refer to the Oracle SQL Reference manual.

Conversion Functions:TO_SINGLE_BYTE ( char )=This function converts a multibyte character string char to its corresponding singlebyte characters. If no equivalent singlebyte character is available the multibyte character will appear in the returned instead.

\n Conversion Functions:TRANSLATE ( text USING CHAR_CS )=Converts text to the character set specified for conversion between the database characterset and the national character set. Specifying CHAR_CS will return a VARCHAR2 string, NCHAR_CS will return a NVARCHAR2 string. Date Functions:ADD_MONTHS ( d , n )=Add n months to the date d. If next resulting month has less days than the day of the month in d the last of that month will be returned, otherwise the result will have the same day of month as d.\n Date Functions:LAST_DAY ( d )=Get the last of the month of the date d.

\nExample:

\nWill return number of days left in month.\n

\nSELECT TRUNC ( LAST_DAY ( SYSDATE ) - SYSDATE ) FROM DUAL;\n\nTRUNC(SYSDATE-LAST_DAY(SYSDATE))\n--------------------------------\n                              27\n
Date Functions:MONTHS_BETWEEN ( d1 , d2 )=Will calculate the number of months between the date d1 and d2. If d1 is later than d2 the result will be positive, otherwise it will be negative. The fraction is calculated based on a 31-day month.

\nExample:\n

\nSELECT MONTHS_BETWEEN(SYSDATE,TO_DATE('1973-12-21','YYYY-MM-DD')) FROM DUAL;\n\nMONTHS_BETWEEN(SYSDATE,TO_DATE('1973-12-21','YYYY-MM-DD'))\n----------------------------------------------------------\n                                                329.437957\n
Date Functions:NEW_TIME ( d , z1 , z2 )=This function converts the date d specified in timezone z1 to what the time is in the timezone z2. The timezones can be one of the following AST, ADT, BST,\nBDT, CST, CDT, EST, EDT, GMT, HST, HDT, MST, MDT, NST, PST, PDT, YST and YDT. For more information refer to the Oracle SQL Reference manual.

\nExample:\n

\nSELECT TO_CHAR ( NEW_TIME ( SYSDATE , 'CDT' , 'GMT' ) , \n                 'YYYY-MM-DD HH24:MI:SS' )\n  FROM DUAL;\n\nTO_CHAR(NEW_TIME(SY\n-------------------\n2001-06-03 18:59:03\n
Date Functions:NEXT_DAY ( d , char )=Get the date of the first weekday named by char after the specified date d. char must be in the language of your session and can be either the full name or it's abbreviation.

\nExample:\n

\nSELECT NEXT_DAY ( SYSDATE , 'MONDAY' ) FROM DUAL;\n\nNEXT_DAY(\n---------\n04-JUN-01\n
Date Functions:ROUND ( d , fmt )=Round off the date d to the unit specified by the fmt format model. For more information about date formats refer to the Oracle SQL Reference manual. If fmt is not specified the result is rounded to days.

\nExample:\n

\nSELECT ROUND ( SYSDATE , 'MONTH' ) FROM DUAL;\n\nROUND(SYS\n---------\n01-JUN-01\n
Date Functions:SYSDATE=Get the current date and time of the database. Date Functions:TRUNC ( d , char )=Truncate the date d to the unit specified by the fmt format model. For more information about date formats refer to the Oracle SQL Reference manual. If fmt is not specified the result is rounded to days.

\nExample:\n

\nSELECT TRUNC ( SYSDATE , 'MONTH' ) FROM DUAL;\n\nTRUNC(SYS\n---------\n01-JUN-01\n
Example Tables=The following SQL script will create the example tables used in these template descriptions.

\n

\n
\nPROMPT CREATE TABLE saleitems\n\nCREATE TABLE saleitems\n(\n saleid NUMBER NOT NULL\n , itemid NUMBER NOT NULL\n , quantity NUMBER \n , amount NUMBER \n , profit NUMBER \n);\n\nPROMPT ALTER TABLE saleitems ADD CONSTRAINT saleitems_pk PRIMARY KEY\n\nALTER TABLE saleitems ADD CONSTRAINT saleitems_pk PRIMARY KEY\n(\n saleid,\n itemid\n);\n\nPROMPT CREATE TABLE sales\n\nCREATE TABLE sales\n(\n saleid NUMBER NOT NULL\n , customerid NUMBER \n , saledate DATE \n , deliverydate DATE \n , sellerid NUMBER \n)\n;\n\nPROMPT ALTER TABLE sales ADD CONSTRAINT sales_pk PRIMARY KEY\n\nALTER TABLE sales ADD CONSTRAINT sales_pk PRIMARY KEY\n(\n saleid\n);\n\nPROMPT CONTENTS OF saleitems\n\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('1','1','1','1000','200');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('1','2','10','1200','60');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('1','3','2','2000','400');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('2','2','2','240','5');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('2','3','3','3000','600');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('2','4','6','600','100');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('3','3','1','1000','200');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('4','2','6','720','30');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('4','1','2','2000','500');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('5','3','4','4000','1000');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('5','1','3','3000','600');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('6','2','5','600','100');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('6','4','4','400','50');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('7','4','3','300','20');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('8','1','3','3000','400');\nINSERT INTO saleitems (saleid,itemid,quantity,amount,profit) VALUES ('9','1','3','3000','500');\nCOMMIT;\n\nPROMPT CONTENTS OF sales\n\nINSERT INTO sales (saleid,customerid,saledate,deliverydate,sellerid) VALUES ('1','1',TO_DATE('2000-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2000-01-05 00:00:00','YYYY-MM-DD HH24:MI:SS'),'1');\nINSERT INTO sales (saleid,customerid,saledate,deliverydate,sellerid) VALUES ('2','1',TO_DATE('2001-06-01 00:00:00','YYYY-MM-DD HH24:MI:SS'),NULL,'2');\nINSERT INTO sales (saleid,customerid,saledate,deliverydate,sellerid) VALUES ('3','2',TO_DATE('2000-01-05 00:00:00','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2000-01-20 00:00:00','YYYY-MM-DD HH24:MI:SS'),'3');\nINSERT INTO sales (saleid,customerid,saledate,deliverydate,sellerid) VALUES ('4','2',TO_DATE('2001-02-15 00:00:00','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2001-02-24 00:00:00','YYYY-MM-DD HH24:MI:SS'),'2');\nINSERT INTO sales (saleid,customerid,saledate,deliverydate,sellerid) VALUES ('5','3',TO_DATE('2001-03-02 00:00:00','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2001-03-19 00:00:00','YYYY-MM-DD HH24:MI:SS'),'2');\nINSERT INTO sales (saleid,customerid,saledate,deliverydate,sellerid) VALUES ('6','3',TO_DATE('2001-04-03 00:00:00','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2001-04-13 00:00:00','YYYY-MM-DD HH24:MI:SS'),'3');\nINSERT INTO sales (saleid,customerid,saledate,deliverydate,sellerid) VALUES ('7','2',TO_DATE('2001-03-23 00:00:00','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2001-04-04 00:00:00','YYYY-MM-DD HH24:MI:SS'),'3');\nINSERT INTO sales (saleid,customerid,saledate,deliverydate,sellerid) VALUES ('8','1',TO_DATE('2001-02-26 00:00:00','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2001-03-02 00:00:00','YYYY-MM-DD HH24:MI:SS'),'1');\nCOMMIT;\n\n
Misc Single-Row Functions:BFILENAME ( ' directory ' , ' filename ' )= Misc Single-Row Functions:DUMP ( expr , return_fmt , start , length )=Get a VARCHAR2 containing the internal database representation of expr. Data is always always in the database character set. return_fmt can be used to specify the format of the returned data and specifies the radix (Octal, decimal and hexadecimal available) or 17 which specifies single characters. If 1000 is added to the return_fmt will also return the character set information of the data. start and length can be used to extract different portions of the internal data.

\nExample:\n

\nSELECT DUMP ( 'GlobeCom' ) FROM DUAL;\n\nDUMP('GLOBECOM')\n------------------------------------------\nTyp=96 Len=8: 71,108,111,98,101,67,111,109\n\nSELECT DUMP ( 'Mauritz' , 1017 ) FROM DUAL;\n\nDUMP('MAURITZ',1017)\n-----------------------------------------------------\nTyp=96 Len=7 CharacterSet=WE8ISO8859P1: M,a,u,r,i,t,z\n
Misc Single-Row Functions:EMPTY_BLOB ( )=Return an empty but initialised BLOB object.

Misc Single-Row Functions:EMPTY_CLOB ( )=Return an empty but initialised BLOB object.

Misc Single-Row Functions:GREATEST ( expr1 , expr2 )=Returns the greatest of the specified expressions.

\nExample:\n

\nSELECT GREATEST ( 1 , 5 , 3 , 8 , -5 ) FROM DUAL;\n\nGREATEST(1,5,3,8,-5)\n--------------------\n                   8\n
Misc Single-Row Functions:LEAST ( expr1 , expr2 )=Returns the smallest of the specified expressions.

\nExample:\n

\nSELECT LEAST ( 1 , 5 , 3 , 8 , -5 ) FROM DUAL;\n\nLEAST(1,5,3,8,-5)\n-----------------\n               -5\n
Misc Single-Row Functions:NLS_CHARSET_DECL_LEN ( bytes , csid )=Get the declaration width of an NCHAR in number of characters. The bytes specifies the width of the column in bytes. The csid indicates the character set ID.

\nExample:\n

\nSELECT NLS_CHARSET_DECL_LEN ( 200 ,\n                              NLS_CHARSET_ID ( 'ZHT16BIG5FIXED' ) )\n  FROM DUAL;\n\nNLS_CHARSET_DECL_LEN(200,NLS_CHARSET_ID('ZHT16BIG5FIXED'))\n----------------------------------------------------------\n                                                       100\n
Misc Single-Row Functions:NLS_CHARSET_ID ( charset )=Get the character set ID from an NLS character set name charset. If 'NCHAR_CS' is specified the multibyte character set of the server and 'CHAR_CS' the singlebyte character set of the server.

\nExample:\n

\nSELECT NLS_CHARSET_ID ( 'ZHT16BIG5FIXED' ) FROM DUAL;\n\nNLS_CHARSET_ID('ZHT16BIG5FIXED')\n--------------------------------\n                            1865\n
Misc Single-Row Functions:NLS_CHARSET_NAME ( n )=Get the character set name from a character set ID.

\nExample:\n

\nSELECT NLS_CHARSET_NAME ( 1865 ) FROM DUAL;\n\nNLS_CHARSET_NA\n--------------\nZHT16BIG5FIXED\n
Misc Single-Row Functions:NVL ( expr1 , expr2 )=This function returns expr1 if it isn't null, in that case expr2 is returned.

\nExample:\n

\nSELECT NVL ( NULL , 'GlobeCom' ) , NVL ( 'Rules' , 'Sucks' ) FROM DUAL;\n\nNVL(NULL NVL('\n-------- -----\nGlobeCom Rules\n
Misc Single-Row Functions:NVL2 ( expr1 , expr2 , expr3 )=This function returns expr2 if expr1 is not null, and expr3 if it is null.

\nExample:\n

\nSELECT NVL2 ( 1 , 'Mauritz' , 'Henrik' ) FROM DUAL;\n\nNVL2(1,\n-------\nMauritz\n
Misc Single-Row Functions:SYS_CONTEXT ( namespace , attribute , length )=This function returns the value of attribute associated with the context namespace. The maximum size is by default 256 bytes which can be overridden by specifying the length parameter. For more information see the Oracle documentation.

\nExample:\n

\nSELECT SYS_CONTEXT ('USERENV', 'SESSION_USER') \n  FROM DUAL;\n\nSYS_CONTEXT('USERENV','SESSION_USER')\n--------------------------------------------------------------------------------\nSYSTEM\n
Misc Single-Row Functions:SYS_GUID ( )=This function returns a generated globally unique number of format RAW consisting of 16 bytes.

\nExample:\n

\nSELECT SYS_GUID ( ) FROM DUAL;\n\nSYS_GUID()\n--------------------------------\n85DB35952D9A27E7E030007F010040E7\n
Misc Single-Row Functions:UID=This function returns an integer that identifies the session user.

\nExample:\n

\nSELECT UID FROM DUAL;\n\n       UID\n----------\n         5\n
Misc Single-Row Functions:USER=Return the name of the session user.

\nExample:\n

\nSELECT USER FROM DUAL;\n\nUSER\n------------------------------\nSYSTEM\n
Misc Single-Row Functions:USERENV ( option )=This function returns information about the current session. For more information about values of option refer to the Oracle documentation.

\nExample:\n

\nSELECT USERENV ( 'SESSIONID' ) FROM DUAL;\n\nUSERENV('SESSIONID')\n--------------------\n               13809\n
Misc Single-Row Functions:VSIZE ( expr )=Get the number of bytes needed to store the value of expr in the internal database representation.

\nExample:\n

\nSELECT VSIZE ( 'Mauritz' ) FROM DUAL;\n\nVSIZE('MAURITZ')\n----------------\n               7\n
Number functions:ABS ( n )=ABS returns the absolute value of n.

\nExample:

\n

\nSELECT ABS(-32) FROM DUAL;\n\nABS(-32)\n--------\n      32\n
Number functions:ACOS ( n )=Get the arc cosine of n. The angle unit is radeans.

\nExample:\n

\nSELECT ACOS ( 0.5 ) FROM DUAL;\n\n ACOS(0.5)\n----------\n1.04719755\n
Number functions:ADD_MONTHS ( d , n )=Add n months to the date d. If next resulting month has less days than the day of the month in d the last of that month will be returned, otherwise the result will have the same day of month as d.\n Number functions:ASIN ( n )=Get the arc sine of n. The angle unit is radeans.

\nExample:\n

\nSELECT ASIN ( 0.5 ) FROM DUAL;\n\n ASIN(0.5)\n----------\n.523598776\n
Number functions:ATAN ( n )=Get the arc tangentent of n. The angle unit is radeans.

\nExample:\n

\nSELECT ATAN ( 0.5 ) FROM DUAL;\n\n ATAN(0.5)\n----------\n.463647609\n
Number functions:ATAN2 ( n , m )=Get the arc tangentent of n / m. The angle unit is radeans.

\nExample:\n

\nSELECT ATAN2 ( 1 , 2 ) FROM DUAL;\n\nATAN2(1,2)\n----------\n.463647609\n
Number functions:BITAND ( argument1 , argument2 )=Calculate the bitwise and of argument1 and argument2 which must both be positive integers. Number functions:CEIL ( n )=Return the smallest integer greater than or equal to n.

\nExample:\n

\nSELECT CEIL ( 1.3 ) FROM DUAL;\n\n CEIL(1.3)\n----------\n         2\n
Number functions:COS ( n )=Return the cosine of n. The angle unit is radeans.

\nExample:\n

\nSELECT COS ( ACOS ( 0.5 ) ) FROM DUAL;\n\nCOS(ACOS(0.5))\n--------------\n            .5\n
Number functions:COSH ( n )=Return the hyperbolic cosine of n.

\nExample:\n

\nSELECT COSH ( 1 ) FROM DUAL;\n\n   COSH(1)\n----------\n1.54308063\n
Number functions:EXP ( n )=Calculate e raised to the n:th power.

\nExample:\n

\nSELECT EXP( 1 ) FROM DUAL;\n\n    EXP(1)\n----------\n2.71828183\n
Number functions:FLOOR ( n )=Return the largest integer smaller than or equal to n.

\nExample:\n

\nSELECT FLOOR ( 1.3 ) FROM DUAL;\n\nFLOOR(1.3)\n----------\n         1\n
Number functions:LN ( n )=Calculate the natural logaritm of n.

\nExample:\n

\nSELECT LN ( EXP ( 1 ) ) FROM DUAL;\n\nLN(EXP(1))\n----------\n         1\n
Number functions:LOG ( m , n )=Calculate the logarithm with base m of n.

\nExample:\n

\nSELECT LOG ( 10 , 100 ) FROM DUAL;\n\nLOG(10,100)\n-----------\n          2\n
Number functions:MOD ( m , n )=Calculate the remainder of m divided by n.

\nExample:\n

\nSELECT MOD ( 15 , 4 ) , MOD ( -14 , 4 ) FROM DUAL;\n\n MOD(15,4) MOD(-14,4)\n---------- ----------\n         3         -2\n
Number functions:POWER ( m , n )=Calculate m raised to the power of n.

\nExample:\n

\nSELECT POWER(4,0.5) FROM DUAL;\n\nPOWER(4,0.5)\n------------\n           2\n
Number functions:ROUND ( n , m )=Rounds the number n off to m places right of the decimal. If m is not specified n is rounded to an integer.

\nExample:\n

\nSELECT ROUND ( 123 , -1 ) FROM DUAL;\n\nROUND(123,-1)\n-------------\n          120\n
Number functions:SIGN ( n )=Return the sign of n. This means -1 is returned if n is below 0, 0 if it is equal to 0 and 1 if above.

\nExample:\n

\nSELECT SIGN(12) FROM DUAL;\n\n  SIGN(12)\n----------\n         1\n
Number functions:SIN ( n )=Return the sine of n. The angle unit is radeans.

\nExample:\n

\nSELECT SIN ( ASIN ( 0.5 ) ) FROM DUAL;\n\nSIN(ASIN(0.5))\n--------------\n            .5\n
Number functions:SINH ( n )=Return the hyperbolic sine of n.

\nExample:\n

\nSELECT SINH ( 1 ) FROM DUAL;\n\n   SINH(1)\n----------\n1.17520119\n
Number functions:SQRT ( n )=Calculate the square root of n.

\nExample:\n

\nSELECT SQRT(100) FROM DUAL;\n\n SQRT(100)\n----------\n        10\n
Number functions:TAN ( n )=Return the tangent of n. The angle unit is radeans.

\nExample:\n

\nSELECT TAN ( ATAN ( 0.5 ) ) FROM DUAL;\n\nTAN(ATAN(0.5))\n--------------\n            .5\n
Number functions:TANH ( n )=Return the hyperbolic tangent of n.

\nExample:\n

\nSELECT TANH ( 1 ) FROM DUAL;\n\n   TANH(1)\n----------\n.761594156\n
Number functions:TRUNC ( n , m )=Rounds the number n off to m places right of the decimal downwards. If m is not specified n is rounded to an integer.

\nExample:\n

\nSELECT TRUNC ( 123 , -1 ) FROM DUAL;\n\nTRUNC(123,-1)\n-------------\n          120
Object Functions:DEREF ( expr )=Returns an object reference to the object of expr.
Object Functions:MAKE_REF ( table|view , key )=Create a referens to a row of view or table.
Object Functions:REF ( correlation )=See Oracle SQL Reference for more information about this function.
Object Functions:REFTOHEX ( expr )=Convert a reference expr to a hexadecimal value.
Object Functions:VALUE ( correlation )=See Oracle SQL Reference for more information about this function.
tora-2.1.3/src/tobackup.cpp0000644000175000017500000005253211270353625015366 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#include "utils.h"

#include "tobackup.h"
#include "tochangeconnection.h"
#include "toconf.h"
#include "tomain.h"
#include "toresulttableview.h"
#include "tosql.h"
#include "totool.h"

#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 

#include 

#include "icons/refresh.xpm"


//static toBackupTool BackupTool;

static toSQL SQLLogSwitches("toBackup:LogSwitches",
                            "SELECT trunc(first_time)\"Date\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               0,\n"
                            "                               1))),\n"
                            "           ' ')\"-00\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               1,\n"
                            "                               1))),\n"
                            "           ' ')\"-01\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               2,\n"
                            "                               1))),\n"
                            "           ' ')\"-02\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               3,\n"
                            "                               1))),\n"
                            "           ' ')\"-03\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               4,\n"
                            "                               1))),\n"
                            "           ' ')\"-04\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               5,\n"
                            "                               1))),\n"
                            "           ' ')\"-05\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               6,\n"
                            "                               1))),\n"
                            "           ' ')\"-06\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               7,\n"
                            "                               1))),\n"
                            "           ' ')\"-07\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               8,\n"
                            "                               1))),\n"
                            "           ' ')\"-08\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               9,\n"
                            "                               1))),\n"
                            "           ' ')\"-09\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               10,\n"
                            "                               1))),\n"
                            "           ' ')\"-10\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               11,\n"
                            "                               1))),\n"
                            "           ' ')\"-11\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               12,\n"
                            "                               1))),\n"
                            "           ' ')\"-12\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               13,\n"
                            "                               1))),\n"
                            "           ' ')\"-13\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               14,\n"
                            "                               1))),\n"
                            "           ' ')\"-14\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               15,\n"
                            "                               1))),\n"
                            "           ' ')\"-15\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               16,\n"
                            "                               1))),\n"
                            "           ' ')\"-16\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               17,\n"
                            "                               1))),\n"
                            "           ' ')\"-17\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               18,\n"
                            "                               1))),\n"
                            "           ' ')\"-18\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               19,\n"
                            "                               1))),\n"
                            "           ' ')\"-19\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               20,\n"
                            "                               1))),\n"
                            "           ' ')\"-20\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               21,\n"
                            "                               1))),\n"
                            "           ' ')\"-21\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               22,\n"
                            "                               1))),\n"
                            "           ' ')\"-22\",\n"
                            "       nvl(to_char(SUM (decode(to_number(to_char(first_time,\n"
                            "                                                 'HH24')),\n"
                            "                               23,\n"
                            "                               1))),\n"
                            "           ' ')\"-23\"\n"
                            "  FROM v$log_history\n"
                            " GROUP BY trunc(first_time)\n"
                            " ORDER BY trunc(first_time)DESC",
                            "Log switch history");

static toSQL SQLLogHistory("toBackup:LogHistory",
                           "SELECT\n"
                           "   THREAD# \"Thread#\",\n"
                           "   SEQUENCE# \"Sequence#\",\n"
                           "   FIRST_TIME \"Time of first entry\",\n"
                           "   FIRST_CHANGE# \"Lowest  SCN\",\n"
                           "   NEXT_CHANGE# \"Highest SCN\",\n"
                           "   RECID \"Controlfile RecID\",\n"
                           "   STAMP \"Controlfile stamp\"\n"
                           "FROM V$LOG_HISTORY\n"
                           "ORDER BY SEQUENCE# DESC",
                           "Redo Log History",
                           "0800");

static toSQL SQLLogHistory7("toBackup:LogHistory",
                            "SELECT \n"
                            "   THREAD# \"Thread#\",\n"
                            "   SEQUENCE# \"Sequence#\",\n"
                            "   TIME \"Time of first entry\",\n"
                            "   LOW_CHANGE# \"Lowest  SCN\",\n"
                            "   (HIGH_CHANGE#-1) \"Highest SCN\",\n"
                            "   ARCHIVE_NAME \"Archived log name\"\n"
                            "FROM V$LOG_HISTORY\n"
                            "ORDER BY SEQUENCE# DESC",
                            "",
                            "0703");

static toSQL SQLOnlineBackup("toBackup:OnlineBackup",
                             "SELECT MIN(VBD.CHECKPOINT_CHANGE#)-MAX(VBD.CHECKPOINT_CHANGE#)\n"
                             "  FROM V$BACKUP_DATAFILE VBD, V$DATAFILE VDF,\n"
                             "       (SELECT CREATION_CHANGE#,\n"
                             "               MAX(COMPLETION_TIME) COMPLETION_TIME\n"
                             "          FROM V$BACKUP_DATAFILE \n"
                             "         WHERE CREATION_CHANGE# IN (SELECT CREATION_CHANGE# FROM V$DATAFILE)\n"
                             "         GROUP BY CREATION_CHANGE#) QUERY1\n"
                             " WHERE VBD.CREATION_CHANGE# = VDF.CREATION_CHANGE#\n"
                             "   AND VBD.CREATION_CHANGE# = QUERY1.CREATION_CHANGE#\n"
                             "   AND VBD.COMPLETION_TIME = QUERY1.COMPLETION_TIME",
                             "Check if online backup or not. Should return 0 if cold backup",
                             "0800");

static toSQL SQLOnlineBackup7("toBackup:OnlineBackup",
                              "SELECT 0 FROM DUAL",
                              "",
                              "0703");

static toSQL SQLLastBackup("toBackup:LastBackup",
                           "SELECT VDF.NAME \"Filename\",\n"
                           "       VBD.COMPLETION_TIME \"Completion time\",\n"
                           "       CASE WHEN VBD.COMPLETION_TIME > VDF.unrecoverable_time THEN 'Unrecoverable change' ELSE 'Backed up' END \"Type\",\n"
                           "       VBD.DATAFILE_BLOCKS*VBD.BLOCK_SIZE \"File size\",\n"
                           "       VBD.BLOCKS*VBD.BLOCK_SIZE \"Bytes written\",\n"
                           "       VBD.INCREMENTAL_LEVEL \"Level\",\n"
                           "       VBD.CHECKPOINT_CHANGE# \"Ckpt change#\",\n"
                           "       VBD.CHECKPOINT_TIME \"Checkpoint time\",\n"
                           "       VBD.MARKED_CORRUPT \"Mrkd crpt\",\n"
                           "       VBD.MEDIA_CORRUPT \"Media crpt\",\n"
                           "       VBD.LOGICALLY_CORRUPT \"Logically corrupt\"\n"
                           "  FROM V$BACKUP_DATAFILE VBD, V$DATAFILE VDF,\n"
                           "       (SELECT CREATION_CHANGE#,\n"
                           "               MAX(COMPLETION_TIME) COMPLETION_TIME\n"
                           "          FROM V$BACKUP_DATAFILE\n"
                           "         WHERE CREATION_CHANGE# IN (SELECT CREATION_CHANGE# FROM V$DATAFILE)\n"
                           "         GROUP BY CREATION_CHANGE#) QUERY1\n"
                           " WHERE VBD.CREATION_CHANGE# = VDF.CREATION_CHANGE#\n"
                           "   AND VBD.CREATION_CHANGE# = QUERY1.CREATION_CHANGE#\n"
                           "   AND VBD.COMPLETION_TIME = QUERY1.COMPLETION_TIME\n"
                           "UNION\n"
                           "SELECT NAME,\n"
                           "       CREATION_TIME,\n"
                           "       'Added since last backup',\n"
                           "       Bytes,\n"
                           "       0,\n"
                           "       0,\n"
                           "       TO_NUMBER(NULL),\n"
                           "       TO_DATE(NULL),\n"
                           "       0,\n"
                           "       0,\n"
                           "       0\n"
                           "  FROM V$DATAFILE\n"
                           " WHERE CREATION_CHANGE# NOT IN (SELECT DISTINCT CREATION_CHANGE# FROM V$BACKUP_DATAFILE)\n"
                           " ORDER BY 2 DESC, 5 DESC, 6 DESC",
                           "Get datafiles in most recent backup",
                           "0800");

static toSQL SQLLastBackup7("toBackup:LastBackup",
                            "SELECT 'Backup information not available in Oracle 7' \"Unsupported\" FROM DUAL",
                            "",
                            "0703");

static toSQL SQLCurrentBackup("toBackup:CurrentBackup",
                              "SELECT SID \"Sid\",\n"
                              "       SERIAL# \"Serial#\",\n"
                              "       CONTEXT \"Context\",\n"
                              "       SOFAR \"So far\",\n"
                              "       TOTALWORK \"Total\",\n"
                              "       ROUND(SOFAR/TOTALWORK*100,2) \"% Complete\"\n"
                              "  FROM V$SESSION_LONGOPS\n"
                              " WHERE OPNAME LIKE 'RMAN%'\n"
                              "   AND OPNAME NOT LIKE '%aggregate%'\n"
                              "   AND TOTALWORK != 0\n"
                              "   AND SOFAR <> TOTALWORK",
                              "Display current RMAN progress",
                              "0801");

static toSQL SQLCurrentBackup8("toBackup:CurrentBackup",
                               "SELECT SID \"Sid\",\n"
                               "       SERIAL# \"Serial#\",\n"
                               "       CONTEXT \"Context\",\n"
                               "       SOFAR \"So far\",\n"
                               "       TOTALWORK \"Total\",\n"
                               "       ROUND(SOFAR/TOTALWORK*100,2)   \"% Complete\"\n"
                               "  FROM GV$SESSION_LONGOPS\n"
                               " WHERE COMPNAM = 'dbms_backup_restore'\n"
                               "   AND ROUND(SOFAR/TOTALWORK*100,2) < 100\n"
                               " ORDER BY 1 DESC",
                               "",
                               "0800");

static toSQL SQLCurrentBackup7("toBackup:CurrentBackup",
                               "SELECT * FROM DUAL WHERE NULL = NULL",
                               "",
                               "0703");

toBackup::toBackup(toTool* tool, QWidget *main, toConnection &connection)
        : toToolWidget(*tool, "backup.html", main, connection, "toBackup")
        , tool_(tool)
{
    QToolBar *toolbar = toAllocBar(this, tr("Backup Manager"));
    layout()->addWidget(toolbar);

    updateAct = new QAction(QPixmap(const_cast(refresh_xpm)),
                            tr("Update"), this);
    updateAct->setShortcut(QKeySequence::Refresh);
    connect(updateAct, SIGNAL(triggered()), this, SLOT(refresh(void)));
    toolbar->addAction(updateAct);

    toolbar->addWidget(new toSpacer());

    new toChangeConnection(toolbar, TO_TOOLBAR_WIDGET_NAME);

    Tabs = new QTabWidget(this);
    layout()->addWidget(Tabs);

    QWidget *box = new QWidget(Tabs);
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->setSpacing(0);
    vbox->setContentsMargins(0, 0, 0, 0);
    box->setLayout(vbox);

    vbox->addWidget(new QLabel(tr("Logswitches per day and hour"), box));
    LogSwitches = new toResultTableView(true, false, box);
    LogSwitches->setSQL(SQLLogSwitches);
    vbox->addWidget(LogSwitches);
    Tabs->addTab(box, tr("Redo Switches"));

    LogHistory = new toResultTableView(true, false, Tabs);
    LogHistory->setSQL(SQLLogHistory);
    Tabs->addTab(LogHistory, tr("Archived Logs"));

    box = new QWidget(Tabs);
    vbox = new QVBoxLayout;
    vbox->setSpacing(0);
    vbox->setContentsMargins(0, 0, 0, 0);
    box->setLayout(vbox);

    LastLabel = new QLabel(box);
    vbox->addWidget(LastLabel);
    LastBackup = new toResultTableView(true, false, box);
    vbox->addWidget(LastBackup);
    LastBackup->setSQL(SQLLastBackup);
    Tabs->addTab(box, tr("Last Backup"));

    CurrentBackup = new toResultTableView(true, false, Tabs);
    CurrentBackup->setSQL(SQLCurrentBackup);
    Tabs->addTab(CurrentBackup, tr("Backup Progress"));

    ToolMenu = NULL;
    connect(toMainWidget()->workspace(), SIGNAL(subWindowActivated(QMdiSubWindow *)),
            this, SLOT(windowActivated(QMdiSubWindow *)));

    refresh();

    setFocusProxy(Tabs);
}

void toBackup::windowActivated(QMdiSubWindow *widget)
{
    if (!widget)
        return;
    if (widget->widget() == this)
    {
        if (!ToolMenu)
        {
            ToolMenu = new QMenu(tr("&Backup Manager"), this);

            ToolMenu->addAction(updateAct);

            toMainWidget()->addCustomMenu(ToolMenu);
        }
    }
    else
    {
        delete ToolMenu;
        ToolMenu = NULL;
    }
}

toBackup::~toBackup()
{
    try
    {
        tool_->closeWindow(connection());
    }
    TOCATCH
}

void toBackup::refresh()
{
    LogSwitches->refresh();
    LogHistory->refresh();
    int val = 0;
    try
    {
        toQuery query(connection(), SQLOnlineBackup);
        val = query.readValue().toInt();
    }
    catch (...)
        {}
    if (val == 0)
        LastLabel->setText(tr("This appears to be a cold backup database"));
    else
        LastLabel->setText(tr("This appears to be a hot backup database"));
    LastBackup->refresh();
    CurrentBackup->refresh();
}

tora-2.1.3/src/toextract.h0000644000175000017500000007321011332067047015233 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#ifndef TO_EXTRACT
#define TO_EXTRACT

#include "config.h"

#include 
#include 

#include 
#include 
#include 
#include 
//Added by qt3to4:
#include 

class QWidget;
class toConnection;

#include "tosqlparse.h"

// Liberally ported from DDL::Oracle 1.06
// Copyright (c) 2000, 2001 Richard Sutherland - United States of America

/**
 * This class can be used to reverse engineered database objects.
 */

class toExtract
{
public:
    /** Describes an available datatype for the database.
     */
    class datatype
    {
    private:
        QString Name;
        int MaxLength;
        int MaxPrecision;
    public:
        /** Create a new datatype description.
         * @param name Name of datatype.
         * @param maxLength Maximum length of parameter if length is needed.
         * @param maxPrecision Maximum precision of parameter if precision is supported.
         */
        datatype(const QString &name, int maxLength = -1, int maxPrecision = -1)
                : Name(name), MaxLength(maxLength), MaxPrecision(maxPrecision)
        { }
        /** Returns true if type has length specification.
         */
        bool hasLength()
        {
            return MaxLength != -1;
        }
        /** Returns true if type has precision specification.
         */
        bool hasPrecision()
        {
            return MaxPrecision != -1;
        }
        /** Get the maximum length value.
         */
        int maxLength()
        {
            return MaxLength;
        }
        /** Get the maximum precision of the datatype.
         */
        int maxPrecision()
        {
            return MaxPrecision;
        }
        /** Get the name of the datatype.
         */
        const QString &name()
        {
            return Name;
        }

        /** Implemented so that you can easily sort a list of them. Just compares the names.
         */
        bool operator < (const datatype &dat) const
        {
            return Name < dat.Name;
        }
        /** Implemented so that you can easily sort a list of them. Just compares the names.
         */
        bool operator == (const datatype &dat) const
        {
            return Name == dat.Name;
        }
    };

    /** This is an abstract class to implement part of an extractor for a database. Observe
     * that an extractor must be stateless and threadsafe except for constructors and
     * destructors. Use the toExtract::context function for saving context.
     */
    class extractor
    {
    protected:
        /** Register an operation to be handled by this extractor.
         * @param db Database this extractor works on.
         * @param oper What kind of operation to implement. Can be one of CREATE,
         *             DESCRIBE, MIGRATE or DROP.
         * @param type The type of object that this is implemented for. Database specific.
         */
        void registerExtract(const QString &db,
                             const QString &oper,
                             const QString &type);
        /** Unregister an operation to be handled by this extractor.
         * @param db Database this extractor works on.
         * @param oper What kind of operation to implement. Can be one of CREATE,
         *             DESCRIBE, MIGRATE or DROP.
         * @param type The type of object that this is implemented for. Database specific.
         */
        void unregisterExtract(const QString &db,
                               const QString &oper,
                               const QString &type);
    public:
        /** Create an extractor. Normally called from a statical instantiator. Should register
         * objects it can handle @ref registerExtract. Apart from the objects it handles one
         * extractor per database can also register an empty operation and type parameter to
         * @ref registerExtract which will be called to initialize an extractor once per
         * constructed toExtract object.
         * operation.
         */
        extractor();
        /** Destructor.
         */
        virtual ~extractor();

        /** Initiate an extractor for a given connection. Can be used to set up states necessary
         * for further processing. Should probably set blocksize to be used for resizing (@ref
         * toExtract::setBlocksize).
         * @param ext Extractor to generate script.
         */
        virtual void initialize(toExtract &ext) const;

        /** Called to generate a script to recreate a database object.
         * @param ext Extractor to generate script.
         * @param stream Stream to write script to.
         * @param type Type of object to recreate.
         * @param schema Specify the schema of the output script or description. If empty
         *               don't specify any object. If the string "1" use same object as input.
         *               Otherwise use the specified schema.
         * @param owner Owner of database object.
         * @param name Name of database object.
         * @return A string containing a script to recreate an object.
         */
        virtual void create(toExtract &ext,
                            QTextStream &stream,
                            const QString &type,
                            const QString &schema,
                            const QString &owner,
                            const QString &name) const;
        /** Called to describe a database object.
         * @param ext Extractor to generate script.
         * @param lst List of descriptions for the object. Should be appended.
         * @param type Type of object to recreate.
         * @param schema Specify the schema of the output script or description. If empty
         *               don't specify any object. If the string "1" use same object as input.
         *               Otherwise use the specified schema.
         * @param owner Owner of database object.
         * @param name Name of database object.
         */
        virtual void describe(toExtract &ext,
                              std::list &lst,
                              const QString &type,
                              const QString &schema,
                              const QString &owner,
                              const QString &name) const;
        /** Called to generate a script to migrate a database object from one description to
         * another description.
         * @param ext Extractor to generate script.
         * @param type Type of object to migrate.
         * @param src Source description list.
         * @param dst Destination description list.
         * @return A script to change the src database object to dst.
         */
        virtual void migrate(toExtract &ext,
                             QTextStream &stream,
                             const QString &type,
                             std::list &src,
                             std::list &dst) const;

        /** Called to generate a script to drop an object.
         * @param ext Extractor to generate script.
         * @param type Type of object to recreate.
         * @param schema Specify the schema of the output script or description. If empty
         *               don't specify any object. If the string "1" use same object as input.
         *               Otherwise use the specified schema.
         * @param owner Owner of database object.
         * @param name Name of database object.
         * @return A string containing a script to recreate an object.
         */
        virtual void drop(toExtract &ext,
                          QTextStream &stream,
                          const QString &type,
                          const QString &schema,
                          const QString &owner,
                          const QString &name) const;

        /** Get the available datatypes for the database.
         */
        virtual std::list datatypes() const;
    };

private:
    toConnection &Connection;
    QWidget *Parent;

    // Attributes
    QString Schema;
    QString Resize;
    bool Code;
    bool Comments;
    bool Constraints;
    bool Contents;
    bool Grants;
    bool Heading;
    bool Indexes;
    bool Parallel;
    bool Partition;
    bool Prompt;
    bool Storage;
    bool Initialized;
    bool Replace; // if object creation extracts should support RE-creation of existing objects

    int CommitDistance;

    // Database info
    int BlockSize;
    std::list Initial;
    std::list Next;
    std::list Limit;

    // Context, can be used by the extractor to save context
    std::map Context;

    // Stuff to handle extractors
    static std::map *Extractors;

    static void allocExtract(void);
    static QString extractorName(const QString &db,
                                 const QString &oper,
                                 const QString &type);
    static extractor *findExtractor(toConnection &conn,
                                    const QString &oper,
                                    const QString &type);
    extractor *findExtractor(const QString &oper,
                             const QString &type)
    {
        return findExtractor(Connection, oper, type);
    }
    void initialize(void);

    // General internal functions

    /** Parse an object string to get owner and name of the object.
     * @param object Object string on the format {owner}.{name}.
     * @param owner Reference to string which will get the object owner.
     * @param name Reference to string which will get the object name.
     */
    void parseObject(const QString &object, QString &owner, QString &name);
    void setSizes(void);

    void rethrow(const QString &what, const QString &object, const QString &exc);
    QString generateHeading(const QString &action, std::list &list);
    static std::map > migrateGroup(std::list &grpLst);
public:
    /** Create a new extractor.
     * @param conn Connection to extract from.
     * @param parent Parent widget of progress indicator.
     */
    toExtract(toConnection &conn, QWidget *parent);

    /** Create script to recreate list of objects.
     * @param object List of object. This has the format {type}:{schema}.{object}.
     *               The type is database dependent but can as an example be of
     *               CONSTRAINT, DATABASE LINK, EXCHANGE INDEX,
     *               EXCHANGE TABLE, FUNCTION, INDEX, MATERIALIZED VIEW,
     *               MATERIALIZED VIEW LOG, PACKAGE, PACKAGE BODY, PROCEDURE,
     *               PROFILE, ROLE, ROLE GRANTS, ROLLBACK SEGMENT, SEQUENCE,
     *               SNAPSHOT, SNAPSHOT LOG, SYNONYM, TABLE, TABLE FAMILY,
     *               TABLE CONTENTS, TABLE REFERENCES, TABLESPACE, TRIGGER,
     *               TRIGGER, TYPE, USER, USER GRANTS for Oracle databases.
     * @return A string containing a script to recreate the specified objects.
     */
    QString create(std::list &object)
    {
        QString ret;
        QTextStream s(&ret, QIODevice::WriteOnly);
        create(s, object);
        return ret;
    }
    /** Create script to recreate list of objects.
     * @param stream Stream to write result to.
     * @param object List of object. This has the format {type}:{schema}.{object}.
     *               The type is database dependent but can as an example be of
     *               CONSTRAINT, DATABASE LINK, EXCHANGE INDEX,
     *               EXCHANGE TABLE, FUNCTION, INDEX, MATERIALIZED VIEW,
     *               MATERIALIZED VIEW LOG, PACKAGE, PACKAGE BODY, PROCEDURE,
     *               PROFILE, ROLE, ROLE GRANTS, ROLLBACK SEGMENT, SEQUENCE,
     *               SNAPSHOT, SNAPSHOT LOG, SYNONYM, TABLE, TABLE FAMILY,
     *               TABLE CONTENTS, TABLE REFERENCES, TABLESPACE, TRIGGER,
     *               TRIGGER, TYPE, USER, USER GRANTS for Oracle databases.
     */
    void create(QTextStream &stream, std::list &object);

    /** Create a description of objects.
     * @param object List of object. This has the format {type}:{schema}.{object}.
     *               The type is database dependent but can as an example be of
     *               CONSTRAINT, DATABASE LINK, EXCHANGE INDEX,
     *               EXCHANGE TABLE, FUNCTION, INDEX, MATERIALIZED VIEW,
     *               MATERIALIZED VIEW LOG, PACKAGE, PACKAGE BODY, PROCEDURE,
     *               PROFILE, ROLE, ROLE GRANTS, ROLLBACK SEGMENT, SEQUENCE,
     *               SNAPSHOT, SNAPSHOT LOG, SYNONYM, TABLE, TABLE FAMILY,
     *               TABLE CONTENTS, TABLE REFERENCES, TABLESPACE, TRIGGER,
     *               TRIGGER, TYPE, USER, USER GRANTS for Oracle databases.
     * @return A list of strings describing the objects. Each string should be
     *         considered like a list of strings separated by the character '\001'.
     *         The later in each string the smaller item the change and it is hierachical.
     */
    std::list describe(std::list &object);

    /** Create script to drop a list of objects.
     * @param object List of object. This has the format {type}:{schema}.{object}.
     *               The type is database dependent but can as an example be of
     *               CONSTRAINT, DATABASE LINK, EXCHANGE INDEX,
     *               EXCHANGE TABLE, FUNCTION, INDEX, MATERIALIZED VIEW,
     *               MATERIALIZED VIEW LOG, PACKAGE, PACKAGE BODY, PROCEDURE,
     *               PROFILE, ROLE, ROLE GRANTS, ROLLBACK SEGMENT, SEQUENCE,
     *               SNAPSHOT, SNAPSHOT LOG, SYNONYM, TABLE, TABLE FAMILY,
     *               TABLE CONTENTS, TABLE REFERENCES, TABLESPACE, TRIGGER,
     *               TRIGGER, TYPE, USER, USER GRANTS for Oracle databases.
     * @return A string containing a script to drop the specified objects.
     */
    QString drop(std::list &object)
    {
        QString ret;
        QTextStream s(&ret, QIODevice::WriteOnly);
        drop(s, object);
        return ret;
    }

    /** Create script to drop a list of objects.
     * @param stream Stream to write result to.
     * @param object List of object. This has the format {type}:{schema}.{object}.
     *               The type is database dependent but can as an example be of
     *               CONSTRAINT, DATABASE LINK, EXCHANGE INDEX,
     *               EXCHANGE TABLE, FUNCTION, INDEX, MATERIALIZED VIEW,
     *               MATERIALIZED VIEW LOG, PACKAGE, PACKAGE BODY, PROCEDURE,
     *               PROFILE, ROLE, ROLE GRANTS, ROLLBACK SEGMENT, SEQUENCE,
     *               SNAPSHOT, SNAPSHOT LOG, SYNONYM, TABLE, TABLE FAMILY,
     *               TABLE CONTENTS, TABLE REFERENCES, TABLESPACE, TRIGGER,
     *               TRIGGER, TYPE, USER, USER GRANTS for Oracle databases.
     * @return A string containing a script to drop the specified objects.
     */
    void drop(QTextStream &stream, std::list &object);

    /** Called to generate a script to migrate a database object from one description to
     * another description.
     * @param stream Stream to write result to.
     * @param src Source description list, generated by describes for the same database.
     * @param dst Destination description list, generated by describes for the same database.
     * @return A script to change the src database object to dst.
     */
    QString migrate(std::list &drpLst, std::list &crtLst)
    {
        QString ret;
        QTextStream s(&ret, QIODevice::WriteOnly);
        migrate(s, drpLst, crtLst);
        return ret;
    }

    /** Called to generate a script to migrate a database object from one description to
     * another description.
     * @param stream Stream to write result to.
     * @param src Source description list, generated by describes for the same database.
     * @param dst Destination description list, generated by describes for the same database.
     * @return A script to change the src database object to dst.
     */
    void migrate(QTextStream &stream, std::list &drpLst, std::list &crtLst);

    /** Set a context for this extractor.
     * @param name Name of this context
     * @param val Value of this context
     */
    void setState(const QString &name, const QVariant &val);
    /** Get the value of a context for the current extractor.
     * @param name Name of the context to extract.
     * @return The value of the context.
     */
    QVariant state(const QString &name);

    /** Set the schema of the extraction.
     * @param schema Specify the schema of the output script or description. If empty
     *               don't specify any object. If the string "1" use same object as input.
     *               Otherwise use the specified schema.
     */
    void setSchema(const QString &schema)
    {
        Schema = schema;
    }
    /** Set sizes to use for resize of object on extraction.
     * @param A list of sizes separated by ':'. Should be an even multiple of three where
     *        the first value is the largest current size to use these values. The next
     *        value is the initial value to use, the last is the next increment value to
     *        use. As a special case the string "1" can be used to set up auto resize.
     */
    void setResize(const QString &resize)
    {
        Resize = resize;
        setSizes();
    }
    /** Set inclusion of prompts.
     * @param prompt If prompt generation should be generated.
     */
    void setPrompt(bool prompt)
    {
        Prompt = prompt;
    }
    /** Include heading in scripts.
     * @param heading Include heading in scripts.
     */
    void setHeading(bool heading)
    {
        Heading = heading;
    }
    /** Include constraints in extraction.
     * @param constraints Include constraints.
     */
    void setConstraints(bool constraints)
    {
        Constraints = constraints;
    }
    /** Include indexes in extraction.
     * @param indexes Include indexes.
     */
    void setIndexes(bool indexes)
    {
        Indexes = indexes;
    }
    /** Include grants in extraction.
     * @param val Include grants.
     */
    void setGrants(bool val)
    {
        Grants = val;
    }
    /** Include storage specification in extraction.
     * @param val Include storage specification.
     */
    void setStorage(bool val)
    {
        Storage = val;
    }
    /** Include parallel specification in extraction.
     * @param val Include parallel specification.
     */
    void setParallel(bool val)
    {
        Parallel = val;
    }
    /** Include partition specification in extraction.
     * @param val Include partition specification.
     */
    void setPartition(bool val)
    {
        Partition = val;
    }
    /** Include contents of tables in scripts.
     * @param val Include contents of tables.
     * @param commitdistance The commit distance of the contents 0 means whole tables.
     */
    void setContents(bool val, int commitdistance)
    {
        Contents = val;
        CommitDistance = commitdistance;
    }
    /** Include comments in extraction.
     * @param val Include indexes.
     */
    void setComments(bool val)
    {
        Comments = val;
    }
    /** Include code in extraction.
     * @param val Include code.
     */
    void setCode(bool val)
    {
        Code = val;
    }
    /** Support RE-creation of existing objects in "create" extracts.
     * @param val Include code.
     */
    void setReplace(bool val)
    {
        Replace = val;
    }
    /** Set blocksize of database.
     * @param val New value of blocksize.
     */
    void setBlockSize(int val)
    {
        BlockSize = val;
        setSizes();
    }

    /** Get schema specification.
     * @return Schema specification.
     * @see setSchema
     */
    const QString &getSchema(void)
    {
        return Schema;
    }
    /** Get resize specification.
     * @return Resize specification.
     * @see setResize
     */
    bool getResize(void)
    {
        return !Resize.isEmpty();
    }
    /** Check if prompt are generated.
     * @return If prompts are generated.
     */
    bool getPrompt(void)
    {
        return Prompt;
    }
    /** Check if headings are generated.
     * @return If headings are generated.
     */
    bool getHeading(void)
    {
        return Heading;
    }
    /** Check if constraints are generated.
     * @return If constraints are generated.
     */
    bool getConstraints(void)
    {
        return Constraints;
    }
    /** Check if indexes are generated.
     * @return If indexes are generated.
     */
    bool getIndexes(void)
    {
        return Indexes;
    }
    /** Check if grants are generated.
     * @return If grants are generated.
     */
    bool getGrants(void)
    {
        return Grants;
    }
    /** Check if storage specification are generated.
     * @return If storage specification are generated.
     */
    bool getStorage(void)
    {
        return Storage;
    }
    /** Check if parallell specification are generated.
     * @return If parallell specification are generated.
     */
    bool getParallel(void)
    {
        return Parallel;
    }
    /** Check if partition specification are generated.
     * @return If partition specification  are generated.
     */
    bool getPartition(void)
    {
        return Partition;
    }
    /** Check if contents of tables are generated.
     * @return If content is generated.
     */
    bool getContents(void)
    {
        return Contents;
    }
    /** Check if support RE-creation of existing objects in "create" extracts is enabled.
     * @return If RE-creation is enabled.
     */
    bool getReplace(void)
    {
        return Replace;
    }
    /** Get the distance of the commits when content is generated.
     * @return Commit distance.
     */
    int getCommitDistance(void)
    {
        return CommitDistance;
    }
    /** Check if comments are generated.
     * @return If comments are generated.
     */
    bool getComments(void)
    {
        return Comments;
    }
    /** Check if code is generated.
     * @return If code is generated.
     */
    bool getCode(void)
    {
        return Code;
    }
    /** Get blocksize.
     */
    int getBlockSize(void)
    {
        return BlockSize;
    }
    /** Get the connection this extractor is working on.
     */
    toConnection &connection()
    {
        return Connection;
    }

    /** Fill in the initial and next value for an object currently holding a @ref number of
     * allocated blocks. Uses the resize or default sizes.
     * @param blocks Blocks currently allocated.
     * @param initial New initial value.
     * @param next New next value.
     */
    void initialNext(const QString &blocks, QString &initial, QString &next);

    /** Get the schema name specified by the extractor setup. Will include the following '.'
     * if needed.
     * @param owner Owner of object to get schema for.
     * @param desc Used from describe and not to generate script.
     * @return The translated schema.
     */
    QString intSchema(const QString &owner, bool desc);

    /** Get the available datatypes for a database.
     * @return A list of datatypes.
     */
    std::list datatypes();

    /** Utility function, creates a statement from the start to the end specified by the
     * parameters. The connection used to specify parsing is the one of the extractor.
     * @param start Start of parameters.
     * @param end End of parameters.
     * @return The indented statement.
     */
    QString createFromParse(std::list::iterator start,
                            std::list::iterator end);

    /** Create a source and destination object list to two other lists
     * containing dropped and created objects or attributes.
     * @param source Source list input (Will not be modified).
     * @param destination Destination list input (Will not be modified).
     * @param drop Drop list output (Will be overwritten).
     * @param create Create list output (Will be overwritten).
     */
    static void srcDst2DropCreate(std::list &source, std::list &destination,
                                  std::list &drop, std::list &creat);

    /** Check if a database is supported at all by the extractor.
     * @param conn Connection to check for support.
     * @return True if the database is supported.
     */
    static bool canHandle(toConnection &conn);

    /** Add a list to description.
     * @param ret The return list to add a line to.
     * @param ctx The current description context.
     * @param arg1 First extra argument to add.
     */
    static void addDescription(std::list &ret, const std::list &ctx,
                               const QString &arg1 = QString::null, const QString &arg2 = QString::null,
                               const QString &arg3 = QString::null, const QString &arg4 = QString::null,
                               const QString &arg5 = QString::null, const QString &arg6 = QString::null,
                               const QString &arg7 = QString::null, const QString &arg8 = QString::null,
                               const QString &arg9 = QString::null);
    /** Split a description line into its components.
     * @param str The description line to split.
     * @return The list of components.
     */
    static std::list splitDescribe(const QString &str);

    /** Get the part of a description indicated by the level
     * @param str Description string
     * @param level The level to get (0 is the first level)
     */
    static QString partDescribe(const QString &str, int level);

    /** Get the context of a given level.
     * @param str Description string
     * @param level The level to get the context for (1 is the first to not return empty string.
     * @return The context, if not enough parts are available null is returned.
     */
    static QString contextDescribe(const QString &str, int level);

    /** Used to get column information from a describe list
     */
    struct columnInfo
    {
        /** Name of column
         */
        QString Name;
        /** Definition of column
         */
        QString Definition;
        /** Extra data for the column (Except for order which has own field.
         */
        std::map Data;
        /** Order of the column. Used for sorting.
         */
        int Order;

        /** Can column be null?
         */
        bool bNotNull;

        /** Default value for column
         */
        QString DefaultValue;

        /** Column comment
         */
        QString Comment;

        /** Create column information from name.
         */
        columnInfo(const QString &name)
                : Name(name)
        {
            Order = 0;
        }
        /** Implement sort order based only on Order field.
         */
        bool operator <(const columnInfo &inf)
        {
            return Order < inf.Order;
        }
        /** Implement sort order based only on Order field.
         */
        bool operator ==(const columnInfo &inf)
        {
            return Order == inf.Order;
        }
    };

    /** Parse a column description and return a sorted list of column data.
     * @param begin The iterator indicating the beginning to start searching from (Inclusive).
     * @param end The iterator indicating the end to end searching at (Not inclusive).
     * @param level Number of levels of context to discard before looking for "COLUMN" definition.
     * @return The list of column definitions. Sorted by column order.
     */
    static std::list parseColumnDescription(std::list::const_iterator begin,
            std::list::const_iterator end,
            int level = 3);

    /** Parse a column description and return a sorted list of column data.
     * @param description A description list. Will go through entire list.
     * @param level Number of levels of context to discard before looking for "COLUMN" definition.
     * @return The list of column definitions. Sorted by column order.
     */
    static std::list parseColumnDescription(const std::list &description, int level = 3)
    {
        return parseColumnDescription(description.begin(), description.end(), level);
    }

    friend class extractor;
};

#endif
tora-2.1.3/src/toconfiguration.cpp0000644000175000017500000015764011363646201016774 0ustar  michaelmichael/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 *
 * Shared/mixed copyright is held throughout files in this product
 *
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2008 Numerous Other Contributors
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 *
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries.
 *
 *      You may link this product with any GPL'd Qt library.
 *
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#include "toconfiguration.h"

// #include 
// #include 

#include "utils.h"

// A little magic to get lrefresh to work and get a check on qApp
#undef QT_TRANSLATE_NOOP
#define QT_TRANSLATE_NOOP(x,y) QTRANS(x,y)

#include "toconf.h"

#include 
#include 
#include 
//#ifdef Q_OS_WIN32
//#include 
//#include 
//#endif


class toConfigurationPrivate
{
public:
    QString m_provider;
    bool    m_savePassword;
    QString m_defaultPassword;
    QString m_defaultDatabase;
    QString m_defaultUser;
    QString m_defaultHost;
    int     m_maxNumber;
    int     m_maxColSize;
    int     m_maxColDisp;
    QString m_planTable;
    QString m_planCheckpoint;
    QString m_textFont;
    QString m_codeFont;
    QString m_listFont;
    QString m_dateFormat;
    QString m_refresh;
    bool    m_highlight;
    bool    m_keywordUpper;
    bool    m_objectNamesUpper;
    QString m_pluginDir;
    QString m_cacheDir;
    bool    m_cacheDisk;
    QString m_sqlFile;
    int     m_statusMessage;
    bool    m_dbTitle;
    QString m_sizeUnit;
    QString m_helpPath;
    int     m_statusSave;
    bool    m_autoCommit;
    bool    m_changeConnection;
    int     m_connectSize;
    QString m_defaultTool;
    int     m_chartSamples;
    int     m_displaySamples;
    bool    m_codeCompletion;
    bool    m_completionSort;
    bool    m_autoIndent;
    bool    m_dontReread;
    int     m_autoLong;
    bool    m_messageStatusbar;
    bool    m_tabbedTools;
    bool    m_colorizedConnections;
    ConnectionColors m_connectionColors;
    int     m_objectCache;
    bool    m_bkgndConnect;
    bool    m_firewallMode;
    int     m_connTestInterval;
    int     m_maxContent;
    bool    m_keepPlans;
    bool    m_vsqlPlans;
    bool    m_restoreSession;
    QString m_defaultSession;
    int     m_defaultFormat;
    bool    m_autoIndentRo;
    bool    m_indicateEmpty;
    QString m_indicateEmptyColor;
    QString m_extensions;
    int     m_recentMax;
    QString m_lastDir;
    QString m_locale;
    int     m_keepAlive;
    int     m_numberFormat;
    int     m_numberDecimals;
    int     m_cacheTimeout;
    int     m_tabStop;
    bool    m_tabSpaces;
    bool    m_editDragDrop;
    bool    m_toadBindings;
    bool    m_displayGridlines;
    QString m_smtp;
    int     m_smtpPort;
    QString m_style;
    QString m_staticChecker; // path+name to static check script (used in code editor)

    // tooracleconnection
    int m_openCursors;
    int m_maxLong;

    // toqsqlconnection
    bool m_onlyForward;
    int  m_createAction;

    // main.cpp
    QString     m_lastVersion;
    QString     m_firstInstall;
    QByteArray  m_leftDockbarState;
    QByteArray  m_rightDockbarState;
    QStringList m_recentFiles;

    // tools
    ToolsMap m_tools;

    // toresultlistformat
    QString m_csvSeparator;
    QString m_csvDelimiter;

    // toeditextensions
    bool m_commaBefore;
    bool m_blockOpenLine;
    bool m_operatorSpace;
    bool m_rightSeparator;
    bool m_endBlockNewline;
    int  m_commentColumn;

    // tobrowser
    bool    m_filterIgnoreCase;
    bool    m_filterInvert;
    int     m_filterType;
    int     m_filterTablespaceType;
    QString m_filterText;

    // tohelp
    HelpsMap m_additionalHelp;

    // tochartmanager
    ChartsMap m_chartFiles;
    ChartsMap m_chartAlarms;

    // tooutput
    QString m_polling;
    int     m_logType;
    QString m_logUser;

    // torollback
    bool m_noExec;
    bool m_needRead;
    bool m_needTwo;
    bool m_alignLeft;
    bool m_oldEnable;

    // tosgatrace
    bool m_autoUpdate;

    // tostorage
    bool m_dispTablespaces;
    bool m_dispCoalesced;
    bool m_dispExtents;
    bool m_dispAvailableGraph;

    // totemplate
    TemplatesMap m_templates;

    // totuning
    /*! True if there are all features enabled.
      It's used when there is no m_tuningOverview defined in prefs. */
    bool m_tuningFirstRun;
    bool m_tuningOverview;
    bool m_tuningFileIO;
    bool m_tuningWaits;
    bool m_tuningCharts;

    // toworksheet
    bool m_wsAutoSave;
    bool m_wsCheckSave;
    QString m_wsAutoLoad;
    bool m_wsLogAtEnd;
    bool m_wsLogMulti;
    bool m_wsStatistics;
    bool m_wsTimedStats;
    bool m_wsNumber;
    bool m_wsMoveToErr;
    bool m_wsHistory;
    bool m_wsExecLog;
    bool m_wsToplevelDescribe;

    // tosyntaxsetup
    QString m_syntaxDefault;
    QString m_syntaxComment;
    QString m_syntaxNumber;
    QString m_syntaxKeyword;
    QString m_syntaxString;
    QString m_syntaxDefaultBg;
    QString m_syntaxErrorBg;
    QString m_syntaxDebugBg;
    QString m_syntaxCurrentLineMarker;
    QString m_syntaxStaticBg;
    bool    m_useMaxTextWidthMark;
    int     m_maxTextWidthMark;

    // mainwindow size
    QByteArray m_mainWindowGeometry;
    QByteArray m_mainWindowState;

    // shortcut editor
    bool               m_useEditorShortcuts;
    EditorShortcutsMap m_editorShortcuts;


    toConfigurationPrivate()
    {
        loadConfig();
    }

    /*! \brief Get directory name where to store session files.
      It's APPDATA on Windows, HOME on UNIX like systems
     */
    QString getSpecialDir()
    {
//#if defined(Q_OS_WIN32)
//        QString qstr;
//       char dir[256];
//        if ( SHGetSpecialFolderPath(NULL, dir, CSIDL_APPDATA, false) )
//       {
//            qstr = dir;
//            if( !qstr.endsWith("\\") )
//                qstr += "\\";
//            qstr.replace( '\\', '/' );
//       }
//        return qstr;
//#else
        return QDir::homePath() + "/";
//#endif
}



    void loadConfig()
    {
        int cnt; // tmp count holder for setting arrays
        QSettings s;
        s.beginGroup("preferences");
        m_provider = s.value(CONF_PROVIDER, DEFAULT_PROVIDER).toString();
        m_savePassword = s.value(CONF_SAVE_PWD, DEFAULT_SAVE_PWD).toBool();
        m_defaultPassword = s.value(CONF_PASSWORD, DEFAULT_PASSWORD).toString();
        m_defaultDatabase = s.value(CONF_DATABASE, DEFAULT_DATABASE).toString();
        m_defaultUser = s.value(CONF_USER, DEFAULT_USER).toString();
        m_defaultHost = s.value(CONF_HOST, DEFAULT_HOST).toString();

        // #define CONF_OPTIONS  "Options"
        // #define DEFAULT_OPTIONS  ""
        m_maxNumber = s.value(CONF_MAX_NUMBER, DEFAULT_MAX_NUMBER).toInt();
        m_maxColSize = s.value(CONF_MAX_COL_SIZE, DEFAULT_MAX_COL_SIZE).toInt();
        m_maxColDisp = s.value(CONF_MAX_COL_DISP, DEFAULT_MAX_COL_DISP).toInt();
        m_planTable = s.value(CONF_PLAN_TABLE, DEFAULT_PLAN_TABLE).toString();
        m_planCheckpoint = s.value(CONF_PLAN_CHECKPOINT, DEFAULT_PLAN_CHECKPOINT).toString();
        m_textFont = s.value(CONF_TEXT, "").toString();
        m_codeFont = s.value(CONF_CODE, "").toString();
        m_listFont = s.value(CONF_LIST, "").toString();
        m_dateFormat = s.value(CONF_DATE_FORMAT, DEFAULT_DATE_FORMAT).toString();
        m_refresh = s.value(CONF_REFRESH, DEFAULT_REFRESH).toString();
        m_highlight = s.value(CONF_HIGHLIGHT, true).toBool();
        m_keywordUpper = s.value(CONF_KEYWORD_UPPER, DEFAULT_KEYWORD_UPPER).toBool();
        m_objectNamesUpper = s.value(CONF_OBJECT_NAMES_UPPER, DEFAULT_OBJECT_NAMES_UPPER).toBool();

        m_pluginDir = s.value(CONF_PLUGIN_DIR, DEFAULT_PLUGIN_DIR).toString();
        m_cacheDir = s.value(CONF_CACHE_DIR, "").toString();
        m_cacheDisk = s.value(CONF_CACHE_DISK, DEFAULT_CACHE_DISK).toBool();
        m_sqlFile = s.value(CONF_SQL_FILE, getSpecialDir() + DEFAULT_SQL_FILE).toString();
        m_statusMessage = s.value(CONF_STATUS_MESSAGE, DEFAULT_STATUS_MESSAGE).toInt();

        m_dbTitle = s.value(CONF_DB_TITLE, true).toBool();
        m_sizeUnit = s.value(CONF_SIZE_UNIT, DEFAULT_SIZE_UNIT).toString();
        m_helpPath = s.value(CONF_HELP_PATH, "qrc:/help/toc.html").toString();
        m_statusSave = s.value(CONF_STATUS_SAVE, DEFAULT_STATUS_SAVE).toInt();
        m_autoCommit = s.value(CONF_AUTO_COMMIT, false).toBool();
        m_changeConnection = s.value(CONF_CHANGE_CONNECTION, true).toBool();

        // #define CONF_CONNECT_HISTORY "ConnectHistory"
        m_connectSize = s.value(CONF_CONNECT_SIZE, DEFAULT_CONNECT_SIZE).toInt();

        // #define CONF_CONNECT_CURRENT "ConnectCurrent"
        m_defaultTool = s.value(CONF_DEFAULT_TOOL).toString();
        // #define CONF_TOOL_ENABLE "Enabled"
        m_chartSamples = s.value(CONF_CHART_SAMPLES, DEFAULT_CHART_SAMPLES).toInt();
        m_displaySamples = s.value(CONF_DISPLAY_SAMPLES, DEFAULT_DISPLAY_SAMPLES).toInt();
        m_codeCompletion = s.value(CONF_CODE_COMPLETION, true).toBool();
        m_completionSort = s.value(CONF_COMPLETION_SORT, true).toBool();
        m_autoIndent = s.value(CONF_AUTO_INDENT, true).toBool();
        m_dontReread = s.value(CONF_DONT_REREAD, true).toBool();
        m_autoLong = s.value(CONF_AUTO_LONG, 0).toInt();
        m_messageStatusbar = s.value(CONF_MESSAGE_STATUSBAR, false).toBool();
        m_tabbedTools = s.value(CONF_TABBED_TOOLS, true).toBool();
        m_colorizedConnections = s.value("ColorizedConnections", true).toBool();
        cnt = s.beginReadArray("ConnectionColors");
        for (int i = 0; i < cnt; ++i)
        {
            s.setArrayIndex(i);
            m_connectionColors[s.value("key").toString()] = s.value("value").toString();
        }
        s.endArray();
        if (m_connectionColors.count() == 0)
        {
            m_connectionColors["#FF0000"] = "Production";
            m_connectionColors["#00FF00"] = "Development";
            m_connectionColors["#0000FF"] = "Testing";
        }

        m_objectCache = s.value(CONF_OBJECT_CACHE, DEFAULT_OBJECT_CACHE).toInt();
        m_bkgndConnect = s.value(CONF_BKGND_CONNECT, false).toBool();
        m_firewallMode = s.value(CONF_FIREWALL_MODE, false).toBool();
        m_connTestInterval = s.value(CONF_CONN_TEST_INTERVAL, DEFAULT_CONN_TEST_INTERVAL).toInt();
        m_maxContent = s.value(CONF_MAX_CONTENT, DEFAULT_MAX_CONTENT).toInt();
        m_keepPlans = s.value(CONF_KEEP_PLANS, false).toBool();
        m_vsqlPlans = s.value(CONF_VSQL_PLANS, true).toBool();
        m_restoreSession = s.value(CONF_RESTORE_SESSION, false).toBool();
        m_defaultSession = s.value(CONF_DEFAULT_SESSION, getSpecialDir() + DEFAULT_SESSION).toString();
        // FIXME!
        m_defaultFormat = s.value(CONF_DEFAULT_FORMAT, "").toInt();
        m_autoIndentRo = s.value(CONF_AUTO_INDENT_RO, true).toBool();
        m_indicateEmpty = s.value(CONF_INDICATE_EMPTY, true).toBool();
        m_indicateEmptyColor = s.value(CONF_INDICATE_EMPTY_COLOR, "#f2ffbc").toString();
        m_extensions = s.value(CONF_EXTENSIONS, DEFAULT_EXTENSIONS).toString();
        m_recentFiles = s.value(CONF_RECENT_FILES, QStringList()).toStringList();
        m_recentMax = s.value(CONF_RECENT_MAX, DEFAULT_RECENT_MAX).toInt();
        m_lastDir = s.value(CONF_LAST_DIR, "").toString();
        m_locale = s.value(CONF_LOCALE, QLocale().name()).toString();
        m_keepAlive = s.value(CONF_KEEP_ALIVE, DEFAULT_KEEP_ALIVE).toInt();
        m_numberFormat = s.value(CONF_NUMBER_FORMAT, DEFAULT_NUMBER_FORMAT).toInt();
        m_numberDecimals = s.value(CONF_NUMBER_DECIMALS, DEFAULT_NUMBER_DECIMALS).toInt();
        m_cacheTimeout = s.value(CONF_CACHE_TIMEOUT, DEFAULT_CACHE_TIMEOUT).toInt();
        m_tabStop = s.value(CONF_TAB_STOP, DEFAULT_TAB_STOP).toInt();
        m_tabSpaces = s.value(CONF_TAB_SPACES, DEFAULT_TAB_SPACES).toBool();
        m_editDragDrop = s.value(CONF_EDIT_DRAG_DROP, DEFAULT_EDIT_DRAG_DROP).toBool();
        m_toadBindings = s.value(CONF_TOAD_BINDINGS, DEFAULT_TOAD_BINDINGS).toBool();
        m_displayGridlines = s.value(CONF_DISPLAY_GRIDLINES, DEFAULT_DISPLAY_GRIDLINES).toBool();
        m_smtp = s.value(CONF_SMTP, DEFAULT_SMTP).toString();
        m_smtpPort = s.value(CONF_SMTP_PORT, DEFAULT_SMTP_PORT).toInt();
        m_style = s.value(CONF_STYLE, DEFAULT_STYLE).toString();
        m_staticChecker = s.value(CONF_STATIC_CHECKER, "").toString();
        // tooracleconnection.cpp
        m_openCursors = s.value(CONF_OPEN_CURSORS, DEFAULT_OPEN_CURSORS).toInt();
        m_maxLong = s.value(CONF_MAX_LONG, DEFAULT_MAX_LONG).toInt();
        // toqsqlconnection
        m_onlyForward = s.value(CONF_ONLY_FORWARD, DEFAULT_ONLY_FORWARD).toBool();
        m_createAction = s.value(CONF_CREATE_ACTION, DEFAULT_CREATE_ACTION).toInt();
        // main.cpp
        m_lastVersion = s.value(CONF_LAST_VERSION, "").toString();
        m_firstInstall = s.value(CONF_FIRST_INSTALL, "").toString();
        // tools
        cnt = s.beginReadArray(CONF_TOOLS);
        for (int i = 0; i < cnt; ++i)
        {
            s.setArrayIndex(i);
            m_tools[s.value("ToolName").toString()] = s.value("Enabled").toBool();
        }
        s.endArray();
        // toresultlistformat
        m_csvSeparator = s.value(CONF_CSV_SEPARATOR, DEFAULT_CSV_SEPARATOR).toString();
        m_csvDelimiter = s.value(CONF_CSV_DELIMITER, DEFAULT_CSV_DELIMITER).toString();
        // toeditextensions
        m_commaBefore = s.value(CONF_COMMA_BEFORE, true).toBool();
        m_blockOpenLine = s.value(CONF_BLOCK_OPEN_LINE, true).toBool();
        m_operatorSpace = s.value(CONF_OPERATOR_SPACE, true).toBool();
        m_rightSeparator = s.value(CONF_RIGHT_SEPARATOR, true).toBool();
        m_endBlockNewline = s.value(CONF_END_BLOCK_NEWLINE, true).toBool();
        m_commentColumn = s.value(CONF_COMMENT_COLUMN, DEFAULT_COMMENT_COLUMN).toInt();
        // tobrowser
        m_filterIgnoreCase = s.value(CONF_FILTER_IGNORE_CASE, false).toBool();
        m_filterInvert = s.value(CONF_FILTER_INVERT, false).toBool();
        m_filterType = s.value(CONF_FILTER_TYPE, 0).toInt();
        m_filterTablespaceType = s.value(CONF_FILTER_TABLESPACE_TYPE, 0).toInt();
        m_filterText = s.value(CONF_FILTER_TEXT, "").toString();
        // tohelp
        cnt = s.beginReadArray("AdditionalHelp");
        for (int i = 0; i < cnt; ++i)
        {
            s.setArrayIndex(i);
            m_additionalHelp[s.value("HelpName").toString()] = s.value("Path").toString();
        }
        s.endArray();
        // tochartmanager
        cnt = s.beginReadArray("ChartFiles");
        for (int i = 0; i < cnt; ++i)
        {
            s.setArrayIndex(i);
            m_chartFiles[s.value("Name").toString()] = s.value("Spec").toString();
        }
        s.endArray();
        cnt = s.beginReadArray("ChartAlarms");
        for (int i = 0; i < cnt; ++i)
        {
            s.setArrayIndex(i);
            m_chartAlarms[s.value("Name").toString()] = s.value("Spec").toString();
        }
        s.endArray();
        // tooutput
        m_polling = s.value(CONF_POLLING, DEFAULT_POLLING).toString();
        m_logType = s.value(CONF_LOG_TYPE, DEFAULT_LOG_TYPE).toInt();
        m_logUser = s.value(CONF_LOG_USER, DEFAULT_LOG_USER).toString();
        // torollback
        m_noExec = s.value(CONF_NO_EXEC, true).toBool();
        m_needRead = s.value(CONF_NEED_READ, true).toBool();
        m_needTwo = s.value(CONF_NEED_TWO, true).toBool();
        m_alignLeft = s.value(CONF_ALIGN_LEFT, true).toBool();
        m_oldEnable = s.value(CONF_OLD_ENABLE, false).toBool();
        // tosgatrace
        m_autoUpdate = s.value(CONF_AUTO_UPDATE, true).toBool();
        // tostorage
        m_dispTablespaces = s.value(CONF_DISP_TABLESPACES, true).toBool();
        m_dispCoalesced = s.value(CONF_DISP_COALESCED, false).toBool();
        m_dispExtents = s.value(CONF_DISP_EXTENTS, false).toBool();
        m_dispAvailableGraph = s.value(CONF_DISP_AVAILABLEGRAPH, true).toBool();
        // totemplate
        cnt = s.beginReadArray("Templates");
        for (int i = 0; i < cnt; ++i)
        {
            s.setArrayIndex(i);
            m_templates[s.value("Name").toString()] = s.value("File").toString();
        }
        s.endArray();
        // totuning
        m_tuningFirstRun = (s.value(CONF_OVERVIEW) == QVariant());
        m_tuningOverview = s.value(CONF_OVERVIEW, false).toBool();
        m_tuningFileIO = s.value(CONF_FILEIO, false).toBool();
        m_tuningWaits = s.value(CONF_WAITS, false).toBool();
        m_tuningCharts = s.value(CONF_CHART, false).toBool();
        // toworksheet
        m_wsAutoSave = s.value(CONF_AUTO_SAVE, false).toBool();
        m_wsCheckSave = s.value(CONF_CHECK_SAVE, true).toBool();
        m_wsAutoLoad = s.value(CONF_AUTO_LOAD, "").toString();
        m_wsLogAtEnd = s.value(CONF_LOG_AT_END, true).toBool();
        m_wsLogMulti = s.value(CONF_LOG_MULTI, true).toBool();
        m_wsStatistics = s.value(CONF_STATISTICS, false).toBool();
        m_wsTimedStats = s.value(CONF_TIMED_STATS, true).toBool();
        m_wsNumber = s.value(CONF_NUMBER, true).toBool();
        m_wsMoveToErr = s.value(CONF_MOVE_TO_ERR, true).toBool();
        m_wsHistory = s.value(CONF_HISTORY, false).toBool();
        m_wsExecLog = s.value(CONF_EXEC_LOG, false).toBool();
        m_wsToplevelDescribe = s.value(CONF_TOPLEVEL_DESCRIBE, true).toBool();
        // tosyntaxsetup
        const QPalette cg = qApp->palette();
        m_syntaxDefault = s.value("SyntaxDefault", cg.color(QPalette::Base).name()).toString();
        m_syntaxComment = s.value("SyntaxComment", "darkgray").toString();
        m_syntaxNumber = s.value("SyntaxNumber", "limegreen").toString();
        m_syntaxKeyword = s.value("SyntaxKeyword", "navy").toString();
        m_syntaxString = s.value("SyntaxString", "red").toString();
        m_syntaxDefaultBg = s.value("SyntaxDefaultBg", cg.color(QPalette::Text).name()).toString();
        m_syntaxErrorBg = s.value("SyntaxErrorBg", "darkred").toString();
        m_syntaxDebugBg = s.value("SyntaxDebugBg", "darkgreen").toString();
        m_syntaxCurrentLineMarker = s.value("SyntaxCurrentLineMarker", "whitesmoke").toString();
        m_syntaxStaticBg = s.value("SyntaxStaticBg", "darkblue").toString();
        m_useMaxTextWidthMark = s.value("useMaxTextWidthMark", false).toBool();
        m_maxTextWidthMark = s.value("maxTextWidthMark", 75).toInt();
        s.endGroup();

        // main window
        s.beginGroup("toMainWindow");
        m_mainWindowGeometry = s.value("geometry").toByteArray();
        // mainwindow's toolbars etc
        m_mainWindowState = s.value("state").toByteArray();
        m_leftDockbarState = s.value("leftDockbar").toByteArray();
        m_rightDockbarState = s.value("rightDockbar").toByteArray();
        s.endGroup();

        // editor shortcuts
        s.beginGroup("editorShortcuts");
        m_useEditorShortcuts = s.value("useEditorShortcuts", false).toBool();
        cnt = s.beginReadArray("shortcuts");
        for (int i = 0; i < cnt; ++i)
        {
            s.setArrayIndex(i);
            m_editorShortcuts[s.value("key").toString()] = s.value("value");
        }
        s.endArray();
        s.endGroup();
    }


    void saveConfig()
    {
        QString key; // tmp key for maps
        QSettings s;
        s.beginGroup("preferences");
        s.setValue(CONF_PROVIDER, m_provider);
        s.setValue(CONF_SAVE_PWD, m_savePassword);
        s.setValue(CONF_PASSWORD, m_defaultPassword);
        s.setValue(CONF_DATABASE, m_defaultDatabase);
        s.setValue(CONF_USER, m_defaultUser);
        s.setValue(CONF_HOST, m_defaultHost);
        s.setValue(CONF_MAX_NUMBER, m_maxNumber);
        s.setValue(CONF_MAX_COL_SIZE, m_maxColSize);
        s.setValue(CONF_MAX_COL_DISP, m_maxColDisp);
        s.setValue(CONF_PLAN_TABLE, m_planTable);
        s.setValue(CONF_PLAN_CHECKPOINT, m_planCheckpoint);
        s.setValue(CONF_TEXT, m_textFont);
        s.setValue(CONF_CODE, m_codeFont);
        s.setValue(CONF_LIST, m_listFont);
        s.setValue(CONF_DATE_FORMAT, m_dateFormat);
        s.setValue(CONF_REFRESH, m_refresh);
        s.setValue(CONF_HIGHLIGHT, m_highlight);
        s.setValue(CONF_KEYWORD_UPPER, m_keywordUpper);
        s.setValue(CONF_OBJECT_NAMES_UPPER, m_objectNamesUpper);
        s.setValue(CONF_PLUGIN_DIR, m_pluginDir);
        s.setValue(CONF_CACHE_DIR, m_cacheDir);
        s.setValue(CONF_CACHE_DISK, m_cacheDisk);
        s.setValue(CONF_SQL_FILE, m_sqlFile);
        s.setValue(CONF_STATUS_MESSAGE, m_statusMessage);
        s.setValue(CONF_DB_TITLE, m_dbTitle);
        s.setValue(CONF_SIZE_UNIT, m_sizeUnit);
        s.setValue(CONF_HELP_PATH, m_helpPath);
        s.setValue(CONF_STATUS_SAVE, m_statusSave);
        s.setValue(CONF_AUTO_COMMIT, m_autoCommit);
        s.setValue(CONF_CHANGE_CONNECTION, m_changeConnection);
        s.setValue(CONF_CONNECT_SIZE, m_connectSize);
        s.setValue(CONF_DEFAULT_TOOL, m_defaultTool);
        s.setValue(CONF_CHART_SAMPLES, m_chartSamples);
        s.setValue(CONF_DISPLAY_SAMPLES, m_displaySamples);
        s.setValue(CONF_CODE_COMPLETION, m_codeCompletion);
        s.setValue(CONF_COMPLETION_SORT, m_completionSort);
        s.setValue(CONF_AUTO_INDENT, m_autoIndent);
        s.setValue(CONF_DONT_REREAD, m_dontReread);
        s.setValue(CONF_AUTO_LONG, m_autoLong);
        s.setValue(CONF_MESSAGE_STATUSBAR, m_messageStatusbar);
        s.setValue(CONF_TABBED_TOOLS, m_tabbedTools);

        s.setValue("ColorizedConnections", m_colorizedConnections);
        s.beginWriteArray("ConnectionColors");
        for (int i = 0; i < m_connectionColors.count(); ++i)
        {
            s.setArrayIndex(i);
            key = m_connectionColors.keys().at(i);
            s.setValue("key", key);
            s.setValue("value", m_connectionColors[key]);
        }
        s.endArray();
        
        s.setValue(CONF_OBJECT_CACHE, m_objectCache);
        s.setValue(CONF_BKGND_CONNECT, m_bkgndConnect);
        s.setValue(CONF_FIREWALL_MODE, m_firewallMode);
        s.setValue(CONF_CONN_TEST_INTERVAL, m_connTestInterval);
        s.setValue(CONF_MAX_CONTENT, m_maxContent);
        s.setValue(CONF_KEEP_PLANS, m_keepPlans);
        s.setValue(CONF_VSQL_PLANS, m_vsqlPlans);
        s.setValue(CONF_RESTORE_SESSION, m_restoreSession);
        s.setValue(CONF_DEFAULT_SESSION, m_defaultSession);
        s.setValue(CONF_DEFAULT_FORMAT, m_defaultFormat);
        s.setValue(CONF_AUTO_INDENT_RO, m_autoIndentRo);
        s.setValue(CONF_INDICATE_EMPTY, m_indicateEmpty);
        s.setValue(CONF_INDICATE_EMPTY_COLOR, m_indicateEmptyColor);
        s.setValue(CONF_EXTENSIONS, m_extensions);
        s.setValue(CONF_RECENT_FILES, m_recentFiles);
        s.setValue(CONF_RECENT_MAX, m_recentMax);
        s.setValue(CONF_LAST_DIR, m_lastDir);
        s.setValue(CONF_LOCALE, m_locale);
        s.setValue(CONF_KEEP_ALIVE, m_keepAlive);
        s.setValue(CONF_NUMBER_FORMAT, m_numberFormat);
        s.setValue(CONF_NUMBER_DECIMALS, m_numberDecimals);
        s.setValue(CONF_CACHE_TIMEOUT, m_cacheTimeout);
        s.setValue(CONF_TAB_STOP, m_tabStop);
        s.setValue(CONF_TAB_SPACES, m_tabSpaces);
        s.setValue(CONF_EDIT_DRAG_DROP, m_editDragDrop);
        s.setValue(CONF_TOAD_BINDINGS, m_toadBindings);
        s.setValue(CONF_DISPLAY_GRIDLINES, m_displayGridlines);
        s.setValue(CONF_SMTP, m_smtp);
        s.setValue(CONF_SMTP_PORT, m_smtpPort);
        s.setValue(CONF_STYLE, m_style);
        s.setValue(CONF_STATIC_CHECKER, m_staticChecker);

        // tooracleconnection
        s.setValue(CONF_OPEN_CURSORS, m_openCursors);
        s.setValue(CONF_MAX_LONG, m_maxLong);
        // toqsqlconnection
        s.setValue(CONF_ONLY_FORWARD, m_onlyForward);
        s.setValue(CONF_CREATE_ACTION, m_createAction);
        // main.cpp
        s.setValue(CONF_LAST_VERSION, m_lastVersion);
        s.setValue(CONF_FIRST_INSTALL, m_firstInstall);
        // tools
        s.beginWriteArray(CONF_TOOLS);
        for (int i = 0; i < m_tools.count(); ++i)
        {
            s.setArrayIndex(i);
            key = m_tools.keys().at(i);
            s.setValue("ToolName", key);
            s.setValue("Enabled", m_tools[key]);
        }
        s.endArray();
        // toresultlistformat
        s.setValue(CONF_CSV_SEPARATOR, m_csvSeparator);
        s.setValue(CONF_CSV_DELIMITER, m_csvDelimiter);
        // toeditextensions
        s.setValue(CONF_COMMA_BEFORE, m_commaBefore);
        s.setValue(CONF_BLOCK_OPEN_LINE, m_blockOpenLine);
        s.setValue(CONF_OPERATOR_SPACE, m_operatorSpace);
        s.setValue(CONF_RIGHT_SEPARATOR, m_rightSeparator);
        s.setValue(CONF_END_BLOCK_NEWLINE, m_endBlockNewline);
        s.setValue(CONF_COMMENT_COLUMN, m_commentColumn);
        // tobrowser
        s.setValue(CONF_FILTER_IGNORE_CASE, m_filterIgnoreCase);
        s.setValue(CONF_FILTER_INVERT, m_filterInvert);
        s.setValue(CONF_FILTER_TYPE, m_filterType);
        s.setValue(CONF_FILTER_TABLESPACE_TYPE, m_filterTablespaceType);
        s.setValue(CONF_FILTER_TEXT, m_filterText);
        // tohelp
        s.beginWriteArray("AdditionalHelp");
        for (int i = 0; i < m_additionalHelp.count(); ++i)
        {
            s.setArrayIndex(i);
            key = m_additionalHelp.keys().at(i);
            s.setValue("HelpName", key);
            s.setValue("Path", m_additionalHelp[key]);
        }
        s.endArray();
        // tochartmanager
        s.beginWriteArray("ChartFiles");
        for (int i = 0; i < m_chartFiles.count(); ++i)
        {
            s.setArrayIndex(i);
            key = m_chartFiles.keys().at(i);
            s.setValue("Name", key);
            s.setValue("Spec", m_chartFiles[key]);
        }
        s.endArray();
        s.beginWriteArray("ChartAlarms");
        for (int i = 0; i < m_chartAlarms.count(); ++i)
        {
            s.setArrayIndex(i);
            key = m_chartAlarms.keys().at(i);
            s.setValue("Name", key);
            s.setValue("Spec", m_chartAlarms[key]);
        }
        s.endArray();
        // tooutput
        s.setValue(CONF_POLLING, m_polling);
        s.setValue(CONF_LOG_TYPE, m_logType);
        s.setValue(CONF_LOG_USER, m_logUser);
        // torollback
        s.setValue(CONF_NO_EXEC, m_noExec);
        s.setValue(CONF_NEED_READ, m_needRead);
        s.setValue(CONF_NEED_TWO, m_needTwo);
        s.setValue(CONF_ALIGN_LEFT, m_alignLeft);
        s.setValue(CONF_OLD_ENABLE, m_oldEnable);
        // tosgatrace
        s.setValue(CONF_AUTO_UPDATE, m_autoUpdate);
        // tostorage
        s.setValue(CONF_DISP_TABLESPACES, m_dispTablespaces);
        s.setValue(CONF_DISP_COALESCED, m_dispCoalesced);
        s.setValue(CONF_DISP_EXTENTS, m_dispExtents);
        s.setValue(CONF_DISP_AVAILABLEGRAPH, m_dispAvailableGraph);
        // totemplate
        s.beginWriteArray("Templates");
        for (int i = 0; i < m_templates.count(); ++i)
        {
            s.setArrayIndex(i);
            key = m_templates.keys().at(i);
            s.setValue("Name", key);
            s.setValue("File", m_templates[key]);
        }
        s.endArray();
        // totuning
        s.setValue(CONF_OVERVIEW, m_tuningOverview);
        s.setValue(CONF_FILEIO, m_tuningFileIO);
        s.setValue(CONF_WAITS, m_tuningWaits);
        s.setValue(CONF_CHART, m_tuningCharts);
        // toworksheet
        s.setValue(CONF_AUTO_SAVE, m_wsAutoSave);
        s.setValue(CONF_CHECK_SAVE, m_wsCheckSave);
        s.setValue(CONF_AUTO_LOAD, m_wsAutoLoad);
        s.setValue(CONF_LOG_AT_END, m_wsLogAtEnd);
        s.setValue(CONF_LOG_MULTI, m_wsLogMulti);
        s.setValue(CONF_STATISTICS, m_wsStatistics);
        s.setValue(CONF_TIMED_STATS, m_wsTimedStats);
        s.setValue(CONF_NUMBER, m_wsNumber);
        s.setValue(CONF_MOVE_TO_ERR, m_wsMoveToErr);
        s.setValue(CONF_HISTORY, m_wsHistory);
        s.setValue(CONF_EXEC_LOG, m_wsExecLog);
        s.setValue(CONF_TOPLEVEL_DESCRIBE, m_wsToplevelDescribe);
        // tosyntaxsetup
        s.setValue("SyntaxDefault", m_syntaxDefault);
        s.setValue("SyntaxComment", m_syntaxComment);
        s.setValue("SyntaxNumber", m_syntaxNumber);
        s.setValue("SyntaxKeyword", m_syntaxKeyword);
        s.setValue("SyntaxString", m_syntaxString);
        s.setValue("SyntaxDefaultBg", m_syntaxDefaultBg);
        s.setValue("SyntaxErrorBg", m_syntaxErrorBg);
        s.setValue("SyntaxDebugBg", m_syntaxDebugBg);
        s.setValue("SyntaxCurrentLineMarker", m_syntaxCurrentLineMarker);
        s.setValue("SyntaxStaticBg", m_syntaxStaticBg);
        s.setValue("useMaxTextWidthMark", m_useMaxTextWidthMark);
        s.setValue("maxTextWidthMark", m_maxTextWidthMark);
        s.endGroup();

        // main window
        s.beginGroup("toMainWindow");
        s.setValue("geometry", m_mainWindowGeometry);
        // mainwindow's toolbars etc
        s.setValue("state", m_mainWindowState);
        s.setValue("leftDockbar", m_leftDockbarState);
        s.setValue("rightDockbar", m_rightDockbarState);
        s.endGroup();

        // editor shortcuts
        s.beginGroup("editorShortcuts");
        s.setValue("useEditorShortcuts", m_useEditorShortcuts);
        s.beginWriteArray("shortcuts");
        for (int i = 0; i < m_editorShortcuts.count(); ++i)
        {
            s.setArrayIndex(i);
            key = m_editorShortcuts.keys().at(i);
            s.setValue("key", key);
            s.setValue("value", m_editorShortcuts[key]);
        }
        s.endArray();
        s.endGroup();
    }


    void loadMap(const QString &filename, std::map &pairs)
    {
        QByteArray data = toReadFile(filename).toUtf8();

        int pos = 0;
        int bol = 0;
        int endtag = -1;
        int wpos = 0;
        int size = data.length();
        while (pos < size)
        {
            switch (data[pos])
            {
            case '\n':
                data[wpos] = 0;
                if (endtag == -1)
                    throw QT_TRANSLATE_NOOP("toTool", "Malformed tag in config file. Missing = on row. (%1)").arg(QString(data.mid(bol, wpos - bol)));
                {
                    QString tag = ((const char *)data) + bol;
                    QString val = ((const char *)data) + endtag + 1;
                    pairs[tag] = val;
                }
                bol = pos + 1;
                endtag = -1;
                wpos = pos;
                break;
            case '=':
                if (endtag == -1)
                {
                    endtag = pos;
                    data[wpos] = 0;
                    wpos = pos;
                }
                else
                    data[wpos] = data[pos];
                break;
            case '\\':
                pos++;
                switch (data[pos])
                {
                case 'n':
                    data[wpos] = '\n';
                    break;
                case '\\':
                    if (endtag >= 0)
                        data[wpos] = '\\';
                    else
                        data[wpos] = ':';
                    break;
                default:
                    throw QT_TRANSLATE_NOOP("toTool", "Unknown escape character in string (Only \\\\ and \\n recognised)");
                }
                break;
            default:
                data[wpos] = data[pos];
            }
            wpos++;
            pos++;
        }

        return;
    }


    bool saveMap(const QString &file, std::map &pairs)
    {
        QString data;

        {
 // qt4        QRegExp newline(QString::fromLatin1("\n"));
// qt4        QRegExp backslash(QString::fromLatin1("\\"));
            QString newline("\n");
            QString backslash("\\");
            for (std::map::iterator i = pairs.begin();i != pairs.end();i++)
            {
                QString str = (*i).first;
                str.append(QString::fromLatin1("="));
                str.replace(backslash, QString::fromLatin1("\\\\"));
                str.replace(newline, QString::fromLatin1("\\n"));
                QString line = (*i).second;
                line.replace(backslash, QString::fromLatin1("\\\\"));
                line.replace(newline, QString::fromLatin1("\\n"));
                str += line.toUtf8();
                str += QString::fromLatin1("\n");
                data += str;
            }
        }
        return toWriteFile(file, data);
    }
};


// static one
void toConfiguration::setQSettingsEnv()
{
    if (QCoreApplication::organizationName().isEmpty())
        QCoreApplication::setOrganizationName(TOORGNAME);
    if (QCoreApplication::organizationDomain().isEmpty())
        QCoreApplication::setOrganizationDomain(TOORGDOMAIN);
    if (QCoreApplication::applicationName().isEmpty())
        QCoreApplication::setApplicationName(TOAPPNAME);
}

toConfiguration::toConfiguration()
{
    setQSettingsEnv();
    p = new toConfigurationPrivate;
}

toConfiguration::~toConfiguration()
{
    delete p;
}

void toConfiguration::saveConfig()
{
    p->saveConfig();
}

void toConfiguration::loadMap(const QString &filename, std::map &pairs)
{
    p->loadMap(filename, pairs);
}

bool toConfiguration::saveMap(const QString &file, std::map &pairs)
{
    return p->saveMap(file, pairs);
}

QColor toConfiguration::syntaxDefault()
{
    QColor c;
    c.setNamedColor(p->m_syntaxDefault);
    return c;
}
void toConfiguration::setSyntaxDefault(QColor v)
{
    p->m_syntaxDefault = v.name();
}

QColor toConfiguration::syntaxComment()
{
    QColor c;
    c.setNamedColor(p->m_syntaxComment);
    return c;
}
void toConfiguration::setSyntaxComment(QColor v)
{
    p->m_syntaxComment = v.name();
}

QColor toConfiguration::syntaxNumber()
{
    QColor c;
    c.setNamedColor(p->m_syntaxNumber);
    return c;
}
void toConfiguration::setSyntaxNumber(QColor v)
{
    p->m_syntaxNumber = v.name();
}

QColor toConfiguration::syntaxKeyword()
{
    QColor c;
    c.setNamedColor(p->m_syntaxKeyword);
    return c;
}
void toConfiguration::setSyntaxKeyword(QColor v)
{
    p->m_syntaxKeyword = v.name();
}

QColor toConfiguration::syntaxString()
{
    QColor c;
    c.setNamedColor(p->m_syntaxString);
    return c;
}
void toConfiguration::setSyntaxString(QColor v)
{
    p->m_syntaxString = v.name();
}

QColor toConfiguration::syntaxDefaultBg()
{
    QColor c;
    c.setNamedColor(p->m_syntaxDefaultBg);
    return c;
}
void toConfiguration::setSyntaxDefaultBg(QColor v)
{
    p->m_syntaxDefaultBg = v.name();
}

QColor toConfiguration::syntaxDebugBg()
{
    QColor c;
    c.setNamedColor(p->m_syntaxDebugBg);
    return c;
}
void toConfiguration::setSyntaxDebugBg(QColor v)
{
    p->m_syntaxDebugBg = v.name();
}

QColor toConfiguration::syntaxErrorBg()
{
    QColor c;
    c.setNamedColor(p->m_syntaxErrorBg);
    return c;
}
void toConfiguration::setSyntaxErrorBg(QColor v)
{
    p->m_syntaxErrorBg = v.name();
}

QColor toConfiguration::syntaxCurrentLineMarker()
{
    QColor c;
    c.setNamedColor(p->m_syntaxCurrentLineMarker);
    return c;
}
void toConfiguration::setSyntaxCurrentLineMarker(QColor v)
{
    p->m_syntaxCurrentLineMarker = v.name();
}

QColor toConfiguration::syntaxStaticBg()
{
    QColor c;
    c.setNamedColor(p->m_syntaxStaticBg);
    return c;
}
void toConfiguration::setSyntaxStaticBg(QColor v)
{
    p->m_syntaxStaticBg = v.name();
}

QString toConfiguration::provider()
{
    return p->m_provider;
}
//   void setProvider(const QString & v) { p->m_provider = v; }

bool toConfiguration::savePassword()
{
    return p->m_savePassword;
}
void toConfiguration::setSavePassword(bool v)
{
    p->m_savePassword = v;
}

QString toConfiguration::defaultPassword()
{
    return p->m_defaultPassword;
}
void toConfiguration::setDefaultPassword(const QString & v)
{
    p->m_defaultPassword = v;
}

QString toConfiguration::defaultDatabase()
{
    return p->m_defaultDatabase;
}
void toConfiguration::setDefaultDatabase(const QString & v)
{
    p->m_defaultDatabase = v;
}

QString toConfiguration::defaultUser()
{
    return p->m_defaultUser;
}
void toConfiguration::setDefaultUser(const QString & v)
{
    p->m_defaultUser = v;
}

QString toConfiguration::defaultHost()
{
    return p->m_defaultHost;
}

int toConfiguration::maxNumber()
{
    return p->m_maxNumber;
}
void toConfiguration::setMaxNumber(int v)
{
    p->m_maxNumber = v;
}

int toConfiguration::maxColSize()
{
    return p->m_maxColSize;
}

int toConfiguration::maxColDisp()
{
    return p->m_maxColDisp;
}
void toConfiguration::setMaxColDisp(int v)
{
    p->m_maxColDisp = v;
}

QString toConfiguration::planTable()
{
    return p->m_planTable;
}
void toConfiguration::setPlanTable(const QString & v)
{
    p->m_planTable = v;
}

QString toConfiguration::planCheckpoint()
{
    return p->m_planCheckpoint;
}
void toConfiguration::setPlanCheckpoint(const QString & v)
{
    p->m_planCheckpoint = v;
}

QString toConfiguration::textFont()
{
    return p->m_textFont;
}
void toConfiguration::setTextFont(const QString & v)
{
    p->m_textFont = v;
}

QString toConfiguration::codeFont()
{
    return p->m_codeFont;
}
void toConfiguration::setCodeFont(const QString & v)
{
    p->m_codeFont = v;
}

QString toConfiguration::listFont()
{
    return p->m_listFont;
}
void toConfiguration::setListFont(const QString & v)
{
    p->m_listFont = v;
}

QString toConfiguration::dateFormat()
{
    return p->m_dateFormat;
}
void toConfiguration::setDateFormat(const QString & v)
{
    p->m_dateFormat = v;
}

QString toConfiguration::refresh()
{
    return p->m_refresh;
}
void toConfiguration::setRefresh(const QString & v)
{
    p->m_refresh = v;
}

bool toConfiguration::highlight()
{
    return p->m_highlight;
}
void toConfiguration::setHighlight(bool v)
{
    p->m_highlight = v;
}

bool toConfiguration::keywordUpper()
{
    return p->m_keywordUpper;
}
void toConfiguration::setKeywordUpper(bool v)
{
    p->m_keywordUpper = v;
}

bool toConfiguration::objectNamesUpper()
{
    return p->m_objectNamesUpper;
}
void toConfiguration::setObjectNamesUpper(bool v)
{
    p->m_objectNamesUpper = v;
}

QString toConfiguration::pluginDir()
{
    return p->m_pluginDir;
}
void toConfiguration::setPluginDir(const QString & v)
{
    p->m_pluginDir = v;
}

QString toConfiguration::cacheDir()
{
    return p->m_cacheDir;
}
void toConfiguration::setCacheDir(const QString & v)
{
    p->m_cacheDir = v;
}

bool toConfiguration::cacheDisk()
{
    return p->m_cacheDisk;
}
void toConfiguration::setCacheDisk(bool v)
{
    p->m_cacheDisk = v;
}

QString toConfiguration::sqlFile()
{
    return p->m_sqlFile;
}
void toConfiguration::setSqlFile(const QString & v)
{
    p->m_sqlFile = v;
}

int toConfiguration::statusMessage()
{
    return p->m_statusMessage;
}
void toConfiguration::setStatusMessage(int v)
{
    p->m_statusMessage = v;
}

bool toConfiguration::dbTitle()
{
    return p->m_dbTitle;
}
void toConfiguration::setDbTitle(bool v)
{
    p->m_dbTitle = v;
}

QString toConfiguration::sizeUnit()
{
    return p->m_sizeUnit;
}
void toConfiguration::setSizeUnit(const QString & v)
{
    p->m_sizeUnit = v;
}

QString toConfiguration::helpPath()
{
    return p->m_helpPath;
}
void toConfiguration::setHelpPath(const QString & v)
{
    p->m_helpPath = v;
}

int toConfiguration::statusSave()
{
    return p->m_statusSave;
}
void toConfiguration::setStatusSave(int v)
{
    p->m_statusSave = v;
}

bool toConfiguration::autoCommit()
{
    return p->m_autoCommit;
}
void toConfiguration::setAutoCommit(bool v)
{
    p->m_autoCommit = v;
}

bool toConfiguration::changeConnection()
{
    return p->m_changeConnection;
}
void toConfiguration::setChangeConnection(bool v)
{
    p->m_changeConnection = v;
}

int toConfiguration::connectSize()
{
    return p->m_connectSize;
}
void toConfiguration::setConnectSize(int v)
{
    p->m_connectSize = v;
}

QString toConfiguration::defaultTool()
{
    return p->m_defaultTool;
}
void toConfiguration::setDefaultTool(const QString & v)
{
    p->m_defaultTool = v;
}

int toConfiguration::chartSamples()
{
    return p->m_chartSamples;
}
void toConfiguration::setChartSamples(int v)
{
    p->m_chartSamples = v;
}

int toConfiguration::displaySamples()
{
    return p->m_displaySamples;
}
void toConfiguration::setDisplaySamples(int v)
{
    p->m_displaySamples = v;
}

bool toConfiguration::codeCompletion()
{
    return p->m_codeCompletion;
}
void toConfiguration::setCodeCompletion(bool v)
{
    p->m_codeCompletion = v;
}

bool toConfiguration::completionSort()
{
    return p->m_completionSort;
}
void toConfiguration::setCodeCompletionSort(bool v)
{
    p->m_completionSort = v;
}

bool toConfiguration::autoIndent()
{
    return p->m_autoIndent;
}
void toConfiguration::setAutoIndent(bool v)
{
    p->m_autoIndent = v;
}

bool toConfiguration::dontReread()
{
    return p->m_dontReread;
}
void toConfiguration::setDontReread(bool v)
{
    p->m_dontReread = v;
}

int toConfiguration::autoLong()
{
    return p->m_autoLong;
}
void toConfiguration::setAutoLong(int v)
{
    p->m_autoLong = v;
}

bool toConfiguration::messageStatusbar()
{
    return p->m_messageStatusbar;
}
void toConfiguration::setMessageStatusbar(bool v)
{
    p->m_messageStatusbar = v;
}

bool toConfiguration::tabbedTools()
{
    return p->m_tabbedTools;
}
void toConfiguration::setTabbedTools(bool v)
{
    p->m_tabbedTools = v;
}

bool toConfiguration::colorizedConnections()
{
    return p->m_colorizedConnections;
}
void toConfiguration::setColorizedConnections(bool v)
{
    p->m_colorizedConnections = v;
}
ConnectionColors toConfiguration::connectionColors()
{
    return p->m_connectionColors;
}
void toConfiguration::setConnectionColors(const ConnectionColors & v)
{
    p->m_connectionColors = v;
}

int toConfiguration::objectCache()
{
    return p->m_objectCache;
}
void toConfiguration::setObjectCache(int v)
{
    p->m_objectCache = v;
}

bool toConfiguration::bkgndConnect()
{
    return p->m_bkgndConnect;
}
void toConfiguration::setBkgndConnect(bool v)
{
    p->m_bkgndConnect = v;
}

bool toConfiguration::firewallMode()
{
    return p->m_firewallMode;
}
void toConfiguration::setFirewallMode(bool v)
{
    p->m_firewallMode = v;
}

int toConfiguration::connTestInterval()
{
    return p->m_connTestInterval;
}
void toConfiguration::setConnTestInterval(int v)
{
    p->m_connTestInterval = v;
}

int toConfiguration::maxContent()
{
    return p->m_maxContent;
}
void toConfiguration::setMaxContent(int v)
{
    p->m_maxContent = v;
}

bool toConfiguration::keepPlans()
{
    return p->m_keepPlans;
}
void toConfiguration::setKeepPlans(bool v)
{
    p->m_keepPlans = v;
}

bool toConfiguration::vsqlPlans()
{
    return p->m_vsqlPlans;
}
void toConfiguration::setVsqlPlans(bool v)
{
    p->m_vsqlPlans = v;
}

bool toConfiguration::restoreSession()
{
    return p->m_restoreSession;
}
void toConfiguration::setRestoreSession(bool v)
{
    p->m_restoreSession = v;
}

QString toConfiguration::defaultSession()
{
    return p->m_defaultSession;
}
void toConfiguration::setDefaultSession(const QString & v)
{
    p->m_defaultSession = v;
}

int toConfiguration::defaultFormat()
{
    return p->m_defaultFormat;
}
void toConfiguration::setDefaultFormat(int v)
{
    p->m_defaultFormat = v;
}

bool toConfiguration::autoIndentRo()
{
    return p->m_autoIndentRo;
}
void toConfiguration::setAutoIndentRo(bool v)
{
    p->m_autoIndentRo = v;
}

bool toConfiguration::indicateEmpty()
{
    return p->m_indicateEmpty;
}
void toConfiguration::setIndicateEmpty(bool v)
{
    p->m_indicateEmpty = v;
}

QString toConfiguration::indicateEmptyColor()
{
    return p->m_indicateEmptyColor;
}
void toConfiguration::setIndicateEmptyColor(const QString & v)
{
    p->m_indicateEmptyColor = v;
}

QString toConfiguration::extensions()
{
    return p->m_extensions;
}
void toConfiguration::setExtensions(const QString & v)
{
    p->m_extensions = v;
}

int toConfiguration::recentMax()
{
    return p->m_recentMax;
}

QString toConfiguration::lastDir()
{
    return p->m_lastDir;
}
void toConfiguration::setLastDir(const QString & v)
{
    p->m_lastDir = v;
}

QString toConfiguration::locale()
{
    return p->m_locale;
}
void toConfiguration::setLocale(const QString & v)
{
    p->m_locale = v;
}

int toConfiguration::keepAlive()
{
    return p->m_keepAlive;
}
void toConfiguration::setKeepAlive(int v)
{
    p->m_keepAlive = v;
}

int toConfiguration::numberFormat()
{
    return p->m_numberFormat;
}
void toConfiguration::setNumberFormat(int v)
{
    p->m_numberFormat = v;
}

int toConfiguration::numberDecimals()
{
    return p->m_numberDecimals;
}
void toConfiguration::setNumberDecimals(int v)
{
    p->m_numberDecimals = v;
}

int toConfiguration::cacheTimeout()
{
    return p->m_cacheTimeout;
}

int toConfiguration::tabStop()
{
    return p->m_tabStop;
}
void toConfiguration::setTabStop(int v)
{
    p->m_tabStop = v;
}

bool toConfiguration::tabSpaces()
{
    return p->m_tabSpaces;
}
void toConfiguration::setTabSpaces(bool v)
{
    p->m_tabSpaces = v;
}

bool toConfiguration::editDragDrop()
{
    return p->m_editDragDrop;
}
void toConfiguration::setEditDragDrop(bool v)
{
    p->m_editDragDrop = v;
}

bool toConfiguration::toadBindings()
{
    return p->m_toadBindings;
}
void toConfiguration::setToadBindings(bool v)
{
    p->m_toadBindings = v;
}

bool toConfiguration::displayGridlines()
{
    return p->m_displayGridlines;
}
void toConfiguration::setDisplayGridlines(bool v)
{
    p->m_displayGridlines = v;
}

QString toConfiguration::smtp()
{
    return p->m_smtp;
}
void toConfiguration::setSmtp(const QString & v)
{
    p->m_smtp = v;
}

int toConfiguration::smtpPort()
{
    return p->m_smtpPort;
}
void toConfiguration::setSmtpPort(int v)
{
    p->m_smtpPort = v;
}

QString toConfiguration::style()
{
    return p->m_style;
}
void toConfiguration::setStyle(const QString & v)
{
    p->m_style = v;
}

// tooracleconnection
int toConfiguration::openCursors()
{
    return p->m_openCursors;
}
void toConfiguration::setOpenCursors(int v)
{
    p->m_openCursors = v;
}

int toConfiguration::maxLong()
{
    return p->m_maxLong;
}
void toConfiguration::setMaxLong(int v)
{
    p->m_maxLong = v;
}

// toqsqlconnection
bool toConfiguration::onlyForward()
{
    return p->m_onlyForward;
}
void toConfiguration::setOnlyForward(bool v)
{
    p->m_onlyForward = v;
}

int toConfiguration::createAction()
{
    return p->m_createAction;
}

void toConfiguration::setCreateAction(int v)
{
    p->m_createAction = v;
}

// main.cpp
QString toConfiguration::lastVersion()
{
    return p->m_lastVersion;
}
void toConfiguration::setLastVersion(const QString & v)
{
    p->m_lastVersion = v;
}

QString toConfiguration::firstInstall()
{
    return p->m_firstInstall;
}
void toConfiguration::setFirstInstall(const QString & v)
{
    p->m_firstInstall = v;
}
// tomain.cpp
QStringList toConfiguration::recentFiles()
{
    return p->m_recentFiles;
}
void toConfiguration::setRecentFiles(QStringList v)
{
    p->m_recentFiles = v;
}
// tools
ToolsMap toConfiguration::tools()
{
    return p->m_tools;
}
void toConfiguration::setTools(ToolsMap v)
{
    p->m_tools = v;
}

// toresultlistformat
QString toConfiguration::csvSeparator()
{
    return p->m_csvSeparator;
}
QString toConfiguration::csvDelimiter()
{
    return p->m_csvDelimiter;
}

// toeditextensions
bool toConfiguration::commaBefore()
{
    return p->m_commaBefore;
}
void toConfiguration::setCommaBefore(bool v)
{
    p->m_commaBefore = v;
}

bool toConfiguration::blockOpenLine()
{
    return p->m_blockOpenLine;
}
void toConfiguration::setBlockOpenLine(bool v)
{
    p->m_blockOpenLine = v;
}

bool toConfiguration::operatorSpace()
{
    return p->m_operatorSpace;
}
void toConfiguration::setOperatorSpace(bool v)
{
    p->m_operatorSpace = v;
}

bool toConfiguration::rightSeparator()
{
    return p->m_rightSeparator;
}
void toConfiguration::setRightSeparator(bool v)
{
    p->m_rightSeparator = v;
}

bool toConfiguration::endBlockNewline()
{
    return p->m_endBlockNewline;
}
void toConfiguration::setEndBlockNewline(bool v)
{
    p->m_endBlockNewline = v;
}

int toConfiguration::commentColumn()
{
    return p->m_commentColumn;
}
void toConfiguration::setCommentColumn(int v)
{
    p->m_commentColumn = v;
}

// tobrowser
bool toConfiguration::filterIgnoreCase()
{
    return p->m_filterIgnoreCase;
}
void toConfiguration::setFilterIgnoreCase(bool v)
{
    p->m_filterIgnoreCase = v;
}

bool toConfiguration::filterInvert()
{
    return p->m_filterInvert;
}
void toConfiguration::setFilterInvert(bool v)
{
    p->m_filterInvert = v;
}

int toConfiguration::filterType()
{
    return p->m_filterType;
}
void toConfiguration::setFilterType(int v)
{
    p->m_filterType = v;
}

int toConfiguration::filterTablespaceType()
{
    return p->m_filterTablespaceType;
}
void toConfiguration::setFilterTablespaceType(int v)
{
    p->m_filterTablespaceType = v;
}

QString toConfiguration::filterText()
{
    return p->m_filterText;
}
void toConfiguration::setFilterText(const QString & v)
{
    p->m_filterText = v;
}

// tohelp
HelpsMap toConfiguration::additionalHelp()
{
    return p->m_additionalHelp;
}
void toConfiguration::setAdditionalHelp(HelpsMap v)
{
    p->m_additionalHelp = v;
}

// tochartmanager
ChartsMap toConfiguration::chartFiles()
{
    return p->m_chartFiles;
}
void toConfiguration::setChartFiles(ChartsMap v)
{
    p->m_chartFiles = v;
}

ChartsMap toConfiguration::chartAlarms()
{
    return p->m_chartAlarms;
}
void toConfiguration::setChartAlarms(ChartsMap v)
{
    p->m_chartAlarms = v;
}

// toooutput
QString toConfiguration::polling()
{
    return p->m_polling;
}
void toConfiguration::setPolling(const QString & v )
{
    p->m_polling = v;
}

int toConfiguration::logType()
{
    return p->m_logType;
}
void toConfiguration::setLogType(int v)
{
    p->m_logType = v;
}

QString toConfiguration::logUser()
{
    return p->m_logUser;
}
void toConfiguration::setLogUser(const QString & v)
{
    p->m_logUser = v;
}

// torollback
bool toConfiguration::noExec()
{
    return p->m_noExec;
}
void toConfiguration::setNoExec(bool v)
{
    p->m_noExec = v;
}

bool toConfiguration::needRead()
{
    return p->m_needRead;
}
void toConfiguration::setNeedRead(bool v)
{
    p->m_needRead = v;
}

bool toConfiguration::needTwo()
{
    return p->m_needTwo;
}
void toConfiguration::setNeedTwo(bool v)
{
    p->m_needTwo = v;
}

bool toConfiguration::alignLeft()
{
    return p->m_alignLeft;
}
void toConfiguration::setAlignLeft(bool v)
{
    p->m_alignLeft = v;
}

bool toConfiguration::oldEnable()
{
    return p->m_oldEnable;
}
void toConfiguration::setOldEnable(bool v)
{
    p->m_oldEnable = v;
}

// tosgatrace
bool toConfiguration::autoUpdate()
{
    return p->m_autoUpdate;
}
void toConfiguration::setAutoUpdate(bool v)
{
    p->m_autoUpdate = v;
}

// tostorage
bool toConfiguration::dispTablespaces()
{
    return p->m_dispTablespaces;
}
void toConfiguration::setDispTablespaces(bool v)
{
    p->m_dispTablespaces = v;
}

bool toConfiguration::dispCoalesced()
{
    return p->m_dispCoalesced;
}
void toConfiguration::setDispCoalesced(bool v)
{
    p->m_dispCoalesced = v;
}

bool toConfiguration::dispExtents()
{
    return p->m_dispExtents;
}
void toConfiguration::setDispExtents(bool v)
{
    p->m_dispExtents = v;
}

bool toConfiguration::dispAvailableGraph()
{
    return p->m_dispAvailableGraph;
}
void toConfiguration::setDispAvailableGraph(bool v)
{
    p->m_dispAvailableGraph = v;
}

// totemplate
TemplatesMap toConfiguration::templates()
{
    return p->m_templates;
}
void toConfiguration::setTemplates(TemplatesMap v)
{
    p->m_templates = v;
}

// totuning
/*! True if there are no prefs for tuning.
  It's used when there is no p->m_tuningOverview defined in prefs. */
bool toConfiguration::tuningFirstRun()
{
    return p->m_tuningFirstRun;
}

bool toConfiguration::tuningOverview()
{
    return p->m_tuningOverview;
}
void toConfiguration::setTuningOverview(bool v)
{
    p->m_tuningOverview = v;
}

bool toConfiguration::tuningFileIO()
{
    return p->m_tuningFileIO;
}
void toConfiguration::setTuningFileIO(bool v)
{
    p->m_tuningFileIO = v;
}

bool toConfiguration::tuningWaits()
{
    return p->m_tuningWaits;
}
void toConfiguration::setTuningWaits(bool v)
{
    p->m_tuningWaits = v;
}

bool toConfiguration::tuningCharts()
{
    return p->m_tuningCharts;
}
void toConfiguration::setTuningCharts(bool v)
{
    p->m_tuningCharts = v;
}

// toworksheet
bool toConfiguration::wsAutoSave()
{
    return p->m_wsAutoSave;
}
void toConfiguration::setWsAutoSave(bool v)
{
    p->m_wsAutoSave = v;
}

bool toConfiguration::wsCheckSave()
{
    return p->m_wsCheckSave;
}
void toConfiguration::setWsCheckSave(bool v)
{
    p->m_wsCheckSave = v;
}

QString toConfiguration::wsAutoLoad()
{
    return p->m_wsAutoLoad;
}
void toConfiguration::setWsAutoLoad(const QString & v)
{
    p->m_wsAutoLoad = v;
}

bool toConfiguration::wsLogAtEnd()
{
    return p->m_wsLogAtEnd;
}
void toConfiguration::setWsLogAtEnd(bool v)
{
    p->m_wsLogAtEnd = v;
}

bool toConfiguration::wsLogMulti()
{
    return p->m_wsLogMulti;
}
void toConfiguration::setWsLogMulti(bool v)
{
    p->m_wsLogMulti = v;
}

bool toConfiguration::wsStatistics()
{
    return p->m_wsStatistics;
}
void toConfiguration::setWsStatistics(bool v)
{
    p->m_wsStatistics = v;
}

bool toConfiguration::wsTimedStats()
{
    return p->m_wsTimedStats;
}
void toConfiguration::setWsTimedStats(bool v)
{
    p->m_wsTimedStats = v;
}

bool toConfiguration::wsNumber()
{
    return p->m_wsNumber;
}
void toConfiguration::setWsNumber(bool v)
{
    p->m_wsNumber = v;
}

bool toConfiguration::wsMoveToErr()
{
    return p->m_wsMoveToErr;
}
void toConfiguration::setWsMoveToErr(bool v)
{
    p->m_wsMoveToErr = v;
}

bool toConfiguration::wsHistory()
{
    return p->m_wsHistory;
}
void toConfiguration::setWsHistory(bool v)
{
    p->m_wsHistory = v;
}

bool toConfiguration::wsExecLog()
{
    return p->m_wsExecLog;
}
void toConfiguration::setWsExecLog(bool v)
{
    p->m_wsExecLog = v;
}

bool toConfiguration::wsToplevelDescribe()
{
    return p->m_wsToplevelDescribe;
}
void toConfiguration::setWsToplevelDescribe(bool v)
{
    p->m_wsToplevelDescribe = v;
}


bool toConfiguration::useEditorShortcuts()
{
    return p->m_useEditorShortcuts;
}

void toConfiguration::setUseEditorShortcuts(bool v)
{
    p->m_useEditorShortcuts = v;
}

EditorShortcutsMap toConfiguration::editorShortcuts()
{
    return p->m_editorShortcuts;
}

void toConfiguration::setEditorShortcuts(const EditorShortcutsMap & v)
{
    p->m_editorShortcuts = v;
}

bool toConfiguration::useMaxTextWidthMark()
{
    return p->m_useMaxTextWidthMark;
}

void toConfiguration::setUseMaxTextWidthMark(bool v)
{
    p->m_useMaxTextWidthMark = v;
}

int toConfiguration::maxTextWidthMark()
{
    return p->m_maxTextWidthMark;
}

void toConfiguration::setMaxTextWidthMark(int v)
{
    p->m_maxTextWidthMark = v;
}

QByteArray toConfiguration::mainWindowGeometry()
{
    return p->m_mainWindowGeometry;
}

void toConfiguration::setMainWindowGeometry(QByteArray v)
{
    p->m_mainWindowGeometry = v;
}

QByteArray toConfiguration::mainWindowState()
{
    return p->m_mainWindowState;
}

void toConfiguration::setMainWindowState(QByteArray v)
{
    p->m_mainWindowState = v;
}


void toConfiguration::setLeftDockbarState(QByteArray v)
{
    p->m_leftDockbarState = v;
}

QByteArray toConfiguration::leftDockbarState()
{
    return p->m_leftDockbarState;
}

void toConfiguration::setRightDockbarState(QByteArray v)
{
    p->m_rightDockbarState = v;
}

QByteArray toConfiguration::rightDockbarState()
{
    return p->m_rightDockbarState;
}

// code editor
QString toConfiguration::staticChecker()
{
    return p->m_staticChecker;
} // staticChecker
void toConfiguration::setStaticChecker(const QString & v)
{
    p->m_staticChecker = v;
} // setStaticChecker
tora-2.1.3/src/toresultdata.h0000644000175000017500000001114311420541346015723 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#ifndef TORESULTDATA_H
#define TORESULTDATA_H

#include "config.h"
#include "toresulttableviewedit.h"
#include "tosql.h"
#include "toresult.h"
#include "toconnection.h"
#include "toresultmodel.h"

#include 
#include 
#include 

class QAction;
class toResultDataSingle;
class QCloseEvent;


class toResultData : public QWidget, public toResult
{
    Q_OBJECT;

    // toolbar actions
    QAction *filterAct;
    QAction *removeAct;
    QAction *refreshAct;
    QAction *addAct;
    QAction *saveAct;
    QAction *discardAct;
    QAction *deleteAct;
    QAction *duplicateAct;
    QAction *firstAct;
    QAction *previousAct;
    QAction *nextAct;
    QAction *lastAct;
    QAction *singleAct;

    // editable QTableView
    toResultTableViewEdit *Edit;

    // single record edit form
    toResultDataSingle *Form;

    // Owner of table.
    QString Owner;

    // Table name
    QString Table;

    // SQL select statement
    QString SQL;

    // ---------------------------------------- filter settings

    // Use filter for all tables.
    bool AllFilter;

    // Filter selection criteria
    QMap Criteria;

    // Filter retrieve order
    QMap Order;

    // Current filter name in map
    QString FilterName;

    // generate filtername
    QString filterName();

    // true if user has elected to discard current changes.
    // should be reset on every query
    bool Discard;

public:
    toResultData(QWidget *parent = 0,
                 const char *name = 0,
                 Qt::WindowFlags f = 0);


    /**
     * Reimplemented from toResult. First parameter is ignored.
     *
     */
    virtual void query(const QString &, const toQList ¶ms);


    /**
     * Reimplemented from toResult. Can handle all connections.
     *
     */
    virtual bool canHandle(toConnection &)
    {
        return true;
    }


    /**
     * Export data to a map.
     *
     * @param data A map that can be used to recreate the data of a chart.
     * @param prefix Prefix to add to the map.
     */
    virtual void exportData(std::map &data,
                            const QString &prefix);


    /**
     * Import data
     *
     * @param data Data to read from a map.
     * @param prefix Prefix to read data from.
     */
    virtual void importData(std::map &data,
                            const QString &prefix);


    /**
     * Prompt to save if modified.
     *
     */
    bool maybeSave(void);

signals:
    /**
     * Emitted when changes are saved.
     *
     */
    void changesSaved(void);

protected:
    virtual void closeEvent(QCloseEvent *);

protected slots:
    void navigate(QAction *);
    void changeFilter(bool);
    void removeFilter(bool);

public slots:
    void singleRecordForm(bool display);
    void updateForm(void);
    void save(void);
    void addRecord(void);
    void refreshWarn(void);
};


#endif
tora-2.1.3/src/toresultcolscomment.cpp0000644000175000017500000001104011402776023017666 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

// Author: Thomas Porschberg, core , (C) 2006
//
// Copyright: See COPYING file that comes with this distribution
//
//

#include "toresultcolscomment.h"
#include "toconnection.h"
#include "tosql.h"
#include "utils.h"

#include 
#include 


static toSQL SQLChangeTableCommentMySQL(
    "toResultCols:ChangeTableComment",
    "ALTER TABLE %1 COMMENT = %2",
    "Set a comment on a table. Must have same % signs",
    "4.1",
    "MySQL");

static toSQL SQLChangeTableComment(
    "toResultCols:ChangeTableComment",
    "COMMENT ON TABLE %1 IS %2",
    "");

static toSQL SQLChangeTableCommentPG(
    "toResultCols:ChangeTableComment",
    "COMMENT ON TABLE %1 IS %2",
    "",
    "7.1",
    "PostgreSQL");

static toSQL SQLChangeTableCommentTD(
    "toResultCols:ChangeTableComment",
    "COMMENT ON TABLE %1 IS %2",
    "",
    "",
    "Teradata");

static toSQL SQLChangeColumnComment(
    "toResultCols:ChangeColumnComment",
    "COMMENT ON COLUMN %1 IS %2",
    "Set a comment on a column. Must have same % signs");

static toSQL SQLChangeColumnCommentPG(
    "toResultCols:ChangeColumnComment",
    "COMMENT ON COLUMN %1 IS %2",
    "",
    "7.1",
    "PostgreSQL");

static toSQL SQLChangeColumnCommentTD(
    "toResultCols:ChangeColumnComment",
    "COMMENT ON COLUMN %1 IS %2",
    "",
    "",
    "Teradata");


toResultColsComment::toResultColsComment(QWidget *parent)
        : QLineEdit(parent), Changed(false)
{
    connect(this,
            SIGNAL(textChanged(const QString &)),
            this,
            SLOT(commentChanged()));
    connect(this,
            SIGNAL(editingFinished()),
            this,
            SLOT(saveUnchanged()));
}


void toResultColsComment::setComment(bool table,
                                     const QString &name,
                                     const QString &comment)
{
    saveUnchanged();
    disconnect(this,
               SIGNAL(textChanged(const QString &)),
               this,
               SLOT(commentChanged()));
    Table = table;
    Name = name;
    Changed = false;
    setText(comment);
    connect(this,
            SIGNAL(textChanged(const QString &)),
            this,
            SLOT(commentChanged()));
}


void toResultColsComment::commentChanged()
{
    Changed = true;
}


void toResultColsComment::saveUnchanged()
{
    try
    {
        if (!Name.isEmpty() && Changed)
        {
            Changed = false;
            toConnection &conn = toCurrentConnection(this);
            QString sql;
            if (Table)
                sql = SQLChangeTableComment(conn);
            else
                sql = SQLChangeColumnComment(conn);
            QString comment = text();
            comment.replace(QRegExp("'"), "''");
            comment = "'" + comment + "'";
            conn.execute(sql.arg(Name).arg(comment));
        }
    }
    TOCATCH;
}

tora-2.1.3/src/toproject.cpp0000644000175000017500000004566411270353625015577 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#include "utils.h"

#include "toconf.h"
#include "tohighlightedtext.h"
#include "tomain.h"
#include "tomemoeditor.h"
#include "toproject.h"
#include "toworksheet.h"

#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 

#include "icons/addproject.xpm"
#include "icons/filesave.xpm"
#include "icons/new.xpm"
#include "icons/sql.xpm"
#include "icons/trash.xpm"
#include "icons/up.xpm"
#include "icons/down.xpm"

static toProjectTemplate ProjectTemplate;

#define PROJECT_EXTENSIONS "SQL (*.sql *.pkg *.pkb),Project files (*.tpr) ,Text (*.txt), All (*)"

bool toProjectTemplateItem::project(void)
{
    if (!parent())
        return true;
    if (Filename.length() > 4 && Filename.mid(Filename.length() - 4, 4) == ".tpr")
        return true;
    return false;
}

void toProjectTemplateItem::setup(const QString &name, bool open)
{
    Order = -1;
    setFilename(name);
    if (project() && !Filename.isEmpty() && open)
    {
        try
        {
            // read in Filename (encoded according to locale settings)
            QString data = toReadFile(Filename);
            QStringList files = data.split(QRegExp(QString::fromLatin1("\n")));
            toProjectTemplateItem *last = NULL;
            for (int i = 0;i < files.count();i++)
                last = new toProjectTemplateItem(this, last, files[i]);
        }
        catch (const QString &exc)
        {
            toStatusMessage(exc);
        }
    }
}

void toProjectTemplateItem::setFilename(const QString &name)
{
    if (parent())
    {
        int pos = name.lastIndexOf(QString::fromLatin1("/"));
        if (pos < 0)
            pos = name.lastIndexOf(QString::fromLatin1("\\"));
        if (pos >= 0)
            setText(0, name.mid(pos + 1));
        else
            setText(0, name);
    }
    Filename = name;
}

toProjectTemplateItem::toProjectTemplateItem(toTemplateItem *item,
        toTreeWidgetItem *after,
        QString name, bool open)
        : toTemplateItem(item, QString::null, after)
{
    setup(name, open);
}

toProjectTemplateItem::toProjectTemplateItem(toTreeWidget *item, QString name, bool open)
        : toTemplateItem(ProjectTemplate, item, qApp->translate("toProject", "SQL Project"))
{
    setup(name, open);
}

int toProjectTemplateItem::order(bool asc)
{
    if (asc)
    {
        toProjectTemplateItem *item = previousSibling();
        if (item)
        {
            int attemptOrder = item->Order + 1;
            if (attemptOrder != Order)
                Order = item->order(asc) + 1;
        }
        else
            Order = 1;
    }
    else
    {
        toProjectTemplateItem *item = dynamic_cast(nextSibling());
        if (item)
        {
            int attemptOrder = item->Order + 1;
            if (attemptOrder != Order)
                Order = item->order(asc) + 1;
        }
        else
            Order = 1;
    }
    return Order;
}

toProjectTemplateItem *toProjectTemplateItem::previousSibling()
{
    toTreeWidgetItem *item = itemAbove();
    if (!item)
        return NULL;
    if (item == parent())
        return NULL;
    while (item && item->parent() != parent())
        item = item->parent();
    return dynamic_cast(item);
}

// Here be dragons! Basically all the order stuff will retain whatever order the
// items were created in.

QString toProjectTemplateItem::key(int col, bool asc) const
{
    if (!parent())
        return text(col);
    int no = ((toProjectTemplateItem *)this)->order(asc);
    QString ret;
    ret.sprintf("%010d", no);
    return ret;
}

void toProjectTemplateItem::selected(void)
{
    if (project())
        return ;
    try
    {
        toWorksheet::fileWorksheet(Filename);
    }
    TOCATCH;
}

QWidget *toProjectTemplateItem::selectedWidget(QWidget *parent)
{
    toProject *proj = ProjectTemplate.selectedWidget(parent);
    proj->selectItem(this);
    return proj;
}

toProject *toProjectTemplate::selectedWidget(QWidget *parent)
{
    if (!Details)
        Details = new toProject(ProjectTemplate.root(), parent);
    return Details;
}

void toProjectTemplate::importData(std::map &data, const QString &prefix)
{
    bool any = false;
    std::map::iterator i = data.find(prefix + ":");
    while (i != data.end())
    {
        if ((*i).first.mid(0, prefix.length()) == prefix)
        {
            Import[(*i).first.mid(prefix.length() + 1)] = (*i).second;
            any = true;
        }
        else if (any)
            break;
        i++;
    }
}

void toProjectTemplate::exportData(std::map &data, const QString &prefix)
{
    if (!Root)
        return ;
    std::map itemMap;
    toTreeWidgetItem *next;
    int id = 0;
    data[prefix + ":"] = Root->filename();
    for (toTreeWidgetItem *item = Root->firstChild();item;item = next)
    {
        id++;
        QString nam = prefix;
        nam += ":Items:";
        nam += QString::number(id).toLatin1();
        nam += ":";
        itemMap[item] = id;
        if (item->parent())
            data[nam + "Parent"] = QString::number(itemMap[item->parent()]);
        else
            data[nam + "Parent"] = QString::fromLatin1("0");
        if (item->isOpen())
            data[nam + "Open"] = QString::fromLatin1("Yes");
        toProjectTemplateItem *projitem = dynamic_cast(item);
        QString val;
        if (projitem)
            data[nam + "0"] = projitem->filename();

        if (item->firstChild())
            next = item->firstChild();
        else if (item->nextSibling())
            next = item->nextSibling();
        else
        {
            next = item;
            do
            {
                next = next->parent();
            }
            while (next && !next->nextSibling());
            if (next)
                next = next->nextSibling();
            if (next == Root->nextSibling())
                break;
        }
    }
}

void toProjectTemplate::insertItems(toTreeWidget *parent, QToolBar *toolbar)
{
    Root = new toProjectTemplateItem(parent, Import[""], false);
    Root->setOpen(true);

    int id = 1;
    std::map::iterator i;
    std::map itemMap;

    toProjectTemplateItem *last = NULL;

    while ((i = Import.find(QString("Items:") + QString::number(id).toLatin1() + ":Parent")) != Import.end())
    {
        QString nam = QString("Items:") + QString::number(id).toLatin1() + ":";
        int parent = (*i).second.toInt();
        if (parent)
            last = new toProjectTemplateItem(itemMap[parent], last, Import[nam + "0"], false);
        else
            last = new toProjectTemplateItem(Root, last, Import[nam + "0"], false);
        if (!Import[nam + "Open"].isEmpty())
            last->setOpen(true);
        itemMap[id] = last;
        id++;
    }

    connect(parent, SIGNAL(selectionChanged(toTreeWidgetItem *)), this, SLOT(changeItem(toTreeWidgetItem *)));
    AddFile = toolbar->addAction(QIcon(QPixmap(const_cast(addproject_xpm))),
                                 qApp->translate("toProject", "Add file to project"),
                                 this,
                                 SLOT(addFile()));
    DelFile = toolbar->addAction(QIcon(QPixmap(const_cast(trash_xpm))),
                                 qApp->translate("toProject", "Remove file from project"),
                                 this,
                                 SLOT(delFile()));
    AddFile->setEnabled(false);
    DelFile->setEnabled(false);
}

void toProjectTemplate::changeItem(toTreeWidgetItem *item)
{
    bool ena = dynamic_cast(item);
    AddFile->setEnabled(ena);
    DelFile->setEnabled(ena && item->parent());
}

void toProjectTemplate::removeItems(toTreeWidgetItem *item)
{
    delete item;
}

void toProjectTemplate::addFile(void)
{
    QString file = toOpenFilename(QString::null,
                                  QString::fromLatin1(PROJECT_EXTENSIONS),
                                  toMainWidget());
    if (!file.isNull())
    {
        toTreeWidget *view = Root->listView();
        toProjectTemplateItem *item = dynamic_cast(view->currentItem());
        if (item)
        {
            item->setOpen(true);
            toTreeWidgetItem *last = item->firstChild();
            while (last && last->nextSibling())
                last = last->nextSibling();
            if (item->project())
                new toProjectTemplateItem(item, last, file);
            else
            {
                item = dynamic_cast(item->parent());
                if (item)
                    new toProjectTemplateItem(item, last, file);
            }
        }
        if (Details)
            Details->update();
    }
}

void toProjectTemplate::delFile(void)
{
    toTreeWidget *view = Root->listView();
    toProjectTemplateItem *item = dynamic_cast(view->currentItem());
    delete item;
    if (Details)
        Details->update();
}

void toProject::update(toProjectTemplateItem *sourceparent, toResultViewItem *parent)
{
    if (parent == NULL)
    {
        parent = new toResultViewItem(Project, NULL, tr("SQL Project"));
        parent->setOpen(true);
        ItemMap[parent] = sourceparent;
    }
    for (toTreeWidgetItem *item = sourceparent->firstChild();item;item = item->nextSibling())
    {
        toProjectTemplateItem * projitem = dynamic_cast(item);
        if (projitem)
        {
            QFile file(projitem->filename());
            unsigned int size = file.size();
            toResultViewItem *nitem;
            nitem = new toResultViewItem(parent, NULL, projitem->filename());
            if (projitem->project())
                update(projitem, nitem);
            else if (size > 0)
                nitem->setText(1, QString::number(size));
            nitem->setOpen(true);
            if (projitem->isSelected())
                nitem->setSelected(true);
            ItemMap[nitem] = projitem;
        }
    }
}

toProject::toProject(toProjectTemplateItem *top, QWidget *parent)
        : QWidget(parent)
{
    Root = top;

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->setSpacing(0);
    vbox->setContentsMargins(0, 0, 0, 0);

    QToolBar *toolbar = toAllocBar(this, tr("SQL project"));
    vbox->addWidget(toolbar);

    toolbar->addAction(QIcon(QPixmap(const_cast(addproject_xpm))),
                       tr("Add file to project"),
                       this,
                       SLOT(addFile()));

    toolbar->addAction(QIcon(QPixmap(const_cast(filesave_xpm))),
                       tr("Save project"),
                       this,
                       SLOT(saveProject()));

    DelFile = toolbar->addAction(QIcon(QPixmap(const_cast(trash_xpm))),
                                 tr("Remove file from project"),
                                 this,
                                 SLOT(delFile()));

    toolbar->addSeparator();

    toolbar->addAction(QIcon(QPixmap(const_cast(new_xpm))),
                       tr("Add new subproject"),
                       this,
                       SLOT(newProject()));

    toolbar->addAction(QIcon(QPixmap(const_cast(sql_xpm))),
                       tr("Generate SQL for this project"),
                       this,
                       SLOT(generateSQL()));

    toolbar->addSeparator();

    toolbar->addAction(QIcon(QPixmap(const_cast(up_xpm))),
                       tr("Move up in project"),
                       this,
                       SLOT(moveUp()));

    toolbar->addAction(QIcon(QPixmap(const_cast(down_xpm))),
                       tr("Move down in project"),
                       this,
                       SLOT(moveDown()));

    toolbar->addWidget(new toSpacer());

    Project = new toListView(this);
    Project->addColumn(tr("File"));
    Project->addColumn(tr("Size"));
    Project->setSelectionMode(toTreeWidget::Single);
    Project->setRootIsDecorated(true);
    Project->setSorting(0);
    connect(Project,
            SIGNAL(selectionChanged()),
            this,
            SLOT(selectionChanged()));
    vbox->addWidget(Project);

    setLayout(vbox);
    update();
}

void toProject::update(void)
{
    ItemMap.clear();
    Project->clear();
    update(Root, NULL);
}

void toProject::selectionChanged(void)
{
    toTreeWidgetItem *item = Project->selectedItem();
    if (item)
    {
        DelFile->setEnabled(item->parent());
        toProjectTemplateItem *oi = ItemMap[item];
        if (oi)
        {
            oi->listView()->setSelected(oi, true);
        }
    }
}

void toProject::addFile(void)
{
    selectionChanged();
    ProjectTemplate.addFile();
}

void toProject::delFile(void)
{
    selectionChanged();
    ProjectTemplate.delFile();
}

void toProject::moveDown(void)
{
    toTreeWidgetItem *item = Project->selectedItem();
    if (item)
    {
        toProjectTemplateItem *oi = ItemMap[item];
        if (oi)
        {
            toTreeWidgetItem *item = oi->nextSibling();
            toTreeWidgetItem *parent = oi->parent();
            if (item && parent)
            {
                oi->moveItem(item);
                update();
            }
        }
    }
}

void toProject::moveUp(void)
{
    toTreeWidgetItem *item = Project->selectedItem();
    if (item)
    {
        toProjectTemplateItem *oi = ItemMap[item];
        if (oi)
        {
            toTreeWidgetItem *item = oi->previousSibling();
            toTreeWidgetItem *parent = oi->parent();
            if (item && parent)
            {
                item->moveItem(oi);
                update();
            }
        }
    }
}

void toProject::newProject(void)
{
    toTreeWidgetItem *item = Project->selectedItem();
    if (item)
    {
        toProjectTemplateItem *oi = ItemMap[item];
        if (oi)
        {
            toTreeWidgetItem *last = oi;
            if (!oi->project())
                oi = dynamic_cast(oi->parent());
            else
            {
                last = last->firstChild();
                while (last && last->nextSibling())
                    last = last->nextSibling();
            }
            if (oi)
            {
                new toProjectTemplateItem(oi, last, tr("untitled.tpr"));
                Project->update();
            }
        }
    }
}

void toProject::saveProject(void)
{
    toTreeWidgetItem *item = Project->selectedItem();
    if (item)
    {
        toProjectTemplateItem *oi = ItemMap[item];
        if (oi)
        {
            if (!oi->project())
                oi = dynamic_cast(oi->parent());
            if (oi)
            {
                QFileInfo file(oi->filename());
                QString fn = oi->filename();
                fn = toSaveFilename(file.dir().path(), QString::fromLatin1("*.tpr"), this);
                if (!fn.isEmpty())
                {
                    QString data;
                    for (toTreeWidgetItem *item = oi->firstChild();item;item = item->nextSibling())
                    {
                        toProjectTemplateItem * projitem = dynamic_cast(item);
                        data += projitem->filename() + QString::fromLatin1("\n");
                    }
                    // write file, encoded according to locale settings
                    if (toWriteFile(fn, data))
                        oi->setFilename(fn);
                }
            }
        }
    }
}

QString toProject::generateSQL(toProjectTemplateItem *parent)
{
    QString data;
    for (toProjectTemplateItem *item = dynamic_cast(parent->firstChild());
            item;
            item = dynamic_cast(item->nextSibling()))
    {
        if (item->project())
        {
            data += tr("\n\n-- Start of project %1\n\n").arg(item->filename());
            data += generateSQL(item);
        }
        else
        {
            data += tr("\n\n-- Start of file %1\n\n").arg(item->filename());
            data += toReadFile(item->filename());
        }
    }
    return data;
}

void toProject::generateSQL(void)
{
    toTreeWidgetItem *item = Project->selectedItem();
    if (item)
    {
        toProjectTemplateItem *oi = ItemMap[item];
        if (oi)
        {
            if (!oi->project())
                oi = dynamic_cast(oi->parent());
            if (oi)
            {
                QString data = generateSQL(oi);
                new toMemoEditor(toMainWidget(), data);
            }
        }
    }
}

toProject::~toProject()
{
    if (ProjectTemplate.Details == this)
        ProjectTemplate.Details = NULL;
}

void toProject::selectItem(toProjectTemplateItem *item)
{
    for (std::map::iterator i = ItemMap.begin();
            i != ItemMap.end();
            i++)
    {
        if ((*i).second == item)
        {
            disconnect(Project, SIGNAL(selectionChanged()),
                       this, SLOT(selectionChanged()));
            Project->setSelected((*i).first, true);
            connect(Project, SIGNAL(selectionChanged()),
                    this, SLOT(selectionChanged()));
            break;
        }
    }
}
tora-2.1.3/src/toresultcombo.cpp0000644000175000017500000000775711414153116016461 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#include "utils.h"

#include "toconf.h"
#include "toconnection.h"
#include "tonoblockquery.h"
#include "toresultcombo.h"
#include "tosql.h"
#include "totool.h"


toResultCombo::toResultCombo(QWidget *parent, const char *name)
  : QComboBox(parent), Query(0), SelectionPolicy(None)
{
    setObjectName(name);
    connect(&Poll, SIGNAL(timeout()), this, SLOT(poll()));
    connect(this, SIGNAL(activated(int)),
            this, SLOT(changeSelected(void)));
    setSizeAdjustPolicy(QComboBox::AdjustToContents);
}

toResultCombo::~toResultCombo()
{
}

void toResultCombo::query(const QString &sql, const toQList ¶m)
{
    if (!setSQLParams(sql, param))
        return ;

    try
    {
        clear();
        addItems(Additional);
        for (int i = 0;i < Additional.count();i++)
            if (Additional[i] == Selected)
                setCurrentIndex(i);

        Query = new toNoBlockQuery(connection(), toQuery::Background, sql, param);
        Poll.start(100);
    }
    TOCATCH
}

void toResultCombo::changeSelected(void)
{
    Selected = currentText();
}

void toResultCombo::poll(void)
{
    try
    {
        if (!toCheckModal(this))
            return ;

        if (Query && Query->poll())
        {
		while (Query->poll() && !Query->eof())
		{
    			QString t = Query->readValue();
    			QStringList l;
        		for(unsigned i=1; idescribe().size(); ++i)
        		{
        			QString v = Query->readValue();
        			l.append(v);
        		}
    			addItem(t, QVariant(l));
    			if (t == Selected)
    				setCurrentIndex(count() - 1);
		}

            if (Query->eof())
            {
		    Poll.stop();
		    switch(SelectionPolicy)
		    {
		    case First:
			    if (currentIndex() != 0)
				    setCurrentIndex(0);
			    break;
		    case Last:
			    if (currentIndex() != count()-1)
				    setCurrentIndex(count()-1);
			    break;
		    case LastButOne:
			    if (currentIndex() != count()-2)
				    setCurrentIndex(count()-2);
			    break;
		    case None:
			    ;
		    };
		    setFont(font()); // Small hack to invalidate size hint of combobox which should resize to needed size.
		    updateGeometry();
		    emit done();
            }
        }
    }
    catch (const QString &exc)
    {
        Poll.stop();
        emit done();
        toStatusMessage(exc);
    }
}
tora-2.1.3/src/toeditwidget.cpp0000644000175000017500000001102311270353625016240 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#include "toeditwidget.h"
#include "tomain.h"

std::list *toEditWidget::Handlers;

void toEditWidget::setMainSettings(void)
{
    toMain::editEnable(this);
}

toEditWidget::toEditWidget()
{
    Open = Save = Print = Undo = Redo = Cut = Copy = Paste = Search = SelectAll = ReadAll = false;
}

toEditWidget::toEditWidget(bool open, bool save, bool print,
                           bool undo, bool redo,
                           bool cut, bool copy, bool paste,
                           bool search,
                           bool selectAll, bool readAll)
{
    Open = open;
    Save = save;
    Print = print;
    Undo = undo;
    Redo = redo;
    Cut = cut;
    Copy = copy;
    Paste = paste;
    Search = search;
    SelectAll = selectAll;
    ReadAll = readAll;
}

void toEditWidget::setEdit(bool open, bool save, bool print,
                           bool undo, bool redo,
                           bool cut, bool copy, bool paste,
                           bool search,
                           bool selectAll, bool readAll)
{
    Open = open;
    Save = save;
    Print = print;
    Undo = undo;
    Redo = redo;
    Cut = cut;
    Copy = copy;
    Paste = paste;
    Search = search;
    SelectAll = selectAll;
    ReadAll = readAll;

    setMainSettings();
}

toEditWidget::~toEditWidget()
{
    toMain::editDisable(this);
}

void toEditWidget::addHandler(toEditWidget::editHandler *handler)
{
    if (!Handlers)
        Handlers = new std::list;
    for (std::list::iterator i = (*Handlers).begin();
            i != (*Handlers).end();
            i++)
        if (*i == handler)
            return ;
    (*Handlers).insert((*Handlers).end(), handler);
}

void toEditWidget::delHandler(toEditWidget::editHandler *handler)
{
    for (std::list::iterator i = (*Handlers).begin();
            i != (*Handlers).end();
            i++)
        if (*i == handler)
        {
            (*Handlers).erase(i);
            break;
        }
}

void toEditWidget::lostFocus(void)
{
    if (!Handlers)
        return ;
    for (std::list::iterator i = (*Handlers).begin();
            i != (*Handlers).end();
            i++)
    {
        (*i)->lostFocus(this);
    }
}

void toEditWidget::receivedFocus(void)
{
    toMain::setEditWidget(this);

    if (!Handlers)
        return ;
    for (std::list::iterator i = (*Handlers).begin();
            i != (*Handlers).end();
            i++)
    {
        (*i)->receivedFocus(this);
    }
}

toEditWidget::editHandler::editHandler()
{
    toEditWidget::addHandler(this);
}

toEditWidget::editHandler::~editHandler()
{
    toEditWidget::delHandler(this);
}

bool toEditWidget::editOpen(QString)
{
    return true;
}

bool toEditWidget::editSave(bool)
{
    return true;
}
tora-2.1.3/src/toprofiler.cpp0000644000175000017500000006303511342143740015736 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#include "utils.h"

#include "tochangeconnection.h"
#include "toconf.h"
#include "toconnection.h"
#include "tohighlightedtext.h"
#include "toprofiler.h"
#include "toresultitem.h"
#include "toresultlong.h"
#include "tosql.h"
#include "totool.h"
#include "toworksheetwidget.h"

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 

#include "icons/clock.xpm"
#include "icons/execute.xpm"
#include "icons/refresh.xpm"

static toSQL SQLProfilerRuns("toProfiler:ProfilerRuns",
                             "create table plsql_profiler_runs\n"
                             "(\n"
                             "  runid           number primary key,\n"
                             "  related_run     number,\n"
                             "  run_owner       varchar2(32),\n"
                             "  run_date        date,\n"
                             "  run_comment     varchar2(2047),\n"
                             "  run_total_time  number,\n"
                             "  run_system_info varchar2(2047),\n"
                             "  run_comment1    varchar2(2047),\n"
                             "  spare1          varchar2(256)\n"
                             ")",
                             "Create table plsql_profiler_runs");

static toSQL SQLProfilerUnits("toProfiler:ProfilerUnits",
                              "create table plsql_profiler_units\n"
                              "(\n"
                              "  runid              number references plsql_profiler_runs,\n"
                              "  unit_number        number,\n"
                              "  unit_type          varchar2(32),\n"
                              "  unit_owner         varchar2(32),\n"
                              "  unit_name          varchar2(32),\n"
                              "  unit_timestamp     date,\n"
                              "  total_time         number DEFAULT 0 NOT NULL,\n"
                              "  spare1             number,\n"
                              "  spare2             number,\n"
                              "  primary key (runid, unit_number)\n"
                              ")",
                              "Create table plsql_profiler_unites");

static toSQL SQLProfilerData("toProfiler:ProfilerData",
                             "create table plsql_profiler_data\n"
                             "(\n"
                             "  runid           number,\n"
                             "  unit_number     number,\n"
                             "  line#           number not null,\n"
                             "  total_occur     number,\n"
                             "  total_time      number,\n"
                             "  min_time        number,\n"
                             "  max_time        number,\n"
                             "  spare1          number,\n"
                             "  spare2          number,\n"
                             "  spare3          number,\n"
                             "  spare4          number,\n"
                             "  primary key (runid, unit_number, line#),\n"
                             "  foreign key (runid, unit_number) references plsql_profiler_units\n"
                             ")",
                             "Create table plsql_profiler_data");

static toSQL SQLProfilerNumber("toProfiler:ProfilerNumber",
                               "create sequence plsql_profiler_runnumber start with 1 nocache",
                               "Create sequence plsql_profiler_runnumber");

static toSQL SQLProfilerDetect("toProfiler:ProfilerDetect",
                               "select count(1)\n"
                               "  from plsql_profiler_data a,\n"
                               "       plsql_profiler_units b,\n"
                               "       plsql_profiler_runs c\n"
                               " where a.runid = null and b.runid = null and c.runid = null",
                               "Detect if profiler tables seems to exist");

static toSQL SQLListUnits("toProfiler:ListUnits",
                          "SELECT unit_owner \"Owner\",\n"
                          "       unit_name \"Name\",\n"
                          "       total_time \"Total time\",\n"
                          "       unit_timestamp \"Changed\",\n"
                          "       unit_type \" \",\n"
                          "       runid \" \",\n"
                          "       unit_number \" \"\n"
                          "  FROM plsql_profiler_units\n"
                          " WHERE runid = :run\n"
                          "   AND unit_owner != ''\n"
                          " ORDER BY total_time DESC",
                          "Get information of available units for a run, same columns and binds");

static toSQL SQLListSource("toProfiler:ListSource",
                           "SELECT *\n"
                           "  FROM (SELECT a.line \"#\",\n"
                           "               NVL(b.total_occur,0) \"Count\",\n"
                           "               b.total_time \"Total\",\n"
                           "               b.max_time \"Max\",\n"
                           "               b.min_time \"Min\",\n"
                           "               TRANSLATE(a.text,'A'||CHR(10),'A') \"Source\"\n"
                           "          FROM all_source a,\n"
                           "               plsql_profiler_data b\n"
                           "         WHERE a.owner = :owner\n"
                           "           AND a.name = :name\n"
                           "           AND a.type = :typ\n"
                           "           AND b.runid = :run\n"
                           "           AND b.unit_number = :unit\n"
                           "           AND a.line = b.line#\n"
                           "        UNION\n"
                           "        SELECT a.line,\n"
                           "               0,\n"
                           "               0,\n"
                           "               0,\n"
                           "               0,\n"
                           "               TRANSLATE(a.text,'A'||CHR(10),'A')\n"
                           "          FROM all_source a\n"
                           "         WHERE a.owner = :owner\n"
                           "           AND a.name = :name\n"
                           "           AND a.type = :typ\n"
                           "           AND not exists (select 'X'\n"
                           "                             from plsql_profiler_data b\n"
                           "                            where b.runid = :run\n"
                           "                              and b.unit_number = :unit\n"
                           "                              and a.line = b.line#)\n"
                           "       )\n"
                           " ORDER BY 1",
                           "Get information about an object with it's statistics data. This one is tricky, must have same binds and columns");

static toSQL SQLRunInfo("toProfiler:RunInfo",
                        "SELECT Related_Run \"Related run\",\n"
                        "       Run_Owner \"Owner\",\n"
                        "       Run_Comment \"Comment\",\n"
                        "       to_char(to_date(trunc(run_total_time/1E9),'SSSSS'),'HH24:MI:SS')||'.'||\n"
                        "       SUBSTR(TO_CHAR(TRUNC(run_total_time/1E7)-TRUNC(run_total_time/1E7,-2),'00'),2) \"Total time\",\n"
                        "       Run_System_Info \"System info\",\n"
                        "       Run_Comment1 \"Extra comment\"\n"
                        "  FROM plsql_profiler_runs\n"
                        " WHERE runid = :run",
                        "Get information about a run, same binds");

static toSQL SQLTotalTime("toProfiler:TotalTime",
                          "SELECT run_total_time\n"
                          "  FROM plsql_profiler_runs\n"
                          " WHERE runid = :run",
                          "Get total time of a run, same binds");

static toSQL SQLListRuns("toProfiler:ListRuns",
                         "SELECT runid,run_owner,run_comment,run_total_time\n"
                         "  FROM plsql_profiler_runs\n"
                         " ORDER BY runid DESC",
                         "Get list of available runs, same columns");

static toSQL SQLStartProfiler("toProfiler:StartProfiler",
                              "DECLARE\n"
                              "  PRAGMA AUTONOMOUS_TRANSACTION;\n"
                              "BEGIN\n"
                              "  DBMS_PROFILER.START_PROFILER(:comment,\n"
                              "                               :com2,\n"
                              "                               :runid);\n",
                              "Start profiler run, must have same binds");

static toSQL SQLStopProfiler("toProfiler:StopProfiler",
                             "  DBMS_PROFILER.STOP_PROFILER;\n"
                             "  UPDATE plsql_profiler_units a\n"
                             "     SET total_time = (SELECT SUM(total_time)\n"
                             "                         FROM plsql_profiler_data b\n"
                             "                        WHERE a.runid = b.runid\n"
                             "                          AND a.unit_number = b.unit_number);\n"
                             "  COMMIT;\n"
                             "END;",
                             "Stop profiler run");

class toProfilerTool : public toTool
{
    virtual const char **pictureXPM(void)
    {
        return const_cast(clock_xpm);
    }
public:
    toProfilerTool()
            : toTool(120, "PL/SQL Profiler")
    { }
    virtual const char *menuItem()
    {
        return "PL/SQL Profiler";
    }
    virtual QWidget *toolWindow(QWidget *parent, toConnection &connection)
    {
        return new toProfiler(parent, connection);
    }
    virtual void closeWindow(toConnection &connection){};
};

static toProfilerTool ProfilerTool;

static QString FormatTime(double tim)
{
    QString timstr;
    if (tim >= 3600)
        timstr.sprintf("%d:%02d:%02d.%02d",
                       int(tim) / 3600,
                       (int(tim) / 60) % 60,
                       int(tim) % 60,
                       int(tim*100) % 100);
    else if (tim > 1)
        timstr.sprintf("%d:%02d.%02d",
                       (int(tim) / 60) % 60,
                       int(tim) % 60,
                       int(tim*100) % 100);
    else if (tim > 0.001)
        timstr.sprintf("%d ms", (int)(tim*1000));
    else if (tim > 0)
        timstr.sprintf("%d ns", (int)(tim*1E9));
    else
        timstr = "0";
    return timstr;
}

class toProfilerUnits : public toResultLong
{
    double Total;
public:
class unitsItem : public toResultViewItem
    {
    public:
        unitsItem(toTreeWidget *parent, toTreeWidgetItem *after, const QString &buf = QString::null)
                : toResultViewItem(parent, after, buf)
        { }
        virtual void paintCell(QPainter *p, const QColorGroup &cg,
                               int column, int width, int alignment)
        {
#if 0                           // disabled - not overriding correct method
            if (column == 2)
            {
                toProfilerUnits *units = dynamic_cast(listView());
                if (!units)
                {
                    toTreeWidgetItem::paintCell(p, cg, column, width, alignment);
                    return ;
                }
                double total = allText(column).toDouble();
                QString timstr = FormatTime(total / 1E9);
                double val = total / units->total();

                p->fillRect(0, 0, int(val*width), height(), QBrush(Qt::blue));
                p->fillRect(int(val*width), 0, width, height(),
                            QBrush(isSelected() ? cg.highlight() : cg.base()));

                QPen pen(isSelected() ? cg.highlightedText() : cg.foreground());
                p->setPen(pen);
                p->drawText(0, 0, width, height(), Qt::AlignRight, timstr);
            }
            else
            {
                toTreeWidgetItem::paintCell(p, cg, column, width, alignment);
            }
#endif
        }
    };

    virtual toTreeWidgetItem *createItem(toTreeWidgetItem *last, const QString &str)
    {
        return new unitsItem(this, last, str);
    }
    toProfilerUnits(QWidget *parent)
            : toResultLong(true, false, toQuery::Normal, parent)
    {
        setColumnAlignment(3, Qt::AlignRight);
        setSQL(SQLListUnits);
    }
    double total(void) const
    {
        return Total;
    }
    void setTotal(double total)
    {
        Total = total;
        update();
    }
};

class toProfilerSource : public toResultLong
{
    double TotalOccur;
    double TotalTime;
    double MaxTime;
    double MinTime;
public:
class listItem : public toResultViewItem
    {
    public:
        listItem(toTreeWidget *parent, toTreeWidgetItem *after, const QString &buf = QString::null)
                : toResultViewItem(parent, after, buf)
        { }
        virtual QString text(int col) const
        {
            if (col == 2 || col == 3 || col == 4)
                return FormatTime(allText(col).toDouble() / 1E9);
            else
                return toResultViewItem::text(col);
        }

        bool operator<(const toTreeWidgetItem &other)
        {
#if 0                           // todo tree
            int col = treeWidget()->sortColumn();
            if (col == 2 || col == 3 || col == 4)
            {
                toProfilerSource::listItem *item =
                    dynamic_cast(&other);
                if (!i)
                    return toTreeWidgetItem::operator<(other);
                else
                {
                    double val_in = allText(col).toDouble();
                    double val_out = item->allText(col).toDouble();
                    return val_in < val_out;
                }
            }
            else
#endif
                return toTreeWidgetItem::operator<(other);
        }

        virtual void paintCell(QPainter *p, const QColorGroup &cg,
                               int column, int width, int alignment)
        {
#if 0                           // disabled - not overriding correct class
            if (column == 1 || column == 2 || column == 3 || column == 4)
            {
                toProfilerSource *source = dynamic_cast(listView());
                if (!source)
                {
                    toTreeWidgetItem::paintCell(p, cg, column, width, alignment);
                    return ;
                }
                double total = allText(column).toDouble();
                double val;
                switch (column)
                {
                case 1:
                    val = total / source->TotalOccur;
                    break;
                case 2:
                    val = total / source->TotalTime;
                    break;
                case 3:
                    val = total / source->MaxTime;
                    break;
                case 4:
                    val = total / source->MinTime;
                    break;
                default:
                    val = 0;
                }

                p->fillRect(0, 0, int(val*width), height(), QBrush(Qt::blue));
                p->fillRect(int(val*width), 0, width, height(),
                            QBrush(isSelected() ? cg.highlight() : cg.base()));

                QPen pen(isSelected() ? cg.highlightedText() : cg.foreground());
                p->setPen(pen);
                p->drawText(0, 0, width, height(), Qt::AlignRight, text(column));
            }
            else
            {
                toTreeWidgetItem::paintCell(p, cg, column, width, alignment);
            }
#endif
        }
    };

    virtual toTreeWidgetItem *createItem(toTreeWidgetItem *last, const QString &str)
    {
        return new listItem(this, last, str);
    }
    void clearTotals(void)
    {
        TotalOccur = TotalTime = MaxTime = MinTime = 0;
    }
    toProfilerSource(QWidget *parent)
            : toResultLong(true, false, toQuery::Normal, parent)
    {
        setColumnAlignment(1, Qt::AlignRight);
        setColumnAlignment(2, Qt::AlignRight);
        setColumnAlignment(3, Qt::AlignRight);
        setColumnAlignment(4, Qt::AlignRight);
        clearTotals();
    }
    void calcTotals(void)
    {
        clearTotals();
        for (toTreeWidgetItem *qi = firstChild();qi;qi = qi->nextSibling())
        {
            toResultViewItem * item = dynamic_cast(qi);
            if (item)
            {
                TotalOccur += item->allText(1).toDouble();
                TotalTime += item->allText(2).toDouble();
                double t;
                t = item->allText(3).toDouble();
                if (t > MaxTime)
                    MaxTime = t;
                t = item->allText(4).toDouble();
                if (t > MinTime)
                    MinTime = t;
            }
        }
        update();
    }
    friend class toProfilerSource::listItem;
};

toProfiler::toProfiler(QWidget *parent, toConnection &connection)
        : toToolWidget(ProfilerTool, "toprofiler.html", parent, connection, "toProfiler")
{
    QToolBar *toolbar = toAllocBar(this, tr("PL/SQL Profiler"));
    layout()->addWidget(toolbar);

    toolbar->addAction(QIcon(QPixmap(const_cast(refresh_xpm))),
                       tr("Refresh list"),
                       this,
                       SLOT(refresh()));

    toolbar->addSeparator();

    toolbar->addWidget(
        new QLabel(tr("Repeat run") + " ", toolbar));

    Repeat = new QSpinBox(toolbar);
    Repeat->setValue(5);
    Repeat->setMaximum(1000);
    toolbar->addWidget(Repeat);

    toolbar->addSeparator();

    toolbar->addWidget(new QLabel(tr("Comment") + " ", toolbar));

    Comment = new QLineEdit(toolbar);
    Comment->setText(tr("Unknown"));
    toolbar->addWidget(Comment);

    toolbar->addSeparator();

#if 0
    Background = new QToolButton(toolbar);
    Background->setToggleButton(true);
    Background->setIconSet(QIcon(QPixmap(const_cast(background_xpm))));
    QToolTip::add
    (Background, tr("Run profiling in background"));

    toolbar->addSeparator();
#endif

    toolbar->addAction(QIcon(QPixmap(const_cast(execute_xpm))),
                       tr("Execute current profiling"),
                       this,
                       SLOT(execute()));

    toolbar->addWidget(new toSpacer());

    new toChangeConnection(toolbar, TO_TOOLBAR_WIDGET_NAME);

    Tabs = new QTabWidget(this);
    layout()->addWidget(Tabs);

    Script = new toWorksheetWidget(Tabs, NULL, connection);
    Tabs->addTab(Script, tr("Script"));

    Result = new QSplitter(Tabs);
    Tabs->addTab(Result, tr("Result"));

    QWidget *box = new QWidget(Result);
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->setSpacing(0);
    vbox->setContentsMargins(0, 0, 0, 0);
    box->setLayout(vbox);
    Run = new QComboBox(box);
    vbox->addWidget(Run);
    QSplitter *vsplit = new QSplitter(Qt::Vertical, box);
    vbox->addWidget(vsplit);
    Info = new toResultItem(2, vsplit);
    Info->setSQL(SQLRunInfo);
    connect(Run, SIGNAL(activated(int)), this, SLOT(changeRun()));
    Units = new toProfilerUnits(vsplit);
    Units->setReadAll(true);
    Units->setSelectionMode(toTreeWidget::Single);
    connect(Units, SIGNAL(selectionChanged()), this, SLOT(changeObject()));
    Lines = new toProfilerSource(Result);
    Lines->setReadAll(true);
    connect(Lines, SIGNAL(done()), this, SLOT(calcTotals()));

    LastUnit = CurrentRun = 0;
//     show();

    try
    {
        toQuery query(connection, SQLProfilerDetect);
    }
    catch (const QString &)
    {
        int ret = TOMessageBox::warning(this,
                                        tr("Profiler tables doesn't exist"),
                                        tr("Profiler tables doesn't exist. Should TOra\n"
                                           "try to create them in the current schema?"),
                                        tr("&Yes"), tr("&No"), QString::null, 0, 1);
        if (ret == 0)
        {
            try
            {
                connection.execute(SQLProfilerRuns);
                connection.execute(SQLProfilerUnits);
                connection.execute(SQLProfilerData);
                connection.execute(SQLProfilerNumber);
            }
            catch (const QString &str)
            {
                toStatusMessage(str);
                QTimer::singleShot(1, this, SLOT(noTables()));
                return ;
            }
        }
        else
        {
            QTimer::singleShot(1, this, SLOT(noTables()));
            return ;
        }
    }

    refresh();
}

void toProfiler::refresh(void)
{
    Run->clear();
    Run->addItem(tr("Select run"));
    try
    {
        toQuery query(connection(), SQLListRuns);
        int id = 1;
        while (!query.eof())
        {
            QString runid = query.readValueNull();
            QString owner = query.readValueNull();
            QString comment = query.readValueNull();
            double total = query.readValueNull().toDouble() / 1E9;
            if (!owner.isEmpty())
                owner = QString::fromLatin1("(") + owner + QString::fromLatin1(")");
            QString timstr = QString::fromLatin1(" [") + FormatTime(total) + QString::fromLatin1("]");
            Run->addItem(runid + owner + QString::fromLatin1(": ") + comment + timstr);
            if (runid.toInt() == CurrentRun)
            {
                Run->setCurrentIndex(id);
                changeRun();
            }
            id++;
        }
    }
    TOCATCH
}

void toProfiler::execute(void)
{
    try
    {
        QString exc;
        exc = toSQL::string(SQLStartProfiler, connection());
        for (int i = 0;i < Repeat->value();i++)
        {
            exc += Script->editor()->text();
            exc += QString::fromLatin1("\n");
        }
        exc += toSQL::string(SQLStopProfiler, connection());

        toQuery query(connection(),
                      exc,
                      Comment->text(),
                      tr("%1 runs").arg(Repeat->value()));
        CurrentRun = query.readValue().toInt();
        if (CurrentRun > 0)
        {
            Tabs->setCurrentIndex(Tabs->indexOf(Result));
            refresh();
        }
        else
            toStatusMessage(tr("Something went wrong collecting statistics"));
    }
    TOCATCH
}

void toProfiler::changeRun(void)
{
    QString t = Run->currentText();
    int pos = t.indexOf(QString::fromLatin1("("));
    if (pos < 0)
        pos = t.indexOf(QString::fromLatin1(":"));
    if (pos >= 0)
        CurrentRun = t.mid(0, pos).toInt();
    QString run = QString::number(CurrentRun);
    try
    {
        toQList vals = toQuery::readQuery(connection(), SQLTotalTime, run);
        Units->setTotal(toShift(vals).toDouble());
        Units->changeParams(run);
        Info->changeParams(run);
    }
    TOCATCH
}

void toProfiler::calcTotals(void)
{
    Lines->calcTotals();
}

void toProfiler::changeObject(void)
{
    toTreeWidgetItem *qi = Units->selectedItem();
    toResultViewItem *item = qi ? dynamic_cast(qi) : NULL;
    if (item)
    {
        toQList par;
        toPush(par, toQValue(item->allText(0)));
        toPush(par, toQValue(item->allText(1)));
        toPush(par, toQValue(item->allText(4)));
        toPush(par, toQValue(item->allText(5)));
        toPush(par, toQValue(item->allText(6)));
        Lines->clearTotals();
        try
        {
            Lines->query(toSQL::string(SQLListSource, connection()), par);
        }
        TOCATCH
    }
}
tora-2.1.3/src/totool.cpp0000644000175000017500000002475311336032004015066 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 *
 * Shared/mixed copyright is held throughout files in this product
 *
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2008 Numerous Other Contributors
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 *
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries.
 *
 *      You may link this product with any GPL'd Qt library.
 *
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

//
// C++ Implementation: toTool, toToolWidget, toConnectionWidget
//

#include "utils.h"

#include "tobackground.h"
#include "toconf.h"
#include "toconnection.h"
#include "tomain.h"
#include "totool.h"

#ifndef Q_OS_WIN32
#include 
#endif

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


// A little magic to get lrefresh to work and get a check on qApp

#undef QT_TRANSLATE_NOOP
#define QT_TRANSLATE_NOOP(x,y) QTRANS(x,y)

toConnectionWidget::toConnectionWidget(toConnection &conn, QWidget *widget)
        : Connection(&conn), Widget(widget)
{
    Connection->addWidget(Widget);
}

void toConnectionWidget::setConnection(toConnection &conn)
{
    if (Connection)
        Connection->delWidget(Widget);
    Connection = &conn;
    Connection->addWidget(Widget);
}

toConnectionWidget::toConnectionWidget(QWidget *widget)
        : Widget(widget)
{
    Connection = NULL;
}

toConnection &toConnectionWidget::connection()
{
    if (Connection)
        return *Connection;
    QWidget *widget = Widget;
    if (!widget)
        throw qApp->translate("toConnectionWidget", "toConnectionWidget not inherited with a QWidget");
    return toCurrentConnection(widget->parentWidget());
}

toToolWidget::toToolWidget(toTool &tool, const QString &ctx, QWidget *parent, toConnection &conn, const char *name)
    : QWidget(parent),
        toHelpContext(ctx),
        toConnectionWidget(conn, this),
        Tool(tool)
{
    if (name)
        setObjectName(name);
    // make sure widget gets deleted
    setAttribute(Qt::WA_DeleteOnClose);
    // have to set the basic layout for widgets. It's requested later
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->setSpacing(0);
    vbox->setContentsMargins(0, 0, 0, 0);
    setLayout(vbox);

    Timer = NULL;

    if (parent)
    {
        // Voodoo for making connection changing cascade to sub tools.
        try
        {
            toToolWidget *tool = toCurrentTool(parent);
            if (tool)
                connect(tool, SIGNAL(connectionChange()), this, SLOT(parentConnection()));
        }
        catch (...)
	{}
    }
}

toConnectionWidget::~toConnectionWidget()
{
}

void toToolWidget::parentConnection(void)
{
    try
    {
        setConnection(toCurrentConnection(parentWidget()));
    }
    TOCATCH
}

toToolWidget::~toToolWidget()
{
    toMainWidget()->toolWidgetRemoved(this);
}

void toToolWidget::setConnection(toConnection &conn)
{
    bool connCap = false;
    QString name = connection().description();
    QString capt = windowTitle();
    if (capt.startsWith(name))
    {
        connCap = true;
        capt = capt.mid(name.length());
    }
    toConnectionWidget::setConnection(conn);
    if (connCap)
    {
        capt.prepend(connection().description());
        setWindowTitle(capt);
    }
    emit connectionChange();
}

toTimer *toToolWidget::timer(void)
{
    if (!Timer)
        Timer = new toTimer(this);
    return Timer;
}

void toToolWidget::exportData(std::map &data, const QString &prefix)
{
    QWidget *par = parentWidget();
    if (!par)
        par = this;
    if (isMaximized() || par->width() >= toMainWidget()->workspace()->width())
        data[prefix + ":State"] = QString::fromLatin1("Maximized");
    else if (isMinimized())
        data[prefix + ":State"] = QString::fromLatin1("Minimized");

    data[prefix + ":X"] = QString::number(par->x());
    data[prefix + ":Y"] = QString::number(par->y());
    data[prefix + ":Width"] = QString::number(par->width());
    data[prefix + ":Height"] = QString::number(par->height());
}

void toToolWidget::importData(std::map &data, const QString &prefix)
{
    QWidget *par = parentWidget();
    if (!par)
        par = this;
    if (data[prefix + ":State"] == QString::fromLatin1("Maximized"))
    {
        par->showMaximized();
        showMaximized();
    }
    else if (data[prefix + ":State"] == QString::fromLatin1("Minimized"))
    {
        par->showMinimized();
        showMinimized();
    }
    else
    {
        par->showNormal();
        par->setGeometry(data[prefix + ":X"].toInt(),
                         data[prefix + ":Y"].toInt(),
                         data[prefix + ":Width"].toInt(),
                         data[prefix + ":Height"].toInt());

    }
}

std::map *toTool::Tools;
// std::map *toTool::Configuration;


const char **toTool::pictureXPM(void)
{
    return (const char **) NULL;  // compiler warning
}

toTool::toTool(int priority, const char *name)
        : Name(name),
        Priority(priority),
        ButtonPicture(0),
        toolAction(0)
{
    if (!Tools)
        Tools = new std::map;
    Key.sprintf("%05d%s", priority, name);
    (*Tools)[Key] = this;
}

toTool::~toTool()
{
    Tools->erase(Key);
    delete ButtonPicture;
}

const QPixmap *toTool::toolbarImage()
{
    if (!ButtonPicture)
    {
        const char **picture = pictureXPM();
        if (picture)
            ButtonPicture = new QPixmap(picture);
    }
    return ButtonPicture;
}

QWidget* toTool::createWindow()
{
    toMain *main = toMainWidget();
    QWidget *newWin = 0;

    try
    {
        if (!canHandle(main->currentConnection()))
            throw QString("The tool %1 doesn't support the current database").arg(QString(name()));
        newWin = toolWindow(main->workspace(), main->currentConnection());

        if (newWin)
        {
            toToolWidget *tool = dynamic_cast(newWin);

            if (tool && tool->windowTitle().isEmpty()) {
                toToolCaption(tool, name());
            }

            // save previous window
            QMdiSubWindow *previous = main->lastActiveWindow();
            QMdiSubWindow *newsub = main->workspace()->addSubWindow(newWin);
            newsub->setFocusProxy(newWin);
            const QPixmap *icon = toolbarImage();
            if (icon)
            {
                newWin->setWindowIcon(*icon); // is this really required?
                newsub->setWindowIcon(*icon);
            }

            if(tool)
                main->toolWidgetAdded(tool);

            // Maximize window if only window
            bool max = true;
            foreach(QMdiSubWindow *window, main->workspace()->subWindowList())
            {
                QWidget *widget = window->widget();
                if (widget && widget != newWin && !widget->isHidden())
                    max = false;
            }

            if(!max && previous)
            {
                // if not max, check previous window. if it's
                // maximized then show this window max
                if(previous->windowState() & Qt::WindowMaximized)
                    max = true;
            }

            if (max)
                newWin->showMaximized();

            // workaround bug in mdi. deactivate subwindow first, then
            // set active
            // WARNING: don't change this call order unles you know what
            // are you doing ;) It's working now. When there is missing
            // "previous" call, the toWorksheet tool do not get focus.
            // Dunno why... it makes me mad.
            main->workspace()->setActiveSubWindow(0);
            main->workspace()->setActiveSubWindow(previous);
            main->workspace()->setActiveSubWindow(newsub);

            // piece of shit mdi doesn't always send window activated
            // signal
            main->windowActivated(newsub);

            newsub->show();
            newsub->raise();
            newsub->setFocus();

            main->updateWindowsMenu();
        }
    }
    TOCATCH;

    return newWin;
}


bool toTool::canHandle(toConnection &conn)
{
    return (toIsOracle(conn));
}

QAction* toTool::getAction(void)
{
    if (toolAction)
        return toolAction;

    toolAction = new QAction(toMainWidget());
    if (toolbarImage())
        toolAction->setIcon(QIcon(QPixmap(pictureXPM())));
    if (menuItem())
        toolAction->setText(menuItem());
    if (toolbarTip())
        toolAction->setToolTip(toolbarTip());

    connect(toolAction, SIGNAL(triggered()), this, SLOT(createWindow()));

    return toolAction;
}


void toTool::customSetup()
{}

QWidget *toTool::configurationTab(QWidget *)
{
    return NULL;
}

toTool *toTool::tool(const QString &key)
{
    if (!Tools)
        Tools = new std::map;
    std::map::iterator i = Tools->find(key);
    if (i == Tools->end())
        return NULL;

    return (*i).second;
}

void toTool::about(QWidget *)
{}

// const QString& toTool::config(const QString &tag, const QString &def) {
//     return toConfigurationSingle::Instance().config(tag, def, Name);
// }
//
// void toTool::setConfig(const QString &tag, const QString &value) {
//     toConfigurationSingle::Instance().setConfig(tag, value, Name);
// }
tora-2.1.3/src/tobrowsersynonymwidget.cpp0000644000175000017500000000662411351612746020450 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#include "toresultextract.h"
#include "toresultitem.h"
#include "toresultgrants.h"
#include "utils.h"

#include "tobrowsersynonymwidget.h"


static toSQL SQLSynonymInfo("toBrowser:SynonymInformation",
                            "SELECT * FROM Sys.All_Synonyms a\n"
                            " WHERE Owner = :f1\n"
                            "   AND Synonym_Name = :f2",
                            "Display information about a synonym");


toBrowserSynonymWidget::toBrowserSynonymWidget(QWidget * parent)
    : toBrowserBaseWidget(parent)
{
    setObjectName("toBrowserSynonymWidget");

    resultInfo = new toResultItem(this);
    resultInfo->setObjectName("resultInfo");
    resultInfo->setSQL(SQLSynonymInfo);

    grantsView = new toResultGrants(this);
    grantsView->setObjectName("grantsView");

    extractView = new toResultExtract(this);
    extractView->setObjectName("extractView");

    changeConnection();
}

void toBrowserSynonymWidget::changeParams(const QString & schema, const QString & object)
{
    int pos = object.indexOf(".");
    QString own("PUBLIC");
    QString name(object);

    if (pos >= 0)
    {
        own = object.mid(0, pos);
        name = object.mid(pos + 1);
    }

    toBrowserBaseWidget::changeParams(own, name);
}

void toBrowserSynonymWidget::changeConnection()
{
    toBrowserBaseWidget::changeConnection();

    toConnection & c = toCurrentConnection(this);

    if (toIsOracle(c))
    {
        addTab(resultInfo, "Info");
        addTab(grantsView, "&Grants");
        addTab(extractView, "Script");
    }
    else
    {
        resultInfo->setVisible(false);
        grantsView->setVisible(false);
        extractView->setVisible(false);
    }
}
tora-2.1.3/src/tobackground.cpp0000644000175000017500000000746311336032004016227 0ustar  michaelmichael/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 *
 * Shared/mixed copyright is held throughout files in this product
 *
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2008 Numerous Other Contributors
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 *
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries.
 *
 *      You may link this product with any GPL'd Qt library.
 *
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

//
// C++ Implementation: toBackground
//

#include "utils.h"

#include "tobackground.h"
#include "toconnection.h"

#include 
#include 
#include 

#include "tobackgroundlabel.h"
#include "tomain.h"

int toBackground::Running = 0;

toBackground::toBackground(QObject* parent, const char* name)
        : toTimer(parent, name)
{
    //createToBackgroundLabel()
    main = toMainWidget();
}

void toBackground::start(int msec)
{
    main = toMainWidget();

    if (!isActive())
    {
        Running++;
        main->getBackgroundLabel()->unpause();
    }
    main->getBackgroundLabel()->setSpeed(std::min(Running, 1)*100);
    //Animation->setSpeed(std::min(Running, 1)*100);
    if (Running > 1)
    {
        main->getBackgroundLabel()->setTip(tr("%1 queries running in background.").arg(Running));
        //QToolTip::add(Label, tr("%1 queries running in background.").arg(Running));
    }
    else
    {
        main->getBackgroundLabel()->setTip(tr("One query running in background."));
        //   QToolTip::add(Label, tr("One query running in background."));
    }
    toTimer::start(msec);
}

void toBackground::stop(void)
{
    main = toMainWidget();

    /*if (!Animation)
        init(); */
    if (isActive())
    {
        Running--;
        if (Running == 0 )
            main->getBackgroundLabel()->pause();
        else
            main->getBackgroundLabel()->setSpeed(Running*100);
        if (Running > 1)
            main->getBackgroundLabel()->setTip(tr("%1 queries running in background.").arg(Running));
        else if (Running == 1)
            main->getBackgroundLabel()->setTip("One query running in background.");
        else
            main->getBackgroundLabel()->setTip(tr("No background queries."));

    }
    toTimer::stop();
}

/*void toBackground::init(void)
{
    toMain *main = toMainWidget();
    if (!main || Label)
        return ;

    Label = theToBackgroundLabel(main->statusBar());
    Label->show();
    main->statusBar()->addWidget(Label, 0, true);
    QToolTip::add
        (Label, tr("No background queries."));
}*/

toBackground::~toBackground()
{
    stop();
}
tora-2.1.3/src/tosgastatement.cpp0000644000175000017500000001254211270353625016615 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#include "utils.h"

#include "toconnection.h"
#include "toconf.h"
#include "toresultfield.h"
#include "toresultplan.h"
#include "toresultplan.h"
#include "toresultresources.h"
#include "toresultview.h"
#include "tosgastatement.h"
#include "tosgatrace.h"
#include "tosqlparse.h"
#include "totool.h"


void toSGAStatement::viewResources(void)
{
    try
    {
        Resources->changeParams(Address);
    }
    catch (...)
    {
        toStatusMessage(tr("Couldn't find SQL statement in SGA"), false, false);
    }
}

static toSQL SQLParsingSchema(
    "toSGAStatement:ParsingSchema",
    "SELECT username\n"
    "  FROM v$sql a,\n"
    "       all_users b\n"
    " WHERE b.user_id = a.parsing_schema_id\n"
    "   AND a.address || ':' || a.hash_value = :f1 AND a.child_number = 0",
    "Get the schema that parsed a statement");

static toSQL SQLcheckVSQL(
    "toSGAStatement:checkVSQL",
    "SELECT count(*) FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1'",
    "Check whether plan for the statement with specified addres exists in V$SQL_PLAN",
    "0900");

static toSQL SQLBackendSql(
    "toSGAStatement:BackendSql",
    "SELECT pg_stat_get_backend_activity ( :backend )",
    "Get the backend's SQL statement.",
    "",
    "PostgreSQL");

toSGAStatement::toSGAStatement(QWidget *parent)
        : QTabWidget(parent)
{

    SQLText = new toResultField(this);
    addTab(SQLText, tr("SQL"));

    if (toIsOracle(toCurrentConnection(this)))
    {
        Plan = new toResultPlan(this);
        addTab(Plan, tr("Execution plan"));
        Resources = new toResultResources(this);
        addTab(Resources, tr("Information"));
    }
    else
        QTabWidget::tabBar()->hide();

    connect(this, SIGNAL(currentChanged(int)),
            this, SLOT(changeTab(int)));
    CurrentTab = SQLText;
}

void toSGAStatement::changeTab(int index)
{
    QWidget *widget = QTabWidget::widget(index);
    try
    {
        CurrentTab = widget;
        if (!Address.isEmpty() && Address != QString::fromLatin1("00:0"))
        {
            if (CurrentTab == SQLText)
            {
                QString sql;
                toConnection &conn = toCurrentConnection(this);

                if (toIsOracle(conn))
                    sql = toSQLString(conn, Address);
                else if (toIsPostgreSQL(conn))
                {
                    toQList vals = toQuery::readQuery(conn, SQLBackendSql, Address);

                    for (toQList::iterator i = vals.begin(); i != vals.end(); i++)
                        sql.append(*i);
                }

                if (toConfigurationSingle::Instance().autoIndent())
                    sql = toSQLParse::indent(sql);
                SQLText->setText(sql);
            }
            else if (CurrentTab == Plan)
            {
		toConnection &conn = toCurrentConnection(this);
		    /*
                Plan->query(toSQLString(toCurrentConnection(this), Address),
                            toQuery::readQuery(toCurrentConnection(this),
                                               SQLParsingSchema, Address));
					       */
		if (conn.version() >= "0900" &&
		    toConfigurationSingle::Instance().vsqlPlans() && 
		    toQuery::readQuery(conn,toSQL::string(SQLcheckVSQL, conn).arg(Address)).begin()->toInt() > 0) 
	            Plan->query(QString::fromLatin1("SGA:") + Address);
		else
		    Plan->query(toSQLString(conn, Address),
				toQuery::readQuery(conn,SQLParsingSchema, Address));
            }
            else if (CurrentTab == Resources)
                viewResources();
        }
    }
    TOCATCH;
}

void toSGAStatement::changeAddress(const QString &str)
{
    Address = str;
    changeTab(QTabWidget::indexOf(CurrentTab));
}
tora-2.1.3/src/toproject.h0000644000175000017500000001055611270353625015234 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#ifndef TOPROJECT_H
#define TOPROJECT_H

#include "config.h"
#include "totemplate.h"

#include 

#include 
#include 


class toProjectTemplateItem : public toTemplateItem
{
    QString Filename;
    int Order;
    void setup(const QString &name, bool open);
    int order(bool asc);

public:
    toProjectTemplateItem(toTemplateItem *item,
                          toTreeWidgetItem *after,
                          QString name,
                          bool open = true);
    toProjectTemplateItem(toTreeWidget *item,
                          QString name = QString::null,
                          bool open = true);

    virtual QString key(int col, bool asc) const;

    const QString &filename(void) const
    {
        return Filename;
    }
    void setFilename(const QString &file);
    bool project(void);
    virtual void selected(void);
    toProjectTemplateItem *previousSibling(void);

    virtual QWidget *selectedWidget(QWidget *parent);
};

class toProject : public QWidget
{
    Q_OBJECT;

    toProjectTemplateItem *Root;
    QAction               *DelFile;
    toTreeWidget            *Project;

    std::map ItemMap;

    void update(toProjectTemplateItem *sourceparent, toResultViewItem *parent);
    QString generateSQL(toProjectTemplateItem *item);

public:
    toProject(toProjectTemplateItem *top, QWidget *parent);
    ~toProject();

    void selectItem(toProjectTemplateItem *);

public slots:
    void update(void);
    void addFile(void);
    void delFile(void);
    void newProject(void);
    void saveProject(void);
    void generateSQL(void);
    void selectionChanged(void);
    void moveDown(void);
    void moveUp(void);
};


class toProjectTemplate : public QObject, public toTemplateProvider
{
    Q_OBJECT;

    toProjectTemplateItem *Root;
    std::map Import;

    QAction *AddFile;
    QAction *DelFile;

    toProject *Details;

public:
    toProjectTemplate(void)
            : QObject(0), toTemplateProvider("project")
    {
        setObjectName("projecttemplate");
        Details = NULL;
    }

    virtual void exportData(std::map &data, const QString &prefix);
    virtual void importData(std::map &data, const QString &prefix);

    virtual void insertItems(toTreeWidget *parent, QToolBar *toolbar);
    virtual void removeItems(toTreeWidgetItem *item);

    virtual toProject *selectedWidget(QWidget *parent);

    virtual toProjectTemplateItem *root(void)
    {
        return Root;
    }

    friend class toProject;

public slots:
    void addFile();
    void delFile();
    void changeItem(toTreeWidgetItem *item);
};

#endif
tora-2.1.3/src/toworksheetstatistic.h0000644000175000017500000000603311270353625017524 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#ifndef TOWORKSHEETSTATISTIC_H
#define TOWORKSHEETSTATISTIC_H

#include "config.h"

#include 
#include 

#include 

#include 
#include 
#include 
#include 

class QLabel;
class QSplitter;
class toAnalyze;
class toBarChart;
class toListView;
class toWorksheetStatistic;
class QAction;


class toWorksheetStatistic : public QWidget
{
    Q_OBJECT;

    struct data
    {
        QAction    *Action;
        QWidget    *Top;
        QLabel     *Label;
        QSplitter  *Charts;
        toListView *Statistics;
        toBarChart *Wait;
        toBarChart *IO;
        toListView *Plan;
    };

    std::list Open;

    QMenu *SaveMenu;
    QMenu *RemoveMenu;

    static toAnalyze *Widget;
    toAnalyze        *Tool;
    QSplitter        *Splitter;
    QWidget          *Dummy;

    QToolButton *ShowPlans;
    QToolButton *ShowCharts;

public:
    toWorksheetStatistic(QWidget *parent);
    ~toWorksheetStatistic();

    static void saveStatistics(std::map &stats);

    void addStatistics(std::map &stats);

public slots:

    virtual void showPlans(bool);
    virtual void showCharts(bool);

    virtual void save(QAction *);
    virtual void remove(QAction *);
    virtual void load(void);
    virtual void displayMenu(void);
};

#endif
tora-2.1.3/src/toresulttableview.h0000644000175000017500000003266111420544125017002 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 *
 * Shared/mixed copyright is held throughout files in this product
 *
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2008 Numerous Other Contributors
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 *
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries.
 *
 *      You may link this product with any GPL'd Qt library.
 *
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#ifndef TORESULTTABLEVIEW_H
#define TORESULTTABLEVIEW_H

#include "config.h"
#include "toqvalue.h"
#include "tosql.h"
#include "toresult.h"
#include "toconnection.h"
#include "toresultmodel.h"
#include "toeditwidget.h"

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

class toResultStats;
class toViewFilter;
class toTableViewIterator;
class toWorkingWidget;
class toExportSettings;


/**
 * This is a simple class for providing sensible size hints to the
 * view.
 *
 */
class toResultTableViewDelegate : public QItemDelegate
{
    static const int maxWidth = 200; // the maximum size to grow a column

public:
    toResultTableViewDelegate(QObject *parent = 0)
        : QItemDelegate(parent)
    {
    }


    virtual QSize sizeHint(const QStyleOptionViewItem &option,
                           const QModelIndex &index) const
    {
        QSize size = QItemDelegate::sizeHint(option, index);
        if (size.width() > maxWidth)
            size.setWidth(maxWidth);

        return size;
    }
};


class toResultTableView : public QTableView,
    public toResult,
    public toEditWidget
{
    Q_OBJECT;

    // Widget to store query statistics to.
    toResultStats *Statistics;

    // if edit delegate should be created
    bool Editable;

    // if all records should be read
    bool ReadAll;

    // if column headers should be modified to be readable
    bool ReadableColumns;

    // number of visible columns
    int VisibleColumns;

    // if vertical header should be displayed
    bool NumberColumn;

    // if user resized columns
    bool ColumnsResized;

    // filter object if set
    toViewFilter *Filter;

    // superimposed until model is ready
    toWorkingWidget *Working;

    // set true when model has signaled
    bool Ready;

    // set true when model has finished.
    // helps work around determining when query.eof has been reached.
    bool Finished;

    /**
     * context menu items. may be null.
     *
     */
    QMenu   *Menu;
    QAction *displayAct;
    QAction *refreshAct;
    QAction *leftAct;
    QAction *rightAct;
    QAction *centerAct;
    QAction *copyAct;
    QAction *copyFormatAct;
    QAction *copyTransAct;
    QAction *selectAllAct;
    QAction *exportAct;
    QAction *editAct;
    QAction *rowCountAct;
    QAction *readAllAct;

    void createActions(void);

    /*! \brief Common setup function called from constructors
    */
    void setup(bool readable, bool numberColumn, bool editable);


protected slots:
    void displayMenu(const QPoint &pos);
    void menuCallback(QAction *action);
    void handleDone(void);
    void handleReset(void);
    void handleFirst(const toConnection::exception &res,
                     bool error);
    void handleDoubleClick(const QModelIndex &);
    // override parent
    virtual void selectionChanged(const QItemSelection &selected,
                                  const QItemSelection &deselected);

    // apply column rules, numbercolumn, readable columns
    void applyColumnRules(void);

protected:
    // pointer to model
    QPointer Model;

    QString Owner;
    QString Table;

    /**
     * overridden from parent.
     *
     * Returns the size hint for the given row's height or -1 if there
     * is no model.
     *
     */
    virtual int sizeHintForRow(int row) const;


    /**
     * overrides parent to overlay working working message until model
     * is ready.
     *
     */
    virtual void paintEvent(QPaintEvent *event);


    /**
     * Overrides QWidget to resize columns when applicable.
     *
     */
    virtual void resizeEvent(QResizeEvent *event);

    /*! Catch special keyboard shortcuts.
        Copy, etc.
    */
    virtual void keyPressEvent(QKeyEvent * event);

signals:

    /**
     * Called before the menu is displayed so that you can add items
     * to it before it is shown.
     *
     * @param menu Pointer to the menu about to be shown.
     */
    void displayMenu(QMenu *menu);


    /**
     * Emitted when table's selection changes.
     *
     */
    void selectionChanged(void);

public:

    typedef toTableViewIterator iterator;


    /**
     * Creates a new tableview.
     *
     * @param readable use readable headers
     * @param numberColumn display vertical header
     * @param parent qobject parent
     * @param name sets objectName property
     * @param editable data is editable. you must setModel() with something
     * able to modify data.
     */
    toResultTableView(bool readable,
                      bool numberColumn,
                      QWidget *parent,
                      const char *name = 0,
                      bool editable = false);
    /*! \brief Constructor provided for Qt designer. See setup()
    */
    toResultTableView(QWidget * parent = 0);
    virtual ~toResultTableView(void);

    virtual bool searchNext(const QString & text);
    virtual bool searchPrevious(const QString & text);
    virtual void searchReplace(const QString & text) {};
    virtual void searchReplaceAll(const QString & text) {};
    virtual bool searchCanReplace(bool all)
    {
        return false;
    };

    /**
     * Reimplemented to create query and new model.
     *
     */
    virtual void query(const QString &sql, const toQList ¶m);


    /**
     * Reimplemented to create query and new model.
     *
     */
    void query(const QString &sql)
    {
        toQList p;
        query(sql, p);
    }


    /**
     * Set statistics widget.
     * @param stats Statistics widget.
     */
    void setStatistics(toResultStats *stats)
    {
        Statistics = stats;
    }


    /**
     * override parent to return toResultModel pointer.
     *
     */
    toResultModel* model(void) const
    {
        return Model;
    }

    /**
     * True if query is running.
     *
     */
    bool running(void);


    /**
     * Enable or disable vertical header
     *
     */
    void setNumberColumn(bool b)
    {
        NumberColumn = b;
        verticalHeader()->setVisible(b);
    }


    /**
     * True by default
     *
     */
    virtual bool canHandle(toConnection &)
    {
        return true;
    }


    /**
     * Set a filter to this list.
     *
     * @param filter The new filter or NULL if no filter is to be used.
     */
    void setFilter(toViewFilter *filter);


    /**
     * Sets the model for the view to present.
     *
     * Must be set before query()
     */
    virtual void setModel(toResultModel *model);


    /**
     * Should view read all data.
     *
     */
    virtual void setReadAll(bool b)
    {
        ReadAll = b;
    }


    /**
     * Convenience function to determine if the row indicated by index
     * is selected. Disregards column information.
     *
     */
    virtual bool isRowSelected(QModelIndex index);


    /**
     * Convenience function to return the first selected index. Useful
     * for tableviews that can only have one selected row.
     *
     * @param col returns an index with column col
     */
    virtual QModelIndex selectedIndex(int col = 1);


    /**
     * Returns 1 if number column is displayed or 0 if not.
     *
     */
    virtual int numberColumn(void)
    {
        if (NumberColumn)
            return 1;
        return 0;
    }


    /**
     * Export list as a string.
     *
     */
    QString exportAsText(toExportSettings settings);


    // ---------------------------------------- overrides toEditWidget

    /**
     * Perform a save on this widget.
     *
     * @param askfile Ask filename even if default filename is available.
     */
    virtual bool editSave(bool askfile);


    /**
     * Print this widgets contents.
     *
     */
    virtual void editPrint(void);


    /**
     * Perform copy.
     *
     */
    virtual void editCopy(void);


    /**
     * Select all contents.
     *
     */
    virtual void editSelectAll(void);

public slots:
    /**
     * Resizes all columns based on the size hints of the delegate
     * used to render each item in the columns.
     *
     * overridden from parent
     */
    void resizeColumnsToContents(void);


    /**
     * Connected to horizontal header so we know when a column was
     * resized. Prevents resizeColumnsToContents from further
     * modifying column widths.
     *
     */
    void columnWasResized(int, int, int);


    /**
     * Overrides toResult to keep column sizes and declare a slot.
     *
     */
    virtual void refresh(void);


    /**
     * Stop running query.
     *
     */
    void stop(void)
    {
        if (Model)
            Model->stop();
    }


    /**
     * apply Filter to row visibility
     *
     */
    void applyFilter(void);


signals:

    /**
     * Emitted when the first result is available.
     *
     * @param sql SQL that was run.
     * @param res String describing result.
     * @param error Error has occurred.
     */
    void firstResult(const QString &sql,
                     const toConnection::exception &res,
                     bool error);


    /**
     * Emitted when query is finished.
     *
     */
    void done(void);
};



/**
 * A simple iterator to walk the rows of a QTableView.
 *
 */
class toTableViewIterator
{
    int                         _row;
    QPointer _view;
    QModelIndex                 _index;

    friend class toTableViewIteratorItem;

    // update _index
    void updateIndex(void);

public:

    /**
     * Create an iterator starting at 0 on a view
     *
     */
    toTableViewIterator(toResultTableView *view);


    /**
     * Create a copy of other
     *
     */
    toTableViewIterator(toTableViewIterator &other);


    /**
     * Get a QModelIndex for this row. May be invalid if you've gone
     * too far, use QModelIndex.isValid()
     *
     */
    QModelIndex operator*() const;


    /**
     * Increment by one
     *
     */
    toTableViewIterator& operator++();


    /**
     * Postfix operator
     *
     */
    const toTableViewIterator operator++(int);


    /**
     * Go forward by n
     *
     */
    toTableViewIterator& operator+=(int n);


    /**
     * Decrement by one
     *
     */
    toTableViewIterator& operator--();


    /**
     * Postfix operator
     *
     */
    const toTableViewIterator operator--(int);


    /**
     * Go back by n
     *
     */
    toTableViewIterator& operator-=(int n);


    /**
     * Make a copy of it and return a reference
     *
     */
    toTableViewIterator& operator=(const toTableViewIterator &it);
};


/**
 * Baseclass for filters to apply to the view to hide out rows that
 * you don't want.
 *
 */
class toViewFilter
{

public:
    toViewFilter()
    {
    }

    virtual ~toViewFilter()
    {
    }

    virtual void startingQuery(void)
    {
    }

    /**
     *  This function can inspect the item to be added and decide if
     *  it is valid for adding or not.
     *
     * @param model toResultModel for fetching data.
     * @param row to inspect.
     * @return If false is returned the item isn't added.
     */
    virtual bool check(const toResultModel *model, const int row) = 0;


    /**
     * Create a copy of this filter.
     *
     * @return A newly created copy of this filter.
     */
    virtual toViewFilter *clone(void) = 0;


    /**
     * Export data to a map.
     *
     * @param data A map that can be used to recreate the data of a chart.
     * @param prefix Prefix to add to the map.
     */
    virtual void exportData(std::map &data,
                            const QString &prefix)
    {
    }


    /**
     * Import data
     *
     * @param data Data to read from a map.
     * @param prefix Prefix to read data from.
     */
    virtual void importData(std::map &data,
                            const QString &prefix)
    {
    }
};


#endif
tora-2.1.3/src/tobrowsersequencewidget.cpp0000644000175000017500000000666011351613145020536 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#include "toresultextract.h"
#include "toresultitem.h"
#include "toresulttableview.h"
#include "toresultgrants.h"
#include "utils.h"

#include "tobrowsersequencewidget.h"


static toSQL SQLSequenceInfoPgSQL("toBrowser:SequenceInformation",
                                  "SELECT *, substr(:f1,1) as \"Owner\" FROM :f2",
                                  "Display information about a sequence",
                                  "7.1",
                                  "PostgreSQL");
static toSQL SQLSequenceInfo("toBrowser:SequenceInformation",
                             "SELECT * FROM SYS.ALL_SEQUENCES\n"
                             " WHERE Sequence_Owner = :f1\n"
                             "   AND Sequence_Name = :f2",
                             "");




toBrowserSequenceWidget::toBrowserSequenceWidget(QWidget * parent)
    : toBrowserBaseWidget(parent)
{
    setObjectName("toBrowserSequenceWidget");

    resultInfo = new toResultItem(this);
    resultInfo->setObjectName("resultInfo");
    resultInfo->setSQL(SQLSequenceInfo);

    grantsView = new toResultGrants(this);
    grantsView->setObjectName("grantsView");

    extractView = new toResultExtract(this);
    extractView->setObjectName("extractView");

    changeConnection();
}

void toBrowserSequenceWidget::changeConnection()
{
    toBrowserBaseWidget::changeConnection();

    toConnection & c = toCurrentConnection(this);

    if (toIsOracle(c) || toIsPostgreSQL(c))
        addTab(resultInfo, "Info");
    else
        resultInfo->hide();

    if (toIsOracle(c))
    {
        addTab(grantsView, "&Grants");
        addTab(extractView, "Script");
    }
    else
    {
        grantsView->hide();
        extractView->hide();
    }
}
tora-2.1.3/src/tolistviewformatter.cpp0000644000175000017500000000524011270353625017705 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2008 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#include "tolistviewformatter.h"

toListViewFormatter::toListViewFormatter()
{
}

toListViewFormatter::~toListViewFormatter()
{
}

void toListViewFormatter::endLine(QString &output)
{
#ifdef Q_OS_WIN32
    output += "\r\n";
#else
    output += "\n";
#endif
}

QVector toListViewFormatter::selectedRows(
    const QModelIndexList &selected)
{

    QVector ret;
    for (QList::const_iterator it = selected.begin();
            it != selected.end();
            it++)
    {
		int r = (*it).row();
		if (!ret.contains(r))
			ret.append(r);
    }

    return ret;
}

QVector toListViewFormatter::selectedColumns(
	const QModelIndexList &selected)
{
	QVector ret;
        ret.append(0); // for later check for row headers
	for (QList::const_iterator it = selected.begin();
            it != selected.end();
            it++)
    {
		int c = (*it).column();
		if (!ret.contains(c))
			ret.append(c);
    }

    return ret;
}
tora-2.1.3/src/toconnectionimport.cpp0000644000175000017500000001022111270353625017500 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#include 

#include "migratetool/sqldeveloper.h"
#include "migratetool/squirrelsql.h"
#include "migratetool/tora3.h"
#include "toconnectionimport.h"
#include "toconnectionmodel.h"



toConnectionImport::toConnectionImport(QWidget * parent)
    : QDialog(parent)
{
    setupUi(this);
    m_tool = toConnectionImport::None;
    toolComboBox->addItem("None", toConnectionImport::None);
    toolComboBox->addItem("TOra (1.3.x)",
                           toConnectionImport::Tora3);
    toolComboBox->addItem("Oracle SQL Developer (1.5)",
                           toConnectionImport::OracleSQLDeveloper);
    toolComboBox->addItem("SquirrelSQL (2.6.x)",
                           toConnectionImport::SquirrelSQL);

    toolComboBox_changed(0);

    availableModel = new toConnectionModel();

    tableView->setModel(availableModel);

    connect(toolComboBox, SIGNAL(currentIndexChanged(int)),
             this, SLOT(toolComboBox_changed(int)));
    connect(runButton, SIGNAL(clicked()),
             this, SLOT(refreshAvailable()));
}

void toConnectionImport::toolComboBox_changed(int ix)
{
    m_tool = (ToolUsed)toolComboBox->itemData(ix).toInt();
    if (m_tool == toConnectionImport::OracleSQLDeveloper)
        notificationLabel->setText(tr("Import connections from an XML file.\n"
                                      "No passwords or options are imported."));
    else if (m_tool == toConnectionImport::SquirrelSQL)
        notificationLabel->setText(tr("Import connections from tool config directory."));
    else if (m_tool == toConnectionImport::Tora3)
        notificationLabel->setText(tr("Import connections from ~/.torarc"));
    else
        notificationLabel->setText(tr("Select one of tools available.\n"
                                      "Connections could require manual changes after importing."));
}

void toConnectionImport::refreshAvailable()
{
    if (m_tool == toConnectionImport::None)
    {
        QMessageBox::information(this, "TOra",
                                 "Please select an import tool first.");
        return;
    }
    if (m_tool == toConnectionImport::OracleSQLDeveloper)
        availableModel->setupData(MigrateTool::sqlDeveloper(this));
    else if (m_tool == toConnectionImport::SquirrelSQL)
        availableModel->setupData(MigrateTool::squirrelSql(this));
    else if (m_tool == toConnectionImport::Tora3)
        availableModel->setupData(MigrateTool::tora3(this));

    tableView->resizeColumnsToContents();
}
tora-2.1.3/src/tooraclesettingui.ui0000644000175000017500000001641011270353625017150 0ustar  michaelmichael
  
  
  
  toOracleSettingUI
  
    
      
        0
        0
        361
        287
      
    
    
      Form1
    
    
      
        11
      
      
        6
      
      
        
          
            &Default date format
          
          
            DefaultDate
          
          
            The default dateformat to use when querying the database.
          
          
            false
          
        
      
      
        
          
            &Checkpoint name
          
          
            CheckPoint
          
          
            The name of the checkpoint used when needed to rollback work.
          
          
            false
          
        
      
      
        
      
      
        
      
      
        
          
            &Max long and LOB data length
          
          
            ExplainPlan
          
          
            Max length to read from LOB or LONG data fields. LONG:s can not be specified unlimited but will be defaulted to 33000 if unlimited.
          
          
            false
          
        
      
      
        
          
            Unlimited
          
          
            true
          
        
      
      
        
          
            false
          
        
      
      
        
          
            
              20
              20
            
          
          
            QSizePolicy::Expanding
          
          
            Qt::Vertical
          
        
      
      
        
          
            
              20
              20
            
          
          
            QSizePolicy::Expanding
          
          
            Qt::Horizontal
          
        
      
      
        
          
            false
          
          
            
              0
              0
            
          
          
            Create Table
          
        
      
      
        
          
            &V$SQL_PLAN
          
          
            Use V$SQL_PLAN when possible.
          
        
      
      
        
          
            &Explain plan table
          
          
            ExplainPlan
          
          
            Name of the table to put explain plan output in.
          
          
            false
          
        
      
      
        
      
      
        
          
            &Keep plans
          
          
            Keep records for the plan explanations in the plan table.
          
        
      
      
        
          
            1
          
        
      
      
        
          
            Maximum cursors to keep open
          
          
            OpenCursors
          
          
            false
          
        
      
    
  
  
    CheckPoint
    DefaultDate
    OpenCursors
    MaxLong
    Unlimited
    ExplainPlan
    KeepPlans
    CreatePlanTable
    VsqlPlans
  
  
    
      CreatePlanTable
      clicked()
      toOracleSettingUI
      createPlanTable()
    
    
      Unlimited
      toggled(bool)
      MaxLong
      setDisabled(bool)
    
  

tora-2.1.3/src/tocurrent.h0000644000175000017500000000657711270353625015260 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#ifndef TOCURRENT_H
#define TOCURRENT_H

#include "config.h"
#include "totool.h"
#include "tosql.h"
#include "tobackground.h"

#include "toresultview.h"

class QTabWidget;
class toNoBlockQuery;
class toResultParam;
class toResultStats;
class toResultView;
class toResultTableView;

class toCurrent : public toToolWidget
{
    Q_OBJECT;

    struct update
    {
        bool IsRole;

        toTreeWidgetItem *Parent;
        QString Type;
        QString SQL;
        QString Role;

        update()
        {
            IsRole = false;
            Parent = NULL;
        }

        update(bool isrole,
               toTreeWidgetItem *parent,
               const QString &type,
               const QString &sql,
               const QString &role)
                : IsRole(isrole),
                Parent(parent),
                Type(type),
                SQL(sql),
                Role(role)
        {
        }
    };

    std::list Updates;

    QTabWidget        *Tabs;
    toResultTableView *Version;
    toListView        *Grants;
    toResultTableView *ResourceLimit;
    toResultParam     *Parameters;
    toResultStats     *Statistics;
    toBackground       Poll;

    update CurrentUpdate;
    toNoBlockQuery *Query;

    virtual void addList(bool isrole,
                         toTreeWidgetItem *parent,
                         const QString &typ,
                         const toSQL &sql,
                         const QString &role = QString::null);

protected:
    void closeEvent(QCloseEvent *event);

public:
    toCurrent(QWidget *parent, toConnection &connection);
    virtual ~toCurrent();

public slots:
    void refresh(void);
    void poll(void);
};

#endif
tora-2.1.3/src/toanalyze.cpp0000644000175000017500000005725511270353625015573 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#include "utils.h"

#include "toanalyze.h"
#include "toconf.h"
#include "toconnection.h"
#include "tomain.h"
#include "tomemoeditor.h"
#include "toresultcombo.h"
#include "toresulttableview.h"
#include "toresultplan.h"
#include "tosql.h"
#include "totool.h"
#include "toworksheetstatistic.h"

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 

#include "icons/execute.xpm"
#include "icons/refresh.xpm"
#include "icons/sql.xpm"
#include "icons/stop.xpm"
#include "icons/toanalyze.xpm"

class toAnalyzeTool : public toTool
{
    virtual const char **pictureXPM(void)
    {
        return const_cast(toanalyze_xpm);
    }
public:
    toAnalyzeTool()
            : toTool(320, "Statistics Manager") { }

    virtual void closeWindow(toConnection &connection) {};

    virtual const char *menuItem()
    {
        return "Statistics Manager";
    }
    virtual QWidget *toolWindow(QWidget *parent, toConnection &connection)
    {
        return new toAnalyze(parent, connection);
    }
    virtual bool canHandle(toConnection &conn)
    {
        return toIsOracle(conn) || toIsMySQL(conn) || toIsPostgreSQL(conn);
    }
};


static toAnalyzeTool AnalyzeTool;

static toSQL SQLListTablesMySQL("toAnalyze:ListTables",
                                "show table status",
                                "Get table statistics, first three columns and binds must be same",
                                "4.1",
                                "MySQL");
static toSQL SQLListTables("toAnalyze:ListTables",
                           "select 'TABLE' \"Type\",\n"
                           "       owner,\n"
                           "       table_name,\n"
                           "       num_rows,\n"
                           "       blocks,\n"
                           "       empty_blocks,\n"
                           "       avg_space \"Free space/block\",\n"
                           "       chain_cnt \"Chained rows\",\n"
                           "       avg_row_len \"Average row length\",\n"
                           "       sample_size,\n"
                           "       last_analyzed\n"
                           "  from sys.all_all_tables\n"
                           " where iot_name is null\n"
                           "   and temporary != 'Y' and secondary = 'N'",
                           "",
                           "0800");
static toSQL SQLListTables7("toAnalyze:ListTables",
                            "select 'TABLE' \"Type\",\n"
                            "       owner,\n"
                            "       table_name,\n"
                            "       num_rows,\n"
                            "       blocks,\n"
                            "       empty_blocks,\n"
                            "       avg_space \"Free space/block\",\n"
                            "       chain_cnt \"Chained rows\",\n"
                            "       avg_row_len \"Average row length\",\n"
                            "       sample_size,\n"
                            "       last_analyzed\n"
                            "  from sys.all_tables\n"
                            " where temporary != 'Y' and secondary = 'N'",
                            "",
                            "0703");

static toSQL SQLListTablesPg(
    "toAnalyze:ListTables",
    "SELECT 'TABLE' AS \"Type\",\n"
    "       st.schemaname,\n"
    "       st.relname AS \"table\",\n"
    "       c.relfrozenxid AS \"Frozen XID\",\n"
    "       c.relpages AS \"8KB Pages\",\n"
    "       c.reltuples AS \"Tuples\",\n"
    "       st.last_analyze AS \"Last Analyze\",\n"
    "       st.last_autoanalyze AS \"Last Auto Analyze\",\n"
    "       st.last_vacuum AS \"Last Vacuum\",\n"
    "       st.last_autovacuum AS \"Last Auto Vacuum\"\n"
    "  FROM pg_stat_all_tables st,\n"
    "       pg_class c\n"
    " WHERE st.relid = c.OID\n"
    " ORDER BY 1,\n"
    "          2",
    "",
    "7.2",
    "PostgreSQL");

static toSQL SQLListIndex("toAnalyze:ListIndex",
                          "SELECT 'INDEX' \"Type\",\n"
                          "       Owner,\n"
                          "       Index_Name,\n"
                          "       Num_rows,\n"
                          "       Distinct_Keys,\n"
                          "       Leaf_Blocks,\n"
                          "       Avg_Leaf_Blocks_Per_Key,\n"
                          "       Avg_Data_Blocks_Per_Key,\n"
                          "       Clustering_Factor,\n"
                          "       Sample_Size,\n"
                          "       Last_Analyzed\n"
                          "  FROM SYS.ALL_INDEXES\n"
                          " WHERE 1 = 1",
                          "List the available indexes, first three column and binds must be same");

static toSQL SQLListIndexPg(
    "toAnalyze:ListIndex",
    "SELECT 'INDEX' AS \"Type\",\n"
    "       st.schemaname,\n"
    "       st.relname AS \"table\",\n"
    "       st.indexrelname,\n"
    "       c.relpages AS \"8KB Pages\",\n"
    "       c.reltuples AS \"Tuples\",\n"
    "       st.idx_scan,\n"
    "       st.idx_tup_read,\n"
    "       st.idx_tup_fetch\n"
    "  FROM pg_stat_all_indexes st,\n"
    "       pg_class c\n"
    " WHERE st.indexrelid = c.OID\n"
    " ORDER BY 1,\n"
    "          2",
    "",
    "7.2",
    "PostgreSQL");

static toSQL SQLListPlans("toAnalyze:ListPlans",
                          "SELECT DISTINCT\n"
                          "       statement_id \"Statement\",\n"
                          "       MAX(timestamp) \"Timestamp\",\n"
                          "       MAX(remarks) \"Remarks\" FROM %1\n"
                          " GROUP BY statement_id",
                          "Display available saved statements. Must have same first "
                          "column and %1");


toAnalyze::toAnalyze(QWidget *main, toConnection &connection)
        : toToolWidget(AnalyzeTool, "analyze.html", main, connection, "toAnalyze")
{

    Tabs = new QTabWidget(this);
    layout()->addWidget(Tabs);

    QWidget *container = new QWidget(Tabs);
    QVBoxLayout *box = new QVBoxLayout;
    Tabs->addTab(container, tr("Analyze"));

    QToolBar *toolbar = toAllocBar(container, tr("Statistics Manager"));
    box->addWidget(toolbar);

    toolbar->addAction(QIcon(QPixmap(const_cast(refresh_xpm))),
                       tr("Refresh"),
                       this,
                       SLOT(refresh()));

    toolbar->addSeparator();

    Analyzed = NULL;
    if (toIsOracle(connection))
    {
        Analyzed = new QComboBox(toolbar);
        Analyzed->addItem(tr("All"));
        Analyzed->addItem(tr("Not analyzed"));
        Analyzed->addItem(tr("Analyzed"));
        toolbar->addWidget(Analyzed);
    }

    Schema = new toResultCombo(toolbar, TO_TOOLBAR_WIDGET_NAME);
    Schema->setSelected(tr("All"));
    Schema->additionalItem(tr("All"));
    toolbar->addWidget(Schema);
    try
    {
        Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST));
    }
    TOCATCH;

    if (toIsOracle(connection))
    {
        Type = new QComboBox(toolbar);
        Type->addItem(tr("Tables"));
        Type->addItem(tr("Indexes"));
        toolbar->addWidget(Type);

        toolbar->addSeparator();

        Operation = new QComboBox(toolbar);
        Operation->addItem(tr("Compute statistics"));
        Operation->addItem(tr("Estimate statistics"));
        Operation->addItem(tr("Delete statistics"));
        Operation->addItem(tr("Validate references"));
        toolbar->addWidget(Operation);
        connect(Operation,
                SIGNAL(activated(int)),
                this,
                SLOT(changeOperation(int)));

        toolbar->addWidget(
            new QLabel(" " + tr("for") + " ", toolbar));

        For = new QComboBox(toolbar);
        For->addItem(tr("All"));
        For->addItem(tr("Table"));
        For->addItem(tr("Indexed columns"));
        For->addItem(tr("Local indexes"));
        toolbar->addWidget(For);

        toolbar->addSeparator();

        toolbar->addWidget(new QLabel(tr("Sample") + " ",
                                      toolbar));

        Sample = new QSpinBox(toolbar);
        Sample->setMinimum(1);
        Sample->setMaximum(100);
        Sample->setValue(100);
        Sample->setSuffix(" " + tr("%"));
        Sample->setEnabled(false);
        toolbar->addWidget(Sample);
    }
    else if (toIsPostgreSQL(connection))
    {
        Type = new QComboBox(toolbar);
        Type->addItem(tr("Tables"));
        Type->addItem(tr("Indexes"));
        toolbar->addWidget(Type);

        toolbar->addSeparator();

        Operation = new QComboBox(toolbar);
        Operation->addItem(tr("Vacuum table"));
        Operation->addItem(tr("Analyze table"));
        toolbar->addWidget(Operation);
        connect(Operation,
                SIGNAL(activated(int)),
                this,
                SLOT(changeOperation(int)));

        Sample = NULL;
        For    = NULL;
    }
    else
    {
        Operation = new QComboBox(toolbar);
        Operation->addItem(tr("Analyze table"));
        Operation->addItem(tr("Optimize table"));
        toolbar->addWidget(Operation);
        connect(Operation,
                SIGNAL(activated(int)),
                this,
                SLOT(changeOperation(int)));

        Type   = NULL;
        Sample = NULL;
        For    = NULL;
    }

    toolbar->addSeparator();

    toolbar->addWidget(new QLabel(tr("Parallel") + " ",
                                  toolbar));
    Parallel = new QSpinBox(toolbar);
    Parallel->setMinimum(1);
    Parallel->setMaximum(100);
    toolbar->addWidget(Parallel);

    toolbar->addSeparator();

    toolbar->addAction(QIcon(QPixmap(const_cast(execute_xpm))),
                       tr("Start analyzing"),
                       this,
                       SLOT(execute()));

    toolbar->addAction(QIcon(QPixmap(const_cast(sql_xpm))),
                       tr("Display SQL"),
                       this,
                       SLOT(displaySQL()));

    Current = new QLabel(toolbar);
    Current->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
    toolbar->addWidget(Current);
    Current->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding,
                                       QSizePolicy::Minimum));

    Stop = new QToolButton(this);
    Stop->setIcon(QIcon(stop_xpm));
    Stop->setText(tr("Stop current run"));
    Stop->setEnabled(false);
    connect(Stop, SIGNAL(triggered(QAction *)), this, SLOT(stop()));
    toolbar->addWidget(Stop);

    Statistics = new toResultTableView(true, false, container);
    Statistics->setSelectionMode(QAbstractItemView::ExtendedSelection);
    Statistics->setReadAll(true);
    box->addWidget(Statistics);
    connect(Statistics, SIGNAL(done()), this, SLOT(fillOwner()));
    connect(Statistics,
            SIGNAL(displayMenu(QMenu *)),
            this,
            SLOT(displayMenu(QMenu *)));

    if (Analyzed)
        connect(Analyzed, SIGNAL(activated(int)), this, SLOT(refresh()));
    connect(Schema, SIGNAL(activated(int)), this, SLOT(refresh()));
    if (Type)
        connect(Type, SIGNAL(activated(int)), this, SLOT(refresh()));

    connect(&Poll, SIGNAL(timeout()), this, SLOT(poll()));

    box->setSpacing(0);
    box->setContentsMargins(0, 0, 0, 0);
    container->setLayout(box);

    if (toIsOracle(connection))
    {
        container = new QWidget(Tabs);
        box = new QVBoxLayout;
        toolbar = toAllocBar(container, tr("Explain plans"));
        box->addWidget(toolbar);

        Tabs->addTab(container, tr("Explain plans"));
        QSplitter *splitter = new QSplitter(Qt::Horizontal, container);
        box->addWidget(splitter);
        Plans = new toResultTableView(false, false, splitter);
        try
        {
            Plans->query(toSQL::string(SQLListPlans, connection).arg(
                             toConfigurationSingle::Instance().planTable()));
        }
        TOCATCH;

        connect(Plans,
                SIGNAL(selectionChanged()),
                this,
                SLOT(selectPlan()));

        toolbar->addAction(QIcon(QPixmap(const_cast(refresh_xpm))),
                           tr("Refresh"),
                           Plans,
                           SLOT(refresh()));

        QLabel *s = new QLabel(toolbar);
        s->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
        s->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding,
                                     QSizePolicy::Minimum));
        toolbar->addWidget(s);

        CurrentPlan = new toResultPlan(splitter);

        Worksheet = new toWorksheetStatistic(Tabs);
        Tabs->addTab(Worksheet, tr("Worksheet statistics"));

        box->setSpacing(0);
        box->setContentsMargins(0, 0, 0, 0);
        container->setLayout(box);
    }
    else
    {
        Plans       = NULL;
        CurrentPlan = NULL;
        Worksheet   = NULL;
    }

    refresh();
    setFocusProxy(Tabs);
}

void toAnalyze::fillOwner(void)
{
    for (toResultTableView::iterator it(Statistics); (*it).isValid(); it++)
    {
        if ((*it).data(Qt::EditRole).isNull())
        {
            Statistics->model()->setData(
                (*it),
                Schema->selected(),
                Qt::EditRole);
        }
    }
}

void toAnalyze::selectPlan(void)
{
    QModelIndex index = Plans->selectedIndex();
    if (index.isValid())
        CurrentPlan->query("SAVED:" + index.data(Qt::EditRole).toString());
}

toWorksheetStatistic *toAnalyze::worksheet(void)
{
    Tabs->setCurrentIndex(Tabs->indexOf(Worksheet));
    return Worksheet;
}

void toAnalyze::changeOperation(int op)
{
    if (Sample)
        Sample->setEnabled(op == 1);
    if (For)
        For->setEnabled(op == 0 || op == 1);
}

void toAnalyze::refresh(void)
{
    try
    {
        Statistics->setSQL(QString::null);
        toQList par;
        QString sql;
        if (!Type || Type->currentIndex() == 0)
            sql = toSQL::string(SQLListTables, connection());
        else
            sql = toSQL::string(SQLListIndex, connection());
        if (Schema->selected() != tr("All"))
        {
            par.insert(par.end(), Schema->selected());
            if (toIsOracle(connection()))
                sql += "\n   AND owner = :own";
            else if (toIsPostgreSQL(connection()))
            {
                sql =
                    QString(" SELECT * FROM ( %1 ) sub\n"
                            "  WHERE schemaname = :own").arg(sql);
            }
            else
                sql += " FROM :f1";
        }
        else if (toIsMySQL(connection()))
            sql += " FROM :f1";
        if (Analyzed)
        {
            switch (Analyzed->currentIndex())
            {
            default:
                break;
            case 1:
                sql += QString::fromLatin1("\n  AND Last_Analyzed IS NULL");
                break;
            case 2:
                sql += QString::fromLatin1("\n  AND Last_Analyzed IS NOT NULL");
                break;
            }
        }

        Statistics->query(sql, (const toQList &)par);
    }
    TOCATCH;
}

void toAnalyze::poll(void)
{
    try
    {
        int running = 0;
        for (std::list::iterator i = Running.begin();i != Running.end();i++)
        {
            bool eof = false;

            try
            {
                if ((*i)->poll())
                {
                    int cols = (*i)->describe().size();
                    for (int j = 0;j < cols;j++)
                        (*i)->readValueNull();  // Eat the output if any.
                }

                try
                {
                    eof = (*i)->eof();
                }
                catch (const QString &)
                {
                    eof = true;
                }
            }
            catch (const QString &err)
            {
                toStatusMessage(err);
                eof = true;
            }
            if (eof)
            {
                QString sql = toShift(Pending);
                if (!sql.isEmpty())
                {
                    delete(*i);
                    toQList par;
                    (*i) = new toNoBlockQuery(connection(), sql, par);
                    running++;
                }
            }
            else
                running++;
        }
        if (!running)
        {
            Poll.stop();
            refresh();
            stop();
        }
        else
            Current->setText(tr("Running %1 Pending %2").arg(running).arg(Pending.size()));
    }
    TOCATCH;
}

std::list toAnalyze::getSQL(void)
{
    std::list ret;
    for (toResultTableView::iterator it(Statistics); (*it).isValid(); it++)
    {
        if (Statistics->isRowSelected((*it)))
        {
            if (toIsOracle(connection()))
            {
                QString sql = QString::fromLatin1("ANALYZE %3 %1.%2 ");
                QString forc;
                if ((*it).data(Qt::EditRole) == QString::fromLatin1("TABLE"))
                {
                    switch (For->currentIndex())
                    {
                    case 0:
                        forc = QString::null;
                        break;
                    case 1:
                        forc = QString::fromLatin1(" FOR TABLE");
                        break;
                    case 2:
                        forc = QString::fromLatin1(" FOR ALL INDEXED COLUMNS");
                        break;
                    case 3:
                        forc = QString::fromLatin1(" FOR ALL LOCAL INDEXES");
                        break;
                    }
                }

                switch (Operation->currentIndex())
                {
                case 0:
                    sql += QString::fromLatin1("COMPUTE STATISTICS");
                    sql += forc;
                    break;
                case 1:
                    sql += QString::fromLatin1("ESTIMATE STATISTICS");
                    sql += forc;
                    sql += QString::fromLatin1(" SAMPLE %1 PERCENT").arg(Sample->value());
                    break;
                case 2:
                    sql += QString::fromLatin1("DELETE STATISTICS");
                    break;
                case 3:
                    sql += QString::fromLatin1("VALIDATE REF UPDATE");
                    break;
                }
                toPush(ret,
                       sql.arg(Statistics->model()->data((*it).row(), 2).toString())
                       .arg(Statistics->model()->data((*it).row(), 3).toString())
                       .arg(Statistics->model()->data((*it).row(), 1).toString()));

            }
            else if (toIsPostgreSQL(connection()))
            {
                QString sql;

                switch (Operation->currentIndex())
                {
                case 0:
                    sql += QString("VACUUM FULL VERBOSE %1.%2");
                    break;
                case 1:
                    sql += QString("ANALYZE VERBOSE %1.%2");
                    break;
                default:
                    toStatusMessage(tr("Internal Error"));
                    continue;
                }

                QString table = Statistics->model()->data((*it).row(), 3).toString();
                QString schema = Statistics->model()->data((*it).row(), 2).toString();
                toPush(ret, sql.arg(schema).arg(table));
            }
            else
            {
                QString sql;
                switch (Operation->currentIndex())
                {
                case 0:
                    sql = QString::fromLatin1("ANALYZE TABLE %1.%2 ");
                    break;
                case 1:
                    sql = QString::fromLatin1("OPTIMIZE TABLE %1.%2 ");
                    break;
                }
                QString owner = Statistics->model()->data((*it).row(), 2).toString();
                if (toUnnull(owner).isNull())
                    owner = Schema->selected();
                toPush(ret,
                       sql.arg(owner).arg(
                           Statistics->model()->data((*it).row(), 1).toString()));
            }
        }
    }
    return ret;
}

void toAnalyze::displaySQL(void)
{
    QString txt;
    std::list sql = getSQL();
    for (std::list::iterator i = sql.begin();i != sql.end();i++)
        txt += (*i) + ";\n";
    new toMemoEditor(this, txt, -1, -1, true);
}

void toAnalyze::execute(void)
{
    stop();

    std::list sql = getSQL();
    for (std::list::iterator i = sql.begin();i != sql.end();i++)
        toPush(Pending, *i);

    try
    {
        toQList par;
        for (int i = 0; i < Parallel->value(); i++)
        {
            QString sql = toShift(Pending);
            if (!sql.isEmpty())
                toPush(Running, new toNoBlockQuery(connection(), sql, par));
        }
        Poll.start(100);
        Stop->setEnabled(true);
        poll();
    }
    TOCATCH;
}

void toAnalyze::stop(void)
{
    try
    {
        for_each(Running.begin(), Running.end(), DeleteObject());
        Running.clear();
        Pending.clear();
        Stop->setEnabled(false);
        Current->setText(QString::null);
        if (!connection().needCommit())
        {
            try
            {
                connection().rollback();
            }
            catch (...) { }
        }
    }
    TOCATCH;
}

void toAnalyze::createTool(void)
{
    AnalyzeTool.createWindow();
}

void toAnalyze::displayMenu(QMenu *menu)
{
    QAction *before = menu->actions()[0];

    menu->insertSeparator(before);

    QAction *action;

    action = new QAction(QIcon(QPixmap(const_cast(sql_xpm))),
                         tr("Display SQL"),
                         menu);
    connect(action, SIGNAL(triggered()), this, SLOT(displaySQL()));
    menu->insertAction(before, action);

    action = new QAction(QIcon(QPixmap(const_cast(execute_xpm))),
                         tr("Execute"),
                         menu);
    connect(action, SIGNAL(triggered()), this, SLOT(execute()));
    menu->insertAction(before, action);

    menu->insertSeparator(before);
}
tora-2.1.3/src/toeditwidget.h0000644000175000017500000002122611270353625015713 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#ifndef TOEDITWIDGET_H
#define TOEDITWIDGET_H

#include "config.h"

#include 

#include 

class toSearchReplace;

/** This is an abstract base class for any widget (Not included in object) that wants to
 * access copy, cut, paste, open, save commands of the user interface.
 */
class toEditWidget
{
public:
    /** Class used to extent how to enable/disable parts of the interface as
     * focus changes.
     */
    class editHandler
    {
    public:
        /** Constructor.
         */
        editHandler();
        /** Destructor.
         */
        virtual ~editHandler();
        /** Called when a new widget receives the focus.
         */
        virtual void receivedFocus(toEditWidget *widget) = 0;
        /** Called when a widget loses the focus.
         */
        virtual void lostFocus(toEditWidget *widget) = 0;
    };
private:
    bool Open;
    bool Save;
    bool Print;
    bool Undo;
    bool Redo;
    bool Cut;
    bool Copy;
    bool Paste;
    bool Search;
    bool SelectAll;
    bool ReadAll;
    void setMainSettings(void);

    static std::list *Handlers;
public:
    /** Empty constructor, all functions are disabled.
     */
    toEditWidget();
    /** Specified constructor, all functions are specified in the constructor.
     */
    toEditWidget(bool open, bool save, bool print,
                 bool undo, bool redo,
                 bool cut, bool copy, bool paste,
                 bool search,
                 bool selectAll, bool readAll);
    virtual ~toEditWidget();

    /** Specify new enabled functions.
     */
    void setEdit(bool open, bool save, bool print,
                 bool undo, bool redo,
                 bool cut, bool copy, bool paste,
                 bool search,
                 bool selectAll, bool readAll);

    /** Perform an open on this widget. Default NOP.
     * @param file The file to open, if not specified prompt for file.
     */
    virtual bool editOpen(QString file = QString::null);
    /** Perform a save on this widget. Default NOP.
     * @param askfile Ask filename even if default filename is available.
     */
    virtual bool editSave(bool askfile);
    /** Print this widgets contents. Default NOP.
     */
    virtual void editPrint(void)
    { }
    /** Perform undo. Default NOP.
     */
    virtual void editUndo(void)
    { }
    /** Perform redo. Default NOP.
     */
    virtual void editRedo(void)
    { }
    /** Perform cut. Default NOP.
     */
    virtual void editCut(void)
    { }
    /** Perform copy. Default NOP.
     */
    virtual void editCopy(void)
    { }
    /** Perform paste. Default NOP.
     */
    virtual void editPaste(void)
    { }
    /** Select all contents. Default NOP.
     */
    virtual void editSelectAll(void)
    { }
    /** Read all available data. Default NOP.
     */
    virtual void editReadAll(void)
    { }

    /** Set if open is enabled.
     */
    void openEnabled(bool val)
    {
        Open = val;
        setMainSettings();
    }
    /** Set if save is enabled.
     */
    void saveEnabled(bool val)
    {
        Save = val;
        setMainSettings();
    }
    /** Set if print is enabled.
     */
    void printEnabled(bool val)
    {
        Print = val;
        setMainSettings();
    }
    /** Set if undo is enabled.
     */
    void undoEnabled(bool val)
    {
        Undo = val;
        setMainSettings();
    }
    /** Set if redo is enabled.
     */
    void redoEnabled(bool val)
    {
        Redo = val;
        setMainSettings();
    }
    /** Set if cut is enabled.
     */
    void cutEnabled(bool val)
    {
        Cut = val;
        setMainSettings();
    }
    /** Set if copy is enabled.
     */
    void copyEnabled(bool val)
    {
        Copy = val;
        setMainSettings();
    }
    /** Set if paste is enabled.
     */
    void pasteEnabled(bool val)
    {
        Paste = val;
        setMainSettings();
    }
    /** Set if search is enabled.
     */
    void searchEnabled(bool val)
    {
        Search = val;
        setMainSettings();
    }
    /** Set if select all is enabled.
     */
    void selectAllEnabled(bool val)
    {
        SelectAll = val;
        setMainSettings();
    }
    /** Set if read all is enabled.
     */
    void readAllEnabled(bool val)
    {
        ReadAll = val;
        setMainSettings();
    }

    /** Check if open is enabled.
     */
    bool openEnabled(void)
    {
        return Open;
    }
    /** Check if save is enabled.
     */
    bool saveEnabled(void)
    {
        return Save;
    }
    /** Check if print is enabled.
     */
    bool printEnabled(void)
    {
        return Print;
    }
    /** Check if undo is enabled.
     */
    bool undoEnabled(void)
    {
        return Undo;
    }
    /** Check if redo is enabled.
     */
    bool redoEnabled(void)
    {
        return Redo;
    }
    /** Check if cut is enabled.
     */
    bool cutEnabled(void)
    {
        return Cut;
    }
    /** Check if copy is enabled.
     */
    bool copyEnabled(void)
    {
        return Copy;
    }
    /** Check if paste is enabled.
     */
    bool pasteEnabled(void)
    {
        return Paste;
    }
    /** Check if search is enabled.
     */
    bool searchEnabled(void)
    {
        return Search;
    }
    /** Check if select all is enabled.
     */
    bool selectAllEnabled(void)
    {
        return SelectAll;
    }
    /** Check if read all is enabled.
     */
    bool readAllEnabled(void)
    {
        return ReadAll;
    }

    /*! \brief Search for next occrence of text
    This is pure virtual as it has to be implemented in all
    separated children of toEditWidget.
    */
    virtual bool searchNext(const QString & text) = 0;
    /*! \brief Search for previous occrence of text
    This is pure virtual as it has to be implemented in all
    separated children of toEditWidget.
    */
    virtual bool searchPrevious(const QString & text) = 0;
    /*! \brief Replace current entry with new data
    This is pure virtual as it has to be implemented in all
    separated children of toEditWidget.
    */
    virtual void searchReplace(const QString &newData) = 0;
    /*! \brief Replace all entries with new data
    This is pure virtual as it has to be implemented in all
    separated children of toEditWidget.
    */
    virtual void searchReplaceAll(const QString &newData) = 0;

    /*! \brief Check if data can be modified by search
     * @param all If true can replace all, otherwise can replace right now.
     */
    virtual bool searchCanReplace(bool all) = 0;

    /** Call this when this widget has received the focus. Must be called by the implementor.
     */
    virtual void receivedFocus(void);
    /** Called when this widget has lost the focus. Don't forget to call parent when reimplemented.
     */
    virtual void lostFocus(void);

    /** Add a hook to be called every time focus changes.
     */
    static void addHandler(editHandler *handler);
    /** Removed a hook from being called every time focus changes.
     */
    static void delHandler(editHandler *handler);
};

#endif
tora-2.1.3/src/toresultmodel.h0000644000175000017500000002675411402451646016133 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#ifndef TORESULTMODEL_H
#define TORESULTMODEL_H

#include "config.h"
#include "tosql.h"
#include "toresult.h"
#include "toconnection.h"
#include "tobackground.h"

#include 
#include 
#include 
#include 
#include 

class toQValue;
class toEventQuery;


class toResultModel : public QAbstractTableModel
{
    Q_OBJECT;

public:
    struct HeaderDesc
    {
        QString           name;        /* column name */
        QString           datatype;    /* data type from queryDescribe */
        bool              nullAllowed; /* data can be null */
        Qt::Alignment     align;       /* alignment */
    };

    typedef QList Row;
    typedef QList RowList;
    typedef QList HeaderList;

private:
    QPointer Query;

    RowList Rows;
    HeaderList Headers;

    // max rows to read until
    int MaxNumber;

    // how much to read at a time
    int MaxRead;

    int CurrentRow;

    // If column names are to be made more readable.
    bool ReadableColumns;

    // when to emit firstResult
    bool First;

    // return editable flag
    bool Editable;

    // headers read already?
    bool HeadersRead;

    // should read all data
    bool ReadAll;

    // helpers for sort implementation
    RowList mergesort(RowList&, int, Qt::SortOrder);
    RowList merge(RowList&, RowList&, int, Qt::SortOrder);


private slots:

    // destroys query, stops timer, good things.
    // emits done()
    void cleanup(void);

    void queryError(const toConnection::exception &);

public:
    toResultModel(toEventQuery *query,
                  QObject *parent = 0,
                  bool edit = false,
                  bool read = false);

    ~toResultModel();


    // ------------------------------ overrides ItemModel parent

    /**
     * Returns the number of rows under the given parent. When the
     * parent is valid it means that rowCount is returning the
     * number of children of parent.
     *
     * Tip: When implementing a table based model, rowCount()
     * should return 0 when the parent is valid.
     */
    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;


    /**
     * Returns the data stored under the given role for the item
     * referred to by the index.
     */
    virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;


    /**
     * Sets the role data for the item at index to value. Returns true
     * if successful; otherwise returns false.
     *
     * The dataChanged() signal should be emitted if the data was
     * successfully set.
     *
     * The base class implementation returns false. This function and
     * data() must be reimplemented for editable models. Note that the
     * dataChanged() signal must be emitted explicitly when
     * reimplementing this function.
     *
     */
    virtual bool setData(const QModelIndex &,
                         const QVariant &,
                         int role = Qt::EditRole);

    /**
     * Convience function to return Qt::EditRole data for row and
     * column.
     *
     */
    virtual QVariant data(int row, int column) const;


    /**
     * Convience function to return Qt::EditRole data for the row and
     * column.
     *
     */
    virtual QVariant data(int row, QString column) const;


    /**
     * Returns the data for the given role and section in the header
     * with the specified orientation.
     *
     */
    QVariant headerData(int section,
                        Qt::Orientation orientation,
                        int role = Qt::DisplayRole) const;
                        
    /*! Update the header.name attribute for the horizontal header.
    This method changes data wchich are taken from DB (but it doesn't
    change it in the DB) so use it only if you know what are you doing.
    It's allowed for Horizontal orientation and DisplayRole only. Else
    it returns always false and it does not do anything.
    */
    bool setHeaderData(int section,
                       Qt::Orientation orientation,
                       const QVariant & value,
                       int role = Qt::EditRole);

    /**
     * Returns the number of columns for the children of the given
     * parent. When the parent is valid it means that rowCount is
     * returning the number of children of parent.
     */
    virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;


    /**
     * Returns true if there is more data available for parent,
     * otherwise false.
     *
     */
    virtual bool canFetchMore(const QModelIndex &parent = QModelIndex()) const;


    /**
     * Fetches any available data for the items with the parent
     * specified by the parent index.
     *
     */
    virtual void fetchMore(const QModelIndex &parent);


    /**
     * Returns the item flags for the given index.
     *
     */
    virtual Qt::ItemFlags flags(const QModelIndex &index) const;


    /**
     * Set the column alignment for given column
     *
     */
    virtual void setAlignment(int col, Qt::AlignmentFlag fl);


    /**
     * Sorts the model by column in the given order.
     *
     */
    virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);


    /**
     * override parent to make public
     *
     */
    QModelIndex createIndex(int row, int column, void *ptr = 0) const
    {
        return QAbstractTableModel::createIndex(row, column, ptr);
    }


    /**
     * stop running query
     *
     */
    void stop(void)
    {
        cleanup();
    }


    /**
     * Return the headers used for this query
     *
     */
    const HeaderList& headers(void) const
    {
        return Headers;
    }


    /**
     * Adds a row internally. Emits rowAdded on success.
     *
     * This isn't part of any parent api. Qt provides insertRow which
     * needs a row number and index. This is provided to simply append
     * a new row.
     *
     * @param ind if valid, the row to duplicate
     * @return added row
     */
    int addRow(QModelIndex ind = QModelIndex());


    /**
     * Delete a row interally. Emits rowDeleted on success.
     *
     * This is not an overriden method.
     */
    void deleteRow(QModelIndex);


    /**
     * Returns a list of MIME types that can be used to describe a
     * list of model indexes.
     *
     */
    virtual QStringList mimeTypes() const;


    /**
     * Returns an object that contains serialized items of data
     * corresponding to the list of indexes specified. The formats
     * used to describe the encoded data is obtained from the
     * mimeTypes() function.
     *
     * If the list of indexes is empty, or there are no supported MIME
     * types, 0 is returned rather than a serialized empty list.
     *
     */
    virtual QMimeData* mimeData(const QModelIndexList &indexes) const;


    /**
     * Handles the data supplied by a drag and drop operation that
     * ended with the given action. Returns true if the data and
     * action can be handled by the model; otherwise returns false.
     *
     * Although the specified row, column and parent indicate the
     * location of an item in the model where the operation ended, it
     * is the responsibility of the view to provide a suitable
     * location for where the data should be inserted.
     *
     * For instance, a drop action on an item in a QTreeView can
     * result in new items either being inserted as children of the
     * item specified by row, column, and parent, or as siblings of
     * the item.
     * 
     * When row and column are -1 it means that it is up to the model
     * to decide where to place the data. This can occur in a tree
     * when data is dropped on a parent. Models will usually append
     * the data to the parent in this case.
     * 
     * Returns true if the dropping was successful otherwise false.
     *
     */
    virtual bool dropMimeData(const QMimeData *data,
                              Qt::DropAction action,
                              int row,
                              int column,
                              const QModelIndex &parent);


    /**
     * Returns the drop actions supported by this model.
     *
     * The default implementation returns Qt::CopyAction. Reimplement
     * this function if you wish to support additional actions. Note
     * that you must also reimplement the dropMimeData() function to
     * handle the additional operations.
     *
     */
    virtual Qt::DropActions supportedDropActions() const;

signals:

    /**
     * Emitted when query is finished.
     *
     */
    void done(void);


    /**
     * Emitted when the first result is available.
     *
     * @param res String describing result.
     * @param error Error has occurred.
     */
    void firstResult(const toConnection::exception &res,
                     bool error);


    /**
     * Emitted when column data in the view changes.
     *
     */
    void columnChanged(const QModelIndex &index,
                       const toQValue &newValue,
                       const toResultModel::Row &row);


    /**
     * Emitted when a row is added to the model. The numbercolumn
     * passed which will not change over the life of the model.
     *
     * Note this is not emitted when query data is added.
     *
     */
    void rowAdded(const toResultModel::Row &row);


    /**
     * Emitted when a row is deleted from the model.
     *
     */
    void rowDeleted(const toResultModel::Row &row);


public slots:
    /**
     * Load all data into model until end of query
     *
     */
    void readAll(void);


    /**
     * Overloaded method. Called when query has data available. 
     *
     */
    void fetchMore(void);


protected slots:

    /**
     * reads ands sets up Rows and Columns
     *
     */
    void readData(void);

    /**
     * reads and sets up Headers
     *
     */
    void readHeaders(void);
};


#endif
tora-2.1.3/src/toresultdatasingle.cpp0000644000175000017500000001430411270353625017466 0ustar  michaelmichael
/* BEGIN_COMMON_COPYRIGHT_HEADER
 *
 * TOra - An Oracle Toolkit for DBA's and developers
 * 
 * Shared/mixed copyright is held throughout files in this product
 * 
 * Portions Copyright (C) 2000-2001 Underscore AB
 * Portions Copyright (C) 2003-2005 Quest Software, Inc.
 * Portions Copyright (C) 2004-2009 Numerous Other Contributors
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;  only version 2 of
 * the License is valid for this program.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 *      As a special exception, you have permission to link this program
 *      with the Oracle Client libraries and distribute executables, as long
 *      as you follow the requirements of the GNU GPL in regard to all of the
 *      software in the executable aside from Oracle client libraries.
 * 
 *      Specifically you are not permitted to link this program with the
 *      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
 *      And you are not permitted to distribute binaries compiled against
 *      these libraries. 
 * 
 *      You may link this product with any GPL'd Qt library.
 * 
 * All trademarks belong to their respective owners.
 *
 * END_COMMON_COPYRIGHT_HEADER */

#include "config.h"
#include "utils.h"
#include "toconf.h"
#include "toconfiguration.h"
#include "toresultdatasingle.h"
#include "toparamget.h"
#include "tomodeleditor.h"

#include 
#include 
#include 
#include 
#include 
#include 
#include 


toResultDataSingle::toResultDataSingle(QWidget *parent)
        : QWidget(parent)
{

    Row       = -1;
    Container = NULL;
    Model     = NULL;

    setBackgroundRole(QPalette::Window);

    // fscking qscrollarea won't resize this is added
    QHBoxLayout *h = new QHBoxLayout;
    h->setContentsMargins(0, 0, 0, 0);
    h->setSpacing(0);
    setLayout(h);

    setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
}


void toResultDataSingle::changeSource(toResultModel *model, int _row)
{
    delete Container;
    Container = new QScrollArea(this);
    layout()->addWidget(Container);

    Model = model;

    QWidget *ext = new QWidget(Container);
    Container->setWidget(ext);
    Container->setWidgetResizable(true);

    QGridLayout *grid = new QGridLayout;
    ext->setLayout(grid);

    Value.clear();
    Null.clear();

    const toResultModel::HeaderList Headers = Model->headers();

    int row = 1;
    int col = 0;

    for (; row < Headers.size(); row++, col = 0)
    {
        QLabel *name = new QLabel(Headers[row].name, this);
        grid->addWidget(name, row, col++);

        QLineEdit *edit = new QLineEdit(this);
        edit->setObjectName(QString::number(row));
        edit->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding,
                                        QSizePolicy::Minimum));
        grid->addWidget(edit, row, col);
        // edit widget should get the most space
        grid->setColumnStretch(col++, 1);

        QCheckBox *box = new QCheckBox(("NULL"), this);
        connect(box, SIGNAL(toggled(bool)), edit, SLOT(setDisabled(bool)));
        grid->addWidget(box, row, col++);

        toParamGetButton *btn = new toParamGetButton(row, this);
        btn->setText(tr("Edit"));
        btn->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed));
        connect(btn, SIGNAL(clicked(int)), this, SLOT(showMemo(int)));
        connect(box, SIGNAL(toggled(bool)), btn, SLOT(setDisabled(bool)));
        connect(box, SIGNAL(toggled(bool)), this, SLOT(saveRow()));
        connect(edit, SIGNAL(editingFinished()), this, SLOT(saveRow()));
        grid->addWidget(btn, row, col++);

        Value.append(edit);
        Null.append(box);
    }

    // add widget at bottom of grid so it can resize
    grid->addWidget(new QLabel(this), row, 0);
    grid->setRowStretch(row, 1);

    changeRow(Row);

    connect(Model,
            SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)),
            this,
            SLOT(dataChanged(const QModelIndex &, const QModelIndex &)));
}


void toResultDataSingle::dataChanged(const QModelIndex &topLeft,
                                     const QModelIndex &bottomRight)
{
    if(topLeft.row() >= Row && bottomRight.row() <= Row)
        changeRow(Row);         // update
}


void toResultDataSingle::changeRow(int row)
{
    bool any = false;

    QList::iterator chk = Null.begin();
    QList::iterator val = Value.begin();

    for (int i = 1;
         i < Model->columnCount() && chk != Null.end() && val != Value.end();
         i++, chk++, val++)
    {
        QVariant str = Model->data(row, i);
        if (!str.isNull())
            any = true;
        (*chk)->setChecked(str.isNull());
        (*val)->setText(str.toString());
    }

    if (!any)
    {
        for (chk = Null.begin(); chk != Null.end(); chk++)
            (*chk)->setChecked(false);
    }

    Row = row;
}


void toResultDataSingle::saveRow()
{
    if (Row < 0)
        return;

    QList::iterator val = Value.begin();
    for (int i = 1; i < Model->columnCount() && val != Value.end(); i++, val++)
    {
        QString v = QString::null;
        if ((*val)->isEnabled())
            v = (*val)->text();

        QModelIndex index = Model->createIndex(Row, i);
        QVariant orig = Model->data(Row, i).toString();

        if (!((v.isNull() && orig.isNull()) || v == orig))
            Model->setData(index, v);
    }
}


void toResultDataSingle::showMemo(int col)
{
    QModelIndex index = Model->index(Row, col);
    if(index.isValid()) {
        toModelEditor *memo = new toModelEditor(
            this,
            Model,
            index,
            false,
            true);

        memo->exec();
    }
}
tora-2.1.3/src/tobrowsertableui.ui0000644000175000017500000002570711310001305016765 0ustar  michaelmichael

 toBrowserTableUI
 
  
   
    0
    0
    651
    561
   
  
  
   Table columns
  
  
   
    
     
      0
     
     
      
       &General
      
      
       
        
         
          
           
            &Schema
           
           
            false
           
           
            Name
           
          
         
         
          
         
         
          
           
            &Name
           
           
            false
           
           
            Name
           
          
         
         
          
         
        
       
       
        
         
          
           
            Custom column declarations
           
          
         
         
          
           
            Qt::Horizontal
           
           
            QSizePolicy::Expanding
           
           
            
             340
             21
            
           
          
         
         
          
           
            Qt::TabFocus
           
           
            
           
           
            
             :/icons/add.xpm:/icons/add.xpm
           
          
         
         
          
           
            Qt::TabFocus
           
           
            
           
           
            
             :/icons/minus.xpm:/icons/minus.xpm
           
          
         
        
       
       
        
         
          Qt::StrongFocus
         
        
       
      
     
     
      
       &Extra
      
      
       
        
         
          C&omment
         
         
          false
         
         
          Comment
         
        
       
       
        
       
       
        
         
          &Tablespace
         
         
          false
         
         
          Tablespace
         
        
       
       
        
       
       
        
         
          &Extra declarations
         
         
          false
         
         
          ExtraDeclarations
         
        
       
       
        
         
          Qt::WheelFocus
         
        
       
       
        
         
          &Storage declarations
         
         
          false
         
         
          StorageDeclarations
         
        
       
       
        
         
          Qt::WheelFocus
         
        
       
       
        
         
          &Parallel declarations
         
         
          false
         
         
          ParallelDeclarations
         
        
       
       
        
         
          Qt::WheelFocus
         
        
       
      
     
    
   
   
    
     
      
       
        Qt::StrongFocus
       
       
        Display SQL to create this constraint
       
       
        
       
       
        
         :/icons/sql.xpm:/icons/sql.xpm
       
      
     
     
      
       
        Qt::Horizontal
       
       
        QSizePolicy::Expanding
       
       
        
         20
         20
        
       
      
     
     
      
       
        true
       
       
        QDialogButtonBox::Cancel|QDialogButtonBox::Ok
       
      
     
    
   
  
 
 
 
  
   toResultCombo
   QWidget
   
toresultcombo.h
toHighlightedText QWidget
tohighlightedtext.h
Tabs Comment Tablespace ExtraDeclarations ShowSql toresultcombo.h tohighlightedtext.h tohighlightedtext.h tohighlightedtext.h tobrowsertable.h ShowSql clicked() toBrowserTableUI displaySQL() 25 551 20 20 AddColumn clicked() toBrowserTableUI addColumn() 594 80 325 280 RemoveColumn clicked() toBrowserTableUI removeColumn() 624 80 325 280 CustomDeclarations clicked(bool) toBrowserTableUI toggleCustom(bool) 111 80 325 280 ButtonBox accepted() toBrowserTableUI accept() 494 543 325 280 ButtonBox rejected() toBrowserTableUI reject() 494 543 325 280 displaySQL() addColumn() removeColumn() toggleCustom(bool)
tora-2.1.3/src/toextract.cpp0000644000175000017500000007561711332067047015603 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "toextract.h" #include #include #include #include #include #include #ifdef Q_OS_WIN32 #include #endif std::map *toExtract::Extractors; void toExtract::extractor::registerExtract(const QString &db, const QString &oper, const QString &type) { toExtract::allocExtract(); QString name = toExtract::extractorName(db, oper, type); if ((*toExtract::Extractors).find(name) != (*toExtract::Extractors).end()) fprintf(stderr, "Extractor %s multiply defined\n", name.toAscii().constData()); (*toExtract::Extractors)[name] = this; } void toExtract::extractor::unregisterExtract(const QString &db, const QString &oper, const QString &type) { toExtract::allocExtract(); QString name = toExtract::extractorName(db, oper, type); std::map::iterator i = (*toExtract::Extractors).find(name); if (i == (*toExtract::Extractors).end()) fprintf(stderr, "Extractor %s not defined on unregistering\n", name.toAscii().constData()); else (*toExtract::Extractors).erase(i); } void toExtract::extractor::initialize(toExtract &) const {} void toExtract::extractor::create(toExtract &, QTextStream &, const QString &, const QString &, const QString &, const QString &) const {} void toExtract::extractor::describe(toExtract &, std::list &, const QString &, const QString &, const QString &, const QString &) const {} void toExtract::extractor::migrate(toExtract &, QTextStream &, const QString &, std::list &, std::list &) const {} void toExtract::extractor::drop(toExtract &, QTextStream &, const QString &, const QString &, const QString &, const QString &) const {} std::list toExtract::extractor::datatypes() const { std::list ret; return ret; } toExtract::extractor::extractor() {} toExtract::extractor::~extractor() {} void toExtract::allocExtract(void) { if (!Extractors) Extractors = new std::map; } QString toExtract::extractorName(const QString &db, const QString &oper, const QString &type) { QString ret(db); if (!oper.isEmpty()) ret += ":" + oper; if (!type.isEmpty()) ret += ":" + type; return ret; } toExtract::extractor *toExtract::findExtractor(toConnection &conn, const QString &oper, const QString &type) { allocExtract(); QString name = extractorName(conn.provider(), oper, type); std::map::iterator i = (*Extractors).find(name); if (i != (*Extractors).end()) return (*i).second; return NULL; } void toExtract::initialize(void) { if (!Initialized) { Initialized = true; extractor *ext = findExtractor(QString::null, QString::null); if (ext) ext->initialize(*this); } } toExtract::toExtract(toConnection &conn, QWidget *parent) : Connection(conn), Parent(parent) { Heading = true; Prompt = true; Constraints = true; Indexes = true; Grants = true; Storage = true; Parallel = true; Contents = true; Comments = true; Partition = true; Replace = false; Schema = "1"; Initialized = false; BlockSize = 8192; } void toExtract::setState(const QString &name, const QVariant &val) { Context[name] = val; } QVariant toExtract::state(const QString &name) { return Context[name]; } void toExtract::srcDst2DropCreate(std::list &source, std::list &destination, std::list &drop, std::list &create) { drop.clear(); create.clear(); std::list::iterator i = source.begin(); std::list::iterator j = destination.begin(); while (i != source.end() && j != destination.end()) { if (*i != *j) { if (*i < *j) { drop.insert(drop.end(), *i); i++; } else { create.insert(create.end(), *j); j++; } } else { i++; j++; } } while (i != source.end()) { drop.insert(drop.end(), *i); i++; } while (j != destination.end()) { create.insert(create.end(), *j); j++; } } void toExtract::parseObject(const QString &object, QString &owner, QString &name) { try { unsigned int search = 0; if (object[0] == '\"') { int pos = object.indexOf('\"', 1); if (pos < 0) throw 1; owner = object.left(pos); owner = owner.right(owner.length() - 1); search = pos + 1; } else { int pos = object.indexOf('.'); if (pos < 0) pos = object.length(); owner = object.left(pos); search = pos; } if (search >= (unsigned int) object.length()) { name = owner; owner = Connection.user(); return; } else if (object.at(search) != '.') throw 2; search++; if (object.at(search) == '\"') { int pos = object.indexOf('\"', search + 1); if (pos < 0) throw 3; name = object.left(pos); name = owner.right(pos - search - 1); search = pos + 1; if (search < (unsigned int) object.length()) throw 4; } else { name = object.right(object.length() - search); } } catch (int i) { throw qApp->translate("toExtract", "Failed to extract owner and name from (%1), internal error %2").arg(object).arg(i); } } bool toExtract::canHandle(toConnection &conn) { return bool(findExtractor(conn, QString::null, QString::null)); } std::list toExtract::datatypes() { std::list ret; try { extractor *ext = findExtractor(connection(), QString::null, QString::null); if (ext) ret = ext->datatypes(); ret.sort(); } TOCATCH return ret; } void toExtract::create(QTextStream &ret, std::list &objects) { ret << generateHeading(qApp->translate("toExtract", "CREATE"), objects); QProgressDialog *progress = NULL; if (Parent) { progress = new QProgressDialog( qApp->translate("toExtract", "Creating create script"), qApp->translate("toExtract", "Cancel"), 0, objects.size(), Parent); progress->setWindowTitle(qApp->translate("toExtract", "Creating script")); } initialize(); try { toBusy busy; int num = 1; for (std::list::iterator i = objects.begin();i != objects.end();i++) { if (progress) { progress->setValue(num); progress->setLabelText(*i); qApp->processEvents(); if (progress->wasCanceled()) throw qApp->translate("toExtract", "Creating script was canceled"); } num++; QString type = *i; QString owner; QString name; int pos = type.indexOf(QString::fromLatin1(":")); if (pos < 0) throw qApp->translate("toExtract", "Internal error, missing : in object description"); parseObject(type.right(type.length() - pos - 1), owner, name); type.truncate(pos); QString utype = type.toUpper(); QString schema = intSchema(owner, false); try { try { extractor *ext = findExtractor(QString::fromLatin1("CREATE"), utype); if (ext) ext->create(*this, ret, utype, schema, owner, name); else throw qApp->translate("toExtract", "Invalid type %1 to create").arg(type); } catch (const QString &exc) { rethrow(qApp->translate("toExtract", "Create"), *i, exc); } } catch (const QString &exc) { toStatusMessage(exc); } } } catch (...) { delete progress; throw; } delete progress; } std::list toExtract::describe(std::list &objects) { std::list ret; QProgressDialog *progress = NULL; if (Parent) { progress = new QProgressDialog( qApp->translate("toExtract", "Creating description"), qApp->translate("toExtract", "Cancel"), 0, objects.size(), Parent); progress->setWindowTitle(qApp->translate("toExtract", "Creating description")); } initialize(); try { toBusy busy; int num = 1; for (std::list::iterator i = objects.begin();i != objects.end();i++) { if (progress) { progress->setValue(num); progress->setLabelText(*i); qApp->processEvents(); if (progress->wasCanceled()) throw qApp->translate("toExtract", "Describe was canceled"); } num++; QString type = *i; QString owner; QString name; int pos = type.indexOf(QString::fromLatin1(":")); if (pos < 0) throw qApp->translate("toExtract", "Internal error, missing : in object description"); parseObject(type.right(type.length() - pos - 1), owner, name); type.truncate(pos); QString utype = type.toUpper(); QString schema = intSchema(owner, true); std::list cur; try { try { extractor *ext = findExtractor(QString::fromLatin1("DESCRIBE"), utype); if (ext) ext->describe(*this, cur, utype, schema, owner, name); else { throw qApp->translate("toExtract", "Invalid type %1 to describe").arg(type); } } catch (const QString &exc) { rethrow(qApp->translate("toExtract", "Describe"), *i, exc); } cur.sort(); ret.merge(cur); } catch (const QString &exc) { toStatusMessage(exc); } } } catch (...) { delete progress; throw; } delete progress; return ret; } void toExtract::drop(QTextStream &ret, std::list &objects) { ret << generateHeading(qApp->translate("toExtract", "DROP"), objects); QProgressDialog *progress = NULL; if (Parent) { progress = new QProgressDialog( qApp->translate("toExtract", "Creating drop script"), qApp->translate("toExtract", "Cancel"), 0, objects.size(), Parent); progress->setWindowTitle(qApp->translate("toExtract", "Creating drop script")); } initialize(); try { toBusy busy; int num = 1; for (std::list::iterator i = objects.begin();i != objects.end();i++) { if (progress) { progress->setValue(num); progress->setLabelText(*i); qApp->processEvents(); if (progress->wasCanceled()) throw qApp->translate("toExtract", "Creating drop script was canceled"); num++; } QString type = *i; QString owner; QString name; int pos = type.indexOf(QString::fromLatin1(":")); if (pos < 0) throw qApp->translate("toExtract", "Internal error, missing : in object description"); parseObject(type.right(type.length() - pos - 1), owner, name); type.truncate(pos); QString utype = type.toUpper(); QString schema = intSchema(owner, false); try { try { extractor *ext = findExtractor(QString::fromLatin1("DROP"), utype); if (ext) ext->drop(*this, ret, utype, schema, owner, name); else { throw qApp->translate("toExtract", "Invalid type %1 to drop"); ; } } catch (const QString &exc) { rethrow(qApp->translate("toExtract", "Drop script"), *i, exc); } } catch (const QString &exc) { toStatusMessage(exc); } } } catch (...) { delete progress; throw; } delete progress; } std::map > toExtract::migrateGroup(std::list &grpLst) { std::map > ret; for (std::list::iterator i = grpLst.begin();i != grpLst.end();i++) { std::list ctx = splitDescribe(*i); if (ctx.size() < 3) toStatusMessage(qApp->translate("toExtract", "Invalid describe context (<3 parts) \"%1\")").arg(*i)); else { QString t = toShift(ctx); t += QString::fromLatin1("\01"); t += toShift(ctx); t += QString::fromLatin1("\01"); t += toShift(ctx); toPush(ret[t], *i); } } return ret; } /* This function can take properties of more than one object as parameters. They are later separated by the call to migrateGroup. Migrate function for specific object is called separately for each identified object. */ void toExtract::migrate(QTextStream &ret, std::list &drpLst, std::list &crtLst) { std::list t; t.insert(t.end(), qApp->translate("toExtract", "Object list not available in migration")); ret << generateHeading(qApp->translate("toExtract", "MIGRATE"), t); QProgressDialog *progress = NULL; std::map > objDrp; std::map > objCrt; objDrp = migrateGroup(drpLst); objCrt = migrateGroup(crtLst); for (std::map >::iterator j = objCrt.begin();j != objCrt.end();j++) objDrp[(*j).first]; // Make sure all objects in the createlist also exists in the droplist if (Parent) { progress = new QProgressDialog( qApp->translate("toExtract", "Creating migration script"), qApp->translate("toExtract", "Cancel"), 0, objDrp.size()); progress->setWindowTitle(qApp->translate("toExtract", "Creating migration script")); } initialize(); try { toBusy busy; int num = 1; for (std::map >::iterator i = objDrp.begin();i != objDrp.end();i++) { QString t = (*i).first; if (progress) { progress->setValue(num); progress->setLabelText(t); qApp->processEvents(); if (progress->wasCanceled()) throw qApp->translate("toExtract", "Creating drop script was canceled"); } num++; std::list &crt = objCrt[t]; std::list &drp = objDrp[t]; crt.sort(); drp.sort(); std::list ctx = splitDescribe(t); QString schema = toShift(ctx); QString utype = toShift(ctx).toUpper(); QString name = toShift(ctx); try { try { extractor *ext = findExtractor(QString::fromLatin1("MIGRATE"), utype); if (ext) ext->migrate(*this, ret, utype, drp, crt); else { throw qApp->translate("toExtract", "Invalid type %1 to migrate").arg(utype); } } catch (const QString &exc) { rethrow(qApp->translate("toExtract", "Migration script"), (*i).first, exc); } } catch (const QString &exc) { toStatusMessage(exc); } } } catch (...) { delete progress; throw; } delete progress; } QString toExtract::generateHeading(const QString &action, std::list &lst) { if (!Heading) return QString::null; char host[1024]; gethostname(host, 1024); QString db = Connection.host(); if (db.length() && db != QString::fromLatin1("*")) db += QString::fromLatin1(":"); else db = QString::null; db += Connection.database(); QString str = qApp->translate("toExtract", "-- This DDL was reverse engineered by\n" "-- " TOAPPNAME ", Version %1\n" "--\n" "-- at: %2\n" "-- from: %3, an %4 %5 database\n" "--\n" "-- on: %6\n" "--\n"). arg(QString::fromLatin1(TOVERSION)). arg(QString::fromLatin1(host)). arg(db). arg(QString(Connection.provider())). arg(QString(Connection.version())). arg(QDateTime::currentDateTime().toString()); if (action == QString::fromLatin1("FREE SPACE")) str += qApp->translate("toExtract", "-- Generating free space report for:\n--"); else { str += qApp->translate("toExtract", "-- Generating %1 statement for:\n").arg(action); } for (std::list::iterator i = lst.begin();i != lst.end();i++) { if (!(*i).startsWith(QString::fromLatin1("TABLE REFERENCES"))) { str += QString::fromLatin1("-- "); str += (*i); str += QString::fromLatin1("\n"); } } str += QString::fromLatin1("\n"); return str; } void toExtract::rethrow(const QString &what, const QString &object, const QString &exc) { throw qApp->translate("toExtract", "Error in toExtract\n" "Operation: %1\n" "Object: %2\n" "Error: %3"). arg(what). arg(object). arg(exc); } void toExtract::setSizes(void) { Initial.clear(); Next.clear(); Limit.clear(); if (Resize == QString::fromLatin1("1")) { for (int i = 1;i < 10000;i *= 10) { QString str; if (i < 1000) { str = QString::number(40 * i + 1); str += QString::fromLatin1(" K"); } else str = QString::fromLatin1("UNLIMITED"); toPush(Initial, str); str = QString::number(5 * BlockSize * i); str += QString::fromLatin1(" K"); toPush(Next, str); toPush(Limit, str); } } else if (!Resize.isEmpty()) { QStringList lst = Resize.split(":"); if (lst.count() % 3 != 0) throw qApp->translate("toExtract", "Malformed resize string (Should contain multiple of 3 number of ':')"); for (int i = 0;i < lst.count();i += 3) { if (i + 3 < lst.count()) toPush(Limit, lst[i]); else toPush(Limit, QString::fromLatin1("UNLIMITED")); toPush(Initial, lst[i + 1]); toPush(Next, lst[i + 2]); } } } QString toExtract::intSchema(const QString &owner, bool desc) { if (owner.toUpper() == "PUBLIC") return QString("PUBLIC"); if (Schema == "1") { QString ret = Connection.quote(owner); if (!desc) ret += "."; return ret; } else if (Schema.isEmpty()) return QString::null; QString ret = Connection.quote(Schema); if (!desc) ret += "."; return ret; } void toExtract::initialNext(const QString &blocks, QString &initial, QString &next) { std::list::iterator iinit = Initial.begin(); std::list::iterator inext = Next.begin(); std::list::iterator ilimit = Limit.begin(); while (ilimit != Initial.end()) { if (*ilimit == QString::fromLatin1("UNLIMITED") || (*ilimit).toFloat() > blocks.toFloat()) { initial = *iinit; next = *inext; return ; } iinit++; inext++; ilimit++; } } void toExtract::addDescription(std::list &ret, const std::list &ctx, const QString &arg1, const QString &arg2, const QString &arg3, const QString &arg4, const QString &arg5, const QString &arg6, const QString &arg7, const QString &arg8, const QString &arg9) { int numArgs; if (!arg9.isNull()) numArgs = 9; else if (!arg8.isNull()) numArgs = 8; else if (!arg7.isNull()) numArgs = 7; else if (!arg6.isNull()) numArgs = 6; else if (!arg5.isNull()) numArgs = 5; else if (!arg4.isNull()) numArgs = 4; else if (!arg3.isNull()) numArgs = 3; else if (!arg2.isNull()) numArgs = 2; else if (!arg1.isNull()) numArgs = 1; else numArgs = 0; std::list args = ctx; if (numArgs > 0) args.insert(args.end(), arg1); if (numArgs > 1) args.insert(args.end(), arg2); if (numArgs > 2) args.insert(args.end(), arg3); if (numArgs > 3) args.insert(args.end(), arg4); if (numArgs > 4) args.insert(args.end(), arg5); if (numArgs > 5) args.insert(args.end(), arg6); if (numArgs > 6) args.insert(args.end(), arg7); if (numArgs > 7) args.insert(args.end(), arg8); if (numArgs > 8) args.insert(args.end(), arg9); QString str; bool first = true; for (std::list::iterator i = args.begin();i != args.end();i++) { if (first) first = false; else str += QString::fromLatin1("\01"); if (!(*i).isEmpty()) str += *i; } ret.insert(ret.end(), str); } std::list toExtract::splitDescribe(const QString &str) { QStringList ctx = str.split("\01"); std::list ret; for (int i = 0;i < ctx.count();i++) ret.insert(ret.end(), ctx[i]); return ret; } QString toExtract::partDescribe(const QString &str, int level) { QStringList ctx = str.split("\01"); if (ctx.count() <= level) return QString::null; return ctx[level]; } QString toExtract::contextDescribe(const QString &str, int level) { int pos = -1; do { level--; pos = str.indexOf("\01", pos + 1); } while (pos >= 0 && level > 0); if (pos < 0) pos = str.length(); if (level == 0) return str.mid(0, pos); return QString::null; } QString toExtract::createFromParse(std::list::iterator start, std::list::iterator end) { QString ret; toSQLParse::statement newstat(toSQLParse::statement::Statement); while (start != end) { newstat.subTokens().insert(newstat.subTokens().end(), *start); start++; } return toSQLParse::indentStatement(newstat, connection()).trimmed(); } std::list toExtract::parseColumnDescription(std::list::const_iterator begin, std::list::const_iterator end, int level) { std::list ret; while (begin != end) { std::list row = toExtract::splitDescribe(*begin); for (int i = 0;i < level;i++) toShift(row); if (toShift(row) == "COLUMN") { QString name = toShift(row); columnInfo *current = NULL; for (std::list::iterator j = ret.begin();j != ret.end();j++) { if ((*j).Name == name) { current = &(*j); break; } } if (current == NULL) { ret.insert(ret.end(), columnInfo(name)); current = &(*(ret.rbegin())); current->bNotNull = false; // by default columns are not "not null" } QString extra = toShift(row); if (extra == "ORDER") current->Order = toShift(row).toInt(); else if (extra == "COMMENT") current->Comment = toShift(row); else if (extra == "EXTRA") { extra = toShift(row); if (extra == "NOT NULL") current->bNotNull = true; else printf("Error! Found unknown extra data for column %s -> %s\n", name.toAscii().constData(), extra.toAscii().constData()); } else if (!extra.isEmpty()) { QString data = toShift(row); if (data.isEmpty()) { // TS 2009-11-01 This can be called twice on the same column, for say VARCHAR2 and for EXTRA // with data variable being empty both times. // if (!current->Definition.isEmpty()) // throw qApp->translate("toExtract", "More than one definition for column %1").arg(name); int iDefaultPos = // position of string "DEFAULT" in QString extra.indexOf("DEFAULT", 0, Qt::CaseInsensitive); if (iDefaultPos > -1) { // in the following code default value is calculated from a string like // VARCHAR2(7) DEFAULT 'something' or VARCHAR2(7) DEFAULT null. // iDefaultPos will point to start of "DEFAULT" // therefore we have to also remove word "DEFAULT" as well as space and // opening quote (unless default is null). Ending quote is removed in // folowing truncate statement if default is not null (without quotes). if (extra[8 + iDefaultPos] == '\'') { current->DefaultValue = extra.right(extra.size() - iDefaultPos - 9); current->DefaultValue.truncate((int)current->DefaultValue.size() - 1); } else { // "DEFAULT null" is represented as empty string in "edit table" dialog current->DefaultValue = ""; } extra.truncate(iDefaultPos-1); } current->Definition = extra; } else { if (current->Data.find(extra) != current->Data.end()) throw qApp->translate("toExtract", "Same kind of definition existing more than once for column %1").arg(name); current->Data[extra] = data; } } } begin++; } ret.sort(); return ret; } tora-2.1.3/src/topushbutton.cpp0000644000175000017500000000776111270353625016340 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "topushbutton.h" #include #include #include /** * much inspiration from libqxt * * http://www.libqxt.org/page/ */ static const int VERTICAL_MASK = 0x02; toPushButton::toPushButton(QWidget *parent) : QPushButton(parent), rotate(NoRotation) { } toPushButton::toPushButton(const QString &text, QWidget *parent) : QPushButton(text, parent), rotate(NoRotation) { } toPushButton::toPushButton(const QIcon &icon, const QString &text, QWidget *parent) : QPushButton(icon, text, parent), rotate(NoRotation) { } void toPushButton::setRotation(Rotation rotation) { if(rotate != rotation) { rotate = rotation; switch (rotation) { case NoRotation: case UpsideDown: setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); break; case Clockwise: case CounterClockwise: setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); break; default: // nothing to do break; } updateGeometry(); update(); } } QSize toPushButton::sizeHint() const { QSize size = QPushButton::sizeHint(); if(rotate & VERTICAL_MASK) size.transpose(); return size; } QSize toPushButton::minimumSizeHint() const { return sizeHint(); } QStyleOptionButton toPushButton::getStyleOption() { QStyleOptionButton option; QPushButton::initStyleOption(&option); if(rotate & VERTICAL_MASK) { QSize size = option.rect.size(); size.transpose(); option.rect.setSize(size); } return option; } void toPushButton::paintEvent(QPaintEvent *) { updateGeometry(); QStylePainter painter(this); painter.rotate(rotate); switch(rotate) { case UpsideDown: painter.translate(-width(), -height()); break; case Clockwise: painter.translate(0, -width()); break; case CounterClockwise: painter.translate(-height(), 0); break; default: // nothing to do break; } const QStyleOptionButton option = getStyleOption(); painter.drawControl(QStyle::CE_PushButton, option); } tora-2.1.3/src/tobrowsercodewidget.h0000644000175000017500000000471011270353625017303 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBROWSERCODEWIDGET_H #define TOBROWSERCODEWIDGET_H #include "tobrowserbasewidget.h" class toResultField; class toResultGrants; class toResultDepend; class toResultExtract; /*! \brief Code browser for toBrowser tool. See toBrowserBaseWidget for more info. \author Petr Vanek */ class toBrowserCodeWidget : public toBrowserBaseWidget { Q_OBJECT toResultField *declarationResult; toResultField *bodyResult; toResultGrants *grantsView; toResultDepend *dependsWidget; toResultExtract *extractView; public: toBrowserCodeWidget(QWidget * parent); virtual void changeConnection(); enum { SpecTab = 0, BodyTab = 1 } TabOrder; }; #endif tora-2.1.3/src/tooracletable.cpp0000644000175000017500000003536111335057470016400 0ustar michaelmichael#include #include "tooracleextract.h" // the same function as in tooracleextract.cpp should probably be moved to toextract.cpp? static bool SameContext(const QString &str, const QString &str2) { if (str.startsWith(str2)) { if (str.length() == str2.length()) return true; if (str.length() > str2.length() && str.at(str2.length()) == QChar('\001')) return true; } return false; } // SameContext /*********************************************************************************** Purpose: Create new table TODO: Maybe toExtract::parseColumnDescription should be used to extract columns? ************************************************************************************/ QString toOracleExtract::createTable(std::list &destin) const { QString context; // grouping properties of one entity (for example one column) QString schema_name; QString table_name; QString tablespace; std::list table_columns; QString tmp; QString end_statements; // statements going after create table one (f.e. comments) bool first_column = true; // Part I - go through given rows and extract table information into local structures std::list::iterator i = destin.begin(); while (i != destin.end()) { tmp = toExtract::partDescribe(*i, 3); if (tmp.isNull()) { // part 3 (starting from 0) is null only for table name description if (!table_name.isNull()) { // if table_name already filled in - error in data or this code throw qApp->translate("toExtract", "Too many table definitions"); } schema_name = toExtract::partDescribe(*i, 0); tmp = toExtract::partDescribe(*i, 1); if (tmp != "TABLE") { throw qApp->translate("toExtract", "Unkown string %1").arg(*i); } table_name = toExtract::partDescribe(*i, 2); } else { if (tmp == "COLUMN") { } else if (tmp == "TABLESPACE") { tablespace = toExtract::partDescribe(*i, 4); } else if (tmp == "COMMENT" ) { end_statements += ("comment on table " + table_name + " is '" + toExtract::partDescribe(*i, 4) + "';\n"); } else { throw qApp->translate("toExtract", "Unkown string %1").arg(*i); } } // if context.isNull i++; } // while table_columns = toExtract::parseColumnDescription(destin); // Part II - generate oracle create table statement from data in local structures // table header tmp = "create table " + schema_name + "." + table_name + "("; // table body - loop through columns for (std::list::iterator i = table_columns.begin(); i != table_columns.end(); i++) { if (!first_column) tmp += ","; else first_column = false; tmp += ("\n" + (*i).Name + " " + (*i).Definition); if (!(*i).DefaultValue.isEmpty()) tmp += (" DEFAULT '" + (*i).DefaultValue + "'"); if ((*i).bNotNull) tmp += " NOT NULL"; if (!(*i).Comment.isEmpty()) end_statements += ("comment on column " + table_name + "." + (*i).Name + " is '" + (*i).Comment + "';\n"); } // for loop through columns // table footer tmp += ")"; if (!tablespace.isNull()) tmp += ("\ntablespace " + tablespace + ";"); else tmp += ";"; if (!end_statements.isEmpty()) tmp += ("\n" + end_statements); return tmp; } // createTable /*********************************************************************************** Purpose: Checks if specified property(-ies) is mentioned in given list. This function is used when altering tables. It can for example say that column mentioned in drop list should not actually be dropped because it is being renamed. ************************************************************************************/ bool propertyMentioned(std::list &list, const QString property1, const QString property2) { QStringList split; bool bProp1; std::list::iterator i = list.begin(); while (i != list.end()) { split = (*i).split("\01"); bProp1 = false; for (int j = 0; j < split.count(); j++) { if (!bProp1) { if (split[j] == property1) { bProp1 = true; } } else if (split[j] == property2) { return true; } } i++; } return false; } // columnMentioned /*********************************************************************************** Purpose: Checks if column_type has default value. If it does not - it checks if default value was present before. If so - it returns true - meaning that altering operation should also remove default value ************************************************************************************/ bool defaultValueRemoved(std::list &list, const QString column_name, const QString column_type) { QStringList split; if (column_type.indexOf("default", 0, Qt::CaseInsensitive) > -1) // there is default value specified, nothing else to check return false; std::list::iterator i = list.begin(); while (i != list.end()) { split = (*i).split("\01"); if (split.count() == 6) if ((split[3] == "COLUMN") && (split[4] == column_name) && (split[5].indexOf(" default '", 0, Qt::CaseInsensitive) > -1)) return true; // yes, default value WAS removed i++; } return false; } // defaultValueRemoved /*********************************************************************************** Purpose: Alter existing table ************************************************************************************/ QString toOracleExtract::alterTable(std::list &source, std::list &destin) const { std::list drop; // will hold table properties being removed std::list create; // will hold table properties being added toExtract::srcDst2DropCreate(source, destin, drop, create); QString statements; QString context = ""; QString table_name; QString new_table_name; QString column_name = "", column_type; QString tmp, tmp1; QString end_statements; // statements to be added to the end QString operation; // used to differentiate between add and modify column QString not_null; bool add_modify_column = false; // drop statements for (std::list::iterator i = drop.begin(); i != drop.end(); i++) { #ifdef DEBUG qDebug() << "drop>>" + *i; #endif table_name = toExtract::partDescribe(*i, 2); if (!SameContext(*i, context)) { if (context != "") { if (column_name != "") // check if property is not mentioned in create list, // if it is, this is not dropping of column but rather renaming if (!propertyMentioned(destin, "COLUMN", column_name)) statements += ("alter table " + table_name + " drop column " + column_name + ";\n"); column_name = ""; } context = toExtract::contextDescribe(*i, 5); } std::list row = toExtract::splitDescribe(*i); // read through "context" - skip general tablename information for (int j = 0; j < 3; j++) toShift(row); tmp = toShift(row); if (tmp == "COLUMN") { column_name = toShift(row); tmp = toShift(row); if (tmp.isNull()) { // nothing to be done here, column name was defined } else if (tmp == "ORDER") { // nothing to do with ORDER } else if (tmp == "COMMENT") { if (propertyMentioned(destin, "COLUMN", column_name)) // if column is not dropped... if (!propertyMentioned(destin, column_name, "COMMENT")) // ...and comment is not changed // then drop comment statements += ("comment on column " + table_name + "." + column_name + " is '';\n"); } else if (tmp == "EXTRA") { if (propertyMentioned(destin, "COLUMN", column_name)) // if column does not have to be dropped - just remove "not null" flag statements += ("alter table " + table_name + " modify (" + column_name + " null);\n"); } else { // nothing to do with column type } } else if (tmp == "PARAMETERS") { // TODO Check if anything should/could be done with parameters being dropped tmp = toExtract::partDescribe(*i, 4); #ifdef DEBUG qDebug() << "Dropping parameters is NOT currently supported (" + tmp + ")."; #endif } else if (tmp == "STORAGE") { // TODO Check if anything should/could be done with sotrage attributes being dropped tmp = toExtract::partDescribe(*i, 4); #ifdef DEBUG qDebug() << "Dropping storage attributes is NOT currently supported (" + tmp + ")."; #endif } else { throw qApp->translate("toExtract", "Unkown string %1 for drop statements").arg(tmp); } } if (column_name != "") if (!propertyMentioned(destin, "COLUMN", column_name)) statements += ("alter table " + table_name + " drop column " + column_name + ";\n"); // add/modify/rename statements column_name = ""; context = ""; for (std::list::iterator i = create.begin(); i != create.end(); i++) { #ifdef DEBUG qDebug() << "add>>" + *i; #endif table_name = toExtract::partDescribe(*i, 2); tmp = toExtract::partDescribe(*i, 5); if (!SameContext(*i, context)) { if (context != "") { if (add_modify_column) { if (propertyMentioned(source, "COLUMN", column_name)) { operation = "modify"; if (defaultValueRemoved(drop, column_name, column_type)) column_type += " default null"; // Note! It is not possible to remove default value in Oracle!!! } else { operation = "add"; } statements += ("alter table " + table_name + " " + operation + " (" + column_name + " " + column_type + not_null + ");\n"); add_modify_column = false; } column_name == ""; } context = toExtract::contextDescribe(*i, 5); not_null = ""; } std::list row = toExtract::splitDescribe(*i); // read through "context" - skip general tablename information for (int j = 0; j < 3; j++) toShift(row); tmp = toShift(row); if (tmp == "COLUMN") { column_name = toShift(row); tmp = toShift(row); // value AFTER column name if (tmp.isNull()) { column_name = tmp1; } else if (tmp == "RENAME") { tmp = toShift(row); statements += ("alter table " + table_name + " rename column " + column_name + " to " + tmp + ";\n"); } else if (tmp == "ORDER") { // nothing to do with ORDER } else if (tmp == "COMMENT") { tmp = toShift(row); end_statements += ("comment on column " + table_name + "." + column_name + " is '" + tmp + "';\n"); } else if (tmp == "EXTRA") { not_null = " NOT NULL"; // set "not null" flag on column add_modify_column = true; } else { column_type = tmp; add_modify_column = true; } } else if (tmp == "RENAME") // rename table { new_table_name = toShift(row); } else { throw qApp->translate("toExtract", "Unkown string %1 for alter/add statements.").arg(tmp); } } if (add_modify_column) { if (propertyMentioned(source, "COLUMN", column_name)) { operation = "modify"; if (defaultValueRemoved(drop, column_name, column_type)) column_type += " default null"; // Note! It is not possible to remove default value in Oracle!!! } else { operation = "add"; } statements += ("alter table " + table_name + " " + operation + " (" + column_name + " " + column_type + not_null + ");\n"); } if (!new_table_name.isNull()) statements += ("alter table " + table_name + " rename to " + new_table_name + ";"); return statements + end_statements; } // alterTable /*********************************************************************************** Main function for table creation/altering called from tobrowsertable.cpp It will call either createTable either alterTable ************************************************************************************/ QString toOracleExtract::migrateTable(toExtract &ext, std::list &source, std::list &destin) const { #ifdef DEBUG qDebug() << "toOracleExtract::migrateTable source="; for (std::list::iterator i = source.begin(); i != source.end(); i++) { qDebug() << *i; } qDebug() << "toOracleExtract::migrateTable destin="; for (std::list::iterator i = destin.begin(); i != destin.end(); i++) { qDebug() << *i; } #endif if (source.empty()) { #ifdef DEBUG qDebug() << "New table has to be created."; #endif return createTable(destin); } else { #ifdef DEBUG qDebug() << "Existing table is to be modified."; #endif return alterTable(source, destin); } } // migrateTable tora-2.1.3/src/toscript.cpp0000644000175000017500000007734611342143740015432 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include #include #include #include #include #include // #include "toscript.h" #include "utils.h" #include "toextract.h" #include "tohighlightedtext.h" #include "tomain.h" #include "toreport.h" #include "toresultview.h" #include "totextview.h" #include "toworksheet.h" #include "toscripttreeitem.h" #include "icons/execute.xpm" #include "icons/toscript.xpm" class toScriptTool : public toTool { protected: virtual const char **pictureXPM(void) { return const_cast(toscript_xpm); } public: toScriptTool() : toTool(310, "DB Extraction/Compare/Search") { } virtual const char *menuItem() { return "DB Extraction/Compare/Search"; } virtual const char *toolbarTip() { return "DB or schema extraction, compare and search"; } virtual bool canHandle(toConnection &conn) { try { return toExtract::canHandle(conn) && toIsOracle(conn); //TODO&& !toSQL::string(SQLObjectList, conn).isEmpty(); } catch (...) { return false; } } virtual QWidget *toolWindow(QWidget *main, toConnection &connection) { return new toScript(main, connection); } virtual void closeWindow(toConnection &connection){}; }; static toScriptTool ScriptTool; // aliases for basic tool modes #define MODE_COMPARE 0 #define MODE_EXTRACT 1 #define MODE_SEARCH 2 #define MODE_MIGRATE 3 #define MODE_REPORT 4 toScript::toScript(QWidget *parent, toConnection &connection) : toToolWidget(ScriptTool, "script.html", parent, connection, "toScript") { QToolBar *toolbar = toAllocBar(this, tr("Extraction and Compare")); layout()->addWidget(toolbar); toolbar->addAction(QIcon(QPixmap(const_cast(execute_xpm))), tr("Perform defined extraction"), this, SLOT(execute(void))); toolbar->addWidget(new toSpacer()); ScriptUI = new Ui::toScriptUI(); ScriptUI->setupUi(this); layout()->addWidget(ScriptUI->Tabs); ScriptUI->Source->setTitle(tr("Source")); ScriptUI->Destination->setTitle(tr("Destination")); QHBoxLayout *hbox = new QHBoxLayout; hbox->setSpacing(0); hbox->setContentsMargins(0, 0, 0, 0); QScrollArea *sa = new QScrollArea(ScriptUI->tab); sa->setWidget(ScriptUI->confContainer); sa->setWidgetResizable(true); sa->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); hbox->addWidget(sa); ScriptUI->tab->setLayout(hbox); QSplitter *hsplitter = new QSplitter(Qt::Horizontal, ScriptUI->DifferenceTab); QWidget *box = new QWidget(ScriptUI->ResultTab); QVBoxLayout *vbox = new QVBoxLayout; vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); box->setLayout(vbox); Worksheet = new toWorksheet(box, connection); vbox->addWidget(Worksheet); SearchList = new toListView(box); vbox->addWidget(SearchList); SearchList->addColumn(tr("Search result")); SearchList->setRootIsDecorated(true); SearchList->setSorting(0); SearchList->hide(); Report = new toTextView(box); vbox->addWidget(Report); Report->hide(); QCompleter *FilenameCompleter = new QCompleter(this); FilenameCompleter->setModel(new QDirModel(FilenameCompleter)); ScriptUI->Filename->setCompleter(FilenameCompleter); DropList = new toListView(hsplitter); DropList->addColumn(tr("Dropped")); DropList->setRootIsDecorated(true); DropList->setSorting(0); CreateList = new toListView(hsplitter); CreateList->addColumn(tr("Created")); CreateList->setRootIsDecorated(true); CreateList->setSorting(0); ScriptUI->Tabs->setTabEnabled(ScriptUI->Tabs->indexOf(ScriptUI->ResultTab), false); ScriptUI->Tabs->setTabEnabled(ScriptUI->Tabs->indexOf(ScriptUI->DifferenceTab), false); connect(SearchList, SIGNAL(clicked(toTreeWidgetItem *)), this, SLOT(keepOn(toTreeWidgetItem *))); connect(DropList, SIGNAL(clicked(toTreeWidgetItem *)), this, SLOT(keepOn(toTreeWidgetItem *))); connect(CreateList, SIGNAL(clicked(toTreeWidgetItem *)), this, SLOT(keepOn(toTreeWidgetItem *))); QGridLayout *layout = new QGridLayout(ScriptUI->ResultTab); layout->addWidget(box, 0, 0); layout = new QGridLayout(ScriptUI->DifferenceTab); layout->addWidget(hsplitter, 0, 0); QButtonGroup *group = new QButtonGroup(ScriptUI->ModeGroup); group->addButton(ScriptUI->Compare, MODE_COMPARE); group->addButton(ScriptUI->Extract, MODE_EXTRACT); group->addButton(ScriptUI->Search, MODE_SEARCH); group->addButton(ScriptUI->Migrate, MODE_MIGRATE); group->addButton(ScriptUI->Report, MODE_REPORT); ScriptUI->Initial->setTitle(tr("&Initial")); ScriptUI->Limit->setTitle(tr("&Limit")); ScriptUI->Next->setTitle(tr("&Next")); connect(group, SIGNAL(buttonClicked(int)), this, SLOT(changeMode(int))); ScriptUI->Tabs->setTabEnabled(ScriptUI->Tabs->indexOf(ScriptUI->ResizeTab), false); // Remove when migrate and resize is implemented #if 1 ScriptUI->Migrate->hide(); #endif ScriptUI->Source->setConnectionString(connection.description()); ScriptUI->Destination->setConnectionString(connection.description()); connect(ScriptUI->Browse, SIGNAL(clicked()), this, SLOT(browseFile())); connect(ScriptUI->AddButton, SIGNAL(clicked()), this, SLOT(newSize())); connect(ScriptUI->Remove, SIGNAL(clicked()), this, SLOT(removeSize())); ScriptUI->Schema->setCurrentIndex(0); setFocusProxy(ScriptUI->Tabs); QSettings s; s.beginGroup("toScript"); // radiobuttons - modes ScriptUI->Compare->setChecked(s.value("Compare", true).toBool()); ScriptUI->Extract->setChecked(s.value("Extract", false).toBool()); ScriptUI->Search->setChecked(s.value("Search", false).toBool()); ScriptUI->Migrate->setChecked(s.value("Migrate", false).toBool()); ScriptUI->Report->setChecked(s.value("Report", false).toBool()); // checkboxes - options ScriptUI->IncludeDDL->setChecked(s.value("IncludeDDL", true).toBool()); ScriptUI->IncludeConstraints->setChecked(s.value("IncludeConstraints", true).toBool()); ScriptUI->IncludeIndexes->setChecked(s.value("IncludeIndexes", true).toBool()); ScriptUI->IncludeGrants->setChecked(s.value("IncludeGrants", true).toBool()); ScriptUI->IncludeStorage->setChecked(s.value("IncludeStorage", true).toBool()); ScriptUI->IncludeParallell->setChecked(s.value("IncludeParallell", true).toBool()); ScriptUI->IncludePartition->setChecked(s.value("IncludePartition", true).toBool()); ScriptUI->IncludeCode->setChecked(s.value("IncludeCode", true).toBool()); ScriptUI->IncludeComment->setChecked(s.value("IncludeComment", true).toBool()); ScriptUI->IncludePrompt->setChecked(s.value("IncludePrompt", false).toBool()); ScriptUI->IncludeHeader->setChecked(s.value("IncludeHeader", true).toBool()); ScriptUI->IncludeContent->setChecked(s.value("IncludeContent", false).toBool()); ScriptUI->CommitDistance->setValue(s.value("CommitDistance", 0).toInt()); ScriptUI->Schema->setEditText(s.value("Schema", "Same").toString()); // target ScriptUI->OutputTab->setChecked(s.value("OutputTab", true).toBool()); ScriptUI->OutputFile->setChecked(s.value("OutputFile", false).toBool()); ScriptUI->OutputDir->setChecked(s.value("OutputDir", false).toBool()); ScriptUI->Filename->setText(s.value("Filename", "").toString()); s.endGroup(); changeMode(group->checkedId()); } toScript::~toScript() {} void toScript::closeEvent(QCloseEvent *event) { if (Worksheet && Worksheet->close()) { QSettings s; s.beginGroup("toScript"); // radiobuttons - modes s.setValue("Compare", ScriptUI->Compare->isChecked()); s.setValue("Extract", ScriptUI->Extract->isChecked()); s.setValue("Search", ScriptUI->Search->isChecked()); s.setValue("Migrate", ScriptUI->Migrate->isChecked()); s.setValue("Report", ScriptUI->Report->isChecked()); // checkboxes - options s.setValue("Report", ScriptUI->Report->isChecked()); s.setValue("IncludeDDL", ScriptUI->IncludeDDL->isChecked()); s.setValue("IncludeConstraints", ScriptUI->IncludeConstraints->isChecked()); s.setValue("IncludeIndexes", ScriptUI->IncludeIndexes->isChecked()); s.setValue("IncludeGrants", ScriptUI->IncludeGrants->isChecked()); s.setValue("IncludeStorage", ScriptUI->IncludeStorage->isChecked()); s.setValue("IncludeParallell", ScriptUI->IncludeParallell->isChecked()); s.setValue("IncludePartition", ScriptUI->IncludePartition->isChecked()); s.setValue("IncludeCode", ScriptUI->IncludeCode->isChecked()); s.setValue("IncludeComment", ScriptUI->IncludeComment->isChecked()); s.setValue("IncludePrompt", ScriptUI->IncludePrompt->isChecked()); s.setValue("IncludeHeader", ScriptUI->IncludeHeader->isChecked()); s.setValue("IncludeContent", ScriptUI->IncludeContent->isChecked()); s.setValue("CommitDistance", ScriptUI->CommitDistance->value()); s.setValue("Schema", ScriptUI->Schema->currentText()); // target s.setValue("OutputTab", ScriptUI->OutputTab->isChecked()); s.setValue("OutputFile", ScriptUI->OutputFile->isChecked()); s.setValue("OutputDir", ScriptUI->OutputDir->isChecked()); s.setValue("Filename", ScriptUI->Filename->text()); s.endGroup(); event->accept(); } else event->ignore(); } std::list toScript::createObjectList(QItemSelectionModel * selections) { std::list lst; std::list otherGlobal; std::list profiles; std::list roles; std::list tableSpace; std::list tables; std::list userOther; std::list userViews; std::list users; if (!selections->hasSelection()) return lst; toScriptTreeItem * item; foreach (QModelIndex i, selections->selectedIndexes()) { item = static_cast(i.internalPointer()); Q_ASSERT_X(item, "toScript::createObjectList()", "fatal logic error - never shoudl go there"); // qDebug() << "selected: "<< item << item->schema() << item->data() << item->type(); if (item->type().isNull()) { continue; } if (item->type() == "TABLESPACE") toPush(tableSpace, item->type() + ":" + item->data()); else if (item->type() == "PROFILE") toPush(profiles, item->type() + ":" + item->data()); else if (item->type() == "ROLE") toPush(roles, item->data()); else if (item->type() == "USER") toPush(users, item->data()); else if (item->type() == "TABLE") toPush(tables, item->schema() + "." + item->data()); else if (item->type() == "VIEW") // just to get it *after* tables toPush(userViews, "VIEW:" + item->schema() + "." + item->data()); else // the rest goes last (pkgs etc.) toPush(userOther, item->type() + ":" + item->schema() + "." + item->data()); } if (ScriptUI->IncludeDDL->isChecked()) { lst.insert(lst.end(), tableSpace.begin(), tableSpace.end()); lst.insert(lst.end(), profiles.begin(), profiles.end()); lst.insert(lst.end(), otherGlobal.begin(), otherGlobal.end()); for_each(roles.begin(), roles.end(), PrefixString(lst, QString::fromLatin1("ROLE:"))); for_each(users.begin(), users.end(), PrefixString(lst, QString::fromLatin1("USER:"))); for_each(tables.begin(), tables.end(), PrefixString(lst, QString::fromLatin1("TABLE FAMILY:"))); lst.insert(lst.end(), userViews.begin(), userViews.end()); lst.insert(lst.end(), userOther.begin(), userOther.end()); } for_each(tables.begin(), tables.end(), PrefixString(lst, QString::fromLatin1("TABLE CONTENTS:"))); if (ScriptUI->IncludeDDL->isChecked()) { for_each(tables.begin(), tables.end(), PrefixString(lst, QString::fromLatin1("TABLE REFERENCES:"))); for_each(roles.begin(), roles.end(), PrefixString(lst, QString::fromLatin1("ROLE GRANTS:"))); for_each(users.begin(), users.end(), PrefixString(lst, QString::fromLatin1("USER GRANTS:"))); } return lst; } void toScript::execute(void) { try { int mode; if (ScriptUI->Compare->isChecked()) mode = MODE_COMPARE; else if (ScriptUI->Extract->isChecked()) mode = MODE_EXTRACT; else if (ScriptUI->Migrate->isChecked()) mode = MODE_SEARCH; else if (ScriptUI->Search->isChecked()) mode = MODE_SEARCH; else if (ScriptUI->Report->isChecked()) mode = MODE_REPORT; else { toStatusMessage(tr("No mode selected")); return ; } std::list sourceObjects = createObjectList(ScriptUI->Source->objectList()); std::list sourceDescription; std::list destinationDescription; QString script; toExtract source(toMainWidget()->connection(ScriptUI->Source->connectionString()), this); setupExtract(source); switch (mode) { case MODE_EXTRACT: if (ScriptUI->OutputTab->isChecked()) script += source.create(sourceObjects); else if (ScriptUI->OutputFile->isChecked()) { if (ScriptUI->Filename->text().isEmpty()) throw tr("No filename specified"); QFile file(ScriptUI->Filename->text()); if (file.exists()) { if (TOMessageBox::warning( this, tr("Overwrite file?"), tr("The file %1 already exists,\n" "are you sure you want to continue and write over it?") .arg(ScriptUI->Filename->text()), tr("&Yes"), tr("&Cancel"), QString::null, 0) != 0) { return ; } } file.open(QIODevice::WriteOnly); if (file.error() != QFile::NoError) throw tr("Couldn't open file %1").arg(file.fileName()); QTextStream stream(&file); source.create(stream, sourceObjects); if (file.error() != QFile::NoError) throw tr("Error writing to file %1").arg(file.fileName()); script = tr("-- Script generated to file %1 successfully").arg(ScriptUI->Filename->text()); } else if (ScriptUI->OutputDir->isChecked()) { if (ScriptUI->Filename->text().isEmpty()) throw tr("No filename specified"); QFile file(ScriptUI->Filename->text() + QDir::separator() + "script.sql"); file.open(QIODevice::WriteOnly); if (file.error() != QFile::NoError) throw QString(tr("Couldn't open file %1")).arg(file.fileName()); QTextStream stream(&file); stream << tr("rem Master script for DDL reverse engineering by TOra\n" "\n"); QFile pfile(ScriptUI->Filename->text() + QDir::separator() + "script.tpr"); pfile.open(QIODevice::WriteOnly); if (pfile.error() != QFile::NoError) throw QString(tr("Couldn't open file %1")).arg(pfile.fileName()); QTextStream pstream(&pfile); QRegExp repl("\\W+"); for (std::list::iterator i = sourceObjects.begin();i != sourceObjects.end();i++) { std::list t; t.insert(t.end(), *i); QString fn = *i; fn.replace(repl, "_"); fn += ".sql"; stream << "@" << fn << "\n"; QFile tf(ScriptUI->Filename->text() + QDir::separator() + fn); tf.open(QIODevice::WriteOnly); pstream << tf.fileName() << "\n"; if (tf.error() != QFile::NoError) throw QString(tr("Couldn't open file %1")).arg(tf.fileName()); QTextStream ts(&tf); source.create(ts, t); if (tf.error() != QFile::NoError) throw QString(tr("Error writing to file %1")).arg(tf.fileName()); script = tr("-- Scripts generate to directory %1 successfully").arg(ScriptUI->Filename->text()); ; } if (file.error() != QFile::NoError) throw QString(tr("Error writing to file %1")).arg(file.fileName()); if (pfile.error() != QFile::NoError) throw QString(tr("Error writing to file %1")).arg(pfile.fileName()); } break; case MODE_COMPARE: case MODE_SEARCH: case MODE_MIGRATE: case MODE_REPORT: sourceDescription = source.describe(sourceObjects); break; } if (ScriptUI->Destination->isEnabled()) { std::list destinationObjects = createObjectList(ScriptUI->Destination->objectList()); toExtract destination(toMainWidget()->connection(ScriptUI->Destination->connectionString()), this); setupExtract(destination); switch (mode) { case MODE_COMPARE: case MODE_SEARCH: destinationDescription = destination.describe(destinationObjects); break; case MODE_REPORT: case MODE_EXTRACT: case MODE_MIGRATE: throw tr("Destination shouldn't be enabled now, internal error"); } std::list drop; std::list create; toExtract::srcDst2DropCreate(sourceDescription, destinationDescription, drop, create); sourceDescription = drop; destinationDescription = create; } ScriptUI->Tabs->setTabEnabled(ScriptUI->Tabs->indexOf(ScriptUI->ResultTab), mode == MODE_EXTRACT || mode == MODE_SEARCH || mode == MODE_MIGRATE || mode == MODE_REPORT); ScriptUI->Tabs->setTabEnabled(ScriptUI->Tabs->indexOf(ScriptUI->DifferenceTab), mode == MODE_COMPARE || mode == MODE_SEARCH); if (!script.isEmpty()) { Worksheet->editor()->setText(script); Worksheet->editor()->setFilename(QString::null); Worksheet->editor()->setModified(true); } if (mode == MODE_SEARCH) { Worksheet->hide(); Report->hide(); SearchList->show(); QRegExp re(ScriptUI->SearchWord->text(), Qt::CaseInsensitive); QStringList words(ScriptUI->SearchWord->text().toUpper().simplified().split(QRegExp(QString::fromLatin1(" ")))); QString word = ScriptUI->SearchWord->text().toUpper(); int searchMode = 0; if (ScriptUI->AllWords->isChecked()) searchMode = 1; else if (ScriptUI->AnyWords->isChecked()) searchMode = 2; else if (ScriptUI->RegExp->isChecked()) searchMode = 3; else if (ScriptUI->ExactMatch->isChecked()) searchMode = 4; std::list result; for (std::list::iterator i = sourceDescription.begin(); i != sourceDescription.end(); i++) { QStringList ctx = (*i).toUpper().split(QString("\01")); switch (searchMode) { case 1: case 2: { int count = 0; for (int k = 0;k < words.count();k++) { QString s = words[k]; if (ctx.last().contains(s)) count++; } if ((searchMode == 2 && count > 0) || (searchMode == 1 && count == words.count())) result.insert(result.end(), *i); } break; case 4: if (ctx.last() == word) result.insert(result.end(), *i); break; case 3: if (re.indexIn(ctx.last()) >= 0) result.insert(result.end(), *i); break; } } fillDifference(result, SearchList); } else if (mode == MODE_REPORT) { Worksheet->hide(); SearchList->hide(); Report->show(); QString res = toGenerateReport(source.connection(), sourceDescription); Report->setText(res); if (ScriptUI->OutputFile->isChecked()) { if (ScriptUI->Filename->text().isEmpty()) toStatusMessage(tr("No filename specified")); else { QFile file(ScriptUI->Filename->text()); file.open(QIODevice::WriteOnly); if (file.error() != QFile::NoError) toStatusMessage(tr("Couldn't open file %1").arg(file.fileName())); else { QTextStream stream(&file); stream << res; if (file.error() != QFile::NoError) toStatusMessage(tr("Error writing to file %1").arg(file.fileName())); } } } } else // TODO migrate { Worksheet->show(); SearchList->hide(); Report->hide(); fillDifference(sourceDescription, DropList); fillDifference(destinationDescription, CreateList); } if (mode == MODE_COMPARE) ScriptUI->Tabs->setCurrentIndex(ScriptUI->Tabs->indexOf(ScriptUI->DifferenceTab)); else ScriptUI->Tabs->setCurrentIndex(ScriptUI->Tabs->indexOf(ScriptUI->ResultTab)); } TOCATCH } void toScript::fillDifference(std::list &objects, toTreeWidget *view) { // qDebug() << "toScript::fillDifference" << view; view->clear(); toTreeWidgetItem *last = NULL; int lastLevel = 0; QStringList lstCtx; for (std::list::iterator i = objects.begin();i != objects.end();i++) { // qDebug() << "fillDifference add: " << (*i); QStringList ctx = (*i).split(QString("\01")); if (last) { while (last && lastLevel >= int(ctx.count())) { last = last->parent(); lastLevel--; } while (last && lastLevel >= 0 && !toCompareLists(lstCtx, ctx, (unsigned int)lastLevel)) { last = last->parent(); lastLevel--; } } if (lastLevel < 0) throw tr("Internal error, lastLevel < 0"); while (lastLevel < int(ctx.count()) - 1) { if (last) last = new toResultViewMLine(last, NULL, ctx[lastLevel]); else last = new toResultViewMLine(view, NULL, ctx[lastLevel]); lastLevel++; } toResultViewMLCheck *item; if (last) item = new toResultViewMLCheck(last, ctx[lastLevel], toTreeWidgetCheck::CheckBox); else item = new toResultViewMLCheck(view, ctx[lastLevel], toTreeWidgetCheck::CheckBox); last = item; item->setOn(true); lstCtx = ctx; lastLevel++; } } void toScript::changeMode(int mode) { if (mode < MODE_COMPARE || mode > MODE_REPORT) return ; if (mode == MODE_COMPARE) ScriptUI->Destination->setEnabled(true); else if (mode == MODE_EXTRACT || mode == MODE_MIGRATE || mode == MODE_REPORT || mode == MODE_SEARCH) ScriptUI->Destination->setEnabled(false); if (mode == MODE_EXTRACT) ScriptUI->Tabs->setTabEnabled(ScriptUI->Tabs->indexOf(ScriptUI->ResizeTab), true); else if (mode == MODE_COMPARE || mode == MODE_MIGRATE || mode == MODE_REPORT || mode == MODE_SEARCH) ScriptUI->Tabs->setTabEnabled(ScriptUI->Tabs->indexOf(ScriptUI->ResizeTab), false); ScriptUI->IncludeContent->setEnabled(mode == MODE_EXTRACT); ScriptUI->CommitDistance->setEnabled(mode == MODE_EXTRACT); if (mode == MODE_EXTRACT) { ScriptUI->IncludeHeader->setEnabled(true); ScriptUI->IncludePrompt->setEnabled(true); } else if (mode == MODE_COMPARE || mode == MODE_MIGRATE || mode == MODE_REPORT || mode == MODE_SEARCH) { ScriptUI->IncludeHeader->setEnabled(false); ScriptUI->IncludePrompt->setEnabled(false); } if (mode == MODE_COMPARE || mode == MODE_SEARCH || mode == MODE_MIGRATE || mode == MODE_REPORT) { ScriptUI->IncludeDDL->setEnabled(false); ScriptUI->IncludeDDL->setChecked(true); } else if (mode == MODE_EXTRACT) ScriptUI->IncludeDDL->setEnabled(true); ScriptUI->OutputGroup->setEnabled(mode == MODE_EXTRACT || mode == MODE_SEARCH || mode == MODE_REPORT); ScriptUI->SearchGroup->setVisible(mode == MODE_SEARCH); ScriptUI->IncludeConstraints->setEnabled(ScriptUI->IncludeDDL->isChecked()); ScriptUI->IncludeIndexes->setEnabled(ScriptUI->IncludeDDL->isChecked()); ScriptUI->IncludeGrants->setEnabled(ScriptUI->IncludeDDL->isChecked()); ScriptUI->IncludeStorage->setEnabled(ScriptUI->IncludeDDL->isChecked() && mode != MODE_MIGRATE); ScriptUI->IncludeParallell->setEnabled(ScriptUI->IncludeDDL->isChecked() && mode != MODE_MIGRATE); ScriptUI->IncludePartition->setEnabled(ScriptUI->IncludeDDL->isChecked() && mode != MODE_MIGRATE); ScriptUI->IncludeCode->setEnabled(ScriptUI->IncludeDDL->isChecked()); ScriptUI->IncludeComment->setEnabled(ScriptUI->IncludeDDL->isChecked()); } void toScript::keepOn(toTreeWidgetItem *parent) { // qDebug() << "void toScript::keepOn(toTreeWidgetItem *parent)"; if (!parent) return ; toResultViewCheck *pchk = dynamic_cast(parent); if (!pchk) return ; pchk->setOn(true); } void toScript::newSize(void) { QString init = ScriptUI->Initial->sizeString(); QString next = ScriptUI->Next->sizeString(); QString max = ScriptUI->Limit->sizeString(); QString maxNum; maxNum.sprintf("%010d", ScriptUI->Limit->value()); for (toTreeWidgetItem *item = ScriptUI->Sizes->firstChild();item;item = item->nextSibling()) if (max == item->text(0)) { toStatusMessage(tr("Replacing existing size with new"), false, false); delete item; break; } new toTreeWidgetItem(ScriptUI->Sizes, max, init, next, maxNum); ScriptUI->Sizes->setSorting(3); } void toScript::removeSize(void) { toTreeWidgetItem *item = ScriptUI->Sizes->selectedItem(); if (item) delete item; } void toScript::setupExtract(toExtract &extr) { extr.setCode (ScriptUI->IncludeCode->isEnabled() && ScriptUI->IncludeCode->isChecked() ); extr.setComments (ScriptUI->IncludeComment->isEnabled() && ScriptUI->IncludeComment->isChecked() ); extr.setConstraints(ScriptUI->IncludeConstraints->isEnabled() && ScriptUI->IncludeConstraints->isChecked()); extr.setContents (ScriptUI->IncludeContent->isEnabled() && ScriptUI->IncludeContent->isChecked() , ScriptUI->CommitDistance->value() ); extr.setGrants (ScriptUI->IncludeGrants->isEnabled() && ScriptUI->IncludeGrants->isChecked() ); extr.setHeading (ScriptUI->IncludeHeader->isEnabled() && ScriptUI->IncludeHeader->isChecked() ); extr.setIndexes (ScriptUI->IncludeIndexes->isEnabled() && ScriptUI->IncludeIndexes->isChecked() ); extr.setParallel (ScriptUI->IncludeParallell->isEnabled() && ScriptUI->IncludeParallell->isChecked() ); extr.setPartition (ScriptUI->IncludePartition->isEnabled() && ScriptUI->IncludePartition->isChecked() ); extr.setPrompt (ScriptUI->IncludePrompt->isEnabled() && ScriptUI->IncludePrompt->isChecked() ); extr.setStorage (ScriptUI->IncludeStorage->isEnabled() && ScriptUI->IncludeStorage->isChecked() ); if (ScriptUI->Schema->currentText() == tr("Same")) extr.setSchema(QString::fromLatin1("1")); else if (ScriptUI->Schema->currentText() == tr("None")) extr.setSchema(QString::null); else extr.setSchema(ScriptUI->Schema->currentText()); if (ScriptUI->DontResize->isChecked()) extr.setResize(QString::null); else if (ScriptUI->AutoResize->isChecked()) extr.setResize(QString::fromLatin1("1")); else { QString siz; for (toTreeWidgetItem *item = ScriptUI->Sizes->firstChild();item;item = item->nextSibling()) { siz += item->text(0); siz += QString::fromLatin1(":"); siz += item->text(1); siz += QString::fromLatin1(":"); siz += item->text(2); if (item->nextSibling()) siz += QString::fromLatin1(":"); } extr.setResize(siz); } } void toScript::browseFile(void) { if (ScriptUI->OutputFile->isChecked()) { QString f = toOpenFilename(QString::null, QString::null, this); if (!f.isEmpty()) ScriptUI->Filename->setText(f); } else if (ScriptUI->OutputDir->isChecked()) { QString f = TOFileDialog::getExistingDirectory(this, tr("Select a Directory"), QString::null); if (!f.isEmpty()) ScriptUI->Filename->setText(f); } } tora-2.1.3/src/tosqledit.cpp0000644000175000017500000004535111270353625015567 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "tohighlightedtext.h" #include "tomain.h" #include "toresultview.h" #include "tosql.h" #include "tosqledit.h" #include "totool.h" #include "toworksheet.h" #include #include #include #include #include "totreewidget.h" #include #include #include #include #include #include #include #include #include #include #include #include "icons/add.xpm" #include "icons/commit.xpm" #include "icons/fileopen.xpm" #include "icons/filesave.xpm" #include "icons/tosqledit.xpm" #include "icons/trash.xpm" class toSQLEditTool : public toTool { protected: QWidget * Window; public: toSQLEditTool() : toTool(920, "SQL Dictionary Editor") { Window = NULL; } virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) { if (Window) { Window->setFocus(Qt::OtherFocusReason); // already opened, prevent creating new sub window return 0; } Window = new toSQLEdit(parent, connection); Window->setWindowIcon(QPixmap(const_cast(tosqledit_xpm))); return Window; } virtual void customSetup() { toMainWidget()->getEditMenu()->addAction( QIcon(tosqledit_xpm), qApp->translate("toSQLEditTool", "&Edit SQL..."), this, SLOT(createWindow())); toMainWidget()->registerSQLEditor(key()); } void closeWindow(void) { Window = NULL; } virtual bool canHandle(toConnection &) { return true; } virtual void closeWindow(toConnection &connection) {}; }; static toSQLEditTool SQLEditTool; void toSQLEdit::updateStatements(const QString &sel) { Statements->clear(); toSQL::sqlMap sql = toSQL::definitions(); toTreeWidgetItem *head = NULL; toTreeWidgetItem *item = NULL; for (toSQL::sqlMap::iterator pos = sql.begin();pos != sql.end();pos++) { QString str = (*pos).first; int i = str.indexOf(QString::fromLatin1(":")); if (i >= 0) { if (!head || head->text(0) != str.left(i)) { head = new toTreeWidgetItem(Statements, str.left(i)); head->setSelectable(false); } item = new toTreeWidgetItem(head, str.right(str.length() - i - 1)); if (sel == str) { Statements->setSelected(item, true); Statements->setCurrentItem(item); Statements->setOpen(head, true); } } else { head = new toTreeWidgetItem(Statements, head, str); if (sel == str) { Statements->setSelected(head, true); Statements->setCurrentItem(item); } } } } toSQLEdit::toSQLEdit(QWidget *main, toConnection &connection) : toToolWidget(SQLEditTool, "sqledit.html", main, connection, "toSQLEdit") { QToolBar *toolbar = toAllocBar(this, tr("SQL editor")); layout()->addWidget(toolbar); toolbar->addAction(QIcon(fileopen_xpm), tr("Load SQL dictionary file"), this, SLOT(loadSQL())); toolbar->addAction(QIcon(filesave_xpm), tr("Save modified SQL to dictionary file"), this, SLOT(saveSQL())); toolbar->addSeparator(); CommitButton = toolbar->addAction( QIcon(commit_xpm), tr("Save this entry in the dictionary"), this, SLOT(commitChanges())); TrashButton = toolbar->addAction( QIcon(trash_xpm), tr("Delete this version from the SQL dictionary"), this, SLOT(deleteVersion())); toolbar->addAction(QIcon(add_xpm), tr("Start new SQL definition"), this, SLOT(newSQL())); CommitButton->setEnabled(true); TrashButton->setEnabled(false); toolbar->addWidget(new toSpacer()); QSplitter *splitter = new QSplitter(Qt::Horizontal, this); layout()->addWidget(splitter); Statements = new toListView(splitter); Statements->setRootIsDecorated(true); Statements->addColumn(tr("Text Name")); Statements->setSorting(0); Statements->setSelectionMode(toTreeWidget::Single); QWidget *vbox = new QWidget(splitter); QVBoxLayout *vlay = new QVBoxLayout; QWidget *hbox = new QWidget(vbox); QHBoxLayout *hlay = new QHBoxLayout; vlay->addWidget(hbox); hlay->addWidget(new QLabel(tr("Name") + " ", hbox)); Name = new QLineEdit(hbox); hlay->addWidget(Name); hlay->addWidget(new QLabel(" " + tr("Database") + " ", hbox)); Version = new QComboBox(hbox); Version->setEditable(true); Version->setDuplicatesEnabled(false); hlay->addWidget(Version); LastVersion = connection.provider() + ":Any"; Version->addItem(LastVersion); QFrame *line = new QFrame(vbox); vlay->addWidget(line); line->setFrameStyle(QFrame::HLine | QFrame::Sunken); vlay->addWidget(new QLabel(tr("Description"), vbox)); splitter = new QSplitter(Qt::Vertical, vbox); vlay->addWidget(splitter); Description = new toMarkedText(splitter); Editor = new toWorksheet(splitter, connection, false); hlay->setSpacing(0); hlay->setContentsMargins(0, 0, 0, 0); hbox->setLayout(hlay); vlay->setSpacing(0); vlay->setContentsMargins(0, 0, 0, 0); vbox->setLayout(vlay); connectList(true); connect(Version, SIGNAL(activated(const QString &)), this, SLOT(changeVersion(const QString &))); connect(toMainWidget(), SIGNAL(sqlEditor(const QString &)), this, SLOT(editSQL(const QString &))); updateStatements(); setFocusProxy(Statements); } void toSQLEdit::connectList(bool conn) { if (conn) connect(Statements, SIGNAL(selectionChanged(void)), this, SLOT(selectionChanged(void))); else disconnect(Statements, SIGNAL(selectionChanged(void)), this, SLOT(selectionChanged(void))); } toSQLEdit::~toSQLEdit() { SQLEditTool.closeWindow(); toSQL::saveSQL(toConfigurationSingle::Instance().sqlFile()); } void toSQLEdit::loadSQL(void) { try { QString filename = toOpenFilename(QString::null, QString::null, this); if (!filename.isEmpty()) { toSQL::loadSQL(filename); Filename = filename; } } TOCATCH; } void toSQLEdit::saveSQL(void) { // must commit changes first for sql to be present in dictionary. commitChanges(); QString filename = toSaveFilename(QString::null, QString::null, this); if (!filename.isEmpty()) { Filename = filename; toSQL::saveSQL(filename); } } void toSQLEdit::deleteVersion(void) { QString provider; QString version; if (!splitVersion(Version->currentText(), provider, version)) return ; try { toSQL::deleteSQL(Name->text().toLatin1(), version, provider); Version->removeItem(Version->currentIndex()); if (Version->count() == 0) { toTreeWidgetItem *item = toFindItem(Statements, Name->text()); if (item) { connectList(false); delete item; connectList(true); } newSQL(); } else selectionChanged(QString(connection().provider() + ":" + connection().version())); } TOCATCH; } bool toSQLEdit::close(bool del) { if (checkStore(false)) return toToolWidget::close(); return false; } bool toSQLEdit::splitVersion(const QString &split, QString &provider, QString &version) { int found = split.indexOf(QString::fromLatin1(":")); if (found < 0) { TOMessageBox::warning(this, tr("Wrong format of version"), tr("Should be database provider:version."), tr("&Ok")); return false; } provider = split.mid(0, found).toLatin1(); if (provider.length() == 0) { TOMessageBox::warning(this, tr("Wrong format of version"), tr("Should be database provider:version. Can't start with :."), tr("&Ok")); return false; } version = split.mid(found + 1).toLatin1(); if (version.length() == 0) { TOMessageBox::warning(this, tr("Wrong format of version"), tr("Should be database provider:version. Can't end with the first :."), tr("&Ok")); return false; } return true; } void toSQLEdit::commitChanges(bool changeSelected) { QString provider; QString version; if (!splitVersion(Version->currentText(), provider, version)) return ; QString name = Name->text(); toTreeWidgetItem *item = toFindItem(Statements, name); if (!item) { int i = name.indexOf(QString::fromLatin1(":")); if (i >= 0) { item = toFindItem(Statements, name.mid(0, i)); if (!item) item = new toTreeWidgetItem(Statements, name.mid(0, i)); item = new toTreeWidgetItem(item, name.mid(i + 1)); } else item = new toTreeWidgetItem(Statements, name); } connectList(false); if (changeSelected) { Statements->setSelected(item, true); Statements->setCurrentItem(item); if (item->parent() && !item->parent()->isOpen()) item->parent()->setOpen(true); } connectList(true); if (Description->text().isEmpty()) { TOMessageBox::warning(this, tr("Missing description"), tr("No description filled in. This is necessary to save SQL." " Adding undescribed as description."), tr("&Ok")); Description->setText(tr("Undescribed")); } toSQL::updateSQL(name.toLatin1(), Editor->editor()->text(), Description->text(), version, provider); TrashButton->setEnabled(true); CommitButton->setEnabled(true); bool update = Name->isModified(); Name->setModified(false); Description->setModified(false); Editor->editor()->setModified(false); LastVersion = Version->currentText(); if (update) updateStatements(Name->text()); Statements->setFocus(); } bool toSQLEdit::checkStore(bool justVer) { if ((Name->isModified() || Editor->editor()->isModified() || (!justVer && Version->currentText() != LastVersion) || Description->isModified()) && Version->currentText().length() > 0) { // grab focus so user can see file and decide to save setFocus(Qt::OtherFocusReason); switch (TOMessageBox::information(this, tr("Modified SQL dictionary"), tr("Save changes into the SQL dictionary"), tr("&Yes"), tr("&No"), tr("Cancel"), 0, 2)) { case 0: commitChanges(false); break; case 1: Name->setModified(false); Description->setModified(false); Editor->editor()->setModified(false); LastVersion = Version->currentText(); return true; case 2: return false; } } return true; } void toSQLEdit::changeVersion(const QString &ver) { if (!Editor->editor()->isModified() || checkStore(true)) { selectionChanged(ver); if (Version->currentText() != ver) { Version->addItem(ver); Version->lineEdit()->setText(ver); } } } void toSQLEdit::selectionChanged(void) { try { if (checkStore(false)) selectionChanged(QString(connection().provider() + ":" + connection().version())); } TOCATCH; } void toSQLEdit::changeSQL(const QString &name, const QString &maxver) { toSQL::sqlMap sql = toSQL::definitions(); Name->setText(name); Name->setModified(false); toTreeWidgetItem *item = toFindItem(Statements, name); if (item) { connectList(false); Statements->setSelected(item, true); Statements->setCurrentItem(item); if (item->parent() && !item->parent()->isOpen()) item->parent()->setOpen(true); connectList(true); } Version->clear(); LastVersion = ""; if (sql.find(name.toLatin1()) != sql.end()) { toSQL::definition &def = sql[name.toLatin1()]; std::list &ver = def.Versions; Description->setText(def.Description); Description->setModified(false); std::list::iterator j = ver.end(); int ind = 0; for (std::list::iterator i = ver.begin();i != ver.end();i++) { QString str = (*i).Provider; str += QString::fromLatin1(":"); str += (*i).Version; Version->addItem(str); if (str <= maxver || j == ver.end()) { j = i; LastVersion = str; ind = Version->count() - 1; } } if (j != ver.end()) { Editor->editor()->setText((*j).SQL); TrashButton->setEnabled(true); CommitButton->setEnabled(true); Version->setCurrentIndex(ind); } } else { Description->clear(); Editor->editor()->clear(); TrashButton->setEnabled(false); CommitButton->setEnabled(true); } if (LastVersion.isEmpty()) { LastVersion = QString::fromLatin1("Any:Any"); Version->addItem(LastVersion); } Editor->editor()->setModified(false); } void toSQLEdit::selectionChanged(const QString &maxver) { try { toTreeWidgetItem *item = Statements->selectedItem(); if (item) { QString name = item->text(0); while (item->parent()) { item = item->parent(); name.prepend(QString::fromLatin1(":")); name.prepend(item->text(0)); } changeSQL(name, maxver); } } TOCATCH; } void toSQLEdit::editSQL(const QString &nam) { try { if (checkStore(false)) changeSQL(nam, QString(connection().provider() + ":" + connection().version())); } TOCATCH; } void toSQLEdit::newSQL(void) { if (checkStore(false)) { QString name = Name->text(); int found = name.indexOf(QString::fromLatin1(":")); if (found < 0) name = QString::null; else name = name.mid(0, found + 1); try { changeSQL(name, QString(connection().provider() + ":Any")); } TOCATCH; } } static toSQLTemplate SQLTemplate; toSQLTemplateItem::toSQLTemplateItem(toTreeWidget *parent) : toTemplateItem(SQLTemplate, parent, qApp->translate("toSQL", "SQL Dictionary")) { setExpandable(true); } static QString JustLast(const QString &str) { int pos = str.lastIndexOf(":"); if (pos >= 0) return QString(str.mid(pos + 1)); return QString(str); } toSQLTemplateItem::toSQLTemplateItem(toSQLTemplateItem *parent, const QString &name) : toTemplateItem(parent, JustLast(name)) { Name = name; std::list def = toSQL::range(Name + ":"); if (def.begin() != def.end()) setExpandable(true); } void toSQLTemplateItem::expand(void) { std::list def; if (Name.isEmpty()) def = toSQL::range(Name); else def = toSQL::range(Name + ":"); QString last; for (std::list::iterator sql = def.begin();sql != def.end();sql++) { QString name = *sql; if (!Name.isEmpty()) name = name.mid(Name.length() + 1); if (name.indexOf(":") != -1) name = name.mid(0, name.indexOf(":")); if (name != last) { if (Name.isEmpty()) new toSQLTemplateItem(this, name); else new toSQLTemplateItem(this, Name + ":" + name); last = name; } } } QString toSQLTemplateItem::allText(int) const { try { toSQL::sqlMap defs = toSQL::definitions(); if (defs.find(Name) == defs.end()) return QString::null; return toSQL::string(Name, toMainWidget()->currentConnection()) + ";"; } catch (...) { return QString::null; } } void toSQLTemplateItem::collapse(void) { while (firstChild()) delete firstChild(); } QWidget *toSQLTemplateItem::selectedWidget(QWidget *parent) { toHighlightedText *widget = new toHighlightedText(parent); widget->setReadOnly(true); widget->setText(allText(0)); return widget; } tora-2.1.3/src/tosecuritytreemodel.cpp0000644000175000017500000003220211270353625017661 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "tosql.h" #include "toconnection.h" #include "tomain.h" #include "toqvalue.h" #include "utils.h" #include "tosecuritytreemodel.h" /*static toSQL SQLObjectPrivs("toSecurity:ObjectPrivs", "SELECT DECODE(:type,'FUNCTION','EXECUTE',\n" " 'LIBRARY','EXECUTE',\n" " 'PACKAGE','EXECUTE',\n" " 'PROCEDURE','EXECUTE',\n" " 'SEQUENCE','ALTER,SELECT',\n" " 'TABLE','ALTER,DELETE,INDEX,INSERT,REFERENCES,SELECT,UPDATE',\n" " 'TYPE','EXECUTE',\n" " 'VIEW','DELETE,SELECT,INSERT,UPDATE',\n" " 'OPERATOR','EXECUTE',\n" " 'DIRECTORY','READ',\n" " NULL) FROM sys.DUAL", "Takes a type as parameter and return ',' separated list of privileges");*/ static toSQL SQLObjectPrivs("toSecurity:ObjectPrivs", "SELECT 'FUNCTION','EXECUTE' from dual\n" " UNION ALL\n" "SELECT 'LIBRARY','EXECUTE' from dual\n" " UNION ALL\n" "SELECT 'PACKAGE','EXECUTE' from dual\n" " UNION ALL\n" "SELECT 'PROCEDURE','EXECUTE' from dual\n" " UNION ALL\n" "SELECT 'SEQUENCE','ALTER,SELECT' from dual\n" " UNION ALL\n" "SELECT 'TABLE','ALTER,DELETE,INDEX,INSERT,REFERENCES,SELECT,UPDATE' from dual\n" " UNION ALL\n" "SELECT 'TYPE','EXECUTE' from dual\n" " UNION ALL\n" "SELECT 'VIEW','DELETE,SELECT,INSERT,UPDATE' from dual\n" " UNION ALL\n" "SELECT 'OPERATOR','EXECUTE' from dual\n" " UNION ALL\n" "SELECT 'DIRECTORY','READ' from dual", "Returns mapping of TYPE-supported acces right"); static toSQL SQLObjectGrant("toSecurity:ObjectGrant", "SELECT owner,\n" " table_name,\n" " privilege,\n" " grantable,\n" " hierarchy\n" " FROM sys.dba_tab_privs\n" " WHERE grantee = :f1", "Get the privilege on objects for a user or role, " "must have same columns and binds"); toSecurityTreeModel::toSecurityTreeModel(QObject *parent) : QAbstractItemModel(parent) { rootItem = new toSecurityTreeItem(); // read common object type vs its privs mapping toQuery typelst(toCurrentConnection(this), SQLObjectPrivs); QString key; QStringList value; while (!typelst.eof()) { key = typelst.readValueNull(); value = typelst.readValueNull().toString().split(","); m_SQLObjectPrivs[key] = value; } } toSecurityTreeModel::~toSecurityTreeModel() { if (rootItem) delete rootItem; } int toSecurityTreeModel::columnCount(const QModelIndex &parent) const { if (parent.isValid()) return static_cast(parent.internalPointer())->columnCount(); else return rootItem->columnCount(); } QVariant toSecurityTreeModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); toSecurityTreeItem *item = static_cast(index.internalPointer()); if (!item) return QVariant(); if (role == Qt::CheckStateRole && item->isCheckable()) return item->state(); if (role != Qt::DisplayRole) return QVariant(); return item->data(/*index.column()*/); } bool toSecurityTreeModel::setData(const QModelIndex & index, const QVariant & value, int role) { if (!index.isValid()) return false; toSecurityTreeItem *item = static_cast(index.internalPointer()); if (!item) return false; if (role == Qt::CheckStateRole) { Qt::CheckState state = (Qt::CheckState)value.toInt(); item->setState(state); item->setChanged(true); // check parent if its child ("with admin opt") is currently checked if (item->parent()->isCheckable() && state != Qt::Unchecked) { item->parent()->setState(state); item->parent()->setChanged(true); } // uncheck "admin opt" child when its parent gets unchecked if (item->childCount() == 2 && state == Qt::Unchecked && item->child(0)->isCheckable()) { item->child(0)->setState(state); item->child(1)->setState(state); } return true; } return false; } Qt::ItemFlags toSecurityTreeModel::flags(const QModelIndex &index) const { if (!index.isValid()) return 0; toSecurityTreeItem *item = static_cast(index.internalPointer()); if (item) return Qt::ItemIsEnabled | /*Qt::ItemIsSelectable |*/ Qt::ItemIsUserCheckable; return Qt::ItemIsEnabled /*| Qt::ItemIsSelectable*/; } QVariant toSecurityTreeModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) return tr("Objects"); return QVariant(); } QModelIndex toSecurityTreeModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); toSecurityTreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); toSecurityTreeItem *childItem = parentItem->child(row); if (childItem) return createIndex(row, column, childItem); else return QModelIndex(); } QModelIndex toSecurityTreeModel::parent(const QModelIndex &index) const { if (!index.isValid()) return QModelIndex(); toSecurityTreeItem *childItem = static_cast(index.internalPointer()); toSecurityTreeItem *parentItem = childItem->parent(); if (parentItem == rootItem) return QModelIndex(); return createIndex(parentItem->row(), 0, parentItem); } int toSecurityTreeModel::rowCount(const QModelIndex &parent) const { toSecurityTreeItem *parentItem; if (parent.column() > 0) return 0; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); return parentItem->childCount(); } void toSecurityTreeModel::setupModelData(const QString & user) { // clear old contents m_objectList.clear(); delete rootItem; rootItem = new toSecurityTreeItem(); // a map to remember schema vs its root item QMap ownerMap; // key owner; value QMap > typeMap; // reading current grants status QMap > > privs; QMap > > hierarchyPrivs; toQuery grant(toCurrentConnection(this), SQLObjectGrant, user); QString yes = "YES"; QString admstr = "ADMIN"; QString normalstr = "normal"; while (!grant.eof()) { QString owner(grant.readValue()); QString object(grant.readValue()); QString priv(grant.readValue()); QString admin(grant.readValue()); QString hierarchy(grant.readValue()); ((privs[owner])[object])[priv] = (admin == yes ? admstr : normalstr); ((hierarchyPrivs[owner])[object])[priv] = (admin == yes ? admstr : normalstr); } QString type; QString owner; QString name; std::list &objectList = toCurrentConnection(this).objects(true); for (std::list::iterator i = objectList.begin(); i != objectList.end(); i++) { type = (*i).Type; owner = (*i).Owner; name = (*i).Name; // no granting user's own objects for himself if (owner == user) continue; if (!ownerMap.contains(owner)) { toSecurityTreeItem *i = new toSecurityTreeItem(rootItem, owner); ownerMap[owner] = i; rootItem->appendChild(i); } toSecurityTreeItem * ownerItem = ownerMap[owner]; if (!typeMap[ownerItem].contains(type)) { toSecurityTreeItem *i = new toSecurityTreeItem(ownerItem, type); typeMap[ownerItem][type] = i; ownerItem->appendChild(i); } toSecurityTreeItem * objectItem = new toSecurityTreeItem(typeMap[ownerItem][type], name); typeMap[ownerItem][type]->appendChild(objectItem); toSecurityTreeItem * grantItem; foreach(QString right, m_SQLObjectPrivs[type]) { grantItem = new toSecurityTreeItem(objectItem, right, name, type, owner); objectItem->appendChild(grantItem); m_objectList.append(grantItem); grantItem->setCheckable(true); toSecurityTreeItem * admin = new toSecurityTreeItem(grantItem, "WITH GRANT OPTION"); grantItem->appendChild(admin); admin->setCheckable(true); if (privs.contains(owner) && privs[owner].contains(name) && privs[owner][name].contains(right)) { grantItem->setState(Qt::Checked); if (((privs[owner])[name])[right] == admstr) admin->setState(Qt::Checked); } if (right != "SELECT") continue; // hierarchy option is only for SELECTs toSecurityTreeItem * hierarchyOption = new toSecurityTreeItem(grantItem, "WITH HIERARCHY OPTION"); grantItem->appendChild(hierarchyOption); hierarchyOption->setCheckable(true); if (hierarchyPrivs.contains(owner) && hierarchyPrivs[owner].contains(name)) { // grantItem->setState(Qt::Checked); if (((hierarchyPrivs[owner])[name])[right] == admstr) hierarchyOption->setState(Qt::Checked); } } } reset(); } void toSecurityTreeModel::sql(const QString &user, std::list &sqlLst) { QString grant("GRANT %1 ON %2 TO %3"); QString revoke("REVOKE %1 ON %2 FROM %3"); foreach (toSecurityTreeItem *i, m_objectList) { if (!i->changed()) continue; QString addons; if (i->state() == Qt::Checked) { addons = ""; for (int j = 0; j < i->childCount(); ++j) { if (i->child(j)->isCheckable() && i->child(j)->state() == Qt::Checked) addons += "\n" + i->child(j)->data(); } sqlLst.push_back(grant.arg(i->data()).arg(i->name()).arg(user) + addons); } else sqlLst.push_back(revoke.arg(i->data()).arg(i->name()).arg(user)); } } tora-2.1.3/src/toparamget.h0000644000175000017500000001010011270353625015347 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOPARAMGET_H #define TOPARAMGET_H #include "config.h" #include "toconnection.h" #include "tohelp.h" #include #include #include #include #include #include #include class QComboBox; class toParamGetButton : public QPushButton { Q_OBJECT int Row; public: toParamGetButton(int row, QWidget *parent = 0, const char *name = 0) : QPushButton(name, parent), Row(row) { connect(this, SIGNAL(clicked()), this, SLOT(internalClicked())); } private slots: void internalClicked(void) { emit clicked(Row); } signals: void clicked(int); }; /** A help class to parse SQL for input/output bindings and if * available also pop up a dialog and ask for values. Also maintains * an internal cache of old values. */ class toParamGet : public QDialog, public toHelpContext { Q_OBJECT; /** Default values cache */ static std::map > DefaultCache; /** Specified values cache */ static std::map > Cache; QScrollArea *View; QGridLayout *Container; std::list Value; toParamGet(QWidget *parent = 0, const char *name = 0); public: /** Get parameters for specified SQL string. * @param conn Connection to get binds for. * @param parent Parent widget if dialog is needed. * @param str SQL to parse for bindings. Observe that this string can be changed to further * declare the binds. * @param interactive If not interactive simply rewrite the query and pass on the defaults. * @return Returns a list of values to feed into the query. */ static toQList getParam(toConnection &conn, QWidget *parent, QString &str, bool interactive = true); /** Specify a default value for the cache. This can not overwrite a manually * specified value by the user. * @param conn Connection to get binds for. * @param name Name of the bind variable. * @param val Value of the bind variable. */ static void setDefault(toConnection &conn, const QString &name, const QString &val); private slots: virtual void showMemo(int row); }; #endif tora-2.1.3/src/tostorage.cpp0000644000175000017500000013512611270353625015566 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "tochangeconnection.h" #include "toconf.h" #include "toconnection.h" #include "tofilesize.h" #include "tohelp.h" #include "tomain.h" #include "tomemoeditor.h" #include "toresultstorage.h" #include "tosql.h" #include "tostorage.h" #include "tostoragedefinition.h" #include "ui_tostorageprefsui.h" #include "totool.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "icons/addfile.xpm" #include "icons/addtablespace.xpm" #include "icons/droptablespace.xpm" #include "icons/coalesce.xpm" #include "icons/eraselog.xpm" #include "icons/logging.xpm" #include "icons/modfile.xpm" #include "icons/modtablespace.xpm" #include "icons/movefile.xpm" #include "icons/offline.xpm" #include "icons/online.xpm" #include "icons/readtablespace.xpm" #include "icons/refresh.xpm" #include "icons/storageextents.xpm" #include "icons/tostorage.xpm" #include "icons/writetablespace.xpm" // #define CONF_DISP_TABLESPACES "DispTablespaces" // #define CONF_DISP_COALESCED "DispCoalesced" // #define CONF_DISP_EXTENTS "DispExtents" // #define CONF_DISP_AVAILABLEGRAPH "AvailableGraph" class toStoragePrefs : public QWidget, public Ui::toStoragePrefsUI, public toSettingTab { toTool *Tool; public: toStoragePrefs(toTool *tool, QWidget* parent = 0, const char* name = 0); virtual void saveSetting(void); }; toStoragePrefs::toStoragePrefs(toTool *tool, QWidget* parent, const char* name) : QWidget(parent), toSettingTab("storage.html"), Tool(tool) { setupUi(this); DispCoalesced->setChecked(toConfigurationSingle::Instance().dispCoalesced()); DispExtents->setChecked(toConfigurationSingle::Instance().dispExtents()); DispTablespaces->setChecked(toConfigurationSingle::Instance().dispTablespaces()); DispAvailableGraph->setChecked(toConfigurationSingle::Instance().dispAvailableGraph()); } void toStoragePrefs::saveSetting(void) { toConfigurationSingle::Instance().setDispCoalesced(DispCoalesced->isChecked()); toConfigurationSingle::Instance().setDispExtents(DispExtents->isChecked()); toConfigurationSingle::Instance().setDispTablespaces(DispTablespaces->isChecked()); toConfigurationSingle::Instance().setDispAvailableGraph(DispAvailableGraph->isChecked()); } class toStorageTool : public toTool { protected: virtual const char **pictureXPM(void) { return const_cast(tostorage_xpm); } public: toStorageTool() : toTool(50, "Storage Manager") { } virtual const char *menuItem() { return "Storage Manager"; } virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) { return new toStorage(parent, connection); } virtual QWidget *configurationTab(QWidget *parent) { return new toStoragePrefs(this, parent); } virtual void closeWindow(toConnection &connection){}; }; toDropTablespace::toDropTablespace(QWidget* parent, const char* name, Qt::WFlags fl) : QWidget(parent, fl) { setupUi(this); if (!name) setObjectName("toDropTablespace"); else setObjectName(name); } std::list toDropTablespace::sql() { std::list ret; if (IncludingObjectsCheck->isChecked()) { toPush(ret, QString::fromLatin1("INCLUDING CONTENTS ")); if (dataFileCheck->isChecked()) toPush(ret, QString::fromLatin1("AND DATAFILES ")); if (CascadeCheck->isChecked()) toPush(ret, QString::fromLatin1("CASCADE CONSTRAINTS ")); } else toPush(ret, QString::fromLatin1("")); return ret; } toStorageTablespace::toStorageTablespace(QWidget* parent, const char* name, Qt::WFlags fl) : QWidget(parent, fl) { setupUi(this); Modify = false; if (!name) setObjectName("toStorageTablespace"); else setObjectName(name); MinimumExtent->setTitle(tr("&Minimum Extent")); LocalUniform->setTitle(tr("Extent &Size")); LocalUniform->setValue(1024); } void toStorageTablespace::permanentToggle(bool val) { try { if (toCurrentConnection(this).version() >= "08") { emit tempFile(!val && !Dictionary->isChecked()); return ; } if (!val) Dictionary->setChecked(true); LocalAuto->setEnabled(val); LocalSelect->setEnabled(val); } TOCATCH } void toStorageTablespace::dictionaryToggle(bool val) { try { if (toCurrentConnection(this).version() < "08") Permanent->setEnabled(val); else emit tempFile(!Permanent->isChecked() && !val); DefaultStorage->setEnabled(val); emit allowStorage(val); } TOCATCH } void toStorageTablespace::allowDefault(bool val) { LocalAuto->setEnabled(!val); LocalSelect->setEnabled(!val); emit allowStorage(val); } bool toStorageTablespace::allowStorage(void) { return DefaultStorage->isChecked(); } void toStorageTablespace::uniformToggle(bool val) { LocalUniform->setEnabled(val); } std::list toStorageTablespace::sql() { std::list ret; QString str; if (ExtentGroup->isEnabled() && Dictionary->isChecked()) toPush(ret, QString::fromLatin1("MINIMUM EXTENT ") + MinimumExtent->sizeString()); if (Logging->isChecked() != LoggingOrig || !Modify) { if (Logging->isChecked()) str = QString::fromLatin1("LOGGING"); else str = QString::fromLatin1("NOLOGGING"); toPush(ret, str); } if (Online->isChecked() != OnlineOrig || !Modify) { if (Online->isChecked()) str = QString::fromLatin1("ONLINE"); else str = QString::fromLatin1("OFFLINE"); toPush(ret, str); } if (Permanent->isChecked() != PermanentOrig || !Modify) { if (Permanent->isChecked()) str = QString::fromLatin1("PERMANENT"); else str = QString::fromLatin1("TEMPORARY"); toPush(ret, str); } if (ExtentGroup->isEnabled()) { str = QString::fromLatin1("EXTENT MANAGEMENT "); if (Dictionary->isChecked()) str.append(QString::fromLatin1("DICTIONARY")); else { str.append(QString::fromLatin1("LOCAL ")); if (LocalAuto->isChecked()) str.append(QString::fromLatin1("AUTOALLOCATE")); else { str.append(QString::fromLatin1("UNIFORM SIZE ")); str.append(LocalUniform->sizeString()); } } toPush(ret, str); } return ret; } toStorageDatafile::toStorageDatafile(bool temp, bool dispName, QWidget* parent, const char* name, Qt::WFlags fl) : QWidget(parent, fl), Tempfile(temp) { setupUi(this); Modify = false; InitialSizeOrig = NextSizeOrig = MaximumSizeOrig = 0; if (!name) setObjectName("DataFile"); else setObjectName(name); setWindowTitle(tr("Create datafile")); if (!dispName) { Name->hide(); NameLabel->hide(); Filename->setFocus(); } else Name->setFocus(); InitialSize->setTitle(tr("&Size")); NextSize->setTitle(tr("&Next")); MaximumSize->setTitle(tr("&Maximum size")); } std::list toStorageDatafile::sql(void) { std::list ret; if (!Modify) { QString str; if (Tempfile) str = QString::fromLatin1("TEMPFILE '"); else str = QString::fromLatin1("DATAFILE '"); QString filename(Filename->text()); filename.replace(QRegExp(QString::fromLatin1("'")), QString::fromLatin1("''")); str.append(filename); str.append(QString::fromLatin1("' SIZE ")); str.append(InitialSize->sizeString()); str.append(QString::fromLatin1(" REUSE AUTOEXTEND ")); if (AutoExtend->isChecked()) { str.append(QString::fromLatin1("ON NEXT ")); str.append(NextSize->sizeString()); str.append(QString::fromLatin1(" MAXSIZE ")); if (UnlimitedMax->isChecked()) str.append(QString::fromLatin1("UNLIMITED")); else { str.append(MaximumSize->sizeString()); } } else str.append(QString::fromLatin1("OFF")); toPush(ret, str); } else { QString str; if (Filename->text() != FilenameOrig) { str = QString::fromLatin1("RENAME FILE '"); str += FilenameOrig; str += QString::fromLatin1("' TO '"); str += Filename->text(); str += "'"; toPush(ret, str); } if (InitialSize->value() != InitialSizeOrig) { if (Tempfile) str = QString::fromLatin1("TEMPFILE '"); else str = QString::fromLatin1("DATAFILE '"); str += Filename->text(); str += QString::fromLatin1("' RESIZE "); str += InitialSize->sizeString(); toPush(ret, str); } if (Tempfile) str = QString::fromLatin1("TEMPFILE '"); else str = QString::fromLatin1("DATAFILE '"); str += Filename->text(); str += QString::fromLatin1("' AUTOEXTEND "); if (AutoExtend->isChecked()) { str.append(QString::fromLatin1("ON NEXT ")); str.append(NextSize->sizeString()); str.append(QString::fromLatin1(" MAXSIZE ")); if (UnlimitedMax->isChecked()) str.append(QString::fromLatin1("UNLIMITED")); else { str.append(MaximumSize->sizeString()); } } else str.append(QString::fromLatin1("OFF")); toPush(ret, str); } return ret; } void toStorageDatafile::browseFile(void) { QString str = TOFileDialog::getSaveFileName(this, tr("Open Storage File"), Filename->text(), QString::fromLatin1("*.dbf")); if (!str.isEmpty()) Filename->setText(str); } void toStorageDatafile::autoExtend(bool val) { MaximumSize->setEnabled(!UnlimitedMax->isChecked()); UnlimitedMax->setEnabled(val); NextSize->setEnabled(val); } void toStorageDatafile::maximumSize(bool val) { MaximumSize->setEnabled(!val); } QString toStorageDatafile::getName(void) { if (!Name) throw tr("No name available"); return Name->text(); } void toStorageDatafile::valueChanged(const QString &) { if ((Name->isHidden() || !Name->text().isEmpty()) && !Filename->text().isEmpty()) emit validContent(true); else emit validContent(false); } void toStorageDialog::Setup(void) { DialogTab->removeTab(DialogTab->indexOf(DefaultPage)); toHelp::connectDialog(this); } static toSQL SQLTablespaceInfo("toStorage:TablespaceInfo", "SELECT min_extlen/1024,\n" " extent_management,\n" " contents,\n" " logging,\n" " status,\n" " initial_extent/1024,\n" " next_extent/1024,\n" " min_extents,\n" " max_extents,\n" " pct_increase\n" " FROM sys.dba_tablespaces\n" " WHERE tablespace_name = :nam", "Get information about a tablespace for the modify dialog, " "must have same columns and bindings"); toStorageDialog::toStorageDialog(const QString &tablespace, QWidget *parent, bool drop) : QDialog(parent)//, "Storage Dialog", true) { setupUi(this); Setup(); OkButton->setEnabled(false); if (!tablespace.isNull()) { TablespaceOrig = tablespace; if (!drop) { try { toQList result; result = toQuery::readQuery(toCurrentConnection(this), SQLTablespaceInfo, tablespace); if (result.size() != 10) throw tr("Invalid response from query"); toShift(result); QString dict = toShift(result); QString temp = toShift(result); Mode = NewDatafile; setWindowTitle(tr("Add datafile")); Tablespace = NULL; Default = NULL; Drop = NULL; Datafile = new toStorageDatafile(dict != QString::fromLatin1("DICTIONARY") && temp != QString::fromLatin1("PERMANENT") && temp != QString::fromLatin1("UNDO"), false, DialogTab); DialogTab->addTab(Datafile, tr("Datafile")); connect(Datafile, SIGNAL(validContent(bool)), this, SLOT(validContent(bool))); } TOCATCH } else { Mode = DropTablespace; Tablespace = NULL; Default = NULL; Datafile = NULL; Drop = new toDropTablespace(DialogTab); DialogTab->addTab(Datafile, tr("Drop Tablespace")); setWindowTitle(tr("Drop Tablespace")); connect(Drop, SIGNAL(validContent(bool)), this, SLOT(validContent(bool))); emit validContent(true); } } else { Mode = NewTablespace; setWindowTitle(tr("Add tablespace")); Datafile = new toStorageDatafile(false, true, DialogTab); DialogTab->addTab(Datafile, tr("Datafile")); Tablespace = new toStorageTablespace(DialogTab); DialogTab->addTab(Tablespace, tr("Tablespace")); Default = new toStorageDefinition(DialogTab); DialogTab->addTab(Default, tr("Default Storage")); Default->setEnabled(false); connect(Tablespace, SIGNAL(allowStorage(bool)), this, SLOT(allowStorage(bool))); connect(Tablespace, SIGNAL(tempFile(bool)), Datafile, SLOT(setTempFile(bool))); connect(Datafile, SIGNAL(validContent(bool)), this, SLOT(validContent(bool))); } } toStorageDialog::toStorageDialog(toConnection &conn, const QString &tablespace, QWidget *parent) : QDialog(parent)//, "Storage Dialog", true) { setupUi(this); Setup(); try { Mode = ModifyTablespace; Datafile = NULL; Tablespace = new toStorageTablespace(DialogTab); DialogTab->addTab(Tablespace, tr("Tablespace")); Default = new toStorageDefinition(DialogTab); DialogTab->addTab(Default, tr("Default Storage")); connect(Tablespace, SIGNAL(allowStorage(bool)), this, SLOT(allowStorage(bool))); toQList result = toQuery::readQuery(conn, SQLTablespaceInfo, tablespace); if (result.size() != 10) throw tr("Invalid response from query"); Tablespace->MinimumExtent->setValue(toShift(result).toInt()); TablespaceOrig = tablespace; Tablespace->Modify = true; Default->setEnabled(false); if (toShift(result).toString() == "DICTIONARY") Tablespace->Dictionary->setChecked(true); else { Tablespace->DefaultStorage->setEnabled(false); Tablespace->LocalAuto->setChecked(true); } Tablespace->ExtentGroup->setEnabled(false); Tablespace->Permanent->setChecked(toShift(result).toString() == "PERMANENT"); Tablespace->Logging->setChecked(toShift(result).toString() == "LOGGING"); Tablespace->Online->setChecked(toShift(result).toString() == "ONLINE"); Tablespace->OnlineOrig = Tablespace->Online->isChecked(); Tablespace->PermanentOrig = Tablespace->Permanent->isChecked(); Tablespace->LoggingOrig = Tablespace->Logging->isChecked(); Default->InitialSize->setValue(toShift(result).toInt()); Default->NextSize->setValue(toShift(result).toInt()); Default->InitialExtent->setValue(toShift(result).toInt()); int num = toShift(result).toInt(); if (num == 0) Default->UnlimitedExtent->setChecked(true); else Default->MaximumExtent->setValue(num); Default->PCTIncrease->setValue(toShift(result).toInt()); } catch (const QString &str) { toStatusMessage(str); reject(); } } static toSQL SQLDatafileInfo("toStorage:DatafileInfo", "SELECT bytes/1024,\n" " autoextensible,\n" " bytes/blocks*increment_by/1024,\n" " maxbytes/1024\n" " FROM (SELECT bytes,autoextensible,blocks,increment_by,maxbytes,file_name,tablespace_name\n" " FROM sys.dba_data_files\n" " WHERE tablespace_name = :nam\n" " AND file_name = :fil\n" " UNION\n" " SELECT bytes,autoextensible,blocks,increment_by,maxbytes,file_name,tablespace_name\n" " FROM sys.dba_temp_files\n" " WHERE tablespace_name = :nam\n" " AND file_name = :fil)", "Get information about a datafile for the modify dialog, " "must have same columns and bindings", "0801"); static toSQL SQLDatafileInfo8("toStorage:DatafileInfo", "SELECT bytes/1024,\n" " autoextensible,\n" " bytes/blocks*increment_by/1024,\n" " maxbytes/1024\n" " FROM (SELECT * FROM sys.dba_data_files\n" " WHERE tablespace_name = :nam" " AND file_name = :fil)", "", "0800"); toStorageDialog::toStorageDialog(toConnection &conn, const QString &tablespace, const QString &filename, QWidget *parent) : QDialog(parent)//, "Storage Dialog", true) { setupUi(this); Setup(); try { Mode = ModifyDatafile; toQList result; result = toQuery::readQuery(toCurrentConnection(this), SQLTablespaceInfo, tablespace); if (result.size() != 10) throw tr("Invalid response from query"); toShift(result); QString dict = toShift(result); QString temp = toShift(result); Datafile = new toStorageDatafile(dict != QString::fromLatin1("DICTIONARY") && temp != QString::fromLatin1("PERMANENT") && temp != QString::fromLatin1("UNDO"), true, DialogTab); DialogTab->addTab(Datafile, tr("Datafile")); setWindowTitle(tr("Modify datafile")); Tablespace = NULL; Default = NULL; result = toQuery::readQuery(conn, SQLDatafileInfo, tablespace, filename); if (result.size() != 4) throw tr("Invalid response from query (Wanted 4, got %1 entries) for %2.%3"). arg(result.size()).arg(tablespace).arg(filename); Datafile->Name->setText(tablespace); Datafile->Name->setEnabled(false); Datafile->Modify = true; Datafile->FilenameOrig = filename; Datafile->Filename->setText(filename); Datafile->InitialSize->setValue(Datafile->InitialSizeOrig = toShift(result).toInt()); if (!(toShift(result) == QString::fromLatin1("NO"))) { Datafile->AutoExtend->setChecked(true); Datafile->NextSize->setValue(Datafile->NextSizeOrig = toShift(result).toInt()); } else { Datafile->NextSizeOrig = 0; } int num = toShift(result).toInt(); if (num == 0) { Datafile->UnlimitedMax->setChecked(true); Datafile->MaximumSize->setEnabled(false); } else { Datafile->UnlimitedMax->setChecked(false); Datafile->MaximumSize->setValue(num); } Datafile->MaximumSizeOrig = num; } catch (const QString &str) { toStatusMessage(str); reject(); } } void toStorageDialog::validContent(bool val) { OkButton->setEnabled(val); } void toStorageDialog::allowStorage(bool val) { Default->setEnabled(val); } void toStorageDialog::displaySQL(void) { std::list lines = sql(); QString res; for (std::list::iterator i = lines.begin();i != lines.end();i++) { res += *i; res += QString::fromLatin1(";\n"); } if (res.length() > 0) { toMemoEditor memo(this, res, -1, -1, true, true); memo.exec(); } else toStatusMessage(tr("No changes made")); } std::list toStorageDialog::sql(void) { try { std::list ret; switch (Mode) { case DropTablespace: { QString start = QString::fromLatin1("DROP TABLESPACE \""); start += TablespaceOrig; start += QString::fromLatin1("\" "); if (Drop) { std::list lst = Drop->sql(); for (std::list::iterator i = lst.begin();i != lst.end();i++) { start += QString::fromLatin1(" "); start += *i; } } toPush(ret, start); } break; case ModifyDatafile: { QString start = QString::fromLatin1("ALTER DATABASE "); std::list lst = Datafile->sql(); for (std::list::iterator i = lst.begin();i != lst.end();i++) { QString t = start; t += *i; toPush(ret, t); } } break; case ModifyTablespace: { QString start = QString::fromLatin1("ALTER TABLESPACE \""); start += TablespaceOrig; start += QString::fromLatin1("\" "); std::list lst = Tablespace->sql(); for (std::list::iterator i = lst.begin();i != lst.end();i++) { QString t = start; t += *i; toPush(ret, t); } if (Tablespace->allowStorage()) { start += QString::fromLatin1("DEFAULT "); std::list lst = Default->sql(); for (std::list::iterator i = lst.begin();i != lst.end();i++) { QString t = start; t += *i; toPush(ret, t); } } } break; case NewDatafile: { QString start = QString::fromLatin1("ALTER TABLESPACE \""); start += TablespaceOrig; start += QString::fromLatin1("\" ADD "); std::list lst = Datafile->sql(); for (std::list::iterator i = lst.begin();i != lst.end();i++) { start += QString::fromLatin1(" "); start += *i; } toPush(ret, start); } break; case NewTablespace: { QString start = QString::fromLatin1("CREATE TABLESPACE \""); start += Datafile->getName().toUpper(); start += QString::fromLatin1("\" "); std::list lst = Datafile->sql(); { for (std::list::iterator i = lst.begin();i != lst.end();i++) { start += QString::fromLatin1(" "); start += *i; } } lst = Tablespace->sql(); for (std::list::iterator i = lst.begin();i != lst.end();i++) { start += QString::fromLatin1(" "); start += *i; } if (Tablespace->allowStorage()) { start += QString::fromLatin1(" DEFAULT"); lst = Default->sql(); for (std::list::iterator i = lst.begin();i != lst.end();i++) { start += QString::fromLatin1(" "); start += *i; } } toPush(ret, start); } } return ret; } catch (const QString &str) { toStatusMessage(str); std::list ret; return ret; } } static toStorageTool StorageTool; toStorage::toStorage(QWidget *main, toConnection &connection) : toToolWidget(StorageTool, "storage.html", main, connection, "toStorage") { QToolBar *toolbar = toAllocBar(this, tr("Storage manager")); layout()->addWidget(toolbar); UpdateAct = new QAction(QPixmap(const_cast(refresh_xpm)), tr("Update"), this); connect(UpdateAct, SIGNAL(triggered()), this, SLOT(refresh())); UpdateAct->setShortcut(QKeySequence::Refresh); toolbar->addAction(UpdateAct); toolbar->addSeparator(); ExtentAct = new QAction(QPixmap(const_cast(storageextents_xpm)), tr("Show extent view."), this); ExtentAct->setCheckable(true); bool extents = toConfigurationSingle::Instance().dispExtents(); if (extents) ExtentAct->setChecked(true); toolbar->addAction(ExtentAct); connect(ExtentAct, SIGNAL(toggled(bool)), this, SLOT(showExtent(bool))); ExtentAct->setToolTip(tr("Show extent view.")); TablespaceAct = new QAction(QPixmap(const_cast(tostorage_xpm)), tr("Show tablespaces or just datafiles."), this); TablespaceAct->setCheckable(true); bool tablespaces = toConfigurationSingle::Instance().dispTablespaces(); if (tablespaces) TablespaceAct->setChecked(true); toolbar->addAction(TablespaceAct); connect(TablespaceAct, SIGNAL(toggled(bool)), this, SLOT(showTablespaces(bool))); TablespaceAct->setToolTip(tr("Show tablespaces or just datafiles.")); toolbar->addSeparator(); OnlineAct = new QAction(QPixmap(const_cast(online_xpm)), tr("Take tablespace online"), this); connect(OnlineAct, SIGNAL(triggered()), this, SLOT(online(void))); toolbar->addAction(OnlineAct); OfflineAct = new QAction(QPixmap(const_cast(offline_xpm)), tr("Take tablespace offline"), this); connect(OfflineAct, SIGNAL(triggered()), this, SLOT(offline(void))); toolbar->addAction(OfflineAct); toolbar->addSeparator(); LoggingAct = new QAction(QPixmap(const_cast(logging_xpm)), tr("Set tablespace default to logging"), this); connect(LoggingAct, SIGNAL(triggered()), this, SLOT(logging(void))); toolbar->addAction(LoggingAct); EraseLogAct = new QAction(QPixmap(const_cast(eraselog_xpm)), tr("Set tablespace default to no logging"), this); connect(EraseLogAct, SIGNAL(triggered()), this, SLOT(noLogging(void))); toolbar->addAction(EraseLogAct); toolbar->addSeparator(); ReadWriteAct = new QAction(QPixmap(const_cast(writetablespace_xpm)), tr("Allow read write access to tablespace"), this); connect(ReadWriteAct, SIGNAL(triggered()), this, SLOT(readWrite(void))); toolbar->addAction(ReadWriteAct); ReadOnlyAct = new QAction(QPixmap(const_cast(readtablespace_xpm)), tr("Set tablespace to read only"), this); connect(ReadOnlyAct, SIGNAL(triggered()), this, SLOT(readOnly(void))); toolbar->addAction(ReadOnlyAct); toolbar->addSeparator(); ModTablespaceAct = new QAction(QPixmap(const_cast(modtablespace_xpm)), tr("Modify tablespace"), this); connect(ModTablespaceAct, SIGNAL(triggered()), this, SLOT(modifyTablespace(void))); toolbar->addAction(ModTablespaceAct); DropTablespaceAct = new QAction(QPixmap(const_cast(droptablespace_xpm)), tr("Drop tablespace"), this); connect(DropTablespaceAct, SIGNAL(triggered()), this, SLOT(dropTablespace(void))); toolbar->addAction(DropTablespaceAct); ModFileAct = new QAction(QPixmap(const_cast(modfile_xpm)), tr("Modify file"), this); connect(ModFileAct, SIGNAL(triggered()), this, SLOT(modifyDatafile(void))); toolbar->addAction(ModFileAct); toolbar->addSeparator(); CreateTablespaceAct = new QAction(QPixmap(const_cast(addtablespace_xpm)), tr("Create new tablespace"), this); connect(CreateTablespaceAct, SIGNAL(triggered()), this, SLOT(newTablespace(void))); toolbar->addAction(CreateTablespaceAct); NewFileAct = new QAction(QPixmap(const_cast(addfile_xpm)), tr("Add datafile to tablespace"), this); connect(NewFileAct, SIGNAL(triggered()), this, SLOT(newDatafile(void))); toolbar->addAction(NewFileAct); toolbar->addSeparator(); CoalesceAct = new QAction(QPixmap(const_cast(coalesce_xpm)), tr("Coalesce tablespace"), this); connect(CoalesceAct, SIGNAL(triggered()), this, SLOT(coalesce(void))); toolbar->addAction(CoalesceAct); MoveFileAct = new QAction(QPixmap(const_cast(movefile_xpm)), tr("Move datafile"), this); connect(MoveFileAct, SIGNAL(triggered()), this, SLOT(moveFile(void))); toolbar->addAction(MoveFileAct); toolbar->addWidget(new toSpacer()); new toChangeConnection(toolbar, TO_TOOLBAR_WIDGET_NAME); QSplitter *splitter = new QSplitter(Qt::Vertical, this); splitter->setChildrenCollapsible(false); layout()->addWidget(splitter); Storage = new toResultStorage(toConfigurationSingle::Instance().dispAvailableGraph(), splitter); ExtentParent = new QSplitter(Qt::Horizontal, splitter); Objects = new QTableView(ExtentParent); ObjectsModel = new toStorageObjectModel(this); QSortFilterProxyModel * proxyModel = new QSortFilterProxyModel(this); proxyModel->setSourceModel(ObjectsModel); Objects->setModel(proxyModel); Objects->setSortingEnabled(true); Objects->setSelectionBehavior(QAbstractItemView::SelectRows); Objects->setSelectionMode(QAbstractItemView::SingleSelection); Extents = new toStorageExtent(ExtentParent); Storage->setSelectionMode(toTreeWidget::Single); connect(Objects->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(selectObject(const QModelIndex &, const QModelIndex &))); if (!extents) ExtentParent->hide(); if (!tablespaces) Storage->setOnlyFiles(true); connect(Storage, SIGNAL(selectionChanged(void)), this, SLOT(selectionChanged(void))); ToolMenu = NULL; connect(toMainWidget()->workspace(), SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(windowActivated(QMdiSubWindow *))); refresh(); selectionChanged(); setFocusProxy(Storage); } void toStorage::windowActivated(QMdiSubWindow *widget) { if (!widget) return; if (widget->widget() == this) { if (!ToolMenu) { ToolMenu = new QMenu(tr("&Storage"), this); ToolMenu->addAction(UpdateAct); ToolMenu->addSeparator(); ToolMenu->addAction(OnlineAct); ToolMenu->addAction(OfflineAct); ToolMenu->addSeparator(); ToolMenu->addAction(LoggingAct); ToolMenu->addAction(EraseLogAct); ToolMenu->addSeparator(); ToolMenu->addAction(ReadWriteAct); ToolMenu->addAction(ReadOnlyAct); ToolMenu->addSeparator(); ToolMenu->addAction(DropTablespaceAct); ToolMenu->addAction(ModTablespaceAct); ToolMenu->addAction(ModFileAct); ToolMenu->addAction(NewFileAct); ToolMenu->addSeparator(); ToolMenu->addAction(CoalesceAct); ToolMenu->addAction(MoveFileAct); toMainWidget()->addCustomMenu(ToolMenu); } } else { delete ToolMenu; ToolMenu = NULL; } } void toStorage::refresh(void) { Storage->showCoalesced(toConfigurationSingle::Instance().dispCoalesced()); Storage->query(); } void toStorage::coalesce(void) { try { QString str; str = QString::fromLatin1("ALTER TABLESPACE \""); str.append(Storage->currentTablespace()); str.append(QString::fromLatin1("\" COALESCE")); connection().execute(str); refresh(); } TOCATCH } void toStorage::online(void) { try { QString str; str = QString::fromLatin1("ALTER TABLESPACE \""); str.append(Storage->currentTablespace()); str.append(QString::fromLatin1("\" ONLINE")); connection().execute(str); refresh(); } TOCATCH } void toStorage::logging(void) { try { QString str; str = QString::fromLatin1("ALTER TABLESPACE \""); str.append(Storage->currentTablespace()); str.append(QString::fromLatin1("\" LOGGING")); connection().execute(str); refresh(); } TOCATCH } void toStorage::noLogging(void) { try { QString str; str = QString::fromLatin1("ALTER TABLESPACE \""); str.append(Storage->currentTablespace()); str.append(QString::fromLatin1("\" NOLOGGING")); connection().execute(str); refresh(); } TOCATCH } void toStorage::readOnly(void) { try { QString str; str = QString::fromLatin1("ALTER TABLESPACE \""); ; str.append(Storage->currentTablespace()); str.append(QString::fromLatin1("\" READ ONLY")); connection().execute(str); refresh(); } TOCATCH } void toStorage::readWrite(void) { try { QString str; str = QString::fromLatin1("ALTER TABLESPACE \""); str.append(Storage->currentTablespace()); str.append(QString::fromLatin1("\" READ WRITE")); connection().execute(str); refresh(); } TOCATCH } void toStorage::offline(void) { try { QString reason; QString dsc = tr("Select mode to take tablespace %1 offline.").arg(Storage->currentTablespace()); switch (TOMessageBox::information(this, tr("Tablespace offline"), dsc, tr("Normal"), tr("Temporary"), tr("Cancel"))) { case 0: reason = QString::fromLatin1("NORMAL"); break; case 1: reason = QString::fromLatin1("TEMPORARY"); break; default: return ; } QString str; str = QString::fromLatin1("ALTER TABLESPACE \""); str.append(Storage->currentTablespace()); str.append(QString::fromLatin1("\" OFFLINE ")); str.append(reason); connection().execute(str); refresh(); } TOCATCH } void toStorage::selectionChanged(void) { OfflineAct->setEnabled(false); OnlineAct->setEnabled(false); CoalesceAct->setEnabled(false); LoggingAct->setEnabled(false); EraseLogAct->setEnabled(false); ModTablespaceAct->setEnabled(false); DropTablespaceAct->setEnabled(false); NewFileAct->setEnabled(false); MoveFileAct->setEnabled(false); ModFileAct->setEnabled(false); ReadOnlyAct->setEnabled(false); ReadWriteAct->setEnabled(false); toTreeWidgetItem *item = Storage->selectedItem(); if (item) { if (item->parent() || Storage->onlyFiles()) { if (!ExtentParent->isHidden()) Extents->setFile(item->text(12), item->text(13).toInt()); item = item->parent(); MoveFileAct->setEnabled(true); ModFileAct->setEnabled(true); } else if (!ExtentParent->isHidden()) Extents->setTablespace(item->text(0)); if (!ExtentParent->isHidden()) { ObjectsModel->setValues(Extents->objects()); Objects->resizeColumnsToContents(); Objects->resizeRowsToContents(); } if (item) { toTreeWidgetItem *child = item->firstChild(); if (!child) { OnlineAct->setEnabled(true); OfflineAct->setEnabled(true); ReadWriteAct->setEnabled(true); ReadOnlyAct->setEnabled(true); } else { if (child->text(1) == QString::fromLatin1("OFFLINE")) OnlineAct->setEnabled(true); else if (child->text(1) == QString::fromLatin1("ONLINE")) { OfflineAct->setEnabled(true); if (child->text(2) == QString::fromLatin1("READ ONLY")) ReadWriteAct->setEnabled(true); else ReadOnlyAct->setEnabled(true); } } if (item->text(4) == QString::fromLatin1("LOGGING")) EraseLogAct->setEnabled(true); else LoggingAct->setEnabled(true); if (item->text(10) != QString::fromLatin1("100%")) CoalesceAct->setEnabled(true); } NewFileAct->setEnabled(true); ModTablespaceAct->setEnabled(true); DropTablespaceAct->setEnabled(true); } if (ToolMenu) { #if 0 // todo ToolMenu->setItemEnabled(TO_ID_ONLINE, OnlineButton->isEnabled()); ToolMenu->setItemEnabled(TO_ID_OFFLINE, OfflineButton->isEnabled()); ToolMenu->setItemEnabled(TO_ID_LOGGING, LoggingButton->isEnabled()); ToolMenu->setItemEnabled(TO_ID_NOLOGGING, EraseLogButton->isEnabled()); ToolMenu->setItemEnabled(TO_ID_READ_WRITE, ReadWriteButton->isEnabled()); ToolMenu->setItemEnabled(TO_ID_READ_ONLY, ReadOnlyButton->isEnabled()); ToolMenu->setItemEnabled(TO_ID_MODIFY_TABLESPACE, ModTablespaceButton->isEnabled()); ToolMenu->setItemEnabled(TO_ID_DROP_TABLESPACE, DropTablespaceButton->isEnabled()); ToolMenu->setItemEnabled(TO_ID_MODIFY_DATAFILE, ModFileButton->isEnabled()); ToolMenu->setItemEnabled(TO_ID_ADD_DATAFILE, NewFileButton->isEnabled()); ToolMenu->setItemEnabled(TO_ID_COALESCE, CoalesceButton->isEnabled()); ToolMenu->setItemEnabled(TO_ID_MOVE_FILE, MoveFileButton->isEnabled()); #endif } } void toStorage::newDatafile(void) { try { toStorageDialog newFile(Storage->currentTablespace(), this); if (newFile.exec()) { std::list lst = newFile.sql(); for (std::list::iterator i = lst.begin();i != lst.end();i++) connection().execute(*i); refresh(); } } TOCATCH } void toStorage::newTablespace(void) { try { toStorageDialog newSpace(QString::null, this); if (newSpace.exec()) { std::list lst = newSpace.sql(); for (std::list::iterator i = lst.begin();i != lst.end();i++) connection().execute(*i); refresh(); } } TOCATCH } void toStorage::dropTablespace(void) { try { toStorageDialog dropSpace(Storage->currentTablespace(), this, true); if (dropSpace.exec()) { std::list lst = dropSpace.sql(); for (std::list::iterator i = lst.begin();i != lst.end();i++) connection().execute(*i); refresh(); } } TOCATCH } void toStorage::modifyTablespace(void) { try { toStorageDialog modifySpace(connection(), Storage->currentTablespace(), this); if (modifySpace.exec()) { std::list lst = modifySpace.sql(); for (std::list::iterator i = lst.begin();i != lst.end();i++) connection().execute(*i); refresh(); } } TOCATCH } void toStorage::modifyDatafile(void) { try { toStorageDialog modifySpace(connection(), Storage->currentTablespace(), Storage->currentFilename(), this); if (modifySpace.exec()) { std::list lst = modifySpace.sql(); for (std::list::iterator i = lst.begin();i != lst.end();i++) connection().execute(*i); refresh(); } } TOCATCH } void toStorage::moveFile(void) { try { QString orig = Storage->currentFilename(); QString file = TOFileDialog::getSaveFileName(this, tr("Rename Data File"), orig, QString::fromLatin1("*.dbf")); if (!file.isEmpty() && file != orig) { QString str; str = QString::fromLatin1("ALTER TABLESPACE \""); str.append(Storage->currentTablespace()); str.append(QString::fromLatin1("\" RENAME DATAFILE '")); orig.replace(QRegExp(QString::fromLatin1("'")), QString::fromLatin1("''")); file.replace(QRegExp(QString::fromLatin1("'")), QString::fromLatin1("''")); str.append(orig); str.append(QString::fromLatin1("' TO '")); str.append(file); str.append(QString::fromLatin1("'")); connection().execute(str); refresh(); } } TOCATCH } void toStorage::selectObject(const QModelIndex & current, const QModelIndex &) { QModelIndex ix = current; if (ix.isValid()) { // toStorageExtent::extentTotal ce = ObjectsModel->values().at(ix.row()); toStorageExtent::extentTotal ce = ObjectsModel->values().at( ix.model()->headerData(ix.row(), Qt::Vertical).toInt()-1); Extents->highlight(ce.Owner, ce.Table, ce.Partition); } } void toStorage::showExtent(bool ena) { if (ena) { ExtentParent->show(); selectionChanged(); } else { ExtentParent->hide(); } } void toStorage::showTablespaces(bool tab) { Storage->setOnlyFiles(!tab); } toStorageObjectModel::toStorageObjectModel(QObject * parent) : QAbstractTableModel(parent) { m_values.clear(); HeaderData << tr("Owner") << tr("Segment") << tr("Partition") << tr("Extents") << tr("Blocks"); } toStorageObjectModel::~toStorageObjectModel() { } void toStorageObjectModel::setValues(std::list values) { m_values.clear(); for (std::list::iterator i = values.begin();i != values.end(); ++i) m_values.append((*i)); reset(); } int toStorageObjectModel::rowCount(const QModelIndex & parent) const { return m_values.size(); } int toStorageObjectModel::columnCount(const QModelIndex & parent) const { return 5; } QVariant toStorageObjectModel::data(const QModelIndex & index, int role) const { if (!index.isValid()) return QVariant(); if (role == Qt::TextAlignmentRole) { if (index.column() == 3 || index.column() == 4) return Qt::AlignRight; else return Qt::AlignLeft; } if (role == Qt::DisplayRole) { toStorageExtent::extentTotal e = m_values.at(index.row()); switch (index.column()) { case 0: return e.Owner; break; case 1: return e.Table; break; case 2: return e.Partition; break; case 3: return e.Extents; break; case 4: return e.Size; break; default: return "Never should go here"; }; }; // safe return return QVariant(); } Qt::ItemFlags toStorageObjectModel::flags(const QModelIndex & index) const { return Qt::ItemIsSelectable | Qt::ItemIsEnabled; } QVariant toStorageObjectModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); if (orientation == Qt::Horizontal) return HeaderData.at(section); else return QString("%1").arg(section + 1); } tora-2.1.3/src/tobrowsercodewidget.cpp0000644000175000017500000001530111363402747017637 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "toresultdepend.h" #include "toresultextract.h" #include "toresultfield.h" #include "toresultgrants.h" #include "utils.h" #include "tobrowsercodewidget.h" // PostgreSQL does not distinguish between Head and Body for Stored SQL // package code will be returnd for both Head and Body static toSQL SQLSQLHeadPgSQL("toBrowser:CodeHead", "SELECT p.prosrc\n" "FROM pg_proc p LEFT OUTER JOIN pg_namespace n ON p.pronamespace=n.oid\n" "WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" " AND p.proname = :f2\n", "Declaration of object", "7.1", "PostgreSQL"); static toSQL SQLSQLHead("toBrowser:CodeHead", "SELECT Text FROM SYS.ALL_SOURCE\n" " WHERE Owner = :f1 AND Name = :f2\n" " AND Type IN ('PACKAGE','TYPE')", ""); static toSQL SQLSQLBodyPgSQL("toBrowser:CodeBody", "SELECT 'CREATE OR REPLACE FUNCTION ' || p.proname || ' ( ' ||\n" "( SELECT array_to_string ( ARRAY ( SELECT t.typname\n" " FROM pg_type t\n" " WHERE t.OID = ANY ( p.proargtypes ) ),\n" " ', ' ) ) || ' ) RETURNS ' || ( SELECT t.typname\n" " from pg_type t\n" " where p.prorettype = t.oid) ||\n" " ' AS ' || quote_literal ( p.prosrc ) || ' language plpgsql;'\n" " FROM pg_proc p\n" " LEFT OUTER JOIN pg_namespace n\n" " ON p.pronamespace = n.OID\n" " WHERE ( n.nspname = :f1 OR n.OID IS NULL )\n" " AND p.proname = :f2", "Implementation of object", "7.1", "PostgreSQL"); static toSQL SQLSQLBody("toBrowser:CodeBody", "SELECT Text FROM SYS.ALL_SOURCE\n" " WHERE Owner = :f1 AND Name = :f2\n" " AND Type IN ('PROCEDURE','FUNCTION','PACKAGE BODY','TYPE BODY')", ""); // Fetching from routine_definition table is not enough as it does not return information about // routine arguments, return type etc. /*static toSQL SQLSQLBodyMySQL("toBrowser:CodeBody", "select routine_definition from information_schema.routines\n" " where routine_schema = :f1 and routine_name = :f2", "", "5.0", "MySQL");*/ // NOTE! MySQL query has an additional argument :f1 which should be set to 'FUNCTION' or 'PROCEDURE'! static toSQL SQLSQLBodyMySQL("toBrowser:CodeBody", "show create :f3 `:f1`.`:f2`;", "", "5.0", "MySQL"); toBrowserCodeWidget::toBrowserCodeWidget(QWidget * parent) : toBrowserBaseWidget(parent) { setObjectName("toBrowserCodeWidget"); declarationResult = new toResultField(this); declarationResult->setObjectName("declarationResult"); declarationResult->setSQL(SQLSQLHead); bodyResult = new toResultField(this); bodyResult->setObjectName("bodyResult"); bodyResult->setSQL(SQLSQLBody); toConnection & c = toCurrentConnection(this); if (toIsMySQL(c)) // For MySQL we need value from third column. As it is not a query which is fetching // routine creation script - particular field cannot be specified (or I do not know // how to do it). Therefore we need this workaround. bodyResult->setWhichResultField(3); grantsView = new toResultGrants(this); grantsView->setObjectName("grantsView"); dependsWidget = new toResultDepend(this, "dependsWidget"); // dependsWidget->setObjectName("dependsWidget"); extractView = new toResultExtract(true, this); extractView->setObjectName("extractView"); changeConnection(); } void toBrowserCodeWidget::changeConnection() { toBrowserBaseWidget::changeConnection(); toConnection & c = toCurrentConnection(this); if (toIsOracle(c)) addTab(declarationResult, "&Declaration"); else declarationResult->hide(); addTab(bodyResult, "B&ody"); if (toIsOracle(c) || toIsSapDB(c)) addTab(grantsView, "&Grants"); else grantsView->hide(); if (toIsOracle(c)) { addTab(dependsWidget, "De&pendencies"); addTab(extractView, "Script"); } else { dependsWidget->hide(); extractView->hide(); } } tora-2.1.3/src/tonewconnection.h0000644000175000017500000001310611402451646016430 0ustar michaelmichael/* -*- Mode: C++ -*- */ /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TONEWCONNECTION_H #define TONEWCONNECTION_H #include "config.h" #include "ui_tonewconnectionui.h" #include "tohelp.h" #include "toconnection.h" #include #include #include #include class toConnection; class toConnectionModel; class QSortFilterProxyModel; class QMenu; /** * Simple class for storing connection options and comparisons. * */ class toConnectionOptions { public: QString provider; QString host; QString database; QString username; QString password; int port; QString schema; QString color; std::set options; // must have for qmap toConnectionOptions() { } toConnectionOptions(const QString &_prov, const QString &_host, const QString &_data, const QString &_user, const QString &_pass, const QString &_schema, const QString &_color, int _port, std::set _options) { provider = _prov; host = _host; database = _data; username = _user; password = _pass; schema = _schema; color = _color; port = _port; options = _options; } bool operator==(const toConnectionOptions &other) { return provider == other.provider && host == other.host && database == other.database && username == other.username && schema == other.schema; } bool operator==(const toConnection &conn) { return conn.user() == username && conn.provider() == provider && conn.host() == host + ":" + QString::number(port) && conn.database() == database && (schema.isEmpty() || (conn.schema() == schema)); } bool operator!=(const toConnectionOptions &other) { return !operator==(other); } }; class toNewConnection : public QDialog, public Ui::toNewConnectionUI, public toHelpContext { Q_OBJECT; private: QSettings Settings; // provider's default port int DefaultPort; QMenu *PreviousContext; // connection created by dialog toConnection *NewConnection; QString realProvider(void); void readSettings(void); void writeSettings(bool checkHistory = false); int findHistory(const QString &provider, const QString &username, const QString &host, const QString &database, const QString &schema, const QString &color, int port); // fills form with data from previous connection at param row void loadPrevious(const QModelIndex & current); toConnection* makeConnection(bool savePrefs); public slots: virtual void done(int r); public: toNewConnection(QWidget* parent = 0, Qt::WFlags fl = 0); toConnection* connection() { return NewConnection; } static const QString ORACLE_INSTANT; static const QString ORACLE_TNS; static toConnectionModel* connectionModel(void); static QSortFilterProxyModel* proxyModel(void); private slots: /** * Handles selection changes in Previous. On selecting a new row, * will load details from history. * */ void previousCellChanged(const QModelIndex & current); void previousMenu(const QPoint &pos); void historyDelete(void); void changeProvider(int current); void changeHost(void); void importButton_clicked(void); void searchEdit_textEdited(const QString & text); void testConnectionButton_clicked(); }; #endif // TONEWCONNECTION_H tora-2.1.3/src/tobrowsertriggerwidget.h0000644000175000017500000000466411270353625020044 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBROWSERTRIGGERWIDGET_H #define TOBROWSERTRIGGERWIDGET_H #include "tobrowserbasewidget.h" class toResultItem; class toResultField; class toResultCols; class toResultGrants; class toResultDepend; class toResultExtract; /*! \brief Trigger browser for toBrowser tool. See toBrowserBaseWidget for more info. \author Petr Vanek */ class toBrowserTriggerWidget : public toBrowserBaseWidget { Q_OBJECT toResultItem *infoView; toResultField *codeView; toResultCols *columnsWidget; toResultGrants *grantsView; toResultDepend *dependView; toResultExtract *extractView; public: toBrowserTriggerWidget(QWidget * parent); void changeConnection(); }; #endif tora-2.1.3/src/toresultdatasingle.h0000644000175000017500000000506611270353625017140 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTDATASINGLE_H #define TORESULTDATASINGLE_H #include "config.h" #include "toresultmodel.h" #include #include #include class QScrollArea; class QCheckBox; class QLineEdit; /** * This widget is used for single record view in the content editor. * */ class toResultDataSingle : public QWidget { Q_OBJECT; int Row; QScrollArea *Container; QList Null; QList Value; QPointer Model; public: toResultDataSingle(QWidget *parent); void changeSource(toResultModel *, int row); void changeRow(int row); inline int currentRow(void) const { return Row; } private slots: virtual void showMemo(int col); void saveRow(void); void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); }; #endif tora-2.1.3/src/tobrowserdirectorieswidget.cpp0000644000175000017500000000542211415711657021245 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "toresulttableview.h" #include "utils.h" #include "tobrowserdirectorieswidget.h" static toSQL SQLDirectoriesInfo("toBrowser:DirectoriesInformation", "SELECT * FROM sys.all_directories\n" " WHERE directory_name = :f1\n" " ORDER BY owner, directory_name", "Display information about directories by name"); toBrowserDirectoriesWidget::toBrowserDirectoriesWidget(QWidget * parent) : toBrowserBaseWidget(parent) { setObjectName("toBrowserDirectoriesWidget"); directoriesView = new toResultTableView(this); directoriesView->setObjectName("directoriesView"); directoriesView->setSQL(SQLDirectoriesInfo); changeConnection(); } void toBrowserDirectoriesWidget::changeConnection() { toBrowserBaseWidget::changeConnection(); toConnection & c = toCurrentConnection(this); if (toIsOracle(c)) { addTab(directoriesView, "&Directories"); } else { directoriesView->setVisible(false); } } tora-2.1.3/src/tobrowsertable.h0000644000175000017500000000774711310250265016260 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBROWSERTABLE_H #define TOBROWSERTABLE_H #include "config.h" #include "ui_tobrowsertableui.h" #include "toextract.h" #include "totool.h" #include #include class toConnection; class toDatatype; class QGridLayout; class QLineEdit; class toBrowserTable : public QDialog, public Ui::toBrowserTableUI, public toConnectionWidget { private: Q_OBJECT; QString Owner; QString Table; toExtract Extractor; std::list Columns; std::list OriginalDescription; QWidget *ColumnGrid; QGridLayout *ColumnGridLayout; int ColumnNumber; // lists pointers to all widgets containing column data std::list ColumnNames; std::list Datatypes; std::list NotNulls; std::list Defaults; std::list Comments; // std::list Extra; // not sure if this still needed as it was // split into NotNull and DefaultValue bool tablespaceSpecified; // indicates if original description of table // has tablespace specified in description toBrowserTable(toConnection &conn, const QString &owner, const QString &table, QWidget *parent, const char *name = NULL); void addParameters(std::list &migrateTable, const std::list &ctx, const QString &type, const QString &data); QString sql(void); protected: virtual void resizeEvent(QResizeEvent *e); public slots: virtual void done(int r); public: static void editTable(toConnection &conn, const QString &owner, const QString &table, QWidget *parent); static void newTable(toConnection &conn, const QString &owner, QWidget *parent) { editTable(conn, owner, QString::null, parent); } public slots: virtual void displaySQL(); virtual void addColumn(); virtual void removeColumn(); virtual void toggleCustom(bool); private: bool UglyFlag; toConnection * cnct; private slots: virtual void uglyWorkaround(); }; #endif tora-2.1.3/src/tohelpaddfileui.ui0000644000175000017500000001116111270353625016544 0ustar michaelmichael toHelpAddFileUI 0 0 434 164 Add help directory 11 11 11 11 6 6 &Browse Qt::Horizontal QSizePolicy::Expanding 20 20 Cancel &Ok true &Table of contents file false Root &Title false Root Root Filename Browse OkButton PushButton2_2 OkButton clicked() toHelpAddFileUI accept() 20 20 20 20 PushButton2_2 clicked() toHelpAddFileUI reject() 20 20 20 20 Browse clicked() toHelpAddFileUI browse() 20 20 20 20 Root textChanged(QString) toHelpAddFileUI valid() 20 20 20 20 Filename textChanged(QString) toHelpAddFileUI valid() 20 20 20 20 tora-2.1.3/src/tohtml.h0000644000175000017500000001323111270353625014523 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOHTML_H #define TOHTML_H #include "config.h" #include #include #define TO_HTML_MAX_QUAL 100 /** A small and hopefully pretty efficient parser of HTML tags. No attempt what * so ever is made trying to check the validity of the text so if you forget * a closing > you will probably end up with an exception. * * A simple traverser counting the number of paragraphs might look like this. *
int paragraphs++;
toHtml count("Paragraphs

And some

Dobedoo"); while(!count.eof()) { count.nextToken(); if (count.isTag()&&count.open()&&QString(count.tag())=="p") paragraphs++; }

*/ class QChar; class toHtml { /** Actual data of file. */ QString Data; /** Length of the data. */ int Length; /** Current position in data. */ int Position; /** Last character that was at the end of text written over by call to @ref mid. * This is a real cludge, but what don't you do for performance. */ QChar LastChar; /** List of qualifiers for tab. This is not a list because of performance as well. * Not really a lot of memory wasted this way, in fact it is probably more efficient * than a dynamic list. */ struct { /** Name of qualifier. Always lowercase, points into @ref Data. */ QString Name; /** Value of qualifier. Points into @ref Data. */ QString Value; } Qualifiers[TO_HTML_MAX_QUAL]; /** Number of qualifiers used. */ int QualifierNum; /** If last token read was a tag or plain text. */ bool IsTag; /** Last tag read was an open tag. Only valid if @ref isTag is true. */ bool Open; /** Name of tag. NULL terminated, points into @ref Data. */ QString Tag; /** Text if not tag. NULL terminated, points into @ref Data. */ QString Text; /** Walk forward in @ref Data until not whitespace. */ void skipSpace(void); /** Extract a string from @ref Data. Insert 0 at end of string, store overwritten char * in LastChar. * @param start Start position of string to extract. * @param size Size of string to extract. * @return Pointer to string (Points into @ref Data) */ QString mid(int start, int size); public: /** Create a HTML parser. * @param data Data to parse. */ toHtml(const QString &data); ~toHtml(); /** Read the next token which can be either a open tag, close tag or text. * * Observe that nextToken destroys the data it has parsed, so you * can't search it later. Searhing must be done on an new toHtml, * several serches can be made though on the same toHtml. */ void nextToken(void); /** Get value of a qualifier. * @param name Name of qualifier in lowercase. * @return Value of qualifier or NULL. */ QString value(const QString &name); /** Return true if current token is a tag. * @return True if tag. */ bool isTag(void) { return IsTag; } /** Return true if open tag. Only valid if @ref isTag is true. * @return True if open tag. */ bool open(void) { return Open; } /** Get bread text if available. Expands &# characters are expanded before returned. * Only valid if @ref isTag returns false. * @return The parsed text. */ QString text(void); /** Get name of tag in lowercase. Only valid if @ref isTag returns true. * @return Name of tag (Excluding / if close tag). */ QString tag(void) { return Tag; } /** Check if at end of data * @return True if at end of data. */ bool eof(void); /** Search data for a simple text. * @param data Data to search. * @param str Substring to search for in data. */ static bool search(const QString &data, const QString &str); /** Escape text to be HTML. */ static QString escape(const QString &html); }; #endif tora-2.1.3/src/totabwidget.h0000644000175000017500000000654211270353625015540 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOTABWIDGET_H #define TOTABWIDGET_H #include "config.h" #include #include #include #include /** An extension of the regular tab widget with posibility to hide * tabs. */ class toTabWidget: public QTabWidget { Q_OBJECT; struct page { QString label; int index; }; typedef QMap WidgetMap; WidgetMap tabs; public: /** Constructor. */ toTabWidget(QWidget *parent = 0); /** Specify if a tab is shown. * @param w Widget to change visibility. * @param shown Show tab if true, hide if false. */ virtual void setTabShown(QWidget *w, bool value); /** Specify that a tab is shown. * @param w Tab to show. */ virtual void showTab(QWidget *w) { setTabShown(w, true); } /** Specify that a tab is hidden. * @param w Tab to hide. */ virtual void hideTab(QWidget *w) { setTabShown(w, false); } // ---------------------------------------- overrides QTabWidget virtual int addTab(QWidget *widget, const QString &); virtual int addTab(QWidget *widget, const QIcon& icon, const QString &label); private: /* this should not be used for simplicity */ int insertTab(int index, QWidget *widget, const QString &); int insertTab(int index, QWidget *widget, const QIcon& icon, const QString &label); void removeTab(int index); private slots: void tabChanged(int index); signals: void currentTabChanged(QWidget *); }; #endif tora-2.1.3/src/tooracleconnection.cpp0000644000175000017500000014757111445353612017456 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TO_NO_ORACLE #include "utils.h" #include "todefaultkeywords.h" #ifdef Q_OS_WIN32 # include "windows/cregistry.h" #include #endif /** * mrj: disabled stream pooling. it doesn't seem to be fully thread * safe. if you're hitting the database hard, say the tuning overview * tab with a refresh of 2 seconds, you get consistent crashes. */ //#define OTL_STREAM_POOLING_ON #define OTL_STL #define OTL_EXCEPTION_ENABLE_ERROR_OFFSET #define OTL_ORA_UTF8 #define OTL_ORA_UNICODE #define OTL_ORA_TIMESTAMP #define OTL_ANSI_CPP // mrj: disabled, otl_stream::eof sometimes throws an unexpected // exception which causes a crash // #define OTL_FUNC_THROW_SPEC_ON #if 1 #if defined(OTL_ORA10G) || defined(OTL_ORA10G_R2) || defined(OTL_ORA11G) #define OTL_ORA_OCI_ENV_CREATE #define OTL_ORA_OCI_ENV_CREATE_MODE OCI_THREADED|OCI_OBJECT|OCI_EVENTS #endif #endif #if 0 /* OTL tracing */ #define OTL_TRACE_LEVEL 0xff #define OTL_TRACE_STREAM cerr #include using namespace std; #endif #include "otlv4.h" #include "toconf.h" #include "toconfiguration.h" #include "toconnection.h" #include "tomain.h" #include "tosql.h" #include "totool.h" #include "tooraclesetting.h" #include #include #include #include #include #include #include #include #include #include #include #include static int toMaxLong = toConfigurationSingle::Instance().maxLong(); static toSQL SQLComment("toOracleConnection:Comments", "SELECT Column_name,Comments FROM sys.All_Col_Comments\n" " WHERE Owner = :f1\n" " AND Table_Name = :f2", "Display column comments"); static toSQL SQLMembers("toOracleConnection:Members", "SELECT object_name,overload,argument_name,data_type\n" " FROM sys.All_Arguments\n" " WHERE Owner = :f1\n" " AND Package_Name = :f2\n" " ORDER BY object_name,overload,DECODE(argument_name,NULL,9999,sequence)", "Get list of package members"); static toSQL SQLListObjects("toOracleConnection:ListObjects", "select a.owner,a.object_name,a.object_type,b.comments\n" " from sys.all_objects a,\n" " sys.all_tab_comments b\n" " where a.owner = b.owner(+) and a.object_name = b.table_name(+)\n" " and a.object_type = b.table_type(+) and a.object_type != 'SYNONYM'", "List the objects to cache for a connection, should have same " "columns and binds"); static toSQL SQLListSynonyms("toOracleConnection:ListSynonyms", "select synonym_name,table_owner,table_name\n" " from sys.all_synonyms\n" " where owner = :usr or owner = 'PUBLIC'\n" " order by table_owner,table_name", "List the synonyms available to a user, should have same columns and binds"); static void ThrowException(const otl_exception &exc) { if (exc.code == 24344) throw toConnection::exception(QString::fromLatin1("ORA-24344 success with compilation error")); else { toConnection::exception ret(QString::fromUtf8((const char *)exc.msg)); if (ret.isEmpty()) { if (exc.code != 0) { ret = QString::fromLatin1("ORA-") + QString::number(exc.code) + QString::fromLatin1(" missing error description"); } else if (ret.isEmpty()) { ret = QString::fromLatin1( "Missing error description. This may be caused by a library " "version mismatch. Check that your ORACLE_HOME and library path is correct."); } } if (exc.stm_text && strlen(exc.stm_text)) { ret += QString::fromLatin1("\n"); QString sql = QString::fromUtf8((const char *)exc.stm_text); if (exc.code >= 0) { QString t = QString::fromUtf8((const char *)exc.stm_text, exc.error_offset); ret.setOffset(t.length()); sql.insert(t.length(), QString::fromLatin1("")); } ret += sql; } throw ret; } } class toOracleProvider : public toConnectionProvider { public: class oracleSub : public toConnectionSub { public: otl_connect *Connection; oracleSub(otl_connect *conn) { Connection = conn; } ~oracleSub() { try { delete Connection; } catch(...) { } Connection = 0; } virtual void cancel(void) { Connection->cancel(); } virtual void throwExtendedException(toConnection &conn, const otl_exception &exc) { if (conn.version() < "0800" && exc.code == 0) { // Serious OCI voodoo to get the Parse error location on Oracle7 servers Lda_Def lda; Cda_Def cda; if (OCISvcCtxToLda(Connection->connect_struct.svchp, Connection->connect_struct.errhp, &lda) == OCI_SUCCESS) { if (oopen(&cda, &lda, (OraText *)0, -1, -1, (OraText *)0, -1) == OCI_SUCCESS) { cda.peo = 0; oparse(&cda, (OraText *)exc.stm_text, -1, FALSE, 1); ((otl_exception &)exc).code = cda.peo; oclose(&cda); } OCILdaToSvcCtx(&Connection->connect_struct.svchp, Connection->connect_struct.errhp, &lda); } } ThrowException(exc); } }; class oracleQuery : public toQuery::queryImpl { bool Cancel; bool Running; bool SaveInPool; otl_stream *Query; public: oracleQuery(toQuery *query, oracleSub *) : toQuery::queryImpl(query) { Running = Cancel = false; SaveInPool = false; Query = NULL; } virtual ~oracleQuery() { if (!Query) return; Query->close(); delete Query; } virtual void execute(void); virtual toQValue readValue(void) { char *buffer = NULL; otl_var_desc *dsc = Query->describe_next_out_var(); if (!dsc) throw QString::fromLatin1("Couldn't get description of next column to read"); oracleSub *conn = dynamic_cast(query()->connectionSub()); if (!conn) throw QString::fromLatin1("Internal error, not oracle sub connection"); if (Cancel) throw QString::fromLatin1("Cancelled while waiting to read value"); Running = true; SaveInPool = true; try { toQValue null; switch (dsc->ftype) { case otl_var_double: case otl_var_float: { double d = 0; (*Query) >> d; Running = false; if (Query->is_null()) return null; return toQValue(d); } break; case otl_var_int: case otl_var_unsigned_int: case otl_var_short: case otl_var_long_int: { int i = 0; (*Query) >> i; Running = false; if (Query->is_null()) return null; return toQValue(i); } break; case otl_var_varchar_long: case otl_var_raw: case otl_var_raw_long: { int len = toMaxLong; if (toMaxLong < 0) len = DEFAULT_MAX_LONG; buffer = (char *)malloc(len + 1); buffer[len] = 0; otl_long_string str(buffer, len); (*Query) >> str; Running = false; if (!str.len()) { free(buffer); return null; } QString buf; if (dsc->ftype == otl_var_varchar_long) { buf = (QString::fromUtf8(buffer)); free(buffer); return buf; } else { QByteArray ret(buffer, str.len()); free(buffer); return toQValue::createBinary(ret); } } case otl_var_clob: case otl_var_blob: { otl_lob_stream lob; (*Query) >> lob; if (lob.len() == 0) { Running = false; return null; } int len = lob.len(); if (toMaxLong >= 0 && len > toMaxLong) len = toMaxLong; if (dsc->ftype == otl_var_clob) len *= 5; else len *= 2; buffer = (char *)malloc(len + 1); buffer[0] = 0; otl_long_string data(buffer, len); lob >> data; if (!lob.eof()) { otl_long_string sink(10000); do { lob >> sink; } while (!lob.eof() && sink.len() > 0); toStatusMessage(QObject::tr("Data exists past configured maximum LOB length (Preferences)", "toOracleConnection")); } buffer[data.len()] = 0; Running = false; if (dsc->ftype == otl_var_clob) { QString buf = QString::fromUtf8(buffer); free(buffer); return buf; } else { QByteArray ret(buffer, data.len()); free(buffer); return toQValue::createBinary(ret); } } break; default: // Try using char if all else fails { // The *5 is for raw columns or UTF expanded data, also dates and numbers // are a bit tricky but if someone specifies a dateformat longer than 100 bytes he // deserves everything he gets! buffer = new char[std::max(dsc->elem_size * 5 + 1, 100)]; buffer[0] = 0; (*Query) >> buffer; QString buf = QString::fromUtf8(buffer); delete[] buffer; Running = false; if (Query->is_null()) return null; return buf; } break; } } catch (const otl_exception &exc) { Running = false; delete[] buffer; if(conn && query()) conn->throwExtendedException(query()->connection(), exc); } catch (...) { Running = false; delete[] buffer; throw; } // Never get here return QString(); //qt4 ::null; } virtual void cancel(void); virtual bool eof(void) { if (!Query || Cancel) return true; try { return Query->eof(); } catch (const otl_exception &exc) { if(query()) { oracleSub *conn = dynamic_cast(query()->connectionSub()); if(conn) conn->throwExtendedException(query()->connection(), exc); } return true; } } virtual int rowsProcessed(void) { if (!Query) return 0; return Query->get_rpc(); } virtual int columns(void) { int descriptionLen; Query->describe_select(descriptionLen); return descriptionLen; } virtual std::list describe(void) { std::list ret; int descriptionLen; int datatypearg1 = 0; int datatypearg2 = 0; otl_column_desc *description = Query->describe_select(descriptionLen); for (int i = 0;i < descriptionLen;i++) { toQuery::queryDescribe desc; desc.AlignRight = false; desc.Name = QString::fromUtf8(description[i].name); /* * http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10758/sqlqr06.htm * include ocidfn.h */ switch (description[i].dbtype) { case 1: /* VARCHAR2, NVARCHAR2 */ desc.Datatype = QString::fromLatin1("VARCHAR2(%i)"); datatypearg1 = description[i].char_size; #ifdef OTL_ORA_UNICODE if (description[i].charset_form == 2) { desc.Datatype = QString::fromLatin1("N") + desc.Datatype; } #endif break; case 2: /* NUMBER */ desc.Datatype = QString::fromLatin1("NUMBER"); if (description[i].prec) { desc.Datatype = QString::fromLatin1("NUMBER(%i)"); datatypearg1 = description[i].prec; if (description[i].scale != 0) { desc.Datatype = QString::fromLatin1("NUMBER(%i,%i)"); datatypearg2 = description[i].scale; } } desc.AlignRight = true; break; case 8: /* LONG */ desc.Datatype = QString::fromLatin1("LONG"); break; case 12: /* DATE */ desc.Datatype = QString::fromLatin1("DATE"); desc.AlignRight = true; break; case 23: /* RAW */ desc.Datatype = QString::fromLatin1("RAW(%i)"); datatypearg1 = description[i].dbsize; break; case 24: /* LONG RAW */ desc.Datatype = QString::fromLatin1("LONG RAW"); break; case 104: /* ROWID, docu: 69, ocidfn.h: 104 */ case 208: /* UROWID */ desc.Datatype = QString::fromLatin1("ROWID"); break; case 96: /* CHAR, NCHAR */ desc.Datatype = QString::fromLatin1("CHAR(%i)"); datatypearg1 = description[i].char_size; #ifdef OTL_ORA_UNICODE if (description[i].charset_form == 2) { desc.Datatype = QString::fromLatin1("N") + desc.Datatype; } #endif break; #ifdef OTL_ORA_NATIVE_TYPES case 100: /* BINARY_FLOAT */ desc.Datatype = QString::fromLatin1("BINARY_FLOAT"); break; case 101: /* BINARY_DOUBLE */ desc.Datatype = QString::fromLatin1("BINARY_DOUBLE"); break; #endif case 112: /* CLOB, NCLOB */ desc.Datatype = QString::fromLatin1("CLOB"); #ifdef OTL_ORA_UNICODE if (description[i].charset_form == 2) { desc.Datatype = QString::fromLatin1("N") + desc.Datatype; } #endif break; case 113: /* BLOB */ desc.Datatype = QString::fromLatin1("BLOB"); break; #ifdef OTL_ORA_TIMESTAMP case 187: /* TIMESTAMP, docu: 180, ocidfn.h: 187 */ desc.Datatype = QString::fromLatin1("TIMESTAMP(%i)"); datatypearg1 = description[i].scale; break; case 188: /* TIMESTAMP WITH TIME ZONE, docu: 181, ocidfn.h: 188 */ desc.Datatype = QString::fromLatin1("TIMESTAMP(%i) WITH TIME ZONE"); datatypearg1 = description[i].scale; break; case 189: /* INTERVAL YEAR TO MONTH, docu: 182, ocidfn.h: 189 */ desc.Datatype = QString::fromLatin1("INTERVAL YEAR(%i) TO MONTH"); datatypearg1 = description[i].prec; break; case 190: /* INTERVAL DAY TO SECOND, docu: 183, ocidfn.h: 190 */ desc.Datatype = QString::fromLatin1("INTERVAL DAY(%i) TO SECOND(%i)"); datatypearg1 = description[i].prec; datatypearg2 = description[i].scale; break; case 232: /* TIMESTAMP WITH LOCAL TIME ZONE docu: 231, ocidfn.h: 232 */ desc.Datatype = QString::fromLatin1("TIMESTAMP(%i) WITH LOCAL TIME ZONE"); datatypearg1 = description[i].scale; break; #endif default: desc.Datatype = QString::fromLatin1("UNKNOWN"); /* report unmatched datatypes for adding later */ printf("File a bug report and include the table layout and the following data:\n"); printf(" type=%i, otl_type=%i, size=%i, nullok=%i, charset_form=%i, charset_size=%i, prec=%i, scale=%i\n", description[i].dbtype, description[i].otl_var_dbtype, description[i].dbsize, description[i].nullok, description[i].charset_form, description[i].char_size, description[i].prec, description[i].scale); } desc.Datatype.sprintf(desc.Datatype.toUtf8().constData(), datatypearg1, datatypearg2); desc.Null = description[i].nullok; ret.insert(ret.end(), desc); } return ret; } }; class oracleConnection : public toConnection::connectionImpl { QString connectString(void) { QString ret; ret = connection().user().toUtf8(); ret += QString::fromLatin1("/"); ret += connection().password().toUtf8(); if (!connection().host().isEmpty()) { ret += QString::fromLatin1("@"); ret += connection().database().toUtf8(); } return ret; } oracleSub *oracleConv(toConnectionSub *sub) { oracleSub *conn = dynamic_cast(sub); if (!conn) throw QString::fromLatin1("Internal error, not oracle sub connection"); return conn; } public: oracleConnection(toConnection *conn) : toConnection::connectionImpl(conn) { } /** Return a string representation to address an object. * Checks if identifier has illegal characters, starts with digit, is a reserved * word etc. - if so - returns it enclosed with quotes (otherwise returns the same string). * Note that when identifier name returned from oracle data dictionary is in lowercase * - it MUST be enclosed with quotes (case insensitive "normal" identifiers are always * returned in uppercase). * @param name The name to be quoted. * @param quoteLowercase Enclose in quotes when identifier has lowercase letters. * When processing data returned by dada dictionary quoteLowercase should be true * When processing data entered by user quoteLowercase should be false * @return String addressing table. */ virtual QString quote(const QString &name, const bool quoteLowercase) { bool ok = true; // Identifiers starting with digit should be quoted if (name.at(0).isDigit()) ok = false; else for (int i = 0; i < name.length(); i++) { if ((name.at(i).toUpper() != name.at(i) && quoteLowercase) || !toIsIdent(name.at(i))) ok = false; } // Check if given identified is a reserved word int i = 0; while (ok && (DefaultKeywords[i] != NULL)) { if (name.compare(DefaultKeywords[i], Qt::CaseInsensitive) == 0) ok = false; i++; } if (ok) { if (toConfigurationSingle::Instance().objectNamesUpper()) return name.toUpper(); else return name.toLower(); } else return QString::fromLatin1("\"") + name + QString::fromLatin1("\""); } virtual QString unQuote(const QString &str) { if (str.at(0).toLatin1() == '\"' && str.at(str.length() - 1).toLatin1() == '\"') return str.left(str.length() - 1).right(str.length() - 2); return str.toUpper(); } virtual std::list objectNames(void) { std::list ret; std::list par; toQuery objects(connection(), toQuery::Long, SQLListObjects, par); toConnection::objectName cur; while (!objects.eof()) { cur.Owner = objects.readValueNull(); cur.Name = objects.readValueNull(); cur.Type = objects.readValueNull(); cur.Comment = objects.readValueNull(); ret.insert(ret.end(), cur); } return ret; } virtual std::map synonymMap(std::list &objects) { std::map ret; toConnection::objectName cur; cur.Type = QString::fromLatin1("A"); std::list par; par.insert(par.end(), toQValue(connection().user().toUpper())); toQuery synonyms(connection(), toQuery::Long, SQLListSynonyms, par); std::list::iterator i = objects.begin(); while (!synonyms.eof()) { QString synonym = synonyms.readValueNull(); cur.Owner = synonyms.readValueNull(); cur.Name = synonyms.readValueNull(); while (i != objects.end() && (*i) < cur) i++; if (i == objects.end()) break; if (cur.Name == (*i).Name && cur.Owner == (*i).Owner) { ret[synonym] = (*i); (*i).Synonyms.insert((*i).Synonyms.end(), synonym); } } return ret; } virtual toQDescList columnDesc(const toConnection::objectName &table) { toBusy busy; if (table.Type == QString::fromLatin1("PACKAGE")) { toQDescList ret; try { toQuery::queryDescribe desc; desc.Datatype = ("MEMBER"); desc.Null = false; QString lastName; QString lastOver; toQuery member(connection(), SQLMembers, table.Owner, table.Name); bool hasArgs = false; while (!member.eof()) { QString name = member.readValue(); QString overld = member.readValue(); QString arg = member.readValueNull(); QString type = member.readValueNull(); if (lastName != name || overld != lastOver) { if (hasArgs) desc.Name += ")"; if (!desc.Name.isEmpty()) ret.insert(ret.end(), desc); desc.Name = name; lastName = name; lastOver = overld; hasArgs = false; } if (arg.isEmpty()) { if (hasArgs) { desc.Name += ")"; hasArgs = false; } desc.Name += " RETURNING "; } else { if (hasArgs) desc.Name += ", "; else { desc.Name += "("; hasArgs = true; } desc.Name += arg; desc.Name += " "; } desc.Name += type; } if (desc.Name.contains("(")) desc.Name += ")"; if (!desc.Name.isEmpty()) ret.insert(ret.end(), desc); } catch (...) {} return ret; } std::map comments; try { toQuery comment(connection(), SQLComment, table.Owner, table.Name); while (!comment.eof()) { QString col = comment.readValue(); comments[col] = comment.readValueNull(); } } catch (...) {} try { toQuery query(connection()); #ifdef OTL_STREAM_POOLING_ON // Need to clear the stream cache first. oracleSub *sub = dynamic_cast(query.connectionSub()); sub->Lock.down(); sub->Connection->set_stream_pool_size(std::max(toConfigurationSingle::Instance().openCursors(), 1)); sub->Lock.up(); #endif QString SQL = QString::fromLatin1("SELECT * FROM \""); SQL += table.Owner; SQL += QString::fromLatin1("\".\""); SQL += table.Name; SQL += QString::fromLatin1("\" WHERE NULL=NULL"); toQList par; query.execute(SQL, par); toQDescList desc = query.describe(); for (toQDescList::iterator j = desc.begin();j != desc.end();j++) (*j).Comment = comments[(*j).Name]; return desc; } catch ( ... ) { throw; } toQDescList ret; return ret; } virtual void commit(toConnectionSub *sub) { oracleSub *conn = oracleConv(sub); try { conn->Connection->commit(); } catch (const otl_exception &exc) { ThrowException(exc); } } virtual void rollback(toConnectionSub *sub) { oracleSub *conn = oracleConv(sub); try { conn->Connection->rollback(); } catch (const otl_exception &exc) { ThrowException(exc); } } virtual toConnectionSub *createConnection(void); void closeConnection(toConnectionSub *conn) { delete conn; } virtual QString version(toConnectionSub *sub) { oracleSub *conn = oracleConv(sub); try { otl_stream version(1, "SELECT version FROM product_component_version where product like 'Oracle%'", *(conn->Connection)); if (!version.eof()) { char buffer[1024]; version >> buffer; QStringList vl = QString(buffer).split('.'); QString ve; QString verrj; for ( QStringList::iterator vi = vl.begin(); vi != vl.end(); ++vi ) { ve = *vi; verrj += ve.rightJustified(2, '0'); } return verrj; } } catch (...) { // Ignore any errors here } return QString(); } virtual toQuery::queryImpl *createQuery(toQuery *query, toConnectionSub *sub) { return new oracleQuery(query, oracleConv(sub)); } virtual void execute(toConnectionSub *sub, const QString &sql, toQList ¶ms) { oracleSub *conn = oracleConv(sub); if ( params.empty() ) { try { otl_cursor::direct_exec(*(conn->Connection), sql.toUtf8().constData()); } catch (const otl_exception &exc) { conn->throwExtendedException(connection(), exc); } } else toQuery query(connection(), sql, params); } virtual void parse(toConnectionSub *sub, const QString &sql) { oracleSub *conn = oracleConv(sub); try { conn->Connection->reset_throw_count(); conn->Connection->syntax_check(sql.toUtf8().constData()); } catch (const otl_exception &exc) { conn->Connection->throw_count++; ThrowException(exc); } } }; toOracleProvider(void) : toConnectionProvider("Oracle", false) {} virtual void initialize(void) { toMaxLong = toConfigurationSingle::Instance().maxLong(); if (otl_connect::otl_initialize(1)) addProvider("Oracle"); else fprintf(stderr, "otl_initialize failed!\n"); } virtual toConnection::connectionImpl *provideConnection(const QString &, toConnection *conn) { return new oracleConnection(conn); } virtual std::list providedOptions(const QString &) { std::list ret; ret.insert(ret.end(), "*SQL*Net"); ret.insert(ret.end(), "-"); ret.insert(ret.end(), "SYS_OPER"); ret.insert(ret.end(), "SYS_DBA"); return ret; } virtual std::list providedHosts(const QString &) { std::list ret; ret.insert(ret.end(), QString::null); ret.insert(ret.end(), QString::fromLatin1("SQL*Net")); return ret; } virtual std::list providedDatabases(const QString &, const QString &host, const QString &, const QString &) { QString str; #ifdef Q_OS_WIN32 CRegistry registry; DWORD siz = 1024; char buffer[1024]; try { if (registry.GetStringValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\ORACLE\\HOME0", "TNS_ADMIN", buffer, siz)) { if (siz > 0) str = buffer; else throw 0; } else throw 0; } catch (...) { try { if (registry.GetStringValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\ORACLE\\HOME0", "ORACLE_HOME", buffer, siz)) { if (siz > 0) { str = buffer; str += "\\network\\admin"; } else throw 0; } else throw 0; } catch (...) { if (GetEnvironmentVariableA("TNS_ADMIN", buffer, siz) > 0) str = buffer; } } #else if (getenv("TNS_ADMIN")) { str = getenv("TNS_ADMIN"); } else { str = getenv("ORACLE_HOME"); str.append(QString::fromLatin1("/network/admin")); } #endif str.append(QString::fromLatin1("/tnsnames.ora")); std::list ret; QFile file(str); if (!file.open(QIODevice::ReadOnly)) return ret; QTextStream in(&file); QByteArray barray = in.readAll().toUtf8(); const char *buf = barray.constData(); int begname = -1; int parambeg = -1; int pos = 0; int param = 0; while (pos < barray.size()) { if (buf[pos] == '#') { while (pos < barray.size() && buf[pos] != '\n') pos++; } else if (buf[pos] == '=') { if (param == 0) { if (begname >= 0 && !host.isEmpty()) ret.insert(ret.end(), QString::fromLatin1(buf + begname, pos - begname)); } } else if (buf[pos] == '(') { begname = -1; parambeg = pos + 1; param++; } else if (buf[pos] == ')') { if (parambeg >= 0 && host.isEmpty()) { QString tmp = QString::fromLatin1(buf + parambeg, pos - parambeg); tmp.replace(QRegExp(QString::fromLatin1("\\s+")), QString::null); if (tmp.toLower().startsWith(QString::fromLatin1("sid="))) ret.insert(ret.end(), tmp.mid(4)); } begname = -1; parambeg = -1; param--; } else if (!isspace(buf[pos]) && begname < 0) { begname = pos; } pos++; } return ret; } virtual QWidget *providerConfigurationTab(const QString &provider, QWidget *parent); }; static toOracleProvider OracleProvider; void toOracleProvider::oracleQuery::execute(void) { oracleSub *conn = dynamic_cast(query()->connectionSub()); if (!conn) throw QString::fromLatin1("Internal error, not oracle sub connection"); try { delete Query; Query = NULL; if (Cancel) throw QString::fromLatin1("Query aborted before started"); Running = true; QRegExp stripnl("\r"); Query = new otl_stream; Query->set_commit(0); if (toQValue::numberFormat() == 0) Query->set_all_column_types(otl_all_num2str | otl_all_date2str); else Query->set_all_column_types(otl_all_date2str); QString sql = query()->sql(); sql.replace(stripnl, ""); Query->open(1, sql.toUtf8().constData(), *(conn->Connection)); } catch (const otl_exception &exc) { delete Query; Query = NULL; Running = false; conn->throwExtendedException(query()->connection(), exc); } try { otl_null null; for (toQList::iterator i = query()->params().begin();i != query()->params().end();i++) { if ((*i).isNull()) (*Query) << null; else { otl_var_desc *next = Query->describe_next_in_var(); if (next) { switch (next->ftype) { case otl_var_double: case otl_var_float: (*Query) << (*i).toDouble(); break; case otl_var_int: case otl_var_unsigned_int: case otl_var_short: case otl_var_long_int: (*Query) << (*i).toInt(); break; case otl_var_raw_long: case otl_var_blob: if ((*i).isBinary()) { QByteArray arr = (*i).toByteArray(); otl_long_string str(arr, arr.size(), arr.size()); (*Query) << str; break; } // Intentially left out break case otl_var_varchar_long: case otl_var_clob: { QString buf = (*i).toUtf8(); otl_long_string str(buf.toUtf8().constData(), buf.length(), buf.length()); (*Query) << str; } break; default: (*Query) << (*i).toUtf8().toUtf8().constData(); break; } } else { printf("ERROR: More parameters than binds\n"); } } } Running = false; } catch (const otl_exception &exc) { delete Query; Query = NULL; Running = false; conn->throwExtendedException(query()->connection(), exc); } } void toOracleProvider::oracleQuery::cancel(void) { if(!Running || Cancel) return; oracleSub *conn = dynamic_cast(query()->connectionSub()); if (!conn) throw QString::fromLatin1("Internal error, not oracle sub connection"); conn->Connection->cancel(); Cancel = true; } toConnectionSub *toOracleProvider::oracleConnection::createConnection(void) { QString oldSid; std::set options = connection().options(); bool sqlNet = (options.find("SQL*Net") != options.end()); if (!sqlNet) { oldSid = getenv("ORACLE_SID"); toSetEnv("ORACLE_SID", connection().database()); } otl_connect *conn = NULL; try { int session_mode = OCI_DEFAULT; if (options.find("SYS_OPER") != options.end()) session_mode = OCI_SYSOPER; else if (options.find("SYS_DBA") != options.end()) session_mode = OCI_SYSDBA; do { conn = new otl_connect; #ifdef OTL_STREAM_POOLING_ON conn->set_stream_pool_size(std::max(toConfigurationSingle::Instance().openCursors(), 1)); #endif if (!sqlNet) conn->server_attach(); else conn->server_attach(connection().database().toUtf8().constData()); QString user = connection().user(); QString pass = connection().password(); try { conn->session_begin(user.isEmpty() ? "" : user.toUtf8().constData(), pass.isEmpty() ? "" : pass.toUtf8().constData(), 0, session_mode); } catch (const otl_exception &exc) { if (toThread::mainThread() && exc.code == 28001) { bool ok = false; QString newpass = QInputDialog::getText( toMainWidget(), qApp->translate("toOracleConnection", "Password expired"), qApp->translate("toOracleConnection", "Enter new password"), QLineEdit::Password, QString::null, &ok); if (ok) { QString newpass2 = QInputDialog::getText( toMainWidget(), qApp->translate("toOracleConnection", "Password expired"), qApp->translate("toOracleConnection", "Enter password again for confirmation"), QLineEdit::Password, QString::null, &ok); if (ok) { if (newpass2 != newpass) throw qApp->translate("toOracleConnection", "The two passwords doesn't match"); QString nputf = newpass; conn->change_password(user.isEmpty() ? "" : user.toUtf8().constData(), pass.isEmpty() ? "" : pass.toUtf8().constData(), newpass.isEmpty() ? "" : nputf.toUtf8().constData()); connection().setPassword(newpass); delete conn; conn = NULL; } else throw exc; } else { throw exc; } } else throw exc; } } while (!conn); } catch (const otl_exception &exc) { if (!sqlNet) { if (oldSid.isNull()) toUnSetEnv("ORACLE_SID"); else toSetEnv("ORACLE_SID", oldSid.toLatin1()); } delete conn; ThrowException(exc); } if (!sqlNet) { if (oldSid.isNull()) toUnSetEnv("ORACLE_SID"); else { toSetEnv("ORACLE_SID", oldSid.toLatin1()); } } try { QString str = QString::fromLatin1("ALTER SESSION SET NLS_DATE_FORMAT = '"); str += toConfigurationSingle::Instance().dateFormat(); str += QString::fromLatin1("'"); otl_stream date(1, str.toUtf8(), *conn); } catch (...) { printf("Failed to set new default date format for session\n"); toStatusMessage(QObject::tr("Failed to set new default date format for session: %1") .arg(toConfigurationSingle::Instance().dateFormat())); } try { otl_stream info(1, "BEGIN\n" " SYS.DBMS_APPLICATION_INFO.SET_CLIENT_INFO('" TOAPPNAME " (http://tora.sf.net)" "');\n" " SYS.DBMS_APPLICATION_INFO.SET_MODULE('" TOAPPNAME "','Access Database');\n" "END;", *conn); } catch (...) { printf("Failed to set client info for session\n"); } return new oracleSub(conn); } /* ** 11g version, see $ORACLE_HOME/rdbms/admin/utlxplan.sql */ static toSQL SQLCreatePlanTable(toSQL::TOSQL_CREATEPLAN, "CREATE TABLE %1 (\n" "STATEMENT_ID VARCHAR2(30),\n" "PLAN_ID NUMBER,\n" "TIMESTAMP DATE,\n" "REMARKS VARCHAR2(4000),\n" "OPERATION VARCHAR2(30),\n" "OPTIONS VARCHAR2(255),\n" "OBJECT_NODE VARCHAR2(128),\n" "OBJECT_OWNER VARCHAR2(30),\n" "OBJECT_NAME VARCHAR2(30),\n" "OBJECT_ALIAS VARCHAR2(65),\n" "OBJECT_INSTANCE NUMERIC,\n" "OBJECT_TYPE VARCHAR2(30),\n" "OPTIMIZER VARCHAR2(255),\n" "SEARCH_COLUMNS NUMBER,\n" "ID NUMERIC,\n" "PARENT_ID NUMERIC,\n" "DEPTH NUMERIC,\n" "POSITION NUMERIC,\n" "COST NUMERIC,\n" "CARDINALITY NUMERIC,\n" "BYTES NUMERIC,\n" "OTHER_TAG VARCHAR2(255),\n" "PARTITION_START VARCHAR2(255),\n" "PARTITION_STOP VARCHAR2(255),\n" "PARTITION_ID NUMERIC,\n" "OTHER LONG,\n" "DISTRIBUTION VARCHAR2(30),\n" "CPU_COST NUMERIC,\n" "IO_COST NUMERIC,\n" "TEMP_SPACE NUMERIC,\n" "ACCESS_PREDICATES VARCHAR2(4000),\n" "FILTER_PREDICATES VARCHAR2(4000),\n" "PROJECTION VARCHAR2(4000),\n" "TIME NUMERIC,\n" "QBLOCK_NAME VARCHAR2(30),\n" "OTHER_XML CLOB\n" ")", "Create plan table, must have same % signs"); toOracleSetting::toOracleSetting(QWidget *parent) : QWidget(parent), toSettingTab("database.html#oracle") { setupUi(this); DefaultDate->setText(toConfigurationSingle::Instance().dateFormat()); CheckPoint->setText(toConfigurationSingle::Instance().planCheckpoint()); ExplainPlan->setText(toConfigurationSingle::Instance().planTable()); OpenCursors->setValue(toConfigurationSingle::Instance().openCursors()); KeepPlans->setChecked(toConfigurationSingle::Instance().keepPlans()); VsqlPlans->setChecked(toConfigurationSingle::Instance().vsqlPlans()); int len = toConfigurationSingle::Instance().maxLong(); if (len >= 0) { MaxLong->setText(QString::number(len)); MaxLong->setValidator(new QIntValidator(MaxLong)); Unlimited->setChecked(false); } try { // Check if connection exists toMainWidget()->currentConnection(); CreatePlanTable->setEnabled(true); } catch (...) {} } void toOracleSetting::saveSetting() { toConfigurationSingle::Instance().setKeepPlans(KeepPlans->isChecked()); toConfigurationSingle::Instance().setVsqlPlans(VsqlPlans->isChecked()); toConfigurationSingle::Instance().setDateFormat(DefaultDate->text()); // try to change NLS for already running sessions QString str("ALTER SESSION SET NLS_DATE_FORMAT = '%1'"); foreach (QString c, toMainWidget()->connections()) { try { toConnection &conn = toMainWidget()->connection(c); if(toIsOracle(conn)) { conn.allExecute( str.arg(toConfigurationSingle::Instance().dateFormat())); } } catch(...) { toStatusMessage(tr("Failed to set new default date format for connection: %1").arg(c)); } } toConfigurationSingle::Instance().setPlanCheckpoint(CheckPoint->text()); toConfigurationSingle::Instance().setPlanTable(ExplainPlan->text()); toConfigurationSingle::Instance().setOpenCursors(OpenCursors->value()); if (Unlimited->isChecked()) { toMaxLong = -1; toConfigurationSingle::Instance().setMaxLong(-1); } else { toConfigurationSingle::Instance().setMaxLong(MaxLong->text().toInt()); toMaxLong = MaxLong->text().toInt(); } } void toOracleSetting::createPlanTable() { try { toConnection &conn = toMainWidget()->currentConnection(); conn.execute(toSQL::string(SQLCreatePlanTable, conn). arg(ExplainPlan->text())); } TOCATCH; } QWidget *toOracleProvider::providerConfigurationTab(const QString &, QWidget *parent) { return new toOracleSetting(parent); } #endif tora-2.1.3/src/tooracleextract.cpp0000644000175000017500000122234611351613123016754 0ustar michaelmichael/* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "tooracleextract.h" #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "toextract.h" #include "tosql.h" #include "totool.h" #include #include static toOracleExtract OracleExtractor; // Implementation misc void toOracleExtract::clearFlags(toExtract &ext) const { ext.setState("IsASnapIndex", QVariant(false)); ext.setState("IsASnapTable", QVariant(false)); } static toSQL SQLDisplaySource("toOracleExtract:ListSource", "SELECT text\n" " FROM sys.all_source\n" " WHERE type = :typ\n" " AND name = :nam\n" " AND owner = :own\n" " ORDER BY line", "Get source of an object from the database, " "must have same columns and binds"); QString toOracleExtract::displaySource(toExtract &ext, const QString &schema, const QString &owner, const QString &name, const QString &type, bool describe) const { if (!ext.getCode()) return ""; QString re("^\\s*"); re += type; re += "\\s+"; QRegExp StripType(re, Qt::CaseInsensitive); toQuery inf(CONNECTION, SQLDisplaySource, type, name, owner); if (inf.eof()) throw qApp->translate("toOracleExtract", "Couldn't find source for of %1.%2").arg(owner).arg(name); QString ret; if (PROMPT && !describe) ret = QString("PROMPT CREATE OR REPLACE %1 %2%3\n\n"). arg(type). arg(schema). arg(QUOTE(name)); bool first = true; while (!inf.eof()) { QString line = inf.readValue(); if (first) { int len; int pos = StripType.indexIn(line, 0); len = StripType.matchedLength(); if (pos != 0) throw qApp->translate("toOracleExtract", "Displaying source of wrong type for %1. Got %2 expected 0.") .arg(type).arg(pos); QString tmp = QString("CREATE OR REPLACE %1 ") .arg(type); if (!describe) tmp += schema; tmp += line.mid(len); line = tmp.simplified() + "\n"; // avoid growing amount of spaces first = false; } ret += line; } if (!describe) ret += "\n/\n\n"; return ret; } static toSQL SQLKeyColumns("toOracleExtract:KeyColumns", "SELECT column_name\n" " FROM sys.all_%1_key_columns\n" " WHERE name = :nam\n" " AND owner = :owner\n" " AND object_type LIKE :typ||'%'", "Get key columns of partitions, " "must have same binds, columns and %"); QString toOracleExtract::keyColumns(toExtract &ext, const QString &owner, const QString &name, const QString &type, const QString &table) const { toQuery inf(CONNECTION, toSQL::string(SQLKeyColumns, CONNECTION).arg(table), name, owner, type); QString ret; bool first = true; while (!inf.eof()) { if (first) first = false; else ret += "\n , "; ret += QUOTE(inf.readValue()); } return ret; } QString toOracleExtract::partitionKeyColumns(toExtract &ext, const QString &owner, const QString &name, const QString &type) const { return keyColumns(ext, owner, name, type, "PART"); } QString toOracleExtract::prepareDB(const QString &db) { static QRegExp quote("'"); QString ret = db; ret.replace(quote, "''"); return ret; } QString toOracleExtract::segments(toExtract &ext) const { return ext.state("Segments").toString(); } QString toOracleExtract::segments(toExtract &ext, const toSQL &sql) const { return toSQL::string(sql, CONNECTION).arg(segments(ext)); } QString toOracleExtract::subPartitionKeyColumns(toExtract &ext, const QString &owner, const QString &name, const QString &type) const { return keyColumns(ext, owner, name, type, "SUBPART"); } // Implementation create utility functions static toSQL SQLConstraintCols("toOracleExtract:ConstraintCols", "SELECT column_name\n" " FROM sys.all_cons_columns\n" " WHERE owner = :own\n" " AND constraint_name = :con\n" " ORDER BY position", "List columns in a constraint, must have same binds and columns"); QString toOracleExtract::constraintColumns(toExtract &ext, const QString &owner, const QString &name) const { toQuery query(CONNECTION, SQLConstraintCols, owner, name); QString ret = "(\n "; bool first = true; while (!query.eof()) { if (first) first = false; else ret += ",\n "; ret += QUOTE(query.readValue()); } ret += "\n)\n"; return ret; } static toSQL SQLTableComments("toOracleExtract:TableComment", "SELECT comments\n" " FROM sys.all_tab_comments\n" " WHERE table_name = :nam\n" " AND comments IS NOT NULL\n" " AND owner = :own", "Extract comments about a table, must have same columns and binds"); static toSQL SQLColumnComments("toOracleExtract:ColumnComment", "SELECT column_name,\n" " comments\n" " FROM sys.all_col_comments\n" " WHERE table_name = :nam\n" " AND comments IS NOT NULL\n" " AND owner = :own", "Extract comments about a columns, must have same columns and binds"); QString toOracleExtract::createComments(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { QString ret; if (ext.getComments()) { QString sql; toQuery inf(CONNECTION, SQLTableComments, name, owner); while (!inf.eof()) { sql = QString("COMMENT ON TABLE %1%2 IS '%3'"). arg(schema). arg(QUOTE(name)). arg(prepareDB(inf.readValue())); if (PROMPT) { ret += "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; } toQuery col(CONNECTION, SQLColumnComments, name, owner); while (!col.eof()) { QString column = col.readValue(); sql = QString("COMMENT ON COLUMN %1%2.%3 IS '%4'"). arg(schema). arg(QUOTE(name)). arg(QUOTE(column)). arg(prepareDB(col.readValue())); if (PROMPT) { ret += "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; } } return ret; } static toSQL SQLContextInfoDBA("toOracleExtract:ContextInfoDBA", "SELECT\n" " ixv_class\n" " , ixv_object\n" " , ixv_attribute\n" " , ixv_value\n" " FROM\n" " ctxsys.ctx_index_values\n" " WHERE\n" " ixv_index_owner = :own\n" " AND\n" " ixv_index_name = :nam\n" " AND\n" " ixv_class = :cls\n" " ORDER BY\n" " ixv_object", "Get information on context index preferences.", "0801"); static toSQL SQLContextInfoNoAttrDBA("toOracleExtract:ContextInfoNoAttrDBA", "SELECT\n" " ixo_object\n" " FROM\n" " ctxsys.ctx_index_objects\n" " WHERE\n" " ixo_index_owner = :own\n" " AND\n" " ixo_index_name = :nam\n" " AND\n" " ixo_class = :cls", "Get the context preferences w/o attributes.", "0801"); static toSQL SQLContextColumnDBA("toOracleExtract:ContextColumnDBA", "SELECT\n" " idx_language_column\n" " , idx_format_column\n" " , idx_charset_column\n" " FROM\n" " ctxsys.ctx_indexes\n" " WHERE\n" " idx_owner = :own\n" " AND\n" " idx_name = :nam", "Get the context column designations.", "0801"); static toSQL SQLContextInfo("toOracleExtract:ContextInfo", "SELECT\n" " ixv_class\n" " , ixv_object\n" " , ixv_attribute\n" " , ixv_value\n" " FROM\n" " ctxsys.ctx_user_index_values\n" " WHERE\n" " ixv_index_name = :nam\n" " AND\n" " ixv_class = :cls\n" " ORDER BY\n" " ixv_object", "Get information on context index preferences.", "0801"); static toSQL SQLContextInfoNoAttr("toOracleExtract:ContextInfoNoAttr", "SELECT\n" " ixo_object\n" " FROM\n" " ctxsys.ctx_user_index_objects\n" " WHERE\n" " ixo_index_name = :nam\n" " AND\n" " ixo_class = :cls", "Get the context preferences w/o attributes.", "0801"); static toSQL SQLContextColumn("toOracleExtract:ContextColumn", "SELECT\n" " idx_language_column\n" " , idx_format_column\n" " , idx_charset_column\n" " FROM\n" " ctxsys.ctx_user_indexes\n" " WHERE\n" " idx_name = :nam", "Get the context column designations.", "0801"); QString toOracleExtract::createContextPrefs(toExtract &ext, const QString &, const QString &owner, const QString &name, const QString &sql) const { QString prefs = ""; if (PROMPT) prefs += "PROMPT CREATE CONTEXT PREFERENCES\n\n"; prefs += qApp->translate("toOracleExtract", "-- Context indexes can be quite complicated depending upon the\n" "-- used parameters. The following is an attempt to recreate this\n" "-- context index. But, a close scrutiny of the following code is\n" "-- strongly recommended.\n\n"); QString tmp; QString pre_name = ""; QString parameters = ""; QStringList ql; toQList resultset; bool first = true; bool isDBA = true; try { resultset = toQuery::readQueryNull(CONNECTION, "SELECT * FROM ctxsys.ctx_indexes " "WHERE idx_owner = 'DUMMY'"); } catch (...) { isDBA = false; } ql << "DATASTORE" << "FILTER" << "LEXER" << "WORDLIST" << "STORAGE"; // Lets start with discovering the preferences QStringList::Iterator it; for (it = ql.begin();it != ql.end();++it) { if (isDBA) resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoDBA, owner, name, *it); else resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfo, name, *it); if (!resultset.empty()) { first = true; while (!resultset.empty()) { QString pre_class = toShift(resultset); QString pre_obj = toShift(resultset); QString pre_attr = toShift(resultset); QString pre_val = toShift(resultset); if (first) { first = false; pre_name = QString("%1_%2").arg(name).arg(pre_obj); pre_name.truncate(30); tmp = QString("BEGIN\n CTX_DDL.CREATE_PREFERENCE('%1','%2');\n") .arg(pre_name).arg(pre_obj); prefs += tmp; parameters += QString(" %1 %2\n") .arg(pre_class).arg(pre_name); } tmp = QString(" CTX_DDL.SET_ATTRIBUTE('%1', '%2', '%3');\n") .arg(pre_name).arg(pre_attr).arg(pre_val); prefs += tmp; } prefs += "END;\n\n"; } else { // some preferences don't have any attributes and // so won't be caught above if (isDBA) resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoNoAttrDBA, owner, name, *it); else resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoNoAttr, name, *it); if (!resultset.empty()) { QString pre_obj = toShift(resultset); pre_name = QString("%1_%2").arg(name).arg(pre_obj); pre_name.truncate(30); tmp = QString("BEGIN\n CTX_DDL.CREATE_PREFERENCE('%1', '%2');\nEND;\n\n").arg(pre_name).arg(pre_obj); prefs += tmp; parameters += QString(" %1 %2\n") .arg(*it).arg(pre_name); } } } // Now get the stoplist if (isDBA) resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoDBA, owner, name, "STOPLIST"); else resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfo, name, "STOPLIST"); pre_name = ""; while (!resultset.empty()) { QString pre_class = toShift(resultset); QString pre_obj = toShift(resultset); QString pre_attr = toShift(resultset); QString pre_val = toShift(resultset); if (pre_name == "") { pre_name = QString("%1_STOPLIST").arg(name); pre_name.truncate(30); tmp = QString("BEGIN\n CTX_DDL.CREATE_STOPLIST('%1');\n") .arg(pre_name); prefs += tmp; parameters += QString(" STOPLIST %1\n").arg(pre_name); } pre_attr.remove(4, 1); tmp = QString(" CTX_DDL.ADD_%1('%2', '%3');\n") .arg(pre_attr).arg(pre_name).arg(pre_val); prefs += tmp; } if (pre_name != "") prefs += "END;\n\n"; else { // This is most probably redundant but shouldn't hurt. // When everybody is out to get you paranoia just seems like a good idea. if (isDBA) resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoNoAttrDBA, owner, name, "STOPLIST"); else resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoNoAttr, name, "STOPLIST"); if (!resultset.empty()) { QString pre_obj = toShift(resultset); pre_name = QString("%1_%2").arg(name).arg(pre_obj); pre_name.truncate(30); tmp = QString("BEGIN\n CTX_DDL.CREATE_STOPLIST('%1');\nEND;\n\n") .arg(pre_name); prefs += tmp; parameters += QString(" STOPLIST %1\n").arg(pre_name); } } // get the section_groups if (isDBA) resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoDBA, owner, name, "SECTION_GROUP"); else resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfo, name, "SECTION_GROUP"); pre_name = ""; while (!resultset.empty()) { QString pre_class = toShift(resultset); QString pre_obj = toShift(resultset); QString pre_attr = toShift(resultset); QString pre_val = toShift(resultset); QString pre_val1 = pre_val.left(pre_val.indexOf(':', 0, Qt::CaseInsensitive)); pre_val = pre_val.right(pre_val.length() - pre_val1.length() - 1); QString pre_val2 = pre_val.left(pre_val.indexOf(':', 0, Qt::CaseInsensitive)); QString pre_val4 = pre_val.right(1); if (pre_val4 == "Y") pre_val4 = "TRUE"; else pre_val4 = "FALSE"; if (pre_name == "") { pre_name = QString("%1_SECTION_GROUP").arg(name); pre_name.truncate(30); tmp = QString("BEGIN\n CTX_DDL.CREATE_SECTION_GROUP('%1', '%2');\n") .arg(pre_name).arg(pre_obj); prefs += tmp; parameters += QString(" SECTION GROUP %1\n").arg(pre_name); } if (pre_attr == "ZONE") tmp = QString(" CTX_DDL.ADD_ZONE_SECTION('%1', '%2', '%3');\n") .arg(pre_name).arg(pre_val1).arg(pre_val2); else if (pre_attr == "FIELD") tmp = QString(" CTX_DDL.ADD_FIELD_SECTION('%1', '%2', '%3', %4);\n") .arg(pre_name).arg(pre_val1).arg(pre_val2).arg(pre_val4); else if (pre_attr == "SPECIAL") tmp = QString(" CTX_DDL.ADD_SPECIAL_SECTION('%1', '%2');\n") .arg(pre_name).arg(pre_val1); prefs += tmp; } if (pre_name != "") prefs += "END;\n\n"; else { if (isDBA) resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoNoAttrDBA, owner, name, "SECTION_GROUP"); else resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoNoAttr, name, "SECTION_GROUP"); if (!resultset.empty()) { QString pre_obj = toShift(resultset); pre_name = QString("%1_%2").arg(name).arg(pre_obj); pre_name.truncate(30); tmp = QString("BEGIN\n CTX_DDL.CREATE_SECTION_GROUP('%1', '%2');\nEND;\n\n"). arg(pre_name).arg(pre_obj); prefs += tmp; parameters += QString(" SECTION GROUP %1\n").arg(pre_name); } } // Lets look up the language, format, and charset columns // only if Oracle 8.1.6 and above if (CONNECTION.version() >= "080106") { if (isDBA) resultset = toQuery::readQueryNull(CONNECTION, SQLContextColumnDBA, owner, name); else resultset = toQuery::readQueryNull(CONNECTION, SQLContextColumn, name); if (!resultset.empty()) { toQValue vlang = toShift(resultset); toQValue vfrmt = toShift(resultset); toQValue vcset = toShift(resultset); if (!vlang.isNull()) { tmp = QString(" LANGUAGE COLUMN %1\n").arg(vlang); parameters += tmp; } if (!vfrmt.isNull()) { tmp = QString(" FORMAT COLUMN %1\n").arg(vfrmt); parameters += tmp; } if (!vcset.isNull()) { tmp = QString(" CHARSET COLUMN %1\n").arg(vcset); parameters += tmp; } } } prefs += sql; parameters += " "; tmp = QString("INDEXTYPE IS CTXSYS.CONTEXT\nPARAMETERS ('\n%1');\n\n"). arg(parameters); prefs += tmp; return prefs; } static toSQL SQLIOTInfo("toOracleExtract:IOTInfo", "SELECT\n" " DECODE(\n" " b.monitoring\n" " ,'NO','NOMONITORING'\n" " , 'MONITORING'\n" " )\n" " , 'N/A' AS table_name\n" " , LTRIM(a.degree)\n" " , LTRIM(a.instances)\n" " , 'INDEX' AS organization\n" " , 'N/A' AS cache\n" " , 'N/A' AS pct_used\n" " , a.pct_free\n" " , DECODE(\n" " a.ini_trans\n" " ,0,1\n" " ,null,1\n" " ,a.ini_trans\n" " ) AS ini_trans\n" " , DECODE(\n" " a.max_trans\n" " ,0,255\n" " ,null,255\n" " ,a.max_trans\n" " ) AS max_trans\n" " , a.initial_extent\n" " , a.next_extent\n" " , a.min_extents\n" " , DECODE(\n" " a.max_extents\n" " ,2147483645,'unlimited'\n" " ,a.max_extents\n" " ) AS max_extents\n" " , a.pct_increase\n" " , NVL(a.freelists,1)\n" " , NVL(a.freelist_groups,1)\n" " , a.buffer_pool AS buffer_pool\n" " , DECODE(\n" " b.logging\n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , a.tablespace_name AS tablespace_name\n" " , DECODE(\n" " b.blocks\n" " ,null,GREATEST(a.initial_extent,a.next_extent) \n" " / (b.blocks * 1024)\n" " ,'0' ,GREATEST(a.initial_extent,a.next_extent)\n" " / (b.blocks * 1024)\n" " ,b.blocks\n" " ) AS blocks\n" " FROM\n" " sys.all_indexes a,\n" " sys.all_all_tables b,\n" " sys.all_constraints c\n" " WHERE a.table_name = :nam\n" " AND b.owner = a.owner\n" " AND b.table_name = a.table_name\n" " AND a.owner = :own\n" " AND c.constraint_name = a.index_name\n" " AND c.owner = a.owner\n" " AND c.constraint_type = 'P'", "Get storage information about a IOT storage, " "same binds and columns"); static toSQL SQLOverflowInfo("toOracleExtract:OverflowInfo", "SELECT\n" " ' '\n" " , 'N/A'\n" " , DECODE(\n" " LTRIM(t.cache)\n" " ,'Y','CACHE'\n" " , 'NOCACHE'\n" " )\n" " , t.pct_used\n" " , t.pct_free\n" " , DECODE(\n" " t.ini_trans\n" " ,0,1\n" " ,null,1\n" " ,t.ini_trans\n" " ) AS ini_trans\n" " , DECODE(\n" " t.max_trans\n" " ,0,255\n" " ,null,255\n" " ,t.max_trans\n" " ) AS max_trans\n" " , t.initial_extent\n" " , t.next_extent\n" " , t.min_extents\n" " , DECODE(\n" " t.max_extents\n" " ,2147483645,'unlimited'\n" " , t.max_extents\n" " ) AS max_extents\n" " , NVL(t.pct_increase,0)\n" " , NVL(t.freelists,1)\n" " , NVL(t.freelist_groups,1)\n" " , t.buffer_pool AS buffer_pool\n" " , DECODE(\n" " t.logging\n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , t.tablespace_name AS tablespace_name\n" " , s.blocks - NVL(t.empty_blocks,0)\n" " FROM\n" " sys.all_tables t\n" " , %1 s\n" " WHERE\n" " t.iot_name = :nam\n" " AND t.table_name = s.segment_name\n" " AND s.segment_type = 'TABLE'\n" " AND s.owner = :own\n" " AND t.owner = s.owner", "Get information about overflow segment for table, must have same binds and columns", "0800"); QString toOracleExtract::createIOT(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { toQList storage = toQuery::readQueryNull(CONNECTION, SQLIOTInfo, name, owner); QString ret = createTableText(ext, storage, schema, owner, name); if (ext.getStorage()) { toQList overflow = toQuery::readQueryNull(CONNECTION, segments(ext, SQLOverflowInfo), name, owner); if (overflow.size() == 18) { ret += "OVERFLOW\n"; ret += segmentAttributes(ext, overflow); } } ret += ";\n\n"; ret += createComments(ext, schema, owner, name); return ret; } static toSQL SQLPrimaryKey("toOracleExtract:PrimaryKey", "SELECT a.constraint_name,b.tablespace_name\n" " FROM sys.all_constraints a,sys.all_indexes b\n" " WHERE a.table_name = :nam\n" " AND a.constraint_type = 'P'\n" " AND a.owner = :own\n" " AND a.owner = b.owner\n" " AND a.constraint_name = b.index_name", "Get constraint name for primary key of table, same binds and columns"); QString toOracleExtract::createTableText(toExtract &ext, toQList &result, const QString &schema, const QString &owner, const QString &name) const { QString monitoring = toShift(result); QString table = toShift(result); QString degree = toShift(result); QString instances = toShift(result); QString organization = toShift(result); QString ret; if (PROMPT) ret = QString("PROMPT CREATE TABLE %1%2\n\n").arg(schema).arg(QUOTE(name)); ret += QString("CREATE TABLE %1%2\n(\n ").arg(schema).arg(QUOTE(name)); ret += tableColumns(ext, owner, name); if (organization == "INDEX" && ext.getStorage()) { toQList res = toQuery::readQueryNull(CONNECTION, SQLPrimaryKey, name, owner); if (res.size() != 2) throw qApp->translate("toOracleExtract", "Couldn't find primary key of %1.%2").arg(owner).arg(name); QString primary = *(res.begin()); QString tablespace = *(res.rbegin()); ret += QString(" , CONSTRAINT %1 PRIMARY KEY\n").arg(QUOTE(primary)); ret += indexColumns(ext, " ", owner, primary); ret += QString(" USING TABLESPACE %2\n").arg(QUOTE(tablespace)); } ret += ")\n"; if (CONNECTION.version() >= "0800" && ext.getStorage() && ! organization.isEmpty() ) { ret += "ORGANIZATION "; ret += organization; ret += "\n"; } if (CONNECTION.version() >= "0801" && ext.getStorage() && ! monitoring.isEmpty() ) { ret += monitoring; ret += "\n"; } if (ext.getParallel() && ! degree.isEmpty() && ! instances.isEmpty() ) ret += QString("PARALLEL\n" "(\n" " DEGREE %1\n" " INSTANCES %2\n" ")\n"). arg(degree). arg(instances); toUnShift(result, toQValue(organization)); toUnShift(result, toQValue("")); ret += segmentAttributes(ext, result); return ret; } static toSQL SQLMViewInfo("toOracleExtract:MaterializedViewInfo", " SELECT\n" " m.container_name\n" " , DECODE(\n" " m.build_mode\n" " ,'YES','USING PREBUILT TABLE'\n" " ,DECODE(\n" " m.last_refresh_date\n" " ,null,'BUILD DEFERRED'\n" " ,'BUILD IMMEDIATE'\n" " )\n" " ) AS build_mode\n" " , DECODE(\n" " m.refresh_method\n" " ,'NEVER','NEVER REFRESH'\n" " ,'REFRESH ' || m.refresh_method\n" " ) AS refresh_method\n" " , DECODE(\n" " m.refresh_mode\n" " ,'NEVER',null\n" " ,'ON ' || m.refresh_mode\n" " ) AS refresh_mode\n" " , TO_CHAR(s.start_with, 'DD-MON-YYYY HH24:MI:SS')\n" " AS start_with\n" " , s.next\n" " , DECODE(\n" " s.refresh_method\n" " ,'PRIMARY KEY','WITH PRIMARY KEY'\n" " ,'ROWID' ,'WITH ROWID'\n" " ,null\n" " ) AS using_pk\n" " , s.master_rollback_seg\n" " , DECODE(\n" " m.updatable\n" " ,'N',null\n" " ,DECODE(\n" " m.rewrite_enabled\n" " ,'Y','FOR UPDATE ENABLE QUERY REWRITE'\n" " ,'N','FOR UPDATE DISABLE QUERY REWRITE'\n" " )\n" " ) AS updatable\n" " , s.query\n" " FROM\n" " sys.all_mviews m\n" " , sys.all_snapshots s\n" " WHERE\n" " m.mview_name = :nam\n" " AND s.name = m.mview_name\n" " AND m.owner = :own\n" " AND s.owner = m.owner", "Get information about materialized view, must have same columns and binds"); static toSQL SQLIndexName("toOracleExtract:TableIndexes", "SELECT index_name\n" " FROM sys.all_indexes\n" " WHERE table_name = :nam\n" " AND owner = own", "Get indexes available to a table, must have same binds and columns"); QString toOracleExtract::createMView(toExtract &ext, const QString &schema, const QString &owner, const QString &name, const QString &type) const { toQList result = toQuery::readQueryNull(CONNECTION, SQLMViewInfo, name, owner); if (result.empty()) throw qApp->translate("toOracleExtract", "Couldn't find materialised table %1.%2"). arg(QUOTE(owner)).arg(QUOTE(name)); QString table = toShift(result); QString buildMode = toShift(result); QString refreshMethod = toShift(result); QString refreshMode = toShift(result); QString startWith = toShift(result); QString next = toShift(result); QString usingPK = toShift(result); QString masterRBSeg = toShift(result); QString updatable = toShift(result); QString query = toShift(result); toQuery inf(CONNECTION, SQLIndexName, table, owner); QString index(inf.readValue()); QString ret; QString sql = QString("CREATE %1 %2%3\n").arg(type).arg(schema).arg(QUOTE(name)); if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n"; } ret += sql; ret += createMViewTable(ext, schema, owner, table); ret += buildMode; ret += "\nUSING INDEX\n"; ret += createMViewIndex(ext, schema, owner, index); if (refreshMethod != "NEVER REFRESH") { if (!startWith.isEmpty()) ret += QString("START WITH TO_DATE('%1','DD-MM-YYYY HH24:MI:SS')\n"). arg(startWith); if (!next.isEmpty()) ret += QString("NEXT %1\n").arg(next); if (!usingPK.isEmpty()) { ret += usingPK; ret += "\n"; } if (!masterRBSeg.isEmpty() && ext.getStorage()) ret += QString("USING MASTER ROLLBACK SEGMENT %1\n"). arg(QUOTE(masterRBSeg)); } if (!updatable.isEmpty()) { ret += updatable; ret += "\n"; } ret += "AS\n"; ret += query; ret += ";\n\n"; return ret; } QString toOracleExtract::createMViewIndex(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { if (!ext.getStorage() || !ext.getParallel()) return ""; ext.setState("IsASnapIndex", true); static QRegExp start("^INITRANS"); static QRegExp ignore("LOGGING"); bool started = false; bool done = false; QString initial = createIndex(ext, schema, owner, name); QStringList linesIn = initial.split("\n"); QString ret; for (QStringList::Iterator i = linesIn.begin();i != linesIn.end() && !done;i++) { if (start.indexIn(*i) >= 0) started = true; if (started) { QString line = *i; if (line.length() > 0 && line.at(line.length() - 1) == ';') { line.truncate(line.length() - 1); done = true; } if (ignore.indexIn(line) < 0 && line.length() > 0) { ret += line; ret += "\n"; } } } ext.setState("IsASnapIndex", false); return ret; } static toSQL SQLSnapshotInfo("toOracleExtract:SnapshotInfo", "SELECT log_table,\n" " rowids,\n" " primary_key,\n" " filter_columns\n" " FROM sys.all_snapshot_logs\n" " AND master = :nam\n" " AND log_owner = :own", "Get information about snapshot or materialized view log, " "must have same binds and columns"); static toSQL SQLSnapshotColumns("toOracleExtract:SnapshotColumns", "SELECT\n" " column_name\n" " FROM\n" " sys.dba_snapshot_log_filter_cols\n" " WHERE\n" " name = :nam\n" " AND owner = :own\n" " MINUS\n" " SELECT\n" " column_name\n" " FROM\n" " sys.all_cons_columns c\n" " , sys.all_constraints d\n" " WHERE\n" " d.table_name = :nam\n" " AND d.constraint_type = 'P'\n" " AND c.table_name = d.table_name\n" " AND c.constraint_name = d.constraint_name\n" " AND d.owner = :own\n" " AND c.owner = d.owner", "Get columns of snapshot log, must have same columns and binds"); QString toOracleExtract::createMViewLog(toExtract &ext, const QString &schema, const QString &owner, const QString &name, const QString &type) const { toQList result = toQuery::readQueryNull(CONNECTION, SQLSnapshotInfo, name, owner); if (result.size() != 4) throw qApp->translate("toOracleExtract", "Couldn't find log %1.%2").arg(owner).arg(name); QString table = toShift(result); QString rowIds = toShift(result); QString primaryKey = toShift(result); QString filterColumns = toShift(result); QString ret; QString sql = QString("CREATE %1 LOG ON %2%3\n"). arg(type). arg(schema). arg(QUOTE(name)); if (PROMPT) { QString ret = "PROMPT "; ret += sql; ret += "\n"; } ret += sql; ret += createMViewTable(ext, schema, owner, table); if (rowIds == "YES" && primaryKey == "YES") ret += "WITH PRIMARY KEY, ROWID "; else if (rowIds == "YES") ret += "WITH ROWID "; else if (primaryKey == "YES") ret += "WITH PRIMARY KEY"; toQuery inf(CONNECTION, SQLSnapshotColumns, name, owner); bool first = true; if (!inf.eof()) { ret += "\n(\n "; while (!inf.eof()) { if (first) first = false; else ret += "\n , "; ret += QUOTE(inf.readValue()); } ret += ")"; } ret += ";\n\n"; return ret; } QString toOracleExtract::createMViewTable(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { if (!ext.getStorage() || !ext.getParallel()) return ""; ext.setState("IsASnapTable", true); static QRegExp parallel("^PARALLEL"); bool started = false; bool done = false; QString initial = createTable(ext, schema, owner, name); QStringList linesIn = initial.split("\n"); QString ret; for (QStringList::Iterator i = linesIn.begin();i != linesIn.end() && !done;i++) { if (parallel.indexIn(*i) >= 0) started = true; if (started) { QString line = *i; if (line.length() > 0 && line.at(line.length() - 1) == ';') { line.truncate(line.length() - 1); done = true; } if (line.length()) { ret += line; ret += "\n"; } } } ext.setState("IsASnapTable", false); return ret; } static toSQL SQLPartitionedIOTInfo("toOracleExtract:PartitionedIOTInfo", "SELECT\n" " DECODE(\n" " t.monitoring\n" " ,'NO','NOMONITORING'\n" " , 'MONITORING'\n" " ) AS monitoring\n" " , t.table_name\n" " , LTRIM(t.degree) AS degree\n" " , LTRIM(t.instances) AS instances\n" " , 'INDEX' AS organization\n" " , DECODE(\n" " LTRIM(t.cache)\n" " ,'Y','CACHE'\n" " , 'NOCACHE'\n" " ) AS cache\n" " , 'N/A' AS pct_used\n" " , p.def_pct_free AS pct_free\n" " , p.def_ini_trans AS ini_trans\n" " , p.def_max_trans AS max_trans\n" " ,DECODE(\n" " p.def_initial_extent\n" " ,'DEFAULT',s.initial_extent\n" " ,p.def_initial_extent * :bs * 1024\n" " ) AS initial_extent\n" " ,DECODE(\n" " p.def_next_extent\n" " ,'DEFAULT',s.next_extent\n" " ,p.def_next_extent * :bs * 1024\n" " ) AS next_extent\n" " , DECODE(\n" " p.def_min_extents\n" " ,'DEFAULT',s.min_extents\n" " ,p.def_min_extents\n" " ) AS min_extents\n" " , DECODE(\n" " p.def_max_extents\n" " ,'DEFAULT',DECODE(\n" " s.max_extents\n" " ,2147483645,'unlimited'\n" " ,s.max_extents\n" " )\n" " ,2147483645,'unlimited'\n" " ,p.def_max_extents\n" " ) AS max_extents\n" " , DECODE(\n" " p.def_pct_increase\n" " ,'DEFAULT',s.pct_increase\n" " ,p.def_pct_increase\n" " ) AS pct_increase\n" " , DECODE(\n" " p.def_freelists\n" " ,0,1\n" " ,NVL(p.def_freelists,1)\n" " ) AS freelists\n" " , DECODE(\n" " p.def_freelist_groups\n" " ,0,1\n" " ,NVL(p.def_freelist_groups,1)\n" " ) AS freelist_groups\n" " , p.def_buffer_pool AS buffer_pool\n" " , DECODE(\n" " p.def_logging \n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , p.def_tablespace_name AS tablespace_name\n" " , t.blocks - NVL(t.empty_blocks,0)\n" " FROM\n" " sys.all_all_tables t\n" " , sys.all_part_indexes p\n" " , sys.dba_tablespaces s\n" " WHERE\n" " t.table_name = :name\n" " AND p.table_name = t.table_name\n" " AND s.tablespace_name = p.def_tablespace_name\n" " AND t.owner = :own\n" " AND p.owner = t.owner", "Get information about a partitioned indexed organized table, " "must have same columns and binds", "0801"); static toSQL SQLPartitionedIOTInfo8("toOracleExtract:PartitionedIOTInfo", "SELECT\n" " 'N/A' AS monitoring\n" " , t.table_name\n" " , LTRIM(t.degree) AS degree\n" " , LTRIM(t.instances) AS instances\n" " , 'INDEX' AS organization\n" " , DECODE(\n" " LTRIM(t.cache)\n" " ,'Y','CACHE'\n" " , 'NOCACHE'\n" " ) AS cache\n" " , 'N/A' AS pct_used\n" " , p.def_pct_free AS pct_free\n" " , p.def_ini_trans AS ini_trans\n" " , p.def_max_trans AS max_trans\n" " ,DECODE(\n" " p.def_initial_extent\n" " ,'DEFAULT',s.initial_extent\n" " ,p.def_initial_extent * :bs * 1024\n" " ) AS initial_extent\n" " ,DECODE(\n" " p.def_next_extent\n" " ,'DEFAULT',s.next_extent\n" " ,p.def_next_extent * :bs * 1024\n" " ) AS next_extent\n" " , DECODE(\n" " p.def_min_extents\n" " ,'DEFAULT',s.min_extents\n" " ,p.def_min_extents\n" " ) AS min_extents\n" " , DECODE(\n" " p.def_max_extents\n" " ,'DEFAULT',DECODE(\n" " s.max_extents\n" " ,2147483645,'unlimited'\n" " ,s.max_extents\n" " )\n" " ,2147483645,'unlimited'\n" " ,p.def_max_extents\n" " ) AS max_extents\n" " , DECODE(\n" " p.def_pct_increase\n" " ,'DEFAULT',s.pct_increase\n" " ,p.def_pct_increase\n" " ) AS pct_increase\n" " , DECODE(\n" " p.def_freelists\n" " ,0,1\n" " ,NVL(p.def_freelists,1)\n" " ) AS freelists\n" " , DECODE(\n" " p.def_freelist_groups\n" " ,0,1\n" " ,NVL(p.def_freelist_groups,1)\n" " ) AS freelist_groups\n" " , 'N/A' AS buffer_pool\n" " , DECODE(\n" " p.def_logging \n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , p.def_tablespace_name AS tablespace_name\n" " , t.blocks - NVL(t.empty_blocks,0)\n" " FROM\n" " sys.all_all_tables t\n" " , sys.all_part_indexes p\n" " , sys.dba_tablespaces s\n" " WHERE\n" " t.table_name = :name\n" " AND p.table_name = t.table_name\n" " AND s.tablespace_name = p.def_tablespace_name\n" " AND t.owner = :own\n" " AND p.owner = t.owner", "", "0800"); static toSQL SQLPartitionIndexNames("toOracleExtract:PartitionIndexNames", "SELECT index_name\n" " FROM sys.all_part_indexes\n" " WHERE table_name = :nam\n" " AND owner = :own\n" " ORDER BY index_name", "Index names of partition table, " "must have same binds and columns"); QString toOracleExtract::createPartitionedIOT(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { toQList result = toQuery::readQueryNull(CONNECTION, SQLPartitionedIOTInfo, QString::number(ext.getBlockSize()), name, owner); QString ret = createTableText(ext, result, schema, owner, name); if (ext.getStorage()) { toQList overflow = toQuery::readQueryNull(CONNECTION, segments(ext, SQLOverflowInfo), name, owner); if (overflow.size() == 18) { ret += "OVERFLOW\n"; ret += segmentAttributes(ext, overflow); } } if (ext.getPartition()) { toQuery inf(CONNECTION, SQLPartitionIndexNames, name, owner); if (!inf.eof()) throw qApp->translate("toOracleExtract", "Couldn't find index partitions for %1.%2").arg(owner).arg(name); QString index(inf.readValue()); ret += "PARTITION BY RANGE\n" "(\n "; ret += partitionKeyColumns(ext, owner, name, "TABLE"); ret += "\n)\n"; ret += rangePartitions(ext, owner, index, "NONE", "IOT"); } ret += createComments(ext, schema, owner, name); return ret; } static toSQL SQLIndexPartition8("toOracleExtract:IndexPartition", "SELECT\n" " i.partitioning_type\n" " , 'N/A' AS subpartitioning_type\n" " , i.locality\n" " , 0 AS compressed\n" " , 'INDEX' AS organization\n" " , 'N/A' AS cache\n" " , 'N/A' AS pct_used\n" " , i.def_pct_free\n" " , DECODE(\n" " i.def_ini_trans\n" " ,0,1\n" " ,null,1\n" " ,i.def_ini_trans\n" " ) AS ini_trans\n" " , DECODE(\n" " i.def_max_trans\n" " ,0,255\n" " ,null,255\n" " ,i.def_max_trans\n" " ) AS max_trans\n" " ,DECODE(\n" " i.def_initial_extent\n" " ,'DEFAULT',s.initial_extent\n" " ,i.def_initial_extent * :bs * 1024\n" " ) AS initial_extent\n" " ,DECODE(\n" " i.def_next_extent\n" " ,'DEFAULT',s.next_extent\n" " ,i.def_next_extent * :bs * 1024\n" " ) AS next_extent\n" " , DECODE(\n" " i.def_min_extents\n" " ,'DEFAULT',s.min_extents\n" " ,i.def_min_extents\n" " ) AS min_extents\n" " , DECODE(\n" " i.def_max_extents\n" " ,'DEFAULT',DECODE(\n" " s.max_extents\n" " ,2147483645,'unlimited'\n" " ,s.max_extents\n" " )\n" " ,2147483645,'unlimited'\n" " ,i.def_max_extents\n" " ) AS max_extents\n" " , DECODE(\n" " i.def_pct_increase\n" " ,'DEFAULT',s.pct_increase\n" " ,i.def_pct_increase\n" " ) AS pct_increase\n" " , DECODE(\n" " i.def_freelists\n" " ,0,1\n" " ,null,1\n" " ,i.def_freelists\n" " ) AS freelists\n" " , DECODE(\n" " i.def_freelist_groups\n" " ,0,1\n" " ,null,1\n" " ,i.def_freelist_groups\n" " ) AS freelist_groups\n" " , 'N/A' AS buffer_pool\n" " , DECODE(\n" " i.def_logging\n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , NVL(i.def_tablespace_name,s.tablespace_name)\n" " , GREATEST(\n" " DECODE(\n" " i.def_initial_extent\n" " ,'DEFAULT',s.initial_extent / :bs / 1024\n" " ,i.def_initial_extent\n" " )\n" " ,DECODE(\n" " i.def_next_extent\n" " ,'DEFAULT',s.next_extent / :bs / 1024\n" " ,i.def_next_extent\n" " )\n" " ) AS blocks\n" " FROM\n" " sys.all_part_indexes i\n" " , sys.dba_tablespaces s\n" " , sys.all_part_tables t\n" " WHERE\n" " i.index_name = :nam\n" " AND t.table_name = i.table_name\n" " AND s.tablespace_name = t.def_tablespace_name\n" " AND i.owner = :own\n" " AND n.owner = i.owner\n" " AND t.owner = i.owner", "Get information about index partitions, " "must have same columns and same columns", "0800"); static toSQL SQLIndexPartition("toOracleExtract:IndexPartition", "SELECT\n" " i.partitioning_type\n" " , i.subpartitioning_type\n" " , i.locality\n" " , DECODE(\n" " n.compression\n" " ,'ENABLED',n.prefix_length\n" " ,0\n" " ) AS compressed\n" " , 'INDEX' AS organization\n" " , 'N/A' AS cache\n" " , 'N/A' AS pct_used\n" " , i.def_pct_free\n" " , DECODE(\n" " i.def_ini_trans\n" " ,0,1\n" " ,null,1\n" " ,i.def_ini_trans\n" " ) AS ini_trans\n" " , DECODE(\n" " i.def_max_trans\n" " ,0,255\n" " ,null,255\n" " ,i.def_max_trans\n" " ) AS max_trans\n" " ,DECODE(\n" " i.def_initial_extent\n" " ,'DEFAULT',s.initial_extent\n" " ,i.def_initial_extent * :bs * 1024\n" " ) AS initial_extent\n" " ,DECODE(\n" " i.def_next_extent\n" " ,'DEFAULT',s.next_extent\n" " ,i.def_next_extent * :bs * 1024\n" " ) AS next_extent\n" " , DECODE(\n" " i.def_min_extents\n" " ,'DEFAULT',s.min_extents\n" " ,i.def_min_extents\n" " ) AS min_extents\n" " , DECODE(\n" " i.def_max_extents\n" " ,'DEFAULT',DECODE(\n" " s.max_extents\n" " ,2147483645,'unlimited'\n" " ,s.max_extents\n" " )\n" " ,2147483645,'unlimited'\n" " ,i.def_max_extents\n" " ) AS max_extents\n" " , DECODE(\n" " i.def_pct_increase\n" " ,'DEFAULT',s.pct_increase\n" " ,i.def_pct_increase\n" " ) AS pct_increase\n" " , DECODE(\n" " i.def_freelists\n" " ,0,1\n" " ,null,1\n" " ,i.def_freelists\n" " ) AS freelists\n" " , DECODE(\n" " i.def_freelist_groups\n" " ,0,1\n" " ,null,1\n" " ,i.def_freelist_groups\n" " ) AS freelist_groups\n" " , i.def_buffer_pool AS buffer_pool\n" " , DECODE(\n" " i.def_logging\n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , NVL(i.def_tablespace_name,s.tablespace_name)\n" " , GREATEST(\n" " DECODE(\n" " i.def_initial_extent\n" " ,'DEFAULT',s.initial_extent / :bs / 1024\n" " ,i.def_initial_extent\n" " )\n" " ,DECODE(\n" " i.def_next_extent\n" " ,'DEFAULT',s.next_extent / :bs / 1024\n" " ,i.def_next_extent\n" " )\n" " ) AS blocks\n" " FROM\n" " sys.all_part_indexes i\n" " , sys.all_indexes n\n" " , sys.dba_tablespaces s\n" " , sys.all_part_tables t\n" " WHERE\n" " i.index_name = :nam\n" " AND n.index_name = i.index_name\n" " AND t.table_name = i.table_name\n" " AND s.tablespace_name = t.def_tablespace_name\n" " AND i.owner = :own\n" " AND n.owner = i.owner\n" " AND t.owner = i.owner", "", "0801"); QString toOracleExtract::createPartitionedIndex(toExtract &ext, const QString &, const QString &owner, const QString &name, const QString &sql) const { if (!ext.getPartition()) return ""; QString ret = sql; toQList result = toQuery::readQueryNull(CONNECTION, SQLIndexPartition, QString::number(ext.getBlockSize()), name, owner); QString partitionType = toShift(result); QString subPartitionType = toShift(result); QString locality = toShift(result); QString compressed = toShift(result); toUnShift(result, toQValue("")); ret += segmentAttributes(ext, result); if (!compressed.isEmpty()) { ret += "COMPRESS "; ret += compressed; ret += "\n"; } if (locality == "GLOBAL") { ret += "GLOBAL PARTITION BY RANGE\n" "(\n" " "; ret += partitionKeyColumns(ext, owner, name, "INDEX"); ret += "\n)\n"; ret += rangePartitions(ext, owner, name, subPartitionType, "GLOBAL"); } else { ret += "LOCAL\n"; if (partitionType == "RANGE") ret += rangePartitions(ext, owner, name, subPartitionType, "LOCAL"); } return ret; } static toSQL SQLPartitionTableInfo("toOracleExtract:PartitionTableInfo", "SELECT\n" " DECODE(\n" " t.monitoring\n" " ,'NO','NOMONITORING'\n" " , 'MONITORING'\n" " ) AS monitoring\n" " , t.table_name\n" " , LTRIM(t.degree) AS degree\n" " , LTRIM(t.instances) AS instances\n" " , DECODE(\n" " t.iot_type\n" " ,'IOT','INDEX'\n" " , 'HEAP'\n" " ) AS organization\n" " , DECODE(\n" " LTRIM(t.cache)\n" " ,'Y','CACHE'\n" " , 'NOCACHE'\n" " ) AS cache\n" " , p.def_pct_used\n" " , p.def_pct_free AS pct_free\n" " , p.def_ini_trans AS ini_trans\n" " , p.def_max_trans AS max_trans\n" " ,DECODE(\n" " p.def_initial_extent\n" " ,'DEFAULT',s.initial_extent\n" " ,p.def_initial_extent * :bs * 1024\n" " ) AS initial_extent\n" " ,DECODE(\n" " p.def_next_extent\n" " ,'DEFAULT',s.next_extent\n" " ,p.def_next_extent * :bs * 1024\n" " ) AS next_extent\n" " , DECODE(\n" " p.def_min_extents\n" " ,'DEFAULT',s.min_extents\n" " ,p.def_min_extents\n" " ) AS min_extents\n" " , DECODE(\n" " p.def_max_extents\n" " ,'DEFAULT',DECODE(\n" " s.max_extents\n" " ,2147483645,'unlimited'\n" " ,s.max_extents\n" " )\n" " ,2147483645,'unlimited'\n" " ,p.def_max_extents\n" " ) AS max_extents\n" " , DECODE(\n" " p.def_pct_increase\n" " ,'DEFAULT',s.pct_increase\n" " ,p.def_pct_increase\n" " ) AS pct_increase\n" " , DECODE(\n" " p.def_freelists\n" " ,0,1\n" " ,NVL(p.def_freelists,1)\n" " ) AS freelists\n" " , DECODE(\n" " p.def_freelist_groups\n" " ,0,1\n" " ,NVL(p.def_freelist_groups,1)\n" " ) AS freelist_groups\n" " , p.def_buffer_pool AS buffer_pool\n" " , DECODE(\n" " p.def_logging \n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , p.def_tablespace_name AS tablespace_name\n" " , t.blocks - NVL(t.empty_blocks,0)\n" " FROM\n" " sys.all_all_tables t\n" " , sys.all_part_tables p\n" " , sys.dba_tablespaces s\n" " WHERE\n" " t.table_name = :nam\n" " AND p.table_name = t.table_name\n" " AND s.tablespace_name = p.def_tablespace_name\n" " AND t.owner = :own\n" " AND p.owner = t.owner", "Get storage information about a partitioned table, " "same binds and columns", "0801"); static toSQL SQLPartitionTableInfo8("toOracleExtract:PartitionTableInfo", "SELECT\n" " 'N/A' AS monitoring\n" " , t.table_name\n" " , LTRIM(t.degree) AS degree\n" " , LTRIM(t.instances) AS instances\n" " , DECODE(\n" " t.iot_type\n" " ,'IOT','INDEX'\n" " , 'HEAP'\n" " ) AS organization\n" " , DECODE(\n" " LTRIM(t.cache)\n" " ,'Y','CACHE'\n" " , 'NOCACHE'\n" " ) AS cache\n" " , p.def_pct_used\n" " , p.def_pct_free AS pct_free\n" " , p.def_ini_trans AS ini_trans\n" " , p.def_max_trans AS max_trans\n" " ,DECODE(\n" " p.def_initial_extent\n" " ,'DEFAULT',s.initial_extent\n" " ,p.def_initial_extent * :bs * 1024\n" " ) AS initial_extent\n" " ,DECODE(\n" " p.def_next_extent\n" " ,'DEFAULT',s.next_extent\n" " ,p.def_next_extent * :bs * 1024\n" " ) AS next_extent\n" " , DECODE(\n" " p.def_min_extents\n" " ,'DEFAULT',s.min_extents\n" " ,p.def_min_extents\n" " ) AS min_extents\n" " , DECODE(\n" " p.def_max_extents\n" " ,'DEFAULT',DECODE(\n" " s.max_extents\n" " ,2147483645,'unlimited'\n" " ,s.max_extents\n" " )\n" " ,2147483645,'unlimited'\n" " ,p.def_max_extents\n" " ) AS max_extents\n" " , DECODE(\n" " p.def_pct_increase\n" " ,'DEFAULT',s.pct_increase\n" " ,p.def_pct_increase\n" " ) AS pct_increase\n" " , DECODE(\n" " p.def_freelists\n" " ,0,1\n" " ,NVL(p.def_freelists,1)\n" " ) AS freelists\n" " , DECODE(\n" " p.def_freelist_groups\n" " ,0,1\n" " ,NVL(p.def_freelist_groups,1)\n" " ) AS freelist_groups\n" " , 'N/A' AS buffer_pool\n" " , DECODE(\n" " p.def_logging \n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , p.def_tablespace_name AS tablespace_name\n" " , t.blocks - NVL(t.empty_blocks,0)\n" " FROM\n" " sys.all_all_tables t\n" " , sys.all_part_tables p\n" " , sys.dba_tablespaces s\n" " WHERE\n" " t.table_name = :nam\n" " AND p.table_name = t.table_name\n" " AND s.tablespace_name = p.def_tablespace_name\n" " AND t.owner = :own\n" " AND p.owner = t.owner", "", "0800"); static toSQL SQLPartitionType("toOracleExtract:PartitionType", "SELECT\n" " partitioning_type\n" " , partition_count\n" " , subpartitioning_type\n" " , def_subpartition_count\n" " FROM\n" " sys.all_part_tables\n" " WHERE\n" " table_name = :nam\n" " AND owner = :own", "Get partition type, must have same binds and columns", "0801"); static toSQL SQLPartitionType8("toOracleExtract:PartitionType", "SELECT\n" " partitioning_type\n" " , partition_count\n" " , 'N/A' AS subpartitioning_type\n" " , 'N/A' AS def_subpartition_count\n" " FROM\n" " sys.all_part_tables\n" " WHERE\n" " table_name = :nam\n" " AND owner = :own", "", "0800"); static toSQL SQLPartitionSegment("toOracleExtract:PartitionSegment", "SELECT\n" " partition_name\n" " , high_value\n" " , 'N/A'\n" " , pct_used\n" " , pct_free\n" " , ini_trans\n" " , max_trans\n" " , initial_extent\n" " , next_extent\n" " , min_extent\n" " , DECODE(\n" " max_extent\n" " ,2147483645,'unlimited'\n" " , max_extent\n" " ) AS max_extents\n" " , pct_increase\n" " , NVL(freelists,1)\n" " , NVL(freelist_groups,1)\n" " , buffer_pool\n" " , DECODE(\n" " logging \n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , tablespace_name\n" " , blocks - NVL(empty_blocks,0)\n" " FROM\n" " sys.all_tab_partitions\n" " WHERE table_name = :nam\n" " AND table_owner = :own\n" " ORDER BY partition_name", "Information about segment storage for partitioned tables, " "must have same binds and columns", "0801"); static toSQL SQLPartitionSegment8("toOracleExtract:PartitionSegment", "SELECT\n" " partition_name\n" " , high_value\n" " , 'N/A'\n" " , pct_used\n" " , pct_free\n" " , ini_trans\n" " , max_trans\n" " , initial_extent\n" " , next_extent\n" " , min_extent\n" " , DECODE(\n" " max_extent\n" " ,2147483645,'unlimited'\n" " , max_extent\n" " ) AS max_extents\n" " , pct_increase\n" " , NVL(freelists,1)\n" " , NVL(freelist_groups,1)\n" " , 'N/A' AS buffer_pool\n" " , DECODE(\n" " logging \n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , tablespace_name\n" " , blocks - NVL(empty_blocks,0)\n" " FROM\n" " sys.all_tab_partitions\n" " WHERE table_name = :nam\n" " AND table_owner = :own\n" " ORDER BY partition_name", "", "0800"); static toSQL SQLSubPartitionName("toOracleExtract:SubPartitionName", "SELECT subpartition_name,\n" " tablespace_name\n" " FROM sys.all_tab_subpartitions\n" " WHERE table_name = :nam\n" " AND partition_name = :prt\n" " AND table_owner = :own\n" " ORDER BY subpartition_name", "Get information about sub partitions, " "must have same columns and binds"); static toSQL SQLPartitionName("toOracleExtract:PartitionName", "SELECT partition_name,\n" " tablespace_name\n" " FROM sys.all_tab_partitions\n" " WHERE table_name = :nam\n" " AND table_owner = :own\n" " ORDER BY partition_name", "Get information about hash partition names, " "must have same columns and binds"); QString toOracleExtract::createPartitionedTable(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { toQList storage = toQuery::readQueryNull(CONNECTION, SQLPartitionTableInfo, QString::number(ext.getBlockSize()), name, owner); QString organization; { toQList::iterator i = storage.begin(); i++; i++; i++; i++; organization = *i; } QString ret = createTableText(ext, storage, schema, owner, name); if (ext.getPartition()) { toQList type = toQuery::readQueryNull(CONNECTION, SQLPartitionType, name, owner); QString partitionType (toShift(type)); QString partitionCount (toShift(type)); QString subPartitionType (toShift(type)); QString subPartitionCount(toShift(type)); ret += QString("PARTITION BY %1\n(\n ").arg(partitionType); ret += partitionKeyColumns(ext, owner, name, "TABLE"); ret += "\n)\n"; if (partitionType == "RANGE") { if (subPartitionType == "HASH") { ret += "SUBPARTITIONED BY HASH\n(\n "; ret += subPartitionKeyColumns(ext, owner, name, "TABLE"); ret += "\n)\nSUBPARTITIONS "; ret += subPartitionCount; ret += "\n"; } ret += "(\n"; toQList segment = toQuery::readQueryNull(CONNECTION, SQLPartitionSegment, name, owner); QString comma = " "; while (!segment.empty()) { toQList storage; QString partition = toShift(segment); QString highValue = toShift(segment); toPush(storage, toQValue(" ")); toPush(storage, toQValue(organization)); for (int i = 0;i < 16;i++) toPush(storage, toShift(segment)); ret += comma; ret += QString("PARTITION %1 VALUES LESS THAN\n" " (\n" " %2\n" " )\n").arg(QUOTE(partition)).arg(highValue); ret += segmentAttributes(ext, storage); comma = " , "; if (subPartitionType == "HASH") { toQList subs = toQuery::readQueryNull(CONNECTION, SQLSubPartitionName, name, partition, owner); bool first = true; ret += " (\n "; while (!subs.empty()) { if (first) first = false; else ret += "\n , "; ret += QString("SUBPARTITION %2 TABLESPACE %1"). arg(QUOTE(toShift(subs))). arg(QUOTE(toShift(subs))); } ret += "\n )\n"; } } } else { toQList hash = toQuery::readQueryNull(CONNECTION, SQLPartitionName, name, owner); bool first = true; ret += "(\n "; while (!hash.empty()) { if (first) first = false; else ret += "\n , "; ret += QString("PARTITION %2 TABLESPACE %1"). arg(QUOTE(toShift(hash))). arg(QUOTE(toShift(hash))); } } ret += ")\n"; } ret += ";\n\n"; ret += createComments(ext, schema, owner, name); return ret; } static toSQL SQLRolePrivs("toOracleExtract:RolePrivs", "SELECT\n" " granted_role\n" " , DECODE(\n" " admin_option\n" " ,'YES','WITH ADMIN OPTION'\n" " ,null\n" " ) AS admin_option\n" " FROM sys.dba_role_privs\n" " WHERE grantee = :nam\n" " ORDER BY granted_role", "Get roles granted, must have same columns and binds"); static toSQL SQLSystemPrivs("toOracleExtract:SystemPrivs", "SELECT\n" " privilege\n" " , DECODE(\n" " admin_option\n" " ,'YES','WITH ADMIN OPTION'\n" " ,null\n" " ) AS admin_option\n" " FROM sys.dba_sys_privs\n" " WHERE grantee = :nam\n" " ORDER BY privilege", "Get system priveleges granted, must have same columns and binds"); static toSQL SQLObjectPrivs("toOracleExtract:ObjectPrivs", "SELECT privilege\n" " , table_schema\n" " , table_name\n" " , DECODE(\n" " grantable\n" " ,'YES','WITH GRANT OPTION'\n" " ,null\n" " ) AS grantable\n" " FROM sys.all_tab_privs\n" " WHERE grantee = :nam\n" " ORDER BY table_name,privilege", "Get object priveleges granted, must have same columns and binds"); QString toOracleExtract::grantedPrivs(toExtract &ext, const QString &dest, const QString &name, int typ) const { if (!ext.getGrants()) return ""; QString ret; if ((typ&1) == 1) { toQList result = toQuery::readQueryNull(CONNECTION, SQLSystemPrivs, name); while (!result.empty()) { QString priv = QString(toShift(result)).toLower(); QString sql = QString("GRANT %1 TO %2 %3"). arg(priv). arg(dest). arg(toShift(result)); if (PROMPT) { ret += "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; } } if ((typ&2) == 2) { toQList result = toQuery::readQueryNull(CONNECTION, SQLRolePrivs, name); while (!result.empty()) { QString priv = QString(toShift(result)).toLower(); QString sql = QString("GRANT %1 TO %2 %3"). arg(priv). arg(dest). arg(toShift(result)); if (PROMPT) { ret += "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; } } if ((typ&4) == 4) { toQList result = toQuery::readQueryNull(CONNECTION, SQLObjectPrivs, name); while (!result.empty()) { QString priv = QString(toShift(result)).toLower(); QString schema = ext.intSchema(toShift(result), false); QString object = QUOTE(toShift(result)); QString sql = QString("GRANT %1 ON %2%3 TO %4 %5"). arg(priv.toLower()). arg(schema). arg(object). arg(dest). arg(toShift(result)); if (PROMPT) { ret += "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; } } return ret; } static toSQL SQLIndexColumns("toOracleExtract:IndexColumns", "SELECT column_name,\n" " descend\n" " FROM sys.all_ind_columns\n" " WHERE index_name = :nam\n" " AND index_owner = :own\n" " ORDER BY column_position", "Get column names from index, same binds and columns", "0801"); static toSQL SQLIndexColumns7("toOracleExtract:IndexColumns", "SELECT column_name,\n" " 'ASC'\n" " FROM sys.all_ind_columns\n" " WHERE index_name = :nam\n" " AND index_owner = :own\n" " ORDER BY column_position", "", "07"); static toSQL SQLIndexFunction("toOracleExtract:IndexFunction", "SELECT c.default$\n" " FROM sys.col$ c,\n" " sys.all_indexes i,\n" " sys.all_objects o\n" " WHERE i.index_name = :ind\n" " AND o.object_name = i.table_name\n" " AND c.obj# = o.object_id\n" " AND c.name = :tab\n" " AND i.owner = :own\n" " AND o.owner = i.table_owner", "Get function of index column, same column and binds"); QString toOracleExtract::indexColumns(toExtract &ext, const QString &indent, const QString &owner, const QString &name) const { static QRegExp quote("\""); static QRegExp func("^sys_nc[0-9]+", Qt::CaseInsensitive); toQuery inf(CONNECTION, SQLIndexColumns, name, owner); QString ret = indent; ret += "(\n"; bool first = true; while (!inf.eof()) { QString col = inf.readValue(); QString asc = inf.readValue(); QString row; if (func.indexIn(col) >= 0) { toQuery def(CONNECTION, SQLIndexFunction, name, col, owner); if (!def.eof()) { QString function(def.readValue()); function.replace(quote, ""); if (asc == "DESC") row = QString("%1 DESC").arg(function, 30); else row = function; } else if (asc == "DESC") row = QString("%1 DESC").arg(QUOTE(col)); else row = QUOTE(col); } else if (asc == "DESC") row = QString("%1 DESC").arg(QUOTE(col)); else row = QUOTE(col); ret += indent; if (first) { first = false; ret += " "; } else ret += " , "; ret += row; ret += "\n"; } ret += indent; ret += ")\n"; return ret; } static toSQL SQLRangePartitions("toOracleExtract:RangePartitions", "SELECT partition_name\n" " , high_value\n" " , 'N/A' AS cache\n" " , 'N/A' AS pct_used\n" " , pct_free\n" " , ini_trans\n" " , max_trans\n" " , initial_extent\n" " , next_extent\n" " , min_extent\n" " , DECODE(\n" " max_extent\n" " ,2147483645,'unlimited'\n" " , max_extent\n" " ) AS max_extents\n" " , pct_increase\n" " , NVL(freelists,1)\n" " , NVL(freelist_groups,1)\n" " , buffer_pool\n" " , DECODE(\n" " logging \n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , tablespace_name\n" " , leaf_blocks AS blocks\n" " FROM sys.all_ind_partitions\n" " WHERE index_name = :nam\n" " AND index_owner = :own\n" " ORDER BY partition_name", "Get information about partition ranges, must have same binds " "and columns", "0801"); static toSQL SQLRangePartitions8("toOracleExtract:RangePartitions", "SELECT partition_name\n" " , high_value\n" " , 'N/A' AS cache\n" " , 'N/A' AS pct_used\n" " , pct_free\n" " , ini_trans\n" " , max_trans\n" " , initial_extent\n" " , next_extent\n" " , min_extent\n" " , DECODE(\n" " max_extent\n" " ,2147483645,'unlimited'\n" " , max_extent\n" " ) AS max_extents\n" " , pct_increase\n" " , NVL(freelists,1)\n" " , NVL(freelist_groups,1)\n" " , 'N/A' AS buffer_pool\n" " , DECODE(\n" " logging \n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , tablespace_name\n" " , leaf_blocks AS blocks\n" " FROM sys.all_ind_partitions\n" " WHERE index_name = :nam\n" " AND index_owner = :own\n" " ORDER BY partition_name", "", "0801"); static toSQL SQLIndexSubPartitionName("toOracleExtract:IndexSubPartitionName", "SELECT subpartition_name,\n" " tablespace_name\n" " FROM sys.all_ind_subpartitions\n" " WHERE index_name = :ind\n" " AND partition_name = :prt\n" " AND index_owner = :own\n" " ORDER BY subpartition_name", "Get information about a subpartition, " "must have same binds and columns"); QString toOracleExtract::rangePartitions(toExtract &ext, const QString &owner, const QString &name, const QString &subPartitionType, const QString &caller) const { if (!ext.getPartition()) return ""; toQList result = toQuery::readQueryNull(CONNECTION, SQLRangePartitions, name, owner); if (result.empty() || result.size() % 18) throw qApp->translate("toOracleExtract", "Couldn't find partition range %1.%2").arg(owner).arg(name); QString ret; QString comma = " "; while (!result.empty()) { QString partition = toShift(result); QString highValue = toShift(result); toQList storage; toPush(storage, toQValue(" ")); toPush(storage, toQValue("INDEX")); for (int i = 0;i < 16;i++) toPush(storage, toShift(result)); ret += comma; ret += "PARTITION "; ret += QUOTE(partition); if (caller != "LOCAL") ret += QString(" VALUES LESS THAN (%1)\n").arg(highValue); else ret += "\n"; ret += segmentAttributes(ext, storage); if (subPartitionType == "HASH") { toQuery inf(CONNECTION, SQLIndexSubPartitionName, name, partition, owner); ret += " (\n" " "; bool first = true; while (!inf.eof()) { QString sub(inf.readValue()); QString tablespace(inf.readValue()); if (first) first = false; else ret += "\n , "; ret += QUOTE(sub); ret += " TABLESPACE "; ret += QUOTE(tablespace); } ret += "\n )\n"; } comma = " , "; } ret += ");\n\n"; return ret; } QString toOracleExtract::segmentAttributes(toExtract &ext, toQList &result) const { QString ret; if (ext.getStorage()) { #if 0 if (result.size() != 18) throw qApp->translate("toOracleExtract", "Internal error, result should be 18 in segment attributes (Was %1)"). arg(result.size()); #endif if (result.size() != 18) return ret; toQList::iterator i = result.begin(); QString indent = *i; i++; QString organization = *i; i++; QString cache = *i; i++; QString pctUsed = *i; i++; QString pctFree = *i; i++; QString iniTrans = *i; i++; QString maxTrans = *i; i++; QString initial = *i; i++; QString next = *i; i++; QString minExtents = *i; i++; QString maxExtents = *i; i++; QString pctIncrease = *i; i++; QString freelists = *i; i++; QString freelistGroups = *i; i++; QString bufferPool = *i; i++; QString logging = *i; i++; QString tablespace = *i; i++; QString blocks = *i; i++; if (ext.getResize()) ext.initialNext(blocks, initial, next); if (organization == "HEAP") { if (cache != "N/A") { ret += indent; ret += cache; ret += "\n"; } if (!ext.state("IsASnapIndex").toBool() && !pctUsed.isEmpty()) ret += QString("%1PCTUSED %2\n").arg(indent).arg(pctUsed); } if (!ext.state("IsASnapIndex").toBool()) ret += QString("%1PCTFREE %2\n").arg(indent).arg(pctFree); if (!ext.state("IsASnapTable").toBool()) ret += QString("%1INITRANS %2\n").arg(indent).arg(iniTrans); ret += QString("%1MAXTRANS %2\n").arg(indent).arg(maxTrans); ret += indent; ret += "STORAGE\n"; ret += indent; ret += "(\n"; ret += QString("%1 INITIAL %2\n").arg(indent).arg(initial); if (!next.isEmpty()) ret += QString("%1 NEXT %2\n").arg(indent).arg(next); ret += QString("%1 MINEXTENTS %2\n").arg(indent).arg(minExtents); ret += QString("%1 MAXEXTENTS %2\n").arg(indent).arg(maxExtents); if (!pctIncrease.isEmpty()) ret += QString("%1 PCTINCREASE %2\n").arg(indent).arg(pctIncrease); ret += QString("%1 FREELISTS %2\n").arg(indent).arg(freelists); ret += QString("%1 FREELIST GROUPS %2\n").arg(indent).arg(freelistGroups); if (CONNECTION.version() >= "0801") { ret += QString("%1 BUFFER_POOL %2\n").arg(indent).arg(QUOTE(bufferPool)); } ret += indent; ret += ")\n"; if (CONNECTION.version() >= "0800") ret += QString("%1%2\n").arg(indent).arg(logging); ret += QString("%1TABLESPACE %2\n").arg(indent).arg(QUOTE(tablespace)); } return ret; } static toSQL SQLTableColumns9("toOracleExtract:TableColumns", "SELECT column_name,\n" " RPAD(\n" " DECODE(\n" " data_type\n" " ,'NUMBER',DECODE(\n" " data_precision\n" " ,null,DECODE(\n" " data_scale\n" " ,0,'INTEGER'\n" " , 'NUMBER'\n" " )\n" " ,'NUMBER'\n" " )\n" " ,'RAW' ,'RAW'\n" " ,'CHAR' ,'CHAR'\n" " ,'NCHAR' ,'NCHAR'\n" " ,'UROWID' ,'UROWID'\n" " ,'VARCHAR2','VARCHAR2'\n" " ,data_type\n" " )\n" " || DECODE(\n" " data_type\n" " ,'DATE',null\n" " ,'LONG',null\n" " ,'NUMBER',DECODE(\n" " data_precision\n" " ,null,null\n" " ,'('\n" " )\n" " ,'RAW' ,'('\n" " ,'CHAR' ,'('\n" " ,'NCHAR' ,'('\n" " ,'UROWID' ,'('\n" " ,'VARCHAR2' ,'('\n" " ,'NVARCHAR2','('\n" " ,null\n" " )\n" " || DECODE(\n" " data_type\n" " ,'RAW' ,data_length\n" " ,'CHAR' ,data_length\n" " ,'NCHAR' ,char_length\n" " ,'UROWID' ,data_length\n" " ,'VARCHAR2' ,data_length\n" " ,'NVARCHAR2',char_length\n" " ,'NUMBER' ,data_precision\n" " , null\n" " )\n" " || DECODE(\n" " data_type\n" " ,'NUMBER',DECODE(\n" " TO_CHAR(data_precision)\n" " ,null,null\n" " ,DECODE(\n" " TO_CHAR(data_scale)\n" " ,null,null\n" " ,0 ,null\n" " ,',' || data_scale\n" " )\n" " )\n" " )\n" " || DECODE(\n" " data_type\n" " ,'DATE',null\n" " ,'LONG',null\n" " ,'NUMBER',DECODE(\n" " data_precision\n" " ,null,null\n" " ,')'\n" " )\n" " ,'RAW' ,')'\n" " ,'CHAR' ,')'\n" " ,'NCHAR' ,')'\n" " ,'UROWID' ,')'\n" " ,'VARCHAR2' ,')'\n" " ,'NVARCHAR2',')'\n" " ,null\n" " )\n" " ,32\n" " )\n" " , data_default\n" " , DECODE(\n" " nullable\n" " ,'N','NOT NULL'\n" " , null\n" " )\n" " FROM sys.all_tab_columns\n" " WHERE table_name = :nam\n" " AND owner = :own\n" " ORDER BY column_id", "Extract column definitions from table", "09"); static toSQL SQLTableColumns("toOracleExtract:TableColumns", "SELECT column_name,\n" " RPAD(\n" " DECODE(\n" " data_type\n" " ,'NUMBER',DECODE(\n" " data_precision\n" " ,null,DECODE(\n" " data_scale\n" " ,0,'INTEGER'\n" " , 'NUMBER'\n" " )\n" " ,'NUMBER'\n" " )\n" " ,'RAW' ,'RAW'\n" " ,'CHAR' ,'CHAR'\n" " ,'NCHAR' ,'NCHAR'\n" " ,'UROWID' ,'UROWID'\n" " ,'VARCHAR2','VARCHAR2'\n" " ,data_type\n" " )\n" " || DECODE(\n" " data_type\n" " ,'DATE',null\n" " ,'LONG',null\n" " ,'NUMBER',DECODE(\n" " data_precision\n" " ,null,null\n" " ,'('\n" " )\n" " ,'RAW' ,'('\n" " ,'CHAR' ,'('\n" " ,'NCHAR' ,'('\n" " ,'UROWID' ,'('\n" " ,'VARCHAR2' ,'('\n" " ,'NVARCHAR2','('\n" " ,null\n" " )\n" " || DECODE(\n" " data_type\n" " ,'RAW' ,data_length\n" " ,'CHAR' ,data_length\n" " ,'NCHAR' ,data_length\n" " ,'UROWID' ,data_length\n" " ,'VARCHAR2' ,data_length\n" " ,'NVARCHAR2',data_length\n" " ,'NUMBER' ,data_precision\n" " , null\n" " )\n" " || DECODE(\n" " data_type\n" " ,'NUMBER',DECODE(\n" " TO_CHAR(data_precision)\n" " ,null,null\n" " ,DECODE(\n" " TO_CHAR(data_scale)\n" " ,null,null\n" " ,0 ,null\n" " ,',' || data_scale\n" " )\n" " )\n" " )\n" " || DECODE(\n" " data_type\n" " ,'DATE',null\n" " ,'LONG',null\n" " ,'NUMBER',DECODE(\n" " data_precision\n" " ,null,null\n" " ,')'\n" " )\n" " ,'RAW' ,')'\n" " ,'CHAR' ,')'\n" " ,'NCHAR' ,')'\n" " ,'UROWID' ,')'\n" " ,'VARCHAR2' ,')'\n" " ,'NVARCHAR2',')'\n" " ,null\n" " )\n" " ,32\n" " )\n" " , data_default\n" " , DECODE(\n" " nullable\n" " ,'N','NOT NULL'\n" " , null\n" " )\n" " FROM sys.all_tab_columns\n" " WHERE table_name = :nam\n" " AND owner = :own\n" " ORDER BY column_id", "", "0800"); static toSQL SQLTableColumns7("toOracleExtract:TableColumns", " SELECT\n" " column_name,\n" " RPAD(\n" " DECODE(\n" " data_type\n" " ,'NUMBER',DECODE(\n" " data_precision\n" " ,null,DECODE(\n" " data_scale\n" " ,0,'INTEGER'\n" " , 'NUMBER'\n" " )\n" " ,'NUMBER'\n" " )\n" " ,'RAW' ,'RAW'\n" " ,'CHAR' ,'CHAR'\n" " ,'UROWID' ,'UROWID'\n" " ,'VARCHAR2','VARCHAR2'\n" " ,data_type\n" " )\n" " || DECODE(\n" " data_type\n" " ,'DATE',null\n" " ,'LONG',null\n" " ,'NUMBER',DECODE(\n" " data_precision\n" " ,null,null\n" " ,'('\n" " )\n" " ,'RAW' ,'('\n" " ,'CHAR' ,'('\n" " ,'UROWID' ,'('\n" " ,'VARCHAR2' ,'('\n" " ,null\n" " )\n" " || DECODE(\n" " data_type\n" " ,'RAW' ,data_length\n" " ,'CHAR' ,data_length\n" " ,'UROWID' ,data_length\n" " ,'VARCHAR2' ,data_length\n" " ,'NUMBER' ,data_precision\n" " , null\n" " )\n" " || DECODE(\n" " data_type\n" " ,'NUMBER',DECODE(\n" " data_precision\n" " ,null,null\n" " ,DECODE(\n" " data_scale\n" " ,null,null\n" " ,0 ,null\n" " ,',' || data_scale\n" " )\n" " )\n" " )\n" " || DECODE(\n" " data_type\n" " ,'DATE',null\n" " ,'LONG',null\n" " ,'NUMBER',DECODE(\n" " data_precision\n" " ,null,null\n" " ,')'\n" " )\n" " ,'RAW' ,')'\n" " ,'CHAR' ,')'\n" " ,'UROWID' ,')'\n" " ,'VARCHAR2' ,')'\n" " ,'NVARCHAR2',')'\n" " ,null\n" " )\n" " ,33\n" " )\n" " , data_default\n" " , DECODE(\n" " nullable\n" " ,'N','NOT NULL'\n" " , null\n" " )\n" " FROM sys.all_tab_columns\n" " WHERE table_name = :nam\n" " AND owner = :own\n" " ORDER BY column_id", "", "0700"); QString toOracleExtract::tableColumns(toExtract &ext, const QString &owner, const QString &name) const { toQList cols = toQuery::readQueryNull(CONNECTION, SQLTableColumns, name, owner); bool first = true; QString ret; while (!cols.empty()) { if (first) first = false; else ret += "\n , "; ret += QString(QUOTE(toShift(cols))).leftJustified(32); ret += " "; ret += toShift(cols); QString def = toShift(cols); QString notNull = toShift(cols); if (!def.isEmpty()) { ret += "DEFAULT "; ret += def.trimmed(); ret += " "; } ret += notNull; } ret += "\n"; return ret; } // Implementation describe utility functions void toOracleExtract::describeAttributes(toExtract &ext, std::list &dsp, std::list &ctx, toQList &result) const { if (!ext.getStorage()) return ; #if 0 if (result.size() != 18) throw qApp->translate("toOracleExtract", "Internal error, result should be 18 in segment attributes"); #endif if (result.size() != 18) return; toQList::iterator i = result.begin(); QString indent = *i; i++; QString organization = *i; i++; QString cache = *i; i++; QString pctUsed = *i; i++; QString pctFree = *i; i++; QString iniTrans = *i; i++; QString maxTrans = *i; i++; QString initial = *i; i++; QString next = *i; i++; QString minExtents = *i; i++; QString maxExtents = *i; i++; QString pctIncrease = *i; i++; QString freelists = *i; i++; QString freelistGroups = *i; i++; QString bufferPool = *i; i++; QString logging = *i; i++; QString tablespace = *i; i++; QString blocks = *i; i++; if (ext.getResize()) ext.initialNext(blocks, initial, next); QString ret; if (organization == "HEAP") { if (cache != "N/A") addDescription(dsp, ctx, "PARAMETERS", cache); if (!ext.state("IsASnapIndex").toBool() && !pctUsed.isEmpty()) addDescription(dsp, ctx, "PARAMETERS", QString("PCTUSED %1").arg(pctUsed)); } if (!ext.state("IsASnapIndex").toBool()) addDescription(dsp, ctx, "PARAMETERS", QString("PCTFREE %1").arg(pctFree)); if (!ext.state("IsASnapTable").toBool()) addDescription(dsp, ctx, "PARAMETERS", QString("INITRANS %1").arg(iniTrans)); addDescription(dsp, ctx, "PARAMETERS", QString("MAXTRANS %1").arg(maxTrans)); addDescription(dsp, ctx, "STORAGE", QString("INITIAL %1").arg(initial)); if (!next.isEmpty()) addDescription(dsp, ctx, "STORAGE", QString("NEXT %1").arg(next)); addDescription(dsp, ctx, "STORAGE", QString("MINEXTENTS %1").arg(minExtents)); addDescription(dsp, ctx, "STORAGE", QString("MAXEXTENTS %1").arg(maxExtents)); addDescription(dsp, ctx, "STORAGE", QString("PCTINCREASE %1").arg(pctIncrease)); addDescription(dsp, ctx, "STORAGE", QString("FREELISTS %1").arg(freelists)); addDescription(dsp, ctx, "STORAGE", QString("FREELIST GROUPS %1").arg(freelistGroups)); if (CONNECTION.version() >= "0801") { addDescription(dsp, ctx, "STORAGE", QString("BUFFER_POOL %1").arg(QUOTE(bufferPool))); } if (CONNECTION.version() >= "0800") addDescription(dsp, ctx, "PARAMETERS", logging); addDescription(dsp, ctx, "PARAMETERS", QString("TABLESPACE %1").arg(QUOTE(tablespace))); } void toOracleExtract::describeComments(toExtract &ext, std::list &lst, std::list &ctx, const QString &owner, const QString &name) const { if (ext.getComments()) { toQuery inf(CONNECTION, SQLTableComments, name, owner); while (!inf.eof()) { addDescription(lst, ctx, "COMMENT", inf.readValue()); } toQuery col(CONNECTION, SQLColumnComments, name, owner); while (!col.eof()) { QString column = col.readValue(); addDescription(lst, ctx, "COLUMN", QUOTE(column), "COMMENT", col.readValue()); } } } void toOracleExtract::describePrivs(toExtract &ext, std::list &lst, std::list &ctx, const QString &name) const { if (!ext.getGrants()) return ; toQList result = toQuery::readQueryNull(CONNECTION, SQLRolePrivs, name); while (!result.empty()) { QString role = QUOTE(toShift(result)); addDescription(lst, ctx, "GRANT", "ROLE " + role, toShift(result)); } result = toQuery::readQueryNull(CONNECTION, SQLSystemPrivs, name); while (!result.empty()) { QString priv = QString(toShift(result)).toLower(); addDescription(lst, ctx, "GRANT", priv, toShift(result)); } result = toQuery::readQueryNull(CONNECTION, SQLObjectPrivs, name); while (!result.empty()) { QString priv = toShift(result); QString schema = ext.intSchema(toShift(result), false); QString res = schema; res += QUOTE(toShift(result)); addDescription(lst, ctx, "GRANT", priv.toLower(), "ON", res, toShift(result)); } } void toOracleExtract::describeIOT(toExtract &ext, std::list &lst, std::list &ctx, const QString &schema, const QString &owner, const QString &name) const { toQList storage = toQuery::readQueryNull(CONNECTION, SQLIOTInfo, name, owner); describeTableText(ext, lst, ctx, storage, schema, owner, name); describeComments(ext, lst, ctx, owner, name); if (ext.getStorage()) { toQList overflow = toQuery::readQueryNull(CONNECTION, segments(ext, SQLOverflowInfo), name, owner); if (overflow.size() == 18) { ctx.insert(ctx.end(), "OVERFLOW"); describeAttributes(ext, lst, ctx, overflow); } } } void toOracleExtract::describeIndexColumns(toExtract &ext, std::list &lst, std::list &ctx, const QString &owner, const QString &name) const { static QRegExp quote("\""); static QRegExp func("^sys_nc[0-9]g"); toQuery inf(CONNECTION, SQLIndexColumns, name, owner); int num = 1; while (!inf.eof()) { QString col = inf.readValue(); QString asc = inf.readValue(); QString row; if (func.indexIn(col) >= 0) { toQuery def(CONNECTION, SQLIndexFunction, col, name, owner); QString function(inf.readValue()); function.replace(quote, ""); if (asc == "DESC") row = QString("%1 DESC").arg(function, 30); else row = function; } else if (asc == "DESC") row = QString("%1 DESC").arg(QUOTE(col)); else row = QUOTE(col); addDescription(lst, ctx, "COLUMN", row); addDescription(lst, ctx, "COLUMN", row, "ORDER", QString::number(num)); num++; } } void toOracleExtract::describeMView(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name, const QString &type) const { toQList result = toQuery::readQueryNull(CONNECTION, SQLMViewInfo, name, owner); if (result.empty()) throw qApp->translate("toOracleExtract", "Couldn't find materialised table %1.%2"). arg(QUOTE(owner)).arg(QUOTE(name)); QString table = toShift(result); QString buildMode = toShift(result); QString refreshMethod = toShift(result); QString refreshMode = toShift(result); QString startWith = toShift(result); QString next = toShift(result); QString usingPK = toShift(result); QString masterRBSeg = toShift(result); QString updatable = toShift(result); QString query = toShift(result); toQuery inf(CONNECTION, SQLIndexName, table, owner); QString index(inf.readValue()); std::list ctx; ctx.insert(ctx.end(), schema); ctx.insert(ctx.end(), type); ctx.insert(ctx.end(), QUOTE(name)); describeMViewTable(ext, lst, ctx, schema, owner, table); addDescription(lst, ctx, buildMode); ctx.insert(ctx.end(), "INDEX"); ctx.insert(ctx.end(), QUOTE(index)); describeMViewIndex(ext, lst, ctx, schema, owner, index); if (refreshMethod != "NEVER REFRESH") { addDescription(lst, ctx, QString("START WITH %1").arg(startWith)); if (!next.isEmpty()) addDescription(lst, ctx, QString("NEXT %1").arg(next)); addDescription(lst, ctx, usingPK); if (!masterRBSeg.isEmpty() && ext.getStorage()) addDescription(lst, ctx, QString("USING MASTER ROLLBACK SEGMENT %1"). arg(QUOTE(masterRBSeg))); } if (!updatable.isEmpty()) addDescription(lst, ctx, updatable); addDescription(lst, ctx, QString("AS %1").arg(query)); } static QString ReContext(std::list &ctx, int strip, const QString &str) { QStringList lst = str.split("\01"); QString ret; QString sep = ""; for (std::list::iterator i = ctx.begin();i != ctx.end();i++) { ret += sep; ret += *i; if (sep.isEmpty()) sep = "\01"; } for (QStringList::Iterator j = lst.begin();j != lst.end();j++) { if (strip > 0) { ret += sep; ret += *j; } else strip--; if (sep.isEmpty()) sep = "\01"; } return ret; } void toOracleExtract::describeMViewIndex(toExtract &ext, std::list &lst, std::list &ctx, const QString &schema, const QString &owner, const QString &name) const { if (!ext.getStorage() || !ext.getParallel()) return ; ext.setState("IsASnapIndex", true); static QRegExp start("^[^\001]+[\001][^\001]+[\001][^\001]+[\001]INITTRANS"); static QRegExp ignore("^[^\001]+[\001][^\001]+[\001][^\001]+[\001]LOGGING"); bool started = false; bool done = false; std::list tbllst; describeIndex(ext, tbllst, schema, owner, name); QString ret; for (std::list::iterator i = tbllst.begin();i != tbllst.end() && !done;i++) { if (start.indexIn(*i) >= 0) started = true; if (started) lst.insert(lst.end(), ReContext(ctx, 3, *i)); } ext.setState("IsASnapIndex", false); } void toOracleExtract::describeMViewLog(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name, const QString &type) const { toQList result = toQuery::readQueryNull(CONNECTION, SQLSnapshotInfo, name, owner); if (result.size() != 4) throw qApp->translate("toOracleExtract", "Couldn't find log %1.%2").arg(owner).arg(name); QString table = toShift(result); QString rowIds = toShift(result); QString primaryKey = toShift(result); QString filterColumns = toShift(result); std::list ctx; ctx.insert(ctx.end(), schema); ctx.insert(ctx.end(), type); ctx.insert(ctx.end(), QUOTE(name)); describeMViewTable(ext, lst, ctx, schema, owner, table); if (rowIds == "YES" && primaryKey == "YES") ctx.insert(ctx.end(), "WITH PRIMARY KEY, ROWID"); else if (rowIds == "YES") ctx.insert(ctx.end(), "WITH ROWID"); else if (primaryKey == "YES") ctx.insert(ctx.end(), "WITH PRIMARY KEY"); addDescription(lst, ctx); toQuery inf(CONNECTION, SQLSnapshotColumns, name, owner); bool first = true; if (!inf.eof()) { QString col = "("; while (!inf.eof()) { if (first) first = false; else col += ","; col += QUOTE(inf.readValue()); } col += ")"; addDescription(lst, ctx, col); } } void toOracleExtract::describeMViewTable(toExtract &ext, std::list &lst, std::list &ctx, const QString &schema, const QString &owner, const QString &name) const { if (!ext.getStorage() || !ext.getParallel()) return ; ext.setState("IsASnapTable", true); // Schema Table Name static QRegExp parallel("^[^\001]+[\001][^\001]+[\001][^\001]+[\001]PARALLEL"); bool started = false; bool done = false; std::list tbllst; describeTable(ext, tbllst, schema, owner, name); QString ret; for (std::list::iterator i = tbllst.begin();i != tbllst.end() && !done;i++) { if (parallel.indexIn(*i) >= 0) started = true; if (started) lst.insert(lst.end(), ReContext(ctx, 3, *i)); } ext.setState("IsASnapTable", false); } void toOracleExtract::describePartitions(toExtract &ext, std::list &lst, std::list &ctx, const QString &owner, const QString &name, const QString &subPartitionType, const QString &caller) const { if (!ext.getPartition()) return ; toQList result = toQuery::readQueryNull(CONNECTION, SQLRangePartitions, name, owner); if (result.empty() || result.size() % 18) throw qApp->translate("toOracleExtract", "Couldn't find partition range %1.%2").arg(owner).arg(name); while (!result.empty()) { QString partition = toShift(result); QString highValue = toShift(result); toQList storage; toPush(storage, toQValue(" ")); toPush(storage, toQValue("INDEX")); for (int i = 0;i < 16;i++) toPush(storage, toShift(result)); std::list cctx = ctx; cctx.insert(cctx.end(), QUOTE(partition)); addDescription(lst, cctx); if (caller != "LOCAL") addDescription(lst, cctx, "RANGE", QString("VALUES LESS THAN (%1)").arg(highValue)); describeAttributes(ext, lst, cctx, storage); if (subPartitionType == "HASH") { toQuery inf(CONNECTION, SQLIndexSubPartitionName, name, partition, owner); while (!inf.eof()) { QString sub(inf.readValue()); QString tablespace(inf.readValue()); addDescription(lst, cctx, "HASH", QString("%1 TABLESPACE %2").arg(QUOTE(sub)).arg(QUOTE(tablespace))); } } } } void toOracleExtract::describePartitionedIOT(toExtract &ext, std::list &lst, std::list &ctx, const QString &schema, const QString &owner, const QString &name) const { toQList result = toQuery::readQueryNull(CONNECTION, SQLPartitionedIOTInfo, QString::number(ext.getBlockSize()), name, owner); describeTableText(ext, lst, ctx, result, schema, owner, name); if (ext.getPartition()) { toQuery inf(CONNECTION, SQLPartitionIndexNames, name, owner); if (!inf.eof()) throw qApp->translate("toOracleExtract", "Couldn't find index partitions for %1.%2").arg(owner).arg(name); QString index(inf.readValue()); std::list cctx = ctx; toPush(cctx, QString("PARTITION COLUMNS")); toPush(cctx, partitionKeyColumns(ext, owner, name, "TABLE")); addDescription(lst, cctx); describePartitions(ext, lst, cctx, owner, index, "NONE", "IOT"); } describeComments(ext, lst, ctx, owner, name); if (ext.getStorage()) { toQList overflow = toQuery::readQueryNull(CONNECTION, segments(ext, SQLOverflowInfo), name, owner); if (overflow.size() == 18) { ctx.insert(ctx.end(), "OVERFLOW"); describeAttributes(ext, lst, ctx, overflow); } } } void toOracleExtract::describePartitionedIndex(toExtract &ext, std::list &lst, std::list &ctx, const QString &, const QString &owner, const QString &name) const { if (!ext.getPartition()) return ; toQList result = toQuery::readQueryNull(CONNECTION, SQLIndexPartition, QString::number(ext.getBlockSize()), owner, name); QString partitionType = toShift(result); QString subPartitionType = toShift(result); QString locality = toShift(result); QString compressed = toShift(result); toUnShift(result, toQValue("")); describeAttributes(ext, lst, ctx, result); if (!compressed.isEmpty()) addDescription(lst, ctx, "COMPRESS", compressed); if (locality == "GLOBAL") { std::list cctx = ctx; toPush(cctx, QString("GLOBAL PARTITION COLUMNS")); toPush(cctx, partitionKeyColumns(ext, owner, name, "INDEX")); addDescription(lst, cctx); describePartitions(ext, lst, cctx, owner, name, subPartitionType, "GLOBAL"); } else { std::list cctx = ctx; toPush(cctx, QString("LOCAL PARTITION")); addDescription(lst, cctx); if (partitionType == "RANGE") describePartitions(ext, lst, cctx, owner, name, subPartitionType, "LOCAL"); } } void toOracleExtract::describePartitionedTable(toExtract &ext, std::list &lst, std::list &ctx, const QString &schema, const QString &owner, const QString &name) const { toQList storage = toQuery::readQueryNull(CONNECTION, SQLPartitionTableInfo, QString::number(ext.getBlockSize()), name, owner); QString organization; { toQList::iterator i = storage.begin(); i++; i++; i++; i++; organization = *i; } describeTableText(ext, lst, ctx, storage, schema, owner, name); if (ext.getPartition()) { toQList type = toQuery::readQueryNull(CONNECTION, SQLPartitionType, name, owner); QString partitionType (toShift(type)); QString partitionCount (toShift(type)); QString subPartitionType (toShift(type)); QString subPartitionCount(toShift(type)); QString prtstr = QString("PARTITION BY %1 (%2)"). arg(partitionType). arg(partitionKeyColumns(ext, owner, name, "TABLE")); addDescription(lst, ctx, prtstr); QString subprtstr; if (partitionType == "RANGE") { if (subPartitionType == "HASH") { subprtstr = QString("SUBPARTITIONED BY HASH (%1) SUBPARTITIONS %2"). arg(subPartitionKeyColumns(ext, owner, name, "TABLE")). arg(subPartitionCount); addDescription(lst, ctx, subprtstr); } toQList segment = toQuery::readQueryNull(CONNECTION, SQLPartitionSegment, name, owner); while (!segment.empty()) { toQList storage; QString partition = toShift(segment); QString highValue = toShift(segment); toPush(storage, toQValue(" ")); toPush(storage, toQValue(organization)); for (int i = 0;i < 16;i++) toPush(storage, toShift(segment)); std::list cctx = ctx; cctx.insert(cctx.end(), prtstr); cctx.insert(cctx.end(), QUOTE(partition)); addDescription(lst, cctx, "RANGE", QString("VALUES LESS THAN %2"). arg(highValue)); describeAttributes(ext, lst, cctx, storage); if (subPartitionType == "HASH") { toQList subs = toQuery::readQueryNull(CONNECTION, SQLSubPartitionName, name, partition, owner); while (!subs.empty()) { QString subpart = QUOTE(toShift(subs)); QString tabspac = toShift(subs); addDescription(lst, cctx, subprtstr, subpart); addDescription(lst, cctx, subprtstr, subpart, QString("TABLESPACE %1").arg(QUOTE(tabspac))); } } } } else { toQList hash = toQuery::readQueryNull(CONNECTION, SQLPartitionName, name, owner); while (!hash.empty()) { QString partition = QUOTE(toShift(hash)); QString tablespac = toShift(hash); addDescription(lst, ctx, prtstr, partition); addDescription(lst, ctx, prtstr, partition, QString("TABLESPACE %1").arg(QUOTE(tablespac))); } } } describeComments(ext, lst, ctx, owner, name); } void toOracleExtract::describeSource(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name, const QString &type) const { if (!ext.getCode()) return ; std::list ctx; ctx.insert(ctx.end(), schema); ctx.insert(ctx.end(), type); ctx.insert(ctx.end(), QUOTE(name)); addDescription(lst, ctx); addDescription(lst, ctx, displaySource(ext, schema, owner, name, type, true)); } void toOracleExtract::describeTableColumns(toExtract &ext, std::list &lst, std::list &ctx, const QString &owner, const QString &name) const { toQList cols = toQuery::readQueryNull(CONNECTION, SQLTableColumns, name, owner); int num = 1; while (!cols.empty()) { QString col = QUOTE(toShift(cols)); QString line = toShift(cols); QString extra = toShift(cols); extra = extra.trimmed(); // In Oracle (at least up to 11R2 if default value was set on column you cannot totally // remove it from data dictionary. Default value is reported as being null rather than // being empty/not set. Therefore this comparison to "null" is added. if (!extra.isEmpty() && (extra.toLower() != "null")) { line += " DEFAULT "; line += extra.trimmed(); // extra could have trailing spaces } extra = toShift(cols); // TS 2009-11-15 changed += to = as default value is already // added as "line" so not required as "extra" addDescription(lst, ctx, "COLUMN", col); addDescription(lst, ctx, "COLUMN", col, line); if (!extra.isEmpty()) addDescription(lst, ctx, "COLUMN", col, "EXTRA", extra); addDescription(lst, ctx, "COLUMN", col, "ORDER", QString::number(num)); num++; } } void toOracleExtract::describeTableText(toExtract &ext, std::list &lst, std::list &ctx, toQList &result, const QString &, const QString &owner, const QString &name) const { QString monitoring = toShift(result); QString table = toShift(result); QString degree = toShift(result); QString instances = toShift(result); QString organization = toShift(result); QString ret; addDescription(lst, ctx); describeTableColumns(ext, lst, ctx, owner, name); if (CONNECTION.version() >= "0800" && ext.getStorage() && !organization.isEmpty() ) addDescription(lst, ctx, "PARAMETERS", QString("ORGANIZATION %1").arg(organization)); if (CONNECTION.version() >= "0801" && ext.getStorage() && ! monitoring.isEmpty() ) addDescription(lst, ctx, "PARAMETERS", monitoring); if (ext.getParallel() && ! degree.isEmpty() && ! instances.isEmpty() ) { addDescription(lst, ctx, "PARALLEL", QString("DEGREE %1").arg(degree)); addDescription(lst, ctx, "PARALLEL", QString("INSTANCES %1").arg(instances)); } toUnShift(result, toQValue(organization)); toUnShift(result, toQValue("")); describeAttributes(ext, lst, ctx, result); } // Implementation create functions static toSQL SQLListConstraint("toOracleExtract:ListConstraint", "SELECT table_name,\n" " constraint_type,\n" " search_condition,\n" " r_owner,\n" " r_constraint_name,\n" " delete_rule,\n" " DECODE(status,'ENABLED','ENABLE NOVALIDATE','DISABLE'),\n" " deferrable,\n" " deferred\n" " FROM sys.all_constraints\n" " WHERE owner = :own\n" " AND constraint_name = :nam", "Get information about a constraint, same binds and columns", "0800"); static toSQL SQLListConstraint7("toOracleExtract:ListConstraint", "SELECT table_name,\n" " constraint_type,\n" " search_condition,\n" " r_owner,\n" " r_constraint_name,\n" " delete_rule,\n" " DECODE(status,'ENABLED','ENABLE','DISABLE'),\n" " NULL,\n" " NULL\n" " FROM sys.all_constraints\n" " WHERE owner = :own\n" " AND constraint_name = :nam", "", "0700"); static toSQL SQLConstraintTable("toOracleExtract:ConstraintTable", "SELECT table_name\n" " FROM sys.all_constraints\n" " WHERE owner = :own\n" " AND constraint_name = :nam", "Get tablename from constraint name, same binds and columns"); QString toOracleExtract::createConstraint(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { QString ret; if (ext.getConstraints()) { toQuery inf(CONNECTION, SQLListConstraint, owner, name); if (inf.eof()) throw qApp->translate("toOracleExtract", "Constraint %1.%2 doesn't exist").arg(owner).arg(name); QString table(inf.readValue()); QString tchr(inf.readValue()); QString search(inf.readValue()); QString rOwner(inf.readValue()); QString rName(inf.readValue()); QString delRule(inf.readValue()); QString status(inf.readValue()); QString defferable(inf.readValue()); QString deffered(inf.readValue()); QString type = (tchr == "P") ? "PRIMARY KEY" : (tchr == "U") ? "UNIQUE" : (tchr == "R") ? "FOREIGN KEY" : "CHECK"; QString sql = QString("ALTER TABLE %1%2 ADD CONSTRAINT %3 %4\n"). arg(schema).arg(QUOTE(table)).arg(QUOTE(name)).arg(type); if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n"; } ret += sql; if (tchr == "C") { ret += " ("; ret += search; ret += ")\n"; } else { ret += constraintColumns(ext, owner, name); if (tchr == "R") { toQuery query(CONNECTION, SQLConstraintTable, rOwner, rName); ret += " REFERENCES "; ret += ext.intSchema(rOwner, false); ret += QUOTE(query.readValue()); ret += constraintColumns(ext, rOwner, rName); if (delRule == "CASCADE") ret += "ON DELETE CASCADE\n"; } } if (CONNECTION.version() < "08") { if (status != "ENABLED") ret += status; } else { ret += defferable; ret += "\nINITIALLY "; ret += deffered; ret += "\n"; ret += status; } ret += ";\n\n"; } return ret; } static toSQL SQLDBLink("toOracleExtract:ExtractDBLink", "SELECT l.userid,\n" " l.password,\n" " l.host\n" " FROM sys.link$ l,\n" " sys.user$ u\n" " WHERE u.name = :own\n" " AND l.owner# = u.user#\n" " AND l.name LIKE :nam||'%'", "Get information about a DB Link, must have same binds and columns"); QString toOracleExtract::createDBLink(toExtract &ext, const QString &, const QString &owner, const QString &name) const { toQuery inf(CONNECTION, SQLDBLink, owner, name); if (inf.eof()) throw qApp->translate("toOracleExtract", "DBLink %1.%2 doesn't exist").arg(owner).arg(name); QString user(inf.readValue()); QString password(inf.readValue()); QString host(inf.readValue()); QString publ = (owner == "PUBLIC") ? " PUBLIC" : ""; QString sql = QString("CREATE%1 DATABASE LINK %2").arg(publ).arg(QUOTE(name)); QString ret; if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += QString("\nCONNECT TO %1 IDENTIFIED BY %2 USING '%3';\n\n"). arg(user.toLower()). arg(password.toLower()). arg(prepareDB(host)); return ret; } static toSQL SQLPartitionSegmentType("toOracleExtract:PartitionSegment type", "SELECT SUBSTR(segment_type,7),\n" " TO_CHAR(blocks)\n" " FROM %1\n" " WHERE segment_name = :nam\n" " AND partition_name = :prt\n" " AND owner = :own", "Get segment type for object partition, same binds and columns"); static toSQL SQLExchangeIndex("toOracleExtract:ExchangeIndex", "SELECT\n" " LTRIM(i.degree)\n" " , LTRIM(i.instances)\n" " , i.table_name\n" " , DECODE(\n" " i.uniqueness\n" " ,'UNIQUE',' UNIQUE'\n" " ,null\n" " ) AS uniqueness\n" " , DECODE(\n" " i.index_type\n" " ,'BITMAP',' BITMAP'\n" " ,null\n" " ) AS index_type\n" " , 'INDEX' AS organization\n" " , 'N/A' AS cache\n" " , 'N/A' AS pct_used\n" " , p.pct_free\n" " , DECODE(\n" " p.ini_trans\n" " ,0,1\n" " ,null,1\n" " ,p.ini_trans\n" " ) AS ini_trans\n" " , DECODE(\n" " p.max_trans\n" " ,0,255\n" " ,null,255\n" " ,p.max_trans\n" " ) AS max_trans\n" " , p.initial_extent\n" " , p.next_extent\n" " , p.min_extent\n" " , DECODE(\n" " p.max_extent\n" " ,2147483645,'unlimited'\n" " , p.max_extent\n" " ) AS max_extent\n" " , p.pct_increase\n" " , NVL(p.freelists,1)\n" " , NVL(p.freelist_groups,1)\n" " , p.buffer_pool AS buffer_pool\n" " , DECODE(\n" " p.logging\n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , p.tablespace_name AS tablespace_name\n" " , %2 AS blocks\n" " FROM\n" " sys.all_indexes i\n" " , sys.all_ind_%1s p\n" " WHERE\n" " p.index_name = :nam\n" " AND p.%1_name = :typ\n" " AND i.index_name = p.index_name\n" " AND p.index_owner = :own\n" " AND i.owner = p.index_owner", "Get information about exchange index, " "must have same %, binds and columns"); QString toOracleExtract::createExchangeIndex(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { QStringList str = name.split(":"); if (str.count() != 2) throw ("When calling createExchangeIndex name should contain :"); QString segment = str.first(); QString partition = str.last(); toQuery inf(CONNECTION, segments(ext, SQLPartitionSegmentType), segment, partition, owner); if (inf.eof()) throw qApp->translate("toOracleExtract", "Exchange index %1.%2 doesn't exist").arg(owner).arg(name); QString type = inf.readValue(); QString blocks = inf.readValue(); QString sql = toSQL::string(SQLExchangeIndex, CONNECTION). arg(type).arg(blocks); toQList result = toQuery::readQueryNull(CONNECTION, sql, segment, partition, owner); QString degree = toShift(result); QString instances = toShift(result); QString table = toShift(result); QString unique = toShift(result); QString bitmap = toShift(result); toUnShift(result, toQValue("")); sql = QString("CREATE%1%2 INDEX %3%4 ON %3%5\n"). arg(unique).arg(bitmap).arg(schema).arg(segment).arg(QUOTE(table)); QString ret; if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n"; } ret += sql; ret += indexColumns(ext, "", owner, segment); if (ext.getParallel() && ! degree.isEmpty() && ! instances.isEmpty() ) { ret += "PARALLEL\n(\n DEGREE "; ret += degree; ret += "\n INSTANCES "; ret += instances; ret += ")\n"; } ret += segmentAttributes(ext, result); ret += ";\n\n"; return ret; } static toSQL SQLExchangeTable("toOracleExtract:ExchangeTable", "SELECT\n" " DECODE(\n" " t.monitoring\n" " ,'NO','NOMONITORING'\n" " , 'MONITORING'\n" " ) AS monitoring\n" " , t.table_name\n" " , LTRIM(t.degree) AS degree\n" " , LTRIM(t.instances) AS instances\n" " , 'HEAP' AS organization\n" " , DECODE(\n" " t.cache\n" " ,'y','CACHE'\n" " , 'NOCACHE'\n" " ) AS cache\n" " , p.pct_used\n" " , p.pct_free\n" " , p.ini_trans\n" " , p.max_trans\n" " , p.initial_extent\n" " , p.next_extent\n" " , p.min_extent\n" " , DECODE(\n" " p.max_extent\n" " ,2147483645,'unlimited'\n" " ,p.max_extent\n" " ) AS max_extents\n" " , p.pct_increase\n" " , p.freelists\n" " , p.freelist_groups\n" " , p.buffer_pool AS buffer_pool\n" " , DECODE(\n" " p.logging\n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , p.tablespace_name AS tablespace_name\n" " , %2 - NVL(p.empty_blocks,0) AS blocks\n" " FROM\n" " sys.all_tables t\n" " , sys.all_tab_%1s p\n" " WHERE\n" " p.table_name = :nam\n" " AND p.%1_name = :sgm\n" " AND t.table_name = p.table_name\n" " AND p.table_owner = :own\n" " AND t.owner = p.table_owner", "Get information about exchange table, " "must have same %, binds and columns"); QString toOracleExtract::createExchangeTable(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { QStringList str = name.split(":"); if (str.count() != 2) throw ("When calling createExchangeTable name should contain :"); QString segment = str.first(); QString partition = str.last(); toQuery inf(CONNECTION, segments(ext, SQLPartitionSegmentType), segment, partition, owner); if (inf.eof()) throw qApp->translate("toOracleExtract", "Exchange table %1.%2 doesn't exist").arg(owner).arg(name); QString type = inf.readValue(); QString blocks = inf.readValue(); QString sql = toSQL::string(SQLExchangeTable, CONNECTION).arg(type).arg(blocks); toQList result = toQuery::readQueryNull(CONNECTION, sql, segment, partition, owner); QString ret = createTableText(ext, result, schema, owner, segment); ret += ";\n\n"; return ret; } QString toOracleExtract::createFunction(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { return displaySource(ext, schema, owner, name, "FUNCTION", false); } static toSQL SQLIndexInfo7("toOracleExtract:IndexInfo", "SELECT 'N/A' AS partitioned\n" " , table_name\n" " , table_owner\n" " , NULL\n" " , DECODE(\n" " uniqueness\n" " ,'UNIQUE',' UNIQUE'\n" " ,null\n" " )\n" " , null AS bitmap\n" " , null AS domain\n" " , null\n" " , null\n" " , null\n" " FROM sys.all_indexes\n" " WHERE index_name = :nam\n" " AND owner = :own", "Initial information about an index, same binds and columns", "0700"); static toSQL SQLIndexInfo("toOracleExtract:IndexInfo", "SELECT partitioned\n" " , table_name\n" " , table_owner\n" " , DECODE(index_type,'NORMAL/REV','REVERSE',NULL)\n" " , DECODE(\n" " uniqueness\n" " ,'UNIQUE',' UNIQUE'\n" " ,null\n" " )\n" " , DECODE(\n" " index_type\n" " ,'BITMAP',' BITMAP'\n" " ,null\n" " )\n" " , DECODE(\n" " index_type\n" " ,'DOMAIN','DOMAIN'\n" " ,null\n" " )\n" " , ityp_owner\n" " , ityp_name\n" " , parameters\n" " FROM sys.all_indexes\n" " WHERE index_name = :nam\n" " AND owner = :own", "", "0800"); static toSQL SQLIndexSegment("toOracleExtract:IndexSegment", "SELECT LTRIM(i.degree)\n" " , LTRIM(i.instances)\n" " , DECODE(\n" " i.compression\n" " ,'ENABLED',i.prefix_length\n" " ,0\n" " ) AS compressed\n" " , 'INDEX' AS organization\n" " , 'N/A' AS cache\n" " , 'N/A' AS pct_used\n" " , i.pct_free\n" " , DECODE(\n" " i.ini_trans\n" " ,0,1\n" " ,null,1\n" " ,i.ini_trans\n" " ) AS ini_trans\n" " , DECODE(\n" " i.max_trans\n" " ,0,255\n" " ,null,255\n" " ,i.max_trans\n" " ) AS max_trans\n" " , i.initial_extent\n" " , i.next_extent\n" " , i.min_extents\n" " , DECODE(\n" " i.max_extents\n" " ,2147483645,'unlimited'\n" " , i.max_extents\n" " ) AS max_extents\n" " , i.pct_increase\n" " , NVL(i.freelists,1)\n" " , NVL(i.freelist_groups,1)\n" " , i.buffer_pool AS buffer_pool\n" " , DECODE(\n" " i.logging\n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , i.tablespace_name AS tablespace_name\n" " , s.blocks\n" " FROM sys.all_indexes i\n" " , %1 s\n" " WHERE i.index_name = :nam\n" " AND s.segment_name = i.index_name\n" " AND s.segment_type = 'INDEX'\n" " AND i.owner = :own\n" " AND s.owner = i.owner", "Get information about how index is stored", "0801"); static toSQL SQLIndexSegment8("toOracleExtract:IndexSegment", "SELECT LTRIM(i.degree)\n" " , LTRIM(i.instances)\n" " , 0 AS compressed\n" " , 'INDEX' AS organization\n" " , 'N/A' AS cache\n" " , 'N/A' AS pct_used\n" " , i.pct_free\n" " , DECODE(\n" " i.ini_trans\n" " ,0,1\n" " ,null,1\n" " ,i.ini_trans\n" " ) AS ini_trans\n" " , DECODE(\n" " i.max_trans\n" " ,0,255\n" " ,null,255\n" " ,i.max_trans\n" " ) AS max_trans\n" " , i.initial_extent\n" " , i.next_extent\n" " , i.min_extents\n" " , DECODE(\n" " i.max_extents\n" " ,2147483645,'unlimited'\n" " , i.max_extents\n" " ) AS max_extents\n" " , i.pct_increase\n" " , NVL(i.freelists,1)\n" " , NVL(i.freelist_groups,1)\n" " , i.buffer_pool AS buffer_pool\n" " , DECODE(\n" " i.logging\n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , i.tablespace_name AS tablespace_name\n" " , s.blocks\n" " FROM sys.all_indexes i\n" " , %1 s\n" " WHERE i.index_name = :nam\n" " AND s.segment_type = 'INDEX'\n" " AND s.segment_name = i.index_name\n" " AND i.owner = :own\n" " AND s.owner = i.owner", "", "0800"); static toSQL SQLIndexSegment7("toOracleExtract:IndexSegment", "SELECT 'N/A' AS degree\n" " , 'N/A' AS instances\n" " , 0 AS compressed\n" " , 'INDEX' AS organization\n" " , 'N/A' AS cache\n" " , 'N/A' AS pct_used\n" " , i.pct_free\n" " , DECODE(\n" " i.ini_trans\n" " ,0,1\n" " ,null,1\n" " ,i.ini_trans\n" " ) AS ini_trans\n" " , DECODE(\n" " i.max_trans\n" " ,0,255\n" " ,null,255\n" " ,i.max_trans\n" " ) AS max_trans\n" " , i.initial_extent\n" " , i.next_extent\n" " , i.min_extents\n" " , DECODE(\n" " i.max_extents\n" " ,2147483645,'unlimited'\n" " , i.max_extents\n" " ) AS max_extents\n" " , i.pct_increase\n" " , NVL(i.freelists,1)\n" " , NVL(i.freelist_groups,1)\n" " , 'N/A' AS buffer_pool\n" " , 'N/A' AS logging\n" " , i.tablespace_name AS tablespace_name\n" " , s.blocks\n" " FROM sys.all_indexes i\n" " , %1 s\n" " WHERE i.index_name = :nam\n" " AND s.segment_name = i.index_name\n" " AND s.segment_type = 'INDEX'\n" " AND i.owner = :own\n" " AND s.owner = i.owner", "", "0700"); QString toOracleExtract::createIndex(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { if (!ext.getIndexes()) return ""; toQList res = toQuery::readQueryNull(CONNECTION, SQLIndexInfo, name, owner); if (res.size() != 10) throw qApp->translate("toOracleExtract", "Couldn't find index %1.%2").arg(owner).arg(name); QString partitioned = toShift(res); QString table = toShift(res); QString tableOwner = toShift(res); QString reverse = toShift(res); QString unique = toShift(res); QString bitmap = toShift(res); QString domain = toShift(res); QString domOwner = toShift(res); QString domName = toShift(res); QString domParam = toShift(res); toQList storage = toQuery::readQueryNull(CONNECTION, segments(ext, SQLIndexSegment), name, owner); QString degree = toShift(storage); QString instances = toShift(storage); QString compressed = toShift(storage); QString schema2 = ext.intSchema(tableOwner, false); QString ret; QString sql = QString("CREATE%1%2 INDEX %3%4 ON %5%6\n"). arg(unique). arg(bitmap). arg(schema). arg(QUOTE(name)). arg(schema2). arg(QUOTE(table)); if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n"; } ret += sql; ret += indexColumns(ext, "", owner, name); if (domain == "DOMAIN") { if (CONNECTION.version() >= "0801" && domOwner == "CTXSYS" && domName == "CONTEXT") { ret = createContextPrefs(ext, schema, owner, name, ret); return ret; } ret += QString("INDEXTYPE IS %1.%2\nPARAMETERS ('%3');\n\n"). arg(QUOTE(domOwner)).arg(QUOTE(domName)).arg(prepareDB(domParam)); return ret; } if (CONNECTION.version() >= "0800" && ext.getParallel() && ! degree.isEmpty() && ! instances.isEmpty() ) { ret += QString("PARALLEL\n" "(\n" " DEGREE %1\n" " INSTANCES %2\n" ")\n"). arg(degree). arg(instances); } if (partitioned == "YES") return createPartitionedIndex(ext, schema, owner, name, ret); toUnShift(storage, toQValue("")); ret += segmentAttributes(ext, storage); if (!compressed.isEmpty() && compressed != "0" && ext.getStorage()) { ret += "COMPRESS "; ret += compressed; ret += "\n"; } if (!reverse.isEmpty()) { ret += reverse; ret += "\n"; } ret += ";\n\n"; return ret; } QString toOracleExtract::createMaterializedView(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { return createMView(ext, schema, owner, name, "MATERIALIZED VIEW"); } QString toOracleExtract::createMaterializedViewLog(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { return createMViewLog(ext, schema, owner, name, "MATERIALIZED VIEW"); } QString toOracleExtract::createPackage(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { return displaySource(ext, schema, owner, name, "PACKAGE", false); } QString toOracleExtract::createPackageBody(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { return displaySource(ext, schema, owner, name, "PACKAGE BODY", false); } QString toOracleExtract::createProcedure(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { return displaySource(ext, schema, owner, name, "PROCEDURE", false); } static toSQL SQLProfileInfo("toOracleExtract:ProfileInfo", "SELECT\n" " RPAD(resource_name,27)\n" " , DECODE(\n" " RESOURCE_NAME\n" " ,'PASSWORD_VERIFY_FUNCTION'\n" " ,DECODE(limit\n" " ,'UNLIMITED','null'\n" " ,limit\n" " )\n" " ,limit\n" " )\n" " FROM\n" " sys.dba_profiles\n" " WHERE\n" " profile = :nam\n" " ORDER\n" " BY\n" " DECODE(\n" " SUBSTR(resource_name,1,8)\n" " ,'FAILED_L',2\n" " ,'PASSWORD',2\n" " ,1\n" " )\n" " , resource_name", "Get information about a profile, must have same binds and columns"); QString toOracleExtract::createProfile(toExtract &ext, const QString &, const QString &, const QString &name) const { toQList info = toQuery::readQueryNull(CONNECTION, SQLProfileInfo, name); if (info.empty()) throw qApp->translate("toOracleExtract", "Couldn't find profile %1").arg(name); QString ret; if (PROMPT) ret = QString("PROMPT CREATE PROFILE %1\n\n").arg(QUOTE(name)); ret += QString("CREATE PROFILE %1\n").arg(QUOTE(name)); while (!info.empty()) { ret += " "; ret += toShift(info); ret += " "; ret += toShift(info); ret += "\n"; } ret += ";\n\n"; return ret; } static toSQL SQLRoleInfo("toOracleExtract:RoleInfo", "SELECT\n" " DECODE(\n" " r.password_required\n" " ,'YES', DECODE(\n" " u.password\n" " ,'EXTERNAL','IDENTIFIED EXTERNALLY'\n" " ,'IDENTIFIED BY VALUES ''' \n" " || u.password || ''''\n" " )\n" " ,'NOT IDENTIFIED'\n" " ) AS password\n" " FROM\n" " sys.dba_roles r\n" " , sys.user$ u\n" " WHERE\n" " r.role = :rol\n" " AND u.name = r.role", "Get information about a role, must have same binds and columns"); QString toOracleExtract::createRole(toExtract &ext, const QString &, const QString &, const QString &name) const { toQList info = toQuery::readQueryNull(CONNECTION, SQLRoleInfo, name); if (info.empty()) throw qApp->translate("toOracleExtract", "Couldn't find role %1").arg(name); QString ret; if (PROMPT) ret = QString("PROMPT CREATE ROLE %1\n\n").arg(QUOTE(name)); ret += QString("CREATE ROLE %1 %2;\n\n").arg(QUOTE(name)).arg(toShift(info)); ret += grantedPrivs(ext, QUOTE(name), name, 1); return ret; } static toSQL SQLRollbackSegment("toOracleExtract:RollbackSegment", "SELECT DECODE(\n" " r.owner\n" " ,'PUBLIC',' PUBLIC '\n" " , ' '\n" " ) AS is_public\n" " , r.tablespace_name\n" " , NVL(r.initial_extent,t.initial_extent) AS initial_extent\n" " , NVL(r.next_extent,t.next_extent) AS next_extent\n" " , r.min_extents\n" " , DECODE(\n" " r.max_extents\n" " ,2147483645,'unlimited'\n" " , r.max_extents\n" " ) AS max_extents\n" " FROM sys.dba_rollback_segs r\n" " , sys.dba_tablespaces t\n" " WHERE\n" " r.segment_name = :nam\n" " AND t.tablespace_name = r.tablespace_name", "Get information about rollback segment, " "must have same binds and columns"); QString toOracleExtract::createRollbackSegment(toExtract &ext, const QString &, const QString &, const QString &name) const { toQList result = toQuery::readQueryNull(CONNECTION, SQLRollbackSegment, name); QString isPublic = toShift(result); QString tablespaceName = toShift(result); QString initialExtent = toShift(result); QString nextExtent = toShift(result); QString minExtent = toShift(result); QString maxExtent = toShift(result); QString ret; if (PROMPT) ret += QString("PROMPT CREATE%1ROLLBACK SEGMENT %2\n\n").arg(isPublic).arg(QUOTE(name)); ret += QString("CREATE%1ROLLBACK SEGMENT %2\n\n").arg(isPublic).arg(QUOTE(name)); if (ext.getStorage()) { ret += QString("STORAGE\n(\n" " INITIAL %1\n").arg(initialExtent); if (!nextExtent.isEmpty()) ret += QString(" NEXT %1\n").arg(nextExtent); ret += QString(" MINEXTENTS %1\n" " MAXEXTENTS %2\n" ")\n" "TABLESPACE %3;\n\n"). arg(minExtent).arg(maxExtent).arg(QUOTE(tablespaceName)); } return ret; } static toSQL SQLSequenceInfo("toOracleExtract:SequenceInfo", "SELECT 'START WITH '\n" " || LTRIM(TO_CHAR(last_number,'fm999999999'))\n" " AS start_with\n" " , 'INCREMENT BY '\n" " || LTRIM(TO_CHAR(increment_by,'fm999999999')) AS imcrement_by\n" " , DECODE(\n" " min_value\n" " ,0,'NOMINVALUE'\n" " ,'MINVALUE ' || TO_CHAR(min_value)\n" " ) AS min_value\n" " , DECODE(\n" " TO_CHAR(max_value,'fm999999999999999999999999999')\n" " ,'999999999999999999999999999','NOMAXVALUE'\n" " ,'MAXVALUE ' || TO_CHAR(max_value)\n" " ) AS max_value\n" " , DECODE(\n" " cache_size\n" " ,0,'NOCACHE'\n" " ,'CACHE ' || TO_CHAR(cache_size)\n" " ) AS cache_size\n" " , DECODE(\n" " cycle_flag\n" " ,'Y','CYCLE'\n" " ,'N', 'NOCYCLE'\n" " ) AS cycle_flag\n" " , DECODE(\n" " order_flag\n" " ,'Y','ORDER'\n" " ,'N', 'NOORDER'\n" " ) AS order_flag\n" " FROM\n" " sys.all_sequences\n" " WHERE\n" " sequence_name = :nam\n" " AND sequence_owner = :own", "Get information about sequences, must have same binds"); QString toOracleExtract::createSequence(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { toQList info = toQuery::readQueryNull(CONNECTION, SQLSequenceInfo, name, owner); if (info.empty()) throw qApp->translate("toOracleExtract", "Couldn't find sequence %1").arg(name); QString ret; if (PROMPT) ret = QString("PROMPT CREATE SEQUENCE %1%2\n\n").arg(schema).arg(QUOTE(name)); ret += QString("CREATE SEQUENCE %1%2\n").arg(schema).arg(QUOTE(name)); while (!info.empty()) { ret += " "; ret += toShift(info); ret += "\n"; } ret += ";\n\n"; return ret; } QString toOracleExtract::createSnapshot(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { return createMViewLog(ext, schema, owner, name, "SNAPSHOT"); } QString toOracleExtract::createSnapshotLog(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { return createMViewLog(ext, schema, owner, name, "SNAPSHOT LOG"); } static toSQL SQLSynonymInfo("toOracleExtract:SynonymInfo", "SELECT table_owner\n" " , table_name\n" " , NVL(db_link,'NULL')\n" " FROM\n" " sys.all_synonyms\n" " WHERE\n" " synonym_name = :nam\n" " AND owner = :own", "Get information about a synonym, must have same binds and columns"); QString toOracleExtract::createSynonym(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { toQList info = toQuery::readQueryNull(CONNECTION, SQLSynonymInfo, name, owner); if (info.empty()) throw qApp->translate("toOracleExtract", "Couldn't find synonym %1.%2").arg(owner).arg(name); QString tableOwner = toShift(info); QString tableName = toShift(info); QString dbLink = toShift(info); if (dbLink == "NULL") dbLink = ""; else dbLink = "@" + QUOTE(dbLink); QString useSchema = (schema == "PUBLIC") ? QString("") : schema; QString isPublic = (owner == "PUBLIC") ? " PUBLIC" : ""; QString tableSchema = ext.intSchema(tableOwner, false); QString andReplace = (ext.getReplace()) ? " OR REPLACE" : ""; QString sql = QString("CREATE%1%2 SYNONYM %3%4 FOR %5%6%7"). arg(andReplace).arg(isPublic).arg(useSchema).arg(QUOTE(name)). arg(tableSchema).arg(QUOTE(tableName)).arg(dbLink); QString ret; if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; return ret; } static toSQL SQLTableType("toOracleExtract:TableType", "SELECT partitioned,\n" " iot_type\n" " FROM sys.all_tables\n" "WHERE table_name = :nam\n" " AND owner = :own", "Get table type, must have same columns and binds", "0800"); static toSQL SQLTableType7("toOracleExtract:TableType", "SELECT 'NO',\n" " 'NOT IOT'\n" " FROM sys.all_tables\n" "WHERE table_name = :nam\n" " AND owner = :own", "", "0700"); static toSQL SQLTableInfo("toOracleExtract:TableInfo", "SELECT\n" " DECODE(\n" " t.monitoring\n" " ,'NO','NOMONITORING'\n" " , 'MONITORING'\n" " ) AS monitoring\n" " , 'N/A' AS table_name\n" " , LTRIM(t.degree)\n" " , LTRIM(t.instances)\n" " , DECODE(\n" " t.iot_type\n" " ,'IOT','INDEX'\n" " , 'HEAP'\n" " ) AS organization\n" " , DECODE(\n" " LTRIM(t.cache)\n" " ,'Y','CACHE'\n" " , 'NOCACHE'\n" " )\n" " , t.pct_used\n" " , t.pct_free\n" " , DECODE(\n" " t.ini_trans\n" " ,0,1\n" " ,null,1\n" " ,t.ini_trans\n" " ) AS ini_trans\n" " , DECODE(\n" " t.max_trans\n" " ,0,255\n" " ,null,255\n" " ,t.max_trans\n" " ) AS max_trans\n" " , t.initial_extent\n" " , t.next_extent\n" " , t.min_extents\n" " , DECODE(\n" " t.max_extents\n" " ,2147483645,'UNLIMITED'\n" " , t.max_extents\n" " ) AS max_extents\n" " , NVL(t.pct_increase,0)\n" " , NVL(t.freelists,1)\n" " , NVL(t.freelist_groups,1)\n" " , t.buffer_pool AS buffer_pool\n" " , DECODE(\n" " t.logging\n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , t.tablespace_name AS tablespace_name\n" " , s.blocks - NVL(t.empty_blocks,0)\n" " FROM\n" " sys.all_tables t\n" " , %1 s\n" " WHERE\n" " t.table_name = :nam\n" " AND t.table_name = s.segment_name\n" " AND s.segment_type = 'TABLE'\n" " AND s.owner = :own\n" " AND t.owner = s.owner", "Get information about a vanilla table, must have same binds and columns", "0801"); static toSQL SQLTableInfo8("toOracleExtract:TableInfo", "SELECT\n" " 'N/A' AS monitoring\n" " , 'N/A' AS table_name\n" " , LTRIM(t.degree)\n" " , LTRIM(t.instances)\n" " , DECODE(\n" " t.iot_type\n" " ,'IOT','INDEX'\n" " , 'HEAP'\n" " ) AS organization\n" " , DECODE(\n" " LTRIM(t.cache)\n" " ,'Y','CACHE'\n" " , 'NOCACHE'\n" " )\n" " , t.pct_used\n" " , t.pct_free\n" " , DECODE(\n" " t.ini_trans\n" " ,0,1\n" " ,null,1\n" " ,t.ini_trans\n" " ) AS ini_trans\n" " , DECODE(\n" " t.max_trans\n" " ,0,255\n" " ,null,255\n" " ,t.max_trans\n" " ) AS max_trans\n" " , t.initial_extent\n" " , t.next_extent\n" " , t.min_extents\n" " , DECODE(\n" " t.max_extents\n" " ,2147483645,'unlimited'\n" " , t.max_extents\n" " ) AS max_extents\n" " , NVL(t.pct_increase,0)\n" " , NVL(t.freelists,1)\n" " , NVL(t.freelist_groups,1)\n" " , 'N/A' AS buffer_pool\n" " , DECODE(\n" " t.logging\n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , t.tablespace_name AS tablespace_name\n" " , s.blocks - NVL(t.empty_blocks,0)\n" " FROM\n" " sys.all_tables t\n" " , %1 s\n" " WHERE\n" " t.table_name = :nam\n" " AND t.table_name = s.segment_name\n" " AND s.segment_type = 'TABLE'\n" " AND s.owner = :own\n" " AND t.owner = s.owner", "", "0800"); static toSQL SQLTableInfo7("toOracleExtract:TableInfo", "SELECT\n" " 'N/A' AS monitoring\n" " , 'N/A' AS table_name\n" " , LTRIM(t.degree)\n" " , LTRIM(t.instances)\n" " , 'N/A' AS organization\n" " , DECODE(\n" " LTRIM(t.cache)\n" " ,'Y','CACHE'\n" " , 'NOCACHE'\n" " )\n" " , t.pct_used\n" " , t.pct_free\n" " , DECODE(\n" " t.ini_trans\n" " ,0,1\n" " ,null,1\n" " ,t.ini_trans\n" " ) AS ini_trans\n" " , DECODE(\n" " t.max_trans\n" " ,0,255\n" " ,null,255\n" " ,t.max_trans\n" " ) AS max_trans\n" " , t.initial_extent\n" " , t.next_extent\n" " , t.min_extents\n" " , DECODE(\n" " t.max_extents\n" " ,2147483645,'unlimited'\n" " , t.max_extents\n" " ) AS max_extents\n" " , NVL(t.pct_increase,0)\n" " , NVL(t.freelists,1)\n" " , NVL(t.freelist_groups,1)\n" " , 'N/A' AS buffer_pool\n" " , 'N/A' AS logging\n" " , t.tablespace_name AS tablespace_name\n" " , s.blocks - NVL(t.empty_blocks,0)\n" " FROM\n" " sys.all_tables t\n" " , %1 s\n" " WHERE\n" " t.table_name = :nam\n" " AND t.table_name = s.segment_name\n" " AND s.segment_type = 'TABLE'\n" " AND s.owner = :own\n" " AND t.owner = s.owner", "", "0700"); QString toOracleExtract::createTable(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { toQuery inf(CONNECTION, SQLTableType, name, owner); if (inf.eof()) throw qApp->translate("toOracleExtract", "Couldn't find table %1.%2").arg(owner).arg(name); QString partitioned(inf.readValue()); QString iot_type(inf.readValue()); if (iot_type == "IOT") { if (partitioned == "YES") return createPartitionedIOT(ext, schema, owner, name); else return createIOT(ext, schema, owner, name); } else if (partitioned == "YES") return createPartitionedTable(ext, schema, owner, name); toQList result = toQuery::readQueryNull(CONNECTION, segments(ext, SQLTableInfo), name, owner); QString ret = createTableText(ext, result, schema, owner, name); ret += ";\n\n"; ret += createComments(ext, schema, owner, name); return ret; } static toSQL SQLTableConstraints("toOracleExtract:TableConstraints", "SELECT\n" " constraint_type,\n" " constraint_name,\n" " NULL\n" " FROM\n" " sys.all_constraints cn\n" " WHERE table_name = :nam\n" " AND owner = :own\n" " AND constraint_type IN('P','U','C')\n" " AND generated != 'GENERATED NAME'\n" " ORDER\n" " BY\n" " DECODE(\n" " constraint_type\n" " ,'P',1\n" " ,'U',2\n" " ,'C',4\n" " )\n" " , constraint_name", "Get constraints tied to a table except referential, same binds and columns", "0800"); static toSQL SQLTableConstraints7("toOracleExtract:TableConstraints", "SELECT\n" " constraint_type,\n" " constraint_name,\n" " search_condition\n" " FROM\n" " sys.all_constraints cn\n" " WHERE table_name = :nam\n" " AND owner = :own\n" " AND constraint_type IN('P','U','C')\n" " ORDER\n" " BY\n" " DECODE(\n" " constraint_type\n" " ,'P',1\n" " ,'U',2\n" " ,'C',4\n" " )\n" " , constraint_name", QString::null, "0703"); static toSQL SQLTableReferences("toOracleExtract:TableReferences", "SELECT\n" " constraint_name\n" " FROM\n" " sys.all_constraints cn\n" " WHERE table_name = :nam\n" " AND owner = :own\n" " AND constraint_type IN('R')\n" " AND generated != 'GENERATED NAME'\n" " ORDER\n" " BY\n" " DECODE(\n" " constraint_type\n" " ,'R',1\n" " )\n" " , constraint_name", "Get foreign constraints from a table, same binds and columns", "0800"); static toSQL SQLTableReferences7("toOracleExtract:TableReferences", "SELECT\n" " constraint_name\n" " FROM\n" " sys.all_constraints cn\n" " WHERE table_name = :nam\n" " AND owner = :own\n" " AND constraint_type IN('R')\n" " ORDER\n" " BY\n" " DECODE(\n" " constraint_type\n" " ,'R',1\n" " )\n" " , constraint_name", QString::null, "0703"); static toSQL SQLTableTriggers("toOracleExtract:TableTriggers", "SELECT trigger_name\n" " FROM sys.all_triggers\n" " WHERE table_name = :nam\n" " AND owner = :own\n" " ORDER BY trigger_name", "Get triggers for a table, must have same columns and binds"); static toSQL SQLIndexNames("toOracleExtract:IndexNames", "SELECT owner,index_name\n" " FROM sys.all_indexes a\n" " WHERE table_name = :nam\n" " AND table_owner = :own", "Get all indexes on table, same binds and columns"); QString toOracleExtract::createTableFamily(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { QString ret = createTable(ext, schema, owner, name); toQuery inf(CONNECTION, SQLTableType, name, owner); if (inf.eof()) throw qApp->translate("toOracleExtract", "Couldn't find table %1.%2").arg(owner).arg(name); inf.readValue(); QString iotType(inf.readValue()); toQList constraints = toQuery::readQueryNull(CONNECTION, SQLTableConstraints, name, owner); toQList indexes = toQuery::readQueryNull(CONNECTION, SQLIndexNames, name, owner); while (!indexes.empty()) { QString indOwner(toShift(indexes)); QString indName(toShift(indexes)); bool add = true; if (iotType == "IOT") { for (toQList::iterator i = constraints.begin();i != constraints.end();i++) { QString consType = *i; i++; QString consName = *i; i++; if (consType == "P" && consName == indName && owner == indOwner) { add = false; break; } } } if (add ) ret += createIndex(ext, ext.intSchema(indOwner, false), indOwner, indName); } while (!constraints.empty()) { QString type = toShift(constraints); QString name = toShift(constraints); QString search = toShift(constraints); if ((type != "P" || iotType != "IOT") && !search.contains(" IS NOT NULL")) ret += createConstraint(ext, schema, owner, name); } toQList triggers = toQuery::readQueryNull(CONNECTION, SQLTableTriggers, name, owner); while (!triggers.empty()) ret += createTrigger(ext, schema, owner, toShift(triggers)); return ret; } void toOracleExtract::createTableContents(toExtract &ext, QTextStream &stream, const QString &schema, const QString &owner, const QString &name) const { if (ext.getContents()) { if (PROMPT) stream << QString("PROMPT CONTENTS OF %1%2\n\n").arg(schema).arg(QUOTE(name)); toQuery query(CONNECTION, QString("SELECT * FROM %1.%2").arg(QUOTE(owner)).arg(QUOTE(name))); toQDescList desc = query.describe(); int cols = query.columns(); bool first = true; QString dateformat(toConfigurationSingle::Instance().dateFormat()); QString beg = QString("INSERT INTO %1%2 (").arg(schema).arg(QUOTE(name)); bool *dates = new bool[desc.size()]; try { int num = 0; for (toQDescList::iterator i = desc.begin();i != desc.end();i++) { if (first) first = false; else beg += ","; beg += (*i).Name; dates[num] = (*i).Datatype.contains("DATE"); num++; } beg += ") VALUES ("; QRegExp find("'"); int row = 0; int maxRow = ext.getCommitDistance(); while (!query.eof()) { QString line = beg; first = true; for (int i = 0;i < cols;i++) { if (first) first = false; else line += ","; QString val = query.readValueNull(); if (dates[i]) { if (val.isNull()) line += "NULL"; else line += QString("TO_DATE('%1','%2')").arg(val).arg(dateformat); } else { if (val.isNull()) line += "NULL"; else { val.replace(find, "''"); line += "'"; line += val; line += "'"; } }; } line += ");\n"; stream << line; row++; if (maxRow > 0 && row % maxRow == 0) stream << "COMMIT;\n"; } } catch (...) { delete[] dates; throw; } delete[] dates; stream << "COMMIT;\n\n"; } } QString toOracleExtract::createTableReferences(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { QString ret; toQList constraints = toQuery::readQueryNull(CONNECTION, SQLTableReferences, name, owner); while (!constraints.empty()) ret += createConstraint(ext, schema, owner, toShift(constraints)); return ret; } static toSQL SQLTablespaceInfo("toOracleExtract:TablespaceInfo", "SELECT initial_extent\n" " , next_extent\n" " , min_extents\n" " , DECODE(\n" " max_extents\n" " ,2147483645,'unlimited'\n" " ,null,DECODE(\n" " :bs\n" " , 1, 57\n" " , 2, 121\n" " , 4, 249\n" " , 8, 505\n" " ,16,1017\n" " ,32,2041\n" " ,'\?\?\?'\n" " )\n" " ,max_extents\n" " ) AS max_extents\n" " , pct_increase\n" " , min_extlen\n" " , contents\n" " , logging\n" " , extent_management\n" " , allocation_type\n" " FROM\n" " sys.dba_tablespaces\n" " WHERE\n" " tablespace_name = :nam", "Get tablespace information, must have same columns and binds", "0801"); static toSQL SQLTablespaceInfo8("toOracleExtract:TablespaceInfo", "SELECT initial_extent\n" " , next_extent\n" " , min_extents\n" " , DECODE(\n" " max_extents\n" " ,2147483645,'unlimited'\n" " ,null,DECODE(\n" " :bs\n" " , 1, 57\n" " , 2, 121\n" " , 4, 249\n" " , 8, 505\n" " ,16,1017\n" " ,32,2041\n" " ,'\?\?\?'\n" " )\n" " ,max_extents\n" " ) AS max_extents\n" " , pct_increase\n" " , min_extlen\n" " , contents\n" " , DECODE(\n" " logging \n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , 'N/A' AS extent_management\n" " , 'N/A' AS allocation_type\n" " FROM\n" " sys.dba_tablespaces\n" " WHERE\n" " tablespace_name = :nam", "", "0800"); static toSQL SQLTablespaceInfo7("toOracleExtract:TablespaceInfo", "SELECT initial_extent\n" " , next_extent\n" " , min_extents\n" " , DECODE(\n" " max_extents\n" " ,2147483645,'unlimited'\n" " ,null,DECODE(\n" " $block_size\n" " , 1, 57\n" " , 2, 121\n" " , 4, 249\n" " , 8, 505\n" " ,16,1017\n" " ,32,2041\n" " ,'\?\?\?'\n" " )\n" " ,max_extents\n" " ) AS max_extents\n" " , pct_increase\n" " , min_extlen\n" " , contents\n" " , DECODE(\n" " logging \n" " ,'NO','NOLOGGING'\n" " , 'LOGGING'\n" " ) AS logging\n" " , 'N/A' AS extent_management\n" " , 'N/A' AS allocation_type\n" " FROM\n" " sys.dba_tablespaces\n" " WHERE\n" " tablespace_name = :nam", "", "0700"); static toSQL SQLDatafileInfo("toOracleExtract:DatafileInfo", "SELECT\n" " file_name\n" " , bytes\n" " , autoextensible\n" " , DECODE(\n" " SIGN(2147483645 - maxbytes)\n" " ,-1,'unlimited'\n" " ,maxbytes\n" " ) AS maxbytes\n" " , increment_by * :bs * 1024 AS increment_by\n" " FROM\n" " (select bytes,autoextensible,blocks,increment_by,maxbytes,file_name,tablespace_name\n" " from sys.dba_temp_files\n" " union\n" " select bytes,autoextensible,blocks,increment_by,maxbytes,file_name,tablespace_name\n" " from sys.dba_data_files)\n" " WHERE\n" " tablespace_name = :nam\n" " ORDER BY file_name", "Get information about datafiles in a tablespace, " "same binds and columns", "0800"); static toSQL SQLDatafileInfo7("toOracleExtract:DatafileInfo", "SELECT\n" " file_name\n" " , bytes\n" " , 'N/A' AS autoextensible\n" " , 'N/A' AS maxbytes\n" " , DECODE(:bs,\n" " NULL,'N/A','N/A') AS increment_by\n" " FROM\n" " sys.dba_data_files\n" " WHERE\n" " tablespace_name = :nam\n" " ORDER BY file_name", "", "0700"); QString toOracleExtract::createTablespace(toExtract &ext, const QString &, const QString &, const QString &name) const { toQList info = toQuery::readQueryNull(CONNECTION, SQLTablespaceInfo, QString::number(ext.getBlockSize()), name); if (info.size() != 10) throw qApp->translate("toOracleExtract", "Couldn't find tablespace %1").arg(name); QString initial = toShift(info); QString next = toShift(info); QString minExtents = toShift(info); QString maxExtents = toShift(info); QString pctIncrease = toShift(info); QString minExtlen = toShift(info); QString contents = toShift(info); QString logging = toShift(info); QString extentManagement = toShift(info); QString allocationType = toShift(info); QString ret; QString sql; if (extentManagement == "LOCAL" && contents == "TEMPORARY") sql = QString("CREATE TEMPORARY TABLESPACE %1\n").arg(QUOTE(name)); else sql = QString("CREATE TABLESPACE %1\n").arg(QUOTE(name)); if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n"; } ret += sql; toQList files = toQuery::readQueryNull(CONNECTION, SQLDatafileInfo, QString::number(ext.getBlockSize()), name); if (extentManagement == "LOCAL" && contents == "TEMPORARY") ret += "TEMPFILE\n"; else ret += "DATAFILE\n"; QString comma = " "; while (!files.empty()) { QString fileName = toShift(files); QString bytes = toShift(files); QString autoExtensible = toShift(files); QString maxBytes = toShift(files); QString incrementBy = toShift(files); ret += QString("%1 '%2' SIZE %3 REUSE\n"). arg(comma). arg(prepareDB(fileName)). arg(bytes); if (CONNECTION.version() >= "0800" && ext.getStorage()) { ret += " AUTOEXTEND "; if (autoExtensible == "YES") ret += QString("ON NEXT %1 MAXSIZE %2\n"). arg(incrementBy). arg(maxBytes); else ret += "OFF\n"; } comma = " ,"; } if (ext.getStorage()) { if (extentManagement == "LOCAL") { ret += "EXTENT MANAGEMENT LOCAL "; if (allocationType == "SYSTEM") ret += "AUTOALLOCATE\n"; else ret += QString("UNIFORM SIZE %1\n").arg(next); } else { ret += QString("DEFAULT STORAGE\n" "(\n" " INITIAL %1\n").arg(initial); if (!next.isEmpty()) ret += QString(" NEXT %1\n").arg(next); ret += QString(" MINEXTENTS %1\n" " MAXEXTENTS %2\n" " PCTINCREASE %3\n" ")\n"). arg(minExtents). arg(maxExtents). arg(pctIncrease); if (minExtlen.toInt() > 0) ret += QString("MINIMUM EXTENT %1\n").arg(minExtlen); if (CONNECTION.version() >= "0801") ret += "EXTENT MANAGEMENT DICTIONARY\n"; } if (CONNECTION.version() >= "0800" && (contents != "TEMPORARY" || extentManagement != "LOCAL")) { ret += logging; ret += "\n"; } } ret += ";\n\n"; return ret; } static toSQL SQLTriggerInfo("toOracleExtract:TriggerInfo", "SELECT trigger_type\n" " , RTRIM(triggering_event)\n" " , table_owner\n" " , table_name\n" " , base_object_type\n" " , referencing_names\n" " , upper(description)\n" " , when_clause\n" " , trigger_body\n" " , DECODE(status,'ENABLED','ENABLE','DISABLE')\n" " FROM\n" " sys.all_triggers\n" " WHERE\n" " trigger_name = :nam\n" " AND owner = :own", "Get information about triggers, must have same binds and columns", "0801"); static toSQL SQLTriggerInfo8("toOracleExtract:TriggerInfo", "SELECT\n" " trigger_type\n" " , RTRIM(triggering_event)\n" " , table_owner\n" " , table_name\n" " , 'TABLE' AS base_object_type\n" " , referencing_names\n" " , upper(description)\n" " , when_clause\n" " , trigger_body\n" " , DECODE(status,'ENABLED','ENABLE','DISABLE')\n" " FROM\n" " sys.all_triggers\n" " WHERE\n" " trigger_name = :nam\n" " AND owner = :own", "", "0800"); QString toOracleExtract::createTrigger(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { if (!ext.getCode()) return ""; toQList result = toQuery::readQueryNull(CONNECTION, SQLTriggerInfo, name, owner); if (result.size() != 10) throw qApp->translate("toOracleExtract", "Couldn't find trigger %1.%2").arg(owner).arg(name); QString triggerType = toShift(result); QString event = toShift(result); QString tableOwner = toShift(result); QString table = toShift(result); QString baseType = toShift(result); QString refNames = toShift(result); QString description = toShift(result); QString when = toShift(result); QString body = toShift(result); QString status = toShift(result); QString trgType; if (triggerType.indexOf("BEFORE") >= 0) trgType = "BEFORE"; else if (triggerType.indexOf("AFTER") >= 0) trgType = "AFTER"; else if (triggerType.indexOf("INSTEAD OF") >= 0) trgType = "INSTEAD OF"; QString trgPart = trgType + " " + event; QRegExp src("\\s" + trgPart + "\\s", Qt::CaseInsensitive); description.replace(QRegExp("\nON"), QString("\n ON")); int pos = description.indexOf(src); //QString columns=description; QString columns; if (pos >= 0) { pos += trgPart.length() + 2; int endPos = description.indexOf(" ON ", pos); if (endPos >= 0) { columns = description.right(description.length() - pos); columns.truncate(endPos - pos); } } QString schema2 = ext.intSchema(tableOwner, false); QString object; if (baseType == "TABLE" || baseType == "VIEW") { object = schema2; object += table; } else if (baseType == "SCHEMA") { object = schema; object += "SCHEMA"; } else { object = baseType; } QString sql = QString("CREATE OR REPLACE TRIGGER %1%2\n").arg(schema).arg(QUOTE(name)); QString ret; if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n"; } ret += sql; ret += QString("%1 %2 %3 ON %4\n").arg(trgType).arg(event).arg(columns).arg(object); if (baseType.indexOf("TABLE") >= 0 || baseType.indexOf("VIEW") >= 0) { ret += refNames; ret += "\n"; } if (triggerType.indexOf("EACH ROW") >= 0) ret += "FOR EACH ROW\n"; if (!when.isEmpty()) { ret += "WHEN ("; ret += when; ret += ")\n"; } ret += body; ret += "\n/\n\n"; if (status != "ENABLE") { ret += QString("ALTER TRIGGER %1%2 DISABLE;\n\n").arg(schema).arg(QUOTE(name)); } return ret; } QString toOracleExtract::createType(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { return displaySource(ext, schema, owner, name, "TYPE", false); } static toSQL SQLUserInfo("toOracleExtract:UserInfo", "SELECT\n" " DECODE(\n" " password\n" " ,'EXTERNAL','EXTERNALLY'\n" " ,'BY VALUES ''' || password || ''''\n" " ) AS password\n" " , profile\n" " , default_tablespace\n" " , temporary_tablespace\n" " FROM\n" " sys.dba_users\n" " WHERE\n" " username = :nam", "Information about authentication for a user, " "same binds and columns"); static toSQL SQLUserQuotas("toOracleExtract:UserQuotas", "SELECT\n" " DECODE(\n" " max_bytes\n" " ,-1,'unlimited'\n" " ,TO_CHAR(max_bytes,'99999999')\n" " ) AS max_bytes\n" " , tablespace_name\n" " FROM\n" " sys.dba_ts_quotas\n" " WHERE\n" " username = :nam\n" " ORDER BY tablespace_name", "Get information about tablespaces for a user, " "same binds and columns"); QString toOracleExtract::createUser(toExtract &ext, const QString &, const QString &, const QString &name) const { toQList info = toQuery::readQueryNull(CONNECTION, SQLUserInfo, name); if (info.size() != 4) throw qApp->translate("toOracleExtract", "Couldn't find user %1").arg(name); QString password = toShift(info); QString profile = toShift(info); QString defaultTablespace = toShift(info); QString temporaryTablespace = toShift(info); QString ret; QString nam; if (ext.getSchema() != "1" && !ext.getSchema().isEmpty()) nam = ext.getSchema().toLower(); else nam = QUOTE(name); if (PROMPT) ret = QString("PROMPT CREATE USER %1\n\n").arg(nam); ret += QString("CREATE USER %1 IDENTIFIED %2\n" " PROFILE %3\n" " DEFAULT TABLESPACE %4\n" " TEMPORARY TABLESPACE %5\n"). arg(nam). arg(password). arg(QUOTE(profile)). arg(QUOTE(defaultTablespace)). arg(QUOTE(temporaryTablespace)); if (ext.getStorage()) { toQList quota = toQuery::readQueryNull(CONNECTION, SQLUserQuotas, name); while (!quota.empty()) { QString siz = toShift(quota); QString tab = toShift(quota); ret += QString(" QUOTA %1 ON %2\n"). arg(siz). arg(QUOTE(tab)); } } ret += ";\n\n"; ret += grantedPrivs(ext, nam, name, 3); return ret; } static toSQL SQLViewSource("toOracleExtract:ViewSource", "SELECT text\n" " FROM\n" " sys.all_views\n" " WHERE\n" " view_name = :nam\n" " AND owner = :own", "Get the source of the view, must have same binds and columns"); static toSQL SQLViewColumns("toOracleExtract:ViewColumns", "SELECT column_name\n" " FROM sys.all_tab_columns\n" " WHERE table_name = :nam\n" " AND owner = :own\n" " ORDER BY column_id", "Get column names of the view, must have same binds and columns"); QString toOracleExtract::createView(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { if (!ext.getCode()) return ""; toQList source = toQuery::readQueryNull(CONNECTION, SQLViewSource, name, owner); if (source.empty()) throw qApp->translate("toOracleExtract", "Couldn't find view %1.%2").arg(QUOTE(owner)).arg(QUOTE(name)); QString text = toShift(source); QString ret; QString sql = QString("CREATE OR REPLACE VIEW %1%2\n").arg(schema).arg(QUOTE(name)); if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n"; } ret += sql; toQList cols = toQuery::readQueryNull(CONNECTION, SQLViewColumns, name, owner); ret += "("; QString sep = "\n "; while (!cols.empty()) { QString str = toShift(cols); ret += sep; ret += QUOTE(str); sep = "\n , "; } ret += "\n)\n"; ret += "AS\n"; ret += text; ret += ";\n\n"; ret += createComments(ext, schema, owner, name); return ret; } // Implementation describe functions void toOracleExtract::describeConstraint(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { if (ext.getConstraints()) { toQuery inf(CONNECTION, SQLListConstraint, owner, name); if (inf.eof()) throw qApp->translate("toOracleExtract", "Constraint %1.%2 doesn't exist").arg(owner).arg(name); QString table(inf.readValue()); QString tchr(inf.readValue()); QString search(inf.readValue()); QString rOwner(inf.readValue()); QString rName(inf.readValue()); QString delRule(inf.readValue()); QString status(inf.readValue()); QString defferable(inf.readValue()); QString deffered(inf.readValue()); QString type = (tchr == "P") ? "PRIMARY KEY" : (tchr == "U") ? "UNIQUE" : (tchr == "R") ? "FOREIGN KEY" : "CHECK"; std::list ctx; ctx.insert(ctx.end(), schema); ctx.insert(ctx.end(), "TABLE"); ctx.insert(ctx.end(), QUOTE(table)); ctx.insert(ctx.end(), "CONSTRAINT"); ctx.insert(ctx.end(), QUOTE(name)); QString ret = type; if (tchr == "C") { ret += " ("; ret += search; ret += ")"; } else { ret += " "; ret += constraintColumns(ext, owner, name).simplified(); if (tchr == "R") { toQuery query(CONNECTION, SQLConstraintTable, rOwner, rName); ret += " REFERENCES "; ret += ext.intSchema(rOwner, false); ret += QUOTE(query.readValue()); ret += constraintColumns(ext, rOwner, rName); if (delRule == "CASCADE") ret += "ON DELETE CASCADE"; } } addDescription(lst, ctx, "DEFINITION", ret); if (status.startsWith("ENABLE")) status = "ENABLED"; if (CONNECTION.version() < "08") ret = status; else { addDescription(lst, ctx, "STATUS", defferable); ret = "INITIALLY "; ret += deffered; addDescription(lst, ctx, "STATUS", ret); ret = status; } addDescription(lst, ctx, "STATUS", ret); } } void toOracleExtract::describeDBLink(toExtract &ext, std::list &lst, const QString &, const QString &owner, const QString &name) const { toQuery inf(CONNECTION, SQLDBLink, owner, name); if (inf.eof()) throw qApp->translate("toOracleExtract", "DBLink %1.%2 doesn't exist").arg(owner).arg(name); QString user(inf.readValue()); QString password(inf.readValue()); QString host(inf.readValue()); QString publ = (owner == "PUBLIC") ? "PUBLIC" : ""; QString sql = QString("CREATE%1 DATABASE LINK %2").arg(publ).arg(QUOTE(name)); QString ret; std::list ctx; ctx.insert(ctx.end(), "DATABASE LINK"); ctx.insert(ctx.end(), QUOTE(name)); addDescription(lst, ctx, publ, QString("%1 IDENTIFIED BY %2 USING '%3'"). arg(user.toLower()). arg(password.toLower()). arg(prepareDB(host))); } void toOracleExtract::describeExchangeIndex(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { QStringList str = name.split(":"); if (str.count() != 2) throw ("When calling createExchangeIndex name should contain :"); QString segment = str.first(); QString partition = str.last(); toQuery inf(CONNECTION, segments(ext, SQLPartitionSegmentType), segment, partition, owner); if (inf.eof()) throw qApp->translate("toOracleExtract", "Exchange index %1.%2 doesn't exist").arg(owner).arg(name); QString type = inf.readValue(); QString blocks = inf.readValue(); QString sql = toSQL::string(SQLExchangeIndex, CONNECTION).arg(type).arg(blocks); toQList result = toQuery::readQueryNull(CONNECTION, sql, segment, partition, owner); QString degree = toShift(result); QString instances = toShift(result); QString table = toShift(result); QString unique = toShift(result); QString bitmap = toShift(result); toUnShift(result, toQValue("")); std::list ctx; ctx.insert(ctx.end(), schema); ctx.insert(ctx.end(), "TABLE"); ctx.insert(ctx.end(), QUOTE(table)); ctx.insert(ctx.end(), "EXCHANGE INDEX"); ctx.insert(ctx.end(), segment); ctx.insert(ctx.end(), partition); describeIndexColumns(ext, lst, ctx, owner, segment); addDescription(lst, ctx, QString("%1%2").arg(unique).arg(bitmap)); addDescription(lst, ctx, QString("%1%2").arg(segment).arg(table)); if (ext.getParallel() && ! degree.isEmpty() && ! instances.isEmpty()) { addDescription(lst, ctx, "PARALLEL", "DEGREE", degree); addDescription(lst, ctx, "PARALLEL", "INSTANCES", instances); } describeAttributes(ext, lst, ctx, result); } void toOracleExtract::describeExchangeTable(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { QStringList str = name.split(":"); if (str.count() != 2) throw ("When calling createExchangeTable name should contain :"); QString segment = str.first(); QString partition = str.last(); toQuery inf(CONNECTION, segments(ext, SQLPartitionSegmentType), segment, partition, owner); if (inf.eof()) throw qApp->translate("toOracleExtract", "Exchange table %1.%2 doesn't exist").arg(owner).arg(name); QString type = inf.readValue(); QString blocks = inf.readValue(); QString sql = toSQL::string(SQLExchangeTable, CONNECTION).arg(type).arg(blocks); toQList result = toQuery::readQueryNull(CONNECTION, sql, segment, partition, owner); std::list ctx; ctx.insert(ctx.end(), schema); ctx.insert(ctx.end(), "EXCHANGE TABLE"); ctx.insert(ctx.end(), segment); ctx.insert(ctx.end(), partition); describeTableText(ext, lst, ctx, result, schema, owner, segment); } void toOracleExtract::describeFunction(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { describeSource(ext, lst, schema, owner, name, "FUNCTION"); } void toOracleExtract::describeIndex(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { if (!ext.getIndexes()) return ; toQList res = toQuery::readQueryNull(CONNECTION, SQLIndexInfo, name, owner); if (res.size() != 10) throw qApp->translate("toOracleExtract", "Couldn't find index %1.%2").arg(owner).arg(name); QString partitioned = toShift(res); QString table = toShift(res); QString tableOwner = toShift(res); QString reverse = toShift(res); QString unique = toShift(res); QString bitmap = toShift(res); QString domain = toShift(res); QString domOwner = toShift(res); QString domName = toShift(res); QString domParam = toShift(res); toQList storage = toQuery::readQueryNull(CONNECTION, segments(ext, SQLIndexSegment), name, owner); QString degree = toShift(storage); QString instances = toShift(storage); QString compressed = toShift(storage); QString schema2 = ext.intSchema(tableOwner, false); std::list ctx; ctx.insert(ctx.end(), schema); ctx.insert(ctx.end(), QString("INDEX")); ctx.insert(ctx.end(), QUOTE(name)); addDescription(lst, ctx, "ON", schema2 + QUOTE(table)); addDescription(lst, ctx, QString("%1%2 INDEX").arg(unique).arg(bitmap).mid(1)); addDescription(lst, ctx); if (!reverse.isEmpty()) addDescription(lst, ctx, reverse); describeIndexColumns(ext, lst, ctx, owner, name); if (domain == "DOMAIN") { addDescription(lst, ctx, "DOMAIN", QString("INDEXTYPE IS DOMAINOWNER %1.%2"). arg(QUOTE(domOwner)). arg(QUOTE(domName))); addDescription(lst, ctx, "DOMAIN", QString("PARAMETERS %1").arg(domParam)); return ; } if (CONNECTION.version() >= "0800" && ext.getParallel() && ! degree.isEmpty() && ! instances.isEmpty()) { addDescription(lst, ctx, "PARALLEL", QString("DEGREE %1").arg(degree)); addDescription(lst, ctx, "PARALLEL", QString("INSTANCES %1").arg(instances)); } if (partitioned == "YES") { describePartitionedIndex(ext, lst, ctx, schema, owner, name); return ; } toUnShift(storage, toQValue("")); describeAttributes(ext, lst, ctx, storage); if (!compressed.isEmpty() && compressed != "0" && ext.getStorage()) addDescription(lst, ctx, "COMPRESS", compressed); } void toOracleExtract::describeMaterializedView(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { describeMView(ext, lst, schema, owner, name, "MATERIALIZED VIEW"); } void toOracleExtract::describeMaterializedViewLog(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { describeMViewLog(ext, lst, schema, owner, name, "MATERIALIZED VIEW LOG"); } void toOracleExtract::describePackage(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { describeSource(ext, lst, schema, owner, name, "PACKAGE"); } void toOracleExtract::describePackageBody(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { describeSource(ext, lst, schema, owner, name, "PACKAGE BODY"); } void toOracleExtract::describeProcedure(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { describeSource(ext, lst, schema, owner, name, "PROCEDURE"); } void toOracleExtract::describeProfile(toExtract &ext, std::list &lst, const QString &, const QString &, const QString &name) const { toQList info = toQuery::readQueryNull(CONNECTION, SQLProfileInfo, name); if (info.empty()) throw qApp->translate("toOracleExtract", "Couldn't find profile %1").arg(name); std::list ctx; ctx.insert(ctx.end(), "NONE"); ctx.insert(ctx.end(), "PROFILE"); ctx.insert(ctx.end(), QUOTE(name)); addDescription(lst, ctx); while (!info.empty()) { QString nam = toShift(info); QString val = toShift(info); addDescription(lst, ctx, nam, val); } } void toOracleExtract::describeRole(toExtract &ext, std::list &lst, const QString &, const QString &, const QString &name) const { toQList info = toQuery::readQueryNull(CONNECTION, SQLRoleInfo, name); if (info.empty()) throw qApp->translate("toOracleExtract", "Couldn't find role %1").arg(name); std::list ctx; ctx.insert(ctx.end(), "NONE"); ctx.insert(ctx.end(), "ROLE"); ctx.insert(ctx.end(), QUOTE(name)); addDescription(lst, ctx); addDescription(lst, ctx, "INFO", toShift(info)); describePrivs(ext, lst, ctx, name); } void toOracleExtract::describeRollbackSegment(toExtract &ext, std::list &lst, const QString &, const QString &, const QString &name) const { toQList result = toQuery::readQueryNull(CONNECTION, SQLRollbackSegment, name); QString isPublic = toShift(result); QString tablespaceName = toShift(result); QString initialExtent = toShift(result); QString nextExtent = toShift(result); QString minExtent = toShift(result); QString maxExtent = toShift(result); std::list ctx; ctx.insert(ctx.end(), "NONE"); ctx.insert(ctx.end(), "ROLLBACK SEGMENT"); ctx.insert(ctx.end(), QUOTE(name)); addDescription(lst, ctx); addDescription(lst, ctx, QString("TABLESPACE %1").arg(QUOTE(tablespaceName))); if (ext.getStorage()) { ctx.insert(ctx.end(), "STORAGE"); addDescription(lst, ctx, QString("INITIAL %1").arg(initialExtent)); if (!nextExtent.isEmpty()) addDescription(lst, ctx, QString("NEXT %1").arg(nextExtent)); addDescription(lst, ctx, QString("MINEXTENTS %1").arg(minExtent)); addDescription(lst, ctx, QString("MAXEXTENTS %1").arg(maxExtent)); } } void toOracleExtract::describeSequence(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { toQList info = toQuery::readQueryNull(CONNECTION, SQLSequenceInfo, name, owner); if (info.empty()) throw qApp->translate("toOracleExtract", "Couldn't find sequence %1").arg(name); std::list ctx; ctx.insert(ctx.end(), schema); ctx.insert(ctx.end(), "SEQUENCE"); ctx.insert(ctx.end(), QUOTE(name)); addDescription(lst, ctx); while (!info.empty()) addDescription(lst, ctx, toShift(info)); } void toOracleExtract::describeSnapshot(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { describeMView(ext, lst, schema, owner, name, "SNAPSHOT"); } void toOracleExtract::describeSnapshotLog(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { describeMViewLog(ext, lst, schema, owner, name, "SNAPSHOT LOG"); } void toOracleExtract::describeSynonym(toExtract &ext, std::list &lst, const QString &, const QString &owner, const QString &name) const { toQList info = toQuery::readQueryNull(CONNECTION, SQLSynonymInfo, name, owner); if (info.empty()) throw qApp->translate("toOracleExtract", "Couldn't find synonym %1.%2").arg(owner).arg(name); QString tableOwner = toShift(info); QString tableName = toShift(info); QString dbLink = toShift(info); if (dbLink == "NULL") dbLink = ""; else dbLink = "@" + QUOTE(dbLink); QString tableSchema = ext.intSchema(tableOwner, true); std::list ctx; ctx.insert(ctx.end(), owner); addDescription(lst, ctx, "SYNONYM", QString("%1%2%3"). arg(tableSchema).arg(QUOTE(tableName)).arg(dbLink)); } void toOracleExtract::describeTable(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { toQuery inf(CONNECTION, SQLTableType, name, owner); if (inf.eof()) throw qApp->translate("toOracleExtract", "Couldn't find table %1.%2").arg(owner).arg(name); QString partitioned(inf.readValue()); QString iot_type(inf.readValue()); std::list ctx; ctx.insert(ctx.end(), schema); ctx.insert(ctx.end(), "TABLE"); ctx.insert(ctx.end(), QUOTE(name)); if (iot_type == "IOT" && ext.getIndexes()) { if (partitioned == "YES") describePartitionedIOT(ext, lst, ctx, schema, owner, name); else describeIOT(ext, lst, ctx, schema, owner, name); return ; } else if (partitioned == "YES") { describePartitionedTable(ext, lst, ctx, schema, owner, name); return ; } toQList result = toQuery::readQueryNull(CONNECTION, segments(ext, SQLTableInfo), name, owner); describeTableText(ext, lst, ctx, result, schema, owner, name); describeComments(ext, lst, ctx, owner, name); } void toOracleExtract::describeTableFamily(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { describeTable(ext, lst, schema, owner, name); toQList indexes = toQuery::readQueryNull(CONNECTION, SQLIndexNames, name, owner); while (!indexes.empty()) { QString indOwner(toShift(indexes)); describeIndex(ext, lst, ext.intSchema(indOwner, true), indOwner, toShift(indexes)); } toQuery inf(CONNECTION, SQLTableType, name, owner); if (inf.eof()) throw qApp->translate("toOracleExtract", "Couldn't find table %1.%2").arg(owner).arg(name); inf.readValue(); QString iotType(inf.readValue()); toQList constraints = toQuery::readQueryNull(CONNECTION, SQLTableConstraints, name, owner); while (!constraints.empty()) { if (toShift(constraints).toUtf8() != "P" || iotType != "IOT") describeConstraint(ext, lst, schema, owner, toShift(constraints)); else toShift(constraints); toShift(constraints); } toQList triggers = toQuery::readQueryNull(CONNECTION, SQLTableTriggers, name, owner); while (!triggers.empty()) describeTrigger(ext, lst, schema, owner, toShift(triggers)); } void toOracleExtract::describeTableReferences(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { toQList constraints = toQuery::readQueryNull(CONNECTION, SQLTableReferences, name, owner); while (!constraints.empty()) describeConstraint(ext, lst, schema, owner, toShift(constraints)); } void toOracleExtract::describeTablespace(toExtract &ext, std::list &lst, const QString &, const QString &, const QString &name) const { toQList info = toQuery::readQueryNull(CONNECTION, SQLTablespaceInfo, QString::number(ext.getBlockSize()), name); if (info.size() != 10) throw qApp->translate("toOracleExtract", "Couldn't find tablespace %1").arg(name); QString initial = toShift(info); QString next = toShift(info); QString minExtents = toShift(info); QString maxExtents = toShift(info); QString pctIncrease = toShift(info); QString minExtlen = toShift(info); QString contents = toShift(info); QString logging = toShift(info); QString extentManagement = toShift(info); QString allocationType = toShift(info); std::list ctx; ctx.insert(ctx.end(), "NONE"); if (extentManagement == "LOCAL" && contents == "TEMPORARY") ctx.insert(ctx.end(), "TEMPORARY TABLESPACE"); else ctx.insert(ctx.end(), "TABLESPACE"); ctx.insert(ctx.end(), QUOTE(name)); addDescription(lst, ctx); toQList files = toQuery::readQueryNull(CONNECTION, SQLDatafileInfo, QString::number(ext.getBlockSize()), name); while (!files.empty()) { QString fileName = toShift(files); QString bytes = toShift(files); QString autoExtensible = toShift(files); QString maxBytes = toShift(files); QString incrementBy = toShift(files); std::list cctx = ctx; if (extentManagement == "LOCAL" && contents == "TEMPORARY") cctx.insert(cctx.end(), "TEMPFILE"); else cctx.insert(cctx.end(), "DATAFILE"); cctx.insert(cctx.end(), prepareDB(fileName)); addDescription(lst, cctx); addDescription(lst, cctx, QString("SIZE %3").arg(bytes)); if (CONNECTION.version() >= "0800" && ext.getStorage()) { QString ret = "AUTOEXTEND "; if (autoExtensible == "YES") ret += QString("ON NEXT %1 MAXSIZE %2\n"). arg(incrementBy). arg(maxBytes); else ret += "OFF\n"; addDescription(lst, cctx, ret); } } if (ext.getStorage()) { if (extentManagement == "LOCAL") { QString ret = "EXTENT MANAGEMENT LOCAL "; if (allocationType == "SYSTEM") ret += "AUTOALLOCATE"; else ret += QString("UNIFORM SIZE %1").arg(next); addDescription(lst, ctx, ret); } else { addDescription(lst, ctx, "STORAGE", QString("INITIAL %1").arg(initial)); if (!next.isEmpty()) addDescription(lst, ctx, "STORAGE", QString("NEXT %1").arg(next)); addDescription(lst, ctx, "STORAGE", QString("MINEXTENTS %1").arg(minExtents)); addDescription(lst, ctx, "STORAGE", QString("MAXEXTENTS %1").arg(maxExtents)); addDescription(lst, ctx, "STORAGE", QString("PCTINCREASE %1").arg(pctIncrease)); addDescription(lst, ctx, QString("MINIMUM EXTENT %1").arg(minExtlen)); addDescription(lst, ctx, "EXTENT MANAGEMENT DICTIONARY"); } if (CONNECTION.version() >= "0800" && (contents != "TEMPORARY" || extentManagement != "LOCAL")) addDescription(lst, ctx, logging); } } void toOracleExtract::describeTrigger(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { if (!ext.getCode()) return ; toQList result = toQuery::readQueryNull(CONNECTION, SQLTriggerInfo, name, owner); if (result.size() != 10) throw qApp->translate("toOracleExtract", "Couldn't find trigger %1.%2").arg(owner).arg(name); QString triggerType = toShift(result); QString event = toShift(result); QString tableOwner = toShift(result); QString table = toShift(result); QString baseType = toShift(result); QString refNames = toShift(result); QString description = toShift(result); QString when = toShift(result); QString body = toShift(result); QString status = toShift(result); QString trgType; if (triggerType.indexOf("BEFORE") >= 0) trgType = "BEFORE"; else if (triggerType.indexOf("AFTER") >= 0) trgType = "AFTER"; else if (triggerType.indexOf("INSTEAD OF") >= 0) trgType = "INSTEAD OF"; QString src = trgType; src += " "; src += event; description.replace(QRegExp("\nON"), QString("\n ON")); int pos = description.indexOf(src); QString columns; if (pos >= 0) { pos += src.length(); int endPos = description.indexOf(" ON ", pos); if (endPos >= 0) { columns = description.right(description.length() - pos); columns.truncate(endPos - pos); } } QString schema2 = ext.intSchema(tableOwner, true); QString object; if (baseType == "TABLE" || baseType == "VIEW") { object = schema2; if (!schema2.isEmpty()) object += "."; object += table; } else if (baseType == "SCHEMA") { object = schema; if (!schema.isEmpty()) object += "."; object += "SCHEMA"; } else { object = baseType; } std::list ctx; ctx.insert(ctx.end(), schema); ctx.insert(ctx.end(), "TRIGGER"); ctx.insert(ctx.end(), QUOTE(name)); addDescription(lst, ctx); QString tmp = triggerType; tmp += event; tmp += columns; addDescription(lst, ctx, tmp); tmp = "ON "; tmp += object; if (!refNames.isEmpty()) { tmp += " "; tmp += refNames; } addDescription(lst, ctx, object); if (!when.isEmpty()) addDescription(lst, ctx, when); addDescription(lst, ctx, "BODY", body); addDescription(lst, ctx, status); } void toOracleExtract::describeType(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { describeSource(ext, lst, schema, owner, name, "TYPE"); } void toOracleExtract::describeUser(toExtract &ext, std::list &lst, const QString &, const QString &, const QString &name) const { toQList info = toQuery::readQueryNull(CONNECTION, SQLUserInfo, name); if (info.size() != 4) throw qApp->translate("toOracleExtract", "Couldn't find user %1").arg(name); QString password = toShift(info); QString profile = toShift(info); QString defaultTablespace = toShift(info); QString temporaryTablespace = toShift(info); std::list ctx; ctx.insert(ctx.end(), "NONE"); ctx.insert(ctx.end(), "USER"); QString nam; if (ext.getSchema() != "1" && !ext.getSchema().isEmpty()) nam = ext.getSchema().toLower(); else nam = QUOTE(name); ctx.insert(ctx.end(), nam); addDescription(lst, ctx); addDescription(lst, ctx, QString("PROFILE %1").arg(QUOTE(profile))); addDescription(lst, ctx, QString("DEFAULT TABLESPACE %1").arg(QUOTE(defaultTablespace))); addDescription(lst, ctx, QString("TEMPORARY TABLESPACE %1").arg(QUOTE(temporaryTablespace))); if (ext.getStorage()) { toQList quota = toQuery::readQueryNull(CONNECTION, SQLUserQuotas, name); while (!quota.empty()) { QString siz = toShift(quota); QString tab = toShift(quota); addDescription(lst, ctx, "QUOTA", QString("%1 ON %2"). arg(siz). arg(QUOTE(tab))); } } describePrivs(ext, lst, ctx, name); } void toOracleExtract::describeView(toExtract &ext, std::list &lst, const QString &schema, const QString &owner, const QString &name) const { if (!ext.getCode()) return ; toQList source = toQuery::readQueryNull(CONNECTION, SQLViewSource, name, owner); if (source.empty()) throw qApp->translate("toOracleExtract", "Couldn't find view %1.%2").arg(QUOTE(owner)).arg(QUOTE(name)); std::list ctx; ctx.insert(ctx.end(), schema); ctx.insert(ctx.end(), "VIEW"); ctx.insert(ctx.end(), QUOTE(name)); addDescription(lst, ctx); QString text = toShift(source); addDescription(lst, ctx, "AS", text); describeComments(ext, lst, ctx, owner, name); toQuery query(CONNECTION, "SELECT * FROM " + QUOTE(owner) + "." + QUOTE(name) + " WHERE NULL = NULL"); toQDescList desc = query.describe(); int num = 1; for (toQDescList::iterator i = desc.begin();i != desc.end();i++) { addDescription(lst, ctx, "COLUMN", (*i).Name); addDescription(lst, ctx, "COLUMN", (*i).Name, (*i).Datatype); addDescription(lst, ctx, "COLUMN", (*i).Name, "ORDER", QString::number(num)); num++; } } // Implementation drop functions QString toOracleExtract::dropConstraint(toExtract &ext, const QString &schema, const QString &owner, const QString &, const QString &name) const { toQList tableName = toQuery::readQueryNull(CONNECTION, SQLConstraintTable, owner, name); if (tableName.empty()) throw qApp->translate("toOracleExtract", "Couldn't find constraint %1.%2"). arg(QUOTE(owner)).arg(QUOTE(name)); QString sql = QString("ALTER TABLE %1%2 DROP CONSTRAINT %3"). arg(schema). arg(QUOTE(toShift(tableName))). arg(QUOTE(name)); QString ret; if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; return ret; } QString toOracleExtract::dropDatabaseLink(toExtract &ext, const QString &, const QString &owner, const QString &, const QString &name) const { QString sql = QString("DROP%1 DATABASE LINK %2"). arg((owner == "PUBLIC") ? " PUBLIC" : ""). arg(QUOTE(name)); QString ret; if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; return ret; } QString toOracleExtract::dropMViewLog(toExtract &ext, const QString &schema, const QString &, const QString &type, const QString &name) const { QString sql = QString("DROP %1 ON %2%3").arg(type).arg(schema).arg(QUOTE(name)); QString ret; if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; return ret; } QString toOracleExtract::dropObject(toExtract &ext, const QString &, const QString &, const QString &type, const QString &name) const { QString sql = QString("DROP %1 %2").arg(type).arg(QUOTE(name)); QString ret; if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; return ret; } QString toOracleExtract::dropProfile(toExtract &ext, const QString &, const QString &, const QString &, const QString &name) const { QString sql = QString("DROP PROFILE %1 CASCADE").arg(QUOTE(name)); QString ret; if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; return ret; } QString toOracleExtract::dropSchemaObject(toExtract &ext, const QString &schema, const QString &, const QString &type, const QString &name) const { QString sql = QString("DROP %1 %2%3").arg(type).arg(schema).arg(QUOTE(name)); QString ret; if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; return ret; } QString toOracleExtract::dropSynonym(toExtract &ext, const QString &schema, const QString &owner, const QString &, const QString &name) const { QString sql = QString("DROP%1 SYNONYM %2%3"). arg((owner == "PUBLIC") ? " PUBLIC" : ""). arg((owner == "PUBLIC") ? schema : QString("")). arg(QUOTE(name)); QString ret; if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; return ret; } QString toOracleExtract::dropTable(toExtract &ext, const QString &schema, const QString &, const QString &, const QString &name) const { QString sql = QString("DROP TABLE %1%2 CASCADE CONSTRAINTS"). arg(schema). arg(QUOTE(name)); QString ret; if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; return ret; } QString toOracleExtract::dropTablespace(toExtract &ext, const QString &, const QString &, const QString &, const QString &name) const { QString sql = QString("DROP TABLESPACE %1 INCLUDING CONTENTS CASCADE CONSTRAINTS"). arg(QUOTE(name)); QString ret; if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; return ret; } QString toOracleExtract::dropUser(toExtract &ext, const QString &, const QString &, const QString &, const QString &name) const { QString sql = QString("DROP USER %1 CASCADE"). arg(QUOTE(name)); QString ret; if (PROMPT) { ret = "PROMPT "; ret += sql; ret += "\n\n"; } ret += sql; ret += ";\n\n"; return ret; } // Internal utility migration functions static bool SameContext(const QString &str, const QString &str2) { if (str.startsWith(str2)) { if (str.length() == str2.length()) return true; if (str.length() > str2.length() && str.at(str2.length()) == QChar('\001')) return true; } return false; } static std::list::iterator FindItem(std::list &desc, std::list::iterator i, const QString &context, int level = -1, const QString & search = QString::null) { if (search.isNull() || level < 0) { while (i != desc.end() && *i < context) i++; if (i == desc.end() || !SameContext(*i, context)) return desc.end(); return i; } else { while (i != desc.end()) { if (!SameContext(*i, context) && !context.isEmpty()) return desc.end(); if (toExtract::partDescribe(*i, level) == search) return i; i++; } return desc.end(); } } QString toOracleExtract::migrateAttributes(std::list &desc, std::list::iterator i, int level, const QString &indent) const { QString after; QString storage; QString parallel; QString ret; QString partition; QString context = toExtract::contextDescribe(*i, level); if (context.isNull()) return QString::null; while (i != desc.end()) { if (!SameContext(*i, context)) break; QString type = toExtract::partDescribe(*i, level); QString par = toExtract::partDescribe(*i, level + 1); if (type == "PARAMETER") { if (par.startsWith("TABLESPACE")) after += indent + par + "\n"; else ret += indent + par + "\n"; } else if (type == "STORAGE") storage += indent + " " + par + "\n"; else if (type == "PARALLEL") parallel += indent + " " + par + "\n"; else if (type == "LOCAL PARTITION") { if (partition.isEmpty()) { partition += indent + "LOCAL\n"; partition += migratePartitions(desc, i, level + 2, indent + " "); } } else if (type == "GLOBAL PARTITION COLUMNS" || type.startsWith("PARTITION BY ")) {} i++; } if (!parallel.isEmpty()) ret.prepend(indent + "PARALLEL\n" + indent + "(\n" + parallel + indent + ")\n"); if (!storage.isEmpty()) ret += indent + "STORAGE\n" + indent + "(\n" + storage + indent + ")\n"; ret += after; return ret; } QString toOracleExtract::migrateIndexColumns(std::list &destin, std::list::iterator i, const QString &context) const { std::map cols; QString ret; do { if (!SameContext(*i, context)) break; QString col = toExtract::partDescribe(*i, 4); QString ord = toExtract::partDescribe(*i, 5); if (!col.isNull() && !col.isNull()) cols[ord.toInt()] = col; i++; } while (i != destin.end()); ret += "(\n"; for (int j = 1;!cols[j].isNull();j++) { if (j == 1) ret += " "; else ret += " , "; ret += cols[j] + "\n"; } ret += ")\n"; return ret; } QString toOracleExtract::migratePartitions(std::list &desc, std::list::iterator &i, int level, const QString &indent) const { QString ret; QString context = toExtract::contextDescribe(*i, level); if (context.isNull()) return QString::null; while (i != desc.end()) { if (!SameContext(*i, context)) break; QString partition = toExtract::partDescribe(*i, level); QString cc = toExtract::contextDescribe(*i, level + 1); ret += indent + "PARTITION " + partition; std::list::iterator t = FindItem(desc, i, cc, level + 1, "RANGE"); if (t != desc.end()) ret += toExtract::partDescribe(*t, level + 2); ret += "\n"; ret += migrateAttributes(desc, i, level + 1, indent + " "); t = FindItem(desc, i, cc, level + 1, "HASH"); if (t != desc.end()) { ret += indent + " (\n"; QString ind = indent + " "; while (t != desc.end()) { if (!SameContext(*t, cc)) { i = t; break; } if (toExtract::partDescribe(*t, level + 1) != "HASH") break; ret += ind + toExtract::partDescribe(*t, level + 2); ind = indent + " , "; t++; } ret += indent + " )\n"; } while (i != desc.end()) { if (!SameContext(*i, cc)) break; i++; } } return ret; } QString toOracleExtract::migrateSource(toExtract &ext, std::list &source, std::list &destin, const QString &sourcetype) const { std::list drop; std::list create; QString ret; toExtract::srcDst2DropCreate(source, destin, drop, create); QString lastOwner; QString lastName; { for (std::list::iterator i = drop.begin();i != drop.end();i++) { std::list ctx = toExtract::splitDescribe(*i); QString owner = toShift(ctx); QString type = toShift(ctx); if (type != sourcetype) continue; QString name = toShift(ctx); if (lastOwner != owner || name != lastName) { QString sql = "DROP " + sourcetype + " " + owner + "." + name; if (PROMPT) ret += "PROMPT " + sql + "\n\n"; ret += sql + ";\n\n"; lastOwner = owner; lastName = name; } } } lastOwner = lastName = QString::null; for (std::list::iterator i = create.begin();i != create.end();i++) { std::list ctx = toExtract::splitDescribe(*i); QString owner = toShift(ctx); QString type = toShift(ctx); if (type != sourcetype) continue; QString name = toShift(ctx); QString source = toShift(ctx); if (lastOwner != owner || (name != lastName && !source.isEmpty())) { QString sql = "CREATE " + sourcetype + " " + owner + "." + name; if (PROMPT) ret += "PROMPT " + sql + "\n\n"; ret += source + "\n\n"; lastOwner = owner; lastName = name; } } return ret; } QString toOracleExtract::migratePrivs(toExtract &ext, std::list &source, std::list &destin, const QString &onlyGrantee) const { std::list drop; std::list create; QString ret; toExtract::srcDst2DropCreate(source, destin, drop, create); { for (std::list::iterator i = drop.begin();i != drop.end();i++) { std::list ctx = toExtract::splitDescribe(*i); if (toShift(ctx) != "NONE") continue; QString grantee = toShift(ctx); if (!onlyGrantee.isEmpty() && grantee != onlyGrantee) continue; QString priv = toShift(ctx); QString admin = toShift(ctx); if (priv.isEmpty()) continue; if (admin == "ON") { QString object = toShift(ctx); admin = toShift(ctx); QString sql = "REVOKE " + priv + " ON " + object + " FROM " + grantee; if (PROMPT) ret += sql + "\n\n"; ret += sql + ";\n\n"; } else { QString sql = "REVOKE " + priv + " FROM " + grantee; if (PROMPT) ret += sql + "\n\n"; ret += sql + ";\n\n"; } } } for (std::list::iterator i = create.begin();i != create.end();i++) { std::list ctx = toExtract::splitDescribe(*i); if (toShift(ctx) != "NONE") continue; QString grantee = toShift(ctx); if (!onlyGrantee.isEmpty() && grantee != onlyGrantee) continue; QString priv = toShift(ctx); QString admin = toShift(ctx); if (priv.isEmpty()) continue; if (admin == "ON") { QString object = toShift(ctx); admin = toShift(ctx); QString sql = "GRANT " + priv + " ON " + object + " TO " + grantee; if (PROMPT) ret += sql + "\n\n"; ret += sql + ";\n\n"; } else { QString sql = "GRANT " + priv + " TO " + grantee; if (PROMPT) ret += sql + "\n\n"; ret += sql + ";\n\n"; } } return ret; } // Implementation of migration functions QString toOracleExtract::migrateConstraint(toExtract &ext, std::list &source, std::list &destin) const { QString lastSchema; QString lastTable; QString lastName; QString lastType; QString sql; std::list drop; std::list create; toExtract::srcDst2DropCreate(source, destin, drop, create); { for (std::list::iterator i = drop.begin();i != drop.end();i++) { std::list ctx = toExtract::splitDescribe(*i); QString schema = toShift(ctx); QString table = toShift(ctx); if (toShift(ctx) != "TABLE") continue; QString name = toShift(ctx); if (toShift(ctx) != "CONSTRAINT") continue; QString type = toShift(ctx); QString extra = toShift(ctx); if ((schema != lastSchema || table != lastTable || name != lastName || type != lastType) && extra.isEmpty()) { if (PROMPT) sql += QString("PROMPT ALTER TABLE %1%2 DROP CONSTRAINT %3\n\n"). arg(schema).arg(table).arg(name); sql += QString("ALTER TABLE %1%2 DROP CONSTRAINT %3;\n\n"). arg(schema).arg(table).arg(name); lastSchema = schema; lastTable = table; lastName = name; lastType = type; } } } lastSchema = lastTable = lastName = lastType = QString::null; for (std::list::iterator i = create.begin();i != create.end();i++) { std::list ctx = toExtract::splitDescribe(*i); QString schema = toShift(ctx); QString table = toShift(ctx); if (toShift(ctx) != "TABLE") continue; QString name = toShift(ctx); if (toShift(ctx) != "CONSTRAINT") continue; QString type = toShift(ctx); if (toShift(ctx) != "DEFINITION") continue; QString extra = toShift(ctx); if (schema == lastSchema && table == lastTable && name == lastName && type == lastType) { sql += " " + extra; } else if (extra.isEmpty()) { if (!sql.isEmpty()) sql += ";\n\n"; if (PROMPT) sql += QString("PROMPT ALTER TABLE %1%2 ADD CONSTRAINT %3\n\n"). arg(schema).arg(table).arg(name); sql += QString("ALTER TABLE %1%2 ADD CONSTRAINT %3 %4"). arg(schema).arg(table).arg(name).arg(type); lastSchema = schema; lastTable = table; lastName = name; lastType = type; } else { if (PROMPT) sql += QString("PROMPT ALTER TABLE %1%2 MODIFY CONSTRAINT %3\n\n"). arg(schema).arg(table).arg(name); sql += QString("ALTER TABLE %1%2 MODIFY CONSTRAINT %3 %4\n\n"). arg(schema).arg(table).arg(name).arg(extra); } } if (!sql.isEmpty()) sql += ";\n\n"; return sql; } QString toOracleExtract::migrateDBLink(toExtract &ext, std::list &source, std::list &destin) const { std::list drop; std::list create; toExtract::srcDst2DropCreate(source, destin, drop, create); QString ret; { for (std::list::iterator i = drop.begin();i != drop.end();i++) { std::list ctx = toExtract::splitDescribe(*i); QString owner = toShift(ctx); if (toShift(ctx) != "DATABASE LINK") continue; QString sql; if (owner == "PUBLIC") sql = "DROP PUBLIC DATABASE LINK "; else sql = "DROP DATABASE LINK"; sql += toShift(ctx); if (PROMPT) ret += "PROMPT " + sql + "\n\n"; ret += sql; ret += ";\n\n"; } } for (std::list::iterator i = create.begin();i != create.end();i++) { std::list ctx = toExtract::splitDescribe(*i); QString owner = toShift(ctx); if (toShift(ctx) != "DATABASE LINK") continue; QString sql; if (owner == "PUBLIC") sql = "CREATE PUBLIC DATABASE LINK "; else sql = "CREATE DATABASE LINK"; sql += toShift(ctx); if (PROMPT) ret += "PROMPT " + sql + "\n\n"; ret += sql; ret += toShift(ctx); ret += ";\n\n"; } return ret; } QString toOracleExtract::migrateFunction(toExtract &ext, std::list &source, std::list &destin) const { return migrateSource(ext, source, destin, "FUNCTION"); } QString toOracleExtract::migrateIndex(toExtract &ext, std::list &source, std::list &destin) const { std::list drop; std::list create; QString ret; toExtract::srcDst2DropCreate(source, destin, drop, create); QString lastOwner; QString lastName; { for (std::list::iterator i = drop.begin();i != drop.end();i++) { std::list ctx = toExtract::splitDescribe(*i); QString owner = toShift(ctx); QString type = toShift(ctx); if (type != "INDEX" && type != "UNIQUE INDEX" && type != "BITMAP INDEX") continue; QString name = toShift(ctx); if (lastOwner != owner || name != lastName) { QString sql = "DROP INDEX " + owner + "." + name; if (PROMPT) ret += "PROMPT " + sql + "\n\n"; ret += sql + ";\n\n"; lastOwner = owner; lastName = name; } } } lastOwner = lastName = QString::null; std::list::iterator j = destin.begin(); for (std::list::iterator i = create.begin();i != create.end();i++) { std::list ctx = toExtract::splitDescribe(*i); QString owner = toShift(ctx); QString type = toShift(ctx); if (type != "INDEX" && type != "UNIQUE INDEX" && type != "BITMAP INDEX") continue; QString name = toShift(ctx); if (lastOwner != owner || name != lastName) { QString context = toExtract::contextDescribe(*i, 3); j = FindItem(destin, j, context); if (j != destin.end()) { std::list::iterator k = FindItem(destin, j, context, 3, "ON"); if (k == destin.end()) throw qApp->translate("toOracleExtract", "Missing ON description item on index"); QString on = toExtract::partDescribe(*k, 4); QString sql = "CREATE " + type + " " + owner + "." + name + " ON " + on; if (PROMPT) ret += "PROMPT " + sql + "\n\n"; ret += sql + "\n"; k = FindItem(destin, j, context, 3, "COLUMN"); if (k == destin.end()) throw qApp->translate("toOracleExtract", "Couldn't find any COLUMN on index"); ret += migrateIndexColumns(destin, k, toExtract::contextDescribe(*k, 4)); k = FindItem(destin, j, context, 3, "DOMAIN"); if (k != destin.end()) { while (k != destin.end() && toExtract::partDescribe(*k, 3) == "DOMAIN") { ret += "\n" + toExtract::partDescribe(*k, 4); k++; } ret += ";\n"; break; } else ret += "\n"; k = FindItem(destin, j, context, 3, "COMPRESS"); if (k != destin.end()) ret += "COMPRESS " + toExtract::partDescribe(*k, 4) + "\n"; ret += migrateAttributes(destin, j, 3, ""); k = FindItem(destin, j, context, 3, "REVERSE"); if (k != destin.end()) ret += "REVERSE\n"; ret + ";\n\n"; } lastOwner = owner; lastName = name; } } return ret; } QString toOracleExtract::migratePackage(toExtract &ext, std::list &source, std::list &destin) const { return migrateSource(ext, source, destin, "PACKAGE"); } QString toOracleExtract::migratePackageBody(toExtract &ext, std::list &source, std::list &destin) const { return migrateSource(ext, source, destin, "PACKAGE BODY"); } QString toOracleExtract::migrateProcedure(toExtract &ext, std::list &source, std::list &destin) const { return migrateSource(ext, source, destin, "PROCEDURE"); } QString toOracleExtract::migrateRole(toExtract &ext, std::list &source, std::list &destin) const { std::list drop; std::list create; toExtract::srcDst2DropCreate(source, destin, drop, create); std::list privs; QString ret; QString lrole; { bool dropped = false; for (std::list::iterator i = drop.begin();i != drop.end();i++) { std::list ctx = toExtract::splitDescribe(*i); QString owner = toShift(ctx); if (toShift(ctx) != "ROLE") continue; QString role = toShift(ctx); if (role != lrole) dropped = false; if ( ctx.empty() ) { QString sql = "DROP ROLE " + QUOTE(role) + ";"; if (PROMPT) ret += "PROMPT " + sql + "\n\n"; ret += sql + ";\n\n"; dropped = true; } else if (!dropped) { if (toShift(ctx) != "GRANT") continue; QString type = toShift(ctx); QString on = toShift(ctx); QString what = toShift(ctx); QString sql = QString("REVOKE %1").arg(QUOTE(type)); if (!on.isEmpty()) sql += QUOTE(on); if (!what.isEmpty()) { if (what == "ON") sql += "FROM"; else sql += QUOTE(what); } if (PROMPT) ret += "PROMPT " + sql + "\n\n"; ret += sql + ";\n\n"; } lrole = role; } } lrole = QString::null; for (std::list::iterator i = create.begin();i != create.end();i++) { std::list ctx = toExtract::splitDescribe(*i); QString owner = toShift(ctx); if (toShift(ctx) != "ROLE") continue; QString role = toShift(ctx); if ( ctx.empty() ) continue; else { QString extra = toShift(ctx); if (extra == "INFO") { QString sql = "CREATE ROLE " + QUOTE(role) + ";"; if (PROMPT) ret += "PROMPT " + sql + "\n\n"; ret += sql + QString("%1;\n\n").arg(toShift(ctx)); } else if (extra == "GRANT") { QString type = toShift(ctx); QString on = toShift(ctx); QString what = toShift(ctx); QString sql = QString("GRANT %1").arg(QUOTE(type)); if (!on.isEmpty()) sql += QUOTE(on); if (!what.isEmpty()) sql += QUOTE(what); if (PROMPT) ret += "PROMPT " + sql + "\n\n"; ret += sql + ";\n\n"; } } lrole = role; } return ret; } QString toOracleExtract::migrateSequence(toExtract &ext, std::list &source, std::list &destin) const { QString ret; std::list drop; std::list create; toExtract::srcDst2DropCreate(source, destin, drop, create); { for (std::list::iterator i = drop.begin();i != drop.end();i++) { std::list ctx = toExtract::splitDescribe(*i); QString owner = toShift(ctx); if (toShift(ctx) != "SEQUENCE") continue; QString sequence = toShift(ctx); if ( ctx.empty() ) { QString sql = QString("DROP SEQUENCE %1.%2").arg(QUOTE(owner)).arg(QUOTE(sequence)); if (PROMPT) ret += "PROMPT " + sql + "\n\n"; ret += sql + ";\n\n"; } } } bool created = false; QString lastOwner; QString lastSequence; QString sql; QString prompt; for (std::list::iterator i = create.begin();i != create.end();i++) { std::list ctx = toExtract::splitDescribe(*i); QString owner = toShift(ctx); if (toShift(ctx) != "SEQUENCE") continue; QString sequence = toShift(ctx); if (lastSequence != sequence || lastOwner != owner) { if (created) { prompt = QString("CREATE SEQUENCE %1.%2").arg(lastOwner).arg(lastSequence); sql.prepend(prompt); } else { prompt = QString("ALTER SEQUENCE %1.%2").arg(lastOwner).arg(lastSequence); sql.prepend(prompt); } if (PROMPT) ret += prompt + "\n\n"; ret += sql + ";\n\n"; prompt = sql = created = false; } if ( ctx.empty() ) created = true; else sql += " " + toShift(ctx); lastOwner = owner; lastSequence = sequence; } if (created) { prompt = QString("CREATE SEQUENCE %1.%2").arg(lastOwner).arg(lastSequence); sql.prepend(prompt); } else { prompt = QString("ALTER SEQUENCE %1.%2").arg(lastOwner).arg(lastSequence); sql.prepend(prompt); } if (PROMPT) ret += prompt + "\n\n"; ret += sql + ";\n\n"; return ret; } // Implementation public interface toOracleExtract::toOracleExtract() { // Supports Oracle registerExtract(ORACLE_NAME, QString::null, QString::null); // Register creates registerExtract(ORACLE_NAME, "CREATE", "CONSTRAINT"); registerExtract(ORACLE_NAME, "CREATE", "DATABASE LINK"); registerExtract(ORACLE_NAME, "CREATE", "EXCHANGE INDEX"); registerExtract(ORACLE_NAME, "CREATE", "EXCHANGE TABLE"); registerExtract(ORACLE_NAME, "CREATE", "FUNCTION"); registerExtract(ORACLE_NAME, "CREATE", "INDEX"); registerExtract(ORACLE_NAME, "CREATE", "MATERIALIZED VIEW"); registerExtract(ORACLE_NAME, "CREATE", "MATERIALIZED VIEW LOG"); registerExtract(ORACLE_NAME, "CREATE", "PACKAGE"); registerExtract(ORACLE_NAME, "CREATE", "PACKAGE BODY"); registerExtract(ORACLE_NAME, "CREATE", "PROCEDURE"); registerExtract(ORACLE_NAME, "CREATE", "PROFILE"); registerExtract(ORACLE_NAME, "CREATE", "ROLE"); registerExtract(ORACLE_NAME, "CREATE", "ROLE GRANTS"); registerExtract(ORACLE_NAME, "CREATE", "ROLLBACK SEGMENT"); registerExtract(ORACLE_NAME, "CREATE", "SEQUENCE"); registerExtract(ORACLE_NAME, "CREATE", "SNAPSHOT"); registerExtract(ORACLE_NAME, "CREATE", "SNAPSHOT LOG"); registerExtract(ORACLE_NAME, "CREATE", "SYNONYM"); registerExtract(ORACLE_NAME, "CREATE", "TABLE"); registerExtract(ORACLE_NAME, "CREATE", "TABLE FAMILY"); registerExtract(ORACLE_NAME, "CREATE", "TABLE CONTENTS"); registerExtract(ORACLE_NAME, "CREATE", "TABLE REFERENCES"); registerExtract(ORACLE_NAME, "CREATE", "TABLESPACE"); registerExtract(ORACLE_NAME, "CREATE", "TRIGGER"); registerExtract(ORACLE_NAME, "CREATE", "TYPE"); registerExtract(ORACLE_NAME, "CREATE", "USER"); registerExtract(ORACLE_NAME, "CREATE", "USER GRANTS"); registerExtract(ORACLE_NAME, "CREATE", "VIEW"); // Register describes registerExtract(ORACLE_NAME, "DESCRIBE", "CONSTRAINT"); registerExtract(ORACLE_NAME, "DESCRIBE", "DATABASE LINK"); registerExtract(ORACLE_NAME, "DESCRIBE", "EXCHANGE INDEX"); registerExtract(ORACLE_NAME, "DESCRIBE", "EXCHANGE TABLE"); registerExtract(ORACLE_NAME, "DESCRIBE", "FUNCTION"); registerExtract(ORACLE_NAME, "DESCRIBE", "INDEX"); registerExtract(ORACLE_NAME, "DESCRIBE", "MATERIALIZED VIEW"); registerExtract(ORACLE_NAME, "DESCRIBE", "MATERIALIZED VIEW LOG"); registerExtract(ORACLE_NAME, "DESCRIBE", "PACKAGE"); registerExtract(ORACLE_NAME, "DESCRIBE", "PACKAGE BODY"); registerExtract(ORACLE_NAME, "DESCRIBE", "PROCEDURE"); registerExtract(ORACLE_NAME, "DESCRIBE", "PROFILE"); registerExtract(ORACLE_NAME, "DESCRIBE", "ROLE"); registerExtract(ORACLE_NAME, "DESCRIBE", "ROLE GRANTS"); registerExtract(ORACLE_NAME, "DESCRIBE", "ROLLBACK SEGMENT"); registerExtract(ORACLE_NAME, "DESCRIBE", "SEQUENCE"); registerExtract(ORACLE_NAME, "DESCRIBE", "SNAPSHOT"); registerExtract(ORACLE_NAME, "DESCRIBE", "SNAPSHOT LOG"); registerExtract(ORACLE_NAME, "DESCRIBE", "SYNONYM"); registerExtract(ORACLE_NAME, "DESCRIBE", "TABLE"); registerExtract(ORACLE_NAME, "DESCRIBE", "TABLE FAMILY"); registerExtract(ORACLE_NAME, "DESCRIBE", "TABLE CONTENTS"); registerExtract(ORACLE_NAME, "DESCRIBE", "TABLE REFERENCES"); registerExtract(ORACLE_NAME, "DESCRIBE", "TABLESPACE"); registerExtract(ORACLE_NAME, "DESCRIBE", "TRIGGER"); registerExtract(ORACLE_NAME, "DESCRIBE", "TYPE"); registerExtract(ORACLE_NAME, "DESCRIBE", "USER"); registerExtract(ORACLE_NAME, "DESCRIBE", "USER GRANTS"); registerExtract(ORACLE_NAME, "DESCRIBE", "VIEW"); // Register drops registerExtract(ORACLE_NAME, "DROP", "CONSTRAINT"); registerExtract(ORACLE_NAME, "DROP", "DATABASE LINK"); registerExtract(ORACLE_NAME, "DROP", "DIMENSION"); registerExtract(ORACLE_NAME, "DROP", "DIRECTORY"); registerExtract(ORACLE_NAME, "DROP", "FUNCTION"); registerExtract(ORACLE_NAME, "DROP", "INDEX"); registerExtract(ORACLE_NAME, "DROP", "MATERIALIZED VIEW"); registerExtract(ORACLE_NAME, "DROP", "MATERIALIZED VIEW LOG"); registerExtract(ORACLE_NAME, "DROP", "PACKAGE"); registerExtract(ORACLE_NAME, "DROP", "PROCEDURE"); registerExtract(ORACLE_NAME, "DROP", "PROFILE"); registerExtract(ORACLE_NAME, "DROP", "ROLE"); registerExtract(ORACLE_NAME, "DROP", "ROLLBACK SEGMENT"); registerExtract(ORACLE_NAME, "DROP", "SEQUENCE"); registerExtract(ORACLE_NAME, "DROP", "SNAPSHOT"); registerExtract(ORACLE_NAME, "DROP", "SNAPSHOT LOG"); registerExtract(ORACLE_NAME, "DROP", "SYNONYM"); registerExtract(ORACLE_NAME, "DROP", "TABLE"); registerExtract(ORACLE_NAME, "DROP", "TABLESPACE"); registerExtract(ORACLE_NAME, "DROP", "TRIGGER"); registerExtract(ORACLE_NAME, "DROP", "TYPE"); registerExtract(ORACLE_NAME, "DROP", "USER"); registerExtract(ORACLE_NAME, "DROP", "VIEW"); // Register migrates registerExtract(ORACLE_NAME, "MIGRATE", "TABLE"); toExtract::datatype * d; // d = new toExtract::datatype("VARCHAR", 2000); // oracle_datatypes.insert(oracle_datatypes.end(), *d); d = new toExtract::datatype("VARCHAR2", 4000); oracle_datatypes.insert(oracle_datatypes.end(), *d); d = new toExtract::datatype("NUMBER", 32, 32); oracle_datatypes.insert(oracle_datatypes.end(), *d); d = new toExtract::datatype("DATE"); oracle_datatypes.insert(oracle_datatypes.end(), *d); d = new toExtract::datatype("INTEGER"); oracle_datatypes.insert(oracle_datatypes.end(), *d); d = new toExtract::datatype("LONG"); oracle_datatypes.insert(oracle_datatypes.end(), *d); d = new toExtract::datatype("CLOB"); oracle_datatypes.insert(oracle_datatypes.end(), *d); } std::list toOracleExtract::datatypes() const { return oracle_datatypes; } toOracleExtract::~toOracleExtract() { } static toSQL SQLSetSizing("toOracleExtract:SetSizing", "SELECT value FROM v$parameter WHERE name = 'db_block_size'", "Get information about block sizes from alloced space, same columns"); static toSQL SQLSetSizingFallback("toOracleExtract:SetSizingFallback", "SELECT bytes/blocks/1024 AS block_size\n" " FROM user_free_space\n" " WHERE bytes IS NOT NULL\n" " AND blocks IS NOT NULL\n" " AND ROWNUM < 2", "Get information about block sizes, same columns"); static toSQL SQLSetSizingFallback2("toOracleExtract:SetSizingFallback2", "SELECT bytes/blocks/1024 AS block_size\n" " FROM user_segments\n" " WHERE bytes IS NOT NULL\n" " AND blocks IS NOT NULL\n" " AND ROWNUM < 2", "Get information about block sizes, same columns"); void toOracleExtract::initialize(toExtract &ext) const { QString DbaSegments; try { toQuery(CONNECTION, "select * from sys.dba_segments where null=null"); DbaSegments = "sys.dba_segments"; } catch (...) { DbaSegments = QString("(select '%1' owner,user_segments.* from sys.user_segments)"). arg(CONNECTION.user().toUpper()); } ext.setState("Segments", DbaSegments); try { toQList ret = toQuery::readQueryNull(CONNECTION, SQLSetSizing); ext.setBlockSize(toShift(ret).toInt()); } catch (...) { toQList ret = toQuery::readQueryNull(CONNECTION, SQLSetSizingFallback); if (ret.empty()) ret = toQuery::readQueryNull(CONNECTION, SQLSetSizingFallback2); ext.setBlockSize(toShift(ret).toInt()); } } void toOracleExtract::create(toExtract &ext, QTextStream &stream, const QString &type, const QString &schema, const QString &owner, const QString &name) const { clearFlags(ext); if (type == "CONSTRAINT") stream << createConstraint(ext, schema, owner, name); else if (type == "DATABASE LINK") stream << createDBLink(ext, schema, owner, name); else if (type == "EXCHANGE INDEX") stream << createExchangeIndex(ext, schema, owner, name); else if (type == "EXCHANGE TABLE") stream << createExchangeTable(ext, schema, owner, name); else if (type == "FUNCTION") stream << createFunction(ext, schema, owner, name); else if (type == "INDEX") stream << createIndex(ext, schema, owner, name); else if (type == "MATERIALIZED VIEW") stream << createMaterializedView(ext, schema, owner, name); else if (type == "MATERIALIZED VIEW LOG") stream << createMaterializedViewLog(ext, schema, owner, name); else if (type == "PACKAGE") stream << createPackage(ext, schema, owner, name); else if (type == "PACKAGE BODY") stream << createPackageBody(ext, schema, owner, name); else if (type == "PROCEDURE") stream << createProcedure(ext, schema, owner, name); else if (type == "PROFILE") stream << createProfile(ext, schema, owner, name); else if (type == "ROLE") stream << createRole(ext, schema, owner, name); else if (type == "ROLE GRANTS") stream << grantedPrivs(ext, QUOTE(name), name, 6); else if (type == "ROLLBACK SEGMENT") stream << createRollbackSegment(ext, schema, owner, name); else if (type == "SEQUENCE") stream << createSequence(ext, schema, owner, name); else if (type == "SNAPSHOT") stream << createSnapshot(ext, schema, owner, name); else if (type == "SNAPSHOT LOG") stream << createSnapshotLog(ext, schema, owner, name); else if (type == "SYNONYM") stream << createSynonym(ext, schema, owner, name); else if (type == "TABLE") stream << createTable(ext, schema, owner, name); else if (type == "TABLE FAMILY") stream << createTableFamily(ext, schema, owner, name); else if (type == "TABLE CONTENTS") createTableContents(ext, stream, schema, owner, name); else if (type == "TABLE REFERENCES") stream << createTableReferences(ext, schema, owner, name); else if (type == "TABLESPACE") stream << createTablespace(ext, schema, owner, name); else if (type == "TRIGGER") stream << createTrigger(ext, schema, owner, name); else if (type == "TYPE") stream << createType(ext, schema, owner, name); else if (type == "USER") stream << createUser(ext, schema, owner, name); else if (type == "USER GRANTS") { QString nam; if (ext.getSchema() != "1" && !ext.getSchema().isEmpty()) nam = ext.getSchema().toLower(); else nam = QUOTE(name); stream << grantedPrivs(ext, nam, name, 4); } else if (type == "VIEW") stream << createView(ext, schema, owner, name); else { throw qApp->translate("toOracleExtract", "Invalid type %1 to create").arg(type); } } void toOracleExtract::describe(toExtract &ext, std::list &lst, const QString &type, const QString &schema, const QString &owner, const QString &name) const { clearFlags(ext); if (type == "CONSTRAINT") describeConstraint(ext, lst, schema, owner, name); else if (type == "DATABASE LINK") describeDBLink(ext, lst, schema, owner, name); else if (type == "EXCHANGE INDEX") describeExchangeIndex(ext, lst, schema, owner, name); else if (type == "EXCHANGE TABLE") describeExchangeTable(ext, lst, schema, owner, name); else if (type == "FUNCTION") describeFunction(ext, lst, schema, owner, name); else if (type == "INDEX") describeIndex(ext, lst, schema, owner, name); else if (type == "MATERIALIZED VIEW") describeMaterializedView(ext, lst, schema, owner, name); else if (type == "MATERIALIZED VIEW LOG") describeMaterializedViewLog(ext, lst, schema, owner, name); else if (type == "PACKAGE") describePackage(ext, lst, schema, owner, name); else if (type == "PACKAGE BODY") describePackageBody(ext, lst, schema, owner, name); else if (type == "PROCEDURE") describeProcedure(ext, lst, schema, owner, name); else if (type == "PROFILE") describeProfile(ext, lst, schema, owner, name); else if (type == "ROLE") describeRole(ext, lst, schema, owner, name); else if (type == "ROLE GRANTS") { // A nop, everything is done in describe role } else if (type == "ROLLBACK SEGMENT") describeRollbackSegment(ext, lst, schema, owner, name); else if (type == "SEQUENCE") describeSequence(ext, lst, schema, owner, name); else if (type == "SNAPSHOT") describeSnapshot(ext, lst, schema, owner, name); else if (type == "SNAPSHOT LOG") describeSnapshotLog(ext, lst, schema, owner, name); else if (type == "SYNONYM") describeSynonym(ext, lst, schema, owner, name); else if (type == "TABLE") describeTable(ext, lst, schema, owner, name); else if (type == "TABLE FAMILY") describeTableFamily(ext, lst, schema, owner, name); else if (type == "TABLE REFERENCES") describeTableReferences(ext, lst, schema, owner, name); else if (type == "TABLE CONTENTS") { // A nop, nothing is described of contents } else if (type == "TABLESPACE") describeTablespace(ext, lst, schema, owner, name); else if (type == "TRIGGER") describeTrigger(ext, lst, schema, owner, name); else if (type == "TYPE") describeType(ext, lst, schema, owner, name); else if (type == "USER") describeUser(ext, lst, schema, owner, name); else if (type == "USER GRANTS") { // A nop, everything is done in describe user } else if (type == "VIEW") describeView(ext, lst, schema, owner, name); else { throw qApp->translate("toOracleExtract", "Invalid type %1 to describe").arg(type); } } void toOracleExtract::drop(toExtract &ext, QTextStream &stream, const QString &type, const QString &schema, const QString &owner, const QString &name) const { clearFlags(ext); if (type == "CONSTRAINT") stream << dropConstraint(ext, schema, owner, type, name); else if (type == "DATABASE LINK") stream << dropDatabaseLink(ext, schema, owner, type, name); else if (type == "DIMENSION") stream << dropSchemaObject(ext, schema, owner, type, name); else if (type == "DIRECTORY") stream << dropObject(ext, schema, owner, type, name); else if (type == "FUNCTION") stream << dropSchemaObject(ext, schema, owner, type, name); else if (type == "INDEX") stream << dropSchemaObject(ext, schema, owner, type, name); else if (type == "MATERIALIZED VIEW") stream << dropSchemaObject(ext, schema, owner, type, name); else if (type == "MATERIALIZED VIEW LOG") stream << dropMViewLog(ext, schema, owner, type, name); else if (type == "PACKAGE") stream << dropSchemaObject(ext, schema, owner, type, name); else if (type == "PROCEDURE") stream << dropSchemaObject(ext, schema, owner, type, name); else if (type == "PROFILE") stream << dropProfile(ext, schema, owner, type, name); else if (type == "ROLE") stream << dropObject(ext, schema, owner, type, name); else if (type == "ROLLBACK SEGMENT") stream << dropObject(ext, schema, owner, type, name); else if (type == "SEQUENCE") stream << dropSchemaObject(ext, schema, owner, type, name); else if (type == "SNAPSHOT") stream << dropSchemaObject(ext, schema, owner, type, name); else if (type == "SNAPSHOT LOG") stream << dropMViewLog(ext, schema, owner, type, name); else if (type == "SYNONYM") stream << dropSynonym(ext, schema, owner, type, name); else if (type == "TABLE") stream << dropTable(ext, schema, owner, type, name); else if (type == "TABLESPACE") stream << dropTablespace(ext, schema, owner, type, name); else if (type == "TRIGGER") stream << dropSchemaObject(ext, schema, owner, type, name); else if (type == "TYPE") stream << dropSchemaObject(ext, schema, owner, type, name); else if (type == "USER") stream << dropUser(ext, schema, owner, type, name); else if (type == "VIEW") stream << dropSchemaObject(ext, schema, owner, type, name); else { throw qApp->translate("toOracleExtract", "Invalid type %1 to drop").arg(type); } } void toOracleExtract::migrate(toExtract &ext, QTextStream &stream, const QString &type, std::list &src, std::list &dst) const { clearFlags(ext); if (type == "TABLE") stream << migrateTable(ext, src, dst); // TODO: Add other missing objects: views, indexes, tablespaces etc. // else if (type == "OTHEROBJECTS") // stream << migrateOtherObject(otherparams); else { throw qApp->translate("toOracleExtract", "Invalid type %1 to migrate").arg(type); } } // migrate tora-2.1.3/src/toresultparam.h0000644000175000017500000000703111270353625016117 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTPARAM_H #define TORESULTPARAM_H #include "config.h" #include "toresult.h" #include #include class QLineEdit; class QToolButton; class toResultView; /** * This widget displays the parameters of a session and lets you edit * them. */ class toResultParam : public QWidget, public toResult { Q_OBJECT; QString LastItem; QString LastValue; std::map NewValues; toResultView *Params; QLineEdit *Value; QToolButton *Toggle; void saveChange(); public: /** Create the widget. * @param parent Parent widget. * @param name Name of widget. */ toResultParam(QWidget *parent, const char *name = NULL); virtual bool canHandle(toConnection &conn); private slots: void generateFile(void); void applySession(void); void applySystem(void); void applyChanges(void); void changeItem(void); void changedData(int row, int col, const QString &data); void dropChanges(void); void done(void); void showHidden(bool); void showGlobal(bool); public slots: virtual void query(const QString &sql, const toQList ¶m); /** Reimplemented for internal reasons. */ virtual void refresh(void) { toResult::refresh(); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1) { toResult::changeParams(Param1); } /** Reimplemented For internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2) { toResult::changeParams(Param1, Param2); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3) { toResult::changeParams(Param1, Param2, Param3); } }; #endif tora-2.1.3/src/tohelpsetupui.ui0000644000175000017500000001132511270353625016316 0ustar michaelmichael toHelpSetupUI 0 0 506 448 Form1 Add manuals from an Oracle index page. Add manuals from an Oracle index page. This is the index page that links to the actual manuals. Not the master index page that links to different categories of manuals. 0 0 0 0 6 6 true Title Filename 0 0 &Add Manual Qt::Horizontal QSizePolicy::Expanding 20 20 0 0 &Remove Manual 0 0 &Oracle Manuals Qt::Horizontal QSizePolicy::Expanding 20 20 toTreeWidget QTreeWidget
totreewidget.h
FileList AddButton RemoveButton AddButton clicked() toHelpSetupUI addFile() 20 20 20 20 RemoveButton clicked() toHelpSetupUI delFile() 20 20 20 20 AddOracle clicked() toHelpSetupUI oracleManuals() 20 20 20 20
tora-2.1.3/src/tosecuritytreeitem.h0000644000175000017500000000720111270353625017165 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOSECURITYTREEITEM_H #define TOSECURITYTREEITEM_H #include #include /*! \brief A leaf item for toSecurity, toSecurityObject. DB object GRANTs are handled in this model. Read Qt4 documentation to understand undocumented methods in this class. */ class toSecurityTreeItem { public: /*! \param parent a parent item. When it's 0, it's a root one. \param data main data - object name usually. \param type object type. See SQL statements for its content. \param schema a schema/owner name. See SQL statements for its content. */ toSecurityTreeItem( toSecurityTreeItem *parent = 0, const QString & data = 0, const QString & name = 0, const QString & type = 0, const QString & schema = 0 ); ~toSecurityTreeItem(); void appendChild(toSecurityTreeItem *child); toSecurityTreeItem *child(int row); int childCount() const; int columnCount() const; int row() const; toSecurityTreeItem *parent(); //! Object display string QString data() const; //! Object name QString name() const; //! Object type QString type() const; //! Object owner/its schema name QString schema() const; //! "Can be checked?" property handlign bool isCheckable() { return m_checkable; }; void setCheckable(bool state) { m_checkable = state; }; //! Handle its check state Qt::CheckState state() { return m_checked; }; void setState(Qt::CheckState state) { m_checked = state; }; //! "Is it modified by user?" property. bool changed() { return m_changed; }; void setChanged(bool v) { m_changed = v; }; private: QList childItems; QString itemData; QString itemName; QString itemType; QString itemSchema; toSecurityTreeItem *parentItem; bool m_changed; bool m_checkable; Qt::CheckState m_checked; }; #endif tora-2.1.3/src/toocistub.cpp0000644000175000017500000001017611270353625015567 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #define OCI_ERROR -1 typedef signed int sword; #define TO_EXPORT __declspec(dllexport) extern "C" { BOOL APIENTRY DllMain(Qt::HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } TO_EXPORT sword OCIEnvInit() { return OCI_ERROR; } TO_EXPORT sword OCIHandleAlloc() { return OCI_ERROR; } TO_EXPORT sword OCIServerAttach() { return OCI_ERROR; } TO_EXPORT sword OCIAttrGet() { return OCI_ERROR; } TO_EXPORT sword OCIAttrSet() { return OCI_ERROR; } TO_EXPORT sword OCISessionBegin() { return OCI_ERROR; } TO_EXPORT sword OCISessionEnd() { return OCI_ERROR; } TO_EXPORT sword OCIBreak() { return OCI_ERROR; } TO_EXPORT sword OCIBindByName() { return OCI_ERROR; } TO_EXPORT sword OCIInitialize() { return OCI_ERROR; } TO_EXPORT sword OCIHandleFree() { return OCI_ERROR; } TO_EXPORT sword OCILobGetLength() { return OCI_ERROR; } TO_EXPORT sword OCILobLocatorIsInit() { return OCI_ERROR; } TO_EXPORT sword OCILobRead() { return OCI_ERROR; } TO_EXPORT sword OCIStmtPrepare() { return OCI_ERROR; } TO_EXPORT sword OCIStmtExecute() { return OCI_ERROR; } TO_EXPORT sword OCITransCommit() { return OCI_ERROR; } TO_EXPORT sword OCITransRollback() { return OCI_ERROR; } TO_EXPORT sword OCIDescriptorAlloc() { return OCI_ERROR; } TO_EXPORT sword OCIDescriptorFree() { return OCI_ERROR; } TO_EXPORT sword OCIParamGet() { return OCI_ERROR; } TO_EXPORT sword OCIServerDetach() { return OCI_ERROR; } TO_EXPORT sword OCILobWrite() { return OCI_ERROR; } TO_EXPORT sword OCIStmtFetch() { return OCI_ERROR; } TO_EXPORT sword OCIDefineByPos() { return OCI_ERROR; } TO_EXPORT sword OCIErrorGet() { return OCI_ERROR; } } tora-2.1.3/src/toawr.cpp0000644000175000017500000004166511415711657014723 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include #include "tologger.h" #include #include //#include #include #include #include //TODO see utis.h define TOMessageBox QMessageBox(QMessageBox should be included there) #include #include "utils.h" #include "totool.h" #include "toawr.h" #include "toresultview.h" #include "toparamget.h" #include "tochangeconnection.h" //#include "tosimplequery.moc" #include "icons/execute.xpm" #include "icons/awrtool.xpm" // -- Instances in this Workload Repository schema // => instnum // => dbid static toSQL SQLDBInstances("toAWR:DBInstances", "select distinct \n" " (case when cd.dbid = wr.dbid and \n" " cd.name = wr.db_name and \n" " ci.instance_number = wr.instance_number and \n" " ci.instance_name = wr.instance_name and \n" " ci.host_name = wr.host_name \n" " then '* '||wr.dbid||':'||wr.instance_name \n" " else ' '||wr.dbid||':'||wr.instance_name \n" " end) disp_dbdbid \n" " , wr.dbid dbbid \n" " , wr.instance_number instt_num \n" " , wr.db_name dbb_name \n" " , wr.instance_name instt_name \n" " , wr.host_name host \n" " from dba_hist_database_instance wr, v$database cd, v$instance ci" " order by 1 desc", // " order by wr.startup_time desc", "Instances in this Workload Repository schema"); // -- // -- Error reporting // -- Plus query max_snap_time // whenever sqlerror exit; // variable max_snap_time char(10); // declare // cursor cidnum is // select 'X' // from dba_hist_database_instance // where instance_number = :instnum // and dbid = :dbid; // cursor csnapid is // select to_char(max(end_interval_time),'dd/mm/yyyy') // from dba_hist_snapshot // where instance_number = :instnum // and dbid = :dbid; // vx char(1); // begin // -- Check Database Id/Instance Number is a valid pair // open cidnum; // fetch cidnum into vx; // if cidnum%notfound then // raise_application_error(-20200, // 'Database/Instance ' || :dbid || '/' || :instnum || // ' does not exist in DBA_HIST_DATABASE_INSTANCE'); // end if; // close cidnum; // -- Check Snapshots exist for Database Id/Instance Number // open csnapid; // fetch csnapid into :max_snap_time; // if csnapid%notfound then // raise_application_error(-20200, // 'No snapshots exist for Database/Instance '||:dbid||'/'||:instnum); // end if; // close csnapid; // end; // / // whenever sqlerror continue; // tohle asi muzu preskocit // - validni kombinace je uz znama // - nactu do komboboxu (anebo tam bude "No snaps") // -- List available snapshots static toSQL SQLSnaps("toAWR:Snaps", " select to_char(s.end_interval_time,'HH24:mi') snapdat \n" " , di.instance_name inst_name \n" " , di.db_name db_name \n" " , s.snap_id snap_id \n" " , s.snap_level lvl \n" " , to_char(s.startup_time,'dd Mon \"at\" HH24:mi:ss') instart_fmt \n" "from dba_hist_snapshot s \n" " , dba_hist_database_instance di \n" "where s.dbid = :db_id \n" " and di.dbid = s.dbid \n" " and s.instance_number = :instnum \n" " and di.instance_number = s.instance_number \n" " and di.dbid = s.dbid \n" " and di.instance_number = s.instance_number \n" " and di.startup_time = s.startup_time \n" " and s.end_interval_time between trunc(to_date(:sdate, 'YYYY:MM:DD')) \n" " and trunc(to_date(:edate, 'YYYY:MM:DD')+1) \n" // " and s.end_interval_time >= decode( &num_days " // " , 0 , to_date('31-JAN-9999','DD-MON-YYYY') " // " , 3.14, s.end_interval_time " // " , to_date(:max_snap_time,'dd/mm/yyyy') - (&num_days-1)) " " order by db_name, instance_name, snap_id \n" , "List availanble snapshots"); // -- // -- Error reporting // whenever sqlerror exit; static toSQL SQLCheckSnaps("toAWR:CheckSnaps", " declare \n" " cursor cspid(vspid dba_hist_snapshot.snap_id%type) is \n" " select end_interval_time \n" " , startup_time \n" " from dba_hist_snapshot \n" " where snap_id = vspid \n" " and dbid = :dbid \n" " and instance_number = :inst; \n" " bsnapt dba_hist_snapshot.end_interval_time%type; \n" " bstart dba_hist_snapshot.startup_time%type; \n" " esnapt dba_hist_snapshot.end_interval_time%type; \n" " estart dba_hist_snapshot.startup_time%type; \n" " begin \n" " -- Check Begin Snapshot id is valid, get corresponding instance startup time \n" " open cspid(:fsnap); \n" " fetch cspid into bsnapt, bstart; \n" " if cspid%notfound then \n" " raise_application_error(-20200, \n" " 'Begin Snapshot Id '||:fsnap||' does not exist for this database/instance'); \n" " end if; \n" " close cspid; \n" " -- Check End Snapshot id is valid and get corresponding instance startup time \n" " open cspid(:tsnap); \n" " fetch cspid into esnapt, estart; \n" " if cspid%notfound then \n" " raise_application_error(-20200, \n" " 'End Snapshot Id '||:tsnap||' does not exist for this database/instance'); \n" " end if; \n" " if esnapt <= bsnapt then \n" " raise_application_error(-20200, \n" " 'End Snapshot Id '||:tsnap||' must be greater than Begin Snapshot Id '||:fsnap); \n" " end if; \n" " close cspid; \n" " -- Check startup time is same for begin and end snapshot ids \n" " if ( bstart != estart) then \n" " raise_application_error(-20200, \n" " 'The instance was shutdown between snapshots '||:fsnap||' and '||:tsnap); \n" " end if; \n" " end; \n", "Check if the pair of snap ids is valid" ); class toAWRTool : public toTool { protected: std::map Windows; virtual const char **pictureXPM(void); public: toAWRTool() : toTool(10003,"AWR") { } virtual const char *menuItem() { return "AWR Report"; } virtual bool canHandle(toConnection &conn) { return toIsOracle(conn); } virtual QWidget *toolWindow(QWidget *parent,toConnection &connection) { std::map::iterator i = Windows.find(&connection); if (i != Windows.end()) { (*i).second->raise(); (*i).second->setFocus(); return NULL; } else { QWidget *window = new toAWR(parent, connection); Windows[&connection] = window; return window; } } virtual void closeWindow(toConnection &connection) { std::map::iterator i = Windows.find(&connection); if (i != Windows.end()) { std::cerr << "Window deleted:" << std::endl; Windows.erase(i); } } }; const char **toAWRTool::pictureXPM(void) { return const_cast(awrtool_xpm); } static toAWRTool AWRTool; toAWR::toAWR(/*toTool *tool,*/ QWidget *parent, toConnection &_connection) : toToolWidget(/* *tool*/AWRTool, "simplequery.html", parent, _connection, "toAWR") { QToolBar *toolbar=toAllocBar(this, tr("Simple Query")); layout()->addWidget(toolbar); toolbar->addWidget(new QLabel("Inst:", toolbar)); dbid = new toResultCombo(toolbar, "AWR toolbar"); fsnap = new toResultCombo(toolbar, "AWR toolbar"); fsnap->setSelectionPolicy(toResultCombo::LastButOne); tsnap = new toResultCombo(toolbar, "AWR toolbar"); tsnap->setSelectionPolicy(toResultCombo::Last); startdate = new QDateTimeEdit(QDate::currentDate()); startdate->setCalendarPopup(true); enddate = new QDateTimeEdit(QDate::currentDate()); enddate->setCalendarPopup(true); connect(dbid, SIGNAL(activated(int)), this, SLOT(instanceChanged(int))); connect(dbid, SIGNAL(done()), this, SLOT(instanceRead())); connect(startdate, SIGNAL(dateChanged(QDate)), this, SLOT(startDateChanged(QDate))); connect(enddate, SIGNAL(dateChanged(QDate)), this, SLOT(endDateChanged(QDate))); toolbar->addWidget(dbid); toolbar->addWidget(startdate); toolbar->addWidget(fsnap); toolbar->addWidget(enddate); toolbar->addWidget(tsnap); try { dbid->query(toSQL::sql("toAWR:DBInstances", connection())); } TOCATCH; toolbar->addAction(QIcon(QPixmap(const_cast(execute_xpm))), tr("Generate report"), this, SLOT(execute())); toolbar->addWidget(new toSpacer()); QAction *executeAct = new QAction(QPixmap(execute_xpm), tr("Execute_ current statement"), this); executeAct->setShortcut(QKeySequence::Refresh); connect(executeAct, SIGNAL(triggered()), this, SLOT(refresh(void))); new toChangeConnection(toolbar); Tabs = new QTabWidget(this); layout()->addWidget(Tabs); } void toAWR::execute(void) { try { //QString sql=Statement->text(); //toQList params=toParamGet::getParam(this,sql); //Result->query(sql,params); //Result->query(sql,toQList()); QVariant vdbid = dbid->itemData(dbid->currentIndex()); QString dbids( vdbid.toStringList().at(0) ); QString insts( vdbid.toStringList().at(1) ); QVariant vf = fsnap->itemData(fsnap->currentIndex()); QVariant vt = tsnap->itemData(tsnap->currentIndex()); QString fsnaps( vf.toStringList().at(2) ); QString tsnaps( vt.toStringList().at(2) ); // toQList params; // params.push_back(fsnaps); // params.push_back(tsnaps); TLOG(0,toDecorator,__HERE__) << "Dbid:" << dbids.toAscii().constData() << ' ' << "Inst:" << insts.toAscii().constData() << ' ' << "fsnap:" << fsnaps.toAscii().constData() << ' ' << "tsnap:" << tsnaps.toAscii().constData() << std::endl; try { toQuery checkSnaps(connection(), SQLCheckSnaps, dbids, insts, fsnaps, tsnaps); toQuery report(connection(), "select NVL(output,' ') \n" //"from table(dbms_workload_repository.awr_report_text( \n" "from table(dbms_workload_repository.awr_report_html( \n" " :dbid, \n" " :inst, \n" " :f, \n" " :t, 0))", dbids, insts, fsnaps, tsnaps); QString reports; while (!report.eof()) { QString line = report.readValue(); reports += line; reports += '\n'; } std::cerr << reports.toAscii().constData() << std::endl; QWidget *box = new QWidget(Tabs); QVBoxLayout *vbox = new QVBoxLayout; vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); box->setLayout(vbox); vbox->addWidget(new QLabel(tr("AWR report"), box)); QTextBrowser *tb = new QTextBrowser(box); tb->setFontFamily("monospace"); tb->setReadOnly(true); tb->setText(reports); //tb->setFontFamily("Courier"); vbox->addWidget(tb); Tabs->addTab(box, tr("AWR Report")); } catch (const toConnection::exception &t ) { TOMessageBox::information(this, t, t); } } TOCATCH } toAWR::~toAWR() { delete dbid; delete fsnap; delete tsnap; delete startdate; delete enddate; } void toAWR::closeEvent(QCloseEvent *event) { try { AWRTool.closeWindow(connection()); } TOCATCH; event->accept(); } void toAWR::startDateChanged(QDate date) { std::cerr << "startDateChanged:" << date.toString() << std::endl; int pos = dbid->currentIndex(); QVariant d = dbid->itemData(pos); QStringList l = d.toStringList(); std::stringstream s; for(QList::iterator i=l.begin(); i!=l.end(); ++i) { s << ":\'" << (*i).toAscii().constData() << '\''; } TLOG(0,toDecorator,__HERE__) << "start date changed:" << date.toString("YYYY:MM:DD") << std::endl; QString dbid = l.at(0); QString inst = l.at(1); try { toQList params; params.push_back(dbid); params.push_back(inst); params.push_back(date.toString("yyyy:MM:dd")); params.push_back(date.toString("yyyy:MM:dd")); fsnap->setSelectionPolicy(toResultCombo::None); fsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast(params ) ); fsnap->refresh(); } TOCATCH; } void toAWR::endDateChanged(QDate date) { std::cerr << "endDateChanged:" << date.toString() << std::endl; int pos = dbid->currentIndex(); QVariant d = dbid->itemData(pos); QStringList l = d.toStringList(); std::stringstream s; for(QList::iterator i=l.begin(); i!=l.end(); ++i) { s << ":\'" << (*i).toAscii().constData() << '\''; } TLOG(0,toDecorator,__HERE__) << "end date changed:" << date.toString("YYYY:MM:DD") << std::endl; QString dbid = l.at(0); QString inst = l.at(1); try { toQList params; params.push_back(dbid); params.push_back(inst); params.push_back(date.toString("yyyy:MM:dd")); params.push_back(date.toString("yyyy:MM:dd")); fsnap->setSelectionPolicy(toResultCombo::None); tsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast(params ) ); tsnap->refresh(); } TOCATCH; } void toAWR::instanceChanged(int pos) { QVariant d = dbid->itemData(pos); QStringList l = d.toStringList(); std::stringstream s; for(QList::iterator i=l.begin(); i!=l.end(); ++i) { s << ":\'" << (*i).toAscii().constData() << '\''; } TLOG(0,toDecorator,__HERE__) << "Instance changed:" << pos << s.str() << std::endl; QString dbid = l.at(0); QString inst = l.at(1); try { toQList sparams, eparams; sparams.push_back(dbid); sparams.push_back(inst); sparams.push_back(startdate->date().toString("yyyy:MM:dd")); sparams.push_back(startdate->date().toString("yyyy:MM:dd")); TLOG(1,toDecorator,__HERE__) << "FSNAP: (" << sparams.size() << ")" << std::endl; fsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast(sparams ) ); fsnap->refresh(); eparams.push_back(dbid); eparams.push_back(inst); eparams.push_back(enddate->date().toString("yyyy:MM:dd")); eparams.push_back(enddate->date().toString("yyyy:MM:dd")); TLOG(1,toDecorator,__HERE__) << "TSNAP: (" << eparams.size() << ")" << std::endl; tsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast(eparams ) ); tsnap->refresh(); } TOCATCH; }; void toAWR::instanceRead(void) { dbid->setCurrentIndex(0); }; tora-2.1.3/src/tochartmanager.cpp0000644000175000017500000010361311270353625016552 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "tochartmanager.h" #include "utils.h" #include "tobarchart.h" #include "toconf.h" #include "toconnection.h" #include "tolinechart.h" #include "tomain.h" #include "toresultview.h" #include "tosmtp.h" #include "totool.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "icons/chart.xpm" #include "icons/fileopen.xpm" #include "icons/refresh.xpm" class toChartTool : public toTool { protected: toChartHandler *Handler; toChartManager *Window; public: toChartTool() : toTool(930, "Chart Manager") { Window = NULL; } virtual QWidget *toolWindow(QWidget *, toConnection &) { if (!Handler) return NULL; if (Window) { Window->setFocus(Qt::OtherFocusReason); // already opened, prevent creating new sub window return 0; } Window = new toChartManager(toMainWidget()->workspace()); Window->setWindowTitle(qApp->translate("toChartTool", "Chart Manager")); Window->setWindowIcon(QPixmap(const_cast(chart_xpm))); Window->refresh(); return Window; } virtual void customSetup() { toMainWidget()->getEditMenu()->addAction( QIcon(chart_xpm), qApp->translate("toChartTool", "Chart Manager..."), this, SLOT(createWindow())); Handler = new toChartHandler(); } void closeWindow(void) { Window = NULL; } void closeHandler(void) { Handler = NULL; } toChartHandler *handler() { return Handler; } toChartManager *manager() { return Window; } virtual bool canHandle(toConnection &) { return true; } virtual void closeWindow(toConnection &connection){}; }; static toChartTool ChartTool; toChartAlarm::toChartAlarm(QWidget *parent, const char *name, bool modal, Qt::WFlags fl) : QDialog(parent) { setupUi(this); } void toChartAlarm::changeValue(int val) { if (val == 1) ExtraLabel->setText(qApp->translate("toChartAlarm", "Email")); else ExtraLabel->setText(QString::null); Extra->setEnabled(val == 1); } toChartSetup::toChartSetup(toLineChart *chart, QWidget* parent, const char* name, bool modal) : QDialog(parent) { setupUi(this); Chart = chart; connect(BrowseButton, SIGNAL(clicked()), this, SLOT(browseFile())); connect(AddButton, SIGNAL(clicked()), this, SLOT(addAlarm())); connect(RemoveButton, SIGNAL(clicked()), this, SLOT(removeAlarm())); connect(ModifyButton, SIGNAL(clicked()), this, SLOT(modifyAlarm())); } void toChartSetup::browseFile() { QString str = toOpenFilename(Filename->text(), QString::fromLatin1("*.csv"), this); if (!str.isEmpty()) Filename->setText(str); } QString toChartSetup::modifyAlarm(const QString &str, bool &persistent) { toChartManager::chartAlarm alarm(str, persistent); toChartAlarm diag(this, NULL, true); diag.Operation->setCurrentIndex((int)alarm.Operation); diag.Comparison->setCurrentIndex((int)alarm.Comparison); diag.Action->setCurrentIndex((int)alarm.Action); diag.Value->setText(QString::number(alarm.Value)); diag.changeValue((int)alarm.Action); diag.Value->setValidator(new QDoubleValidator(diag.Value)); diag.Extra->setText(alarm.Extra); std::list::iterator sel = alarm.Columns.begin(); diag.Charts->addColumn(qApp->translate("toChartSetup", "Charts")); diag.Charts->setSelectionMode(toTreeWidget::Multi); toTreeWidgetItem *item = NULL; std::list::iterator lab = Chart->labels().begin(); for (int i = 0;lab != Chart->labels().end();i++, lab++) { item = new toTreeWidgetItem(diag.Charts, item, *lab); if (sel != alarm.Columns.end() && *sel == i) { item->setSelected(true); sel++; } } diag.Persistent->setChecked(persistent); if (diag.exec()) { persistent = diag.Persistent->isChecked(); int i = 0; alarm.Columns.clear(); for (toTreeWidgetItem *item = diag.Charts->firstChild();item;item = item->nextSibling()) { if (item->isSelected()) alarm.Columns.insert(alarm.Columns.end(), i); i++; } alarm.Action = (toChartManager::action)diag.Action->currentIndex(); alarm.Operation = (toChartManager::chartAlarm::operation)diag.Operation->currentIndex(); alarm.Comparison = (toChartManager::chartAlarm::comparison)diag.Comparison->currentIndex(); alarm.Value = diag.Value->text().toDouble(); alarm.Extra = diag.Extra->text(); return alarm.toString(); } return QString::null; } void toChartSetup::addAlarm() { toChartManager::chartAlarm alarm; QString str = modifyAlarm(alarm.toString(), alarm.Persistent); if (!str.isEmpty()) new toTreeWidgetItem(Alarms, str, alarm.Persistent ? qApp->translate("toChartSetup", "Persistent") : qApp->translate("toChartSetup", "Temporary")); } void toChartSetup::modifyAlarm() { toTreeWidgetItem *item = Alarms->selectedItem(); if (item) { bool pers = item->text(1) == qApp->translate("toChartSetup", "Persistent"); QString str = modifyAlarm(item->text(0), pers); if (!str.isEmpty()) { item->setText(0, str); item->setText(1, pers ? qApp->translate("toChartSetup", "Persistent") : qApp->translate("toChartSetup", "Temporary")); } } } void toChartSetup::removeAlarm() { delete Alarms->selectedItem(); } toChartReceiver::toChartReceiver(toChartHandler *parent, toLineChart *chart) : QObject(parent) { Parent = parent; Chart = chart; Result = NULL; connect(Chart, SIGNAL(valueAdded(std::list &, const QString &)), this, SLOT(valueAdded(std::list &, const QString &))); } toResult *toChartReceiver::result(void) { if (!Result) Result = dynamic_cast(Chart); return Result; } QString toChartReceiver::name(void) { if (!Result || Result->sqlName().isEmpty()) return QString::null; try { LastName = Result->connection().description(false) + QString(":") + QString(Result->sqlName()); } catch (...) {} return LastName; } void toChartReceiver::valueAdded(std::list &value, const QString &xValues) { Parent->valueAdded(Chart, name(), value, xValues); } toChartManager::toChartManager(QWidget *main) : QWidget(main), toHelpContext(QString::fromLatin1("chartmanager.html")) { QVBoxLayout *vbox = new QVBoxLayout; QToolBar *toolbar = toAllocBar(this, tr("Chart Manager")); vbox->addWidget(toolbar); toolbar->addAction(QIcon(refresh_xpm), tr("Refresh list"), this, SLOT(refresh())); toolbar->addSeparator(); toolbar->addAction(QIcon(fileopen_xpm), tr("Open tracker file"), this, SLOT(openChart())); toolbar->addAction(QIcon(chart_xpm), tr("Setup chart"), this, SLOT(setupChart())); toolbar->addWidget(new toSpacer()); List = new toListView(this); List->addColumn(tr("Connection")); List->addColumn(tr("Title")); List->addColumn(tr("ID")); List->addColumn(tr("Tracking")); List->addColumn(tr("Alarms")); List->setSorting(2); List->setSelectionMode(toTreeWidget::Single); vbox->addWidget(List); connect(&Refresh, SIGNAL(timeout()), this, SLOT(refresh())); setFocusProxy(List); vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); setLayout(vbox); } toChartManager::~toChartManager() { ChartTool.closeWindow(); } void toChartHandler::addChart(toLineChart *chart) { Charts.insert(Charts.end(), new toChartReceiver(this, chart)); toChartManager *manager = ChartTool.manager(); if (manager) { manager->Refresh.setSingleShot(true); manager->Refresh.start(1); } } void toChartHandler::removeChart(toLineChart *chart) { for (std::list::iterator i = Charts.begin();i != Charts.end();i++) { if ((*i)->chart() == chart) { QString name = (*i)->name(); if (!name.isNull()) { std::map >::iterator fnda = Alarms.find(name); if (fnda != Alarms.end()) { bool any = false; for (std::list::iterator j = (*fnda).second.begin();j != (*fnda).second.end();) { if (!(*j).Persistent) { (*fnda).second.erase(j); j = (*fnda).second.begin(); } else { j++; any = true; } } if (!any) Alarms.erase(fnda); } std::map::iterator fndt = Files.find(name); if (fndt != Files.end()) { if (!(*fndt).second.Persistent) Files.erase(fndt); } } delete *i; Charts.erase(i); toChartManager *manager = ChartTool.manager(); if (manager) { manager->Refresh.setSingleShot(true); manager->Refresh.start(1); } return ; } } } toChartManager::alarmSignal::alarmSignal(void) { Action = Ignore; } toChartManager::chartAlarm::chartAlarm(const QString &inp, bool pers) { char oper[100]; char cols[10000]; char comp[100]; char act[100]; char extra[10000]; Signal = false; Persistent = pers; // The \01 is just one character unlikely to be in an email address int ret = sscanf(inp.toUtf8(), "%s %s %s %lf %s %[^\01]", oper, cols, comp, &Value, act, extra); if (ret != 5 && ret != 6) { Operation = Any; Value = 0; Comparison = Equal; Action = Ignore; return ; } QString t = QString::fromLatin1(oper); if (t == QString::fromLatin1("min")) Operation = Min; else if (t == QString::fromLatin1("all")) Operation = All; else if (t == QString::fromLatin1("sum")) Operation = Sum; else if (t == QString::fromLatin1("average")) Operation = Average; else if (t == QString::fromLatin1("max")) Operation = Max; else Operation = Any; t = QString::fromUtf8(cols); if (t.length() > 2) { QStringList lst = t.mid(1, t.length() - 2).split(","); for (int i = 0;i < lst.count();i++) Columns.insert(Columns.end(), lst[i].toInt()); Columns.sort(); } t = QString::fromLatin1(comp); if (t == QString::fromLatin1("=")) { Comparison = Equal; } else if (t == QString::fromLatin1("!=")) { Comparison = NotEqual; } else if (t == QString::fromLatin1("<")) { Comparison = Less; } else if (t == QString::fromLatin1(">")) { Comparison = Greater; } else if (t == QString::fromLatin1("<=")) { Comparison = LessEqual; } else if (t == QString::fromLatin1(">=")) { Comparison = GreaterEqual; } else { Comparison = Equal; } t = QString::fromLatin1(act); if (t == QString::fromLatin1("StatusMessage")) Action = StatusMessage; else if (t == QString::fromLatin1("Email")) Action = Email; else Action = Ignore; if (ret == 6) Extra = QString::fromUtf8(extra); } toChartManager::chartAlarm::chartAlarm() { Signal = false; Operation = Any; Comparison = Equal; Action = StatusMessage; Value = 0; Persistent = true; } toChartManager::chartAlarm::chartAlarm(operation oper, comparison comp, action act, double value, std::list &cols, const QString &extra, bool persistent) { Signal = false; Operation = oper; Comparison = comp; Action = act; Value = value; Columns = cols; Persistent = persistent; Extra = extra; } QString toChartManager::chartAlarm::toString(void) { QString t; switch (Operation) { case Any: t = QString::fromLatin1("any"); break; case All: t = QString::fromLatin1("all"); break; case Sum: t = QString::fromLatin1("sum"); break; case Average: t = QString::fromLatin1("average"); break; case Max: t = QString::fromLatin1("max"); break; case Min: t = QString::fromLatin1("min"); break; } t += QString::fromLatin1(" ("); bool first = true; for (std::list::iterator i = Columns.begin();i != Columns.end();i++) { if (first) first = false; else t += QString::fromLatin1(","); t += QString::number(*i); } t += QString::fromLatin1(")"); switch (Comparison) { case Equal: t += QString::fromLatin1(" = "); break; case NotEqual: t += QString::fromLatin1(" != "); break; case Less: t += QString::fromLatin1(" < "); break; case Greater: t += QString::fromLatin1(" > "); break; case LessEqual: t += QString::fromLatin1(" <= "); break; case GreaterEqual: t += QString::fromLatin1(" >= "); break; } t += QString::number(Value); switch (Action) { case StatusMessage: t += QString::fromLatin1(" StatusMessage"); break; case Email: t += QString::fromLatin1(" Email"); break; case Ignore: t += QString::fromLatin1(" Ignore"); break; } if (!Extra.isEmpty()) { t += QString::fromLatin1(" "); t += Extra; } return t; } bool toChartManager::chartAlarm::checkValue(double val) { switch (Comparison) { case Equal: return val == Value; case NotEqual: return val != Value; case Less: return Value < val; case Greater: return Value > val; case LessEqual: return Value <= val; case GreaterEqual: return Value >= val; } return false; } void toChartManager::chartAlarm::valueAdded(toChartHandler *handler, const QString &str, std::list &value, const QString &xValue) { std::list vals; std::list::iterator i = value.begin(); std::list::iterator j = Columns.begin(); for (int id = 0;j != Columns.end() && i != value.end();i++, id++) { if (id == *j) { vals.insert(vals.end(), *i); j++; } } bool sig = false; switch (Operation) { case Any: { for (std::list::iterator i = vals.begin();i != vals.end();i++) if (checkValue(*i)) { sig = true; break; } } break; case All: sig = true; { for (std::list::iterator i = vals.begin();i != vals.end();i++) if (!checkValue(*i)) { sig = false; break; } } break; case Sum: { double val = 0; for (std::list::iterator i = vals.begin();i != vals.end();i++) val += *i; sig = checkValue(val); } break; case Average: { double val = 0; for (std::list::iterator i = vals.begin();i != vals.end();i++) val += *i; sig = checkValue(val / vals.size()); } break; case Max: { bool first = true; double val = 0; for (std::list::iterator i = vals.begin();i != vals.end();i++) { if (first) { first = false; val = *i; } else val = std::max(*i, val); } sig = checkValue(val); } break; case Min: { bool first = true; double val = 0; for (std::list::iterator i = vals.begin();i != vals.end();i++) { if (first) { first = false; val = *i; } else val = std::min(*i, val); } sig = checkValue(val); } break; } if (sig) { if (Signal) return ; handler->SignalAlarms.insert(handler->SignalAlarms.end(), alarmSignal(Action, xValue, str, toString(), Extra)); handler->Timer.setSingleShot(true); handler->Timer.start(1); Signal = true; } else Signal = false; } void toChartHandler::saveSettings(void) { { // int num = 0; ChartsMap c; for (std::map::iterator i = Files.begin();i != Files.end();i++) { if ((*i).second.Persistent) { // num++; // QString name = QString("Files:") + QString::number(num).toLatin1(); // ChartTool.setConfig(name + ":Name", (*i).first); // ChartTool.setConfig(name + ":Spec", (*i).second.File.fileName()); c[(*i).first] = (*i).second.File.fileName(); } } // ChartTool.setConfig("FilesCount", QString::number(num)); toConfigurationSingle::Instance().setChartFiles(c); } { ChartsMap c; // int num = 0; for (std::map >::iterator i = Alarms.begin(); i != Alarms.end();i++) { for (std::list::iterator j = (*i).second.begin();j != (*i).second.end();j++) { if ((*j).Persistent) { // num++; // QString name = QString("Alarms:") + QString::number(num).toLatin1(); // ChartTool.setConfig(name + ":Name", (*i).first); // ChartTool.setConfig(name + ":Spec", (*j).toString()); c[(*i).first] = (*j).toString(); } } } // ChartTool.setConfig("AlarmCount", QString::number(num)); toConfigurationSingle::Instance().setChartAlarms(c); } toConfigurationSingle::Instance().saveConfig(); } void toChartHandler::loadSettings(void) { // { // for (int num = ChartTool.config("FilesCount", "0").toInt();num > 0;num--) // { // QString name = QString("Files:") + QString::number(num).toLatin1(); // QString t = ChartTool.config(name + ":Name", ""); // QString s = ChartTool.config(name + ":Spec", ""); // if (!t.isEmpty() && !s.isEmpty()) // Files[t] = toChartManager::chartTrack(s, true); // } // } ChartsMapIterator i(toConfigurationSingle::Instance().chartFiles()); while (i.hasNext()) { i.next(); if (!i.key().isEmpty() && !i.value().isEmpty()) Files[i.key()] = toChartManager::chartTrack(i.value(), true); } // { // for (int num = ChartTool.config("AlarmCount", "0").toInt();num > 0;num--) // { // QString name = QString("Alarms:") + QString::number(num).toLatin1(); // QString t = ChartTool.config(name + ":Name", ""); // QString s = ChartTool.config(name + ":Spec", ""); // if (!t.isEmpty() && !s.isEmpty()) // Alarms[t].insert(Alarms[t].end(), toChartManager::chartAlarm(s, true)); // } // } ChartsMapIterator i1(toConfigurationSingle::Instance().chartAlarms()); while (i1.hasNext()) { i1.next(); if (!i1.key().isEmpty() && !i1.value().isEmpty()) Alarms[i1.key()].insert(Alarms[i1.key()].end(), toChartManager::chartAlarm(i1.value(), true)); } } void toChartHandler::alarm(void) { while (!SignalAlarms.empty()) { toChartManager::alarmSignal signal = toShift(SignalAlarms); if (signal.Action == toChartManager::StatusMessage) toStatusMessage(tr("ALARM:") + signal.Chart + QString::fromLatin1(": ") + signal.Alarm + QString::fromLatin1(": ") + signal.xValue); else if (signal.Action == toChartManager::Email) new toSMTP(QString::fromLatin1(TOAPPNAME " "), signal.Extra, tr("TOra alert:") + " " + signal.Chart, tr("A defined alert value was detected:\n\n%1\n\nAt: %2").arg(signal.Alarm).arg(signal.xValue)); } } void toChartHandler::valueAdded(toLineChart *chart, const QString &chartName, std::list &value, const QString &xValue) { std::map >::iterator fnda = Alarms.find(chartName); if (fnda != Alarms.end()) { std::list &alarms = (*fnda).second; for (std::list::iterator i = alarms.begin();i != alarms.end();i++) (*i).valueAdded(this, chartName, value, xValue); } std::map::iterator fndt = Files.find(chartName); if (fndt != Files.end()) { QFile &file = (*fndt).second.File; bool header = false; if (!file.isOpen()) { if (!file.exists()) header = true; file.open(QIODevice::Unbuffered | QIODevice::WriteOnly | QIODevice::Append); } if (file.isOpen()) { static QRegExp quote(QString::fromLatin1("\"")); QString out = "\""; if (header) { QString t = chart->title(); t.replace(quote, QString::fromLatin1("\"\"")); out += t.toUtf8(); std::list labels = chart->labels(); for (std::list::iterator i = labels.begin();i != labels.end();i++) { out += "\";\""; QString t = (*i); t.replace(quote, QString::fromLatin1("\"\"")); out += t.toUtf8(); } out += "\"\n\""; } QString t = xValue; t.replace(quote, QString::fromLatin1("\"\"")); out += t.toUtf8(); for (std::list::iterator i = value.begin();i != value.end();i++) { out += "\";\""; out += QString::number(*i); } out += "\"\n"; file.write(out.toUtf8()); } } } static QString ReadCSV(const QString &data, int &pos, bool &nl) { QString ret; if (data.at(pos) != '\"') throw qApp->translate("toChartManager", "Initial value didn't start with \" in CSV file"); pos++; while (pos < data.length() && (data.at(pos) != '\"' || (pos + 1 < data.length() && data.at(pos + 1) == '\"'))) { ret += data.at(pos); if (data.at(pos) == '\"') pos++; pos++; } if (pos >= data.length()) throw qApp->translate("toChartManager", "Missing closing \" in CSV file"); pos++; nl = false; while (pos < data.length() && (data.at(pos).isSpace() || data.at(pos) == ',' || data.at(pos) == ';')) { if (data.at(pos) == '\n') nl = true; pos++; } return ret; } void toChartManager::openChart(void) { QString name = toOpenFilename(QString::null, QString::fromLatin1("*.csv"), this); if (!name.isEmpty()) { try { QString data = toReadFile(name); int pos = 0; toLineChart *chart; switch (TOMessageBox::information(toMainWidget(), tr("Chart format"), tr("Select format of the chart to display"), tr("Barchart"), tr("Linechart"), tr("Cancel"))) { case 0: chart = new toBarChart(toMainWidget()->workspace(), NULL); chart->setAttribute(Qt::WA_DeleteOnClose); break; case 1: chart = new toLineChart(toMainWidget()->workspace(), NULL); chart->setAttribute(Qt::WA_DeleteOnClose); break; default: return ; } chart->show(); chart->setSamples( -1); bool eol; chart->setTitle(ReadCSV(data, pos, eol)); std::list lab; while (!eol && pos < data.length()) lab.insert(lab.end(), ReadCSV(data, pos, eol)); chart->setLabels(lab); while (pos < data.length()) { QString t = ReadCSV(data, pos, eol); std::list val; while (!eol && pos < data.length()) val.insert(val.end(), ReadCSV(data, pos, eol).toDouble()); chart->addValues(val, t); } } TOCATCH } } void toChartManager::setupChart(void) { toChartReceiver *chart = selectedChart(); if (chart && ChartTool.handler()) ChartTool.handler()->setupChart(chart->chart()); } toChartReceiver *toChartManager::selectedChart(void) { try { toTreeWidgetItem *item = List->selectedItem(); if (item && ChartTool.handler()) { for (std::list::iterator i = ChartTool.handler()->Charts.begin();i != ChartTool.handler()->Charts.end();i++) { toResult *result = (*i)->result(); if (result) { if (item->text(0) == result->connection().description(false) && item->text(2) == result->sqlName()) return *i; } } } } TOCATCH return NULL; } void toChartHandler::setupChart(toLineChart *chart) { for (std::list::iterator i = Charts.begin();i != Charts.end();i++) { if ((*i)->chart() == chart) { QString name = (*i)->name(); if (!name.isNull()) { std::list alarm; std::map >::iterator fnda = Alarms.find(name); if (fnda != Alarms.end()) alarm = (*fnda).second; toChartManager::chartTrack file; std::map::iterator fndt = Files.find(name); if (fndt != Files.end()) file = (*fndt).second; toChartSetup setup(chart, toMainWidget(), NULL, true); setup.Alarms->addColumn(tr("Alarms")); setup.Alarms->addColumn(tr("Persistent")); setup.Alarms->setSorting(0); setup.Alarms->setSelectionMode(toTreeWidget::Single); setup.Persistent->setChecked(file.Persistent); setup.Filename->setText(file.File.fileName()); if (!setup.Filename->text().isEmpty()) setup.Enabled->setChecked(true); setup.ChartFrame->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred)); toLineChart *t = chart->openCopy(setup.ChartFrame); t->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred)); t->showLegend(false); t->showAxisLegend(false); setup.ChartFrame->layout()->addWidget(t); for (std::list::iterator j = alarm.begin();j != alarm.end();j++) new toTreeWidgetItem(setup.Alarms, (*j).toString(), (*j).Persistent ? tr("Persistent") : tr("Temporary")); if (setup.exec()) { if (setup.Filename->text().isEmpty() || !setup.Enabled->isChecked()) { if (fndt != Files.end()) Files.erase(fndt); } else { Files[name] = toChartManager::chartTrack(setup.Filename->text(), setup.Persistent->isChecked()); } if (fnda != Alarms.end()) Alarms.erase(fnda); alarm.clear(); for (toTreeWidgetItem *item = setup.Alarms->firstChild(); item;item = item->nextSibling()) { alarm.insert(alarm.end(), toChartManager::chartAlarm(item->text(0), item->text(1) == tr("Persistent"))); } if (!alarm.empty()) Alarms[name] = alarm; saveSettings(); } } break; } } } void toChartManager::refresh(void) { if (!ChartTool.handler()) return ; try { List->clear(); for (std::list::iterator i = ChartTool.handler()->Charts.begin();i != ChartTool.handler()->Charts.end();i++) { toResult *result = (*i)->result(); if (result) { toResultViewItem *item = new toResultViewMLine(List, NULL, result->connection().description(false)); item->setText(1, (*i)->chart()->title()); item->setText(2, result->sqlName()); QString name = (*i)->name(); if (!name.isNull()) { std::map >::iterator fnda = ChartTool.handler()->Alarms.find(name); if (fnda != ChartTool.handler()->Alarms.end()) { QString t; for (std::list::iterator j = (*fnda).second.begin();j != (*fnda).second.end();j++) { t += (*j).toString(); t += QString::fromLatin1("\n"); } if (t.length() > 0) item->setText(4, t.mid(0, t.length() - 1)); } std::map::iterator fndt = ChartTool.handler()->Files.find(name); if (fndt != ChartTool.handler()->Files.end()) item->setText(3, (*fndt).second.File.fileName()); } } } } TOCATCH } toChartHandler::toChartHandler() { connect(toMainWidget(), SIGNAL(chartAdded(toLineChart *)), this, SLOT(addChart(toLineChart *))); connect(toMainWidget(), SIGNAL(chartRemoved(toLineChart *)), this, SLOT(removeChart(toLineChart *))); connect(toMainWidget(), SIGNAL(chartSetup(toLineChart *)), this, SLOT(setupChart(toLineChart *))); connect(&Timer, SIGNAL(timeout()), this, SLOT(alarm())); } toChartHandler::~toChartHandler() { ChartTool.closeHandler(); } tora-2.1.3/src/toeditextensions.h0000644000175000017500000001015111316746030016617 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOEDITEXTENSIONS_H #define TOEDITEXTENSIONS_H #include "config.h" #include "toeditwidget.h" // for settings classes //#include "ui_toeditextensiongotoui.h" #include "ui_toeditextensionsetupui.h" #include "totemplate.h" #include "tosqlparse.h" #include class toMarkedText; class toEditExtensionTool; class toEditExtensions : public QObject, public toEditWidget::editHandler { Q_OBJECT; toMarkedText *Current; void intIndent(int level); /*! \brief A helper method for handleComment(). It takes given line's text, then it checks if it starts with SQL comment "--". It adds a comment mark if there isn't any. It removes comment mark if there is one in the beginning of the line. \param line row position in the document */ void handleCommentLine(int line); public: toEditExtensions(); virtual void receivedFocus(toEditWidget *widget); virtual void lostFocus(toEditWidget *widget); public slots: void indentBlock(void); void deindentBlock(void); void autoIndentBlock(void); void autoIndentBuffer(void); void quoteBlock(void); void unquoteBlock(void); /*! \brief Comment or uncomment the text selection or current line. See handleCommentLine(). */ void handleComment(); void obfuscateBlock(void); void obfuscateBuffer(void); void searchForward(void); void searchBackward(void); void upperCase(void); void lowerCase(void); void gotoLine(void); void autoComplete(void); void editEnabled(bool); // bookmarks void bookmarkSwitch(); void bookmarkPrev(); void bookmarkNext(); // eol void convertEol(); }; // class toEditExtensionGoto : public QDialog, public Ui::toEditExtensionGotoUI // { // Q_OBJECT; // // toMarkedText *Editor; // // public: // toEditExtensionGoto(toMarkedText *editor); // void gotoLine(); // }; class toEditExtensionSetup : public QWidget, public Ui::toEditExtensionSetupUI, public toSettingTab { Q_OBJECT; toEditExtensionTool *Tool; toSQLParse::settings Current; bool Ok; bool Started; public: toEditExtensionSetup( toEditExtensionTool *tool, QWidget *parent, const char *name = NULL); virtual ~toEditExtensionSetup(); public slots: void saveCurrent(void); virtual void changed(void); virtual void saveSetting(void); }; #endif tora-2.1.3/src/tohtml.cpp0000644000175000017500000002306011354412714015055 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "toconf.h" #include "tomain.h" #include "tohtml.h" #include #include #include #include toHtml::toHtml(const QString &data) { Length = data.length(); Data = data; Position = 0; LastChar = 0; } toHtml::~toHtml() { } void toHtml::skipSpace(void) { if (Position >= Length) return; QChar c = LastChar; if (c == 0) c = Data[Position]; if (c.isSpace()) { Position++; LastChar = 0; while (Position < Length && Data[Position].isSpace()) Position++; } } bool toHtml::eof(void) { if (Position > Length) throw qApp->translate("toHtml", "Invalidly went beyond end of file"); return Position == Length; } void toHtml::nextToken(void) { if (eof()) throw qApp->translate("toHtml", "Reading HTML after eof"); QualifierNum = 0; QChar c = LastChar; if (c == 0) c = Data[Position]; if (c == '<') { IsTag = true; Position++; LastChar = 0; skipSpace(); if (Position >= Length) throw qApp->translate("toHtml", "Lone < at end"); if (Data[Position] != '/') { Open = true; } else { Open = false; Position++; } skipSpace(); { int start = Position; while (Position < Length && !(Data[Position].isSpace()) && Data[Position] != '>') { Data[Position] = Data[Position].toLower(); Position++; } Tag = mid(start, Position - start); } for (;;) { skipSpace(); if (Position >= Length) throw qApp->translate("toHtml", "Unended tag at end"); c = LastChar; if (c == 0) c = Data[Position]; if (c == '>') { LastChar = 0; Position++; break; } // Must always be an empty char here, so LastChar not needed to be checked. { int start = Position; while (Position < Length && !(Data[Position].isSpace()) && Data[Position] != '=' && Data[Position] != '>') { Data[Position] = Data[Position].toLower(); Position++; } Qualifiers[QualifierNum].Name = mid(start, Position - start); } skipSpace(); if (Position >= Length) throw qApp->translate("toHtml", "Unended tag qualifier at end"); c = LastChar; if (c == 0) c = Data[Position]; if (c == '=') { LastChar = 0; Position++; skipSpace(); if (Position >= Length) throw qApp->translate("toHtml", "Unended tag qualifier data at end"); c = Data[Position]; if (c == '\'' || c == '\"') { Position++; int start = Position; while (Data[Position] != c) { Position++; if (Position >= Length) throw qApp->translate("toHtml", "Unended quoted string at end"); } Qualifiers[QualifierNum].Value = mid(start, Position - start); Position++; LastChar = 0; } else { int start = Position; while (!(Data[Position].isSpace()) && Data[Position] != '>') { Position++; if (Position >= Length) throw qApp->translate("toHtml", "Unended qualifier data at end"); } Qualifiers[QualifierNum].Value = mid(start, Position - start); } } QualifierNum++; if (QualifierNum >= TO_HTML_MAX_QUAL) throw qApp->translate("toHtml", "Exceeded qualifier max in toHtml"); } } else { IsTag = false; int start = Position; Position++; LastChar = 0; while (Position < Length) { if (Data[Position] == '<') break; Position++; } Text = mid(start, Position - start); } } QString toHtml::value(const QString &q) { for (int i = 0;i < QualifierNum;i++) { if (q == Qualifiers[i].Name) return Qualifiers[i].Value; } return NULL; } QString toHtml::text() { QString ret; for (int pos = 0; pos < Text.length(); pos++) { if (Text[pos] == '&') { int start = pos + 1; while (Text[pos] != 0 && Text[pos] != ';') pos++; QString tmp(QByteArray(start, pos - start)); if (tmp[0] == '#') { tmp = tmp.right(tmp.length() - 1); ret += char(tmp.toInt()); } else if (tmp == "auml") ret += "�"; // The rest of the & codes... } else ret += Text[pos]; } return ret; } QString toHtml::mid(int start, int size) { if (size == 0) return ""; if (start >= Length) throw qApp->translate("toHtml", "Tried to access string out of bounds in mid (start=%1)").arg(start); if (size > Length) throw qApp->translate("toHtml", "Tried to access string out of bounds in mid (size=%1)").arg(size); if (start + size > Length) throw qApp->translate("toHtml", "Tried to access string out of bounds in mid (total=%1+%2>%3)"). arg(start). arg(size). arg(Length); LastChar = Data[start + size]; Data[start + size] = 0; return Data.mid(start, size); } bool toHtml::search(const QString &all, const QString &str) { QString data(str.toLower().toLatin1()); enum { beginning, inTag, inString, inWord } lastState = beginning, state = beginning; int pos = 0; QChar endString = 0; for (int i = 0;i < all.length();i++) { QChar c = all.at(i).toLower(); if (c == '\'' || c == '\"') { endString = c; state = inString; } else if (c == '<') { state = inTag; } else { switch (state) { case inString: if (c == endString) state = lastState; break; case beginning: if (data.at(pos) != c) { pos = 0; state = inWord; } else { pos++; if (pos >= data.length()) { if (i + 1 >= all.length() || !all.at(i + 1).isLetterOrNumber()) return true; pos = 0; } break; } // Intentionally no break here case inWord: if (!c.isLetterOrNumber()) state = beginning; break; case inTag: if (c == '>') state = beginning; break; } } } return false; } QString toHtml::escape(const QString &html) { QString ret = html; static QRegExp amp(QString::fromLatin1("\\&")); static QRegExp lt(QString::fromLatin1("\\<")); static QRegExp gt(QString::fromLatin1("\\>")); return ret; } tora-2.1.3/src/tosgatrace.h0000644000175000017500000000512111270353625015347 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOSGATRACE_H #define TOSGATRACE_H #include "config.h" #include "totool.h" #include #define TOSQL_LONGOPS "toSGATrace:LongOps" class QComboBox; class QMenu; class QTabWidget; class toConnection; class toMain; class toResultCombo; class toResultTableView; class toSGAStatement; class toTool; class toSGATrace : public toToolWidget { Q_OBJECT; toResultTableView *Trace; QTabWidget *ResultTab; QAction *FetchAct; toResultCombo *Schema; QComboBox *Type; QComboBox *Refresh; QComboBox *Limit; toSGAStatement *Statement; QString CurrentSchema; void updateSchemas(void); public: toSGATrace(QWidget *parent, toConnection &connection); public slots: void changeSchema(const QString &str); void changeItem(void); void changeRefresh(const QString &str); void refresh(void); }; #endif tora-2.1.3/src/towaitevents.h0000644000175000017500000000641711270353625015760 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOWAITEVENTS_H #define TOWAITEVENTS_H #include "config.h" #include "tobackground.h" #include #include #include #include #include class toTreeWidget; class toNoBlockQuery; class toPieChart; class toResultBar; class QSplitter; class toWaitEvents : public QWidget { Q_OBJECT; QSplitter * splitter; toResultBar *Delta; toResultBar *DeltaTimes; toPieChart *AbsolutePie; toPieChart *DeltaPie; toTreeWidget *Types; toNoBlockQuery *Query; toBackground Poll; bool First; bool ShowTimes; QString Now; std::list Labels; time_t LastTime; std::list LastCurrent; std::list LastTimes; std::list Current; std::list CurrentTimes; std::list Relative; std::list RelativeTimes; std::list Enabled; int Session; std::map HideMap; void setup(int session); public: toWaitEvents(QWidget *parent, const char *name); toWaitEvents(int session, QWidget *parent, const char *name); ~toWaitEvents(); void setSession(int session); virtual void exportData(std::map &data, const QString &prefix); virtual void importData(std::map &data, const QString &prefix); public slots: virtual void connectionChanged(void); virtual void changeSelection(void); virtual void poll(void); virtual void refresh(void); virtual void start(void); virtual void stop(void); virtual void changeType(int); }; #endif tora-2.1.3/src/torollbackdialogui.ui0000644000175000017500000001651311270353625017262 0ustar michaelmichael toRollbackDialogUI 0 0 556 480 Modify tablespace 11 6 image0 Display the SQL used to generate the specified object Rollback Segment 11 6 &Public true If this should be a publicly available rollback segment &Name Name false &Tablespace Tablespace false 20 20 QSizePolicy::Expanding Qt::Vertical 4 0 &Ok true 4 0 Cancel 71 20 QSizePolicy::Maximum Qt::Horizontal 20 20 QSizePolicy::Expanding Qt::Vertical DialogTabs OkButton PushButton2 789c6d90cf6e83300c87ef3c45446e684a13081434f51136ed3869dac11828f4cf2a6ddd619af6eeebcf848ab25921f2f7c5d88455a29e9f1e54b28a3ece741e58714fef2a693e8fc7af97d7cd7714bb426179e5e2bb28368ad5e3e9ad45ae2fb9b612c001e84a577aa96c81a94d6d4ec07d405fa44016acd2729d010f01795d037b60e6325bca692d58654c0c6c80de795b7b6027489eb901ee8039e5555700b7019b11e98a9d5c6711e2b4d666da82436e64c30a0ed9f85cdd5881983b5410d5332755dc50dbc99869aed1db7ee8696c307ddfe5d5ddfea0cdac9f48d2e6d685c1b7ce84ab2c5c908b7ff09ffbdb6f723ff7d12f66576feb OkButton clicked() toRollbackDialogUI accept() PushButton2 clicked() toRollbackDialogUI reject() ToolButton1 clicked() toRollbackDialogUI displaySQL() Name textChanged(QString) toRollbackDialogUI valueChanged(QString) tora-2.1.3/src/tomainwindow.cpp0000644000175000017500000000350211270353625016266 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "tomainwindow.h" toMainWindow::toMainWindow() : QMainWindow()//0, "Main Window") { } tora-2.1.3/src/tosecuritytreemodel.h0000644000175000017500000000725711270353625017342 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOSECURITYTREEMODEL_H #define TOSECURITYTREEMODEL_H #include #include #include #include "tosecuritytreeitem.h" /*! \brief A tree model for QTreeView used in toSecurity, toSecurityObject Read Qt4 documenation to understand MVC used here. */ class toSecurityTreeModel : public QAbstractItemModel { Q_OBJECT public: toSecurityTreeModel(QObject *parent = 0); ~toSecurityTreeModel(); QVariant data(const QModelIndex &index, int role) const; bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole); Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; /*! \brief Reset the model with newly readed data from database. \param user a user name. It will use WHERE clause with this string. The tree is built with (un)checkable items. Only the "grants" related items are set as checkable. These chanckable items with set isChanged() to true are used for SQL creation in the sql() method. */ void setupModelData(const QString & user); /*! \brief Construct GRANT/REVOKE script based on user's changes. */ void sql(const QString &user, std::list &sqlLst); private: //! An universal root item. It's deleted and recreated in setupModelData() toSecurityTreeItem *rootItem; //! Mapping of the OBJECT TYPE - its available privileges QMap m_SQLObjectPrivs; //! A list with privilege items (only th 3rd level is stored there. QList m_objectList; }; #endif tora-2.1.3/src/tolegendchart.cpp0000644000175000017500000001413311270353625016374 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "tolegendchart.h" #include //Added by qt3to4: #include toLegendChart::toLegendChart(int columns, QWidget *parent, const char *name, Qt::WFlags f) : QWidget(parent, f) { setObjectName(name); Columns = columns < 1 ? 1 : columns; setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred)); } void toLegendChart::addLabel(const QString &label) { Labels.insert(Labels.end(), label); sizeHint(); update(); } void toLegendChart::setLabels(std::list &labels) { Labels = labels; sizeHint(); update(); } #define FONT_ALIGN Qt::AlignLeft|Qt::AlignTop|Qt::TextExpandTabs std::list toLegendChart::sizeHint(int &height, int &items) { QFontMetrics fm = fontMetrics(); int count = 0; { for (std::list::iterator i = Labels.begin();i != Labels.end();i++) if (!(*i).isEmpty() && *i != " ") count++; } items = (count + Columns - 1) / Columns; height = 0; int width = 0; int cheight = 0; int cur = 0; std::list ret; for (std::list::iterator i = Labels.begin();i != Labels.end();i++) { if (!(*i).isEmpty() && *i != " ") { if (cur == items) { ret.insert(ret.end(), width); if (cheight > height) height = cheight; cheight = 0; width = 0; cur = 0; } QRect bounds = fm.boundingRect(0, 0, 10000, 10000, FONT_ALIGN, *i); if (width < bounds.width()) width = bounds.width(); cheight += bounds.height(); cur++; } } if (width > 0) { ret.insert(ret.end(), width); } if (cheight > height) height = cheight; return ret; } QSize toLegendChart::sizeHint(void) { QFontMetrics fm = fontMetrics(); int height, items; std::list widths = sizeHint(height, items); height += 8; int width = 8; for (std::list::iterator i = widths.begin();i != widths.end();i++) width += (*i) + 12; setFixedWidth(width); if (!Title.isEmpty()) { QRect bounds = fm.boundingRect(0, 0, width, 10000, FONT_ALIGN, Title); height += bounds.height() + 2; } return QSize(width, height); } void toLegendChart::paintEvent(QPaintEvent *) { int height, items; std::list widths = sizeHint(height, items); int width = 4; { for (std::list::iterator i = widths.begin();i != widths.end();i++) width += (*i) + 12; } QPainter p(this); QFontMetrics fm = fontMetrics(); if (!Title.isEmpty()) { p.save(); QFont f = p.font(); f.setBold(true); p.setFont(f); QRect bounds = fm.boundingRect(0, 0, toLegendChart::width(), toLegendChart::height(), FONT_ALIGN, Title); p.drawText(0, 2, toLegendChart::width() - 4, toLegendChart::height(), Qt::AlignHCenter | Qt::AlignTop, Title); p.restore(); p.translate(0, bounds.height() + 2); } int cx = 2; int cy = 4; p.save(); p.setBrush(Qt::white); p.drawRect(2, 2, width, height + 4); p.restore(); int cur = 0; std::list::iterator j = widths.begin(); int cp = 0; for (std::list::iterator i = Labels.begin();i != Labels.end();i++) { if (!(*i).isEmpty() && *i != " ") { if (cur == items) { cx += *j + 12; cy = 4; cur = 0; j++; } QRect bounds = fm.boundingRect(cx + 12, cy, 100000, 100000, FONT_ALIGN, *i); p.drawText(bounds, FONT_ALIGN, *i); p.save(); QBrush brush(toChartBrush(cp)); p.setBrush(brush.color()); p.drawRect(cx + 2, cy + bounds.height() / 2 - fm.ascent() / 2, 8, fm.ascent()); if (brush.style() != Qt::SolidPattern) { p.setBrush(QBrush(Qt::white, brush.style())); p.drawRect(cx + 2, cy + bounds.height() / 2 - fm.ascent() / 2, 8, fm.ascent()); } p.restore(); cy += bounds.height(); cur++; } cp++; } } tora-2.1.3/src/topushbutton.h0000644000175000017500000000544311270353625016000 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOPUSHBUTTON_H #define TOPUSHBUTTON_H #include "config.h" #include // a button that can be rotated. class toPushButton : public QPushButton { Q_OBJECT; public: enum Rotation { NoRotation = 0, UpsideDown = 180, Clockwise = 90, CounterClockwise = 270 }; explicit toPushButton(QWidget *parent = 0); explicit toPushButton(const QString &text, QWidget *parent = 0); explicit toPushButton(const QIcon &icon, const QString &text, QWidget *parent = 0); /** * Return the rotation set for this button * */ inline Rotation rotation() const { return rotate; } /** * Set rotation for this button * */ void setRotation(Rotation rotation); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; protected: virtual void paintEvent(QPaintEvent *); private: Rotation rotate; QStyleOptionButton getStyleOption(); }; #endif tora-2.1.3/src/todescribeui.ui0000644000175000017500000000154411270353625016067 0ustar michaelmichael toDescribe 0 0 751 330 Describe 0 0 toBrowserBaseWidget QWidget
tobrowserbasewidget.h
1
tora-2.1.3/src/tobrowserfilterui.ui0000644000175000017500000002574411270353625017210 0ustar michaelmichael toBrowserFilterUI 0 0 646 484 Filter setting 11 11 11 11 6 6 Qt::Horizontal QSizePolicy::Expanding 20 20 0 0 &Ok true 0 0 Cancel 0 0 0 0 Filter on name &No filter true 0 Object name start with &Start with 1 Object name ends in &End with 2 Object name contains &Contains 3 Comma separated list of object names &Comma list 4 Object name matches RegExp &RegExp 5 false 0 0 Filter on tablespace 11 11 11 11 6 6 Include &All true &Include &Exclude false Qt::StrongFocus 6 0 0 0 0 Only display own schema false Ignore &Case true false &Invert selection toResultView QWidget
toresultview.h
OnlyOwnSchema IgnoreCase Invert None String IncludeAll Include Exclude Tablespaces OkButton Cancel None toggled(bool) String setDisabled(bool) 20 20 20 20 None toggled(bool) IgnoreCase setDisabled(bool) 20 20 20 20 None toggled(bool) Invert setDisabled(bool) 20 20 20 20 Cancel clicked() toBrowserFilterUI reject() 20 20 20 20 OkButton clicked() toBrowserFilterUI accept() 20 20 20 20 IncludeAll toggled(bool) Tablespaces setDisabled(bool) 20 20 20 20
tora-2.1.3/src/tomessageui.ui0000644000175000017500000000227511270353625015735 0ustar michaelmichael toMessageUI 0 0 411 271 Warning message 0 0 Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset toMarkedText QWidget
tomarkedtext.h
tora-2.1.3/src/toscriptschemawidget.cpp0000644000175000017500000001461211270353625020007 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "tosql.h" #include "tomain.h" #include "toconnection.h" #include "toscripttreemodel.h" #include "toscripttreeitem.h" #include "toscriptschemawidget.h" #include "toworkingwidget.h" static toSQL SQLSchemasMySQL("toScriptSchemaWidget:ExtractSchema", "SHOW DATABASES", "Get usernames available in database, must have same columns", "3.23", "MySQL"); static toSQL SQLSchemas("toScriptSchemaWidget:ExtractSchema", "SELECT username FROM sys.all_users ORDER BY username", ""); toScriptSchemaWidget::toScriptSchemaWidget(QWidget * parent) : QWidget(parent) { setupUi(this); WorkingWidget->hide(); WorkingWidget->setType(toWorkingWidget::NonInteractive); Model = new toScriptTreeModel(this); ObjectsView->setModel(Model); std::list cons = toMainWidget()->connections(); while (cons.size() > 0) ConnectionComboBox->addItem(toShift(cons)); connect(ConnectionComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(changeConnection(int))); connect(SchemaComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(changeSchema(int))); connect(toMainWidget(), SIGNAL(addedConnection(const QString &)), this, SLOT(addConnection(const QString &))); connect(toMainWidget(), SIGNAL(removedConnection(const QString &)), this, SLOT(delConnection(const QString &))); connect(ObjectsView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(objectsView_selectionChanged(const QItemSelection &, const QItemSelection &))); }; void toScriptSchemaWidget::setTitle(const QString & text) { GroupBox->setTitle(text); } void toScriptSchemaWidget::changeConnection(int val) { // qDebug() << "toScriptSchemaWidget::changeConnection" << val; if (val == -1) return; SchemaComboBox->blockSignals(true); SchemaComboBox->clear(); toConnection &conn = toMainWidget()->connection(connectionString()); toQList schema = toQuery::readQuery(conn, SQLSchemas); SchemaComboBox->addItem(tr("All")); while (schema.size() > 0) SchemaComboBox->addItem(toShift(schema)); int ix = SchemaComboBox->findText(conn.user().toUpper(), Qt::MatchExactly); if (ix == -1) ix = 0; SchemaComboBox->blockSignals(false); SchemaComboBox->setCurrentIndex(ix); } QString toScriptSchemaWidget::connectionString() { return ConnectionComboBox->currentText(); } void toScriptSchemaWidget::setConnectionString(const QString & c) { int i = ConnectionComboBox->findText(c); if (i == -1) return; ConnectionComboBox->setCurrentIndex(i); changeConnection(i); } void toScriptSchemaWidget::delConnection(const QString &name) { ConnectionComboBox->removeItem(ConnectionComboBox->findText(name)); } void toScriptSchemaWidget::addConnection(const QString & name) { ConnectionComboBox->addItem(name); } void toScriptSchemaWidget::changeSchema(int val) { // qDebug() << "toScriptSchemaWidget::changeSchema" << val; if (val == -1) return; QString schema; if (val != 0) schema = SchemaComboBox->itemText(val); setEnabled(false); WorkingWidget->show(); QCoreApplication::processEvents(); Model->setupModelData(ConnectionComboBox->currentText(), schema); WorkingWidget->hide(); setEnabled(true); } QItemSelectionModel * toScriptSchemaWidget::objectList() { return ObjectsView->selectionModel(); } void toScriptSchemaWidget::objectsView_selectionChanged(const QItemSelection & selected, const QItemSelection & deselected) { // all other widgets are disabled until it ends setEnabled(false); WorkingWidget->show(); foreach (QModelIndex i, selected.indexes()) subSelectionChanged(i); WorkingWidget->hide(); setEnabled(true); } void toScriptSchemaWidget::subSelectionChanged(QModelIndex ix) { QCoreApplication::processEvents(); QItemSelectionModel * sel = ObjectsView->selectionModel(); toScriptTreeItem * item = static_cast(ix.internalPointer()); toScriptTreeItem * subItem; QModelIndex subIx; for (int i = 0; i < item->childCount(); ++i) { subIx = Model->index(i, 0, ix); subItem = static_cast(subIx.internalPointer()); if (!sel->isSelected(subIx)) sel->select(subIx, QItemSelectionModel::Select); if (subItem->childCount() > 0) subSelectionChanged(subIx); } } tora-2.1.3/src/toresultdepend.h0000644000175000017500000000607711270353625016267 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTDEPEND_H #define TORESULTDEPEND_H #include "config.h" #include "tobackground.h" #include "toresultview.h" class toNoBlockQuery; /** This widget displays information about the dependencies of an object * specified by the first and second parameter in the query. The sql is not * used in the query. It will also recurs through all dependencies of the * objects depended on. */ class toResultDepend : public toResultView { Q_OBJECT /** Check if an object already exists. * @param owner Owner of object. * @param name Name of object. * @return True if object exists. */ bool exists(const QString &owner, const QString &name); toNoBlockQuery *Query; toBackground Poll; toTreeWidgetItem *Current; public: /** Create the widget. * @param parent Parent widget. * @param name Name of widget. */ toResultDepend(QWidget *parent, const char *name = NULL); /** Object destructor. */ ~toResultDepend(); /** Reimplemented for internal reasons. */ virtual void query(const QString &sql, const toQList ¶m); /** Reimplemented for internal reasons. */ void query(const QString &sql) { toQList p; query(sql, p); } /** Support Oracle */ virtual bool canHandle(toConnection &conn); public slots: void poll(void); }; #endif tora-2.1.3/src/tomain.h0000644000175000017500000004124211411113467014501 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOMAIN_H #define TOMAIN_H #include "config.h" #include "tobackground.h" #include "tomainwindow.h" #include #include #include #include #include #include #include #define TOMessageBox QMessageBox class QComboBox; class QLabel; class toTreeWidget; class toTreeWidgetItem; class QToolBar; class QToolButton; class QMdiArea; class toBackgroundLabel; class toConnection; class toEditWidget; class toLineChart; class toMarkedText; class toSearchReplace; class toTool; class toToolWidget; class toMessage; class toDocklet; class toDockbar; /** This class defines the main window. Observe that this class will have different baseclass * depending on if TOra is a Qt or KDE application. In the case of Qt this will be a * QMainWindow descendant. */ class toMain : public toMainWindow { Q_OBJECT; private: /** * The connections that have been opened in TOra. */ std::list Connections; /** * Workspace of main window - MDI area. */ QMdiArea *Workspace; /** * The last active sub window in workspace */ QPointer LastActiveWindow; /** * Handles available connections list in toolbar. */ QComboBox *ConnectionSelection; /** * The ID of the tool providing the SQL editor. */ QString SQLEditor; /** * A reference to the error dialog. */ toMessage * Message; /** * Status message storage for status bar */ std::list StatusMessages; /** * Edit buttons toolbar. */ QToolBar *editToolbar; /** * Tool buttons toolbar. */ QToolBar *toolsToolbar; /** * Connection buttons toolbar. */ QToolBar *connectionToolbar; /** * Toolbar for minimizing docklets, left * */ toDockbar *leftDockbar; /** * Toolbar for minimizing docklets, right * */ toDockbar *rightDockbar; /** * File menu. */ QMenu *fileMenu; /** * Recent files menu (child of fileMenu). */ QMenu *recentMenu; /** * Edit menu. */ QMenu *editMenu; /** * View menu. */ QMenu *viewMenu; /** * Tools menu. */ QMenu *toolsMenu; /** * Windows menu. */ QMenu *windowsMenu; /** * Help menu. */ QMenu *helpMenu; /** * Display latest status messages */ QMenu *statusMenu; /** * Current column label. */ QLabel *ColumnLabel; /** * Current row label. */ QLabel *RowLabel; //! \brief Display current type of text edit selection (normal/block) QLabel * SelectionLabel; toBackground Poll; /** * Search & replace dialog if available. */ toSearchReplace *Search; toBackgroundLabel* BackgroundLabel; toEditWidget *Edit; toEditWidget *findEdit(QWidget *edit); void updateRecent(void); /** * enable or disable buttons that need an active connection * */ void enableConnectionActions(bool enabled); void editEnable(toEditWidget *edit, bool open, bool save, bool print, bool undo, bool redo, bool cut, bool copy, bool paste, bool search, bool selectAll, bool readAll); QAction *newConnAct; QAction *closeConn; QAction *commitAct; QAction *rollbackAct; QAction *currentAct; QAction *stopAct; QAction *refreshAct; QAction *openAct; QAction *saveAct; QAction *saveAsAct; QAction *openSessionAct; QAction *saveSessionAct; QAction *restoreSessionAct; QAction *closeSessionAct; QAction *printAct; QAction *quitAct; QAction *undoAct; QAction *redoAct; QAction *cutAct; QAction *copyAct; QAction *pasteAct; QAction *searchReplaceAct; QAction *searchNextAct; QAction *selectAllAct; #if 0 // TODO: this part is waiting for QScintilla backend feature (yet unimplemented). QAction *selectBlockAct; #endif QAction *readAllAct; QAction *prefsAct; QAction *helpCurrentAct; QAction *helpContentsAct; QAction *aboutAct; QAction *aboutQtAct; QAction *licenseAct; QAction *windowCloseAct; QAction *windowCloseAllAct; QAction *cascadeAct; QAction *tileAct; void createActions(); void createMenus(); void createToolbars(); void createStatusbar(); void createToolMenus(); void createDocklets(); void createDockbars(); //! \brief Sets tools displaying depending on preferences (tabs/windows) void handleToolsDisplay(); public: /** * Create main window. Always NULL as parent. */ toMain(); /** * Get the workspace widget of the main window. * @return Workspace widget. */ QMdiArea *workspace() const { return Workspace; } toSearchReplace * searchDialog() { return Search; } /** * The last active sub window in workspace. MDI area is buggy as * hell and currentSubWindow will not tell you the correct window * if a menu is open, or if a tool has a custom widget (sql * editor), somebody sneezes, etc. * * Use this to find the last active sub window. */ QMdiSubWindow* lastActiveWindow() const { return LastActiveWindow; } /** * Get the current database connection * @return Reference to current connection. */ toConnection ¤tConnection(void); /** * Set the widget to edit through menues and toolbar. */ static void setEditWidget(toEditWidget *edit); /** * Set available menu items in user interface. It is not enough to just call * this function to make open for instance to actually work. It is a lot of * more especially in @ref commandCallback and @ref editFileMenu. Will only * update if this is the current editing widget. */ static void editEnable(toEditWidget *edit); /** * Disable all the current available items in the user interface (That @ref * editEnable can enable). If specified widget has the focus the edit widget * is cleared. */ static void editDisable(toEditWidget *edit); /** Get current edit widget */ toEditWidget *editWidget() { return Edit; } /** * Create the default tool for the current connection. * * This is the tool with the highest priority, usually the SQL worksheet. */ void createDefault(void); /** * Set coordinates in the statusbar. * * Used to indicate current cursor position by child widgets. */ void setCoordinates(int, int); toBackgroundLabel* getBackgroundLabel(); /** * Get a list of currently open connections. * @return List of connection names. The returned list can then be used by * @ref connection to get the actual connection. */ std::list connections(void); /** Get a connection identified by a string. * @return A reference to a connection. * @exception QString If connection wasn't found. */ toConnection &connection(const QString &); /** Set if a connection needs to be committed. Also updates visual feedback in interface. */ void setNeedCommit(toConnection &conn, bool needCommit = true); /** Edit an SQL statement in the SQL editor if any connected. * @param str Identifier of the SQL to edit. */ void editSQL(const QString &str); /** * Register a tool which to use as an SQL editor. When something * is to be edited first a toolwindow will be created and the @ref * sqlEditor will be emited, so the SQL editor must connect to * this signal as well. * * @param toolid Which tool identifier to register as the SQL * editor. This is the value which is passed to the * @ref toTool::customSetup member. */ void registerSQLEditor(const QString &); /** Called by @ref toTool when a new tool is created. * @param tool The tool widget created. */ void toolWidgetAdded(toToolWidget *tool); /** Called by @ref toToolWidget when a new tool is about to be destroyed. * @param tool The tool widget created. */ void toolWidgetRemoved(toToolWidget *tool); /** Export data to a map. * @param data A map that can be used to recreate the session. * @param prefix Prefix to add to the map. */ virtual void exportData(std::map < QString, QString > &data, const QString &prefix); /** Import data * @param data Data to read from a map. * @param prefix Prefix to read data from. */ virtual void importData(std::map < QString, QString > &data, const QString &prefix); /** Added chart. */ void addChart(toLineChart *chart); /** Removed chart. */ void removeChart(toLineChart *chart); /** Setup chart. */ void setupChart(toLineChart *chart); /** Add recent file */ void addRecentFile(const QString &filename); /** * allow tools to add custom menus (ie. File, Edit, Sql Editor) * without giving away public access to menubars. * */ void addCustomMenu(QMenu *); // access needed to some QActions for creating popup menus QAction* getUndoAction() { return undoAct; } QAction* getRedoAction() { return redoAct; } QAction* getCutAction() { return cutAct; } QAction* getCopyAction() { return copyAct; } QAction* getPasteAction() { return pasteAct; } QAction* getSelectAllAction() { return selectAllAct; } QMenu* getEditMenu() { return editMenu; } /** * add a button to the application toolbar \warning Do not use it. It screw realoading of the state of toolbars \warning The toolbar just after editToolbar the top row of the schema browser is migrating to the right - basically the whitespace after the editToolbar is expanding too far. */ void addButtonApplication(QAction *); /** * Add a new connection. The connection itself must already be created. * Returns the connection or it's duplicate already opened connection. */ toConnection *addConnection(toConnection *conn, bool def = true); signals: /** Invoked to start editing an SQL identifier. * @param str Identifier to start editing. */ void sqlEditor(const QString &str); /** Invoked when a new chart is created. */ void chartAdded(toLineChart *chart); /** Invoked before a chart is destroyed. */ void chartSetup(toLineChart *chart); /** Invoked before a chart is destroyed. */ void chartRemoved(toLineChart *chart); /** Invoked when a connection is added. * @param str Connection identifier. */ void addedConnection(const QString &str); /** Invoked when a connection is removed. * @param str Connection identifier. */ void removedConnection(const QString &str); /** Invoked when a tool window is created. * @param tool The tool created. */ void addedToolWidget(toToolWidget *tool); /** Invoked when a tool window is closed. * @param tool Tool about to be removed. */ void removedToolWidget(toToolWidget *tool); /** Emitted before a commit or rollback is made to the current connection. * @param conn Connection that is committed * @param cmt True if commit, false if rollback. */ void willCommit(toConnection &conn, bool cmt); /** * emitted when widgets related to editing. */ void editEnabled(bool en); /** * emitted to internally handle status bar messages */ void messageRequested(const QString &str, bool save, bool log); public slots: /** * Close window * @param del If user interaction is allowed. * @return True if close was allowed, otherwise false. */ //bool close(); /** Used to enable/disable entries in the windows menu */ void updateWindowsMenu(); /** Called when active window is changed. */ void windowActivated(QMdiSubWindow *); /** Used to enable/disable entries in the file menu */ void showFileMenu(void); /** Check if object caching is done. */ void checkCaching(void); /** Save the current TOra session */ void saveSession(void); /** Load a session (Merge with current) */ void loadSession(void); /** Close all windows and connections. */ void closeSession(void); /** Change current connection */ void changeConnection(void); /** * Show a statusbar message. * * @param str message to show * @param save save to messages menu * @param log */ void showMessage(const QString &str, bool save, bool log); /** * Show a busy cursor or other indicators. Must be called from the * main thread. * * class toBusy calls this method. * */ void showBusy(void); /** * Remove busy cursor or other indicators. Must be called from the * main thread. * * class toBusy calls this method. */ void removeBusy(void); /** * Open a file in sql worksheet * */ void editOpenFile(QString file); /** * Return the toDockbar that manages the docklet. If none * currently manages the docklet, returns what will if the docklet * is shown. * */ toDockbar* dockbar(toDocklet *let); /** * Handles moving docklet to new dockbar * */ void moveDocklet(toDocklet *let, Qt::DockWidgetArea area); protected: /** intercept close event from parent */ void closeEvent(QCloseEvent *event); private slots: /** Add a connection */ void addConnection(void); /** Remove a connection */ bool delConnection(void); /** Handles menu selections * @param cmd Menu entry ID selected */ void commandCallback(QAction *); /** * handles callbacks for recent files menu * */ void recentCallback(QAction *); /** * handles callbacks for the status bar * */ void statusCallback(QAction *action); /** * handles callbacks for the status bar * */ void windowCallback(QAction *action); /** * handles callbacks for the view menu * */ void viewCallback(QAction *action); void updateStatusMenu(void); /** Display status message */ void displayMessage(void); /** * Internal slot for handling status bar messages * */ void showMessageImpl(const QString &str, bool save, bool log); void workspaceCloseWindow(int); }; /** Get a pointer to the main window * @return Pointer to main window. */ toMain *toMainWidget(void); #endif tora-2.1.3/src/windows/0000755000175000017500000000000011445450571014537 5ustar michaelmichaeltora-2.1.3/src/windows/cregistry.cpp0000755000175000017500000001677111270353513017267 0ustar michaelmichael// Registry Access class (updated) by David Overton (david@insomniavisions.com). // These will compile either ANSI or UNICODE. #include "cregistry.h" // Returns true if the OS is Windows NT or Windows 2000 bool CRegistry::IsWinNTor2K() { OSVERSIONINFO OsVer; GetVersionEx(&OsVer); return (OsVer.dwPlatformId == VER_PLATFORM_WIN32_NT) != 0; } // Creates a key specified by pszSubKey - you can't create // keys directly under HKEY_LOCAL_MACHINE in Windows NT or 2000 // just for an extra bit of info. bool CRegistry::CreateKey(HKEY hKeyRoot, LPCTSTR pszSubKey) { HKEY hKey; DWORD dwFunc; LONG lRet; lRet = RegCreateKeyEx( hKeyRoot, pszSubKey, 0, (LPTSTR)NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, (LPSECURITY_ATTRIBUTES)NULL, &hKey, &dwFunc ); if (lRet == ERROR_SUCCESS) { RegCloseKey(hKey); hKey = (HKEY)NULL; return true; } SetLastError((DWORD)lRet); return false; } bool CRegistry::DeleteKey(HKEY hKeyRoot, LPCTSTR pszSubKey) { DWORD dwRet = ERROR_SUCCESS; if (IsWinNTor2K()) { // WinNT/2K will not allow you to delete keys which have // subkeys/values inside them. MS's platform SDK tells you // to use the SHDeleteKey function in shlwapi.dll. This dll // is not available on NT platforms without IE 4.0 or later. // Because of this I first attempt to delete the key in the // hope that it is empty. If that is not possible I load shlwapi // and call the function in that. This prevents the app bombing // out if the dll can't be found. if (RegDeleteKey(hKeyRoot, pszSubKey) != ERROR_SUCCESS) { HINSTANCE hLibInst = LoadLibrary(_T("shlwapi.dll")); if (!hLibInst) { throw ERROR_NO_SHLWAPI_DLL; } #if defined(UNICODE) || defined(_UNICODE) SHDELKEYPROC DeleteKeyRecursive = (SHDELKEYPROC)GetProcAddress(hLibInst, "SHDeleteKeyW"); #else SHDELKEYPROC DeleteKeyRecursive = (SHDELKEYPROC)GetProcAddress(hLibInst, "SHDeleteKeyA"); #endif if (!DeleteKeyRecursive) { FreeLibrary(hLibInst); throw ERROR_NO_SHDELETEKEY; } dwRet = DeleteKeyRecursive(hKeyRoot, pszSubKey); FreeLibrary(hLibInst); } } else { // Windows 9x will allow RegDeleteKey to delete keys // even if they have subkeys/values. dwRet = RegDeleteKey(hKeyRoot, pszSubKey); } if (dwRet == ERROR_SUCCESS) return true; SetLastError(dwRet); return false; } // Deletes a value from a given subkey and root bool CRegistry::DeleteValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue) { HKEY hKey; LONG lRes; if ((lRes = RegOpenKeyEx(hKeyRoot, pszSubKey, 0, KEY_SET_VALUE, &hKey)) != ERROR_SUCCESS) { SetLastError((DWORD)lRes); return false; } lRes = RegDeleteValue(hKey, pszValue); RegCloseKey(hKey); if (lRes == ERROR_SUCCESS) return true; SetLastError(lRes); return false; } // Fetch a binary value. If the size specified by rdwSize is too small, rdwSize will // be set to the correct size. bool CRegistry::GetBinaryValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, PVOID pBuffer, DWORD& rdwSize) { HKEY hKey; DWORD dwType = REG_BINARY; DWORD dwSize = rdwSize; LONG lRes = 0; if ((lRes = RegOpenKeyEx(hKeyRoot, pszSubKey, 0, KEY_READ, &hKey)) != ERROR_SUCCESS) { SetLastError((DWORD)lRes); return false; } lRes = RegQueryValueEx(hKey, pszValue, 0, &dwType, (LPBYTE)pBuffer, &dwSize); rdwSize = dwSize; RegCloseKey(hKey); if (lRes != ERROR_SUCCESS) { SetLastError(lRes); return false; } if (dwType != REG_BINARY) { throw ERROR_WRONG_TYPE; } return true; } // Fetch a little endian DWORD from the registry (see platform SDK "Registry Value Types") bool CRegistry::GetDWORDValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, DWORD &rdwBuff) { HKEY hKey; DWORD dwType = REG_DWORD; DWORD dwSize = sizeof(DWORD); DWORD dwValue = 0; LONG lRes; rdwBuff = 0; if ((lRes = RegOpenKeyEx(hKeyRoot, pszSubKey, 0, KEY_READ, &hKey)) != ERROR_SUCCESS) { SetLastError(lRes); return false; } lRes = RegQueryValueEx(hKey, pszValue, 0, &dwType, (LPBYTE) & dwValue, &dwSize); RegCloseKey(hKey); if (dwType != REG_DWORD) throw ERROR_WRONG_TYPE; if (lRes != ERROR_SUCCESS) { SetLastError(lRes); return false; } rdwBuff = dwValue; return true; } // Retrieve a string value. If the given buffer for the string is too small (specified // by rdwSize), rdwSize is increased to the correct value. If the buffer is bigger than // the retrieved string, rdwSize is set to the length of the string (in bytes) including // the terminating null. bool CRegistry::GetStringValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, LPTSTR pszBuffer, DWORD& rdwSize) { HKEY hKey; DWORD dwType = REG_SZ; LONG lRes; DWORD dwBufferSize = rdwSize; if (!pszBuffer) throw ERROR_INVALID_BUFFER; if ((lRes = RegOpenKeyEx(hKeyRoot, pszSubKey, 0, KEY_READ, &hKey)) != ERROR_SUCCESS) { SetLastError(lRes); return false; } lRes = RegQueryValueEx(hKey, pszValue, NULL, &dwType, (unsigned char*)pszBuffer, &dwBufferSize); RegCloseKey(hKey); rdwSize = dwBufferSize; if (dwType != REG_SZ) throw ERROR_WRONG_TYPE; if (lRes != ERROR_SUCCESS) { SetLastError(lRes); return false; } return true; } // Writes a binary value to the registry bool CRegistry::SetBinaryValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, PVOID pData, DWORD dwSize) { HKEY hKey; LONG lRes = 0; if ((lRes = RegOpenKeyEx(hKeyRoot, pszSubKey, 0, KEY_WRITE, &hKey)) != ERROR_SUCCESS) { SetLastError(lRes); return false; } lRes = RegSetValueEx(hKey, pszValue, 0, REG_BINARY, reinterpret_cast(pData), dwSize); RegCloseKey(hKey); if (lRes != ERROR_SUCCESS) { SetLastError(lRes); return false; } return true; } // Writes a DWORD value to the registry bool CRegistry::SetDWORDValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, DWORD dwValue) { HKEY hKey; LONG lRes; if ((lRes = RegOpenKeyEx(hKeyRoot, pszSubKey, 0, KEY_WRITE, &hKey)) != ERROR_SUCCESS) { SetLastError(lRes); return false; } lRes = RegSetValueEx(hKey, pszValue, 0, REG_DWORD, reinterpret_cast(&dwValue), sizeof(DWORD)); RegCloseKey(hKey); if (lRes != ERROR_SUCCESS) { SetLastError(lRes); return false; } return true; } // Writes a string to the registry. bool CRegistry::SetStringValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, LPCTSTR pszString) { HKEY hKey; LONG lRes; DWORD dwSize = lstrlen(pszString) * sizeof(TCHAR); if ((lRes = RegOpenKeyEx(hKeyRoot, pszSubKey, 0, KEY_WRITE, &hKey)) != ERROR_SUCCESS) { SetLastError(lRes); return false; } lRes = RegSetValueEx(hKey, pszValue, 0, REG_SZ, (BYTE*)(pszString), dwSize); RegCloseKey(hKey); if (lRes != ERROR_SUCCESS) { SetLastError(lRes); return false; } return true; } tora-2.1.3/src/windows/Makefile0000644000175000017500000000623011270353513016172 0ustar michaelmichael # BEGIN_COMMON_COPYRIGHT_HEADER # # TOra - An Oracle Toolkit for DBA's and developers # # Shared/mixed copyright is held throughout files in this product # # Portions Copyright (C) 2000-2001 Underscore AB # Portions Copyright (C) 2003-2005 Quest Software, Inc. # Portions Copyright (C) 2004-2009 Numerous Other Contributors # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; only version 2 of # the License is valid for this program. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception, you have permission to link this program # with the Oracle Client libraries and distribute executables, as long # as you follow the requirements of the GNU GPL in regard to all of the # software in the executable aside from Oracle client libraries. # # Specifically you are not permitted to link this program with the # Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. # And you are not permitted to distribute binaries compiled against # these libraries. # # You may link this product with any GPL'd Qt library. # # All trademarks belong to their respective owners. # # END_COMMON_COPYRIGHT_HEADER # This script only compiles the resources and windows classes in this directory # C++ Compiler to use GCC=g++ # Windows resource compiler RC=windres # Additional defines DEFINES=-D_WIN32 # Additional includes needed to compile program INCLUDES= # Comment out this line if you want more output from compile .SILENT: # Additional flags set when using only the precompiler. CPPFLAGS_GLOB= # Additional flags set when compiling. CFLAGS_GLOB=-g -O3 -W -Wall -c -w -fno-rtti ############################################################################ # # End of configuration part of Makefile # ############################################################################ SOURCES=\ cregistry.cpp RESOURCES=\ tora.rc default: all CPPFLAGS=$(CPPFLAGS_GLOB) $(DEFINES) $(INCLUDES) CFLAGS=$(CFLAGS_GLOB) $(INCLUDES) $(DEFINES) OBJECTS=$(filter %.o,$(SOURCES:%.cpp=%.o)) $(filter %.o,$(RESOURCES:%.rc=%.o)) DEPENDS=$(filter %.d,$(SOURCES:%.cpp=.depends/%.d)) vpath %.h $(INCLUDE) .PHONY: all clean all: $(OBJECTS) %.moc: %.h @echo Metacompiling $< $(MOC) -o $@ $< %.o: %.rc @echo Compiling resources $< $(RC) -o $@ $< %.o: %.cpp @echo Compiling $< $(GCC) $(CFLAGS) -o $@ -c $< include $(DEPENDS) .depends/%.d: %.cpp @echo Making dependencies for $< if [ ! -d .depends ] ; then mkdir -p .depends ; fi $(GCC) -MM -MG $(CPPFLAGS) $< > $@.tmp && \ ( sed "s/^\(.*\.\)o\([ :]*\)/\1o \ $(subst /,\\/,$@)\2/g" < $@.tmp > $@ ; rm -f $@.tmp ) clean: @echo Cleaning $(TITLE) -rm -rf *.o tora-2.1.3/src/windows/installer/0000755000175000017500000000000011445450571016534 5ustar michaelmichaeltora-2.1.3/src/windows/installer/tora.nsi0000644000175000017500000000541411360161103020202 0ustar michaelmichael; TOra.nsi ; ; This script is a basic TOra installer: it remembers the directory, ; has uninstall support and (optionally) installs start menu shortcuts. ; ; It will install TOra into a directory that the user selects, ;-------------------------------- ; The name of the installer Name "TOra" ; The file to write OutFile "TOra Installer.exe" ; The default installation directory InstallDir "$PROGRAMFILES\Tora" ; Registry key to check for directory (so if you install again, it will ; overwrite the old one automatically) InstallDirRegKey HKCU "Software\Tora" "Install_Dir" ;-------------------------------- ; Pages Page components Page directory Page instfiles UninstPage uninstConfirm UninstPage instfiles ;-------------------------------- ; The stuff to install Section "Tora (required)" SectionIn RO ; Set output path to the installation directory. SetOutPath $INSTDIR ; Put file there File /r files\*.* ; Write the installation path into the registry WriteRegStr HKCU "Software\Tora" "Install_Dir" "$INSTDIR" ; Write the uninstall keys for Windows WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tora" "DisplayName" "TOra" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tora" "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tora" "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tora" "NoRepair" 1 WriteUninstaller "uninstall.exe" SectionEnd ; Optional section (can be disabled by the user) Section "Start Menu Shortcuts" CreateDirectory "$SMPROGRAMS\Tora" CreateShortCut "$SMPROGRAMS\Tora\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0 CreateShortCut "$SMPROGRAMS\Tora\TOra.lnk" "$INSTDIR\tora.exe" "" "$INSTDIR\tora.exe" 0 SectionEnd Section "Stub oci.dll" stub_section_id File oci\oci.dll SectionEnd Function .onInit SearchPath $1 "oci.dll" IfErrors +2 0 SectionSetFlags ${stub_section_id} 0 FunctionEnd ;-------------------------------- ; Uninstaller Section "Uninstall" ; Remove registry keys DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tora" ; Currently uninstaller preserves all the settings ; uncomment line below if you want otherwise ; DeleteRegKey HKCU "Software\Tora" ; Remove files from directories Delete $INSTDIR\*.* Delete $INSTDIR\sqldrivers\*.* Delete $INSTDIR\help\*.* Delete $INSTDIR\help\api\*.* Delete $INSTDIR\help\images\*.* ; Remove shortcuts, if any Delete "$SMPROGRAMS\Tora\*.*" ; Remove directories used RMDir "$SMPROGRAMS\Tora" RMDir "$INSTDIR\sqldrivers" RMDir "$INSTDIR\help\api" RMDir "$INSTDIR\help\images" RMDir "$INSTDIR\help" RMDir "$INSTDIR" SectionEnd tora-2.1.3/src/windows/installer/tora-teradata.nsi0000644000175000017500000000575211411113466022000 0ustar michaelmichael; TOra.nsi ; ; This script is a basic TOra installer: it remembers the directory, ; has uninstall support and (optionally) installs start menu shortcuts. ; ; It will install TOra into a directory that the user selects, ;-------------------------------- ; The name of the installer Name "TOra" ; The file to write OutFile "TOra-ora11-td13-2.3.1.exe" ; The default installation directory InstallDir "$PROGRAMFILES\Tora" ; Registry key to check for directory (so if you install again, it will ; overwrite the old one automatically) InstallDirRegKey HKCU "Software\Tora" "Install_Dir" ;-------------------------------- ; Pages Page components Page directory Page instfiles UninstPage uninstConfirm UninstPage instfiles ;-------------------------------- ; The stuff to install Section "Tora (required)" SectionIn RO ; Set output path to the installation directory. SetOutPath $INSTDIR ; Put file there File /r files\*.* ; Write the installation path into the registry WriteRegStr HKCU "Software\Tora" "Install_Dir" "$INSTDIR" ; Required Teradata keys for gss. WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Teradata" "" "" WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Teradata\Teradata GSS" "InstallDir" "$PROGRAMFILES\Tora\" WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Teradata\Teradata GSS\nt-i386" "ClientCurrentVersion" "13.10.00.02" WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Teradata\Teradata GSS\nt-i386\13.10.00.02" "" "" ; Write the uninstall keys for Windows WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tora" "DisplayName" "TOra" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tora" "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tora" "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tora" "NoRepair" 1 WriteUninstaller "uninstall.exe" SectionEnd ; Optional section (can be disabled by the user) Section "Start Menu Shortcuts" CreateDirectory "$SMPROGRAMS\Tora" CreateShortCut "$SMPROGRAMS\Tora\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0 CreateShortCut "$SMPROGRAMS\Tora\TOra.lnk" "$INSTDIR\tora.exe" "" "$INSTDIR\tora.exe" 0 SectionEnd ;-------------------------------- ; Uninstaller Section "Uninstall" ; Remove registry keys DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tora" ; Currently uninstaller preserves all the settings ; uncomment line below if you want otherwise ; DeleteRegKey HKCU "Software\Tora" ; Remove files from directories Delete $INSTDIR\*.* Delete $INSTDIR\sqldrivers\*.* Delete $INSTDIR\help\*.* Delete $INSTDIR\help\api\*.* Delete $INSTDIR\help\images\*.* ; Remove shortcuts, if any Delete "$SMPROGRAMS\Tora\*.*" ; Remove directories used RMDir "$SMPROGRAMS\Tora" RMDir "$INSTDIR\sqldrivers" RMDir "$INSTDIR\help\api" RMDir "$INSTDIR\help\images" RMDir "$INSTDIR\help" RMDir "$INSTDIR" SectionEnd tora-2.1.3/src/windows/dummyoci/0000755000175000017500000000000011445450571016365 5ustar michaelmichaeltora-2.1.3/src/windows/dummyoci/oci_stub.c0000644000175000017500000000315211270353513020333 0ustar michaelmichael#define EXPORT __declspec(dllexport) /* These routine names were determined experimentally * by continually trying to run the executable until it stopped * complaining about missing entry points. Intent is solely to * provide a stub DLL to silence complaints about a missing oracle * install, not to provide any actual functionality. */ EXPORT void OCIBindByName(void) { } EXPORT void OCISvcCtxToLda(void) { } EXPORT void oopen(void) { } EXPORT void oparse(void) {} EXPORT void oclose(void) {} EXPORT void OCILdaToSvcCtx(void) { } EXPORT void OCILobTrim(void) { } EXPORT void OCILobIsOpen(void) { } EXPORT void OCILobClose(void) { } EXPORT void OCILobLocatorIsInit(void) { } EXPORT void OCILobRead(void) { } EXPORT void OCILobGetLength(void) { } EXPORT void OCITransRollback(void) { } EXPORT void OCIParamGet(void) { } EXPORT void OCIStmtFetch(void) { } EXPORT void OCIStmtPrepare(void) { } EXPORT void OCIStmtExecute(void) { } EXPORT void OCIAttrGet(void) { } EXPORT void OCILobWrite(void) { } EXPORT void OCIDescriptorAlloc(void) { } EXPORT void OCIDateTimeConstruct(void) { } EXPORT void OCIDescriptorFree(void) { } EXPORT void OCITransCommit(void) { } EXPORT void OCIErrorGet(void) { } EXPORT void OCISessionEnd(void) { } EXPORT void OCIServerDetach(void) { } EXPORT void OCIHandleFree(void) { } EXPORT void OCIPasswordChange(void) { } EXPORT void OCISessionBegin(void) { } EXPORT void OCIEnvCreate(void) { } EXPORT void OCIHandleAlloc(void) { } EXPORT void OCIServerAttach(void) { } EXPORT void OCIAttrSet(void) { } EXPORT void OCIBreak(void) { } EXPORT void OCIDefineByPos(void) { } tora-2.1.3/src/windows/dummyoci/oci_nonstub.c0000644000175000017500000000000011270353513021033 0ustar michaelmichaeltora-2.1.3/src/windows/dummyoci/Makefile0000644000175000017500000000033311270353513020016 0ustar michaelmichaelall: oci.dll install oci.dll: oci_stub.c oci_nonstub.c cl oci_stub.c oci_nonstub.c /link /DLL /out:oci.dll install: copy oci.dll c:\build\tora-build\release\oci.dll clean: del *~ *.exp *.obj *.dll *.lib tora-2.1.3/src/windows/resource.h0000755000175000017500000000066411270353513016542 0ustar michaelmichael//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by tora.rc // #define ID_MAIN 128 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 105 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 102 #endif #endif tora-2.1.3/src/windows/cregistry.h0000755000175000017500000000355211270353513016725 0ustar michaelmichael// Registry Access class (updated) by David Overton (david@insomniavisions.com) // Proper errors are available in this version. The functions call // SetLastError if it is a standard windows error. The user defined // errors shown below are exceptions. Catch them as shown here: // try { // pRegistry->SetDWORDValue(...); // whatever // } // catch(unsigned int error) { // // error is one of the error codes defined below // } #if !defined(__CRegistry_H_) #define __CRegistry_H_ #define WIN32_LEAN_AND_MEAN #include #include #include const unsigned int ERROR_WRONG_TYPE = 0x01; // Wrong type of data const unsigned int ERROR_BUFFER_SIZE = 0x02; // Buffer too small const unsigned int ERROR_NO_SHLWAPI_DLL = 0x03; // Only under NT if shlwapi.dll doesn't exist const unsigned int ERROR_INVALID_BUFFER = 0x04; // Occurs if buffer invalid (ie no buffer) const unsigned int ERROR_NO_SHDELETEKEY = 0x05; // Occurs in NT if no SHDeleteKey fn in shlwapi.dll typedef DWORD (__stdcall* SHDELKEYPROC)(HKEY, LPCTSTR); class CRegistry { bool IsWinNTor2K(); public: bool CreateKey(HKEY hKeyRoot, LPCTSTR pszSubKey); bool DeleteKey(HKEY hKeyRoot, LPCTSTR pszSubKey); bool DeleteValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue); bool GetBinaryValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, PVOID pData, DWORD& rdwSize); bool GetDWORDValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, DWORD& rdwBuff); bool GetStringValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, LPTSTR pszBuffer, DWORD& rdwSize); bool SetBinaryValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, PVOID pData, DWORD dwSize); bool SetDWORDValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, DWORD dwValue); bool SetStringValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, LPCTSTR pszString); }; #endif tora-2.1.3/src/windows/config.h0000644000175000017500000001751011270353513016153 0ustar michaelmichael/* config.h. Generated by configure. */ /* config.h.in. Generated from configure.in by autoheader. */ /* Define to 1 if the `closedir' function returns void instead of `int'. */ /* #undef CLOSEDIR_VOID */ /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ /* #undef CRAY_STACKSEG_END */ /* Define to 1 if using `alloca.c'. */ /* #undef C_ALLOCA */ /* Define to 1 if you have `alloca', as a function or macro. */ #define HAVE_ALLOCA 1 /* Define to 1 if you have and it should be used (not on Ultrix). */ #define HAVE_ALLOCA_H 1 /* Define if you have the CoreAudio API */ /* #undef HAVE_COREAUDIO */ /* Define to 1 if you have the header file. */ /* #undef HAVE_CRT_EXTERNS_H */ /* Defines if your system has the crypt function */ /* #undef HAVE_CRYPT */ /* Define to 1 if you have the header file, and it defines `DIR'. */ #define HAVE_DIRENT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you have the header file. */ #define HAVE_FCNTL_H 1 /* Define if you have a STL implementation by HP */ /* #undef HAVE_HP_STL */ /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define if you have libjpeg */ #define HAVE_LIBJPEG 1 /* Define to 1 if you have the `pcre' library (-lpcre). */ #define HAVE_LIBPCRE 1 /* Define if you have libpng */ #define HAVE_LIBPNG 1 /* Define if you have a working libpthread */ #define HAVE_LIBPTHREAD 1 /* Define if you have libz */ #define HAVE_LIBZ 1 /* Define to 1 if you have the header file. */ #define HAVE_LOCALE_H 1 /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #define HAVE_MALLOC 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the header file, and it defines `DIR'. */ /* #undef HAVE_NDIR_H */ /* Define if your system needs _NSGetEnviron to set up the environment */ /* #undef HAVE_NSGETENVIRON */ /* Define to 1 if you have the header file. */ /* #undef HAVE_PTHREAD_LINUXTHREADS_PTHREAD_H */ /* Define to 1 if you have the `putenv' function. */ #define HAVE_PUTENV 1 /* Define if you have the res_init function */ /* #undef HAVE_RES_INIT */ /* Define to 1 if you have the `setenv' function. */ #define HAVE_SETENV 1 /* Define if you have a STL implementation by SGI */ #define HAVE_SGI_STL 1 /* Define to 1 if you have the `snprintf' function. */ #define HAVE_SNPRINTF 1 /* Define to 1 if stdbool.h conforms to C99. */ #define HAVE_STDBOOL_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the `strdup' function. */ #define HAVE_STRDUP 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if `st_blocks' is member of `struct stat'. */ #define HAVE_STRUCT_STAT_ST_BLOCKS 1 /* Define to 1 if your `struct stat' has `st_blocks'. Deprecated, use `HAVE_STRUCT_STAT_ST_BLOCKS' instead. */ #define HAVE_ST_BLOCKS 1 /* Define to 1 if you have the header file, and it defines `DIR'. */ /* #undef HAVE_SYS_DIR_H */ /* Define to 1 if you have the header file. */ /* #undef HAVE_SYS_MKDEV_H */ /* Define to 1 if you have the header file, and it defines `DIR'. */ /* #undef HAVE_SYS_NDIR_H */ /* Define to 1 if you have the header file. */ #define HAVE_SYS_PARAM_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_SYSMACROS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TIME_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_TIME_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UTIME_H 1 /* Define to 1 if you have the `vsnprintf' function. */ #define HAVE_VSNPRINTF 1 /* Define if you want Xinerama support */ /* #undef HAVE_XINERAMA */ /* Define to 1 if the system has the type `_Bool'. */ #define HAVE__BOOL 1 /* Suffix for lib directories */ #define KDELIBSUFF "" /* Define to 1 if `major', `minor', and `makedev' are declared in . */ /* #undef MAJOR_IN_MKDEV */ /* Define to 1 if `major', `minor', and `makedev' are declared in . */ /* #undef MAJOR_IN_SYSMACROS */ /* Name of package */ #define PACKAGE "tora" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "" /* Define to the version of this package. */ #define PACKAGE_VERSION "" /* The size of a `char', as computed by sizeof. */ /* #undef SIZEOF_CHAR */ /* The size of a `char *', as computed by sizeof. */ /* #undef SIZEOF_CHAR_P */ /* The size of a `int', as computed by sizeof. */ /* #undef SIZEOF_INT */ /* The size of a `long', as computed by sizeof. */ /* #undef SIZEOF_LONG */ /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ /* #undef STACK_DIRECTION */ /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define to 1 if you can safely include both and . */ #define TIME_WITH_SYS_TIME 1 /* Define to 1 if your declares `struct tm'. */ /* #undef TM_IN_SYS_TIME */ /* True if using monolithic build. */ #define TOMONOLITHIC 1 /* Define if you have putenv */ #define HAVE_SETENV 0 /* Define if compiled against Oracle Instant Client */ /* #undef TO_INSTANT_CLIENT */ /* Define if you have KDE. */ /* #undef TO_KDE */ /* Define if you do _not_ have Oracle. */ /* #undef TO_NO_ORACLE */ /* Version number of package */ #define TOVERSION "1.3.22svn" /* Define to 1 if the X Window System is missing or not being used. */ /* #undef X_DISPLAY_MISSING */ /* * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system * headers and I'm too lazy to write a configure test as long as only * unixware is related */ #ifdef _UNIXWARE #define HAVE_BOOLEAN #endif /* * AIX defines FD_SET in terms of bzero, but fails to include * that defines bzero. */ #if defined(_AIX) #include #endif /* * On HP-UX, the declaration of vsnprintf() is needed every time ! */ #if !defined(HAVE_VSNPRINTF) || defined(hpux) #if __STDC__ #include #include #else #include #endif #ifdef __cplusplus extern "C" #endif int vsnprintf(char *str, size_t n, char const *fmt, va_list ap); #ifdef __cplusplus extern "C" #endif int snprintf(char *str, size_t n, char const *fmt, ...); #endif #if defined(__SVR4) && !defined(__svr4__) #define __svr4__ 1 #endif /* Compatibility define */ /* #undef ksize_t */ /* Define to rpl_malloc if the replacement function should be used. */ /* #undef malloc */ /* Define to `unsigned' if does not define. */ /* #undef size_t */ /* Define the real type of socklen_t */ /* #undef socklen_t */ tora-2.1.3/src/windows/tora.ico0000755000175000017500000000206611270353513016201 0ustar michaelmichael &(( @f`fffff`fff`ffffff`fv`fxvof`vho`h`gfgfvowhwfvhfvo`o`gfh`hffgffg?????????( ffpxpwpxw????tora-2.1.3/src/windows/CMakeLists.txt0000644000175000017500000000056011270353513017272 0ustar michaelmichaelINCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/src/windows/ ) # SET(WINDOWS_MOC_CLASSES # ) SET(WINDOWS_LIB_SOURCES cregistry.h resource.h cregistry.cpp tora.ico tora.rc ) # QT4_WRAP_CPP(WINDOWS_MOC_SOURCES ${WINDOWS_MOC_CLASSES}) SET(WINDOWS_LIB "windows_lib") ADD_LIBRARY(${WINDOWS_LIB} STATIC ${WINDOWS_LIB_SOURCES} )#${WINDOWS_MOC_SOURCES}) tora-2.1.3/src/windows/tora.rc0000755000175000017500000000431611270353513016033 0ustar michaelmichael//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // //#include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 //LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. ID_MAIN ICON DISCARDABLE "tora.ico" ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_DIALOG1, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 179 TOPMARGIN, 7 BOTTOMMARGIN, 88 END END #endif // APSTUDIO_INVOKED #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Swedish resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_SVE) #ifdef _WIN32 //LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // Swedish resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED tora-2.1.3/src/totool.h0000644000175000017500000003227111270353625014541 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOTOOL_H #define TOTOOL_H #include "config.h" #include "toconfiguration.h" #include #include #include #include #include #include class toConnection; class toTimer; /** * Abstract baseclass for tools. * * This class is the baseclass of all classes defining tools. It * contains functions for defining the priority and name of the tool, * as well as virtual functions to define it's place in the user * interface. Further it contains methods to access configuration * settings. * * To use this class you create a child which is then instantiated once * which inserts that tool in the global tool map (See @ref tools). You * should never delete a tool unless on exit. Usually tools are instantiated * statically in the global scope. */ class toTool : public QObject { Q_OBJECT private: /** * Name of the tool. */ QString Name; /** * Key of the tool, this is used for sorting. */ QString Key; /** * Priority, used to determine in which order the tools should be listed. */ int Priority; /** * A map of @ref Key to tools. Used to keep track of the different tools * available. */ static std::map *Tools; /** * Contain the pixmap of this tool if any. Used for the toolbar and menu entries. */ QPixmap *ButtonPicture; /** * For inserting into menus and toolbars. * */ QAction *toolAction; protected: /** * Should return the xpm used to create the @ref ButtonPicture. */ virtual const char **pictureXPM(void); public: /** * Get the name. * * @return Name of tool. */ QString name() const { return Name; } /** * Get the name. * * @return Name of tool. */ QString key() const { return Key; } /** * Get the priority. * * @return Priority of tool. */ int priority() const { return Priority; } /** * This should never be called, but if it is. Erases the tool from the list of * available tools. WARNING: It will not remove any of it's open tools. */ ~toTool(); /** * Create a tool. Remember that usually the main window is not created here. * * @param priority Priority of the created tool. * @param name Name of tool. */ toTool(int priority, const char *name); /** * Get the image to display in the toolbar. * * @return Pointer to image in toolbar or NULL if no image should be displayed. */ virtual const QPixmap *toolbarImage(); /** * Get the name of the menuitem to be displayed in the menu. * * @return A string containing the name of the menuentry or NULL if no menuentry should * be created. */ virtual const char *menuItem() { return NULL; } /** * Get toolbar tip of the toolbar button. Defaults to same as @ref menuItem. * * @return Toolbar tip string. */ virtual const char *toolbarTip() { return menuItem(); } /** Check if the tool can handle a specific connection. Default is to only handle * connections from the provider Oracle. * @return True if connection can be handled. */ virtual bool canHandle(toConnection &conn); /** * This function is called as a last step after the main widget is created. It could * be used to insert the tool pretty much anywhere in the user interface if the toolmenu, * toolbar is not sufficient. * */ virtual void customSetup(); /** * Create a new tool window. See toToolWidget documentation for * exact tool vs. MDI windows handling. * * @param parent Parent window, which is the worksheet of the main window. * @param connection The database connection that this tool should operate on. */ virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) = 0; /** * Create and return configuration tab for this tool. The returned widget should also * be a childclass of @ref toSettingTab. * * @return A pointer to the widget containing the setup tab for this tool or NULL of * no settings are available. */ virtual QWidget *configurationTab(QWidget *parent); /** Display an about dialog for this tool. * @param parent The parent widget of the about dialog. */ virtual void about(QWidget *parent); /** Indicate whether or not this tool has an about dialog. */ virtual bool hasAbout(void) { return false; } /** * Get access to the map of tools. Don't modify it. Observe that the index string is not * the name of the tool but an internal key used to get tools sorted in the correct * priority order. * * @see Tools * @return A reference to the tool map. */ static std::map &tools(void) { if (!Tools) Tools = new std::map; return *Tools; } /** * Get a pointer to the tool with a specified key. * * @see Tools * @return A pointer to the tool or NULL if tool doesn't exist. */ static toTool *tool(const QString &key); /** * Get tool specific settings. * * Setting names are hierachical separated by ':' instead of '/' usually used * in filenames. As an example all settings for the tool 'Example' would be * under the 'Example:{settingname}' name. * * @param tag The name of the configuration setting. * @param def Contents of this setting. */ // const QString &config(const QString &tag, const QString &def); /** * Change toolspecific setting. Depending on the implementation this can change the * contents on disk or not. * * Setting names are hierachical separated by ':' instead of '/' usually used * in filenames. As an example all settings for the tool 'Example' would be * under the 'Example:{settingname}' name. * * @param tag The name of the configuration setting. * @param def Default value of the setting, if it is not available. */ // void setConfig(const QString &tag, const QString &value); virtual void closeWindow(toConnection &connection) = 0; /** * Get the tool's QAction object * */ QAction* getAction(void); /** * Enable/disable tool's QAction * */ void enableAction(bool en) { getAction()->setEnabled(en); } /** * Enable/disable tool's QAction if tool can support conn. * */ void enableAction(toConnection &conn) { enableAction(canHandle(conn)); } /** * Set action visibility if tool can support toConnection * provider. * */ void setActionVisible(toConnection &conn) { getAction()->setVisible(canHandle(conn)); } /** * Set action visibility if tool can support toConnection * provider. * */ void setActionVisible(bool en) { getAction()->setVisible(en); } public slots: /** * Create a window of the current tool. This function sets up a toolwindow for * this tool. It calls the @ref toolWindow function to get widget and sets it * up properly. */ QWidget* createWindow(void); }; #include "tohelp.h" /** * Abstract baseclass for widgets defining tool settings. */ class toSettingTab : public toHelpContext { public: /** * Default constructor. * @param ctx Help context for this setting tab. */ toSettingTab(const QString &ctx) : toHelpContext(ctx) { } /** * This function is called to save the contents of the widget when * a user has pressed the ok button of the dialog. It should simply * save the values in the dialog to the appropriate configuration * entry using the @ref toTool::setConfig function. */ virtual void saveSetting(void) = 0; }; /** This class is used to hold connections for @ref toResult classes. * Must be multiply inherited by a widget otherwise it will go kaboom. * It will dynamic cast itself to a QWidget from time to time so if that * doesn't resolve correctly it will not work. */ class toConnectionWidget { toConnection *Connection; QWidget *Widget; public: /** Constructor with the connection it should be set to initially. */ toConnectionWidget(toConnection &conn, QWidget *widget); /** Constructor without a connection. Will inherit the connection from a parent connection widget. */ toConnectionWidget(QWidget *widget); /** Destructor. */ virtual ~toConnectionWidget(); /** Change connection of the widget. */ virtual void setConnection(toConnection &conn); /** Get the connection it is pointed to. */ virtual toConnection &connection(); }; /** Simple baseclass for widgets defining the main tool widget. It is in * no way mandatory and all it does is register the widget in the connetion. * * Tools are common QWidget based objects. The main window - the MDI area - * requires them wrapped as QMdiSubWindows. So the tool widget is set as widget() * in the toToolWidget constructor. * * \note: Note that all access to tool widget is done via QMdiSubWindow::widget() in * the code. See all available tools' windowActivated() slots for examples. * * \warning Remember that windowActivated() slot called by toMainWidget()->workspace(), * SIGNAL(subWindowActivated(QMdiSubWindow *) has to handle "0" as input parameter * so an appropriate test is mandatory. */ class toToolWidget : public QWidget, public toHelpContext, public toConnectionWidget { Q_OBJECT toTimer *Timer; toTool &Tool; private slots: void parentConnection(void); signals: /** Emitted when the connection is changed. */ void connectionChange(void); public: /** Create widget and its QMdiSubWindow. * @param ctx Help context for this tool. * @param parent Parent widget. * @param conn Connection of widget. * @param name Name of widget. */ toToolWidget(toTool &tool, const QString &ctx, QWidget *parent, toConnection &conn, const char *name = NULL); ~toToolWidget(); /** Get the current connection. * @return Reference to connection. */ toConnection &connection() { return toConnectionWidget::connection(); } /** Get the tool for this tool widget. * @return Reference to a tool object. */ toTool &tool(void) { return Tool; } /** Check if this tool can handle a specific connection. * @param provider Name of connection. * @return True if connection is handled. */ virtual bool canHandle(toConnection &conn) { return Tool.canHandle(conn); } /** Change connection of tool. */ void setConnection(toConnection &conn); /** Get timer of tool. Used by some results to get update time. * @return Pointer to a timer object. */ toTimer *timer(void); /** Export data to a map. * @param data A map that can be used to recreate the data of a chart. * @param prefix Prefix to add to the map. */ virtual void exportData(std::map &data, const QString &prefix); /** Import data * @param data Data to read from a map. * @param prefix Prefix to read data from. */ virtual void importData(std::map &data, const QString &prefix); }; #endif tora-2.1.3/src/toparamget.cpp0000644000175000017500000003437711270353625015730 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "tohelp.h" #include "tomemoeditor.h" #include "toparamget.h" #include "totool.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include std::map > toParamGet::DefaultCache; std::map > toParamGet::Cache; toParamGet::toParamGet(QWidget *parent, const char *name) : QDialog(parent), toHelpContext(QString::fromLatin1("common.html#param")) { setModal(true); toHelp::connectDialog(this); resize(500, 480); setWindowTitle(tr("Define binding variables")); QHBoxLayout *hlayout = new QHBoxLayout; // for buttons on right QWidget *vbox = new QWidget; QVBoxLayout *vlayout = new QVBoxLayout; View = new QScrollArea(this); View->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); hlayout->addWidget(View); // a widget to set as central to scroll area QWidget *ext = new QWidget(View); View->setWidget(ext); View->setWidgetResizable(true); Container = new QGridLayout; Container->setSpacing(10); ext->setLayout(Container); QPushButton *OkButton = new QPushButton("OkButton", this); OkButton->setText(tr("&Ok")); OkButton->setDefault(true); vlayout->addWidget(OkButton); QPushButton *CancelButton = new QPushButton("CancelButton", this); CancelButton->setText(tr("Cancel")); CancelButton->setDefault(false); vlayout->addWidget(CancelButton); QSpacerItem* spacer = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding); vlayout->addItem(spacer); connect(OkButton, SIGNAL(clicked()), this, SLOT(accept())); connect(CancelButton, SIGNAL(clicked()), this, SLOT(reject())); vbox->setLayout(vlayout); hlayout->addWidget(vbox); setLayout(hlayout); } toQList toParamGet::getParam(toConnection &conn, QWidget *parent, QString &str, bool interactive) { std::map parameters; std::list names; toParamGet *widget = NULL; enum { afterName, inString, normal, comment, multiComment, name, specification, endInput } state; state = normal; QChar endString; QString fname; QString direction; QString res; QString def = QString::fromLatin1(""); int colon = 1; int num = 0; for (int i = 0; i < str.length() + 1; i++) { QChar c; QChar nc; QChar pc; c = nc = pc = '\n'; if (i < str.length()) c = str.at(i); if (i < str.length() - 1) nc = str.at(i + 1); if (i - 1 > 0) pc = str.at(i - 1); if (state == normal && c == '-' && nc == '-') state = comment; else if (state == normal && c == '/' && nc == '*') state = multiComment; else { switch (state) { case inString: if (c == endString) state = normal; break; case comment: if (c == '\n') state = normal; break; case multiComment: if (c == '*' && nc == '/') state = normal; break; case normal: switch (c.toLatin1()) { case '\'': case '\"': endString = c; state = inString; break; case ':': // ignore :: // this is a type cast for postgres, not a parameter. if (nc == ':' || pc == ':') break; if (nc != '=') state = name; direction = ""; fname = ""; break; case '?': fname = QString::fromLatin1("f"); fname += QString::number(colon); colon++; res += QString::fromLatin1(":"); res += fname; res += def.mid(0, def.length() - 1); c = def.at(def.length() - 1); break; } break; case name: if (c.isLetterOrNumber() || c == '_') { fname += c; break; } if (fname.isEmpty() && !toIsMySQL(conn)) { toStatusMessage(tr("Missing field name")); throw tr("Missing field name"); } state = afterName; case afterName: if (c == '<') state = specification; else { state = normal; res += def; } break; case specification: if (c == ',') state = endInput; else if (c == '>') state = normal; break; case endInput: if (c == '>') state = normal; else direction += c; break; } } if (state == normal && !fname.isEmpty()) { if (direction.isEmpty() || direction == "in" || direction == "inout") { if (!parameters[fname]) { parameters[fname] = true; if (!widget) widget = new toParamGet(parent); QLabel *id = new QLabel(fname, widget); widget->Container->addWidget(id, num, 0); QComboBox *edit = new QComboBox(widget); // to memo finds child by widget name (row) edit->setObjectName(QString::number(num)); edit->setEditable(true); edit->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); edit->setMinimumContentsLength(30); widget->Container->addWidget(edit, num, 1); QString defval; std::map >::iterator fnd = Cache.find(fname); if (fnd != Cache.end()) { for (std::list::iterator i = (*fnd).second.begin(); i != (*fnd).second.end(); i++) { if (edit->count() == 0) defval = *i; edit->addItem(*i); } } fnd = DefaultCache.find(fname); if (fnd != DefaultCache.end()) { for (std::list::iterator i = (*fnd).second.begin(); i != (*fnd).second.end(); i++) { if (edit->count() == 0) defval = *i; edit->addItem(*i); } } QCheckBox *box = new QCheckBox(tr("NULL"), widget); connect(box, SIGNAL(toggled(bool)), edit, SLOT(setDisabled(bool))); if (edit->count() > 0) { if (defval.isNull()) box->setChecked(true); } widget->Container->addWidget(box, num, 2); toParamGetButton *btn = new toParamGetButton( num, widget); btn->setText(tr("Edit")); connect(btn, SIGNAL(clicked(int)), widget, SLOT(showMemo(int))); connect(box, SIGNAL(toggled(bool)), btn, SLOT(setDisabled(bool))); widget->Container->addWidget(btn, num, 3); widget->Value.insert(widget->Value.end(), edit); names.insert(names.end(), fname); widget->Container->setRowMinimumHeight(num, 30); num++; } } fname = ""; } if (i < str.length()) res += c; } // for if (widget && num > 0) { // set edit column to stretch widget->Container->setColumnStretch(1, 1); // add widget at bottom of grid that can resize widget->Container->addWidget(new QLabel(widget), num, 0); widget->Container->setRowStretch(num, 1); } toQList ret; if (widget) { (*widget->Value.begin())->setFocus(); if (!interactive || widget->exec()) { std::list::iterator cn = names.begin(); for (std::list::iterator i = widget->Value.begin();i != widget->Value.end();i++) { QComboBox *current = *i; QString val; if (current) { if (current->isEnabled()) val = current->currentText(); else val = QString::null; } if (cn != names.end()) { std::list &lst = Cache[*cn]; for (std::list::iterator i = lst.begin();i != lst.end();i++) if ((*i) == val) { lst.erase(i); break; } lst.insert(lst.begin(), val); std::map >::iterator fnd = DefaultCache.find(*cn); if (fnd != DefaultCache.find(*cn)) for (std::list::iterator i = (*fnd).second.begin();i != (*fnd).second.end();i++) if ((*i) == val) { (*fnd).second.erase(i); break; } cn++; } ret.insert(ret.end(), val); } delete widget; } else { delete widget; toStatusMessage(tr("Aborted execution"), false, false); throw tr("Aborted execution"); } } str = res; return ret; } void toParamGet::setDefault(toConnection &, const QString &name, const QString &val) { std::map >::iterator fnd = Cache.find(name); if (fnd != Cache.end()) for (std::list::iterator i = (*fnd).second.begin();i != (*fnd).second.end();i++) if (val == *i) return ; std::list &lst = DefaultCache[name]; for (std::list::iterator i = lst.begin();i != lst.end();i++) if ((*i) == val) { lst.erase(i); break; } lst.insert(lst.begin(), val); } void toParamGet::showMemo(int row) { QComboBox *obj = findChild(QString::number(row)); if (obj) { toMemoEditor *memo = new toMemoEditor(this, obj->currentText(), row, 0, false, true); if (memo->exec()) obj->setItemText(obj->currentIndex(), memo->text()); } } tora-2.1.3/src/tosmtp.h0000644000175000017500000000541411270353625014546 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOSMTP_H #define TOSMTP_H #include "config.h" #include #include class QTcpSocket; class QTextStream; // Adapted from Qt smtp example. /** * Used to send mail asyncronously. Just create an instance and forget * it. It will delete itself when done. */ class toSMTP : public QObject { Q_OBJECT; public: /** Send an email. * @param from From field of email. * @param to To field of email header. * @param subject Subject of mail. * @param body Body of email message. */ toSMTP(const QString &from, const QString &to, const QString &subject, const QString &body); ~toSMTP(); private slots: void readyRead(); void connected(); private: enum state { Init, Mail, Rcpt, Data, Body, Quit, Close }; QString Message; QString From; QString Recipient; QTcpSocket *Socket; QTextStream *Stream; int State; QString Response; }; #endif tora-2.1.3/src/toworksheettext.cpp0000644000175000017500000000733511270353625017042 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "config.h" #include "toworksheettext.h" #include "utils.h" #include "toworksheet.h" #include #include #include toWorksheetText::toWorksheetText(toWorksheet *worksheet, QWidget *parent, const char *name) : toHighlightedText(parent, name), Worksheet(worksheet) { } bool toWorksheetText::editSave(bool askfile) { bool ret = toHighlightedText::editSave(askfile); Worksheet->setCaption(); return ret; } bool toWorksheetText::editOpen(QString suggestedFile) { int ret = 1; if (isModified()) { // grab focus so user can see file and decide to save setFocus(Qt::OtherFocusReason); ret = TOMessageBox::information( this, qApp->translate("toWorksheetText", "Save changes?"), qApp->translate( "toWorksheetText", "The editor has been changed. Do you want to save them,\n" "discard changes or open file in new worksheet?"), qApp->translate("toWorksheetText", "&Save"), qApp->translate("toWorksheetText", "&Discard"), qApp->translate("toWorksheetText", "&New worksheet"), 0); if (ret < 0) return false; else if (ret == 0) { if (!editSave(false)) return false; } } QString fname; if (suggestedFile != QString::null) fname = suggestedFile; else { QFileInfo file(filename()); fname = toOpenFilename(file.dir().path(), QString::null, this); } if (fname.isEmpty()) return false; try { if (ret == 2) toWorksheet::fileWorksheet(fname); else { openFilename(fname); Worksheet->setCaption(); } emit fileOpened(); emit fileOpened(fname); return true; } TOCATCH; return false; } tora-2.1.3/src/tomemoeditor.cpp0000644000175000017500000004256011361122016016252 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "tohighlightedtext.h" #include "tomarkedtext.h" #include "tomemoeditor.h" #include "toresultview.h" #include "tomain.h" #include #include #include #include #include #include #include #include #include #include #include "icons/commit.xpm" #include "icons/copy.xpm" #include "icons/wordwrap.xpm" #include "icons/cut.xpm" #include "icons/fileopen.xpm" #include "icons/filesave.xpm" #include "icons/forward.xpm" #include "icons/next.xpm" #include "icons/paste.xpm" #include "icons/previous.xpm" #include "icons/rewind.xpm" class toMemoText : public toMarkedText { toMemoEditor *MemoEditor; public: toMemoText(toMemoEditor *edit, QWidget *parent, const char *name = NULL) : toMarkedText(parent, name), MemoEditor(edit) { } virtual void keyPressEvent(QKeyEvent *e) { if (toCheckKeyEvent(e, QKeySequence(qApp->translate("toMemoEditor", "Ctrl+Return", "Memo Editor|Save changes")))) { MemoEditor->store(); e->accept(); } else { toMarkedText::keyPressEvent(e); } } }; class toMemoSQL : public toHighlightedText { toMemoEditor *MemoEditor; public: toMemoSQL(toMemoEditor *edit, QWidget *parent, const char *name = NULL) : toHighlightedText(parent, name), MemoEditor(edit) { } virtual void keyPressEvent(QKeyEvent *e) { if (toCheckKeyEvent(e, QKeySequence(qApp->translate("toMemoEditor", "Ctrl+Return", "Memo Editor|Save changes")))) { MemoEditor->store(); e->accept(); } else { toHighlightedText::keyPressEvent(e); } } }; void toMemoEditor::openFile(void) { Editor->editOpen(); } void toMemoEditor::saveFile(void) { Editor->editSave(true); } toMemoEditor::toMemoEditor(QWidget *parent, const QString &str, int row, int col, bool sql, bool modal, bool navigation) : QDialog(parent), Row(row), Col(col) { setModal(modal); setWindowTitle("Memo Editor"); QVBoxLayout *vbox = new QVBoxLayout; vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); setLayout(vbox); Toolbar = toAllocBar(this, tr("Memo Editor")); vbox->addWidget(Toolbar); if (sql) Editor = new toMemoSQL(this, this); else Editor = new toMemoText(this, this); vbox->addWidget(Editor); Editor->setReadOnly(Row < 0 || Col < 0 || listView()); Editor->setFocus(); QDialogButtonBox * buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); vbox->addWidget(buttonBox); connect(buttonBox, SIGNAL(rejected()), this, SLOT(close())); if (Row >= 0 && Col >= 0 && !listView()) { Toolbar->addAction(QIcon(QPixmap(const_cast(commit_xpm))), tr("Save changes"), this, SLOT(store(void))); Toolbar->addSeparator(); Toolbar->addAction(QIcon(QPixmap(const_cast(fileopen_xpm))), tr("Open file"), this, SLOT(openFile())); Toolbar->addAction(QIcon(QPixmap(const_cast(filesave_xpm))), tr("Save file"), this, SLOT(saveFile())); Toolbar->addSeparator(); QAction *act = Toolbar->addAction(QIcon(QPixmap(const_cast(cut_xpm))), tr("Cut to clipboard"), Editor, SLOT(cut())); connect(Editor, SIGNAL(copyAvailable(bool)), act, SLOT(setEnabled(bool))); act->setEnabled(false); } else { Toolbar->addAction(QIcon(QPixmap(const_cast(filesave_xpm))), tr("Save changes"), this, SLOT(saveFile(void))); Toolbar->addSeparator(); } QAction *act = Toolbar->addAction(QIcon(QPixmap(const_cast(copy_xpm))), tr("Copy to clipboard"), Editor, SLOT(copy())); connect(Editor, SIGNAL(copyAvailable(bool)), act, SLOT(setEnabled(bool))); act->setEnabled(false); QAction * WordWrapAct = new QAction(QIcon(QPixmap(const_cast(wordwrap_xpm))), tr("Word Wrap"), Toolbar); WordWrapAct->setCheckable(true); connect(WordWrapAct, SIGNAL(toggled(bool)), Editor, SLOT(setWordWrap(bool))); Toolbar->addAction(WordWrapAct); QAction * XMLWrapAct = new QAction(QIcon(":/icons/xmlwrap.png"), tr("XML Format"), Toolbar); XMLWrapAct->setCheckable(true); connect(XMLWrapAct, SIGNAL(toggled(bool)), Editor, SLOT(setXMLWrap(bool))); Toolbar->addAction(XMLWrapAct); if (Row >= 0 && Col >= 0 && !listView()) { Toolbar->addAction(QIcon(QPixmap(const_cast(paste_xpm))), tr("Paste from clipboard"), Editor, SLOT(paste())); } toListView *lst = listView(); if (lst || navigation) { Toolbar->addSeparator(); Toolbar->addAction(QIcon(QPixmap(const_cast(rewind_xpm))), tr("First column"), this, SLOT(firstColumn())); Toolbar->addAction(QIcon(QPixmap(const_cast(previous_xpm))), tr("Previous column"), this, SLOT(previousColumn())); Toolbar->addAction(QIcon(QPixmap(const_cast(next_xpm))), tr("Next column"), this, SLOT(nextColumn())); Toolbar->addAction(QIcon(QPixmap(const_cast(forward_xpm))), tr("Last column"), this, SLOT(lastColumn())); } Toolbar->addSeparator(); Null = new QCheckBox(tr("NULL"), Toolbar); Null->setObjectName(TO_TOOLBAR_WIDGET_NAME); Toolbar->addWidget(Null); connect(Null, SIGNAL(toggled(bool)), this, SLOT(null(bool))); Null->setEnabled(!Editor->isReadOnly()); Null->setFocusPolicy(Qt::StrongFocus); setText(str); Label = new QLabel(Toolbar); Label->setObjectName(TO_TOOLBAR_WIDGET_NAME); Label->setAlignment(Qt::AlignRight | Qt::AlignVCenter); Label->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum)); if (lst) { connect(parent, SIGNAL(currentChanged(toTreeWidgetItem *)), this, SLOT(changeCurrent(toTreeWidgetItem *))); Label->setText(QString::fromLatin1("") + lst->headerItem()->text(Col) + QString::fromLatin1("")); } Toolbar->addWidget(Label); readSettings(); connect(this, SIGNAL(finished(int)), this, SLOT(writeSettings())); if (!modal) show(); } void toMemoEditor::readSettings() { QSettings settings; settings.beginGroup("memoEditor"); resize(settings.value("size", QSize(400, 300)).toSize()); } void toMemoEditor::writeSettings() const { QSettings settings; settings.beginGroup("memoEditor"); settings.setValue("size", size()); } void toMemoEditor::setText(const QString &str) { Editor->setText(str); Null->setChecked(str.isNull()); Editor->setModified(false); } void toMemoEditor::null(bool nul) { Editor->setModified(true); Editor->setDisabled(nul); } QString toMemoEditor::text(void) { return Editor->text(); } void toMemoEditor::store(void) { if (Editor->isReadOnly()) return ; if (Editor->isModified()) { if (!Editor->isEnabled()) emit changeData(Row, Col, QString::null); else emit changeData(Row, Col, Editor->text()); } accept(); } void toMemoEditor::changePosition(int row, int cols) { if (Editor->isModified()) { if (!Editor->isEnabled()) emit changeData(Row, Col, QString::null); else emit changeData(Row, Col, Editor->text()); Editor->setModified(false); } toListView *lst = listView(); if (lst) Label->setText(QString::fromLatin1("") + lst->headerItem()->text(Col) + QString::fromLatin1("")); Row = row; Col = cols; } toListView *toMemoEditor::listView(void) { return dynamic_cast(parentWidget()); } void toMemoEditor::firstColumn(void) { toListView *lst = listView(); if (lst) { toTreeWidgetItem *cur = lst->currentItem(); if (!cur) return ; if (Col == 0) { toTreeWidgetItem *item = lst->firstChild(); toTreeWidgetItem *next = item; while (next && next != cur) { item = next; if (item->firstChild()) next = item->firstChild(); else if (item->nextSibling()) next = item->nextSibling(); else { next = item; do { next = next->parent(); } while (next && !next->nextSibling()); if (next) next = next->nextSibling(); } } lst->setCurrentItem(item); } else { Col = 0; Label->setText("" + lst->headerItem()->text(Col) + ""); toResultViewItem *resItem = dynamic_cast(cur); toResultViewCheck *chkItem = dynamic_cast(cur); if (resItem) setText(resItem->allText(Col)); else if (chkItem) setText(chkItem->allText(Col)); else setText(cur->text(Col)); } } } void toMemoEditor::previousColumn(void) { toListView *lst = listView(); if (lst) { toTreeWidgetItem *cur = lst->currentItem(); if (!cur) return ; if (Col == 0) { Col = lst->columns() - 1; toTreeWidgetItem *item = lst->firstChild(); toTreeWidgetItem *next = item; while (next && next != cur) { item = next; if (item->firstChild()) next = item->firstChild(); else if (item->nextSibling()) next = item->nextSibling(); else { next = item; do { next = next->parent(); } while (next && !next->nextSibling()); if (next) next = next->nextSibling(); } } if (item != cur) { lst->setCurrentItem(item); cur = NULL; } } else Col--; if (cur) { toResultViewItem *resItem = dynamic_cast(cur); toResultViewCheck *chkItem = dynamic_cast(cur); if (resItem) setText(resItem->allText(Col)); else if (chkItem) setText(chkItem->allText(Col)); else setText(cur->text(Col)); } Label->setText(QString::fromLatin1("") + lst->headerItem()->text(Col) + QString::fromLatin1("")); } } void toMemoEditor::nextColumn(void) { toListView *lst = listView(); if (lst) { toTreeWidgetItem *cur = lst->currentItem(); if (!cur) return ; if (Col == lst->columns() - 1) { Col = 0; toTreeWidgetItem *next = cur; if (cur->firstChild()) next = cur->firstChild(); else if (cur->nextSibling()) next = cur->nextSibling(); else { next = cur; do { next = next->parent(); } while (next && !next->nextSibling()); if (next) next = next->nextSibling(); } if (next) { lst->setCurrentItem(next); cur = NULL; } } else Col++; if (cur) { toResultViewItem *resItem = dynamic_cast(cur); toResultViewCheck *chkItem = dynamic_cast(cur); if (resItem) setText(resItem->allText(Col)); else if (chkItem) setText(chkItem->allText(Col)); else setText(cur->text(Col)); } Label->setText(QString::fromLatin1("") + lst->headerItem()->text(Col) + QString::fromLatin1("")); } } void toMemoEditor::lastColumn(void) { toListView *lst = listView(); if (lst) { toTreeWidgetItem *cur = lst->currentItem(); if (!cur) return ; if (Col == lst->columns() - 1) { toTreeWidgetItem *next = cur; if (cur->firstChild()) next = cur->firstChild(); else if (cur->nextSibling()) next = cur->nextSibling(); else { next = cur; do { next = next->parent(); } while (next && !next->nextSibling()); if (next) next = next->nextSibling(); } if (next) lst->setCurrentItem(next); } else { Col = lst->columns() - 1; Label->setText(QString::fromLatin1("") + lst->headerItem()->text(Col) + QString::fromLatin1("")); toResultViewItem *resItem = dynamic_cast(cur); toResultViewCheck *chkItem = dynamic_cast(cur); if (resItem) setText(resItem->allText(Col)); else if (chkItem) setText(chkItem->allText(Col)); else setText(cur->text(Col)); } } } void toMemoEditor::changeCurrent(toTreeWidgetItem *) { toListView *lst = listView(); if (lst) { toTreeWidgetItem *cur = lst->currentItem(); if (!cur) return ; toResultViewItem *resItem = dynamic_cast(cur); toResultViewCheck *chkItem = dynamic_cast(cur); if (resItem) setText(resItem->allText(Col)); else if (chkItem) setText(chkItem->allText(Col)); else setText(cur->text(Col)); } } tora-2.1.3/src/tosearchreplace.h0000644000175000017500000000576211270353625016372 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOSEARCHREPLACE_H #define TOSEARCHREPLACE_H #include "config.h" #include "ui_tosearchreplaceui.h" #include "tohelp.h" #include "toeditwidget.h" class toListView; class toMarkedText; class toResultContentEditor; //! \brief A helper namespace for Search related tools namespace Search { enum SearchMode { SearchPlaintext = 0, SearchRegexp }; enum SearchDirection { SearchUndefined = -1, SearchForward = 0, SearchBackward = 1 }; }; // namespace Search class toSearchReplace : public QDialog, public Ui::toSearchReplaceUI, public toHelpContext, public toEditWidget::editHandler { Q_OBJECT toEditWidget *Target; public: toSearchReplace(QWidget *parent); ~toSearchReplace() { toEditWidget::delHandler(this); }; void show(); QString currentSearchText(); Search::SearchMode searchMode(); bool wholeWords(); bool caseSensitive(); virtual void receivedFocus(toEditWidget *widget); virtual void lostFocus(toEditWidget *) { receivedFocus(NULL); } public slots: void searchNext(); void searchPrevious(); private slots: void replaceAll(); void replace(); void searchChanged(const QString & text); void displayHelp(); }; #endif tora-2.1.3/src/tobarchart.h0000644000175000017500000000523511270353625015352 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBARCHART_H #define TOBARCHART_H #include "config.h" #include "tolinechart.h" /** A widget that displays a barchart. Each line is added onto the next one. */ class toBarChart : public toLineChart { Q_OBJECT protected: virtual void paintChart(QPainter *p, QRect &rect); public: /** Create a new barchart. * @param parent Parent widget. * @param name Name of widget. * @param f Widget flags. */ toBarChart(QWidget *parent = NULL, const char *name = NULL, Qt::WFlags f = 0); /** Create a new barchart by copying all the data from another barchart. * @param chart Chart to copy data from. * @param parent Parent widget. * @param name Name of widget. * @param f Widget flags. */ toBarChart(toBarChart *chart, QWidget *parent = NULL, const char *name = NULL, Qt::WFlags f = 0); /** Open chart in new window. */ virtual toLineChart *openCopy(QWidget *parent); }; #endif tora-2.1.3/src/tostoragedefinitionui.ui0000644000175000017500000001666511270353625020036 0ustar michaelmichael toStorageDefinitionUI 0 0 596 480 Form1 Optimal allocation of extents. Will free unused extents down to specified value 11 11 11 11 6 6 &Extents 11 11 11 11 6 6 1 2147483647 1 false 1 2147483647 1 Maximum number of extents to allocate for an object &Maximum extents false MaximumExtent Number of extents to initially allocate &Initial size false InitialSize No limit to the number of extents to allocate if needed &Unlimited extents true &Optimal size 11 11 11 11 6 6 &No optimal size true Default increase in size of next allocated extent. A size of 0 will prevent background coalesce of free space &Default PCT increase false PCTIncrease 1000 10 Qt::Vertical QSizePolicy::Expanding 20 20 toFilesize QWidget
tofilesize.h
UnlimitedExtent toggled(bool) MaximumExtent setDisabled(bool) 20 20 20 20 OptimalNull toggled(bool) OptimalSize setDisabled(bool) 20 20 20 20
tora-2.1.3/src/tobrowsertable.cpp0000644000175000017500000006126711351612624016616 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "tobrowsertable.h" #include "toconnection.h" #include "todatatype.h" #include "toextract.h" #include "tohighlightedtext.h" #include "tomemoeditor.h" #include "toresultcombo.h" #include "tosql.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include static toSQL SQLListTablespaces("toBrowserTable:ListTablespaces", "SELECT Tablespace_Name FROM sys.DBA_TABLESPACES\n" " ORDER BY Tablespace_Name", "List the available tablespaces in a database."); static toSQL SQLDefaultTablespace("toBrowserTable:DefaultTablespaces", "select default_tablespace from dba_users where username = user", "List the default tablespace for current user."); void toBrowserTable::editTable(toConnection &conn, const QString &owner, const QString &table, QWidget *parent) { toBrowserTable dialog(conn, owner, table, parent); dialog.exec(); } static QString getDefaultTablespace(toConnection &conn) { toQList result; result = toQuery::readQuery(conn, SQLDefaultTablespace); return toShift(result); } // getDefaultTablespace // handle acceptance of table dialog (f.e. pressing OK button) // all actions should be done here so that in case of error user would have // a chance to fix parameters and retry creation/modification of table void toBrowserTable::done(int r) { if (!r) { QDialog::done(r); return; } else { std::list statements = toSQLParse::parse(sql(), *cnct); try { QProgressDialog prog(tr("Performing table changes"), tr("Stop"), 0, statements.size(), this); prog.setWindowTitle(tr("Performing table changes")); for (std::list::iterator i = statements.begin(); i != statements.end(); i++) { QString sql = toSQLParse::indentStatement(*i, *cnct); int l = sql.length() - 1; while (l >= 0 && (sql.at(l) == ';' || sql.at(l).isSpace())) l--; if (l >= 0) cnct->execute(sql.mid(0, l + 1)); qApp->processEvents(); if (prog.wasCanceled()) throw tr("Canceled ongoing table modification, table might be corrupt"); } QDialog::done(r); } // Cannot use standard TOCATCH. Table creation dialog always pop'us // above standard error message window. // TODO: play around with modal/nonmodal properties to fix this // TOCATCH; catch (const QString &str) { QMessageBox::warning(0, qApp->translate("toStatusMessage", "TOra Message"), str ); } } } // toBrowserTable::done toBrowserTable::toBrowserTable(toConnection &conn, const QString &owner, const QString &table, QWidget *parent, const char *name) : QDialog(parent), toConnectionWidget(conn, this), Extractor(conn, NULL) { setupUi(this); cnct = &conn; // the central widget to the scrollarea is a widget with a vbox // layout so the qgrid doesn't take all the vertical space. QWidget *box = new QWidget(ColumnList); QVBoxLayout *vbox = new QVBoxLayout; vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); box->setLayout(vbox); ColumnList->setWidget(box); ColumnList->setWidgetResizable(true); ColumnGrid = new QWidget(box); vbox->addWidget(ColumnGrid); vbox->addItem(new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding)); ColumnGridLayout = new QGridLayout; ColumnGridLayout->setSpacing(0); ColumnGridLayout->setContentsMargins(0, 0, 0, 0); ColumnGrid->setLayout(ColumnGridLayout); ColumnNumber = 0; ColumnGridLayout->addWidget(new QLabel(tr("Name")), 0, 0); ColumnGridLayout->addWidget(new QLabel(tr("Datatype")), 0, 1); ColumnGridLayout->addWidget(new QLabel(tr("Not null")), 0, 2); ColumnGridLayout->addWidget(new QLabel(tr("Default")), 0, 3); ColumnGridLayout->addWidget(new QLabel(tr("Comments")), 0, 4); // ColumnGridLayout->addWidget(new QLabel(tr("Extra parameters")), 0, 5); ColumnGridLayout->setColumnStretch(0, 1); ColumnGridLayout->setColumnStretch(1, 1); ColumnGridLayout->setColumnStretch(2, 0); ColumnGridLayout->setColumnStretch(3, 1); ColumnGridLayout->setColumnStretch(4, 1); // ColumnGridLayout->setColumnStretch(5, 1); Extractor.setIndexes(false); Extractor.setConstraints(false); Extractor.setPrompt(false); Extractor.setHeading(false); // connect(ButtonBox, SIGNAL(accepted()), this, SLOT(accept())); // connect(ButtonBox, SIGNAL(rejected()), this, SLOT(reject())); UglyFlag = false; // Indicates wether the correct size has been // retreived at least once. try { Owner = owner; Table = cnct->quote(table); QString tablespace; Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST)); Schema->setSelected(Owner); if (!Table.isEmpty()) { // Editing existing table. Extract current description of table. std::list Objects; Objects.insert(Objects.end(), "TABLE:" + Owner + "." + table); OriginalDescription = Extractor.describe(Objects); tablespaceSpecified = false; Schema->setEnabled(false); bool invalid = false; Name->setText(Table); QString declarations; QString storage; QString parallel; for (std::list::iterator i = OriginalDescription.begin(); i != OriginalDescription.end(); i++) { std::list row = toExtract::splitDescribe(*i); if (toShift(row) != connection().quote(owner)) { invalid = true; break; } if (toShift(row) != "TABLE") continue; if (toShift(row) != connection().quote(table)) { invalid = true; break; } QString type = toShift(row); if (type == "COLUMN") { // Nop, handled by the parseColumnDescription call below } else if (type == "COMMENT") Comment->setText(toShift(row)); else if (type == "STORAGE") storage += toShift(row) + " "; else if (type == "PARALLEL") parallel += toShift(row) + " "; else if (type == "PARAMETERS") { QString t = toShift(row); if (t.startsWith("TABLESPACE")) { // TODO: currently toOracleExtract::describe is NOT always returning name of // tablespace so this one will never be called. Should be fixed. tablespace = connection().unQuote(t.mid(10).trimmed()); tablespaceSpecified = true; } else declarations += t + " "; } else if (!type.isEmpty()) invalid = true; } Columns = toExtract::parseColumnDescription(OriginalDescription); ExtraDeclarations->setText(declarations.trimmed()); StorageDeclarations->setText(storage.trimmed()); ParallelDeclarations->setText(parallel.trimmed()); { for (unsigned int i = 0; i < Columns.size(); i++) addColumn(); } std::list::iterator name = ColumnNames.begin(); std::list::iterator datatype = Datatypes.begin(); std::list::iterator notnull = NotNulls.begin(); std::list::iterator defaultValue = Defaults.begin(); // std::list::iterator extra = Extra.begin(); std::list::iterator comment = Comments.begin(); for (std::list::iterator column = Columns.begin(); name != ColumnNames.end() && datatype != Datatypes.end() && notnull != NotNulls.end() && defaultValue != Defaults.end() && // extra != Extra.end() && comment != Comments.end() && column != Columns.end(); name++, datatype++, notnull++, defaultValue++, /*extra++,*/ comment++, column++) { if ((*column).Order == 0) invalid = true; (*name)->setText((*column).Name); (*datatype)->setType((*column).Definition); if ((*column).bNotNull) (*notnull)->setChecked(true); (*defaultValue)->setText((*column).DefaultValue); // (*extra)->setText((*column).Data["EXTRA"]); (*comment)->setText((*column).Comment); } if (invalid) { reject(); toStatusMessage("Invalid output from extraction layer prevents " "this dialog from being properly filled in."); return ; } } else { // create new column, add first column and select default tablespace addColumn(); tablespace = getDefaultTablespace(connection()); // TODO: NEW connection??!! } if (toIsMySQL(connection())) { ParallelLabel->hide(); ParallelDeclarations->hide(); SchemaLabel->setText(tr("&Database")); } // set-up tablespace combo box try { // get a list of tablespaces toQuery query(connection(), SQLListTablespaces); // TODO: does this create NEW connection??!! while (!query.eof()) { QString t = query.readValueNull(); Tablespace->addItem(t); if (t == tablespace) Tablespace->setCurrentIndex(Tablespace->count() - 1); } } catch (...) { TablespaceLabel->hide(); Tablespace->hide(); } } catch (const QString &exc) { toStatusMessage(exc); reject(); } uglyWorkaround(); } void toBrowserTable::addParameters(std::list &migrateTable, const std::list &ctx, const QString &type, const QString &data) { toSQLParse::statement statement = toSQLParse::parseStatement(data, connection()); std::list::iterator beg = statement.subTokens().begin(); std::list::iterator end = beg; while (end != statement.subTokens().end()) { if ((beg->String == "BUFFER_POOL") || (beg->String == "FREELISTS") || (beg->String == "INITIAL") || (beg->String == "MAXEXTENTS") || (beg->String == "MINEXTENTS") || (beg->String == "NEXT") || (beg->String == "PCTINCREASE") || (beg->String == "INITRANS") || (beg->String == "MAXTRANS") || (beg->String == "PCTFREE") || (beg->String == "DEGREE") || (beg->String == "INSTANCES") || (beg->String == "ORGANIZATION") || (beg->String == "TABLESPACE") || (beg->String == "GROUPS")) { // process parameters with one argument end++; end++; toExtract::addDescription(migrateTable, ctx, type, Extractor.createFromParse(beg, end)); beg = end; } else { if (beg->String == "FREELIST") { // process parameters with two arguments end++; end++; end++; toExtract::addDescription(migrateTable, ctx, type, Extractor.createFromParse(beg, end)); beg = end; } else { // process parameters without any arguments end++; toExtract::addDescription(migrateTable, ctx, type, Extractor.createFromParse(beg, end)); beg = end; } } /* if (beg != end) { if ((*end).String != "=") { if ((*end).String == "(") { do { end++; } while (end != statement.subTokens().end() && (*end).String != ")"); } end++; toExtract::addDescription(migrateTable, ctx, type, Extractor.createFromParse(beg, end)); beg = end; } else end++; } else end++;*/ } if (beg != end) toExtract::addDescription(migrateTable, ctx, type, Extractor.createFromParse(beg, end).trimmed()); } // addParameters // Generates and displays sql statements required to perform chosen operation // (creation of new or modifying existing table). QString toBrowserTable::sql() { std::list migrateTable; // list of complex (\01 separated) strings to be sent to extractor std::list ctx; // context to be added to all strings in migrateTable (f.e. owner, TABLE, tablename) toPush(ctx, cnct->quote(Owner)); toPush(ctx, QString("TABLE")); if (Table.isEmpty()) toPush(ctx, Name->text()); else toPush(ctx, Table); toExtract::addDescription(migrateTable, ctx); if (Name->text() != Table && !Table.isEmpty()) toExtract::addDescription(migrateTable, ctx, "RENAME", Name->text()); // iterating through columns as they have been upon loading table data (before any changes) std::list::const_iterator column = Columns.begin(); // iterating through column data as it is (after changes) std::list::const_iterator name = ColumnNames.begin(); std::list::const_iterator datatype = Datatypes.begin(); std::list::iterator notnull = NotNulls.begin(); std::list::iterator defaultValue = Defaults.begin(); // std::list::const_iterator extra = Extra.begin(); std::list::const_iterator comment = Comments.begin(); int num = 1; // order number, used to generate ORDERn rows while (name != ColumnNames.end() && datatype != Datatypes.end() && notnull != NotNulls.end() && defaultValue != Defaults.end() && // extra != Extra.end() && comment != Comments.end()) { QString cname; QString cdatatype; if (column != Columns.end()) { cname = (*column).Name; // add rename instruction if column name has changed if ((*name)->text() != cname) toExtract::addDescription(migrateTable, ctx, "COLUMN", cname, "RENAME", (*name)->text()); column++; } else { cname = (*name)->text(); } // add column name toExtract::addDescription(migrateTable, ctx, "COLUMN", cname); // add extra info (currently only "not null" property is supported, what else should there be?) if ((*notnull)->isChecked()) toExtract::addDescription(migrateTable, ctx, "COLUMN", cname, "EXTRA", "NOT NULL"); // add comment info if (!(*comment)->text().isEmpty()) toExtract::addDescription(migrateTable, ctx, "COLUMN", cname, "COMMENT", (*comment)->text()); // could this be used for something? // if (!(*extra)->text().isEmpty()) // toExtract::addDescription(migrateTable, ctx, "COLUMN", cname, "EXTRA", (*extra)->text()); // add order info toExtract::addDescription(migrateTable, ctx, "COLUMN", cname, "ORDER", QString::number(num++)); // add datatype row cdatatype = (*datatype)->type(); if (!(*defaultValue)->text().isEmpty()) cdatatype += " DEFAULT '" + (*defaultValue)->text() + "'"; // space at the end - workaround toExtract::addDescription(migrateTable, ctx, "COLUMN", cname, cdatatype); name++; datatype++; notnull++; defaultValue++; // extra++; comment++; } if (!Comment->text().isEmpty()) toExtract::addDescription(migrateTable, ctx, "COMMENT", Comment->text()); addParameters(migrateTable, ctx, "STORAGE", StorageDeclarations->text()); addParameters(migrateTable, ctx, "PARALLEL", ParallelDeclarations->text()); addParameters(migrateTable, ctx, "PARAMETERS", ExtraDeclarations->text()); // when creating new table tablespace must always be specified if (OriginalDescription.empty()) { addParameters(migrateTable, ctx, "TABLESPACE", cnct->quote(Tablespace->currentText())); } else { // when adjusting table tablespace is specified only // if it was specified in original description if (tablespaceSpecified) { // "quote" should be used for tablespace, but for tablespace // it will always do toLower anyway addParameters(migrateTable, ctx, "PARAMETERS", "TABLESPACE " + cnct->quote(Tablespace->currentText())); } } migrateTable.sort(); return Extractor.migrate(OriginalDescription, migrateTable); } // sql // Calls sql() to generate required sql statement(s) and then displays it(them). // If no changes are to be done - warning is displayed. void toBrowserTable::displaySQL() { QString statements = sql(); if (!statements.isNull()) { toMemoEditor memo(this, statements, -1, -1, true, true); memo.exec(); } else { QMessageBox::warning(0, qApp->translate("toStatusMessage", "TOra Message"), "No changes."); } } // displaySQL void toBrowserTable::addColumn() { ColumnNumber++; QLineEdit *tl; QCheckBox *cb; toDatatype *td; tl = new QLineEdit; ColumnGridLayout->addWidget(tl, ColumnNumber, 0); tl->setObjectName(QString::number(ColumnNumber)); // name will be used when deleting tl->show(); ColumnNames.insert(ColumnNames.end(), tl); td = new toDatatype(connection(), ColumnGrid); ColumnGridLayout->addWidget(td, ColumnNumber, 1); td->setObjectName(QString::number(ColumnNumber)); td->show(); Datatypes.insert(Datatypes.end(), td); cb = new QCheckBox; ColumnGridLayout->addWidget(cb, ColumnNumber, 2); cb->setObjectName(QString::number(ColumnNumber)); cb->show(); NotNulls.insert(NotNulls.end(), cb); tl = new QLineEdit; ColumnGridLayout->addWidget(tl, ColumnNumber, 3); tl->setObjectName(QString::number(ColumnNumber)); tl->show(); Defaults.insert(Defaults.end(), tl); tl = new QLineEdit; ColumnGridLayout->addWidget(tl, ColumnNumber, 4); tl->setObjectName(QString::number(ColumnNumber)); tl->show(); Comments.insert(Comments.end(), tl); // tl = new QLineEdit; // ColumnGridLayout->addWidget(tl, ColumnNumber, 5); // tl->setObjectName(QString::number(ColumnNumber)); // tl->show(); // Extra.insert(Extra.end(), tl); } // removes currently selected column void toBrowserTable::removeColumn() { QString toBeRemoved = qApp->focusWidget()->objectName(); std::list::const_iterator name = ColumnNames.begin(); std::list::const_iterator datatype = Datatypes.begin(); std::list::iterator notnull = NotNulls.begin(); std::list::iterator defaultValue = Defaults.begin(); // std::list::const_iterator extra = Extra.begin(); std::list::const_iterator comment = Comments.begin(); std::list::const_iterator column = Columns.begin(); while (name != ColumnNames.end() && datatype != Datatypes.end() && notnull != NotNulls.end() && defaultValue != Defaults.end() && // extra != Extra.end() && comment != Comments.end() && column != Columns.end() ) { if ((*name)->objectName() == toBeRemoved) { ColumnGridLayout->removeWidget(*name); ColumnNames.remove(*name); delete *name; ColumnGridLayout->removeWidget(*datatype); Datatypes.remove(*datatype); delete *datatype; ColumnGridLayout->removeWidget(*notnull); NotNulls.remove(*notnull); delete *notnull; ColumnGridLayout->removeWidget(*defaultValue); Defaults.remove(*defaultValue); delete *defaultValue; // ColumnGridLayout->removeWidget(*extra); // Extra.remove(*extra); // delete *extra; ColumnGridLayout->removeWidget(*comment); Comments.remove(*comment); delete *comment; Columns.remove(*column); return; } name++; datatype++; notnull++; defaultValue++; // extra++; comment++; column++; } // while #ifdef DEBUG qDebug() << "Could not find column to delete."; #endif } // removeColumn void toBrowserTable::toggleCustom(bool val) { for (std::list::iterator i = Datatypes.begin(); i != Datatypes.end(); i++) (*i)->setCustom(val); } void toBrowserTable::uglyWorkaround() { // Somehome the size doesn't get updated until way later so just // keep calling until it gets set. if (ColumnList->width() > 220 || UglyFlag) { ColumnGrid->setFixedWidth(ColumnList->width() - 30); UglyFlag = true; } else QTimer::singleShot(100, this, SLOT(uglyWorkaround())); } void toBrowserTable::resizeEvent(QResizeEvent *e) { QDialog::resizeEvent(e); uglyWorkaround(); } tora-2.1.3/src/toworksheetstatistic.cpp0000644000175000017500000002324111270353625020057 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toanalyze.h" #include "tobarchart.h" #include "toconf.h" #include "toresultview.h" #include "toworksheetstatistic.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "icons/fileopen.xpm" #include "icons/filesave.xpm" #include "icons/grid.xpm" #include "icons/trash.xpm" #include "icons/tree.xpm" toAnalyze *toWorksheetStatistic::Widget; toWorksheetStatistic::toWorksheetStatistic(QWidget *parent) : QWidget(parent) { QVBoxLayout *vlayout = new QVBoxLayout; vlayout->setSpacing(0); vlayout->setContentsMargins(0, 0, 0, 0); QToolBar *toolbar = toAllocBar(this, tr("Server Tuning")); vlayout->addWidget(toolbar); toolbar->addAction(QIcon(QPixmap(const_cast(fileopen_xpm))), tr("Load statistics from file"), this, SLOT(load(void))); SaveMenu = new QMenu(toolbar); SaveMenu->setIcon(QPixmap(const_cast(filesave_xpm))); SaveMenu->setTitle(tr("Save statistics to file")); toolbar->addAction(SaveMenu->menuAction()); connect(SaveMenu, SIGNAL(aboutToShow()), this, SLOT(displayMenu())); connect(SaveMenu, SIGNAL(triggered(QAction *)), this, SLOT(save(QAction *))); toolbar->addSeparator(); RemoveMenu = new QMenu(toolbar); RemoveMenu->setIcon(QPixmap(const_cast(trash_xpm))); RemoveMenu->setTitle(tr("Remove statistics")); toolbar->addAction(RemoveMenu->menuAction()); connect(RemoveMenu, SIGNAL(aboutToShow()), this, SLOT(displayMenu())); connect(RemoveMenu, SIGNAL(triggered(QAction *)), this, SLOT(remove(QAction *))); Splitter = new QSplitter(Qt::Vertical, this); vlayout->addWidget(Splitter); toolbar->addSeparator(); ShowCharts = new QToolButton(toolbar); ShowCharts->setCheckable(true); ShowCharts->setIcon(QIcon(QPixmap(const_cast(grid_xpm)))); ShowCharts->setToolTip(tr("Display charts")); ShowCharts->setChecked(true); connect(ShowCharts, SIGNAL(toggled(bool)), this, SLOT(showCharts(bool))); toolbar->addWidget(ShowCharts); ShowPlans = new QToolButton(toolbar); ShowPlans->setCheckable(true); ShowPlans->setIcon(QIcon(QPixmap(const_cast(tree_xpm)))); ShowPlans->setToolTip(tr("Display execution plans")); ShowPlans->setChecked(true); connect(ShowPlans, SIGNAL(toggled(bool)), this, SLOT(showPlans(bool))); toolbar->addWidget(ShowPlans); QWidget *w = new QWidget(toolbar); toolbar->addWidget(w); w->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum)); Dummy = new QWidget(Splitter); try { Tool = dynamic_cast(toCurrentTool(this)); if (!Widget) Widget = Tool; } TOCATCH; setLayout(vlayout); } toWorksheetStatistic::~toWorksheetStatistic() { if (Widget == Tool) Widget = NULL; } void toWorksheetStatistic::saveStatistics(std::map &stats) { if (!Widget) toAnalyze::createTool(); if (Widget) Widget->worksheet()->addStatistics(stats); } void toWorksheetStatistic::addStatistics(std::map &stats) { data cur; cur.Top = new QWidget(Splitter); QVBoxLayout *vbox = new QVBoxLayout; vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); QWidget *hcontainer = new QWidget(cur.Top); QHBoxLayout *box = new QHBoxLayout; box->setSpacing(0); box->setContentsMargins(0, 0, 0, 0); hcontainer->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); vbox->addWidget(hcontainer); cur.Action = new QAction(stats["Description"], cur.Top); cur.Label = new QLabel(stats["Description"], hcontainer); cur.Label->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred)); box->addWidget(cur.Label); QCheckBox *check = new QCheckBox(tr("Hide"), hcontainer); check->setCheckState(Qt::Unchecked); box->addWidget(check); cur.Charts = new QSplitter(Qt::Horizontal, cur.Top); vbox->addWidget(cur.Charts); cur.Statistics = new toListView(cur.Charts); cur.Statistics->importData(stats, "Stat"); cur.Wait = new toBarChart(cur.Charts); cur.Wait->importData(stats, "Wait"); cur.IO = new toBarChart(cur.Charts); cur.IO->importData(stats, "IO"); cur.Plan = new toListView(cur.Charts); cur.Plan->importData(stats, "Plan"); connect(check, SIGNAL(toggled(bool)), cur.Charts, SLOT(setHidden(bool))); cur.Top->setLayout(vbox); hcontainer->setLayout(box); QList sizes; sizes << 1 << 1 << 1 << 1; cur.Charts->setSizes(sizes); if (!cur.Plan->firstChild()) { delete cur.Plan; cur.Plan = NULL; } else if (!ShowPlans->isChecked()) cur.Plan->hide(); if (!ShowCharts->isChecked()) { cur.Statistics->hide(); cur.Wait->hide(); cur.IO->hide(); } cur.Top->show(); hcontainer->show(); cur.Charts->show(); setFocus(); Open.insert(Open.end(), cur); if (Dummy) { delete Dummy; Dummy = NULL; } } void toWorksheetStatistic::showPlans(bool show) { for (std::list::iterator i = Open.begin();i != Open.end();i++) { if ((*i).Plan) { if (show) { (*i).Plan->show(); } else { (*i).Plan->hide(); } } } } void toWorksheetStatistic::showCharts(bool show) { for (std::list::iterator i = Open.begin();i != Open.end();i++) { if (show) { (*i).Statistics->show(); (*i).Wait->show(); (*i).IO->show(); } else { (*i).Statistics->hide(); (*i).Wait->hide(); (*i).IO->hide(); } } } void toWorksheetStatistic::save(QAction *action) { for (std::list::iterator i = Open.begin();i != Open.end();i++) { if ((*i).Action == action) { QString fn = toSaveFilename(QString::null, QString::fromLatin1("*.stat"), this); if (!fn.isEmpty()) { std::map stat; (*i).Statistics->exportData(stat, "Stat"); (*i).IO->exportData(stat, "IO"); (*i).Wait->exportData(stat, "Wait"); if ((*i).Plan) (*i).Plan->exportData(stat, "Plan"); stat["Description"] = (*i).Label->text(); try { toConfigurationSingle::Instance().saveMap(fn, stat); } TOCATCH; } break; } } } void toWorksheetStatistic::remove(QAction *action) { for (std::list::iterator i = Open.begin();i != Open.end();i++) { if ((*i).Action == action) { delete(*i).Top; if (Open.size() == 1) { Dummy = new QWidget(Splitter); Dummy->show(); } Open.erase(i); break; } } } void toWorksheetStatistic::load(void) { QString filename = toOpenFilename(QString::null, QString::fromLatin1("*.stat"), this); if (!filename.isEmpty()) { try { std::map ret; toConfigurationSingle::Instance().loadMap(filename, ret); addStatistics(ret); } TOCATCH } } void toWorksheetStatistic::displayMenu(void) { SaveMenu->clear(); RemoveMenu->clear(); for (std::list::iterator i = Open.begin(); i != Open.end(); i++) { SaveMenu->addAction((*i).Action); RemoveMenu->addAction((*i).Action); } } tora-2.1.3/src/totemplate.h0000644000175000017500000002666511270353625015411 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOTEMPLATE_H #define TOTEMPLATE_H #include "config.h" #include "tobackground.h" #include "tohelp.h" #include "toresultview.h" // due the TODock #include "utils.h" #include #include #include #include #include #include #include "ui_totemplateeditui.h" #include "ui_totemplateaddfileui.h" #include "ui_totemplatesetupui.h" class toTreeWidget; class toTreeWidgetItem; class QSplitter; class QToolBar; class toConnection; class toListView; class toTemplateItem; class toTemplateProvider; class toNoBlockQuery; /** Not part of the API. * @internal */ class toTemplate : public QWidget, public toHelpContext { Q_OBJECT; QToolBar *Toolbar; toListView *List; QWidget *WidgetExtra; QWidget *Result; QWidget *Frame; public: toTemplate(TODock *parent); virtual ~toTemplate(); void setWidget(QWidget *widget); QWidget *widget(void) { return WidgetExtra; } QWidget *frame(void); static QWidget *parentWidget(toTreeWidgetItem *item); static toTemplate *templateWidget(toTreeWidgetItem *item); static toTemplate *templateWidget(toTreeWidget *obj); static bool templateShown(); virtual bool canHandle(toConnection &) { return true; } void closeFrame(void); void showResult(bool show); void hideEvent(QHideEvent *); void showEvent(QShowEvent *); public slots: void expand(toTreeWidgetItem *item); void collapse(toTreeWidgetItem *item); void selected(toTreeWidgetItem *item); void hideTemplates(); }; /** * This is the base class of a provider of template items. Usually it is created with * a static object just like the tools. It can also be assumed that a maximum of one * template window will be opened. */ class toTemplateProvider { /** List of currently available template providers. */ static std::list *Providers; static bool Shown; static QString *ToolKey; QString Name; bool Open; public: toTemplateProvider(const QString &name); virtual ~toTemplateProvider() { } /** Get name of this template provider. */ const QString name() { return Name; } /** Insert a parent item for this template provider into a list view. * @param parent The list into which to insert the item. * @param toolbar The template toolbar if any buttons are to be added on it. */ virtual void insertItems(toTreeWidget *parent, QToolBar *toolbar) = 0; /** Save settings for this template provider. * @param data Map of data. * @param prefix Prefix of where to save info. */ virtual void exportData(std::map &data, const QString &prefix); /** Save settings for all template providers. * @param data Map of data. * @param prefix Prefix of where to save info. */ static void exportAllData(std::map &data, const QString &prefix); /** Import data * @param data Data to read from a map. * @param prefix Prefix to read data from. */ virtual void importData(std::map &data, const QString &prefix); /** Import data for all template providers. * @param data Data to read from a map. * @param prefix Prefix to read data from. */ static void importAllData(std::map &data, const QString &prefix); /** Used internally to indicate if template help is shown. */ static void setShown(bool shown); /** Used internally to indicate tool key string */ static void setToolKey(const QString &key); friend class toTemplate; }; /** This is an item that is contained in a template. It is different in the expand and * collapse methods that are called when this item is expanded or collapsed from the * template widget. */ class toTemplateItem : public toResultViewItem { /** The provider responsible for this item. */ toTemplateProvider &Provider; public: /** Create an item. * @param prov Provider for this item. * @param parent Parent of this item. * @param name Contents of the first column of the item. */ toTemplateItem(toTemplateProvider &prov, toTreeWidget *parent, const QString &name) : toResultViewItem(parent, NULL, name), Provider(prov) { } /** Create an item. * @param parent Parent of this item. * @param name Contents of the first column of the item. * @param after The item to put this item after. */ toTemplateItem(toTemplateItem *parent, const QString &name, toTreeWidgetItem *after = NULL) : toResultViewItem(parent, after, name), Provider(parent->provider()) { } /** Get a reference to the provider of this item. * @return Reference to provider. */ toTemplateProvider &provider(void) { return Provider; } /** This function is called when the item is expanded and can be used to fill up the * list when needed. */ virtual void expand(void) { } /** This function is called when the item is selected by doubleclicking or pressing return. */ virtual void selected(void) { } /** This function is called when the item is collapsed. */ virtual void collapse(void) { } /** This function can be used to return a widget that is displays extra information for * this item. Return NULL if no widget is to be displayed. The widget will be deleted * when this item is no longer shown. */ virtual QWidget *selectedWidget(QWidget *parent); /** Reimplemented for internal reasons. */ virtual void setSelected(bool sel); }; /** This class represent a template item that have an extra text to describe it if it is * selected. */ class toTemplateText : public toTemplateItem { /** The note to display. */ const QString Note; public: /** Create an item. * @param parent Parent of this item. * @param name Contents of the first column of the item. * @param note Extra text to display if item is selected. */ toTemplateText(toTemplateItem *parent, const QString &name, const QString ¬e) : toTemplateItem(parent, name), Note(note) { } /** Reimplemented for internal reasons. */ virtual QWidget *selectedWidget(QWidget *parent); }; class toTemplateSQL; /** Used by toTemplateSQL. Only for internal use. * @internal */ class toTemplateSQLObject : public QObject { Q_OBJECT; toNoBlockQuery *Query; toBackground Poll; toTemplateSQL *Parent; toTemplateSQLObject(toTemplateSQL *parent); virtual ~toTemplateSQLObject(); void expand(void); friend class toTemplateSQL; private slots: void poll(void); }; /** This class represent an item that when expanded will execute an SQL statement * and create child items which are the result of the query. */ class toTemplateSQL : public toTemplateItem { toTemplateSQLObject Object; /** Connection to run statement in */ toConnection *Connection; /** Statement to run. */ QString SQL; protected: /** Create an item. * @param conn Connection to query. * @param parent Parent of this item. * @param name Contents of the first column of the item. * @param sql SQL statement. */ toTemplateSQL(toTemplateItem *parent, const QString &name, const QString &sql); public: /** Create an item. * @param conn Connection to query. * @param parent Parent of this item. * @param name Contents of the first column of the item. * @param sql SQL statement. */ toTemplateSQL(toConnection &conn, toTemplateItem *parent, const QString &name, const QString &sql); /** Get connection of this item. * @return Reference to connection. */ virtual toConnection &connection() { return *Connection; } /** Create a child of this item. * @param name Name of the child. * @return A newly created item. */ virtual toTemplateItem *createChild(const QString &name) { return new toTemplateItem(this, name); } /** Get parameters to pass to query. * @return List of strings to pass as input parameters to query */ virtual toQList parameters(void) { toQList ret; return ret; } /** Reimplemented for internal reasons. */ virtual void expand(void); friend class toTemplateSQLObject; }; class toTemplatePrefs : public QWidget, public Ui::toTemplateSetupUI, public toSettingTab { Q_OBJECT; toTool *Tool; public: toTemplatePrefs(toTool *tool, QWidget *parent, const char *name = 0); public slots: virtual void saveSetting(void); virtual void addFile(void); virtual void editFile(void); virtual void delFile(void); }; class toTemplateAddFile : public QDialog, public Ui::toTemplateAddFileUI { Q_OBJECT; public: toTemplateAddFile(QWidget *parent, const char *name = 0); public slots: virtual void browse(void); virtual void valid(void); }; class toTemplateEdit : public QDialog, public Ui::toTemplateEditUI, public toHelpContext { Q_OBJECT; std::map &TemplateMap; std::map::iterator LastTemplate; public: void connectList(bool conn); toTreeWidgetItem *findLast(void); void allocateItem(void); bool clearUnused(toTreeWidgetItem *first, const QString &pre); toTemplateEdit(std::map &pairs, QWidget *parent, const char *name = 0); QString name(toTreeWidgetItem *item); public slots: virtual void updateFromMap(void); virtual void remove(void); virtual void preview(void); virtual void newTemplate(void); virtual void changeSelection(void); }; #endif tora-2.1.3/src/toqvalue.cpp0000644000175000017500000002231011445353612015405 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toqvalue.h" #include #include #include static int NumberFormat; static int NumberDecimals; toQValue::toQValue(int i) { Value = i; } toQValue::toQValue(double i) { Value = i; } toQValue::toQValue(qlonglong d) { Value = d; } toQValue::toQValue(qulonglong d) { Value = d; } toQValue::toQValue(const toQValue ©) { Value = copy.Value; /** Be destructive only if complexType is held * There should be no copying of data read from a query, * but toQValue is also used for query parameters(toQList and others) * and these are copyined often (toNoBlockQuery.Params => toQuery.Params) */ if(isUserType()) const_cast(copy).Value = "deleted value(clone)"; } const toQValue &toQValue::operator = (const toQValue & copy) { Value = copy.Value; /** Be destructive only if complexType is held * There should be no copying of data read from a query, * but toQValue is also used for query parameters(toQList and others) * and these are copyined often (toNoBlockQuery.Params => toQuery.Params) */ if(isUserType()) const_cast(copy).Value = "deleted value(assign)"; return *this; } toQValue::toQValue(const QString &str) { Value = str; } toQValue::toQValue() { } toQValue::~toQValue() { if(isUserType()) { complexType *i = Value.value(); if(i) delete i; } } bool toQValue::operator<(const toQValue &other) const { if (isInt() && other.isInt()) return toInt() < other.toInt(); if (isDouble() && other.isDouble()) return toDouble() < other.toDouble(); if (isLong() && other.isLong()) return toLong() < other.toLong(); if (isuLong() && other.isuLong()) return touLong() < other.touLong(); if (isBinary() && other.isBinary()) return Value.toByteArray() < other.Value.toByteArray(); // otherwise, try to convert to double for comparison bool ok; double d1 = toString().toDouble(&ok); if (ok) { double d2 = other.toString().toDouble(&ok); if (ok) return d1 < d2; } return toString() < other.toString(); } bool toQValue::operator>(const toQValue &other) const { return !operator<(other); } bool toQValue::operator<=(const toQValue &other) const { if (isInt() && other.isInt()) return toInt() <= other.toInt(); if (isDouble() && other.isDouble()) return toDouble() <= other.toDouble(); if (isLong() && other.isLong()) return toLong() <= other.toLong(); if (isuLong() && other.isuLong()) return touLong() <= other.touLong(); if (isBinary() && other.isBinary()) return Value.toByteArray() <= other.Value.toByteArray(); // otherwise, try to convert to double for comparison bool ok; double d1 = toString().toDouble(&ok); if (ok) { double d2 = other.toString().toDouble(&ok); if (ok) return d1 <= d2; } return toString() <= other.toString(); } bool toQValue::operator>=(const toQValue &other) const { return !operator<=(other); } bool toQValue::isNumber() const { return isInt() || isDouble() || isLong() || isuLong(); } bool toQValue::operator == (const toQValue &val) const { return Value == val.Value; } QVariant const& toQValue::toQVariant() const { return Value; } bool toQValue::isInt() const { return Value.type() == QVariant::Int; } bool toQValue::isDouble() const { return Value.type() == QVariant::Double; } bool toQValue::isuLong() const { return Value.type() == QVariant::ULongLong; } bool toQValue::isLong() const { return Value.type() == QVariant::LongLong; } bool toQValue::isString() const { return Value.type() == QVariant::String; } bool toQValue::isBinary() const { return Value.type() == QVariant::ByteArray; } bool toQValue::isUserType(void) const { return Value.type() == QVariant::UserType; } bool toQValue::isNull() const { return Value.isNull(); } const QByteArray toQValue::toByteArray() const { return Value.toByteArray(); } QString toQValue::toUtf8() const { if(isUserType()) return QString("U UserType"); else return Value.toString(); } QString toQValue::toString() const { if(isUserType()) return QString("T UserType"); else return Value.toString(); } int toQValue::toInt() const { return Value.toInt(); } double toQValue::toDouble() const { return Value.toDouble(); } qlonglong toQValue::toLong() const { return Value.toLongLong(); } qulonglong toQValue::touLong() const { return Value.toULongLong(); } void toQValue::setNumberFormat(int format, int decimals) { NumberFormat = format; NumberDecimals = decimals; } QString toQValue::formatNumber(double number) { if (number == int(number)) return QString::number(number); switch (NumberFormat) { case 1: { char buf[100]; sprintf(buf, "%E", number); return buf; } case 2: { char buf[100]; sprintf(buf, "%0.*f", NumberDecimals, number); return buf; } default: return QString::number(number); } } int toQValue::numberFormat() { return NumberFormat; } int toQValue::numberDecimals() { return NumberDecimals; } toQValue toQValue::fromVariant(const QVariant &val) { toQValue ret; ret.Value = val; return ret; } toQValue toQValue::createBinary(const QByteArray &arr) { toQValue ret; ret.Value = arr; return ret; } toQValue toQValue::createFromHex(const QByteArray &hex) { QByteArray arr; for (int i = 0;i < hex.length();i += 2) { int num; char c = hex.at(i); if (c >= 'a') num = c - 'a'; else if (c >= 'A') num = c - 'A'; else num = c - '0'; num <<= 4; c = hex.at(i + 1); if (c >= 'a') num += c - 'a'; else if (c >= 'A') num += c - 'A'; else num += c - '0'; // arr.at(i / 2) = num; arr[i / 2] = num; } return createBinary(arr); } toQValue toQValue::createFromHex(const QString &hex) { QByteArray arr; for (int i = 0;i < hex.length();i += 2) { int num; // qt4 char c = hex.at(i); char c = hex.at(i).toAscii(); if (c >= 'a') num = c - 'a'; else if (c >= 'A') num = c - 'A'; else num = c - '0'; num <<= 4; // qt4 c = hex.at(i + 1); c = hex.at(i + 1).toAscii(); if (c >= 'a') num += c - 'a'; else if (c >= 'A') num += c - 'A'; else num += c - '0'; arr[i / 2] = num; } return createBinary(arr); } toQValue::operator QString() const { if(isUserType()) return QString("O UserType"); else return Value.toString(); } QString toQValue::toSIsize() const { if (this->isNull()) return NULL; double size = toDouble(); QString s = "%1"; int i = 0; while (size / 1024 >= 10) { i++; size = size / 1024; } switch (i) { case 0: break; case 1: s.append("K"); break; case 2: s.append("M"); break; case 3: s.append("G"); break; case 4: s.append("T"); break; case 5: s.append("P"); break; default: s.append("E"); } return s.arg(size, 0, 'f', 0); } tora-2.1.3/src/toconnectionimport.h0000644000175000017500000000534211270353625017155 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOCONNECTIONIMPORT_H #define TOCONNECTIONIMPORT_H #include "ui_toconnectionimportui.h" #include "toconnectionmodel.h" /*! \brief GUI to load conections from the others tools. \author Petr Vanek */ class toConnectionImport : public QDialog, public Ui::toConnectionImport { Q_OBJECT public: toConnectionImport(QWidget * parent = 0); //! \brief Supported loaders enum ToolUsed { None = 0, OracleSQLDeveloper = 1, SquirrelSQL = 2, Tora3 = 3 }; //! \brief Send all imported connections to the caller QMap availableConnections() { return availableModel->availableConnections(); }; private: toConnectionModel * availableModel; ToolUsed m_tool; private slots: //! Change m_tool void toolComboBox_changed(int); //! Read new connections from the outside void refreshAvailable(); }; #endif tora-2.1.3/src/toeditablemenu.cpp0000644000175000017500000000546711270353625016564 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "toeditablemenu.h" #include #include #include "icons/trash.xpm" toEditableMenu::toEditableMenu(QWidget *parent) : QMenu(parent), Context(0) { } void toEditableMenu::keyPressEvent(QKeyEvent *event) { if(event->modifiers() == Qt::NoModifier && event->key() == Qt::Key_Delete) remove(); } void toEditableMenu::contextMenuEvent(QContextMenuEvent *event) { event->accept(); if(!Context) { Context = new QMenu(this); Remove = new QAction(QPixmap(const_cast(trash_xpm)), tr("Remove"), this); Remove->setShortcut(QKeySequence::Delete); Context->addAction(Remove); connect(Remove, SIGNAL(triggered()), this, SLOT(remove())); } Context->exec(QCursor::pos()); } void toEditableMenu::remove() { QAction *active = this->activeAction(); if(!active) return; emit actionRemoved(active); this->removeAction(active); } tora-2.1.3/src/todebugtext.cpp0000644000175000017500000003616211332075013016104 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconnection.h" #include "todebug.h" #include "todebugtext.h" #include "tosql.h" #include #include #include //Added by qt3to4: #include #include #include "icons/breakpoint.xpm" #include "icons/disbreakpoint.xpm" #define TO_BREAK_COL 5 int toDebugText::ID = 0; toBreakpointItem::toBreakpointItem(toTreeWidget *parent, toTreeWidgetItem *after, const QString &schema, const QString &type, const QString &object, int line) : toTreeWidgetItem(parent, after) { if (schema.isNull()) setText(2, QString::null); else setText(2, schema); if (object.isNull()) setText(0, QString::null); else setText(0, object); if (type.isNull()) setText(3, QString::null); else setText(3, type); setText(1, QString::number(line + 1)); if (type == QString::fromLatin1("PACKAGE") || type == QString::fromLatin1("PROCEDURE") || type == QString::fromLatin1("FUNCTION") || type == QString::fromLatin1("TYPE")) Namespace = TO_NAME_TOPLEVEL; else if (type == QString::fromLatin1("PACKAGE BODY") || type == QString::fromLatin1("TYPE BODY")) Namespace = TO_NAME_BODY; else Namespace = TO_NAME_NONE; Line = line; setText(4, qApp->translate("toDebug", "DEFERED")); } static toSQL SQLBreakpoint("toDebug:SetBreakpoint", "DECLARE\n" " proginf SYS.DBMS_DEBUG.PROGRAM_INFO;\n" " bnum BINARY_INTEGER;\n" " ret BINARY_INTEGER;\n" "BEGIN\n" " proginf.Namespace:=:type;\n" " proginf.Name:=:name;\n" " proginf.Owner:=:schema;\n" " proginf.DbLink:=NULL;\n" " proginf.LibUnitType:=SYS.DBMS_DEBUG.LibUnitType_Procedure;\n" " proginf.EntryPointName:=NULL;\n" " proginf.Line#:=:line;\n" " ret:=SYS.DBMS_DEBUG.SET_BREAKPOINT(proginf,proginf.Line#,bnum,0,1);\n" " SELECT ret,bnum INTO :ret,:bnum FROM sys.DUAL;\n" "END;", "Set breakpoint, must have same bindings"); void toBreakpointItem::setBreakpoint(void) { bool ok = false; try { try { clearBreakpoint(); } TOCATCH // I don't the removal of the breakpoint to interact with the setting of the breakpoint toConnection &conn = toCurrentConnection(listView()); toQList args; toPush(args, toQValue(Namespace)); toPush(args, toQValue(text(0))); toPush(args, toQValue(text(2))); toPush(args, toQValue(Line + 1)); toQuery query(conn, SQLBreakpoint, args); int ret = query.readValue().toInt(); if (ret == TO_SUCCESS) { setText(TO_BREAK_COL, query.readValue()); setText(4, qApp->translate("toDebug", "ENABLED")); ok = true; } else if (ret == TO_ERROR_ILLEGAL_LINE) { toStatusMessage(qApp->translate("toDebug", "Can not enable breakpoint, not a valid line. Perhaps needs to recompile.")); } else if (ret == TO_ERROR_BAD_HANDLE) { toStatusMessage(qApp->translate("toDebug", "Can not enable breakpoint, not a valid object. Perhaps needs to compile.")); } } TOCATCH if (!ok) setText(4, qApp->translate("toDebug", "NOT SET")); } static toSQL SQLClearBreakpoint("toDebug:ClearBreakpoint", "DECLARE\n" " bnum BINARY_INTEGER;\n" " ret BINARY_INTEGER;\n" "BEGIN\n" " bnum:=:bnum;\n" " ret:=SYS.DBMS_DEBUG.DELETE_BREAKPOINT(bnum);\n" " SELECT ret INTO :ret FROM sys.DUAL;\n" "END;", "Clear breakpoint, must have same bindings"); /** If something goes wrong it throws an exception (type QString with the error message */ void toBreakpointItem::clearBreakpoint() { if (text(4) == qApp->translate("toDebug", "ENABLED") && !text(TO_BREAK_COL).isEmpty()) { toConnection &conn = toCurrentConnection(listView()); toQList args; toPush(args, toQValue(text(TO_BREAK_COL))); toQuery query(conn, SQLClearBreakpoint, args); int res = query.readValue().toInt(); if (res != TO_SUCCESS && res != TO_NO_SUCH_BREAKPOINT) { QString message = qApp->translate("toDebug", "Failed to remove breakpoint (Reason %1)").arg(res); toStatusMessage(message); throw(message); } } setText(4, qApp->translate("toDebug", "DISABLED")); } #define DEBUG_INDENT 10 static toSQL SQLReadSource("toDebug:ReadSource", "SELECT Text FROM SYS.All_Source\n" " WHERE OWNER = :f1\n" " AND NAME = :f2\n" " AND TYPE = :f3\n" " ORDER BY Type,Line", "Read sourcecode for object"); static toSQL SQLReadErrors("toDebug:ReadErrors", "SELECT Line-1,Text FROM SYS.All_Errors\n" " WHERE OWNER = :f1\n" " AND NAME = :f2\n" " AND TYPE = :f3\n" " ORDER BY Type,Line", "Get lines with errors in object (Observe first line 0)"); bool toDebugText::readErrors(toConnection &conn) { try { toQuery errors(conn, SQLReadErrors, Schema, Object, Type); QMap Errors; while (!errors.eof()) { int line = errors.readValue().toInt(); Errors[line] += QString::fromLatin1(" "); Errors[line] += errors.readValue(); } setErrors(Errors); return true; } TOCATCH return false; } bool toDebugText::readData(toConnection &conn, toTreeWidget *Stack) { toTreeWidgetItem *item = NULL; if (Stack && Stack->firstChild()) for (item = Stack->firstChild();item->firstChild();item = item->firstChild()) ; try { toQuery lines(conn, SQLReadSource, Schema, Object, Type); QString str; while (!lines.eof()) str += lines.readValue(); setText(str); setModified(false); setCurrent( -1); if (str.isEmpty()) return false; else { if (item && Schema == item->text(2) && Object == item->text(0) && Type == item->text(3)) setCurrent(item->text(1).toInt() - 1); return readErrors(conn); } } TOCATCH return false; } void toDebugText::setData(const QString &schema, const QString &type, const QString &object) { Schema = schema; Type = type; Object = object; CurrentItem = FirstItem = NULL; NoBreakpoints = false; update(); } toDebugText::toDebugText(toTreeWidget *breakpoints, QWidget *parent, toDebug *debugger) : toHighlightedText(parent, QString::number(++ID).toLatin1()), Debugger(debugger), Breakpoints(breakpoints) { //setLeftIgnore(DEBUG_INDENT); setMarginWidth(0, 25); setMarginWidth(1, 10); setMarginSensitivity(0, true); setMarginSensitivity(1, true); CurrentItem = FirstItem = NULL; NoBreakpoints = false; connect(this, SIGNAL(marginClicked(int, int, Qt::KeyboardModifiers)), this, SLOT(toggleBreakpoint(int, int, Qt::KeyboardModifiers))); // breakMarker=markerDefine(new QPixmap(const_cast(breakpoint_xpm))); // disabledBreakMarker=markerDefine(new QPixmap(const_cast(disbreakpoint_xpm))); breakMarker = markerDefine(QPixmap(breakpoint_xpm)); disabledBreakMarker = markerDefine(QPixmap(disbreakpoint_xpm)); setMarginMarkerMask(1, (2 ^ breakMarker) | (2 ^ disabledBreakMarker)); } bool toDebugText::checkItem(toBreakpointItem *item) { if (!item) return false; if (item->text(2) == Schema && item->text(3) == Type && item->text(0) == Object) return true; return false; } void toDebugText::clear(void) { setData(QString::null, QString::null, QString::null); FirstItem = CurrentItem = NULL; NoBreakpoints = false; toHighlightedText::clear(); } bool toDebugText::hasBreakpoint(int row) // This has to leave CurrentItem on the breakpoint { if (!FirstItem && !NoBreakpoints) { FirstItem = dynamic_cast(Breakpoints->firstChild()); while (!checkItem(FirstItem) && FirstItem) FirstItem = dynamic_cast(FirstItem->nextSibling()); if (!FirstItem) NoBreakpoints = true; CurrentItem = FirstItem; } if (!NoBreakpoints) { toBreakpointItem *next = dynamic_cast(CurrentItem->nextSibling()); bool hasNext = checkItem(next); int nextLine = hasNext ? next->line() : row + 1; if (CurrentItem->line() == row) return true; if (row == nextLine) { CurrentItem = next; return true; } if (!hasNext && row > CurrentItem->line()) return false; if (row < CurrentItem->line()) { if (CurrentItem == FirstItem) return false; CurrentItem = FirstItem; return hasBreakpoint(row); } if (row > nextLine) { CurrentItem = next; return hasBreakpoint(row); } } return false; } void toDebugText::mouseMoveEvent(QMouseEvent *me) { QRect view = childrenRect (); if (me->x() > DEBUG_INDENT + view.left()) { if (LastX <= DEBUG_INDENT + view.left()) setCursor(Qt::IBeamCursor); if (me->buttons() != 0) toHighlightedText::mouseMoveEvent(me); } else { if (LastX > DEBUG_INDENT + view.left()) setCursor(Qt::IBeamCursor); setCursor(Qt::ArrowCursor); } LastX = me->x(); } void toDebugText::toggleBreakpoint(int row, bool enable) { if (Schema.isEmpty() || Type.isEmpty() || Object.isEmpty()) return ; int curcol; if (row < 0) getCursorPosition (&row, &curcol); if (row >= 0) { if (hasBreakpoint(row)) { try { if (enable) { if (CurrentItem->text(4) == qApp->translate("toDebug", "DISABLED")) { CurrentItem->setText(4, qApp->translate("toDebug", "DEFERED")); markerDelete(row, disabledBreakMarker); markerAdd(row, breakMarker); } else { CurrentItem->clearBreakpoint(); markerDelete(row, breakMarker); markerAdd(row, disabledBreakMarker); } } else { CurrentItem->clearBreakpoint(); delete CurrentItem; markerDelete(row, breakMarker); markerDelete(row, disabledBreakMarker); if (FirstItem == CurrentItem) { NoBreakpoints = false; CurrentItem = FirstItem = NULL; } else CurrentItem = FirstItem; } } TOCATCH } else if (!enable) { markerAdd(row, breakMarker); if (CurrentItem && CurrentItem->line() > row) new toBreakpointItem(Breakpoints, NULL, Schema, Type, Object, row); else new toBreakpointItem(Breakpoints, CurrentItem, Schema, Type, Object, row); FirstItem = CurrentItem = NULL; NoBreakpoints = false; } //updateCell(row, 0, false); } } void toDebugText::toggleBreakpoint(int margin, int line, Qt::KeyboardModifiers state) { if (margin <= 1) toggleBreakpoint(line); } void toDebugText::exportData(std::map &data, const QString &prefix) { toHighlightedText::exportData(data, prefix); data[prefix + ":Schema"] = Schema; data[prefix + ":Object"] = Object; data[prefix + ":Type"] = Type; } void toDebugText::importData(std::map &data, const QString &prefix) { toHighlightedText::importData(data, prefix); Schema = data[prefix + ":Schema"]; Object = data[prefix + ":Object"]; Type = data[prefix + ":Type"]; NoBreakpoints = false; } tora-2.1.3/src/toresultlistformat.h0000644000175000017500000000533611270353625017211 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTLISTFORMAT_H #define TORESULTLISTFORMAT_H #include "ui_toresultlistformatui.h" #include "config.h" #include class toExportSettings; /** * "Prepare Data Export/Copying" dialog * * @internal */ class toResultListFormat : public QDialog, public Ui::toResultListFormatUI { Q_OBJECT; public: enum DialogType { TypeRaw, // Don't use dialog, just fetch data with plaintextCopySettings() TypeCopy, TypeExport }; toResultListFormat(QWidget *parent, DialogType type = TypeCopy, const char *name = 0); //! Construct export settings with dialog's values. toExportSettings exportSettings(); /*! Set the toExportSettings for simple plaintext copy settings. No headers, just selection. For quick Ctrl+C. */ static toExportSettings plaintextCopySettings(); public slots: void accept(void); private slots: virtual void formatChanged(int pos); }; #endif tora-2.1.3/src/tonoblockquery.h0000644000175000017500000001305211336032004016261 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TONOBLOCKQUERY_H #define TONOBLOCKQUERY_H #include "config.h" #include "toconnection.h" #include "tothread.h" #include #include class toResultStats; /** This is class to be able to run a query in the background without * blocking until a response is available from OCI. */ class toNoBlockQuery : public QObject { Q_OBJECT; private: /** A task to implement running the query. */ class queryTask : public toTask { toNoBlockQuery &Parent; public: queryTask(toNoBlockQuery &parent) : Parent(parent) { } virtual void run(void); }; friend class queryTask; /** This semaphore indicates wether the query is still running. */ toSemaphore Running; /** This semaphore indicates wether the child thread should * continue reading values. */ toSemaphore Continue; /** Lock for all this stuff */ mutable toLock Lock; /** Current location that values are being read. */ toQList::iterator CurrentValue; /** Values read by the task. This can be changed without holding @ref Lock. */ toQList ReadingValues; /** Values ready to be read by client. */ toQList Values; /** Indicator if at end of query. */ bool EOQ; /** Indicator if to quit reading from query. */ bool Quit; /** SQL to execute. */ QString SQL; /** Error string if error occurs. */ toConnection::exception Error; /** Number of rows processed. */ int Processed; /** Parameters to pass to query before execution. */ toQList Param; /** Statistics to be used if any. */ QPointer Statistics; /** Description of result */ toQDescList Description; /** When query is executed */ time_t Started; /** Query used to run query */ toQuery *Query; /** Throw error if any. */ void checkError() const; /** Stop reading query */ void stop(); public: /** Create a new query. * @param conn Connection to run on. * @param sql SQL to execute. * @param param Parameters to pass to query. * @param statistics Optional statistics widget to update with values from query. */ toNoBlockQuery(toConnection &conn, const QString &sql, const toQList ¶m, toResultStats *statistics = NULL); /** Create a new query. * @param conn Connection to run on. * @param mode Query mode to execute query in. * @param sql SQL to execute. * @param param Parameters to pass to query. * @param statistics Optional statistics widget to update with values from query. */ toNoBlockQuery(toConnection &conn, toQuery::queryMode mode, const QString &sql, const toQList ¶m, toResultStats *statistics = NULL); virtual ~toNoBlockQuery(); /** Poll if any result is available. * @return True if at least one row is available. */ bool poll(void); /** Get description of columns. * @return Description of columns list. Don't modify this list. */ const toQDescList &describe(void) const; /** Read the next value from the query. * @return The next available value. */ toQValue readValue(void); /** Read the next value from the query. Don't send NULL as string. * @return The next available value. */ toQValue readValueNull(void); /** Get the number of rows processed. * @return Number of rows processed. */ int rowsProcessed(void); /** Check if at end of query. * @return True if query is done. */ bool eof(void); /** * return query's sql command * */ const QString sql(void) { return SQL; } }; #endif tora-2.1.3/src/toresulttableview.cpp0000644000175000017500000005455011420543756017347 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "config.h" #include "toresulttableview.h" #include "toresultmodel.h" #include "toeventquery.h" #include "toconf.h" #include "utils.h" #include "toconfiguration.h" #include "toconnection.h" #include "tomodeleditor.h" #include "tomain.h" #include "toresultlistformat.h" #include "tolistviewformatter.h" #include "tolistviewformatterfactory.h" //#include "tolistviewformatteridentifier.h" #include "toworkingwidget.h" #include "tosearchreplace.h" #include #include #include #include #include #include #include #include #include toResultTableView::toResultTableView(QWidget * parent) : QTableView(parent), toResult(), toEditWidget(false, // open true, // save true, // print false, // undo false, // redo false, // cut true, // copy false, // past true, // search true, // selectall false), // readall Model(NULL) { setObjectName("toResultTableView"); setup(true, false, false); } toResultTableView::toResultTableView(bool readable, bool numberColumn, QWidget *parent, const char *name, bool editable) : QTableView(parent), toResult(), toEditWidget(false, // open true, // save true, // print false, // undo false, // redo false, // cut true, // copy false, // past true, // search true, // selectall false), // readall Model(NULL) { if (name) setObjectName(name); setup(readable, numberColumn, editable); } void toResultTableView::setup(bool readable, bool numberColumn, bool editable) { Statistics = NULL; Menu = NULL; Editable = editable; ReadAll = false; Filter = 0; ReadableColumns = readable; NumberColumn = numberColumn; ColumnsResized = false; Ready = false; Finished = false; Working = new toWorkingWidget(this); connect(Working, SIGNAL(stop()), this, SLOT(stop())); Working->hide(); // hide by default // set item delegate if default. Don't replace custom set delegate QAbstractItemDelegate *del = itemDelegate(); if(dynamic_cast(del) == 0) setItemDelegate(new toResultTableViewDelegate(this)); createActions(); setSelectionBehavior(QAbstractItemView::SelectItems); setSelectionMode(QAbstractItemView::ContiguousSelection); setAlternatingRowColors(true); setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(displayMenu(const QPoint &))); connect(horizontalHeader(), SIGNAL(sectionResized(int, int, int)), this, SLOT(columnWasResized(int, int, int))); connect(this, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(handleDoubleClick(const QModelIndex &))); setDragEnabled(true); if(Editable) viewport()->setAcceptDrops(true); setDropIndicatorShown(true); if(Editable) setDragDropMode(QAbstractItemView::DragDrop); // this is my dirty hack to prevent fetchMore being called on the // model during a horizontal scroll. // this would be one great way to fix it, but as of this time it's // prioritized low and not scheduled for a fix: // http://trolltech.no/developer/task-tracker/index_html?method=entry&id=177663 disconnect(QTableView::horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(horizontalScrollbarValueChanged(int))); } toResultTableView::~toResultTableView() { if(Model) delete Model; Model = NULL; if(Filter) delete Filter; Filter = 0; } void toResultTableView::query(const QString &sql, const toQList ¶m) { setSQLParams(sql, param); toEventQuery *query = NULL; try { if (Model && running()) Model->stop(); if(Model) { delete Model; Model = NULL; } readAllAct->setEnabled(true); Ready = false; Finished = false; Working->setText(tr("Please wait...")); Working->hide(); // sets visible true but won't show if parent is hidden QTimer t(this); t.singleShot(300, Working, SLOT(forceShow())); query = new toEventQuery(connection(), toQuery::Long, sql, param, Statistics); Model = new toResultModel(query, this, Editable, ReadableColumns); setModel(Model); connect(Model, SIGNAL(done()), this, SLOT(handleDone())); connect(Model, SIGNAL(modelReset()), this, SLOT(handleReset())); connect(Model, SIGNAL(firstResult(const toConnection::exception &, bool)), this, SLOT(handleFirst(const toConnection::exception &, bool))); setSortingEnabled(true); } catch (const toConnection::exception &str) { emit firstResult(toResult::sql(), str, true); emit done(); toStatusMessage(str); } catch (const QString &str) { emit firstResult(toResult::sql(), str, true); emit done(); toStatusMessage(str); } verticalHeader()->setVisible(false); verticalHeader()->setDefaultSectionSize(QFontMetrics(QFont()).height() + 4); horizontalHeader()->setHighlightSections(false); // when a new model is created the column sizes are lost ColumnsResized = false; } void toResultTableView::createActions() { displayAct = new QAction(tr("&Display in editor..."), this); refreshAct = new QAction(tr("&Refresh"), this); leftAct = new QAction(tr("&Left"), this); centerAct = new QAction(tr("&Center"), this); rightAct = new QAction(tr("&Right"), this); copyAct = new QAction(tr("&Copy"), this); copyFormatAct = new QAction(tr("Copy in &format..."), this); copyTransAct = new QAction(tr("Copy &transposed"), this); selectAllAct = new QAction(tr("Select &all"), this); exportAct = new QAction(tr("E&xport to file..."), this); editAct = new QAction(tr("&Edit SQL..."), this); rowCountAct = new QAction(tr("C&ount Rows"), this); readAllAct = new QAction(tr("&Read All"), this); } void toResultTableView::applyFilter() { if (!Filter) return; Filter->startingQuery(); setUpdatesEnabled(false); for (int row = 0; row < Model->rowCount(); row++) { if (!Filter->check(Model, row)) hideRow(row); else showRow(row); } setUpdatesEnabled(true); } int toResultTableView::sizeHintForRow(int row) const { return 5; } void toResultTableView::paintEvent(QPaintEvent *event) { if(!Ready) { Working->setGeometry(this->viewport()->frameGeometry()); Working->show(); event->ignore(); } else { Working->hide(); QTableView::paintEvent(event); } } void toResultTableView::resizeEvent(QResizeEvent *event) { if(VisibleColumns == 1 && ReadableColumns) setColumnWidth(1, viewport()->width()); QTableView::resizeEvent(event); } void toResultTableView::keyPressEvent(QKeyEvent * event) { if (event->matches(QKeySequence::Copy)) { editCopy(); return; } QTableView::keyPressEvent(event); } void toResultTableView::applyColumnRules() { if (!NumberColumn) hideColumn(0); if (ReadableColumns) { VisibleColumns = 0; // loop through columns and hide anything starting with a ' ' for (int col = 1; col < model()->columnCount(); col++) { if (model()->headerData( col, Qt::Horizontal, Qt::DisplayRole).toString().startsWith(" ")) { hideColumn(col); } else VisibleColumns++; } } // hiding columns sends signal sectionResized ColumnsResized = false; resizeColumnsToContents(); if (VisibleColumns == 1 && ReadableColumns) setColumnWidth(1, viewport()->width()); } void toResultTableView::displayMenu(const QPoint &pos) { if (!Menu) { Menu = new QMenu(this); Menu->addAction(displayAct); Menu->addAction(refreshAct); QMenu *just = new QMenu(tr("A&lignment"), this); just->addAction(leftAct); just->addAction(centerAct); just->addAction(rightAct); connect(just, SIGNAL(triggered(QAction *)), this, SLOT(menuCallback(QAction *))); Menu->addAction(just->menuAction()); Menu->addSeparator(); Menu->addAction(copyAct); Menu->addAction(copyFormatAct); // not implemented // Menu->addAction(copyTransAct); Menu->addSeparator(); Menu->addAction(selectAllAct); Menu->addSeparator(); Menu->addAction(exportAct); Menu->addSeparator(); Menu->addAction(editAct); Menu->addSeparator(); Menu->addAction(rowCountAct); Menu->addAction(readAllAct); connect(Menu, SIGNAL(triggered(QAction *)), this, SLOT(menuCallback(QAction *))); emit displayMenu(Menu); } Menu->exec(QCursor::pos()); } void toResultTableView::menuCallback(QAction *action) { QModelIndex index = currentIndex(); if (!index.isValid()) return; if (action == displayAct) { QVariant data = model()->data(index, Qt::EditRole); toModelEditor *ed = new toModelEditor(this, model(), index); ed->exec(); } else if (action == leftAct) Model->setAlignment(index.column(), Qt::AlignLeft); else if (action == rightAct) Model->setAlignment(index.column(), Qt::AlignRight); else if (action == centerAct) Model->setAlignment(index.column(), Qt::AlignHCenter); else if (action == copyAct) editCopy(); else if (action == selectAllAct) editSelectAll(); else if (action == editAct) toMainWidget()->editSQL(sqlName()); else if (action == readAllAct || action == rowCountAct) { Model->readAll(); if (action == rowCountAct) { int count = Model->rowCount(); TOMessageBox::information( this, tr("Row Count"), tr("%1 row%2.").arg(count).arg(count > 1 ? "s" : 0)); } } else if (action == refreshAct) refresh(); else if (action == exportAct) editSave(false); else if (action == copyFormatAct) { toResultListFormat exp(this, toResultListFormat::TypeCopy); if (!exp.exec()) return; QString t = exportAsText(exp.exportSettings()); QClipboard *clip = qApp->clipboard(); clip->setText(t); } } void toResultTableView::handleDone(void) { readAllAct->setEnabled(false); applyFilter(); Ready = true; Finished = true; Working->hide(); emit done(); } void toResultTableView::handleReset(void) { if (ReadAll) Model->readAll(); } void toResultTableView::handleFirst(const toConnection::exception &res, bool error) { applyColumnRules(); Ready = true; Working->hide(); emit firstResult(sql(), res, error); } void toResultTableView::handleDoubleClick(const QModelIndex &index) { if (Editable) return; QVariant data = model()->data(index, Qt::EditRole); toModelEditor *ed = new toModelEditor(this, model(), index); ed->exec(); } void toResultTableView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) { QTableView::selectionChanged(selected, deselected); emit selectionChanged(); } bool toResultTableView::running(void) { if (!Model) return false; QModelIndex index = currentIndex(); return Model->canFetchMore(index); } bool toResultTableView::searchNext(const QString & text) { QModelIndex index = currentIndex(); int row = currentIndex().row(); int col = currentIndex().column() + 1; bool cs = toMainWidget()->searchDialog()->caseSensitive(); bool ww = toMainWidget()->searchDialog()->wholeWords(); bool rx = toMainWidget()->searchDialog()->searchMode() == Search::SearchRegexp; QString currentText; QString realSearch(text); if (!cs) realSearch = realSearch.toUpper(); bool stop = false; while (row < Model->rowCount()) { while (col < Model->columnCount()) { currentText = Model->data(Model->index(row, col)).toString().trimmed(); if (!cs) currentText = currentText.toUpper(); if (rx && currentText.contains(QRegExp(text))) stop = true; else if ((ww && currentText == realSearch) || (!ww && currentText.contains(realSearch))) stop = true; if (stop) { setCurrentIndex(Model->index(row, col)); return true; } ++col; } ++row; col = 0; } return false; } bool toResultTableView::searchPrevious(const QString & text) { QModelIndex index = currentIndex(); int row = currentIndex().row(); int col = currentIndex().column() - 1; bool cs = toMainWidget()->searchDialog()->caseSensitive(); bool ww = toMainWidget()->searchDialog()->wholeWords(); bool rx = toMainWidget()->searchDialog()->searchMode() == Search::SearchRegexp; QString currentText; QString realSearch(text); if (!cs) realSearch = realSearch.toUpper(); bool stop = false; while (row >= 0) { while (col >= 0) { currentText = Model->data(Model->index(row, col)).toString().trimmed(); if (!cs) currentText = currentText.toUpper(); if (rx && currentText.contains(QRegExp(text))) stop = true; else if ((ww && currentText == realSearch) || (!ww && currentText.contains(realSearch))) stop = true; if (stop) { setCurrentIndex(Model->index(row, col)); return true; } --col; } --row; col = Model->columnCount(); } return false; } void toResultTableView::setFilter(toViewFilter *filter) { if(Filter) delete Filter; Filter = filter; } void toResultTableView::setModel(toResultModel *model) { // if(running()) // throw tr("Cannot change model while query is running."); Model = QPointer(model); QTableView::setModel(model); } bool toResultTableView::isRowSelected(QModelIndex index) { QModelIndexList sel = selectedIndexes(); for (QModelIndexList::iterator it = sel.begin(); it != sel.end(); it++) { if ((*it).row() == index.row()) return true; } return false; } QModelIndex toResultTableView::selectedIndex(int col) { // should only have one anyhow. just take first. QModelIndexList sel = selectedIndexes(); if (sel.size() < 1) return QModelIndex(); return model()->index(sel[0].row(), col); } QString toResultTableView::exportAsText(toExportSettings settings) { if (settings.requireSelection()) settings.selected = selectedIndexes(); if (settings.rowsExport == toExportSettings::RowsAll) { QProgressDialog progress("Fetching All Data...", "Abort", 0, 2, parentWidget()); progress.setWindowModality(Qt::WindowModal); progress.show(); // prevent scrolling in table view this->clearSelection(); this->setEnabled(false); while (!Finished) { qApp->processEvents(); if (progress.wasCanceled()) break; if (Model->canFetchMore(currentIndex())) Model->fetchMore(currentIndex()); progress.setValue(progress.value() == 0 ? 1 : 0); } this->setEnabled(true); progress.setValue(2); } std::auto_ptr pFormatter( toListViewFormatterFactory::Instance().CreateObject(settings.type)); settings.owner = Owner; settings.objectName = Table; return pFormatter->getFormattedString(settings, model()); } // ---------------------------------------- overrides toEditWidget bool toResultTableView::editSave(bool askfile) { try { toResultListFormat exp(this, toResultListFormat::TypeExport); if (!exp.exec()) return false; toExportSettings settings = exp.exportSettings(); QString filename = toSaveFilename(QString::null, settings.extension, this); if (filename.isEmpty()) return false; return toWriteFile(filename, exportAsText(settings)); } TOCATCH; return false; } void toResultTableView::editPrint() { } void toResultTableView::editCopy() { QClipboard *clip = qApp->clipboard(); // if there's a selection, then export as text to clipboard QModelIndexList sel = selectedIndexes(); if (sel.size() > 1) { toExportSettings settings = toResultListFormat::plaintextCopySettings(); settings.selected = sel; clip->setText(exportAsText(settings)); } else { QModelIndex index = currentIndex(); QVariant data = model()->data(index, Qt::EditRole); if (data.canConvert()) clip->setText(data.toString()); } } void toResultTableView::editSelectAll() { selectAll(); } void toResultTableView::resizeColumnsToContents() { if (!ColumnsResized) QTableView::resizeColumnsToContents(); } void toResultTableView::columnWasResized(int, int, int) { ColumnsResized = true; } void toResultTableView::refresh() { // todo. save column sizes. horizontalHeader()->restoreState(st); // didn't work. toResult::refresh(); } // ---------------------------------------- iterator /** * Create an iterator starting at 0 on a view * */ toTableViewIterator::toTableViewIterator(toResultTableView *view) { _row = 0; _view = view; updateIndex(); } /** * Create a copy of other * */ toTableViewIterator::toTableViewIterator(toTableViewIterator &other) { _row = other._row; _view = other._view; updateIndex(); } void toTableViewIterator::updateIndex(void) { if (_view && _view->model() && _row < _view->model()->rowCount()) _index = _view->model()->index(_row, 1); // skip numbercolumn else _index = QModelIndex(); } /** * Get a QModelIndex for this row. May be invalid if you've gone * too far. Check with QModelIndex.isValid() * */ QModelIndex toTableViewIterator::operator*() const { return _index; } /** * Increment by one * */ toTableViewIterator& toTableViewIterator::operator++() { _row++; updateIndex(); return *this; } /** * Postfix operator * */ const toTableViewIterator toTableViewIterator::operator++(int) { toTableViewIterator tmp(*this); ++(*this); updateIndex(); return tmp; } /** * Go forward by n * */ toTableViewIterator& toTableViewIterator::operator+=(int n) { _row += n; updateIndex(); return *this; } /** * Decrement by one * */ toTableViewIterator& toTableViewIterator::operator--() { _row--; updateIndex(); return *this; } /** * Postfix operator * */ const toTableViewIterator toTableViewIterator::operator--(int) { toTableViewIterator tmp(*this); --(*this); updateIndex(); return tmp; } /** * Go back by n * */ toTableViewIterator& toTableViewIterator::operator-=(int n) { _row -= n; updateIndex(); return *this; } /** * Make a copy of it and return a reference * */ toTableViewIterator& toTableViewIterator::operator=(const toTableViewIterator & it) { _row = it._row; _view = it._view; updateIndex(); return *this; } tora-2.1.3/src/Makefile.am0000644000175000017500000003674411445450560015115 0ustar michaelmichael# require version or better AUTOMAKE_OPTIONS = 1.7 bin_PROGRAMS=tora METASOURCES = AUTO TRANSLATIONS= \ i18n/tora_se.ts \ i18n/tora_fr.ts \ i18n/tora_it.ts \ i18n/tora_toad.ts LOKIDIR_INC=$(top_srcdir)/src/loki/include LOKIDIR_SRC=$(top_srcdir)/src/loki/src AM_CPPFLAGS = -I./otl -I$(LOKIDIR_INC) $(QT_INCLUDES) $(LTDLINCL) AM_CPPFLAGS += $(PCRE_CFLAGS) \ -DDEFAULT_PLUGIN_DIR=\"$(libdir)\" \ -DTOVERSION=\"$(PACKAGE_VERSION)\" \ $(ORACLE_CXXFLAGS) \ $(TERADATA_CXXFLAGS) \ $(QT_DEFINES) \ $(WIN_CXXFLAGS) \ $(QSCINTILLA_CXXFLAGS) AM_LDFLAGS = $(PCRE_LIBS) \ $(QT_LDFLAGS) \ $(LIB_DCOP) \ -lstdc++ \ $(LIBPTHREAD) \ $(ORACLE_LDFLAGS) \ $(TERADATA_LDFLAGS) \ $(WIN_LDFLAGS) \ $(QSCINTILLA_LDFLAGS) # fix for annoying automake naming problems. tora_CXXFLAGS = $(AM_CXXFLAGS) tora_LDADD = $(ORACLE_LIBS) $(PQ_LIBS) $(TERADATA_LIBS) $(@TORA_LINK_OTHERS@) if HAVE_ORACLE EXTRA_ORACLE_MONO_SOURCE = tooracleconnection.cpp tooraclesetting.h \ tooracletable.cpp \ tooracleextract.cpp otl/otlv4.h EXTRA_ORACLE_MONO_SOURCE_MOC = moc_tooraclesetting.cpp endif if HAVE_TERADATA EXTRA_TERADATE_SOURCE = toteradataconnection.cpp endif tora_SOURCES=main.cpp \ tomainwindow.cpp tomainwindow.h \ toabout.cpp toabout.h \ tobackground.cpp tobackground.h \ tobackgroundlabel.cpp tobackgroundlabel.h \ toconfiguration.cpp toconfiguration.h \ toconnection.cpp toconnection.h \ toqvalue.cpp toqvalue.h \ toconnectionimport.cpp toconnectionimport.h \ toconnectionpool.cpp toconnectionpool.h \ todescribe.cpp todescribe.h \ torunnable.cpp torunnable.h \ toeditwidget.cpp toeditwidget.h \ toglobalsetting.cpp toglobalsetting.h \ tohelp.cpp tohelp.h tohelpsetup.h \ tohighlightedtext.cpp tohighlightedtext.h \ tohtml.cpp tohtml.h \ tolistviewformatter.cpp tolistviewformatter.h \ tolistviewformattercsv.cpp tolistviewformattercsv.h \ tolistviewformatterfactory.h \ tolistviewformatterhtml.cpp tolistviewformatterhtml.h \ tolistviewformatteridentifier.h \ tolistviewformattersql.cpp tolistviewformattersql.h \ tolistviewformattertabdel.cpp tolistviewformattertabdel.h \ tolistviewformattertext.cpp tolistviewformattertext.h \ tomain.cpp tomain.h \ tomarkedtext.cpp tomarkedtext.h \ tomemoeditor.cpp tomemoeditor.h \ tomodeleditor.cpp tomodeleditor.h \ tomessage.cpp tomessage.h \ tonewconnection.cpp tonewconnection.h \ tonoblockquery.cpp tonoblockquery.h \ toeventquery.cpp toeventquery.h \ toeventquerytask.cpp toeventquerytask.h \ toparamget.cpp toparamget.h \ topreferences.cpp topreferences.h \ toplsqleditor.cpp toplsqleditor.h \ toplsqltext.cpp toplsqltext.h \ toresult.cpp toresult.h \ toresultfield.cpp toresultfield.h \ toresultitem.cpp toresultitem.h \ toresultstats.cpp toresultstats.h \ toresultview.cpp toresultview.h \ toresultlistformat.cpp toresultlistformat.h \ toresultmodel.cpp toresultmodel.h \ toresulttableview.cpp toresulttableview.h \ toresulttableviewedit.cpp toresulttableviewedit.h \ toresultdata.cpp toresultdata.h \ toresultdatasingle.cpp toresultdatasingle.h \ totreewidget.cpp totreewidget.h \ tosearchreplace.cpp tosearchreplace.h \ tosmtp.cpp tosmtp.h \ tosplash.cpp tosplash.h \ tosql.cpp tosql.h \ tosqlparse.cpp tosqlparse.h \ tosyntaxsetup.cpp tosyntaxsetup.h \ totabwidget.cpp totabwidget.h \ totemplateprovider.cpp \ totextview.cpp totextview.h \ tothread.cpp tothread.h tothread_p.h \ totimer.cpp totimer.h \ totool.cpp totool.h \ utils.cpp utils.h \ toalert.cpp toalert.h \ toanalyze.cpp toanalyze.h \ tobackup.cpp tobackup.h \ tobackuptool.cpp tobackuptool.h \ tobrowser.cpp tobrowser.h \ todocklet.cpp todocklet.h \ todockbar.cpp todockbar.h \ topushbutton.cpp topushbutton.h \ docklets/toviewdirectory.cpp docklets/toviewdirectory.h \ docklets/toviewconnections.cpp docklets/toviewconnections.h \ tobarchart.cpp tobarchart.h \ tocurrent.cpp tocurrent.h \ todebug.cpp todebug.h \ toeditextensions.cpp toeditextensions.h \ todatatype.cpp todatatype.h \ toinvalid.cpp toinvalid.h \ tooutput.cpp tooutput.h \ topassword.cpp \ toprofiler.cpp toprofiler.h \ toproject.cpp toproject.h \ toqsqlconnection.cpp \ torollback.cpp torollback.h \ toscript.cpp toscript.h \ toscriptschemawidget.cpp toscriptschemawidget.h \ toscripttreeitem.cpp toscripttreeitem.h \ tocodemodel.cpp tocodemodel.h \ toscripttreemodel.cpp toscripttreemodel.h \ tosecurity.cpp tosecurity.h \ tosecuritytreemodel.cpp tosecuritytreemodel.h \ tosecuritytreeitem.cpp tosecuritytreeitem.h \ tosession.cpp tosession.h \ tosgatrace.cpp tosgatrace.h \ tosqledit.cpp tosqledit.h \ tostorage.cpp tostorage.h \ tostoragedefinition.cpp tostoragedefinition.h \ totemplate.cpp totemplate.h \ totemporary.cpp totemporary.h \ totuning.cpp totuning.h \ tounittest.cpp tounittest.h \ tochangeconnection.cpp tochangeconnection.h \ toworkingwidget.cpp toworkingwidget.h \ toworksheet.cpp toworksheet.h \ toeditablemenu.cpp toeditablemenu.h \ toworksheetwidget.cpp toworksheetwidget.h \ toworksheettext.cpp toworksheettext.h \ toworksheetstatistic.cpp toworksheetstatistic.h \ tobrowserconstraint.cpp tobrowserconstraint.h \ tobrowserindex.cpp tobrowserindex.h \ tobrowsertable.cpp tobrowsertable.h \ tochartmanager.cpp tochartmanager.h \ tolegendchart.cpp tolegendchart.h \ tolinechart.cpp tolinechart.h \ topiechart.cpp topiechart.h \ toresultbar.cpp toresultbar.h \ toresultline.cpp toresultline.h \ toresultpie.cpp toresultpie.h \ todebugtext.cpp todebugtext.h \ toextract.cpp toextract.h \ toreport.cpp toreport.h \ toresultextract.cpp toresultextract.h \ toresultcols.cpp toresultcols.h \ toresultcolscomment.cpp toresultcolscomment.h \ toresultcombo.cpp toresultcombo.h \ toresultschema.cpp toresultschema.h \ toresultdepend.cpp toresultdepend.h \ toresultlabel.cpp toresultlabel.h \ toresultlock.cpp toresultlock.h \ toresultlong.cpp toresultlong.h \ toresultplan.cpp toresultplan.h \ toresultparam.cpp toresultparam.h \ toresultstorage.cpp toresultstorage.h \ tofilesize.cpp tofilesize.h \ tosgastatement.cpp tosgastatement.h \ totableselect.cpp totableselect.h \ tovisualize.cpp tovisualize.h \ towaitevents.cpp towaitevents.h \ toconnectionmodel.cpp toconnectionmodel.h \ tobrowserbasewidget.cpp tobrowserbasewidget.h \ tobrowseraccesswidget.cpp tobrowseraccesswidget.h \ tobrowsertablewidget.cpp tobrowsertablewidget.h \ tobrowserviewwidget.cpp tobrowserviewwidget.h \ tobrowserindexwidget.cpp tobrowserindexwidget.h \ tobrowserschemawidget.cpp tobrowserschemawidget.h \ tobrowsersequencewidget.cpp tobrowsersequencewidget.h \ tobrowsersynonymwidget.cpp tobrowsersynonymwidget.h \ tobrowsercodewidget.cpp tobrowsercodewidget.h \ tobrowsertriggerwidget.cpp tobrowsertriggerwidget.h \ tobrowserdblinkswidget.cpp tobrowserdblinkswidget.h \ tobrowserdirectorieswidget.cpp tobrowserdirectorieswidget.h \ toresultgrants.cpp toresultgrants.h \ toawr.cpp toawr.h \ precompiled.h \ migratetool/sqldeveloper.cpp migratetool/sqldeveloper.h \ migratetool/squirrelsql.cpp migratetool/squirrelsql.h \ migratetool/tora3.cpp migratetool/tora3.h \ shortcuteditor/shortcuteditordialog.cpp shortcuteditor/shortcuteditordialog.h \ shortcuteditor/shortcutmodel.cpp shortcuteditor/shortcutmodel.h \ $(EXTRA_ORACLE_MONO_SOURCE) \ $(EXTRA_TERADATE_SOURCE) \ $(LOKIDIR_SRC)/SmallObj.cpp \ $(LOKIDIR_SRC)/Singleton.cpp \ $(EXTRA_tora_SOURCES) \ $(BUILT_SOURCES) UI_FILES = toaboutui.ui \ tobrowserconstraintui.ui \ tobrowserfilterui.ui \ tobrowserindexui.ui \ tobrowsertableui.ui \ toconnectionimportui.ui \ todescribeui.ui \ tooraclesettingui.ui \ tostoragetablespaceui.ui \ tochartalarmui.ui \ topreferencesui.ui \ tosyntaxsetupui.ui \ tochartsetupui.ui \ toresultcontentfilterui.ui \ totemplateaddfileui.ui \ todatabasesettingui.ui \ toresultlistformatui.ui \ totemplateeditui.ui \ todebugchangeui.ui \ torollbackdialogui.ui \ totemplatesetupui.ui \ todebugwatch.ui \ toscriptui.ui \ toscriptschemawidgetui.ui \ totoolsettingui.ui \ toeditextensiongotoui.ui \ tosearchreplaceui.ui \ totuningoverviewui.ui \ toeditextensionsetupui.ui \ tosecurityquotaui.ui \ totuningsettingui.ui \ toglobalsettingui.ui \ tosecurityroleui.ui \ toworksheetsetupui.ui \ tohelpui.ui \ tohelpaddfileui.ui \ tosecurityuserui.ui \ tohelpsetupui.ui \ tostoragedatafileui.ui \ tolinechartsetupui.ui \ tostoragedefinitionui.ui \ tomessageui.ui \ tostoragedialogui.ui \ tonewconnectionui.ui \ tostorageprefsui.ui \ todroptablespaceui.ui \ toscriptschemawidgetui.ui \ shortcuteditor/shortcuteditordialog.ui \ connectioncolorsdialogui.ui EXTRA_DIST = icons \ templates \ windows \ qscintilla2 \ COPYRIGHT.h \ help \ $(LOKIDIR_INC) \ $(UI_FILES) \ CMakeLists.txt \ loki/CMakeLists.txt \ Makefile.am \ toconf.h \ todefaultkeywords.h \ toextratranslations.cpp \ tomysqlkeywords.h \ toocistub.cpp \ tooraclepreload.cpp \ toresultresources.h \ tooracleextract.h \ tologger.h \ ts_log/critical_section.h \ ts_log/decorator.h \ ts_log/message_handler_log.h \ ts_log/thread_safe_log.h \ ts_log/ts_log_utils.h \ $(TRANSLATIONS) \ LICENSE.h \ tora.qrc \ tora.rc # this is a hack (but it *is* mentioned in the automake manual, of all # places). EXTRA_DIST includes all files, even things like CVS # folders. so we delete them here. but specifying all the files in # those subdirs would suck more because many of them are generated # (help api for one). dist-hook: rm -rf `find $(distdir) -name .svn` # mrj: this sorta sucks. there's a lot of generated source files... # the old build system distributed the .depends folder in the source # tarball, which is the old way of handling the dependencies. that's # not fully portable. using BUILT_SOURCES is the (relatively speaking) # new work around. this is mainly why i've required automake >= 1.6. # files listed in BUILT_SOURCES are built before anything else. BUILT_SOURCES = \ moc_toabout.cpp \ moc_toalert.cpp \ moc_toanalyze.cpp \ moc_tobackup.cpp \ moc_tobarchart.cpp \ moc_tobackgroundlabel.cpp \ moc_tobrowser.cpp \ moc_tobrowserconstraint.cpp \ moc_tobrowserindex.cpp \ moc_tobrowsertable.cpp \ moc_tochangeconnection.cpp \ moc_tochartmanager.cpp \ moc_toconnection.cpp \ moc_toconnectionmodel.cpp \ moc_tocodemodel.cpp \ moc_toconnectionpool.cpp \ moc_toconnectionimport.cpp \ moc_todescribe.cpp \ moc_torunnable.cpp \ moc_tonoblockquery.cpp \ moc_toeventquery.cpp \ moc_toeventquerytask.cpp \ moc_tocurrent.cpp \ moc_todatatype.cpp \ moc_todebug.cpp \ moc_todebugtext.cpp \ moc_toeditextensions.cpp \ moc_tofilesize.cpp \ moc_toglobalsetting.cpp \ moc_tohelp.cpp \ moc_tohelpsetup.cpp \ moc_tohighlightedtext.cpp \ moc_toinvalid.cpp \ moc_tolegendchart.cpp \ moc_tolinechart.cpp \ moc_tomain.cpp \ moc_tomainwindow.cpp \ moc_tomarkedtext.cpp \ moc_tomemoeditor.cpp \ moc_tomodeleditor.cpp \ moc_tomessage.cpp \ moc_tonewconnection.cpp \ moc_tooutput.cpp \ moc_toparamget.cpp \ moc_topiechart.cpp \ moc_toplsqleditor.cpp \ moc_toplsqltext.cpp \ moc_topreferences.cpp \ moc_toprofiler.cpp \ moc_toproject.cpp \ moc_toresult.cpp \ moc_toresultbar.cpp \ moc_toresultcols.cpp \ moc_toresultcolscomment.cpp \ moc_toresultcombo.cpp \ moc_toresultschema.cpp \ moc_toresultdepend.cpp \ moc_toresultextract.cpp \ moc_toresultfield.cpp \ moc_toresultitem.cpp \ moc_toresultlabel.cpp \ moc_toresultline.cpp \ moc_toresultlock.cpp \ moc_toresultlong.cpp \ moc_toresultparam.cpp \ moc_toresultpie.cpp \ moc_toresultplan.cpp \ moc_toresultstats.cpp \ moc_toresultstorage.cpp \ moc_toresultview.cpp \ moc_toresultlistformat.cpp \ moc_toresultmodel.cpp \ moc_toresulttableview.cpp \ moc_toresulttableviewedit.cpp \ moc_toresultdata.cpp \ moc_toresultdatasingle.cpp \ moc_totreewidget.cpp \ moc_torollback.cpp \ moc_toscript.cpp \ moc_tosearchreplace.cpp \ moc_tosecurity.cpp \ moc_tosecuritytreemodel.cpp \ moc_tosession.cpp \ moc_tosgastatement.cpp \ moc_tosgatrace.cpp \ moc_tosmtp.cpp \ moc_tosqledit.cpp \ moc_tostorage.cpp \ moc_tosyntaxsetup.cpp \ moc_totableselect.cpp \ moc_totabwidget.cpp \ moc_totemplate.cpp \ moc_totemporary.cpp \ moc_tothread_p.cpp \ moc_totool.cpp \ moc_totuning.cpp \ moc_tounittest.cpp \ moc_tovisualize.cpp \ moc_towaitevents.cpp \ moc_toworksheet.cpp \ moc_toeditablemenu.cpp \ moc_toworksheetwidget.cpp \ moc_toworksheetstatistic.cpp \ moc_utils.cpp \ moc_toscriptschemawidget.cpp \ moc_toscripttreemodel.cpp \ moc_toworkingwidget.cpp \ shortcuteditor/moc_shortcuteditordialog.cpp \ shortcuteditor/moc_shortcutmodel.cpp \ moc_todocklet.cpp \ moc_todockbar.cpp \ moc_topushbutton.cpp \ moc_tobrowserbasewidget.cpp \ moc_tobrowseraccesswidget.cpp \ moc_tobrowsertablewidget.cpp \ moc_tobrowserviewwidget.cpp \ moc_tobrowserindexwidget.cpp \ moc_tobrowserschemawidget.cpp \ moc_tobrowsersequencewidget.cpp \ moc_tobrowsersynonymwidget.cpp \ moc_tobrowsercodewidget.cpp \ moc_tobrowsertriggerwidget.cpp \ moc_tobrowserdblinkswidget.cpp \ moc_tobrowserdirectorieswidget.cpp \ moc_toresultgrants.cpp \ docklets/moc_toviewdirectory.cpp \ docklets/moc_toviewconnections.cpp \ ui_toaboutui.h \ ui_todroptablespaceui.h \ ui_tobrowserconstraintui.h \ ui_tobrowserfilterui.h \ ui_tobrowserindexui.h \ ui_todescribeui.h \ ui_tobrowsertableui.h \ ui_toconnectionimportui.h \ ui_tochartalarmui.h \ ui_tochartsetupui.h \ ui_todatabasesettingui.h \ ui_todebugchangeui.h \ ui_todebugwatch.h \ ui_toeditextensiongotoui.h \ ui_toeditextensionsetupui.h \ ui_toglobalsettingui.h \ ui_tohelpaddfileui.h \ ui_tohelpsetupui.h \ ui_tolinechartsetupui.h \ ui_tomessageui.h \ ui_tonewconnectionui.h \ ui_tooraclesettingui.h \ ui_topreferencesui.h \ ui_toresultcontentfilterui.h \ ui_toresultlistformatui.h \ ui_torollbackdialogui.h \ ui_toscriptui.h \ ui_tosearchreplaceui.h \ ui_tosecurityquotaui.h \ ui_tosecurityroleui.h \ ui_tosecurityuserui.h \ ui_tostoragedatafileui.h \ ui_tostoragedefinitionui.h \ ui_tostoragedialogui.h \ ui_tostorageprefsui.h \ ui_tostoragetablespaceui.h \ ui_tosyntaxsetupui.h \ ui_totemplateaddfileui.h \ ui_totemplateeditui.h \ ui_totemplatesetupui.h \ ui_totoolsettingui.h \ ui_totuningoverviewui.h \ ui_totuningsettingui.h \ ui_toworksheetsetupui.h \ ui_tohelpui.h \ ui_toscriptschemawidgetui.h \ ui_connectioncolorsdialogui.h \ shortcuteditor/ui_shortcuteditordialog.h \ $(EXTRA_ORACLE_MONO_SOURCE_MOC) \ $(filter %.qm,$(TRANSLATIONS:%.ts=%.qm)) \ tora_toad.h \ qrc_tora.cpp #.ui.h: # $(UIC) -o $@ $< ui_%.h: %.ui $(UIC) -o $@ $< %.cpp: %.h %.ui $(UIC) -o $@ $< moc_%.cpp: %.h $(MOC) $< -o $@ qrc_%.cpp: %.qrc $(RCC) $< -o $@ #make resource file depend on resources qrc_tora.cpp: help/*.html help/images/*.png icons/*.xpm #.h.moc: # $(MOC) $(AM_CPPFLAGS) -o $@ $< .ts.qm: @if ! test -d i18n; then mkdir i18n; echo "create i18n"; fi $(LRELEASE) $< -qm $@ clean-local: rm -f moc_* for file in `ls *.ui`; do \ rm -f `echo $$file | sed 's/\.ui/\.cpp/g'`; \ rm -f `echo $$file | sed 's/\.ui/\.h/g'`; \ done tora_toad.h: i18n/tora_toad.qm $(top_builddir)/utils/chex/chex $< > $@ tora.pro: Makefile.am echo "# Not indended to be used for anything except lupdate" > tora.pro echo 'SOURCES= \ ' >> tora.pro echo ' main.cpp \ ' >> tora.pro echo ' toextratranslations.cpp \ ' >> tora.pro echo " $(tora_SOURCES)" >> tora.pro echo 'TRANSLATIONS=$(TRANSLATIONS)' >> tora.pro lupdate: tora.pro $(LUPDATE) tora.pro lrelease: tora.pro $(TRANSLATIONS) $(LRELEASE) tora.pro install-data-hook: mkdir -p $(DESTDIR)$(libdir) cp -f $(top_builddir)/src/i18n/*.qm $(DESTDIR)$(libdir) tora-2.1.3/src/toinvalid.cpp0000644000175000017500000002436411332067047015550 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "tochangeconnection.h" #include "toconf.h" #include "toconnection.h" #include "toextract.h" #include "tohighlightedtext.h" #include "toinvalid.h" #include "tomain.h" #include "toresultextract.h" #include "toresulttableview.h" #include "toresultview.h" #include "tosql.h" #include "totool.h" #include #include #include #include #include #include #include #include "icons/refresh.xpm" #include "icons/toinvalid.xpm" #include "icons/compile.xpm" static toSQL SQLListInvalid("toInvalid:ListInvalid", "SELECT owner \"Owner\",object_name \"Object\",object_type \"Type\",status \"Status\"\n" " FROM sys.all_objects\n" " WHERE status <> 'VALID'", "Get invalid objects, must have same first three columns."); static toSQL SQLListSource("toInvalid:ListSource", "SELECT Text FROM SYS.ALL_SOURCE\n" " WHERE Owner = :f1 AND Name = :f2 AND type = :f3", "List source of an object."); static toSQL SQLReadErrors("toInvalid:ReadErrors", "SELECT Line-1,Text FROM sys.All_Errors\n" " WHERE OWNER = :f1\n" " AND NAME = :f2\n" " AND TYPE = :f3", " ORDER BY Type,Line", "Get lines with errors in object (Observe first line 0)"); class toInvalidTool : public toTool { virtual const char **pictureXPM(void) { return const_cast(toinvalid_xpm); } public: toInvalidTool() : toTool(130, "Invalid Objects") { } virtual const char *menuItem() { return "Invalid Objects"; } virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) { return new toInvalid(parent, connection); } virtual void closeWindow(toConnection &connection) {}; }; static toInvalidTool InvalidTool; toInvalid::toInvalid(QWidget *main, toConnection &connection) : toToolWidget(InvalidTool, "invalid.html", main, connection, "toInvalid") { QToolBar *toolbar = toAllocBar(this, tr("Invalid Objects")); layout()->addWidget(toolbar); QAction *refreshAct = toolbar->addAction( QIcon(QPixmap(const_cast(refresh_xpm))), tr("Refresh list"), this, SLOT(refresh())); refreshAct->setShortcut(QKeySequence::Refresh); toolbar->addAction(QIcon(QPixmap(const_cast(compile_xpm))), tr("Recompile all invalid"), this, SLOT(recompileSelected())); toolbar->addWidget(new toSpacer()); new toChangeConnection(toolbar, TO_TOOLBAR_WIDGET_NAME); QSplitter *splitter = new QSplitter(Qt::Horizontal, this); layout()->addWidget(splitter); Objects = new toResultTableView(false, false, splitter); Objects->setSQL(SQLListInvalid); connect(Objects, SIGNAL(selectionChanged()), this, SLOT(changeSelection())); Source = new toResultExtract(false, splitter); Source->setSQL(SQLListSource); connect(Source, SIGNAL(executed()), this, SLOT(refresh())); refresh(); setFocusProxy(Objects); } #include void toInvalid::recompileSelected(void) { QProgressDialog progress(tr("Recompiling all invalid"), tr("Cancel"), 0, Objects->model()->rowCount(), this); progress.setWindowTitle("Recompiling"); progress.show(); for (toResultTableView::iterator it(Objects); (*it).isValid(); it++) { toConnection &conn = connection(); progress.setLabelText("Recompiling " + Objects->model()->data((*it).row(), 2).toString() + "." + Objects->model()->data((*it).row(), 3).toString()); progress.setValue(progress.value() + 1); qApp->processEvents(); if (progress.wasCanceled()) break; QString type = Objects->model()->data((*it).row(), 3).toString(); QString name = Objects->model()->data((*it).row(), 2).toString(); QString sql; if (type == "INDEX") sql = "ALTER " + type + " " + conn.quote(Objects->model()->data((*it).row(), 1).toString()) + "." + conn.quote(name) + " REBUILD"; else if (type == "PACKAGE BODY") sql = "ALTER PACKAGE " + conn.quote(Objects->model()->data((*it).row(), 1).toString()) + "." + conn.quote(Objects->model()->data((*it).row(), 2).toString()) + " COMPILE BODY"; else if ((type == "SYNONYM") && (Objects->model()->data((*it).row(), 1).toString() == "PUBLIC")) { // only SYS user is allowed to do ALTER PUBLIC SYNONYM ... // other users can only do CREATE OR REPLACE PUBLIC SYNONYM ... std::list objects; toExtract extract(conn, NULL); extract.setCode(true); extract.setHeading(false); extract.setPrompt(false); extract.setReplace(true); // get create OR REPLACE statement objects.insert(objects.end(), type + QString::fromLatin1(":") + "PUBLIC" + QString::fromLatin1(".") + name); sql = extract.create(objects); } else sql = "ALTER " + Objects->model()->data((*it).row(), 3).toString() + " " + conn.quote(Objects->model()->data((*it).row(), 1).toString()) + "." + conn.quote(Objects->model()->data((*it).row(), 2).toString()) + " COMPILE"; try { // remove trailing newlines, spaces, tabs and semicolons from execution // as this could cause "execution" of empty statement (doing nothing) int l = sql.length() - 1; while (l >= 0 && (sql.at(l) == ';' || sql.at(l).isSpace())) l--; #ifdef DEBUG qDebug() << "statement=" << sql.mid(0, l + 1); #endif if (l >= 0) conn.execute(sql.mid(0, l + 1)); } catch (...) {} } if (progress.isVisible()) progress.close(); qApp->processEvents(); this->refresh(); } void toInvalid::refresh(void) { QModelIndex item = Objects->selectedIndex(); QString owner; QString object; QString type; if (item.isValid()) { owner = Objects->model()->data(item.row(), 1).toString(); object = Objects->model()->data(item.row(), 2).toString(); type = Objects->model()->data(item.row(), 3).toString(); } Objects->refresh(); if (item.isValid()) { for (toResultTableView::iterator it(Objects); (*it).isValid(); it++) { if (Objects->model()->data(item.row(), 1).toString() == owner && Objects->model()->data(item.row(), 2).toString() == object && Objects->model()->data(item.row(), 3).toString() == type) { Objects->selectionModel()->select(QItemSelection((*it), (*it)), QItemSelectionModel::ClearAndSelect); Objects->setCurrentIndex((*it)); break; } } changeSelection(); } } void toInvalid::changeSelection(void) { try { QModelIndex item = Objects->selectedIndex(); if (item.isValid()) { Source->changeParams(Objects->model()->data(item.row(), 1).toString(), Objects->model()->data(item.row(), 2).toString(), Objects->model()->data(item.row(), 3).toString()); QMap Errors; toQuery errors(connection(), SQLReadErrors, Objects->model()->data(item.row(), 1).toString(), Objects->model()->data(item.row(), 2).toString(), Objects->model()->data(item.row(), 3).toString()); while (!errors.eof()) { int line = errors.readValue().toInt(); Errors[line] += QString::fromLatin1(" "); Errors[line] += errors.readValue(); } Source->editor()->setErrors(Errors); } } TOCATCH; } tora-2.1.3/src/main.cpp0000644000175000017500000002307711270353625014504 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toabout.h" #include "toconf.h" #include "toconnection.h" #include "tohighlightedtext.h" #include "tomain.h" #include "tosql.h" #include "totool.h" // qt4 in via the qtranslator // #include "tora_toad.h" #ifndef Q_OS_WIN32 #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #ifndef TOMONOLITHIC #include #include #include #include #include #include #endif bool toMonolithic(void) { #ifdef TOMONOLITHIC return true; #else return false; #endif } // void toUpdateIndicateEmpty(void); int main(int argc, char **argv) { toConfiguration::setQSettingsEnv(); /*! \warning: Keep the code before QApplication init as small as possible. There could be serious display issues when you construct some Qt classes before QApplication. It's the same for global static stuff - some instances can break it (e.g. qscintilla lexers etc.). */ QApplication app(argc, argv); QString style(toConfigurationSingle::Instance().style()); if (!style.isEmpty()) QApplication::setStyle(QStyleFactory::create(style)); // Set the default codec to use for QString QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); try { // qt4 if (getenv("LANG")) // qApp->setDefaultCodec(QTextCodec::codecForName(getenv("LANG"))); QTranslator torats(0); torats.load(toConfigurationSingle::Instance().pluginDir()/*toPluginPath()*/ + "/" + QString("tora_") + toConfigurationSingle::Instance().locale(), "."); qApp->installTranslator(&torats); QTranslator toadbindings(0); if (toConfigurationSingle::Instance().toadBindings()) { // qt4 - hot candidate for a builtin resource // if (!toadbindings.load(tora_toad, sizeof(tora_toad))) // printf("Internal error, couldn't load TOAD bindings"); toadbindings.load(toConfigurationSingle::Instance().pluginDir()/*toPluginPath()*/ + "/" + "tora_toad.qm"); qApp->installTranslator(&toadbindings); } #ifndef TOMONOLITHIC { toSplash splash(NULL, "About " TOAPPNAME, false); splash.show(); std::list failed; QString dirPath = toConfigurationSingle::Instance().pluginDir();/*toPluginPath()*/; QDir d(dirPath, QString::fromLatin1("*.tso"), QDir::Name, QDir::Files); if (!d.exists()) { fprintf(stderr, "Couldn't find PluginDir, falling back to default: %s\n", DEFAULT_PLUGIN_DIR); dirPath = DEFAULT_PLUGIN_DIR; d.cd(dirPath); if (d.exists()) toConfigurationSingle::Instance().setPluginDir(dirPath); else fprintf(stderr, "Invalid PluginDir.\n"); } for (unsigned int i = 0;i < d.count();i++) { failed.insert(failed.end(), d.filePath(d[i])); } QProgressBar *progress = splash.progress(); QLabel *label = splash.label(); progress->setTotalSteps(failed.size()); progress->setProgress(1); qApp->processEvents(); bool success; do { success = false; std::list current = failed; failed.clear(); for (std::list::iterator i = current.begin();i != current.end();i++) { if (!dlopen(*i, RTLD_NOW | RTLD_GLOBAL)) { failed.insert(failed.end(), *i); } else { success = true; progress->setProgress(progress->progress() + 1); QFileInfo file(*i); label->setText(qApp->translate("main", "Loaded plugin %1").arg(file.fileName())); qApp->processEvents(); } } } while (failed.begin() != failed.end() && success); for (std::list::iterator i = failed.begin();i != failed.end();i++) if (!dlopen(*i, RTLD_NOW | RTLD_GLOBAL)) fprintf(stderr, "Failed to load %s\n %s\n", (const char *)(*i), dlerror()); } #endif try { toSQL::loadSQL(toConfigurationSingle::Instance().sqlFile()); } catch (...) {} toConnectionProvider::initializeAll(); { QString nls = getenv("NLS_LANG"); if (nls.isEmpty()) nls = "american_america.UTF8"; else { int pos = nls.lastIndexOf('.'); if (pos > 0) nls = nls.left(pos); nls += ".UTF8"; } toSetEnv("NLS_LANG", nls); } if (toConfigurationSingle::Instance().lastVersion() != TOVERSION) { std::auto_ptr about ( new toAbout(toAbout::About, NULL, "About " TOAPPNAME, true)); if (!about->exec()) { exit (2); } toConfigurationSingle::Instance().setLastVersion(TOVERSION); } if (toConfigurationSingle::Instance().firstInstall().isEmpty()) { toConfigurationSingle::Instance().setFirstInstall( QDateTime::currentDateTime().toString()); } toQValue::setNumberFormat( toConfigurationSingle::Instance().numberFormat(), toConfigurationSingle::Instance().numberDecimals()); if (qApp->argc() > 2 || (qApp->argc() == 2 && qApp->argv()[1][0] == '-')) { printf("Usage:\n\n tora [{X options}] [connectstring]\n\n"); exit(2); } else if (qApp->argc() == 2) { QString connect = QString::fromLatin1(qApp->argv()[1]); QString user; int pos = connect.indexOf(QString::fromLatin1("@")); if (pos > -1) { user = connect.left(pos); connect = connect.right(connect.length() - pos - 1); } else { user = connect; if (getenv("ORACLE_SID")) connect = QString::fromLatin1(getenv("ORACLE_SID")); } if (!connect.isEmpty()) toConfigurationSingle::Instance().setDefaultDatabase(connect); pos = user.indexOf(QString::fromLatin1("/")); if (pos > -1) { toConfigurationSingle::Instance().setDefaultPassword(user.right(user.length() - pos - 1)); user = user.left(pos); } if (!user.isEmpty()) toConfigurationSingle::Instance().setDefaultUser(user); } toMarkedText::setDefaultTabWidth(toConfigurationSingle::Instance().tabStop()); toMarkedText::setDefaultTabSpaces(toConfigurationSingle::Instance().tabSpaces()); // toUpdateIndicateEmpty(); new toMain; int ret = qApp->exec(); return ret; } catch (const QString &str) { fprintf(stderr, "Unhandled exception:\n\n%s\n", (const char *) str.toLatin1()); TOMessageBox::critical(NULL, qApp->translate("main", "Unhandled exception"), str, qApp->translate("main", "Exit")); } return 1; } tora-2.1.3/src/toconf.h0000644000175000017500000002227611363644470014521 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOCONF_H #define TOCONF_H #define CONF_PROVIDER "Provider" #define DEFAULT_PROVIDER "Oracle" #define CONF_SAVE_PWD "SavePassword" #define DEFAULT_SAVE_PWD false #define CONF_PASSWORD "DefaultPassword" #define DEFAULT_PASSWORD "" #define CONF_DATABASE "DefaultDatabase" #define DEFAULT_DATABASE "" #define CONF_USER "DefaultUser" #define DEFAULT_USER "system" #define CONF_HOST "Host" #define DEFAULT_HOST "localhost" #define CONF_OPTIONS "Options" #define DEFAULT_OPTIONS "" #define CONF_MAX_NUMBER "MaxNumber" #define DEFAULT_MAX_NUMBER 50 #define CONF_MAX_COL_SIZE "MaxColSize" #define DEFAULT_MAX_COL_SIZE 30000 #define CONF_MAX_COL_DISP "MaxColDisp" #define DEFAULT_MAX_COL_DISP 300 #define CONF_PLAN_TABLE "PlanTable" #define DEFAULT_PLAN_TABLE "PLAN_TABLE" #define CONF_PLAN_CHECKPOINT "PlanCheckpoint" #define DEFAULT_PLAN_CHECKPOINT "TORA_CHECKPOINT" #define CONF_TEXT "ConfText" #define CONF_CODE "ConfCode" #define CONF_LIST "ListText" #define CONF_DATE_FORMAT "ConfDateFormat" #define DEFAULT_DATE_FORMAT "YYYY-MM-DD HH24:MI:SS" #define CONF_REFRESH "Refresh" #define DEFAULT_REFRESH "None" #define CONF_HIGHLIGHT "SyntaxHighlight" #define CONF_KEYWORD_UPPER "KeywordUpper" #define DEFAULT_KEYWORD_UPPER false #define CONF_OBJECT_NAMES_UPPER "ObjectNamesUpper" #define DEFAULT_OBJECT_NAMES_UPPER false #define CONF_COLOR "KeywordColor" #define CONF_PLUGIN_DIR "PluginDir" #define CONF_CACHE_DIR "CacheDir" #define CONF_CACHE_DISK "CacheDiskUse" #define DEFAULT_CACHE_DISK true #define CONF_SQL_FILE "SQLDictionary" #define DEFAULT_SQL_FILE ".torasql" #define CONF_STATUS_MESSAGE "StatusMessage" #define DEFAULT_STATUS_MESSAGE "5" #define CONF_DB_TITLE "DBTitle" #define CONF_SIZE_UNIT "SizeUnit" #define DEFAULT_SIZE_UNIT "MB" #define CONF_HELP_PATH "HelpPath" #define CONF_STATUS_SAVE "StatusSave" #define DEFAULT_STATUS_SAVE 10 #define CONF_AUTO_COMMIT "AutoCommit" #define CONF_CHANGE_CONNECTION "ChangeConnection" #define CONF_CONNECT_HISTORY "ConnectHistory" #define CONF_CONNECT_SIZE "ConnectSize" #define CONF_CONNECT_CURRENT "ConnectCurrent" #define DEFAULT_CONNECT_SIZE 20 #define CONF_DEFAULT_TOOL "DefaultTool" #define CONF_TOOL_ENABLE "Enabled" #define CONF_CHART_SAMPLES "ChartSamples" #define DEFAULT_CHART_SAMPLES 100 #define CONF_DISPLAY_SAMPLES "DisplaySamples" #define DEFAULT_DISPLAY_SAMPLES -1 #define CONF_CODE_COMPLETION "CodeComplete" #define CONF_COMPLETION_SORT "CompleteSort" #define CONF_AUTO_INDENT "AutoIndent" #define CONF_DONT_REREAD "DontReread" #define CONF_AUTO_LONG "AutoLong" #define CONF_MESSAGE_STATUSBAR "MessageStatusbar" #define CONF_TABBED_TOOLS "TabbedTools" #define CONF_OBJECT_CACHE "ObjectCache" #define DEFAULT_OBJECT_CACHE 1 #define CONF_BKGND_CONNECT "BackgroundConnect" #define CONF_FIREWALL_MODE "FirewallMode" #define CONF_CONN_TEST_INTERVAL "Connection test interval" #define DEFAULT_CONN_TEST_INTERVAL 5000 #define CONF_MAX_CONTENT "MaxContent" #define DEFAULT_MAX_CONTENT 100 #define CONF_KEEP_PLANS "KeepPlans" // default: false #define CONF_VSQL_PLANS "VSqlPlans" // default: true #define CONF_RESTORE_SESSION "RestoreSession" #define CONF_DEFAULT_SESSION "DefaultSession" #define DEFAULT_SESSION ".tora.tse" #define CONF_DEFAULT_FORMAT "DefaultFormat" #define CONF_CSV_SEPARATOR "CSVSeparator" #define DEFAULT_CSV_SEPARATOR ";" #define CONF_CSV_DELIMITER "CSVDelimiter" #define DEFAULT_CSV_DELIMITER "\"" #define CONF_AUTO_INDENT_RO "AutoIndent" #define CONF_INDICATE_EMPTY "IndicateEmpty" #define CONF_INDICATE_EMPTY_COLOR "IndicateEmptyColor" #define CONF_EXTENSIONS "Extensions" #define CONF_RECENT_FILES "RecentFiles" #define CONF_RECENT_MAX "RecentMax" #define DEFAULT_RECENT_MAX 25 #define CONF_LAST_DIR "LastDir" #define CONF_LOCALE "Locale" #define CONF_KEEP_ALIVE "KeepAlive" #define DEFAULT_KEEP_ALIVE 300 #define CONF_NUMBER_FORMAT "NumberFormat" #define DEFAULT_NUMBER_FORMAT 0 #define CONF_NUMBER_DECIMALS "NumberDecimals" #define DEFAULT_NUMBER_DECIMALS 2 #define CONF_CACHE_TIMEOUT "CacheTimeout" #define DEFAULT_CACHE_TIMEOUT 7 #define CONF_TAB_STOP "TabStop" #define DEFAULT_TAB_STOP 8 #define CONF_TAB_SPACES "TabSpaces" #define DEFAULT_TAB_SPACES false #define CONF_EDIT_DRAG_DROP "EditDragDrop" #define DEFAULT_EDIT_DRAG_DROP false #define CONF_TOAD_BINDINGS "ToadBindings" #define DEFAULT_TOAD_BINDINGS false #define CONF_DISPLAY_GRIDLINES "Gridlines" #define DEFAULT_DISPLAY_GRIDLINES true #define DEFAULT_EXTENSIONS "SQL (*.sql *.pkg *.pkb), Text (*.txt), All (*)" #define CONF_SMTP "SmtpServer" #define DEFAULT_SMTP "localhost" #define CONF_SMTP_PORT "SmtpServerPort" #define DEFAULT_SMTP_PORT 25 #define CONF_STYLE "Style" #define DEFAULT_STYLE "" //"Cleanlooks" // code editor #define CONF_STATIC_CHECKER "StaticChecker" // tooracleconnection.cpp #define CONF_OPEN_CURSORS "OpenCursors" #define DEFAULT_OPEN_CURSORS 40 // Defined to be able to update tuning view #define CONF_MAX_LONG "MaxLong" #ifndef DEFAULT_MAX_LONG #define DEFAULT_MAX_LONG 30000 #endif // tonewconnection #define CONF_PROVIDER_LIST_SORT_OFFSET "ProvListSort" //Sort by database/connection name, asc #define DEFAULT_PROVIDER_LIST_SORT_OFFSET 4 // tosqlconnection #define CONF_ONLY_FORWARD "OnlyForward" #define DEFAULT_ONLY_FORWARD true #define CONF_CREATE_ACTION "BeforeCreateAction" #define DEFAULT_CREATE_ACTION 0 // main.cpp #define CONF_LAST_VERSION "LastVersion" #define CONF_FIRST_INSTALL "FirstInstall" // tools #define CONF_TOOLS "Tools" // toeditextensions #define CONF_COMMA_BEFORE "CommaBefore" #define CONF_BLOCK_OPEN_LINE "BlockOpenLine" #define CONF_OPERATOR_SPACE "OperatorSpace" #define CONF_KEYWORD_UPPER "KeywordUpper" #define CONF_RIGHT_SEPARATOR "RightSeparator" #define CONF_END_BLOCK_NEWLINE "EndBlockNewline" #define CONF_COMMENT_COLUMN "CommentColumn" #define DEFAULT_COMMENT_COLUMN 60 // tobrowser #define CONF_FILTER_IGNORE_CASE "FilterIgnoreCase" #define CONF_FILTER_INVERT "FilterInvert" #define CONF_FILTER_TYPE "FilterType" #define CONF_FILTER_TABLESPACE_TYPE "FilterTablespaceType" #define CONF_FILTER_TEXT "FilterText" // tooutput #define CONF_POLLING "Refresh" #define DEFAULT_POLLING "10 seconds" #define CONF_LOG_TYPE "Type" #define DEFAULT_LOG_TYPE 0 #define CONF_LOG_USER "LogUser" #define DEFAULT_LOG_USER "ULOG" // torollback #define CONF_NO_EXEC "NoExec" #define CONF_NEED_READ "NeedRead" #define CONF_NEED_TWO "NeedTwo" #define CONF_ALIGN_LEFT "AlignLeft" #define CONF_OLD_ENABLE "OldEnable" // tosgatrace #define CONF_AUTO_UPDATE "AutoUpdate" // tostorage #define CONF_DISP_TABLESPACES "DispTablespaces" #define CONF_DISP_COALESCED "DispCoalesced" #define CONF_DISP_EXTENTS "DispExtents" #define CONF_DISP_AVAILABLEGRAPH "AvailableGraph" // totuning #define CONF_OVERVIEW "Overview" #define CONF_FILEIO "File I/O" #define CONF_WAITS "Wait events" #define CONF_CHART "Charts" // toworksheet #define CONF_AUTO_SAVE "AutoSave" #define CONF_CHECK_SAVE "CheckSave" #define CONF_AUTO_LOAD "AutoLoad" #define CONF_LOG_AT_END "LogAtEnd" #define CONF_LOG_MULTI "LogMulti" #define CONF_STATISTICS "Statistics" #define CONF_TIMED_STATS "TimedStats" #define CONF_NUMBER "Number" #define CONF_MOVE_TO_ERR "MoveToError" #define CONF_HISTORY "History" #define CONF_EXEC_LOG "ExecLog" #define CONF_TOPLEVEL_DESCRIBE "ToplevelDescribe" // Version of TOra, must also change rpm files #ifndef TOAPPNAME # define TOAPPNAME "TOra" #endif // defines for QSettings #ifndef TOORGDOMAIN #define TOORGDOMAIN "tora.sourceforge.net" #endif #ifndef TOORGNAME #define TOORGNAME "TOra" #endif #define TO_TOOLBAR_WIDGET_NAME "kde toolbar widget" #endif tora-2.1.3/src/toresultdata.cpp0000644000175000017500000003210711420540052016252 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "config.h" #include "toresultdata.h" #include "utils.h" #include "toconf.h" #include "toconfiguration.h" #include "toresultdatasingle.h" #include "ui_toresultcontentfilterui.h" #include #include #include #include #include #include "icons/refresh.xpm" #include "icons/addrecord.xpm" #include "icons/canceledit.xpm" #include "icons/duplicaterecord.xpm" #include "icons/filter.xpm" #include "icons/forward.xpm" #include "icons/next.xpm" #include "icons/nofilter.xpm" #include "icons/previous.xpm" #include "icons/rewind.xpm" #include "icons/filesave.xpm" #include "icons/single.xpm" #include "icons/trash.xpm" toResultData::toResultData(QWidget *parent, const char *name, Qt::WindowFlags f) : QWidget(parent, f) { AllFilter = false; Discard = false; if (name) setObjectName(name); QVBoxLayout *vbox = new QVBoxLayout; vbox->setContentsMargins(0, 0, 0, 0); vbox->setSpacing(0); QToolBar *toolbar = toAllocBar(this, tr("Content editor")); vbox->addWidget(toolbar); Edit = new toResultTableViewEdit(false, false, this); vbox->addWidget(Edit); Form = new toResultDataSingle(this); vbox->addWidget(Form); connect(Edit, SIGNAL(firstResult( const QString &, const toConnection::exception &, bool)), this, SLOT(updateForm())); singleRecordForm(false); filterAct = toolbar->addAction( QIcon(QPixmap(const_cast(filter_xpm))), tr("Define filter for editor")); filterAct->setCheckable(true); connect(filterAct, SIGNAL(triggered(bool)), this, SLOT(changeFilter(bool))); removeAct = toolbar->addAction( QIcon(QPixmap(const_cast(nofilter_xpm))), tr("Remove filters")); connect(removeAct, SIGNAL(triggered(bool)), this, SLOT(removeFilter(bool))); toolbar->addSeparator(); saveAct = toolbar->addAction( QIcon(QPixmap(const_cast(filesave_xpm))), tr("Save changes")); connect(saveAct, SIGNAL(triggered()), this, SLOT(save())); connect(Edit, SIGNAL(changed(bool)), saveAct, SLOT(setEnabled(bool))); addAct = toolbar->addAction( QIcon(QPixmap(const_cast(addrecord_xpm))), tr("Add a new record")); connect(addAct, SIGNAL(triggered()), this, SLOT(addRecord())); duplicateAct = toolbar->addAction( QIcon(QPixmap(const_cast(duplicaterecord_xpm))), tr("Duplicate an existing record")); connect(duplicateAct, SIGNAL(triggered()), Edit, SLOT(duplicateRecord())); deleteAct = toolbar->addAction( QIcon(QPixmap(const_cast(trash_xpm))), tr("Delete current record from table")); connect(deleteAct, SIGNAL(triggered()), Edit, SLOT(deleteRecord())); toolbar->addSeparator(); refreshAct = toolbar->addAction( QIcon(QPixmap(const_cast(refresh_xpm))), tr("Refresh data")); connect(refreshAct, SIGNAL(triggered()), this, SLOT(refreshWarn())); toolbar->addSeparator(); firstAct = toolbar->addAction( QIcon(QPixmap(const_cast(rewind_xpm))), tr("Go to first row")); previousAct = toolbar->addAction( QIcon(QPixmap(const_cast(previous_xpm))), tr("Go to previous row")); nextAct = toolbar->addAction( QIcon(QPixmap(const_cast(next_xpm))), tr("Go to next row")); lastAct = toolbar->addAction( QIcon(QPixmap(const_cast(forward_xpm))), tr("Go to last row")); toolbar->addSeparator(); singleAct = toolbar->addAction( QIcon(QPixmap(const_cast(single_xpm))), tr("Toggle between table or single record editing")); singleAct->setCheckable(true); connect(singleAct, SIGNAL(toggled(bool)), this, SLOT(singleRecordForm(bool))); connect(toolbar, SIGNAL(actionTriggered(QAction *)), this, SLOT(navigate(QAction *))); setLayout(vbox); } void toResultData::query(const QString &, const toQList ¶ms) { if (!maybeSave()) return; Discard = false; if (params.size() == 2) { toQList::const_iterator par = params.begin(); Owner = *par; par++; Table = *par; } /* Always check, if either is empty, query will fail */ if (Owner.isEmpty() || Table.isEmpty()) { /* Need to clear columns here */ return; } FilterName = filterName(); bool filter = AllFilter || Criteria.contains(FilterName); filterAct->setChecked(filter); toConnection &conn = connection(); SQL = "SELECT * FROM %1.%2"; SQL = SQL.arg(conn.quote(Owner)).arg(conn.quote(Table)); bool where = false; if (filter && !Criteria[FilterName].isEmpty()) { SQL += " WHERE "; SQL += Criteria[FilterName]; SQL += " "; where = true; } if (filter && !Order[FilterName].isEmpty()) { SQL += " ORDER BY "; SQL += Order[FilterName]; } Edit->query(SQL, params); } void toResultData::exportData(std::map &data, const QString &prefix) { ; // stub } void toResultData::importData(std::map &data, const QString &prefix) { ; // stub } void toResultData::closeEvent(QCloseEvent *event) { if (maybeSave()) event->accept(); else event->ignore(); } void toResultData::navigate(QAction *action) { Edit->setFocus(); if (!Edit->selectionModel()) return; QModelIndex current = Edit->selectionModel()->currentIndex(); int row = current.row(); int col = current.column(); if (col < 1) col = 1; // can't select hidden first column if (action == firstAct) row = 0; else if (action == previousAct) row--; else if (action == nextAct) row++; else if (action == lastAct) row = Edit->model()->rowCount() - 1; else return; // not a nav action if (row < 0) row = 0; if (row >= Edit->model()->rowCount()) row = Edit->model()->rowCount() - 1; QModelIndex left = Edit->model()->createIndex(row, col); Edit->selectionModel()->select(QItemSelection(left, left), QItemSelectionModel::ClearAndSelect); Edit->setCurrentIndex(left); // will update form if shown singleRecordForm(singleAct->isChecked()); } QString toResultData::filterName() { QString nam; if (AllFilter) nam = ""; else { nam = Owner; nam += "."; nam += Table; } return nam; } void toResultData::removeFilter(bool) { if (!AllFilter) { switch (TOMessageBox::information( this, tr("Remove filter"), tr("Remove the filter for this table only or for all tables?"), tr("&All"), tr("&This"), tr("Cancel"), 0)) { case 0: Criteria.clear(); Order.clear(); // Intentionally no break case 1: Criteria.remove(FilterName); Order.remove(FilterName); filterAct->setChecked(false); break; case 2: return; } } else { QString nam = ""; Criteria.remove(nam); Order.remove(nam); AllFilter = false; filterAct->setChecked(false); } maybeSave(); refresh(); } void toResultData::changeFilter(bool checked) { QDialog dialog(this); Ui::toResultContentFilterUI filter; filter.setupUi(&dialog); FilterName = filterName(); filter.AllTables->setChecked(AllFilter); filter.Order->setText(Order[FilterName]); filter.Criteria->setText(Criteria[FilterName]); filter.Columns->changeParams(Owner, Table); if (dialog.exec()) { AllFilter = filter.AllTables->isChecked(); FilterName = filterName(); Criteria[FilterName] = filter.Criteria->text(); Order[FilterName] = filter.Order->text(); maybeSave(); refresh(); } if (Criteria[FilterName].isEmpty() && Order[FilterName].isEmpty()) filterAct->setChecked(false); else filterAct->setChecked(true); } bool toResultData::maybeSave(void) { if (!Edit->changed()) return true; if (!isVisible()) return true; // grab focus so user can see file and decide to save setFocus(Qt::OtherFocusReason); int ret = TOMessageBox::information( this, tr("Save changes"), tr("Save changes to %1.%2?").arg(Owner).arg(Table), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); if (ret == QMessageBox::Save) { if (Edit->commitChanges()) emit changesSaved(); return true; } else if (ret == QMessageBox::Discard) return Discard = true; else return false; } void toResultData::singleRecordForm(bool display) { if (display) { if (!Edit->selectionModel()->currentIndex().isValid()) { QModelIndex left = Edit->model()->createIndex(0, 0); Edit->selectionModel()->select(QItemSelection(left, left), QItemSelectionModel::ClearAndSelect); Edit->setCurrentIndex(left); } Form->changeRow(Edit->selectionModel()->currentIndex().row()); } else { if(Form->currentRow() >= 0) { // set selection to same as the form's QModelIndex left = Edit->model()->createIndex(Form->currentRow(), 1); Edit->selectionModel()->select(QItemSelection(left, left), QItemSelectionModel::ClearAndSelect); Edit->setCurrentIndex(left); } } Form->setVisible(display); Edit->setVisible(!display); } void toResultData::updateForm() { // update single edit form if (Edit->model()) { Form->changeSource(Edit->model(), Edit->selectionModel()->currentIndex().row()); } } void toResultData::save() { if (Edit->commitChanges()) emit changesSaved(); } void toResultData::addRecord() { Edit->addRecord(); // don't navigate here. done by Edit. // navigate(lastAct); } void toResultData::refreshWarn() { if (Edit->changed()) { switch (TOMessageBox( QMessageBox::Warning, tr("Warning"), tr("Refreshing from the database will lose current changes."), QMessageBox::Ok | QMessageBox::Cancel, this).exec()) { case QMessageBox::Ok: break; case QMessageBox::Cancel: return; default: return; } } Edit->refresh(); } tora-2.1.3/src/tobrowserschemawidget.cpp0000644000175000017500000000735711301740530020164 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include #include "tobrowserschemawidget.h" #include "tocodemodel.h" #include "utils.h" toBrowserSchemaTableView::toBrowserSchemaTableView(QWidget * parent) : toResultTableView(true, false, parent), toBrowserSchemaBase() { } QString toBrowserSchemaTableView::objectName() { return selectedIndex(1).data(Qt::EditRole).toString(); } void toBrowserSchemaTableView::changeParams(const QString & schema, const QString & filter) { toResultTableView::changeParams(schema, filter); } toBrowserSchemaCodeBrowser::toBrowserSchemaCodeBrowser(QWidget * parent) : QTreeView(parent), toBrowserSchemaBase() { m_model = new toCodeModel(this); setModel(m_model); setAlternatingRowColors(true); connect(this, SIGNAL(clicked(const QModelIndex &)), m_model, SLOT(addChildContent(const QModelIndex &))); connect(m_model, SIGNAL(dataReady()), this, SLOT(expandAll())); } QString toBrowserSchemaCodeBrowser::objectName() { toCodeModelItem *item = static_cast(currentIndex().internalPointer()); if (!item || item->type() == "NULL") return ""; if (item->type() == "PACKAGE" || item->type() == "FUNCTION" || item->type() == "PROCEDURE" || item->type() == "TYPE") { return item->display(); } if (item->type() == "SPEC" || item->type() == "BODY") return item->parent()->display(); return ""; } QString toBrowserSchemaCodeBrowser::objectType() { toCodeModelItem *item = static_cast(currentIndex().internalPointer()); if (item && item->parent()) { return item->type(); } return ""; } void toBrowserSchemaCodeBrowser::changeParams(const QString & schema, const QString & filter) { // WARNING: QCoreApplication::processEvents() is mandatory here // to prevent random crashing on parent-tab widget switching // in toBrowser. Dunno why... QCoreApplication::processEvents(); m_model->refresh(toCurrentConnection(this), schema); } tora-2.1.3/src/toresultlabel.cpp0000644000175000017500000000615011270353625016432 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "tonoblockquery.h" #include "toresultlabel.h" #include "tosql.h" #include "totool.h" //Added by qt3to4: #include toResultLabel::toResultLabel(QWidget *parent, const char *name) : QLabel(parent) { setObjectName(name); Query = NULL; connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); } toResultLabel::~toResultLabel() { delete Query; } void toResultLabel::query(const QString &sql, const toQList ¶m) { if (!setSQLParams(sql, param)) return ; try { clear(); if (Query) { delete Query; Query = NULL; } Query = new toNoBlockQuery(connection(), toQuery::Background, sql, param); Poll.start(100); } TOCATCH } #define THRESHOLD 10240 void toResultLabel::poll(void) { try { if (!toCheckModal(this)) return ; if (Query && Query->poll()) { QStringList res; while (!Query->eof()) { res << Query->readValue(); } setText(res.join(QString::fromLatin1("/"))); delete Query; Query = NULL; Poll.stop(); } } catch (const QString &exc) { delete Query; Query = NULL; Poll.stop(); toStatusMessage(exc); } } tora-2.1.3/src/tolistviewformatter.h0000644000175000017500000000765711420543463017366 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOLISTVIEWFORMATTER #define TOLISTVIEWFORMATTER #include #include #include class toListView; class toResultModel; /** * Class for storing settings for export. * */ class toExportSettings { public: enum RowExport { RowsAll = 0, RowsDisplayed, RowsSelected }; enum ColumnExport { ColumnsAll = 0, ColumnsSelected }; RowExport rowsExport; ColumnExport columnsExport; bool rowsHeader; bool columnsHeader; int type; QString separator; QString delimiter; QString extension; QString owner; // owner (schema) of the object QString objectName; // name of object data of which is being exported QModelIndexList selected; toExportSettings(RowExport _rowsExport, ColumnExport _columnsExport, int _type, bool _rowsHeader, bool _columnsHeader, const QString &_sep, const QString &_del) { rowsExport = _rowsExport; columnsExport = _columnsExport; type = _type; rowsHeader = _rowsHeader; columnsHeader = _columnsHeader; separator = _sep; delimiter = _del; switch (type) { default: extension = "*.txt"; break; case 2: extension = "*.csv"; break; case 3: extension = "*.html"; break; case 4: extension = "*.sql"; break; }; } bool requireSelection() { return (rowsExport == RowsSelected) || (columnsExport == ColumnsSelected); } }; class toListViewFormatter { public: toListViewFormatter(); virtual ~toListViewFormatter(); virtual QString getFormattedString(toExportSettings &settings, const QAbstractItemModel * model) = 0; protected: virtual void endLine(QString &output); // build a vector of selected rows for easy searching virtual QVector selectedRows(const QModelIndexList &selected); virtual QVector selectedColumns(const QModelIndexList &selected); }; #endif tora-2.1.3/src/tolinechart.h0000644000175000017500000002423111342143740015525 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOLINECHART_H #define TOLINECHART_H #include "config.h" #include #include #include #include //Added by qt3to4: #include #include #include class QMenu; class QScrollBar; /** * A widget that displays a linechart with optional background * throbber (Not implemented yet). * */ class toLineChart : public QWidget { Q_OBJECT; QMenu *Menu; QScrollBar *Horizontal; QScrollBar *Vertical; protected: std::list > Values; std::list XValues; std::list Labels; std::list Enabled; bool Legend; bool Last; int Grid; bool AxisText; double MinValue; bool MinAuto; double MaxValue; bool MaxAuto; QString YPostfix; int Samples; QString Title; QRect Chart; QPoint MousePoint[2]; int SkipSamples; int UseSamples; int DisplaySamples; bool Zooming; double zMinValue; double zMaxValue; static double round(double round, bool up); QRect fixRect(QPoint p1, QPoint p2); virtual void mouseReleaseEvent(QMouseEvent *e); virtual void mouseMoveEvent(QMouseEvent *e); virtual void mouseDoubleClickEvent(QMouseEvent *e); virtual void mousePressEvent(QMouseEvent *e); int countSamples(void); void clearZoom(void); virtual void paintLegend(QPainter *p, QRect &rect); virtual void paintTitle(QPainter *p, QRect &rect); virtual void paintAxis(QPainter *p, QRect &rect); virtual void paintChart(QPainter *p, QRect &rect); public: /** Create a new linechart. * @param parent Parent widget. * @param name Name of widget. * @param f Widget flags. */ toLineChart(QWidget *parent = NULL, const char *name = NULL, Qt::WFlags f = 0); /** Create a new chart by copying all the data from another chart. * @param chart Chart to copy data from. * @param parent Parent widget. * @param name Name of widget. * @param f Widget flags. */ toLineChart(toLineChart *chart, QWidget *parent = NULL, const char *name = NULL, Qt::WFlags f = 0); /** Destroy chart */ ~toLineChart(); /** Specify if legend should be displayed to the right of the graph, default is on. * @param on Whether to display legend or not. */ void showLegend(bool on) { Legend = on; update(); } /** Check if legend is displayed or not. * @return If legend is displayed or not. */ bool legend(void) const { return Legend; } /** Show most recent value on top of graph * @param on Whether to display or not. */ void showLast(bool on) { Last = on; update(); } /** Check if last value is displayed or not. * @return If value is displayed or not. */ bool last(void) const { return Last; } /** Set title of the chart. Set to empty string to not display title. * @param title Title of chart. */ void setTitle(const QString &title = QString::null) { Title = title; setWindowTitle(title); update(); } /** Get title of chart. * @return Title of chart. */ const QString &title(void) { return Title; } /** Specify if a grid should be displayed in the graph, default is on. * @param div Number of parts to divide grid into. */ void showGrid(int div = 0) { Grid = div; update(); } /** Check if grid is displayed or not. * @return Number of parts to divide grid into. */ int grid(void) const { return Grid; } /** Specify if a y-axis legend should be displayed in the graph, default is on. * @param on Whether to display legend or not. */ void showAxisLegend(bool on) { AxisText = on; update(); } /** Check if y-axis legend is displayed or not. * @return If legend is displayed or not. */ bool axisLegend(void) const { return AxisText; } /** Set y postfix value. This will be appended to the values in the axis legend. * @param postfix The string to append. */ void setYPostfix(const QString &postfix) { YPostfix = postfix; update(); } /** Set max value on y-axis to auto. */ void setMaxValueAuto(void) { MaxAuto = true; update(); } /** Set min value on y-axis to auto. */ void setMinValueAuto(void) { MinAuto = true; update(); } /** Set max value on y-axis. * @param val Max value on y-axis. */ void setMaxValue(double maxVal) { MaxAuto = false; MaxValue = maxVal; update(); } /** Set min value on y-axis. * @param val Min value on y-axis. */ void setMinValue(double minVal) { MinAuto = false; MinValue = minVal; update(); } /** Get minimum value on y-axis. Will not return the automatically determinned minimum value. * @return Minimum value on y-axis. */ double minValue(void) const { return MinValue; } /** Get maximum value on y-axis. Will not return the automatically determinned maximum value. * @return Maximum value on y-axis. */ double maxValue(void) const { return MaxValue; } /** Set the number of samples on the x-axis. Setting samples to -1 will keep all entries. * @param samples Number of samples. */ void setSamples(int samples = -1); /** Get the maximum number of samples on the x-axis. * @return Max number of samples. */ int samples(void) const { return Samples; } /** Set the labels on the chart lines. * @param labels Labels of the lines. Empty labels will not show up in the legend. */ void setLabels(const std::list &labels) { Labels = labels; update(); } /** Get the labels of the chart lines. * @return List of labels. */ std::list &labels(void) { return Labels; } /** Add a new value set to the chart. * @param value New values for charts (One for each line). * @param label X-value on these values. */ virtual void addValues(std::list &value, const QString &xValues); /** Get list of labels * @return List of labels */ std::list &xValues(void) { return XValues; } /** Get list of values. * @return Values in piechart. */ std::list > &values(void) { return Values; } /** Export chart to a map. * @param data A map that can be used to recreate the data of a chart. * @param prefix Prefix to add to the map. */ virtual void exportData(std::map &data, const QString &prefix); /** Import data * @param data Data to read from a map. * @param prefix Prefix to read data from. */ virtual void importData(std::map &data, const QString &prefix); /** Get enabled datavalues. Values in this list with false are not drawn in the chart. * Could be an empty list if everything is enabled. */ std::list enabledCharts(void) { return Enabled; } /** Set enabled datavalues. Values in this list with false are not drawn in the chart. */ void setEnabledCharts(std::list &enabled) { Enabled = enabled; update(); } /** Open chart in new window. */ virtual toLineChart *openCopy(QWidget *parent); signals: /** A new value set was added to the chart. * @param value New values for charts (One for each line). * @param label X-value on these values. */ void valueAdded(std::list &value, const QString &xValues); public slots: /** Clear the values from the chart. */ virtual void clear(void) { Values.clear(); XValues.clear(); update(); } /** Setup values of charts. */ virtual void setup(void); /** Print the chart. */ virtual void editPrint(void); void openCopy(void) { openCopy(NULL); } protected: /** Reimplemented for internal reasons. */ virtual void paintEvent(QPaintEvent *e); /** Reimplemented for internal reasons. */ virtual void addMenues(QMenu *) { } private slots: void horizontalChange(int); void verticalChange(int); void chartSetup(void); }; #endif tora-2.1.3/src/tobrowserviewwidget.h0000644000175000017500000000473211323661251017343 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TOBROWSERVIEWWIDGET_H #define TOBROWSERVIEWWIDGET_H #include "tobrowserbasewidget.h" class toResultCols; class toResultTableView; class toResultField; class toResultData; class toResultGrants; class toResultDepend; class toResultExtract; /*! \brief View browser for toBrowser tool. See toBrowserBaseWidget for more info. \author Petr Vanek */ class toBrowserViewWidget : public toBrowserBaseWidget { Q_OBJECT toResultCols *columnsWidget; toResultField *resultField; toResultTableView *triggersView; toResultData *resultData; toResultGrants *grantsView; toResultDepend *resultDependencies; toResultExtract *extractView; public: toBrowserViewWidget(QWidget * parent); void changeConnection(); }; #endif tora-2.1.3/src/toconnection.cpp0000644000175000017500000013142411402776023016254 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "tohighlightedtext.h" #include "tomain.h" #include "tosql.h" #include "totool.h" #include "toconnectionpool.h" #include #include #include #include #include #include #include #include #include #include // A little magic to get lrefresh to work and get a check on qApp #undef QT_TRANSLATE_NOOP #define QT_TRANSLATE_NOOP(x,y) QTRANS(x,y) // Connection provider implementation std::map *toConnectionProvider::Providers; std::map *toConnectionProvider::Types; void toConnectionProvider::checkAlloc(void) { if (!Providers) Providers = new std::map; } void toConnectionProvider::addProvider(const QString &provider) { checkAlloc(); Provider = provider; (*Providers)[Provider] = this; } toConnectionProvider::toConnectionProvider(const QString &provider, bool add ) { Provider = provider; if (add ) addProvider(provider); if (!Types) Types = new std::map; (*Types)[provider] = this; } std::list toConnectionProvider::providedOptions(const QString &) { std::list ret; return ret; } void toConnectionProvider::removeProvider(const QString &provider) { std::map::iterator i = Providers->find(provider); if (i != Providers->end()) Providers->erase(i); } toConnectionProvider::~toConnectionProvider() { try { if (!Provider.isEmpty()) removeProvider(Provider); std::map::iterator i = Types->find(Provider); if (i != Types->end()) Types->erase(i); } catch (...) {} } std::list toConnectionProvider::providedHosts(const QString &) { std::list ret; return ret; } std::list toConnectionProvider::providers() { std::list ret; if (!Providers) return ret; for (std::map::iterator i = Providers->begin(); i != Providers->end(); i++) ret.insert(ret.end(), (*i).first); return ret; } void toConnectionProvider::initializeAll(void) { if (Types) for (std::map::iterator i = Types->begin(); i != Types->end(); i++) (*i).second->initialize(); } toConnectionProvider &toConnectionProvider::fetchProvider(const QString &provider) { checkAlloc(); std::map::iterator i = Providers->find(provider); if (i == Providers->end()) throw QT_TRANSLATE_NOOP("toConnectionProvider", "Tried to fetch unknown provider %1").arg(QString(provider)); return *((*i).second); } std::list toConnectionProvider::options(const QString &provider) { return fetchProvider(provider).providedOptions(provider); } QWidget *toConnectionProvider::configurationTab(const QString &provider, QWidget *parent) { return fetchProvider(provider).providerConfigurationTab(provider, parent); } toConnection::connectionImpl *toConnectionProvider::connection(const QString &provider, toConnection *conn) { return fetchProvider(provider).provideConnection(provider, conn); } std::list toConnectionProvider::hosts(const QString &provider) { return fetchProvider(provider).providedHosts(provider); } std::list toConnectionProvider::databases(const QString &provider, const QString &host, const QString &user, const QString &pwd) { return fetchProvider(provider).providedDatabases(provider, host, user, pwd); } // const QString &toConnectionProvider::config(const QString &tag, const QString &def) { // QString str = Provider; // str.append(":"); // str.append(tag); // return toConfigurationSingle::Instance().globalConfig(str, def); // } // // void toConnectionProvider::setConfig(const QString &tag, const QString &def) { // QString str = Provider; // str.append(":"); // str.append(tag); // toConfigurationSingle::Instance().globalSetConfig(str, def); // } QWidget *toConnectionProvider::providerConfigurationTab(const QString &, QWidget *) { return NULL; } // toQuery implementation toQuery::toQuery(toConnection &conn, const toSQL &sql, const QString &arg1, const QString &arg2, const QString &arg3, const QString &arg4, const QString &arg5, const QString &arg6, const QString &arg7, const QString &arg8, const QString &arg9) : Connection(QPointer(&conn)), ConnectionSub(conn.pooledConnection()), SQL(sql(*Connection).toAscii()) { Mode = Normal; showBusy = true; int numArgs; if (!arg9.isNull()) numArgs = 9; else if (!arg8.isNull()) numArgs = 8; else if (!arg7.isNull()) numArgs = 7; else if (!arg6.isNull()) numArgs = 6; else if (!arg5.isNull()) numArgs = 5; else if (!arg4.isNull()) numArgs = 4; else if (!arg3.isNull()) numArgs = 3; else if (!arg2.isNull()) numArgs = 2; else if (!arg1.isNull()) numArgs = 1; else numArgs = 0; if (numArgs > 0) Params.insert(Params.end(), arg1); if (numArgs > 1) Params.insert(Params.end(), arg2); if (numArgs > 2) Params.insert(Params.end(), arg3); if (numArgs > 3) Params.insert(Params.end(), arg4); if (numArgs > 4) Params.insert(Params.end(), arg5); if (numArgs > 5) Params.insert(Params.end(), arg6); if (numArgs > 6) Params.insert(Params.end(), arg7); if (numArgs > 7) Params.insert(Params.end(), arg8); if (numArgs > 8) Params.insert(Params.end(), arg9); toBusy busy; try { Query = NULL; Query = conn.Connection->createQuery(this, ConnectionSub); Query->execute(); } catch (...) { if (Query) delete Query; Query = NULL; Connection->ConnectionPool->release(ConnectionSub); throw; } ConnectionSub->setQuery(this); } toQuery::toQuery(toConnection &conn, const QString &sql, const QString &arg1, const QString &arg2, const QString &arg3, const QString &arg4, const QString &arg5, const QString &arg6, const QString &arg7, const QString &arg8, const QString &arg9) : Connection(QPointer(&conn)), ConnectionSub(conn.pooledConnection()), SQL(sql) { Mode = Normal; showBusy = true; int numArgs; if (!arg9.isNull()) numArgs = 9; else if (!arg8.isNull()) numArgs = 8; else if (!arg7.isNull()) numArgs = 7; else if (!arg6.isNull()) numArgs = 6; else if (!arg5.isNull()) numArgs = 5; else if (!arg4.isNull()) numArgs = 4; else if (!arg3.isNull()) numArgs = 3; else if (!arg2.isNull()) numArgs = 2; else if (!arg1.isNull()) numArgs = 1; else numArgs = 0; if (numArgs > 0) Params.insert(Params.end(), arg1); if (numArgs > 1) Params.insert(Params.end(), arg2); if (numArgs > 2) Params.insert(Params.end(), arg3); if (numArgs > 3) Params.insert(Params.end(), arg4); if (numArgs > 4) Params.insert(Params.end(), arg5); if (numArgs > 5) Params.insert(Params.end(), arg6); if (numArgs > 6) Params.insert(Params.end(), arg7); if (numArgs > 7) Params.insert(Params.end(), arg8); if (numArgs > 8) Params.insert(Params.end(), arg9); toBusy busy; try { Query = NULL; Query = conn.Connection->createQuery(this, ConnectionSub); Query->execute(); } catch (...) { if (Query) delete Query; Query = NULL; Connection->ConnectionPool->release(ConnectionSub); throw; } ConnectionSub->setQuery(this); } toQuery::toQuery(toConnection &conn, const toSQL &sql, const toQList ¶ms) : Connection(QPointer(&conn)), ConnectionSub(conn.pooledConnection()), Params(params), SQL(sql(conn).toAscii()) { Mode = Normal; showBusy = true; toBusy busy; try { Query = NULL; Query = conn.Connection->createQuery(this, ConnectionSub); Query->execute(); } catch (...) { if (Query) delete Query; Query = NULL; Connection->ConnectionPool->release(ConnectionSub); throw; } ConnectionSub->setQuery(this); } // for testing sub toQuery::toQuery(toConnection &conn, toConnectionSub *sub, const QString &sql, const toQList ¶ms) : Connection(QPointer(&conn)), ConnectionSub(sub), Params(params), SQL(sql) { Mode = Test; showBusy = true; toBusy busy; try { Query = NULL; Query = conn.Connection->createQuery(this, ConnectionSub); Query->execute(); } catch (...) { if (Query) delete Query; Query = NULL; throw; } ConnectionSub->setQuery(this); } toQuery::toQuery(toConnection &conn, const QString &sql, const toQList ¶ms) : Connection(QPointer(&conn)), ConnectionSub(conn.pooledConnection()), Params(params), SQL(sql) { Mode = Normal; showBusy = true; toBusy busy; try { Query = NULL; Query = conn.Connection->createQuery(this, ConnectionSub); Query->execute(); } catch (...) { if (Query) delete Query; Query = NULL; Connection->ConnectionPool->release(ConnectionSub); throw; } ConnectionSub->setQuery(this); } toQuery::toQuery(toConnection &conn, queryMode mode, const toSQL &sql, const toQList ¶ms) : Connection(QPointer(&conn)), Params(params), SQL(sql(conn).toAscii()) { Mode = mode; showBusy = true; ConnectionSub = conn.pooledConnection(); toBusy busy; try { Query = NULL; Query = conn.Connection->createQuery(this, ConnectionSub); Query->execute(); } catch (...) { if (Query) delete Query; Query = NULL; Connection->ConnectionPool->release(ConnectionSub); throw; } ConnectionSub->setQuery(this); } toQuery::toQuery(toConnection &conn, queryMode mode, const QString &sql, const toQList ¶ms) : Connection(QPointer(&conn)), Params(params), SQL(sql) { Mode = mode; showBusy = true; ConnectionSub = conn.pooledConnection(); toBusy busy; try { Query = NULL; Query = conn.Connection->createQuery(this, ConnectionSub); Query->execute(); } catch (...) { if (Query) delete Query; Query = NULL; Connection->ConnectionPool->release(ConnectionSub); throw; } ConnectionSub->setQuery(this); } toQuery::toQuery(toConnection &conn, queryMode mode) : Connection(QPointer(&conn)) { Mode = mode; showBusy = true; ConnectionSub = conn.pooledConnection(); toBusy busy; try { Query = NULL; Query = conn.Connection->createQuery(this, ConnectionSub); } catch (...) { if (Query) delete Query; Query = NULL; throw; } ConnectionSub->setQuery(this); } void toQuery::execute(const toSQL &sql, const toQList ¶ms) { toBusy busy; SQL = sql(*Connection); Params = params; Query->execute(); } void toQuery::execute(const QString &sql, const toQList ¶ms) { toBusy busy; SQL = sql; Params = params; Query->execute(); } void toQuery::execute(const toSQL &sql) { std::list params; params.clear(); execute(sql, params); } void toQuery::execute(const toSQL &sql, const QString ¶m) { std::list params; params.clear(); params.insert(params.end(), param); execute(sql, params); } void toQuery::execute(const toSQL &sql, const QString ¶m1, const QString ¶m2, const QString ¶m3) { std::list params; params.clear(); params.insert(params.end(), param1); params.insert(params.end(), param2); params.insert(params.end(), param3); execute(sql, params); } toQuery::~toQuery() { toBusy busy; if (Query) delete Query; try { if (ConnectionSub->query() == this) ConnectionSub->setQuery(NULL); if (Mode != Test && Connection && Connection->ConnectionPool) Connection->ConnectionPool->release(ConnectionSub); } catch (...) {} } bool toQuery::eof(void) { return Query->eof(); } toQList toQuery::readQuery(toConnection &conn, const toSQL &sql, toQList ¶ms) { toBusy busy; toQuery query(conn, sql, params); toQList ret; while (!query.eof()) ret.insert(ret.end(), query.readValue()); return ret; } toQList toQuery::readQuery(toConnection &conn, const QString &sql, toQList ¶ms) { toBusy busy; toQuery query(conn, sql, params); toQList ret; while (!query.eof()) ret.insert(ret.end(), query.readValue()); return ret; } toQList toQuery::readQuery(const QString &sql, toQList ¶ms) { toBusy busy(showBusy); SQL = sql; Params = params; Query->execute(); toQList ret; while (!eof()) ret.insert(ret.end(), readValue()); return ret; } toQList toQuery::readQuery(toConnection &conn, const toSQL &sql, const QString &arg1, const QString &arg2, const QString &arg3, const QString &arg4, const QString &arg5, const QString &arg6, const QString &arg7, const QString &arg8, const QString &arg9) { toBusy busy; toQuery query(conn, sql, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); toQList ret; while (!query.eof()) ret.insert(ret.end(), query.readValue()); return ret; } toQList toQuery::readQuery(toConnection &conn, const QString &sql, const QString &arg1, const QString &arg2, const QString &arg3, const QString &arg4, const QString &arg5, const QString &arg6, const QString &arg7, const QString &arg8, const QString &arg9) { toBusy busy; toQuery query(conn, sql, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); toQList ret; while (!query.eof()) ret.insert(ret.end(), query.readValue()); return ret; } toQList toQuery::readQueryNull(toConnection &conn, const toSQL &sql, toQList ¶ms) { toBusy busy; toQuery query(conn, sql, params); toQList ret; while (!query.eof()) ret.insert(ret.end(), query.readValueNull()); return ret; } toQList toQuery::readQueryNull(toConnection &conn, const QString &sql, toQList ¶ms) { toQuery query(conn, sql, params); toQList ret; while (!query.eof()) ret.insert(ret.end(), query.readValueNull()); return ret; } toQList toQuery::readQueryNull(toConnection &conn, const toSQL &sql, const QString &arg1, const QString &arg2, const QString &arg3, const QString &arg4, const QString &arg5, const QString &arg6, const QString &arg7, const QString &arg8, const QString &arg9) { toBusy busy; toQuery query(conn, sql, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); toQList ret; while (!query.eof()) ret.insert(ret.end(), query.readValueNull()); return ret; } toQList toQuery::readQueryNull(toConnection &conn, const QString &sql, const QString &arg1, const QString &arg2, const QString &arg3, const QString &arg4, const QString &arg5, const QString &arg6, const QString &arg7, const QString &arg8, const QString &arg9) { toBusy busy; toQuery query(conn, sql, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); toQList ret; while (!query.eof()) ret.insert(ret.end(), query.readValueNull()); return ret; } toQValue toQuery::readValue(void) { if (!Connection) return toQValue(0); if (Connection->Abort) throw qApp->translate("toQuery", "Query aborted"); return toNull(Query->readValue()); } toQValue toQuery::readValueNull(void) { if (!Connection) return toQValue(0); if (Connection->Abort) throw qApp->translate("toQuery", "Query aborted"); return Query->readValue(); } void toQuery::cancel(void) { Query->cancel(); } // toConnection implementation toConnectionSub* toConnection::addConnection() { toBusy busy; toConnectionSub *sub = Connection->createConnection(); toLocker lock(Lock) ; toQList params; for (std::list::iterator i = InitStrings.begin(); i != InitStrings.end(); i++) { try { Connection->execute(sub, *i, params); } TOCATCH } return sub; } void toConnection::closeConnection(toConnectionSub *sub) { if (Connection) Connection->closeConnection(sub); } toConnection::toConnection(const QString &provider, const QString &user, const QString &password, const QString &host, const QString &database, const QString &schema, const QString &color, const std::set &options, bool cache) : Provider(provider), User(user), Password(password), Host(host), Database(database), Schema(schema), Color(color), Options(options), Connection(0) { Connection = toConnectionProvider::connection(Provider, this); NeedCommit = Abort = false; ReadingCache = false; ConnectionPool = new toConnectionPool(this); PoolPtr sub(ConnectionPool); Version = Connection->version(*sub); if (cache) { if (toConfigurationSingle::Instance().objectCache() == 1) readObjects(); } else { ReadingValues.up(); ReadingValues.up(); } } toConnection::toConnection(const toConnection &conn) : Provider(conn.Provider), User(conn.User), Password(conn.Password), Host(conn.Host), Database(conn.Database), Schema(conn.Schema), Color(conn.Color), Options(conn.Options), Connection(0) { Connection = toConnectionProvider::connection(Provider, this); ReadingValues.up(); ReadingValues.up(); ReadingCache = false; NeedCommit = Abort = false; ConnectionPool = new toConnectionPool(this); PoolPtr sub(ConnectionPool); Version = Connection->version(*sub); } std::list toConnection::running(void) { toBusy busy; toLocker lock(Lock) ; std::list ret; // this is insane. disabled code that tried to get sql from // running queries return ret; } void toConnection::cancelAll(void) { ConnectionPool->cancelAll(); } toConnection::~toConnection() { toBusy busy; Abort = true; { closeWidgets(); ConnectionPool->cancelAll(true); // wait for cacheObjects to finish toLocker clock(CacheLock); delete ConnectionPool; ConnectionPool = 0; toLocker lock(Lock); } if (ReadingCache) { ReadingValues.down(); ReadingValues.down(); } delete Connection; } toConnectionSub* toConnection::pooledConnection(void) { return ConnectionPool->borrow(); } void toConnection::commit(toConnectionSub *sub) { toBusy busy; Connection->commit(sub); } void toConnection::commit(void) { ConnectionPool->commit(); setNeedCommit(false); } void toConnection::rollback(toConnectionSub *sub) { toBusy busy; Connection->rollback(sub); } void toConnection::rollback(void) { ConnectionPool->rollback(); setNeedCommit(false); } void toConnection::delWidget(QWidget *widget) { for (std::list >::iterator i = Widgets.begin(); i != Widgets.end(); i++) { if ((*i) && (*i) == widget) { Widgets.erase(i); break; } } } void toConnection::addWidget(QWidget *widget) { Widgets.insert(Widgets.end(), QPointer(widget)); } bool toConnection::closeWidgets(void) { for (std::list >::iterator i = Widgets.begin(); i != Widgets.end(); i++) { if (!(*i)) continue; // make double sure destroy flag is set (*i)->setAttribute(Qt::WA_DeleteOnClose); // black magic to close widget's MDI subwindow too if ((*i)->parent() && (*i)->parent()->metaObject()->className() == QMdiSubWindow::staticMetaObject.className()) { qobject_cast((*i)->parent())->close(); } if (!(*i)->close()) { // close will fail if parent already closed. // closing parent will hide children though if ((*i)->isVisible()) return false; } else delete *i; } Widgets.clear(); return true; } QString toConnection::description(bool version) const { QString ret(User); ret += QString::fromLatin1("@"); if (!toIsMySQL(*this)) ret += Database; if (!Host.isEmpty() && Host != "SQL*Net") { if (!toIsMySQL(*this)) ret += QString::fromLatin1("."); ret += Host; } if (version) { if (!Version.isEmpty()) { ret += QString::fromLatin1(" ["); ret += Version; ret += QString::fromLatin1("]"); } } return ret; } void toConnection::addInit(const QString &sql) { delInit(sql); InitStrings.insert(InitStrings.end(), sql); } void toConnection::delInit(const QString &sql) { std::list::iterator i = InitStrings.begin(); while (i != InitStrings.end()) { if ((*i) == sql) i = InitStrings.erase(i); else i++; } } const std::list toConnection::initStrings() const { return InitStrings; } void toConnection::parse(const QString &sql) { toBusy busy; PoolPtr sub(ConnectionPool); Version = Connection->version(*sub); Connection->parse(*sub, sql); } void toConnection::parse(const toSQL &sql) { toBusy busy; PoolPtr sub(ConnectionPool); Version = Connection->version(*sub); Connection->parse(*sub, toSQL::sql(sql, *this)); } void toConnection::execute(const toSQL &sql, toQList ¶ms) { toBusy busy; PoolPtr sub(ConnectionPool); Version = Connection->version(*sub); Connection->execute(*sub, toSQL::sql(sql, *this), params); } void toConnection::execute(const QString &sql, toQList ¶ms) { toBusy busy; PoolPtr sub(ConnectionPool); Version = Connection->version(*sub); Connection->execute(*sub, sql, params); } void toConnection::execute(const toSQL &sql, const QString &arg1, const QString &arg2, const QString &arg3, const QString &arg4, const QString &arg5, const QString &arg6, const QString &arg7, const QString &arg8, const QString &arg9) { int numArgs; if (!arg9.isNull()) numArgs = 9; else if (!arg8.isNull()) numArgs = 8; else if (!arg7.isNull()) numArgs = 7; else if (!arg6.isNull()) numArgs = 6; else if (!arg5.isNull()) numArgs = 5; else if (!arg4.isNull()) numArgs = 4; else if (!arg3.isNull()) numArgs = 3; else if (!arg2.isNull()) numArgs = 2; else if (!arg1.isNull()) numArgs = 1; else numArgs = 0; toQList args; if (numArgs > 0) args.insert(args.end(), arg1); if (numArgs > 1) args.insert(args.end(), arg2); if (numArgs > 2) args.insert(args.end(), arg3); if (numArgs > 3) args.insert(args.end(), arg4); if (numArgs > 4) args.insert(args.end(), arg5); if (numArgs > 5) args.insert(args.end(), arg6); if (numArgs > 6) args.insert(args.end(), arg7); if (numArgs > 7) args.insert(args.end(), arg8); if (numArgs > 8) args.insert(args.end(), arg9); toBusy busy; PoolPtr sub(ConnectionPool); Version = Connection->version(*sub); Connection->execute(*sub, toSQL::sql(sql, *this), args); } void toConnection::execute(const QString &sql, const QString &arg1, const QString &arg2, const QString &arg3, const QString &arg4, const QString &arg5, const QString &arg6, const QString &arg7, const QString &arg8, const QString &arg9) { int numArgs; if (!arg9.isNull()) numArgs = 9; else if (!arg8.isNull()) numArgs = 8; else if (!arg7.isNull()) numArgs = 7; else if (!arg6.isNull()) numArgs = 6; else if (!arg5.isNull()) numArgs = 5; else if (!arg4.isNull()) numArgs = 4; else if (!arg3.isNull()) numArgs = 3; else if (!arg2.isNull()) numArgs = 2; else if (!arg1.isNull()) numArgs = 1; else numArgs = 0; toQList args; if (numArgs > 0) args.insert(args.end(), arg1); if (numArgs > 1) args.insert(args.end(), arg2); if (numArgs > 2) args.insert(args.end(), arg3); if (numArgs > 3) args.insert(args.end(), arg4); if (numArgs > 4) args.insert(args.end(), arg5); if (numArgs > 5) args.insert(args.end(), arg6); if (numArgs > 6) args.insert(args.end(), arg7); if (numArgs > 7) args.insert(args.end(), arg8); if (numArgs > 8) args.insert(args.end(), arg9); toBusy busy; PoolPtr sub(ConnectionPool); Version = Connection->version(*sub); Connection->execute(*sub, sql, args); } void toConnection::allExecute(const toSQL &sql, toQList ¶ms) { ConnectionPool->executeAll(toSQL::sql(sql, *this), params); } void toConnection::allExecute(const QString &sql, toQList ¶ms) { ConnectionPool->executeAll(sql, params); } void toConnection::allExecute(const toSQL &sql, const QString &arg1, const QString &arg2, const QString &arg3, const QString &arg4, const QString &arg5, const QString &arg6, const QString &arg7, const QString &arg8, const QString &arg9) { int numArgs; if (!arg9.isNull()) numArgs = 9; else if (!arg8.isNull()) numArgs = 8; else if (!arg7.isNull()) numArgs = 7; else if (!arg6.isNull()) numArgs = 6; else if (!arg5.isNull()) numArgs = 5; else if (!arg4.isNull()) numArgs = 4; else if (!arg3.isNull()) numArgs = 3; else if (!arg2.isNull()) numArgs = 2; else if (!arg1.isNull()) numArgs = 1; else numArgs = 0; toQList args; if (numArgs > 0) args.insert(args.end(), arg1); if (numArgs > 1) args.insert(args.end(), arg2); if (numArgs > 2) args.insert(args.end(), arg3); if (numArgs > 3) args.insert(args.end(), arg4); if (numArgs > 4) args.insert(args.end(), arg5); if (numArgs > 5) args.insert(args.end(), arg6); if (numArgs > 6) args.insert(args.end(), arg7); if (numArgs > 7) args.insert(args.end(), arg8); if (numArgs > 8) args.insert(args.end(), arg9); ConnectionPool->executeAll(toSQL::sql(sql, *this), args); } void toConnection::allExecute(const QString &sql, const QString &arg1, const QString &arg2, const QString &arg3, const QString &arg4, const QString &arg5, const QString &arg6, const QString &arg7, const QString &arg8, const QString &arg9) { int numArgs; if (!arg9.isNull()) numArgs = 9; else if (!arg8.isNull()) numArgs = 8; else if (!arg7.isNull()) numArgs = 7; else if (!arg6.isNull()) numArgs = 6; else if (!arg5.isNull()) numArgs = 5; else if (!arg4.isNull()) numArgs = 4; else if (!arg3.isNull()) numArgs = 3; else if (!arg2.isNull()) numArgs = 2; else if (!arg1.isNull()) numArgs = 1; else numArgs = 0; toQList args; if (numArgs > 0) args.insert(args.end(), arg1); if (numArgs > 1) args.insert(args.end(), arg2); if (numArgs > 2) args.insert(args.end(), arg3); if (numArgs > 3) args.insert(args.end(), arg4); if (numArgs > 4) args.insert(args.end(), arg5); if (numArgs > 5) args.insert(args.end(), arg6); if (numArgs > 6) args.insert(args.end(), arg7); if (numArgs > 7) args.insert(args.end(), arg8); if (numArgs > 8) args.insert(args.end(), arg9); ConnectionPool->executeAll(sql, args); } const QString &toConnection::provider(void) const { return Provider; } QString toConnection::cacheDir() { QString home(QDir::homePath()); QString dirname(toConfigurationSingle::Instance().cacheDir()); if (dirname.isEmpty()) { #ifdef Q_OS_WIN32 if (getenv("TEMP")) dirname = QString(getenv("TEMP")); else #endif dirname = QString(home); dirname += "/.tora_cache"; } return dirname; } QString toConnection::cacheFile() { QString dbname(description(false).trimmed()); return (cacheDir() + "/" + dbname).trimmed(); } bool toConnection::loadDiskCache() { if (!toConfigurationSingle::Instance().cacheDisk()) return false; toConnection::objectName *cur = 0; int objCounter = 0; int synCounter = 0; QString filename = cacheFile(); QFile file(filename); if (!QFile::exists(filename)) return false; QFileInfo fi(file); QDateTime today; if (fi.lastModified().addDays(toConfigurationSingle::Instance().cacheTimeout()) < today) return false; /** read in all data */ if (!file.open(QIODevice::ReadOnly)) return false; QString data = file.readAll(); /** build cache lists */ if(!data.isEmpty()) { QStringList records = data.split("\x1D", QString::KeepEmptyParts); for (QStringList::Iterator i = records.begin(); i != records.end(); i++) { objCounter++; QStringList record = (*i).split("\x1E", QString::KeepEmptyParts); QStringList::Iterator rec = record.begin(); cur = new objectName; (*cur).Owner = (*rec); rec++; (*cur).Name = (*rec); rec++; (*cur).Type = (*rec); rec++; (*cur).Comment = (*rec); rec++; QStringList slist = (*rec).split("\x1F", QString::SkipEmptyParts); for (QStringList::Iterator s = slist.begin(); s != slist.end(); s++) { SynonymMap[(*s)] = (*cur); (*cur).Synonyms.insert((*cur).Synonyms.end(), (*s)); synCounter++; } ObjectNames.insert(ObjectNames.end(), (*cur)); delete cur; cur = 0; } } return true; } void toConnection::writeDiskCache() { QString text; long objCounter = 0; long synCounter = 0; if (!toConfigurationSingle::Instance().cacheDisk()) return ; QString filename(cacheFile()); /** check pathnames and create */ QString dirname(cacheDir()); QDir dir; dir.setPath(dirname); if (!dir.exists(dirname)) dir.mkdir(dirname); /** build record to write out */ QStringList record; QStringList records; QStringList recordSynonym; for (std::list::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) { record.clear(); record.append((*i).Owner); record.append((*i).Name); record.append((*i).Type); record.append((*i).Comment); for (std::list::iterator s = (*i).Synonyms.begin(); s != (*i).Synonyms.end(); s++) { recordSynonym.append((*s)); synCounter++; } record.append(recordSynonym.join("\x1F")); recordSynonym.clear(); objCounter++; records.append(record.join("\x1E")); } /** open file */ QFile file(filename); file.open(QIODevice::ReadWrite | QIODevice::Truncate); QTextStream t(&file); t << records.join("\x1D"); file.flush(); file.close(); } void toConnection::cacheObjects::run() { bool diskloaded = false; // hold while running toLocker clock(Connection->CacheLock); try { diskloaded = Connection->loadDiskCache(); if (!diskloaded && !Connection->Abort) { std::list n = Connection->Connection->objectNames(); if (!Connection->Abort) Connection->ObjectNames = n; } Connection->ObjectNames.sort(); Connection->ReadingValues.up(); if (!diskloaded && !Connection->Abort) { std::map m = Connection->Connection->synonymMap(Connection->ObjectNames); if (!Connection->Abort) { Connection->SynonymMap = m; Connection->writeDiskCache(); } } } catch (...) { if (Connection->ReadingValues.getValue() == 0) Connection->ReadingValues.up(); } if (Connection) Connection->ReadingValues.up(); } void toConnection::readObjects(void) { if (toConfigurationSingle::Instance().objectCache() == 3) { ReadingCache = false; return ; } if (!ReadingCache) { ReadingCache = true; try { (new toThread(new cacheObjects(this)))->start(); } catch (...) { ReadingCache = false; } } } void toConnection::rereadCache(void) { if (toConfigurationSingle::Instance().objectCache() == 3) { ColumnCache.clear(); return ; } if (ReadingValues.getValue() < 2 && ReadingCache) { toStatusMessage(qApp->translate("toConnection", "Not done caching objects, can not clear unread cache")); return ; } ReadingCache = false; while (ReadingValues.getValue() > 0) ReadingValues.down(); ObjectNames.clear(); ColumnCache.clear(); SynonymMap.clear(); /** delete cache file to force reload */ QString filename(cacheFile()); if (QFile::exists(filename)) QFile::remove(filename); readObjects(); } QString toConnection::quote(const QString &name, const bool quoteLowercase) { if (!name.isNull()) return Connection->quote(name, quoteLowercase); return QString::null; } QString toConnection::unQuote(const QString &name) { if (!name.isNull()) return Connection->unQuote(name); return QString::null; } bool toConnection::cacheAvailable(bool synonyms, bool block, bool need) { if (toConfigurationSingle::Instance().objectCache() == 3) return true; if (!ReadingCache) { if (!need) return true; if (toConfigurationSingle::Instance().objectCache() == 2 && !block) return true; readObjects(); toMainWidget()->checkCaching(); } if (ReadingValues.getValue() == 0 || (ReadingValues.getValue() == 1 && synonyms == true)) { if (block) { toBusy busy; if (toThread::mainThread()) { QProgressDialog waiting(qApp->translate("toConnection", "Waiting for object caching to be completed.\n" "Canceling this dialog will probably leave some list of\n" "database objects empty."), qApp->translate("toConnection", "Cancel"), 0, 10, toMainWidget()); waiting.setWindowTitle(qApp->translate("toConnection", "Waiting for object cache")); int num = 1; int waitVal = (synonyms ? 2 : 1); do { qApp->processEvents(); toThread::msleep(100); waiting.setValue((++num) % 10); if (waiting.wasCanceled()) return false; } while (ReadingValues.getValue() < waitVal); } ReadingValues.down(); if (synonyms) { ReadingValues.down(); ReadingValues.up(); } ReadingValues.up(); } else return false; } return true; } std::list &toConnection::objects(bool block) { if (!cacheAvailable(false, block)) { toStatusMessage(qApp->translate("toConnection", "Not done caching objects"), false, false); static std::list ret; return ret; } return ObjectNames; } void toConnection::addIfNotExists(toConnection::objectName &obj) { if (!cacheAvailable(true, false)) { toStatusMessage(qApp->translate("toConnection", "Not done caching objects"), false, false); return ; } std::list::iterator i = ObjectNames.begin(); while (i != ObjectNames.end() && (*i) < obj) i++; if (i != ObjectNames.end() && *i == obj) // Already exists, don't add return ; ObjectNames.insert(i, obj); } std::map &toConnection::synonyms(bool block) { if (!cacheAvailable(true, block)) { toStatusMessage(qApp->translate("toConnection", "Not done caching objects"), false, false); static std::map ret; return ret; } return SynonymMap; } const toConnection::objectName &toConnection::realName(const QString &object, QString &synonym, bool block) { if (!cacheAvailable(true, block)) throw qApp->translate("toConnection", "Not done caching objects"); QString name; QString owner; QChar q('"'); QChar c('.'); bool quote = false; for (int pos = 0; pos < object.length(); pos++) { if (object.at(pos) == q) { quote = !quote; } else { if (!quote && object.at(pos) == c) { owner = name; name = QString::null; } else name += object.at(pos); } } QString uo = owner.toUpper(); QString un = name.toUpper(); synonym = QString::null; for (std::list::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) { if (owner.isEmpty()) { if (((*i).Name == un || (*i).Name == name) && ((*i).Owner == user().toUpper() || (*i).Owner == database())) return *i; } else if (((*i).Name == un || (*i).Name == name) && ((*i).Owner == uo || (*i).Owner == owner)) return *i; } if (owner.isEmpty()) { std::map::iterator i = SynonymMap.find(name); if (i == SynonymMap.end() && un != name) { i = SynonymMap.find(un); synonym = un; } else synonym = name; if (i != SynonymMap.end()) { return (*i).second; } } throw qApp->translate( "toConnection", "Object %1 not available for %2").arg(object).arg(user()); } const toConnection::objectName &toConnection::realName(const QString &object, bool block) { QString dummy; return realName(object, dummy, block); } toQDescList &toConnection::columns(const objectName &object, bool nocache) { std::map::iterator i = ColumnCache.find(object); if (i == ColumnCache.end() || nocache) { ColumnCache[object] = Connection->columnDesc(object); } return ColumnCache[object]; } std::list toConnection::tables(const objectName &object, bool nocache) { std::list ret; Q_FOREACH(objectName obj, ObjectNames) { if(obj.Owner == object.Name) ret.insert(ret.end(), obj); } return ret; } bool toConnection::objectName::operator < (const objectName &nam) const { if (Owner < nam.Owner || (Owner.isNull() && !nam.Owner.isNull())) return true; if (Owner > nam.Owner || (!Owner.isNull() && nam.Owner.isNull())) return false; if (Name < nam.Name || (Name.isNull() && !nam.Name.isNull())) return true; if (Name > nam.Name || (!Name.isNull() && nam.Name.isNull())) return false; if (Type < nam.Type) return true; return false; } bool toConnection::objectName::operator == (const objectName &nam) const { return Owner == nam.Owner && Name == nam.Name && Type == nam.Type; } toSyntaxAnalyzer &toConnection::connectionImpl::analyzer() { return toSyntaxAnalyzer::defaultAnalyzer(); } toSyntaxAnalyzer &toConnection::analyzer() { return Connection->analyzer(); } std::list toConnection::connectionImpl::objectNames(void) { std::list ret; return ret; } std::map toConnection::connectionImpl::synonymMap(std::list &) { std::map ret; return ret; } toQDescList toConnection::connectionImpl::columnDesc(const objectName &) { toQDescList ret; return ret; } void toConnection::connectionImpl::parse(toConnectionSub *, const QString &) { throw qApp->translate( "toConnection", "Parse only not implemented for this type of connection"); } tora-2.1.3/src/toresultbar.cpp0000644000175000017500000001400711270353625016117 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "toconnection.h" #include "tomain.h" #include "tonoblockquery.h" #include "toresultbar.h" #include "tosql.h" #include "totool.h" #include toResultBar::toResultBar(QWidget *parent, const char *name) : toBarChart(parent, name) { connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); LastStamp = 0; Flow = true; Columns = 0; Query = NULL; Started = false; } toResultBar::~toResultBar() { delete Query; } void toResultBar::start(void) { if (!Started) { try { connect(timer(), SIGNAL(timeout()), this, SLOT(refresh())); } TOCATCH Started = true; } } void toResultBar::stop(void) { if (Started) { try { disconnect(timer(), SIGNAL(timeout()), this, SLOT(refresh())); } TOCATCH Started = false; } } void toResultBar::query(const QString &sql, const toQList ¶m, bool first) { if (!handled() || Query) return ; start(); setSQLParams(sql, param); try { First = first; Query = new toNoBlockQuery(connection(), toQuery::Background, sql, param); Poll.start(100); } TOCATCH } void toResultBar::poll(void) { try { if (Query && Query->poll()) { toQDescList desc; if (!Columns) { desc = Query->describe(); Columns = desc.size(); } if (First) { if ( desc.empty() ) desc = Query->describe(); clear(); std::list labels; for (toQDescList::iterator i = desc.begin();i != desc.end();i++) if (i != desc.begin()) labels.insert(labels.end(), (*i).Name); setLabels(labels); } while (Query->poll() && !Query->eof()) { unsigned int num = 0; QString lab = Query->readValue(); num++; std::list vals; while (!Query->eof() && num < Columns) { vals.insert(vals.end(), Query->readValue().toDouble()); num++; } if (Flow) { time_t now = time(NULL); if (now != LastStamp) { if (LastValues.size() > 0) { std::list dispVal; std::list::iterator i = vals.begin(); std::list::iterator j = LastValues.begin(); while (i != vals.end() && j != LastValues.end()) { dispVal.insert(dispVal.end(), (*i - *j) / (now - LastStamp)); i++; j++; } std::list tmp = transform(dispVal); addValues(tmp, lab); } LastValues = vals; LastStamp = now; } } else { std::list tmp = transform(vals); addValues(tmp, lab); } } if (Query->eof()) { Poll.stop(); Columns = 0; delete Query; Query = NULL; update(); } } } catch (const QString &exc) { delete Query; Query = NULL; Poll.stop(); toStatusMessage(exc); } } std::list toResultBar::transform(std::list &input) { return input; } void toResultBar::connectionChanged(void) { toResult::connectionChanged(); clear(); } void toResultBar::addMenues(QMenu *popup) { if (!sqlName().isEmpty()) { popup->addSeparator(); popup->addAction(tr("Edit SQL..."), this, SLOT(editSQL())); } } void toResultBar::editSQL(void) { toMainWidget()->editSQL(sqlName()); } tora-2.1.3/src/toworksheetsetupui.ui0000644000175000017500000002003311270353625017375 0ustar michaelmichael toWorksheetSetupUI 0 0 568 480 Form1 Automatically save file when closing editor (Without asking any questions). 0 0 0 0 6 6 SQL Editor 11 11 11 11 6 6 Auto &save Ask about saving changes when closing worksheet. Ask about saving &changes Add newly executed queries at end of log instead of top. Changing this will mess up the log in the windows that are opened. Add &log entries at end Display multiple lines in the SQL column of the logging. &Multiple lines in log. Enable statistic collection per default. &Enable statistics Enable timed statistics as well when collecting normal statistics. Enable &timed statistics Add a numbering column to the left of the result. &Display number column Move the cursor to an error if the error occurs. Move &cursor to error Keep previous results in while editor is open. Will consume lot of memory. Save previous results &Browse File to automatically open in a new editor. Default &file false DefaultFile Qt::Vertical QSizePolicy::Expanding 20 160 Execute a statement when it is selected in the log, if disabled simply selected the statement in the log. Execute directly when selecting in log Execute a statement when it is selected in the log, if disabled simply selected the statement in the log. Display column descriptions in own toplevel window. AutoSave CheckSave LogAtEnd LogMulti Statistics TimedStatistics DisplayNumber History ExecLog DefaultFile FileChoose FileChoose clicked() toWorksheetSetupUI chooseFile() 20 20 20 20 History toggled(bool) ExecLog setEnabled(bool) 20 20 20 20 tora-2.1.3/src/toresultview.cpp0000644000175000017500000012414611420544224016325 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2008 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "toconf.h" #include "tolistviewformatter.h" #include "tolistviewformatterfactory.h" //#include "tolistviewformatteridentifier.h" #include "tomain.h" #include "tomemoeditor.h" #include "toparamget.h" #include "toresultview.h" #include "tosql.h" #include "totool.h" #include "toresultlistformat.h" #include "tosearchreplace.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static int MaxColDisp; static bool Gridlines; void toResultViewMLine::setText(int col, const QString &text) { toResultViewItem::setText(col, text); int pos = 0; int lines = 0; do { pos = text.indexOf("\n", pos); lines++; pos++; } while (pos > 0); if (lines > Lines) Lines = lines; } void toResultViewMLine::setText(int col, const toQValue &text) { if (text.isDouble()) toResultViewItem::setText(col, text); setText(col, QString(text)); } void toResultViewMLine::setup(void) { toResultViewItem::setup(); int margin = listView()->itemMargin() * 2 + 1; setHeight((listView()->fontMetrics().height() + 1)*Lines + margin); } void toResultViewMLine::paintCell(QPainter *pnt, const QColorGroup & cg, int column, int width, int alignment) { toResultViewItem::paintCell(pnt, cg, column, std::max(toTreeWidgetItem::width(pnt->fontMetrics(), listView(), column), width), alignment); if (Gridlines) { pnt->setPen(Qt::gray); pnt->drawLine(width - 1, 0, width - 1, height()); pnt->drawLine(0, height() - 1, width - 1, height() - 1); } } static int TextWidth(const QFontMetrics &fm, const QString &str) { int lpos = 0; int pos = 0; int maxWidth = 0; do { pos = str.indexOf("\n", lpos); QRect bounds = fm.boundingRect(str.mid(lpos, pos - lpos)); if (bounds.width() > maxWidth) maxWidth = bounds.width(); lpos = pos + 1; } while (pos >= 0); return maxWidth; } int toResultViewMLine::realWidth(const QFontMetrics &fm, const toTreeWidget *top, int column, const QString &txt) const { if (!MaxColDisp) { MaxColDisp = toConfigurationSingle::Instance().maxColDisp(); Gridlines = toConfigurationSingle::Instance().displayGridlines(); } QString t = text(column); if (t.isNull()) t = txt; return std::min(TextWidth(fm, t), MaxColDisp) + top->itemMargin() * 2 - fm.minLeftBearing() - fm.minRightBearing() + 1; } QString toResultViewItem::firstText(int col) const { if (col >= ColumnCount) return QString::null; QString txt = ColumnData[col].Data; int pos = txt.indexOf('\n'); if (pos != -1) return txt.mid(0, pos) + "..."; return txt; } QString toResultViewItem::text(int col) const { if (col >= ColumnCount) return QString::null; if (ColumnData[col].Type == keyData::Number) return toTreeWidgetItem::text(col); return firstText(col); } int toResultViewItem::realWidth(const QFontMetrics &fm, const toTreeWidget *top, int column, const QString &txt) const { if (!MaxColDisp) { MaxColDisp = toConfigurationSingle::Instance().maxColDisp(); Gridlines = toConfigurationSingle::Instance().displayGridlines(); } QString t = text(column); if (t.isNull()) t = txt; QRect bounds = fm.boundingRect(t); return std::min(bounds.width(), MaxColDisp) + top->itemMargin() * 2 - fm.minLeftBearing() - fm.minRightBearing() + 1; } void toResultViewItem::paintCell(QPainter * p, const QColorGroup & cg, int column, int width, int align) { #if 0 // disabled, not overriding correct function anyhow // null related background handling QColorGroup colNull(cg); if ((toConfigurationSingle::Instance().indicateEmpty() && text(column) == "{null}") || text(column).isNull()) { QColor nullColor; nullColor.setNamedColor(toConfigurationSingle::Instance().indicateEmptyColor()); colNull.setColor(QColorGroup::Base, nullColor); } toTreeWidgetItem::paintCell(p, colNull, column, width, align); toResultView *view = dynamic_cast(listView()); if (view && (itemBelow() == NULL || itemBelow()->itemBelow() == NULL)) view->addItem(); if (Gridlines) { p->setPen(Qt::gray); p->drawLine(width - 1, 0, width - 1, height()); p->drawLine(0, height() - 1, width - 1, height() - 1); } #endif } #define ALLOC_SIZE 10 void toResultViewItem::setText(int col, const QString &txt) { if (txt != text(col)) { if (col >= ColumnCount || !ColumnData) { int ns = (col + ALLOC_SIZE) / ALLOC_SIZE * ALLOC_SIZE; keyData *nd = new keyData[ns]; int i; for (i = 0; i < ColumnCount; i++) nd[i] = ColumnData[i]; while (i < ns) { nd[i].Width = 0; nd[i].Type = keyData::String; i++; } delete[] ColumnData; ColumnData = nd; ColumnCount = ns; } static QRegExp number(QString::fromLatin1("^-?\\d*\\.?\\d+E?-?\\d*.?.?$")); ColumnData[col].Data = txt; if (txt == "N/A") { ColumnData[col].Type = keyData::String; ColumnData[col].KeyAsc = "\xff"; ColumnData[col].KeyDesc = "\x00"; } else if (number.indexIn(txt) >= 0) // qt4 match() { ColumnData[col].Type = keyData::Number; static char buf[100]; double val = txt.toFloat(); if (val < 0) sprintf(buf, "\x01%015.5f", val); else sprintf(buf, "%015.5f", val); ColumnData[col].KeyAsc = ColumnData[col].KeyDesc = QString::fromLatin1(buf); } else { ColumnData[col].Type = keyData::String; ColumnData[col].KeyAsc = ColumnData[col].KeyDesc = ColumnData[col].Data; } ColumnData[col].Width = realWidth(listView()->fontMetrics(), listView(), col, txt); } toTreeWidgetItem::setText(col, firstText(col)); } void toResultViewItem::setText(int col, const toQValue &text) { setText(col, QString(text)); if (text.isDouble()) ColumnData[col].Data = QString::number(text.toDouble()); } toResultViewCheck::toResultViewCheck(toTreeWidget *parent, toTreeWidgetItem *after, const QString &text, toTreeWidgetCheck::Type type) : toTreeWidgetCheck(parent, after, QString::null, type) { ColumnData = NULL; ColumnCount = 0; if (!text.isNull()) setText(0, text); } toResultViewCheck::toResultViewCheck(toTreeWidgetItem *parent, toTreeWidgetItem *after, const QString &text, toTreeWidgetCheck::Type type) : toTreeWidgetCheck(parent, after, QString::null, type) { ColumnData = NULL; ColumnCount = 0; if (!text.isNull()) setText(0, text); } void toResultViewCheck::setText(int col, const QString &txt) { if (txt != text(col)) { if (col >= ColumnCount || !ColumnData) { int ns = (col + ALLOC_SIZE) / ALLOC_SIZE * ALLOC_SIZE; keyData *nd = new keyData[ns]; int i; for (i = 0; i < ColumnCount; i++) nd[i] = ColumnData[i]; while (i < ns) { nd[i].Width = 0; nd[i].Type = keyData::String; i++; } delete[] ColumnData; ColumnData = nd; ColumnCount = ns; } static QRegExp number(QString::fromLatin1("^\\d*\\.?\\d+E?-?\\d*.?.?$")); ColumnData[col].Data = txt; if (txt == "N/A") { ColumnData[col].Type = keyData::String; ColumnData[col].KeyAsc = "\xff"; ColumnData[col].KeyDesc = "\x00"; } // qt4 else if (number.match(txt) >= 0) else if (number.indexIn(txt) >= 0) { ColumnData[col].Type = keyData::Number; static char buf[100]; double val = txt.toFloat(); if (val < 0) sprintf(buf, "\x01%015.5f", val); else sprintf(buf, "%015.5f", val); ColumnData[col].KeyAsc = ColumnData[col].KeyDesc = QString::fromLatin1(buf); } else { ColumnData[col].Type = keyData::String; ColumnData[col].KeyAsc = ColumnData[col].KeyDesc = ColumnData[col].Data; } ColumnData[col].Width = realWidth(listView()->fontMetrics(), listView(), col, txt); } toTreeWidgetCheck::setText(col, firstText(col)); } void toResultViewCheck::setText(int col, const toQValue &text) { setText(col, QString(text)); if (text.isDouble()) ColumnData[col].Data = QString::number(text.toDouble()); } void toResultViewMLCheck::setText(int col, const QString &text) { toResultViewCheck::setText(col, text); int pos = 0; int lines = 0; do { pos = text.indexOf("\n", pos); lines++; pos++; } while (pos > 0); if (lines > Lines) Lines = lines; } void toResultViewMLCheck::setText(int col, const toQValue &text) { if (text.isDouble()) toResultViewCheck::setText(col, text); setText(col, QString(text)); } void toResultViewMLCheck::setup(void) { toResultViewCheck::setup(); int margin = listView()->itemMargin() * 2; setHeight((listView()->fontMetrics().height() + 1)*Lines + margin); } void toResultViewMLCheck::paintCell(QPainter *pnt, const QColorGroup & cg, int column, int width, int alignment) { toResultViewCheck::paintCell(pnt, cg, column, std::max(toTreeWidgetCheck::width(pnt->fontMetrics(), listView(), column), width), alignment); } int toResultViewMLCheck::realWidth(const QFontMetrics &fm, const toTreeWidget *top, int column, const QString &txt) const { if (!MaxColDisp) { MaxColDisp = toConfigurationSingle::Instance().maxColDisp(); Gridlines = toConfigurationSingle::Instance().displayGridlines(); } QString t = text(column); if (t.isNull()) t = txt; int wx = top->itemMargin() * 2 - fm.minLeftBearing() - fm.minRightBearing() + 1; if (column == 0) wx += top->style()->pixelMetric(QStyle::PM_CheckListButtonSize) + 4 + top->itemMargin(); return std::min(TextWidth(fm, t), MaxColDisp) + wx; } int toResultViewCheck::realWidth(const QFontMetrics &fm, const toTreeWidget *top, int column, const QString &txt) const { if (!MaxColDisp) { MaxColDisp = toConfigurationSingle::Instance().maxColDisp(); Gridlines = toConfigurationSingle::Instance().displayGridlines(); } QString t = text(column); if (t.isNull()) t = txt; QRect bounds = fm.boundingRect(t); int wx = top->itemMargin() * 2 - fm.minLeftBearing() - fm.minRightBearing() + 1; if (column == 0) wx += top->style()->pixelMetric(QStyle::PM_CheckListButtonSize) + 4 + top->itemMargin(); return std::min(bounds.width(), MaxColDisp) + wx; } void toResultViewCheck::paintCell(QPainter * p, const QColorGroup & cg, int column, int width, int align) { toTreeWidgetCheck::paintCell(p, cg, column, width, align); toResultView *view = dynamic_cast(listView()); if (view && (itemBelow() == NULL || itemBelow()->itemBelow() == NULL)) view->addItem(); } QString toResultViewCheck::text(int col) const { if (col >= ColumnCount) return QString::null; if (ColumnData[col].Type == keyData::Number) return toTreeWidgetCheck::text(col); return firstText(col); } QString toResultViewCheck::firstText(int col) const { if (col >= ColumnCount) return QString::null; QString txt = ColumnData[col].Data; int pos = txt.indexOf('\n'); if (pos != -1) return txt.mid(0, pos) + "..."; return txt; } toListView::toListView(QWidget *parent, const char *name, Qt::WFlags f) : toTreeWidget(parent, name, f), toEditWidget(false, true, true, false, false, false, false, false, true, true, false) { setTreeStepSize(15); setSelectionMode(Extended); setAllColumnsShowFocus(true); setSorting(-1); Menu = NULL; setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(displayMenu(const QPoint &))); QString str(toConfigurationSingle::Instance().listFont()); if (!str.isEmpty()) { QFont font(toStringToFont(str)); setFont(font); } LastMove = QPoint(-1, -1); } toListView::~toListView() { } void toListView::contentsMouseDoubleClickEvent(QMouseEvent *e) { #if 0 // todo QPoint p = e->pos(); int col = headerItem()->sectionAt(p.x()); toTreeWidgetItem *item = itemAt(contentsToViewport(p)); toResultViewItem *resItem = dynamic_cast(item); toResultViewCheck *chkItem = dynamic_cast(item); QClipboard *clip = qApp->clipboard(); if (resItem) clip->setText(resItem->allText(col)); else if (chkItem) clip->setText(chkItem->allText(col)); else if (item) clip->setText(item->text(col)); Q3Header *head = header(); for (int i = 0; i < columns(); i++) { QString str; if (resItem) str = resItem->allText(i); else if (chkItem) str = chkItem->allText(col); else if (item) str = item->text(i); try { toParamGet::setDefault(toCurrentConnection(this), head->label(i).lower(), toUnnull(str)); } catch (...) {} } toTreeWidget::contentsMouseDoubleClickEvent(e); #endif } void toListView::contentsMouseMoveEvent(QMouseEvent *e) { #if 0 if (e->state() == Qt::LeftButton && e->stateAfter() == Qt::LeftButton && LastMove.x() > 0 && LastMove != e->pos()) { QPoint p = e->pos(); int col = header()->sectionAt(p.x()); toTreeWidgetItem *item = itemAt(contentsToViewport(p)); toResultViewItem *resItem = dynamic_cast(item); toResultViewCheck *chkItem = dynamic_cast(item); QString str; if (resItem) str = resItem->allText(col); else if (chkItem) str = chkItem->allText(col); else if (item) str = item->text(col); if (str.length()) { Q3DragObject *d = new Q3TextDrag(str, this); d->dragCopy(); } } else { LastMove = e->pos(); toTreeWidget::contentsMouseMoveEvent(e); } #endif } void toListView::contentsMousePressEvent(QMouseEvent *e) { #if 0 // todo LastMove = QPoint(-1, -1); toTreeWidget::contentsMousePressEvent(e); #endif } void toListView::contentsMouseReleaseEvent(QMouseEvent *e) { #if 0 // todo LastMove = QPoint(-1, -1); toTreeWidget::contentsMouseReleaseEvent(e); #endif } #if 0 toTreeWidgetItem *toListView::printPage(TOPrinter *printer, QPainter *painter, toTreeWidgetItem *top, int &column, int &level, int pageNo, bool paint) { Q3PaintDeviceMetrics wmetr(this); Q3PaintDeviceMetrics metrics(printer); double wpscalex = (double(metrics.width()) * wmetr.widthMM() / metrics.widthMM() / wmetr.width()); double wpscaley = (double(metrics.height()) * wmetr.heightMM() / metrics.heightMM() / wmetr.height()); painter->save(); QFont font = painter->font(); font.setPointSizeFloat(font.pointSizeFloat() / std::max(wpscalex, wpscaley)); painter->setFont(font); painter->scale(wpscalex, wpscaley); double mwidth = metrics.width() / wpscalex; double mheight = metrics.height() / wpscaley; double x = 0; if (paint) { QString numPage(tr("Page: %1").arg(pageNo)); painter->drawText(0, int(metrics.height() / wpscaley) - header()->height(), int(metrics.width() / wpscalex), header()->height(), Qt::SingleLine | Qt::AlignRight | Qt::AlignVCenter, numPage); painter->drawText(0, int(metrics.height() / wpscaley) - header()->height(), int(metrics.width() / wpscalex), header()->height(), Qt::SingleLine | Qt::AlignHCenter | Qt::AlignVCenter, middleString()); painter->drawText(0, int(metrics.height() / wpscaley) - header()->height(), int(metrics.width() / wpscalex), header()->height(), Qt::SingleLine | Qt::AlignLeft | Qt::AlignVCenter, sqlName()); painter->drawLine(0, header()->height() - 1, int(mwidth), header()->height() - 1); } font = toListView::font(); font.setPointSizeFloat(font.pointSizeFloat() / std::max(wpscalex, wpscaley)); painter->setFont(font); for (int i = column; i < columns(); i++) { double width = columnWidth(i); if (width + x >= mwidth) { if (i == column) width = mwidth - x - 1; else break; } if (paint) painter->drawText(int(x), 0, int(width), header()->height(), Qt::SingleLine | Qt::AlignLeft | Qt::AlignVCenter, header()->label(i)); x += width; } if (paint) painter->translate(0, header()->height()); double y = (header()->height() + 1) + header()->height(); int curLevel = level; int tree = rootIsDecorated() ? treeStepSize() : 0; int newCol = -1; toTreeWidgetItem *item = top; while (item && (y < mheight || item == top)) { if (column == 0) x = curLevel; else x = 0; painter->translate(x, 0); for (int i = column; i < columns(); i++) { double width = columnWidth(i); if (width + x >= mwidth) { if (i == column) width = mwidth - x - 1; else { newCol = i; break; } } if (i == 0) width -= curLevel; if (paint) { item->setSelected(false); item->paintCell(painter, qApp->palette().active(), i, int(width), columnAlignment(i)); painter->translate(width, 0); } x += width; } if (paint) painter->translate(-x, item->height()); y += item->height(); if (item->firstChild()) { item = item->firstChild(); curLevel += tree; } else if (item->nextSibling()) item = item->nextSibling(); else { do { item = item->parent(); curLevel -= tree; } while (item && !item->nextSibling()); if (item) item = item->nextSibling(); } } if (paint) painter->drawLine(0, 0, int(mwidth), 0); painter->restore(); if (newCol >= 0) { column = newCol; return top; } column = 0; level = curLevel; return item; } #endif void toListView::editPrint(void) { #if 0 TOPrinter printer; std::map PageColumns; std::map PageItems; int column = 0; int tree = rootIsDecorated() ? treeStepSize() : 0; int page = 1; PageColumns[1] = 0; toTreeWidgetItem *item = PageItems[1] = firstChild(); printer.setCreator(tr(TOAPPNAME)); QPainter painter(&printer); while ((item = printPage(&printer, &painter, item, column, tree, page++, false))) { PageColumns[page] = column; PageItems[page] = item; } printer.setMinMax(1, page - 1); printer.setFromTo(1, page - 1); if (printer.setup()) { QList pages; for (int i = printer.fromPage(); i <= printer.toPage() || (printer.toPage() == 0 && i < page); i++) pages += i; for (QList::iterator pageit = pages.begin(); pageit != pages.end(); pageit++) { page = *pageit; item = PageItems[page]; column = PageColumns[page]; printPage(&printer, &painter, item, column, tree, page, true); printer.newPage(); painter.resetXForm(); qApp->processEvents(); QString str = tr("Printing page %1").arg(page); toStatusMessage(str, false, false); } painter.end(); toStatusMessage(tr("Done printing"), false, false); } #endif } void toListView::setDisplayMenu(QMenu *m) { if (Menu) { delete Menu; Menu = NULL; } Menu = m; } void toListView::displayMenu(const QPoint &pos) { toTreeWidgetItem *item = itemAt(pos); if (!item) return; if (!Menu) { Menu = new QMenu(this); displayAct = Menu->addAction(tr("Display in editor...")); QMenu *just = new QMenu(tr("Alignment"), this); leftAct = just->addAction(tr("Left")); centerAct = just->addAction(tr("Center")); rightAct = just->addAction(tr("Right")); connect(just, SIGNAL(triggered(QAction *)), this, SLOT(menuCallback(QAction *))); Menu->addSeparator(); copyAct = Menu->addAction(tr("&Copy field")); // if (selectionMode() == Multi || selectionMode() == Extended) // { // copySelAct = Menu->addAction(tr("Copy selection")); // copyHeadAct = Menu->addAction(tr("Copy selection with header")); // } copyTransAct = Menu->addAction(tr("Copy transposed")); if (selectionMode() == Multi || selectionMode() == Extended) { Menu->addSeparator(); selectAllAct = Menu->addAction(tr("Select all")); } Menu->addSeparator(); exportAct = Menu->addAction(tr("Export to file...")); if (!Name.isEmpty()) { Menu->addSeparator(); editAct = Menu->addAction(tr("Edit SQL...")); } connect(Menu, SIGNAL(triggered(QAction *)), this, SLOT(menuCallback(QAction *))); addMenues(Menu); emit displayMenu(Menu); } MenuItem = item; MenuColumn = currentColumn(); Menu->exec(QCursor::pos()); } void toListView::displayMemo(void) { QString str = menuText(); if (!str.isEmpty()) new toMemoEditor(this, str, 0, MenuColumn); } void toListView::menuCallback(QAction *action) { if (action == copyAct) { QClipboard *clip = qApp->clipboard(); clip->setText(menuText()); } else if (action == copyFormatAct) { try { toResultListFormat exp(this, toResultListFormat::TypeCopy); if (!exp.exec()) return; QString str = exportAsText(exp.exportSettings()); if (!str.isNull()) { QClipboard *clip = qApp->clipboard(); QMimeData drag; drag.setHtml(str); clip->setMimeData(&drag); } } TOCATCH; } else if (action == leftAct) setColumnAlignment(MenuColumn, Qt::AlignLeft); else if (action == centerAct) setColumnAlignment(MenuColumn, Qt::AlignCenter); else if (action == rightAct) setColumnAlignment(MenuColumn, Qt::AlignRight); else if (action == selectAllAct) selectAll(true); // else if(act == // case TORESULT_MEMO: // displayMemo(); // break; else if (action == copyTransAct) copyTransposed(); else if (action == editAct) toMainWidget()->editSQL(Name); else if (action == exportAct) editSave(false); else toStatusMessage("Not yet implemented."); } QString toListView::menuText(void) { toResultViewItem *resItem = dynamic_cast(MenuItem); toResultViewCheck *chkItem = dynamic_cast(MenuItem); QString str; if (resItem) str = resItem->allText(MenuColumn); else if (chkItem) str = chkItem->allText(MenuColumn); else if (MenuItem) str = MenuItem->text(MenuColumn); return str; } void toListView::focusInEvent(QFocusEvent *e) { receivedFocus(); toTreeWidget::focusInEvent(e); } bool toListView::searchNext(const QString & text) { toTreeWidgetItem *item = currentItem(); bool first = true; bool cs = toMainWidget()->searchDialog()->caseSensitive(); bool ww = toMainWidget()->searchDialog()->wholeWords(); bool rx = toMainWidget()->searchDialog()->searchMode() == Search::SearchRegexp; QString realSearch(text); if (!cs) realSearch = realSearch.toUpper(); for (toTreeWidgetItem *next = NULL; item; item = next) { if (!first) first = true; else { for (int i = 0; i < columns(); i++) { toResultViewItem *resItem = dynamic_cast(item); toResultViewCheck *chkItem = dynamic_cast(item); QString txt; if (resItem) txt = resItem->allText(i); else if (chkItem) txt = chkItem->allText(i); else if (item) txt = item->text(i); if (!cs) txt = txt.toUpper(); if (rx && txt.contains(QRegExp(text))) { setCurrentItem(item); return true; } else if ((ww && txt == realSearch) || (!ww && txt.contains(realSearch))) { setCurrentItem(item); return true; } } } if (item->firstChild()) next = item->firstChild(); else if (item->nextSibling()) next = item->nextSibling(); else { next = item; do { next = next->parent(); } while (next && !next->nextSibling()); if (next) next = next->nextSibling(); } } return false; } bool toListView::searchPrevious(const QString & text) { // TODO/FIXME: real backward searching return searchNext(text); } toListView *toListView::copyTransposed(void) { QMdiSubWindow * w = new QMdiSubWindow(toMainWidget()->workspace()); toListView *lst = new toListView(toMainWidget()->workspace()); w->setAttribute(Qt::WA_DeleteOnClose); w->setWidget(lst); toMainWidget()->workspace()->addSubWindow(w); // qt4 // lst->setWFlags(lst->getWFlags() | Qt::WDestructiveClose); lst->Name = Name; toTreeWidgetItem *next = NULL; for (int i = 1; i < columns(); i++) { next = new toResultViewItem(lst, next); next->setText(0, headerItem()->text(i)); } next = NULL; int col = 1; lst->addColumn(headerItem()->text(0)); for (toTreeWidgetItem *item = firstChild(); item; item = next) { lst->addColumn(item->text(0)); toTreeWidgetItem *ci = lst->firstChild(); for (int i = 1; i < columns() && ci; i++) { ci->setText(col, item->text(i)); ci = ci->nextSibling(); } if (item->firstChild()) { next = item->firstChild(); } else if (item->nextSibling()) next = item->nextSibling(); else { next = item; do { next = next->parent(); } while (next && !next->nextSibling()); if (next) next = next->nextSibling(); } col++; } w->setWindowTitle(Name); w->show(); toMainWidget()->updateWindowsMenu(); return lst; } bool toListView::editSave(bool) { try { toResultListFormat dia(this, toResultListFormat::TypeExport); if (!dia.exec()) return false; toExportSettings settings = dia.exportSettings(); QString filename = toSaveFilename(QString::null, settings.extension, this); if (filename.isEmpty()) return false; std::auto_ptr pFormatter( toListViewFormatterFactory::Instance().CreateObject(settings.type)); return toWriteFile(filename, exportAsText(settings)); } TOCATCH return false; } void toListView::addMenues(QMenu *) {} #if 0 int toListView::exportType(QString &separator, QString &delimiter, bool &includeHeader, bool &onlySelection) { toResultListFormat format(this, NULL); if (!format.exec()) return -1; separator = format.Separator->text(); delimiter = format.Delimiter->text(); includeHeader = format.IncludeHeaders->isChecked(); onlySelection = format.OnlySelection->isChecked(); return format.Format->currentIndex(); } #endif QString toListView::exportAsText(toExportSettings settings) { #if 0 QString result; includeHeader = tincludeHeader; onlySelection = tonlySelection; sep = tsep; del = tdel; if (type < 0) type = exportType(sep, del, includeHeader, onlySelection); if (type < 0) return QString::null; std::auto_ptr pFormatter(toListViewFormatterFactory::Instance().CreateObject(type)); result = pFormatter->getFormattedString(*this); return result; #endif if (settings.requireSelection()) settings.selected = selectedIndexes(); if (settings.rowsExport == toExportSettings::RowsAll) { QProgressDialog progress("Fetching All Data...", "Abort", 0, 2, this); progress.setWindowModality(Qt::WindowModal); while (model()->canFetchMore(currentIndex())) { if (progress.wasCanceled()) break; model()->fetchMore(currentIndex()); progress.setValue(progress.value() == 0 ? 1 : 0); } progress.setValue(2); } std::auto_ptr pFormatter( toListViewFormatterFactory::Instance().CreateObject(settings.type)); settings.owner = owner; settings.objectName = objectName; return pFormatter->getFormattedString(settings, model()); } void toListView::exportData(std::map &ret, const QString &prefix) { int id = 0; for (int i = 0; i < columns(); i++) { id++; ret[prefix + ":Labels:" + QString::number(id).toLatin1()] = headerItem()->text(i); } std::map itemMap; toTreeWidgetItem *next = NULL; id = 0; if (rootIsDecorated()) ret[prefix + ":Decorated"] = QString::fromLatin1("Yes"); for (toTreeWidgetItem *item = firstChild(); item; item = next) { id++; QString nam = prefix; nam += ":Items:"; nam += QString::number(id).toLatin1(); nam += ":"; itemMap[item] = id; if (item->parent()) ret[nam + "Parent"] = QString::number(itemMap[item->parent()]); else ret[nam + "Parent"] = QString::fromLatin1("0"); if (item->isOpen()) ret[nam + "Open"] = QString::fromLatin1("Yes"); for (int i = 0; i < columns(); i++) { toResultViewItem *resItem = dynamic_cast(item); toResultViewCheck *chkItem = dynamic_cast(item); QString val; if (resItem) val = resItem->allText(i); else if (chkItem) val = resItem->allText(i); else val = item->text(i); ret[nam + QString::number(i).toLatin1()] = val; } if (item->firstChild()) next = item->firstChild(); else if (item->nextSibling()) next = item->nextSibling(); else { next = item; do { next = next->parent(); } while (next && !next->nextSibling()); if (next) next = next->nextSibling(); } } } void toListView::importData(std::map &ret, const QString &prefix) { int id; std::map::iterator i; clear(); id = 1; while ((i = ret.find(prefix + ":Labels:" + QString::number(id).toLatin1())) != ret.end()) { addColumn((*i).second); id++; } setRootIsDecorated(ret.find(prefix + ":Decorated") != ret.end()); setSorting(0); std::map itemMap; id = 1; while ((i = ret.find(prefix + ":Items:" + QString::number(id).toLatin1() + ":Parent")) != ret.end()) { QString nam = prefix + ":Items:" + QString::number(id).toLatin1() + ":"; int parent = (*i).second.toInt(); toResultViewItem *item; if (parent) item = new toResultViewItem(itemMap[parent], NULL); else item = new toResultViewItem(this, NULL); if (!ret[nam + "Open"].isEmpty()) item->setOpen(true); itemMap[id] = item; for (int j = 0; j < columns(); j++) item->setText(j, ret[nam + QString::number(j).toLatin1()]); id++; } } bool toResultView::eof(void) { return !Query || Query->eof(); } QString toResultView::middleString() { try { return connection().description(); } catch (...) { return QString::null; } } void toResultView::setup(bool readable, bool dispCol) { Query = NULL; ReadableColumns = readable; NumberColumn = dispCol; SortConnected = false; if (NumberColumn) { addColumn(QString::fromLatin1("#")); setColumnAlignment(0, Qt::AlignRight); } Filter = NULL; readAllEnabled(true); ReadAll = false; SortColumn = -2; SortAscending = true; } toResultView::toResultView(bool readable, bool dispCol, QWidget *parent, const char *name, Qt::WFlags f) : toListView(parent, name, f) { setup(readable, dispCol); } toResultView::toResultView(QWidget *parent, const char *name, Qt::WFlags f) : toListView(parent, name, f) { setup(false, true); } #define STOP_RESIZE_ROW 500 toTreeWidgetItem *toResultView::createItem(toTreeWidgetItem *last, const QString &str) { if (childCount() == STOP_RESIZE_ROW && resizeMode() == toTreeWidget::NoColumn) for (int i = 0; i < columns(); i++) setColumnWidthMode(i, toTreeWidget::Manual); return new toResultViewItem(this, last, str); } void toResultView::addItem(void) { MaxColDisp = toConfigurationSingle::Instance().maxColDisp(); Gridlines = toConfigurationSingle::Instance().displayGridlines(); try { if (Query && !Query->eof()) { RowNumber++; int disp = 0; toTreeWidgetItem *last = LastItem; LastItem = createItem(LastItem, QString::null); if (NumberColumn) { LastItem->setText(0, QString::number(RowNumber)); disp = 1; } else LastItem->setText(columns(), QString::number(RowNumber)); for (int j = 0; (j < Query->columns() || j == 0) && !Query->eof(); j++) LastItem->setText(j + disp, Query->readValue()); if (Filter && !Filter->check(LastItem)) { delete LastItem; LastItem = last; RowNumber--; } } } TOCATCH } void toResultView::query(const QString &sql, const toQList ¶m) { if (!handled()) return ; if (!setSQLParams(sql, param)) return ; delete Query; Query = NULL; LastItem = NULL; RowNumber = 0; clear(); if (NumberColumn) { addColumn(QString::fromLatin1("#")); setColumnAlignment(0, Qt::AlignRight); } if (Filter) Filter->startingQuery(); try { Query = new toQuery(connection(), sql, param); //printf("Query: %s \n", (const char*) Query->sql); toQDescList description = Query->describe(); bool hidden = false; for (toQDescList::iterator i = description.begin(); i != description.end(); i++) { QString name = (*i).Name; if (ReadableColumns) toReadableColumn(name); if (name.length() > 0 && name.at(0) != ' ') { if (hidden) throw tr("Can only hide last column in query"); if (name.at(0) == '-') { addColumn(toTranslateMayby(sqlName(), name.right(name.length() - 1))); setColumnAlignment(columns() - 1, Qt::AlignRight); } else { addColumn(toTranslateMayby(sqlName(), name)); if ((*i).AlignRight) setColumnAlignment(columns() - 1, Qt::AlignRight); } } else hidden = true; } setResizeMode(resizeMode()); if (NumberColumn) setSorting(0); else setSorting(Query->columns()); int MaxNumber = toConfigurationSingle::Instance().maxNumber(); for (int j = 0; j < MaxNumber && !Query->eof(); j++) addItem(); if (ReadAll || MaxNumber < 0) editReadAll(); } TOCATCH updateContents(); } void toResultView::editReadAll(void) { if (!ReadAll) toStatusMessage(tr("Reading all entries"), false, false); int i = 0; while (!eof()) { addItem(); i++; if (i % 100 == 0) qApp->processEvents(); } } toResultView::~toResultView() { if (Query) Query->deleteLater(); delete Filter; } void toResultView::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_PageDown) { toTreeWidgetItem *item = firstChild(); if (item && !eof() && item->height()) { int num = visibleHeight() / item->height(); while (num > 0) { addItem(); num--; } } } toTreeWidget::keyPressEvent(e); } void toResultView::addMenues(QMenu *menu) { menu->addSeparator(); ReadAllAct = menu->addAction(tr("Read All")); } void toResultView::menuCallback(QAction *cmd) { if (cmd == ReadAllAct) editReadAll(); else { if (cmd == toListView::exportAct) editReadAll(); toListView::menuCallback(cmd); } } int toResultView::queryColumns(void) const { return Query ? Query->columns() : 0; } void toResultView::setSorting(int col, bool asc) { if (col == SortColumn && asc == SortAscending) return ; SortColumn = col; SortAscending = asc; if (((col == 0 && NumberColumn) || (col == columns() && !NumberColumn)) && asc == true) { col = -1; toListView::setSorting(0, true); sort(); QTimer::singleShot(1, this, SLOT(checkHeading())); } else if (SortConnected) { SortConnected = false; // disconnect(headerItem(), SIGNAL(clicked(int)), this, SLOT(headingClicked(int))); todo } toListView::setSorting(col, asc); } void toResultView::headingClicked(int col) { if (col == SortColumn) setSorting(col, !SortAscending); else setSorting(col, true); } void toResultView::checkHeading(void) { SortConnected = true; // connect(headerItem(), SIGNAL(clicked(int)), this, SLOT(headingClicked(int))); todo } void toResultView::refresh(void) { int lastSort = SortColumn; bool lastAsc = SortAscending; toResult::refresh(); if (lastSort >= 0) setSorting(lastSort, lastAsc); } void toResultFilter::exportData(std::map &, const QString &) {} void toResultFilter::importData(std::map &, const QString &) {} tora-2.1.3/src/otl/0000755000175000017500000000000011445450570013642 5ustar michaelmichaeltora-2.1.3/src/otl/otlv4.h0000644000175000017500000270431211445353612015073 0ustar michaelmichael// ============================================================== // ORACLE, ODBC and DB2/CLI Template Library, Version 4.0.173, // Copyright (C) Sergei Kuchin, 1996,2008 // Author: Sergei Kuchin // This library is free software. Permission to use, copy, // modify and redistribute it for any purpose is hereby granted // without fee, provided that the above copyright notice appear // in all copies. // ============================================================== #ifndef __OTL_H__ #define __OTL_H__ #define OTL_VERSION_NUMBER (0x0400ADL) #if defined(_MSC_VER) #if (_MSC_VER >= 1400) #pragma warning (disable:4351) //#pragma warning (disable:4996) #define OTL_STRCAT_S(dest,dest_sz,src) strcat_s(dest,dest_sz,src) #define OTL_STRCPY_S(dest,dest_sz,src) strcpy_s(dest,dest_sz,src) #define OTL_STRNCPY_S(dest,dest_sz,src,count) strncpy_s(dest,dest_sz,src,count) #else #define OTL_STRCAT_S(dest,dest_sz,src) strcat(dest,src) #define OTL_STRCPY_S(dest,dest_sz,src) strcpy(dest,src) #define OTL_STRNCPY_S(dest,dest_sz,src,count) strncpy(dest,src,count) #endif #else #define OTL_STRCAT_S(dest,dest_sz,src) strcat(dest,src) #define OTL_STRCPY_S(dest,dest_sz,src) strcpy(dest,src) #define OTL_STRNCPY_S(dest,dest_sz,src,count) strncpy(dest,src,count) #endif #include #include #include #include //======================= CONFIGURATION #DEFINEs =========================== // Uncomment the following line in order to include the OTL for ODBC: //#define OTL_ODBC // Uncomment the following line in order to include the OTL for // MySQL/MyODBC for MyODBC 2.5 (pretty old). Otherwise, use OTL_ODBC //#define OTL_ODBC_MYSQL // Uncomment the following line in order to include the OTL for DB2 CLI: //#define OTL_DB2_CLI // Uncomment the following line in order to include the OTL for // Oracle 7: //#define OTL_ORA7 // Uncomment the following line in order to include the OTL for // Oracle 8: //#define OTL_ORA8 // Uncomment the following line in order to include the OTL for // Oracle 8i: //#define OTL_ORA8I // Uncomment the following line in order to include the OTL for // Oracle 9i: //#define OTL_ORA9I // Uncomment the following line in order to include the OTL for // Oracle 10g Release 1: //#define OTL_ORA10G // Uncomment the following line in order to include the OTL for // Oracle 10g Release 2: //#define OTL_ORA10G_R2 // Uncomment the following line in order to include the OTL for // Oracle 11g Release 1 //#define OTL_ORA11G // The macro definitions may be also turned on via C++ compiler command line // option, e.g.: -DOTL_ODBC, -DOTL_ORA7, -DOTL_ORA8, -DOTL_ORA8I, -DOTL_ODBC_UNIX // -DOTL_ODBC_MYSQL, -DOTL_DB2_CLI // this becomes the default from version 4.0.162 and on. // the #define is not enabled for vc++ 6.0 in version 4.0.167 and higher. #if !defined(OTL_UNCAUGHT_EXCEPTION_ON) && !(defined(_MSC_VER)&&(_MSC_VER==1200)) #define OTL_UNCAUGHT_EXCEPTION_ON #endif #if defined(OTL_ORA11G) #define OTL_ORA10G_R2 #endif #if defined(OTL_STREAM_LEGACY_BUFFER_SIZE_TYPE) typedef short int otl_stream_buffer_size_type; #else typedef int otl_stream_buffer_size_type; #endif #if defined(OTL_ODBC_MULTI_MODE) #define OTL_ODBC #define OTL_ODBC_SQL_EXTENDED_FETCH_ON #endif #if defined(OTL_ODBC_MSSQL_2005) #define OTL_ODBC #endif #if defined(OTL_IODBC_BSD) #define OTL_ODBC #define OTL_ODBC_UNIX #endif #if defined(OTL_ODBC_TIMESTEN_WIN) #define OTL_ODBC_TIMESTEN #define OTL_ODBC #define OTL_ODBC_SQL_EXTENDED_FETCH_ON #define ODBCVER 0x0250 #include #endif #if defined(OTL_ODBC_TIMESTEN_UNIX) #define OTL_ODBC_TIMESTEN #define OTL_ODBC #define OTL_ODBC_UNIX #define OTL_ODBC_SQL_EXTENDED_FETCH_ON #include #endif #if defined(OTL_ODBC_ENTERPRISEDB) #define OTL_ODBC_POSTGRESQL #endif #if defined(OTL_ODBC_POSTGRESQL) #define OTL_ODBC #endif // Comment out this #define when using pre-ANSI C++ compiler #if !defined(OTL_ODBC_zOS) && !defined (OTL_ANSI_CPP) #define OTL_ANSI_CPP #endif #if defined(OTL_ODBC_zOS) #define OTL_ODBC_UNIX #define OTL_ODBC_SQL_EXTENDED_FETCH_ON #endif #if defined(OTL_ORA8I) #define OTL_ORA8 #define OTL_ORA8_8I_REFCUR #define OTL_ORA8_8I_DESC_COLUMN_SCALE #endif #if defined(OTL_ORA10G)||defined(OTL_ORA10G_R2) #define OTL_ORA9I #define OTL_ORA_NATIVE_TYPES #endif #if defined(OTL_ORA9I) #define OTL_ORA8 #define OTL_ORA8_8I_REFCUR #define OTL_ORA8_8I_DESC_COLUMN_SCALE #endif #if defined(OTL_ODBC_MYSQL) #define OTL_ODBC #endif #if defined(OTL_ODBC_XTG_IBASE6) #define OTL_ODBC #endif #define OTL_VALUE_TEMPLATE //#define OTL_ODBC_SQL_EXTENDED_FETCH_ON #if defined(OTL_ODBC_UNIX) && !defined(OTL_ODBC) #define OTL_ODBC #endif #if defined(OTL_BIND_VAR_STRICT_TYPE_CHECKING_ON) #define OTL_CHECK_BIND_VARS \ if(strcmp(type_arr,"INT")==0|| \ strcmp(type_arr,"UNSIGNED")==0|| \ strcmp(type_arr,"SHORT")==0|| \ strcmp(type_arr,"LONG")==0|| \ strcmp(type_arr,"FLOAT")==0|| \ strcmp(type_arr,"DOUBLE")==0|| \ strcmp(type_arr,"TIMESTAMP")==0|| \ strcmp(type_arr,"TZ_TIMESTAMP")==0|| \ strcmp(type_arr,"LTZ_TIMESTAMP")==0|| \ strcmp(type_arr,"BIGINT")==0|| \ strcmp(type_arr,"CHAR")==0|| \ strcmp(type_arr,"CHARZ")==0|| \ strcmp(type_arr,"DB2DATE")==0|| \ strcmp(type_arr,"DB2TIME")==0|| \ strcmp(type_arr,"VARCHAR_LONG")==0|| \ strcmp(type_arr,"RAW_LONG")==0|| \ strcmp(type_arr,"RAW")==0|| \ strcmp(type_arr,"CLOB")==0|| \ strcmp(type_arr,"BLOB")==0|| \ strcmp(type_arr,"NCHAR")==0|| \ strcmp(type_arr,"NCLOB")==0|| \ strcmp(type_arr,"REFCUR")==0) \ ; \ else \ return 0; #else #define OTL_CHECK_BIND_VARS #endif // ------------------- Namespace generation ------------------------ #if defined(OTL_EXPLICIT_NAMESPACES) #if defined(OTL_DB2_CLI) #define OTL_ODBC_NAMESPACE_BEGIN namespace db2 { #define OTL_ODBC_NAMESPACE_PREFIX db2:: #define OTL_ODBC_NAMESPACE_END } #else #define OTL_ODBC_NAMESPACE_BEGIN namespace odbc { #define OTL_ODBC_NAMESPACE_PREFIX odbc:: #define OTL_ODBC_NAMESPACE_END } #endif #define OTL_ORA7_NAMESPACE_BEGIN namespace oracle { #define OTL_ORA7_NAMESPACE_PREFIX oracle:: #define OTL_ORA7_NAMESPACE_END } #define OTL_ORA8_NAMESPACE_BEGIN namespace oracle { #define OTL_ORA8_NAMESPACE_PREFIX oracle:: #define OTL_ORA8_NAMESPACE_END } #else // Only one OTL is being intantiated #if defined(OTL_ODBC)&&!defined(OTL_ORA8)&& \ !defined(OTL_ORA7)&&!defined(OTL_DB2_CLI) \ || !defined(OTL_ODBC)&&defined(OTL_ORA8)&& \ !defined(OTL_ORA7)&&!defined(OTL_DB2_CLI) \ || !defined(OTL_ODBC)&&!defined(OTL_ORA8)&& \ defined(OTL_ORA7)&&!defined(OTL_DB2_CLI) \ || !defined(OTL_ODBC)&&!defined(OTL_ORA8)&& \ !defined(OTL_ORA7)&&defined(OTL_DB2_CLI) #define OTL_ODBC_NAMESPACE_BEGIN #define OTL_ODBC_NAMESPACE_PREFIX #define OTL_ODBC_NAMESPACE_END #define OTL_ORA7_NAMESPACE_BEGIN #define OTL_ORA7_NAMESPACE_PREFIX #define OTL_ORA7_NAMESPACE_END #define OTL_ORA8_NAMESPACE_BEGIN #define OTL_ORA8_NAMESPACE_PREFIX #define OTL_ORA8_NAMESPACE_END #endif // ================ Combinations of two OTLs ========================= #if defined(OTL_ODBC) && defined(OTL_ORA7) && \ !defined(OTL_ORA8) && !defined(OTL_DB2_CLI) #define OTL_ODBC_NAMESPACE_BEGIN namespace odbc{ #define OTL_ODBC_NAMESPACE_PREFIX odbc:: #define OTL_ODBC_NAMESPACE_END } #define OTL_ORA7_NAMESPACE_BEGIN namespace oracle { #define OTL_ORA7_NAMESPACE_PREFIX oracle:: #define OTL_ORA7_NAMESPACE_END } #define OTL_ORA8_NAMESPACE_BEGIN #define OTL_ORA8_NAMESPACE_PREFIX #define OTL_ORA8_NAMESPACE_END #endif #if defined(OTL_ODBC) && !defined(OTL_ORA7) && \ defined(OTL_ORA8) && !defined(OTL_DB2_CLI) #define OTL_ODBC_NAMESPACE_BEGIN namespace odbc{ #define OTL_ODBC_NAMESPACE_PREFIX odbc:: #define OTL_ODBC_NAMESPACE_END } #define OTL_ORA8_NAMESPACE_BEGIN namespace oracle { #define OTL_ORA8_NAMESPACE_PREFIX oracle:: #define OTL_ORA8_NAMESPACE_END } #define OTL_ORA7_NAMESPACE_BEGIN #define OTL_ORA7_NAMESPACE_PREFIX #define OTL_ORA7_NAMESPACE_END #endif #if !defined(OTL_ODBC) && defined(OTL_ORA7) && \ !defined(OTL_ORA8) && defined(OTL_DB2_CLI) #define OTL_ORA7_NAMESPACE_BEGIN namespace oracle { #define OTL_ORA7_NAMESPACE_PREFIX oracle:: #define OTL_ORA7_NAMESPACE_END } #define OTL_ORA8_NAMESPACE_BEGIN #define OTL_ORA8_NAMESPACE_PREFIX #define OTL_ORA8_NAMESPACE_END #define OTL_ODBC_NAMESPACE_BEGIN namespace db2 { #define OTL_ODBC_NAMESPACE_PREFIX db2:: #define OTL_ODBC_NAMESPACE_END } #endif #if !defined(OTL_ODBC) && !defined(OTL_ORA7) && \ defined(OTL_ORA8) && defined(OTL_DB2_CLI) #define OTL_ORA8_NAMESPACE_BEGIN namespace oracle { #define OTL_ORA8_NAMESPACE_PREFIX oracle:: #define OTL_ORA8_NAMESPACE_END } #define OTL_ORA7_NAMESPACE_BEGIN #define OTL_ORA7_NAMESPACE_PREFIX #define OTL_ORA7_NAMESPACE_END #define OTL_ODBC_NAMESPACE_BEGIN namespace db2 { #define OTL_ODBC_NAMESPACE_PREFIX db2:: #define OTL_ODBC_NAMESPACE_END } #endif #endif // -------------------- End of namespace generation ------------------- // --------------------- Invalid combinations -------------------------- #if defined(OTL_STL) && defined(OTL_UNICODE_STRING_TYPE) #error Invalid combination: OTL_STL and OTL_UNICODE_STRING_TYPE #endif #if defined(OTL_ORA_UTF8) && !defined(OTL_ORA10G) && \ !defined(OTL_ORA_10G_R2) && !defined(OTL_ORA9I) #error Invalid combination: OTL_ORA_UTF8 can only be used with OTL_ORA9I or higher #endif #if defined(OTL_ORA_UTF8) && defined(OTL_UNICODE) #error Invalid combination: OTL_ORA_UTF8 and OTL_UNICODE are mutually exclusive #endif #if defined(OTL_ODBC) && defined(OTL_DB2_CLI) #error Invalid combination: OTL_ODBC && OTL_DB2_CLI together #endif #if defined(OTL_ORA7) && defined(OTL_ORA8) #error Invalid combination: OTL_ORA7 && OTL_ORA8(I) together #endif #if (defined(OTL_ORA7) || defined(OTL_ORA8) || \ defined(OTL_ORA8I) || defined(OTL_ORA9I) ) && \ defined(OTL_BIGINT) && \ (defined(OTL_ODBC) || defined(OTL_DB2_CLI)) #error OTL_BIGINT is not supported when OTL_ORAXX and OTL_ODBC \ (or OTL_DB2_CLI) are defined together #endif #if defined (OTL_ORA7) && defined(OTL_ORA8) #error Invalid combination: OTL_ORA7 && OTL_ORA8(I) together #endif #if defined(OTL_ORA_OCI_ENV_CREATE) && \ (!defined(OTL_ORA8I) && !defined(OTL_ORA9I) && \ !defined(OTL_ORA10G) && !defined(OTL_ORA10G_R2)) #error OTL_ORA_OCI_ENV_CREATE can be only defined when OTL_ORA8I, OTL_ORA9I, OTL_ORA10G, OTL_ORA10G_R2, or OTL_ORA11G is defined #endif // -------------------------------------------------------------------- #if defined(OTL_TRACE_LEVEL) #if !defined(OTL_TRACE_LINE_PREFIX) #define OTL_TRACE_LINE_PREFIX "OTL TRACE ==> " #endif #if defined(OTL_UNICODE_CHAR_TYPE) && !defined(OTL_UNICODE) #error OTL_UNICODE needs to be defined if OTL_UNICODE_CHAR_TYPE is defined #endif #if defined(OTL_UNICODE_STRING_TYPE) && !defined(OTL_UNICODE_CHAR_TYPE) #error OTL_UNICODE_CHAR_TYPE needs to be defined if OTL_UNICODE_STRING_TYPE is defined #endif #if defined(OTL_UNICODE_STRING_TYPE) && !defined(OTL_UNICODE_CHAR_TYPE) #error OTL_UNICODE_CHAR_TYPE needs to be defined if OTL_UNICODE_STRING_TYPE is defined #endif #if defined(OTL_UNICODE_STRING_TYPE) && !defined(OTL_UNICODE) #error OTL_UNICODE needs to be defined if OTL_UNICODE_STRING_TYPE is defined #endif #if defined(OTL_UNICODE_EXCEPTION_AND_RLOGON) && !defined(OTL_UNICODE_CHAR_TYPE) #error OTL_UNICODE_CHAR_TYPE needs to be defined if OTL_UNICODE_EXCEPTION_AND_RLOGON is defined #endif #if !defined(OTL_TRACE_LINE_SUFFIX) #if defined(OTL_UNICODE) #define OTL_TRACE_LINE_SUFFIX L"\n" #else #define OTL_TRACE_LINE_SUFFIX "\n" #endif #endif #if !defined(OTL_TRACE_STREAM_OPEN) #define OTL_TRACE_STREAM_OPEN \ if(OTL_TRACE_LEVEL & 0x4){ \ OTL_TRACE_STREAM<0){ \ OTL_STRCAT_S(temp_connect_str,sizeof(temp_connect_str),"@"); \ OTL_STRCAT_S(temp_connect_str,sizeof(temp_connect_str),tnsname); \ } \ OTL_TRACE_STREAM<0){ \ OTL_STRCAT_S(temp_connect_str2,sizeof(temp_connect_str2),"@"); \ OTL_STRCAT_S(temp_connect_str2,sizeof(temp_connect_str2),tnsname); \ } \ OTL_TRACE_STREAM<(_e) #define OTL_RCAST(_t,_e) reinterpret_cast<_t >(_e) #define OTL_DCAST(_t,_e) dynamic_cast<_t >(_e) #define OTL_CCAST(_t,_e) const_cast<_t >(_e) #define OTL_CONST_EXCEPTION const #if defined OTL_FUNC_THROW_SPEC_ON #define OTL_THROWS_OTL_EXCEPTION throw(otl_exception) #define OTL_NO_THROW throw() #else #define OTL_THROWS_OTL_EXCEPTION #define OTL_NO_THROW #endif #define OTL_TYPE_NAME typename #include #else #define OTL_SCAST(_t,_e) ((_t)(_e)) #define OTL_RCAST(_t,_e) ((_t)(_e)) #define OTL_DCAST(_t,_e) ((_t)(_e)) #define OTL_CCAST(_t,_e) ((_t)(_e)) #define OTL_CONST_EXCEPTION #define OTL_THROWS_OTL_EXCEPTION #define OTL_NO_THROW #define OTL_TYPE_NAME class #endif #define OTL_PCONV(_to,_from,_val) \ OTL_SCAST(_to,*OTL_RCAST(_from*,OTL_CCAST(void*,_val))) #if defined(OTL_ACE) #include #include #include #include #define OTL_USER_DEFINED_STRING_CLASS_ON #define USER_DEFINED_STRING_CLASS ACE_TString #define OTL_VALUE_TEMPLATE_ON const int otl_tmpl_vector_default_size=16; template class otl_tmpl_vector: public ACE_Array{ public: otl_tmpl_vector(const int init_size=otl_tmpl_vector_default_size) : ACE_Array(init_size==0?otl_tmpl_vector_default_size:init_size) { _length=0; } ~otl_tmpl_vector(){} int capacity(void) const { return this->max_size(); } int size(void) const { return _length; } void clear(void) { _length=0; } void resize(const int new_size, const T& t=T()) { ACE_Array::size(new_size); if(new_size>_length){ for(int i=_length;imax_size(); if(_length==curr_max_size) ACE_Array::size(curr_max_size*2); ++_length; (*this)[_length-1]=elem; } void pop_back(void) { if(_length>0) --_length; } protected: int _length; }; #endif #if defined(OTL_UNCAUGHT_EXCEPTION_ON) #include #if !defined(OTL_STLPORT) inline bool otl_uncaught_exception() { return std::uncaught_exception(); } #else inline bool otl_uncaught_exception() { return __std_alias::uncaught_exception(); } #endif #else inline bool otl_uncaught_exception() { return false; } #endif #if defined(OTL_STLPORT) #if defined(__STLPORT_STD) #define OTL_STLPORT_NAMESPACE __STLPORT_STD #else #if defined(_STLP_USE_OWN_NAMESPACE) #define OTL_STLPORT_NAMESPACE _STL #else #define OTL_STLPORT_NAMESPACE std #endif #endif #define OTL_STL #endif #if defined(OTL_VALUE_TEMPLATE_ON) && !defined(OTL_STL) && !defined(OTL_ACE) #define STD_NAMESPACE_PREFIX #if (defined(_MSC_VER)&&(_MSC_VER>=1300))||defined(OTL_ANSI_CPP) #include using namespace std; #else #include #endif #endif #if defined(OTL_USER_DEFINED_STRING_CLASS_ON) #if defined(OTL_STL) #error OTL_STL cannot be used in combination with OTL_USER_DEFINED_STRING_CLASS_ON #endif #if defined(USER_DEFINED_STRING_CLASS) #define OTL_STRING_CONTAINER USER_DEFINED_STRING_CLASS #define STD_NAMESPACE_PREFIX #else #error USER_DEFINED_STRING_CLASS macro needs to be defined before including otlv4.h #endif #endif #if defined(OTL_STL) #if defined(_MSC_VER) #if (_MSC_VER >= 1200) #pragma warning (disable:4786) #pragma warning (disable:4290) #pragma warning (disable:4996) #endif #endif #if defined(OTL_STL_NOSTD_NAMESPACE) #ifndef OTL_STRING_CONTAINER #define OTL_STRING_CONTAINER string #endif #define STD_NAMESPACE_PREFIX #else #ifndef OTL_STRING_CONTAINER #if defined(OTL_STLPORT) #define OTL_STRING_CONTAINER OTL_STLPORT_NAMESPACE ::string #else #define OTL_STRING_CONTAINER std::string #endif #endif #if defined(OTL_STLPORT) #define STD_NAMESPACE_PREFIX OTL_STLPORT_NAMESPACE :: #else #define STD_NAMESPACE_PREFIX std:: #endif #endif #include #include #include #ifndef OTL_STL_NOSTD_NAMESPACE #include #else #if defined(_MSC_VER) && (_MSC_VER >= 1300) #include using namespace std; #else #include #endif #endif #endif //======================= END OF CONFIGURATION ============================== // ====== COMMON NON-TEMPLATE OBJECTS: CONSTANTS, CLASSES, ETC. =========== #if defined(OTL_ORA8) const int otl_var_list_size=1024; #else const int otl_var_list_size=512; #endif const int otl_error_code_0=32000; #define otl_error_msg_0 "Incompatible data types in stream operation" const int otl_error_code_1=32004; #define otl_error_msg_1 "No input variables have been defined in SQL statement" const int otl_error_code_2=32003; #define otl_error_msg_2 "Not all input variables have been initialized" const int otl_error_code_3=32001; #define otl_error_msg_3 "Row must be full for flushing output stream" const int otl_error_code_4=32005; #define otl_error_msg_4 "Input string value is too large to fit into the buffer" const int otl_error_code_5=32006; #define otl_error_msg_5 "Input otl_long_string is too large to fit into the buffer" const int otl_error_code_6=32007; #define otl_error_msg_6 "PL/SQL table size is too large (>32767)" const int otl_error_code_7=32008; #define otl_error_msg_7 "Writing CLOB/BLOB in stream mode: actual size is greater than specified" const int otl_error_code_8=32009; #define otl_error_msg_8 "Closing CLOB/BLOB in stream mode: actual size is not equal to specified size" const int otl_error_code_9=32010; #define otl_error_msg_9 "CLOB/BLOB stream is not open for writing" const int otl_error_code_10=32011; #define otl_error_msg_10 "CLOB/BLOB stream is not open for reading" const int otl_error_code_11=32012; #define otl_error_msg_11 "First session must be started with session_begin()" const int otl_error_code_12=32013; #define otl_error_msg_12 "Invalid bind variable declaration" const int otl_error_code_13=32014; #define otl_error_msg_13 "No stored procedure was found" const int otl_error_code_14=32015; #define otl_error_msg_14 "Unsupported data type: " const int otl_error_code_15=32016; #define otl_error_msg_15 "Unsupported procedure type" const int otl_error_code_16=32017; #define otl_error_msg_16 "Stream buffer size can't be > 1 in this case" const int otl_error_code_17=32018; #define otl_error_msg_17 \ "ODBC / DB2 CLI function name is not recognized. " \ "It should be one of the following: SQLTables, SQLColumns, " \ "SQLProcedures, SQLColumnPrivileges, SQLTablePrivileges, " \ "SQLPrimaryKeys, SQLProcedureColumns, SQLForeignKeys" const int otl_error_code_18=32019; #define otl_error_msg_18 \ "otl_stream::operator>>() should have been called " \ "before otl_stream::operator int()" const int otl_error_code_19=32020; #define otl_error_msg_19 \ "otl_stream_read_iterator: otl_stream is not open" const int otl_error_code_20=32021; #define otl_error_msg_20 \ "otl_stream_read_iterator: PL/SQL table and 'refcur' " \ "parameters are not supported" const int otl_error_code_21=32022; #define otl_error_msg_21 \ "otl_stream_read_iterator: otl_stream cannot be described" const int otl_error_code_22=32023; #define otl_error_msg_22 \ "otl_stream_read_iterator: position is out of range" const int otl_error_code_23=32024; #define otl_error_msg_23 \ "otl_stream_read_iterator: incompatible types in get()" const int otl_error_code_24=32025; #define otl_error_msg_24 \ "otl_stream::operator int() is not supported in the LOB stream mode" const int otl_error_code_25=32026; #define otl_error_msg_25 \ "otl_stream_read_iterator: get(otl_lob_stream*&) function " \ "can only be used if otl_stream::set_lob_stream_mode(true) had been called " \ "before the iterator was attached to the stream" const int otl_error_code_26=32027; #define otl_error_msg_26 \ "otl_stream_read_iterator: variable name is not recognized " const int otl_error_code_27=32028; #define otl_error_msg_27 "Unsupported column data type" const int otl_error_code_28=32029; #define otl_error_msg_28 \ "RAW value cannot be read with otl_lob_stream, use otl_long_string instead" const int otl_error_code_29=32030; #define otl_error_msg_29 \ "otl_stream is already open" const int otl_error_code_30=32031; #define otl_error_msg_30 \ "otl_connect is already connected" const int otl_error_code_31=32032; #define otl_error_msg_31 \ "SELECT otl_stream buffer size for TimesTen should be in [0..128] range" const int otl_error_code_32=32033; #define otl_error_msg_32 \ "otl_connect object needs to be connected to DB before using otl_subscriber" const int otl_error_code_33=32034; #define otl_error_msg_33 \ "otl_stream buffer size should be 1 when refcur or plsql table is used" const int otl_oracle_date_size=7; const int otl_explicit_select=0; const int otl_implicit_select=1; const int otl_input_param=0; const int otl_output_param=1; const int otl_inout_param=2; const unsigned int otl_all_num2str=1; const unsigned int otl_all_date2str=2; const int otl_num_str_size=60; const int otl_date_str_size=60; class otl_select_struct_override{ public: short int* col_ndx; short int* col_type; int* col_size; int len; unsigned int all_mask; bool lob_stream_mode; otl_select_struct_override(): col_ndx(new short int[otl_var_list_size]), col_type(new short int[otl_var_list_size]), col_size(new int[otl_var_list_size]), len(0), all_mask(0), lob_stream_mode(false), container_size_(otl_var_list_size) { } ~otl_select_struct_override() { delete[] col_ndx; delete[] col_type; delete[] col_size; } void reset(void) { len=0; all_mask=0; lob_stream_mode=false; } void add_override(const int andx, const int atype, const int asize=0) { if(len==otl_var_list_size){ int temp_container_size=container_size_; container_size_*=2; short int* temp_col_ndx=new short int[container_size_]; short int* temp_col_type=new short int[container_size_]; int* temp_col_size=new int[container_size_]; memcpy(temp_col_ndx,col_ndx,sizeof(short int)*temp_container_size); memcpy(temp_col_type,col_type,sizeof(short int)*temp_container_size); memcpy(temp_col_size,col_size,sizeof(int)*temp_container_size); delete[] col_ndx; delete[] col_type; delete[] col_size; col_ndx=temp_col_ndx; col_type=temp_col_type; col_size=temp_col_size; } ++len; col_ndx[len-1]=OTL_SCAST(short,andx); col_type[len-1]=OTL_SCAST(short,atype); col_size[len-1]=asize; } int find(const int ndx) { int i; for(i=0;i=desc.name_len_) OTL_STRCPY_S(name,name_len_,desc.name); else if(name==0 && desc.name!=0){ name=new char[desc.name_len_]; name_len_=desc.name_len_; OTL_STRCPY_S(name,name_len_,desc.name); }else if(name_len_= 1400) OTL_STRNCPY_S(name,sizeof(name),nm,sizeof(name)-1); name[sizeof(name)-1]=0; #else strncpy(name,nm,sizeof(name)); name[sizeof(name)-1]=0; #endif #else strncpy(name,nm,sizeof(name)); name[sizeof(name)-1]=0; #endif } } }; const int otl_var_none=0; const int otl_var_char=1; const int otl_var_double=2; const int otl_var_float=3; const int otl_var_int=4; const int otl_var_unsigned_int=5; const int otl_var_short=6; const int otl_var_long_int=7; const int otl_var_timestamp=8; const int otl_var_varchar_long=9; const int otl_var_raw_long=10; const int otl_var_clob=11; const int otl_var_blob=12; const int otl_var_refcur=13; const int otl_var_long_string=15; const int otl_var_db2time=16; const int otl_var_db2date=17; const int otl_var_tz_timestamp=18; const int otl_var_ltz_timestamp=19; const int otl_var_bigint=20; #if defined(OTL_ORA_UNICODE)||defined(OTL_ORA_UTF8) const int otl_var_nchar=21; const int otl_var_nclob=22; #else #endif const int otl_var_raw=23; const int otl_var_lob_stream=100; const int otl_bigint_str_size=40; class otl_long_string{ public: unsigned char* v; int length; int extern_buffer_flag; int buf_size; bool this_is_last_piece_; otl_long_string(const int buffer_size=32760,const int input_length=0): v(0), length(0), extern_buffer_flag(0), buf_size(0), this_is_last_piece_(false) { this_is_last_piece_=false; if(buffer_size==0){ v=0; length=0; extern_buffer_flag=0; }else{ extern_buffer_flag=0; length=input_length; buf_size=buffer_size; v=new unsigned char[buffer_size+1]; memset(v,0,buffer_size); } } otl_long_string (const void* external_buffer, const int buffer_size, const int input_length=0): v(OTL_RCAST(unsigned char*, OTL_CCAST(void*, external_buffer))), length(input_length), extern_buffer_flag(1), buf_size(buffer_size), this_is_last_piece_(false) { } otl_long_string& operator=(const otl_long_string& s) { this_is_last_piece_=s.this_is_last_piece_; if(s.extern_buffer_flag){ if(!extern_buffer_flag) delete[] v; v=s.v; length=s.length; extern_buffer_flag=s.extern_buffer_flag; buf_size=s.buf_size; }else{ if(extern_buffer_flag){ v=new unsigned char[s.buf_size]; buf_size=s.buf_size; }else if(buf_size= 1400) // VC++ 8.0 or higher const size_t var_info_sz #else const size_t /*var_info_sz*/ #endif #else const size_t /*var_info_sz*/ #endif ) {char buf1[128]; char buf2[128]; OTL_STRCPY_S(buf1,sizeof(buf1),otl_var_type_name(ftype)); OTL_STRCPY_S(buf2,sizeof(buf2),otl_var_type_name(type_code)); OTL_STRCPY_S(var_info,var_info_sz,"Variable: "); OTL_STRCAT_S(var_info,var_info_sz,name); OTL_STRCAT_S(var_info,var_info_sz,"<"); OTL_STRCAT_S(var_info,var_info_sz,buf1); OTL_STRCAT_S(var_info,var_info_sz,">, datatype in operator <>: "); OTL_STRCAT_S(var_info,var_info_sz,buf2); } inline void otl_var_info_var2 (const char* name, const int ftype, char* var_info, #if defined(_MSC_VER) #if (_MSC_VER >= 1400) // VC++ 8.0 or higher const size_t var_info_sz #else const size_t /*var_info_sz*/ #endif #else const size_t /*var_info_sz*/ #endif ) {char buf1[128]; OTL_STRCPY_S(buf1,sizeof(buf1),otl_var_type_name(ftype)); OTL_STRCPY_S(var_info,var_info_sz,"Variable: "); OTL_STRCPY_S(var_info,var_info_sz,name); OTL_STRCAT_S(var_info,var_info_sz,"<"); OTL_STRCAT_S(var_info,var_info_sz,buf1); OTL_STRCAT_S(var_info,var_info_sz,">"); } inline void otl_var_info_var3 (const char* name, const int ftype, const int type_code, char* var_info, #if defined(_MSC_VER) #if (_MSC_VER >= 1400) // VC++ 8.0 or higher const size_t var_info_sz #else const size_t /*var_info_sz*/ #endif #else const size_t /*var_info_sz*/ #endif ) {char buf1[128]; char buf2[128]; OTL_STRCPY_S(buf1,sizeof(buf1),otl_var_type_name(ftype)); OTL_STRCPY_S(buf2,sizeof(buf2),otl_var_type_name(type_code)); OTL_STRCPY_S(var_info,var_info_sz,"Variable: "); OTL_STRCAT_S(var_info,var_info_sz,name); OTL_STRCAT_S(var_info,var_info_sz,"<"); OTL_STRCAT_S(var_info,var_info_sz,buf1); OTL_STRCAT_S(var_info, var_info_sz, ">, datatype in otl_stream_read_iterator::get(): "); OTL_STRCAT_S(var_info,var_info_sz,buf2); } inline void otl_var_info_var4 (const char* name, const int ftype, const int type_code, char* var_info, #if defined(_MSC_VER) #if (_MSC_VER >= 1400) // VC++ 8.0 or higher const size_t var_info_sz #else const size_t /*var_info_sz*/ #endif #else const size_t /*var_info_sz*/ #endif ) {char buf1[128]; char buf2[128]; OTL_STRCPY_S(buf1,sizeof(buf1),otl_var_type_name(ftype)); OTL_STRCPY_S(buf2,sizeof(buf2),otl_var_type_name(type_code)); OTL_STRCPY_S(var_info,var_info_sz,"Variable: "); OTL_STRCAT_S(var_info,var_info_sz,name); OTL_STRCAT_S(var_info,var_info_sz,"<"); OTL_STRCAT_S(var_info,var_info_sz,buf1); OTL_STRCAT_S(var_info, var_info_sz, ">, datatype in otl_stream_read_iterator::get(): "); OTL_STRCAT_S(var_info,var_info_sz,buf2); } inline void otl_strcpy( unsigned char* trg, unsigned char* src, int& overflow, const int inp_size=0, const int actual_inp_size=-1 ) { OTL_CHAR* c1=OTL_RCAST(OTL_CHAR*,trg); const OTL_CHAR* c2=OTL_RCAST(const OTL_CHAR*,src); int out_size=0; overflow=0; if(actual_inp_size!=-1){ while(out_size= 1400)) inline void otl_strcpy (unsigned char* trg, const unsigned char* src) { OTL_CHAR* c1=OTL_RCAST(OTL_CHAR*,trg); const OTL_CHAR* c2=OTL_RCAST(const OTL_CHAR*,src); while(*c2){ *c1++=*c2++; } *c1=0; } #else inline void otl_strcpy(unsigned char* trg,const unsigned char* src) { strcpy(OTL_RCAST(char*,trg),OTL_RCAST(const char*,src)); } #endif inline void otl_strcat(char* trg,const char* src) { while(*trg)++trg; while(*src){ *trg=*src; ++trg; ++src; } *trg=0; } #if defined(OTL_UNICODE) && !defined(OTL_ODBC) inline void otl_strcpy2( unsigned char* trg, const unsigned char* src, const int max_src_len ) { OTL_CHAR* c1=OTL_RCAST(OTL_CHAR*,trg); const OTL_CHAR* c2=OTL_RCAST(const OTL_CHAR*,src); int src_len=OTL_SCAST(int,*OTL_SCAST(const unsigned short*,c2)); int len=0; ++c2; while(*c2&&len=10) k=n%10; else k=n; digit=digits[k]; *c=digit; ++c; ++klen; n=n/10; }while(n!=0); *c=0; if(negative){ *c1='-'; ++c1; } for(int j=klen-1;j>=0;--j){ *c1=buf[j]; ++c1; } *c1=0; return c1; } inline void otl_var_info_col (const int pos, const int ftype, const int type_code, char* var_info, #if defined(_MSC_VER) #if (_MSC_VER >= 1400) // VC++ 8.0 or higher const size_t var_info_sz #else const size_t /*var_info_sz*/ #endif #else const size_t /*var_info_sz*/ #endif ) { char buf1[128]; char buf2[128]; char name[128]; otl_itoa(pos,name); OTL_STRCPY_S(buf1,sizeof(buf1),otl_var_type_name(ftype)); OTL_STRCPY_S(buf2,sizeof(buf2),otl_var_type_name(type_code)); OTL_STRCPY_S(var_info,var_info_sz,"Column: "); OTL_STRCAT_S(var_info,var_info_sz,name); OTL_STRCAT_S(var_info,var_info_sz,"<"); OTL_STRCAT_S(var_info,var_info_sz,buf1); OTL_STRCAT_S(var_info, var_info_sz, ">, datatype in operator <>: "); OTL_STRCAT_S(var_info,var_info_sz,buf2); } inline void otl_var_info_col2 (const int pos, const int ftype, char* var_info, #if defined(_MSC_VER) #if (_MSC_VER >= 1400) // VC++ 8.0 or higher const size_t var_info_sz #else const size_t /*var_info_sz*/ #endif #else const size_t /*var_info_sz*/ #endif ) { char buf1[128]; char name[128]; otl_itoa(pos,name); OTL_STRCPY_S(buf1,sizeof(buf1),otl_var_type_name(ftype)); OTL_STRCPY_S(var_info,var_info_sz,"Column: "); OTL_STRCAT_S(var_info,var_info_sz,name); OTL_STRCAT_S(var_info,var_info_sz,"<"); OTL_STRCAT_S(var_info,var_info_sz,buf1); OTL_STRCAT_S(var_info,var_info_sz,">"); } inline void otl_var_info_col3 (const int pos, const int ftype, const char* col_name, char* var_info, #if defined(_MSC_VER) #if (_MSC_VER >= 1400) // VC++ 8.0 or higher const size_t var_info_sz #else const size_t /*var_info_sz*/ #endif #else const size_t /*var_info_sz*/ #endif ) { char buf1[128]; char name[128]; otl_itoa(pos,name); OTL_STRCPY_S(buf1,sizeof(buf1),otl_var_type_name(ftype)); OTL_STRCPY_S(var_info,var_info_sz,"Column: "); OTL_STRCAT_S(var_info,var_info_sz,name); OTL_STRCAT_S(var_info,var_info_sz," / "); OTL_STRCAT_S(var_info,var_info_sz,col_name); OTL_STRCAT_S(var_info,var_info_sz," <"); OTL_STRCAT_S(var_info,var_info_sz,buf1); OTL_STRCAT_S(var_info,var_info_sz,">"); } class otl_pl_tab_generic{ public: unsigned char* p_v; short* p_null; int elem_size; int tab_size; int tab_len; int vtype; otl_pl_tab_generic(): p_v(0), p_null(0), elem_size(0), tab_size(0), tab_len(0), vtype(0) { } virtual ~otl_pl_tab_generic(){} unsigned char* val(int ndx=0) { return p_v+(ndx*elem_size); } int is_null(int ndx=0) { return p_null[ndx]!=0; } void set_null(int ndx=0) { p_null[ndx]=1; } void set_non_null(int ndx=0) { p_null[ndx]=0; } void init_generic(void) {int i; memset(p_v,0,elem_size*tab_len); for(i=0;i inline int otl_numeric_convert_T (const int ftype,const void* val,T& n) { if(ftype==T_type){ n=*OTL_RCAST(T*,OTL_CCAST(void*,val)); return 1; }else return 0; } template inline int otl_numeric_convert_T2(const int ftype,const void* val,T& n) { int rc=1; switch(ftype){ case otl_var_double: n=OTL_PCONV(T,double,val); break; case otl_var_short: n=OTL_PCONV(T,short,val); break; case otl_var_int: n=OTL_PCONV(T,int,val); break; case otl_var_unsigned_int: n=OTL_PCONV(T,unsigned int,val); break; case otl_var_long_int: n=OTL_PCONV(T,long int,val); break; case otl_var_float: n=OTL_PCONV(T,float,val); break; #if defined(OTL_BIGINT) case otl_var_bigint: n=OTL_PCONV(T,OTL_BIGINT,val); break; #endif default: rc=0; break; } return rc; } #else template inline int otl_numeric_convert_T(const int ftype,const void* val,T& n) { int rc=1; switch(ftype){ case otl_var_double: n=OTL_PCONV(T,double,val); break; case otl_var_short: n=OTL_PCONV(T,short,val); break; case otl_var_int: n=OTL_PCONV(T,int,val); break; case otl_var_unsigned_int: n=OTL_PCONV(T,unsigned int,val); break; case otl_var_long_int: n=OTL_PCONV(T,long int,val); break; case otl_var_float: n=OTL_PCONV(T,float,val); break; #if defined(OTL_BIGINT) case otl_var_bigint: n=OTL_PCONV(T,OTL_BIGINT,val); break; #endif default: rc=0; break; } return rc; } #endif #if defined(OTL_STL) && defined(OTL_STREAM_POOLING_ON) class otl_ltstr{ public: bool operator()(const OTL_STRING_CONTAINER& s1, const OTL_STRING_CONTAINER& s2) const { return strcmp(s1.c_str(), s2.c_str()) < 0; } }; const int otl_max_default_pool_size=32; #endif #if defined(OTL_ACE) const int otl_max_default_pool_size=32; #endif class otl_stream_shell_generic{ public: int should_delete; otl_stream_shell_generic(): should_delete(0) { } virtual ~otl_stream_shell_generic(){} }; #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) #if defined(OTL_STL) #include #endif class otl_stream_pool_entry{ public: #if defined(OTL_ACE) otl_tmpl_vector s; #else STD_NAMESPACE_PREFIX vector s; #endif int cnt; otl_stream_pool_entry(): s(), cnt(0) { } otl_stream_pool_entry(const otl_stream_pool_entry& sc): s(), cnt(0) { copy(sc); } otl_stream_pool_entry& operator=(const otl_stream_pool_entry& sc) { copy(sc); return *this; } virtual ~otl_stream_pool_entry(){} private: void copy(const otl_stream_pool_entry& sc) { s.clear(); for(size_t i=0;i, ACE_Null_Mutex> sc_type; typedef otl_tmpl_vector vec_type; typedef ACE_RB_Tree_Node ace_map_entry; #else typedef STD_NAMESPACE_PREFIX map sc_type; typedef STD_NAMESPACE_PREFIX vector vec_type; #endif sc_type sc; int max_size; int size; otl_stream_pool(): sc(), max_size(otl_max_default_pool_size), size(0) { } void init(int amax_size=otl_max_default_pool_size) { if(size==0&&max_size==0)return; if(amax_size<2) amax_size=2; #if defined(OTL_ACE) sc_type::iterator elem0=sc.begin(); sc_type::iterator elemN=sc.end(); for(sc_type::iterator i=elem0; i!=elemN; ++i){ cache_entry_type& ce=(*i).item(); int sz=ce.s.size(); for(int j=0;jshould_delete=1; delete ce.s[j]; ce.s[j]=0; } ce.s.clear(); ce.cnt=0; } sc.clear(); #else sc_type::iterator elem0=sc.begin(); sc_type::iterator elemN=sc.end(); for(sc_type::iterator i=elem0; i!=elemN; ++i){ cache_entry_type& ce=(*i).second; size_t sz=ce.s.size(); for(size_t j=0;jshould_delete=1; delete ce.s[j]; ce.s[j]=0; } ce.s.clear(); ce.cnt=0; } sc.clear(); #endif size=0; max_size=amax_size; } otl_stream_shell_generic* find(const OTL_STRING_CONTAINER& stmtxt) { otl_stream_shell_generic* s; #if defined(OTL_ACE) ace_map_entry* ce=0; int found=sc.find(stmtxt,ce); if(found==-1)return 0; // entry not found s=ce->item().s[ce->item().s.size()-1]; ce->item().s.pop_back(); if(ce->item().s.size()==0){ sc.unbind(ce); --size; } #else sc_type::iterator cur=sc.find(stmtxt); if(cur==sc.end()) return 0; // entry not found cache_entry_type& ce=(*cur).second; s=ce.s[ce.s.size()-1]; ce.s.pop_back(); if(ce.s.size()==0){ sc.erase(cur); --size; } #endif return s; } void remove(const otl_stream_shell_generic* s,const OTL_STRING_CONTAINER& stmtxt) { #if defined(OTL_ACE) ace_map_entry* cur=0; int found=sc.find(stmtxt,cur); if(found==-1) return; cache_entry_type& ce=(*cur).item(); for(int i=0;i1 && i!=ce.s.size()-1){ otl_stream_shell_generic* temp_s=ce.s[i]; ce.s[i]=ce.s[ce.s.size()-1]; ce.s[ce.s.size()-1]=temp_s; } ce.s.pop_back(); --size; return; } #else sc_type::iterator cur=sc.find(stmtxt); if(cur==sc.end()) return; cache_entry_type& ce=(*cur).second; vec_type::iterator bgn=ce.s.begin(); vec_type::iterator end=ce.s.end(); for(vec_type::iterator i=bgn;i!=end;++i) if((*i)==s){ ce.s.erase(i); --size; return; } #endif } void add(otl_stream_shell_generic* s,const char* stm_text) { OTL_STRING_CONTAINER stmtxt(stm_text); #if defined(OTL_ACE) ace_map_entry* cur=0; int found_in_map=sc.find(stmtxt,cur); if(found_in_map==0){ // entry found bool found=false; cache_entry_type& ce=(*cur).item(); int sz=ce.s.size(); for(int i=0;i(*i).item().cnt){ // found less used entry min_entry=&(*i); min_cnt=(*i).item().cnt; } } cache_entry_type& me=(*min_entry).item(); int sz=me.s.size(); for(int n=0;nshould_delete=1; me.s[n]->close(); delete me.s[n]; } me.s.clear(); sc.unbind(min_entry); cache_entry_type ce; ce.cnt=1; ce.s.push_back(s); sc.bind(stmtxt,ce); } } #else sc_type::iterator cur=sc.find(stmtxt); if(cur!=sc.end()){ // entry found bool found=false; cache_entry_type& ce=(*cur).second; size_t sz=ce.s.size(); for(size_t i=0;i(*i).second.cnt){ // found less used entry min_entry=i; min_cnt=(*i).second.cnt; } } cache_entry_type& me=(*min_entry).second; size_t sz=me.s.size(); for(size_t n=0;nshould_delete=1; otl_stream_shell_generic* tmp=me.s[n]; delete tmp; // delete me.s[n]; } me.s.clear(); sc.erase(min_entry); cache_entry_type ce; ce.cnt=1; ce.s.push_back(s); sc[stmtxt]=ce; } } #endif } virtual ~otl_stream_pool() { init(); } private: otl_stream_pool(const otl_stream_pool&): sc(), max_size(0), size(0) { } otl_stream_pool& operator=(const otl_stream_pool&) { return *this; } }; #endif // =========================== COMMON TEMPLATES ============================ #if (defined(OTL_STL)||defined(OTL_VALUE_TEMPLATE_ON)) && defined(OTL_VALUE_TEMPLATE) template class otl_value{ public: TData v; bool ind; otl_value(): v(), ind(true) { } virtual ~otl_value(){} otl_value(const otl_value& var): v(var.v), ind(var.ind) { } otl_value(const TData& var): v(var), ind(false) { } otl_value(const otl_null&): v(), ind(true) { } otl_value& operator=(const otl_value& var) { v=var.v; ind=var.ind; return *this; } otl_value& operator=(const TData& var) { v=var; ind=false; return *this; } otl_value& operator=(const otl_null&) { ind=true; return *this; } bool is_null(void)const {return ind;} void set_null(void){ind=true;} void set_non_null(void){ind=false;} }; template STD_NAMESPACE_PREFIX ostream& operator<< (STD_NAMESPACE_PREFIX ostream& s, const otl_value& var) { if(var.ind) s<<"NULL"; else s<& var) { if(var.ind) s<<"NULL"; else{ s< class otl_auto_array_ptr{ public: T* ptr; int arr_size_; otl_auto_array_ptr(): ptr(0), arr_size_(0) { } otl_auto_array_ptr(const int arr_size): ptr(new T[arr_size]), arr_size_(arr_size) { } void double_size(void) { int old_arr_size=arr_size_; arr_size_*=2; T* temp_ptr=new T[arr_size_]; for(int i=0;i&): ptr(0), arr_size_(0) { } otl_auto_array_ptr& operator=(const otl_auto_array_ptr&) { return *this; } }; template class otl_ptr{ public: T** ptr; int arr_flag; otl_ptr(): ptr(0), arr_flag(0) { } void assign(T** var) { ptr=var; arr_flag=0; } void assign_array(T** var) { ptr=var; arr_flag=1; } void disconnect(void) { if(ptr!=0) *ptr=0; ptr=0; } void destroy(void) { if(ptr==0)return; if(*ptr!=0){ if(arr_flag) delete[] *ptr; else delete *ptr; *ptr=0; } } ~otl_ptr() { destroy(); } private: otl_ptr(const otl_ptr&): ptr(0), arr_flag(0) { } otl_ptr& operator=(const otl_ptr&) { return *this; } }; template class otl_Tptr{ public: T* ptr; bool do_not_destroy; otl_Tptr(): ptr(0), do_not_destroy(false) { } void assign(T* var) { ptr=var; } void disconnect(void) { ptr=0; } void destroy(void) { if(do_not_destroy) return; delete ptr; ptr=0; } ~otl_Tptr() { destroy(); } otl_Tptr& operator=(const otl_Tptr& src) { ptr=src.ptr; do_not_destroy=src.do_not_destroy; return *this; } private: otl_Tptr(const otl_Tptr&): ptr(0), do_not_destroy(false) { } }; template class otl_tmpl_nocommit_stream: public OTLStream{ public: otl_tmpl_nocommit_stream() OTL_NO_THROW : OTLStream() { OTLStream::set_commit(0); } otl_tmpl_nocommit_stream (const otl_stream_buffer_size_type arr_size, const char* sqlstm, OTLConnect& pdb, const char* ref_cur_placeholder=0) OTL_THROWS_OTL_EXCEPTION : OTLStream(arr_size,sqlstm,pdb,ref_cur_placeholder) { OTLStream::set_commit(0); } void open (otl_stream_buffer_size_type arr_size, const char* sqlstm, OTLConnect& db, const char* ref_cur_placeholder=0) OTL_THROWS_OTL_EXCEPTION { OTLStream::open(arr_size,sqlstm,db,ref_cur_placeholder); OTLStream::set_commit(0); } }; #if defined(OTL_STL) class otl_pl_vec_generic{ public: typedef STD_NAMESPACE_PREFIX vector null_flag_type; void* p_v; null_flag_type null_flag; int vtype; int elem_size; otl_pl_vec_generic(): p_v(0), null_flag(), vtype(0), elem_size(0) { } virtual int len(void) const { return 0; } virtual void set_len(const int /*new_len*/=0, const bool /*set_all_to_null*/=true) { } bool is_null(const int ndx=0) { return null_flag[ndx]; } void set_null(const int ndx=0) { null_flag[ndx]=true; } void set_non_null(const int ndx=0) { null_flag[ndx]=false; } virtual ~otl_pl_vec_generic(){} private: otl_pl_vec_generic(const otl_pl_vec_generic&): p_v(0), null_flag(), vtype(0), elem_size(0) { } otl_pl_vec_generic& operator=(const otl_pl_vec_generic&) { return *this; } }; template class otl_T_vec: public otl_pl_vec_generic{ public: STD_NAMESPACE_PREFIX vector v; otl_T_vec(): v() { this->p_v=OTL_RCAST(void*,&v); this->vtype=type_code; this->elem_size=T_sz; } virtual ~otl_T_vec(){} virtual void set_len (const int new_len=0, const bool set_all_to_null=true) {int i,vsize; v.resize(new_len); this->null_flag.resize(new_len); vsize=OTL_SCAST(int,v.size()); if(set_all_to_null) for(i=0;inull_flag[i]=true; } virtual int len(void) const { return OTL_SCAST(int,v.size()); } T& operator[](int ndx) { return v[ndx]; } private: otl_T_vec(const otl_T_vec&): v() { } otl_T_vec& operator=(const otl_T_vec&) { return *this; } }; typedef otl_T_vec otl_double_vec; typedef otl_T_vec otl_float_vec; typedef otl_T_vec otl_int_vec; typedef otl_T_vec otl_short_vec; typedef otl_T_vec otl_long_int_vec; typedef otl_T_vec otl_datetime_vec; typedef otl_T_vec otl_string_vec; #endif template class otl_tmpl_pl_tab: public otl_pl_tab_generic{ public: T v[atab_size]; short null_flag[atab_size]; void init(void) {int i; tab_len=0; vtype=avtype; tab_size=atab_size; p_null=null_flag; p_v=OTL_RCAST(unsigned char*,v); elem_size=sizeof(T); for(i=0;i class otl_int_tab: public otl_tmpl_pl_tab{ public: otl_int_tab():otl_tmpl_pl_tab(){} }; template class otl_double_tab: public otl_tmpl_pl_tab{ public: otl_double_tab():otl_tmpl_pl_tab(){} }; template class otl_float_tab: public otl_tmpl_pl_tab{ public: otl_float_tab():otl_tmpl_pl_tab(){} }; template class otl_unsigned_tab: public otl_tmpl_pl_tab{ public: otl_unsigned_tab():otl_tmpl_pl_tab(){} }; template class otl_short_tab: public otl_tmpl_pl_tab{ public: otl_short_tab():otl_tmpl_pl_tab(){} }; template class otl_long_int_tab: public otl_tmpl_pl_tab{ public: otl_long_int_tab():otl_tmpl_pl_tab(){} }; template class otl_cstr_tab: public otl_pl_tab_generic{ public: typedef unsigned char T[str_size]; T v[atab_size]; short null_flag[atab_size]; void init(void) {int i; tab_len=0; vtype=otl_var_char; tab_size=atab_size; p_null=null_flag; p_v=OTL_RCAST(unsigned char*,v); elem_size=sizeof(T); for(i=0;i class otl_datetime_tab: public otl_pl_tab_generic{ public: typedef otl_datetime T; T v[atab_size]; short null_flag[atab_size]; void init(void) {int i; tab_len=0; vtype=otl_var_timestamp; tab_size=atab_size; p_null=null_flag; p_v=OTL_RCAST(unsigned char*,v); elem_size=sizeof(otl_oracle_date); for(i=0;i class otl_tmpl_dyn_pl_tab: public otl_pl_tab_generic{ public: T* v; short* null_flag; void init(const int atab_size=1) {int i; tab_len=0; vtype=avtype; tab_size=atab_size; v=new T[tab_size]; null_flag=new short[tab_size]; p_null=null_flag; p_v=OTL_RCAST(unsigned char*,v); elem_size=sizeof(T); for(i=0;i&): v(0), null_flag(0) { } otl_tmpl_dyn_pl_tab& operator=(const otl_tmpl_dyn_pl_tab&) { return *this; } }; class otl_dynamic_int_tab: public otl_tmpl_dyn_pl_tab{ public: otl_dynamic_int_tab(const int atab_size=1) :otl_tmpl_dyn_pl_tab(atab_size){} }; class otl_dynamic_double_tab: public otl_tmpl_dyn_pl_tab{ public: otl_dynamic_double_tab(const int atab_size=1) :otl_tmpl_dyn_pl_tab(atab_size){} }; class otl_dynamic_float_tab: public otl_tmpl_dyn_pl_tab{ public: otl_dynamic_float_tab(const int atab_size=1) :otl_tmpl_dyn_pl_tab(atab_size){} }; class otl_dynamic_unsigned_tab: public otl_tmpl_dyn_pl_tab{ public: otl_dynamic_unsigned_tab(const int atab_size=1) :otl_tmpl_dyn_pl_tab(atab_size){} }; class otl_dynamic_short_tab: public otl_tmpl_dyn_pl_tab{ public: otl_dynamic_short_tab(const int atab_size=1) :otl_tmpl_dyn_pl_tab(atab_size){} }; class otl_dynamic_long_int_tab: public otl_tmpl_dyn_pl_tab{ public: otl_dynamic_long_int_tab(const int atab_size=1) :otl_tmpl_dyn_pl_tab(atab_size){} }; template class otl_dynamic_cstr_tab: public otl_pl_tab_generic{ public: typedef unsigned char T[str_size]; T* v; short* null_flag; void init(const int atab_size=1) {int i; tab_len=0; vtype=otl_var_char; tab_size=atab_size; v=new T[tab_size]; null_flag=new short[tab_size]; p_null=null_flag; p_v=OTL_RCAST(unsigned char*,v); elem_size=sizeof(T); for(i=0;i #define OTL_TMPL_CONNECT \ otl_tmpl_connect \ #define OTL_TMPL_CURSOR \ otl_tmpl_cursor \ #define OTL_TMPL_OUT_STREAM \ otl_tmpl_out_stream \ #define OTL_TMPL_SELECT_CURSOR \ otl_tmpl_select_cursor \ #define OTL_TMPL_INOUT_STREAM \ otl_tmpl_inout_stream \ #define OTL_TMPL_SELECT_STREAM \ otl_tmpl_select_stream \ #if defined(OTL_EXCEPTION_IS_DERIVED_FROM_STD_EXCEPTION) #if defined(OTL_EXCEPTION_DERIVED_FROM) #error OTL_EXCEPTION_DERIVED_FROM is already defined. \ OTL_EXCEPTION_IS_DERIVED_FROM_STD_EXCEPTION cannot be used #endif #define OTL_EXCEPTION_DERIVED_FROM std::exception #define OTL_EXCEPTION_HAS_MEMBERS \ virtual const char* what() const \ { \ return reinterpret_cast(msg); \ } #endif template #if defined(OTL_EXCEPTION_DERIVED_FROM) class otl_tmpl_exception: public OTL_EXCEPTION_DERIVED_FROM, public TExceptionStruct{ #else class otl_tmpl_exception: public TExceptionStruct{ #endif public: #if defined(OTL_EXCEPTION_HAS_MEMBERS) OTL_EXCEPTION_HAS_MEMBERS #endif #if defined(OTL_EXCEPTION_STM_TEXT_SIZE) char stm_text[OTL_EXCEPTION_STM_TEXT_SIZE]; #else char stm_text[2048]; #endif char var_info[256]; otl_tmpl_exception() #if defined(__GNUC__) && (__GNUC__>=3) throw() #else OTL_NO_THROW #endif { stm_text[0]=0; var_info[0]=0; } otl_tmpl_exception(TConnectStruct& conn_struct, const char* sqlstm=0) #if defined(__GNUC__) && (__GNUC__>=3) throw() #else OTL_NO_THROW #endif { stm_text[0]=0; var_info[0]=0; if(sqlstm){ OTL_STRNCPY_S(OTL_RCAST(char*,stm_text), sizeof(stm_text), sqlstm, sizeof(stm_text)-1); stm_text[sizeof(stm_text)-1]=0; } conn_struct.error(OTL_SCAST(TExceptionStruct&,*this)); OTL_TRACE_EXCEPTION(this->code,this->msg,this->stm_text,this->var_info) } otl_tmpl_exception(TCursorStruct& cursor_struct, const char* sqlstm=0) #if defined(__GNUC__) && (__GNUC__>=3) throw() #else OTL_NO_THROW #endif { stm_text[0]=0; var_info[0]=0; if(sqlstm){ OTL_STRNCPY_S(OTL_RCAST(char*,stm_text), sizeof(stm_text), sqlstm, sizeof(stm_text)-1); stm_text[sizeof(stm_text)-1]=0; } cursor_struct.error(OTL_SCAST(TExceptionStruct&,*this)); OTL_TRACE_EXCEPTION(this->code,this->msg,this->stm_text,this->var_info) } otl_tmpl_exception (const char* amsg, const int acode, const char* sqlstm=0, const char* varinfo=0) #if defined(__GNUC__) && (__GNUC__>=3) throw() #else OTL_NO_THROW #endif { stm_text[0]=0; var_info[0]=0; if(sqlstm){ #if defined(_MSC_VER) #if (_MSC_VER >= 1400) OTL_STRCPY_S(OTL_RCAST(char*,stm_text),sizeof(stm_text),sqlstm); #else strncpy(OTL_RCAST(char*,stm_text),sqlstm,sizeof(stm_text)); stm_text[sizeof(stm_text)-1]=0; #endif #else strncpy(OTL_RCAST(char*,stm_text),sqlstm,sizeof(stm_text)); stm_text[sizeof(stm_text)-1]=0; #endif } if(varinfo) OTL_STRCPY_S(OTL_RCAST(char*,var_info),sizeof(var_info),varinfo); TExceptionStruct::init(amsg,acode); OTL_TRACE_EXCEPTION(this->code,this->msg,this->stm_text,this->var_info) } virtual ~otl_tmpl_exception() #if defined(__GNUC__) && (__GNUC__>=3) throw() #else OTL_NO_THROW #endif { } }; template class otl_tmpl_connect{ public: int connected; TConnectStruct connect_struct; int long_max_size; int retcode; int throw_count; void set_max_long_size(const int amax_size) { reset_throw_count(); #if defined(OTL_UNICODE) #if defined(OTL_ORA8I)||defined(OTL_ORA9I)||defined(OTL_ORA10G)||defined(OTL_ORA10G_R2) long_max_size=amax_size*sizeof(OTL_WCHAR); #else long_max_size=amax_size; #endif #else long_max_size=amax_size; #endif } int get_max_long_size(void) { reset_throw_count(); return long_max_size; } void set_timeout(const int atimeout=0) { reset_throw_count(); connect_struct.set_timeout(atimeout); } void set_cursor_type(const int acursor_type=0) { reset_throw_count(); connect_struct.set_cursor_type(acursor_type); } void reset_throw_count(void) { throw_count=0; } otl_tmpl_connect(): connected(0), connect_struct(), long_max_size(32760), retcode(1), throw_count(0) { } otl_tmpl_connect(const char* connect_str,const int auto_commit=0): connected(0), connect_struct(), long_max_size(32760), retcode(1), throw_count(0) { rlogon(connect_str,auto_commit); } virtual ~otl_tmpl_connect() { logoff(); } static int otl_initialize(const int threaded_mode=0) { return TConnectStruct::initialize(threaded_mode); } void rlogon(const char* connect_str,const int auto_commit=0) { throw_count=0; retcode=connect_struct.rlogon(connect_str,auto_commit); if(retcode) connected=1; else{ connected=0; ++throw_count; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION(connect_struct); } } void logoff(void) { if(!connected)return; OTL_TRACE_FUNC(0x1,"otl_connect","logoff","") retcode=connect_struct.logoff(); connected=0; if(retcode)return; if(throw_count>0) return; ++throw_count; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION(connect_struct); } void commit(void) { if(!connected)return; OTL_TRACE_FUNC(0x1,"otl_connect","commit","") reset_throw_count(); retcode=connect_struct.commit(); if(retcode)return; ++throw_count; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION(connect_struct); } void auto_commit_on(void) { if(!connected)return; OTL_TRACE_FUNC(0x1,"otl_connect","auto_commit_on","") reset_throw_count(); retcode=connect_struct.auto_commit_on(); if(retcode)return; ++throw_count; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION(connect_struct); } void auto_commit_off(void) { if(!connected)return; OTL_TRACE_FUNC(0x1,"otl_connect","auto_commit_off","") reset_throw_count(); retcode=connect_struct.auto_commit_off(); if(retcode)return; ++throw_count; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION(connect_struct); } void rollback(void) { if(!connected)return; OTL_TRACE_FUNC(0x1,"otl_connect","rollback","") reset_throw_count(); retcode=connect_struct.rollback(); if(retcode)return; ++throw_count; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION(connect_struct); } private: otl_tmpl_connect(const otl_tmpl_connect&): connected(0), connect_struct(), long_max_size(32760), retcode(1), throw_count(0) { } otl_tmpl_connect& operator=(const otl_tmpl_connect&) { return *this; } }; template class otl_tmpl_variable{ public: int param_type; int ftype; int elem_size; int array_size; char* name; int pos; int name_pos; int bound; int pl_tab_flag; TVariableStruct var_struct; int actual_elem_size(void) { return var_struct.actual_elem_size(); } void copy_var_desc(otl_var_desc& v) { v.param_type=param_type; v.ftype=ftype; v.elem_size=elem_size; v.array_size=array_size; v.pos=pos; v.name_pos=name_pos; if(name){ OTL_STRNCPY_S(v.name,sizeof(v.name),name,sizeof(v.name)-1); v.name[sizeof(v.name)-1]=0; }else v.name[0]=0; v.pl_tab_flag=pl_tab_flag; } otl_tmpl_variable(): param_type(0), ftype(0), elem_size(0), array_size(0), name(0), pos(0), name_pos(0), bound(0), pl_tab_flag(0), var_struct() { } virtual ~otl_tmpl_variable() { delete[] name; } otl_tmpl_variable (const int column_num, const int aftype, const int aelem_size, const short aarray_size): param_type(0), ftype(0), elem_size(0), array_size(0), name(0), pos(0), name_pos(0), bound(0), pl_tab_flag(0), var_struct() { copy_pos(column_num); init(aftype,aelem_size,aarray_size); } otl_tmpl_variable (const char* aname, const int aftype, const int aelem_size, const short aarray_size, const int apl_tab_flag=0) { copy_name(aname); init (aftype, aelem_size, aarray_size, 0, apl_tab_flag); } void init (const bool select_stm_flag, const int aftype, const int aelem_size, const otl_stream_buffer_size_type aarray_size, const void* connect_struct=0, const int apl_tab_flag=0) { ftype=aftype; #if defined(OTL_ORA_UNICODE)||defined(OTL_ORA_UTF8) if(ftype==otl_var_nchar) ftype=otl_var_char; else if(ftype==otl_var_nclob) ftype=otl_var_clob; #endif elem_size=aelem_size; array_size=aarray_size; pl_tab_flag=apl_tab_flag; bound=0; var_struct.init(select_stm_flag, aftype, elem_size, aarray_size, connect_struct, pl_tab_flag); } void set_param_type(const int aparam_type=otl_input_param) { param_type=aparam_type; } int get_param_type(void) { return param_type; } void copy_name(const char* aname) { pos=0; if(name==aname)return; if(name)delete[] name; size_t len=strlen(aname)+1; name=new char[len]; OTL_STRCPY_S(name,len,aname); } void copy_pos(const int apos) { if(name){ delete[] name; name=0; name_pos=0; } pos=apos; } void set_null(int ndx) { var_struct.set_null(ndx); } void set_not_null(int ndx) { var_struct.set_not_null(ndx,elem_size); } void bulk_set_not_null(int aarray_size) { var_struct.bulk_set_not_null(elem_size,aarray_size); } void set_len(int len, int ndx=0) { var_struct.set_len(len,ndx); } int get_len(int ndx=0) { return var_struct.get_len(ndx); } int get_pl_tab_len(void) { return this->var_struct.get_pl_tab_len(); } int get_max_pl_tab_len(void) { return this->var_struct.get_max_pl_tab_len(); } void set_pl_tab_len(const int pl_tab_len) { this->var_struct.set_pl_tab_len(pl_tab_len); } int is_null(int ndx) { return var_struct.is_null(ndx); } void* val(int ndx=0) { return var_struct.val(ndx,elem_size); } static void map_ftype (otl_column_desc& desc, const int max_long_size, int& aftype, int& aelem_size, otl_select_struct_override& override, const int column_ndx, const int connection_type) { TVariableStruct::map_ftype (desc, max_long_size, aftype, aelem_size, override, column_ndx, connection_type); } static int int2ext(int int_type) { return TVariableStruct::int2ext(int_type); } private: otl_tmpl_variable(const otl_tmpl_variable&): param_type(0), ftype(0), elem_size(0), array_size(0), name(0), pos(0), name_pos(0), bound(0), pl_tab_flag(0), var_struct() { } otl_tmpl_variable& operator=(const otl_tmpl_variable&) { return *this; } }; template class otl_tmpl_cursor{ public: int connected; char* stm_text; char*stm_label; TCursorStruct cursor_struct; int vl_len; otl_tmpl_variable** vl; OTL_TMPL_CONNECT* adb; int eof_data; int eof_desc; int retcode; long _rpc; int in_destructor; otl_tmpl_cursor(): connected(0), stm_text(0), stm_label(0), cursor_struct(), vl_len(0), vl(0), adb(0), eof_data(), eof_desc(), retcode(1), _rpc(0), in_destructor(0) { } otl_tmpl_cursor(OTL_TMPL_CONNECT& connect): connected(0), stm_text(0), stm_label(0), cursor_struct(), vl_len(0), vl(0), adb(&connect), eof_data(), eof_desc(), retcode(1), _rpc(0), in_destructor(0) { open(connect); } otl_tmpl_cursor (OTL_TMPL_CONNECT& connect, TVariableStruct* var): connected(0), stm_text(0), stm_label(0), cursor_struct(), vl_len(0), vl(0), adb(&connect), eof_data(), eof_desc(), retcode(1), _rpc(0), in_destructor(0) { open(connect,var); } virtual ~otl_tmpl_cursor() { in_destructor=1; close(); delete[] stm_label; stm_label=0; delete[] stm_text; stm_text=0; } void open (OTL_TMPL_CONNECT& connect, TVariableStruct* var=0) { in_destructor=0; eof_data=0; eof_desc=0; retcode=1; adb=&connect; _rpc=0; if(var==0) retcode=cursor_struct.open(connect.connect_struct); else retcode=cursor_struct.open(connect.connect_struct,var); if(retcode){ connected=1; return; } if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION(cursor_struct); } virtual void close(void) {_rpc=0; if(!connected)return; if(!this->adb)return; if(!adb->connected){ connected=0; adb=0; retcode=1; return; } connected=0; retcode=cursor_struct.close(); if(retcode){ adb=0; return; } if(this->adb->throw_count>0){ adb=0; return; } this->adb->throw_count++; adb=0; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION(cursor_struct); } void parse(void) {_rpc=0; if(!connected)return; retcode=cursor_struct.parse(stm_text); switch(retcode){ case 0: if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION(cursor_struct,stm_label?stm_label:stm_text); case 2: if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; char var_info[1]; var_info[0]=0; throw OTL_TMPL_EXCEPTION (otl_error_msg_17, otl_error_code_17, this->stm_label?this->stm_label:this->stm_text, var_info); } } void parse(const char* sqlstm) { if(!connected)return; if(stm_text){ delete[] stm_text; stm_text=0; } size_t len=strlen(sqlstm)+1; stm_text=new char[len]; OTL_STRCPY_S(stm_text,len,sqlstm); parse(); } long get_rpc() { return _rpc; } void exec(const int iters=1,const int rowoff=0) { if(!connected)return; retcode=cursor_struct.exec(iters,rowoff); _rpc=cursor_struct.get_rpc(); if(retcode)return; if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION(cursor_struct,stm_label?stm_label:stm_text); } virtual bool valid_binding (const otl_tmpl_variable& v, const int binding_type) { bool rc=true; if(((v.ftype==otl_var_varchar_long||v.ftype==otl_var_raw_long) && (v.var_struct.otl_adapter==otl_ora7_adapter|| v.var_struct.otl_adapter==otl_ora8_adapter) && v.array_size>1) || ((v.ftype==otl_var_blob||v.ftype==otl_var_clob)&& v.var_struct.otl_adapter==otl_ora8_adapter&& v.array_size>1 && binding_type==otl_inout_binding)) rc=false; return rc; } virtual void bind (const char* name, otl_tmpl_variable& v) { if(!connected)return; if(v.bound)return; v.copy_name(name); if(!valid_binding(v,otl_inout_binding)){ char var_info[256]; otl_var_info_var2 (v.name, v.ftype, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (otl_error_msg_16, otl_error_code_16, stm_label?stm_label:stm_text, var_info); } retcode=cursor_struct.bind (name, v.var_struct, v.elem_size, v.ftype, v.param_type, v.name_pos, this->adb->connect_struct.get_connection_type(), v.pl_tab_flag); if(retcode){ v.bound=1; return; } if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION(cursor_struct,stm_label?stm_label:stm_text); } virtual void bind (const int column_num, otl_tmpl_variable& v) { if(!connected)return; v.copy_pos(column_num); if(!valid_binding(v,otl_select_binding)){ char var_info[256]; otl_var_info_col2 (v.pos, v.ftype, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (otl_error_msg_16, otl_error_code_16, stm_label?stm_label:stm_text, var_info); } retcode=cursor_struct.bind (column_num, v.var_struct, v.elem_size, v.ftype, v.param_type); if(retcode)return; if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION(cursor_struct,stm_label?stm_label:stm_text); } virtual void bind(otl_tmpl_variable& v) { if(!connected)return; if(v.name) bind(v.name,v); if(v.pos) bind(v.pos,v); } static long direct_exec (OTL_TMPL_CONNECT& connect, const char* sqlstm, const int exception_enabled=1) #if defined(OTL_ANSI_CPP) && defined(OTL_FUNC_THROW_SPEC_ON) throw(OTL_TMPL_EXCEPTION) #endif { connect.reset_throw_count(); OTL_TRACE_DIRECT_EXEC try{ OTL_TMPL_CURSOR cur(connect); cur.cursor_struct.set_direct_exec(1); cur.parse(sqlstm); cur.exec(); return cur.cursor_struct.get_rpc(); }catch(OTL_CONST_EXCEPTION OTL_TMPL_EXCEPTION&){ if(exception_enabled){ connect.throw_count++; throw; } } return -1; } static void syntax_check (OTL_TMPL_CONNECT& connect, const char* sqlstm) #if defined(OTL_ANSI_CPP) && defined(OTL_FUNC_THROW_SPEC_ON) throw(OTL_TMPL_EXCEPTION) #endif { connect.reset_throw_count(); OTL_TRACE_SYNTAX_CHECK OTL_TMPL_CURSOR cur(connect); cur.cursor_struct.set_direct_exec(1); cur.cursor_struct.set_parse_only(1); cur.parse(sqlstm); } int eof(void){return eof_data;} int describe_column (otl_column_desc& col, const int column_num) { if(!connected)return 0; retcode=cursor_struct.describe_column (col,column_num,eof_desc); if(eof_desc)return 0; if(retcode)return 1; if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw OTL_TMPL_EXCEPTION(cursor_struct,stm_label?stm_label:stm_text); } private: otl_tmpl_cursor(const otl_tmpl_cursor&): connected(0), stm_text(0), stm_label(0), cursor_struct(), vl_len(0), vl(0), adb(0), eof_data(), eof_desc(), retcode(1), _rpc(0), in_destructor(0) { } otl_tmpl_cursor& operator=(const otl_tmpl_cursor&) { return *this; } }; inline int is_num(char c) { return c>='0' && c<='9'; } template class otl_tmpl_ext_hv_decl{ public: enum var_status{ in=0, out=1, io=2, def=3 }; char** hv; short* inout; int* pl_tab_size; int array_size; int prev_array_size; short vst[4]; int len; char* stm_text_; char* stm_label_; int container_size_; bool has_plsql_tabs_or_refcur_; otl_tmpl_ext_hv_decl(char* stm, int arr_size=1, char* label=0, otl_select_struct_override** select_override=0, OTL_TMPL_CONNECT* adb=0): hv(0), inout(0), pl_tab_size(0), array_size(0), prev_array_size(0), vst(), len(0), stm_text_(0), stm_label_(0), container_size_(0), has_plsql_tabs_or_refcur_(0) { container_size_=otl_var_list_size; hv=new char*[container_size_]; inout=new short[container_size_]; pl_tab_size=new int[container_size_]; has_plsql_tabs_or_refcur_=false; int j; array_size=arr_size; prev_array_size=arr_size; stm_text_=stm; stm_label_=label; int i=0; short in_str=0; bool in_comment=false; bool in_one_line_comment=false; char *c=stm; hv[i]=0; while(*c){ switch(*c){ case '\'': if(!in_comment&&!in_one_line_comment){ if(!in_str) in_str=1; else{ if(c[1]=='\'') ++c; else in_str=0; } } break; case '/': if(c[1]=='*'&&!in_str){ in_comment=true; ++c; } break; case '-': if(c[1]=='-'&&!in_str){ in_one_line_comment=true; ++c; } break; case '*': if(c[1]=='/'&&in_comment){ in_comment=false; ++c; } break; case '\n': if(in_one_line_comment) in_one_line_comment=false; break; } if(*c==':' && !in_str && !in_comment && !in_one_line_comment && ((c>stm && *(c-1)!='\\') || c==stm)){ char* bind_var_ptr=c; short in_out=def; int apl_tab_size=0; char var[64]; char* v=var; *v++=*c++; while(is_id(*c)) *v++=*c++; while(otl_isspace(*c)&&*c) ++c; if(*c=='<'){ *c=' '; while(*c!='>'&&*c!=','&&*c){ *v++=*c; *c++=' '; } if(*c==','){ *c++=' '; if(otl_to_upper(*c)=='I'){ if(otl_to_upper(c[2])=='O') in_out=io; else in_out=in; }else if(otl_to_upper(*c)=='O') in_out=out; while(*c!='>'&&*c&&(*c!='[' && *c!='(')) *c++=' '; if(*c=='[' || *c=='('){ char tmp[32]; char *t=tmp; *c++=' '; while((*c!=']' && *c!=')')&&*c!='>'&&*c){ *t++=*c; *c++=' '; } *t='\0'; apl_tab_size=atoi(tmp); while(*c!='>'&&*c) *c++=' '; } } if(*c)*c=' '; *v='\0'; if(select_override!=0 && bind_var_ptr[1]=='#'){ char* c4=bind_var_ptr+2; char col_num[64]; char* col_num_ptr=col_num; while(is_num(*c4) && *c4){ *col_num_ptr=*c4; ++col_num_ptr; ++c4; } *col_num_ptr=0; int col_ndx=atoi(col_num); if(col_ndx>0){ if(*select_override==0){ *select_override=new otl_select_struct_override(); } int data_type=otl_var_none; int data_len=0; char name[128]; parse_var (adb, var, data_type, data_len, name); (*select_override)->add_override (col_ndx, data_type, data_len); } c4=bind_var_ptr; while(*c4 && *c4!=' '){ *c4=' '; ++c4; } }else add_var(i,var,in_out,apl_tab_size); } } if(*c)++c; } for(j=0;j<4;++j)vst[j]=0; i=0; while(hv[i]){ switch(inout[i]){ case in: ++vst[0]; break; case out: ++vst[1]; break; case io: ++vst[2]; break; case def: ++vst[3]; break; } ++i; } len=i; } virtual ~otl_tmpl_ext_hv_decl() {int i; for(i=0;hv[i]!=0;++i) delete[] hv[i]; delete[] hv; delete[] inout; delete[] pl_tab_size; } char* operator[](int ndx){return hv[ndx];} short v_status(int ndx){return inout[ndx];} int is_id(char c){return isalnum(c)||c=='_'||c=='#';} int name_comp(char* n1,char* n2) { while(*n1!=' '&&*n1!='\0'&&*n2!=' '&&*n2!='\0'){ if(otl_to_upper(*n1)!=otl_to_upper(*n2))return 0; ++n1; ++n2; } if((*n1==' '&&*n2!=' ')||(*n2==' '&&*n1!=' ')) return 0; return 1; } void add_var(int &n,char* v,short in_out,int apl_tab_size=0) {int i; for(i=0;i0) has_plsql_tabs_or_refcur_=true; if(n==container_size_-1){ int temp_container_size=container_size_; container_size_*=2; char** temp_hv=new char*[container_size_]; short* temp_inout=new short[container_size_]; int* temp_pl_tab_size=new int[container_size_]; memcpy(temp_hv,hv,sizeof(char*)*temp_container_size); memcpy(temp_inout,inout,sizeof(short)*temp_container_size); memcpy(temp_pl_tab_size,pl_tab_size,sizeof(int)*temp_container_size); delete[] hv; delete[] inout; delete[] pl_tab_size; hv=temp_hv; inout=temp_inout; pl_tab_size=temp_pl_tab_size; } hv[++n]=0; inout[n]=def; pl_tab_size[n]=0; } int parse_var (OTL_TMPL_CONNECT* pdb, char* s, int& data_type, int& data_len, char* name) { data_type=otl_var_none; data_len=0; #if defined(OTL_BIND_VAR_STRICT_TYPE_CHECKING_ON) char type_arr[256]; #endif char type=' '; char t2=' '; char t3=' '; char t4=' '; int size=0; char *c=name,*c1=s; while(*c1!=' '&&*c1) *c++=*c1++; *c=0; while(*c1==' '&&*c1) ++c1; #if defined(OTL_BIND_VAR_STRICT_TYPE_CHECKING_ON) char* ct=c1; char* tac=type_arr; size_t ta_len=0; while(*ct && (*ct!='[' && *ct!='(') && ta_len=3){ type=otl_to_upper(c1[0]); t2=otl_to_upper(c1[1]); t3=otl_to_upper(c1[2]); t4=otl_to_upper(c1[3]); } if((type=='C'&&t2=='H')||(type=='R'&&t2=='A'&&t3=='W'&&(t4=='['||t4=='('))){ char tmp[32]; char *t=tmp; while((*c1!='[' && *c1!='(')&&*c1) ++c1; ++c1; while((*c1!=']' && *c1!=')')&&*c1) *t++=*c1++; *t=0; size=atoi(tmp); #if defined(OTL_ADD_NULL_TERMINATOR_TO_STRING_SIZE) size+=1; #endif } #if defined(OTL_ORA_UNICODE) if(type=='N'&&t2=='C'&&t3=='H'){ char tmp[32]; char *t=tmp; while((*c1!='[' && *c1!='(')&&*c1) ++c1; ++c1; while((*c1!=']' && *c1!=')')&&*c1) *t++=*c1++; *t=0; size=atoi(tmp); #if defined(OTL_ADD_NULL_TERMINATOR_TO_STRING_SIZE) size+=1; #endif } #endif OTL_CHECK_BIND_VARS int rc=1; switch(type){ case 'B': if(t2=='L'){ data_type=otl_var_blob; if(pdb) data_len=pdb->get_max_long_size(); else data_len=0; } #if defined(OTL_BIGINT) && (defined(OTL_ODBC)||defined(OTL_DB2_CLI)) else if(t2=='I'){ data_type=otl_var_bigint; data_len=sizeof(OTL_BIGINT); } #elif (defined(OTL_ORA7)||defined(OTL_ORA8)|| \ defined(OTL_ORA8I)||defined(OTL_ORA9I)) && \ defined(OTL_BIGINT) else if(t2=='I'){ data_type=otl_var_char; data_len=otl_bigint_str_size; } #endif break; case 'C': if(t2=='H'){ data_type=otl_var_char; data_len=size; }else if(t2=='L'){ data_type=otl_var_clob; if(pdb) data_len=pdb->get_max_long_size(); else data_len=0; }else rc=0; break; case 'D': if(t2=='O'){ data_type=otl_var_double; data_len=sizeof(double); } else if(t2=='B'&&t3=='2'){ if(t4=='T'){ data_type=otl_var_db2time; data_len=sizeof(TTimestampStruct); } else if(t4=='D'){ data_type=otl_var_db2date; data_len=sizeof(TTimestampStruct); }else rc=0; }else rc=0; break; #if defined(OTL_ORA_UNICODE)||defined(OTL_ORA_UTF8) case 'N': if(t2=='C'){ if(t3=='L'){ data_type=otl_var_nclob; if(pdb) data_len=pdb->get_max_long_size(); else data_len=0; }else if(t3=='H'){ data_type=otl_var_nchar; data_len=size; } } break; #endif case 'F': data_type=otl_var_float; data_len=sizeof(float); break; case 'I': data_type=otl_var_int; data_len=sizeof(int); break; case 'U': data_type=otl_var_unsigned_int; data_len=sizeof(unsigned); break; case 'R': if(t2=='E'&&t3=='F'){ data_type=otl_var_refcur; data_len=1; }else if(t2=='A'&&t3=='W'){ data_type=otl_var_raw_long; if(pdb) data_len=pdb->get_max_long_size(); else data_len=0; } break; case 'S': data_type=otl_var_short; data_len=sizeof(short); break; case 'L': if(t2=='O'&&t3=='N'){ data_type=otl_var_long_int; data_len=sizeof(long); }else if(t2=='T'&&t3=='Z'){ data_type=otl_var_ltz_timestamp; data_len=sizeof(TTimestampStruct); }else rc=0; break; case 'T': if(t2=='Z'){ data_type=otl_var_tz_timestamp; data_len=sizeof(TTimestampStruct); }else if(t2=='I' && t3=='M'){ data_type=otl_var_timestamp; data_len=sizeof(TTimestampStruct); }else rc=0; break; case 'V': data_type=otl_var_varchar_long; if(pdb) data_len=pdb->get_max_long_size(); else data_len=0; break; default: return 0; } return rc; } otl_tmpl_variable* alloc_var (char* s, const int vstat, const int status, OTL_TMPL_CONNECT& adb, const int apl_tab_size=0) { char name[128]; #if defined(OTL_BIND_VAR_STRICT_TYPE_CHECKING_ON) char type_arr[256]; #endif char type=' '; char t2=' '; char t3=' '; char t4=' '; char t5=' '; int size=0; char *c=name,*c1=s; while(*c1!=' '&&*c1) *c++=*c1++; *c=0; while(*c1==' '&&*c1) ++c1; #if defined(OTL_BIND_VAR_STRICT_TYPE_CHECKING_ON) char* ct=c1; char* tac=type_arr; size_t ta_len=0; while(*ct && (*ct!='[' && *ct!='(') && ta_len=3){ type=otl_to_upper(c1[0]); t2=otl_to_upper(c1[1]); t3=otl_to_upper(c1[2]); t4=otl_to_upper(c1[3]); } if(clen>4) t5=otl_to_upper(c1[4]); if((type=='C'&&t2=='H')||(type=='R'&&t2=='A'&&t3=='W'&&(t4=='['||t4=='('))){ char tmp[32]; char *t=tmp; while((*c1!='[' && *c1!='(')&&*c1) ++c1; if(*c1)++c1; while((*c1!=']' && *c1!=')')&&*c1) *t++=*c1++; *t=0; if(*tmp==0) // declaration is invalid return 0; size=atoi(tmp); #if defined(OTL_ADD_NULL_TERMINATOR_TO_STRING_SIZE) if(type=='C')size+=1; #endif if(size<2) // minimum size of should be at 2 return 0; } #if defined(OTL_ORA_UNICODE)||defined(OTL_ORA_UTF8) if(type=='N'&&t2=='C'&&t3=='H'){ char tmp[32]; char *t=tmp; while((*c1!='[' && *c1!='(')&&*c1) ++c1; if(*c1)++c1; while((*c1!=']' && *c1!=')')&&*c1) *t++=*c1++; *t=0; if(*tmp==0) return 0; size=atoi(tmp); #if defined(OTL_ADD_NULL_TERMINATOR_TO_STRING_SIZE) size+=1; #endif } #endif if(status==in && (vstat==in||vstat==io)) ; else if(status==out && (vstat==out||vstat==io||vstat==def)) ; else if(status==def) ; else return 0; OTL_CHECK_BIND_VARS int pl_tab_flag=0; if(apl_tab_size){ array_size=apl_tab_size; pl_tab_flag=1; }else array_size=prev_array_size; otl_tmpl_variable* v= new otl_tmpl_variable; v->copy_name(name); switch(type){ case 'B': if(t2=='L') v->init(false, otl_var_blob, adb.get_max_long_size(), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct); #if defined(OTL_BIGINT) && (defined(OTL_ODBC)||defined(OTL_DB2_CLI)) else if(t2=='I') v->init(false, otl_var_bigint,sizeof(OTL_BIGINT), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); #elif (defined(OTL_ORA7)||defined(OTL_ORA8)|| \ defined(OTL_ORA8I)||defined(OTL_ORA9I)) && \ defined(OTL_BIGINT) else if(t2=='I') v->init(false, otl_var_char, otl_bigint_str_size, OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct, pl_tab_flag); #endif break; #if defined(OTL_ORA_UNICODE)||defined(OTL_ORA_UTF8) case 'N': if(t2=='C' && (t3=='L'||t3=='H')){ if(t3=='L'){ v->init(false,otl_var_nclob, adb.get_max_long_size(), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct); v->ftype=otl_var_clob; }else if(t3=='H'){ v->init(false,otl_var_nchar, size, OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); v->ftype=otl_var_char; } }else{ delete v; v=0; } break; #endif case 'C': if(t2=='H'){ v->init(false,otl_var_char, size, OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); if(t5=='Z') v->var_struct.charz_flag=true; }else if(t2=='L') v->init(false,otl_var_clob, adb.get_max_long_size(), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct); else{ delete v; v=0; } break; case 'D': if(t2=='O') v->init(false,otl_var_double,sizeof(double), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); else if(t2=='B'&&t3=='2'){ if(t4=='T') v->init(false,otl_var_db2time,sizeof(TTimestampStruct), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); else if(t4=='D') v->init(false,otl_var_db2date,sizeof(TTimestampStruct), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); else{ delete v; v=0; } }else{ delete v; v=0; } break; case 'F': v->init(false,otl_var_float, sizeof(float), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); break; case 'I': v->init(false,otl_var_int, sizeof(int), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); break; case 'U': v->init(false,otl_var_unsigned_int, sizeof(unsigned), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); break; case 'R': if(t2=='E'&&t3=='F') v->init(false,otl_var_refcur, 1, OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,0); else if(t2=='A'&&t3=='W'&&(t4=='['||t4=='(')) v->init(false,otl_var_raw, size, OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); else if(t2=='A'&&t3=='W') v->init(false,otl_var_raw_long, adb.get_max_long_size(), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct); break; case 'S': v->init(false,otl_var_short, sizeof(short), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); break; case 'L': if(t2=='O'&&t3=='N') v->init(false,otl_var_long_int, sizeof(long), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); else if(t2=='T'&&t3=='Z') v->init(false,otl_var_ltz_timestamp, sizeof(TTimestampStruct), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); else{ delete v; v=0; } break; case 'T': if(t2=='Z') v->init(false,otl_var_tz_timestamp,sizeof(TTimestampStruct), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); else if(t2=='I' && t3=='M') v->init(false,otl_var_timestamp,sizeof(TTimestampStruct), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct,pl_tab_flag); else{ delete v; v=0; } break; case 'V': v->init(false,otl_var_varchar_long,adb.get_max_long_size(), OTL_SCAST(const otl_stream_buffer_size_type,array_size), &adb.connect_struct); break; default: delete v; v=0; break; } return v; } void alloc_host_var_list (otl_tmpl_variable** &vl, int& vl_len, OTL_TMPL_CONNECT& adb, const int status=def) { int j; vl_len=0; if(!hv[0]){ vl=0; return; } otl_auto_array_ptr*> loc_ptr(container_size_); otl_tmpl_variable** tmp_vl=loc_ptr.ptr; int i=0; while(hv[i]){ otl_tmpl_variable* vp= alloc_var(hv[i],inout[i],status,adb,pl_tab_size[i]); if(vp==0){ int j2; for(j2=0;j2name_pos=i+1; if(vp){ ++vl_len; tmp_vl[vl_len-1]=vp; } ++i; } if(vl_len>0){ vl=new otl_tmpl_variable*[vl_len]; for(j=0;j&): hv(0), inout(0), pl_tab_size(0), array_size(0), prev_array_size(0), vst(), len(0), stm_text_(0), stm_label_(0), container_size_(0), has_plsql_tabs_or_refcur_(0) { } otl_tmpl_ext_hv_decl & operator= (const otl_tmpl_ext_hv_decl &) { return *this; } }; template class otl_tmpl_select_cursor: public OTL_TMPL_CURSOR{ public: int cur_row; int cur_size; int row_count; int array_size; int prefetch_array_size; TSelectCursorStruct select_cursor_struct; otl_select_struct_override local_override; otl_tmpl_select_cursor (OTL_TMPL_CONNECT& pdb, const otl_stream_buffer_size_type arr_size=1, const char* sqlstm_label=0): OTL_TMPL_CURSOR(pdb), cur_row(-1), cur_size(0), row_count(0), array_size(0), prefetch_array_size(0), select_cursor_struct(), local_override() { local_override.reset(); if(sqlstm_label!=0){ if(this->stm_label!=0){ delete[] this->stm_label; this->stm_label=0; } size_t len=strlen(sqlstm_label)+1; this->stm_label=new char[len]; OTL_STRCPY_S(this->stm_label,len,sqlstm_label); } select_cursor_struct.set_arr_size (arr_size, array_size, prefetch_array_size); select_cursor_struct.init(array_size); } otl_tmpl_select_cursor() : OTL_TMPL_CURSOR(){} void open (OTL_TMPL_CONNECT& db, otl_stream_buffer_size_type arr_size=1) { local_override.reset(); cur_row=-1; row_count=0; cur_size=0; array_size=arr_size; OTL_TMPL_CURSOR::open(db); } void close(void) { local_override.reset(); OTL_TMPL_CURSOR::close(); } int first(void) { if(!OTL_TMPL_CURSOR::connected)return 0; select_cursor_struct.set_prefetch_size(prefetch_array_size); int rc=select_cursor_struct.first (this->cursor_struct, cur_row,cur_size, row_count, this->eof_data, array_size); OTL_TRACE_FIRST_FETCH if(!rc){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw OTL_TMPL_EXCEPTION (this->cursor_struct, this->stm_label? this->stm_label: this->stm_text); } return cur_size!=0; } int next_throw(void) { if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw OTL_TMPL_EXCEPTION (this->cursor_struct, this->stm_label? this->stm_label: this->stm_text); } int next(void) { if(!this->connected)return 0; if(cur_row==-1)return first(); int rc=select_cursor_struct.next (this->cursor_struct, cur_row,cur_size, row_count, this->eof_data, array_size); if(!rc){ return next_throw(); } OTL_TRACE_NEXT_FETCH return cur_size!=0; } private: otl_tmpl_select_cursor (const otl_tmpl_select_cursor&): OTL_TMPL_CURSOR(), cur_row(-1), cur_size(0), row_count(0), array_size(0), prefetch_array_size(0), select_cursor_struct(), local_override() { } otl_tmpl_select_cursor& operator= (const otl_tmpl_select_cursor&) { return *this; } }; #if defined(OTL_ORA8)||defined(OTL_ODBC) const int otl_lob_stream_read_mode=1; const int otl_lob_stream_write_mode=2; const int otl_lob_stream_zero_mode=3; const int otl_lob_stream_first_piece=1; const int otl_lob_stream_next_piece=2; const int otl_lob_stream_last_piece=3; class otl_lob_stream_generic{ public: int mode; int retcode; int ndx; int offset; int lob_len; int in_destructor; int eof_flag; int lob_is_null; bool ora_lob; otl_lob_stream_generic(const bool aora_lob=true): mode(0), retcode(0), ndx(0), offset(0), lob_len(0), in_destructor(0), eof_flag(0), lob_is_null(0), ora_lob(aora_lob) { } virtual ~otl_lob_stream_generic(){} virtual void init (void* avar,void* aconnect,void* acursor,int andx, int amode,const int alob_is_null=0) = 0; virtual void set_len(const int new_len=0) = 0; virtual otl_lob_stream_generic& operator<<(const otl_long_string& s) = 0; virtual otl_lob_stream_generic& operator>>(otl_long_string& s) = 0; #if (defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS)) && !defined(OTL_UNICODE) virtual otl_lob_stream_generic& operator<<(const OTL_STRING_CONTAINER& s) = 0; virtual otl_lob_stream_generic& operator>>(OTL_STRING_CONTAINER& s) = 0; virtual void setStringBuffer(const int chunk_size) = 0; #endif virtual int eof(void) = 0; virtual int len(void) = 0; virtual bool is_initialized(void) = 0; virtual void close(void) = 0; private: otl_lob_stream_generic(const otl_lob_stream_generic&): mode(0), retcode(0), ndx(0), offset(0), lob_len(0), in_destructor(0), eof_flag(0), lob_is_null(0), ora_lob(false) { } otl_lob_stream_generic& operator=(const otl_lob_stream_generic&) { return *this; } }; #endif #if defined(__GNUC__) || defined(__SUNPRO_CC) || \ (defined(_MSC_VER) && (_MSC_VER <= 1300)) || \ defined(__HP_aCC) || defined(__BORLANDC__) // Enable the kludge for compilers that do not support template // member functions at all, or have bugs: g++, Forte C++ (Solaris), // Visual C++ 6.0, Visual C++ 7.0, etc. #if !defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) #define OTL_NO_TMPL_MEMBER_FUNC_SUPPORT #endif #endif template class otl_tmpl_select_stream: public OTL_TMPL_SELECT_CURSOR{ public: otl_column_desc* sl_desc; otl_tmpl_variable* sl; int sl_len; int null_fetched; int cur_col; int cur_in; int executed; int eof_status; char var_info[256]; otl_select_struct_override* override; int delay_next; bool lob_stream_mode; long _rfc; void cleanup(void) {int i; delete[] sl; for(i=0;ivl_len;++i) delete this->vl[i]; delete[] this->vl; delete[] sl_desc; } virtual ~otl_tmpl_select_stream() { cleanup(); } otl_tmpl_select_stream (otl_select_struct_override* aoverride, const otl_stream_buffer_size_type arr_size, const char* sqlstm, OTL_TMPL_CONNECT& pdb, const int implicit_select=otl_explicit_select, const char* sqlstm_label=0) : OTL_TMPL_SELECT_CURSOR(pdb,arr_size,sqlstm_label), sl_desc(0), sl(0), sl_len(0), null_fetched(0), cur_col(0), cur_in(0), executed(0), eof_status(0), var_info(), override(0), delay_next(0), lob_stream_mode(false), _rfc(0) { int i; this->select_cursor_struct.set_select_type(implicit_select); sl=0; sl_len=0; _rfc=0; null_fetched=0; lob_stream_mode=aoverride->lob_stream_mode; this->retcode=0; sl_desc=0; executed=0; cur_in=0; this->stm_text=0; eof_status=1; override=aoverride; { size_t len=strlen(sqlstm)+1; this->stm_text=new char[len]; OTL_STRCPY_S(this->stm_text,len,sqlstm); otl_select_struct_override* temp_local_override=&this->local_override; otl_tmpl_ext_hv_decl hvd (this->stm_text, 1, this->stm_label, &temp_local_override, &pdb ); hvd.alloc_host_var_list(this->vl,this->vl_len,pdb); } try{ this->parse(); if(!this->select_cursor_struct.implicit_cursor){ get_select_list(); bind_all(); }else{ for(i=0;ivl_len;++i) this->bind(*this->vl[i]); } if(this->vl_len==0){ rewind(); null_fetched=0; } }catch(OTL_CONST_EXCEPTION OTL_TMPL_EXCEPTION&){ cleanup(); if(this->adb)this->adb->throw_count++; throw; } } void rewind(void) { OTL_TRACE_STREAM_EXECUTION int i; _rfc=0; if(!this->select_cursor_struct.close_select(this->cursor_struct)){ throw OTL_TMPL_EXCEPTION (this->cursor_struct, this->stm_label?this->stm_label:this->stm_text); } if(this->select_cursor_struct.implicit_cursor){ this->exec(1); if(sl){ delete[] sl; sl=0; } get_select_list(); for(i=0;ibind(sl[i]); } eof_status=this->first(); null_fetched=0; cur_col=-1; cur_in=0; executed=1; delay_next=0; } void clean(void) { _rfc=0; this->cursor_struct.canceled=false; null_fetched=0; cur_col=-1; cur_in=0; executed=0; delay_next=0; this->cur_row=-1; this->row_count=0; this->cur_size=0; if(!this->select_cursor_struct.close_select(this->cursor_struct)){ throw OTL_TMPL_EXCEPTION (this->cursor_struct, this->stm_label?this->stm_label:this->stm_text); } } int is_null(void) { return null_fetched; } int eof(void) { if(delay_next){ look_ahead(); delay_next=0; } return !eof_status; } int eof_intern(void) { return !eof_status; } void bind_all(void) {int i; for(i=0;ivl_len;++i)this->bind(*this->vl[i]); for(i=0;ibind(sl[i]); } void get_select_list(void) { int j; otl_auto_array_ptr loc_ptr(otl_var_list_size); otl_column_desc* sl_desc_tmp=loc_ptr.ptr; int sld_tmp_len=0; int ftype,elem_size,i; for(i=1;this->describe_column(sl_desc_tmp[i-1],i);++i){ if(otl_tmpl_variable::int2ext (sl_desc_tmp[i-1].dbtype)==otl_unsupported_type){ otl_var_info_col3 (i-1, sl_desc_tmp[i-1].dbtype, sl_desc_tmp[i-1].name, this->var_info, sizeof(this->var_info)); throw OTL_TMPL_EXCEPTION (otl_error_msg_27, otl_error_code_27, this->stm_label? this->stm_label: this->stm_text, this->var_info); } ++sld_tmp_len; if(sld_tmp_len==loc_ptr.arr_size_){ loc_ptr.double_size(); sl_desc_tmp=loc_ptr.ptr; } } sl_len=sld_tmp_len; if(sl){ delete[] sl; sl=0; } sl=new otl_tmpl_variable[sl_len==0?1:sl_len]; int max_long_size=this->adb->get_max_long_size(); for(j=0;j::map_ftype (sl_desc_tmp[j], max_long_size, ftype, elem_size, this->local_override.getLen()>0?this->local_override:*override, j+1, this->adb->connect_struct.get_connection_type()); sl[j].copy_pos(j+1); #if defined(OTL_ORA_UNICODE)||defined(OTL_ORA_UTF8) if(sl_desc_tmp[j].charset_form==2) sl[j].var_struct.nls_flag=true; #endif sl[j].init(true, ftype, elem_size, OTL_SCAST(otl_stream_buffer_size_type,(this->array_size)), &this->adb->connect_struct ); sl[j].var_struct.lob_stream_mode=this->lob_stream_mode; } if(sl_desc){ delete[] sl_desc; sl_desc=0; } sl_desc=new otl_column_desc[sl_len==0?1:sl_len]; for(j=0;jadb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (otl_error_msg_2, otl_error_code_2, this->stm_label? this->stm_label: this->stm_text, 0); } void check_if_executed(void) { if(!executed){ check_if_executed_throw(); } } int check_type_throw(int type_code,int actual_data_type) { int out_type_code; if(actual_data_type!=0) out_type_code=actual_data_type; else out_type_code=type_code; otl_var_info_col (sl[cur_col].pos, sl[cur_col].ftype, out_type_code, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw OTL_TMPL_EXCEPTION (otl_error_msg_0, otl_error_code_0, this->stm_label? this->stm_label: this->stm_text, var_info); } #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) void strict_check_throw(int type_code) { otl_var_info_col (sl[cur_col].pos, sl[cur_col].ftype, type_code, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (otl_error_msg_0, otl_error_code_0, this->stm_label? this->stm_label: this->stm_text, var_info); } #endif int check_type(int type_code,int actual_data_type=0) { switch(sl[cur_col].ftype){ case otl_var_timestamp: case otl_var_tz_timestamp: case otl_var_ltz_timestamp: if(type_code==otl_var_timestamp) return 1; default: if(sl[cur_col].ftype==type_code) return 1; } return check_type_throw(type_code,actual_data_type); } void get_next(void) { if(cur_colcur_row); }else{ eof_status=this->next(); cur_col=0; } } void look_ahead(void) { if(cur_col==sl_len-1){ eof_status=this->next(); cur_col=-1; ++_rfc; } } OTL_TMPL_SELECT_STREAM& operator>>(char& c) { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_char)&&!eof_intern()){ c=*OTL_RCAST(char*,sl[cur_col].val(this->cur_row)); look_ahead(); } return *this; } OTL_TMPL_SELECT_STREAM& operator>>(unsigned char& c) { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_char)&&!eof_intern()){ c=*OTL_RCAST(unsigned char*,sl[cur_col].val(this->cur_row)); look_ahead(); } return *this; } #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) OTL_TMPL_SELECT_STREAM& operator>>(OTL_STRING_CONTAINER& s) { check_if_executed(); if(eof_intern())return *this; get_next(); switch(sl[cur_col].ftype){ case otl_var_char: if(!eof_intern()){ #if defined(OTL_ACE) s.set(OTL_RCAST(char*,sl[cur_col].val(this->cur_row)),1); #else s=OTL_RCAST(char*,sl[cur_col].val(this->cur_row)); #endif look_ahead(); } break; #if defined(OTL_USER_DEFINED_STRING_CLASS_ON) || \ defined(OTL_STL) || defined(OTL_ACE) case otl_var_varchar_long: case otl_var_raw_long: if(!eof_intern()){ unsigned char* c=OTL_RCAST(unsigned char*, sl[cur_col].val(this->cur_row)); int len=sl[cur_col].get_len(this->cur_row); int buf_sz=sl[cur_col].elem_size; if(len>buf_sz)len=buf_sz; #if (defined(OTL_USER_DEFINED_STRING_CLASS_ON) || defined(OTL_STL)) \ && !defined(OTL_ACE) s.assign(OTL_RCAST(char*,c),len); #elif defined(OTL_ACE) s.set(OTL_RCAST(char*,c),len,1); #endif look_ahead(); } break; case otl_var_blob: case otl_var_clob: if(!eof_intern()){ int len=0; int max_long_sz=this->adb->get_max_long_size(); otl_auto_array_ptr loc_ptr(max_long_sz); unsigned char* temp_buf=loc_ptr.ptr; int rc=sl[cur_col].var_struct.get_blob (this->cur_row, temp_buf, max_long_sz, len); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (this->adb->connect_struct, this->stm_label?this->stm_label: this->stm_text); } #if (defined(OTL_USER_DEFINED_STRING_CLASS_ON) || \ defined(OTL_STL)) && !defined(OTL_ACE) s.assign(OTL_RCAST(char*,temp_buf),len); #elif defined(OTL_ACE) s.set(OTL_RCAST(char*,temp_buf),len,1); #endif look_ahead(); } break; #endif default: check_type(otl_var_char); } // switch return *this; } #endif OTL_TMPL_SELECT_STREAM& operator>>(char* s) { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_char)&&!eof_intern()){ otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,sl[cur_col].val(this->cur_row)) ); look_ahead(); } return *this; } #if defined(OTL_UNICODE_STRING_TYPE) OTL_TMPL_SELECT_STREAM& operator<<(const OTL_UNICODE_STRING_TYPE& s) { check_in_var(); if(check_in_type(otl_var_char,1)){ int overflow; otl_strcpy4 (OTL_RCAST(unsigned char*,this->vl[cur_in]->val()), OTL_RCAST(unsigned char*, OTL_CCAST(OTL_UNICODE_CHAR_TYPE*,s.c_str())), overflow, this->vl[cur_in]->elem_size, OTL_SCAST(int,s.length()) ); if(overflow){ char temp_var_info[256]; otl_var_info_var (this->vl[cur_in]->name, this->vl[cur_in]->ftype, otl_var_char, temp_var_info, sizeof(temp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_4, otl_error_code_4, this->stm_label?this->stm_label: this->stm_text, temp_var_info); } this->vl[cur_in]->set_not_null(0); } get_in_next(); return *this; } #endif #if defined(OTL_UNICODE_STRING_TYPE) OTL_TMPL_SELECT_STREAM& operator>>(OTL_UNICODE_STRING_TYPE& s) { check_if_executed(); if(eof_intern())return *this; get_next(); switch(sl[cur_col].ftype){ case otl_var_char: if(!eof_intern()){ #if defined(OTL_ODBC) || defined(DB2_CLI) s=OTL_RCAST(OTL_UNICODE_CHAR_TYPE*,sl[cur_col].val(this->cur_row)); #else #if defined(OTL_UNICODE_STRING_TYPE_CAST_FROM_CHAR) OTL_UNICODE_CHAR_TYPE* temp_s=OTL_RCAST (OTL_UNICODE_CHAR_TYPE*,sl[cur_col].val(this->cur_row)); OTL_UNICODE_STRING_TYPE_CAST_FROM_CHAR(s,temp_s+1,*temp_s); #else OTL_UNICODE_CHAR_TYPE* temp_s=OTL_RCAST (OTL_UNICODE_CHAR_TYPE*,sl[cur_col].val(this->cur_row)); s.assign(temp_s+1,*temp_s); #endif #endif look_ahead(); } break; case otl_var_varchar_long: if(!eof_intern()){ s=OTL_RCAST(OTL_UNICODE_CHAR_TYPE*,sl[cur_col].val(this->cur_row)); look_ahead(); } break; case otl_var_clob: if(!eof_intern()){ int len=0; int max_long_sz=this->adb->get_max_long_size(); otl_auto_array_ptr loc_ptr(max_long_sz); unsigned char* temp_buf=OTL_RCAST(unsigned char*,loc_ptr.ptr); int rc=sl[cur_col].var_struct.get_blob (this->cur_row, temp_buf, max_long_sz, len); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (this->adb->connect_struct, this->stm_label?this->stm_label: this->stm_text); } s=OTL_RCAST(OTL_UNICODE_CHAR_TYPE*,temp_buf); look_ahead(); } break; default: check_type(otl_var_char); } return *this; } #endif OTL_TMPL_SELECT_STREAM& operator>>(unsigned char* s) { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_char)&&!eof_intern()){ otl_strcpy2(OTL_RCAST(unsigned char*,s), OTL_RCAST(unsigned char*,sl[cur_col].val(this->cur_row)), sl[cur_col].get_len(this->cur_row) ); look_ahead(); } return *this; } #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) #define OTL_D1(T,T_type) \ OTL_TMPL_SELECT_STREAM& operator>>(T& n) \ { \ check_if_executed(); \ if(eof_intern())return *this; \ get_next(); \ if(!eof_intern()){ \ int match_found=otl_numeric_convert_T \ (sl[cur_col].ftype, \ sl[cur_col].val(this->cur_row), \ n); \ if(!match_found) \ strict_check_throw(T_type); \ look_ahead(); \ } \ return *this; \ } #else #define OTL_D1(T,T_type) \ OTL_TMPL_SELECT_STREAM& operator>>(T& n) \ { \ check_if_executed(); \ if(eof_intern())return *this; \ get_next(); \ if(!eof_intern()){ \ int match_found=otl_numeric_convert_T \ (sl[cur_col].ftype, \ sl[cur_col].val(this->cur_row), \ n); \ if(!match_found){ \ if(check_type(otl_var_double,T_type)) \ n=OTL_PCONV(T,double,sl[cur_col].val(this->cur_row)); \ } \ look_ahead(); \ } \ return *this; \ } #endif #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) OTL_D1(int,otl_var_int) #if defined(OTL_BIGINT) OTL_D1(OTL_BIGINT,otl_var_bigint) #endif OTL_D1(unsigned,otl_var_unsigned_int) OTL_D1(long,otl_var_long_int) OTL_D1(short,otl_var_short) OTL_D1(float,otl_var_float) OTL_D1(double,otl_var_double) #else template OTL_D1(T,T_type) #endif OTL_TMPL_SELECT_STREAM& operator>>(TTimestampStruct& t) { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_timestamp)&&!eof_intern()){ TTimestampStruct* tm= OTL_RCAST(TTimestampStruct*,sl[cur_col].val(this->cur_row)); int rc=sl[cur_col].var_struct.read_dt (&t,tm,sizeof(TTimestampStruct)); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (this->adb->connect_struct, this->stm_label?this->stm_label: this->stm_text); } look_ahead(); } return *this; } OTL_TMPL_SELECT_STREAM& operator>>(otl_long_string& s) { check_if_executed(); if(eof_intern())return *this; get_next(); switch(sl[cur_col].ftype){ case otl_var_raw_long: { if(!eof_intern()){ unsigned char* c=OTL_RCAST(unsigned char*,sl[cur_col].val(this->cur_row)); int len2=sl[cur_col].get_len(this->cur_row); if(len2>s.buf_size)len2=s.buf_size; otl_memcpy(s.v,c,len2,sl[cur_col].ftype); s.set_len(len2); look_ahead(); } } break; case otl_var_varchar_long: { if(!eof_intern()){ if(sl[cur_col].var_struct.otl_adapter==otl_ora8_adapter){ #if defined(OTL_UNICODE) int len2=0; OTL_CHAR* source=OTL_RCAST(OTL_CHAR*,sl[cur_col].val(this->cur_row)); OTL_CHAR* target=OTL_RCAST(OTL_CHAR*,s.v); while(*source && len2cur_row)); int len2=sl[cur_col].get_len(this->cur_row); if(len2>s.buf_size)len2=s.buf_size; otl_memcpy(s.v,c,len2,sl[cur_col].ftype); s.null_terminate_string(len2); s.set_len(len2); look_ahead(); #endif }else{ unsigned char* c=OTL_RCAST(unsigned char*,sl[cur_col].val(this->cur_row)); int len2=sl[cur_col].get_len(this->cur_row); if(len2>s.buf_size)len2=s.buf_size; otl_memcpy(s.v,c,len2,sl[cur_col].ftype); s.null_terminate_string(len2); s.set_len(len2); look_ahead(); } } } break; case otl_var_raw: { if(!eof_intern()){ unsigned char* c=OTL_RCAST(unsigned char*,sl[cur_col].val(this->cur_row)); if(sl[cur_col].var_struct.otl_adapter==otl_ora7_adapter|| sl[cur_col].var_struct.otl_adapter==otl_ora8_adapter){ int len2=OTL_SCAST(int,*OTL_RCAST(unsigned short*,c)); otl_memcpy(s.v,c+sizeof(short int),len2,sl[cur_col].ftype); s.set_len(len2); }else{ int len2=sl[cur_col].get_len(this->cur_row); if(len2>s.buf_size)len2=s.buf_size; otl_memcpy(s.v,c,len2,sl[cur_col].ftype); s.set_len(len2); } look_ahead(); } } break; case otl_var_blob: case otl_var_clob: { if(!eof_intern()){ int len=0; int rc=sl[cur_col].var_struct.get_blob(this->cur_row,s.v,s.buf_size,len); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (this->adb->connect_struct, this->stm_label?this->stm_label: this->stm_text); } if(len>s.buf_size)len=s.buf_size; s.set_len(len); if(sl[cur_col].ftype==otl_var_clob) s.null_terminate_string(len); look_ahead(); } } break; default: { char tmp_var_info[256]; otl_var_info_col (sl[cur_col].pos, sl[cur_col].ftype, otl_var_long_string, tmp_var_info, sizeof(tmp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_0, otl_error_code_0, this->stm_label?this->stm_label: this->stm_text, tmp_var_info); } } return *this; } #if defined(OTL_ORA8)||defined(OTL_ODBC) OTL_TMPL_SELECT_STREAM& operator>> (otl_lob_stream_generic& s) { check_if_executed(); if(eof_intern())return *this; get_next(); if(s.ora_lob&& (sl[cur_col].ftype==otl_var_blob|| sl[cur_col].ftype==otl_var_clob)&& !eof_intern()){ s.init (OTL_RCAST(void*,&sl[cur_col]), OTL_RCAST(void*,this->adb), OTL_RCAST(void*,this), this->cur_row, otl_lob_stream_read_mode, this->is_null()); delay_next=1; }else if((sl[cur_col].ftype==otl_var_varchar_long|| sl[cur_col].ftype==otl_var_raw_long)&& !eof_intern()){ s.init (OTL_RCAST(void*,&sl[cur_col]), OTL_RCAST(void*,this->adb), OTL_RCAST(void*,this), this->cur_row, otl_lob_stream_read_mode); delay_next=1; }else{ char tmp_var_info[256]; otl_var_info_col (sl[cur_col].pos, sl[cur_col].ftype, otl_var_long_string, tmp_var_info, sizeof(tmp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_0, otl_error_code_0, this->stm_label?this->stm_label: this->stm_text, tmp_var_info); } return *this; } #endif int check_in_type_throw(int type_code) { otl_var_info_var (this->vl[cur_in]->name, this->vl[cur_in]->ftype, type_code, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw OTL_TMPL_EXCEPTION (otl_error_msg_0, otl_error_code_0, this->stm_label?this->stm_label: this->stm_text, var_info); } int check_in_type(int type_code,int tsize) { switch(this->vl[cur_in]->ftype){ case otl_var_char: if(type_code==otl_var_char) return 1; case otl_var_db2date: case otl_var_db2time: case otl_var_timestamp: case otl_var_tz_timestamp: case otl_var_ltz_timestamp: if(type_code==otl_var_timestamp) return 1; default: if(this->vl[cur_in]->ftype==type_code && this->vl[cur_in]->elem_size==tsize) return 1; } return check_in_type_throw(type_code); } void check_in_var_throw(void) { if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (otl_error_msg_1, otl_error_code_1, this->stm_label?this->stm_label: this->stm_text, 0); } void check_in_var(void) { if(this->vl_len==0) check_in_var_throw(); } void get_in_next(void) { if(cur_in==this->vl_len-1) rewind(); else{ ++cur_in; executed=0; } } OTL_TMPL_SELECT_STREAM& operator<<(const otl_null& /* n */) { check_in_var(); this->vl[cur_in]->set_null(0); get_in_next(); return *this; } OTL_TMPL_SELECT_STREAM& operator<<(const char c) { check_in_var(); if(check_in_type(otl_var_char,1)){ char* tmp=OTL_RCAST(char*,this->vl[cur_in]->val()); tmp[0]=c; tmp[1]=0; this->vl[cur_in]->set_not_null(0); } get_in_next(); return *this; } OTL_TMPL_SELECT_STREAM& operator<<(const unsigned char c) { check_in_var(); if(check_in_type(otl_var_char,1)){ unsigned char* tmp= OTL_RCAST(unsigned char*,this->vl[cur_in]->val()); tmp[0]=c; tmp[1]=0; this->vl[cur_in]->set_not_null(0); } get_in_next(); return *this; } OTL_TMPL_SELECT_STREAM& operator<<(const char* s) { check_in_var(); if(check_in_type(otl_var_char,1)){ int overflow; otl_strcpy (OTL_RCAST(unsigned char*,this->vl[cur_in]->val()), OTL_RCAST(unsigned char*,OTL_CCAST(char*,s)), overflow, this->vl[cur_in]->elem_size ); if(overflow){ char tmp_var_info[256]; otl_var_info_var (this->vl[cur_in]->name, this->vl[cur_in]->ftype, otl_var_char, tmp_var_info, sizeof(tmp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_4, otl_error_code_4, this->stm_label?this->stm_label: this->stm_text, tmp_var_info); } this->vl[cur_in]->set_not_null(0); } get_in_next(); return *this; } OTL_TMPL_SELECT_STREAM& operator<<(const otl_long_string& s) { check_in_var(); switch(this->vl[cur_in]->ftype){ case otl_var_raw_long: { unsigned char* c=OTL_RCAST(unsigned char*,this->vl[cur_in]->val(0)); int len=OTL_CCAST(otl_long_string*,&s)->len(); if(len>this->vl[cur_in]->actual_elem_size()){ otl_var_info_var (this->vl[cur_in]->name, this->vl[cur_in]->ftype, otl_var_char, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_5, otl_error_code_5, this->stm_label?this->stm_label: this->stm_text, var_info); } this->vl[cur_in]->set_not_null(0); otl_memcpy(c,s.v,len,this->vl[cur_in]->ftype); this->vl[cur_in]->set_len(len,0); } break; case otl_var_raw: { unsigned char* c=OTL_RCAST(unsigned char*,this->vl[cur_in]->val(0)); int len=OTL_CCAST(otl_long_string*,&s)->len(); if(len>this->vl[cur_in]->actual_elem_size()){ otl_var_info_var (this->vl[cur_in]->name, this->vl[cur_in]->ftype, otl_var_char, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_5, otl_error_code_5, this->stm_label?this->stm_label: this->stm_text, var_info); } this->vl[cur_in]->set_not_null(0); if((this->vl[cur_in]->var_struct.otl_adapter==otl_ora7_adapter|| this->vl[cur_in]->var_struct.otl_adapter==otl_ora8_adapter) && this->vl[cur_in]->ftype==otl_var_raw){ otl_memcpy (c+sizeof(unsigned short), s.v, len, this->vl[cur_in]->ftype); *OTL_RCAST(unsigned short*, this->vl[cur_in]->val(0))=OTL_SCAST(unsigned short,len); this->vl[cur_in]->set_len(len,0); }else{ otl_memcpy(c,s.v,len,this->vl[cur_in]->ftype); this->vl[cur_in]->set_len(len,0); } } break; } get_in_next(); return *this; } #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) OTL_TMPL_SELECT_STREAM& operator<<(const OTL_STRING_CONTAINER& s) { check_in_var(); if(check_in_type(otl_var_char,1)){ int overflow; otl_strcpy (OTL_RCAST(unsigned char*,this->vl[cur_in]->val()), OTL_RCAST(unsigned char*,OTL_CCAST(char*,s.c_str())), overflow, this->vl[cur_in]->elem_size, OTL_SCAST(int,s.length()) ); if(overflow){ char temp_var_info[256]; otl_var_info_var (this->vl[cur_in]->name, this->vl[cur_in]->ftype, otl_var_char, temp_var_info, sizeof(temp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_4, otl_error_code_4, this->stm_label?this->stm_label: this->stm_text, temp_var_info); } this->vl[cur_in]->set_not_null(0); } get_in_next(); return *this; } #endif OTL_TMPL_SELECT_STREAM& operator<<(const unsigned char* s) { check_in_var(); if(check_in_type(otl_var_char,1)){ int overflow; otl_strcpy4 (OTL_RCAST(unsigned char*,this->vl[cur_in]->val()), OTL_CCAST(unsigned char*,s), overflow, this->vl[cur_in]->elem_size ); if(overflow){ char temp_var_info[256]; otl_var_info_var (this->vl[cur_in]->name, this->vl[cur_in]->ftype, otl_var_char, temp_var_info, sizeof(temp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_4, otl_error_code_4, this->stm_label?this->stm_label: this->stm_text, temp_var_info); } this->vl[cur_in]->set_not_null(0); } get_in_next(); return *this; } #define OTL_D2(T,T_type) \ OTL_TMPL_SELECT_STREAM& operator<<(const T n) \ { \ check_in_var(); \ if(check_in_type(T_type,sizeof(T))){ \ *OTL_RCAST(T*,this->vl[cur_in]->val())=n; \ } \ this->vl[cur_in]->set_not_null(0); \ get_in_next(); \ return *this; \ } #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) OTL_D2(int,otl_var_int) OTL_D2(unsigned,otl_var_unsigned_int) #if defined(OTL_BIGINT) OTL_D2(OTL_BIGINT,otl_var_bigint) #endif OTL_D2(long,otl_var_long_int) OTL_D2(short,otl_var_short) OTL_D2(float,otl_var_float) OTL_D2(double,otl_var_double) #else template OTL_D2(T,T_type) #endif OTL_TMPL_SELECT_STREAM& operator<<(const TTimestampStruct& t) { check_in_var(); if(check_in_type(otl_var_timestamp,sizeof(TTimestampStruct))){ TTimestampStruct* tm= OTL_RCAST(TTimestampStruct*,this->vl[cur_in]->val()); int rc=this->vl[cur_in]->var_struct.write_dt (tm,&t,sizeof(TTimestampStruct)); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (this->adb->connect_struct, this->stm_label?this->stm_label: this->stm_text); } } this->vl[cur_in]->set_not_null(0); get_in_next(); return *this; } private: otl_tmpl_select_stream (const otl_tmpl_select_stream&): OTL_TMPL_SELECT_CURSOR(), sl_desc(0), sl(0), sl_len(0), null_fetched(0), cur_col(0), cur_in(0), executed(0), eof_status(0), var_info(), override(0), delay_next(0), lob_stream_mode(false), _rfc(0) { } otl_tmpl_select_stream& operator=(const otl_tmpl_select_stream&) { return *this; } }; template class otl_tmpl_out_stream: public OTL_TMPL_CURSOR{ public: int auto_commit_flag; int dirty; int cur_x; int cur_y; otl_stream_buffer_size_type array_size; int in_exception_flag; int in_destruct_flag; int should_delete_flag; char var_info[256]; bool flush_flag; bool flush_flag2; bool lob_stream_mode; void cleanup(void) {int i; if(should_delete_flag){ for(i=0;ivl_len;++i) delete this->vl[i]; } delete[] this->vl; } otl_tmpl_out_stream (otl_stream_buffer_size_type arr_size, const char* sqlstm, OTL_TMPL_CONNECT& db, const bool alob_stream_mode=false, const char* sqlstm_label=0): OTL_TMPL_CURSOR(db), auto_commit_flag(0), dirty(0), cur_x(0), cur_y(0), array_size(0), in_exception_flag(0), in_destruct_flag(0), should_delete_flag(0), var_info(), flush_flag(0), flush_flag2(0), lob_stream_mode(0) { int i; if(sqlstm_label!=0){ if(this->stm_label!=0){ delete[] this->stm_label; this->stm_label=0; } size_t len=strlen(sqlstm_label)+1; this->stm_label=new char[strlen(sqlstm_label)+1]; OTL_STRCPY_S(this->stm_label,len,sqlstm_label); } dirty=0; auto_commit_flag=1; flush_flag=true; flush_flag2=true; lob_stream_mode=alob_stream_mode; this->cursor_struct.last_param_data_token=0; this->cursor_struct.last_sql_param_data_status=0; this->cursor_struct.sql_param_data_count=0; cur_x=-1; cur_y=0; should_delete_flag=1; in_exception_flag=0; in_destruct_flag=0; this->stm_text=0; array_size=arr_size; { int len=strlen(sqlstm)+1; this->stm_text=new char[len]; OTL_STRCPY_S(this->stm_text,len,sqlstm); otl_tmpl_ext_hv_decl hvd(this->stm_text,arr_size); hvd.alloc_host_var_list(this->vl,this->vl_len,db); } try{ this->parse(); for(i=0;ivl_len;++i){ if(this->vl[i]->var_struct.otl_adapter==otl_odbc_adapter){ this->vl[i]->var_struct.lob_stream_mode=lob_stream_mode; this->vl[i]->var_struct.vparam_type=this->vl[i]->param_type; if(this->vl[i]->ftype==otl_var_varchar_long|| this->vl[i]->ftype==otl_var_raw_long){ this->vl[i]->set_not_null(0); } } bind(*(this->vl[i])); } }catch(OTL_CONST_EXCEPTION OTL_TMPL_EXCEPTION&){ cleanup(); if(this->adb)this->adb->throw_count++; throw; } } otl_tmpl_out_stream (OTL_TMPL_CONNECT& pdb, const bool alob_stream_mode=false, const char* sqlstm_label=0): OTL_TMPL_CURSOR(pdb), auto_commit_flag(0), dirty(0), cur_x(0), cur_y(0), array_size(0), in_exception_flag(0), in_destruct_flag(0), should_delete_flag(0), var_info(), flush_flag(0), flush_flag2(0), lob_stream_mode(0) { if(sqlstm_label!=0){ if(this->stm_label!=0){ delete[] this->stm_label; this->stm_label=0; } size_t len=strlen(sqlstm_label)+1; this->stm_label=new char[len]; OTL_STRCPY_S(this->stm_label,len,sqlstm_label); } should_delete_flag=1; in_exception_flag=0; in_destruct_flag=0; dirty=0; auto_commit_flag=1; flush_flag=true; flush_flag2=true; lob_stream_mode=alob_stream_mode; this->cursor_struct.last_param_data_token=0; this->cursor_struct.last_sql_param_data_status=0; this->cursor_struct.sql_param_data_count=0; cur_x=-1; cur_y=0; this->stm_text=0; } virtual ~otl_tmpl_out_stream() {in_destruct_flag=1; this->in_destructor=1; if(dirty&&!in_exception_flag&& flush_flag&&flush_flag2) flush(); cleanup(); in_destruct_flag=0; } virtual void flush(const int rowoff=0,const bool force_flush=false) {int i,rc; this->_rpc=0; if(!dirty)return; if(!flush_flag2)return; if(force_flush){ if(rowoff>cur_y){ clean(); return; } int temp_rc; OTL_TRACE_STREAM_EXECUTION2 this->exec(OTL_SCAST(otl_stream_buffer_size_type,(cur_y+1)),rowoff); for(i=0;ivl_len;++i){ temp_rc=this->vl[i]->var_struct.put_blob(); if(temp_rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (this->adb->connect_struct, this->stm_label?this->stm_label: this->stm_text); } } if(auto_commit_flag) this->adb->commit(); clean(); return; } #if defined(OTL_STL) && defined(OTL_UNCAUGHT_EXCEPTION_ON) if(otl_uncaught_exception()){ clean(); return; } #elif defined(OTL_UNCAUGHT_EXCEPTION_ON) if(otl_uncaught_exception()){ clean(); return; } #endif if(this->retcode==0||this->adb->retcode==0){ clean(); return; } if(cur_x!=this->vl_len-1){ in_exception_flag=1; if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; #if defined(OTL_STL) && defined(OTL_UNCAUGHT_EXCEPTION_ON) if( otl_uncaught_exception()){ clean(); return; } #elif defined(OTL_UNCAUGHT_EXCEPTION_ON) if(otl_uncaught_exception()){ clean(); return; } #endif throw OTL_TMPL_EXCEPTION (otl_error_msg_3, otl_error_code_3, this->stm_label?this->stm_label: this->stm_text, 0); } if(in_destruct_flag){ OTL_TRACE_STREAM_EXECUTION2 this->retcode=this->cursor_struct.exec(cur_y+1,rowoff); for(i=0;ivl_len;++i){ rc=this->vl[i]->var_struct.put_blob(); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (this->adb->connect_struct, this->stm_label?this->stm_label: this->stm_text); } } if(!this->retcode){ clean(); in_exception_flag=1; if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (this->cursor_struct, this->stm_label?this->stm_label: this->stm_text); } if(auto_commit_flag){ this->adb->retcode=this->adb->connect_struct.commit(); if(!this->adb->retcode){ clean(); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (this->adb->connect_struct, this->stm_label?this->stm_label: this->stm_text); } } }else{ int temp_rc; OTL_TRACE_STREAM_EXECUTION2 this->exec(OTL_SCAST(otl_stream_buffer_size_type,(cur_y+1)),rowoff); for(i=0;ivl_len;++i){ temp_rc=this->vl[i]->var_struct.put_blob(); if(temp_rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (this->adb->connect_struct, this->stm_label?this->stm_label: this->stm_text); } } if(auto_commit_flag) this->adb->commit(); if(rowoff>0) clean(); else clean(0,cur_y+1); } } virtual void clean (const int clean_up_error_flag=0, const int /*rows*/=0) { if(clean_up_error_flag) { this->retcode=1; this->in_exception_flag=0; } if(!dirty)return; cur_x=-1; cur_y=0; dirty=0; } void set_commit(int auto_commit=0) { auto_commit_flag=auto_commit; } void get_next(void) { if(cur_xvl_len-1) ++cur_x; else{ if(cur_yvl[cur_x]->name, this->vl[cur_x]->ftype, type_code, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw OTL_TMPL_EXCEPTION (otl_error_msg_0, otl_error_code_0, this->stm_label?this->stm_label: this->stm_text, var_info); } int check_type(int type_code, int tsize) { switch(this->vl[cur_x]->ftype){ case otl_var_char: if(type_code==otl_var_char)return 1; case otl_var_db2time: case otl_var_tz_timestamp: case otl_var_ltz_timestamp: case otl_var_db2date: if(type_code==otl_var_timestamp)return 1; case otl_var_refcur: if(type_code==otl_var_refcur)return 1; default: if(this->vl[cur_x]->ftype==type_code && this->vl[cur_x]->elem_size==tsize) return 1; } return check_type_throw(type_code); } void check_buf(void) { if(cur_x==this->vl_len-1 && cur_y==array_size-1) flush(); } OTL_TMPL_OUT_STREAM& operator<<(const char c) { if(this->vl_len>0){ get_next(); if(check_type(otl_var_char,1)){ char* tmp=OTL_RCAST(char*,this->vl[cur_x]->val(cur_y)); tmp[0]=c; tmp[1]=0; this->vl[cur_x]->set_not_null(cur_y); } check_buf(); } return *this; } OTL_TMPL_OUT_STREAM& operator<<(const unsigned char c) { if(this->vl_len>0){ get_next(); if(check_type(otl_var_char,1)){ unsigned char* tmp=OTL_RCAST(unsigned char*,this->vl[cur_x]->val(cur_y)); tmp[0]=c; tmp[1]=0; this->vl[cur_x]->set_not_null(cur_y); } check_buf(); } return *this; } #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) OTL_TMPL_OUT_STREAM& operator<<(const OTL_STRING_CONTAINER& s) { if(this->vl_len>0){ get_next(); switch(this->vl[cur_x]->ftype){ case otl_var_char: { int overflow; otl_strcpy (OTL_RCAST(unsigned char*,this->vl[cur_x]->val(cur_y)), OTL_RCAST(unsigned char*,OTL_CCAST(char*,s.c_str())), overflow, this->vl[cur_x]->elem_size, OTL_SCAST(int,s.length())); if(overflow){ otl_var_info_var (this->vl[cur_x]->name, this->vl[cur_x]->ftype, otl_var_char, var_info, sizeof(var_info)); in_exception_flag=1; if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_4, otl_error_code_4, this->stm_label?this->stm_label: this->stm_text, var_info); } this->vl[cur_x]->set_not_null(cur_y); } break; #if defined(OTL_USER_DEFINED_STRING_CLASS_ON) || \ defined(OTL_STL) || defined(OTL_ACE) case otl_var_varchar_long: case otl_var_raw_long: { unsigned char* c=OTL_RCAST(unsigned char*, this->vl[cur_x]->val(cur_y)); int len=OTL_SCAST(int,s.length()); this->vl[cur_x]->set_not_null(cur_y); if(len>this->vl[cur_x]->actual_elem_size()){ otl_var_info_var (this->vl[cur_x]->name, this->vl[cur_x]->ftype, otl_var_char, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_5, otl_error_code_5, this->stm_label?this->stm_label: this->stm_text, var_info); } otl_memcpy(c, OTL_RCAST(unsigned char*, OTL_CCAST(char*,s.c_str())), len, this->vl[cur_x]->ftype); this->vl[cur_x]->set_len(len,cur_y); } break; case otl_var_blob: case otl_var_clob: { int len=OTL_SCAST(int,s.length()); if(len>this->vl[cur_x]->actual_elem_size()){ otl_var_info_var (this->vl[cur_x]->name, this->vl[cur_x]->ftype, otl_var_char, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_5, otl_error_code_5, this->stm_label?this->stm_label: this->stm_text, var_info); } this->vl[cur_x]->set_not_null(cur_y); this->vl[cur_x]->var_struct.save_blob (OTL_RCAST(unsigned char*,OTL_CCAST(char*,s.c_str())),len,0); } break; #endif default: check_type(otl_var_char,1); } // switch check_buf(); } return *this; } #endif #if defined(OTL_UNICODE_STRING_TYPE) OTL_TMPL_OUT_STREAM& operator<<(const OTL_UNICODE_STRING_TYPE& s) { if(this->vl_len>0){ get_next(); switch(this->vl[cur_x]->ftype){ case otl_var_char: { int overflow; otl_strcpy4 (OTL_RCAST(unsigned char*,this->vl[cur_x]->val(cur_y)), OTL_RCAST(unsigned char*, OTL_CCAST(OTL_UNICODE_CHAR_TYPE*,s.c_str())), overflow, this->vl[cur_x]->elem_size, OTL_SCAST(int,s.length()) ); if(overflow){ otl_var_info_var (this->vl[cur_x]->name, this->vl[cur_x]->ftype, otl_var_char, var_info, sizeof(var_info)); in_exception_flag=1; if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_4, otl_error_code_4, this->stm_label?this->stm_label: this->stm_text, var_info); } this->vl[cur_x]->set_not_null(cur_y); break; } case otl_var_varchar_long: { unsigned char* c=OTL_RCAST(unsigned char*, this->vl[cur_x]->val(cur_y)); int len=OTL_SCAST(int,s.length()); this->vl[cur_x]->set_not_null(cur_y); if(len>this->vl[cur_x]->actual_elem_size()){ otl_var_info_var (this->vl[cur_x]->name, this->vl[cur_x]->ftype, otl_var_char, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_5, otl_error_code_5, this->stm_label?this->stm_label: this->stm_text, var_info); } otl_memcpy(c, OTL_RCAST(unsigned char*, OTL_CCAST(OTL_UNICODE_CHAR_TYPE*,s.c_str())), len, this->vl[cur_x]->ftype); this->vl[cur_x]->set_len(len,cur_y); break; } case otl_var_clob: { int len=OTL_SCAST(int,s.length()); if(len>this->vl[cur_x]->actual_elem_size()){ otl_var_info_var (this->vl[cur_x]->name, this->vl[cur_x]->ftype, otl_var_char, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_5, otl_error_code_5, this->stm_label?this->stm_label: this->stm_text, var_info); } this->vl[cur_x]->set_not_null(cur_y); this->vl[cur_x]->var_struct.save_blob (OTL_RCAST(const unsigned char*,s.c_str()), len, 0); } break; default: check_type(otl_var_char,1); } check_buf(); } return *this; } #endif OTL_TMPL_OUT_STREAM& operator<<(const char* s) { if(this->vl_len>0){ get_next(); if(check_type(otl_var_char,1)){ int overflow; otl_strcpy (OTL_RCAST(unsigned char*,this->vl[cur_x]->val(cur_y)), OTL_RCAST(unsigned char*,OTL_CCAST(char*,s)), overflow, this->vl[cur_x]->elem_size ); if(overflow){ otl_var_info_var (this->vl[cur_x]->name, this->vl[cur_x]->ftype, otl_var_char, var_info, sizeof(var_info)); in_exception_flag=1; if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_4, otl_error_code_4, this->stm_label?this->stm_label: this->stm_text, var_info); } this->vl[cur_x]->set_not_null(cur_y); } check_buf(); } return *this; } OTL_TMPL_OUT_STREAM& operator<<(const unsigned char* s) { if(this->vl_len>0){ get_next(); if(check_type(otl_var_char,1)){ int overflow; otl_strcpy4 (OTL_RCAST(unsigned char*,this->vl[cur_x]->val(cur_y)), OTL_CCAST(unsigned char*,s), overflow, this->vl[cur_x]->elem_size ); if(overflow){ otl_var_info_var (this->vl[cur_x]->name, this->vl[cur_x]->ftype, otl_var_char, var_info, sizeof(var_info)); in_exception_flag=1; if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_4, otl_error_code_4, this->stm_label?this->stm_label: this->stm_text, var_info); } this->vl[cur_x]->set_not_null(cur_y); } check_buf(); } return *this; } #define OTL_D3(T,T_type) \ OTL_TMPL_OUT_STREAM& operator<<(const T n) \ { \ if(this->vl_len>0){ \ get_next(); \ if(check_type(T_type,sizeof(T))){ \ *OTL_RCAST(T*,this->vl[cur_x]->val(cur_y))=n; \ this->vl[cur_x]->set_not_null(cur_y); \ } \ check_buf(); \ } \ return *this; \ } #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) OTL_D3(int,otl_var_int) #if defined(OTL_BIGINT) OTL_D3(OTL_BIGINT,otl_var_bigint) #endif OTL_D3(unsigned,otl_var_unsigned_int) OTL_D3(long,otl_var_long_int) OTL_D3(short,otl_var_short) OTL_D3(float,otl_var_float) OTL_D3(double,otl_var_double) #else template OTL_D3(T,T_type) #endif #if defined(OTL_PL_TAB) OTL_TMPL_OUT_STREAM& operator<<(otl_pl_tab_generic& tab) { if(this->vl_len>0){ get_next(); if(check_type(tab.vtype,tab.elem_size)){ int i,tmp_len; if(tab.len()<=this->vl[cur_x]->array_size) tmp_len=tab.len(); else tmp_len=this->vl[cur_x]->array_size; this->vl[cur_x]->set_pl_tab_len(tmp_len); if(tab.vtype==otl_var_char){ int i2; for(i2=0;i2vl[cur_x]->val(i2)), OTL_RCAST(unsigned char*,tab.val(i2)), overflow, this->vl[cur_x]->elem_size ); if(overflow){ char tmp_var_info[256]; otl_var_info_var (this->vl[cur_x]->name, this->vl[cur_x]->ftype, otl_var_char, tmp_var_info, sizeof(tmp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_4, otl_error_code_4, this->stm_label?this->stm_label: this->stm_text, tmp_var_info); } } }else if(tab.vtype==otl_var_timestamp){ otl_datetime* ext_dt=OTL_RCAST(otl_datetime*,tab.p_v); otl_oracle_date* int_dt=OTL_RCAST(otl_oracle_date*, this->vl[cur_x]->val()); int j; for(j=0;jvl[cur_x]->val()), OTL_RCAST(char*,tab.val()), tab.elem_size*tmp_len); for(i=0;ivl[cur_x]->set_null(i); else this->vl[cur_x]->set_not_null(i); } } check_buf(); } return *this; } #endif #if defined(OTL_PL_TAB) && defined(OTL_STL) OTL_TMPL_OUT_STREAM& operator<<(otl_pl_vec_generic& vec) { if(this->vl_len>0){ get_next(); if(check_type(vec.vtype,vec.elem_size)){ int i,tmp_len; if(vec.len()<=this->vl[cur_x]->array_size) tmp_len=vec.len(); else tmp_len=this->vl[cur_x]->array_size; this->vl[cur_x]->set_pl_tab_len(tmp_len); switch(vec.vtype){ case otl_var_char: int i2; for(i2=0;i2vl[cur_x]->val(i2)), OTL_RCAST(unsigned char*, OTL_CCAST(char*,(*OTL_RCAST(STD_NAMESPACE_PREFIX vector*, vec.p_v))[i2].c_str())), overflow, this->vl[cur_x]->elem_size, OTL_SCAST(int,(*OTL_RCAST(STD_NAMESPACE_PREFIX vector*, vec.p_v))[i2].length()) ); if(overflow){ char temp_var_info[256]; otl_var_info_var (this->vl[cur_x]->name, this->vl[cur_x]->ftype, otl_var_char, temp_var_info, sizeof(temp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_4, otl_error_code_4, this->stm_label?this->stm_label: this->stm_text, temp_var_info); } } break; case otl_var_timestamp: { otl_oracle_date* int_dt=OTL_RCAST(otl_oracle_date*,this->vl[cur_x]->val()); int j; otl_datetime* ext_dt; for(j=0;j*, vec.p_v))[j]); convert_date(*int_dt,*ext_dt); ++int_dt; } } break; case otl_var_int: memcpy(OTL_RCAST(char*,this->vl[cur_x]->val()), OTL_RCAST(char*, &(*OTL_RCAST(STD_NAMESPACE_PREFIX vector*,vec.p_v))[0]), sizeof(int)*tmp_len); break; case otl_var_double: memcpy(OTL_RCAST(char*,this->vl[cur_x]->val()), OTL_RCAST(char*, &(*OTL_RCAST(STD_NAMESPACE_PREFIX vector*,vec.p_v))[0]), sizeof(double)*tmp_len); break; case otl_var_float: memcpy(OTL_RCAST(char*,this->vl[cur_x]->val()), OTL_RCAST(char*, &(*OTL_RCAST(STD_NAMESPACE_PREFIX vector*,vec.p_v))[0]), sizeof(float)*tmp_len); break; case otl_var_unsigned_int: memcpy(OTL_RCAST(char*,this->vl[cur_x]->val()), OTL_RCAST(char*, &(*OTL_RCAST(STD_NAMESPACE_PREFIX vector*,vec.p_v))[0]), sizeof(unsigned)*tmp_len); break; case otl_var_short: memcpy(OTL_RCAST(char*,this->vl[cur_x]->val()), OTL_RCAST(char*, &(*OTL_RCAST(STD_NAMESPACE_PREFIX vector*,vec.p_v))[0]), sizeof(short)*tmp_len); break; case otl_var_long_int: memcpy(OTL_RCAST(char*,this->vl[cur_x]->val()), OTL_RCAST(char*, &(*OTL_RCAST(STD_NAMESPACE_PREFIX vector*,vec.p_v))[0]), sizeof(long int)*tmp_len); break; } for(i=0;ivl[cur_x]->set_null(i); else this->vl[cur_x]->set_not_null(i); } } check_buf(); } return *this; } #endif OTL_TMPL_OUT_STREAM& operator<<(const otl_null& /* n */) { if(this->vl_len>0){ get_next(); this->vl[cur_x]->set_null(cur_y); check_buf(); } return *this; } OTL_TMPL_OUT_STREAM& operator<<(const TTimestampStruct& t) { if(this->vl_len>0){ get_next(); if(check_type(otl_var_timestamp,sizeof(TTimestampStruct))){ TTimestampStruct* tm= OTL_RCAST(TTimestampStruct*,this->vl[cur_x]->val(cur_y)); this->vl[cur_x]->set_not_null(cur_y); int rc=this->vl[cur_x]->var_struct.write_dt (tm,&t,sizeof(TTimestampStruct)); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (this->adb->connect_struct, this->stm_label?this->stm_label: this->stm_text); } } check_buf(); } return *this; } OTL_TMPL_OUT_STREAM& operator<<(const otl_long_string& s) { if(this->vl_len>0){ get_next(); switch(this->vl[cur_x]->ftype){ case otl_var_varchar_long: case otl_var_raw_long: case otl_var_raw: { unsigned char* c=OTL_RCAST(unsigned char*,this->vl[cur_x]->val(cur_y)); int len=OTL_CCAST(otl_long_string*,&s)->len(); if(this->vl[cur_x]->ftype!=otl_var_raw) this->vl[cur_x]->set_not_null(cur_y); if(len>this->vl[cur_x]->actual_elem_size()){ otl_var_info_var (this->vl[cur_x]->name, this->vl[cur_x]->ftype, otl_var_long_string, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_5, otl_error_code_5, this->stm_label?this->stm_label: this->stm_text, var_info); } if((this->vl[cur_x]->var_struct.otl_adapter==otl_ora7_adapter|| this->vl[cur_x]->var_struct.otl_adapter==otl_ora8_adapter) && this->vl[cur_x]->ftype==otl_var_raw){ otl_memcpy (c+sizeof(unsigned short), s.v, len, this->vl[cur_x]->ftype); *OTL_RCAST(unsigned short*, this->vl[cur_x]->val(cur_y))=OTL_SCAST(unsigned short,len); this->vl[cur_x]->set_len(len,cur_y); }else{ otl_memcpy(c,s.v,len,this->vl[cur_x]->ftype); this->vl[cur_x]->set_len(len,cur_y); } } break; case otl_var_blob: case otl_var_clob: { int len=OTL_CCAST(otl_long_string*,&s)->len(); if(len>this->vl[cur_x]->actual_elem_size()){ otl_var_info_var (this->vl[cur_x]->name, this->vl[cur_x]->ftype, otl_var_long_string, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_5, otl_error_code_5, this->stm_label?this->stm_label: this->stm_text, var_info); } this->vl[cur_x]->set_not_null(cur_y); this->vl[cur_x]->var_struct.save_blob(s.v,len,s.extern_buffer_flag); } break; } check_buf(); } return *this; } #if defined(OTL_ORA8)||defined(OTL_ODBC) #define OTL_TMPL_CUR_DUMMY OTL_TMPL_CURSOR OTL_TMPL_OUT_STREAM& operator<< (otl_lob_stream_generic& s) { if(this->vl_len>0){ get_next(); if(((s.ora_lob&& this->vl[cur_x]->ftype==otl_var_blob)|| this->vl[cur_x]->ftype==otl_var_clob)|| (this->vl[cur_x]->ftype==otl_var_varchar_long|| this->vl[cur_x]->ftype==otl_var_raw_long)){ s.init (this->vl[cur_x], this->adb, OTL_RCAST(OTL_TMPL_CUR_DUMMY*,this), 0, otl_lob_stream_write_mode); if(!s.ora_lob) this->vl[cur_x]->set_not_null(cur_y); } check_buf(); }else{ char temp_var_info[256]; otl_var_info_var (this->vl[cur_x]->name, this->vl[cur_x]->ftype, otl_var_long_string, temp_var_info, sizeof(temp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_0, otl_error_code_0, this->stm_label?this->stm_label: this->stm_text, temp_var_info); } return *this; } #undef OTL_TMPL_CUR_DUMMY #endif otl_tmpl_out_stream(): OTL_TMPL_CURSOR(), auto_commit_flag(0), dirty(0), cur_x(0), cur_y(0), array_size(0), in_exception_flag(0), in_destruct_flag(0), should_delete_flag(0), var_info(), flush_flag(0), flush_flag2(0), lob_stream_mode(0) { } private: otl_tmpl_out_stream (const otl_tmpl_out_stream&): OTL_TMPL_CURSOR(), auto_commit_flag(0), dirty(0), cur_x(0), cur_y(0), array_size(0), in_exception_flag(0), in_destruct_flag(0), should_delete_flag(0), var_info(), flush_flag(0), flush_flag2(0), lob_stream_mode(0) { } otl_tmpl_out_stream& operator= (const otl_tmpl_out_stream&) { return *this; } }; template class otl_tmpl_inout_stream: public OTL_TMPL_OUT_STREAM{ public: otl_tmpl_variable** in_vl; int iv_len; int cur_in_x; int cur_in_y; int in_y_len; int null_fetched; otl_tmpl_variable** avl; int avl_len; char var_info[256]; void cleanup(void) {int i; for(i=0;idirty=0; this->auto_commit_flag=1; this->adb=&pdb; this->in_exception_flag=0; this->stm_text=0; this->array_size=arr_size; this->should_delete_flag=0; { size_t len=strlen(sqlstm)+1; this->stm_text=new char[len]; OTL_STRCPY_S(this->stm_text,len,sqlstm); otl_tmpl_ext_hv_decl hvd(this->stm_text,arr_size); if(hvd.has_plsql_tabs_or_refcur_ && arr_size>1){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (otl_error_msg_33, otl_error_code_33, this->stm_label?this->stm_label: this->stm_text); } if(hvd.vst[otl_tmpl_ext_hv_decl ::def]==hvd.len){ this->should_delete_flag=1; hvd.alloc_host_var_list(this->vl,this->vl_len,pdb); }else{ for(i=0;i::in) ++this->vl_len; else if(hvd.inout[i]==otl_tmpl_ext_hv_decl ::out) ++iv_len; else if(hvd.inout[i]==otl_tmpl_ext_hv_decl ::io){ ++this->vl_len; ++iv_len; } } if(this->vl_len>0){ this->vl=new otl_tmpl_variable*[this->vl_len]; } if(iv_len>0){ in_vl=new otl_tmpl_variable*[iv_len]; } if(hvd.len>0){ avl=new otl_tmpl_variable*[hvd.len]; } iv_len=0; this->vl_len=0; avl_len=hvd.len; for(j=0;j32767){ char tmp_var_info[256]; otl_var_info_var (hvd[j], otl_var_none, otl_var_none, tmp_var_info, sizeof(tmp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (otl_error_msg_6, otl_error_code_6, this->stm_label?this->stm_label: this->stm_text, tmp_var_info); } #endif otl_tmpl_variable* v=hvd.alloc_var (hvd[j], hvd.inout[j], otl_tmpl_ext_hv_decl ::def, pdb, hvd.pl_tab_size[j]); if(v==0){ int k; for(k=0;kvl_len=0; throw OTL_TMPL_EXCEPTION (otl_error_msg_12, otl_error_code_12, hvd.stm_label_?hvd.stm_label_:hvd.stm_text_, hvd[j]); } v->name_pos=j+1; avl[j]=v; if(hvd.inout[j]==otl_tmpl_ext_hv_decl ::in){ ++this->vl_len; this->vl[this->vl_len-1]=v; v->set_param_type(otl_input_param); }else if(hvd.inout[j]==otl_tmpl_ext_hv_decl ::out){ ++iv_len; in_vl[iv_len-1]=v; v->set_param_type(otl_output_param); }else if(hvd.inout[j]==otl_tmpl_ext_hv_decl ::io){ ++this->vl_len; ++iv_len; this->vl[this->vl_len-1]=v; in_vl[iv_len-1]=v; v->set_param_type(otl_inout_param); } } } } try{ this->parse(); for(i=0;ivl_len;++i){ if(this->vl[i]->var_struct.otl_adapter==otl_odbc_adapter){ this->vl[i]->var_struct.lob_stream_mode=this->lob_stream_mode; this->vl[i]->var_struct.vparam_type=this->vl[i]->param_type; if(this->vl[i]->ftype==otl_var_varchar_long|| this->vl[i]->ftype==otl_var_raw_long){ this->vl[i]->set_not_null(0); } } this->bind(*(this->vl[i])); } for(j=0;jbind(*in_vl[j]); rewind(); }catch(OTL_CONST_EXCEPTION OTL_TMPL_EXCEPTION&){ cleanup(); if(this->adb)this->adb->throw_count++; throw; } } virtual ~otl_tmpl_inout_stream() {this->in_destructor=1; if(!this->in_exception_flag) flush(); cleanup(); } int eof(void) { if(iv_len==0)return 1; if(in_y_len==0)return 1; if(cur_in_y<=in_y_len-1)return 0; return 1; } void flush(const int rowoff=0, const bool force_flush=false) { if(this->vl_len==0)return; in_y_len=this->cur_y+1; cur_in_y=0; cur_in_x=0; if(!this->in_exception_flag) OTL_TMPL_OUT_STREAM::flush(rowoff,force_flush); } void clean(const int clean_up_error_flag=0,const int rows=0) { if(this->vl_len!=0) { in_y_len=this->cur_y+1; cur_in_y=0; cur_in_x=0; } OTL_TMPL_OUT_STREAM::clean(clean_up_error_flag,rows); } void rewind(void) { flush(); cur_in_x=0; cur_in_y=0; this->cur_x=-1; this->cur_y=0; in_y_len=0; null_fetched=0; if(this->vl_len==0){ this->exec(this->array_size); in_y_len=this->array_size; cur_in_y=0; cur_in_x=0; } } int is_null(void) { return null_fetched; } void get_in_next(void) { if(iv_len==0)return; if(in_y_len==0)return; if(cur_in_xin_exception_flag=1; otl_var_info_var (in_vl[cur_in_x]->name, in_vl[cur_in_x]->ftype, type_code, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw OTL_TMPL_EXCEPTION (otl_error_msg_0, otl_error_code_0, this->stm_label?this->stm_label: this->stm_text, var_info); } int check_in_type(int type_code,int tsize) { switch(in_vl[cur_in_x]->ftype){ case otl_var_refcur: if(type_code==otl_var_refcur) return 1; case otl_var_db2time: case otl_var_db2date: if(type_code==otl_var_timestamp) return 1; case otl_var_char: if(type_code==otl_var_char) return 1; default: if(in_vl[cur_in_x]->ftype==type_code && in_vl[cur_in_x]->elem_size==tsize) return 1; } return check_in_type_throw(type_code); } int is_null_intern(void) { if(iv_len==0)return 0; if(in_y_len==0)return 0; if(in_y_len>0) return in_vl[cur_in_x]->is_null(cur_in_y); return 0; } OTL_TMPL_INOUT_STREAM& operator>>(char& c) { if(eof())return *this; if(check_in_type(otl_var_char,1)){ c=*OTL_RCAST(char*,in_vl[cur_in_x]->val(cur_in_y)); null_fetched=is_null_intern(); } get_in_next(); return *this; } OTL_TMPL_INOUT_STREAM& operator>>(unsigned char& c) { if(eof())return *this; if(check_in_type(otl_var_char,1)){ c=*OTL_RCAST(unsigned char*,in_vl[cur_in_x]->val(cur_in_y)); null_fetched=is_null_intern(); } get_in_next(); return *this; } #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) OTL_TMPL_INOUT_STREAM& operator>>(OTL_STRING_CONTAINER& s) { if(eof())return *this; switch(in_vl[cur_in_x]->ftype){ case otl_var_char: { #if defined(OTL_ACE) s.set(OTL_RCAST(char*,in_vl[cur_in_x]->val(cur_in_y)),1); #else s=OTL_RCAST(char*,in_vl[cur_in_x]->val(cur_in_y)); #endif null_fetched=is_null_intern(); } break; #if defined(USER_DEFINED_STRING_CLASS) || \ defined(OTL_STL) || defined(OTL_ACE) case otl_var_varchar_long: case otl_var_raw_long: { unsigned char* c= OTL_RCAST(unsigned char*,in_vl[cur_in_x]->val(cur_in_y)); int len=in_vl[cur_in_x]->get_len(); #if (defined(USER_DEFINED_STRING_CLASS) || defined(OTL_STL)) && !defined(OTL_ACE) s.assign(OTL_RCAST(char*,c),len); #elif defined(OTL_ACE) s.set(OTL_RCAST(char*,c),len,1); #endif null_fetched=is_null_intern(); } break; case otl_var_blob: case otl_var_clob: { int len=0; int max_long_sz=this->adb->get_max_long_size(); otl_auto_array_ptr loc_ptr(max_long_sz); unsigned char* temp_buf=loc_ptr.ptr; int rc=in_vl[cur_in_x]->var_struct.get_blob (cur_in_y, temp_buf, max_long_sz, len); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (this->adb->connect_struct, this->stm_label?this->stm_label: this->stm_text); } #if (defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS)) && !defined(OTL_ACE) s.assign(OTL_RCAST(char*,temp_buf),len); #elif defined(OTL_ACE) s.set(OTL_RCAST(char*,temp_buf),len,1); #endif null_fetched=is_null_intern(); } break; #endif default: check_in_type(otl_var_char,1); } // switch get_in_next(); return *this; } #endif OTL_TMPL_INOUT_STREAM& operator>>(char* s) { if(eof())return *this; if(check_in_type(otl_var_char,1)){ otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,in_vl[cur_in_x]->val(cur_in_y))); null_fetched=is_null_intern(); } get_in_next(); return *this; } #if defined(OTL_UNICODE_STRING_TYPE) OTL_TMPL_INOUT_STREAM& operator>>(OTL_UNICODE_STRING_TYPE& s) { if(eof())return *this; if(check_in_type(otl_var_char,1)){ #if defined(OTL_ODBC) || defined(DB2_CLI) s=OTL_RCAST(OTL_UNICODE_CHAR_TYPE*,in_vl[cur_in_x]->val(cur_in_y)); #else #if defined(OTL_UNICODE_STRING_TYPE_CAST_FROM_CHAR) OTL_UNICODE_CHAR_TYPE* temp_s=OTL_RCAST (OTL_UNICODE_CHAR_TYPE*,in_vl[cur_in_x]->val(cur_in_y)); OTL_UNICODE_STRING_TYPE_CAST_FROM_CHAR(s,temp_s+1,*temp_s); #else OTL_UNICODE_CHAR_TYPE* temp_s=OTL_RCAST (OTL_UNICODE_CHAR_TYPE*,in_vl[cur_in_x]->val(cur_in_y)); s.assign(temp_s+1,*temp_s); #endif #endif null_fetched=is_null_intern(); } get_in_next(); return *this; } #endif OTL_TMPL_INOUT_STREAM& operator>>(unsigned char* s) { if(eof())return *this; if(check_in_type(otl_var_char,1)){ otl_strcpy2(OTL_RCAST(unsigned char*,s), OTL_RCAST(unsigned char*,in_vl[cur_in_x]->val(cur_in_y)), in_vl[cur_in_x]->get_len(cur_in_y) ); null_fetched=is_null_intern(); } get_in_next(); return *this; } #define OTL_D4(T,T_type) \ OTL_TMPL_INOUT_STREAM& operator>>(T& n) \ { \ if(eof())return *this; \ if(check_in_type(T_type,sizeof(T))){ \ n=*OTL_RCAST(T*,in_vl[cur_in_x]->val(cur_in_y)); \ null_fetched=is_null_intern(); \ } \ get_in_next(); \ return *this; \ } #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) OTL_D4(int,otl_var_int) OTL_D4(unsigned,otl_var_unsigned_int) #if defined(OTL_BIGINT) OTL_D4(OTL_BIGINT,otl_var_bigint) #endif OTL_D4(long,otl_var_long_int) OTL_D4(short,otl_var_short) OTL_D4(float,otl_var_float) OTL_D4(double,otl_var_double) #else template OTL_D4(T,T_type) #endif #if defined(OTL_PL_TAB) OTL_TMPL_INOUT_STREAM& operator>>(otl_pl_tab_generic& tab) { if(eof())return *this; if(check_in_type(tab.vtype,tab.elem_size)){ int i,tmp_len; tmp_len=in_vl[cur_in_x]->get_pl_tab_len(); if(tab.tab_sizeval(i)), in_vl[cur_in_x]->get_len(i), overflow, tab.elem_size ); } }else if(tab.vtype==otl_var_timestamp){ otl_datetime* ext_dt=OTL_RCAST(otl_datetime*,tab.p_v); otl_oracle_date* int_dt= OTL_RCAST(otl_oracle_date*,in_vl[cur_in_x]->val()); int j; for(j=0;jval()), tab.elem_size*tmp_len); for(i=0;iis_null(i)) tab.set_null(i); else tab.set_non_null(i); } null_fetched=0; } get_in_next(); return *this; } #endif #if defined(OTL_PL_TAB) && defined(OTL_STL) OTL_TMPL_INOUT_STREAM& operator>>(otl_pl_vec_generic& vec) { if(eof())return *this; if(check_in_type(vec.vtype,vec.elem_size)){ int i,tmp_len; tmp_len=in_vl[cur_in_x]->get_pl_tab_len(); vec.set_len(tmp_len); if(tmp_len>0){ switch(vec.vtype){ case otl_var_char: for(i=0;i*,vec.p_v))[i]= OTL_RCAST(char*,in_vl[cur_in_x]->val(i)); } break; case otl_var_timestamp: { otl_datetime* ext_dt; otl_oracle_date* int_dt= OTL_RCAST(otl_oracle_date*,in_vl[cur_in_x]->val()); int j; for(j=0;j*,vec.p_v))[j]); convert_date(*ext_dt,*int_dt); ++int_dt; } } break; case otl_var_int: memcpy(OTL_RCAST(char*, &(*OTL_RCAST(STD_NAMESPACE_PREFIX vector*,vec.p_v))[0]), OTL_RCAST(char*,in_vl[cur_in_x]->val()), sizeof(int)*tmp_len); break; case otl_var_double: memcpy(OTL_RCAST(char*, &(*OTL_RCAST(STD_NAMESPACE_PREFIX vector*,vec.p_v))[0]), OTL_RCAST(char*,in_vl[cur_in_x]->val()), sizeof(double)*tmp_len); break; case otl_var_float: memcpy(OTL_RCAST(char*, &(*OTL_RCAST(STD_NAMESPACE_PREFIX vector*,vec.p_v))[0]), OTL_RCAST(char*,in_vl[cur_in_x]->val()), sizeof(float)*tmp_len); break; case otl_var_unsigned_int: memcpy(OTL_RCAST(char*, &(*OTL_RCAST(STD_NAMESPACE_PREFIX vector*,vec.p_v))[0]), OTL_RCAST(char*,in_vl[cur_in_x]->val()), sizeof(unsigned)*tmp_len); break; case otl_var_short: memcpy(OTL_RCAST(char*, &(*OTL_RCAST(STD_NAMESPACE_PREFIX vector*,vec.p_v))[0]), OTL_RCAST(char*,in_vl[cur_in_x]->val()), sizeof(short)*tmp_len); break; case otl_var_long_int: memcpy(OTL_RCAST(char*, &(*OTL_RCAST(STD_NAMESPACE_PREFIX vector*,vec.p_v))[0]), OTL_RCAST(char*,in_vl[cur_in_x]->val()), sizeof(long int)*tmp_len); break; } } for(i=0;iis_null(i)) vec.set_null(i); else vec.set_non_null(i); } null_fetched=0; } get_in_next(); return *this; } #endif OTL_TMPL_INOUT_STREAM& operator>>(TTimestampStruct& t) { if(eof())return *this; if(check_in_type(otl_var_timestamp,sizeof(TTimestampStruct))){ TTimestampStruct* tm= OTL_RCAST(TTimestampStruct*,in_vl[cur_in_x]->val(cur_in_y)); int rc=in_vl[cur_in_x]->var_struct.read_dt (&t,tm,sizeof(TTimestampStruct)); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (this->adb->connect_struct, this->stm_label?this->stm_label: this->stm_text); } null_fetched=is_null_intern(); } get_in_next(); return *this; } OTL_TMPL_INOUT_STREAM& operator>>(otl_long_string& s) { int len=0; if(eof())return *this; switch(in_vl[cur_in_x]->ftype){ case otl_var_raw: case otl_var_varchar_long: case otl_var_raw_long: { unsigned char* c=OTL_RCAST(unsigned char*,in_vl[cur_in_x]->val(cur_in_y)); len=in_vl[cur_in_x]->get_len(); if(len>s.buf_size)len=s.buf_size; otl_memcpy(s.v,c,len,in_vl[cur_in_x]->ftype); s.set_len(len); if(in_vl[cur_in_x]->ftype==otl_var_varchar_long) s.null_terminate_string(len); null_fetched=is_null_intern(); } break; case otl_var_clob: case otl_var_blob: { int rc=in_vl[cur_in_x]->var_struct.get_blob(cur_in_y,s.v,s.buf_size,len); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (this->adb->connect_struct, this->stm_label?this->stm_label: this->stm_text); } if(len>s.buf_size)len=s.buf_size; s.set_len(len); if(in_vl[cur_in_x]->ftype==otl_var_clob) s.null_terminate_string(len); null_fetched=is_null_intern(); } break; default: { char temp_var_info[256]; otl_var_info_var (in_vl[cur_in_x]->name, in_vl[cur_in_x]->ftype, otl_var_long_string, temp_var_info, sizeof(temp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_0, otl_error_code_0, this->stm_label?this->stm_label: this->stm_text, temp_var_info); } } get_in_next(); return *this; } #if defined(OTL_ORA8)||defined(OTL_ODBC) OTL_TMPL_INOUT_STREAM& operator>> (otl_lob_stream_generic& s) { if(eof())return *this; if((s.ora_lob&& in_vl[cur_in_x]->ftype==otl_var_clob)|| in_vl[cur_in_x]->ftype==otl_var_blob){ null_fetched=is_null_intern(); s.init (OTL_RCAST(void*,in_vl[cur_in_x]), OTL_RCAST(void*,this->adb), OTL_RCAST(void*,this), 0, otl_lob_stream_read_mode, this->is_null()); }else if(in_vl[cur_in_x]->ftype==otl_var_varchar_long|| in_vl[cur_in_x]->ftype==otl_var_raw_long){ s.init (OTL_RCAST(void*,in_vl[cur_in_x]), OTL_RCAST(void*,this->adb), OTL_RCAST(void*,this), 0, otl_lob_stream_read_mode); }else{ char tmp_var_info[256]; otl_var_info_var (in_vl[cur_in_x]->name, in_vl[cur_in_x]->ftype, otl_var_long_string, tmp_var_info, sizeof(tmp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_0, otl_error_code_0, this->stm_label?this->stm_label: this->stm_text, tmp_var_info); } get_in_next(); return *this; } #endif otl_tmpl_inout_stream(): OTL_TMPL_OUT_STREAM(), in_vl(0), iv_len(0), cur_in_x(0), cur_in_y(0), in_y_len(0), null_fetched(0), avl(0), avl_len(0), var_info() { } private: otl_tmpl_inout_stream (const otl_tmpl_inout_stream&): OTL_TMPL_OUT_STREAM(), in_vl(0), iv_len(0), cur_in_x(0), cur_in_y(0), in_y_len(0), null_fetched(0), avl(0), avl_len(0), var_info() { } otl_tmpl_inout_stream& operator=(const otl_tmpl_inout_stream&) { return *this; } }; // ==================== OTL-Adapter for ODBC/CLI ========================= #if defined(OTL_ODBC) #if !defined(OTL_DB2_CLI) && !defined(OTL_ODBC_zOS) // in case if it's ODBC for Windows (!OTL_ODBC_UNIX), and windows.h is // not included yet (_WINDOWS_ not defined yet), then include the file // explicitly #if !defined(OTL_ODBC_UNIX) && !defined(_WINDOWS_) #include #endif #if defined(OTL_ODBC_UNIX) && defined(OTL_INFORMIX_CLI) #include #define OTL_HENV SQLHANDLE #define OTL_HDBC SQLHANDLE #define OTL_SQLHANDLE SQLHANDLE #define OTL_SQLRETURN SQLRETURN #define OTL_SQLSMALLINT SQLSMALLINT #define OTL_SQLCHAR_PTR SQLCHAR* #define OTL_SQLINTEGER_PTR SQLINTEGER* #define OTL_SQLSMALLINT_PTR SQLSMALLINT* #define OTL_SQLINTEGER SQLINTEGER #define OTL_SQLHSTMT SQLHSTMT #define OTL_SQLUSMALLINT SQLUSMALLINT #define OTL_SQLPOINTER SQLPOINTER #define OTL_SQLCHAR SQLCHAR #define OTL_SQLUINTEGER SQLUINTEGER #define OTL_SQLLEN SQLINTEGER #define OTL_SQLLEN_PTR SQLINTEGER* #define OTL_SQLULEN SQLUINTEGER #define OTL_SQLULEN_PTR SQLUINTEGER* #else #include #include #endif #else #include #endif #if defined(OTL_ODBC) && !defined(OTL_DB2_CLI) #define OTL_SQL_XML (-152) #endif #if defined(OTL_ODBC) && defined(OTL_DB2_CLI) #if defined(SQL_XML) #define OTL_SQL_XML SQL_XML #else #define OTL_SQL_XML (-370) #endif #endif #if defined(OTL_ODBC) #if (ODBCVER >= 0x0300) #define OTL_SQL_TIMESTAMP_STRUCT SQL_TIMESTAMP_STRUCT #define OTL_SQL_TIME_STRUCT SQL_TIME_STRUCT #define OTL_SQL_DATE_STRUCT SQL_DATE_STRUCT #else #define OTL_SQL_TIMESTAMP_STRUCT TIMESTAMP_STRUCT #define OTL_SQL_TIME_STRUCT TIME_STRUCT #define OTL_SQL_DATE_STRUCT DATE_STRUCT #endif #if defined(OTL_DB2_CLI) #define OTL_HENV SQLHANDLE #define OTL_HDBC SQLHANDLE #define OTL_SQLHANDLE SQLHANDLE #define OTL_SQLRETURN SQLRETURN #define OTL_SQLSMALLINT SQLSMALLINT #define OTL_SQLCHAR_PTR SQLCHAR* #define OTL_SQLINTEGER_PTR SQLINTEGER* #define OTL_SQLSMALLINT_PTR SQLSMALLINT* #define OTL_SQLINTEGER SQLINTEGER #define OTL_SQLHSTMT SQLHSTMT #define OTL_SQLUSMALLINT SQLUSMALLINT #define OTL_SQLPOINTER SQLPOINTER #define OTL_SQLCHAR SQLCHAR #define OTL_SQLUINTEGER SQLUINTEGER #if defined(OTL_IODBC_BSD) #define OTL_SQLLEN SQLLEN #define OTL_SQLULEN SQLULEN #define OTL_SQLULEN_PTR SQLULEN* #define OTL_SQLLEN_PTR SQLLEN* #else // #if defined(OTL_IODBC_BSD) #define OTL_SQLLEN SQLINTEGER #define OTL_SQLLEN_PTR SQLINTEGER* #define OTL_SQLULEN SQLUINTEGER #define OTL_SQLULEN_PTR SQLUINTEGER* #endif // #if defined(OTL_IODBC_BSD) #else // #if defined(OTL_DB2_CLI) #if (ODBCVER >= 0x0300) #define OTL_HENV SQLHANDLE #define OTL_HDBC SQLHANDLE #define OTL_SQLHANDLE SQLHANDLE #define OTL_SQLRETURN SQLRETURN #define OTL_SQLSMALLINT SQLSMALLINT #define OTL_SQLCHAR_PTR SQLCHAR* #define OTL_SQLINTEGER_PTR SQLINTEGER* #define OTL_SQLSMALLINT_PTR SQLSMALLINT* #define OTL_SQLINTEGER SQLINTEGER #define OTL_SQLHSTMT SQLHSTMT #define OTL_SQLUSMALLINT SQLUSMALLINT #define OTL_SQLPOINTER SQLPOINTER #define OTL_SQLCHAR SQLCHAR #define OTL_SQLUINTEGER SQLUINTEGER #if defined(OTL_IODBC_BSD) #define OTL_SQLLEN SQLLEN #define OTL_SQLLEN_PTR SQLLEN* #define OTL_SQLULEN SQLULEN #define OTL_SQLULEN_PTR SQLULEN* #else // #if defined(OTL_IODBC_BSD) #if (defined(_MSC_VER)&&(_MSC_VER==1200)) // VC 6++ #define OTL_SQLLEN SQLINTEGER #define OTL_SQLLEN_PTR SQLINTEGER* #define OTL_SQLULEN SQLUINTEGER #define OTL_SQLULEN_PTR SQLUINTEGER* #else #if !defined(OTL_SQLLEN) #define OTL_SQLLEN SQLLEN #define OTL_SQLLEN_PTR SQLLEN* #define OTL_SQLULEN SQLULEN #define OTL_SQLULEN_PTR SQLULEN* #endif #endif #endif // #if defined(OTL_IODBC_BSD) #else // #if (ODBCVER >= 0x0300) #define OTL_HENV HENV #define OTL_HDBC HDBC #define OTL_SQLHANDLE HSTMT #define OTL_SQLRETURN SQLRETURN #define OTL_SQLSMALLINT SQLSMALLINT #define OTL_SQLCHAR_PTR SQLCHAR* #define OTL_SQLINTEGER_PTR SQLINTEGER* #define OTL_SQLSMALLINT_PTR SQLSMALLINT* #define OTL_SQLINTEGER SQLINTEGER #define OTL_SQLHSTMT SQLHSTMT #define OTL_SQLUSMALLINT SQLUSMALLINT #define OTL_SQLPOINTER SQLPOINTER #define OTL_SQLCHAR SQLCHAR #define OTL_SQLUINTEGER SQLUINTEGER #if defined(OTL_IODBC_BSD) #define OTL_SQLLEN SQLLEN #define OTL_SQLLEN_PTR SQLLEN* #define OTL_SQLULEN SQLULEN #define OTL_SQLULEN_PTR SQLULEN* #else // #if defined(OTL_IODBC_BSD) #if (defined(_MSC_VER)&&(_MSC_VER==1200)) // VC 6++ #define OTL_SQLLEN SQLINTEGER #define OTL_SQLLEN_PTR SQLINTEGER* #define OTL_SQLULEN SQLUINTEGER #define OTL_SQLULEN_PTR SQLUINTEGER* #else #define OTL_SQLLEN SQLLEN #define OTL_SQLLEN_PTR SQLLEN* #define OTL_SQLULEN SQLULEN #define OTL_SQLULEN_PTR SQLULEN* #endif #endif // #if defined(OTL_IODBC_BSD) #endif #endif #endif OTL_ODBC_NAMESPACE_BEGIN #if (defined(UNICODE) || defined(_UNICODE)) && defined(OTL_ODBC) inline void otl_convert_char_to_SQLWCHAR(SQLWCHAR* dst, const unsigned char* src) { while(*src) *dst++=OTL_SCAST(SQLWCHAR,*src++); *dst=0; } inline void otl_convert_SQLWCHAR_to_char(unsigned char* dst, const SQLWCHAR*src) { while(*src) *dst++=OTL_SCAST(unsigned char,*src++); *dst=0; } inline size_t otl_strlen(const SQLWCHAR* s) { size_t len=0; while(*s){ ++s; ++len; } return len; } #endif typedef OTL_SQL_TIMESTAMP_STRUCT otl_time; const int otl_odbc_date_prec=23; const int otl_odbc_date_scale=0; const int OTL_MAX_MSG_ARR=512; class otl_exc{ public: #if defined(OTL_UNICODE_EXCEPTION_AND_RLOGON) SQLWCHAR msg[1000]; SQLWCHAR sqlstate[1000]; #else unsigned char msg[1000]; unsigned char sqlstate[1000]; #endif int code; #if defined(OTL_EXTENDED_EXCEPTION) #if defined(OTL_UNICODE_EXCEPTION_AND_RLOGON) SQLWCHAR** msg_arr; SQLWCHAR** sqlstate_arr; #else char** msg_arr; char** sqlstate_arr; #endif int* code_arr; int arr_len; #endif enum{disabled=0,enabled=1}; otl_exc(): msg(), sqlstate(), code(0) #if defined(OTL_EXTENDED_EXCEPTION) #if defined(OTL_UNICODE_EXCEPTION_AND_RLOGON) ,msg_arr(0), sqlstate_arr(0), #else ,msg_arr(0), sqlstate_arr(0), #endif code_arr(0), arr_len(0) #endif { sqlstate[0]=0; msg[0]=0; } #if defined(OTL_EXTENDED_EXCEPTION) otl_exc(const otl_exc& ex): #if defined(OTL_UNICODE_EXCEPTION_AND_RLOGON) msg(), sqlstate(), #else msg(), sqlstate(), #endif code(0), #if defined(OTL_EXTENDED_EXCEPTION) #if defined(OTL_UNICODE_EXCEPTION_AND_RLOGON) msg_arr(0), sqlstate_arr(0), #else msg_arr(0), sqlstate_arr(0), #endif code_arr(0), arr_len(0) #endif { #if defined(OTL_UNICODE_EXCEPTION_AND_RLOGON) otl_strcpy(OTL_RCAST(unsigned char*,msg), OTL_RCAST(const unsigned char*, OTL_CCAST(SQLWCHAR*,ex.msg))); otl_strcpy(OTL_RCAST(unsigned char*, OTL_CCAST(SQLWCHAR*,sqlstate)), OTL_RCAST(const unsigned char*, OTL_CCAST(SQLWCHAR*,ex.sqlstate))); code=ex.code; arr_len=0; msg_arr=0; sqlstate_arr=0; code_arr=0; if(ex.arr_len>0){ sqlstate_arr=new SQLWCHAR*[ex.arr_len]; msg_arr=new SQLWCHAR*[ex.arr_len]; code_arr=new int[ex.arr_len]; int i; size_t msg_len, sqlstate_len; for(i=0;i0){ sqlstate_arr=new char*[ex.arr_len]; msg_arr=new char*[ex.arr_len]; code_arr=new int[ex.arr_len]; int i; size_t msg_len, sqlstate_len; for(i=0;i0){ for(i=0;i= 0x0300) #if defined(OTL_EXTENDED_EXCEPTION) inline void otl_fill_exception( otl_exc& exception_struct, OTL_SQLHANDLE handle, OTL_SQLSMALLINT htype ) { #if defined(OTL_UNICODE_EXCEPTION_AND_RLOGON) OTL_SQLRETURN rc; OTL_SQLSMALLINT msg_len=0; SQLWCHAR* tmp_msg_arr[OTL_MAX_MSG_ARR]; SQLWCHAR* tmp_sqlstate_arr[OTL_MAX_MSG_ARR]; int tmp_code_arr[OTL_MAX_MSG_ARR]; int tmp_arr_len=0; OTL_SQLSMALLINT tmp_msg_len=0; OTL_SQLSMALLINT tmp_sqlstate_len=0; int tmp_code; SQLWCHAR tmp_msg[SQL_MAX_MESSAGE_LENGTH]; SQLWCHAR tmp_sqlstate[1000]; otl_strcpy(OTL_RCAST(unsigned char*,tmp_msg), OTL_RCAST(const unsigned char*, OTL_CCAST(SQLWCHAR*,exception_struct.msg))); otl_strcpy(OTL_RCAST(unsigned char*,tmp_sqlstate), OTL_RCAST(const unsigned char*, OTL_CCAST(SQLWCHAR*,exception_struct.sqlstate))); tmp_code=exception_struct.code; do{ tmp_sqlstate_len=OTL_SCAST(OTL_SQLSMALLINT,otl_strlen(tmp_sqlstate)); tmp_msg_len=OTL_SCAST(OTL_SQLSMALLINT,otl_strlen(tmp_msg)); ++tmp_arr_len; tmp_msg_arr[tmp_arr_len-1]=new SQLWCHAR[tmp_msg_len+1]; tmp_sqlstate_arr[tmp_arr_len-1]=new SQLWCHAR[tmp_sqlstate_len+1]; otl_strcpy(OTL_RCAST(unsigned char*,tmp_msg_arr[tmp_arr_len-1]), OTL_RCAST(const unsigned char*, OTL_CCAST(SQLWCHAR*,tmp_msg))); otl_strcpy(OTL_RCAST(unsigned char*,tmp_sqlstate_arr[tmp_arr_len-1]), OTL_RCAST(const unsigned char*, OTL_CCAST(SQLWCHAR*,tmp_sqlstate))); tmp_code_arr[tmp_arr_len-1]=tmp_code; rc=SQLGetDiagRec (htype, handle, OTL_SCAST(OTL_SQLSMALLINT,tmp_arr_len+1), OTL_RCAST(SQLWCHAR*,tmp_sqlstate), OTL_RCAST(OTL_SQLINTEGER_PTR,&tmp_code), OTL_RCAST(SQLWCHAR*,tmp_msg), SQL_MAX_MESSAGE_LENGTH-1, OTL_RCAST(OTL_SQLSMALLINT_PTR,&msg_len)); tmp_msg[msg_len]=0; if((rc==SQL_NO_DATA||rc==SQL_INVALID_HANDLE|| rc==SQL_ERROR)&&tmp_arr_len==1){ int i; for(i=0;i0){ status=SQLSetConnectAttr (hdbc, SQL_ATTR_LOGIN_TIMEOUT, OTL_RCAST(void*,OTL_SCAST(size_t,timeout)), 0); if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO)return 0; } #if defined(OTL_DB2_CLI) status=SQLSetConnectAttr (hdbc, SQL_ATTR_LONGDATA_COMPAT, OTL_RCAST(SQLPOINTER,SQL_LD_COMPAT_YES), SQL_IS_INTEGER); if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO)return 0; #endif status=SQLConnect (hdbc, OTL_CCAST(SQLWCHAR*,tnsname),SQL_NTS, OTL_CCAST(SQLWCHAR*,username),SQL_NTS, OTL_CCAST(SQLWCHAR*,passwd),SQL_NTS); if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO) return 0; else return 1; } #endif int ext_logon(OTL_HENV ahenv, OTL_HDBC ahdbc, const int #ifndef OTL_ODBC_MYSQL auto_commit #endif ) { if(!extern_lda){ #if (ODBCVER >= 0x0300) if(hdbc!=0){ status=SQLFreeHandle(SQL_HANDLE_DBC,hdbc); } #else if(hdbc!=0) status=SQLFreeConnect(hdbc); #endif hdbc=0; #if (ODBCVER >= 0x0300) if(henv!=0){ status=SQLFreeHandle(SQL_HANDLE_ENV,henv); } #else if(henv!=0) status=SQLFreeEnv(henv); #endif henv=0; } extern_lda=true; henv=ahenv; hdbc=ahdbc; #ifndef OTL_ODBC_MYSQL #if (ODBCVER >= 0x0300) if(auto_commit) status=SQLSetConnectAttr (hdbc, SQL_ATTR_AUTOCOMMIT, OTL_RCAST(SQLPOINTER,SQL_AUTOCOMMIT_ON), SQL_IS_POINTER); else status=SQLSetConnectAttr (hdbc, SQL_ATTR_AUTOCOMMIT, OTL_RCAST(SQLPOINTER,SQL_AUTOCOMMIT_OFF), SQL_IS_POINTER); #else if(auto_commit) status=SQLSetConnectOption(hdbc,SQL_AUTOCOMMIT,1); else status=SQLSetConnectOption(hdbc,SQL_AUTOCOMMIT,0); #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO)return 0; #endif #if defined(OTL_DB2_CLI) status=SQLSetConnectAttr (hdbc, SQL_ATTR_LONGDATA_COMPAT, OTL_RCAST(SQLPOINTER,SQL_LD_COMPAT_YES), SQL_IS_INTEGER); if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO)return 0; #endif return 1; } virtual ~otl_conn() { if(extern_lda){ hdbc=0; henv=0; extern_lda=false; }else{ #if (ODBCVER >= 0x0300) if(hdbc!=0){ status=SQLFreeHandle(SQL_HANDLE_DBC,hdbc); } #else if(hdbc!=0) status=SQLFreeConnect(hdbc); #endif hdbc=0; #if (ODBCVER >= 0x0300) if(henv!=0){ status=SQLFreeHandle(SQL_HANDLE_ENV,henv); } #else if(henv!=0) status=SQLFreeEnv(henv); #endif henv=0; } } void set_timeout(const int atimeout=0) { timeout=atimeout; } void set_cursor_type(const int acursor_type=0) { cursor_type=acursor_type; } int rlogon(const char* connect_str, const int #ifndef OTL_ODBC_MYSQL auto_commit #endif ) { char username[256]; char passwd[256]; char tnsname[1024]; char* tnsname_ptr=0; char* c=OTL_CCAST(char*,connect_str); char* username_ptr=username; char* passwd_ptr=passwd; char temp_connect_str[512]; if(extern_lda){ extern_lda=false; henv=0; hdbc=0; } memset(username,0,sizeof(username)); memset(passwd,0,sizeof(passwd)); memset(tnsname,0,sizeof(tnsname)); char* c1=OTL_CCAST(char*,connect_str); int oracle_format=0; char prev_c=' '; while(*c1){ if(*c1=='@' && prev_c!='\\'){ oracle_format=1; break; } prev_c=*c1; ++c1; } if(oracle_format){ while(*c && *c!='/' && (OTL_SCAST(unsigned,username_ptr-username)< sizeof(username)-1)){ *username_ptr=*c; ++c; ++username_ptr; } *username_ptr=0; if(*c=='/')++c; prev_c=' '; while(*c && !(*c=='@' && prev_c!='\\') && (OTL_SCAST(unsigned,passwd_ptr-passwd)= 0x0300) status=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv); #else status=SQLAllocEnv(&henv); #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO)return 0; #if (ODBCVER >= 0x0300) status=SQLSetEnvAttr (henv, SQL_ATTR_ODBC_VERSION, OTL_RCAST(void*,SQL_OV_ODBC3), SQL_NTS); if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO)return 0; #endif #if (ODBCVER >= 0x0300) status=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc); #else status=SQLAllocConnect(henv, &hdbc); #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO)return 0; } #ifndef OTL_ODBC_MYSQL #if (ODBCVER >= 0x0300) if(auto_commit) status=SQLSetConnectAttr (hdbc, SQL_ATTR_AUTOCOMMIT, OTL_RCAST(SQLPOINTER,SQL_AUTOCOMMIT_ON), SQL_IS_POINTER); else status=SQLSetConnectAttr (hdbc, SQL_ATTR_AUTOCOMMIT, OTL_RCAST(SQLPOINTER,SQL_AUTOCOMMIT_OFF), SQL_IS_POINTER); #else if(auto_commit) status=SQLSetConnectOption(hdbc,SQL_AUTOCOMMIT,1); else status=SQLSetConnectOption(hdbc,SQL_AUTOCOMMIT,0); #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO)return 0; #endif #if (ODBCVER >= 0x0300) if(timeout>0) status=SQLSetConnectAttr (hdbc, SQL_ATTR_LOGIN_TIMEOUT, OTL_RCAST(void*,OTL_SCAST(size_t,timeout)), 0); #else if (timeout>0) status=SQLSetConnectOption(hdbc,SQL_LOGIN_TIMEOUT,timeout); #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO)return 0; #if defined(OTL_DB2_CLI) status=SQLSetConnectAttr (hdbc, SQL_ATTR_LONGDATA_COMPAT, OTL_RCAST(SQLPOINTER,SQL_LD_COMPAT_YES), SQL_IS_INTEGER); if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO)return 0; #endif if(oracle_format){ #if defined(OTL_ODBC_zOS) if(tnsname[0]==0 && username[0]==0 && passwd[0]==0){ status=SQLConnect (hdbc, 0L,SQL_NTS, 0L,SQL_NTS, 0L,SQL_NTS); logoff_commit = false; }else status=SQLConnect (hdbc, OTL_RCAST(unsigned char*,tnsname),SQL_NTS, OTL_RCAST(unsigned char*,username),SQL_NTS, OTL_RCAST(unsigned char*,passwd),SQL_NTS); #else #if defined(UNICODE) || defined(_UNICODE) { SQLWCHAR* temp_tnsname=new SQLWCHAR[strlen(tnsname)+1]; SQLWCHAR* temp_username=new SQLWCHAR[strlen(username)+1]; SQLWCHAR* temp_passwd=new SQLWCHAR[strlen(passwd)+1]; otl_convert_char_to_SQLWCHAR(temp_tnsname,OTL_RCAST(unsigned char*,tnsname)); otl_convert_char_to_SQLWCHAR(temp_username,OTL_RCAST(unsigned char*,username)); otl_convert_char_to_SQLWCHAR(temp_passwd,OTL_RCAST(unsigned char*,passwd)); status=SQLConnect (hdbc, temp_tnsname,SQL_NTS, temp_username,SQL_NTS, temp_passwd,SQL_NTS); delete[] temp_tnsname; delete[] temp_username; delete[] temp_passwd; } #else status=SQLConnect (hdbc, OTL_RCAST(unsigned char*,tnsname),SQL_NTS, OTL_RCAST(unsigned char*,username),SQL_NTS, OTL_RCAST(unsigned char*,passwd),SQL_NTS); #endif #endif }else{ char* tc2=temp_connect_str; const char* tc1=connect_str; prev_c=' '; while(*tc1 && (OTL_SCAST(unsigned,tc2-temp_connect_str)< sizeof(temp_connect_str)-1)){ if(*tc1=='@' && prev_c=='\\') --tc2; *tc2=*tc1; prev_c=*tc1; ++tc1; ++tc2; } *tc2=0; SQLSMALLINT out_len=0; #if (defined(UNICODE)||defined(_UNICODE)) { size_t len=strlen(temp_connect_str); SQLWCHAR* temp_connect_str2=new SQLWCHAR[len+1]; SQLWCHAR out_str[2048]; otl_convert_char_to_SQLWCHAR(temp_connect_str2,OTL_RCAST(unsigned char*,temp_connect_str)); status=SQLDriverConnect (hdbc, 0, temp_connect_str2, OTL_SCAST(short,len), out_str, sizeof(out_str)/sizeof(SQLWCHAR), &out_len, SQL_DRIVER_NOPROMPT); delete[] temp_connect_str2; } #else SQLCHAR out_str[2048]; status=SQLDriverConnect (hdbc, 0, OTL_RCAST(SQLCHAR*,OTL_CCAST(char*,temp_connect_str)), OTL_SCAST(short,strlen(temp_connect_str)), out_str, sizeof(out_str), &out_len, SQL_DRIVER_NOPROMPT); #endif } if(status == SQL_SUCCESS_WITH_INFO || status == SQL_SUCCESS) return 1; else return 0; } int set_transaction_isolation_level (const long int #ifndef OTL_ODBC_MYSQL level #endif ) { #ifndef OTL_ODBC_MYSQL #if (ODBCVER >= 0x0300) status=SQLSetConnectAttr (hdbc, SQL_ATTR_TXN_ISOLATION, OTL_RCAST(SQLPOINTER,OTL_SCAST(size_t,level)), SQL_IS_POINTER); #else status=SQLSetConnectOption(hdbc,SQL_TXN_ISOLATION,level); #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO) return 0; else return 1; #else return 1; #endif } int auto_commit_on(void) { #if defined(OTL_ODBC_MYSQL) return 1; #else #if (ODBCVER >= 0x0300) status=SQLSetConnectAttr (hdbc, SQL_ATTR_AUTOCOMMIT, OTL_RCAST(SQLPOINTER,SQL_AUTOCOMMIT_ON), SQL_IS_POINTER); #else status=SQLSetConnectOption(hdbc,SQL_AUTOCOMMIT,1); #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO) return 0; else return 1; #endif } int auto_commit_off(void) { #if defined(OTL_ODBC_MYSQL) return 1; #else #if (ODBCVER >= 0x0300) status=SQLSetConnectAttr (hdbc, SQL_ATTR_AUTOCOMMIT, OTL_RCAST(SQLPOINTER,SQL_AUTOCOMMIT_OFF), SQL_IS_POINTER); #else status=SQLSetConnectOption(hdbc,SQL_AUTOCOMMIT,0); #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO) return 0; else return 1; #endif } int logoff(void) { if(extern_lda){ extern_lda=false; henv=0; hdbc=0; return 1; }else{ #if defined(OTL_ODBC_zOS) if(logoff_commit) commit(); #else commit(); #endif status=SQLDisconnect(hdbc); if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO) return 0; else return 1; } } void error(otl_exc& exception_struct) {OTL_SQLRETURN rc; OTL_SQLSMALLINT msg_len=0; #if (ODBCVER >= 0x0300) #if (defined(UNICODE)||defined(_UNICODE)) #if defined(OTL_UNICODE_EXCEPTION_AND_RLOGON) rc=SQLGetDiagRec #if defined(OTL_ODBC_zOS) (hdbc==0?SQL_HANDLE_ENV:SQL_HANDLE_DBC, hdbc==0?henv:hdbc, #else (SQL_HANDLE_DBC, hdbc, #endif 1, &exception_struct.sqlstate[0], OTL_RCAST(OTL_SQLINTEGER_PTR,&exception_struct.code), &exception_struct.msg[0], SQL_MAX_MESSAGE_LENGTH-1, OTL_RCAST(OTL_SQLSMALLINT_PTR,&msg_len)); exception_struct.msg[msg_len]=0; #else { SQLWCHAR temp_msg[SQL_MAX_MESSAGE_LENGTH]; SQLWCHAR temp_sqlstate[1000]; rc=SQLGetDiagRec #if defined(OTL_ODBC_zOS) (hdbc==0?SQL_HANDLE_ENV:SQL_HANDLE_DBC, hdbc==0?henv:hdbc, #else (SQL_HANDLE_DBC, hdbc, #endif 1, temp_sqlstate, OTL_RCAST(OTL_SQLINTEGER_PTR,&exception_struct.code), temp_msg, SQL_MAX_MESSAGE_LENGTH-1, OTL_RCAST(OTL_SQLSMALLINT_PTR,&msg_len)); temp_msg[msg_len]=0; otl_convert_SQLWCHAR_to_char (OTL_RCAST(unsigned char*,&exception_struct.sqlstate[0]), temp_sqlstate); otl_convert_SQLWCHAR_to_char (OTL_RCAST(unsigned char*,&exception_struct.msg[0]), temp_msg); } #endif #else void* temp_ptr=&exception_struct.code; rc=SQLGetDiagRec #if defined(OTL_ODBC_zOS) (hdbc==0?SQL_HANDLE_ENV:SQL_HANDLE_DBC, hdbc==0?henv:hdbc, #else (SQL_HANDLE_DBC, hdbc, #endif 1, OTL_RCAST(OTL_SQLCHAR_PTR,&exception_struct.sqlstate[0]), OTL_RCAST(OTL_SQLINTEGER_PTR,temp_ptr), OTL_RCAST(OTL_SQLCHAR_PTR,&exception_struct.msg[0]), SQL_MAX_MESSAGE_LENGTH-1, OTL_RCAST(OTL_SQLSMALLINT_PTR,&msg_len)); #endif #else rc=SQLError(henv, hdbc, 0, // hstmt OTL_RCAST(OTL_SQLCHAR_PTR,&exception_struct.sqlstate[0]), OTL_RCAST(OTL_SQLINTEGER_PTR,&exception_struct.code), OTL_RCAST(OTL_SQLCHAR_PTR,&exception_struct.msg[0]), SQL_MAX_MESSAGE_LENGTH-1, OTL_RCAST(OTL_SQLSMALLINT_PTR,&msg_len)); #endif exception_struct.msg[msg_len]=0; if(rc==SQL_INVALID_HANDLE||rc==SQL_ERROR) exception_struct.msg[0]=0; #if (ODBCVER >= 0x0300) #if defined(OTL_EXTENDED_EXCEPTION) else if(rc!=SQL_NO_DATA) #if defined(OTL_ODBC_zOS) { if(hdbc) otl_fill_exception(exception_struct,hdbc,SQL_HANDLE_DBC); else otl_fill_exception(exception_struct,henv,SQL_HANDLE_ENV); } #else otl_fill_exception(exception_struct,hdbc,SQL_HANDLE_DBC); #endif #endif #endif } int commit(void) { #ifndef OTL_ODBC_MYSQL #if (ODBCVER >= 0x0300) status=SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT); #else status=SQLTransact(henv,hdbc,SQL_COMMIT); #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO) return 0; else return 1; #else return 1; #endif } int rollback(void) { #ifndef OTL_ODBC_MYSQL #if (ODBCVER >= 0x0300) status=SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_ROLLBACK); #else status=SQLTransact(henv,hdbc,SQL_ROLLBACK); #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO) return 0; else return 1; #else return 1; #endif } private: otl_conn(const otl_conn&): henv(0), hdbc(0), timeout(0), cursor_type(0), status(SQL_SUCCESS), long_max_size(32760), extern_lda(false) #if defined(OTL_ODBC_zOS) ,logoff_commit(true) #endif #if defined(OTL_THROWS_ON_SQL_SUCCESS_WITH_INFO) ,throws_on_sql_success_with_info(false) #endif ,connection_type(OTL_DEFAULT_ODBC_CONNECT) { } otl_conn& operator=(const otl_conn&) { return *this; } }; class otl_cur0{ public: OTL_SQLHSTMT cda; int last_param_data_token; int last_sql_param_data_status; int sql_param_data_count; otl_cur0(): cda(0), last_param_data_token(0), last_sql_param_data_status(0), sql_param_data_count(0) { } virtual ~otl_cur0(){} private: otl_cur0(const otl_cur0&): cda(0), last_param_data_token(0), last_sql_param_data_status(0), sql_param_data_count(0) { } otl_cur0& operator=(const otl_cur0&) { return *this; } }; class otl_var{ public: unsigned char* p_v; OTL_SQLLEN_PTR p_len; int ftype; int act_elem_size; bool lob_stream_mode; int lob_stream_flag; int vparam_type; int lob_len; int lob_pos; int lob_ftype; int otl_adapter; bool charz_flag; otl_var(): p_v(0), p_len(0), ftype(0), act_elem_size(0), lob_stream_mode(false), lob_stream_flag(0), vparam_type(-1), lob_len(0), lob_pos(0), lob_ftype(0), otl_adapter(otl_odbc_adapter), charz_flag(false) { } virtual ~otl_var() { delete[] p_v; delete[] p_len; } int write_dt(void* trg, const void* src, const int sz) { memcpy(trg,src,sz); return 1; } int read_dt(void* trg, const void* src, const int sz) { memcpy(trg,src,sz); return 1; } void set_lob_stream_flag(const int flg=1) { lob_stream_flag=flg; } int get_pl_tab_len(void) { return 0; } int get_max_pl_tab_len(void) { return 0; } void set_pl_tab_len(const int /* pl_tab_len */) { } int write_blob (const otl_long_string& s, const int /* alob_len */, int& aoffset, otl_cur0& cur) { SQLRETURN rc=0; SQLINTEGER temp_len=0; SQLPOINTER pToken=0; int param_number=0; if(!lob_stream_flag&&!lob_stream_mode)return 1; if(aoffset==1){ if(cur.sql_param_data_count==0){ rc=SQLParamData(cur.cda, &pToken); param_number=OTL_SCAST(int,OTL_RCAST(size_t,pToken)); ++cur.sql_param_data_count; cur.last_sql_param_data_status=rc; cur.last_param_data_token=param_number; if(rc!=SQL_SUCCESS&&rc!=SQL_SUCCESS_WITH_INFO&& rc!=SQL_NEED_DATA) return 0; } } if(ftype==otl_var_raw_long) temp_len=s.length; else temp_len=s.length*sizeof(OTL_CHAR); rc=SQLPutData(cur.cda,s.v,temp_len); if(rc!=SQL_SUCCESS&&rc!=SQL_SUCCESS_WITH_INFO) return 0; else{ aoffset+=s.length; return 1; } } int clob_blob(otl_cur0& cur) { SQLRETURN rc=0; SQLPOINTER pToken=0; int param_number=0; if(!(cur.last_param_data_token==0&&cur.sql_param_data_count>0)){ rc=SQLParamData(cur.cda, &pToken); param_number=OTL_SCAST(int,OTL_RCAST(size_t,pToken)); ++cur.sql_param_data_count; cur.last_sql_param_data_status=rc; cur.last_param_data_token=param_number; if(rc!=SQL_SUCCESS&&rc!=SQL_SUCCESS_WITH_INFO&& #if (ODBCVER >= 0x0300) rc!=SQL_NO_DATA && #endif rc!=SQL_NEED_DATA) return 0; } return 1; } int read_blob (otl_cur0& cur, otl_long_string& s, const int andx, int& aoffset, int& eof_flag) { SQLRETURN rc=0; OTL_SQLLEN retLen=0; int chunkLen=0; if(!lob_stream_flag&&!lob_stream_mode)return 1; int buf_size=s.buf_size*sizeof(OTL_CHAR); if(ftype==otl_var_raw_long) buf_size=s.buf_size; rc=SQLGetData (cur.cda, OTL_SCAST(SQLSMALLINT,lob_pos), OTL_SCAST(SQLSMALLINT,lob_ftype), s.v, buf_size, &retLen); if(rc==SQL_SUCCESS_WITH_INFO||rc==SQL_SUCCESS){ if(retLen==SQL_NULL_DATA){ chunkLen=0; p_len[andx]=SQL_NULL_DATA; }else if(retLen>buf_size||retLen==SQL_NO_TOTAL) chunkLen=s.buf_size; else{ if(ftype==otl_var_raw_long) chunkLen=OTL_SCAST(int,retLen); else chunkLen=OTL_SCAST(int,retLen)/sizeof(OTL_CHAR); } #if defined(OTL_UNICODE) if(lob_ftype==SQL_C_WCHAR) s.set_len(chunkLen-1); #else if(lob_ftype==SQL_C_CHAR) s.set_len(chunkLen-1); #endif else s.set_len(chunkLen); if(lob_len==0&&aoffset==1&& retLen!=SQL_NULL_DATA&& retLen!=SQL_NO_TOTAL) lob_len=OTL_SCAST(int,retLen); aoffset+=chunkLen; if(chunkLen= 0x0300) else if(rc==SQL_NO_DATA) #else else if(rc==SQL_NO_DATA_FOUND) #endif return 1; else return 0; } int get_blob_len(const int /* ndx */,int& alen) { alen=lob_len; return 1; } int put_blob(void) { return 1; } int get_blob (const int /* ndx */, unsigned char* /* abuf */, const int /* buf_size */, int& /* len */) { return 1; } int save_blob (const unsigned char* /* abuf */, const int /* len */, const int /* extern_buffer_flag */) { return 1; } int actual_elem_size(void) { return act_elem_size; } void init (const bool, const int aftype, int& aelem_size, const otl_stream_buffer_size_type aarray_size, const void* /* connect_struct */=0, const int /*apl_tab_size*/=0) {int i; size_t byte_size=0; ftype=aftype; act_elem_size=aelem_size; byte_size=aelem_size*OTL_SCAST(size_t,aarray_size); #if defined(OTL_UNICODE) if(aftype==otl_var_char||aftype==otl_var_varchar_long){ byte_size*=sizeof(OTL_CHAR); p_v=new unsigned char[byte_size]; } else p_v=new unsigned char[byte_size]; #else p_v=new unsigned char[byte_size]; #endif p_len=new OTL_SQLLEN[aarray_size]; memset(p_v,0,byte_size); for(i=0;i= 0x0300) case SQL_TYPE_DATE: return SQL_C_TIMESTAMP; case SQL_TYPE_TIMESTAMP: return SQL_C_TIMESTAMP; case SQL_TYPE_TIME: return SQL_C_TIMESTAMP; #else case SQL_DATE: return SQL_C_TIMESTAMP; case SQL_TIMESTAMP: return SQL_C_TIMESTAMP; case SQL_TIME: return SQL_C_TIMESTAMP; #endif #if defined(OTL_BIGINT) case SQL_BIGINT: return SQL_C_SBIGINT; #else case SQL_BIGINT: return SQL_C_DOUBLE; #endif case SQL_DECIMAL: return SQL_C_DOUBLE; case SQL_DOUBLE: return SQL_C_DOUBLE; case SQL_FLOAT: return SQL_C_DOUBLE; case SQL_INTEGER: return SQL_C_SLONG; case SQL_NUMERIC: return SQL_C_DOUBLE; case SQL_REAL: return SQL_C_DOUBLE; case SQL_SMALLINT: return SQL_C_SSHORT; case SQL_BIT: return SQL_C_SSHORT; case SQL_TINYINT: return SQL_C_SSHORT; case SQL_LONGVARBINARY: return SQL_LONGVARBINARY; #if defined(OTL_MAP_SQL_VARBINARY_TO_RAW_LONG) case SQL_VARBINARY: return SQL_LONGVARBINARY; #else case SQL_VARBINARY: return SQL_C_BINARY; #endif #if (ODBCVER >= 0x0350) #if defined(OTL_MAP_SQL_GUID_TO_CHAR) #if defined(OTL_UNICODE) case SQL_GUID: return SQL_C_WCHAR; #else case SQL_GUID: return SQL_C_CHAR; #endif #else case SQL_GUID: return SQL_C_BINARY; #endif #endif #if defined(OTL_MAP_SQL_BINARY_TO_CHAR) #if defined(OTL_UNICODE) case SQL_BINARY: // MS SQL TIMESTAMP, BINARY return SQL_C_WCHAR; #else case SQL_BINARY: // MS SQL TIMESTAMP, BINARY return SQL_C_CHAR; #endif #else case SQL_BINARY: return SQL_C_BINARY; #endif #if (ODBCVER >= 0x0350) case OTL_SQL_XML: #if defined(OTL_UNICODE) return SQL_C_WCHAR; #else return SQL_C_CHAR; #endif #endif default: return otl_unsupported_type; } } static int datatype_size(int ftype,int maxsz,int int_type,int max_long_size) { switch(ftype){ #if defined(OTL_UNICODE) case SQL_C_WCHAR: #endif case SQL_C_CHAR: switch(int_type){ case SQL_BINARY: // MS SQL TIMESTAMP return 17; #if defined(OTL_UNICODE) case SQL_WLONGVARCHAR: #endif case SQL_LONGVARCHAR: return max_long_size*sizeof(OTL_CHAR); case SQL_LONGVARBINARY: return max_long_size; case SQL_DATE: return 40; #if (ODBCVER >= 0x0300) case SQL_TYPE_TIMESTAMP: #else case SQL_TIMESTAMP: #endif return 40; #if (ODBCVER >= 0x0300) case SQL_TYPE_TIME: #else case SQL_TIME: #endif return 40; #if (ODBCVER >= 0x0350) #if defined(OTL_MAP_SQL_GUID_TO_SQL_VARBINARY) case SQL_GUID: return 16; #else case SQL_GUID: return 40; #endif #endif default: return (maxsz+1); } #if defined(OTL_BIGINT) case SQL_C_SBIGINT: return sizeof(OTL_BIGINT); #endif case SQL_C_DOUBLE: return sizeof(double); case SQL_C_SLONG: return sizeof(int); case SQL_C_SSHORT: return sizeof(short int); case SQL_C_TIMESTAMP: return sizeof(OTL_SQL_TIMESTAMP_STRUCT); case SQL_C_TIME: return sizeof(OTL_SQL_TIME_STRUCT); case SQL_C_DATE: return sizeof(OTL_SQL_DATE_STRUCT); #if defined(OTL_UNICODE) case SQL_WLONGVARCHAR: return max_long_size; #endif case SQL_LONGVARCHAR: return max_long_size; case SQL_LONGVARBINARY: return max_long_size; case SQL_C_BINARY: return maxsz; default: return 0; } } static void map_ftype (otl_column_desc& desc, const int max_long_size, int& ftype, int& elem_size, otl_select_struct_override& override, const int column_ndx, const int #if !defined(OTL_ODBC_TIMESTEN) && defined(OTL_ODBC_MULTI_MODE) connection_type #endif ) { int ndx=override.find(column_ndx); if(ndx==-1){ #if defined(OTL_ODBC_MSSQL_2005) && !defined(OTL_ODBC_MULTI_MODE) if(desc.prec==0 && desc.dbtype==SQL_VARBINARY) ftype=SQL_LONGVARBINARY; else #elif defined(OTL_ODBC_MULTI_MODE) if(connection_type==OTL_MSSQL_2005_ODBC_CONNECT && desc.prec==0 && desc.dbtype==SQL_VARBINARY) ftype=SQL_LONGVARBINARY; else #endif ftype=int2ext(desc.dbtype); if(desc.dbsize==0){ #if !defined(OTL_UNICODE) if(ftype==SQL_C_CHAR) ftype=SQL_LONGVARCHAR; #else if(ftype==SQL_C_CHAR) ftype=SQL_LONGVARCHAR; else if(ftype==SQL_C_WCHAR) ftype=SQL_WLONGVARCHAR; #endif elem_size=max_long_size*sizeof(OTL_CHAR); }else{ elem_size=datatype_size (ftype, OTL_SCAST(int,desc.dbsize), desc.dbtype, max_long_size); } switch(ftype){ #if defined(OTL_UNICODE) case SQL_C_WCHAR: ftype=otl_var_char; break; case SQL_WLONGVARCHAR: ftype=otl_var_varchar_long; break; #else case SQL_C_CHAR: ftype=otl_var_char; break; case SQL_LONGVARCHAR: ftype=otl_var_varchar_long; break; #endif case SQL_C_DOUBLE: if(override.all_mask&otl_all_num2str){ ftype=otl_var_char; elem_size=otl_num_str_size; }else ftype=otl_var_double; break; #if defined(OTL_BIGINT) case SQL_C_SBIGINT: if(override.all_mask&otl_all_num2str){ ftype=otl_var_char; elem_size=otl_num_str_size; }else ftype=otl_var_bigint; break; #endif case SQL_C_SLONG: if(override.all_mask&otl_all_num2str){ ftype=otl_var_char; elem_size=otl_num_str_size; }else ftype=otl_var_int; break; case SQL_C_SSHORT: if(override.all_mask&otl_all_num2str){ ftype=otl_var_char; elem_size=otl_num_str_size; }else ftype=otl_var_short; break; case SQL_LONGVARBINARY: ftype=otl_var_raw_long; break; case SQL_C_DATE: case SQL_C_TIME: case SQL_C_TIMESTAMP: if(override.all_mask&otl_all_date2str){ ftype=otl_var_char; elem_size=otl_date_str_size; }else ftype=otl_var_timestamp; break; case SQL_C_BINARY: ftype=otl_var_raw; break; default: ftype=0; break; } }else{ ftype=override.col_type[ndx]; switch(ftype){ case otl_var_char: elem_size=override.col_size[ndx]*sizeof(OTL_CHAR); break; case otl_var_raw: elem_size=override.col_size[ndx]; break; case otl_var_double: elem_size=sizeof(double); break; case otl_var_float: elem_size=sizeof(float); break; case otl_var_int: elem_size=sizeof(int); break; #if defined(OTL_BIGINT) case otl_var_bigint: elem_size=sizeof(OTL_BIGINT); break; #endif case otl_var_unsigned_int: elem_size=sizeof(unsigned); break; case otl_var_short: elem_size=sizeof(short); break; case otl_var_long_int: elem_size=sizeof(double); break; default: elem_size=override.col_size[ndx]; break; } } desc.otl_var_dbtype=ftype; } private: otl_var(const otl_var&): p_v(0), p_len(0), ftype(0), act_elem_size(0), lob_stream_mode(false), lob_stream_flag(0), vparam_type(-1), lob_len(0), lob_pos(0), lob_ftype(0), otl_adapter(otl_odbc_adapter), charz_flag(false) { } otl_var& operator=(const otl_var&) { return *this; } }; #if defined(OTL_ODBC_zOS)||defined(OTL_ODBC_TIMESTEN) const long otl_tran_read_uncommitted=SQL_TXN_READ_UNCOMMITTED; const long otl_tran_read_committed=SQL_TXN_READ_COMMITTED; const long otl_tran_repeatable_read=SQL_TXN_REPEATABLE_READ; const long otl_tran_serializable=SQL_TXN_SERIALIZABLE; #else const long otl_tran_read_uncommitted=SQL_TRANSACTION_READ_UNCOMMITTED; const long otl_tran_read_committed=SQL_TRANSACTION_READ_COMMITTED; const long otl_tran_repeatable_read=SQL_TRANSACTION_REPEATABLE_READ; const long otl_tran_serializable=SQL_TRANSACTION_SERIALIZABLE; #endif class otl_cur: public otl_cur0{ public: int status; otl_conn* adb; int direct_exec_flag; long _rpc; bool canceled; otl_cur(): otl_cur0(), status(0), adb(0), direct_exec_flag(0), _rpc(0), canceled(false) { cda=0; last_param_data_token=0; last_sql_param_data_status=0; sql_param_data_count=0; } virtual ~otl_cur(){} int cancel(void) { status=SQLCancel(cda); canceled=true; if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO) return 0; else return 1; } int open(otl_conn& /* connect */,otl_var* /* var */) { return 1; } void set_direct_exec(const int flag) { direct_exec_flag=flag; } void set_parse_only(const int /*flag*/){} int open(otl_conn& connect) { direct_exec_flag=0; adb=&connect; #if (ODBCVER >= 0x0300) status=SQLAllocHandle(SQL_HANDLE_STMT,connect.hdbc,&cda); #else status=SQLAllocStmt(connect.hdbc,&cda); #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO)return 0; if(connect.timeout>0){ #if (ODBCVER >= 0x0300) status=SQLSetStmtAttr (cda, SQL_ATTR_QUERY_TIMEOUT, OTL_RCAST(void*,OTL_SCAST(size_t,connect.timeout)), SQL_NTS); #else status=SQLSetStmtOption(cda,SQL_QUERY_TIMEOUT,connect.timeout); #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO) return 0; } if(connect.cursor_type!=0){ // other than default #if (ODBCVER >= 0x0300) status=SQLSetStmtAttr (cda, SQL_ATTR_CURSOR_TYPE, OTL_RCAST(void*,OTL_SCAST(size_t,connect.cursor_type)), SQL_NTS); #else status=SQLSetStmtOption(cda,SQL_CURSOR_TYPE,connect.cursor_type); #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO) return 0; } return 1; } int close(void) { #if (ODBCVER >= 0x0300) status=SQLFreeHandle(SQL_HANDLE_STMT,cda); #else status=SQLFreeStmt(cda,SQL_DROP); #endif adb=0; cda=0; if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO) return 0; else return 1; } int parse(char* stm_text) { #if !defined(OTL_ODBC_TIMESTEN) short in_str=0; #endif char *c=stm_text; if(*c=='$'){ ++c; _rpc=0; direct_exec_flag=1; const int ctl_arr_size=6; struct{ OTL_SQLCHAR_PTR name_ptr; OTL_SQLSMALLINT name_len; OTL_SQLCHAR name[512]; } ctl_arr[ctl_arr_size]; #if (defined(UNICODE)||defined(_UNICODE)) struct{ SQLWCHAR name_ptr; OTL_SQLSMALLINT name_len; SQLWCHAR name[512]; } ctl_arr_W[ctl_arr_size]; #endif int i=0; for(i=0;istm_text && *(c-1)!='\\' )|| c==stm_text)){ ++c; while(*c && *c==' ')++c; if(*c=='\''){ par_val_len=0; ++c; while(*c && *c!='\'' && par_val_len=0 && par_numthrows_on_sql_success_with_info && status==SQL_SUCCESS_WITH_INFO) return 0; #endif if(status!=SQL_SUCCESS&& status!=SQL_SUCCESS_WITH_INFO&& #if (ODBCVER >= 0x0300) status!=SQL_NO_DATA #else status!=SQL_NO_DATA_FOUND #endif ) return 0; else{ OTL_SQLLEN tmp_rpc=0; SQLRETURN diag_status=SQLRowCount(cda,&tmp_rpc); if(diag_status==SQL_SUCCESS|| diag_status==SQL_SUCCESS_WITH_INFO) _rpc=OTL_SCAST(long,tmp_rpc); return 1; } } #if !defined(OTL_ODBC_TIMESTEN) // Converting : notation into ODBC's native notation ? while(*c){ if(*c=='\''){ if(!in_str) in_str=1; else{ if(c[1]=='\'') ++c; else in_str=0; } } if(*c==':' && !in_str && ((c>stm_text && *(c-1)!='\\' )|| c==stm_text)){ *c='?'; ++c; while(isdigit(*c)||isalpha(*c)||*c=='_'){ *c=' '; ++c; } }else if(*c==':' && !in_str && ((c>stm_text && *(c-1)=='\\' )|| c==stm_text)){ char* c_1=c-1; char* c_=c; while(*c_){ *c_1=*c_; ++c_1; ++c_; } if(c_1>c-1) *c_1=0; --c; } ++c; } #endif #if defined(OTL_DB2_CLI) OTL_SQLINTEGER temp_isolation_level=0; status=SQLGetStmtAttr (cda, SQL_ATTR_TXN_ISOLATION, OTL_RCAST(SQLPOINTER,&temp_isolation_level), SQL_IS_POINTER, 0); if(OTL_SCAST(long,temp_isolation_level)==otl_tran_read_committed|| OTL_SCAST(long,temp_isolation_level)==otl_tran_read_uncommitted){ status=SQLSetStmtAttr (cda, SQL_ATTR_CLOSE_BEHAVIOR, OTL_RCAST(void*,SQL_CC_RELEASE), SQL_NTS); if(status!=SQL_SUCCESS&& status!=SQL_SUCCESS_WITH_INFO) return 0; } #endif #if (defined(UNICODE)||defined(_UNICODE)) { SQLWCHAR* temp_stm_text=new SQLWCHAR[strlen(stm_text)+1]; otl_convert_char_to_SQLWCHAR(temp_stm_text,OTL_RCAST(unsigned char*,stm_text)); status=SQLPrepare (cda, temp_stm_text, SQL_NTS); delete[] temp_stm_text; } #else status=SQLPrepare (cda, OTL_RCAST(OTL_SQLCHAR_PTR,stm_text), SQL_NTS); #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO) return 0; else return 1; } int exec(const int iters, const int /*rowoff*/) { #if (ODBCVER >= 0x0300) #else OTL_SQLUINTEGER irows; #endif if(direct_exec_flag){ return 1; }else{ #if !defined(OTL_ODBC_MYSQL) && !defined(OTL_ODBC_XTG_IBASE6) #if (ODBCVER >= 0x0300) if(iters>1||_rpc>1){ size_t temp_iters=OTL_SCAST(size_t,iters); status=SQLSetStmtAttr (cda, SQL_ATTR_PARAMSET_SIZE, OTL_RCAST(void*,temp_iters), SQL_NTS ); if(status!=SQL_SUCCESS&& status!=SQL_SUCCESS_WITH_INFO) return 0; } #else if(iters>1||_rpc>1){ status=SQLParamOptions (cda, OTL_SCAST(OTL_SQLUINTEGER,iters), &irows); if(status!=SQL_SUCCESS&& status!=SQL_SUCCESS_WITH_INFO) return 0; } #endif #endif _rpc=0; last_param_data_token=0; last_sql_param_data_status=0; sql_param_data_count=0; status=SQLExecute(cda); if(canceled)return 0; #if defined(OTL_THROWS_ON_SQL_SUCCESS_WITH_INFO) if(adb && adb->throws_on_sql_success_with_info && status==SQL_SUCCESS_WITH_INFO) return 0; #endif if(status!=SQL_SUCCESS&& status!=SQL_SUCCESS_WITH_INFO&& #if (ODBCVER >= 0x0300) status!=SQL_NO_DATA&& #else status!=SQL_NO_DATA_FOUND&& #endif status!=SQL_NEED_DATA)return 0; if(status==SQL_NEED_DATA){ _rpc=iters; return 1; } OTL_SQLLEN tmp_rpc=0; SQLRETURN diag_status=SQLRowCount(cda,&tmp_rpc); if(diag_status==SQL_SUCCESS|| diag_status==SQL_SUCCESS_WITH_INFO) _rpc=OTL_SCAST(long,tmp_rpc); return 1; } } long get_rpc() { return _rpc; } int tmpl_ftype2odbc_ftype(const int ftype) { switch(ftype){ #if defined(OTL_UNICODE) case otl_var_char: return SQL_C_WCHAR; case otl_var_varchar_long: return SQL_WLONGVARCHAR; #else case otl_var_char: return SQL_C_CHAR; case otl_var_varchar_long: return SQL_LONGVARCHAR; #endif case otl_var_double: return SQL_C_DOUBLE; #if defined(OTL_BIGINT) case otl_var_bigint: return SQL_C_SBIGINT; #endif case otl_var_float: return SQL_C_FLOAT; case otl_var_int: return SQL_C_SLONG; case otl_var_long_int: #if defined(OTL_MAP_LONG_TO_SQL_C_SBIGINT) && \ ((ODBCVER >= 0x0300) || defined(OTL_ODBC_TIMESTEN)) { static bool long_is_8_bytes=sizeof(long)==8; if(long_is_8_bytes) return SQL_C_SBIGINT; else return SQL_C_SLONG; } #else return SQL_C_SLONG; #endif case otl_var_unsigned_int: return SQL_C_ULONG; case otl_var_short: return SQL_C_SSHORT; case otl_var_timestamp: case otl_var_db2time: case otl_var_db2date: return SQL_C_TIMESTAMP; case otl_var_raw_long: return SQL_LONGVARBINARY; case otl_var_raw: return SQL_C_BINARY; default: return 0; } } int otl_map_ext2int(int ftype) { switch(ftype){ #if defined(OTL_UNICODE) case SQL_WLONGVARCHAR: return SQL_WLONGVARCHAR; case SQL_C_WCHAR: return SQL_WVARCHAR; #else case SQL_LONGVARCHAR: return SQL_LONGVARCHAR; case SQL_C_CHAR: return SQL_VARCHAR; #endif case SQL_LONGVARBINARY: return SQL_LONGVARBINARY; case SQL_C_DATE: return SQL_DATE; #if (ODBCVER >= 0x0300) case SQL_C_TIME: return SQL_TYPE_TIME; case SQL_C_TIMESTAMP: return SQL_TYPE_TIMESTAMP; #else case SQL_C_TIME: return SQL_TIME; case SQL_C_TIMESTAMP: return SQL_TIMESTAMP; #endif case SQL_C_DOUBLE: return SQL_DOUBLE; #if defined(OTL_BIGINT) case SQL_C_SBIGINT: return SQL_BIGINT; #endif case SQL_C_FLOAT: return SQL_FLOAT; case SQL_C_SLONG: return SQL_INTEGER; case SQL_C_SSHORT: return SQL_SMALLINT; case SQL_C_ULONG: return SQL_DOUBLE; case SQL_C_BINARY: return SQL_VARBINARY; default: return -1; } } int bind (const char* /* name */, otl_var& v, const int aelem_size, const int aftype, const int aparam_type, const int name_pos, const int #if !defined(OTL_ODBC_TIMESTEN) && defined(OTL_ODBC_MULTI_MODE) connection_type #endif , const int /* apl_tab_size */) {OTL_SQLSMALLINT ftype=OTL_SCAST(OTL_SQLSMALLINT,tmpl_ftype2odbc_ftype(aftype)); OTL_SQLSMALLINT ftype_save=ftype; int param_type; int parm_pos=name_pos; v.vparam_type=aparam_type; switch(aparam_type){ case otl_input_param: param_type=SQL_PARAM_INPUT; break; case otl_output_param: param_type=SQL_PARAM_OUTPUT; break; case otl_inout_param: param_type=SQL_PARAM_INPUT_OUTPUT; break; default: param_type=SQL_PARAM_INPUT; break; } #if defined(OTL_UNICODE) if(ftype==SQL_WLONGVARCHAR){ ftype=SQL_C_WCHAR; #else if(ftype==SQL_LONGVARCHAR){ ftype=SQL_C_CHAR; #endif }else if(ftype==SQL_LONGVARBINARY){ ftype=SQL_C_BINARY; } int sqltype=otl_map_ext2int(ftype_save); int mapped_sqltype=sqltype; if(aftype==otl_var_db2date) #if (ODBCVER >= 0x0300) mapped_sqltype=SQL_TYPE_DATE; #else mapped_sqltype=SQL_DATE; #endif else if(aftype==otl_var_db2time) #if (ODBCVER >= 0x0300) mapped_sqltype=SQL_TYPE_TIME; #else mapped_sqltype=SQL_TIME; #endif if(v.lob_stream_mode&& (ftype_save==SQL_LONGVARBINARY|| #if defined(OTL_UNICODE) ftype_save==SQL_WLONGVARCHAR)){ #else ftype_save==SQL_LONGVARCHAR)){ #endif // in case of "stream mode" the variable // gets bound in a special way #if defined(OTL_ODBC_MSSQL_2005) && !defined(OTL_ODBC_MULTI_MODE) switch(ftype_save){ case SQL_LONGVARBINARY: mapped_sqltype=SQL_VARBINARY; break; #if defined(OTL_UNICODE) case SQL_WLONGVARCHAR: mapped_sqltype=SQL_WVARCHAR; break; #else case SQL_LONGVARCHAR: mapped_sqltype=SQL_VARCHAR; break; #endif } #elif defined(OTL_ODBC_MULTI_MODE) if(connection_type==OTL_MSSQL_2005_ODBC_CONNECT){ switch(ftype_save){ case SQL_LONGVARBINARY: mapped_sqltype=SQL_VARBINARY; break; #if defined(OTL_UNICODE) case SQL_WLONGVARCHAR: mapped_sqltype=SQL_WVARCHAR; break; #else case SQL_LONGVARCHAR: mapped_sqltype=SQL_VARCHAR; break; #endif } } #endif status=SQLBindParameter (cda, OTL_SCAST(OTL_SQLUSMALLINT,parm_pos), OTL_SCAST(OTL_SQLSMALLINT,param_type), ftype, OTL_SCAST(OTL_SQLSMALLINT,mapped_sqltype), #if (ODBCVER >= 0x0300) #if defined(OTL_ODBC_MSSQL_2005) && !defined(OTL_ODBC_MULTI_MODE) 0, #elif defined(OTL_ODBC_MULTI_MODE) (connection_type==OTL_MSSQL_2005_ODBC_CONNECT) ? 0 : (sqltype==SQL_TYPE_TIMESTAMP?otl_odbc_date_prec:aelem_size), #else sqltype==SQL_TYPE_TIMESTAMP?otl_odbc_date_prec:aelem_size, #endif #else sqltype==SQL_TIMESTAMP?otl_odbc_date_prec:aelem_size, #endif #if (ODBCVER >= 0x0300) sqltype==SQL_TYPE_TIMESTAMP?otl_odbc_date_scale:0, #else sqltype==SQL_TIMESTAMP?otl_odbc_date_scale:0, #endif OTL_RCAST(OTL_SQLPOINTER,OTL_SCAST(size_t,parm_pos)), 0, v.p_len); }else{ int temp_column_size=0; #if (ODBCVER >= 0x0300) if(sqltype==SQL_TYPE_TIMESTAMP) temp_column_size=otl_odbc_date_prec; #if defined(OTL_UNICODE) else if(ftype==SQL_C_WCHAR) temp_column_size=(aelem_size-1)*sizeof(OTL_CHAR); #else else if(ftype==SQL_C_CHAR) temp_column_size=aelem_size-1; #endif else temp_column_size=aelem_size; #else if(sqltype==SQL_TIMESTAMP) temp_column_size=otl_odbc_date_prec; else if(ftype==SQL_C_CHAR) temp_column_size=aelem_size-1; else temp_column_size=aelem_size; #endif OTL_SQLINTEGER buflen=0; #if defined(OTL_UNICODE) if(ftype==SQL_C_WCHAR) buflen=aelem_size*sizeof(OTL_CHAR); else #endif buflen=aelem_size; status=SQLBindParameter (cda, OTL_SCAST(OTL_SQLUSMALLINT,parm_pos), OTL_SCAST(OTL_SQLSMALLINT,param_type), ftype, OTL_SCAST(OTL_SQLSMALLINT,mapped_sqltype), temp_column_size, #if (ODBCVER >= 0x0300) sqltype==SQL_TYPE_TIMESTAMP?otl_odbc_date_scale:0, #else sqltype==SQL_TIMESTAMP?otl_odbc_date_scale:0, #endif OTL_RCAST(OTL_SQLPOINTER,v.p_v), buflen, v.p_len); } if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO) return 0; else return 1; } int bind (const int column_num, otl_var& v, const int elem_size, const int aftype, const int param_type) {SWORD ftype=OTL_SCAST(SWORD,tmpl_ftype2odbc_ftype(aftype)); v.vparam_type=param_type; SWORD ftype_save=ftype; #if defined(OTL_UNICODE) if(ftype==SQL_WLONGVARCHAR){ ftype=SQL_C_WCHAR; #else if(ftype==SQL_LONGVARCHAR){ ftype=SQL_C_CHAR; #endif }else if(ftype==SQL_LONGVARBINARY){ ftype=SQL_C_BINARY; } if(v.lob_stream_mode&& (ftype_save==SQL_LONGVARBINARY|| #if defined(OTL_UNICODE) ftype_save==SQL_WLONGVARCHAR)){ #else ftype_save==SQL_LONGVARCHAR)){ #endif // in case of "stream mode" the variable // remains unbound v.lob_ftype=ftype; v.lob_pos=column_num; return 1; }else{ SQLINTEGER buflen=elem_size; #if defined(OTL_UNICODE) if(ftype==SQL_C_WCHAR||ftype==SQL_WLONGVARCHAR) buflen=elem_size*sizeof(OTL_CHAR); #endif status=SQLBindCol (cda, OTL_SCAST(unsigned short,column_num), ftype, OTL_RCAST(PTR,v.p_v), buflen, &v.p_len[0]); if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO) return 0; else return 1; } } int describe_column (otl_column_desc& col, const int column_num, int& eof_desc) { OTL_SQLCHAR name[256]; OTL_SQLSMALLINT nlen; OTL_SQLSMALLINT dbtype; OTL_SQLLEN dbsize; OTL_SQLSMALLINT scale; OTL_SQLULEN prec; OTL_SQLSMALLINT nullok; OTL_SQLSMALLINT icols; eof_desc=0; status=SQLNumResultCols(cda,&icols); if(status!=SQL_SUCCESS&& status!=SQL_SUCCESS_WITH_INFO) return 0; if(column_num>icols){ eof_desc=1; return 0; } #if (defined(UNICODE)||defined(_UNICODE)) { SQLWCHAR temp_name[256]; status=SQLDescribeCol (cda, OTL_SCAST(unsigned short,column_num), temp_name, sizeof(temp_name), &nlen, &dbtype, &prec, &scale, &nullok); otl_convert_SQLWCHAR_to_char(OTL_RCAST(unsigned char*,name),temp_name); } #else status=SQLDescribeCol (cda, OTL_SCAST(unsigned short,column_num), name, sizeof(name), &nlen, &dbtype, &prec, &scale, &nullok); #endif if(!(status == SQL_SUCCESS || status == SQL_SUCCESS_WITH_INFO)) return 0; dbsize=prec; col.set_name(OTL_RCAST(char*,name)); #if defined(OTL_DB2_CLI) && defined(OTL_DB2_CLI_MAP_LONG_VARCHAR_TO_VARCHAR) #if defined(OTL_UNICODE) #error OTL_DB2_CLI_MAP_LONG_VARCHAR_TO_VARCHAR is not supported when \ OTL_UNICODE is defined #else if(dbtype==SQL_LONGVARCHAR && dbsize <= OTL_DB2_CLI_MAP_LONG_VARCHAR_TO_VARCHAR){ dbtype=SQL_VARCHAR; } #endif #endif col.dbtype=dbtype; col.dbsize=dbsize; col.scale=scale; col.prec=prec; col.nullok=nullok; return 1; } void error(otl_exc& exception_struct) {OTL_SQLRETURN rc; OTL_SQLSMALLINT msg_len=0; #if (ODBCVER >= 0x0300) #if (defined(UNICODE)||defined(_UNICODE)) { #if defined(OTL_UNICODE_EXCEPTION_AND_RLOGON) rc=SQLGetDiagRec (SQL_HANDLE_STMT, cda, 1, &exception_struct.sqlstate[0], OTL_RCAST(OTL_SQLINTEGER_PTR,&exception_struct.code), &exception_struct.msg[0], SQL_MAX_MESSAGE_LENGTH-1, OTL_RCAST(OTL_SQLSMALLINT_PTR,&msg_len)); exception_struct.msg[msg_len]=0; #else SQLWCHAR temp_sqlstate[1000]; SQLWCHAR temp_msg[SQL_MAX_MESSAGE_LENGTH]; rc=SQLGetDiagRec (SQL_HANDLE_STMT, cda, 1, temp_sqlstate, OTL_RCAST(OTL_SQLINTEGER_PTR,&exception_struct.code), temp_msg, SQL_MAX_MESSAGE_LENGTH-1, OTL_RCAST(OTL_SQLSMALLINT_PTR,&msg_len)); temp_msg[msg_len]=0; otl_convert_SQLWCHAR_to_char (OTL_RCAST(unsigned char*,&exception_struct.sqlstate[0]), temp_sqlstate); otl_convert_SQLWCHAR_to_char (OTL_RCAST(unsigned char*,&exception_struct.msg[0]), temp_msg); #endif } #else void* temp_ptr=&exception_struct.code; rc=SQLGetDiagRec (SQL_HANDLE_STMT, cda, 1, OTL_RCAST(OTL_SQLCHAR_PTR,&exception_struct.sqlstate[0]), OTL_RCAST(OTL_SQLINTEGER_PTR,temp_ptr), OTL_RCAST(OTL_SQLCHAR_PTR,&exception_struct.msg[0]), SQL_MAX_MESSAGE_LENGTH-1, OTL_RCAST(OTL_SQLSMALLINT_PTR,&msg_len)); #endif #else rc=SQLError(adb->henv, adb->hdbc, cda, OTL_RCAST(OTL_SQLCHAR_PTR,&exception_struct.sqlstate[0]), OTL_RCAST(OTL_SQLINTEGER_PTR,&exception_struct.code), OTL_RCAST(OTL_SQLCHAR_PTR,&exception_struct.msg[0]), SQL_MAX_MESSAGE_LENGTH-1, OTL_RCAST(OTL_SQLSMALLINT_PTR,&msg_len)); #endif exception_struct.msg[msg_len]=0; if(rc==SQL_INVALID_HANDLE||rc==SQL_ERROR) exception_struct.msg[0]=0; #if (ODBCVER >= 0x0300) #if defined(OTL_EXTENDED_EXCEPTION) else if(rc!=SQL_NO_DATA) otl_fill_exception(exception_struct,cda,SQL_HANDLE_STMT); #endif #endif } private: otl_cur(const otl_cur&): otl_cur0(), status(0), adb(0), direct_exec_flag(0), _rpc(0), canceled(false) { } otl_cur& operator=(const otl_cur&) { return *this; } }; class otl_sel{ public: int implicit_cursor; int status; int prefetch_array_size; #if defined(OTL_ODBC_UNIX) #if defined(SIZEOF_LONG) #if (SIZEOF_LONG==8) #if !defined(BUILD_REAL_64_BIT_MODE) OTL_SQLULEN crow; #else OTL_SQLUINTEGER crow; #endif #else // (SIZEOF_LONG==8) OTL_SQLULEN crow; #endif #else // defined(SIZEOF_LONG) OTL_SQLULEN crow; #endif #else // defined(OTL_ODBC_UNIX) OTL_SQLULEN crow; #endif int in_sequence; #if defined(OTL_ODBC_SQL_EXTENDED_FETCH_ON) || (ODBCVER<0x0300) OTL_SQLUSMALLINT* row_status; int row_status_arr_size; #endif void set_arr_size (const int input_arr_size, int& out_array_size, int& out_prefetch_array_size) { #if defined(OTL_ODBC_TIMESTEN) out_array_size=1; out_prefetch_array_size=input_arr_size; #else out_array_size=input_arr_size; out_prefetch_array_size=0; #endif } int close_select(otl_cur& cur) { if(!in_sequence)return 1; #if defined(OTL_DB2_CLI) status=SQLCloseCursor(cur.cda); #else status=SQLFreeStmt(cur.cda,SQL_CLOSE); #endif in_sequence=0; if(status==SQL_ERROR) return 0; else return 1; } otl_sel(): implicit_cursor(0), status(0), prefetch_array_size(0), crow(0), in_sequence(0) #if defined(OTL_ODBC_SQL_EXTENDED_FETCH_ON) || (ODBCVER<0x0300) ,row_status(0) ,row_status_arr_size(0) #endif { } virtual ~otl_sel() { #if defined(OTL_ODBC_SQL_EXTENDED_FETCH_ON) || (ODBCVER<0x0300) if(row_status!=0){ delete[] row_status; row_status=0; row_status_arr_size=0; } #endif } #if defined(OTL_ODBC_SQL_EXTENDED_FETCH_ON) || (ODBCVER<0x0300) void alloc_row_status(const int array_size) { if(row_status==0){ row_status=new OTL_SQLUSMALLINT[array_size]; row_status_arr_size=array_size; memset(row_status,0,sizeof(OTL_SQLUSMALLINT)*array_size); }else if(row_status!=0 && array_size!=row_status_arr_size){ delete[] row_status; row_status=new OTL_SQLUSMALLINT[array_size]; row_status_arr_size=array_size; memset(row_status,0,sizeof(OTL_SQLUSMALLINT)*array_size); } } #endif void set_select_type(const int atype) { implicit_cursor=atype; } void init(const int /* array_size */) { } void set_prefetch_size(const int aprefetch_array_size) { prefetch_array_size=aprefetch_array_size; } int first (otl_cur& cur, int& cur_row, int& cur_size, int& row_count, int& eof_data, const int #if !defined(OTL_ODBC_XTG_IBASE6) array_size #endif ) { #if defined(OTL_ODBC_XTG_IBASE6) cur_row=-1; eof_data=0; if(!implicit_cursor){ status=SQLExecute(cur.cda); if(cur.canceled)return 0; #if defined(OTL_THROWS_ON_SQL_SUCCESS_WITH_INFO) if(cur.adb && cur.adb->throws_on_sql_success_with_info && status==SQL_SUCCESS_WITH_INFO) return 0; #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO)return 0; } crow=0; status=SQLFetch(cur.cda); if(cur.canceled)return 0; if(status==SQL_SUCCESS||status==SQL_SUCCESS_WITH_INFO){ crow=1; in_sequence=1; } #else #if defined(OTL_ODBC_SQL_EXTENDED_FETCH_ON) alloc_row_status(array_size); #endif cur_row=-1; eof_data=0; #if (ODBCVER >= 0x0300) status=SQLSetStmtAttr (cur.cda, SQL_ATTR_ROW_ARRAY_SIZE, OTL_RCAST(void*,OTL_SCAST(size_t,array_size)), SQL_NTS); #else #if defined(OTL_ODBC_TIMESTEN) status=SQLSetStmtOption(cur.cda,TT_PREFETCH_COUNT,prefetch_array_size); #else status=SQLSetStmtOption(cur.cda,SQL_ROWSET_SIZE,array_size); #endif #endif if(cur.canceled)return 0; if(status!=SQL_SUCCESS&& status!=SQL_SUCCESS_WITH_INFO) return 0; #if defined(OTL_ODBC_SQL_EXTENDED_FETCH_ON) #else #if (ODBCVER >= 0x0300) status=SQLSetStmtAttr(cur.cda,SQL_ATTR_ROWS_FETCHED_PTR,&crow,SQL_NTS); if(cur.canceled)return 0; if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO)return 0; #else #endif #endif if(!implicit_cursor){ status=SQLExecute(cur.cda); if(cur.canceled)return 0; #if defined(OTL_THROWS_ON_SQL_SUCCESS_WITH_INFO) if(cur.adb && cur.adb->throws_on_sql_success_with_info && status==SQL_SUCCESS_WITH_INFO) return 0; #endif if(status!=SQL_SUCCESS&&status!=SQL_SUCCESS_WITH_INFO)return 0; } #if defined(OTL_ODBC_SQL_EXTENDED_FETCH_ON) if(array_size==1){ crow=0; status=SQLFetch(cur.cda); if(cur.canceled)return 0; if(status==SQL_SUCCESS||status==SQL_SUCCESS_WITH_INFO){ crow=1; in_sequence=1; } }else{ status=SQLExtendedFetch (cur.cda, SQL_FETCH_NEXT, 1, &crow, row_status); } #else #if (ODBCVER >= 0x0300) status=SQLFetchScroll(cur.cda,SQL_FETCH_NEXT,1); #else { alloc_row_status(array_size); status=SQLExtendedFetch (cur.cda, SQL_FETCH_NEXT, 1, &crow, row_status); } #endif #endif #endif in_sequence=1; if(cur.canceled)return 0; if(status==SQL_ERROR|| status==SQL_INVALID_HANDLE) return 0; if(status==SQL_NO_DATA_FOUND){ eof_data=1; cur_row=-1; crow=0; row_count=0; cur_size=0; #if defined(OTL_DB2_CLI) status=SQLCloseCursor(cur.cda); #else status=SQLFreeStmt(cur.cda,SQL_CLOSE); #endif in_sequence=0; if(status==SQL_ERROR)return 0; return 1; } row_count=OTL_SCAST(int,crow); cur_size=row_count; if(cur_size!=0)cur_row=0; return 1; } #if defined(OTL_ODBC_SQL_EXTENDED_FETCH_ON) int next (otl_cur& cur, int& cur_row, int& cur_size, int& row_count, int& eof_data, const int array_size) { alloc_row_status(array_size); #else int next (otl_cur& cur, int& cur_row, int& cur_size, int& row_count, int& eof_data, #if (ODBCVER >= 0x0300) const int /* array_size */) #else const int array_size) #endif { #endif if(cur_row= 0x0300) status=SQLFetchScroll(cur.cda,SQL_FETCH_NEXT,1); #else { alloc_row_status(array_size); status=SQLExtendedFetch (cur.cda, SQL_FETCH_NEXT, 1, &crow, row_status); } #endif #endif in_sequence=1; if(cur.canceled)return 0; if(status==SQL_ERROR|| // status==SQL_SUCCESS_WITH_INFO|| status==SQL_INVALID_HANDLE) return 0; if(status==SQL_NO_DATA_FOUND){ eof_data=1; cur_row=-1; cur_size=0; in_sequence=0; #if defined(OTL_DB2_CLI) status=SQLCloseCursor(cur.cda); #else status=SQLFreeStmt(cur.cda,SQL_CLOSE); #endif if(status==SQL_ERROR)return 0; return 1; } cur_size=OTL_SCAST(int,crow); row_count+=OTL_SCAST(int,crow); if(cur_size!=0)cur_row=0; return 1; } } private: otl_sel(const otl_sel&): implicit_cursor(0), status(0), prefetch_array_size(0), crow(0), in_sequence(0) #if defined(OTL_ODBC_SQL_EXTENDED_FETCH_ON) || (ODBCVER<0x0300) ,row_status(0) ,row_status_arr_size(0) #endif { } otl_sel& operator=(const otl_sel&) { return *this; } }; typedef otl_tmpl_connect otl_odbc_connect; typedef otl_tmpl_cursor otl_cursor; typedef otl_tmpl_exception otl_exception; typedef otl_tmpl_select_stream otl_select_stream; typedef otl_tmpl_inout_stream otl_inout_stream; class otl_connect: public otl_odbc_connect{ public: void set_connection_mode(const int connection_mode) { connect_struct.connection_type=connection_mode; } int get_connection_mode(void) { return connect_struct.connection_type; } #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) otl_stream_pool sc; void set_stream_pool_size(const int max_size=otl_max_default_pool_size) { sc.init(max_size); } #endif void commit(void) { #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) if(!auto_commit_){ (*this)<<"commit tran"; otl_odbc_connect::commit(); (*this)<<"begin tran"; } #else otl_odbc_connect::commit(); #endif } void rollback(void) { #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) if(!auto_commit_){ (*this)<<"rollback tran"; otl_odbc_connect::rollback(); (*this)<<"begin tran"; } #else otl_odbc_connect::rollback(); #endif } long direct_exec (const char* sqlstm, const int exception_enabled=1) OTL_THROWS_OTL_EXCEPTION { return otl_cursor::direct_exec(*this,sqlstm,exception_enabled); } void syntax_check(const char* sqlstm) OTL_THROWS_OTL_EXCEPTION { otl_cursor::syntax_check(*this,sqlstm); } otl_connect() OTL_NO_THROW : otl_odbc_connect(), #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) sc(), #endif cmd_(0) #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) ,auto_commit_(false) #endif { } otl_connect(const char* connect_str, const int aauto_commit=0) OTL_THROWS_OTL_EXCEPTION: otl_odbc_connect(connect_str, aauto_commit), #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) sc(), #endif cmd_(0) #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) ,auto_commit_(false) #endif { #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) if(aauto_commit) auto_commit_=true; else auto_commit_=false; #endif } otl_connect(OTL_HENV ahenv,OTL_HDBC ahdbc,const int auto_commit=0) OTL_THROWS_OTL_EXCEPTION: otl_odbc_connect(), #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) sc(), #endif cmd_(0) #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) ,auto_commit_(false) #endif { #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) if(auto_commit) auto_commit_=true; else auto_commit_=false; #endif rlogon(ahenv,ahdbc,auto_commit); } const char* getCmd(void) const { return cmd_; } otl_connect& operator<<(const char* cmd) { if(!connected){ this->rlogon(cmd); }else{ otl_cursor::direct_exec(*this,cmd); } return *this; } otl_connect& operator<<=(const char* cmd) { if(cmd_){ delete[] cmd_; cmd_=0; } size_t cmd_len=strlen(cmd); cmd_=new char[cmd_len+1]; OTL_STRCPY_S(cmd_,cmd_len+1,cmd); return *this; } #if defined(OTL_THROWS_ON_SQL_SUCCESS_WITH_INFO) void set_throw_on_sql_success_with_info(const bool throw_flag=false) { this->connect_struct.throws_on_sql_success_with_info=throw_flag; } #endif void rlogon(OTL_HENV ahenv,OTL_HDBC ahdbc,const int auto_commit=0) OTL_THROWS_OTL_EXCEPTION { if(this->connected){ throw otl_exception(otl_error_msg_30,otl_error_code_30); } if(cmd_){ delete[] cmd_; cmd_=0; } #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) if(auto_commit) auto_commit_=true; else auto_commit_=false; #endif retcode=connect_struct.ext_logon(ahenv,ahdbc,auto_commit); if(retcode) connected=1; else{ connected=0; throw_count++; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(connect_struct); } #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) if(!auto_commit_){ (*this)<<"begin tran"; } #endif } #if defined(OTL_UNICODE_EXCEPTION_AND_RLOGON) void rlogon(const OTL_UNICODE_CHAR_TYPE* username, const OTL_UNICODE_CHAR_TYPE* passwd, const OTL_UNICODE_CHAR_TYPE* dns, const int auto_commit=0) OTL_THROWS_OTL_EXCEPTION { if(this->connected){ throw otl_exception(otl_error_msg_30,otl_error_code_30); } #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) if(auto_commit) auto_commit_=true; else auto_commit_=false; #endif retcode=connect_struct.rlogon (OTL_RCAST(const SQLWCHAR*,username), OTL_RCAST(const SQLWCHAR*,passwd), OTL_RCAST(const SQLWCHAR*,dns), auto_commit); if(retcode) connected=1; else{ connected=0; throw_count++; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(connect_struct); } #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) if(!auto_commit_){ (*this)<<"begin tran"; } #endif } #endif virtual ~otl_connect() #if !defined(OTL_DESTRUCTORS_DO_NOT_THROW) OTL_THROWS_OTL_EXCEPTION #endif { if(cmd_){ delete[] cmd_; cmd_=0; } #if defined(OTL_DESTRUCTORS_DO_NOT_THROW) try{ logoff(); }catch(otl_exception&){ } #endif } void rlogon(const char* connect_str, const int aauto_commit=0) OTL_THROWS_OTL_EXCEPTION { if(this->connected){ throw otl_exception(otl_error_msg_30,otl_error_code_30); } if(cmd_){ delete[] cmd_; cmd_=0; } #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) if(aauto_commit) auto_commit_=true; else auto_commit_=false; #endif otl_odbc_connect::rlogon(connect_str,aauto_commit); #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) if(!auto_commit_){ (*this)<<"begin tran"; } #endif } void logoff(void) OTL_THROWS_OTL_EXCEPTION { #if defined(OTL_STL) && defined(OTL_STREAM_POOLING_ON) if(connected) sc.init(sc.max_size); #endif #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) if(!auto_commit_) rollback(); #endif otl_odbc_connect::logoff(); } void set_transaction_isolation_level(const long int level) OTL_THROWS_OTL_EXCEPTION { retcode=connect_struct.set_transaction_isolation_level(level); if(!retcode){ throw_count++; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(connect_struct); } } private: char* cmd_; #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) bool auto_commit_; #endif otl_connect(const otl_connect&) OTL_NO_THROW : otl_odbc_connect(), #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) sc(), #endif cmd_(0) #if defined(OTL_FREETDS_ODBC_WORKAROUNDS) ,auto_commit_(false) #endif { } otl_connect& operator=(const otl_connect&) { return *this; } }; const int otl_odbc_no_stream=0; const int otl_odbc_io_stream=1; const int otl_odbc_select_stream=2; class otl_stream_shell: public otl_stream_shell_generic{ public: otl_select_stream* ss; otl_inout_stream* io; otl_connect* adb; int auto_commit_flag; otl_var_desc* iov; int iov_len; int next_iov_ndx; otl_var_desc* ov; int ov_len; int next_ov_ndx; bool flush_flag; int stream_type; bool lob_stream_flag; otl_select_struct_override override; #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) OTL_STRING_CONTAINER orig_sql_stm; #endif otl_stream_shell(): otl_stream_shell_generic(), ss(0), io(0), adb(0), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), flush_flag(false), stream_type(otl_odbc_no_stream), lob_stream_flag(0), override() #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) ,orig_sql_stm() #endif { should_delete=0; } otl_stream_shell(const int ashould_delete): otl_stream_shell_generic(), ss(0), io(0), adb(0), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), flush_flag(true), stream_type(otl_odbc_no_stream), lob_stream_flag(false), override() #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) ,orig_sql_stm() #endif { should_delete=ashould_delete; } virtual ~otl_stream_shell() { if(should_delete){ delete[] iov; delete[] ov; iov=0; iov_len=0; ov=0; ov_len=0; next_iov_ndx=0; next_ov_ndx=0; override.len=0; flush_flag=true; delete ss; delete io; ss=0; io=0; adb=0; } } private: otl_stream_shell(const otl_stream_shell&): otl_stream_shell_generic(), ss(0), io(0), adb(0), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), flush_flag(false), stream_type(otl_odbc_no_stream), lob_stream_flag(0), override() #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) ,orig_sql_stm() #endif { should_delete=0; } otl_stream_shell& operator=(const otl_stream_shell&) { return *this; } }; template class otl_tmpl_lob_stream: public otl_lob_stream_generic{ public: typedef otl_tmpl_exception otl_exception; typedef otl_tmpl_variable* p_bind_var; typedef otl_tmpl_connect * p_connect; typedef otl_tmpl_cursor * p_cursor; p_bind_var bind_var; p_connect connect; p_cursor cursor; otl_long_string* temp_buf; char* temp_char_buf; bool written_to_flag; bool closed_flag; void init (void* avar,void* aconnect,void* acursor, int andx,int amode,const int alob_is_null=0) OTL_NO_THROW { closed_flag=false; if(written_to_flag){ retcode=bind_var->var_struct.clob_blob(cursor->cursor_struct); written_to_flag=false; if(!retcode){ if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (cursor->cursor_struct, cursor->stm_label?cursor->stm_label: cursor->stm_text); } } connect=OTL_RCAST(p_connect,aconnect); bind_var=OTL_RCAST(p_bind_var,avar); cursor=OTL_RCAST(p_cursor,acursor); mode=amode; retcode=0; lob_is_null=alob_is_null; ndx=andx; offset=0; lob_len=0; eof_flag=0; in_destructor=0; if(bind_var) bind_var->var_struct.set_lob_stream_flag(); } void set_len(void) OTL_NO_THROW { } void set_len(const int /*new_len*/) OTL_NO_THROW { } otl_tmpl_lob_stream() OTL_NO_THROW: otl_lob_stream_generic(false), bind_var(0), connect(0), cursor(0), temp_buf(0), temp_char_buf(0), written_to_flag(false), closed_flag(false) { init(0,0,0,0,otl_lob_stream_zero_mode); } ~otl_tmpl_lob_stream() #if !defined(OTL_DESTRUCTORS_DO_NOT_THROW) OTL_THROWS_OTL_EXCEPTION #endif { in_destructor=1; if(temp_buf){ delete temp_buf; temp_buf=0; } if(temp_char_buf){ delete[] temp_char_buf; temp_char_buf=0; } #if defined(OTL_DESTRUCTORS_DO_NOT_THROW) try{ if(!closed_flag) close(); }catch(otl_exception&){ } #else if(!closed_flag) close(); #endif } #if (defined(OTL_STL) || defined(OTL_ACE) || \ defined(OTL_USER_DEFINED_STRING_CLASS_ON)) && !defined(OTL_UNICODE) otl_lob_stream_generic& operator<<(const OTL_STRING_CONTAINER& s) OTL_THROWS_OTL_EXCEPTION { otl_long_string temp_s(s.c_str(), OTL_SCAST(int,s.length()), OTL_SCAST(int,s.length())); (*this)<>(OTL_STRING_CONTAINER& s) OTL_THROWS_OTL_EXCEPTION { const int TEMP_BUF_SIZE=4096; if(!temp_char_buf)temp_char_buf=new char[TEMP_BUF_SIZE]; if(!temp_buf)temp_buf=new otl_long_string(temp_char_buf,TEMP_BUF_SIZE-1); int iters=0; while(!this->eof()){ ++iters; (*this)>>(*temp_buf); temp_char_buf[temp_buf->len()]=0; if(iters>1) s+=temp_char_buf; else s=temp_char_buf; } return *this; } #endif otl_lob_stream_generic& operator<<(const otl_long_string& s) OTL_THROWS_OTL_EXCEPTION { if(mode!=otl_lob_stream_write_mode){ char* stm=0; char var_info[256]; var_info[0]=0; if(cursor!=0){ if(cursor->stm_label) stm=cursor->stm_label; else stm=cursor->stm_text; } if(bind_var!=0){ otl_var_info_var (bind_var->name, bind_var->ftype, otl_var_long_string, var_info, sizeof(var_info)); } char* vinfo=0; if(var_info[0]!=0) vinfo=&var_info[0]; if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_tmpl_exception (otl_error_msg_9, otl_error_code_9, stm, vinfo); } if(offset==0)offset=1; retcode=bind_var->var_struct.write_blob (s,lob_len,offset,cursor->cursor_struct); written_to_flag=true; if(retcode) return *this; if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (cursor->cursor_struct, cursor->stm_label?cursor->stm_label: cursor->stm_text); } otl_lob_stream_generic& operator>>(otl_long_string& s) OTL_THROWS_OTL_EXCEPTION { if(mode!=otl_lob_stream_read_mode){ char* stm=0; char var_info[256]; var_info[0]=0; if(cursor!=0){ if(cursor->stm_label) stm=cursor->stm_label; else stm=cursor->stm_text; } if(bind_var!=0){ otl_var_info_var (bind_var->name, bind_var->ftype, otl_var_long_string, var_info, sizeof(var_info)); } char* vinfo=0; if(var_info[0]!=0) vinfo=&var_info[0]; if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (otl_error_msg_10, otl_error_code_10, stm, vinfo); } if(offset==0)offset=1; retcode=bind_var->var_struct.read_blob (cursor->cursor_struct,s,ndx,offset,eof_flag); if(retcode){ if(eof()) close(); return *this; } if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw OTL_TMPL_EXCEPTION (cursor->cursor_struct, cursor->stm_label?cursor->stm_label: cursor->stm_text); } int eof(void) OTL_NO_THROW { if(mode!=otl_lob_stream_read_mode)return 1; if(lob_is_null)return 1; return eof_flag; } int len(void) OTL_THROWS_OTL_EXCEPTION { if(cursor==0||connect==0||bind_var==0||lob_is_null)return 0; int alen; retcode=bind_var->var_struct.get_blob_len(ndx,alen); if(retcode)return alen; if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw OTL_TMPL_EXCEPTION (connect->connect_struct, cursor->stm_label?cursor->stm_label: cursor->stm_text); } bool is_initialized(void) OTL_THROWS_OTL_EXCEPTION { if(cursor==0||connect==0||bind_var==0||lob_is_null) return false; else return true; } void close(void) OTL_THROWS_OTL_EXCEPTION { if(in_destructor){ if(mode==otl_lob_stream_read_mode){ bind_var->var_struct.set_lob_stream_flag(0); bind_var->set_not_null(0); } if(mode==otl_lob_stream_write_mode){ retcode=bind_var->var_struct.clob_blob(cursor->cursor_struct); closed_flag=true; written_to_flag=false; if(!retcode){ if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (cursor->cursor_struct, cursor->stm_label?cursor->stm_label: cursor->stm_text); } } return; } if(mode==otl_lob_stream_zero_mode)return; if(mode==otl_lob_stream_read_mode){ bind_var->var_struct.set_lob_stream_flag(0); bind_var->set_not_null(0); init(0,0,0,0,otl_lob_stream_zero_mode); }else{ // write mode if(mode==otl_lob_stream_write_mode){ retcode=bind_var->var_struct.clob_blob(cursor->cursor_struct); written_to_flag=false; closed_flag=true; if(!retcode){ if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return; if(otl_uncaught_exception()) return; throw OTL_TMPL_EXCEPTION (cursor->cursor_struct, cursor->stm_label?cursor->stm_label: cursor->stm_text); } } bind_var->var_struct.set_lob_stream_flag(0); bind_var->set_not_null(0); } } private: otl_tmpl_lob_stream(const otl_tmpl_lob_stream&) OTL_NO_THROW: otl_lob_stream_generic(false), bind_var(0), connect(0), cursor(0), temp_buf(0), temp_char_buf(0), written_to_flag(false), closed_flag(false) { } otl_tmpl_lob_stream& operator=(const otl_tmpl_lob_stream&) { return *this; } }; typedef otl_tmpl_lob_stream otl_lob_stream; class otl_stream{ public: otl_stream_shell* shell; otl_ptr shell_pt; int connected; otl_select_stream** ss; otl_inout_stream** io; otl_connect** adb; int* auto_commit_flag; otl_var_desc** iov; int* iov_len; int* next_iov_ndx; otl_var_desc** ov; int* ov_len; int* next_ov_ndx; otl_select_struct_override* override; int end_marker; int oper_int_called; int last_eof_rc; bool last_oper_was_read_op; protected: int buf_size_; void reset_end_marker(void) { last_eof_rc=0; end_marker=-1; oper_int_called=0; } public: const char* get_stm_text(void) { const char* no_stm_text=OTL_NO_STM_TEXT; switch(shell->stream_type){ case otl_odbc_no_stream: return no_stm_text; case otl_odbc_io_stream: return (*io)->stm_label?(*io)->stm_label:(*io)->stm_text; case otl_odbc_select_stream: return (*ss)->stm_label?(*ss)->stm_label:(*ss)->stm_text; default: return no_stm_text; } } void setBufSize(int buf_size) { buf_size_=buf_size; } int getBufSize(void) const { return buf_size_; } long get_rpc() OTL_THROWS_OTL_EXCEPTION { if((*io)){ (*adb)->reset_throw_count(); return (*io)->get_rpc(); }else if((*ss)){ (*adb)->reset_throw_count(); return (*ss)->_rfc; }else return 0; } operator int(void) OTL_THROWS_OTL_EXCEPTION { if(shell && shell->lob_stream_flag){ if(this->adb&&*this->adb)(*this->adb)->throw_count++; if(this->adb&&*this->adb&&(*this->adb)->throw_count>1)return 0; char* stm_label=0; char* stm_text=0; if((*io)){ stm_label=(*io)->stm_label; stm_text=(*io)->stm_text; }else if((*ss)){ stm_label=(*ss)->stm_label; stm_text=(*ss)->stm_text; } throw otl_exception (otl_error_msg_24, otl_error_code_24, stm_label?stm_label:stm_text); } if(!last_oper_was_read_op){ if(this->adb&&*this->adb)(*this->adb)->throw_count++; if(this->adb&&*this->adb&&(*this->adb)->throw_count>1)return 0; char* stm_label=0; char* stm_text=0; if((*io)){ stm_label=(*io)->stm_label; stm_text=(*io)->stm_text; }else if((*ss)){ stm_label=(*ss)->stm_label; stm_text=(*ss)->stm_text; } throw otl_exception (otl_error_msg_18, otl_error_code_18, stm_label?stm_label:stm_text); } if(end_marker==1)return 0; int rc=0; int temp_eof=eof(); if(temp_eof && end_marker==-1 && oper_int_called==0){ end_marker=1; if(last_eof_rc==1) rc=0; else rc=1; }else if(!temp_eof && end_marker==-1) rc=1; else if(temp_eof && end_marker==-1){ end_marker=0; rc=1; }else if(temp_eof && end_marker==0){ end_marker=1; rc=0; } if(!oper_int_called)oper_int_called=1; return rc; } void cancel(void) OTL_THROWS_OTL_EXCEPTION { if((*ss)){ (*adb)->reset_throw_count(); int status=(*ss)->cursor_struct.cancel(); if(status==0) throw otl_exception((*ss)->cursor_struct); }else if((*io)){ (*adb)->reset_throw_count(); int status=(*io)->cursor_struct.cancel(); if(status==0) throw otl_exception((*io)->cursor_struct); } } void create_var_desc(void) {int i; delete[] (*iov); delete[] (*ov); (*iov)=0; (*iov_len)=0; (*ov)=0; (*ov_len)=0; if((*ss)){ if((*ss)->vl_len>0){ (*iov)=new otl_var_desc[(*ss)->vl_len]; (*iov_len)=(*ss)->vl_len; for(i=0;i<(*ss)->vl_len;++i) (*ss)->vl[i]->copy_var_desc((*iov)[i]); } if((*ss)->sl_len>0){ (*ov)=new otl_var_desc[(*ss)->sl_len]; (*ov_len)=(*ss)->sl_len; for(i=0;i<(*ss)->sl_len;++i){ (*ss)->sl[i].copy_var_desc((*ov)[i]); if((*ss)->sl_desc!=0) (*ov)[i].copy_name((*ss)->sl_desc[i].name); } } }else if((*io)){ if((*io)->vl_len>0){ (*iov)=new otl_var_desc[(*io)->vl_len]; (*iov_len)=(*io)->vl_len; for(i=0;i<(*io)->vl_len;++i) (*io)->vl[i]->copy_var_desc((*iov)[i]); } if((*io)->iv_len>0){ (*ov)=new otl_var_desc[(*io)->iv_len]; (*ov_len)=(*io)->iv_len; for(i=0;i<(*io)->iv_len;++i) (*io)->in_vl[i]->copy_var_desc((*ov)[i]); } } } void set_column_type(const int column_ndx, const int col_type, const int col_size=0) OTL_NO_THROW { if(shell==0){ init_stream(); shell->flush_flag=true; } override->add_override(column_ndx,col_type,col_size); } void set_all_column_types(const unsigned mask=0) OTL_NO_THROW { if(shell==0){ init_stream(); shell->flush_flag=true; } override->set_all_column_types(mask); } void set_flush(const bool flush_flag=true) OTL_NO_THROW { if(shell==0)init_stream(); shell->flush_flag=flush_flag; } void set_lob_stream_mode(const bool lob_stream_flag=false) OTL_NO_THROW { if(shell==0)return; shell->lob_stream_flag=lob_stream_flag; } void inc_next_ov(void) { if((*ov_len)==0)return; if((*next_ov_ndx)<(*ov_len)-1) ++(*next_ov_ndx); else (*next_ov_ndx)=0; } void inc_next_iov(void) { if((*iov_len)==0)return; if((*next_iov_ndx)<(*iov_len)-1) ++(*next_iov_ndx); else (*next_iov_ndx)=0; } otl_var_desc* describe_in_vars(int& desc_len) OTL_NO_THROW { desc_len=0; if(shell==0)return 0; if(shell->iov==0)return 0; desc_len=shell->iov_len; return shell->iov; } otl_var_desc* describe_out_vars(int& desc_len) OTL_NO_THROW { desc_len=0; if(shell==0)return 0; if(shell->ov==0)return 0; desc_len=shell->ov_len; return shell->ov; } otl_var_desc* describe_next_in_var(void) OTL_NO_THROW { if(shell==0)return 0; if(shell->iov==0)return 0; return &(shell->iov[shell->next_iov_ndx]); } otl_var_desc* describe_next_out_var(void) OTL_NO_THROW { if(shell==0)return 0; if(shell->ov==0)return 0; return &(shell->ov[shell->next_ov_ndx]); } void init_stream(void) { buf_size_=1; last_oper_was_read_op=false; shell=0; shell=new otl_stream_shell(0); shell_pt.assign(&shell); connected=0; ss=&(shell->ss); io=&(shell->io); adb=&(shell->adb); auto_commit_flag=&(shell->auto_commit_flag); iov=&(shell->iov); iov_len=&(shell->iov_len); next_iov_ndx=&(shell->next_iov_ndx); ov=&(shell->ov); ov_len=&(shell->ov_len); next_ov_ndx=&(shell->next_ov_ndx); override=&(shell->override); (*io)=0; (*ss)=0; (*adb)=0; (*ov)=0; (*ov_len)=0; (*next_iov_ndx)=0; (*next_ov_ndx)=0; (*auto_commit_flag)=1; (*iov)=0; (*iov_len)=0; } otl_stream (const otl_stream_buffer_size_type arr_size, const char* sqlstm, otl_connect& db, const int implicit_select=otl_explicit_select, const char* sqlstm_label=0) OTL_THROWS_OTL_EXCEPTION: shell(0), shell_pt(), connected(0), ss(0), io(0), adb(0), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), override(0), end_marker(0), oper_int_called(0), last_eof_rc(0), last_oper_was_read_op(false), buf_size_(0) { init_stream(); (*io)=0; (*ss)=0; (*iov)=0; (*iov_len)=0; (*ov)=0; (*ov_len)=0; (*auto_commit_flag)=1; (*next_iov_ndx)=0; (*next_ov_ndx)=0; (*adb)=&db; shell->flush_flag=true; open(arr_size,sqlstm,db,implicit_select,sqlstm_label); } otl_stream() OTL_NO_THROW: shell(0), shell_pt(), connected(0), ss(0), io(0), adb(0), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), override(0), end_marker(0), oper_int_called(0), last_eof_rc(0), last_oper_was_read_op(false), buf_size_(0) { init_stream(); shell->flush_flag=true; } virtual ~otl_stream() #if !defined(OTL_DESTRUCTORS_DO_NOT_THROW) OTL_THROWS_OTL_EXCEPTION #endif { if(!connected)return; try{ if((*io)!=0&&shell->flush_flag==false) (*io)->flush_flag2=false; close(); if(shell!=0){ if((*io)!=0) (*io)->flush_flag2=true; } }catch(OTL_CONST_EXCEPTION otl_exception&){ if(shell!=0){ if((*io)!=0) (*io)->flush_flag2=true; } #if defined(OTL_STL) && defined(OTL_STREAM_POOLING_ON) clean(1); if(shell!=0) shell->should_delete=1; shell_pt.destroy(); #else shell_pt.destroy(); #endif #if !defined(OTL_DESTRUCTORS_DO_NOT_THROW) throw; #endif } #if defined(OTL_STL) && defined(OTL_STREAM_POOLING_ON) if((adb && (*adb) && (*adb)->throw_count>0) #if defined(OTL_STL) && defined(OTL_UNCAUGHT_EXCEPTION_ON) || otl_uncaught_exception() #endif ){ // } #elif defined(OTL_UNCAUGHT_EXCEPTION_ON) if(otl_uncaught_exception()){ // } #else shell_pt.destroy(); #endif } int eof(void) OTL_NO_THROW { if((*io)){ (*adb)->reset_throw_count(); return (*io)->eof(); }else if((*ss)){ (*adb)->reset_throw_count(); return (*ss)->eof(); }else return 1; } void flush(void) OTL_THROWS_OTL_EXCEPTION { if((*io)){ (*adb)->reset_throw_count(); (*io)->flush(); } } void clean(const int clean_up_error_flag=0) OTL_THROWS_OTL_EXCEPTION { if((*io)){ (*adb)->reset_throw_count(); (*io)->clean(clean_up_error_flag); }else if((*ss)){ (*adb)->reset_throw_count(); (*ss)->clean(); } } void rewind(void) OTL_THROWS_OTL_EXCEPTION { if((*io)){ (*adb)->reset_throw_count(); (*io)->rewind(); }else if((*ss)){ (*adb)->reset_throw_count(); (*ss)->rewind(); } } int is_null(void) OTL_NO_THROW { if((*io)) return (*io)->is_null(); else if((*ss)) return (*ss)->is_null(); else return 0; } void set_commit(int auto_commit=0) OTL_NO_THROW { (*auto_commit_flag)=auto_commit; if((*io)){ (*adb)->reset_throw_count(); (*io)->set_commit(auto_commit); } } const char* assign_stream_type (const char* stm_text, const char* stm_label) { const char* temp_stm_text=0; temp_stm_text=stm_label?stm_label:stm_text; return temp_stm_text; } void open (const otl_stream_buffer_size_type arr_size, const char* sqlstm, otl_connect& db, const int implicit_select=otl_explicit_select, const char* sqlstm_label=0) OTL_THROWS_OTL_EXCEPTION { reset_end_marker(); otl_stream_buffer_size_type temp_arr_size=arr_size; if(this->good()){ const char* temp_stm_text=assign_stream_type(sqlstm,sqlstm_label); throw otl_exception (otl_error_msg_29, otl_error_code_29, temp_stm_text); } if(shell==0) init_stream(); buf_size_=arr_size; OTL_TRACE_STREAM_OPEN #if defined(OTL_STL) && defined(OTL_STREAM_POOLING_ON) char temp_buf[128]; otl_itoa(arr_size,temp_buf); OTL_STRING_CONTAINER sql_stm= OTL_STRING_CONTAINER(temp_buf)+ OTL_STRING_CONTAINER("===>")+ sqlstm; otl_stream_shell* temp_shell=OTL_RCAST(otl_stream_shell*,db.sc.find(sql_stm)); if(temp_shell){ if(shell!=0)shell_pt.destroy(); shell=temp_shell; ss=&(shell->ss); io=&(shell->io); if((*io)!=0)(*io)->flush_flag2=true; adb=&(shell->adb); auto_commit_flag=&(shell->auto_commit_flag); iov=&(shell->iov); iov_len=&(shell->iov_len); next_iov_ndx=&(shell->next_iov_ndx); ov=&(shell->ov); ov_len=&(shell->ov_len); next_ov_ndx=&(shell->next_ov_ndx); override=&(shell->override); try{ if((*iov_len)==0)this->rewind(); }catch(OTL_CONST_EXCEPTION otl_exception&){ if((*adb)) (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; throw; } connected=1; return; } shell->orig_sql_stm=sql_stm; #endif delete[] (*iov); delete[] (*ov); (*iov)=0; (*iov_len)=0; (*ov)=0; (*ov_len)=0; (*next_iov_ndx)=0; (*next_ov_ndx)=0; char tmp[7]; char* c=OTL_CCAST(char*,sqlstm); override->lob_stream_mode=shell->lob_stream_flag; while(otl_isspace(*c)||(*c)=='(')++c; OTL_STRNCPY_S(tmp,sizeof(tmp),c,6); tmp[6]=0; c=tmp; while(*c){ *c=OTL_SCAST(char,otl_to_upper(*c)); ++c; } if(adb==0)adb=&(shell->adb); (*adb)=&db; (*adb)->reset_throw_count(); try{ #if (defined(OTL_ODBC_POSTGRESQL) || \ defined(OTL_ODBC_SELECT_STM_EXECUTE_BEFORE_DESCRIBE)) && \ !defined(OTL_ODBC_MULTI_MODE) if((strncmp(tmp,"SELECT",6)==0|| strncmp(tmp,"WITH",4)==0)){ (*ss)=new otl_select_stream(override, temp_arr_size, sqlstm, db,otl_implicit_select, sqlstm_label); shell->stream_type=otl_odbc_select_stream; } #elif defined(OTL_ODBC_MULTI_MODE) int connect_type=(*adb)->connect_struct.get_connection_type(); if((connect_type==OTL_POSTGRESQL_ODBC_CONNECT || connect_type==OTL_ENTERPRISE_DB_ODBC_CONNECT || connect_type==OTL_MYODBC35_ODBC_CONNECT) && (strncmp(tmp,"SELECT",6)==0|| strncmp(tmp,"WITH",4)==0)){ (*ss)=new otl_select_stream(override, temp_arr_size, sqlstm, db,otl_implicit_select, sqlstm_label); shell->stream_type=otl_odbc_select_stream; }else if((strncmp(tmp,"SELECT",6)==0|| strncmp(tmp,"WITH",4)==0)&& !implicit_select){ (*ss)=new otl_select_stream(override,temp_arr_size,sqlstm, db,otl_explicit_select, sqlstm_label); shell->stream_type=otl_odbc_select_stream; } #else if((strncmp(tmp,"SELECT",6)==0|| strncmp(tmp,"WITH",4)==0)&& !implicit_select){ #if defined(OTL_ODBC_TIMESTEN) if(temp_arr_size>128||temp_arr_size<0){ const char* temp_stm_text=assign_stream_type(sqlstm,sqlstm_label); throw otl_exception (otl_error_msg_31, otl_error_code_31, temp_stm_text); } #endif (*ss)=new otl_select_stream(override,temp_arr_size,sqlstm, db,otl_explicit_select, sqlstm_label); shell->stream_type=otl_odbc_select_stream; } #endif else if(tmp[0]=='$'){ (*ss)=new otl_select_stream (override,temp_arr_size, sqlstm,db, 1,sqlstm_label); shell->stream_type=otl_odbc_select_stream; }else{ if(implicit_select){ #if defined(OTL_ODBC_TIMESTEN) if(temp_arr_size>128||temp_arr_size<0){ const char* temp_stm_text=assign_stream_type(sqlstm,sqlstm_label); throw otl_exception (otl_error_msg_31, otl_error_code_31, temp_stm_text); } #endif (*ss)=new otl_select_stream(override,temp_arr_size, sqlstm,db, 1,sqlstm_label); shell->stream_type=otl_odbc_select_stream; }else{ (*io)=new otl_inout_stream (arr_size,sqlstm,db, shell->lob_stream_flag, sqlstm_label); (*io)->flush_flag=shell->flush_flag; shell->stream_type=otl_odbc_io_stream; } } }catch(OTL_CONST_EXCEPTION otl_exception&){ shell_pt.destroy(); throw; } if((*io))(*io)->set_commit((*auto_commit_flag)); create_var_desc(); connected=1; } void intern_cleanup(void) { delete[] (*iov); delete[] (*ov); (*iov)=0; (*iov_len)=0; (*ov)=0; (*ov_len)=0; (*next_iov_ndx)=0; (*next_ov_ndx)=0; override->len=0; override->lob_stream_mode=false; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: try{ (*io)->flush(); (*io)->close(); }catch(OTL_CONST_EXCEPTION otl_exception&){ clean(1); (*io)->close(); delete (*io); (*io)=0; shell->stream_type=otl_odbc_no_stream; throw; } delete (*io); (*io)=0; shell->stream_type=otl_odbc_no_stream; break; case otl_odbc_select_stream: try{ (*ss)->close(); }catch(OTL_CONST_EXCEPTION otl_exception&){ delete (*ss); (*ss)=0; shell->stream_type=otl_odbc_no_stream; throw; } delete (*ss); (*ss)=0; shell->stream_type=otl_odbc_no_stream; break; } (*ss)=0; (*io)=0; if(adb!=0)(*adb)=0; adb=0; } #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) void close(const bool save_in_stream_pool=true) OTL_THROWS_OTL_EXCEPTION #else void close(void) OTL_THROWS_OTL_EXCEPTION #endif { if(shell==0)return; OTL_TRACE_FUNC(0x4,"otl_stream","close","") #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) if(save_in_stream_pool&&(*adb)&& #if defined(OTL_STL) && defined(OTL_UNCAUGHT_EXCEPTION_ON) !(otl_uncaught_exception())&& #elif defined(OTL_UNCAUGHT_EXCEPTION_ON) !(otl_uncaught_exception())&& #endif (*adb)->throw_count==0){ try{ this->flush(); this->clean(1); }catch(OTL_CONST_EXCEPTION otl_exception&){ this->clean(1); throw; } if((*adb) && (*adb)->throw_count>0){ (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; return; } #if defined(OTL_STL) && defined(OTL_UNCAUGHT_EXCEPTION_ON) if(otl_uncaught_exception()){ if((*adb)) (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; return; } #elif defined(OTL_UNCAUGHT_EXCEPTION_ON) if(otl_uncaught_exception()){ if((*adb)) (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; return; } #endif (*adb)->sc.add(shell,shell->orig_sql_stm.c_str()); shell_pt.disconnect(); connected=0; }else{ if((*adb)) (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; } #else intern_cleanup(); connected=0; #endif } otl_column_desc* describe_select(int& desc_len) OTL_NO_THROW { desc_len=0; if((*ss)){ (*adb)->reset_throw_count(); desc_len=(*ss)->sl_len; return (*ss)->sl_desc; } return 0; } int good(void) OTL_NO_THROW { if(!connected)return 0; if((*io)||(*ss)){ (*adb)->reset_throw_count(); return 1; }else return 0; } otl_stream& operator<<(otl_lob_stream& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); if((*io)){ (*io)->operator<<(s); inc_next_iov(); } return *this; } otl_stream& operator>>(otl_lob_stream& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; } inc_next_ov(); return *this; } otl_stream& operator>>(otl_time& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; } return *this; } otl_stream& operator<<(const otl_time& n) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: (*io)->operator<<(n); break; case otl_odbc_select_stream: (*ss)->operator<<(n); if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } return *this; } otl_stream& operator>>(otl_datetime& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; otl_time tmp; (*this)>>tmp; #if defined(OTL_DEFAULT_DATETIME_NULL_TO_VAL) if((*this).is_null()) s=OTL_DEFAULT_DATETIME_NULL_TO_VAL; else{ s.year=tmp.year; s.month=tmp.month; s.day=tmp.day; s.hour=tmp.hour; s.minute=tmp.minute; s.second=tmp.second; s.fraction=otl_from_fraction(tmp.fraction,s.frac_precision); } #else s.year=tmp.year; s.month=tmp.month; s.day=tmp.day; s.hour=tmp.hour; s.minute=tmp.minute; s.second=tmp.second; s.fraction=otl_from_fraction(tmp.fraction,s.frac_precision); #endif OTL_TRACE_WRITE (s.month<<"/"<>", "otl_datetime&"); inc_next_ov(); return *this; } otl_stream& operator<<(const otl_datetime& s) OTL_THROWS_OTL_EXCEPTION { otl_time tmp; last_oper_was_read_op=false; reset_end_marker(); tmp.year=OTL_SCAST(SQLSMALLINT,s.year); tmp.month=OTL_SCAST(SQLSMALLINT,s.month); tmp.day=OTL_SCAST(SQLSMALLINT,s.day); tmp.hour=OTL_SCAST(SQLSMALLINT,s.hour); tmp.minute=OTL_SCAST(SQLSMALLINT,s.minute); tmp.second=OTL_SCAST(SQLSMALLINT,s.second); tmp.fraction=otl_to_fraction(s.fraction,s.frac_precision); (*this)<>", "otl_datetime&"); inc_next_iov(); return *this; } #if !defined(OTL_UNICODE) otl_stream& operator>>(char& c) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(c); break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(c); break; } #if defined(OTL_DEFAULT_CHAR_NULL_TO_VAL) if((*this).is_null()) c=OTL_DEFAULT_CHAR_NULL_TO_VAL; #endif OTL_TRACE_WRITE("'"<>","char&") inc_next_ov(); return *this; } #endif #if !defined(OTL_UNICODE) otl_stream& operator>>(unsigned char& c) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(c); break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(c); break; } #if defined(OTL_DEFAULT_CHAR_NULL_TO_VAL) if((*this).is_null()) c=OTL_DEFAULT_CHAR_NULL_TO_VAL; #endif OTL_TRACE_WRITE("'"<>","unsigned char&") inc_next_ov(); return *this; } #endif #if !defined(OTL_UNICODE) #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) otl_stream& operator>>(OTL_STRING_CONTAINER& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; } #if defined(OTL_USER_DEFINED_STRING_CLASS_DEFAULT_NULL_TO_VAL) if((*this).is_null()){ OTL_USER_DEFINED_STRING_CLASS_DEFAULT_NULL_TO_VAL(s); } #elif defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) s=OTL_DEFAULT_STRING_NULL_TO_VAL; #endif OTL_TRACE_WRITE(s,"operator >>","OTL_STRING_CONTAINER&") inc_next_ov(); return *this; } #endif #endif #if !defined(OTL_UNICODE) otl_stream& operator>>(char* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; } #if defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,OTL_DEFAULT_STRING_NULL_TO_VAL)); #endif OTL_TRACE_WRITE(s,"operator >>","char*") inc_next_ov(); return *this; } #endif #if defined(OTL_UNICODE_STRING_TYPE) otl_stream& operator>>(OTL_UNICODE_STRING_TYPE& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; } #if defined(OTL_USER_DEFINED_STRING_CLASS_DEFAULT_NULL_TO_VAL) if((*this).is_null()){ OTL_USER_DEFINED_STRING_CLASS_DEFAULT_NULL_TO_VAL(s); } #elif defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) s=OTL_RCAST(OTL_UNICODE_CHAR_TYPE*,OTL_DEFAULT_STRING_NULL_TO_VAL); #endif OTL_TRACE_WRITE(s.c_str(), "operator >>", "OTL_UNICODE_STRING_TYPE&"); inc_next_ov(); return *this; } #endif otl_stream& operator>>(unsigned char* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; } #if defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) otl_strcpy (OTL_RCAST(unsigned char*,s), OTL_RCAST(unsigned char*, OTL_CCAST(char*,OTL_DEFAULT_STRING_NULL_TO_VAL))); #endif #if defined(OTL_UNICODE) OTL_TRACE_WRITE(OTL_RCAST(OTL_UNICODE_CHAR_TYPE*,s), "operator >>", OTL_UNICODE_CHAR_TYPE_TRACE_NAME "*") #else OTL_TRACE_WRITE(s,"operator >>","unsigned char*") #endif inc_next_ov(); return *this; } #if defined(OTL_UNICODE) otl_stream& operator>>(OTL_UNICODE_CHAR_TYPE& c) OTL_THROWS_OTL_EXCEPTION { OTL_UNICODE_CHAR_TYPE s[1024]; last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(OTL_RCAST(unsigned char*,s)); break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(OTL_RCAST(unsigned char*,s)); break; } c=s[0]; #if defined(OTL_DEFAULT_CHAR_NULL_TO_VAL) if((*this).is_null()) c=OTL_DEFAULT_CHAR_NULL_TO_VAL; #endif OTL_TRACE_WRITE(c,"operator >>", OTL_UNICODE_CHAR_TYPE_TRACE_NAME "") inc_next_ov(); return *this; } otl_stream& operator>>(OTL_UNICODE_CHAR_TYPE* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(OTL_RCAST(unsigned char*,s)); break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(OTL_RCAST(unsigned char*,s)); break; } #if defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,OTL_DEFAULT_STRING_NULL_TO_VAL)); #endif OTL_TRACE_WRITE(OTL_RCAST(OTL_UNICODE_CHAR_TYPE*,s), "operator >>", OTL_UNICODE_CHAR_TYPE_TRACE_NAME "*") inc_next_ov(); return *this; } #endif otl_stream& operator>>(int& n) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator>>(n); #else (*io)->operator>>(n); #endif break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(n); #else (*ss)->operator>>(n); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) n=OTL_SCAST(int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(n,"operator >>","int&") inc_next_ov(); return *this; } otl_stream& operator>>(unsigned& u) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator>>(u); #else (*io)->operator>>(u); #endif break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(u); #else (*ss)->operator>>(u); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) u=OTL_SCAST(unsigned int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(u,"operator >>","unsigned&") inc_next_ov(); return *this; } otl_stream& operator>>(short& sh) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator>>(sh); #else (*io)->operator>>(sh); #endif break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(sh); #else (*ss)->operator>>(sh); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) sh=OTL_SCAST(short int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(sh,"operator >>","short int&") inc_next_ov(); return *this; } otl_stream& operator>>(long int& l) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator>>(l); #else (*io)->operator>>(l); #endif break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(l); #else (*ss)->operator>>(l); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) l=OTL_SCAST(long int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(l,"operator >>","long int&") inc_next_ov(); return *this; } #if defined(OTL_BIGINT) otl_stream& operator>>(OTL_BIGINT& l) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); #if defined(OTL_STR_TO_BIGINT) && defined(OTL_BIGINT_TO_STR) { otl_var_desc* var_desc=describe_next_out_var(); if(var_desc){ if(var_desc->ftype==otl_var_char){ char temp_val[otl_bigint_str_size]; #if defined(OTL_UNICODE) OTL_CHAR unitemp_val[otl_bigint_str_size]; (*ss)->operator>>(OTL_RCAST(unsigned char*,unitemp_val)); OTL_CHAR* uc=unitemp_val; char* c=temp_val; while(*uc){ *c=OTL_SCAST(char,*uc); ++c; ++uc; } *c=0; #else (*ss)->operator>>(temp_val); #endif OTL_STR_TO_BIGINT(temp_val,l); }else #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator>>(l); #else (*io)->operator>>(l); #endif } } #else #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator>>(l); #else (*io)->operator>>(l); #endif #endif break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); #if defined(OTL_STR_TO_BIGINT) && defined(OTL_BIGINT_TO_STR) { otl_var_desc* var_desc=describe_next_out_var(); if(var_desc){ if(var_desc->ftype==otl_var_char){ char temp_val[otl_bigint_str_size]; (*ss)->operator>>(temp_val); OTL_STR_TO_BIGINT(temp_val,l); }else #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(l); #else (*ss)->operator>>(l); #endif } } #else #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(l); #else (*ss)->operator>>(l); #endif #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) l=OTL_SCAST(OTL_BIGINT,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif #if defined(_MSC_VER) && defined(OTL_TRACE_LEVEL) // VC ++ { char temp_str[otl_bigint_str_size]; _i64toa(l,temp_str,10); OTL_TRACE_WRITE(temp_str,"operator >>","BIGINT&") } #elif !defined(_MSC_VER) && defined(OTL_TRACE_LEVEL) OTL_TRACE_WRITE(l,"operator >>","BIGINT&") #endif inc_next_ov(); return *this; } #endif otl_stream& operator>>(float& f) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator>>(f); #else (*io)->operator>>(f); #endif break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(f); #else (*ss)->operator>>(f); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) f=OTL_SCAST(float,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(f,"operator >>","float&") inc_next_ov(); return *this; } otl_stream& operator>>(double& d) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator>>(d); #else (*io)->operator>>(d); #endif break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(d); #else (*ss)->operator>>(d); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) d=OTL_SCAST(double,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(d,"operator >>","double&") inc_next_ov(); return *this; } otl_stream& operator>>(otl_long_string& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_odbc_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; } OTL_TRACE_WRITE(" string length: "<>","otl_long_string&") inc_next_ov(); return *this; } otl_stream& operator<<(const char c) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: (*io)->operator<<(c); break; case otl_odbc_select_stream: (*ss)->operator<<(c); if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } OTL_TRACE_READ("'"<stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: (*io)->operator<<(c); break; case otl_odbc_select_stream: (*ss)->operator<<(c); if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } #if defined(OTL_UNICODE) otl_stream& operator<<(const OTL_UNICODE_CHAR_TYPE* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ ("\""<stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: (*io)->operator<<(OTL_RCAST(const unsigned char*,s)); break; case otl_odbc_select_stream: (*ss)->operator<<(OTL_RCAST(const unsigned char*,s)); if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const OTL_UNICODE_CHAR_TYPE c) OTL_THROWS_OTL_EXCEPTION { OTL_UNICODE_CHAR_TYPE s[2]; s[0]=c; s[1]=0; (*this)<stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: (*io)->operator<<(s); break; case otl_odbc_select_stream: (*ss)->operator<<(s); if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } #endif #if defined(OTL_UNICODE_STRING_TYPE) otl_stream& operator<<(const OTL_UNICODE_STRING_TYPE& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ("\""<stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: (*io)->operator<<(s); break; case otl_odbc_select_stream: (*ss)->operator<<(s); if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } #endif #if !defined(OTL_UNICODE) otl_stream& operator<<(const char* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ("\""<stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: (*io)->operator<<(s); break; case otl_odbc_select_stream: (*ss)->operator<<(s); if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } #endif otl_stream& operator<<(const unsigned char* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); #if defined(OTL_UNICODE) OTL_TRACE_READ ("\""<stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: (*io)->operator<<(s); break; case otl_odbc_select_stream: (*ss)->operator<<(s); if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const int n) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(n,"operator <<","int"); switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator<<(n); #else (*io)->operator<<(n); #endif break; case otl_odbc_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(n); #else (*ss)->operator<<(n); #endif if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } #if defined(OTL_BIGINT) otl_stream& operator<<(const OTL_BIGINT n) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); #if defined(_MSC_VER) && defined(OTL_TRACE_LEVEL) // VC ++ { char temp_str[otl_bigint_str_size]; _i64toa(n,temp_str,10); OTL_TRACE_READ(temp_str,"operator >>","BIGINT") } #elif !defined(_MSC_VER) && defined(OTL_TRACE_LEVEL) OTL_TRACE_READ(n,"operator >>","BIGINT"); #endif switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: #if defined(OTL_STR_TO_BIGINT) && defined(OTL_BIGINT_TO_STR) { otl_var_desc* var_desc=describe_next_in_var(); if(var_desc){ if(var_desc->ftype==otl_var_char){ char temp_val[otl_bigint_str_size]; OTL_BIGINT_TO_STR(n,temp_val); #if defined(OTL_UNICODE) OTL_CHAR unitemp_val[otl_bigint_str_size]; OTL_CHAR* uc=unitemp_val; char* c=temp_val; while(*c){ *uc=OTL_SCAST(OTL_CHAR,*c); ++c; ++uc; } *uc=0; (*io)->operator<<(OTL_RCAST(const unsigned char*,unitemp_val)); #else (*io)->operator<<(temp_val); #endif }else #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator<<(n); #else (*io)->operator<<(n); #endif } } #else #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator<<(n); #else (*io)->operator<<(n); #endif #endif break; case otl_odbc_select_stream: #if defined(OTL_STR_TO_BIGINT) && defined(OTL_BIGINT_TO_STR) { otl_var_desc* var_desc=describe_next_in_var(); if(var_desc){ if(var_desc->ftype==otl_var_char){ char temp_val[otl_bigint_str_size]; OTL_BIGINT_TO_STR(n,temp_val); (*ss)->operator<<(temp_val); }else #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(n); #else (*ss)->operator<<(n); #endif } } #else #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(n); #else (*ss)->operator<<(n); #endif #endif if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } #endif otl_stream& operator<<(const unsigned u) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(u,"operator <<","unsigned int"); switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator<<(u); #else (*io)->operator<<(u); #endif break; case otl_odbc_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(u); #else (*ss)->operator<<(u); #endif if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const short sh) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(sh,"operator <<","short int"); switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator<<(sh); #else (*io)->operator<<(sh); #endif break; case otl_odbc_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(sh); #else (*ss)->operator<<(sh); #endif if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const long int l) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(l,"operator <<","long int"); switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator<<(l); #else (*io)->operator<<(l); #endif break; case otl_odbc_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(l); #else (*ss)->operator<<(l); #endif if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const float f) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(f,"operator <<","float"); switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator<<(f); #else (*io)->operator<<(f); #endif break; case otl_odbc_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(f); #else (*ss)->operator<<(f); #endif if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const double d) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(d,"operator <<","double"); switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator<<(d); #else (*io)->operator<<(d); #endif break; case otl_odbc_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(d); #else (*ss)->operator<<(d); #endif if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const otl_null& n) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ("NULL","operator <<","otl_null&"); switch(shell->stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: (*io)->operator<<(n); break; case otl_odbc_select_stream: (*ss)->operator<<(n); if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const otl_long_string& d) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(" len= "<stream_type){ case otl_odbc_no_stream: break; case otl_odbc_io_stream: (*io)->operator<<(d); break; case otl_odbc_select_stream: (*ss)->operator<<(d); if(!(*ov)&&(*ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } private: otl_stream& operator=(const otl_stream&) { return *this; } otl_stream(const otl_stream&): shell(0), shell_pt(), connected(0), ss(0), io(0), adb(0), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), override(0), end_marker(0), oper_int_called(0), last_eof_rc(0), last_oper_was_read_op(false), buf_size_(0) { } #if !defined(OTL_STREAM_NO_PRIVATE_BOOL_OPERATORS) otl_stream& operator>>(bool&) OTL_NO_THROW { return *this; } otl_stream& operator<<(const bool) OTL_NO_THROW { return *this; } #endif #if !defined(OTL_STREAM_NO_PRIVATE_UNSIGNED_LONG_OPERATORS) otl_stream& operator>>(unsigned long int&) OTL_NO_THROW { return *this; } otl_stream& operator<<(const unsigned long int) OTL_NO_THROW { return *this; } #endif }; inline otl_connect& operator>>(otl_connect& connect, otl_stream& s) { const char* cmd=connect.getCmd(); const char* invalid_cmd="*** INVALID COMMAND ***"; if(!cmd) cmd=invalid_cmd; s.open(s.getBufSize(),cmd,connect); return connect; } #if (defined(OTL_STL)||defined(OTL_VALUE_TEMPLATE_ON)) && defined(OTL_VALUE_TEMPLATE) template otl_stream& operator<<(otl_stream& s, const otl_value& var) OTL_THROWS_OTL_EXCEPTION { if(var.ind) s< otl_stream& operator>>(otl_stream& s, otl_value& var) OTL_THROWS_OTL_EXCEPTION { s>>var.v; if(s.is_null()) var.ind=true; else var.ind=false; return s; } #endif class otl_nocommit_stream: public otl_stream{ public: otl_nocommit_stream() OTL_NO_THROW : otl_stream() { set_commit(0); } otl_nocommit_stream (const otl_stream_buffer_size_type arr_size, const char* sqlstm, otl_connect& db, const int implicit_select=otl_explicit_select) OTL_THROWS_OTL_EXCEPTION : otl_stream(arr_size,sqlstm,db,implicit_select) { set_commit(0); } void open (otl_stream_buffer_size_type arr_size, const char* sqlstm, otl_connect& db, const int implicit_select=otl_explicit_select) OTL_THROWS_OTL_EXCEPTION { otl_stream::open(arr_size,sqlstm,db,implicit_select); set_commit(0); } }; OTL_ODBC_NAMESPACE_END #endif // ==================== OTL-Adapter for Oracle 7 ===================== #if defined(OTL_ORA7) #if defined(OTL_UNICODE) #error OTL_ORA7 and OTL_UNICODE are incompatible #endif #if defined(OTL_ORA_TEXT_ON) #define text OTL_ORA_TEXT #endif extern "C"{ #include } OTL_ORA7_NAMESPACE_BEGIN const int inVarChar2=1; const int inNumber=2; const int inLong=8; const int inRowId=11; const int inDate=12; const int inRaw=23; const int inLongRaw=24; const int inChar=96; const int inMslabel=106; const int extVarChar2=inVarChar2; const int extNumber=inNumber; const int extInt=3; const int extFloat=4; const int extCChar=5; const int extVarNum=6; const int extLong=inLong; const int extVarChar=9; const int extRowId=inRowId; const int extDate=inDate; const int extVarRaw=15; const int extRaw=extVarRaw; const int extLongRaw=inLongRaw; const int extUInt=68; const int extLongVarChar=94; const int extLongVarRaw=95; const int extChar=inChar; const int extCharZ=97; const int extMslabel=inMslabel; typedef otl_oracle_date otl_time0; class otl_exc{ public: unsigned char msg[1000]; int code; char sqlstate[32]; #if defined(OTL_EXCEPTION_ENABLE_ERROR_OFFSET) int error_offset; #endif #if defined(OTL_EXTENDED_EXCEPTION) char** msg_arr; char** sqlstate_arr; int* code_arr; int arr_len; #endif enum{disabled=0,enabled=1}; otl_exc(): msg(), code(0), sqlstate() #if defined(OTL_EXCEPTION_ENABLE_ERROR_OFFSET) ,error_offset(0) #endif #if defined(OTL_EXTENDED_EXCEPTION) ,msg_arr(0), sqlstate_arr(0), code_arr(0), arr_len(0) #endif { sqlstate[0]=0; msg[0]=0; code=0; #if defined(OTL_EXTENDED_EXCEPTION) msg_arr=0; sqlstate_arr=0; code_arr=0; arr_len=0; #endif } virtual ~otl_exc(){} void init(const char* amsg, const int acode) { OTL_STRCPY_S(OTL_RCAST(char*,msg),sizeof(msg),amsg); code=acode; #if defined(OTL_EXTENDED_EXCEPTION) msg_arr=0; sqlstate_arr=0; code_arr=0; arr_len=0; #endif } }; class otl_conn{ public: Lda_Def* lda; unsigned char hda[512]; int extern_lda; int get_connection_type(void) { return 0; } static int initialize(const int threaded_mode=0) { if(threaded_mode) return !opinit(1); else return 1; } otl_conn(): lda(new Lda_Def), hda(), extern_lda(0) { memset(lda,0,sizeof(*lda)); memset(hda,0,sizeof(hda)); } virtual ~otl_conn() { delete lda; } void set_timeout(const int /*atimeout*/=0){} void set_cursor_type(const int /*acursor_type*/=0){} int ext_logon(Lda_Def* ext_lda,const int auto_commit) {int rc; if(!extern_lda)delete lda; lda=ext_lda; extern_lda=1; if(auto_commit){ rc=ocon(lda); if(rc) return 0; else return 1; } return 1; } int rlogon(const char* connect_str,const int auto_commit) { if(!extern_lda)delete lda; OTL_TRACE_RLOGON_ORA7 (0x1, "otl_connect", "rlogon", connect_str, auto_commit) lda=new Lda_Def; extern_lda=0; memset(lda,0,sizeof(*lda)); memset(hda,0,sizeof(hda)); int rc=olog(lda, hda, OTL_RCAST(unsigned char*,OTL_CCAST(char*,connect_str)), -1, 0, -1, 0, -1, 0 ); if(rc)return 0; if(!auto_commit)return 1; rc=ocon(lda); if(rc) return 0; else return 1; } int logoff(void) { if(extern_lda){ lda=0; extern_lda=0; return 1; }else{ if(!lda)return 1; if(lda->rc==3113||lda->rc==1041||lda->rc==1033||lda->rc==1034){ delete lda; lda=0; return 1; } int rc=ologof(lda); delete lda; lda=0; return !rc; } } void error(otl_exc& exception_struct) { if(!lda){ exception_struct.code=3113; OTL_STRCPY_S(OTL_RCAST(char*,exception_struct.msg), sizeof(exception_struct.msg), "ORA-03113: end-of-file on communication channel" ); return; } size_t len; exception_struct.code=lda->rc; oerhms (lda, lda->rc, exception_struct.msg, sizeof(exception_struct.msg) ); len = strlen(OTL_RCAST(const char*,exception_struct.msg)); exception_struct.msg[len]=0; } int commit(void) { return !ocom(lda); } int auto_commit_on(void) { return !ocon(lda); } int auto_commit_off(void) { return !ocof(lda); } int rollback(void) { return !orol(lda); } private: otl_conn(const otl_conn&): lda(0), hda(), extern_lda(0) { } otl_conn& operator=(const otl_conn&) { return *this; } }; class otl_var{ public: ub1* p_v; sb2* p_ind; ub2* p_rlen; ub2* p_rcode; int ftype; int act_elem_size; int array_size; ub4 max_tab_len; ub4 cur_tab_len; int pl_tab_flag; int vparam_type; int lob_len; int lob_pos; int lob_ftype; int otl_adapter; bool lob_stream_mode; bool charz_flag; sb2 null_ind; otl_var(): p_v(0), p_ind(0), p_rlen(0), p_rcode(0), ftype(0), act_elem_size(0), array_size(0), max_tab_len(0), cur_tab_len(0), pl_tab_flag(0), vparam_type(-1), lob_len(0), lob_pos(0), lob_ftype(0), otl_adapter(otl_ora7_adapter), lob_stream_mode(false), charz_flag(false), null_ind(0) { } virtual ~otl_var() { delete[] p_v; delete[] p_ind; delete[] p_rlen; delete[] p_rcode; } int write_dt(void* trg, const void* src, const int sz) { memcpy(trg,src,sz); return 1; } int read_dt(void* trg, const void* src, const int sz) { memcpy(trg,src,sz); return 1; } int actual_elem_size(void) { return act_elem_size; } void init (const bool, const int aftype, int& aelem_size, const otl_stream_buffer_size_type aarray_size, const void* /*connect_struct*/=0, const int apl_tab_flag=0) { int i,elem_size; ftype=aftype; pl_tab_flag=apl_tab_flag; act_elem_size=aelem_size; if(aftype==otl_var_varchar_long||aftype==otl_var_raw_long){ elem_size=aelem_size+sizeof(sb4); array_size=1; }else if(aftype==otl_var_raw){ elem_size=aelem_size+sizeof(short int); array_size=aarray_size; }else{ elem_size=aelem_size; array_size=aarray_size; } p_v=new ub1[elem_size*OTL_SCAST(unsigned,array_size)]; p_ind=new sb2[array_size]; p_rlen=new ub2[array_size]; p_rcode=new ub2[array_size]; memset(p_v,0,elem_size*OTL_SCAST(unsigned,array_size)); if(aftype==otl_var_varchar_long||aftype==otl_var_raw_long){ if(aelem_size>32760) p_ind[0]=0; else p_ind[0]=OTL_SCAST(short,aelem_size); p_rcode[0]=0; }else{ for(i=0;i otl_ora7_connect; typedef otl_tmpl_cursor otl_cursor; typedef otl_tmpl_exception otl_exception; typedef otl_tmpl_inout_stream otl_inout_stream; typedef otl_tmpl_select_stream otl_select_stream; typedef otl_tmpl_ext_hv_decl otl_ext_hv_decl; class otl_stream_shell; class otl_connect: public otl_ora7_connect{ public: #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) otl_stream_pool sc; void set_stream_pool_size(const int max_size=otl_max_default_pool_size) { sc.init(max_size); } #endif long direct_exec (const char* sqlstm, const int exception_enabled=1) OTL_THROWS_OTL_EXCEPTION { return otl_cursor::direct_exec(*this,sqlstm,exception_enabled); } void syntax_check(const char* sqlstm) OTL_THROWS_OTL_EXCEPTION { otl_cursor::syntax_check(*this,sqlstm); } otl_connect() OTL_NO_THROW : otl_ora7_connect(), cmd_(0) { } otl_connect(const char* connect_str, const int aauto_commit=0) OTL_THROWS_OTL_EXCEPTION : otl_ora7_connect(connect_str, aauto_commit), cmd_(0) { } virtual ~otl_connect() #if !defined(OTL_DESTRUCTORS_DO_NOT_THROW) OTL_THROWS_OTL_EXCEPTION #endif { if(cmd_){ delete[] cmd_; cmd_=0; } #if defined(OTL_DESTRUCTORS_DO_NOT_THROW) try{ logoff(); }catch(otl_exception&){ } #endif } void rlogon(Lda_Def* alda) OTL_THROWS_OTL_EXCEPTION { if(this->connected){ throw otl_exception(otl_error_msg_30,otl_error_code_30); } if(cmd_){ delete[] cmd_; cmd_=0; } connected=0; long_max_size=32760; retcode=connect_struct.ext_logon(alda,0); if(retcode) connected=1; else{ connected=0; throw_count++; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(connect_struct); } } void rlogon(const char* connect_str, const int aauto_commit=0) OTL_THROWS_OTL_EXCEPTION { if(this->connected){ throw otl_exception(otl_error_msg_30,otl_error_code_30); } otl_ora7_connect::rlogon(connect_str,aauto_commit); } void logoff(void) { #if defined(OTL_STL) && defined(OTL_STREAM_POOLING_ON) if(connected) sc.init(sc.max_size); #endif otl_ora7_connect::logoff(); } const char* getCmd(void) const { return cmd_; } otl_connect& operator<<(const char* cmd) { if(!connected){ this->rlogon(cmd); }else{ otl_cursor::direct_exec(*this,cmd); } return *this; } otl_connect& operator<<=(const char* cmd) { if(cmd_){ delete[] cmd_; cmd_=0; } size_t cmd_len=strlen(cmd); cmd_=new char[cmd_len+1]; OTL_STRCPY_S(cmd_,cmd_len+1,cmd); return *this; } private: char* cmd_; otl_connect& operator=(const otl_connect&) { return *this; } otl_connect(const otl_connect&) :otl_ora7_connect(),cmd_(0){} }; // ============ OTL Reference Cursor Streams for Oracle 7 ================= typedef otl_tmpl_variable otl_generic_variable; typedef otl_generic_variable* otl_p_generic_variable; class otl_ref_cursor: public otl_tmpl_cursor { public: int cur_row; int cur_size; int row_count; int array_size; otl_select_struct_override local_override; otl_ref_cursor (otl_connect& db, const char* cur_placeholder_name, const otl_stream_buffer_size_type arr_size=1) :otl_tmpl_cursor (db), cur_row(-1), cur_size(0), row_count(0), array_size(arr_size), local_override(), sel_cur(), rvl_len(otl_var_list_size), rvl(new otl_p_generic_variable[rvl_len]), vl_cur_len(0), cur_placeholder() { local_override.reset(); for(int i=0;i(), cur_row(-1), cur_size(0), row_count(0), array_size(0), local_override(), sel_cur(), rvl_len(0), rvl(0), vl_cur_len(0), cur_placeholder() { local_override.reset(); } virtual ~otl_ref_cursor() { this->in_destructor=1; delete[] rvl; rvl=0; } void open (otl_connect& db, const char* cur_placeholder_name, const otl_stream_buffer_size_type arr_size=1) { int i; local_override.reset(); cur_row=-1; row_count=0; cur_size=0; array_size=arr_size; rvl_len=otl_var_list_size; vl_cur_len=0; rvl=new otl_p_generic_variable[rvl_len]; for(i=0;i::open(db); } void close(void) { local_override.reset(); delete[] rvl; rvl=0; if(sel_cur.connected && sel_cur.adb==0) sel_cur.adb=adb; sel_cur.close(); otl_tmpl_cursor ::close(); } int first(void) {int i,rc; rc=obndrv (&cursor_struct.cda, OTL_RCAST(unsigned char*,cur_placeholder), -1, OTL_RCAST(ub1*,&sel_cur.cursor_struct.cda), sizeof(sel_cur.cursor_struct.cda), 102,-1,0,0,-1,-1); if(rc!=0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception(cursor_struct,stm_label?stm_label:stm_text); } if(cur_row==-2) ; // Special case -- calling describe_select() between parse() and first() else{ exec(1); // Executing the PLSQL master block sel_cur.connected=1; } cur_row=-1; for(i=0;iadb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception(sel_cur.cursor_struct,stm_label?stm_label:stm_text); } row_count=sel_cur.cursor_struct.cda.rpc; OTL_TRACE_FIRST_FETCH cur_size=row_count; if(cur_size!=0)cur_row=0; return cur_size!=0; } int next(void) {int rc; if(cur_row<0)return first(); if(cur_rowadb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception(sel_cur.cursor_struct,stm_label?stm_label:stm_text); } cur_size=sel_cur.cursor_struct.cda.rpc-row_count; row_count=sel_cur.cursor_struct.cda.rpc; OTL_TRACE_NEXT_FETCH if(cur_size!=0)cur_row=0; } return cur_size!=0; } void bind (const int column_num, otl_generic_variable& v) { if(!connected)return; ++vl_cur_len; if(vl_cur_len==rvl_len){ int temp_rvl_len=rvl_len*2; otl_p_generic_variable* temp_rvl= new otl_p_generic_variable[temp_rvl_len]; int i; for(i=0;i::bind(v); } void bind (const char* name, otl_generic_variable& v) { otl_tmpl_cursor ::bind(name,v); } int describe_select (otl_column_desc* desc, int& desc_len) {int i,rc; rc=obndrv (&cursor_struct.cda, OTL_RCAST(unsigned char*,cur_placeholder), -1, OTL_RCAST(ub1*,&sel_cur.cursor_struct.cda), sizeof(sel_cur.cursor_struct.cda), 102,-1,0,0,-1,-1); if(rc!=0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception(cursor_struct,stm_label?stm_label:stm_text); } exec(1); // Executing the PLSQL master block sel_cur.connected=1; cur_row=-2; // Special case -- describe_select() before first() or next() desc_len=0; for(i=1;sel_cur.describe_column(desc[i-1],i);++i) ++desc_len; return 1; } public: otl_cursor sel_cur; protected: int rvl_len; otl_p_generic_variable* rvl; int vl_cur_len; char cur_placeholder[64]; private: otl_ref_cursor(const otl_ref_cursor&) : otl_tmpl_cursor (), cur_row(-1), cur_size(0), row_count(0), array_size(0), local_override(), sel_cur(), rvl_len(0), rvl(0), vl_cur_len(0), cur_placeholder() { } otl_ref_cursor& operator=(const otl_ref_cursor&) { return *this; } }; class otl_ref_select_stream: public otl_ref_cursor{ public: otl_select_struct_override* override; long _rfc; void cleanup(void) {int i; delete[] sl; for(i=0;ilocal_override; otl_ext_hv_decl hvd (this->stm_text, 1, this->stm_label, &temp_local_override, adb ); hvd.alloc_host_var_list(vl,vl_len,*adb); } override=aoverride; try{ parse(); if(vl_len==0){ rewind(); null_fetched=0; } }catch(OTL_CONST_EXCEPTION otl_exception&){ cleanup(); if(this->adb)this->adb->throw_count++; throw; } } virtual ~otl_ref_select_stream() { cleanup(); } void rewind(void) { OTL_TRACE_STREAM_EXECUTION _rfc=0; get_select_list(); ret_code=first(); null_fetched=0; cur_col=-1; cur_in=0; executed=1; } void clean(void) { _rfc=0; null_fetched=0; cur_col=-1; cur_in=0; executed=0; } int is_null(void) { return null_fetched; } int eof(void) { return !ret_code; } otl_ref_select_stream& operator>>(otl_time0& t) { check_if_executed(); if(eof())return *this; get_next(); if(check_type(otl_var_timestamp)&&!eof()){ otl_time0* tm=OTL_RCAST(otl_time0*,sl[cur_col].val(cur_row)); memcpy(OTL_RCAST(void*,&t),tm,otl_oracle_date_size); look_ahead(); } return *this; } otl_ref_select_stream& operator>>(char& c) { check_if_executed(); if(eof())return *this; get_next(); if(check_type(otl_var_char)&&!eof()){ c=*OTL_RCAST(char*,sl[cur_col].val(cur_row)); look_ahead(); } return *this; } otl_ref_select_stream& operator>>(unsigned char& c) { check_if_executed(); if(eof())return *this; get_next(); if(check_type(otl_var_char)&&!eof()){ c=*OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)); look_ahead(); } return *this; } #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) otl_ref_select_stream& operator>>(OTL_STRING_CONTAINER& s) { check_if_executed(); if(eof())return *this; get_next(); switch(sl[cur_col].ftype){ case otl_var_char: if(!eof()){ #if defined(OTL_ACE) s.set(OTL_RCAST(char*,sl[cur_col].val(cur_row)),1); #else s=OTL_RCAST(char*,sl[cur_col].val(cur_row)); #endif look_ahead(); } break; #if defined(USER_DEFINED_STRING_CLASS) || \ defined(OTL_STL) || defined(OTL_ACE) case otl_var_varchar_long: case otl_var_raw_long: if(!eof()){ unsigned char* c=OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)); int len=sl[cur_col].get_len(cur_row); #if (defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS)) && !defined(OTL_ACE) s.assign(OTL_RCAST(char*,c),len); #elif defined(OTL_ACE) s.set(OTL_RCAST(char*,c),len,1); #endif look_ahead(); } break; #endif default: check_type(otl_var_char); } // switch return *this; } #endif otl_ref_select_stream& operator>>(char* s) { check_if_executed(); if(eof())return *this; get_next(); if(check_type(otl_var_char)&&!eof()){ otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,sl[cur_col].val(cur_row))); look_ahead(); } return *this; } otl_ref_select_stream& operator>>(unsigned char* s) { check_if_executed(); if(eof())return *this; get_next(); if(check_type(otl_var_char)&&!eof()){ otl_strcpy2(OTL_RCAST(unsigned char*,s), OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)), sl[cur_col].get_len(cur_row) ); look_ahead(); } return *this; } #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) #define OTL_D5(T,T_type) \ otl_ref_select_stream& operator>>(T& n) \ { \ check_if_executed(); \ if(eof())return *this; \ get_next(); \ if(!eof()){ \ int match_found=otl_numeric_convert_T \ (sl[cur_col].ftype, \ sl[cur_col].val(cur_row), \ n); \ if(!match_found) \ strict_check_throw(T_type); \ look_ahead(); \ } \ return *this; \ } #else #define OTL_D5(T,T_type) \ otl_ref_select_stream& operator>>(T& n) \ { \ check_if_executed(); \ if(eof())return *this; \ get_next(); \ if(!eof()){ \ int match_found=otl_numeric_convert_T \ (sl[cur_col].ftype, \ sl[cur_col].val(cur_row), \ n); \ if(!match_found){ \ if(check_type(otl_var_double,T_type)) \ n=OTL_PCONV(T,double,sl[cur_col].val(cur_row)); \ } \ look_ahead(); \ } \ return *this; \ } #endif #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) OTL_D5(int,otl_var_int) OTL_D5(unsigned,otl_var_unsigned_int) OTL_D5(long,otl_var_long_int) OTL_D5(short,otl_var_short) OTL_D5(float,otl_var_float) OTL_D5(double,otl_var_double) #else template OTL_D5(T,T_type) #endif otl_ref_select_stream& operator>>(otl_long_string& s) { check_if_executed(); if(eof())return *this; get_next(); switch(sl[cur_col].ftype){ case otl_var_varchar_long: case otl_var_raw_long: { if(!eof()){ unsigned char* c=OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)); int len=sl[cur_col].get_len(cur_row); if(len>s.buf_size)len=s.buf_size; otl_memcpy(s.v,c,len,sl[cur_col].ftype); if(sl[cur_col].ftype==otl_var_varchar_long) s.null_terminate_string(len); s.set_len(len); look_ahead(); } } break; case otl_var_raw: { if(!eof()){ unsigned char* c=OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)); int len=OTL_SCAST(int,*OTL_RCAST(unsigned short*,c)); if(len>s.buf_size)len=s.buf_size; otl_memcpy(s.v,c+sizeof(short int),len,sl[cur_col].ftype); s.set_len(len); look_ahead(); } } break; } return *this; } otl_ref_select_stream& operator<<(const otl_time0& t) { check_in_var(); if(check_in_type(otl_var_timestamp,otl_oracle_date_size)){ otl_time0* tm=OTL_RCAST(otl_time0*,vl[cur_in]->val()); memcpy(tm,OTL_RCAST(void*,OTL_CCAST(otl_time0*,&t)),otl_oracle_date_size); } this->vl[cur_in]->set_not_null(0); get_in_next(); return *this; } otl_ref_select_stream& operator<<(const otl_null& /* n */) { check_in_var(); this->vl[cur_in]->set_null(0); get_in_next(); return *this; } otl_ref_select_stream& operator<<(const char c) { check_in_var(); if(check_in_type(otl_var_char,1)){ char* tmp=OTL_RCAST(char*,vl[cur_in]->val()); tmp[0]=c; tmp[1]=0; } this->vl[cur_in]->set_not_null(0); get_in_next(); return *this; } otl_ref_select_stream& operator<<(const unsigned char c) { check_in_var(); if(check_in_type(otl_var_char,1)){ unsigned char* tmp=OTL_RCAST(unsigned char*,vl[cur_in]->val()); tmp[0]=c; tmp[1]=0; } this->vl[cur_in]->set_not_null(0); get_in_next(); return *this; } #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) otl_ref_select_stream& operator<<(const OTL_STRING_CONTAINER& s) { check_in_var(); if(check_in_type(otl_var_char,1)){ int overflow; otl_strcpy (OTL_RCAST(unsigned char*,vl[cur_in]->val()), OTL_RCAST(unsigned char*,OTL_CCAST(char*,s.c_str())), overflow, vl[cur_in]->elem_size, OTL_SCAST(int,s.length()) ); if(overflow){ char temp_var_info[256]; otl_var_info_var (vl[cur_in]->name, vl[cur_in]->ftype, otl_var_char, temp_var_info, sizeof(temp_var_info)); if(this->adb&&this->adb->throw_count>1)return *this; if(this->adb)this->adb->throw_count++; if(otl_uncaught_exception()) return *this; throw otl_exception (otl_error_msg_4, otl_error_code_4, stm_label?stm_label:stm_text, temp_var_info); } } this->vl[cur_in]->set_not_null(0); get_in_next(); return *this; } #endif otl_ref_select_stream& operator<<(const char* s) { check_in_var(); if(check_in_type(otl_var_char,1)){ int overflow; otl_strcpy (OTL_RCAST(unsigned char*,vl[cur_in]->val()), OTL_RCAST(unsigned char*,OTL_CCAST(char*,s)), overflow, vl[cur_in]->elem_size ); if(overflow){ char temp_var_info[256]; otl_var_info_var (vl[cur_in]->name, vl[cur_in]->ftype, otl_var_char, temp_var_info, sizeof(temp_var_info)); if(this->adb&&this->adb->throw_count>1)return *this; if(this->adb)this->adb->throw_count++; if(otl_uncaught_exception()) return *this; throw otl_exception (otl_error_msg_4, otl_error_code_4, stm_label?stm_label:stm_text, temp_var_info); } } this->vl[cur_in]->set_not_null(0); get_in_next(); return *this; } otl_ref_select_stream& operator<<(const unsigned char* s) { check_in_var(); if(check_in_type(otl_var_char,1)){ int overflow; otl_strcpy4 (OTL_RCAST(unsigned char*,vl[cur_in]->val()), OTL_CCAST(unsigned char*,s), overflow, vl[cur_in]->elem_size ); if(overflow){ char temp_var_info[256]; otl_var_info_var (vl[cur_in]->name, vl[cur_in]->ftype, otl_var_char, temp_var_info, sizeof(temp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_exception (otl_error_msg_4, otl_error_code_4, stm_label?stm_label:stm_text, temp_var_info); } } this->vl[cur_in]->set_not_null(0); get_in_next(); return *this; } #define OTL_D6(T,T_type) \ otl_ref_select_stream& operator<<(const T n) \ { \ check_in_var(); \ if(check_in_type(T_type,sizeof(T))){ \ *OTL_RCAST(T*,vl[cur_in]->val())=n; \ } \ this->vl[cur_in]->set_not_null(0); \ get_in_next(); \ return *this; \ } #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) OTL_D6(int,otl_var_int) OTL_D6(unsigned,otl_var_unsigned_int) OTL_D6(long,otl_var_long_int) OTL_D6(short,otl_var_short) OTL_D6(float,otl_var_float) OTL_D6(double,otl_var_double) #else template OTL_D6(T,T_type) #endif int select_list_len(void) { return sl_len; } int column_ftype(int ndx=0) { return sl[ndx].ftype; } int column_size(int ndx=0) { return sl[ndx].elem_size; } otl_column_desc* sl_desc; int sl_len; otl_generic_variable* sl; protected: int null_fetched; int ret_code; int cur_col; int cur_in; int executed; char var_info[256]; void init(void) { sl=0; sl_len=0; null_fetched=0; ret_code=0; sl_desc=0; executed=0; cur_in=0; stm_text=0; } void get_next(void) { if(cur_coladb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception (otl_error_msg_0, otl_error_code_0, this->stm_label? this->stm_label: this->stm_text, var_info); } #endif int check_type_throw(int type_code,int actual_data_type) { int out_type_code; if(actual_data_type!=0) out_type_code=actual_data_type; else out_type_code=type_code; otl_var_info_col (sl[cur_col].pos, sl[cur_col].ftype, out_type_code, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception (otl_error_msg_0, otl_error_code_0, stm_label?stm_label:stm_text, var_info); } int check_type(int type_code, int actual_data_type=0) { if(sl[cur_col].ftype==type_code) return 1; return check_type_throw(type_code,actual_data_type); } void look_ahead(void) { if(cur_col==sl_len-1){ ret_code=next(); cur_col=-1; ++_rfc; } } void get_select_list(void) {int i,j,rc; otl_auto_array_ptr loc_ptr(otl_var_list_size); otl_column_desc* sl_desc_tmp=loc_ptr.ptr; int sld_tmp_len=0; int ftype,elem_size; rc=obndrv (&cursor_struct.cda, OTL_RCAST(unsigned char*,cur_placeholder), -1, OTL_RCAST(ub1*,&sel_cur.cursor_struct.cda), sizeof(sel_cur.cursor_struct.cda), 102,-1,0,0,-1,-1); if(rc!=0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(cursor_struct,stm_label?stm_label:stm_text); } for(i=0;i::bind(*vl[i]); otl_tmpl_cursor ::exec(1); // Executing the PLSQL master block sel_cur.connected=1; cur_row=-2; sld_tmp_len=0; for(i=1;sel_cur.describe_column(sl_desc_tmp[i-1],i);++i){ ++sld_tmp_len; if(sld_tmp_len==loc_ptr.arr_size_){ loc_ptr.double_size(); sl_desc_tmp=loc_ptr.ptr; } } sl_len=sld_tmp_len; if(sl){ delete[] sl; sl=0; } sl=new otl_generic_variable[sl_len==0?1:sl_len]; int max_long_size=this->adb->get_max_long_size(); for(j=0;jlocal_override.getLen()>0?this->local_override:*override, j+1, adb->connect_struct.get_connection_type()); sl[j].copy_pos(j+1); sl[j].init(true,ftype, elem_size, OTL_SCAST(otl_stream_buffer_size_type,array_size), &adb->connect_struct ); } if(sl_desc){ delete[] sl_desc; sl_desc=0; } sl_desc=new otl_column_desc[sl_len==0?1:sl_len]; for(i=0;iname, vl[cur_in]->ftype, type_code, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception (otl_error_msg_0, otl_error_code_0, stm_label?stm_label:stm_text, var_info); } int check_in_type(int type_code,int tsize) { switch(vl[cur_in]->ftype){ case otl_var_char: if(type_code==otl_var_char) return 1; default: if(vl[cur_in]->ftype==type_code && vl[cur_in]->elem_size==tsize) return 1; } return check_in_type_throw(type_code); } void check_in_var_throw(void) { if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception (otl_error_msg_1, otl_error_code_1, stm_label?stm_label:stm_text, 0); } void check_in_var(void) { if(vl_len==0) check_in_var(); } void check_if_executed_throw(void) { if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception (otl_error_msg_2, otl_error_code_2, stm_label?stm_label:stm_text, 0); } void check_if_executed(void) { if(!executed) check_if_executed_throw(); } private: otl_ref_select_stream(const otl_ref_select_stream&): otl_ref_cursor(), override(0), _rfc(0), sl_desc(0), sl_len(0), sl(0), null_fetched(0), ret_code(0), cur_col(0), cur_in(0), executed(0), var_info() { } otl_ref_select_stream& operator=(const otl_ref_select_stream&) { return *this; } }; const int otl_ora7_no_stream=0; const int otl_ora7_io_stream=1; const int otl_ora7_select_stream=2; const int otl_ora7_refcur_select_stream=3; class otl_stream_shell: public otl_stream_shell_generic{ public: otl_ref_select_stream* ref_ss; otl_select_stream* ss; otl_inout_stream* io; otl_connect* adb; bool lob_stream_flag; int auto_commit_flag; otl_var_desc* iov; int iov_len; int next_iov_ndx; otl_var_desc* ov; int ov_len; int next_ov_ndx; bool flush_flag; int stream_type; otl_select_struct_override override; #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) OTL_STRING_CONTAINER orig_sql_stm; #endif otl_stream_shell(): otl_stream_shell_generic(), ref_ss(0), ss(0), io(0), adb(0), lob_stream_flag(false), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), flush_flag(false), stream_type(otl_ora7_no_stream), override() #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) ,rig_sql_stm() #endif { } otl_stream_shell(const int ashould_delete): otl_stream_shell_generic(), ref_ss(0), ss(0), io(0), adb(0), lob_stream_flag(false), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), flush_flag(true), stream_type(otl_ora7_no_stream), override() #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) ,rig_sql_stm() #endif { override.len=0; should_delete=ashould_delete; } virtual ~otl_stream_shell() { if(should_delete){ delete[] iov; delete[] ov; iov=0; iov_len=0; ov=0; ov_len=0; next_iov_ndx=0; next_ov_ndx=0; override.len=0; flush_flag=true; stream_type=otl_ora7_no_stream; delete ss; delete io; delete ref_ss; ss=0; io=0; ref_ss=0; adb=0; } } private: otl_stream_shell(const otl_stream_shell&): otl_stream_shell_generic(), ref_ss(0), ss(0), io(0), adb(0), lob_stream_flag(false), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), flush_flag(false), stream_type(otl_ora7_no_stream), override() #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) ,rig_sql_stm() #endif { } otl_stream_shell& operator=(const otl_stream_shell&) { return *this; } }; class otl_stream{ public: otl_stream_shell* shell; otl_ptr shell_pt; int connected; otl_ref_select_stream** ref_ss; otl_select_stream** ss; otl_inout_stream** io; otl_connect** adb; int* auto_commit_flag; otl_var_desc** iov; int* iov_len; int* next_iov_ndx; otl_var_desc** ov; int* ov_len; int* next_ov_ndx; otl_select_struct_override* override; int end_marker; int oper_int_called; int last_eof_rc; bool last_oper_was_read_op; protected: void reset_end_marker(void) { last_eof_rc=0; end_marker=-1; oper_int_called=0; } int buf_size_; public: const char* get_stm_text(void) { const char* no_stm_text=OTL_NO_STM_TEXT; switch(shell->stream_type){ case otl_ora7_no_stream: return no_stm_text; case otl_ora7_io_stream: return (*io)->stm_label?(*io)->stm_label:(*io)->stm_text; case otl_ora7_select_stream: return (*ss)->stm_label?(*ss)->stm_label:(*ss)->stm_text; case otl_ora7_refcur_select_stream: return (*ref_ss)->stm_label?(*ref_ss)->stm_label:(*ref_ss)->stm_text; default: return no_stm_text; } } void setBufSize(int buf_size) { buf_size_=buf_size; } int getBufSize(void) const { return buf_size_; } long get_rpc() OTL_THROWS_OTL_EXCEPTION { switch(shell->stream_type){ case otl_ora7_no_stream: return 0; case otl_ora7_io_stream: (*adb)->reset_throw_count(); return (*io)->get_rpc(); case otl_ora7_select_stream: (*adb)->reset_throw_count(); return (*ss)->_rfc; case otl_ora7_refcur_select_stream: (*adb)->reset_throw_count(); return (*ref_ss)->_rfc; default: return 0; } } operator int(void) OTL_THROWS_OTL_EXCEPTION { if(!last_oper_was_read_op){ if(this->adb&&*this->adb)(*this->adb)->throw_count++; if(this->adb&&*this->adb&&(*this->adb)->throw_count>1)return 0; char* stm_label=0; char* stm_text=0; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: stm_label=(*io)->stm_label; stm_text=(*io)->stm_text; break; case otl_ora7_select_stream: stm_label=(*ss)->stm_label; stm_text=(*ss)->stm_text; break; case otl_ora7_refcur_select_stream: stm_label=(*ref_ss)->stm_label; stm_text=(*ref_ss)->stm_text; break; } throw otl_exception (otl_error_msg_18, otl_error_code_18, stm_label?stm_label:stm_text); } if(end_marker==1)return 0; int rc=0; int temp_eof=eof(); if(temp_eof && end_marker==-1 && oper_int_called==0){ end_marker=1; if(last_eof_rc==1) rc=0; else rc=1; }else if(!temp_eof && end_marker==-1) rc=1; else if(temp_eof && end_marker==-1){ end_marker=0; rc=1; }else if(temp_eof && end_marker==0){ end_marker=1; rc=0; } if(!oper_int_called)oper_int_called=1; return rc; } void create_var_desc(void) {int i; delete[] (*iov); delete[] (*ov); (*iov)=0; (*iov_len)=0; (*ov)=0; (*ov_len)=0; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: if((*io)->vl_len>0){ (*iov)=new otl_var_desc[(*io)->vl_len]; (*iov_len)=(*io)->vl_len; for(i=0;i<(*io)->vl_len;++i) (*io)->vl[i]->copy_var_desc((*iov)[i]); } if((*io)->iv_len>0){ (*ov)=new otl_var_desc[(*io)->iv_len]; (*ov_len)=(*io)->iv_len; for(i=0;i<(*io)->iv_len;++i) (*io)->in_vl[i]->copy_var_desc((*ov)[i]); } break; case otl_ora7_select_stream: if((*ss)->vl_len>0){ (*iov)=new otl_var_desc[(*ss)->vl_len]; (*iov_len)=(*ss)->vl_len; for(i=0;i<(*ss)->vl_len;++i) (*ss)->vl[i]->copy_var_desc((*iov)[i]); } if((*ss)->sl_len>0){ (*ov)=new otl_var_desc[(*ss)->sl_len]; (*ov_len)=(*ss)->sl_len; for(i=0;i<(*ss)->sl_len;++i){ (*ss)->sl[i].copy_var_desc((*ov)[i]); (*ov)[i].copy_name((*ss)->sl_desc[i].name); } } break; case otl_ora7_refcur_select_stream: if((*ref_ss)->vl_len>0){ (*iov)=new otl_var_desc[(*ref_ss)->vl_len]; (*iov_len)=(*ref_ss)->vl_len; for(i=0;i<(*ref_ss)->vl_len;++i) (*ref_ss)->vl[i]->copy_var_desc((*iov)[i]); } if((*ref_ss)->sl_len>0){ (*ov)=new otl_var_desc[(*ref_ss)->sl_len]; (*ov_len)=(*ref_ss)->sl_len; for(i=0;i<(*ref_ss)->sl_len;++i){ (*ref_ss)->sl[i].copy_var_desc((*ov)[i]); (*ov)[i].copy_name((*ref_ss)->sl_desc[i].name); } } break; } } void set_column_type(const int column_ndx, const int col_type, const int col_size=0) OTL_NO_THROW { if(shell==0){ init_stream(); shell->flush_flag=true; } override->add_override(column_ndx,col_type,col_size); } void set_all_column_types(const unsigned mask=0) OTL_NO_THROW { if(shell==0){ init_stream(); shell->flush_flag=true; } override->set_all_column_types(mask); } void set_flush(const bool flush_flag=true) OTL_NO_THROW { if(shell==0)init_stream(); if(shell==0)return; shell->flush_flag=flush_flag; } void inc_next_ov(void) { if((*ov_len)==0)return; if((*next_ov_ndx)<(*ov_len)-1) ++(*next_ov_ndx); else (*next_ov_ndx)=0; } void inc_next_iov(void) { if((*iov_len)==0)return; if((*next_iov_ndx)<(*iov_len)-1) ++(*next_iov_ndx); else (*next_iov_ndx)=0; } otl_var_desc* describe_in_vars(int& desc_len) OTL_NO_THROW { desc_len=0; if(shell==0)return 0; if(shell->iov==0)return 0; desc_len=shell->iov_len; return shell->iov; } otl_var_desc* describe_out_vars(int& desc_len) OTL_NO_THROW { desc_len=0; if(shell==0)return 0; if(shell->ov==0)return 0; desc_len=shell->ov_len; return shell->ov; } otl_var_desc* describe_next_in_var(void) OTL_NO_THROW { if(shell==0)return 0; if(shell->iov==0)return 0; return &(shell->iov[shell->next_iov_ndx]); } otl_var_desc* describe_next_out_var(void) OTL_NO_THROW { if(shell==0)return 0; if(shell->ov==0)return 0; return &(shell->ov[shell->next_ov_ndx]); } void init_stream(void) { buf_size_=1; last_oper_was_read_op=false; shell=0; shell=new otl_stream_shell(0); shell_pt.assign(&shell); connected=0; ref_ss=&(shell->ref_ss); ss=&(shell->ss); io=&(shell->io); adb=&(shell->adb); auto_commit_flag=&(shell->auto_commit_flag); iov=&(shell->iov); iov_len=&(shell->iov_len); next_iov_ndx=&(shell->next_iov_ndx); ov=&(shell->ov); ov_len=&(shell->ov_len); next_ov_ndx=&(shell->next_ov_ndx); override=&(shell->override); (*ref_ss)=0; (*io)=0; (*ss)=0; (*adb)=0; (*ov)=0; (*ov_len)=0; (*next_iov_ndx)=0; (*next_ov_ndx)=0; (*auto_commit_flag)=1; (*iov)=0; (*iov_len)=0; } otl_stream (const otl_stream_buffer_size_type arr_size, const char* sqlstm, otl_connect& db, const char* ref_cur_placeholder=0, const char* sqlstm_label=0) OTL_THROWS_OTL_EXCEPTION: shell(0), shell_pt(), connected(0), ref_ss(0), ss(0), io(0), adb(0), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), override(0), end_marker(0), oper_int_called(0), last_eof_rc(0), last_oper_was_read_op(0), buf_size_(0) { init_stream(); (*io)=0; (*ss)=0; (*ref_ss)=0; (*iov)=0; (*iov_len)=0; (*ov)=0; (*ov_len)=0; (*auto_commit_flag)=1; (*next_iov_ndx)=0; (*next_ov_ndx)=0; (*adb)=&db; shell->flush_flag=true; open(arr_size,sqlstm,db,ref_cur_placeholder,sqlstm_label); } otl_stream() OTL_NO_THROW: shell(0), shell_pt(), connected(0), ref_ss(0), ss(0), io(0), adb(0), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), override(0), end_marker(0), oper_int_called(0), last_eof_rc(0), last_oper_was_read_op(0), buf_size_(0) { init_stream(); shell->flush_flag=true; } virtual ~otl_stream() #if !defined(OTL_DESTRUCTORS_DO_NOT_THROW) OTL_THROWS_OTL_EXCEPTION #endif { if(!connected)return; try{ if((*io)!=0&&shell->flush_flag==false) (*io)->flush_flag2=false; close(); if(shell!=0){ if((*io)!=0) (*io)->flush_flag2=true; } }catch(OTL_CONST_EXCEPTION otl_exception&){ if(shell!=0){ if((*io)!=0) (*io)->flush_flag2=true; } #if defined(OTL_STL) && defined(OTL_STREAM_POOLING_ON) clean(1); if(shell!=0) shell->should_delete=1; shell_pt.destroy(); #else shell_pt.destroy(); #endif #if !defined(OTL_DESTRUCTORS_DO_NOT_THROW) throw; #endif } #if defined(OTL_STL) && defined(OTL_STREAM_POOLING_ON) if(adb && (*adb) && (*adb)->throw_count>0 #if defined(OTL_STL) && defined(OTL_UNCAUGHT_EXCEPTION_ON) || otl_uncaught_exception() #elif defined(OTL_UNCAUGHT_EXCEPTION_ON) || otl_uncaught_exception() #endif ){ // } #else shell_pt.destroy(); #endif } int eof(void) OTL_NO_THROW { switch(shell->stream_type){ case otl_ora7_no_stream: return 1; case otl_ora7_io_stream: (*adb)->reset_throw_count(); return (*io)->eof(); case otl_ora7_select_stream: (*adb)->reset_throw_count(); return (*ss)->eof(); case otl_ora7_refcur_select_stream: (*adb)->reset_throw_count(); return (*ref_ss)->eof(); default: return 0; } } void flush(void) OTL_THROWS_OTL_EXCEPTION { if((*io)){ (*adb)->reset_throw_count(); (*io)->flush(); } } void clean(const int clean_up_error_flag=0) OTL_THROWS_OTL_EXCEPTION { switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: (*adb)->reset_throw_count(); (*io)->clean(clean_up_error_flag); break; case otl_ora7_select_stream: (*adb)->reset_throw_count(); (*ss)->clean(); break; case otl_ora7_refcur_select_stream: (*adb)->reset_throw_count(); (*ref_ss)->clean(); break; } } void rewind(void) OTL_THROWS_OTL_EXCEPTION { switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: (*adb)->reset_throw_count(); (*io)->rewind(); break; case otl_ora7_select_stream: (*adb)->reset_throw_count(); (*ss)->rewind(); break; case otl_ora7_refcur_select_stream: (*adb)->reset_throw_count(); (*ref_ss)->rewind(); break; } } int is_null(void) OTL_NO_THROW { switch(shell->stream_type){ case otl_ora7_no_stream: return 0; case otl_ora7_io_stream: return (*io)->is_null(); case otl_ora7_select_stream: return (*ss)->is_null(); case otl_ora7_refcur_select_stream: return (*ref_ss)->is_null(); default: return 0; } } void set_commit(int auto_commit=0) OTL_NO_THROW { (*auto_commit_flag)=auto_commit; if((*io)){ (*adb)->reset_throw_count(); (*io)->set_commit(auto_commit); } } void intern_cleanup(void) { delete[] (*iov); delete[] (*ov); (*iov)=0; (*iov_len)=0; (*ov)=0; (*ov_len)=0; (*next_iov_ndx)=0; (*next_ov_ndx)=0; override->len=0; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: try{ (*io)->flush(); (*io)->close(); }catch(OTL_CONST_EXCEPTION otl_exception&){ clean(1); (*io)->close(); delete (*io); (*io)=0; shell->stream_type=otl_ora7_no_stream; throw; } delete (*io); (*io)=0; shell->stream_type=otl_ora7_no_stream; break; case otl_ora7_select_stream: try{ (*ss)->close(); }catch(OTL_CONST_EXCEPTION otl_exception&){ delete (*ss); (*ss)=0; shell->stream_type=otl_ora7_no_stream; throw; } delete (*ss); (*ss)=0; shell->stream_type=otl_ora7_no_stream; break; case otl_ora7_refcur_select_stream: try{ (*ref_ss)->close(); }catch(OTL_CONST_EXCEPTION otl_exception&){ delete (*ref_ss); (*ref_ss)=0; shell->stream_type=otl_ora7_no_stream; throw; } delete (*ref_ss); (*ref_ss)=0; shell->stream_type=otl_ora7_no_stream; break; } (*ss)=0; (*io)=0; (*ref_ss)=0; if(adb!=0)(*adb)=0; adb=0; } void open (const otl_stream_buffer_size_type arr_size, const char* sqlstm, otl_connect& db, const char* ref_cur_placeholder=0, const char* sqlstm_label=0) OTL_THROWS_OTL_EXCEPTION { reset_end_marker(); if(this->good()){ const char* temp_stm_text=0; switch(shell->stream_type){ case otl_ora7_no_stream: temp_stm_text=OTL_NO_STM_TEXT; break; case otl_ora7_io_stream: temp_stm_text=(*io)->stm_label?(*io)->stm_label:(*io)->stm_text; break; case otl_ora7_select_stream: temp_stm_text=(*ss)->stm_label?(*ss)->stm_label:(*ss)->stm_text; case otl_ora7_refcur_select_stream: temp_stm_text=(*ref_ss)->stm_label?(*ref_ss)->stm_label:(*ref_ss)->stm_text; break; default: temp_stm_text=OTL_NO_STM_TEXT; break; } throw otl_exception (otl_error_msg_29, otl_error_code_29, temp_stm_text); } if(shell==0) init_stream(); buf_size_=arr_size; OTL_TRACE_STREAM_OPEN2 #if defined(OTL_STL) && defined(OTL_STREAM_POOLING_ON) char temp_buf[128]; otl_itoa(arr_size,temp_buf); OTL_STRING_CONTAINER sql_stm=OTL_STRING_CONTAINER(temp_buf)+ OTL_STRING_CONTAINER("===>")+sqlstm; otl_stream_shell* temp_shell=OTL_RCAST(otl_stream_shell*, db.sc.find(sql_stm)); if(temp_shell){ if(shell!=0) shell_pt.destroy(); shell=temp_shell; ref_ss=&(shell->ref_ss); ss=&(shell->ss); io=&(shell->io); if((*io)!=0)(*io)->flush_flag2=true; adb=&(shell->adb); auto_commit_flag=&(shell->auto_commit_flag); iov=&(shell->iov); iov_len=&(shell->iov_len); next_iov_ndx=&(shell->next_iov_ndx); ov=&(shell->ov); ov_len=&(shell->ov_len); next_ov_ndx=&(shell->next_ov_ndx); override=&(shell->override); try{ if((*iov_len)==0)this->rewind(); }catch(OTL_CONST_EXCEPTION otl_exception&){ if((*adb)) (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; throw; } connected=1; return; } shell->orig_sql_stm=sql_stm; #endif delete[] (*iov); delete[] (*ov); (*iov)=0; (*iov_len)=0; (*ov)=0; (*ov_len)=0; (*next_iov_ndx)=0; (*next_ov_ndx)=0; char tmp[7]; char* c=OTL_CCAST(char*,sqlstm); while(otl_isspace(*c)||(*c)=='(')++c; OTL_STRNCPY_S(tmp,sizeof(tmp),c,6); tmp[6]=0; c=tmp; while(*c){ *c=OTL_SCAST(char,otl_to_upper(*c)); ++c; } if(adb==0)adb=&(shell->adb); (*adb)=&db; (*adb)->reset_throw_count(); try{ if((strncmp(tmp,"SELECT",6)==0|| strncmp(tmp,"WITH",4)==0)&& ref_cur_placeholder==0){ (*ss)=new otl_select_stream (override, arr_size, sqlstm, db, otl_explicit_select, sqlstm_label); shell->stream_type=otl_ora7_select_stream; }else if(ref_cur_placeholder!=0){ (*ref_ss)=new otl_ref_select_stream (override,arr_size,sqlstm, ref_cur_placeholder,db, sqlstm_label); shell->stream_type=otl_ora7_refcur_select_stream; }else{ (*io)=new otl_inout_stream(arr_size,sqlstm,db,false,sqlstm_label); (*io)->flush_flag=shell->flush_flag; shell->stream_type=otl_ora7_io_stream; } }catch(OTL_CONST_EXCEPTION otl_exception&){ shell_pt.destroy(); throw; } if((*io))(*io)->set_commit((*auto_commit_flag)); create_var_desc(); connected=1; } #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) void close(const bool save_in_stream_pool=true) OTL_THROWS_OTL_EXCEPTION #else void close(void) OTL_THROWS_OTL_EXCEPTION #endif { if(shell==0)return; OTL_TRACE_FUNC(0x4,"otl_stream","close","") #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) if(save_in_stream_pool&&(*adb)&& #if defined(OTL_STL) && defined(OTL_UNCAUGHT_EXCEPTION_ON) !(otl_uncaught_exception())&& #elif defined(OTL_UNCAUGHT_EXCEPTION_ON) !(otl_uncaught_exception())&& #endif (*adb)->throw_count==0){ try{ this->flush(); this->clean(1); }catch(OTL_CONST_EXCEPTION otl_exception&){ this->clean(1); throw; } if((*adb) && (*adb)->throw_count>0){ (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; return; } #if defined(OTL_STL) && defined(OTL_UNCAUGHT_EXCEPTION_ON) if(otl_uncaught_exception()){ if((*adb)) (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; return; } #elif defined(OTL_UNCAUGHT_EXCEPTION_ON) if(otl_uncaught_exception()){ if((*adb)) (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; return; } #endif (*adb)->sc.add(shell,shell->orig_sql_stm.c_str()); shell_pt.disconnect(); connected=0; }else{ if((*adb)) (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; } #else intern_cleanup(); connected=0; #endif } otl_column_desc* describe_select(int& desc_len) OTL_NO_THROW { desc_len=0; switch(shell->stream_type){ case otl_ora7_no_stream: return 0; case otl_ora7_io_stream: return 0; case otl_ora7_select_stream: (*adb)->reset_throw_count(); desc_len=(*ss)->sl_len; return (*ss)->sl_desc; case otl_ora7_refcur_select_stream: (*adb)->reset_throw_count(); desc_len=(*ref_ss)->sl_len; return (*ref_ss)->sl_desc; default: return 0; } } int good(void) OTL_NO_THROW { if(!connected)return 0; if((*io)||(*ss)||(*ref_ss)){ (*adb)->reset_throw_count(); return 1; }else return 0; } otl_stream& operator>>(otl_pl_tab_generic& tab) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; if((*io)){ last_eof_rc=(*io)->eof(); (*io)->operator>>(tab); OTL_TRACE_WRITE(", tab len="<>","PL/SQL Tab&") inc_next_ov(); } return *this; } otl_stream& operator<<(otl_pl_tab_generic& tab) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); if((*io)){ OTL_TRACE_READ(", tab len="<operator<<(tab); inc_next_iov(); } return *this; } #if defined(OTL_PL_TAB) && defined(OTL_STL) otl_stream& operator>>(otl_pl_vec_generic& vec) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; if((*io)){ last_eof_rc=(*io)->eof(); (*io)->operator>>(vec); OTL_TRACE_WRITE(", tab len="<>","PL/SQL Tab&") inc_next_ov(); } return *this; } otl_stream& operator<<(otl_pl_vec_generic& vec) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); if((*io)){ (*io)->operator<<(vec); OTL_TRACE_READ(", tab len="<>(otl_time0& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_ora7_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; case otl_ora7_refcur_select_stream: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(s); break; } return *this; } otl_stream& operator<<(const otl_time0& n) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: (*io)->operator<<(n); break; case otl_ora7_select_stream: (*ss)->operator<<(n); break; case otl_ora7_refcur_select_stream: (*ref_ss)->operator<<(n); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } return *this; } otl_stream& operator>>(otl_datetime& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; #if defined(OTL_ORA7) && defined(OTL_ORA7_STRING_TO_TIMESTAMP) if(describe_next_out_var()->ftype==otl_var_char){ char tmp_str[100]; (*this)>>tmp_str; #if defined(OTL_DEFAULT_DATETIME_NULL_TO_VAL) if((*this).is_null()) s=OTL_DEFAULT_DATETIME_NULL_TO_VAL; else OTL_ORA7_STRING_TO_TIMESTAMP(tmp_str,s); #else OTL_ORA7_STRING_TO_TIMESTAMP(tmp_str,s); #endif OTL_TRACE_WRITE (s.month<<"/"<>", "otl_datetime&"); return *this; }else{ otl_time0 tmp; (*this)>>tmp; #if defined(OTL_DEFAULT_DATETIME_NULL_TO_VAL) if((*this).is_null()) s=OTL_DEFAULT_DATETIME_NULL_TO_VAL; else{ s.year=(OTL_SCAST(int,tmp.century)-100)*100+(OTL_SCAST(int,tmp.year)-100); s.month=tmp.month; s.day=tmp.day; s.hour=tmp.hour-1; s.minute=tmp.minute-1; s.second=tmp.second-1; } #else s.year=(OTL_SCAST(int,tmp.century)-100)*100+(OTL_SCAST(int,tmp.year)-100); s.month=tmp.month; s.day=tmp.day; s.hour=tmp.hour-1; s.minute=tmp.minute-1; s.second=tmp.second-1; #endif OTL_TRACE_WRITE (s.month<<"/"<>", "otl_datetime&") inc_next_ov(); return *this; } #else otl_time0 tmp; (*this)>>tmp; #if defined(OTL_DEFAULT_DATETIME_NULL_TO_VAL) if((*this).is_null()) s=OTL_DEFAULT_DATETIME_NULL_TO_VAL; else{ s.year=(OTL_SCAST(int,tmp.century)-100)*100+(OTL_SCAST(int,tmp.year)-100); s.month=tmp.month; s.day=tmp.day; s.hour=tmp.hour-1; s.minute=tmp.minute-1; s.second=tmp.second-1; } #else s.year=(OTL_SCAST(int,tmp.century)-100)*100+(OTL_SCAST(int,tmp.year)-100); s.month=tmp.month; s.day=tmp.day; s.hour=tmp.hour-1; s.minute=tmp.minute-1; s.second=tmp.second-1; #endif OTL_TRACE_WRITE (s.month<<"/"<>", "otl_datetime&") inc_next_ov(); return *this; #endif } otl_stream& operator<<(const otl_datetime& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); #if defined(OTL_ORA7) && defined(OTL_ORA7_TIMESTAMP_TO_STRING) if(describe_next_in_var()->ftype==otl_var_char){ char tmp_str[100]; OTL_ORA7_TIMESTAMP_TO_STRING(s,tmp_str); OTL_TRACE_READ (s.month<<"/"<>(char& c) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(c); break; case otl_ora7_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(c); break; case otl_ora7_refcur_select_stream: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(c); break; } #if defined(OTL_DEFAULT_CHAR_NULL_TO_VAL) if((*this).is_null()) c=OTL_DEFAULT_CHAR_NULL_TO_VAL; #endif OTL_TRACE_WRITE("'"<>","char&") inc_next_ov(); return *this; } otl_stream& operator>>(unsigned char& c) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(c); break; case otl_ora7_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(c); break; case otl_ora7_refcur_select_stream: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(c); break; } #if defined(OTL_DEFAULT_CHAR_NULL_TO_VAL) if((*this).is_null()) c=OTL_DEFAULT_CHAR_NULL_TO_VAL; #endif OTL_TRACE_WRITE("'"<>","unsigned char&") inc_next_ov(); return *this; } #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) otl_stream& operator>>(OTL_STRING_CONTAINER& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_ora7_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; case otl_ora7_refcur_select_stream: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(s); break; } #if defined(OTL_USER_DEFINED_STRING_CLASS_DEFAULT_NULL_TO_VAL) if((*this).is_null()){ OTL_USER_DEFINED_STRING_CLASS_DEFAULT_NULL_TO_VAL(s); } #elif defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) s=OTL_DEFAULT_STRING_NULL_TO_VAL; #endif OTL_TRACE_WRITE("\""<>","OTL_STRING_CONTAINER&") inc_next_ov(); return *this; } #endif otl_stream& operator>>(char* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_ora7_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; case otl_ora7_refcur_select_stream: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(s); break; } #if defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,OTL_DEFAULT_STRING_NULL_TO_VAL) ); #endif OTL_TRACE_WRITE("\""<>","char*") inc_next_ov(); return *this; } otl_stream& operator>>(unsigned char* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_ora7_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; case otl_ora7_refcur_select_stream: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(s); break; } #if defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,OTL_DEFAULT_STRING_NULL_TO_VAL) ); #endif #if defined(OTL_UNICODE) OTL_TRACE_WRITE ("\""<>", OTL_UNICODE_CHAR_TYPE_TRACE_NAME "*") #else OTL_TRACE_WRITE("\""<>","unsigned char*") #endif inc_next_ov(); return *this; } otl_stream& operator>>(int& n) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: last_eof_rc=(*io)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator>>(n); #else (*io)->operator>>(n); #endif break; case otl_ora7_select_stream: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(n); #else (*ss)->operator>>(n); #endif break; case otl_ora7_refcur_select_stream: last_eof_rc=(*ref_ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator>>(n); #else (*ref_ss)->operator>>(n); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) n=OTL_SCAST(int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(n,"operator >>","int&") inc_next_ov(); return *this; } otl_stream& operator>>(unsigned& u) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: last_eof_rc=(*io)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator>>(u); #else (*io)->operator>>(u); #endif break; case otl_ora7_select_stream: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(u); #else (*ss)->operator>>(u); #endif break; case otl_ora7_refcur_select_stream: last_eof_rc=(*ref_ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator>>(u); #else (*ref_ss)->operator>>(u); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) u=OTL_SCAST(unsigned int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(u,"operator >>","unsigned&") inc_next_ov(); return *this; } otl_stream& operator>>(short& sh) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: last_eof_rc=(*io)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator>>(sh); #else (*io)->operator>>(sh); #endif break; case otl_ora7_select_stream: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(sh); #else (*ss)->operator>>(sh); #endif break; case otl_ora7_refcur_select_stream: last_eof_rc=(*ref_ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator>>(sh); #else (*ref_ss)->operator>>(sh); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) sh=OTL_SCAST(short int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(sh,"operator >>","short int&") inc_next_ov(); return *this; } otl_stream& operator>>(long int& l) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: last_eof_rc=(*io)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator>>(l); #else (*io)->operator>>(l); #endif break; case otl_ora7_select_stream: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(l); #else (*ss)->operator>>(l); #endif break; case otl_ora7_refcur_select_stream: last_eof_rc=(*ref_ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator>>(l); #else (*ref_ss)->operator>>(l); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) l=OTL_SCAST(long int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(l,"operator >>","long int&") inc_next_ov(); return *this; } otl_stream& operator>>(float& f) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: last_eof_rc=(*io)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator>>(f); #else (*io)->operator>>(f); #endif break; case otl_ora7_select_stream: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(f); #else (*ss)->operator>>(f); #endif break; case otl_ora7_refcur_select_stream: last_eof_rc=(*ref_ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator>>(f); #else (*ref_ss)->operator>>(f); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) f=OTL_SCAST(float,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(f,"operator >>","float&") inc_next_ov(); return *this; } otl_stream& operator>>(double& d) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: last_eof_rc=(*io)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator>>(d); #else (*io)->operator>>(d); #endif break; case otl_ora7_select_stream: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(d); #else (*ss)->operator>>(d); #endif break; case otl_ora7_refcur_select_stream: last_eof_rc=(*ref_ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator>>(d); #else (*ref_ss)->operator>>(d); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) d=OTL_SCAST(double,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(d,"operator >>","double&") inc_next_ov(); return *this; } otl_stream& operator>>(otl_long_string& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_ora7_select_stream: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; case otl_ora7_refcur_select_stream: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(s); break; } OTL_TRACE_WRITE(" len="<>","otl_long_string&") inc_next_ov(); return *this; } otl_stream& operator<<(const char c) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ("'"<stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: (*io)->operator<<(c); break; case otl_ora7_select_stream: (*ss)->operator<<(c); break; case otl_ora7_refcur_select_stream: (*ref_ss)->operator<<(c); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const unsigned char c) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ("'"<stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: (*io)->operator<<(c); break; case otl_ora7_select_stream: (*ss)->operator<<(c); break; case otl_ora7_refcur_select_stream: (*ref_ss)->operator<<(c); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) otl_stream& operator<<(const OTL_STRING_CONTAINER& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ("\""<stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: (*io)->operator<<(s); break; case otl_ora7_select_stream: (*ss)->operator<<(s); break; case otl_ora7_refcur_select_stream: (*ref_ss)->operator<<(s); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } #endif otl_stream& operator<<(const char* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ("\""<stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: (*io)->operator<<(s); break; case otl_ora7_select_stream: (*ss)->operator<<(s); break; case otl_ora7_refcur_select_stream: (*ref_ss)->operator<<(s); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const unsigned char* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); #if defined(OTL_UNICODE) OTL_TRACE_READ ("\""<stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: (*io)->operator<<(s); break; case otl_ora7_select_stream: (*ss)->operator<<(s); break; case otl_ora7_refcur_select_stream: (*ref_ss)->operator<<(s); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const int n) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(n,"operator <<","int") switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator<<(n); #else (*io)->operator<<(n); #endif break; case otl_ora7_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(n); #else (*ss)->operator<<(n); #endif break; case otl_ora7_refcur_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator<<(n); #else (*ref_ss)->operator<<(n); #endif if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const unsigned u) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(u,"operator <<","unsigned") switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator<<(u); #else (*io)->operator<<(u); #endif break; case otl_ora7_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(u); #else (*ss)->operator<<(u); #endif break; case otl_ora7_refcur_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator<<(u); #else (*ref_ss)->operator<<(u); #endif if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const short sh) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(sh,"operator <<","short int") switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator<<(sh); #else (*io)->operator<<(sh); #endif break; case otl_ora7_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(sh); #else (*ss)->operator<<(sh); #endif break; case otl_ora7_refcur_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator<<(sh); #else (*ref_ss)->operator<<(sh); #endif if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const long int l) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(l,"operator <<","long int") switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator<<(l); #else (*io)->operator<<(l); #endif break; case otl_ora7_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(l); #else (*ss)->operator<<(l); #endif break; case otl_ora7_refcur_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator<<(l); #else (*ref_ss)->operator<<(l); #endif if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const float f) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(f,"operator <<","float") switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator<<(f); #else (*io)->operator<<(f); #endif break; case otl_ora7_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(f); #else (*ss)->operator<<(f); #endif break; case otl_ora7_refcur_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator<<(f); #else (*ref_ss)->operator<<(f); #endif if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const double d) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(d,"operator <<","double") switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*io)->operator<<(d); #else (*io)->operator<<(d); #endif break; case otl_ora7_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(d); #else (*ss)->operator<<(d); #endif break; case otl_ora7_refcur_select_stream: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator<<(d); #else (*ref_ss)->operator<<(d); #endif if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const otl_null& n) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ("NULL","operator <<","otl_null&") switch(shell->stream_type){ case otl_ora7_no_stream: break; case otl_ora7_io_stream: (*io)->operator<<(n); break; case otl_ora7_select_stream: (*ss)->operator<<(n); break; case otl_ora7_refcur_select_stream: (*ref_ss)->operator<<(n); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const otl_long_string& d) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(" len="<operator<<(d); inc_next_iov(); } return *this; } private: otl_stream& operator=(const otl_stream&) { return *this; } otl_stream(const otl_stream&): shell(0), shell_pt(), connected(0), ref_ss(0), ss(0), io(0), adb(0), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), override(0), end_marker(0), oper_int_called(0), last_eof_rc(0), last_oper_was_read_op(0), buf_size_(0) { } #if !defined(OTL_STREAM_NO_PRIVATE_BOOL_OPERATORS) otl_stream& operator>>(bool&) OTL_NO_THROW { return *this; } otl_stream& operator<<(const bool) OTL_NO_THROW { return *this; } #endif #if !defined(OTL_STREAM_NO_PRIVATE_UNSIGNED_LONG_OPERATORS) otl_stream& operator>>(unsigned long int&) OTL_NO_THROW { return *this; } otl_stream& operator<<(const unsigned long int) OTL_NO_THROW { return *this; } #endif }; inline otl_connect& operator>>(otl_connect& connect, otl_stream& s) { const char* cmd=connect.getCmd(); const char* invalid_cmd="*** INVALID COMMAND ***"; if(!cmd) cmd=invalid_cmd; s.open(s.getBufSize(),cmd,connect); return connect; } #if (defined(OTL_STL)||defined(OTL_VALUE_TEMPLATE_ON)) && defined(OTL_VALUE_TEMPLATE) template otl_stream& operator<<(otl_stream& s, const otl_value& var) OTL_THROWS_OTL_EXCEPTION { if(var.ind) s< otl_stream& operator>>(otl_stream& s, otl_value& var) OTL_THROWS_OTL_EXCEPTION { s>>var.v; if(s.is_null()) var.ind=true; else var.ind=false; return s; } #endif typedef otl_tmpl_nocommit_stream otl_nocommit_stream; #if defined(OTL_BIGINT) && defined(OTL_STR_TO_BIGINT) && \ defined(OTL_BIGINT_TO_STR) inline otl_stream& operator>>(otl_stream& s, OTL_BIGINT& n) OTL_THROWS_OTL_EXCEPTION { char temp_val[otl_bigint_str_size]; s>>temp_val; if(s.is_null()){ #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if(s.is_null()) n=OTL_SCAST(OTL_BIGINT,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif return s; } OTL_STR_TO_BIGINT(temp_val,n) return s; } inline otl_stream& operator<<(otl_stream& s, const OTL_BIGINT n) OTL_THROWS_OTL_EXCEPTION { char temp_val[otl_bigint_str_size]; OTL_BIGINT_TO_STR(n,temp_val); s< #if !defined(OTL_ORA_DOES_NOT_UNDEF_MIN_MAX) #if defined(min) #undef min #endif #if defined(max) #undef max #endif #endif #define OTL_UTF8_BYTES_PER_CHAR (4) #if defined(OTL_ORA8_PROC) extern "C" { #include } #endif OTL_ORA8_NAMESPACE_BEGIN const int inVarChar2=1; const int inNumber=2; const int inLong=8; const int inRowId=104; const int inDate=12; const int inRaw=23; const int inLongRaw=24; const int inChar=96; #if defined(OTL_ORA10G)||defined(OTL_ORA10G_R2) const int inBFloat=SQLT_IBFLOAT; const int inBDouble=SQLT_IBDOUBLE; #endif const int inMslabel=105; const int inUserDefinedType=108; const int inRef=111; const int inCLOB=112; const int inBLOB=113; #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) const int inTimestamp=SQLT_TIMESTAMP; const int inTimestamp_TZ=SQLT_TIMESTAMP_TZ; const int inTimestamp_LTZ=SQLT_TIMESTAMP_LTZ; const int inIntervalYM=SQLT_INTERVAL_YM; const int inIntervalDS=SQLT_INTERVAL_DS; #endif const int extVarChar2=1; const int extNumber=2; const int extInt=3; const int extFloat=4; #if defined(OTL_ORA_MAP_STRINGS_TO_CHARZ) const int extCChar=97; #else const int extCChar=5; #endif const int extVarNum=6; const int extLong=8; const int extVarChar=9; const int extRowId=11; const int extDate=12; const int extVarRaw=15; const int extRaw=extVarRaw; const int extLongRaw=24; const int extUInt=68; const int extLongVarChar=94; const int extLongVarRaw=95; const int extChar=96; const int extCharZ=97; const int extMslabel=105; const int extCLOB=inCLOB; const int extBLOB=inBLOB; #if (defined(OTL_ORA10G)||defined(OTL_ORA10G_R2))&&!defined(OTL_ORA_LEGACY_NUMERIC_TYPES) const int extBFloat=SQLT_BFLOAT; const int extBDouble=SQLT_BDOUBLE; #endif #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) const int extTimestamp=SQLT_TIMESTAMP; const int extTimestamp_TZ=SQLT_TIMESTAMP_TZ; const int extTimestamp_LTZ=SQLT_TIMESTAMP_LTZ; #endif #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) typedef otl_datetime otl_time0; #else typedef otl_oracle_date otl_time0; #endif class otl_exc{ public: unsigned char msg[1000]; int code; char sqlstate[32]; #if defined(OTL_EXCEPTION_ENABLE_ERROR_OFFSET) int error_offset; #endif #if defined(OTL_EXTENDED_EXCEPTION) char** msg_arr; char** sqlstate_arr; int* code_arr; int arr_len; #endif enum{disabled=0,enabled=1}; otl_exc(): msg(), code(0), sqlstate() #if defined(OTL_EXCEPTION_ENABLE_ERROR_OFFSET) ,error_offset(-1) #endif #if defined(OTL_EXTENDED_EXCEPTION) ,msg_arr(0), sqlstate_arr(0), code_arr(0), arr_len(0) #endif { sqlstate[0]=0; msg[0]=0; } virtual ~otl_exc(){} void init(const char* amsg, const int acode) { OTL_STRCPY_S(OTL_RCAST(char*,msg),sizeof(msg),amsg); code=acode; #if defined(OTL_EXCEPTION_ENABLE_ERROR_OFFSET) error_offset=-1; #endif #if defined(OTL_EXTENDED_EXCEPTION) msg_arr=0; sqlstate_arr=0; code_arr=0; arr_len=0; #endif } }; class otl_conn{ public: OCIEnv *envhp; // OCI environment handle OCIServer *srvhp; // OCI Server handle OCIError *errhp; // OCI Error handle OCISvcCtx *svchp; // OCI Service context handle OCISession *authp; // OCI Session handle int auto_commit; int extern_lda; int attached; int in_session; int char_set_; int session_begin_count; int session_mode_; int ext_cred; int last_status; char* xa_server_external_name; char* xa_server_internal_name; #if defined(OTL_ORA_OCI_ENV_CREATE) bool threaded_mode; #endif int get_connection_type(void) { return 0; } #if !defined(OTL_ORA_OCI_ENV_CREATE) static int initialize(const int threaded_mode=0) { int status; int mode; if(threaded_mode) mode=OCI_THREADED; else mode=OCI_DEFAULT; status=OCIInitialize (OTL_SCAST(ub4,mode), OTL_RCAST(dvoid *,0), 0, 0, 0); if(status!=OCI_SUCCESS) return 0; else return 1; #else static int initialize(const int /*threaded_mode*/) { return 1; #endif } otl_conn(): envhp(0), srvhp(0), errhp(0), svchp(0), authp(0), auto_commit(0), extern_lda(0), attached(0), in_session(0), char_set_(SQLCS_IMPLICIT), session_begin_count(0), session_mode_(OCI_DEFAULT), ext_cred(0), last_status(OCI_SUCCESS), xa_server_external_name(0), xa_server_internal_name(0) #if defined(OTL_ORA_OCI_ENV_CREATE) ,threaded_mode(false) #endif { } #if defined(OTL_ORA_OCI_ENV_CREATE) void set_connect_mode(bool mode) { threaded_mode=mode; } #endif void set_char_set(const int char_set) { char_set_=char_set; } void set_xa_server_external_name(const char* name) { if(xa_server_external_name){ delete[] xa_server_external_name; xa_server_external_name=0; } size_t len=strlen(name)+1; xa_server_external_name=new char[len]; OTL_STRCPY_S(xa_server_external_name,len,name); } void set_xa_server_internal_name(const char* name) { if(xa_server_internal_name){ delete[] xa_server_internal_name; xa_server_internal_name=0; } size_t len=strlen(name)+1; xa_server_internal_name=new char[len]; OTL_STRCPY_S(xa_server_internal_name,len,name); } void delete_xa_strings(void ) { if(xa_server_external_name){ delete[] xa_server_external_name; xa_server_external_name=0; } if(xa_server_internal_name){ delete[] xa_server_internal_name; xa_server_internal_name=0; } } virtual ~otl_conn() { delete_xa_strings(); } void set_timeout(const int /*atimeout*/=0){} void set_cursor_type(const int /*acursor_type*/=0){} int cancel(void) {int status; status=OCIBreak(srvhp,errhp); if(status) return 0; else return 1; } int reset(void) {int status; status=OCIReset(srvhp,errhp); if(status) return 0; else return 1; } int server_attach(const char* tnsname) {int& status=last_status; envhp=0; srvhp=0; errhp=0; svchp=0; authp=0; extern_lda=0; attached=0; in_session=0; session_begin_count=0; #if !defined(OTL_ORA_OCI_ENV_CREATE) status=OCIEnvInit (OTL_RCAST(OCIEnv**,&envhp), OCI_DEFAULT, 0, 0); #else status=OCIEnvCreate (OTL_RCAST(OCIEnv**,&envhp), #if defined(OTL_ORA_OCI_ENV_CREATE_MODE) OTL_ORA_OCI_ENV_CREATE_MODE, #else threaded_mode?OCI_THREADED:OCI_DEFAULT, #endif 0, 0, 0, 0, 0, 0); #endif if(status)return 0; #if defined(__GNUC__) && (__GNUC__>=4) void* temp_errhp=&errhp; #endif status=OCIHandleAlloc (OTL_RCAST(dvoid*,envhp), #if defined(__GNUC__) && (__GNUC__>=4) OTL_RCAST(dvoid**,temp_errhp), #else OTL_RCAST(dvoid**,&errhp), #endif OCI_HTYPE_ERROR, 0, 0); if(status)return 0; #if defined(__GNUC__) && (__GNUC__>=4) void* temp_srvhp=&srvhp; #endif status=OCIHandleAlloc (OTL_RCAST(dvoid*,envhp), #if defined(__GNUC__) && (__GNUC__>=4) OTL_RCAST(dvoid**,temp_srvhp), #else OTL_RCAST(dvoid**,&srvhp), #endif OCI_HTYPE_SERVER, 0, 0); if(status)return 0; #if defined(__GNUC__) && (__GNUC__>=4) void * temp_svchp=&svchp; #endif status=OCIHandleAlloc (OTL_RCAST(dvoid*,envhp), #if defined(__GNUC__) && (__GNUC__>=4) OTL_RCAST(dvoid**,temp_svchp), #else OTL_RCAST(dvoid**,&svchp), #endif OCI_HTYPE_SVCCTX, 0, 0); if(status)return 0; status=OCIServerAttach (srvhp, errhp, tnsname==0?OTL_RCAST(text*,OTL_CCAST(char*,"")): OTL_RCAST(text*,OTL_CCAST(char*,tnsname)), tnsname==0?0:OTL_SCAST(sb4,strlen(OTL_CCAST(char*,tnsname))), 0); if(status)return 0; status=OCIAttrSet (OTL_RCAST(dvoid*,svchp), OCI_HTYPE_SVCCTX, OTL_RCAST(dvoid*,srvhp), 0, OCI_ATTR_SERVER, OTL_RCAST(OCIError*,errhp)); if(status)return 0; if(xa_server_external_name!=0 && xa_server_internal_name!=0){ status=OCIAttrSet (OTL_RCAST(dvoid*,srvhp), OCI_HTYPE_SERVER, OTL_RCAST(dvoid*,xa_server_external_name), 0, OCI_ATTR_EXTERNAL_NAME, errhp); if(status)return 0; status=OCIAttrSet (OTL_RCAST(dvoid*,srvhp), OCI_HTYPE_SERVER, OTL_RCAST(dvoid*,xa_server_internal_name), 0, OCI_ATTR_INTERNAL_NAME, errhp); if(status)return 0; } #if defined(__GNUC__) && (__GNUC__>=4) void* temp_authp=&authp; #endif status=OCIHandleAlloc (OTL_RCAST(dvoid*,envhp), #if defined(__GNUC__) && (__GNUC__>=4) OTL_RCAST(dvoid **,temp_authp), #else OTL_RCAST(dvoid **,&authp), #endif OTL_SCAST(ub4,OCI_HTYPE_SESSION), 0, 0); if(status)return 0; attached=1; return 1; } int session_begin(const int aauto_commit) {int& status=last_status; int cred_type; if(!attached)return 0; if(session_begin_count==0)return 0; if(ext_cred) cred_type=OCI_CRED_EXT; else cred_type=OCI_CRED_RDBMS; status=OCISessionBegin (svchp, errhp, authp, cred_type, OTL_SCAST(ub4,session_mode_)); if(status!=OCI_SUCCESS && status!=OCI_SUCCESS_WITH_INFO) return 0; in_session=1; auto_commit=aauto_commit; ++session_begin_count; return 1; } int session_begin (const char* userid, const char* password, const int aauto_commit, const int session_mode=OCI_DEFAULT) {int& status=last_status; int cred_type; if(!attached)return 0; status=OCIAttrSet (OTL_RCAST(dvoid*,authp), OTL_SCAST(ub4,OCI_HTYPE_SESSION), OTL_RCAST(dvoid*,OTL_CCAST(char*,userid)), OTL_SCAST(ub4,strlen(OTL_CCAST(char*,userid))), OTL_SCAST(ub4,OCI_ATTR_USERNAME), errhp); if(status)return 0; status=OCIAttrSet (OTL_RCAST(dvoid*,authp), OTL_SCAST(ub4,OCI_HTYPE_SESSION), OTL_RCAST(dvoid*,OTL_CCAST(char*,password)), OTL_SCAST(ub4,strlen(OTL_CCAST(char*,password))), OTL_SCAST(ub4,OCI_ATTR_PASSWORD), errhp); if(status)return 0; cred_type=OCI_CRED_RDBMS; if(userid[0]==0&&password[0]==0){ ext_cred=1; cred_type=OCI_CRED_EXT; }else{ ext_cred=0; cred_type=OCI_CRED_RDBMS; } session_mode_=session_mode; status=OCISessionBegin (svchp, errhp, authp, cred_type, OTL_SCAST(ub4,session_mode_)); if(status!=OCI_SUCCESS && status!=OCI_SUCCESS_WITH_INFO) return 0; status=OCIAttrSet (OTL_RCAST(dvoid*,svchp), OTL_SCAST(ub4,OCI_HTYPE_SVCCTX), OTL_RCAST(dvoid *,authp), 0, OTL_SCAST(ub4,OCI_ATTR_SESSION), errhp); if(status)return 0; in_session=1; auto_commit=aauto_commit; ++session_begin_count; return 1; } #if defined(OTL_ORA8I) || defined(OTL_ORA9I) int change_password (const char* user_name, const char* password, const char* new_password) {int& status=last_status; OCIAttrSet (OTL_RCAST(dvoid*,svchp), OTL_SCAST(ub4,OCI_HTYPE_SVCCTX), OTL_RCAST(dvoid *,authp), 0, OTL_SCAST(ub4,OCI_ATTR_SESSION), errhp); status=OCIPasswordChange (svchp, errhp, OTL_RCAST(text*,OTL_CCAST(char*,user_name)), OTL_SCAST(ub4,strlen(user_name)), OTL_RCAST(text*,OTL_CCAST(char*,password)), OTL_SCAST(ub4,strlen(password)), OTL_RCAST(text*,OTL_CCAST(char*,new_password)), OTL_SCAST(ub4,strlen(new_password)), OCI_AUTH); if(status) return 0; else return 1; } #endif int server_detach(void) {int rc=0; if(attached){ OCIServerDetach(srvhp,errhp,OTL_SCAST(ub4,OCI_DEFAULT)); rc=1; } if(authp!=0)OCIHandleFree(OTL_RCAST(dvoid*,authp), OTL_SCAST(ub4,OCI_HTYPE_SESSION)); if(errhp!=0)OCIHandleFree(OTL_RCAST(dvoid*,errhp), OTL_SCAST(ub4,OCI_HTYPE_ERROR)); if(svchp!=0)OCIHandleFree(OTL_RCAST(dvoid*,svchp), OTL_SCAST(ub4,OCI_HTYPE_SVCCTX)); if(srvhp!=0)OCIHandleFree(OTL_RCAST(dvoid*,srvhp), OTL_SCAST(ub4,OCI_HTYPE_SERVER)); if(envhp!=0)OCIHandleFree(OTL_RCAST(dvoid*,envhp), OTL_SCAST(ub4,OCI_HTYPE_ENV)); auto_commit=0; attached=0; in_session=0; envhp=0; srvhp=0; errhp=0; svchp=0; authp=0; delete_xa_strings(); return rc; } int session_end(void) {int& status=last_status; if(!in_session)return 0; status=OCISessionEnd(svchp,errhp,authp,0); if(status)return 0; in_session=0; auto_commit=0; return 1; } int auto_commit_on(void) { auto_commit=1; return 1; } int auto_commit_off(void) { auto_commit=0; return 1; } int rlogon(const char* connect_str,const int aauto_commit) { int status; char username[256]; char passwd[256]; char tnsname[1024]; char* tnsname_ptr=0; char* username_ptr=username; char* c=OTL_CCAST(char*,connect_str); char* passwd_ptr=passwd; char prev_c=' '; auto_commit=aauto_commit; username[0]=0; passwd[0]=0; tnsname[0]=0; while(*c&&*c!='/'&&(OTL_SCAST(unsigned,username_ptr-username)< sizeof(username)-1)){ *username_ptr=*c; ++c; ++username_ptr; } *username_ptr=0; if(*c=='/')++c; prev_c=' '; while(*c && !(*c=='@' && prev_c!='\\') && (OTL_SCAST(unsigned,passwd_ptr-passwd)=4) void* temp_errhp=&errhp; #endif status=OCIHandleAlloc (OTL_RCAST(dvoid*,envhp), #if defined(__GNUC__) && (__GNUC__>=4) OTL_RCAST(dvoid**,temp_errhp), #else OTL_RCAST(dvoid**,&errhp), #endif OCI_HTYPE_ERROR, 0, 0); if(status)return 0; return 1; } int logoff(void) { int rc; if(extern_lda){ OCIHandleFree(OTL_RCAST(dvoid*,errhp), OTL_SCAST(ub4,OCI_HTYPE_ERROR)); envhp=0; svchp=0; errhp=0; extern_lda=0; }else{ rc=session_end(); if(!rc)return 0; rc=server_detach(); if(!rc)return 0; } auto_commit=0; return 1; } void error(otl_exc& exception_struct) {sb4 errcode; size_t len; OCIErrorGet (OTL_RCAST(dvoid*,errhp), OTL_SCAST(ub4,1), 0, &errcode, OTL_RCAST(text*,exception_struct.msg), OTL_SCAST(ub4,sizeof(exception_struct.msg)), OCI_HTYPE_ERROR); exception_struct.code=errcode; len=strlen(OTL_RCAST(char*,exception_struct.msg)); exception_struct.msg[len]=0; } int commit(void) { last_status=OCITransCommit(svchp,errhp,OTL_SCAST(ub4,OCI_DEFAULT)); return !last_status; } #if defined(OTL_ORA10G_R2) int commit_nowait(void) { #if defined(OCI_TRANS_WRITENOWAIT) last_status=OCITransCommit (svchp, errhp, OTL_SCAST(ub4,OCI_TRANS_WRITENOWAIT)); #else last_status=OCITransCommit (svchp, errhp, OTL_SCAST(ub4,0x00000008)); #endif return !last_status; } #endif int rollback(void) { last_status=OCITransRollback(svchp,errhp,OTL_SCAST(ub4,OCI_DEFAULT)); return !last_status; } private: otl_conn(const otl_conn&): envhp(0), srvhp(0), errhp(0), svchp(0), authp(0), auto_commit(0), extern_lda(0), attached(0), in_session(0), char_set_(SQLCS_IMPLICIT), session_begin_count(0), session_mode_(OCI_DEFAULT), ext_cred(0), last_status(OCI_SUCCESS), xa_server_external_name(0), xa_server_internal_name(0) #if defined(OTL_ORA_OCI_ENV_CREATE) ,threaded_mode(false) #endif { } otl_conn& operator=(const otl_conn&) { return *this; } }; class otl_cur0{ public: virtual ~otl_cur0(){} }; class otl_var{ public: ub1* p_v; sb2* p_ind; ub2* p_rlen; ub2* p_rcode; int ftype; int array_size; int elem_size; bool nls_flag; OCILobLocator** lob; #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) OCIDateTime** timestamp; #endif OCIStmt* cda; otl_conn* connect; ub1* buf; int buf_len; int ext_buf_flag; int act_elem_size; ub4 max_tab_len; ub4 cur_tab_len; int pl_tab_flag; int lob_stream_flag; int vparam_type; int lob_len; int lob_pos; int lob_ftype; int otl_adapter; bool lob_stream_mode; sb4 unicode_var_len; ub2 csid; ub1 csfrm; ub4 read_blob_amt; ub4 total_read_blob_amt; bool charz_flag; bool select_stm_flag; otl_var(): p_v(0), p_ind(0), p_rlen(0), p_rcode(0), ftype(0), array_size(0), elem_size(0), nls_flag(false), lob(0), #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) timestamp(0), #endif cda(0), connect(0), buf(0), buf_len(0), ext_buf_flag(0), act_elem_size(0), max_tab_len(0), cur_tab_len(0), pl_tab_flag(0), lob_stream_flag(0), vparam_type(-1), lob_len(0), lob_pos(0), lob_ftype(0), otl_adapter(otl_ora8_adapter), lob_stream_mode(false), unicode_var_len(0), csid(0), csfrm(SQLCS_IMPLICIT), read_blob_amt(0), total_read_blob_amt(0), charz_flag(false), select_stm_flag(false) { } virtual ~otl_var() {int i; if(ftype==otl_var_refcur&&cda!=0){ OCIHandleFree(OTL_RCAST(dvoid*,cda),OCI_HTYPE_STMT); cda=0; } if(ftype==otl_var_blob||(ftype==otl_var_clob&&lob!=0)){ for(i=0;ienvhp, connect->errhp, trg_ptr, OTL_SCAST(sb2,src_ptr->year), OTL_SCAST(ub1,src_ptr->month), OTL_SCAST(ub1,src_ptr->day), OTL_SCAST(ub1,src_ptr->hour), OTL_SCAST(ub1,src_ptr->minute), OTL_SCAST(ub1,src_ptr->second), OTL_SCAST (ub4,otl_to_fraction(src_ptr->fraction, src_ptr->frac_precision)), 0, 0); }else{ int tz_hour=src_ptr->tz_hour; int tz_minute=src_ptr->tz_minute; char tz_str[60]; char* tzc=otl_itoa(tz_hour,tz_str); *tzc=':'; ++tzc; otl_itoa(tz_minute,tzc); rc=OCIDateTimeConstruct (connect->envhp, connect->errhp, trg_ptr, OTL_SCAST(sb2,src_ptr->year), OTL_SCAST(ub1,src_ptr->month), OTL_SCAST(ub1,src_ptr->day), OTL_SCAST(ub1,src_ptr->hour), OTL_SCAST(ub1,src_ptr->minute), OTL_SCAST(ub1,src_ptr->second), OTL_SCAST (ub4,otl_to_fraction(src_ptr->fraction, src_ptr->frac_precision)), OTL_RCAST(text*,tz_str), OTL_SCAST(size_t,(tzc-tz_str))); } if(rc!=0)return 0; return 1; #else memcpy(trg,src,sz); return 1; #endif } int read_dt(void* trg, const void* src, const int #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) #else sz #endif ) { #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) OCIDateTime* src_ptr=OTL_RCAST(OCIDateTime*,OTL_CCAST(void*,src)); otl_datetime* trg_ptr=OTL_RCAST(otl_datetime*,OTL_CCAST(void*,trg)); sb2 year; ub1 month, day, hour, minute, sec; ub4 fsec; sb1 tz_hour; sb1 tz_minute; int rc=OCIDateTimeGetDate (connect->envhp, connect->errhp, src_ptr, &year, &month, &day); if(rc!=0)return 0; rc=OCIDateTimeGetTime (connect->envhp, connect->errhp, src_ptr, &hour, &minute, &sec, &fsec); if(rc!=0)return 0; trg_ptr->year=year; trg_ptr->month=month; trg_ptr->day=day; trg_ptr->hour=hour; trg_ptr->minute=minute; trg_ptr->second=sec; trg_ptr->fraction=otl_from_fraction(fsec,trg_ptr->frac_precision); trg_ptr->tz_hour=0; trg_ptr->tz_minute=0; if(ftype==otl_var_tz_timestamp || ftype==otl_var_ltz_timestamp){ rc=OCIDateTimeGetTimeZoneOffset (connect->envhp, connect->errhp, src_ptr, &tz_hour, &tz_minute); if(rc!=0)return 0; trg_ptr->tz_hour=tz_hour; trg_ptr->tz_minute=tz_minute; } return 1; #else memcpy(trg,src,sz); return 1; #endif } int actual_elem_size(void) { return act_elem_size; } void init (const bool aselect_stm_flag, const int aftype, int& aelem_size, const otl_stream_buffer_size_type aarray_size, const void* connect_struct=0, const int apl_tab_flag=0) { int i; ub4 lobEmpty=0; select_stm_flag=aselect_stm_flag; connect=OTL_RCAST(otl_conn*,OTL_CCAST(void*,connect_struct)); ftype=aftype; #if defined(OTL_ORA_UNICODE)||defined(OTL_ORA_UTF8) if(ftype==otl_var_nchar){ ftype=otl_var_char; nls_flag=true; }else if(ftype==otl_var_nclob){ ftype=otl_var_clob; nls_flag=true; } #endif pl_tab_flag=apl_tab_flag; act_elem_size=aelem_size; #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) if((ftype==otl_var_timestamp || ftype==otl_var_tz_timestamp || ftype==otl_var_ltz_timestamp) && apl_tab_flag) act_elem_size=sizeof(otl_oracle_date); #endif if(ftype==otl_var_refcur){ array_size=aarray_size; elem_size=1; #if defined(__GNUC__) && (__GNUC__>=4) void* temp_cda=&cda; #endif OCIHandleAlloc (OTL_RCAST(dvoid*,connect->envhp), #if defined(__GNUC__) && (__GNUC__>=4) OTL_RCAST(dvoid**,temp_cda), #else OTL_RCAST(dvoid**,&cda), #endif OCI_HTYPE_STMT, 0, 0); #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) }else if((ftype==otl_var_timestamp || ftype==otl_var_tz_timestamp || ftype==otl_var_ltz_timestamp) && !apl_tab_flag){ array_size=aarray_size; elem_size=sizeof(OCIDateTime*); act_elem_size=elem_size; timestamp=new OCIDateTime*[array_size]; p_v=OTL_RCAST(ub1*,timestamp); p_ind=new sb2[array_size]; p_rlen=new ub2[array_size]; p_rcode=new ub2[array_size]; for(i=0;ienvhp), OTL_RCAST(dvoid**,×tamp[i]), dtype, 0, 0); write_dt(timestamp[i],&dt,1); } }else timestamp=0; #endif }else if(ftype==otl_var_blob||ftype==otl_var_clob){ array_size=aarray_size; elem_size=aelem_size; lob=new OCILobLocator*[array_size]; p_v=OTL_RCAST(ub1*,lob); p_ind=new sb2[array_size]; p_rlen=0; p_rcode=0; if(connect!=0){ for(i=0;ienvhp), OTL_RCAST(dvoid**,&lob[i]), OTL_SCAST(ub4,OCI_DTYPE_LOB), 0, 0); lobEmpty=0; OCIAttrSet (OTL_RCAST(dvoid*,lob[i]), OCI_DTYPE_LOB, OTL_RCAST(dvoid*,&lobEmpty), 0, OCI_ATTR_LOBEMPTY, OTL_RCAST(OCIError*,connect->errhp)); } }else lob=0; }else{ if(ftype==otl_var_varchar_long||ftype==otl_var_raw_long){ elem_size=aelem_size+sizeof(sb4); array_size=1; }else if(ftype==otl_var_raw){ elem_size=aelem_size+sizeof(short int); array_size=aarray_size; }else{ elem_size=aelem_size; array_size=aarray_size; #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) if((ftype==otl_var_timestamp || ftype==otl_var_tz_timestamp || ftype==otl_var_ltz_timestamp) && apl_tab_flag){ elem_size=sizeof(otl_oracle_date); aelem_size=elem_size; // sending feedback back to the template class } #endif } #if defined(OTL_UNICODE) if(ftype==otl_var_char){ unsigned unicode_buffer_size= elem_size*OTL_SCAST(unsigned,array_size)*sizeof(OTL_WCHAR); p_v=new ub1[unicode_buffer_size]; memset(p_v,0,unicode_buffer_size); } else if(ftype==otl_var_varchar_long){ unsigned unicode_buffer_size=elem_size; p_v=new ub1[unicode_buffer_size]; memset(p_v,0,unicode_buffer_size); }else{ p_v=new ub1[elem_size*OTL_SCAST(unsigned,array_size)]; memset(p_v,0,elem_size*OTL_SCAST(unsigned,array_size)); } #elif defined(OTL_ORA_UTF8) if(ftype==otl_var_char){ unsigned buffer_size=elem_size*OTL_SCAST(unsigned,array_size); if(select_stm_flag) buffer_size*=OTL_UTF8_BYTES_PER_CHAR; // 3 bytes per UTF8 char on SELECT by default p_v=new ub1[buffer_size]; memset(p_v,0,buffer_size); } else if(ftype==otl_var_varchar_long){ p_v=new ub1[elem_size]; memset(p_v,0,elem_size); }else{ p_v=new ub1[elem_size*OTL_SCAST(unsigned,array_size)]; memset(p_v,0,elem_size*OTL_SCAST(unsigned,array_size)); } #else p_v=new ub1[elem_size*OTL_SCAST(unsigned,array_size)]; memset(p_v,0,elem_size*OTL_SCAST(unsigned,array_size)); #endif p_ind=new sb2[array_size]; p_rlen=new ub2[array_size]; p_rcode=new ub2[array_size]; if(ftype==otl_var_varchar_long||ftype==otl_var_raw_long){ if(aelem_size>32767) p_ind[0]=0; else p_ind[0]=OTL_SCAST(short,aelem_size); p_rcode[0]=0; }else{ for(i=0;isvchp, connect->errhp, lob[ndx], &blen); alen=OTL_SCAST(int,blen); if(rc!=OCI_SUCCESS)return 0; return 1; } int is_blob_initialized(const int ndx,int& is_init) { int rc; is_init=0; rc=OCILobLocatorIsInit (connect->envhp, connect->errhp, lob[ndx], &is_init); if(rc!=OCI_SUCCESS) return 0; else return 1; } int get_blob (const int ndx, unsigned char* abuf, const int buf_size, int& len) { int byte_buf_size=buf_size; #if defined(OTL_UNICODE) if(ftype==otl_var_clob) byte_buf_size=buf_size*sizeof(OTL_CHAR); #endif ub4 amt=byte_buf_size; ub4 offset=1; int rc; memset(OTL_RCAST(void*,abuf),0,OTL_SCAST(size_t,buf_size)); int is_init=0; rc=OCILobLocatorIsInit (connect->envhp, connect->errhp, lob[ndx], &is_init); if (rc!=0) return 0; if (!is_init){ len=0; return 1; } #if defined(OTL_UNICODE) if(ftype==otl_var_clob) csid=OTL_UNICODE_ID; else csid=0; #else csid=0; #endif do{ rc=OCILobRead (connect->svchp, connect->errhp, lob[ndx], &amt, offset, OTL_RCAST(dvoid*,abuf+offset-1), OTL_SCAST(ub4,byte_buf_size-offset+1), 0, 0, csid, OTL_SCAST(ub1,nls_flag?SQLCS_NCHAR:connect->char_set_)); offset+=amt; }while(rc==OCI_NEED_DATA); len=offset-1; if(rc!=OCI_SUCCESS){ len=0; return 0; } return 1; } void set_lob_stream_flag(const int flg=1) { lob_stream_flag=flg; } int close_lob(void) { #if defined(OTL_ORA8I)||defined(OTL_ORA9I) int rc; boolean flag=0; rc=OCILobIsOpen (connect->svchp, connect->errhp, lob[0], &flag); if(rc!=OCI_SUCCESS)return 0; if(flag!=TRUE)return 1; rc=OCILobClose (connect->svchp, connect->errhp, lob[0]); if(rc!=OCI_SUCCESS)return 0; #endif return 1; } int put_blob(void) { if((ftype!=otl_var_clob&&ftype!=otl_var_blob)|| lob_stream_flag||buf==0||buf_len==0)return 1; int rc; int byte_buf_len=buf_len; #if defined(OTL_UNICODE) if(ftype==otl_var_clob) byte_buf_len=buf_len*sizeof(OTL_CHAR); #endif ub4 amt=OTL_SCAST(ub4,buf_len); ub4 offset=1; #if defined(OTL_UNICODE) if(ftype==otl_var_clob) csid=OTL_UNICODE_ID; else csid=0; #else csid=0; #endif rc=OCILobWrite (connect->svchp, connect->errhp, lob[0], &amt, offset, OTL_RCAST(dvoid*,buf), OTL_SCAST(ub4,byte_buf_len), OCI_ONE_PIECE, 0, 0, csid, OTL_SCAST(ub1,nls_flag?SQLCS_NCHAR:connect->char_set_)); if(rc!=0)return 0; return 1; } int read_blob (otl_long_string& s, const int andx, int& aoffset, int alob_len) { ub4 byte_buf_size=s.buf_size; #if defined(OTL_UNICODE) if(ftype==otl_var_clob) byte_buf_size=byte_buf_size*sizeof(OTL_CHAR); #endif ub4& amt=read_blob_amt; amt=0; if(aoffset==1)total_read_blob_amt=0; ub4& offset=total_read_blob_amt; if(offset==0)offset=1; int rc; int is_init=0; rc=OCILobLocatorIsInit (connect->envhp, connect->errhp, lob[0], &is_init); if(rc!=OCI_SUCCESS)return 0; if(!is_init){ s.set_len(0); return 1; } #if defined(OTL_UNICODE) if(ftype==otl_var_clob) csid=OTL_UNICODE_ID; else csid=0; #else csid=0; #endif // amt=byte_buf_size; rc=OCILobRead (connect->svchp, connect->errhp, lob[andx], &amt, offset, OTL_RCAST(dvoid*,s.v), OTL_SCAST(ub4,byte_buf_size), 0, 0, csid, OTL_SCAST(ub1,nls_flag?SQLCS_NCHAR:connect->char_set_)); #if defined(OTL_UNICODE) if(ftype==otl_var_clob && aoffset>1 && amt==byte_buf_size) amt/=sizeof(OTL_CHAR); #endif #if defined(OTL_ORA_UTF8) switch(rc){ case OCI_SUCCESS: s.set_len(amt); offset+=amt; if(ftype==otl_var_blob) aoffset+=s.length; else aoffset=alob_len+1; return 1; case OCI_NEED_DATA: s.set_len(amt); offset+=amt; if(ftype==otl_var_blob) aoffset+=s.length; else aoffset=2; return 1; case OCI_ERROR: default: s.set_len(0); return 0; } #else switch(rc){ case OCI_SUCCESS: if(aoffset==1) s.set_len(alob_len); else s.set_len(alob_len-aoffset+1); break; case OCI_NEED_DATA: s.set_len(amt); break; case OCI_ERROR: s.set_len(0); break; } if(rc==OCI_NEED_DATA||rc==OCI_SUCCESS){ aoffset+=s.length; return 1; }else return 0; #endif } int write_blob (const otl_long_string& s, const int alob_len, int& aoffset, otl_cur0& /* cur */) { if(!lob_stream_flag)return 1; int rc; int byte_s_length=s.length; #if defined(OTL_UNICODE) int byte_lob_len; if(ftype==otl_var_clob){ byte_lob_len=alob_len*sizeof(OTL_CHAR); byte_s_length=s.length*sizeof(OTL_CHAR); } #endif ub4 offset=aoffset; ub4 amt=0; ub1 mode; if(aoffset==1&&alob_len>s.length) mode=OCI_FIRST_PIECE; else if(aoffset==1&&alob_len<=s.length){ mode=OCI_ONE_PIECE; amt=s.length; }else if((aoffset-1)+s.lengthsvchp, connect->errhp, lob[0], 0); if(rc!=OCI_SUCCESS) return 0; } if(alob_len==0)return 1; rc=OCILobWrite (connect->svchp, connect->errhp, lob[0], OTL_RCAST(ub4*,&amt), offset, OTL_RCAST(dvoid*,s.v), OTL_SCAST(ub4,byte_s_length), mode, 0, 0, csid, OTL_SCAST(ub1,nls_flag?SQLCS_NCHAR:connect->char_set_)); if(rc==OCI_NEED_DATA|| rc==OCI_SUCCESS|| rc==OCI_SUCCESS_WITH_INFO){ aoffset+=s.length; return 1; } return 0; } int save_blob (const unsigned char* abuf, const int len, const int extern_buffer_flag) { if(extern_buffer_flag){ ext_buf_flag=1; buf_len=len; buf=OTL_CCAST(unsigned char*,abuf); }else{ if(buf!=0&&!ext_buf_flag){ delete[] buf; buf=0; } ext_buf_flag=0; buf_len=len; #if defined(OTL_UNICODE) buf=new ub1[buf_len*sizeof(OTL_CHAR)]; memcpy(buf,abuf,buf_len*sizeof(OTL_CHAR)); #else buf=new ub1[buf_len]; memcpy(buf,abuf,buf_len); #endif } return 1; } void set_null(int ndx) { p_ind[ndx]=-1; } void set_not_null(int ndx, int pelem_size) { switch(ftype){ case otl_var_varchar_long: case otl_var_raw_long: p_ind[0]=0; break; case otl_var_raw: p_ind[ndx]=OTL_SCAST(short,pelem_size); break; case otl_var_clob: case otl_var_blob: if(lob_stream_flag==0){ ub4 lobEmpty=0; OCIAttrSet (OTL_RCAST(dvoid*,lob[ndx]), OCI_DTYPE_LOB, OTL_RCAST(dvoid*,&lobEmpty), 0, OCI_ATTR_LOBEMPTY, OTL_RCAST(OCIError*,connect->errhp)); } break; default: p_ind[ndx]=OTL_SCAST(short,pelem_size); break; } } void bulk_set_not_null(int pelem_size,int aarray_size) { int i; switch(ftype){ case otl_var_varchar_long: case otl_var_raw_long: p_ind[0]=0; break; case otl_var_raw: for(i=0;ierrhp)); } break; default: for(i=0;iauto_commit; if(var!=0){ extern_cda=true; cda=var->cda; status=OCI_SUCCESS; }else{ #if defined(__GNUC__) && (__GNUC__>=4) void* temp_cda=&cda; #endif status=OCIHandleAlloc (OTL_RCAST(dvoid *,db->envhp), #if defined(__GNUC__) && (__GNUC__>=4) OTL_RCAST(dvoid **,temp_cda), #else OTL_RCAST(dvoid **,&cda), #endif OCI_HTYPE_STMT, 0, 0); if(status)return 0; } #if defined(__GNUC__) && (__GNUC__>=4) void* temp_errhp=&errhp; #endif status=OCIHandleAlloc (OTL_RCAST(dvoid *,db->envhp), #if defined(__GNUC__) && (__GNUC__>=4) OTL_RCAST(dvoid **,temp_errhp), #else OTL_RCAST(dvoid **,&errhp), #endif OCI_HTYPE_ERROR, 0, 0); if(status)return 0; straight_select=1; pos_nbr=0; return 1; } int close(void) { if(!extern_cda) status=OCIHandleFree(OTL_RCAST(dvoid*,cda),OCI_HTYPE_STMT); status=OCIHandleFree(OTL_RCAST(dvoid*,errhp),OCI_HTYPE_ERROR); cda=0; errhp=0; commit_on_success=0; return 1; } int parse(const char* stm_text) { status=OCIStmtPrepare (cda, errhp, OTL_RCAST(text*,OTL_CCAST(char*,stm_text)), OTL_SCAST(ub4,strlen(stm_text)), OTL_SCAST(ub4,OCI_NTV_SYNTAX), OTL_SCAST(ub4,OCI_DEFAULT)); if(status)return 0; if(direct_exec_flag && parse_only_flag){ #if !defined(OCI_PARSE_ONLY) status=OCIStmtExecute (db->svchp, cda, errhp, OTL_SCAST(ub4,1), OTL_SCAST(ub4,0), 0, 0, 0x100); #else status=OCIStmtExecute (db->svchp, cda, errhp, OTL_SCAST(ub4,0), OTL_SCAST(ub4,0), 0, 0, OCI_PARSE_ONLY); #endif if(status) return 0; else return 1; }else if(direct_exec_flag && !parse_only_flag){ ub4 mode; if(commit_on_success) mode=OCI_COMMIT_ON_SUCCESS; else mode=OCI_DEFAULT; status=OCIStmtExecute (db->svchp, cda, errhp, OTL_SCAST(ub4,1), OTL_SCAST(ub4,0), 0, 0, mode); stm_executed=1; if(status) return 0; else return 1; } return 1; } int exec(const int iters, const int rowoff) { if(parse_only_flag){ parse_only_flag=0; return 1; }else if(!stm_executed){ ub4 mode; if(commit_on_success) mode=OCI_COMMIT_ON_SUCCESS; else mode=OCI_DEFAULT; status=OCIStmtExecute (db->svchp, cda, errhp, OTL_SCAST(ub4,iters), OTL_SCAST(ub4,rowoff), 0, 0, mode); stm_executed=0; if(status!=OCI_SUCCESS) return 0; return 1; } return 1; } long get_rpc() { return rpc(); } int fetch(const otl_stream_buffer_size_type iters,int& eof_data) { eof_data=0; status=OCIStmtFetch (cda, errhp, OTL_SCAST(ub4,iters), OTL_SCAST(ub4,OCI_FETCH_NEXT), OTL_SCAST(ub4,OCI_DEFAULT)); eof_status=status; if(status!=OCI_SUCCESS&& status!=OCI_SUCCESS_WITH_INFO&& status!=OCI_NO_DATA) return 0; if(status==OCI_NO_DATA){ eof_data=1; return 1; } return 1; } int tmpl_ftype2ora_ftype(const int ftype) { switch(ftype){ case otl_var_char: return extCChar; #if (defined(OTL_ORA10G)||defined(OTL_ORA10G_R2))&&defined(OTL_ORA_NATIVE_TYPES)\ &&!defined(OTL_ORA_LEGACY_NUMERIC_TYPES) case otl_var_double: return extBDouble; case otl_var_float: return extBFloat; #else case otl_var_double: return extFloat; case otl_var_float: return extFloat; #endif case otl_var_int: return extInt; case otl_var_unsigned_int: return extUInt; case otl_var_short: return extInt; case otl_var_long_int: return extInt; #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) case otl_var_timestamp: return extTimestamp; case otl_var_tz_timestamp: return extTimestamp_TZ; case otl_var_ltz_timestamp: return extTimestamp_LTZ; #else case otl_var_timestamp: return extDate; #endif case otl_var_varchar_long: return extLongVarChar; case otl_var_raw_long: return extLongVarRaw; case otl_var_raw: return extRaw; case otl_var_clob: return SQLT_CLOB; case otl_var_blob: return SQLT_BLOB; default: return 0; } } int bind (const char* name, otl_var& v, const int elem_size, const int ftype, const int /*param_type*/, const int /*name_pos*/, const int /*connection_type*/, const int apl_tab_flag) {OCIBind* bindpp; int db_ftype=0; if(ftype==otl_var_refcur){ status=OCIBindByName (cda, &bindpp, errhp, OTL_RCAST(text*,OTL_CCAST(char*,name)), OTL_SCAST(sb4,strlen(name)), OTL_RCAST(dvoid*,&v.cda), 0, SQLT_RSET, 0, 0, 0, 0, 0, OTL_SCAST(ub4,OCI_DEFAULT)); }else if(ftype!=otl_var_clob&&ftype!=otl_var_blob){ int var_elem_size; #if defined(OTL_UNICODE) if(ftype==otl_var_char){ var_elem_size=elem_size*sizeof(OTL_WCHAR); // ### } else if(ftype==otl_var_varchar_long) var_elem_size=elem_size; else var_elem_size=elem_size; #else if(ftype==otl_var_varchar_long) var_elem_size=elem_size+sizeof(sb4); else var_elem_size=elem_size; #endif db_ftype=tmpl_ftype2ora_ftype(ftype); #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) if(ftype==otl_var_timestamp || ftype==otl_var_tz_timestamp || ftype==otl_var_ltz_timestamp){ if(!apl_tab_flag) var_elem_size=sizeof(OCIDateTime*); else if(db_ftype==extTimestamp) db_ftype=extDate; } #endif #if defined(OTL_UNICODE) if(ftype==otl_var_char) db_ftype=SQLT_VCS; #endif if(apl_tab_flag){ if(ftype==otl_var_float||ftype==otl_var_double) db_ftype=extFloat; status=OCIBindByName (cda, &bindpp, errhp, OTL_RCAST(text*,OTL_CCAST(char*,name)), OTL_SCAST(sb4,strlen(name)), OTL_RCAST(dvoid*,v.p_v), ftype==otl_var_raw?var_elem_size+sizeof(short):var_elem_size, OTL_SCAST(ub2,v.charz_flag?extCharZ:db_ftype), OTL_RCAST(dvoid*,v.p_ind), 0, 0, OTL_SCAST(ub4,v.max_tab_len), OTL_RCAST(ub4*,&v.cur_tab_len), OTL_SCAST(ub4,OCI_DEFAULT)); }else{ status=OCIBindByName (cda, &bindpp, errhp, OTL_RCAST(text*,OTL_CCAST(char*,name)), OTL_SCAST(sb4,strlen(name)), OTL_RCAST(dvoid*,v.p_v), ftype==otl_var_raw?var_elem_size+sizeof(short):var_elem_size, OTL_SCAST(ub2,db_ftype), OTL_RCAST(dvoid*,v.p_ind), 0, 0, 0, 0, OTL_SCAST(ub4,OCI_DEFAULT)); } if(status)return 0; #if defined(OTL_UNICODE) if(ftype==otl_var_char||ftype==otl_var_varchar_long){ if(ftype!=otl_var_varchar_long){ if(v.nls_flag) v.csfrm=OTL_SCAST(ub1,SQLCS_NCHAR); else v.csfrm=OTL_SCAST(ub1,db->char_set_); status=OCIAttrSet (bindpp, OCI_HTYPE_BIND, &v.csfrm, 0, OTL_SCAST(ub4,OCI_ATTR_CHARSET_FORM), errhp); if(status)return 0; } v.csid=OTL_UNICODE_ID; status=OCIAttrSet (bindpp, OCI_HTYPE_BIND, &v.csid, 0, OCI_ATTR_CHARSET_ID, errhp); if(status)return 0; if(ftype==otl_var_varchar_long) v.unicode_var_len=elem_size-sizeof(sb4); else{ #if defined(OTL_ORA_MAX_UNICODE_VARCHAR_SIZE) if(var_elem_size>OTL_ORA_MAX_UNICODE_VARCHAR_SIZE) v.unicode_var_len=OTL_ORA_MAX_UNICODE_VARCHAR_SIZE; else v.unicode_var_len=var_elem_size; #else v.unicode_var_len=var_elem_size; #endif } status=OCIAttrSet (bindpp, OCI_HTYPE_BIND, &v.unicode_var_len, 0, OCI_ATTR_MAXDATA_SIZE, errhp); if(status)return 0; } #endif #if defined(OTL_ORA_UTF8) if(ftype==otl_var_char){ if(v.nls_flag) v.csfrm=OTL_SCAST(ub1,SQLCS_NCHAR); else v.csfrm=OTL_SCAST(ub1,db->char_set_); status=OCIAttrSet (bindpp, OCI_HTYPE_BIND, &v.csfrm, 0, OTL_SCAST(ub4,OCI_ATTR_CHARSET_FORM), errhp); if(status)return 0; } #endif return 1; }else{ status=OCIBindByName (cda, &bindpp, errhp, OTL_RCAST(text*,OTL_CCAST(char*,name)), OTL_SCAST(sb4,strlen(name)), OTL_RCAST(dvoid*,v.p_v), OTL_SCAST(sb4,-1), OTL_SCAST(ub2,tmpl_ftype2ora_ftype(ftype)), OTL_RCAST(dvoid*,v.p_ind), 0, 0, 0, 0, OTL_SCAST(ub4,OCI_DEFAULT)); if(status)return 0; #if defined(OTL_UNICODE) if(ftype==otl_var_clob){ v.csid=OTL_UNICODE_ID; status=OCIAttrSet (bindpp, OCI_HTYPE_BIND, &v.csid, 0, OCI_ATTR_CHARSET_ID, errhp); if(status)return 0; if(v.nls_flag) v.csfrm=OTL_SCAST(ub1,SQLCS_NCHAR); else v.csfrm=OTL_SCAST(ub1,db->char_set_); status=OCIAttrSet (bindpp, OCI_HTYPE_BIND, &v.csfrm, 0, OTL_SCAST(ub4,OCI_ATTR_CHARSET_FORM), errhp); if(status)return 0; } #endif #if defined(OTL_ORA_UTF8) if(ftype==otl_var_clob){ if(v.nls_flag) v.csfrm=OTL_SCAST(ub1,SQLCS_NCHAR); else v.csfrm=OTL_SCAST(ub1,db->char_set_); status=OCIAttrSet (bindpp, OCI_HTYPE_BIND, &v.csfrm, 0, OTL_SCAST(ub4,OCI_ATTR_CHARSET_FORM), errhp); if(status)return 0; } #endif return 1; } if(status)return 0; return 1; } int bind (const int column_num, otl_var& v, const int elem_size, const int ftype, const int /*param_type*/) {OCIDefine *defnp; int db_ftype=0; if(ftype!=otl_var_clob&&ftype!=otl_var_blob){ int var_elem_size; #if defined(OTL_UNICODE) if(ftype==otl_var_char) var_elem_size=elem_size*sizeof(OTL_WCHAR); else if(ftype==otl_var_varchar_long) var_elem_size=elem_size+sizeof(sb4); else var_elem_size=elem_size; #elif defined(OTL_ORA_UTF8) if(ftype==otl_var_char && v.select_stm_flag) var_elem_size=elem_size*OTL_UTF8_BYTES_PER_CHAR; // 3 bytes per UTF8 char else if(ftype==otl_var_varchar_long) var_elem_size=elem_size+sizeof(sb4); else var_elem_size=elem_size; #else if(ftype==otl_var_varchar_long) var_elem_size=elem_size+sizeof(sb4); else var_elem_size=elem_size; #endif db_ftype=tmpl_ftype2ora_ftype(ftype); #if defined(OTL_UNICODE) if(ftype==otl_var_char) db_ftype=SQLT_VCS; #endif status=OCIDefineByPos (cda, &defnp, errhp, OTL_SCAST(ub4,column_num), OTL_RCAST(dvoid*,v.p_v), OTL_SCAST(sb4,ftype==otl_var_raw?var_elem_size+sizeof(short):var_elem_size), OTL_SCAST(ub2,db_ftype), OTL_RCAST(dvoid*,v.p_ind), OTL_RCAST(ub2*,v.p_rlen), OTL_RCAST(ub2*,v.p_rcode), OCI_DEFAULT); if(status)return 0; #if defined(OTL_ORA_UTF8) if(ftype==otl_var_char||ftype==otl_var_varchar_long){ if(v.nls_flag) v.csfrm=OTL_SCAST(ub1,SQLCS_NCHAR); else v.csfrm=OTL_SCAST(ub1,db->char_set_); status=OCIAttrSet (defnp, OCI_HTYPE_DEFINE, OTL_RCAST(void*,&v.csfrm), OTL_SCAST(ub4,0), OTL_SCAST(ub4,OCI_ATTR_CHARSET_FORM), errhp); if(status)return 0; } #endif #if defined(OTL_UNICODE) if(ftype==otl_var_char||ftype==otl_var_varchar_long){ if(v.nls_flag) v.csfrm=OTL_SCAST(ub1,SQLCS_NCHAR); else v.csfrm=OTL_SCAST(ub1,db->char_set_); status=OCIAttrSet (defnp, OCI_HTYPE_DEFINE, OTL_RCAST(void*,&v.csfrm), OTL_SCAST(ub4,0), OTL_SCAST(ub4,OCI_ATTR_CHARSET_FORM), errhp); if(status)return 0; v.csid=OTL_UNICODE_ID; status=OCIAttrSet (defnp, OCI_HTYPE_DEFINE, &v.csid, 0, OCI_ATTR_CHARSET_ID, errhp); if(status)return 0; } #endif return 1; }else{ status=OCIDefineByPos (cda, &defnp, errhp, OTL_SCAST(ub4,column_num), OTL_RCAST(dvoid*,v.p_v), OTL_SCAST(sb4,-1), OTL_SCAST(ub2,tmpl_ftype2ora_ftype(ftype)), OTL_RCAST(dvoid*,v.p_ind), OTL_RCAST(ub2*,v.p_rlen), OTL_RCAST(ub2*,v.p_rcode), OCI_DEFAULT); if(status)return 0; #if defined(OTL_UNICODE) if(ftype==otl_var_char||ftype==otl_var_varchar_long){ v.csid=OTL_UNICODE_ID; status=OCIAttrSet (defnp, OCI_HTYPE_DEFINE, &v.csid, 0, OCI_ATTR_CHARSET_ID, errhp); if(status)return 0; } #endif #if defined(OTL_ORA_UTF8) if(ftype==otl_var_clob){ if(v.nls_flag) v.csfrm=OTL_SCAST(ub1,SQLCS_NCHAR); else v.csfrm=OTL_SCAST(ub1,db->char_set_); status=OCIAttrSet (defnp, OCI_HTYPE_DEFINE, OTL_RCAST(void*,&v.csfrm), OTL_SCAST(ub4,0), OTL_SCAST(ub4,OCI_ATTR_CHARSET_FORM), errhp); if(status)return 0; } #endif return 1; } } void set_select_type(const int select_type) { straight_select=select_type; } int describe_column (otl_column_desc& col, const int column_num, int& eof_desc) { OCIParam* pard; ub2 dtype; ub2 dbsize; sb2 prec; #if defined(OTL_ORA8_8I_DESC_COLUMN_SCALE) ub1 scale; #else sb2 scale; #endif ub1 nullok; text* col_name; ub4 col_name_len; ub4 pos_num; eof_desc=0; if(straight_select&&pos_nbr==0){ status=OCIStmtExecute (db->svchp, cda, errhp, 0, 0, 0, 0, OCI_DESCRIBE_ONLY); if(status!=OCI_SUCCESS)return 0; status=OCIAttrGet (cda, OCI_HTYPE_STMT, OTL_RCAST(ub4*,&pos_num), 0, OTL_SCAST(ub4,OCI_ATTR_PARAM_COUNT), errhp); if(status!=OCI_SUCCESS)return 0; pos_nbr=OTL_SCAST(int,pos_num); } if(!straight_select&&pos_nbr==0){ status=OCIAttrGet (cda, OCI_HTYPE_STMT, OTL_RCAST(ub4*,&pos_num), 0, OTL_SCAST(ub4,OCI_ATTR_PARAM_COUNT), errhp); if(status!=OCI_SUCCESS)return 0; pos_nbr=OTL_SCAST(int,pos_num); } if(column_num<1||column_num>pos_nbr){ eof_desc=1; return 0; } #if defined(__GNUC__) && (__GNUC__>=4) void* temp_pard=&pard; #endif status=OCIParamGet (cda, OCI_HTYPE_STMT, errhp, #if defined(__GNUC__) && (__GNUC__>=4) OTL_RCAST(void**,temp_pard), #else OTL_RCAST(void**,&pard), #endif OTL_SCAST(ub4,column_num)); if(status!=OCI_SUCCESS&&status!=OCI_NO_DATA) return 0; if(status==OCI_NO_DATA){ eof_desc=1; return 1; } status=OCIAttrGet (OTL_RCAST(dvoid*,pard), OTL_SCAST(ub4,OCI_DTYPE_PARAM), OTL_RCAST(dvoid*,&dtype), 0, OTL_SCAST(ub4,OCI_ATTR_DATA_TYPE), OTL_RCAST(OCIError*,errhp)); if(status!=OCI_SUCCESS)return 0; #if defined(OTL_ORA_UNICODE)||defined(OTL_ORA_UTF8) #if !defined(OTL_ORA8I) ub1 charset_form; status=OCIAttrGet (OTL_RCAST(dvoid*,pard), OTL_SCAST(ub4,OCI_DTYPE_PARAM), OTL_RCAST(dvoid*,&charset_form), 0, OTL_SCAST(ub4,OCI_ATTR_CHARSET_FORM), OTL_RCAST(OCIError*,errhp)); if(status!=OCI_SUCCESS)return 0; col.charset_form=OTL_SCAST(int,charset_form); ub2 char_size; status=OCIAttrGet (OTL_RCAST(dvoid*,pard), OTL_SCAST(ub4,OCI_DTYPE_PARAM), OTL_RCAST(dvoid*,&char_size), 0, OTL_SCAST(ub4,OCI_ATTR_CHAR_SIZE), OTL_RCAST(OCIError*,errhp)); if(status!=OCI_SUCCESS)return 0; col.char_size=OTL_SCAST(int,char_size); #else col.char_size=0; #endif #endif col.dbtype=dtype; #if defined(__GNUC__) && (__GNUC__>=4) void* temp_col_name=&col_name; #endif status=OCIAttrGet (OTL_RCAST(dvoid*,pard), OTL_SCAST(ub4,OCI_DTYPE_PARAM), #if defined(__GNUC__) && (__GNUC__>=4) OTL_RCAST(dvoid**,temp_col_name), #else OTL_RCAST(dvoid**,&col_name), #endif OTL_RCAST(ub4*,&col_name_len), OTL_SCAST(ub4,OCI_ATTR_NAME), OTL_RCAST(OCIError*,errhp)); if(status!=OCI_SUCCESS)return 0; col.set_name(OTL_RCAST(char*,col_name),col_name_len); status=OCIAttrGet (OTL_RCAST(dvoid*,pard), OTL_SCAST(ub4,OCI_DTYPE_PARAM), OTL_RCAST(dvoid*,&dbsize), OTL_RCAST(ub4*,0), OTL_SCAST(ub4,OCI_ATTR_DATA_SIZE), OTL_RCAST(OCIError*,errhp)); if(status!=OCI_SUCCESS)return 0; col.dbsize=dbsize; status=OCIAttrGet (OTL_RCAST(dvoid*,pard), OTL_SCAST(ub4,OCI_DTYPE_PARAM), OTL_RCAST(dvoid*,&prec), 0, OTL_SCAST(ub4,OCI_ATTR_PRECISION), OTL_RCAST(OCIError*,errhp)); if(status!=OCI_SUCCESS)return 0; col.prec=prec; status=OCIAttrGet (OTL_RCAST(dvoid*,pard), OTL_SCAST(ub4,OCI_DTYPE_PARAM), OTL_RCAST(dvoid*,&scale), 0, OTL_SCAST(ub4,OCI_ATTR_SCALE), OTL_RCAST(OCIError*,errhp)); if(status!=OCI_SUCCESS)return 0; col.scale=scale; status=OCIAttrGet (OTL_RCAST(dvoid*,pard), OTL_SCAST(ub4,OCI_DTYPE_PARAM), OTL_RCAST(dvoid*,&nullok), 0, OTL_SCAST(ub4,OCI_ATTR_IS_NULL), OTL_RCAST(OCIError*,errhp)); if(status!=OCI_SUCCESS)return 0; col.nullok=nullok; return 1; } void error(otl_exc& exception_struct) {sb4 errcode; size_t len; OTL_STRCPY_S(OTL_RCAST(char*,exception_struct.msg), sizeof(exception_struct.msg), "123456789"); OCIErrorGet (OTL_RCAST(dvoid*,errhp), OTL_SCAST(ub4,1), 0, &errcode, OTL_RCAST(text*,exception_struct.msg), OTL_SCAST(ub4,sizeof(exception_struct.msg)), OCI_HTYPE_ERROR); exception_struct.code=errcode; len=strlen(OTL_RCAST(char*,exception_struct.msg)); exception_struct.msg[len]=0; #if defined(OTL_EXCEPTION_ENABLE_ERROR_OFFSET) ub2 error_offset; if(OCIAttrGet (cda, OCI_HTYPE_STMT, OTL_RCAST(ub2*,&error_offset), 0, OTL_SCAST(ub4,OCI_ATTR_PARSE_ERROR_OFFSET), errhp)==OCI_SUCCESS) exception_struct.error_offset=OTL_SCAST(int,error_offset); #endif } private: otl_cur(const otl_cur&): otl_cur0(), cda(0), errhp(0), extern_cda(false), status(0), eof_status(0), db(0), straight_select(1), pos_nbr(0), commit_on_success(0), last_param_data_token(0), last_sql_param_data_status(0), sql_param_data_count(0), canceled(false), direct_exec_flag(0), parse_only_flag(0), stm_executed(0) { } otl_cur& operator=(const otl_cur&) { return *this; } }; class otl_sel{ public: int implicit_cursor; void set_arr_size (const int input_arr_size, int& out_array_size, int& out_prefetch_array_size) { out_array_size=input_arr_size; out_prefetch_array_size=0; } void set_prefetch_size(const int /*aprefetch_array_size*/) { } int close_select(otl_cur& /*cur*/) { int i=1; return i; } otl_sel(): implicit_cursor(0) { } virtual ~otl_sel(){} void set_select_type(const int /*atype*/) { implicit_cursor=0; } void init(const int /*array_size*/){} int first (otl_cur& cur, int& cur_row, int& cur_size, int& row_count, int& eof_data, const int array_size) {int rc; eof_data=0; cur_row=-1; cur.commit_on_success=0; rc=cur.exec(0,0); if(rc==0)return 0; rc=cur.fetch(OTL_SCAST(otl_stream_buffer_size_type,array_size),eof_data); if(rc==0)return 0; row_count=cur.rpc(); cur_size=row_count; if(cur_size!=0)cur_row=0; return 1; } int next (otl_cur& cur, int& cur_row, int& cur_size, int& row_count, int& eof_data, const int array_size) {int rc; if(cur_row otl_ora8_connect; typedef otl_tmpl_cursor otl_cursor; template class otl_tmpl_lob_stream: public otl_lob_stream_generic{ public: typedef otl_tmpl_exception otl_exception; typedef otl_tmpl_variable* p_bind_var; typedef otl_tmpl_connect * p_connect; typedef otl_tmpl_cursor * p_cursor; p_bind_var bind_var; p_connect connect; p_cursor cursor; otl_long_string* temp_buf; char* temp_char_buf; void init (void* avar,void* aconnect,void* acursor, int andx, int amode, const int alob_is_null=0) OTL_NO_THROW { connect=OTL_RCAST(p_connect,aconnect); bind_var=OTL_RCAST(p_bind_var,avar); cursor=OTL_RCAST(p_cursor,acursor); mode=amode; retcode=0; lob_is_null=alob_is_null; ndx=andx; offset=0; if(amode==otl_lob_stream_write_mode) lob_len=2147483647; else lob_len=0; eof_flag=0; in_destructor=0; if(bind_var) bind_var->var_struct.set_lob_stream_flag(); } void set_len(const int new_len=0) OTL_NO_THROW { lob_len=new_len; } otl_tmpl_lob_stream() OTL_NO_THROW: otl_lob_stream_generic(true), bind_var(0), connect(0), cursor(0), temp_buf(0), temp_char_buf(0) { init(0,0,0,0,otl_lob_stream_zero_mode); } virtual ~otl_tmpl_lob_stream() #if !defined(OTL_DESTRUCTORS_DO_NOT_THROW) OTL_THROWS_OTL_EXCEPTION #endif { in_destructor=1; if(temp_buf){ delete temp_buf; temp_buf=0; } if(temp_char_buf){ delete[] temp_char_buf; temp_char_buf=0; } #if defined(OTL_DESTRUCTORS_DO_NOT_THROW) try{ close(); }catch(otl_exception&){ } #else close(); #endif } #if (defined(OTL_STL) || defined(OTL_ACE) || \ defined(OTL_USER_DEFINED_STRING_CLASS_ON)) && !defined(OTL_UNICODE) otl_lob_stream_generic& operator<<(const OTL_STRING_CONTAINER& s) OTL_THROWS_OTL_EXCEPTION { otl_long_string temp_s(s.c_str(), OTL_SCAST(int,s.length()), OTL_SCAST(int,s.length())); (*this)<>(OTL_STRING_CONTAINER& s) OTL_THROWS_OTL_EXCEPTION { const int TEMP_BUF_SIZE=4096; if(!temp_char_buf)temp_char_buf=new char[TEMP_BUF_SIZE]; if(!temp_buf)temp_buf=new otl_long_string(temp_char_buf,TEMP_BUF_SIZE-1); int iters=0; while(!this->eof()){ ++iters; (*this)>>(*temp_buf); temp_char_buf[temp_buf->len()]=0; if(iters>1) s+=temp_char_buf; else s=temp_char_buf; } return *this; } #endif otl_lob_stream_generic& operator<<(const otl_long_string& s) OTL_THROWS_OTL_EXCEPTION { if(mode!=otl_lob_stream_write_mode){ char* stm=0; char var_info[256]; var_info[0]=0; if(cursor!=0){ if(cursor->stm_label) stm=cursor->stm_label; else stm=cursor->stm_text; } if(bind_var!=0){ otl_var_info_var (bind_var->name, bind_var->ftype, otl_var_long_string, var_info, sizeof(var_info)); } char* vinfo=0; if(var_info[0]!=0) vinfo=&var_info[0]; if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_tmpl_exception (otl_error_msg_9, otl_error_code_9, stm, vinfo); } if(offset==0)offset=1; if((offset-1)+s.length>lob_len){ char var_info[256]; otl_var_info_var (bind_var->name, bind_var->ftype, otl_var_long_string, var_info, sizeof(var_info)); if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; char err_msg[1024]; char temp_num[64]; OTL_STRCPY_S(err_msg,sizeof(err_msg),otl_error_msg_7); OTL_STRCAT_S(err_msg,sizeof(err_msg),", trying to store "); otl_itoa(s.length,temp_num); OTL_STRCAT_S(err_msg,sizeof(err_msg),temp_num); #if defined(OTL_UNICODE) OTL_STRCAT_S(err_msg,sizeof(err_msg)," Unicode characters at offset "); #else OTL_STRCAT_S(err_msg,sizeof(err_msg)," bytes at offset "); #endif otl_itoa(offset,temp_num); OTL_STRCAT_S(err_msg,sizeof(err_msg),temp_num); OTL_STRCAT_S(err_msg,sizeof(err_msg),". New length: "); otl_itoa((offset-1)+s.length,temp_num); OTL_STRCAT_S(err_msg,sizeof(err_msg),temp_num); OTL_STRCAT_S(err_msg,sizeof(err_msg)," would be bigger than length of lob: "); otl_itoa(lob_len,temp_num); OTL_STRCAT_S(err_msg,sizeof(err_msg),temp_num); throw otl_tmpl_exception (err_msg, otl_error_code_7, cursor->stm_label?cursor->stm_label: cursor->stm_text, var_info); } if(s.this_is_last_piece_) lob_len=(offset+s.length-1); retcode=bind_var->var_struct.write_blob (s,lob_len,offset,cursor->cursor_struct); if(retcode){ if((offset-1)==lob_len) close(); return *this; } if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_tmpl_exception (connect->connect_struct, cursor->stm_label?cursor->stm_label: cursor->stm_text); } otl_lob_stream_generic& operator>>(otl_long_string& s) OTL_THROWS_OTL_EXCEPTION { if(mode!=otl_lob_stream_read_mode){ char* stm=0; char var_info[256]; var_info[0]=0; if(cursor!=0){ if(cursor->stm_label) stm=cursor->stm_label; else stm=cursor->stm_text; } if(bind_var!=0){ otl_var_info_var (bind_var->name, bind_var->ftype, otl_var_long_string, var_info, sizeof(var_info)); } char* vinfo=0; if(var_info[0]!=0) vinfo=&var_info[0]; if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_tmpl_exception (otl_error_msg_10, otl_error_code_10, stm, vinfo); } if(offset==0&&lob_len==0) lob_len=len(); if(lob_len==0||(offset-1)==lob_len){ s.set_len(0); eof_flag=1; return *this; } if(offset==0)offset=1; retcode=bind_var->var_struct.read_blob(s,ndx,offset,lob_len); if((offset-1)==lob_len)eof_flag=1; if(retcode){ if(eof()){ close(); eof_flag=1; } return *this; } if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_tmpl_exception (connect->connect_struct, cursor->stm_label?cursor->stm_label: cursor->stm_text); } int eof(void) OTL_NO_THROW { if(lob_is_null)return 1; return eof_flag; } bool is_initialized(void) OTL_THROWS_OTL_EXCEPTION { if(cursor==0||connect==0||bind_var==0||lob_is_null)return false; int is_init=0; retcode=bind_var->var_struct.is_blob_initialized(ndx,is_init); if(retcode) return is_init!=0; if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return false; if(otl_uncaught_exception()) return false; throw OTL_TMPL_EXCEPTION (connect->connect_struct, cursor->stm_label?cursor->stm_label: cursor->stm_text); } int len(void) OTL_THROWS_OTL_EXCEPTION { if(cursor==0||connect==0||bind_var==0||lob_is_null)return 0; int alen; retcode=bind_var->var_struct.get_blob_len(ndx,alen); if(retcode)return alen; if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_tmpl_exception (connect->connect_struct, cursor->stm_label?cursor->stm_label: cursor->stm_text); } void close(void) OTL_THROWS_OTL_EXCEPTION { if(in_destructor){ if(mode==otl_lob_stream_read_mode){ bind_var->var_struct.set_lob_stream_flag(0); bind_var->set_not_null(0); } return; } if(mode==otl_lob_stream_zero_mode)return; if(mode==otl_lob_stream_read_mode){ if(offsetvar_struct.close_lob(); bind_var->var_struct.set_lob_stream_flag(0); bind_var->set_not_null(0); init(0,0,0,0,otl_lob_stream_zero_mode); }else{ // write mode if(!(offset==0&&lob_len==0)&&(offset-1)!=lob_len){ bind_var->var_struct.close_lob(); char var_info[256]; char msg_buf[1024]; OTL_STRCPY_S(msg_buf,sizeof(msg_buf),otl_error_msg_8); otl_var_info_var (bind_var->name, bind_var->ftype, otl_var_long_string, var_info, sizeof(var_info)); if(this->connect)this->connect->throw_count++; if(this->connect&&this->connect->throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_tmpl_exception (msg_buf, otl_error_code_8, cursor->stm_label?cursor->stm_label: cursor->stm_text, var_info); } bind_var->var_struct.set_lob_stream_flag(0); bind_var->set_not_null(0); } } private: otl_tmpl_lob_stream(const otl_tmpl_lob_stream&) OTL_NO_THROW: otl_lob_stream_generic(true), bind_var(0), connect(0), cursor(0), temp_buf(0), temp_char_buf(0) { } otl_tmpl_lob_stream& operator=(const otl_tmpl_lob_stream&) { return *this; } }; typedef otl_tmpl_lob_stream otl_lob_stream; typedef otl_tmpl_exception otl_exception; typedef otl_tmpl_inout_stream otl_ora8_inout_stream; typedef otl_tmpl_select_stream otl_select_stream; typedef otl_tmpl_ext_hv_decl otl_ext_hv_decl; const int otl_no_stream_type=0; const int otl_inout_stream_type=1; const int otl_refcur_stream_type=2; const int otl_select_stream_type=3; const int otl_constant_sql_type=4; class otl_connect: public otl_ora8_connect{ public: #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) otl_stream_pool sc; void set_stream_pool_size(const int max_size=otl_max_default_pool_size) { sc.init(max_size); } #endif public: long direct_exec (const char* sqlstm, const int exception_enabled=1) OTL_THROWS_OTL_EXCEPTION { return otl_cursor::direct_exec(*this,sqlstm,exception_enabled); } void syntax_check(const char* sqlstm) OTL_THROWS_OTL_EXCEPTION { otl_cursor::syntax_check(*this,sqlstm); } otl_connect() OTL_NO_THROW: otl_ora8_connect(), #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) sc(), #endif cmd_(0) { } #if defined(OTL_ORA_OCI_ENV_CREATE) void set_connect_mode(bool threaded_mode=false) { connect_struct.threaded_mode=threaded_mode; } #endif #if defined(OTL_UNICODE) || defined(OTL_ORA_UTF8) void set_character_set(const int char_set=SQLCS_IMPLICIT) OTL_THROWS_OTL_EXCEPTION { connect_struct.set_char_set(char_set); } #endif otl_connect(const char* connect_str, const int aauto_commit=0 #if defined(OTL_ORA_OCI_ENV_CREATE) ,bool threaded_mode=false #endif ) OTL_THROWS_OTL_EXCEPTION : otl_ora8_connect(), #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) sc(), #endif cmd_(0) { #if defined(OTL_ORA_OCI_ENV_CREATE) set_connect_mode(threaded_mode); #endif rlogon(connect_str,aauto_commit); } virtual ~otl_connect() #if !defined(OTL_DESTRUCTORS_DO_NOT_THROW) OTL_THROWS_OTL_EXCEPTION #endif { if(cmd_){ delete[] cmd_; cmd_=0; } #if defined(OTL_DESTRUCTORS_DO_NOT_THROW) try{ logoff(); }catch(otl_exception&){ } #else logoff(); #endif } const char* getCmd(void) const { return cmd_; } otl_connect& operator<<(const char* cmd) { if(!connected){ this->rlogon(cmd); }else{ otl_cursor::direct_exec(*this,cmd); } return *this; } otl_connect& operator<<=(const char* cmd) { if(cmd_){ delete[] cmd_; cmd_=0; } size_t cmd_len=strlen(cmd); cmd_=new char[cmd_len+1]; OTL_STRCPY_S(cmd_,cmd_len+1,cmd); return *this; } static int otl_terminate(void) OTL_THROWS_OTL_EXCEPTION { #if defined(OTL_ORA8)&&!defined(OTL_ORA8I)&&!defined(OTL_ORA9I) return 1; #else return OCITerminate(OCI_DEFAULT)==OCI_SUCCESS; #endif } void cancel(void) OTL_THROWS_OTL_EXCEPTION { if(!connected)return; retcode=connect_struct.cancel(); if(!retcode){ throw_count++; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(connect_struct); } } void reset(void) OTL_THROWS_OTL_EXCEPTION { if(!connected)return; retcode=connect_struct.reset(); if(!retcode){ throw_count++; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(connect_struct); } } #if defined(OTL_ORA10G_R2) void commit_nowait(void) OTL_THROWS_OTL_EXCEPTION { if(!connected)return; retcode=connect_struct.commit_nowait(); if(!retcode){ throw_count++; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(connect_struct); } } #endif #if defined(OTL_ORA8I) || defined(OTL_ORA9I) void change_password (const char* user_name, const char* old_password, const char* new_password) OTL_THROWS_OTL_EXCEPTION { throw_count=0; retcode=connect_struct.change_password (user_name, old_password, new_password); if(!retcode){ throw_count++; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(connect_struct); } } #endif void auto_commit_off(void) OTL_THROWS_OTL_EXCEPTION { otl_ora8_connect::auto_commit_off(); } void auto_commit_on(void) OTL_THROWS_OTL_EXCEPTION { otl_ora8_connect::auto_commit_on(); } void rlogon(OCIEnv *envhp,OCISvcCtx *svchp) OTL_THROWS_OTL_EXCEPTION { if(this->connected){ throw otl_exception(otl_error_msg_30,otl_error_code_30); } if(cmd_){ delete[] cmd_; cmd_=0; } connected=0; long_max_size=32760; retcode=connect_struct.ext_logon(envhp,svchp,0); if(retcode) connected=1; else{ connected=0; throw_count++; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(connect_struct); } } void rlogon(const char* connect_str, const int aauto_commit=0, const char* xa_server_external_name=0, const char* xa_server_internal_name=0 #if defined(OTL_ORA_OCI_ENV_CREATE) ,bool threaded_mode=false #endif ) OTL_THROWS_OTL_EXCEPTION { if(this->connected){ throw otl_exception(otl_error_msg_30,otl_error_code_30); } if(cmd_){ delete[] cmd_; cmd_=0; } if(xa_server_external_name!=0 && xa_server_internal_name!=0){ connect_struct.set_xa_server_external_name (xa_server_external_name); connect_struct.set_xa_server_internal_name (xa_server_internal_name); } #if defined(OTL_ORA_OCI_ENV_CREATE) set_connect_mode(threaded_mode); #endif otl_ora8_connect::rlogon(connect_str,aauto_commit); if(connect_struct.last_status==OCI_SUCCESS_WITH_INFO){ otl_exception ex(connect_struct); if(ex.code!=0){ ++throw_count; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw ex; } } } void logoff(void) OTL_THROWS_OTL_EXCEPTION { #if defined(OTL_STL) && defined(OTL_STREAM_POOLING_ON) if(connected) sc.init(sc.max_size); #endif if(!connected){ connect_struct.session_end(); connect_struct.server_detach(); }else{ OTL_TRACE_FUNC(0x1,"otl_connect","logoff","") if(connect_struct.extern_lda) connect_struct.logoff(); else{ session_end(); server_detach(); } connected=0; } } void server_attach(const char* tnsname=0, const char* xa_server_external_name=0, const char* xa_server_internal_name=0 #if defined(OTL_ORA_OCI_ENV_CREATE) ,bool threaded_mode=false #endif ) OTL_THROWS_OTL_EXCEPTION { if(cmd_){ delete[] cmd_; cmd_=0; } if(xa_server_external_name!=0 && xa_server_internal_name!=0){ connect_struct.set_xa_server_external_name (xa_server_external_name); connect_struct.set_xa_server_internal_name (xa_server_internal_name); } connected=0; long_max_size=32760; throw_count=0; #if defined(OTL_ORA_OCI_ENV_CREATE) set_connect_mode(threaded_mode); #endif retcode=connect_struct.server_attach(tnsname); if(!retcode){ ++throw_count; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(connect_struct); } } void server_detach(void) OTL_THROWS_OTL_EXCEPTION { retcode=connect_struct.server_detach(); if(!retcode){ ++throw_count; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(connect_struct); } } void session_begin (const char* username, const char* password, const int auto_commit=0, const int session_mode=OCI_DEFAULT // OCI_SYSDBA -- in this mode, the user is authenticated for SYSDBA // access. // OCI_SYSOPER -- in this mode, the user is authenticated // for SYSOPER access. ) OTL_THROWS_OTL_EXCEPTION { if(cmd_){ delete[] cmd_; cmd_=0; } throw_count=0; retcode=connect_struct.session_begin (username,password,auto_commit,session_mode); if(retcode) connected=1; else{ connected=0; ++throw_count; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(connect_struct); } if(connect_struct.last_status==OCI_SUCCESS_WITH_INFO){ otl_exception ex(connect_struct); if(ex.code!=0){ ++throw_count; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw ex; } } } void session_reopen(const int auto_commit=0) OTL_THROWS_OTL_EXCEPTION { throw_count=0; if(connect_struct.session_begin_count==0){ connected=0; ++throw_count; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(otl_error_msg_11,otl_error_code_11); } retcode=connect_struct.session_begin(auto_commit); if(retcode) connected=1; else{ connected=0; ++throw_count; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(connect_struct); } if(connect_struct.last_status==OCI_SUCCESS_WITH_INFO){ otl_exception ex(connect_struct); if(ex.code!=0){ ++throw_count; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw ex; } } } void session_end(void) OTL_THROWS_OTL_EXCEPTION { #if defined(OTL_STL) && defined(OTL_STREAM_POOLING_ON) if(connected) sc.init(sc.max_size); #endif connected=0; retcode=connect_struct.session_end(); if(!retcode){ ++throw_count; if(throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(connect_struct); } } private: char* cmd_; otl_connect& operator=(const otl_connect&) { return *this; } otl_connect(const otl_connect&) : otl_ora8_connect(), #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) sc(), #endif cmd_(0) { } }; typedef otl_tmpl_variable otl_generic_variable; typedef otl_generic_variable* otl_p_generic_variable; class otl_refcur_base_cursor: public otl_tmpl_cursor { public: int cur_row; int cur_size; int row_count; int array_size; otl_refcur_base_cursor (otl_connect& db, otl_var* var, const char* master_plsql_block, const otl_stream_buffer_size_type arr_size=1) :otl_tmpl_cursor (db,var), cur_row(-1), cur_size(0), row_count(0), array_size(arr_size) { size_t len=strlen(master_plsql_block)+1; stm_text=new char[len]; OTL_STRCPY_S(stm_text,len,master_plsql_block); } otl_refcur_base_cursor(): otl_tmpl_cursor (), cur_row(-1), cur_size(0), row_count(0), array_size(0) { } virtual ~otl_refcur_base_cursor() { delete[] stm_text; stm_text=0; } void open (otl_connect& db, otl_var* var, const char* master_plsql_block, const otl_stream_buffer_size_type arr_size=1) { cur_row=-1; row_count=0; cur_size=0; array_size=arr_size; otl_tmpl_cursor ::open(db,var); size_t len=strlen(master_plsql_block)+1; stm_text=new char[len]; OTL_STRCPY_S(stm_text,len,master_plsql_block); } void close(void) { delete[] stm_text; stm_text=0; otl_tmpl_cursor ::close(); } int first(void) {int rc; cur_row=-1; rc=cursor_struct.fetch(OTL_SCAST (otl_stream_buffer_size_type, array_size), eof_data); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception(cursor_struct,stm_label?stm_label:stm_text); } row_count=cursor_struct.rpc(); cur_size=row_count; if(cur_size!=0)cur_row=0; return cur_size!=0; } int next(void) {int rc; if(cur_row<0)return first(); if(cur_row::eof()){ cur_row=-1; return 0; } rc=cursor_struct.fetch(OTL_SCAST(otl_stream_buffer_size_type, array_size),eof_data); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception(cursor_struct,stm_label?stm_label:stm_text); } cur_size=cursor_struct.rpc()-row_count; row_count=cursor_struct.rpc(); if(cur_size!=0)cur_row=0; } return cur_size!=0; } void bind_col (const int column_num, otl_generic_variable& v) { if(!connected)return; v.pos=column_num; otl_refcur_base_cursor::bind(column_num,v); } int describe_select (otl_column_desc* desc, int& desc_len) {int i; desc_len=0; cursor_struct.straight_select=0; for(i=1;describe_column(desc[i-1],i);++i) ++desc_len; return 1; } private: otl_refcur_base_cursor(const otl_refcur_base_cursor&): otl_tmpl_cursor (), cur_row(-1), cur_size(0), row_count(0), array_size(0) { } otl_refcur_base_cursor& operator=(const otl_refcur_base_cursor&) { return *this; } }; #if defined(OTL_ORA_DECLARE_COMMON_READ_STREAM_INTERFACE) #define OTL_ORA_COMMON_READ_STREAM otl_read_stream_interface #define OTL_ORA_REFCUR_COMMON_READ_STREAM otl_read_stream_interface class otl_read_stream_interface{ public: virtual ~otl_read_stream_interface(){} virtual int is_null(void) OTL_NO_THROW = 0; virtual void rewind(void) OTL_THROWS_OTL_EXCEPTION = 0; virtual int eof(void) OTL_NO_THROW = 0; virtual otl_var_desc* describe_out_vars(int& desc_len) OTL_NO_THROW = 0; virtual otl_var_desc* describe_next_out_var(void) OTL_NO_THROW = 0; virtual otl_read_stream_interface& operator>>(otl_datetime& s) OTL_THROWS_OTL_EXCEPTION = 0; #if !defined(OTL_UNICODE) virtual otl_read_stream_interface& operator>>(char& c) OTL_THROWS_OTL_EXCEPTION = 0; #endif virtual otl_read_stream_interface& operator>>(unsigned char& c) OTL_THROWS_OTL_EXCEPTION = 0; #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) virtual otl_read_stream_interface& operator>>(OTL_STRING_CONTAINER& s) OTL_THROWS_OTL_EXCEPTION = 0; #endif #if defined(OTL_UNICODE_STRING_TYPE) virtual otl_read_stream_interface& operator>>(OTL_UNICODE_STRING_TYPE& s) OTL_THROWS_OTL_EXCEPTION = 0; #endif #if !defined(OTL_UNICODE) virtual otl_read_stream_interface& operator>>(char* s) OTL_THROWS_OTL_EXCEPTION = 0; #endif #if defined(OTL_UNICODE) virtual otl_read_stream_interface& operator>>(OTL_UNICODE_CHAR_TYPE* s) OTL_THROWS_OTL_EXCEPTION = 0; #endif virtual otl_read_stream_interface& operator>>(unsigned char* s) OTL_THROWS_OTL_EXCEPTION = 0; virtual otl_read_stream_interface& operator>>(int& n) OTL_THROWS_OTL_EXCEPTION = 0; virtual otl_read_stream_interface& operator>>(unsigned& u) OTL_THROWS_OTL_EXCEPTION = 0; virtual otl_read_stream_interface& operator>>(short& sh) OTL_THROWS_OTL_EXCEPTION = 0; virtual otl_read_stream_interface& operator>>(long int& l) OTL_THROWS_OTL_EXCEPTION = 0; virtual otl_read_stream_interface& operator>>(float& f) OTL_THROWS_OTL_EXCEPTION = 0; virtual otl_read_stream_interface& operator>>(double& d) OTL_THROWS_OTL_EXCEPTION = 0; virtual otl_read_stream_interface& operator>>(otl_long_string& s) OTL_THROWS_OTL_EXCEPTION = 0; virtual otl_read_stream_interface& operator>>(otl_lob_stream& s) OTL_THROWS_OTL_EXCEPTION = 0; virtual otl_column_desc* describe_select(int& desc_len) OTL_NO_THROW = 0; }; #else #define OTL_ORA_COMMON_READ_STREAM otl_stream #define OTL_ORA_REFCUR_COMMON_READ_STREAM otl_refcur_stream #endif class otl_refcur_stream: #if defined(OTL_ORA_DECLARE_COMMON_READ_STREAM_INTERFACE) public otl_read_stream_interface, #endif public otl_refcur_base_cursor{ public: int delay_next; int same_sl_flag; otl_select_struct_override override; otl_var_desc* ov; int ov_len; int next_ov_ndx; void inc_next_ov(void) { if(ov_len==0)return; if(next_ov_ndxadb)this->adb->throw_count++; throw; } } virtual ~otl_refcur_stream() OTL_THROWS_OTL_EXCEPTION { cleanup(); close(); } void rewind(void) OTL_THROWS_OTL_EXCEPTION { ret_code=first(); null_fetched=0; cur_col=-1; cur_in=0; executed=1; delay_next=0; } int is_null(void) OTL_NO_THROW { return null_fetched; } int eof(void) OTL_NO_THROW { if(delay_next){ look_ahead(); delay_next=0; } return !ret_code; } int eof_intern(void) { return !ret_code; } void check_if_executed(void){} void open (otl_connect& db, otl_var* var, const char* master_plsql_block, const otl_stream_buffer_size_type arr_size=1) OTL_THROWS_OTL_EXCEPTION { otl_refcur_base_cursor::open(db,var,master_plsql_block,arr_size); get_select_list(); rewind(); delete[] ov; ov=new otl_var_desc[sl_len]; ov_len=sl_len; for(int i=0;i>(otl_time0& t) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_timestamp)&&!eof_intern()){ #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) void* tm=OTL_RCAST(void*,sl[cur_col].val(this->cur_row)); int rc=sl[cur_col].var_struct.read_dt(&t,tm,sizeof(otl_time0)); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_exception(adb->connect_struct,stm_label?stm_label:stm_text); } #else otl_time0* tm=OTL_RCAST(otl_time0*,sl[cur_col].val(cur_row)); memcpy(OTL_RCAST(void*,&t),tm,otl_oracle_date_size); #endif look_ahead(); } inc_next_ov(); return *this; } #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) // already declared #else OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(otl_datetime& s) OTL_THROWS_OTL_EXCEPTION {otl_time0 tmp; (*this)>>tmp; #if defined(OTL_DEFAULT_DATETIME_NULL_TO_VAL) if((*this).is_null()) s=OTL_DEFAULT_DATETIME_NULL_TO_VAL; else{ s.year=(OTL_SCAST(int,tmp.century)-100)*100+(OTL_SCAST(int,tmp.year)-100); s.month=tmp.month; s.day=tmp.day; s.hour=tmp.hour-1; s.minute=tmp.minute-1; s.second=tmp.second-1; } #else s.year=(OTL_SCAST(int,tmp.century)-100)*100+(OTL_SCAST(int,tmp.year)-100); s.month=tmp.month; s.day=tmp.day; s.hour=tmp.hour-1; s.minute=tmp.minute-1; s.second=tmp.second-1; #endif inc_next_ov(); return *this; } #endif OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(char& c) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_char)&&!eof_intern()){ c=*OTL_RCAST(char*,sl[cur_col].val(cur_row)); #if defined(OTL_DEFAULT_CHAR_NULL_TO_VAL) if((*this).is_null()) c=OTL_DEFAULT_CHAR_NULL_TO_VAL; #endif look_ahead(); } inc_next_ov(); return *this; } OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(unsigned char& c) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_char)&&!eof_intern()){ c=*OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)); #if defined(OTL_DEFAULT_CHAR_NULL_TO_VAL) if((*this).is_null()) c=OTL_DEFAULT_CHAR_NULL_TO_VAL; #endif look_ahead(); } inc_next_ov(); return *this; } #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(OTL_STRING_CONTAINER& s) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); switch(sl[cur_col].ftype){ case otl_var_char: if(!eof_intern()){ #if defined(OTL_USER_DEFINED_STRING_CLASS_DEFAULT_NULL_TO_VAL) if((*this).is_null()){ OTL_USER_DEFINED_STRING_CLASS_DEFAULT_NULL_TO_VAL(s); }else #elif defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) s=OTL_DEFAULT_STRING_NULL_TO_VAL; else #endif #if defined(OTL_ACE) s.set(OTL_RCAST(char*,sl[cur_col].val(cur_row)),1); #else s=OTL_RCAST(char*,sl[cur_col].val(cur_row)); #endif look_ahead(); } break; #if defined(USER_DEFINED_STRING_CLASS) || \ defined(OTL_STL) || defined(OTL_ACE) case otl_var_varchar_long: case otl_var_raw_long: if(!eof_intern()){ unsigned char* c=OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)); int len=sl[cur_col].get_len(cur_row); #if (defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS)) && !defined(OTL_ACE) s.assign(OTL_RCAST(char*,c),len); #elif defined(OTL_ACE) s.set(OTL_RCAST(char*,c),len,1); #endif look_ahead(); } break; case otl_var_blob: case otl_var_clob: if(!eof_intern()){ int len=0; int max_long_sz=this->adb->get_max_long_size(); otl_auto_array_ptr loc_ptr(max_long_sz); unsigned char* temp_buf=loc_ptr.ptr; int rc=sl[cur_col].var_struct.get_blob (cur_row, temp_buf, max_long_sz, len); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_exception(adb->connect_struct, stm_label?stm_label:stm_text); } #if (defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS)) && !defined(OTL_ACE) s.assign(OTL_RCAST(char*,temp_buf),len); #elif defined(OTL_ACE) s.set(OTL_RCAST(char*,temp_buf),len,1); #endif look_ahead(); } break; #endif default: check_type(otl_var_char); } // switch inc_next_ov(); return *this; } #endif OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(char* s) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_char)&&!eof_intern()){ otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,sl[cur_col].val(cur_row))); #if defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,OTL_DEFAULT_STRING_NULL_TO_VAL) ); #endif look_ahead(); } inc_next_ov(); return *this; } #if defined(OTL_UNICODE_STRING_TYPE) OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(OTL_UNICODE_STRING_TYPE& s) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_char)&&!eof_intern()){ #if defined(OTL_UNICODE_STRING_TYPE_CAST_FROM_CHAR) OTL_UNICODE_CHAR_TYPE* temp_s=OTL_RCAST (OTL_UNICODE_CHAR_TYPE*,sl[cur_col].val(cur_row)); OTL_UNICODE_STRING_TYPE_CAST_FROM_CHAR(s,temp_s+1,*temp_s); #else OTL_UNICODE_CHAR_TYPE* temp_s=OTL_RCAST (OTL_UNICODE_CHAR_TYPE*,sl[cur_col].val(cur_row)); s.assign(temp_s+1,*temp_s); #endif #if defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) s=OTL_RCAST(OTL_UNICODE_CHAR_TYPE*,OTL_DEFAULT_STRING_NULL_TO_VAL); #endif look_ahead(); } inc_next_ov(); return *this; } #endif #if defined(OTL_UNICODE) OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(OTL_UNICODE_CHAR_TYPE* s) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_char)&&!eof_intern()){ otl_strcpy2(OTL_RCAST(unsigned char*,s), OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)), sl[cur_col].get_len(cur_row) ); #if defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,OTL_DEFAULT_STRING_NULL_TO_VAL) ); #endif look_ahead(); } inc_next_ov(); return *this; } #endif OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(unsigned char* s) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_char)&&!eof_intern()){ otl_strcpy2(OTL_RCAST(unsigned char*,s), OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)), sl[cur_col].get_len(cur_row) ); #if defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,OTL_DEFAULT_STRING_NULL_TO_VAL) ); #endif look_ahead(); } inc_next_ov(); return *this; } OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(int& n) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if(!eof_intern()){ #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) int match_found=otl_numeric_convert_T2 (sl[cur_col].ftype, sl[cur_col].val(cur_row), n); #else int match_found=otl_numeric_convert_T (sl[cur_col].ftype, sl[cur_col].val(cur_row), n); #endif if(!match_found){ if(check_type(otl_var_double,otl_var_int)) n=OTL_PCONV(int,double,sl[cur_col].val(cur_row)); } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) n=OTL_SCAST(int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif look_ahead(); } inc_next_ov(); return *this; } OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(unsigned& u) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if(!eof_intern()){ #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) int match_found=otl_numeric_convert_T2 (sl[cur_col].ftype, sl[cur_col].val(cur_row), u); #else int match_found=otl_numeric_convert_T (sl[cur_col].ftype, sl[cur_col].val(cur_row), u); #endif if(!match_found){ if(check_type(otl_var_double,otl_var_unsigned_int)) u=OTL_PCONV(unsigned,double,sl[cur_col].val(cur_row)); } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) u=OTL_SCAST(unsigned int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif look_ahead(); } inc_next_ov(); return *this; } OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(short& sh) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if(!eof_intern()){ #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) int match_found=otl_numeric_convert_T2 (sl[cur_col].ftype, sl[cur_col].val(cur_row), sh); #else int match_found=otl_numeric_convert_T (sl[cur_col].ftype, sl[cur_col].val(cur_row), sh); #endif if(!match_found){ if(check_type(otl_var_double,otl_var_short)) sh=OTL_PCONV(short,double,sl[cur_col].val(cur_row)); } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) sh=OTL_SCAST(short int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif look_ahead(); } inc_next_ov(); return *this; } OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(long int& l) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if(!eof_intern()){ #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) int match_found=otl_numeric_convert_T2 (sl[cur_col].ftype, sl[cur_col].val(cur_row), l); #else int match_found=otl_numeric_convert_T (sl[cur_col].ftype, sl[cur_col].val(cur_row), l); #endif if(!match_found){ if(check_type(otl_var_double,otl_var_long_int)) l=OTL_PCONV(long int,double,sl[cur_col].val(cur_row)); } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) l=OTL_SCAST(long int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif look_ahead(); } inc_next_ov(); return *this; } OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(float& f) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if(!eof_intern()){ #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) int match_found=otl_numeric_convert_T2 (sl[cur_col].ftype, sl[cur_col].val(cur_row), f); #else int match_found=otl_numeric_convert_T (sl[cur_col].ftype, sl[cur_col].val(cur_row), f); #endif if(!match_found){ if(check_type(otl_var_double,otl_var_float)) f=OTL_PCONV(float,double,sl[cur_col].val(cur_row)); } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) f=OTL_SCAST(float,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif look_ahead(); } inc_next_ov(); return *this; } OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(double& d) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if(!eof_intern()){ #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) int match_found=otl_numeric_convert_T2 (sl[cur_col].ftype, sl[cur_col].val(cur_row), d); #else int match_found=otl_numeric_convert_T (sl[cur_col].ftype, sl[cur_col].val(cur_row), d); #endif if(!match_found){ if(check_type(otl_var_double,otl_var_double)) d=*OTL_RCAST(double*,sl[cur_col].val(cur_row)); } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) d=OTL_SCAST(double,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif look_ahead(); } inc_next_ov(); return *this; } OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(otl_long_string& s) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if((sl[cur_col].ftype==otl_var_varchar_long|| sl[cur_col].ftype==otl_var_raw_long)&& !eof_intern()){ unsigned char* c=OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)); int len=sl[cur_col].get_len(cur_row); if(len>s.buf_size)len=s.buf_size; otl_memcpy(s.v,c,len,sl[cur_col].ftype); if(sl[cur_col].ftype==otl_var_varchar_long) s.null_terminate_string(len); s.set_len(len); look_ahead(); }else if((sl[cur_col].ftype==otl_var_blob|| sl[cur_col].ftype==otl_var_clob)&& !eof_intern()){ int len; int rc=sl[cur_col].var_struct.get_blob(cur_row,s.v,s.buf_size,len); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_exception(adb->connect_struct, stm_label?stm_label:stm_text); } s.set_len(len); if(sl[cur_col].ftype==otl_var_clob) s.null_terminate_string(len); look_ahead(); } inc_next_ov(); return *this; } OTL_ORA_REFCUR_COMMON_READ_STREAM& operator>>(otl_lob_stream& s) OTL_THROWS_OTL_EXCEPTION { check_if_executed(); if(eof_intern())return *this; get_next(); if((sl[cur_col].ftype==otl_var_blob|| sl[cur_col].ftype==otl_var_clob)&& !eof_intern()){ s.init (&sl[cur_col], adb, OTL_RCAST(otl_refcur_base_cursor*,this), cur_row, otl_lob_stream_read_mode, this->is_null()); delay_next=1; } inc_next_ov(); return *this; } otl_var_desc* describe_out_vars(int& desc_len) OTL_NO_THROW { desc_len=0; if(ov==0)return 0; desc_len=ov_len; return ov; } otl_var_desc* describe_next_out_var(void) OTL_NO_THROW { if(ov==0)return 0; return &ov[next_ov_ndx]; } int select_list_len(void) OTL_NO_THROW { return sl_len; } int column_ftype(int ndx=0) OTL_NO_THROW { return sl[ndx].ftype; } int column_size(int ndx=0) OTL_NO_THROW { return sl[ndx].elem_size; } otl_column_desc* describe_select(int& desc_len) OTL_NO_THROW { desc_len=0; desc_len=sl_len; return sl_desc; } otl_column_desc* sl_desc; int sl_len; otl_generic_variable* sl; protected: int null_fetched; int ret_code; int cur_col; int cur_in; int executed; char var_info[256]; void init(void) { ov=0; ov_len=0; next_ov_ndx=0; same_sl_flag=0; sl=0; sl_len=0; null_fetched=0; ret_code=0; sl_desc=0; executed=0; cur_in=0; cur_col=-1; executed=1; stm_text=0; delay_next=0; } void get_next(void) { if(cur_coladb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception (otl_error_msg_0, otl_error_code_0, stm_label?stm_label:stm_text, var_info); } int check_type(int type_code, int actual_data_type=0) { switch(sl[cur_col].ftype){ case otl_var_timestamp: case otl_var_tz_timestamp: case otl_var_ltz_timestamp: if(type_code==otl_var_timestamp) return 1; default: if(sl[cur_col].ftype==type_code) return 1; } return check_type_throw(type_code,actual_data_type); } void look_ahead(void) { if(cur_col==sl_len-1){ ret_code=next(); cur_col=-1; } } void get_select_list(void) { int i,j; otl_auto_array_ptr loc_ptr(otl_var_list_size); otl_column_desc* sl_desc_tmp=loc_ptr.ptr; int sld_tmp_len=0; int ftype,elem_size; sld_tmp_len=0; cursor_struct.straight_select=0; for(i=1;describe_column(sl_desc_tmp[i-1],i);++i){ ++sld_tmp_len; if(sld_tmp_len==loc_ptr.arr_size_){ loc_ptr.double_size(); sl_desc_tmp=loc_ptr.ptr; } } sl_len=sld_tmp_len; if(sl){ delete[] sl; sl=0; } sl=new otl_generic_variable[sl_len==0?1:sl_len]; int max_long_size=this->adb->get_max_long_size(); for(j=0;jadb->connect_struct.get_connection_type()); sl[j].copy_pos(j+1); #if defined(OTL_ORA_UNICODE)||defined(OTL_ORA_UTF8) if(sl_desc_tmp[j].charset_form==2) sl[j].var_struct.nls_flag=true; #endif sl[j].init(true, ftype, elem_size, OTL_SCAST(otl_stream_buffer_size_type,array_size), &adb->connect_struct ); } if(sl_desc){ delete[] sl_desc; sl_desc=0; } sl_desc=new otl_column_desc[sl_len==0?1:sl_len]; for(i=0;i>(otl_refcur_stream& str) { if(eof())return *this; if(check_in_type(otl_var_refcur,1)){ if(str.connected)str.close(); str.open(*adb2, &(in_vl[cur_in_x]->var_struct), stm_text, OTL_SCAST (const otl_stream_buffer_size_type, in_vl[cur_in_x]->var_struct.array_size) ); null_fetched=0; } get_in_next(); return *this; } #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) otl_inout_stream& operator>>(OTL_STRING_CONTAINER& s) { otl_ora8_inout_stream::operator>>(s); return *this; } otl_inout_stream& operator<<(const OTL_STRING_CONTAINER& s) { otl_ora8_inout_stream::operator<<(s); return *this; } #endif otl_inout_stream& operator<<(const otl_null& n) { otl_ora8_inout_stream::operator<<(n); return *this; } #if defined(OTL_PL_TAB) && defined(OTL_STL) otl_inout_stream& operator>>(otl_pl_vec_generic& tab) { otl_ora8_inout_stream::operator>>(tab); return *this; } otl_inout_stream& operator<<(otl_pl_vec_generic& tab) { otl_ora8_inout_stream::operator<<(tab); return *this; } #endif otl_inout_stream& operator>>(otl_pl_tab_generic& tab) { otl_ora8_inout_stream::operator>>(tab); return *this; } otl_inout_stream& operator<<(otl_pl_tab_generic& tab) { otl_ora8_inout_stream::operator<<(tab); return *this; } otl_inout_stream& operator>>(otl_time0& s) { otl_ora8_inout_stream::operator>>(s); return *this; } otl_inout_stream& operator<<(const otl_time0& s) { otl_ora8_inout_stream::operator<<(s); return *this; } otl_inout_stream& operator>>(char& c) { otl_ora8_inout_stream::operator>>(c); return *this; } otl_inout_stream& operator<<(const char c) { otl_ora8_inout_stream::operator<<(c); return *this; } otl_inout_stream& operator>>(unsigned char& c) { otl_ora8_inout_stream::operator>>(c); return *this; } #if defined(OTL_UNICODE_STRING_TYPE) otl_inout_stream& operator>>(OTL_UNICODE_STRING_TYPE& s) { otl_ora8_inout_stream::operator>>(s); return *this; } otl_inout_stream& operator<<(const OTL_UNICODE_STRING_TYPE& s) { otl_ora8_inout_stream::operator<<(s); return *this; } #endif otl_inout_stream& operator<<(const unsigned char c) { otl_ora8_inout_stream::operator<<(c); return *this; } otl_inout_stream& operator>>(char* s) { otl_ora8_inout_stream::operator>>(s); return *this; } otl_inout_stream& operator<<(const char* s) { otl_ora8_inout_stream::operator<<(s); return *this; } otl_inout_stream& operator>>(unsigned char* s) { otl_ora8_inout_stream::operator>>(s); return *this; } otl_inout_stream& operator<<(const unsigned char* s) { otl_ora8_inout_stream::operator<<(s); return *this; } otl_inout_stream& operator>>(int& n) { #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) otl_ora8_inout_stream::operator>>(n); #else otl_ora8_inout_stream::operator>>(n); #endif return *this; } otl_inout_stream& operator<<(const int n) { #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) otl_ora8_inout_stream::operator<<(n); #else otl_ora8_inout_stream::operator<<(n); #endif return *this; } otl_inout_stream& operator>>(float& n) { #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) otl_ora8_inout_stream::operator>>(n); #else otl_ora8_inout_stream::operator>>(n); #endif return *this; } otl_inout_stream& operator<<(const float n) { #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) otl_ora8_inout_stream::operator<<(n); #else otl_ora8_inout_stream::operator<<(n); #endif return *this; } otl_inout_stream& operator>>(double& n) { #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) otl_ora8_inout_stream::operator>>(n); #else otl_ora8_inout_stream::operator>>(n); #endif return *this; } otl_inout_stream& operator<<(const double n) { #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) otl_ora8_inout_stream::operator<<(n); #else otl_ora8_inout_stream::operator<<(n); #endif return *this; } otl_inout_stream& operator>>(short int& n) { #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) otl_ora8_inout_stream::operator>>(n); #else otl_ora8_inout_stream::operator>>(n); #endif return *this; } otl_inout_stream& operator<<(const short int n) { #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) otl_ora8_inout_stream::operator<<(n); #else otl_ora8_inout_stream::operator<<(n); #endif return *this; } otl_inout_stream& operator>>(unsigned int& n) { #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) otl_ora8_inout_stream::operator>>(n); #else otl_ora8_inout_stream::operator>>(n); #endif return *this; } otl_inout_stream& operator<<(const unsigned int n) { #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) otl_ora8_inout_stream::operator<<(n); #else otl_ora8_inout_stream::operator<<(n); #endif return *this; } otl_inout_stream& operator>>(long int& n) { #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) otl_ora8_inout_stream::operator>>(n); #else otl_ora8_inout_stream::operator>>(n); #endif return *this; } otl_inout_stream& operator<<(const long int n) { #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) otl_ora8_inout_stream::operator<<(n); #else otl_ora8_inout_stream::operator<<(n); #endif return *this; } otl_inout_stream& operator>>(otl_long_string& n) { otl_ora8_inout_stream::operator>>(n); return *this; } otl_inout_stream& operator<<(const otl_long_string& n) { otl_ora8_inout_stream::operator<<(n); return *this; } otl_inout_stream& operator>>(otl_lob_stream& n) { otl_ora8_inout_stream::operator>>(n); return *this; } otl_inout_stream& operator<<(otl_lob_stream& s) { otl_ora8_inout_stream::operator<<(s); return *this; } protected: otl_connect* adb2; private: otl_inout_stream(const otl_inout_stream&): otl_ora8_inout_stream(), adb2(0) { } otl_inout_stream& operator=(const otl_inout_stream&) { return *this; } }; // ============ OTL Reference Cursor Streams for Oracle 8 ================= class otl_ref_cursor: public otl_tmpl_cursor { public: int cur_row; int cur_size; int row_count; int array_size; otl_select_struct_override local_override; otl_ref_cursor (otl_connect& db, const char* cur_placeholder_name, const otl_stream_buffer_size_type arr_size=1) :otl_tmpl_cursor (db), cur_row(-1), cur_size(0), row_count(0), array_size(arr_size), local_override(), sel_cur(), rvl_len(otl_var_list_size), rvl(new otl_p_generic_variable[rvl_len]), vl_cur_len(0), cur_placeholder() {int i; local_override.reset(); for(i=0;i(), cur_row(-1), cur_size(0), row_count(0), array_size(0), local_override(), sel_cur(), rvl_len(0), rvl(), vl_cur_len(0), cur_placeholder() { local_override.reset(); } virtual ~otl_ref_cursor() { delete[] rvl; rvl=0; } void open (otl_connect& db, const char* cur_placeholder_name, const otl_stream_buffer_size_type arr_size=1) {int i; local_override.reset(); cur_row=-1; row_count=0; cur_size=0; array_size=arr_size; rvl_len=otl_var_list_size; vl_cur_len=0; rvl=new otl_p_generic_variable[rvl_len]; for(i=0;i::open(db); } void release_sel_cur(void) { #if defined(OTL_ORA8_8I_REFCUR) return; #else char tmp_buf[256]; OCIBind* bindpp; int rc; if(!sel_cur.connected)return; OTL_STRCPY_S(tmp_buf,sizeof(tmp_buf),"begin close "); OTL_STRCAT_S(tmp_buf,sizeof(tmp_buf),cur_placeholder); OTL_STRCAT_S(tmp_buf,sizeof(tmp_buf),"; end;"); otl_tmpl_cursor ::parse(tmp_buf); rc=OCIBindByName (cursor_struct.cda, &bindpp, cursor_struct.errhp, OTL_RCAST(text*,cur_placeholder), OTL_SCAST(sb4,strlen(cur_placeholder)), OTL_RCAST(dvoid*,&sel_cur.cursor_struct.cda), 0, SQLT_RSET, 0, 0, 0, 0, 0, OTL_SCAST(ub4,OCI_DEFAULT)); if(rc!=0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(cursor_struct, stm_label?stm_label:stm_text); } otl_tmpl_cursor ::exec(); #endif } void close(void) { local_override.reset(); delete[] rvl; rvl=0; release_sel_cur(); sel_cur.close(); otl_tmpl_cursor ::close(); } int first(void) {int i,rc; OCIBind* bindpp; if(!sel_cur.connected){ sel_cur.open(*adb); rc=OCIBindByName (cursor_struct.cda, &bindpp, cursor_struct.errhp, OTL_RCAST(text*,cur_placeholder), OTL_SCAST(sb4,strlen(cur_placeholder)), OTL_RCAST(dvoid*,&sel_cur.cursor_struct.cda), 0, SQLT_RSET, 0, 0, 0, 0, 0, OTL_SCAST(ub4,OCI_DEFAULT)); if(rc!=0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception(cursor_struct, stm_label?stm_label:stm_text); } } if(cur_row==-2) ; // Special case -- calling describe_select() between parse() and first() else{ exec(1); // Executing the PLSQL master block sel_cur.connected=1; } cur_row=-1; for(i=0;iadb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception(sel_cur.cursor_struct, stm_label?stm_label:stm_text); } row_count=sel_cur.cursor_struct.rpc(); cur_size=row_count; if(cur_size!=0)cur_row=0; return cur_size!=0; } int next(void) {int rc; if(cur_row<0)return first(); if(cur_rowadb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception(sel_cur.cursor_struct, stm_label?stm_label:stm_text); } cur_size=sel_cur.cursor_struct.rpc()-row_count; row_count=sel_cur.cursor_struct.rpc(); if(cur_size!=0)cur_row=0; } return cur_size!=0; } void bind (const int column_num, otl_generic_variable& v) { if(!connected)return; ++vl_cur_len; if(vl_cur_len==rvl_len){ int temp_rvl_len=rvl_len*2; otl_p_generic_variable* temp_rvl= new otl_p_generic_variable[temp_rvl_len]; int i; for(i=0;i::bind(v); } void bind (const char* name, otl_generic_variable& v) { otl_tmpl_cursor ::bind(name,v); } int describe_select (otl_column_desc* desc, int& desc_len) {int i,rc; OCIBind* bindpp; if(!sel_cur.connected){ sel_cur.open(*adb); rc=OCIBindByName (cursor_struct.cda, &bindpp, cursor_struct.errhp, OTL_RCAST(text*,cur_placeholder), OTL_SCAST(sb4,strlen(cur_placeholder)), OTL_RCAST(dvoid*,&sel_cur.cursor_struct.cda), 0, SQLT_RSET, 0, 0, 0, 0, 0, OTL_SCAST(ub4,OCI_DEFAULT)); if(rc!=0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception(cursor_struct, stm_label?stm_label:stm_text); } } exec(1); // Executing the PLSQL master block sel_cur.connected=1; cur_row=-2; // Special case -- describe_select() before first() or next() desc_len=0; sel_cur.cursor_struct.straight_select=0; for(i=1;sel_cur.describe_column(desc[i-1],i);++i) ++desc_len; return 1; } public: otl_cursor sel_cur; protected: int rvl_len; otl_p_generic_variable* rvl; int vl_cur_len; char cur_placeholder[64]; private: otl_ref_cursor(const otl_ref_cursor&) :otl_tmpl_cursor (), cur_row(-1), cur_size(0), row_count(0), array_size(0), local_override(), sel_cur(), rvl_len(0), rvl(0), vl_cur_len(0), cur_placeholder() { } otl_ref_cursor& operator=(const otl_ref_cursor&) { return *this; } }; class otl_ref_select_stream: public otl_ref_cursor{ public: otl_select_struct_override *override; int delay_next; int same_sl_flag; long _rfc; void cleanup(void) {int i; delete[] sl; for(i=0;ilocal_override; otl_ext_hv_decl hvd (this->stm_text, 1, this->stm_label, &temp_local_override, adb ); hvd.alloc_host_var_list(vl,vl_len,*adb); } try{ parse(); if(vl_len==0){ rewind(); null_fetched=0; } }catch(OTL_CONST_EXCEPTION otl_exception&){ cleanup(); if(this->adb)this->adb->throw_count++; throw; } } virtual ~otl_ref_select_stream() { cleanup(); close(); } void rewind(void) { _rfc=0; get_select_list(); ret_code=first(); null_fetched=0; cur_col=-1; cur_in=0; executed=1; delay_next=0; } void clean(void) { _rfc=0; null_fetched=0; cur_col=-1; cur_in=0; executed=0; delay_next=0; } int is_null(void) { return null_fetched; } int eof(void) { if(delay_next){ look_ahead(); delay_next=0; } return !ret_code; } int eof_intern(void) { return !ret_code; } otl_ref_select_stream& operator>>(otl_time0& t) { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_timestamp)&&!eof_intern()){ #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) void* tm=OTL_RCAST(void*,sl[cur_col].val(this->cur_row)); int rc=sl[cur_col].var_struct.read_dt(&t,tm,sizeof(otl_time0)); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_exception(adb->connect_struct, stm_label?stm_label:stm_text); } #else otl_time0* tm=OTL_RCAST(otl_time0*,sl[cur_col].val(cur_row)); memcpy(OTL_RCAST(void*,&t),tm,otl_oracle_date_size); #endif look_ahead(); } return *this; } otl_ref_select_stream& operator<<(const otl_time0& t) { check_in_var(); if(check_in_type(otl_var_timestamp,otl_oracle_date_size)){ #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) void* tm=OTL_RCAST(void*,vl[cur_in]->val()); int rc=vl[cur_in]->var_struct.write_dt(tm,&t,sizeof(otl_time0)); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_exception(adb->connect_struct, stm_label?stm_label:stm_text); } #else otl_time0* tm=OTL_RCAST(otl_time0*,vl[cur_in]->val()); memcpy(tm,OTL_RCAST(void*,OTL_CCAST(otl_time0*,&t)),otl_oracle_date_size); #endif } this->vl[cur_in]->set_not_null(0); get_in_next(); return *this; } otl_ref_select_stream& operator>>(char& c) { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_char)&&!eof_intern()){ c=*OTL_RCAST(char*,sl[cur_col].val(cur_row)); look_ahead(); } return *this; } otl_ref_select_stream& operator>>(unsigned char& c) { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_char)&&!eof_intern()){ c=*OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)); look_ahead(); } return *this; } #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) otl_ref_select_stream& operator>>(OTL_STRING_CONTAINER& s) { check_if_executed(); if(eof_intern())return *this; get_next(); switch(sl[cur_col].ftype){ case otl_var_char: if(!eof_intern()){ #if defined(OTL_ACE) s.set(OTL_RCAST(char*,sl[cur_col].val(cur_row)),1); #else s=OTL_RCAST(char*,sl[cur_col].val(cur_row)); #endif look_ahead(); } break; #if defined(USER_DEFINED_STRING_CLASS) || \ defined(OTL_STL) || defined(OTL_ACE) case otl_var_varchar_long: case otl_var_raw_long: if(!eof_intern()){ unsigned char* c=OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)); int len=sl[cur_col].get_len(cur_row); #if (defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS)) && !defined(OTL_ACE) s.assign(OTL_RCAST(char*,c),len); #elif defined(OTL_ACE) s.set(OTL_RCAST(char*,c),len,1); #endif look_ahead(); } break; case otl_var_blob: case otl_var_clob: if(!eof_intern()){ int len=0; int max_long_sz=this->adb->get_max_long_size(); otl_auto_array_ptr loc_ptr(max_long_sz); unsigned char* temp_buf=loc_ptr.ptr; int rc=sl[cur_col].var_struct.get_blob (cur_row, temp_buf, max_long_sz, len); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_exception(adb->connect_struct, stm_label?stm_label:stm_text); } #if (defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS)) && !defined(OTL_ACE) s.assign(OTL_RCAST(char*,temp_buf),len); #elif defined(OTL_ACE) s.set(OTL_RCAST(char*,temp_buf),len,1); #endif look_ahead(); } break; #endif default: check_type(otl_var_char); } // switch return *this; } #endif otl_ref_select_stream& operator>>(char* s) { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_char)&&!eof_intern()){ otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,sl[cur_col].val(cur_row))); look_ahead(); } return *this; } #if defined(OTL_UNICODE_STRING_TYPE) otl_ref_select_stream& operator>>(OTL_UNICODE_STRING_TYPE& s) { check_if_executed(); if(eof_intern())return *this; get_next(); switch(sl[cur_col].ftype){ case otl_var_char: if(!eof_intern()){ #if defined(OTL_UNICODE_STRING_TYPE_CAST_FROM_CHAR) OTL_UNICODE_CHAR_TYPE* temp_s=OTL_RCAST (OTL_UNICODE_CHAR_TYPE*,sl[cur_col].val(this->cur_row)); OTL_UNICODE_STRING_TYPE_CAST_FROM_CHAR(s,temp_s+1,*temp_s); #else OTL_UNICODE_CHAR_TYPE* temp_s=OTL_RCAST (OTL_UNICODE_CHAR_TYPE*,sl[cur_col].val(this->cur_row)); s.assign(temp_s+1,*temp_s); #endif look_ahead(); } break; case otl_var_varchar_long: if(!eof_intern()){ s=OTL_RCAST(OTL_UNICODE_CHAR_TYPE*,sl[cur_col].val(this->cur_row)); look_ahead(); } break; case otl_var_clob: if(!eof_intern()){ int len=0; int max_long_sz=this->adb->get_max_long_size(); otl_auto_array_ptr loc_ptr(max_long_sz); unsigned char* temp_buf=OTL_RCAST(unsigned char*,loc_ptr.ptr); int rc=sl[cur_col].var_struct.get_blob (this->cur_row, temp_buf, max_long_sz, len); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_exception (this->adb->connect_struct, this->stm_label?this->stm_label: this->stm_text); } s=OTL_RCAST(OTL_UNICODE_CHAR_TYPE*,temp_buf); look_ahead(); } break; default: check_type(otl_var_char); } return *this; } #endif otl_ref_select_stream& operator>>(unsigned char* s) { check_if_executed(); if(eof_intern())return *this; get_next(); if(check_type(otl_var_char)&&!eof_intern()){ otl_strcpy2(OTL_RCAST(unsigned char*,s), OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)), sl[cur_col].get_len(cur_row) ); look_ahead(); } return *this; } #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) #define OTL_D7(T,T_type) \ otl_ref_select_stream& operator>>(T& n) \ { \ check_if_executed(); \ if(eof_intern())return *this; \ get_next(); \ if(!eof_intern()){ \ int match_found=otl_numeric_convert_T \ (sl[cur_col].ftype, \ sl[cur_col].val(cur_row), \ n); \ if(!match_found) \ strict_check_throw(T_type); \ look_ahead(); \ } \ return *this; \ } #else #define OTL_D7(T,T_type) \ otl_ref_select_stream& operator>>(T& n) \ { \ check_if_executed(); \ if(eof_intern())return *this; \ get_next(); \ if(!eof_intern()){ \ int match_found=otl_numeric_convert_T \ (sl[cur_col].ftype, \ sl[cur_col].val(cur_row), \ n); \ if(!match_found){ \ if(check_type(otl_var_double,T_type)) \ n=OTL_PCONV(T,double,sl[cur_col].val(cur_row)); \ } \ look_ahead(); \ } \ return *this; \ } #endif #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) OTL_D7(int,otl_var_int) OTL_D7(unsigned,otl_var_unsigned_int) OTL_D7(long,otl_var_long_int) OTL_D7(short,otl_var_short) OTL_D7(float,otl_var_float) OTL_D7(double,otl_var_double) #else template OTL_D7(T,T_type) #endif otl_ref_select_stream& operator>>(otl_long_string& s) { check_if_executed(); if(eof_intern())return *this; get_next(); switch(sl[cur_col].ftype){ case otl_var_varchar_long: case otl_var_raw_long: { if(!eof_intern()){ unsigned char* c=OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)); int len=sl[cur_col].get_len(cur_row); if(len>s.buf_size)len=s.buf_size; otl_memcpy(s.v,c,len,sl[cur_col].ftype); s.v[len]=0; s.set_len(len); look_ahead(); } } break; case otl_var_raw: { if(!eof_intern()){ unsigned char* c=OTL_RCAST(unsigned char*,sl[cur_col].val(cur_row)); int len=OTL_SCAST(int,*OTL_RCAST(unsigned short*,c)); if(len>s.buf_size)len=s.buf_size; otl_memcpy(s.v,c+sizeof(short int),len,sl[cur_col].ftype); s.set_len(len); look_ahead(); } } break; case otl_var_blob: case otl_var_clob: { if(!eof_intern()){ int len; int rc=sl[cur_col].var_struct.get_blob(cur_row,s.v,s.buf_size,len); if(rc==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_exception(adb->connect_struct, stm_label?stm_label:stm_text); } s.set_len(len); if(sl[cur_col].ftype==otl_var_clob) s.null_terminate_string(len); look_ahead(); } } break; } return *this; } otl_ref_select_stream& operator>>(otl_lob_stream& s) { check_if_executed(); if(eof_intern())return *this; get_next(); if((sl[cur_col].ftype==otl_var_blob|| sl[cur_col].ftype==otl_var_clob)&& !eof_intern()){ s.init (&sl[cur_col], adb, OTL_RCAST(otl_ref_cursor*,this), cur_row, otl_lob_stream_read_mode, this->is_null()); delay_next=1; } return *this; } otl_ref_select_stream& operator<<(const otl_null& /*n*/) { check_in_var(); this->vl[cur_in]->set_null(0); get_in_next(); return *this; } otl_ref_select_stream& operator<<(const char c) { check_in_var(); if(check_in_type(otl_var_char,1)){ char* tmp=OTL_RCAST(char*,vl[cur_in]->val()); tmp[0]=c; tmp[1]=0; } this->vl[cur_in]->set_not_null(0); get_in_next(); return *this; } otl_ref_select_stream& operator<<(const unsigned char c) { check_in_var(); if(check_in_type(otl_var_char,1)){ unsigned char* tmp=OTL_RCAST(unsigned char*,vl[cur_in]->val()); tmp[0]=c; tmp[1]=0; } this->vl[cur_in]->set_not_null(0); get_in_next(); return *this; } #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) otl_ref_select_stream& operator<<(const OTL_STRING_CONTAINER& s) { check_in_var(); if(check_in_type(otl_var_char,1)){ int overflow; otl_strcpy (OTL_RCAST(unsigned char*,vl[cur_in]->val()), OTL_RCAST(unsigned char*,OTL_CCAST(char*,s.c_str())), overflow, vl[cur_in]->elem_size, OTL_SCAST(int,s.length()) ); if(overflow){ char temp_var_info[256]; otl_var_info_var (vl[cur_in]->name, vl[cur_in]->ftype, otl_var_char, temp_var_info, sizeof(temp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_exception (otl_error_msg_4, otl_error_code_4, stm_label?stm_label:stm_text, temp_var_info); } } this->vl[cur_in]->set_not_null(0); get_in_next(); return *this; } #endif #if defined(OTL_UNICODE_STRING_TYPE) otl_ref_select_stream& operator<<(const OTL_UNICODE_STRING_TYPE& s) { check_in_var(); if(check_in_type(otl_var_char,1)){ int overflow; otl_strcpy4 (OTL_RCAST(unsigned char*,vl[cur_in]->val()), OTL_RCAST(unsigned char*, OTL_CCAST(OTL_UNICODE_CHAR_TYPE*,s.c_str())), overflow, vl[cur_in]->elem_size, OTL_SCAST(int,s.length()) ); if(overflow){ char temp_var_info[256]; otl_var_info_var (vl[cur_in]->name, vl[cur_in]->ftype, otl_var_char, temp_var_info, sizeof(temp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_exception (otl_error_msg_4, otl_error_code_4, stm_label?stm_label:stm_text, temp_var_info); } } this->vl[cur_in]->set_not_null(0); get_in_next(); return *this; } #endif otl_ref_select_stream& operator<<(const char* s) { check_in_var(); if(check_in_type(otl_var_char,1)){ int overflow; otl_strcpy (OTL_RCAST(unsigned char*,vl[cur_in]->val()), OTL_RCAST(unsigned char*,OTL_CCAST(char*,s)), overflow, vl[cur_in]->elem_size ); if(overflow){ char temp_var_info[256]; otl_var_info_var (vl[cur_in]->name, vl[cur_in]->ftype, otl_var_char, temp_var_info, sizeof(temp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_exception (otl_error_msg_4, otl_error_code_4, stm_label?stm_label:stm_text, temp_var_info); } } this->vl[cur_in]->set_not_null(0); get_in_next(); return *this; } otl_ref_select_stream& operator<<(const unsigned char* s) { check_in_var(); if(check_in_type(otl_var_char,1)){ int overflow; otl_strcpy4 (OTL_RCAST(unsigned char*,vl[cur_in]->val()), OTL_CCAST(unsigned char*,s), overflow, vl[cur_in]->elem_size ); if(overflow){ char temp_var_info[256]; otl_var_info_var (vl[cur_in]->name, vl[cur_in]->ftype, otl_var_char, temp_var_info, sizeof(temp_var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return *this; if(otl_uncaught_exception()) return *this; throw otl_exception (otl_error_msg_4, otl_error_code_4, stm_label?stm_label:stm_text, temp_var_info); } } this->vl[cur_in]->set_not_null(0); get_in_next(); return *this; } #define OTL_D8(T,T_type) \ otl_ref_select_stream& operator<<(const T n) \ { \ check_in_var(); \ if(check_in_type(T_type,sizeof(T))){ \ *OTL_RCAST(T*,vl[cur_in]->val())=n; \ } \ this->vl[cur_in]->set_not_null(0); \ get_in_next(); \ return *this; \ } #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) OTL_D8(int,otl_var_int) OTL_D8(unsigned,otl_var_unsigned_int) OTL_D8(long,otl_var_long_int) OTL_D8(short,otl_var_short) OTL_D8(float,otl_var_float) OTL_D8(double,otl_var_double) #else template OTL_D8(T,T_type) #endif int select_list_len(void) { return sl_len; } int column_ftype(int ndx=0) { return sl[ndx].ftype; } int column_size(int ndx=0) { return sl[ndx].elem_size; } otl_column_desc* sl_desc; int sl_len; otl_generic_variable* sl; protected: int null_fetched; int ret_code; int cur_col; int cur_in; int executed; char var_info[256]; void init(void) { same_sl_flag=0; sl=0; sl_len=0; null_fetched=0; ret_code=0; sl_desc=0; executed=0; cur_in=0; stm_text=0; } void get_next(void) { if(cur_coladb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception (otl_error_msg_0, otl_error_code_0, stm_label?stm_label:stm_text, var_info); } int check_type(int type_code, int actual_data_type=0) { switch(sl[cur_col].ftype){ case otl_var_timestamp: case otl_var_tz_timestamp: case otl_var_ltz_timestamp: if(type_code==otl_var_timestamp) return 1; default: if(sl[cur_col].ftype==type_code) return 1; } return check_type_throw(type_code,actual_data_type); } void look_ahead(void) { if(cur_col==sl_len-1){ ret_code=next(); cur_col=-1; ++_rfc; } } void get_select_list(void) {int i,j,rc; otl_auto_array_ptr loc_ptr(otl_var_list_size); otl_column_desc* sl_desc_tmp=loc_ptr.ptr; int sld_tmp_len=0; int ftype,elem_size; OCIBind* bindpp; if(!sel_cur.connected){ sel_cur.open(*adb); rc=OCIBindByName (cursor_struct.cda, &bindpp, cursor_struct.errhp, OTL_RCAST(text*,cur_placeholder), OTL_SCAST(sb4,strlen(cur_placeholder)), OTL_RCAST(dvoid*,&sel_cur.cursor_struct.cda), 0, SQLT_RSET, 0, 0, 0, 0, 0, OTL_SCAST(ub4,OCI_DEFAULT)); if(rc!=0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception(cursor_struct, stm_label?stm_label:stm_text); } } for(i=0;i::bind(*vl[i]); otl_tmpl_cursor ::exec(1); // Executing the PLSQL master block sel_cur.connected=1; cur_row=-2; if(same_sl_flag && sl){ // assuming that ref.cur's select list is the same as // in previous executions of the master block. for(i=0;iadb->get_max_long_size(); for(j=0;jlocal_override.getLen()>0?this->local_override:*override, j+1, this->adb->connect_struct.get_connection_type()); sl[j].copy_pos(j+1); #if defined(OTL_ORA_UNICODE)||defined(OTL_ORA_UTF8) if(sl_desc_tmp[j].charset_form==2) sl[j].var_struct.nls_flag=true; #endif sl[j].init(true, ftype, elem_size, OTL_SCAST(otl_stream_buffer_size_type,array_size), &adb->connect_struct ); } if(sl_desc){ delete[] sl_desc; sl_desc=0; } sl_desc=new otl_column_desc[sl_len==0?1:sl_len]; for(i=0;iname, vl[cur_in]->ftype, type_code, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return 0; if(otl_uncaught_exception()) return 0; throw otl_exception (otl_error_msg_0, otl_error_code_0, stm_label?stm_label:stm_text, var_info); } int check_in_type(int type_code,int tsize) { switch(vl[cur_in]->ftype){ case otl_var_char: if(type_code==otl_var_char) return 1; case otl_var_timestamp: case otl_var_tz_timestamp: case otl_var_ltz_timestamp: if(type_code==otl_var_timestamp) return 1; default: if(vl[cur_in]->ftype==type_code && vl[cur_in]->elem_size==tsize) return 1; } return check_in_type_throw(type_code); } void check_in_var(void) { if(vl_len==0){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception (otl_error_msg_1, otl_error_code_1, stm_label?stm_label:stm_text, 0); } } void check_if_executed(void) { if(!executed){ if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception (otl_error_msg_2, otl_error_code_2, stm_label?stm_label:stm_text, 0); } } #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) void strict_check_throw(int type_code) { otl_var_info_col (sl[cur_col].pos, sl[cur_col].ftype, type_code, var_info, sizeof(var_info)); if(this->adb)this->adb->throw_count++; if(this->adb&&this->adb->throw_count>1)return; if(otl_uncaught_exception()) return; throw otl_exception (otl_error_msg_0, otl_error_code_0, this->stm_label? this->stm_label: this->stm_text, var_info); } #endif private: otl_ref_select_stream (const otl_ref_select_stream&) :otl_ref_cursor(), override(0), delay_next(0), same_sl_flag(0), _rfc(0), sl_desc(0), sl_len(0), sl(0), null_fetched(0), ret_code(0), cur_col(0), cur_in(0), executed(0), var_info() { } otl_ref_select_stream& operator=(const otl_ref_select_stream&) { return *this; } }; class otl_stream_shell: public otl_stream_shell_generic{ public: otl_ref_select_stream* ref_ss; otl_select_stream* ss; otl_inout_stream* io; otl_connect* adb; int auto_commit_flag; bool lob_stream_flag; otl_var_desc* iov; int iov_len; int next_iov_ndx; otl_var_desc* ov; int ov_len; int next_ov_ndx; bool flush_flag; int stream_type; otl_select_struct_override override; #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) OTL_STRING_CONTAINER orig_sql_stm; #endif otl_stream_shell(): otl_stream_shell_generic(), ref_ss(0), ss(0), io(0), adb(0), auto_commit_flag(0), lob_stream_flag(false), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), flush_flag(false), stream_type(otl_no_stream_type), override() #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) ,orig_sql_stm() #endif { should_delete=0; } otl_stream_shell(const int ashould_delete): otl_stream_shell_generic(), ref_ss(0), ss(0), io(0), adb(0), auto_commit_flag(0), lob_stream_flag(false), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), flush_flag(true), stream_type(otl_no_stream_type), override() #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) ,orig_sql_stm() #endif { should_delete=ashould_delete; } virtual ~otl_stream_shell() { if(should_delete){ delete[] iov; delete[] ov; iov=0; iov_len=0; ov=0; ov_len=0; next_iov_ndx=0; next_ov_ndx=0; override.len=0; flush_flag=true; delete ss; delete io; delete ref_ss; ss=0; io=0; ref_ss=0; adb=0; } } private: otl_stream_shell(const otl_stream_shell&): otl_stream_shell_generic(), ref_ss(0), ss(0), io(0), adb(0), auto_commit_flag(0), lob_stream_flag(false), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), flush_flag(false), stream_type(otl_no_stream_type), override() #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) ,orig_sql_stm() #endif { } otl_stream_shell& operator=(const otl_stream_shell&) { return *this; } }; class otl_sp_parm_desc{ public: int position; char arg_name[40]; char in_out[20]; char data_type[40]; char bind_var[128]; otl_sp_parm_desc(): position(-1), arg_name(), in_out(), data_type(), bind_var() { arg_name[0]=0; in_out[0]=0; data_type[0]=0; bind_var[0]=0; } otl_sp_parm_desc(const otl_sp_parm_desc& r): position(-1), arg_name(), in_out(), data_type(), bind_var() { copy(r); } otl_sp_parm_desc& operator=(const otl_sp_parm_desc& r) { copy(r); return *this; } ~otl_sp_parm_desc(){} protected: void copy(const otl_sp_parm_desc& r) { position=r.position; OTL_STRCPY_S(arg_name,sizeof(arg_name),r.arg_name); OTL_STRCPY_S(in_out,sizeof(in_out),r.in_out); OTL_STRCPY_S(data_type,sizeof(data_type),r.data_type); OTL_STRCPY_S(bind_var,sizeof(bind_var),r.bind_var); } }; class otl_stream #if defined(OTL_ORA_DECLARE_COMMON_READ_STREAM_INTERFACE) : public otl_read_stream_interface #endif { public: otl_stream_shell* shell; otl_ptr shell_pt; int connected; otl_ref_select_stream** ref_ss; otl_select_stream** ss; otl_inout_stream** io; otl_connect** adb; int* auto_commit_flag; otl_var_desc** iov; int* iov_len; int* next_iov_ndx; otl_var_desc** ov; int* ov_len; int* next_ov_ndx; int end_marker; int oper_int_called; int last_eof_rc; bool last_oper_was_read_op; otl_select_struct_override* override; protected: int buf_size_; void reset_end_marker(void) { last_eof_rc=0; end_marker=-1; oper_int_called=0; } static void convert_bind_var_datatype (char* out_buf, #if defined(_MSC_VER) #if (_MSC_VER >= 1400) // VC++ 8.0 or higher const size_t out_buf_sz, #else const size_t /*out_buf_sz*/, #endif #else const size_t /*out_buf_sz*/, #endif const char* datatype, const int varchar_size, const int all_num2type) { out_buf[0]=0; if(strcmp(datatype,"BINARY_INTEGER")==0|| strcmp(datatype,"NATIVE INTEGER")==0|| strcmp(datatype,"FLOAT")==0|| strcmp(datatype,"NUMBER")==0){ switch(all_num2type){ case otl_var_char: OTL_STRCPY_S(out_buf,out_buf_sz,"char[50]"); break; case otl_var_double: OTL_STRCPY_S(out_buf,out_buf_sz,"double"); break; case otl_var_float: OTL_STRCPY_S(out_buf,out_buf_sz,"float"); break; case otl_var_long_int: OTL_STRCPY_S(out_buf,out_buf_sz,"long"); break; case otl_var_int: OTL_STRCPY_S(out_buf,out_buf_sz,"int"); break; case otl_var_unsigned_int: OTL_STRCPY_S(out_buf,out_buf_sz,"unsigned"); break; case otl_var_short: OTL_STRCPY_S(out_buf,out_buf_sz,"short"); break; default: break; } }else if(strcmp(datatype,"DATE")==0) OTL_STRCPY_S(out_buf,out_buf_sz,"timestamp"); #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) else if(strcmp(datatype,"TIMESTAMP")==0) OTL_STRCPY_S(out_buf,out_buf_sz,"timestamp"); #endif else if(strcmp(datatype,"VARCHAR2")==0) #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(out_buf,out_buf_sz,"char[%d]",varchar_size); #else sprintf(out_buf,"char[%d]",varchar_size); #endif #else sprintf(out_buf,"char[%d]",varchar_size); #endif else if(strcmp(datatype,"CHAR")==0) #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(out_buf,out_buf_sz,"char[%d]",varchar_size); #else sprintf(out_buf,"char[%d]",varchar_size); #endif #else sprintf(out_buf,"char[%d]",varchar_size); #endif } public: void setBufSize(int buf_size) { buf_size_=buf_size; } int getBufSize(void) const { return buf_size_; } operator int(void) OTL_THROWS_OTL_EXCEPTION { if(shell && shell->lob_stream_flag){ if(this->adb&&*this->adb)(*this->adb)->throw_count++; if(this->adb&&*this->adb&&(*this->adb)->throw_count>1)return 0; char* stm_label=0; char* stm_text=0; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: stm_label=(*io)->stm_label; stm_text=(*io)->stm_text; break; case otl_select_stream_type: stm_label=(*ss)->stm_label; stm_text=(*ss)->stm_text; break; case otl_refcur_stream_type: stm_label=(*ref_ss)->stm_label; stm_text=(*ref_ss)->stm_text; break; } throw otl_exception (otl_error_msg_24, otl_error_code_24, stm_label?stm_label:stm_text); } if(!last_oper_was_read_op){ if(this->adb&&*this->adb)(*this->adb)->throw_count++; if(this->adb&&*this->adb&&(*this->adb)->throw_count>1)return 0; char* stm_label=0; char* stm_text=0; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: stm_label=(*io)->stm_label; stm_text=(*io)->stm_text; break; case otl_select_stream_type: stm_label=(*ss)->stm_label; stm_text=(*ss)->stm_text; break; case otl_refcur_stream_type: stm_label=(*ref_ss)->stm_label; stm_text=(*ref_ss)->stm_text; break; } throw otl_exception (otl_error_msg_18, otl_error_code_18, stm_label?stm_label:stm_text); } if(end_marker==1)return 0; int rc=0; int temp_eof=eof(); if(temp_eof && end_marker==-1 && oper_int_called==0){ end_marker=1; if(last_eof_rc==1) rc=0; else rc=1; }else if(!temp_eof && end_marker==-1) rc=1; else if(temp_eof && end_marker==-1){ end_marker=0; rc=1; }else if(temp_eof && end_marker==0){ end_marker=1; rc=0; } if(!oper_int_called)oper_int_called=1; return rc; } #if !defined(OTL_UNICODE) static void create_stored_proc_call (otl_connect& db, otl_stream& args_strm, char* sql_stm, int& stm_type, char* refcur_placeholder, const char* proc_name, const char* package_name, const char* schema_name=0, const bool schema_name_included=false, const int varchar_size=2001, const int all_num2type=otl_var_double) { sql_stm[0]=0; stm_type=otl_no_stream_type; refcur_placeholder[0]=0; char full_name[1024]; char temp_buf[1024]; char temp_buf2[1024]; int i; if(package_name==0) #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(full_name,sizeof(full_name),"%s",proc_name); #else sprintf(full_name,"%s",proc_name); #endif #else sprintf(full_name,"%s",proc_name); #endif else #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(full_name,sizeof(full_name),"%s.%s",package_name,proc_name); #else sprintf(full_name,"%s.%s",package_name,proc_name); #endif #else sprintf(full_name,"%s.%s",package_name,proc_name); #endif if(schema_name_included&&schema_name!=0){ #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf,sizeof(temp_buf),"%s.%s",schema_name,full_name); #else sprintf(temp_buf,"%s.%s",schema_name,full_name); #endif #else sprintf(temp_buf,"%s.%s",schema_name,full_name); #endif OTL_STRCPY_S(full_name,sizeof(full_name),temp_buf); } if(!args_strm.good()){ args_strm.open (50, "select position, " " lower(':'||nvl(argument_name,'rc__')) argument_name, " " in_out, " " nvl(data_type,'*') data_type, " " ':'||lower(nvl(argument_name,'rc__'))|| " " decode(data_type,'REF CURSOR',' ', " " '<'||'%s,'|| " " decode(in_out,'IN','in', " " 'OUT','out', " " 'IN/OUT','inout', " " 'xxx') " " ||'>' " " ) || decode(position,0,' := ',' ') " " bind_var " "from all_arguments " "where object_name=upper(:obj_name) " " and (:pkg_name is null and package_name is null or " " :pkg_name is not null and package_name=upper(:pkg_name)) " " and ((:owner is null " " and owner= " " (select owner from " " (select user as owner " " from user_objects " " where (:pkg_name is not null " " and object_name = upper(:pkg_name) " " and object_type = 'PACKAGE') " " or (:pkg_name is null " " and object_name = upper(:obj_name) " " and object_type in ('FUNCTION','PROCEDURE')) " " union all " " select table_owner as owner " " from user_synonyms " " where (:pkg_name is not null " " and synonym_name = upper(:pkg_name)) " " or (:pkg_name is null " " and synonym_name = upper(:obj_name)) " " union all " " select table_owner as owner " " from all_synonyms " " where (:pkg_name is not null " " and synonym_name = upper(:pkg_name)) " " or (:pkg_name is null " " and synonym_name = upper(:obj_name)) " " ) " " where rownum = 1) " " or " " (:owner is not null and owner=upper(:owner))) " " and data_level=0 )" "order by position", db); } otl_auto_array_ptr< otl_Tptr > desc(otl_var_list_size); int desc_len=0; otl_sp_parm_desc parm; args_strm<>parm.position; args_strm>>parm.arg_name; args_strm>>parm.in_out; args_strm>>parm.data_type; args_strm>>parm.bind_var; ++desc_len; if(desc_len==desc.arr_size_){ int j; for(j=0;j= 1400) sprintf_s(temp_buf,sizeof(temp_buf),"procedure %s",full_name); #else sprintf(temp_buf,"procedure %s",full_name); #endif #else sprintf(temp_buf,"procedure %s",full_name); #endif throw otl_exception (otl_error_msg_13, otl_error_code_13, temp_buf); } if(desc_len==1){ if(desc.ptr[0].ptr->position==1 && desc.ptr[0].ptr->data_type[0]=='*'){ // procedure without any parameters otl_strcat(sql_stm,"BEGIN "); otl_strcat(sql_stm,full_name); otl_strcat(sql_stm,"; END;"); stm_type=otl_constant_sql_type; return; }if(desc.ptr[0].ptr->position==1 && desc.ptr[0].ptr->data_type[0]!='*'){ // procedure with one parameter if(strcmp(desc.ptr[0].ptr->data_type,"REF CURSOR")==0){ // procedure with one parameter of refcur type if(strcmp(desc.ptr[0].ptr->in_out,"IN")==0){ // refcur parameter should be either OUT or IN OUT, not IN. #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf,sizeof(temp_buf),"procedure %s",full_name); #else sprintf(temp_buf,"procedure %s",full_name); #endif #else sprintf(temp_buf,"procedure %s",full_name); #endif throw otl_exception (otl_error_msg_15, otl_error_code_15, temp_buf,0); } otl_strcat(sql_stm,"BEGIN "); otl_strcat(sql_stm,full_name); otl_strcat(sql_stm,"("); otl_strcat(sql_stm,desc.ptr[0].ptr->bind_var); otl_strcat(sql_stm,"); END;"); stm_type=otl_refcur_stream_type; otl_strcpy(OTL_RCAST(unsigned char*,refcur_placeholder), OTL_RCAST(const unsigned char*,desc.ptr[0].ptr->arg_name)); return; }else{ // procedure with one scalar parameter convert_bind_var_datatype (temp_buf,sizeof(temp_buf),desc.ptr[0].ptr->data_type, varchar_size,all_num2type); if(temp_buf[0]==0){ #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf,sizeof(temp_buf),"procedure %s, parameter %s", full_name,desc.ptr[0].ptr->arg_name); #else sprintf(temp_buf,"procedure %s, parameter %s", full_name,desc.ptr[0].ptr->arg_name); #endif #else sprintf(temp_buf,"procedure %s, parameter %s", full_name,desc.ptr[0].ptr->arg_name); #endif throw otl_exception (otl_error_msg_14, otl_error_code_14, temp_buf,0); } #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf2,sizeof(temp_buf2),desc.ptr[0].ptr->bind_var,temp_buf); #else sprintf(temp_buf2,desc.ptr[0].ptr->bind_var,temp_buf); #endif #else sprintf(temp_buf2,desc.ptr[0].ptr->bind_var,temp_buf); #endif otl_strcat(sql_stm,"BEGIN "); otl_strcat(sql_stm,full_name); otl_strcat(sql_stm,"("); otl_strcat(sql_stm,temp_buf2); otl_strcat(sql_stm,"); END;"); stm_type=otl_inout_stream_type; refcur_placeholder[0]=0; return; } }else if(desc.ptr[0].ptr->position==0){ if(strcmp(desc.ptr[0].ptr->data_type,"REF CURSOR")==0){ // refcur function without any parameters otl_strcat(sql_stm,"BEGIN "); otl_strcat(sql_stm,desc.ptr[0].ptr->bind_var); otl_strcat(sql_stm," "); otl_strcat(sql_stm,full_name); otl_strcat(sql_stm,"; END;"); stm_type=otl_refcur_stream_type; otl_strcpy(OTL_RCAST(unsigned char*,refcur_placeholder), OTL_RCAST(const unsigned char*,desc.ptr[0].ptr->arg_name)); return; }else{ // scalar function without any parameters convert_bind_var_datatype (temp_buf,sizeof(temp_buf),desc.ptr[0].ptr->data_type, varchar_size,all_num2type); if(temp_buf[0]==0){ #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf,sizeof(temp_buf), "procedure %s, parameter %s", full_name, desc.ptr[0].ptr->arg_name); #else sprintf(temp_buf, "procedure %s, parameter %s", full_name, desc.ptr[0].ptr->arg_name); #endif #else sprintf(temp_buf, "procedure %s, parameter %s", full_name, desc.ptr[0].ptr->arg_name); #endif throw otl_exception (otl_error_msg_14, otl_error_code_14, temp_buf,0); } #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf2,sizeof(temp_buf2),desc.ptr[0].ptr->bind_var,temp_buf); #else sprintf(temp_buf2,desc.ptr[0].ptr->bind_var,temp_buf); #endif #else sprintf(temp_buf2,desc.ptr[0].ptr->bind_var,temp_buf); #endif otl_strcat(sql_stm,"BEGIN "); otl_strcat(sql_stm,temp_buf2); otl_strcat(sql_stm," "); otl_strcat(sql_stm,full_name); otl_strcat(sql_stm,"; END;"); stm_type=otl_inout_stream_type; refcur_placeholder[0]=0; return; } } } // Checking if the procedure is of the "refcur" type bool refcur_flag=false; bool refcur_outpar=false; int refcur_count=0; bool inpar_only=true; for(i=0;iin_out,"IN")!=0 && strcmp(desc.ptr[i].ptr->data_type,"REF CURSOR")!=0) inpar_only=false; if(strcmp(desc.ptr[i].ptr->data_type,"REF CURSOR")==0){ ++refcur_count; refcur_flag=true; refcur_outpar=strcmp(desc.ptr[i].ptr->in_out,"IN")!=0; } } if(refcur_flag){ if(!inpar_only||refcur_count>1||!refcur_outpar){ #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf,sizeof(temp_buf),"procedure %s",full_name); #else sprintf(temp_buf,"procedure %s",full_name); #endif #else sprintf(temp_buf,"procedure %s",full_name); #endif throw otl_exception (otl_error_msg_15, otl_error_code_15, temp_buf,0); } stm_type=otl_refcur_stream_type; refcur_placeholder[0]=0; sql_stm[0]=0; bool full_name_printed=false; for(i=0;idata_type,"REF CURSOR")==0) otl_strcpy(OTL_RCAST(unsigned char*,refcur_placeholder), OTL_RCAST(const unsigned char*,desc.ptr[i].ptr->arg_name)); // in case of a function, function's return code if(desc.ptr[i].ptr->position==0){ convert_bind_var_datatype (temp_buf,sizeof(temp_buf),desc.ptr[i].ptr->data_type, varchar_size,all_num2type); if(temp_buf[0]==0&& strcmp(desc.ptr[i].ptr->data_type,"REF CURSOR")!=0){ #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf,sizeof(temp_buf),"procedure %s, parameter %s", full_name,desc.ptr[i].ptr->arg_name); #else sprintf(temp_buf,"procedure %s, parameter %s", full_name,desc.ptr[i].ptr->arg_name); #endif #else sprintf(temp_buf,"procedure %s, parameter %s", full_name,desc.ptr[i].ptr->arg_name); #endif throw otl_exception (otl_error_msg_14, otl_error_code_14, temp_buf,0); } if(strcmp(desc.ptr[i].ptr->data_type,"REF CURSOR")==0) OTL_STRCPY_S(temp_buf2,sizeof(temp_buf2),desc.ptr[i].ptr->bind_var); else #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf2,sizeof(temp_buf2),desc.ptr[i].ptr->bind_var,temp_buf); #else sprintf(temp_buf2,desc.ptr[i].ptr->bind_var,temp_buf); #endif #else sprintf(temp_buf2,desc.ptr[i].ptr->bind_var,temp_buf); #endif otl_strcat(sql_stm,temp_buf2); } // procedure/function's name if(!full_name_printed){ otl_strcat(sql_stm,full_name); otl_strcat(sql_stm,"("); full_name_printed=true; } if(desc.ptr[i].ptr->position!=0){ // normal parameters convert_bind_var_datatype (temp_buf,sizeof(temp_buf),desc.ptr[i].ptr->data_type, varchar_size,all_num2type); if(temp_buf[0]==0&& strcmp(desc.ptr[i].ptr->data_type,"REF CURSOR")!=0){ #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf,sizeof(temp_buf),"procedure %s, parameter %s", full_name,desc.ptr[i].ptr->arg_name); #else sprintf(temp_buf,"procedure %s, parameter %s", full_name,desc.ptr[i].ptr->arg_name); #endif #else sprintf(temp_buf,"procedure %s, parameter %s", full_name,desc.ptr[i].ptr->arg_name); #endif throw otl_exception (otl_error_msg_14, otl_error_code_14, temp_buf,0); } if(strcmp(desc.ptr[i].ptr->data_type,"REF CURSOR")==0) OTL_STRCPY_S(temp_buf2,sizeof(temp_buf2),desc.ptr[i].ptr->bind_var); else #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf2,sizeof(temp_buf2),desc.ptr[i].ptr->bind_var,temp_buf); #else sprintf(temp_buf2,desc.ptr[i].ptr->bind_var,temp_buf); #endif #else sprintf(temp_buf2,desc.ptr[i].ptr->bind_var,temp_buf); #endif otl_strcat(sql_stm,temp_buf2); } if(iposition!=0) otl_strcat(sql_stm,","); else if(i==desc_len-1) otl_strcat(sql_stm,"); "); } otl_strcat(sql_stm," END;"); return; } // The procedure is of the "general" type stm_type=otl_inout_stream_type; refcur_placeholder[0]=0; sql_stm[0]=0; bool full_name_printed=false; for(i=0;iposition==0){ convert_bind_var_datatype (temp_buf,sizeof(temp_buf),desc.ptr[i].ptr->data_type, varchar_size,all_num2type); if(temp_buf[0]==0){ #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf,sizeof(temp_buf),"procedure %s, parameter %s", full_name,desc.ptr[i].ptr->arg_name); #else sprintf(temp_buf,"procedure %s, parameter %s", full_name,desc.ptr[i].ptr->arg_name); #endif #else sprintf(temp_buf,"procedure %s, parameter %s", full_name,desc.ptr[i].ptr->arg_name); #endif throw otl_exception (otl_error_msg_14, otl_error_code_14, temp_buf,0); } #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf2,sizeof(temp_buf2),desc.ptr[i].ptr->bind_var,temp_buf); #else sprintf(temp_buf2,desc.ptr[i].ptr->bind_var,temp_buf); #endif #else sprintf(temp_buf2,desc.ptr[i].ptr->bind_var,temp_buf); #endif otl_strcat(sql_stm,temp_buf2); } // procedure/function's name if(!full_name_printed){ otl_strcat(sql_stm,full_name); otl_strcat(sql_stm,"("); full_name_printed=true; } if(desc.ptr[i].ptr->position!=0){ // normal parameters convert_bind_var_datatype (temp_buf,sizeof(temp_buf),desc.ptr[i].ptr->data_type, varchar_size,all_num2type); if(temp_buf[0]==0){ #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf,sizeof(temp_buf),"procedure %s, parameter %s", full_name,desc.ptr[i].ptr->arg_name); #else sprintf(temp_buf,"procedure %s, parameter %s", full_name,desc.ptr[i].ptr->arg_name); #endif #else sprintf(temp_buf,"procedure %s, parameter %s", full_name,desc.ptr[i].ptr->arg_name); #endif throw otl_exception (otl_error_msg_14, otl_error_code_14, temp_buf,0); } #if defined(_MSC_VER) #if (_MSC_VER >= 1400) sprintf_s(temp_buf2,sizeof(temp_buf2),desc.ptr[i].ptr->bind_var,temp_buf); #else sprintf(temp_buf2,desc.ptr[i].ptr->bind_var,temp_buf); #endif #else sprintf(temp_buf2,desc.ptr[i].ptr->bind_var,temp_buf); #endif otl_strcat(sql_stm,temp_buf2); } if(iposition!=0) otl_strcat(sql_stm,","); else if(i==desc_len-1) otl_strcat(sql_stm,"); "); } otl_strcat(sql_stm," END;"); } #endif int get_stream_type(void) OTL_NO_THROW { if(shell==0) return otl_no_stream_type; else return shell->stream_type; } void set_column_type(const int column_ndx, const int col_type, const int col_size=0) OTL_NO_THROW { if(shell==0){ init_stream(); shell->flush_flag=true; } override->add_override(column_ndx,col_type,col_size); } void set_all_column_types(const unsigned mask=0) OTL_NO_THROW { if(shell==0){ init_stream(); shell->flush_flag=true; } override->set_all_column_types(mask); } void set_flush(const bool flush_flag=true) OTL_NO_THROW { if(shell==0)init_stream(); shell->flush_flag=flush_flag; } void set_lob_stream_mode(const bool lob_stream_flag=false) OTL_NO_THROW { if(shell==0)return; shell->lob_stream_flag=lob_stream_flag; } void inc_next_ov(void) { if((*ov_len)==0)return; if((*next_ov_ndx)<(*ov_len)-1) ++(*next_ov_ndx); else (*next_ov_ndx)=0; } void inc_next_iov(void) { if((*iov_len)==0)return; if((*next_iov_ndx)<(*iov_len)-1) ++(*next_iov_ndx); else (*next_iov_ndx)=0; } otl_var_desc* describe_in_vars(int& desc_len) OTL_NO_THROW { desc_len=0; if(shell==0)return 0; if(shell->iov==0)return 0; desc_len=shell->iov_len; return shell->iov; } otl_var_desc* describe_out_vars(int& desc_len) OTL_NO_THROW { desc_len=0; if(shell==0)return 0; if(shell->ov==0)return 0; desc_len=shell->ov_len; return shell->ov; } otl_var_desc* describe_next_in_var(void) OTL_NO_THROW { if(shell==0)return 0; if(shell->iov==0)return 0; return &(shell->iov[shell->next_iov_ndx]); } otl_var_desc* describe_next_out_var(void) OTL_NO_THROW { if(shell==0)return 0; if(shell->ov==0)return 0; return &(shell->ov[shell->next_ov_ndx]); } const char* get_stm_text(void) { const char* no_stm_text=OTL_NO_STM_TEXT; switch(shell->stream_type){ case otl_no_stream_type: return no_stm_text; case otl_inout_stream_type: return (*io)->stm_label?(*io)->stm_label:(*io)->stm_text; case otl_select_stream_type: return (*ss)->stm_label?(*ss)->stm_label:(*ss)->stm_text; case otl_refcur_stream_type: return (*ref_ss)->stm_label?(*ref_ss)->stm_label:(*ref_ss)->stm_text; default: return no_stm_text; } } long get_rpc() OTL_THROWS_OTL_EXCEPTION { switch(shell->stream_type){ case otl_no_stream_type: return 0; case otl_inout_stream_type: (*adb)->reset_throw_count(); return (*io)->get_rpc(); case otl_select_stream_type: (*adb)->reset_throw_count(); return (*ss)->_rfc; case otl_refcur_stream_type: (*adb)->reset_throw_count(); return (*ref_ss)->_rfc; default: return 0; } } void create_var_desc(void) {int i; delete[] (*iov); delete[] (*ov); (*iov)=0; (*iov_len)=0; (*ov)=0; (*ov_len)=0; if((*ss)){ if((*ss)->vl_len>0){ (*iov)=new otl_var_desc[(*ss)->vl_len]; (*iov_len)=(*ss)->vl_len; for(i=0;i<(*ss)->vl_len;++i) (*ss)->vl[i]->copy_var_desc((*iov)[i]); } if((*ss)->sl_len>0){ (*ov)=new otl_var_desc[(*ss)->sl_len]; (*ov_len)=(*ss)->sl_len; for(i=0;i<(*ss)->sl_len;++i){ (*ss)->sl[i].copy_var_desc((*ov)[i]); (*ov)[i].copy_name((*ss)->sl_desc[i].name); } } }else if((*io)){ if((*io)->vl_len>0){ (*iov)=new otl_var_desc[(*io)->vl_len]; (*iov_len)=(*io)->vl_len; for(i=0;i<(*io)->vl_len;++i) (*io)->vl[i]->copy_var_desc((*iov)[i]); } if((*io)->iv_len>0){ (*ov)=new otl_var_desc[(*io)->iv_len]; (*ov_len)=(*io)->iv_len; for(i=0;i<(*io)->iv_len;++i) (*io)->in_vl [i]->copy_var_desc((*ov)[i]); } }else if((*ref_ss)){ if((*ref_ss)->vl_len>0){ (*iov)=new otl_var_desc[(*ref_ss)->vl_len]; (*iov_len)=(*ref_ss)->vl_len; for(i=0;i<(*ref_ss)->vl_len;++i) (*ref_ss)->vl[i]->copy_var_desc((*iov)[i]); } if((*ref_ss)->sl_len>0){ (*ov)=new otl_var_desc[(*ref_ss)->sl_len]; (*ov_len)=(*ref_ss)->sl_len; for(i=0;i<(*ref_ss)->sl_len;++i){ (*ref_ss)->sl[i].copy_var_desc((*ov)[i]); (*ov)[i].copy_name((*ref_ss)->sl_desc[i].name); } } } } void init_stream(void) { buf_size_=1; last_oper_was_read_op=false; shell=0; shell=new otl_stream_shell(0); shell_pt.assign(&shell); connected=0; ref_ss=&(shell->ref_ss); ss=&(shell->ss); io=&(shell->io); adb=&(shell->adb); auto_commit_flag=&(shell->auto_commit_flag); iov=&(shell->iov); iov_len=&(shell->iov_len); next_iov_ndx=&(shell->next_iov_ndx); ov=&(shell->ov); ov_len=&(shell->ov_len); next_ov_ndx=&(shell->next_ov_ndx); override=&(shell->override); (*ref_ss)=0; (*io)=0; (*ss)=0; (*adb)=0; (*ov)=0; (*ov_len)=0; (*next_iov_ndx)=0; (*next_ov_ndx)=0; (*auto_commit_flag)=1; (*iov)=0; (*iov_len)=0; } otl_stream (const otl_stream_buffer_size_type arr_size, const char* sqlstm, otl_connect& db, const char* ref_cur_placeholder=0, const char* sqlstm_label=0) OTL_THROWS_OTL_EXCEPTION: #if defined(OTL_ORA_DECLARE_COMMON_READ_STREAM_INTERFACE) otl_read_stream_interface(), #endif shell(0), shell_pt(), connected(0), ref_ss(0), ss(0), io(0), adb(0), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), end_marker(0), oper_int_called(0), last_eof_rc(0), last_oper_was_read_op(false), override(0), buf_size_(0) { init_stream(); (*io)=0; (*ss)=0; (*ref_ss)=0; (*iov)=0; (*iov_len)=0; (*ov)=0; (*ov_len)=0; (*auto_commit_flag)=1; (*next_iov_ndx)=0; (*next_ov_ndx)=0; (*adb)=&db; shell->flush_flag=true; open(arr_size,sqlstm,db,ref_cur_placeholder,sqlstm_label); } otl_stream() OTL_NO_THROW: #if defined(OTL_ORA_DECLARE_COMMON_READ_STREAM_INTERFACE) otl_read_stream_interface(), #endif shell(0), shell_pt(), connected(0), ref_ss(0), ss(0), io(0), adb(0), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), end_marker(0), oper_int_called(0), last_eof_rc(0), last_oper_was_read_op(false), override(0), buf_size_(0) { init_stream(); shell->flush_flag=true; } virtual ~otl_stream() #if !defined(OTL_DESTRUCTORS_DO_NOT_THROW) OTL_THROWS_OTL_EXCEPTION #endif { if(!connected)return; try{ if((*io)!=0&&shell->flush_flag==false) (*io)->flush_flag2=false; close(); if(shell!=0){ if((*io)!=0) (*io)->flush_flag2=true; } }catch(OTL_CONST_EXCEPTION otl_exception&){ if(shell!=0){ if((*io)!=0) (*io)->flush_flag2=true; } #if defined(OTL_STL) && defined(OTL_STREAM_POOLING_ON) clean(1); if(shell!=0) shell->should_delete=1; shell_pt.destroy(); #else shell_pt.destroy(); #endif #if !defined(OTL_DESTRUCTORS_DO_NOT_THROW) throw; #endif } #if defined(OTL_STL) && defined(OTL_STREAM_POOLING_ON) if((adb && (*adb) && (*adb)->throw_count>0) #if defined(OTL_STL) && defined(OTL_UNCAUGHT_EXCEPTION_ON) || otl_uncaught_exception() #elif defined(OTL_UNCAUGHT_EXCEPTION_ON) || otl_uncaught_exception() #endif ){ // } #else shell_pt.destroy(); #endif } int eof(void) OTL_NO_THROW { if((*io)){ (*adb)->reset_throw_count(); return (*io)->eof(); }else if((*ss)){ (*adb)->reset_throw_count(); return (*ss)->eof(); }else if((*ref_ss)){ (*adb)->reset_throw_count(); return (*ref_ss)->eof(); }else return 1; } void flush(const int rowoff=0,const bool force_flush=false) OTL_THROWS_OTL_EXCEPTION { if((*io)){ (*adb)->reset_throw_count(); (*io)->flush(rowoff,force_flush); } } void clean(const int clean_up_error_flag=0) OTL_THROWS_OTL_EXCEPTION { if((*io)){ (*adb)->reset_throw_count(); (*io)->clean(clean_up_error_flag); }else if(*ss){ (*adb)->reset_throw_count(); (*ss)->clean(); }else if(*ref_ss){ (*adb)->reset_throw_count(); (*ref_ss)->clean(); } } void rewind(void) OTL_THROWS_OTL_EXCEPTION { if((*io)){ (*adb)->reset_throw_count(); (*io)->rewind(); }else if((*ss)){ (*adb)->reset_throw_count(); (*ss)->rewind(); }else if((*ref_ss)){ (*adb)->reset_throw_count(); (*ref_ss)->rewind(); } } int is_null(void) OTL_NO_THROW { if((*io)) return (*io)->is_null(); else if((*ss)) return (*ss)->is_null(); else if((*ref_ss)) return (*ref_ss)->is_null(); else return 0; } void set_commit(int auto_commit=0) OTL_NO_THROW { (*auto_commit_flag)=auto_commit; if((*io)){ (*adb)->reset_throw_count(); (*io)->set_commit(auto_commit); } } void open (const otl_stream_buffer_size_type arr_size, const char* sqlstm, otl_connect& db, const char* ref_cur_placeholder=0, const char* sqlstm_label=0) OTL_THROWS_OTL_EXCEPTION { reset_end_marker(); if(this->good()){ const char* temp_stm_text=0; switch(shell->stream_type){ case otl_no_stream_type: temp_stm_text=OTL_NO_STM_TEXT; break; case otl_inout_stream_type: temp_stm_text=(*io)->stm_label?(*io)->stm_label:(*io)->stm_text; break; case otl_select_stream_type: temp_stm_text=(*ss)->stm_label?(*ss)->stm_label:(*ss)->stm_text; break; case otl_refcur_stream_type: temp_stm_text=(*ref_ss)->stm_label?(*ref_ss)->stm_label:(*ref_ss)->stm_text; break; default: temp_stm_text=OTL_NO_STM_TEXT; break; } throw otl_exception (otl_error_msg_29, otl_error_code_29, temp_stm_text); } if(shell==0) init_stream(); buf_size_=arr_size; OTL_TRACE_STREAM_OPEN2 #if defined(OTL_STL) && defined(OTL_STREAM_POOLING_ON) char temp_buf[128]; otl_itoa(arr_size,temp_buf); OTL_STRING_CONTAINER sql_stm= OTL_STRING_CONTAINER(temp_buf)+ OTL_STRING_CONTAINER("===>")+sqlstm; otl_stream_shell_generic* temp_shell=db.sc.find(sql_stm); if(temp_shell){ if(shell!=0) shell_pt.destroy(); shell=OTL_RCAST(otl_stream_shell*,temp_shell); ref_ss=&(shell->ref_ss); ss=&(shell->ss); io=&(shell->io); if((*io)!=0)(*io)->flush_flag2=true; adb=&(shell->adb); auto_commit_flag=&(shell->auto_commit_flag); iov=&(shell->iov); iov_len=&(shell->iov_len); next_iov_ndx=&(shell->next_iov_ndx); ov=&(shell->ov); ov_len=&(shell->ov_len); next_ov_ndx=&(shell->next_ov_ndx); override=&(shell->override); try{ if((*iov_len)==0)this->rewind(); }catch(OTL_CONST_EXCEPTION otl_exception&){ if((*adb)) (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; throw; } connected=1; return; } shell->orig_sql_stm=sql_stm; #endif delete[] (*iov); delete[] (*ov); (*iov)=0; (*iov_len)=0; (*ov)=0; (*ov_len)=0; (*next_iov_ndx)=0; (*next_ov_ndx)=0; char tmp[7]; char* c=OTL_CCAST(char*,sqlstm); while(otl_isspace(*c)||(*c)=='(')++c; OTL_STRNCPY_S(tmp,sizeof(tmp),c,6); tmp[6]=0; c=tmp; while(*c){ *c=OTL_SCAST(char,otl_to_upper(*c)); ++c; } if(adb==0)adb=&(shell->adb); (*adb)=&db; (*adb)->reset_throw_count(); try{ if((strncmp(tmp,"SELECT",6)==0|| strncmp(tmp,"WITH",4)==0)&& ref_cur_placeholder==0){ (*ss)=new otl_select_stream(override,arr_size, sqlstm,db,otl_explicit_select, sqlstm_label); shell->stream_type=otl_select_stream_type; }else if(ref_cur_placeholder!=0){ (*ref_ss)=new otl_ref_select_stream (override,arr_size,sqlstm,ref_cur_placeholder, db,sqlstm_label); shell->stream_type=otl_refcur_stream_type; }else{ (*io)=new otl_inout_stream(arr_size,sqlstm,db,false,sqlstm_label); (*io)->flush_flag=shell->flush_flag; shell->stream_type=otl_inout_stream_type; } }catch(OTL_CONST_EXCEPTION otl_exception&){ shell_pt.destroy(); throw; } if((*io))(*io)->set_commit((*auto_commit_flag)); create_var_desc(); connected=1; } void intern_cleanup(void) { delete[] (*iov); delete[] (*ov); (*iov)=0; (*iov_len)=0; (*ov)=0; (*ov_len)=0; (*next_iov_ndx)=0; (*next_ov_ndx)=0; override->len=0; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: try{ (*io)->flush(); (*io)->close(); }catch(OTL_CONST_EXCEPTION otl_exception&){ clean(1); (*io)->close(); delete (*io); (*io)=0; shell->stream_type=otl_no_stream_type; throw; } delete (*io); (*io)=0; shell->stream_type=otl_no_stream_type; break; case otl_select_stream_type: try{ (*ss)->close(); }catch(OTL_CONST_EXCEPTION otl_exception&){ delete (*ss); (*ss)=0; shell->stream_type=otl_no_stream_type; throw; } delete (*ss); (*ss)=0; shell->stream_type=otl_no_stream_type; break; case otl_refcur_stream_type: try{ (*ref_ss)->close(); }catch(OTL_CONST_EXCEPTION otl_exception&){ delete (*ref_ss); (*ref_ss)=0; shell->stream_type=otl_no_stream_type; throw; } delete (*ref_ss); (*ref_ss)=0; shell->stream_type=otl_no_stream_type; break; } (*ss)=0; (*io)=0; (*ref_ss)=0; if(adb!=0)(*adb)=0; adb=0; } #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) void close(const bool save_in_stream_pool=true) #else void close(void) #endif { if(shell==0)return; OTL_TRACE_FUNC(0x4,"otl_stream","close","") #if (defined(OTL_STL)||defined(OTL_ACE)) && defined(OTL_STREAM_POOLING_ON) if(save_in_stream_pool&&(*adb)&& #if defined(OTL_STL) && defined(OTL_UNCAUGHT_EXCEPTION_ON) !otl_uncaught_exception()&& #elif defined(OTL_UNCAUGHT_EXCEPTION_ON) !otl_uncaught_exception()&& #endif (*adb)->throw_count==0){ try{ this->flush(); this->clean(1); }catch(OTL_CONST_EXCEPTION otl_exception&){ this->clean(1); throw; } if((*adb) && (*adb)->throw_count>0){ (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; return; } #if defined(OTL_STL) && defined(OTL_UNCAUGHT_EXCEPTION_ON) if(otl_uncaught_exception()){ if((*adb)) (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; return; } #elif defined(OTL_UNCAUGHT_EXCEPTION_ON) if(otl_uncaught_exception()){ if((*adb)) (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; return; } #endif (*adb)->sc.add(shell,shell->orig_sql_stm.c_str()); shell_pt.disconnect(); connected=0; }else{ if((*adb)) (*adb)->sc.remove(shell,shell->orig_sql_stm); intern_cleanup(); shell_pt.destroy(); connected=0; } #else intern_cleanup(); connected=0; #endif } otl_column_desc* describe_select(int& desc_len) OTL_NO_THROW { desc_len=0; switch(shell->stream_type){ case otl_no_stream_type: return 0; case otl_inout_stream_type: return 0; case otl_select_stream_type: (*adb)->reset_throw_count(); desc_len=(*ss)->sl_len; return (*ss)->sl_desc; case otl_refcur_stream_type: (*adb)->reset_throw_count(); desc_len=(*ref_ss)->sl_len; return (*ref_ss)->sl_desc; default: return 0; } } int good(void) OTL_NO_THROW { if(!connected)return 0; if((*io)||(*ss)||(*ref_ss)){ (*adb)->reset_throw_count(); return 1; }else return 0; } otl_stream& operator>>(otl_pl_tab_generic& tab) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; if((*io)){ last_eof_rc=(*io)->eof(); (*io)->operator>>(tab); OTL_TRACE_WRITE(", tab len="<>","PL/SQL Tab&") inc_next_ov(); } return *this; } otl_stream& operator>>(otl_refcur_stream& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; if((*io)){ last_eof_rc=(*io)->eof(); (*io)->operator>>(s); OTL_TRACE_WRITE(" ref.cur.stream","operator >>","otl_refcur_stream&") inc_next_ov(); } return *this; } otl_stream& operator<<(otl_pl_tab_generic& tab) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); if((*io)){ (*io)->operator<<(tab); OTL_TRACE_READ(", tab len="<>(otl_pl_vec_generic& vec) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; if((*io)){ last_eof_rc=(*io)->eof(); (*io)->operator>>(vec); OTL_TRACE_WRITE(", tab len="<>","PL/SQL Tab&") inc_next_ov(); } return *this; } otl_stream& operator<<(otl_pl_vec_generic& vec) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); if((*io)){ (*io)->operator<<(vec); OTL_TRACE_READ(", tab len="<operator<<(s); OTL_TRACE_READ(", lob stream","operator <<","PL/otl_lob_stream&") inc_next_iov(); } return *this; } otl_stream& operator>>(otl_time0& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: { last_eof_rc=(*io)->eof(); (*io)->operator>>(s); #if defined(OTL_ORA_TIMESTAMP) OTL_TRACE_WRITE (s.month<<"/"<>", "otl_datetime&"); #endif break; } case otl_select_stream_type: { last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); #if defined(OTL_ORA_TIMESTAMP) OTL_TRACE_WRITE (s.month<<"/"<>", "otl_datetime&"); #endif break; } case otl_refcur_stream_type: { last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(s); #if defined(OTL_ORA_TIMESTAMP) OTL_TRACE_WRITE (s.month<<"/"<>", "otl_datetime&"); #endif break; } } #if defined(OTL_ORA_TIMESTAMP) inc_next_ov(); #endif return *this; } otl_stream& operator<<(const otl_time0& n) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: { (*io)->operator<<(n); #if defined(OTL_ORA_TIMESTAMP) OTL_TRACE_READ(n.month<<"/"<>", "otl_datetime&"); #endif break; } case otl_select_stream_type: { (*ss)->operator<<(n); #if defined(OTL_ORA_TIMESTAMP) OTL_TRACE_READ(n.month<<"/"<>", "otl_datetime&"); #endif break; } case otl_refcur_stream_type: { (*ref_ss)->operator<<(n); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); #if defined(OTL_ORA_TIMESTAMP) OTL_TRACE_READ(n.month<<"/"<>", "otl_datetime&"); #endif break; } } #if defined(OTL_ORA_TIMESTAMP) inc_next_iov(); #endif return *this; } #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) // already declared #else OTL_ORA_COMMON_READ_STREAM& operator>>(otl_datetime& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; #if defined(OTL_ORA7_STRING_TO_TIMESTAMP) if(describe_next_out_var()->ftype==otl_var_char){ char tmp_str[100]; (*this)>>tmp_str; #if defined(OTL_DEFAULT_DATETIME_NULL_TO_VAL) if((*this).is_null()) s=OTL_DEFAULT_DATETIME_NULL_TO_VAL; else OTL_ORA7_STRING_TO_TIMESTAMP(tmp_str,s); #else OTL_ORA7_STRING_TO_TIMESTAMP(tmp_str,s); #endif OTL_TRACE_WRITE (s.month<<"/"<>", "otl_datetime&"); return *this; }else{ otl_time0 tmp; (*this)>>tmp; #if defined(OTL_DEFAULT_DATETIME_NULL_TO_VAL) if((*this).is_null()) s=OTL_DEFAULT_DATETIME_NULL_TO_VAL; else{ s.year=(OTL_SCAST(int,tmp.century)-100)*100+(OTL_SCAST(int,tmp.year)-100); s.month=tmp.month; s.day=tmp.day; s.hour=tmp.hour-1; s.minute=tmp.minute-1; s.second=tmp.second-1; } #else s.year=(OTL_SCAST(int,tmp.century)-100)*100+(OTL_SCAST(int,tmp.year)-100); s.month=tmp.month; s.day=tmp.day; s.hour=tmp.hour-1; s.minute=tmp.minute-1; s.second=tmp.second-1; #endif OTL_TRACE_WRITE (s.month<<"/"<>", "otl_datetime&") inc_next_ov(); return *this; } #else otl_time0 tmp; (*this)>>tmp; #if defined(OTL_DEFAULT_DATETIME_NULL_TO_VAL) if((*this).is_null()) s=OTL_DEFAULT_DATETIME_NULL_TO_VAL; else{ s.year=(OTL_SCAST(int,tmp.century)-100)*100+(OTL_SCAST(int,tmp.year)-100); s.month=tmp.month; s.day=tmp.day; s.hour=tmp.hour-1; s.minute=tmp.minute-1; s.second=tmp.second-1; } #else s.year=(OTL_SCAST(int,tmp.century)-100)*100+(OTL_SCAST(int,tmp.year)-100); s.month=tmp.month; s.day=tmp.day; s.hour=tmp.hour-1; s.minute=tmp.minute-1; s.second=tmp.second-1; #endif OTL_TRACE_WRITE (s.month<<"/"<>", "otl_datetime&"); inc_next_ov(); return *this; #endif } #endif #if (defined(OTL_ORA8I)||defined(OTL_ORA9I))&&defined(OTL_ORA_TIMESTAMP) // already declared #else otl_stream& operator<<(const otl_datetime& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); #if defined(OTL_ORA7_TIMESTAMP_TO_STRING) if(describe_next_in_var()->ftype==otl_var_char){ char tmp_str[100]; OTL_ORA7_TIMESTAMP_TO_STRING(s,tmp_str); OTL_TRACE_READ (s.month<<"/"<>(char& c) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(c); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(c); break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(c); break; } #if defined(OTL_DEFAULT_CHAR_NULL_TO_VAL) if((*this).is_null()) c=OTL_DEFAULT_CHAR_NULL_TO_VAL; #endif OTL_TRACE_WRITE("'"<>","char&") inc_next_ov(); return *this; } #endif OTL_ORA_COMMON_READ_STREAM& operator>>(unsigned char& c) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(c); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(c); break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(c); break; } #if defined(OTL_DEFAULT_CHAR_NULL_TO_VAL) if((*this).is_null()) c=OTL_DEFAULT_CHAR_NULL_TO_VAL; #endif OTL_TRACE_WRITE("'"<>","unsigned char&") inc_next_ov(); return *this; } #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) OTL_ORA_COMMON_READ_STREAM& operator>>(OTL_STRING_CONTAINER& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(s); break; } #if defined(OTL_USER_DEFINED_STRING_CLASS_DEFAULT_NULL_TO_VAL) if((*this).is_null()){ OTL_USER_DEFINED_STRING_CLASS_DEFAULT_NULL_TO_VAL(s); } #elif defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) s=OTL_DEFAULT_STRING_NULL_TO_VAL; #endif OTL_TRACE_WRITE("\""<>","OTL_STRING_CONTAINER&") inc_next_ov(); return *this; } #endif #if !defined(OTL_UNICODE) OTL_ORA_COMMON_READ_STREAM& operator>>(char* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(s); break; } #if defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,OTL_DEFAULT_STRING_NULL_TO_VAL)); #endif OTL_TRACE_WRITE("\""<>","char*") inc_next_ov(); return *this; } #endif #if defined(OTL_UNICODE_STRING_TYPE) OTL_ORA_COMMON_READ_STREAM& operator>>(OTL_UNICODE_STRING_TYPE& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(s); break; } #if defined(OTL_USER_DEFINED_STRING_CLASS_DEFAULT_NULL_TO_VAL) if((*this).is_null()){ OTL_USER_DEFINED_STRING_CLASS_DEFAULT_NULL_TO_VAL(s); } #elif defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) s=OTL_RCAST(const OTL_UNICODE_CHAR_TYPE*, OTL_DEFAULT_STRING_NULL_TO_VAL); #endif OTL_TRACE_WRITE ("\""<>", "OTL_UNICODE_STRING_TYPE&"); inc_next_ov(); return *this; } otl_stream& operator<<(const OTL_UNICODE_STRING_TYPE& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ("\""<stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator<<(s); break; case otl_select_stream_type: (*ss)->operator<<(s); break; case otl_refcur_stream_type: (*ref_ss)->operator<<(s); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } #endif OTL_ORA_COMMON_READ_STREAM& operator>>(unsigned char* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(s); break; } #if defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,OTL_DEFAULT_STRING_NULL_TO_VAL) ); #endif #if defined(OTL_UNICODE) OTL_TRACE_WRITE ("\""<>", OTL_UNICODE_CHAR_TYPE_TRACE_NAME "*") #else OTL_TRACE_WRITE("\""<>","unsigned char*") #endif inc_next_ov(); return *this; } #if defined(OTL_UNICODE) OTL_ORA_COMMON_READ_STREAM& operator>>(OTL_UNICODE_CHAR_TYPE* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(OTL_RCAST(unsigned char*,s)); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(OTL_RCAST(unsigned char*,s)); break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(OTL_RCAST(unsigned char*,s)); break; } #if defined(OTL_DEFAULT_STRING_NULL_TO_VAL) if((*this).is_null()) otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,OTL_DEFAULT_STRING_NULL_TO_VAL)); #endif OTL_TRACE_WRITE(OTL_RCAST(OTL_UNICODE_CHAR_TYPE*,s), "operator >>", OTL_UNICODE_CHAR_TYPE_TRACE_NAME "*") inc_next_ov(); return *this; } OTL_ORA_COMMON_READ_STREAM& operator>>(OTL_UNICODE_CHAR_TYPE& c) OTL_THROWS_OTL_EXCEPTION { OTL_UNICODE_CHAR_TYPE s[1024]; last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(OTL_RCAST(unsigned char*,s)); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(OTL_RCAST(unsigned char*,s)); break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(OTL_RCAST(unsigned char*,s)); break; } c=s[0]; #if defined(OTL_DEFAULT_CHAR_NULL_TO_VAL) if((*this).is_null()) c=OTL_DEFAULT_CHAR_NULL_TO_VAL; #endif OTL_TRACE_WRITE(c,"operator >>", OTL_UNICODE_CHAR_TYPE_TRACE_NAME "") inc_next_ov(); return *this; } #endif OTL_ORA_COMMON_READ_STREAM& operator>>(int& n) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(n); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(n); #else (*ss)->operator>>(n); #endif break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator>>(n); #else (*ref_ss)->operator>>(n); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) n=OTL_SCAST(int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(n,"operator >>","int&") inc_next_ov(); return *this; } OTL_ORA_COMMON_READ_STREAM& operator>>(unsigned& u) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(u); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(u); #else (*ss)->operator>>(u); #endif break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator>>(u); #else (*ref_ss)->operator>>(u); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) u=OTL_SCAST(unsigned int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(u,"operator >>","unsigned&") inc_next_ov(); return *this; } OTL_ORA_COMMON_READ_STREAM& operator>>(short& sh) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(sh); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(sh); #else (*ss)->operator>>(sh); #endif break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator>>(sh); #else (*ref_ss)->operator>>(sh); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) sh=OTL_SCAST(short int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(sh,"operator >>","short int&") inc_next_ov(); return *this; } OTL_ORA_COMMON_READ_STREAM& operator>>(long int& l) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(l); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(l); #else (*ss)->operator>>(l); #endif break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator>>(l); #else (*ref_ss)->operator>>(l); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) l=OTL_SCAST(long int,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(l,"operator >>","long int&") inc_next_ov(); return *this; } OTL_ORA_COMMON_READ_STREAM& operator>>(float& f) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(f); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(f); #else (*ss)->operator>>(f); #endif break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator>>(f); #else (*ref_ss)->operator>>(f); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) f=OTL_SCAST(float,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(f,"operator >>","float&") inc_next_ov(); return *this; } OTL_ORA_COMMON_READ_STREAM& operator>>(double& d) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(d); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator>>(d); #else (*ss)->operator>>(d); #endif break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator>>(d); #else (*ref_ss)->operator>>(d); #endif break; } #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if((*this).is_null()) d=OTL_SCAST(double,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif OTL_TRACE_WRITE(d,"operator >>","double&") inc_next_ov(); return *this; } OTL_ORA_COMMON_READ_STREAM& operator>>(otl_long_string& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator>>(s); break; case otl_select_stream_type: (*ss)->operator>>(s); break; case otl_refcur_stream_type: (*ref_ss)->operator>>(s); break; } OTL_TRACE_WRITE(" len="<>","otl_long_string&") inc_next_ov(); return *this; } OTL_ORA_COMMON_READ_STREAM& operator>>(otl_lob_stream& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=true; switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: last_eof_rc=(*io)->eof(); (*io)->operator>>(s); break; case otl_select_stream_type: last_eof_rc=(*ss)->eof(); (*ss)->operator>>(s); break; case otl_refcur_stream_type: last_eof_rc=(*ref_ss)->eof(); (*ref_ss)->operator>>(s); break; } shell->lob_stream_flag=true; OTL_TRACE_WRITE(" lob stream","operator >>","otl_lob_stream&") inc_next_ov(); return *this; } #if !defined(OTL_UNICODE) otl_stream& operator<<(const char c) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ("'"<stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator<<(c); break; case otl_select_stream_type: (*ss)->operator<<(c); break; case otl_refcur_stream_type: (*ref_ss)->operator<<(c); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } #endif otl_stream& operator<<(const unsigned char c) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ("'"<stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator<<(c); break; case otl_select_stream_type: (*ss)->operator<<(c); break; case otl_refcur_stream_type: (*ref_ss)->operator<<(c); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) otl_stream& operator<<(const OTL_STRING_CONTAINER& s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ("\""<stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator<<(s); break; case otl_select_stream_type: (*ss)->operator<<(s); break; case otl_refcur_stream_type: (*ref_ss)->operator<<(s); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } #endif #if !defined(OTL_UNICODE) otl_stream& operator<<(const char* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ("\""<stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator<<(s); break; case otl_select_stream_type: (*ss)->operator<<(s); break; case otl_refcur_stream_type: (*ref_ss)->operator<<(s); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } #endif otl_stream& operator<<(const unsigned char* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); #if defined(OTL_UNICODE) OTL_TRACE_READ ("\""<stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator<<(s); break; case otl_select_stream_type: (*ss)->operator<<(s); break; case otl_refcur_stream_type: (*ref_ss)->operator<<(s); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } #if defined(OTL_UNICODE) otl_stream& operator<<(const OTL_UNICODE_CHAR_TYPE* s) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ ("\""<stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator<<(OTL_RCAST(const unsigned char*,s)); break; case otl_select_stream_type: (*ss)->operator<<(OTL_RCAST(const unsigned char*,s)); break; case otl_refcur_stream_type: (*ref_ss)->operator<<(OTL_RCAST(const unsigned char*,s)); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const OTL_UNICODE_CHAR_TYPE c) OTL_THROWS_OTL_EXCEPTION { OTL_UNICODE_CHAR_TYPE s[2]; s[0]=c; s[1]=0; (*this)<stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator<<(n); break; case otl_select_stream_type: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(n); #else (*ss)->operator<<(n); #endif break; case otl_refcur_stream_type: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator<<(n); #else (*ref_ss)->operator<<(n); #endif if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const unsigned u) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(u,"operator <<","unsigned"); switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator<<(u); break; case otl_select_stream_type: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(u); #else (*ss)->operator<<(u); #endif break; case otl_refcur_stream_type: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator<<(u); #else (*ref_ss)->operator<<(u); #endif if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const short sh) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(sh,"operator <<","short int"); switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator<<(sh); break; case otl_select_stream_type: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(sh); #else (*ss)->operator<<(sh); #endif break; case otl_refcur_stream_type: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator<<(sh); #else (*ref_ss)->operator<<(sh); #endif if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const long int l) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(l,"operator <<","long int"); switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator<<(l); break; case otl_select_stream_type: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(l); #else (*ss)->operator<<(l); #endif break; case otl_refcur_stream_type: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator<<(l); #else (*ref_ss)->operator<<(l); #endif if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const float f) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(f,"operator <<","float"); switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator<<(f); break; case otl_select_stream_type: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(f); #else (*ss)->operator<<(f); #endif break; case otl_refcur_stream_type: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator<<(f); #else (*ref_ss)->operator<<(f); #endif if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const double d) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(d,"operator <<","double"); switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator<<(d); break; case otl_select_stream_type: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ss)->operator<<(d); #else (*ss)->operator<<(d); #endif break; case otl_refcur_stream_type: #if defined(OTL_NO_TMPL_MEMBER_FUNC_SUPPORT) (*ref_ss)->operator<<(d); #else (*ref_ss)->operator<<(d); #endif if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const otl_null& n) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ("NULL","operator <<","otl_null&"); switch(shell->stream_type){ case otl_no_stream_type: break; case otl_inout_stream_type: (*io)->operator<<(n); break; case otl_select_stream_type: (*ss)->operator<<(n); break; case otl_refcur_stream_type: (*ref_ss)->operator<<(n); if(!(*ov)&&(*ref_ss)->sl) create_var_desc(); break; } inc_next_iov(); return *this; } otl_stream& operator<<(const otl_long_string& d) OTL_THROWS_OTL_EXCEPTION { last_oper_was_read_op=false; reset_end_marker(); OTL_TRACE_READ(" len="<operator<<(d); inc_next_iov(); } return *this; } private: otl_stream& operator=(const otl_stream&) { return *this; } otl_stream(const otl_stream&): #if defined(OTL_ORA_DECLARE_COMMON_READ_STREAM_INTERFACE) otl_read_stream_interface(), #endif shell(0), shell_pt(), connected(0), ref_ss(0), ss(0), io(0), adb(0), auto_commit_flag(0), iov(0), iov_len(0), next_iov_ndx(0), ov(0), ov_len(0), next_ov_ndx(0), end_marker(0), oper_int_called(0), last_eof_rc(0), last_oper_was_read_op(false), override(0), buf_size_(0) { } #if !defined(OTL_STREAM_NO_PRIVATE_BOOL_OPERATORS) otl_stream& operator>>(bool&) OTL_NO_THROW { return *this; } otl_stream& operator<<(const bool) OTL_NO_THROW { return *this; } #endif #if !defined(OTL_STREAM_NO_PRIVATE_UNSIGNED_LONG_OPERATORS) otl_stream& operator>>(unsigned long int&) OTL_NO_THROW { return *this; } otl_stream& operator<<(const unsigned long int) OTL_NO_THROW { return *this; } #endif }; #if defined(OTL_ORA_SUBSCRIBE) #if !defined(OTL_ORA_OCI_ENV_CREATE) #error OTL_ORA_SUBSCRIBE requires #define OTL_ORA_OCI_ENV_CREATE to be enabled #endif #if !defined(OTL_ORA_OCI_ENV_CREATE_MODE) #error OTL_ORA_SUBSCRIBE requires #define OTL_ORA_OCI_ENV_CREATE_MODE to be \ enabled and to have OCI_THREADED|OCI_OBJECT|OCI_EVENTS #endif class otl_subscriber{ public: otl_subscriber(otl_connect* adb=0): db(adb), subscrhp(0) { } virtual ~otl_subscriber(void) { unsubscribe(); } void subscribe(const char *name=0,int port=0,int timeout=1800) { if(subscrhp) unsubscribe(); if(!db||(db&&!db->connected)) throw otl_exception (otl_error_msg_32, otl_error_code_32); OCIEnv *envhp=db->connect_struct.envhp; OCIError *errhp=db->connect_struct.errhp; OCISvcCtx *svchp=db->connect_struct.svchp; if(port) check(OCIAttrSet(OTL_RCAST(dvoid*,envhp), OTL_SCAST(ub4,OCI_HTYPE_ENV), OTL_RCAST(dvoid*,&port), 0, OCI_ATTR_SUBSCR_PORTNO, errhp)); OCISubscription** temp_subscrhp=&subscrhp; check(OCIHandleAlloc(OTL_RCAST(dvoid*,envhp), OTL_RCAST(dvoid**,temp_subscrhp), OCI_HTYPE_SUBSCRIPTION, OTL_SCAST(size_t,0), OTL_RCAST(dvoid**,0))); if(name && *name) check(OCIAttrSet(subscrhp, OCI_HTYPE_SUBSCRIPTION, OTL_RCAST(void*,OTL_CCAST(char*,name)), OTL_SCAST(ub4,strlen(name)), OCI_ATTR_SUBSCR_NAME, errhp)); ub4 nspace = OCI_SUBSCR_NAMESPACE_DBCHANGE; check(OCIAttrSet(subscrhp, OCI_HTYPE_SUBSCRIPTION, OTL_RCAST(dvoid*,&nspace), sizeof(ub4), OCI_ATTR_SUBSCR_NAMESPACE, errhp)); check(OCIAttrSet(subscrhp, OCI_HTYPE_SUBSCRIPTION, #if defined(__GNUC__) && (__GNUC__<4) (void*)common_notification_callback, #else OTL_RCAST(void*,common_notification_callback), #endif 0, OCI_ATTR_SUBSCR_CALLBACK, errhp)); int rowids_needed=1; check(OCIAttrSet(subscrhp, OCI_HTYPE_SUBSCRIPTION, OTL_RCAST(dvoid*,&rowids_needed), sizeof(ub4), OCI_ATTR_CHNF_ROWIDS, errhp)); check(OCIAttrSet(subscrhp, OTL_SCAST(ub4,OCI_HTYPE_SUBSCRIPTION), OTL_RCAST(dvoid*,this), 0, OCI_ATTR_SUBSCR_CTX, errhp)); if(timeout) check(OCIAttrSet(subscrhp, OCI_HTYPE_SUBSCRIPTION, OTL_RCAST(dvoid*,&timeout), 0, OCI_ATTR_SUBSCR_TIMEOUT, errhp)); check(OCISubscriptionRegister(svchp,&subscrhp,1,errhp,OCI_DEFAULT)); } void unsubscribe(void) { if(!subscrhp) return; if(!db||(db&&!db->connected)) throw otl_exception (otl_error_msg_32, otl_error_code_32); OCIError *errhp=db->connect_struct.errhp; OCISvcCtx *svchp=db->connect_struct.svchp; OCISubscriptionUnRegister(svchp,subscrhp,errhp,OCI_DEFAULT); OCIHandleFree(OTL_RCAST(dvoid*,subscrhp),OCI_HTYPE_SUBSCRIPTION); subscrhp=0; } void associate_table(const char *table_name) { if(!db||(db&&!db->connected)) throw otl_exception (otl_error_msg_32, otl_error_code_32); char sql_stmt[1024]; OTL_STRCPY_S(sql_stmt,sizeof(sql_stmt),"select :i from "); OTL_STRCAT_S(sql_stmt,sizeof(sql_stmt),table_name); int arg=0; otl_stream s(1,sql_stmt,*db); if(!s.shell || !s.shell->ss) throw otl_exception(db->connect_struct,sql_stmt); OCIError *errhp=db->connect_struct.errhp; OCIStmt *stmthp=s.shell->ss->cursor_struct.cda; check(OCIAttrSet(stmthp, OCI_HTYPE_STMT, subscrhp, 0, OCI_ATTR_CHNF_REGHANDLE, errhp)); s<connected)) throw otl_exception (otl_error_msg_32, otl_error_code_32); otl_stream s(1,stmt,*db); if(!s.shell || !s.shell->ss) throw otl_exception(db->connect_struct,stmt); OCIError *errhp=db->connect_struct.errhp; OCIStmt *stmthp=s.shell->ss->cursor_struct.cda; check(OCIAttrSet(stmthp, OCI_HTYPE_STMT, subscrhp, 0, OCI_ATTR_CHNF_REGHANDLE, errhp)); s<<0; } protected: void check(ub4 ret_code) { if(ret_code!=OCI_SUCCESS) throw otl_exception(db->connect_struct); } virtual void OnException(otl_exception& e) = 0; virtual void OnDeRegistration(void) = 0; //--- DB events: virtual void OnStartup(void) = 0; virtual void OnInstanceShutdown(void) = 0; virtual void OnAnyInstanceShutdown(void) = 0; //--- Table events: virtual void OnTableInvalidate(text *table_name) = 0; virtual void OnTableAlter(text *table_name) = 0; virtual void OnTableDrop(text *table_name) = 0; virtual void OnTableChange(text *table_name) = 0; //--- Row events: virtual void OnRowInsert( text *table_name, text *row_id ) = 0; virtual void OnRowUpdate( text *table_name, text *row_id ) = 0; virtual void OnRowDelete( text *table_name, text *row_id ) = 0; protected: otl_connect* db; private: OCISubscription *subscrhp; void notification_callback (dvoid* /*payload*/, ub4 /*paylen*/, dvoid *desc, ub4 /*mode*/) { if(!db||(db&&!db->connected)) return; ub4 num_rows = 0; OCIColl *row_changes=0; dvoid *row_desc, **row_descp; dvoid*** temp_row_descp=&row_descp; text *row_id; ub4 rowid_size; unsigned int j; try{ OCIEnv *envhp=db->connect_struct.envhp; OCIError *errhp=db->connect_struct.errhp; //---------------- ub4 notify_type; check(OCIAttrGet(desc, OCI_DTYPE_CHDES, ¬ify_type, 0, OCI_ATTR_CHDES_NFYTYPE, errhp)); switch(notify_type){ case OCI_EVENT_STARTUP: OnStartup(); return; case OCI_EVENT_SHUTDOWN: OnInstanceShutdown(); return; case OCI_EVENT_SHUTDOWN_ANY: OnAnyInstanceShutdown(); return; case OCI_EVENT_DEREG: OnDeRegistration(); return; case OCI_EVENT_OBJCHANGE: break; default: return; } OCIColl *table_changes=0; check(OCIAttrGet(desc, OCI_DTYPE_CHDES, &table_changes, 0, OCI_ATTR_CHDES_TABLE_CHANGES, errhp)); if(!table_changes)return; ub4 num_tables=0; check(OCICollSize(envhp, errhp, OTL_RCAST(CONST OCIColl*,table_changes), OTL_RCAST(sb4*,&num_tables))); if(!num_tables)return; for(unsigned int i=0;inotification_callback(payload,paylen,desc,mode); } public: bool is_online(void){ return subscrhp!=0; } private: otl_subscriber(const otl_subscriber&): db(0), subscrhp(0) { } otl_subscriber& operator=(const otl_subscriber&) { return *this; } }; #endif inline otl_connect& operator>>(otl_connect& connect, otl_stream& s) { const char* cmd=connect.getCmd(); const char* invalid_cmd="*** INVALID COMMAND ***"; if(!cmd) cmd=invalid_cmd; s.open(s.getBufSize(),cmd,connect); return connect; } #if (defined(OTL_STL)||defined(OTL_VALUE_TEMPLATE_ON)) \ && defined(OTL_VALUE_TEMPLATE) template otl_stream& operator<<(otl_stream& s, const otl_value& var) OTL_THROWS_OTL_EXCEPTION { if(var.ind) s< otl_stream& operator>>(otl_stream& s, otl_value& var) OTL_THROWS_OTL_EXCEPTION { s>>var.v; if(s.is_null()) var.ind=true; else var.ind=false; return s; } template otl_refcur_stream& operator>>(otl_refcur_stream& s, otl_value& var) OTL_THROWS_OTL_EXCEPTION { s>>var.v; if(s.is_null()) var.ind=true; else var.ind=false; return s; } #endif typedef otl_tmpl_nocommit_stream otl_nocommit_stream; #if defined(OTL_BIGINT) && defined(OTL_STR_TO_BIGINT) && \ defined(OTL_BIGINT_TO_STR) inline otl_stream& operator>>(otl_stream& s, OTL_BIGINT& n) OTL_THROWS_OTL_EXCEPTION { char temp_val[otl_bigint_str_size]; #if defined(OTL_UNICODE) OTL_CHAR unitemp_val[otl_bigint_str_size]; s>>OTL_RCAST(unsigned char*,unitemp_val); OTL_CHAR* uc=unitemp_val; char* c=temp_val; while(*uc){ *c=OTL_SCAST(char,*uc); ++uc; ++c; } *c=0; #else s>>temp_val; #endif if(s.is_null()){ #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if(s.is_null()) n=OTL_SCAST(OTL_BIGINT,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif return s; } OTL_STR_TO_BIGINT(temp_val,n) return s; } inline otl_refcur_stream& operator>>(otl_refcur_stream& s, OTL_BIGINT& n) OTL_THROWS_OTL_EXCEPTION { char temp_val[otl_bigint_str_size]; s>>temp_val; if(s.is_null()){ #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if(s.is_null()) n=OTL_SCAST(OTL_BIGINT,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); #endif return s; } OTL_STR_TO_BIGINT(temp_val,n) return s; } inline otl_stream& operator<<(otl_stream& s, const OTL_BIGINT n) OTL_THROWS_OTL_EXCEPTION { #if defined(OTL_UNICODE) char temp_val[otl_bigint_str_size]; OTL_BIGINT_TO_STR(n,temp_val) OTL_CHAR unitemp_val[otl_bigint_str_size]; OTL_CHAR* uc=unitemp_val; char* c=temp_val; while(*c){ *uc=OTL_SCAST(OTL_CHAR,*c); ++uc; ++c; } *uc=0; s< #define STL_OUTPUT_ITERATOR_TO_DERIVE_FROM \ : public STD_NAMESPACE_PREFIX iterator \ #endif #if defined(OTL_STL) || defined(OTL_STLPORT) #define OTL_ITERATORS \ template \ class otl_input_iterator STL_INPUT_ITERATOR_TO_DERIVE_FROM { \ public: \ \ typedef STD_NAMESPACE_PREFIX input_iterator_tag iterator_category; \ typedef T value_type; \ typedef Distance difference_type; \ typedef const T* pointer; \ typedef const T& reference; \ \ otl_stream* stream; \ T value; \ int end_marker; \ \ void read() \ { \ if(!stream){ \ end_marker=-1; \ return; \ } \ if(stream->eof()){ \ end_marker=-1; \ return; \ } \ end_marker=stream->eof(); \ if(!end_marker)*stream>>value; \ if(stream->eof())end_marker=1; \ } \ \ otl_input_iterator() : stream(0), value(), end_marker(-1){} \ otl_input_iterator(otl_stream& s) : stream(&s), value(),end_marker(0){read();} \ \ const T& operator*() const { return value; } \ \ otl_input_iterator& operator++(){read(); return *this;} \ \ otl_input_iterator operator++(int) \ { \ otl_input_iterator tmp = *this; \ read(); \ return tmp; \ } \ \ otl_input_iterator(const otl_input_iterator& src): \ stream(src.stream),value(src.value),end_marker(src.end_marker){} \ \ otl_input_iterator& operator=(const otl_input_iterator& src) \ { \ stream=src.stream; \ value=src.value; \ end_marker=src.end_marker; \ return *this; \ } \ }; \ \ template \ inline STD_NAMESPACE_PREFIX input_iterator_tag iterator_category( \ const otl_input_iterator& \ ) \ { \ return STD_NAMESPACE_PREFIX input_iterator_tag(); \ } \ \ template \ inline T* value_type(const otl_input_iterator&) \ { \ return 0; \ } \ \ template \ inline Distance* distance_type(const otl_input_iterator&) \ { \ return 0; \ } \ \ template \ bool operator==(const otl_input_iterator& x, \ const otl_input_iterator& y) \ { \ return (x.stream == y.stream && x.end_marker == y.end_marker) || \ (x.end_marker == -1 && y.end_marker == -1); \ } \ \ template \ bool operator!=(const otl_input_iterator& x, \ const otl_input_iterator& y) \ { \ return !(x==y); \ } \ \ template \ class otl_output_iterator STL_OUTPUT_ITERATOR_TO_DERIVE_FROM { \ protected: \ otl_stream* stream; \ public: \ \ typedef STD_NAMESPACE_PREFIX output_iterator_tag iterator_category; \ typedef void value_type; \ typedef void difference_type; \ typedef void pointer; \ typedef void reference; \ \ otl_output_iterator(otl_stream& s) : stream(&s){} \ otl_output_iterator& operator=(const T& value) \ { \ *stream << value; \ return *this; \ } \ otl_output_iterator& operator*() { return *this; } \ otl_output_iterator& operator++() { return *this; } \ otl_output_iterator operator++(int) { return *this; } \ \ }; \ \ template \ inline STD_NAMESPACE_PREFIX output_iterator_tag \ iterator_category(const otl_output_iterator&) { \ return STD_NAMESPACE_PREFIX output_iterator_tag(); \ } #if defined(OTL_ORA7) OTL_ORA7_NAMESPACE_BEGIN OTL_ITERATORS OTL_ORA7_NAMESPACE_END #endif #if defined(OTL_ORA8) OTL_ORA8_NAMESPACE_BEGIN OTL_ITERATORS OTL_ORA8_NAMESPACE_END #endif #if defined(OTL_ODBC) OTL_ODBC_NAMESPACE_BEGIN OTL_ITERATORS OTL_ODBC_NAMESPACE_END #endif #endif #if defined(OTL_STREAM_READ_ITERATOR_ON) #if defined(OTL_UNICODE) #error UNICODE is not supported when #define OTL_STREAM_READ_ITERATOR_ON is enabled #endif #if defined(OTL_STL) #include #endif #if defined(OTL_ACE) #include #include #include #include #include #endif #if defined(OTL_STL)||defined(OTL_ACE) class otl_ltcharstar{ public: #if defined(OTL_STL) bool #else int #endif operator()(const char* s1, const char* s2) const { #if defined(__BORLANDC__) || defined(_MSC_VER) return stricmp(s1,s2)<0; #else #if defined(__STRICT_ANSI__) while(otl_to_upper(*s1)==otl_to_upper(*s2)&&*s1){ ++s1; ++s2; } return *s1 < *s2; #else return strcasecmp(s1,s2)<0; #endif #endif } }; #endif template class otl_stream_read_iterator{ public: otl_stream_read_iterator(OTLStream& s) { set(); attach(s); } otl_stream_read_iterator(): out_vars_(0), out_vars_len_(0), str_(0), out_vars_arr_(0), out_vars_null_arr_(0), out_vars_constructed_(0), lob_stream_mode_flag_(false) #if defined(OTL_STL) ,var_name2pos_map_() #endif #if defined(OTL_ACE) ,var_name2pos_map_() #endif { set(); } ~otl_stream_read_iterator() { reset(); } void attach(OTLStream& s) { reset(); str_=&s; if(!str_->good()){ str_=0; throw OTLException(otl_error_msg_19,otl_error_code_19); } out_vars_=str_->describe_out_vars(out_vars_len_); if(!out_vars_){ throw OTLException(otl_error_msg_21,otl_error_code_21); } if(str_->shell) lob_stream_mode_flag_=str_->shell->lob_stream_flag; allocate_arrays(); } void detach(void) { reset(); } const otl_var_desc* describe(int& var_desc_len) { var_desc_len=out_vars_len_; return out_vars_; } bool next_row(void) { if(str_->eof())return false; for(int i=0;i>OTL_RCAST(char*,curr_ptr); break; case otl_var_double: (*str_)>>*OTL_RCAST(double*,curr_ptr); break; case otl_var_float: (*str_)>>*OTL_RCAST(float*,curr_ptr); break; case otl_var_int: (*str_)>>*OTL_RCAST(int*,curr_ptr); break; case otl_var_unsigned_int: (*str_)>>*OTL_RCAST(unsigned*,curr_ptr); break; case otl_var_short: (*str_)>>*OTL_RCAST(short int*,curr_ptr); break; case otl_var_long_int: (*str_)>>*OTL_RCAST(long int*,curr_ptr); break; case otl_var_raw: (*str_)>>*OTL_RCAST(otl_long_string*,curr_ptr); break; case otl_var_timestamp: case otl_var_db2time: case otl_var_db2date: case otl_var_tz_timestamp: case otl_var_ltz_timestamp: (*str_)>>*OTL_RCAST(otl_datetime*,curr_ptr); break; case otl_var_varchar_long: case otl_var_raw_long: case otl_var_clob: case otl_var_blob: #if !defined(OTL_ORA7) if(lob_stream_mode_flag_) (*str_)>>*OTL_RCAST(OTLLobStream*,curr_ptr); else #endif (*str_)>>*OTL_RCAST(otl_long_string*,curr_ptr); break; #if defined(OTL_BIGINT) case otl_var_bigint: (*str_)>>*OTL_RCAST(OTL_BIGINT*,curr_ptr); break; #endif } out_vars_null_arr_[i]=str_->is_null()==1; } return true; } #if !defined(OTL_ORA7) void get(const int pos, OTLLobStream*& s) { check_pos(pos); check_type(pos,otl_var_long_string,true); if(!lob_stream_mode_flag_){ char var_info[255]; otl_var_info_var3 (out_vars_[pos-1].name, out_vars_[pos-1].ftype, otl_var_lob_stream, var_info, sizeof(var_info)); throw OTLException (otl_error_msg_25, otl_error_code_25, str_->get_stm_text(), var_info); } unsigned char* curr_ptr=out_vars_arr_[pos-1]; s=OTL_RCAST(OTLLobStream*,curr_ptr); } #endif #if defined(OTL_STL) && !defined(OTL_ORA7) void get(const char* var_name,OTLLobStream*& n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) && !defined(OTL_ORA7) void get(const char* var_name,OTLLobStream*& n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif void get(const int pos, char& c) { check_pos(pos); check_type(pos,otl_var_char); unsigned char* curr_ptr=out_vars_arr_[pos-1]; c=OTL_SCAST(char,*curr_ptr); } #if defined(OTL_STL) void get(const char* var_name, char& n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) void get(const char* var_name, char& n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif void get(const int pos, unsigned char& c) { check_pos(pos); check_type(pos,otl_var_char); unsigned char* curr_ptr=out_vars_arr_[pos-1]; c=*curr_ptr; } #if defined(OTL_STL) void get(const char* var_name, unsigned char& n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) void get(const char* var_name, unsigned char& n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif void get(const int pos, char* s) { check_pos(pos); check_type(pos,otl_var_char); unsigned char* curr_ptr=out_vars_arr_[pos-1]; otl_strcpy(OTL_RCAST(unsigned char*,s), OTL_RCAST(const unsigned char*,curr_ptr)); } #if defined(OTL_STL) void get(const char* var_name, char* n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) void get(const char* var_name, char* n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif void get(const int pos, unsigned char* s) { check_pos(pos); check_type(pos,otl_var_char); unsigned char* curr_ptr=out_vars_arr_[pos-1]; otl_strcpy(OTL_RCAST(unsigned char*,s),OTL_RCAST(const unsigned char*,curr_ptr)); } #if defined(OTL_STL) void get(const char* var_name, unsigned char* n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) void get(const char* var_name, unsigned char* n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif void get(const int pos, unsigned int& n) { check_pos(pos); void* curr_ptr=out_vars_arr_[pos-1]; #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) int match_found=otl_numeric_convert_T (out_vars_[pos-1].ftype, curr_ptr, n); #else int match_found=otl_numeric_convert_T (out_vars_[pos-1].ftype, curr_ptr, n); #endif if(match_found)return; check_type(pos,otl_var_unsigned_int); } #if defined(OTL_STL) void get(const char* var_name, unsigned int& n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) void get(const char* var_name, unsigned int& n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif void get(const int pos, int& n) { check_pos(pos); void* curr_ptr=out_vars_arr_[pos-1]; #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) int match_found=otl_numeric_convert_T (out_vars_[pos-1].ftype, curr_ptr, n); #else int match_found=otl_numeric_convert_T (out_vars_[pos-1].ftype, curr_ptr, n); #endif if(match_found)return; check_type(pos,otl_var_unsigned_int); } #if defined(OTL_STL) void get(const char* var_name, int& n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) void get(const char* var_name, int& n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif void get(const int pos, short int& n) { check_pos(pos); void* curr_ptr=out_vars_arr_[pos-1]; #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) int match_found=otl_numeric_convert_T (out_vars_[pos-1].ftype, curr_ptr, n); #else int match_found=otl_numeric_convert_T (out_vars_[pos-1].ftype, curr_ptr, n); #endif if(match_found)return; check_type(pos,otl_var_short); } #if defined(OTL_STL) void get(const char* var_name, short int& n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) void get(const char* var_name, short int& n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif void get(const int pos, long int& n) { check_pos(pos); void* curr_ptr=out_vars_arr_[pos-1]; #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) int match_found=otl_numeric_convert_T (out_vars_[pos-1].ftype, curr_ptr, n); #else int match_found=otl_numeric_convert_T (out_vars_[pos-1].ftype, curr_ptr, n); #endif if(match_found)return; check_type(pos,otl_var_long_int); } #if defined(OTL_STL) void get(const char* var_name, long int& n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) void get(const char* var_name, long int& n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif void get(const int pos, float& n) { check_pos(pos); void* curr_ptr=out_vars_arr_[pos-1]; #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) int match_found=otl_numeric_convert_T (out_vars_[pos-1].ftype, curr_ptr, n); #else int match_found=otl_numeric_convert_T (out_vars_[pos-1].ftype, curr_ptr, n); #endif if(match_found)return; check_type(pos,otl_var_double); } #if defined(OTL_STL) void get(const char* var_name, float& n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) void get(const char* var_name, float& n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif void get(const int pos, double& n) { check_pos(pos); void* curr_ptr=out_vars_arr_[pos-1]; #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) int match_found=otl_numeric_convert_T (out_vars_[pos-1].ftype, curr_ptr, n); #else int match_found=otl_numeric_convert_T (out_vars_[pos-1].ftype, curr_ptr, n); #endif if(match_found)return; check_type(pos,otl_var_double); } #if defined(OTL_BIGINT) void get(const int pos, OTL_BIGINT& n) { check_pos(pos); void* curr_ptr=out_vars_arr_[pos-1]; #if defined(OTL_STRICT_NUMERIC_TYPE_CHECK_ON_SELECT) int match_found=otl_numeric_convert_T (out_vars_[pos-1].ftype, curr_ptr, n); #else int match_found=otl_numeric_convert_T (out_vars_[pos-1].ftype, curr_ptr, n); #endif if(match_found)return; #if defined(OTL_STR_TO_BIGINT) && defined(OTL_BIGINT_TO_STR) if(out_vars_[pos-1].ftype==otl_var_char){ char* temp_val=OTL_RCAST(char*,curr_ptr); #if defined(OTL_DEFAULT_NUMERIC_NULL_TO_VAL) if(is_null(pos)){ n=OTL_SCAST(OTL_BIGINT,OTL_DEFAULT_NUMERIC_NULL_TO_VAL); return; } #endif OTL_STR_TO_BIGINT(temp_val,n); return; } check_type(pos,otl_var_bigint); #else check_type(pos,otl_var_bigint); #endif } #if defined(OTL_STL) void get(const char* var_name, OTL_BIGINT& n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) void get(const char* var_name, OTL_BIGINT& n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif #endif bool is_null(const int pos) { check_pos(pos); return out_vars_null_arr_[pos-1]; } #if defined(OTL_STL) bool is_null(const char* var_name) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); return is_null((*it).second+1); } #endif #if defined(OTL_ACE) bool is_null(const char* var_name) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); return is_null(it->item()+1); } #endif #if defined(OTL_STL) || defined(USER_DEFINED_STRING_CLASS) void get(const int pos, OTL_STRING_CONTAINER& s) { check_pos(pos); otl_var_desc& curr_var=out_vars_[pos-1]; unsigned char* curr_ptr=out_vars_arr_[pos-1]; switch(curr_var.ftype){ case otl_var_varchar_long: case otl_var_raw_long: case otl_var_clob: case otl_var_blob: { otl_long_string* ls=OTL_RCAST(otl_long_string*,curr_ptr); int len=ls->len(); s.assign(OTL_RCAST(char*,ls->v),len); } break; case otl_var_char: s=OTL_RCAST(char*,curr_ptr); break; default: { char var_info[255]; otl_var_info_var3 (out_vars_[pos-1].name, out_vars_[pos-1].ftype, otl_var_char, var_info, sizeof(var_info)); throw OTLException (otl_error_msg_23, otl_error_code_23, str_->get_stm_text(), var_info); } } } #endif #if defined(OTL_STL) void get(const char* var_name, OTL_STRING_CONTAINER& n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) void get(const char* var_name, OTL_STRING_CONTAINER& n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif void get(const int pos, otl_long_string& s) { check_pos(pos); check_type(pos,otl_var_long_string); unsigned char* curr_ptr=out_vars_arr_[pos-1]; s=*OTL_RCAST(otl_long_string*,curr_ptr); } #if defined(OTL_STL) void get(const char* var_name, otl_long_string& n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) void get(const char* var_name, otl_long_string& n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif void get(const int pos, otl_long_string*& s) { check_pos(pos); check_type(pos,otl_var_long_string); unsigned char* curr_ptr=out_vars_arr_[pos-1]; s=OTL_RCAST(otl_long_string*,curr_ptr); } #if defined(OTL_STL) void get(const char* var_name, otl_long_string*& n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) void get(const char* var_name, otl_long_string*& n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif void get(const int pos, otl_datetime& s) { check_pos(pos); check_type(pos,otl_var_timestamp); unsigned char* curr_ptr=out_vars_arr_[pos-1]; s=*OTL_RCAST(otl_datetime*,curr_ptr); } #if defined(OTL_STL) void get(const char* var_name, otl_datetime& n) { var_name2pos_map_type::iterator it=var_name2pos_map_.find(var_name); check_name(it,var_name); get((*it).second+1,n); } #endif #if defined(OTL_ACE) void get(const char* var_name, otl_datetime& n) { var_name2pos_map_type::ENTRY* it=0; var_name2pos_map_.find(var_name,it); check_name(it,var_name); get(it->item()+1,n); } #endif protected: otl_var_desc* out_vars_; int out_vars_len_; OTLStream* str_; unsigned char** out_vars_arr_; bool* out_vars_null_arr_; bool out_vars_constructed_; bool lob_stream_mode_flag_; #if defined(OTL_STL) typedef STD_NAMESPACE_PREFIX map var_name2pos_map_type; var_name2pos_map_type var_name2pos_map_; #endif #if defined(OTL_ACE) typedef ACE_RB_Tree var_name2pos_map_type; var_name2pos_map_type var_name2pos_map_; #endif void check_pos(const int pos) { int actual_pos=pos-1; if(actual_pos<0 || actual_pos>out_vars_len_-1){ throw OTLException (otl_error_msg_22, otl_error_code_22, str_->get_stm_text()); } } #if defined(OTL_STL) void check_name(var_name2pos_map_type::iterator& it, const char* var_name) { if(it==var_name2pos_map_.end()) throw OTLException (otl_error_msg_26, otl_error_code_26, str_->get_stm_text(), var_name); } #endif #if defined(OTL_ACE) void check_name(var_name2pos_map_type::ENTRY* it,const char* var_name) { if(!it){ throw OTLException (otl_error_msg_26, otl_error_code_26, str_->get_stm_text(), var_name); } } #endif void check_type(const int pos, const int type_code, const bool lob_stream_arg=false) { switch(out_vars_[pos-1].ftype){ case otl_var_timestamp: case otl_var_tz_timestamp: case otl_var_ltz_timestamp: if(type_code==otl_var_timestamp) return; case otl_var_varchar_long: case otl_var_raw_long: case otl_var_clob: case otl_var_blob: if(type_code==otl_var_long_string) return; case otl_var_raw: if(type_code==otl_var_long_string && lob_stream_mode_flag_ && lob_stream_arg){ char var_info1[255]; otl_var_info_var4 (out_vars_[pos-1].name, out_vars_[pos-1].ftype, otl_var_lob_stream, var_info1, sizeof(var_info1)); throw OTLException (otl_error_msg_28, otl_error_code_28, str_->get_stm_text(), var_info1); }else return; default: if(out_vars_[pos-1].ftype==type_code) return; } char var_info2[255]; otl_var_info_var3 (out_vars_[pos-1].name, out_vars_[pos-1].ftype, type_code, var_info2, sizeof(var_info2)); throw OTLException (otl_error_msg_23, otl_error_code_23, str_->get_stm_text(), var_info2); } void set(void) { out_vars_=0; out_vars_len_=0; str_=0; out_vars_arr_=0; out_vars_null_arr_=0; out_vars_constructed_=false; lob_stream_mode_flag_=false; } void reset(void) { if(out_vars_constructed_){ for(int i=0;ishell->adb->get_max_long_size())); break; #if defined(OTL_BIGINT) case otl_var_bigint: out_vars_arr_[i]=OTL_RCAST(unsigned char*,new OTL_BIGINT(0)); break; #endif } #if defined(OTL_STL) var_name2pos_map_[curr_var.name]=i; #endif #if defined(OTL_ACE) var_name2pos_map_.bind(curr_var.name,i); #endif } out_vars_constructed_=true; } private: otl_stream_read_iterator(const otl_stream_read_iterator&): out_vars_(0), out_vars_len_(0), str_(0), out_vars_arr_(0), out_vars_null_arr_(0), out_vars_constructed_(0), lob_stream_mode_flag_(false) #if defined(OTL_STL) ,var_name2pos_map_() #endif #if defined(OTL_ACE) ,var_name2pos_map_() #endif { } otl_stream_read_iterator& operator=(const otl_stream_read_iterator&) { return *this; } }; #endif #if defined(OTL_ORA_TEXT_ON)&&defined(text) #undef text #endif #endif tora-2.1.3/src/utils.cpp0000644000175000017500000010271111414153116014702 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" #include "tobackground.h" #include "toconf.h" #include "toconnection.h" #include "tohighlightedtext.h" #include "tomain.h" #include "toresult.h" #include "tosql.h" #include "tothread.h" #include "totool.h" #include #include #include #include #include #include #include #include "totreewidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_WIN32 # include "windows/cregistry.h" # include "windows.h" #endif #if defined(Q_OS_MACX) #include #include #endif // Q_OS_MACX #define CHUNK_SIZE 31 // A little magic to get lrefresh to work and get a check on qApp #undef QT_TRANSLATE_NOOP #define QT_TRANSLATE_NOOP(x,y) QTRANS(x,y) // toSQL::TOSQL_USERLIST is used to populate toResultSchema static toSQL SQLUserNamesMySQL(toSQL::TOSQL_USERLIST, "SHOW DATABASES", "List users in the database", "3.0", "MySQL"); static toSQL SQLUserNames(toSQL::TOSQL_USERLIST, "SELECT UserName FROM sys.All_Users ORDER BY UserName", ""); static toSQL SQLUserNamesPgSQL(toSQL::TOSQL_USERLIST, "SELECT nspname AS UserName FROM pg_namespace ORDER BY nspname", "", "7.1", "PostgreSQL"); static toSQL SQLUserNamesSapDB(toSQL::TOSQL_USERLIST, "SELECT username \"UserName\" FROM users ORDER BY username", "", "", "SapDB"); static toSQL SQLUserNamesTD( toSQL::TOSQL_USERLIST, "SELECT trim ( databasename )\n" " FROM dbc.UserRights\n" " UNION\n" "SELECT trim ( databasename )\n" " FROM dbc.UserRoleRights\n" " GROUP BY 1", "", "", "Teradata"); static toSQL SQLTextPiece("Global:SQLText", "SELECT SQL_Text\n" " FROM V$SQLText_With_Newlines\n" " WHERE Address||':'||Hash_Value = :f1\n" " ORDER BY Piece", "Get text of SQL statement."); QString toSQLString(toConnection &conn, const QString &address) { QString sql; toQList vals = toQuery::readQuery(conn, SQLTextPiece, address); for (toQList::iterator i = vals.begin(); i != vals.end(); i++) { sql.append(*i); } if (sql.isEmpty()) throw qApp->translate("toSQLString", "SQL Address not found in SGA"); return sql; } static toSQL SQLNowMySQL("Global:Now", "SELECT now()", "Get current date/time from database", "3.0", "MySQL"); static toSQL SQLNow("Global:Now", "SELECT TO_CHAR(SYSDATE) FROM sys.DUAL", ""); static toSQL SQLNowPgSQL("Global:Now", "SELECT now()", "", "7.1", "PostgreSQL"); static toSQL SQLNowTD("Global:Now", "SELECT CURRENT_DATE", "", "", "Teradata"); QString toNow(toConnection &conn) { try { toQList vals = toQuery::readQuery(conn, SQLNow); return toPop(vals); } catch (...) { return qApp->translate("toNow", "Unexpected error"); } } QString toSQLStripSpecifier(const QString &sql) { QString ret; char inString = 0; for (int i = 0; i < sql.length(); i++) { QChar rc = sql.at(i); char c = rc.toLatin1(); if (inString) { if (c == inString) { inString = 0; } ret += c; } else { switch (c) { case '\'': inString = '\''; ret += rc; break; case '\"': inString = '\"'; ret += rc; break; case ':': ret += rc; for (i++; i < sql.length(); i++) { rc = sql.at(i); c = rc.toLatin1(); if (!rc.isLetterOrNumber()) break; ret += rc; } if (c == '<') { ret += QString::fromLatin1(" "); for (i++; i < sql.length(); i++) { rc = sql.at(i); c = rc.toLatin1(); ret += QString::fromLatin1(" "); if (c == '>') { i++; break; } } } i--; break; default: ret += rc; } } } return ret; } QString toSQLStripBind(const QString &sql) { QString ret; char inString = 0; for (int i = 0; i < sql.length(); i++) { QChar rc = sql.at(i); char c = rc.toLatin1(); // current char n = 0; // next if (i + 1 < sql.length()) n = sql.at(i + 1).toLatin1(); if (inString) { if (c == inString) { inString = 0; } ret += rc; } else { switch (char(c)) { case '\'': inString = '\''; ret += rc; break; case '\"': inString = '\"'; ret += rc; break; case ':': // don't nuke my postgres-style casts if (n == ':') { ret += rc; ret += n; i++; break; } ret += QString::fromLatin1("''"); for (i++; i < sql.length(); i++) { rc = sql.at(i); c = rc.toLatin1(); if (!rc.isLetterOrNumber()) break; } if (c == '<') { for (i++; i < sql.length(); i++) { rc = sql.at(i); c = rc.toLatin1(); if (c == '>') { i++; break; } } } i--; break; default: ret += rc; } } } return ret; } static toSQL SQLAddress("Global:Address", "SELECT Address||':'||Hash_Value\n" " FROM V$SQLText_With_Newlines\n" " WHERE SQL_Text LIKE :f1||'%'", "Get address of an SQL statement"); QString toSQLToAddress(toConnection &conn, const QString &sql) { QString search = toSQLStripSpecifier(sql); toQList vals = toQuery::readQuery(conn, SQLAddress, search.left(CHUNK_SIZE)); for (toQList::iterator i = vals.begin(); i != vals.end(); i++) { if (search == toSQLString(conn, *i)) return *i; } throw qApp->translate("toSQLToAddress", "SQL Query not found in SGA"); } void toStatusMessage(const QString &str, bool save, bool log) { // If there is no main widget yet (e.g. style init error) // display error message in standard dialog. if (toMainWidget()) toMainWidget()->showMessage(str, save, log); else { QMessageBox::warning(0, qApp->translate("toStatusMessage", "TOra Message"), str ); } } QComboBox *toRefreshCreate(QWidget *parent, const char *name, const QString &def, QComboBox *item) { QComboBox *refresh; if (item) refresh = item; else { refresh = new QComboBox(parent); refresh->setObjectName(name); refresh->setEditable(false); } refresh->addItem(qApp->translate("toRefreshCreate", "None")); refresh->addItem(qApp->translate("toRefreshCreate", "2 seconds")); refresh->addItem(qApp->translate("toRefreshCreate", "5 seconds")); refresh->addItem(qApp->translate("toRefreshCreate", "10 seconds")); refresh->addItem(qApp->translate("toRefreshCreate", "30 seconds")); refresh->addItem(qApp->translate("toRefreshCreate", "1 min")); refresh->addItem(qApp->translate("toRefreshCreate", "5 min")); refresh->addItem(qApp->translate("toRefreshCreate", "10 min")); QString str; if (!def.isNull()) str = def; else str = toConfigurationSingle::Instance().refresh(); if (str == "2 seconds") refresh->setCurrentIndex(1); else if (str == "5 seconds") refresh->setCurrentIndex(2); else if (str == "10 seconds") refresh->setCurrentIndex(3); else if (str == "30 seconds") refresh->setCurrentIndex(4); else if (str == "1 min") refresh->setCurrentIndex(5); else if (str == "5 min") refresh->setCurrentIndex(6); else if (str == "10 min") refresh->setCurrentIndex(7); else refresh->setCurrentIndex(0); return refresh; } void toRefreshParse(toTimer *timer, const QString &str) { QString t = str; if (t.isEmpty()) t = toConfigurationSingle::Instance().refresh(); if (t == qApp->translate("toRefreshCreate", "None") || t == "None") timer->stop(); else if (t == qApp->translate("toRefreshCreate", "2 seconds") || t == "2 seconds") timer->start(2*1000); else if (t == qApp->translate("toRefreshCreate", "5 seconds") || t == "5 seconds") timer->start(5*1000); else if (t == qApp->translate("toRefreshCreate", "10 seconds") || t == "10 seconds") timer->start(10*1000); else if (t == qApp->translate("toRefreshCreate", "30 seconds") || t == "30 seconds") timer->start(30*1000); else if (t == qApp->translate("toRefreshCreate", "1 min") || t == "1 min") timer->start(60*1000); else if (t == qApp->translate("toRefreshCreate", "5 min") || t == "5 min") timer->start(300*1000); else if (t == qApp->translate("toRefreshCreate", "10 min") || t == "10 min") timer->start(600*1000); else throw qApp->translate("toRefreshParse", "Unknown timer value"); } QString toDeepCopy(const QString &str) { return QString(str.data(), str.length()); } QStringList toGetSessionTypes(void) { return QStyleFactory::keys(); } QString toGetSessionType(void) { QStyle *style = qApp->style(); QString sname = style->metaObject()->className(); // This is probably really slow, but who cares. QStringList keys = QStyleFactory::keys(); for (int i = 0; i < keys.size(); i++) { QString name = keys[i]; QStyle *t = QStyleFactory::create(name); if (!t) continue; if (sname == t->metaObject()->className()) { delete t; return name; } delete t; } // Weird should never get here. return sname; } void toSetSessionType(const QString &str) { QStyle *style = QStyleFactory::create(str); if (style) qApp->setStyle(style); else toStatusMessage(qApp->translate("toSetSessionType", "Failed to find style %1").arg(str)); } QToolBar *toAllocBar(QWidget *parent, const QString &str) { QString db; try { db = toCurrentConnection(parent).description(false); } catch (...) {} QString name = str; if (!db.isEmpty() && toConfigurationSingle::Instance().dbTitle()) { name += QString::fromLatin1(" "); name += db; } QToolBar *tool; QMainWindow *main = dynamic_cast(parent); if (main) tool = toMainWidget()->addToolBar(name); else tool = new QToolBar(parent); // Enforce smaller toolbars on mac tool->setIconSize(QSize(16, 16)); tool->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed)); tool->setFocusPolicy(Qt::NoFocus); return tool; } TODock *toAllocDock(const QString &name, const QString &db, const QPixmap &pix) { QString str = name; if (!db.isEmpty() && toConfigurationSingle::Instance().dbTitle()) { str += QString::fromLatin1(" "); str += db; } QDockWidget *dock = new QDockWidget(str, toMainWidget()); dock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable); if (!pix.isNull()) dock->setWindowIcon(QIcon(pix)); return dock; } void toAttachDock(TODock *dock, QWidget *container, Qt::DockWidgetArea area) { QDockWidget *d = dynamic_cast(dock); if (d) { toMainWidget()->addDockWidget(area, d); d->setWidget(container); container->show(); } } QString toFontToString(const QFont &fnt) { return fnt.toString(); } QFont toStringToFont(const QString &str) { if (str.isEmpty()) return QFont(QString::fromLatin1("Courier New"), 12); QFont fnt; if (fnt.fromString(str)) return fnt; return QFont(QString::fromLatin1("Courier New"), 12); } int toSizeDecode(const QString &str) { if (str == QString::fromLatin1("KB")) return 1024; if (str == QString::fromLatin1("MB")) return 1024*1024; return 1; } // QString toPluginPath(void) // { // QString str; // // #ifdef Q_OS_WIN32 // // CRegistry registry; // DWORD siz = 1024; // char buffer[1024]; // // try // { // if (registry.GetStringValue(HKEY_LOCAL_MACHINE, // "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\TOra", // "UninstallString", // buffer, siz)) // { // if (siz > 0) // { // str = buffer; // static QRegExp findQuotes("\"([^\"]*)\""); // if (findQuotes.indexIn(str) >= 0) // str = findQuotes.cap(1); // int ind = str.lastIndexOf('\\'); // if (ind >= 0) // str = str.mid(0, ind); // str += "\\templates"; // } // } // } // catch (...) // {} // // #elif defined( Q_OS_MACX ) // { // // MacOS // char resourcePath[MAXPATHLEN]; // memset( &resourcePath[0], 0, MAXPATHLEN ); // CFBundleRef appBundle = ::CFBundleGetMainBundle(); // if ( appBundle ) // { // CFURLRef urlRef = CFBundleCopyResourcesDirectoryURL( appBundle ); // if ( urlRef ) // { // UInt8* _p = (UInt8*) & resourcePath[0]; // bool isOK = CFURLGetFileSystemRepresentation( // urlRef, TRUE, _p, MAXPATHLEN ); // if ( !isOK ) // { // // QMessageBox::warning( 0, "File error", // // QString( "Unexpected: no file system representation") ); // } // } // else // { // // QMessageBox::warning( 0, "File error", // // QString( "Unexpected: unable to get resource directory") ); // } // CFRelease( urlRef ); // str = &resourcePath[0]; // } // else // { // // QMessageBox::warning( 0, "File error", // // QString( "Unexpected: unable to get main bundle") ); // } // } // MacOS // // #else // str = toConfigurationSingle::Instance().pluginDir(); // #endif // // return str; // } // QString toHelpPath(void) // { // QString str = toConfigurationSingle::Instance().helpPath(); // if (str.isEmpty()) // { // str = toPluginPath(); // str += QString::fromLatin1("/help/toc.html"); // } // return str; // } QByteArray toReadFileB(const QString &filename) { QString expanded = toExpandFile(filename); // for some reason qrc:/ urls fail with QFile but are required for // QTextBrowser if (expanded.startsWith("qrc")) expanded = expanded.right(expanded.length() - 3); QFile file(expanded); if (!file.open(QIODevice::ReadOnly)) throw QT_TRANSLATE_NOOP("toReadFile", "Couldn't open file %1.").arg(expanded); return file.readAll(); } QString toReadFile(const QString &filename) { QTextCodec *codec = QTextCodec::codecForLocale(); return codec->toUnicode(toReadFileB(filename)); } QString toExpandFile(const QString &file) { QString ret(file); QString home; #ifdef Q_OS_WIN32 CRegistry registry; DWORD siz = 1024; char buffer[1024]; try { if (registry.GetStringValue(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", "Personal", buffer, siz)) { if (siz > 0) home = buffer; } } catch (...) {} #else home = QDir::homePath(); #endif ret.replace(QRegExp(QString::fromLatin1("\\$HOME")), home); return ret; } // saves a QByteArray (binary data) to filename bool toWriteFile(const QString &filename, const QByteArray &data) { QString expanded = toExpandFile(filename); QFile file(expanded); if (!file.open(QIODevice::WriteOnly)) { TOMessageBox::warning( toMainWidget(), QT_TRANSLATE_NOOP("toWriteFile", "File error"), QT_TRANSLATE_NOOP( "toWriteFile", QString("Couldn't open %1 for writing").arg(filename).toAscii().constData())); return false; } file.write(data); if (file.error() != QFile::NoError) { TOMessageBox::warning( toMainWidget(), QT_TRANSLATE_NOOP("toWriteFile", "File error"), QT_TRANSLATE_NOOP("toWriteFile", "Couldn't write data to file")); return false; } toStatusMessage(QT_TRANSLATE_NOOP("toWriteFile", "File saved successfully"), false, false); return true; } // saves a QString to filename, // encoded according to the current locale settings bool toWriteFile(const QString &filename, const QString &data) { return toWriteFile(filename, data.toLocal8Bit()); } bool toCompareLists(QStringList &lsta, QStringList &lstb, int len) { if (lsta.count() < len || lstb.count() < len) return false; for (int i = 0; i < len; i++) if (lsta[i] != lstb[i]) return false; return true; } QString GetExtensions(void) { static QRegExp repl(QString::fromLatin1("\\s*,\\s*")); QString t(toConfigurationSingle::Instance().extensions()); t.replace(repl, QString::fromLatin1(";;")); // multiple filters are separated by double semicolons return t; } QPixmap connectionColorPixmap(const QString & name) { QPixmap pm; if (name.isNull() || name.isEmpty()) return pm; if (!QPixmapCache::find(name, pm)) { // draw a "cool 3d" bullet here pm = QPixmap(16, 16); pm.fill(Qt::transparent); QColor col(name); QPainter painter(&pm); painter.setRenderHints(QPainter::HighQualityAntialiasing); QRadialGradient brush(16/2, 16/2, 16*1.5, 16/2, 16/4); brush.setColorAt(0, col.lighter()); brush.setColorAt(0.2, col); brush.setColorAt(0.6, col.darker()); brush.setColorAt(1, Qt::black); painter.setBrush(brush); QPen pen(Qt::black); pen.setWidth(1.5); pen.setCosmetic(true); painter.setPen(pen); painter.drawEllipse(1, 1, 14, 14); painter.end(); QPixmapCache::insert(name, pm); } return pm; } static QString AddExt(QString t, const QString &filter) { static QRegExp hasext(QString::fromLatin1("\\.[^\\/]*$")); if (t.isEmpty()) return t; toConfigurationSingle::Instance().setLastDir(t); if (hasext.indexIn(t) < 0) { static QRegExp findext(QString::fromLatin1("\\.[^ \t\r\n\\)\\|]*")); int len = 0; int pos = findext.indexIn(filter, 0); len = findext.matchedLength(); if (pos >= 0) t += filter.mid(pos, len); else { QFile file(t); if (!file.exists()) t += QString::fromLatin1(".sql"); } } return t; } QString toOpenFilename(const QString &filename, const QString &filter, QWidget *parent) { QString t = filter; if (t.isEmpty()) t = GetExtensions(); QString dir = filename; if (dir.isNull()) dir = toConfigurationSingle::Instance().lastDir(); return AddExt(TOFileDialog::getOpenFileName(parent, QObject::tr("Open File", "utils/toOpenFilename"), dir, t), t); } QString toSaveFilename(const QString &filename, const QString &filter, QWidget *parent) { QString t = filter; if (t.isEmpty()) t = GetExtensions(); QString dir = filename; if (dir.isNull()) dir = toConfigurationSingle::Instance().lastDir(); return AddExt(TOFileDialog::getSaveFileName(parent, QObject::tr("Save File", "utils/toSaveFilename"), dir, t), t); } void toSetEnv(const QString &var, const QString &val) { #if HAVE_SETENV && !defined(Q_OS_WIN32) setenv(var.toAscii().constData(), val.toAscii().constData(), 1); #else // Has a memory leak, but just a minor one. char *env = new char[var.length() + val.length() + 2]; strcpy(env, var.toUtf8()); strcat(env, "="); strcat(env, val.toUtf8()); putenv(env); #endif } void toUnSetEnv(const QString &var) { #if HAVE_SETENV && !defined(Q_OS_WIN32) unsetenv(var.toAscii().constData()); #else toSetEnv(var.toAscii().constData(), ""); #endif } #define COLORS 2 #define TYPES 7 #define STYLES 5 QBrush toChartBrush(int index) { index %= (COLORS * TYPES * STYLES); index = COLORS * TYPES * STYLES - 1 - index; int type = index % TYPES; int color = (index / TYPES) % COLORS; int style = (index / TYPES / COLORS); int r = 0, g = 0, b = 0; int offset = 1; switch (type) { case 6: r = 1; break; case 5: g = 1; break; case 4: b = 1; break; case 3: r = g = 1; break; case 2: r = b = 1; break; case 1: b = g = 1; break; case 0: r = b = g = 1; offset = 0; break; } Qt::BrushStyle rets; switch (style) { default: rets = Qt::SolidPattern; break; case 3: rets = Qt::BDiagPattern; break; case 2: rets = Qt::FDiagPattern; break; case 1: rets = Qt::DiagCrossPattern; break; case 0: rets = Qt::CrossPattern; break; } color += offset; QBrush brush(QColor(TO_MIN(255, r*color*256 / (COLORS)), TO_MIN(255, g*color*256 / (COLORS)), TO_MIN(255, b*color*256 / (COLORS))), rets); return brush; } toToolWidget *toCurrentTool(QObject *cur) { while (cur) { toToolWidget *tool = dynamic_cast(cur); if (tool) return tool; cur = cur->parent(); } throw qApp->translate("toCurrentTool", "Couldn't find parent tool. Internal error."); } toConnection &toCurrentConnection(QObject *cur) { while (cur) { toConnectionWidget *conn = dynamic_cast(cur); if (conn) return conn->connection(); cur = cur->parent(); } throw qApp->translate("toCurrentConnection", "Couldn't find parent connection. Internal error."); } toBusy::toBusy(bool busy) { Busy = busy; if (busy) QMetaObject::invokeMethod(toMainWidget(), "showBusy", Qt::QueuedConnection); } toBusy::~toBusy() { if (Busy) QMetaObject::invokeMethod(toMainWidget(), "removeBusy", Qt::QueuedConnection); } void toReadableColumn(QString &name) { bool inWord = false; for (int i = 0; i < name.length(); i++) { if (name.at(i) == '_') { name[i] = ' '; inWord = false; } else if (name.at(i).isSpace()) { inWord = false; } else if (name.at(i).isLetter()) { if (inWord) name[i] = name.at(i).toLower(); else name[i] = name.at(i).toUpper(); inWord = true; } } } bool toIsOracle(const toConnection &conn) { return conn.provider() == "Oracle"; } bool toIsSapDB(const toConnection &conn) { return conn.provider() == "SapDB"; } bool toIsMySQL(const toConnection &conn) { return conn.provider() == "MySQL"; } bool toIsPostgreSQL(const toConnection &conn) { return conn.provider() == "PostgreSQL"; } bool toIsTeradata(const toConnection &conn) { return conn.provider() == "Teradata"; } static toTreeWidgetItem *FindItem(toTreeWidget *lst, toTreeWidgetItem *first, const QString &str) { while (first) { QString tmp = first->text(0); if (tmp == str) return first; else { tmp += QString::fromLatin1(":"); if (str.startsWith(tmp)) { toTreeWidgetItem *ret = FindItem(lst, first->firstChild(), str.mid(tmp.length())); if (ret) return ret; } } first = first->nextSibling(); } return NULL; } toTreeWidgetItem *toFindItem(toTreeWidget *lst, const QString &str) { return FindItem(lst, lst->firstChild(), str); } void toToolCaption(toToolWidget *widget, const QString &caption) { QString title; if (toConfigurationSingle::Instance().dbTitle()) { try { title = widget->connection().description(); title += QString::fromLatin1(" "); } catch (...) {} } title += caption; widget->setWindowTitle(title); toMainWidget()->updateWindowsMenu(); } void toMapExport(std::map &data, const QString &prefix, std::map &src) { std::map::iterator i = src.begin(); if (i != src.end()) { data[prefix + ":First"] = QString((*i).first); QString key = prefix + ":d:"; do { data[key + (*i).first] = (*i).second; i++; } while (i != src.end()); } } void toMapImport(std::map &data, const QString &prefix, std::map &dst) { dst.clear(); std::map::iterator i = data.find(prefix + ":First"); if (i != data.end()) { QString key = prefix + ":d:"; i = data.find(key + (*i).second.toLatin1()); while (i != data.end() && (*i).first.mid(0, key.length()) == key) { QString t = (*i).first.mid(key.length()); if (t.isNull()) t = ""; dst[t] = (*i).second; i++; } } } bool toCheckModal(QWidget *widget) { QWidget *parent = QApplication::activeModalWidget(); if (!parent) return true; while (widget && widget != parent) widget = widget->parentWidget(); if (widget == parent) return true; return false; } // static bool IndicateEmpty = false; // // void toUpdateIndicateEmpty(void) // { // IndicateEmpty = toConfigurationSingle::Instance().indicateEmpty(); // } toQValue toNull(const toQValue &str) { if (!toConfigurationSingle::Instance().indicateEmpty()) { if (str.isNull()) return str; if (str.toString().length() == 0) return QString::fromLatin1("''"); } else if (str.isNull()) return QString::fromLatin1("{null}"); return str; } toQValue toUnnull(const toQValue &str) { if (!toConfigurationSingle::Instance().indicateEmpty()) { if (QString(str) == QString::fromLatin1("''")) return QString::fromLatin1(""); } else if (QString(str) == QString::fromLatin1("{null}")) return QString(); return str; } QString toTranslateMayby(const QString &ctx, const QString &text) { if (ctx.contains(QString::fromLatin1(" ")) || ctx.toLatin1() != ctx.toUtf8() || text.toLatin1() != text.toUtf8() || ctx.isEmpty() || text.isEmpty()) return text; return QT_TRANSLATE_NOOP(ctx.toLatin1(), text.toLatin1()); } toPopupButton::toPopupButton(const QIcon &iconSet, const QString &textLabel, const QString &grouptext, QToolBar *parent, const char *name) : QToolButton(parent) { setObjectName(name); setIcon(iconSet); setText(textLabel); setToolTip(grouptext); } toPopupButton::toPopupButton(QWidget *parent, const char *name) : QToolButton(parent) { setObjectName(name); } QString toObfuscate(const QString &str) { if (str.isEmpty()) return str; QByteArray arr = qCompress(str.toUtf8()); QString ret = "\002"; char buf[100]; // Just to be on the safe side for (int i = 0; i < arr.size(); i++) { sprintf(buf, "%02x", ((unsigned int)arr.at(i)) % 0xff); ret += buf; } return ret; } QString toUnobfuscate(const QString &str) { if (str.isEmpty()) return str; if (str.at(0) != '\001' && str.at(0) != '\002') return str; QByteArray arr; for (int i = 1; i < str.length(); i += 2) // qt4 arr.at(i / 2) = str.mid(i, 2).toInt(0, 16); arr[i / 2] = str.mid(i, 2).toInt(0, 16); if (str.at(0) == '\002') { QByteArray ret = qUncompress(arr); return QString::fromUtf8(ret); } else return QString::fromUtf8(arr); } QKeySequence toKeySequence(const QString &key) { QKeySequence ret = key; if (key.isEmpty() && ret.isEmpty()) printf("Key sequence %s is not valid\n", key.toAscii().constData()); return ret; } bool toCheckKeyEvent(QKeyEvent *event, const QKeySequence &key) { int state = 0; if (key.count() != 1) return false; int val = key[0]; if ((val&Qt::META) == Qt::META) state |= Qt::META; if ((val&Qt::SHIFT) == Qt::SHIFT) state |= Qt::SHIFT; if ((val&Qt::CTRL) == Qt::CTRL) state |= Qt::CTRL; if ((val&Qt::ALT) == Qt::ALT) state |= Qt::ALT; val &= 0xfffff; return (event->modifiers() == Qt::NoModifier && event->key() == val); } int countChars(const QString &source, const char find) { int found = 0; for (int i = 0; i < source.length(); i++) { if (source[i] == find) found++; } return found; } toSpacer::toSpacer(QWidget *parent) : QWidget(parent) { setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum)); } tora-2.1.3/src/tologger.h0000644000175000017500000000732311445353612015043 0ustar michaelmichael#ifndef __TORA_LOGGER__ #define __TORA_LOGGER__ #ifdef DEBUG #define USE_QT_THREAD_MANAGER #include "ts_log/critical_section.h" #include "ts_log/message_handler_log.h" #include "ts_log/thread_safe_log.h" #include "ts_log/ts_log_utils.h" #include "ts_log/decorator.h" #include #include #include #include using namespace boost; using namespace boost::iostreams; #define TLOG(lognumber, decorator, where) get_log(lognumber).ts( where) typedef Tdecorator< TSLOG_TYPELIST_6(dashDecorator<4>, tidDecorator, charDecorator<' '>, hereDecorator, dashDecorator<4>, charDecorator<'\n'> )> toDecorator; struct s_null_sink : public boost::iostreams::stream_buffer { s_null_sink() { open(boost::iostreams::null_sink() ); } }; template< int idxLog> inline thread_safe_log templ_get_log_ownthread( int_to_type< idxLog> *i = NULL ) { /* static std::ofstream out( get_out_name< idxLog>( false).c_str() ); */ #ifdef DEBUG static internal_thread_safe_log_ownthread log( std::cout ); #else static s_null_sink nsink; static std::ostream out(&nsink); static internal_thread_safe_log_ownthread log( out ); #endif return thread_safe_log( log); } // tonoblockquery<3> - debugging(disabled) template<> inline thread_safe_log templ_get_log_ownthread(int_to_type<3>*) { static s_null_sink nsink; static std::ostream out(&nsink); static internal_thread_safe_log_ownthread log( out ); return thread_safe_log( log); } // tonoblockquery<4> - data read(disabled) template<> inline thread_safe_log templ_get_log_ownthread(int_to_type<4>*) { static s_null_sink nsink; static std::ostream out(&nsink); static internal_thread_safe_log_ownthread log( out ); return thread_safe_log( log); } /* thread_safe_log templ_get_log_ownthread<1>( int_to_type< 1> * = NULL ) { static std::ofstream out( get_out_name< idxLog>( false).c_str() ); static internal_thread_safe_log_ownthread log( out); return thread_safe_log( log); } */ inline thread_safe_log get_log( int idxLog) { switch( idxLog) { case 0: return templ_get_log_ownthread< 0>(); // tooracleconnection log case 1: return templ_get_log_ownthread< 1>(); // exception log case 2: return templ_get_log_ownthread< 2>(); // qDebug log case 3: return templ_get_log_ownthread< 3>(NULL); // tonoblockquery log case 4: return templ_get_log_ownthread< 4>(NULL); // data read log default: assert( false); return templ_get_log_ownthread< 0>(); } } #else // no DEBUGing at all #include "ts_log/ts_log_utils.h" #include "ts_log/decorator.h" #include class NullLogger; template inline NullLogger& operator<<( NullLogger& stream, const C &str); //template //inline NullLogger& operator<<( NullLogger& stream, const C str); class NullLogger : public NullType { public: inline NullLogger& operator<<(std::ostream& (*f)(std::ostream&)) { return *this; } template friend NullLogger& operator<<(NullLogger& stream, const C &str); // template friend NullLogger& operator<<(NullLogger& stream, const C str); }; template inline NullLogger& operator<<( NullLogger& stream, const C &str) { return stream; }; //template //inline NullLogger& operator<<( NullLogger& stream, const C str) //{ // return stream; //}; inline NullLogger& get_null_log() { static NullLogger null; return null; } #define TLOG(lognumber, decorator, where) get_null_log() #endif // TODO add some comment on this MSVC inline std::ostream& operator<<( std::ostream & stream, const QString & str) { // TODO review this QByteArray b( str.toAscii()); const char *c = b.constData(); stream << c; return stream; } #endif tora-2.1.3/src/toresultplan.h0000644000175000017500000000653511270353625015761 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTPLAN_H #define TORESULTPLAN_H #include "config.h" #include "tobackground.h" #include "tosqlparse.h" #include "toresultview.h" #include #include class toNoBlockQuery; /** This widget displays the execution plan of a statement. The statement * is identified by the first parameter which should be the address as gotten * from the @ref toSQLToAddress function. */ class toResultPlan : public toResultView { Q_OBJECT QString Ident; std::map Parents; std::map Last; std::list Statements; toTreeWidgetItem *TopItem; toTreeWidgetItem *LastTop; bool Reading; toNoBlockQuery *Query; toBackground Poll; QString User; void checkException(const QString &); void oracleSetup(void); void oracleNext(void); void addStatements(std::list &stats); public: /** Create the widget. * @param parent Parent widget. * @param name Name of widget. */ toResultPlan(QWidget *parent, const char *name = NULL); /** Destruct object */ ~toResultPlan(); /** Reimplemented for internal reasons. If you prepend "SAVED:" a saved plan is read * with the identified_by set to the string following the initial "SAVED:" string. */ virtual void query(const QString &sql, const toQList ¶m); /** Reimplemented for internal reasons. */ void query(const QString &sql) { toQList p; query(sql, p); } /** Support Oracle */ virtual bool canHandle(toConnection &conn); private slots: void poll(); }; #endif tora-2.1.3/src/toresultview.h0000644000175000017500000007175611270353625016010 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TORESULTVIEW_H #define TORESULTVIEW_H #include "config.h" #include "toeditwidget.h" #include "toresult.h" #include "totreewidget.h" #include #include #include #include #include #include #include class toTreeWidgetItem; class TOPrinter; class toListTip; class toQuery; class toResultCols; class toResultView; class toSQL; class toSearchReplace; class toExportSettings; /** Baseclass for filters to apply to the @ref toResultView to filter * out rows that you don't want to add as items to the list. */ class toResultFilter { public: toResultFilter() { } virtual ~toResultFilter() { } virtual void startingQuery(void) { } /** This function can inspect the item to be added and decide if it is * valid for adding or not. * @param item Item to inspect. * @return If false is returned the item isn't added. */ virtual bool check(const toTreeWidgetItem *item) = 0; /** Create a copy of this filter. * @return A newly created copy of this filter. */ virtual toResultFilter *clone(void) = 0; /** Export data to a map. * @param data A map that can be used to recreate the data of a chart. * @param prefix Prefix to add to the map. */ virtual void exportData(std::map &data, const QString &prefix); /** Import data * @param data Data to read from a map. * @param prefix Prefix to read data from. */ virtual void importData(std::map &data, const QString &prefix); }; /** An item to display in a toListView or toResultView. They differ * from normal QListViewItems in that they can have a tooltip and * actually contain more text than is displayed in the cell of the * listview. */ class toResultViewItem : public toTreeWidgetItem { struct keyData { QString Data; QString KeyAsc; QString KeyDesc; int Width; enum { String, Number } Type; }; int ColumnCount; keyData *ColumnData; QString firstText(int col) const; protected: virtual int realWidth(const QFontMetrics &fm, const toTreeWidget *top, int column, const QString &txt) const; public: /** Create a new item. * @param parent Parent list view. * @param after Insert after this item. * @param buffer String to set as first column */ toResultViewItem(toTreeWidget *parent, toTreeWidgetItem *after, const QString &buf = QString::null) : toTreeWidgetItem(parent, after, QString::null) { ColumnData = NULL; ColumnCount = 0; if (!buf.isNull()) setText(0, buf); } /** Create a new item. * @param parent Parent to this item. * @param after Insert after this item. * @param buffer String to set as first column */ toResultViewItem(toTreeWidgetItem *parent, toTreeWidgetItem *after, const QString &buf = QString::null) : toTreeWidgetItem(parent, after, QString::null) { ColumnData = NULL; ColumnCount = 0; if (!buf.isNull()) setText(0, buf); } /** Reimplemented for internal reasons. */ virtual ~toResultViewItem() { delete[] ColumnData; } /** Reimplemented for internal reasons. */ virtual void setText(int col, const QString &txt); /** Set from database. */ virtual void setText(int col, const toQValue &val); /** Reimplemented for internal reasons. */ virtual void paintCell(QPainter * p, const QColorGroup & cg, int column, int width, int align); /** Reimplemented for internal reasons. */ virtual QString text(int col) const; /** String to sort the data on. This is reimplemented so that * numbers are sorted as numbers and not as strings. * @param col Column * @param asc Wether to sort ascending or not. */ virtual QString key(int col, bool asc) const { if (col >= ColumnCount) return QString::null; return asc ? ColumnData[col].KeyAsc : ColumnData[col].KeyDesc; } /** Reimplemented for internal reasons. */ virtual int width(const QFontMetrics &, const toTreeWidget *, int col) const { if (col >= ColumnCount) return 0; return ColumnData[col].Width; } /** Get all text for this item. This is used for copying, drag & * drop and memo editing etc. * @param col Column. * @return All of the text. */ virtual QString allText(int col) const { return toTreeWidgetItem::text(col); } /** Get the text to be displayed as tooltip for this item. * @param col Column. * @return The text to display as tooltip. */ virtual QString tooltip(int col) const { return allText(col); } }; /** This item expands the height to commodate all lines in the input * buffer. */ class toResultViewMLine : public toResultViewItem { private: /** Number of lines in the largest row. */ int Lines; protected: virtual int realWidth(const QFontMetrics &fm, const toTreeWidget *top, int column, const QString &txt) const; public: /** Create a new item. * @param parent Parent list view. * @param after Insert after this item. * @param buffer String to set as first column */ toResultViewMLine(toTreeWidget *parent, toTreeWidgetItem *after, const QString &buf = QString::null) : toResultViewItem(parent, after, QString::null) { Lines = 1; if (!buf.isNull()) setText(0, buf); } /** Create a new item. * @param parent Parent to this item. * @param after Insert after this item. * @param buffer String to set as first column */ toResultViewMLine(toTreeWidgetItem *parent, toTreeWidgetItem *after, const QString &buf = QString::null) : toResultViewItem(parent, after, QString::null) { Lines = 1; if (!buf.isNull()) setText(0, buf); } /** Reimplemented for internal reasons. */ virtual void setText(int, const QString &); /** Set from database. */ virtual void setText(int col, const toQValue &val); /** Reimplemented for internal reasons. */ virtual void setup(void); /** Reimplemented for internal reasons. */ virtual QString text(int col) const { return toResultViewItem::allText(col); } /** Reimplemented for internal reasons. */ virtual void paintCell(QPainter *pnt, const QColorGroup & cg, int column, int width, int alignment); }; /** An item to display in a toListView or toResultView. They differ * from normal QListViewItems in that they can have a tooltip and * actually contain more text than is displayed in the cell of the * listview. */ class toResultViewCheck : public toTreeWidgetCheck { struct keyData { QString Data; QString KeyAsc; QString KeyDesc; int Width; enum { String, Number } Type; }; int ColumnCount; keyData *ColumnData; protected: virtual int realWidth(const QFontMetrics &fm, const toTreeWidget *top, int column, const QString &txt) const; QString firstText(int col) const; public: /** Create a new item. * @param parent Parent list view. * @param text Text of first column. * @param type Type of check on this item. */ toResultViewCheck(toTreeWidget *parent, const QString &text, toTreeWidgetCheck::Type type = Controller) : toTreeWidgetCheck(parent, QString::null, type) { ColumnData = NULL; ColumnCount = 0; if (!text.isNull()) setText(0, text); } /** Create a new item. * @param parent Parent item. * @param text Text of first column. * @param type Type of check on this item. */ toResultViewCheck(toTreeWidgetItem *parent, const QString &text, toTreeWidgetCheck::Type type = Controller) : toTreeWidgetCheck(parent, QString::null, type) { ColumnData = NULL; ColumnCount = 0; if (!text.isNull()) setText(0, text); } /** Create a new item. * @param parent Parent list view. * @param after After last item. * @param text Text of first column. * @param type Type of check on this item. */ toResultViewCheck(toTreeWidget *parent, toTreeWidgetItem *after, const QString &text, toTreeWidgetCheck::Type type = Controller); /** Create a new item. * @param parent Parent item. * @param after After last item. * @param text Text of first column. * @param type Type of check on this item. */ toResultViewCheck(toTreeWidgetItem *parent, toTreeWidgetItem *after, const QString &text, toTreeWidgetCheck::Type type = Controller); /** Reimplemented for internal reasons. */ virtual ~toResultViewCheck() { delete[] ColumnData; } /** Reimplemented for internal reasons. */ virtual void setText(int col, const QString &txt); /** Set from database. */ virtual void setText(int col, const toQValue &val); /** Reimplemented for internal reasons. */ virtual void paintCell(QPainter * p, const QColorGroup & cg, int column, int width, int align); /** Reimplemented for internal reasons. */ virtual QString text(int col) const; /** String to sort the data on. This is reimplemented so that * numbers are sorted as numbers and not as strings. * @param col Column * @param asc Wether to sort ascending or not. */ /** String to sort the data on. This is reimplemented so that * numbers are sorted as numbers and not as strings. * @param col Column * @param asc Wether to sort ascending or not. */ virtual QString key(int col, bool asc) const { if (col >= ColumnCount) return QString::null; return asc ? ColumnData[col].KeyAsc : ColumnData[col].KeyDesc; } /** Reimplemented for internal reasons. */ virtual int width(const QFontMetrics &, const toTreeWidget *, int col) const { if (col >= ColumnCount) return 0; return ColumnData[col].Width; } /** Get all text for this item. This is used for copying, drag & * drop and memo editing etc. * @param col Column. * @return All of the text. */ virtual QString allText(int col) const { return text(col); } /** Get the text to be displayed as tooltip for this item. * @param col Column. * @return The text to display as tooltip. */ virtual QString tooltip(int col) const { return allText(col); } }; /** This item expands the height to commodate all lines in the input buffer. */ class toResultViewMLCheck : public toResultViewCheck { private: /** Number of lines in the largest row. */ int Lines; protected: virtual int realWidth(const QFontMetrics &fm, const toTreeWidget *top, int column, const QString &txt) const; public: /** Create a new item. * @param parent Parent list view. * @param text Text of first column. * @param type Type of check on this item. */ toResultViewMLCheck(toTreeWidget *parent, const QString &text, toTreeWidgetCheck::Type type = Controller) : toResultViewCheck(parent, QString::null, type) { Lines = 1; if (!text.isNull()) setText(0, text); } /** Create a new item. * @param parent Parent item. * @param text Text of first column. * @param type Type of check on this item. */ toResultViewMLCheck(toTreeWidgetItem *parent, const QString &text, toTreeWidgetCheck::Type type = Controller) : toResultViewCheck(parent, QString::null, type) { Lines = 1; if (!text.isNull()) setText(0, text); } /** Reimplemented for internal reasons. */ virtual void setup(void); /** Reimplemented for internal reasons. */ virtual void setText(int, const QString &); /** Set from database. */ virtual void setText(int col, const toQValue &val); /** Reimplemented for internal reasons. */ virtual QString text(int col) const { // ladies and gentlemen, welcome to the Infinite Recursion. // And now... KABOOM! // return toResultViewCheck::allText(col); return toResultViewCheck::text(col); } /** Reimplemented for internal reasons. */ virtual void paintCell(QPainter *pnt, const QColorGroup & cg, int column, int width, int alignment); }; /** * The TOra implementation of a listview which offers a few extra * goodies to the baseclass. First of all tooltip which can display * contents that doesn't fit in the list, printing, integration into * toMain with Edit menu etc, drag & drop, export as file, display * item as memo and context menu. */ class toListView : public toTreeWidget, public toEditWidget { Q_OBJECT; /** * Name of this list, used primarily when printing. Also used to * be able to edit * * SQL displayed in @ref toResultView. */ QString Name; /** Used to display tip on fields. */ toListTip *AllTip; /** Item selected when popup menu displayed. */ toTreeWidgetItem *MenuItem; /** Column of item selected when popup menu displayed. */ int MenuColumn; /** Last move, used to determine if drag has started. */ QPoint LastMove; /** Reimplemented for internal reasons. */ virtual void contentsMouseDoubleClickEvent(QMouseEvent *e); /** Reimplemented for internal reasons. */ virtual void contentsMousePressEvent(QMouseEvent *e); /** Reimplemented for internal reasons. */ virtual void contentsMouseReleaseEvent(QMouseEvent *e); /** Reimplemented for internal reasons. */ virtual void contentsMouseMoveEvent(QMouseEvent *e); #if 0 /** Used to print one page of the list. * @param printer Printer to print to. * @param painter Painter to print page to. * @param top Item at top of page. * @param column Column to start printing at. Will be changed to where you are when done. * @param level The indentation level of the top item. * @param pageNo Page number. * @param paint If just testing to determine how many pages are needed set this to false. * @return The next item to print to (Pass as top to this function). */ virtual toTreeWidgetItem *printPage( TOPrinter *printer, QPainter *painter, toTreeWidgetItem *top, int &column, int &level, int pageNo, bool paint = true); #endif QString owner; QString objectName; protected: /** * context menu items. may be null. * */ QMenu *Menu; QAction *displayAct; QAction *leftAct; QAction *rightAct; QAction *centerAct; QAction *copyAct; QAction *copyFormatAct; QAction *copyTransAct; QAction *selectAllAct; QAction *exportAct; QAction *editAct; public: /** Create new list view. * @param parent Parent of list. * @param name Name of list. * @param f Widget flags. */ toListView(QWidget *parent, const char *name = NULL, Qt::WFlags f = 0); virtual ~toListView(); /** Get SQL name of list. */ virtual QString sqlName(void) { return Name; } /** Set SQL name of list. */ virtual void setSQLName(const QString &name) { Name = name; } /** Set owner * introduced to get type information for fields */ virtual void setOwner(QString const & tOwner) { owner = tOwner; } /** Set object name * introduced to get type information for fields */ virtual void setObjectName(QString const & tObjectName) { objectName = tObjectName; } /** Get owner * introduced to get type information for fields */ virtual QString getOwner() { return owner; } /** Get object name * introduced to get type information for fields */ virtual QString getObjectName() { return objectName; } /** Get the whole text for the item and column selected when menu * was poped up. */ QString menuText(void); /** Print this list */ virtual void editPrint(void); /** Reimplemented for internal reasons. */ virtual void focusInEvent(QFocusEvent *e); /** The string to be displayed in the middle of the footer when printing. * @return String to be placed in middle. */ virtual QString middleString() { return QString::null; } /** Adds option to add menues to the popup menu before it is displayed. * @param menu Menu to add entries to. */ virtual void addMenues(QMenu *menu); /** Export list as a string. */ virtual QString exportAsText(toExportSettings settings); /** Export list as file. */ virtual bool editSave(bool ask); /** Select all contents. */ virtual void editSelectAll(void) { selectAll(true); } /** Search for next entry * @return True if found, should select the found text. */ virtual bool searchNext(const QString & text); virtual bool searchPrevious(const QString & text); virtual void searchReplace(const QString & text) {}; virtual void searchReplaceAll(const QString & text) {}; virtual bool searchCanReplace(bool all) { return false; }; /** Export data to a map. * @param data A map that can be used to recreate the data of a chart. * @param prefix Prefix to add to the map. */ virtual void exportData(std::map &data, const QString &prefix); /** Import data * @param data Data to read from a map. * @param prefix Prefix to read data from. */ virtual void importData(std::map &data, const QString &prefix); /** Create transposed copy of list * @return Pointer to newly allocated transposed listview. */ virtual toListView *copyTransposed(void); signals: /** Called before the menu is displayed so that you can add items * to it before it is shown. * * @param menu Pointer to the menu about to be shown. */ void displayMenu(QMenu *menu); public slots: /** set the popup menu --> see displayMenu() * @param item Item to display. */ virtual void setDisplayMenu(QMenu *item); /** Display the menu at the given point and column. * @param item Item to display. * @param pnt Point to display menu at. * @param col Column to display menu for. */ virtual void displayMenu(const QPoint &); /** Display memo of selected menu column */ virtual void displayMemo(void); protected slots: /** Callback when menu is selected. If you override this make sure you * call the parents function when you have parsed your entries. * @param id ID of the menu item selected. */ virtual void menuCallback(QAction *); }; /** * This class defines a list which displays the result of a query. * * One special thing to know about this class is that columns at the * end in which the description start with a '-' characters are not * displayed. */ class toResultView : public toListView, public toResult { Q_OBJECT; int SortColumn; bool SortAscending; bool SortConnected; /** Reimplemented for internal reasons. */ virtual void keyPressEvent(QKeyEvent * e); protected: /** * Context Menu action to read all records * */ QAction *ReadAllAct; /** Connection to execute statement on. */ toQuery *Query; /** Last added item. */ toTreeWidgetItem *LastItem; /** Number of rows in list. */ int RowNumber; /** If column names are to be made more readable. */ bool ReadableColumns; /** Wether to display first number column or not. */ bool NumberColumn; /** If all the available data should be read at once. */ bool ReadAll; /** Input filter if any. */ toResultFilter *Filter; /** Setup the list. * @param readable Wether to display first number column or not. * @param dispCol Wether to display first number column or not. */ void setup(bool readable, bool dispCol); /** Check if end of query is detected yet or not. */ virtual bool eof(void); public: /** Create list. * @param readable Indicate if columns are to be made more * readable. This means that the descriptions are capitalised and * '_' are converted to ' '. * @param numCol If number column is to be displayed. * @param parent Parent of list. * @param name Name of widget. * @param f Widget flags. */ toResultView(bool readable, bool numCol, QWidget *parent, const char *name = NULL, Qt::WFlags f = 0); /** Create list. The columns are not readable and the number * column is displayed. * @param parent Parent of list. * @param name Name of widget. * @param f Widget flags. */ toResultView(QWidget *parent, const char *name = NULL, Qt::WFlags f = 0); ~toResultView(); /** Set the read all flag. * @param all New value of flag. */ void setReadAll(bool all) { ReadAll = all; } /** Get read all flag * @return Value of read all flag. */ virtual void editReadAll(void); /** Get the number of columns in query. * @return Columns in query. */ int queryColumns() const; /** Get the query used to execute this. */ toQuery *query() { return Query; } /** Set a filter to this list. * @param filter The new filter or NULL if no filter is to be used. */ void setFilter(toResultFilter *filter) { Filter = filter; } /** Get the current filter. * @return Current filter or NULL if no filter. */ toResultFilter *filter(void) { return Filter; } /** Get number column flag. * @return Wether or not the numbercolumn is displayed. */ bool numberColumn() const { return NumberColumn; } /** Set number column flag. Don't change this while a query is * running. Observe that not all descendants of this class support * changing this on the fly. The base * class and @ref toResultTableView does though. * @param val New value of number column. */ void setNumberColumn(bool val) { NumberColumn = val; } /** Get readable column flag. * @return Wether or not the readable column names. */ bool readableColumn() const { return ReadableColumns; } /** Set readable column flag. */ void setReadableColumns(bool val) { ReadableColumns = val; } /** Create a new item in this list. Can be used if a special kind * of item is wanted in the list. The rest of the columns will be * filled with setText. * @param last Where to insert the item. * @param str String to set first column to. * @return Allocated item. */ virtual toTreeWidgetItem *createItem(toTreeWidgetItem *last, const QString &str); /** Reimplemented for internal reasons. */ virtual void query(const QString &sql, const toQList ¶m); /** Get SQL name of list. */ virtual QString sqlName(void) { return toListView::sqlName(); } /** Set SQL name of list. */ virtual void setSQLName(const QString &name) { toListView::setSQLName(name); } // Why are these needed? #if 1 /** Set the SQL statement of this list * @param sql String containing statement. */ void setSQL(const QString &sql) { toResult::setSQL(sql); } /** Set the SQL statement of this list. This will also affect @ref Name. * @param sql SQL containing statement. */ void setSQL(const toSQL &sql) { toResult::setSQL(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const QString &sql) { toResult::query(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql) { toResult::query(sql); } /** Set new SQL and run query. * @param sql New sql. * @see setSQL */ void query(const toSQL &sql, toQList &par) { toResult::query(sql, par); } #endif /** Reimplemented for internal reasons. */ virtual void editPrint(void) { editReadAll(); toListView::editPrint(); } /** Reimplemented for internal reasons. */ virtual QString middleString(); /** Reimplemented for internal reasons. */ virtual void addMenues(QMenu *); /** Reimplemented for internal reasons. */ virtual void setSorting(int col, bool asc = true); /** Reimplemented for internal reasons. */ virtual int sortColumn() const { return SortColumn; } public slots: /** Reimplemented for internal reasons. */ virtual void refresh(void); /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1) { toResult::changeParams(Param1); } /** Reimplemented For internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2) { toResult::changeParams(Param1, Param2); } /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3) { toResult::changeParams(Param1, Param2, Param3); } /** Try to add an item to the list if available. */ virtual void addItem(void); /** Handle any connection by default */ virtual bool canHandle(toConnection &) { return true; } private slots: void headingClicked(int col); void checkHeading(void); protected slots: /** Reimplemented for internal reasons. */ virtual void menuCallback(QAction *); }; #endif tora-2.1.3/src/todescribe.h0000644000175000017500000000460611336032004015331 0ustar michaelmichael /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * * Shared/mixed copyright is held throughout files in this product * * Portions Copyright (C) 2000-2001 Underscore AB * Portions Copyright (C) 2003-2005 Quest Software, Inc. * Portions Copyright (C) 2004-2009 Numerous Other Contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries. * * You may link this product with any GPL'd Qt library. * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TODESCRIBE_H #define TODESCRIBE_H #include "ui_todescribeui.h" /*! \brief Enhanced "key F4 describe table" dialog. It tries to find object by its name. It uses descibe widget based on name's type. */ class toDescribe : public QDialog, public Ui::toDescribe { Q_OBJECT public: toDescribe(QWidget * parent = 0); /*! \brief This method tries to find object type by its name. It shows the dialog itself - so there is no need to call show() explicitly. */ void changeParams(const QString & owner, const QString & object); protected: //! Save the prefs void hideEvent(QHideEvent * event); }; #endif tora-2.1.3/src/loki/0000755000175000017500000000000011445450571014003 5ustar michaelmichaeltora-2.1.3/src/loki/src/0000755000175000017500000000000011445450570014571 5ustar michaelmichaeltora-2.1.3/src/loki/src/SmallObj.cpp0000644000175000017500000012054011270353521016774 0ustar michaelmichael//////////////////////////////////////////////////////////////////////////////// // The Loki Library // Copyright (c) 2001 by Andrei Alexandrescu // This code accompanies the book: // Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design // Patterns Applied". Copyright (c) 2001. Addison-Wesley. // Permission to use, copy, modify, distribute and sell this software for any // purpose is hereby granted without fee, provided that the above copyright // notice appear in all copies and that both that copyright notice and this // permission notice appear in supporting documentation. // The author or Addison-Wesley Longman make no representations about the // suitability of this software for any purpose. It is provided "as is" // without express or implied warranty. //////////////////////////////////////////////////////////////////////////////// // $Id: SmallObj.cpp 756 2006-10-17 20:05:42Z syntheticpp $ #include #include #include #include // patch to compile with gcc4.3 - petr #include //#define DO_EXTRA_LOKI_TESTS //#define USE_NEW_TO_ALLOCATE #ifdef DO_EXTRA_LOKI_TESTS #include #endif namespace Loki { /** @struct Chunk @ingroup SmallObjectGroupInternal Contains info about each allocated Chunk - which is a collection of contiguous blocks. Each block is the same size, as specified by the FixedAllocator. The number of blocks in a Chunk depends upon page size. This is a POD-style struct with value-semantics. All functions and data are private so that they can not be changed by anything other than the FixedAllocator which owns the Chunk. @par Minimal Interface For the sake of runtime efficiency, no constructor, destructor, or copy-assignment operator is defined. The inline functions made by the compiler should be sufficient, and perhaps faster than hand-crafted functions. The lack of these functions allows vector to create and copy Chunks as needed without overhead. The Init and Release functions do what the default constructor and destructor would do. A Chunk is not in a usable state after it is constructed and before calling Init. Nor is a Chunk usable after Release is called, but before the destructor. @par Efficiency Down near the lowest level of the allocator, runtime efficiencies trump almost all other considerations. Each function does the minimum required of it. All functions should execute in constant time to prevent higher- level code from unwittingly using a version of Shlemiel the Painter's Algorithm. @par Stealth Indexes The first char of each empty block contains the index of the next empty block. These stealth indexes form a singly-linked list within the blocks. A Chunk is corrupt if this singly-linked list has a loop or is shorter than blocksAvailable_. Much of the allocator's time and space efficiency comes from how these stealth indexes are implemented. */ class Chunk { private: friend class FixedAllocator; /** Initializes a just-constructed Chunk. @param blockSize Number of bytes per block. @param blocks Number of blocks per Chunk. @return True for success, false for failure. */ bool Init( std::size_t blockSize, unsigned char blocks ); /** Allocate a block within the Chunk. Complexity is always O(1), and this will never throw. Does not actually "allocate" by calling malloc, new, or any other function, but merely adjusts some internal indexes to indicate an already allocated block is no longer available. @return Pointer to block within Chunk. */ void * Allocate( std::size_t blockSize ); /** Deallocate a block within the Chunk. Complexity is always O(1), and this will never throw. For efficiency, this assumes the address is within the block and aligned along the correct byte boundary. An assertion checks the alignment, and a call to HasBlock is done from within VicinityFind. Does not actually "deallocate" by calling free, delete, or other function, but merely adjusts some internal indexes to indicate a block is now available. */ void Deallocate( void * p, std::size_t blockSize ); /** Resets the Chunk back to pristine values. The available count is set back to zero, and the first available index is set to the zeroth block. The stealth indexes inside each block are set to point to the next block. This assumes the Chunk's data was already using Init. */ void Reset( std::size_t blockSize, unsigned char blocks ); /// Releases the allocated block of memory. void Release(); /** Determines if the Chunk has been corrupted. @param numBlocks Total # of blocks in the Chunk. @param blockSize # of bytes in each block. @param checkIndexes True if caller wants to check indexes of available blocks for corruption. If false, then caller wants to skip some tests tests just to run faster. (Debug version does more checks, but release version runs faster.) @return True if Chunk is corrupt. */ bool IsCorrupt( unsigned char numBlocks, std::size_t blockSize, bool checkIndexes ) const; /** Determines if block is available. @param p Address of block managed by Chunk. @param numBlocks Total # of blocks in the Chunk. @param blockSize # of bytes in each block. @return True if block is available, else false if allocated. */ bool IsBlockAvailable( void * p, unsigned char numBlocks, std::size_t blockSize ) const; /// Returns true if block at address P is inside this Chunk. inline bool HasBlock( void * p, std::size_t chunkLength ) const { unsigned char * pc = static_cast< unsigned char * >( p ); return ( pData_ <= pc ) && ( pc < pData_ + chunkLength ); } inline bool HasAvailable( unsigned char numBlocks ) const { return ( blocksAvailable_ == numBlocks ); } inline bool IsFilled( void ) const { return ( 0 == blocksAvailable_ ); } /// Pointer to array of allocated blocks. unsigned char * pData_; /// Index of first empty block. unsigned char firstAvailableBlock_; /// Count of empty blocks. unsigned char blocksAvailable_; }; /** @class FixedAllocator @ingroup SmallObjectGroupInternal Offers services for allocating fixed-sized objects. It has a container of "containers" of fixed-size blocks. The outer container has all the Chunks. The inner container is a Chunk which owns some blocks. @par Class Level Invariants - There is always either zero or one Chunk which is empty. - If this has no empty Chunk, then emptyChunk_ is NULL. - If this has an empty Chunk, then emptyChunk_ points to it. - If the Chunk container is empty, then deallocChunk_ and allocChunk_ are NULL. - If the Chunk container is not-empty, then deallocChunk_ and allocChunk_ are either NULL or point to Chunks within the container. - allocChunk_ will often point to the last Chunk in the container since it was likely allocated most recently, and therefore likely to have an available block. */ class FixedAllocator { private: /** Deallocates the block at address p, and then handles the internal bookkeeping needed to maintain class invariants. This assumes that deallocChunk_ points to the correct chunk. */ void DoDeallocate( void * p ); /** Creates an empty Chunk and adds it to the end of the ChunkList. All calls to the lower-level memory allocation functions occur inside this function, and so the only try-catch block is inside here. @return true for success, false for failure. */ bool MakeNewChunk( void ); /** Finds the Chunk which owns the block at address p. It starts at deallocChunk_ and searches in both forwards and backwards directions from there until it finds the Chunk which owns p. This algorithm should find the Chunk quickly if it is deallocChunk_ or is close to it in the Chunks container. This goes both forwards and backwards since that works well for both same-order and opposite-order deallocations. (Same-order = objects are deallocated in the same order in which they were allocated. Opposite order = objects are deallocated in a last to first order. Complexity is O(C) where C is count of all Chunks. This never throws. @return Pointer to Chunk that owns p, or NULL if no owner found. */ Chunk * VicinityFind( void * p ) const; /// Not implemented. FixedAllocator(const FixedAllocator&); /// Not implemented. FixedAllocator& operator=(const FixedAllocator&); /// Type of container used to hold Chunks. typedef std::vector< Chunk > Chunks; /// Iterator through container of Chunks. typedef Chunks::iterator ChunkIter; /// Iterator through const container of Chunks. typedef Chunks::const_iterator ChunkCIter; /// Fewest # of objects managed by a Chunk. static unsigned char MinObjectsPerChunk_; /// Most # of objects managed by a Chunk - never exceeds UCHAR_MAX. static unsigned char MaxObjectsPerChunk_; /// Number of bytes in a single block within a Chunk. std::size_t blockSize_; /// Number of blocks managed by each Chunk. unsigned char numBlocks_; /// Container of Chunks. Chunks chunks_; /// Pointer to Chunk used for last or next allocation. Chunk * allocChunk_; /// Pointer to Chunk used for last or next deallocation. Chunk * deallocChunk_; /// Pointer to the only empty Chunk if there is one, else NULL. Chunk * emptyChunk_; public: /// Create a FixedAllocator which manages blocks of 'blockSize' size. FixedAllocator(); /// Destroy the FixedAllocator and release all its Chunks. ~FixedAllocator(); /// Initializes a FixedAllocator by calculating # of blocks per Chunk. void Initialize( std::size_t blockSize, std::size_t pageSize ); /** Returns pointer to allocated memory block of fixed size - or NULL if it failed to allocate. */ void * Allocate( void ); /** Deallocate a memory block previously allocated with Allocate. If the block is not owned by this FixedAllocator, it returns false so that SmallObjAllocator can call the default deallocator. If the block was found, this returns true. */ bool Deallocate( void * p, Chunk * hint ); /// Returns block size with which the FixedAllocator was initialized. inline std::size_t BlockSize() const { return blockSize_; } /** Releases the memory used by the empty Chunk. This will take constant time under any situation. @return True if empty chunk found and released, false if none empty. */ bool TrimEmptyChunk( void ); /** Releases unused spots from ChunkList. This takes constant time with respect to # of Chunks, but actual time depends on underlying memory allocator. @return False if no unused spots, true if some found and released. */ bool TrimChunkList( void ); /** Returns count of empty Chunks held by this allocator. Complexity is O(C) where C is the total number of Chunks - empty or used. */ std::size_t CountEmptyChunks( void ) const; /** Determines if FixedAllocator is corrupt. Checks data members to see if any have erroneous values, or violate class invariants. It also checks if any Chunk is corrupt. Complexity is O(C) where C is the number of Chunks. If any data is corrupt, this will return true in release mode, or assert in debug mode. */ bool IsCorrupt( void ) const; /** Returns true if the block at address p is within a Chunk owned by this FixedAllocator. Complexity is O(C) where C is the total number of Chunks - empty or used. */ const Chunk * HasBlock( void * p ) const; inline Chunk * HasBlock( void * p ) { return const_cast< Chunk * >( const_cast< const FixedAllocator * >( this )->HasBlock( p ) ); } }; unsigned char FixedAllocator::MinObjectsPerChunk_ = 8; unsigned char FixedAllocator::MaxObjectsPerChunk_ = UCHAR_MAX; // Chunk::Init ---------------------------------------------------------------- bool Chunk::Init( std::size_t blockSize, unsigned char blocks ) { assert(blockSize > 0); assert(blocks > 0); // Overflow check const std::size_t allocSize = blockSize * blocks; assert( allocSize / blockSize == blocks); #ifdef USE_NEW_TO_ALLOCATE // If this new operator fails, it will throw, and the exception will get // caught one layer up. pData_ = static_cast< unsigned char * >( ::operator new ( allocSize ) ); #else // malloc can't throw, so its only way to indicate an error is to return // a NULL pointer, so we have to check for that. pData_ = static_cast< unsigned char * >( ::std::malloc( allocSize ) ); if ( NULL == pData_ ) return false; #endif Reset( blockSize, blocks ); return true; } // Chunk::Reset --------------------------------------------------------------- void Chunk::Reset(std::size_t blockSize, unsigned char blocks) { assert(blockSize > 0); assert(blocks > 0); // Overflow check assert((blockSize * blocks) / blockSize == blocks); firstAvailableBlock_ = 0; blocksAvailable_ = blocks; unsigned char i = 0; for ( unsigned char * p = pData_; i != blocks; p += blockSize ) { *p = ++i; } } // Chunk::Release ------------------------------------------------------------- void Chunk::Release() { assert( NULL != pData_ ); #ifdef USE_NEW_TO_ALLOCATE ::operator delete ( pData_ ); #else ::std::free( static_cast< void * >( pData_ ) ); #endif } // Chunk::Allocate ------------------------------------------------------------ void* Chunk::Allocate(std::size_t blockSize) { if ( IsFilled() ) return NULL; assert((firstAvailableBlock_ * blockSize) / blockSize == firstAvailableBlock_); unsigned char * pResult = pData_ + (firstAvailableBlock_ * blockSize); firstAvailableBlock_ = *pResult; --blocksAvailable_; return pResult; } // Chunk::Deallocate ---------------------------------------------------------- void Chunk::Deallocate(void* p, std::size_t blockSize) { assert(p >= pData_); unsigned char* toRelease = static_cast(p); // Alignment check assert((toRelease - pData_) % blockSize == 0); unsigned char index = static_cast< unsigned char >( ( toRelease - pData_ ) / blockSize); #if defined(DEBUG) || defined(_DEBUG) // Check if block was already deleted. Attempting to delete the same // block more than once causes Chunk's linked-list of stealth indexes to // become corrupt. And causes count of blocksAvailable_ to be wrong. if ( 0 < blocksAvailable_ ) assert( firstAvailableBlock_ != index ); #endif *toRelease = firstAvailableBlock_; firstAvailableBlock_ = index; // Truncation check assert(firstAvailableBlock_ == (toRelease - pData_) / blockSize); ++blocksAvailable_; } // Chunk::IsCorrupt ----------------------------------------------------------- bool Chunk::IsCorrupt( unsigned char numBlocks, std::size_t blockSize, bool checkIndexes ) const { if ( numBlocks < blocksAvailable_ ) { // Contents at this Chunk corrupted. This might mean something has // overwritten memory owned by the Chunks container. assert( false ); return true; } if ( IsFilled() ) // Useless to do further corruption checks if all blocks allocated. return false; unsigned char index = firstAvailableBlock_; if ( numBlocks <= index ) { // Contents at this Chunk corrupted. This might mean something has // overwritten memory owned by the Chunks container. assert( false ); return true; } if ( !checkIndexes ) // Caller chose to skip more complex corruption tests. return false; /* If the bit at index was set in foundBlocks, then the stealth index was found on the linked-list. */ std::bitset< UCHAR_MAX > foundBlocks; unsigned char * nextBlock = NULL; /* The loop goes along singly linked-list of stealth indexes and makes sure that each index is within bounds (0 <= index < numBlocks) and that the index was not already found while traversing the linked-list. The linked- list should have exactly blocksAvailable_ nodes, so the for loop will not check more than blocksAvailable_. This loop can't check inside allocated blocks for corruption since such blocks are not within the linked-list. Contents of allocated blocks are not changed by Chunk. Here are the types of corrupted link-lists which can be verified. The corrupt index is shown with asterisks in each example. Type 1: Index is too big. numBlocks == 64 blocksAvailable_ == 7 firstAvailableBlock_ -> 17 -> 29 -> *101* There should be no indexes which are equal to or larger than the total number of blocks. Such an index would refer to a block beyond the Chunk's allocated domain. Type 2: Index is repeated. numBlocks == 64 blocksAvailable_ == 5 firstAvailableBlock_ -> 17 -> 29 -> 53 -> *17* -> 29 -> 53 ... No index should be repeated within the linked-list since that would indicate the presence of a loop in the linked-list. */ for ( unsigned char cc = 0; ; ) { nextBlock = pData_ + ( index * blockSize ); foundBlocks.set( index, true ); ++cc; if ( cc >= blocksAvailable_ ) // Successfully counted off number of nodes in linked-list. break; index = *nextBlock; if ( numBlocks <= index ) { /* This catches Type 1 corruptions as shown in above comments. This implies that a block was corrupted due to a stray pointer or an operation on a nearby block overran the size of the block. */ assert( false ); return true; } if ( foundBlocks.test( index ) ) { /* This catches Type 2 corruptions as shown in above comments. This implies that a block was corrupted due to a stray pointer or an operation on a nearby block overran the size of the block. Or perhaps the program tried to delete a block more than once. */ assert( false ); return true; } } if ( foundBlocks.count() != blocksAvailable_ ) { /* This implies that the singly-linked-list of stealth indexes was corrupted. Ideally, this should have been detected within the loop. */ assert( false ); return true; } return false; } // Chunk::IsBlockAvailable ---------------------------------------------------- bool Chunk::IsBlockAvailable( void * p, unsigned char numBlocks, std::size_t blockSize ) const { (void) numBlocks; if ( IsFilled() ) return false; unsigned char * place = static_cast< unsigned char * >( p ); // Alignment check assert( ( place - pData_ ) % blockSize == 0 ); unsigned char blockIndex = static_cast< unsigned char >( ( place - pData_ ) / blockSize ); unsigned char index = firstAvailableBlock_; assert( numBlocks > index ); if ( index == blockIndex ) return true; /* If the bit at index was set in foundBlocks, then the stealth index was found on the linked-list. */ std::bitset< UCHAR_MAX > foundBlocks; unsigned char * nextBlock = NULL; for ( unsigned char cc = 0; ; ) { nextBlock = pData_ + ( index * blockSize ); foundBlocks.set( index, true ); ++cc; if ( cc >= blocksAvailable_ ) // Successfully counted off number of nodes in linked-list. break; index = *nextBlock; if ( index == blockIndex ) return true; assert( numBlocks > index ); assert( !foundBlocks.test( index ) ); } return false; } // FixedAllocator::FixedAllocator --------------------------------------------- FixedAllocator::FixedAllocator() : blockSize_( 0 ) , numBlocks_( 0 ) , chunks_( 0 ) , allocChunk_( NULL ) , deallocChunk_( NULL ) , emptyChunk_( NULL ) { } // FixedAllocator::~FixedAllocator -------------------------------------------- FixedAllocator::~FixedAllocator() { #ifdef DO_EXTRA_LOKI_TESTS TrimEmptyChunk(); assert( chunks_.empty() && "Memory leak detected!" ); #endif for ( ChunkIter i( chunks_.begin() ); i != chunks_.end(); ++i ) i->Release(); } // FixedAllocator::Initialize ------------------------------------------------- void FixedAllocator::Initialize( std::size_t blockSize, std::size_t pageSize ) { assert( blockSize > 0 ); assert( pageSize >= blockSize ); blockSize_ = blockSize; std::size_t numBlocks = pageSize / blockSize; if ( numBlocks > MaxObjectsPerChunk_ ) numBlocks = MaxObjectsPerChunk_; else if ( numBlocks < MinObjectsPerChunk_ ) numBlocks = MinObjectsPerChunk_; numBlocks_ = static_cast(numBlocks); assert(numBlocks_ == numBlocks); } // FixedAllocator::CountEmptyChunks ------------------------------------------- std::size_t FixedAllocator::CountEmptyChunks( void ) const { #ifdef DO_EXTRA_LOKI_TESTS // This code is only used for specialized tests of the allocator. // It is #ifdef-ed so that its O(C) complexity does not overwhelm the // functions which call it. std::size_t count = 0; for ( ChunkCIter it( chunks_.begin() ); it != chunks_.end(); ++it ) { const Chunk & chunk = *it; if ( chunk.HasAvailable( numBlocks_ ) ) ++count; } return count; #else return ( NULL == emptyChunk_ ) ? 0 : 1; #endif } // FixedAllocator::IsCorrupt -------------------------------------------------- bool FixedAllocator::IsCorrupt( void ) const { const bool isEmpty = chunks_.empty(); ChunkCIter start( chunks_.begin() ); ChunkCIter last( chunks_.end() ); const size_t emptyChunkCount = CountEmptyChunks(); if ( isEmpty ) { if ( start != last ) { assert( false ); return true; } if ( 0 < emptyChunkCount ) { assert( false ); return true; } if ( NULL != deallocChunk_ ) { assert( false ); return true; } if ( NULL != allocChunk_ ) { assert( false ); return true; } if ( NULL != emptyChunk_ ) { assert( false ); return true; } } else { const Chunk * front = &chunks_.front(); const Chunk * back = &chunks_.back(); if ( start >= last ) { assert( false ); return true; } if ( back < deallocChunk_ ) { assert( false ); return true; } if ( back < allocChunk_ ) { assert( false ); return true; } if ( front > deallocChunk_ ) { assert( false ); return true; } if ( front > allocChunk_ ) { assert( false ); return true; } switch ( emptyChunkCount ) { case 0: if ( emptyChunk_ != NULL ) { assert( false ); return true; } break; case 1: if ( emptyChunk_ == NULL ) { assert( false ); return true; } if ( back < emptyChunk_ ) { assert( false ); return true; } if ( front > emptyChunk_ ) { assert( false ); return true; } if ( !emptyChunk_->HasAvailable( numBlocks_ ) ) { // This may imply somebody tried to delete a block twice. assert( false ); return true; } break; default: assert( false ); return true; } for ( ChunkCIter it( start ); it != last; ++it ) { const Chunk & chunk = *it; if ( chunk.IsCorrupt( numBlocks_, blockSize_, true ) ) return true; } } return false; } // FixedAllocator::HasBlock --------------------------------------------------- const Chunk * FixedAllocator::HasBlock( void * p ) const { const std::size_t chunkLength = numBlocks_ * blockSize_; for ( ChunkCIter it( chunks_.begin() ); it != chunks_.end(); ++it ) { const Chunk & chunk = *it; if ( chunk.HasBlock( p, chunkLength ) ) return &chunk; } return NULL; } // FixedAllocator::TrimEmptyChunk --------------------------------------------- bool FixedAllocator::TrimEmptyChunk( void ) { // prove either emptyChunk_ points nowhere, or points to a truly empty Chunk. assert( ( NULL == emptyChunk_ ) || ( emptyChunk_->HasAvailable( numBlocks_ ) ) ); if ( NULL == emptyChunk_ ) return false; // If emptyChunk_ points to valid Chunk, then chunk list is not empty. assert( !chunks_.empty() ); // And there should be exactly 1 empty Chunk. assert( 1 == CountEmptyChunks() ); Chunk * lastChunk = &chunks_.back(); if ( lastChunk != emptyChunk_ ) std::swap( *emptyChunk_, *lastChunk ); assert( lastChunk->HasAvailable( numBlocks_ ) ); lastChunk->Release(); chunks_.pop_back(); if ( chunks_.empty() ) { allocChunk_ = NULL; deallocChunk_ = NULL; } else { if ( deallocChunk_ == emptyChunk_ ) { deallocChunk_ = &chunks_.front(); assert( deallocChunk_->blocksAvailable_ < numBlocks_ ); } if ( allocChunk_ == emptyChunk_ ) { allocChunk_ = &chunks_.back(); assert( allocChunk_->blocksAvailable_ < numBlocks_ ); } } emptyChunk_ = NULL; assert( 0 == CountEmptyChunks() ); return true; } // FixedAllocator::TrimChunkList ---------------------------------------------- bool FixedAllocator::TrimChunkList( void ) { if ( chunks_.empty() ) { assert( NULL == allocChunk_ ); assert( NULL == deallocChunk_ ); } if ( chunks_.size() == chunks_.capacity() ) return false; // Use the "make-a-temp-and-swap" trick to remove excess capacity. Chunks( chunks_ ).swap( chunks_ ); return true; } // FixedAllocator::MakeNewChunk ----------------------------------------------- bool FixedAllocator::MakeNewChunk( void ) { bool allocated = false; try { std::size_t size = chunks_.size(); // Calling chunks_.reserve *before* creating and initializing the new // Chunk means that nothing is leaked by this function in case an // exception is thrown from reserve. if ( chunks_.capacity() == size ) { if ( 0 == size ) size = 4; chunks_.reserve( size * 2 ); } Chunk newChunk; allocated = newChunk.Init( blockSize_, numBlocks_ ); if ( allocated ) chunks_.push_back( newChunk ); } catch ( ... ) { allocated = false; } if ( !allocated ) return false; allocChunk_ = &chunks_.back(); deallocChunk_ = &chunks_.front(); return true; } // FixedAllocator::Allocate --------------------------------------------------- void * FixedAllocator::Allocate( void ) { // prove either emptyChunk_ points nowhere, or points to a truly empty Chunk. assert( ( NULL == emptyChunk_ ) || ( emptyChunk_->HasAvailable( numBlocks_ ) ) ); assert( CountEmptyChunks() < 2 ); if ( ( NULL == allocChunk_ ) || allocChunk_->IsFilled() ) { if ( NULL != emptyChunk_ ) { allocChunk_ = emptyChunk_; emptyChunk_ = NULL; } else { for ( ChunkIter i( chunks_.begin() ); ; ++i ) { if ( chunks_.end() == i ) { if ( !MakeNewChunk() ) return NULL; break; } if ( !i->IsFilled() ) { allocChunk_ = &*i; break; } } } } else if ( allocChunk_ == emptyChunk_) // detach emptyChunk_ from allocChunk_, because after // calling allocChunk_->Allocate(blockSize_); the chunk // is no longer empty. emptyChunk_ = NULL; assert( allocChunk_ != NULL ); assert( !allocChunk_->IsFilled() ); void * place = allocChunk_->Allocate( blockSize_ ); // prove either emptyChunk_ points nowhere, or points to a truly empty Chunk. assert( ( NULL == emptyChunk_ ) || ( emptyChunk_->HasAvailable( numBlocks_ ) ) ); assert( CountEmptyChunks() < 2 ); return place; } // FixedAllocator::Deallocate ------------------------------------------------- bool FixedAllocator::Deallocate( void * p, Chunk * hint ) { assert(!chunks_.empty()); assert(&chunks_.front() <= deallocChunk_); assert(&chunks_.back() >= deallocChunk_); assert( &chunks_.front() <= allocChunk_ ); assert( &chunks_.back() >= allocChunk_ ); assert( CountEmptyChunks() < 2 ); Chunk * foundChunk = ( NULL == hint ) ? VicinityFind( p ) : hint; if ( NULL == foundChunk ) return false; assert( foundChunk->HasBlock( p, numBlocks_ * blockSize_ ) ); #ifdef LOKI_CHECK_FOR_CORRUPTION if ( foundChunk->IsCorrupt( numBlocks_, blockSize_, true ) ) { assert( false ); return false; } if ( foundChunk->IsBlockAvailable( p, numBlocks_, blockSize_ ) ) { assert( false ); return false; } #endif deallocChunk_ = foundChunk; DoDeallocate(p); assert( CountEmptyChunks() < 2 ); return true; } // FixedAllocator::VicinityFind ----------------------------------------------- Chunk * FixedAllocator::VicinityFind( void * p ) const { if ( chunks_.empty() ) return NULL; assert(deallocChunk_); const std::size_t chunkLength = numBlocks_ * blockSize_; Chunk * lo = deallocChunk_; Chunk * hi = deallocChunk_ + 1; const Chunk * loBound = &chunks_.front(); const Chunk * hiBound = &chunks_.back() + 1; // Special case: deallocChunk_ is the last in the array if (hi == hiBound) hi = NULL; for (;;) { if (lo) { if ( lo->HasBlock( p, chunkLength ) ) return lo; if ( lo == loBound ) { lo = NULL; if ( NULL == hi ) break; } else --lo; } if (hi) { if ( hi->HasBlock( p, chunkLength ) ) return hi; if ( ++hi == hiBound ) { hi = NULL; if ( NULL == lo ) break; } } } return NULL; } // FixedAllocator::DoDeallocate ----------------------------------------------- void FixedAllocator::DoDeallocate(void* p) { // Show that deallocChunk_ really owns the block at address p. assert( deallocChunk_->HasBlock( p, numBlocks_ * blockSize_ ) ); // Either of the next two assertions may fail if somebody tries to // delete the same block twice. assert( emptyChunk_ != deallocChunk_ ); assert( !deallocChunk_->HasAvailable( numBlocks_ ) ); // prove either emptyChunk_ points nowhere, or points to a truly empty Chunk. assert( ( NULL == emptyChunk_ ) || ( emptyChunk_->HasAvailable( numBlocks_ ) ) ); // call into the chunk, will adjust the inner list but won't release memory deallocChunk_->Deallocate(p, blockSize_); if ( deallocChunk_->HasAvailable( numBlocks_ ) ) { assert( emptyChunk_ != deallocChunk_ ); // deallocChunk_ is empty, but a Chunk is only released if there are 2 // empty chunks. Since emptyChunk_ may only point to a previously // cleared Chunk, if it points to something else besides deallocChunk_, // then FixedAllocator currently has 2 empty Chunks. if ( NULL != emptyChunk_ ) { // If last Chunk is empty, just change what deallocChunk_ // points to, and release the last. Otherwise, swap an empty // Chunk with the last, and then release it. Chunk * lastChunk = &chunks_.back(); if ( lastChunk == deallocChunk_ ) deallocChunk_ = emptyChunk_; else if ( lastChunk != emptyChunk_ ) std::swap( *emptyChunk_, *lastChunk ); assert( lastChunk->HasAvailable( numBlocks_ ) ); lastChunk->Release(); chunks_.pop_back(); if ( ( allocChunk_ == lastChunk ) || allocChunk_->IsFilled() ) allocChunk_ = deallocChunk_; } emptyChunk_ = deallocChunk_; } // prove either emptyChunk_ points nowhere, or points to a truly empty Chunk. assert( ( NULL == emptyChunk_ ) || ( emptyChunk_->HasAvailable( numBlocks_ ) ) ); } // GetOffset ------------------------------------------------------------------ /// @ingroup SmallObjectGroupInternal /// Calculates index into array where a FixedAllocator of numBytes is located. inline std::size_t GetOffset( std::size_t numBytes, std::size_t alignment ) { const std::size_t alignExtra = alignment-1; return ( numBytes + alignExtra ) / alignment; } // DefaultAllocator ----------------------------------------------------------- /** @ingroup SmallObjectGroupInternal Calls the default allocator when SmallObjAllocator decides not to handle a request. SmallObjAllocator calls this if the number of bytes is bigger than the size which can be handled by any FixedAllocator. @param numBytes number of bytes @param doThrow True if this function should throw an exception, or false if it should indicate failure by returning a NULL pointer. */ void * DefaultAllocator( std::size_t numBytes, bool doThrow ) { #ifdef USE_NEW_TO_ALLOCATE return doThrow ? ::operator new( numBytes ) : ::operator new( numBytes, std::nothrow_t() ); #else void * p = ::std::malloc( numBytes ); if ( doThrow && ( NULL == p ) ) throw std::bad_alloc(); return p; #endif } // DefaultDeallocator --------------------------------------------------------- /** @ingroup SmallObjectGroupInternal Calls default deallocator when SmallObjAllocator decides not to handle a request. The default deallocator could be the global delete operator or the free function. The free function is the preferred default deallocator since it matches malloc which is the preferred default allocator. SmallObjAllocator will call this if an address was not found among any of its own blocks. */ void DefaultDeallocator( void * p ) { #ifdef USE_NEW_TO_ALLOCATE ::operator delete( p ); #else ::std::free( p ); #endif } // SmallObjAllocator::SmallObjAllocator --------------------------------------- SmallObjAllocator::SmallObjAllocator( std::size_t pageSize, std::size_t maxObjectSize, std::size_t objectAlignSize ) : pool_( NULL ), maxSmallObjectSize_( maxObjectSize ), objectAlignSize_( objectAlignSize ) { #ifdef DO_EXTRA_LOKI_TESTS std::cout << "SmallObjAllocator " << this << std::endl; #endif assert( 0 != objectAlignSize ); const std::size_t allocCount = GetOffset( maxObjectSize, objectAlignSize ); pool_ = new FixedAllocator[ allocCount ]; for ( std::size_t i = 0; i < allocCount; ++i ) pool_[ i ].Initialize( ( i+1 ) * objectAlignSize, pageSize ); } // SmallObjAllocator::~SmallObjAllocator -------------------------------------- SmallObjAllocator::~SmallObjAllocator( void ) { #ifdef DO_EXTRA_LOKI_TESTS std::cout << "~SmallObjAllocator " << this << std::endl; #endif delete [] pool_; } // SmallObjAllocator::TrimExcessMemory ---------------------------------------- bool SmallObjAllocator::TrimExcessMemory( void ) { bool found = false; const std::size_t allocCount = GetOffset( GetMaxObjectSize(), GetAlignment() ); std::size_t i = 0; for ( ; i < allocCount; ++i ) { if ( pool_[ i ].TrimEmptyChunk() ) found = true; } for ( i = 0; i < allocCount; ++i ) { if ( pool_[ i ].TrimChunkList() ) found = true; } return found; } // SmallObjAllocator::Allocate ------------------------------------------------ void * SmallObjAllocator::Allocate( std::size_t numBytes, bool doThrow ) { if ( numBytes > GetMaxObjectSize() ) return DefaultAllocator( numBytes, doThrow ); assert( NULL != pool_ ); if ( 0 == numBytes ) numBytes = 1; const std::size_t index = GetOffset( numBytes, GetAlignment() ) - 1; const std::size_t allocCount = GetOffset( GetMaxObjectSize(), GetAlignment() ); (void) allocCount; assert( index < allocCount ); FixedAllocator & allocator = pool_[ index ]; assert( allocator.BlockSize() >= numBytes ); assert( allocator.BlockSize() < numBytes + GetAlignment() ); void * place = allocator.Allocate(); if ( ( NULL == place ) && TrimExcessMemory() ) place = allocator.Allocate(); if ( ( NULL == place ) && doThrow ) { #ifdef _MSC_VER throw std::bad_alloc( "could not allocate small object" ); #else // GCC did not like a literal string passed to std::bad_alloc. // so just throw the default-constructed exception. throw std::bad_alloc(); #endif } return place; } // SmallObjAllocator::Deallocate ---------------------------------------------- void SmallObjAllocator::Deallocate( void * p, std::size_t numBytes ) { if ( NULL == p ) return; if ( numBytes > GetMaxObjectSize() ) { DefaultDeallocator( p ); return; } assert( NULL != pool_ ); if ( 0 == numBytes ) numBytes = 1; const std::size_t index = GetOffset( numBytes, GetAlignment() ) - 1; const std::size_t allocCount = GetOffset( GetMaxObjectSize(), GetAlignment() ); (void) allocCount; assert( index < allocCount ); FixedAllocator & allocator = pool_[ index ]; assert( allocator.BlockSize() >= numBytes ); assert( allocator.BlockSize() < numBytes + GetAlignment() ); const bool found = allocator.Deallocate( p, NULL ); (void) found; assert( found ); } // SmallObjAllocator::Deallocate ---------------------------------------------- void SmallObjAllocator::Deallocate( void * p ) { if ( NULL == p ) return; assert( NULL != pool_ ); FixedAllocator * pAllocator = NULL; const std::size_t allocCount = GetOffset( GetMaxObjectSize(), GetAlignment() ); Chunk * chunk = NULL; for ( std::size_t ii = 0; ii < allocCount; ++ii ) { chunk = pool_[ ii ].HasBlock( p ); if ( NULL != chunk ) { pAllocator = &pool_[ ii ]; break; } } if ( NULL == pAllocator ) { DefaultDeallocator( p ); return; } assert( NULL != chunk ); const bool found = pAllocator->Deallocate( p, chunk ); (void) found; assert( found ); } // SmallObjAllocator::IsCorrupt ----------------------------------------------- bool SmallObjAllocator::IsCorrupt( void ) const { if ( NULL == pool_ ) { assert( false ); return true; } if ( 0 == GetAlignment() ) { assert( false ); return true; } if ( 0 == GetMaxObjectSize() ) { assert( false ); return true; } const std::size_t allocCount = GetOffset( GetMaxObjectSize(), GetAlignment() ); for ( std::size_t ii = 0; ii < allocCount; ++ii ) { if ( pool_[ ii ].IsCorrupt() ) return true; } return false; } } // end namespace Loki tora-2.1.3/src/loki/src/Singleton.cpp0000644000175000017500000000503711270353521017236 0ustar michaelmichael//////////////////////////////////////////////////////////////////////////////// // The Loki Library // Copyright (c) 2001 by Andrei Alexandrescu // This code accompanies the book: // Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design // Patterns Applied". Copyright (c) 2001. Addison-Wesley. // Permission to use, copy, modify, distribute and sell this software for any // purpose is hereby granted without fee, provided that the above copyright // notice appear in all copies and that both that copyright notice and this // permission notice appear in supporting documentation. // The author or Addison-Wesley Longman make no representations about the // suitability of this software for any purpose. It is provided "as is" // without express or implied warranty. //////////////////////////////////////////////////////////////////////////////// // $Id: Singleton.cpp 756 2006-10-17 20:05:42Z syntheticpp $ #include #ifdef LOKI_ENABLE_NEW_SETLONGLIVITY_HELPER_DATA_IMPL Loki::Private::TrackerArray* Loki::Private::pTrackerArray = 0; #else Loki::Private::TrackerArray Loki::Private::pTrackerArray = 0; unsigned int Loki::Private::elements = 0; #endif //////////////////////////////////////////////////////////////////////////////// // function AtExitFn // Ensures proper destruction of objects with longevity //////////////////////////////////////////////////////////////////////////////// #ifdef LOKI_ENABLE_NEW_SETLONGLIVITY_HELPER_DATA_IMPL void LOKI_C_CALLING_CONVENTION_QUALIFIER Loki::Private::AtExitFn() { assert(pTrackerArray!=0 && !pTrackerArray->empty()); // Pick the element at the top of the stack LifetimeTracker* pTop = pTrackerArray->back(); // Remove that object off the stack _before_ deleting pTop pTrackerArray->pop_back(); // Destroy the element delete pTop; // Destroy stack when it's empty _after_ deleting pTop if(pTrackerArray->empty()) { delete pTrackerArray; pTrackerArray = 0; } } #else void LOKI_C_CALLING_CONVENTION_QUALIFIER Loki::Private::AtExitFn() { assert(elements > 0 && pTrackerArray != 0); // Pick the element at the top of the stack LifetimeTracker* pTop = pTrackerArray[elements - 1]; // Remove that object off the stack // Don't check errors - realloc with less memory // can't fail pTrackerArray = static_cast(std::realloc( pTrackerArray, sizeof(*pTrackerArray) * --elements)); // Destroy the element delete pTop; } #endif tora-2.1.3/src/loki/include/0000755000175000017500000000000011445450571015426 5ustar michaelmichaeltora-2.1.3/src/loki/include/loki/0000755000175000017500000000000011445450571016364 5ustar michaelmichaeltora-2.1.3/src/loki/include/loki/AbstractFactory.h0000644000175000017500000001416311270353521021626 0ustar michaelmichael//////////////////////////////////////////////////////////////////////////////// // The Loki Library // Copyright (c) 2001 by Andrei Alexandrescu // This code accompanies the book: // Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design // Patterns Applied". Copyright (c) 2001. Addison-Wesley. // Permission to use, copy, modify, distribute and sell this software for any // purpose is hereby granted without fee, provided that the above copyright // notice appear in all copies and that both that copyright notice and this // permission notice appear in supporting documentation. // The author or Addison-Wesley Longman make no representations about the // suitability of this software for any purpose. It is provided "as is" // without express or implied warranty. //////////////////////////////////////////////////////////////////////////////// #ifndef LOKI_ABSTRACTFACTORY_INC_ #define LOKI_ABSTRACTFACTORY_INC_ // $Id: AbstractFactory.h 771 2006-10-27 18:05:03Z clitte_bbt $ #include "Typelist.h" #include "Sequence.h" #include "TypeManip.h" #include "HierarchyGenerators.h" #include /** * \defgroup FactoriesGroup Factories * \defgroup AbstractFactoryGroup Abstract Factory * \ingroup FactoriesGroup * \brief Implements an abstract object factory. */ /** * \class AbstractFactory * \ingroup AbstractFactoryGroup * \brief Implements an abstract object factory. */ namespace Loki { //////////////////////////////////////////////////////////////////////////////// // class template AbstractFactoryUnit // The building block of an Abstract Factory //////////////////////////////////////////////////////////////////////////////// template class AbstractFactoryUnit { public: virtual T* DoCreate(Type2Type) = 0; virtual ~AbstractFactoryUnit() {} }; //////////////////////////////////////////////////////////////////////////////// // class template AbstractFactory // Defines an Abstract Factory interface starting from a typelist //////////////////////////////////////////////////////////////////////////////// template < class TList, template class Unit = AbstractFactoryUnit > class AbstractFactory : public GenScatterHierarchy { public: typedef TList ProductList; template T* Create() { Unit& unit = *this; return unit.DoCreate(Type2Type()); } }; //////////////////////////////////////////////////////////////////////////////// // class template OpNewFactoryUnit // Creates an object by invoking the new operator //////////////////////////////////////////////////////////////////////////////// template class OpNewFactoryUnit : public Base { typedef typename Base::ProductList BaseProductList; protected: typedef typename BaseProductList::Tail ProductList; public: typedef typename BaseProductList::Head AbstractProduct; ConcreteProduct* DoCreate(Type2Type) { return new ConcreteProduct; } }; //////////////////////////////////////////////////////////////////////////////// // class template PrototypeFactoryUnit // Creates an object by cloning a prototype // There is a difference between the implementation herein and the one described // in the book: GetPrototype and SetPrototype use the helper friend // functions DoGetPrototype and DoSetPrototype. The friend functions avoid // name hiding issues. Plus, GetPrototype takes a reference to pointer // instead of returning the pointer by value. //////////////////////////////////////////////////////////////////////////////// template class PrototypeFactoryUnit : public Base { typedef typename Base::ProductList BaseProductList; protected: typedef typename BaseProductList::Tail ProductList; public: typedef typename BaseProductList::Head AbstractProduct; PrototypeFactoryUnit(AbstractProduct* p = 0) : pPrototype_(p) {} template friend void DoGetPrototype(const PrototypeFactoryUnit& me, typename Base1::ProductList::Head*& pPrototype); template friend void DoSetPrototype(PrototypeFactoryUnit& me, typename Base1::ProductList::Head* pObj); template void GetPrototype(U*& p) { return DoGetPrototype(*this, p); } template void SetPrototype(U* pObj) { DoSetPrototype(*this, pObj); } AbstractProduct* DoCreate(Type2Type) { assert(pPrototype_); return pPrototype_->Clone(); } private: AbstractProduct* pPrototype_; }; template inline void DoGetPrototype(const PrototypeFactoryUnit& me, typename Base::ProductList::Head*& pPrototype) { pPrototype = me.pPrototype_; } template inline void DoSetPrototype(PrototypeFactoryUnit& me, typename Base::ProductList::Head* pObj) { me.pPrototype_ = pObj; } //////////////////////////////////////////////////////////////////////////////// // class template ConcreteFactory // Implements an AbstractFactory interface //////////////////////////////////////////////////////////////////////////////// template < class AbstractFact, template class Creator = OpNewFactoryUnit, class TList = typename AbstractFact::ProductList > class ConcreteFactory : public GenLinearHierarchy< typename TL::Reverse::Result, Creator, AbstractFact> { public: typedef typename AbstractFact::ProductList ProductList; typedef TList ConcreteProductList; }; } // namespace Loki #endif // end file guardian tora-2.1.3/src/loki/include/loki/Key.h0000644000175000017500000006011711270353521017263 0ustar michaelmichael//////////////////////////////////////////////////////////////////////////////// // The Loki Library // Copyright (c) 2006 by Guillaume Chatelet // // Code covered by the MIT License // // Permission to use, copy, modify, distribute and sell this software for any // purpose is hereby granted without fee, provided that the above copyright // notice appear in all copies and that both that copyright notice and this // permission notice appear in supporting documentation. // // The authors make no representations about the suitability of this software // for any purpose. It is provided "as is" without express or implied warranty. // // This code DOES NOT accompany the book: // Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design // Patterns Applied". Copyright (c) 2001. Addison-Wesley. // //////////////////////////////////////////////////////////////////////////////// #ifndef LOKI_KEY_INC_ #define LOKI_KEY_INC_ // $Id: Key.h 771 2006-10-27 18:05:03Z clitte_bbt $ #include namespace Loki { template< class Factory, typename IdentifierType > class Key; template bool operator==(const Key &k1, const Key &k2); template bool operator<(const Key &k1, const Key &k2); /** * A Key class */ template< class Factory, typename IdentifierType > class Key { typedef typename Factory::Parm1 Parm1; typedef typename Factory::Parm2 Parm2; typedef typename Factory::Parm3 Parm3; typedef typename Factory::Parm4 Parm4; typedef typename Factory::Parm5 Parm5; typedef typename Factory::Parm6 Parm6; typedef typename Factory::Parm7 Parm7; typedef typename Factory::Parm8 Parm8; typedef typename Factory::Parm9 Parm9; typedef typename Factory::Parm10 Parm10; typedef typename Factory::Parm11 Parm11; typedef typename Factory::Parm12 Parm12; typedef typename Factory::Parm13 Parm13; typedef typename Factory::Parm14 Parm14; typedef typename Factory::Parm15 Parm15; public: // member variables int count; // should be const, but constness prevent default copy ctor IdentifierType id; Parm1 p1; Parm2 p2; Parm3 p3; Parm4 p4; Parm5 p5; Parm6 p6; Parm7 p7; Parm8 p8; Parm9 p9; Parm10 p10; Parm11 p11; Parm12 p12; Parm13 p13; Parm14 p14; Parm15 p15; // member functions Key() : count(-1) { } Key(const IdentifierType& id) : count(0) { this->id = id; } Key(const IdentifierType& id, Parm1 &p1) : count(1) { this->id = id; this->p1 = p1; } Key(const IdentifierType& id, Parm1 &p1, Parm2 &p2) : count(2) { this->id = id; this->p1 = p1; this->p2 = p2; } Key(const IdentifierType& id, Parm1 &p1, Parm2 &p2, Parm3 &p3) : count(3) { this->id = id; this->p1 = p1; this->p2 = p2; this->p3 = p3; } Key(const IdentifierType& id, Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4) : count(4) { this->id = id; this->p1 = p1; this->p2 = p2; this->p3 = p3; this->p4 = p4; } Key(const IdentifierType& id, Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5) : count(5) { this->id = id; this->p1 = p1; this->p2 = p2; this->p3 = p3; this->p4 = p4; this->p5 = p5; } Key(const IdentifierType& id, Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5, Parm6 &p6) : count(6) { this->id = id; this->p1 = p1; this->p2 = p2; this->p3 = p3; this->p4 = p4; this->p5 = p5; this->p6 = p6; } Key(const IdentifierType& id, Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5, Parm6 &p6, Parm7 &p7 ) : count(7) { this->id = id; this->p1 = p1; this->p2 = p2; this->p3 = p3; this->p4 = p4; this->p5 = p5; this->p6 = p6; this->p7 = p7; } Key(const IdentifierType& id, Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5, Parm6 &p6, Parm7 &p7, Parm8 &p8) : count(8) { this->id = id; this->p1 = p1; this->p2 = p2; this->p3 = p3; this->p4 = p4; this->p5 = p5; this->p6 = p6; this->p7 = p7; this->p8 = p8; } Key(const IdentifierType& id, Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5, Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9) : count(9) { this->id = id; this->p1 = p1; this->p2 = p2; this->p3 = p3; this->p4 = p4; this->p5 = p5; this->p6 = p6; this->p7 = p7; this->p8 = p8; this->p9 = p9; } Key(const IdentifierType& id, Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5, Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9,Parm10 &p10) : count(10) { this->id = id; this->p1 = p1; this->p2 = p2; this->p3 = p3; this->p4 = p4; this->p5 = p5; this->p6 = p6; this->p7 = p7; this->p8 = p8; this->p9 = p9; this->p10 = p10; } Key(const IdentifierType& id, Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5, Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9, Parm10 &p10, Parm11 &p11) : count(11) { this->id = id; this->p1 = p1; this->p2 = p2; this->p3 = p3; this->p4 = p4; this->p5 = p5; this->p6 = p6; this->p7 = p7; this->p8 = p8; this->p9 = p9; this->p10 = p10; this->p11 = p11; } Key(const IdentifierType& id, Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5, Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9, Parm10 &p10, Parm11 &p11, Parm12 &p12) : count(12) { this->id = id; this->p1 = p1; this->p2 = p2; this->p3 = p3; this->p4 = p4; this->p5 = p5; this->p6 = p6; this->p7 = p7; this->p8 = p8; this->p9 = p9; this->p10 = p10; this->p11 = p11; this->p12 = p12; } Key(const IdentifierType& id, Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5, Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9, Parm10 &p10, Parm11 &p11, Parm12 &p12, Parm13 &p13) : count(13) { this->id = id; this->p1 = p1; this->p2 = p2; this->p3 = p3; this->p4 = p4; this->p5 = p5; this->p6 = p6; this->p7 = p7; this->p8 = p8; this->p9 = p9; this->p10 = p10; this->p11 = p11; this->p12 = p12; this->p13 = p13; } Key(const IdentifierType& id, Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5, Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9, Parm10 &p10, Parm11 &p11, Parm12 &p12, Parm13 &p13, Parm14 &p14) : count(14) { this->id = id; this->p1 = p1; this->p2 = p2; this->p3 = p3; this->p4 = p4; this->p5 = p5; this->p6 = p6; this->p7 = p7; this->p8 = p8; this->p9 = p9; this->p10 = p10; this->p11 = p11; this->p12 = p12; this->p13 = p13; this->p14 = p14; } Key(const IdentifierType& id, Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5, Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9, Parm10 &p10, Parm11 &p11, Parm12 &p12, Parm13 &p13, Parm14 &p14, Parm15 &p15) : count(15) { this->id = id; this->p1 = p1; this->p2 = p2; this->p3 = p3; this->p4 = p4; this->p5 = p5; this->p6 = p6; this->p7 = p7; this->p8 = p8; this->p9 = p9; this->p10 = p10; this->p11 = p11; this->p12 = p12; this->p13 = p13; this->p14 = p14; this->p15 = p15; } template friend bool operator==(const Key &k1, const Key &k2); template friend bool operator<(const Key &k1, const Key &k2); }; template bool operator==(const Key &k1, const Key &k2) { if( k1.count != k2.count ) return false; switch(k1.count){ case -1: return true; case 0: if( k1.id == k2.id ) return true; else return false; case 1: if( (k1.id == k2.id) && (k1.p1 == k2.p1) ) return true; else return false; case 2: if( (k1.id == k2.id) && (k1.p1 == k2.p1) && (k1.p2 == k2.p2) ) return true; else return false; case 3: if( (k1.id == k2.id) && (k1.p1 == k2.p1) && (k1.p2 == k2.p2) && (k1.p3 == k2.p3) ) return true; else return false; case 4: if( (k1.id == k2.id) && (k1.p1 == k2.p1) && (k1.p2 == k2.p2) && (k1.p3 == k2.p3) && (k1.p4 == k2.p4) ) return true; else return false; case 5: if( (k1.id == k2.id) && (k1.p1 == k2.p1) && (k1.p2 == k2.p2) && (k1.p3 == k2.p3) && (k1.p4 == k2.p4) && (k1.p5 == k2.p5) ) return true; else return false; case 6: if( (k1.id == k2.id) && (k1.p1 == k2.p1) && (k1.p2 == k2.p2) && (k1.p3 == k2.p3) && (k1.p4 == k2.p4) && (k1.p5 == k2.p5) && (k1.p6 == k2.p6) ) return true; else return false; case 7: if( (k1.id == k2.id) && (k1.p1 == k2.p1) && (k1.p2 == k2.p2) && (k1.p3 == k2.p3) && (k1.p4 == k2.p4) && (k1.p5 == k2.p5) && (k1.p6 == k2.p6) && (k1.p7 == k2.p7) ) return true; else return false; case 8: if( (k1.id == k2.id) && (k1.p1 == k2.p1) && (k1.p2 == k2.p2) && (k1.p3 == k2.p3) && (k1.p4 == k2.p4) && (k1.p5 == k2.p5) && (k1.p6 == k2.p6) && (k1.p7 == k2.p7) && (k1.p8 == k2.p8) ) return true; else return false; case 9: if( (k1.id == k2.id) && (k1.p1 == k2.p1) && (k1.p2 == k2.p2) && (k1.p3 == k2.p3) && (k1.p4 == k2.p4) && (k1.p5 == k2.p5) && (k1.p6 == k2.p6) && (k1.p7 == k2.p7) && (k1.p8 == k2.p8) && (k1.p9 == k2.p9) ) return true; else return false; case 10: if( (k1.id == k2.id) && (k1.p1 == k2.p1) && (k1.p2 == k2.p2) && (k1.p3 == k2.p3) && (k1.p4 == k2.p4) && (k1.p5 == k2.p5) && (k1.p6 == k2.p6) && (k1.p7 == k2.p7) && (k1.p8 == k2.p8) && (k1.p9 == k2.p9) && (k1.p10 == k2.p10) ) return true; else return false; case 11: if( (k1.id == k2.id) && (k1.p1 == k2.p1) && (k1.p2 == k2.p2) && (k1.p3 == k2.p3) && (k1.p4 == k2.p4) && (k1.p5 == k2.p5) && (k1.p6 == k2.p6) && (k1.p7 == k2.p7) && (k1.p8 == k2.p8) && (k1.p9 == k2.p9) && (k1.p10 == k2.p10) && (k1.p11 == k2.p11) ) return true; else return false; case 12: if( (k1.id == k2.id) && (k1.p1 == k2.p1) && (k1.p2 == k2.p2) && (k1.p3 == k2.p3) && (k1.p4 == k2.p4) && (k1.p5 == k2.p5) && (k1.p6 == k2.p6) && (k1.p7 == k2.p7) && (k1.p8 == k2.p8) && (k1.p9 == k2.p9) && (k1.p10 == k2.p10) && (k1.p11 == k2.p11) && (k1.p12 == k2.p12) ) return true; else return false; case 13: if( (k1.id == k2.id) && (k1.p1 == k2.p1) && (k1.p2 == k2.p2) && (k1.p3 == k2.p3) && (k1.p4 == k2.p4) && (k1.p5 == k2.p5) && (k1.p6 == k2.p6) && (k1.p7 == k2.p7) && (k1.p8 == k2.p8) && (k1.p9 == k2.p9) && (k1.p10 == k2.p10) && (k1.p11 == k2.p11) && (k1.p12 == k2.p12) && (k1.p13 == k2.p13) ) return true; else return false; case 14: if( (k1.id == k2.id) && (k1.p1 == k2.p1) && (k1.p2 == k2.p2) && (k1.p3 == k2.p3) && (k1.p4 == k2.p4) && (k1.p5 == k2.p5) && (k1.p6 == k2.p6) && (k1.p7 == k2.p7) && (k1.p8 == k2.p8) && (k1.p9 == k2.p9) && (k1.p10 == k2.p10) && (k1.p11 == k2.p11) && (k1.p12 == k2.p12) && (k1.p13 == k2.p13) && (k1.p14 == k2.p14) ) return true; else return false; case 15: if( (k1.id == k2.id) && (k1.p1 == k2.p1) && (k1.p2 == k2.p2) && (k1.p3 == k2.p3) && (k1.p4 == k2.p4) && (k1.p5 == k2.p5) && (k1.p6 == k2.p6) && (k1.p7 == k2.p7) && (k1.p8 == k2.p8) && (k1.p9 == k2.p9) && (k1.p10 == k2.p10) && (k1.p11 == k2.p11) && (k1.p12 == k2.p12) && (k1.p13 == k2.p13) && (k1.p14 == k2.p14) && (k1.p15 == k2.p15) ) return true; else return false; default: return false; } } template bool operator<(const Key &k1, const Key &k2) { if( k1.count < k2.count ) return true; switch(k1.count){ case -1: return false; case 0: if( k1.id < k2.id ) return true; else return false; case 1: if( (k1.id < k2.id) || (k1.p1 < k2.p1) ) return true; else return false; case 2: if( (k1.id < k2.id) || (k1.p1 < k2.p1) || (k1.p2 < k2.p2) ) return true; else return false; case 3: if( (k1.id < k2.id) || (k1.p1 < k2.p1) || (k1.p2 < k2.p2) || (k1.p3 < k2.p3) ) return true; else return false; case 4: if( (k1.id < k2.id) || (k1.p1 < k2.p1) || (k1.p2 < k2.p2) || (k1.p3 < k2.p3) || (k1.p4 < k2.p4) ) return true; else return false; case 5: if( (k1.id < k2.id) || (k1.p1 < k2.p1) || (k1.p2 < k2.p2) || (k1.p3 < k2.p3) || (k1.p4 < k2.p4) || (k1.p5 < k2.p5) ) return true; else return false; case 6: if( (k1.id < k2.id) || (k1.p1 < k2.p1) || (k1.p2 < k2.p2) || (k1.p3 < k2.p3) || (k1.p4 < k2.p4) || (k1.p5 < k2.p5) || (k1.p6 < k2.p6) ) return true; else return false; case 7: if( (k1.id < k2.id) || (k1.p1 < k2.p1) || (k1.p2 < k2.p2) || (k1.p3 < k2.p3) || (k1.p4 < k2.p4) || (k1.p5 < k2.p5) || (k1.p6 < k2.p6) || (k1.p7 < k2.p7) ) return true; else return false; case 8: if( (k1.id < k2.id) || (k1.p1 < k2.p1) || (k1.p2 < k2.p2) || (k1.p3 < k2.p3) || (k1.p4 < k2.p4) || (k1.p5 < k2.p5) || (k1.p6 < k2.p6) || (k1.p7 < k2.p7) || (k1.p8 < k2.p8) ) return true; else return false; case 9: if( (k1.id < k2.id) || (k1.p1 < k2.p1) || (k1.p2 < k2.p2) || (k1.p3 < k2.p3) || (k1.p4 < k2.p4) || (k1.p5 < k2.p5) || (k1.p6 < k2.p6) || (k1.p7 < k2.p7) || (k1.p8 < k2.p8) || (k1.p9 < k2.p9) ) return true; else return false; case 10: if( (k1.id < k2.id) || (k1.p1 < k2.p1) || (k1.p2 < k2.p2) || (k1.p3 < k2.p3) || (k1.p4 < k2.p4) || (k1.p5 < k2.p5) || (k1.p6 < k2.p6) || (k1.p7 < k2.p7) || (k1.p8 < k2.p8) || (k1.p9 < k2.p9) || (k1.p10 < k2.p10) ) return true; else return false; case 11: if( (k1.id < k2.id) || (k1.p1 < k2.p1) || (k1.p2 < k2.p2) || (k1.p3 < k2.p3) || (k1.p4 < k2.p4) || (k1.p5 < k2.p5) || (k1.p6 < k2.p6) || (k1.p7 < k2.p7) || (k1.p8 < k2.p8) || (k1.p9 < k2.p9) || (k1.p10 < k2.p10) || (k1.p11 < k2.p11) ) return true; else return false; case 12: if( (k1.id < k2.id) || (k1.p1 < k2.p1) || (k1.p2 < k2.p2) || (k1.p3 < k2.p3) || (k1.p4 < k2.p4) || (k1.p5 < k2.p5) || (k1.p6 < k2.p6) || (k1.p7 < k2.p7) || (k1.p8 < k2.p8) || (k1.p9 < k2.p9) || (k1.p10 < k2.p10) || (k1.p11 < k2.p11) || (k1.p12 < k2.p12) ) return true; else return false; case 13: if( (k1.id < k2.id) || (k1.p1 < k2.p1) || (k1.p2 < k2.p2) || (k1.p3 < k2.p3) || (k1.p4 < k2.p4) || (k1.p5 < k2.p5) || (k1.p6 < k2.p6) || (k1.p7 < k2.p7) || (k1.p8 < k2.p8) || (k1.p9 < k2.p9) || (k1.p10 < k2.p10) || (k1.p11 < k2.p11) || (k1.p12 < k2.p12) || (k1.p13 < k2.p13) ) return true; else return false; case 14: if( (k1.id < k2.id) || (k1.p1 < k2.p1) || (k1.p2 < k2.p2) || (k1.p3 < k2.p3) || (k1.p4 < k2.p4) || (k1.p5 < k2.p5) || (k1.p6 < k2.p6) || (k1.p7 < k2.p7) || (k1.p8 < k2.p8) || (k1.p9 < k2.p9) || (k1.p10 < k2.p10) || (k1.p11 < k2.p11) || (k1.p12 < k2.p12) || (k1.p13 < k2.p13) || (k1.p14 < k2.p14) ) return true; else return false; case 15: if( (k1.id < k2.id) || (k1.p1 < k2.p1) || (k1.p2 < k2.p2) || (k1.p3 < k2.p3) || (k1.p4 < k2.p4) || (k1.p5 < k2.p5) || (k1.p6 < k2.p6) || (k1.p7 < k2.p7) || (k1.p8 < k2.p8) || (k1.p9 < k2.p9) || (k1.p10 < k2.p10) || (k1.p11 < k2.p11) || (k1.p12 < k2.p12) || (k1.p13 < k2.p13) || (k1.p14 < k2.p14) || (k1.p15 < k2.p15) ) return true; else return false; default: return false; } } } // namespace Loki #endif // end file guardian tora-2.1.3/src/loki/include/loki/LockingPtr.h0000644000175000017500000000637611270353521020616 0ustar michaelmichael//////////////////////////////////////////////////////////////////////////////// // The Loki Library // Copyright (c) 2001 by Andrei Alexandrescu // This code is from the article: // "Generic: volatile Multithreaded Programmers Best Friend // Volatile-Correctness or How to Have Your Compiler Detect Race Conditions // for You" by Alexandrescu, Andrei. // Published in the February 2001 issue of the C/C++ Users Journal. // http://www.cuj.com/documents/s=7998/cujcexp1902alexandr/ // Prepared for Loki library by Richard Sposato //////////////////////////////////////////////////////////////////////////////// #ifndef LOKI_LOCKING_PTR_INC_ #define LOKI_LOCKING_PTR_INC_ // $Id: LockingPtr.h 748 2006-10-17 19:49:08Z syntheticpp $ #include namespace Loki { /** @class LockingPtr Locks a volatile object and casts away volatility so that the object can be safely used in a single-threaded region of code. Original version of LockingPtr had only one template - for the shared object, but not the mutex type. This version allows users to specify a the mutex type as a LockingPolicy class. The only requirements for a LockingPolicy class are to provide Lock and Unlock methods. */ template < typename SharedObject, typename LockingPolicy = LOKI_DEFAULT_MUTEX, template class ConstPolicy = LOKI_DEFAULT_CONSTNESS > class LockingPtr { public: typedef typename ConstPolicy::Type ConstOrNotType; /** Constructor locks mutex associated with an object. @param object Reference to object. @param mutex Mutex used to control thread access to object. */ LockingPtr( volatile ConstOrNotType & object, LockingPolicy & mutex ) : pObject_( const_cast< SharedObject * >( &object ) ), pMutex_( &mutex ) { mutex.Lock(); } typedef typename std::pair Pair; /** Constructor locks mutex associated with an object. @param lockpair a std::pair of pointers to the object and the mutex */ LockingPtr( Pair lockpair ) : pObject_( const_cast< SharedObject * >( lockpair.first ) ), pMutex_( lockpair.second ) { lockpair.second->Lock(); } /// Destructor unlocks the mutex. ~LockingPtr() { pMutex_->Unlock(); } /// Star-operator dereferences pointer. ConstOrNotType & operator * () { return *pObject_; } /// Point-operator returns pointer to object. ConstOrNotType * operator -> () { return pObject_; } private: /// Default constructor is not implemented. LockingPtr(); /// Copy-constructor is not implemented. LockingPtr( const LockingPtr & ); /// Copy-assignment-operator is not implemented. LockingPtr & operator = ( const LockingPtr & ); /// Pointer to the shared object. ConstOrNotType * pObject_; /// Pointer to the mutex. LockingPolicy * pMutex_; }; // end class LockingPtr } // namespace Loki #endif // end file guardian tora-2.1.3/src/loki/include/loki/Tuple.h0000644000175000017500000000231311270353521017616 0ustar michaelmichael//////////////////////////////////////////////////////////////////////////////// // The Loki Library // Copyright (c) 2001 by Andrei Alexandrescu // This code accompanies the book: // Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design // Patterns Applied". Copyright (c) 2001. Addison-Wesley. // Permission to use, copy, modify, distribute and sell this software for any // purpose is hereby granted without fee, provided that the above copyright // notice appear in all copies and that both that copyright notice and this // permission notice appear in supporting documentation. // The author or Addison-Wesley Longman make no representations about the // suitability of this software for any purpose. It is provided "as is" // without express or implied warranty. //////////////////////////////////////////////////////////////////////////////// // Last update: June 20, 2001 //////////////////////////////////////////////////////////////////////////////// // This file is intentionally left empty // Due to compiler limitations, its contents has been moved to // HierarchyGenerators.h //////////////////////////////////////////////////////////////////////////////// tora-2.1.3/src/loki/include/loki/TypeTraits.h0000644000175000017500000026773411270353521020661 0ustar michaelmichael//////////////////////////////////////////////////////////////////////////////// // The Loki Library // Copyright (c) 2001 by Andrei Alexandrescu // This code accompanies the book: // Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design // Patterns Applied". Copyright (c) 2001. Addison-Wesley. // Permission to use, copy, modify, distribute and sell this software for any // purpose is hereby granted without fee, provided that the above copyright // notice appear in all copies and that both that copyright notice and this // permission notice appear in supporting documentation. // The author or Addison-Wesley Longman make no representations about the // suitability of this software for any purpose. It is provided "as is" // without express or implied warranty. //////////////////////////////////////////////////////////////////////////////// #ifndef LOKI_TYPETRAITS_INC_ #define LOKI_TYPETRAITS_INC_ // $Id: TypeTraits.h 749 2006-10-17 19:49:26Z syntheticpp $ #include "Typelist.h" #include "Sequence.h" #if (defined _MSC_VER) && (_MSC_VER < 1400) #include #endif #ifdef _MSC_VER #pragma warning( push ) #pragma warning( disable : 4180 ) //qualifier applied to function type has no meaning; ignored #endif namespace Loki { //////////////////////////////////////////////////////////////////////////////// // class template IsCustomUnsignedInt // Offers a means to integrate nonstandard built-in unsigned integral types // (such as unsigned __int64 or unsigned long long int) with the TypeTraits // class template defined below. // Invocation: IsCustomUnsignedInt where T is any type // Defines 'value', an enum that is 1 iff T is a custom built-in unsigned // integral type // Specialize this class template for nonstandard unsigned integral types // and define value = 1 in those specializations //////////////////////////////////////////////////////////////////////////////// template struct IsCustomUnsignedInt { enum { value = 0 }; }; //////////////////////////////////////////////////////////////////////////////// // class template IsCustomSignedInt // Offers a means to integrate nonstandard built-in unsigned integral types // (such as unsigned __int64 or unsigned long long int) with the TypeTraits // class template defined below. // Invocation: IsCustomSignedInt where T is any type // Defines 'value', an enum that is 1 iff T is a custom built-in signed // integral type // Specialize this class template for nonstandard unsigned integral types // and define value = 1 in those specializations //////////////////////////////////////////////////////////////////////////////// template struct IsCustomSignedInt { enum { value = 0 }; }; //////////////////////////////////////////////////////////////////////////////// // class template IsCustomFloat // Offers a means to integrate nonstandard floating point types with the // TypeTraits class template defined below. // Invocation: IsCustomFloat where T is any type // Defines 'value', an enum that is 1 iff T is a custom built-in // floating point type // Specialize this class template for nonstandard unsigned integral types // and define value = 1 in those specializations //////////////////////////////////////////////////////////////////////////////// template struct IsCustomFloat { enum { value = 0 }; }; //////////////////////////////////////////////////////////////////////////////// // Helper types for class template TypeTraits defined below //////////////////////////////////////////////////////////////////////////////// namespace Private { #ifndef LOKI_DISABLE_TYPELIST_MACROS typedef LOKI_TYPELIST_4(unsigned char, unsigned short int,unsigned int, unsigned long int) StdUnsignedInts; typedef LOKI_TYPELIST_4(signed char, short int,int, long int) StdSignedInts; typedef LOKI_TYPELIST_3(bool, char, wchar_t) StdOtherInts; typedef LOKI_TYPELIST_3(float, double, long double) StdFloats; #else typedef Loki::Seq::Type StdUnsignedInts; typedef Loki::Seq::Type StdSignedInts; typedef Loki::Seq::Type StdOtherInts; typedef Loki::Seq::Type StdFloats; #endif template struct AddPointer { typedef U* Result; }; template struct AddPointer { typedef U* Result; }; template struct AddReference { typedef U & Result; }; template struct AddReference { typedef U & Result; }; template <> struct AddReference { typedef NullType Result; }; template struct AddParameterType { typedef const U & Result; }; template struct AddParameterType { typedef U & Result; }; template <> struct AddParameterType { typedef NullType Result; }; template struct IsFunctionPointerRaw {enum{result = 0};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum{result = 0};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; // Const versions template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; // Volatile versions template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; // Const volatile versions template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; template struct IsMemberFunctionPointerRaw {enum {result = 1};}; }// namespace Private //////////////////////////////////////////////////////////////////////////////// // class template TypeTraits // // Figures out at compile time various properties of any given type // Invocations (T is a type, TypeTraits::Propertie): // // - isPointer : returns true if T is a pointer type // - PointeeType : returns the type to which T points if T is a pointer // type, NullType otherwise // - isReference : returns true if T is a reference type // - ReferredType : returns the type to which T refers if T is a reference // type, NullType otherwise // - isMemberPointer : returns true if T is a pointer to member type // - isStdUnsignedInt: returns true if T is a standard unsigned integral type // - isStdSignedInt : returns true if T is a standard signed integral type // - isStdIntegral : returns true if T is a standard integral type // - isStdFloat : returns true if T is a standard floating-point type // - isStdArith : returns true if T is a standard arithmetic type // - isStdFundamental: returns true if T is a standard fundamental type // - isUnsignedInt : returns true if T is a unsigned integral type // - isSignedInt : returns true if T is a signed integral type // - isIntegral : returns true if T is a integral type // - isFloat : returns true if T is a floating-point type // - isArith : returns true if T is a arithmetic type // - isFundamental : returns true if T is a fundamental type // - ParameterType : returns the optimal type to be used as a parameter for // functions that take Ts // - isConst : returns true if T is a const-qualified type // - NonConstType : Type with removed 'const' qualifier from T, if any // - isVolatile : returns true if T is a volatile-qualified type // - NonVolatileType : Type with removed 'volatile' qualifier from T, if any // - UnqualifiedType : Type with removed 'const' and 'volatile' qualifiers from // T, if any // - ConstParameterType: returns the optimal type to be used as a parameter // for functions that take 'const T's // //////////////////////////////////////////////////////////////////////////////// template class TypeTraits { private: template struct ReferenceTraits { enum { result = false }; typedef U ReferredType; }; template struct ReferenceTraits { enum { result = true }; typedef U ReferredType; }; template struct PointerTraits { enum { result = false }; typedef NullType PointeeType; }; template struct PointerTraits { enum { result = true }; typedef U PointeeType; }; template struct PointerTraits { enum { result = true }; typedef U PointeeType; }; template struct PToMTraits { enum { result = false }; }; template struct PToMTraits { enum { result = true }; }; template struct PToMTraits { enum { result = true }; }; template struct FunctionPointerTraits { enum{ result = Private::IsFunctionPointerRaw::result }; }; template struct PToMFunctionTraits { enum{ result = Private::IsMemberFunctionPointerRaw::result }; }; template struct UnConst { typedef U Result; enum { isConst = 0 }; }; template struct UnConst { typedef U Result; enum { isConst = 1 }; }; template struct UnConst { typedef U& Result; enum { isConst = 1 }; }; template struct UnVolatile { typedef U Result; enum { isVolatile = 0 }; }; template struct UnVolatile { typedef U Result; enum { isVolatile = 1 }; }; template struct UnVolatile { typedef U& Result; enum { isVolatile = 1 }; }; public: typedef typename UnConst::Result NonConstType; typedef typename UnVolatile::Result NonVolatileType; typedef typename UnVolatile::Result>::Result UnqualifiedType; typedef typename PointerTraits::PointeeType PointeeType; typedef typename ReferenceTraits::ReferredType ReferredType; enum { isConst = UnConst::isConst }; enum { isVolatile = UnVolatile::isVolatile }; enum { isReference = ReferenceTraits::result }; enum { isFunction = FunctionPointerTraits::Result >::result }; enum { isFunctionPointer= FunctionPointerTraits< typename ReferenceTraits::ReferredType >::result }; enum { isMemberFunctionPointer= PToMFunctionTraits< typename ReferenceTraits::ReferredType >::result }; enum { isMemberPointer = PToMTraits< typename ReferenceTraits::ReferredType >::result || isMemberFunctionPointer }; enum { isPointer = PointerTraits< typename ReferenceTraits::ReferredType >::result || isFunctionPointer }; enum { isStdUnsignedInt = TL::IndexOf::value >= 0 || TL::IndexOf::ReferredType>::value >= 0}; enum { isStdSignedInt = TL::IndexOf::value >= 0 || TL::IndexOf::ReferredType>::value >= 0}; enum { isStdIntegral = isStdUnsignedInt || isStdSignedInt || TL::IndexOf::value >= 0 || TL::IndexOf::ReferredType>::value >= 0}; enum { isStdFloat = TL::IndexOf::value >= 0 || TL::IndexOf::ReferredType>::value >= 0}; enum { isStdArith = isStdIntegral || isStdFloat }; enum { isStdFundamental = isStdArith || isStdFloat || Conversion::sameType }; enum { isUnsignedInt = isStdUnsignedInt || IsCustomUnsignedInt::value }; enum { isSignedInt = isStdSignedInt || IsCustomSignedInt::value }; enum { isIntegral = isStdIntegral || isUnsignedInt || isSignedInt }; enum { isFloat = isStdFloat || IsCustomFloat::value }; enum { isArith = isIntegral || isFloat }; enum { isFundamental = isStdFundamental || isArith }; typedef typename Select::Result>::Result ParameterType; }; } #ifdef _MSC_VER #pragma warning( pop ) #endif // _MSC_VER #endif // end file guardian tora-2.1.3/src/loki/include/loki/Threads.h0000644000175000017500000003174211270353521020127 0ustar michaelmichael//////////////////////////////////////////////////////////////////////////////// // The Loki Library // Copyright (c) 2001 by Andrei Alexandrescu // This code accompanies the book: // Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design // Patterns Applied". Copyright (c) 2001. Addison-Wesley. // Permission to use, copy, modify, distribute and sell this software for any // purpose is hereby granted without fee, provided that the above copyright // notice appear in all copies and that both that copyright notice and this // permission notice appear in supporting documentation. // The author or Addison-Wesley Longman make no representations about the // suitability of this software for any purpose. It is provided "as is" // without express or implied warranty. //////////////////////////////////////////////////////////////////////////////// #ifndef LOKI_THREADS_INC_ #define LOKI_THREADS_INC_ // $Id: Threads.h 749 2006-10-17 19:49:26Z syntheticpp $ /// @defgroup ThreadingGroup Threading /// Policies to for the threading model: /// /// - SingleThreaded /// - ObjectLevelLockable /// - ClassLevelLockable /// /// All classes in Loki have configurable threading model. /// /// The macro LOKI_DEFAULT_THREADING selects the default /// threading model for certain components of Loki /// (it affects only default template arguments) /// /// \par Usage: /// /// To use a specific threading model define /// /// - nothing, single-theading is default /// - LOKI_OBJECT_LEVEL_THREADING for object-level-threading /// - LOKI_CLASS_LEVEL_THREADING for class-level-threading /// /// \par Supported platfroms: /// /// - Windows (windows.h) /// - POSIX (pthread.h): /// No recursive mutex support with pthread. /// This means: calling Lock() on a Loki::Mutex twice from the /// same thread before unlocking the mutex deadlocks the system. /// To avoid this redesign your synchronization. See also: /// http://sourceforge.net/tracker/index.php?func=detail&aid=1516182&group_id=29557&atid=396647 #include #if defined(LOKI_CLASS_LEVEL_THREADING) || defined(LOKI_OBJECT_LEVEL_THREADING) #define LOKI_DEFAULT_THREADING_NO_OBJ_LEVEL ::Loki::ClassLevelLockable #if defined(LOKI_CLASS_LEVEL_THREADING) && !defined(LOKI_OBJECT_LEVEL_THREADING) #define LOKI_DEFAULT_THREADING ::Loki::ClassLevelLockable #else #define LOKI_DEFAULT_THREADING ::Loki::ObjectLevelLockable #endif #if defined(_WIN32) || defined(_WIN64) #include #define LOKI_WINDOWS_H #else #include #define LOKI_PTHREAD_H #endif #else #define LOKI_DEFAULT_THREADING ::Loki::SingleThreaded #define LOKI_DEFAULT_THREADING_NO_OBJ_LEVEL ::Loki::SingleThreaded #endif #ifndef LOKI_DEFAULT_MUTEX #define LOKI_DEFAULT_MUTEX ::Loki::Mutex #endif #ifdef LOKI_WINDOWS_H #define LOKI_THREADS_MUTEX(x) CRITICAL_SECTION (x); #define LOKI_THREADS_MUTEX_INIT(x) ::InitializeCriticalSection (x) #define LOKI_THREADS_MUTEX_DELETE(x) ::DeleteCriticalSection (x) #define LOKI_THREADS_MUTEX_LOCK(x) ::EnterCriticalSection (x) #define LOKI_THREADS_MUTEX_UNLOCK(x) ::LeaveCriticalSection (x) #define LOKI_THREADS_LONG LONG #define LOKI_THREADS_ATOMIC_FUNCTIONS \ static IntType AtomicIncrement(volatile IntType& lval) \ { return InterlockedIncrement(&const_cast(lval)); } \ \ static IntType AtomicDecrement(volatile IntType& lval) \ { return InterlockedDecrement(&const_cast(lval)); } \ \ static void AtomicAssign(volatile IntType& lval, IntType val) \ { InterlockedExchange(&const_cast(lval), val); } \ \ static void AtomicAssign(IntType& lval, volatile IntType& val) \ { InterlockedExchange(&lval, val); } #elif defined(LOKI_PTHREAD_H) #define LOKI_THREADS_MUTEX(x) pthread_mutex_t (x); // no recursive mutex support #define LOKI_THREADS_MUTEX_INIT(x) ::pthread_mutex_init(x, 0) #define LOKI_THREADS_MUTEX_DELETE(x) ::pthread_mutex_destroy (x) #define LOKI_THREADS_MUTEX_LOCK(x) ::pthread_mutex_lock (x) #define LOKI_THREADS_MUTEX_UNLOCK(x) ::pthread_mutex_unlock (x) #define LOKI_THREADS_LONG long #define LOKI_THREADS_ATOMIC(x) \ pthread_mutex_lock(&atomic_mutex_); \ x; \ pthread_mutex_unlock(&atomic_mutex_) #define LOKI_THREADS_ATOMIC_FUNCTIONS \ private: \ static pthread_mutex_t atomic_mutex_; \ public: \ static IntType AtomicIncrement(volatile IntType& lval) \ { LOKI_THREADS_ATOMIC( lval++ ); return lval; } \ \ static IntType AtomicDecrement(volatile IntType& lval) \ { LOKI_THREADS_ATOMIC(lval-- ); return lval; } \ \ static void AtomicAssign(volatile IntType& lval, IntType val) \ { LOKI_THREADS_ATOMIC( lval = val ); } \ \ static void AtomicAssign(IntType& lval, volatile IntType& val) \ { LOKI_THREADS_ATOMIC( lval = val ); } #else // single threaded #define LOKI_THREADS_MUTEX(x) #define LOKI_THREADS_MUTEX_INIT(x) #define LOKI_THREADS_MUTEX_DELETE(x) #define LOKI_THREADS_MUTEX_LOCK(x) #define LOKI_THREADS_MUTEX_UNLOCK(x) #define LOKI_THREADS_LONG #endif namespace Loki { //////////////////////////////////////////////////////////////////////////////// /// \class Mutex // /// \ingroup ThreadingGroup /// A simple and portable Mutex. A default policy class for locking objects. //////////////////////////////////////////////////////////////////////////////// class Mutex { public: Mutex() { LOKI_THREADS_MUTEX_INIT(&mtx_); } ~Mutex() { LOKI_THREADS_MUTEX_DELETE(&mtx_); } void Lock() { LOKI_THREADS_MUTEX_LOCK(&mtx_); } void Unlock() { LOKI_THREADS_MUTEX_UNLOCK(&mtx_); } private: /// Copy-constructor not implemented. Mutex(const Mutex &); /// Copy-assignement operator not implemented. Mutex & operator = (const Mutex &); LOKI_THREADS_MUTEX(mtx_) }; //////////////////////////////////////////////////////////////////////////////// /// \class SingleThreaded /// /// \ingroup ThreadingGroup /// Implementation of the ThreadingModel policy used by various classes /// Implements a single-threaded model; no synchronization //////////////////////////////////////////////////////////////////////////////// template class SingleThreaded { public: /// \struct Lock /// Dummy Lock class struct Lock { Lock() {} explicit Lock(const SingleThreaded&) {} explicit Lock(const SingleThreaded*) {} }; typedef Host VolatileType; typedef int IntType; static IntType AtomicAdd(volatile IntType& lval, IntType val) { return lval += val; } static IntType AtomicSubtract(volatile IntType& lval, IntType val) { return lval -= val; } static IntType AtomicMultiply(volatile IntType& lval, IntType val) { return lval *= val; } static IntType AtomicDivide(volatile IntType& lval, IntType val) { return lval /= val; } static IntType AtomicIncrement(volatile IntType& lval) { return ++lval; } static IntType AtomicDecrement(volatile IntType& lval) { return --lval; } static void AtomicAssign(volatile IntType & lval, IntType val) { lval = val; } static void AtomicAssign(IntType & lval, volatile IntType & val) { lval = val; } }; #if defined(LOKI_WINDOWS_H) || defined(LOKI_PTHREAD_H) //////////////////////////////////////////////////////////////////////////////// /// \class ObjectLevelLockable /// /// \ingroup ThreadingGroup /// Implementation of the ThreadingModel policy used by various classes /// Implements a object-level locking scheme //////////////////////////////////////////////////////////////////////////////// template < class Host, class MutexPolicy = LOKI_DEFAULT_MUTEX > class ObjectLevelLockable { mutable MutexPolicy mtx_; public: ObjectLevelLockable() : mtx_() {} ObjectLevelLockable(const ObjectLevelLockable&) : mtx_() {} ~ObjectLevelLockable() {} class Lock; friend class Lock; /// \struct Lock /// Lock class to lock on object level class Lock { public: /// Lock object explicit Lock(const ObjectLevelLockable& host) : host_(host) { host_.mtx_.Lock(); } /// Lock object explicit Lock(const ObjectLevelLockable* host) : host_(*host) { host_.mtx_.Lock(); } /// Unlock object ~Lock() { host_.mtx_.Unlock(); } private: /// private by design of the object level threading Lock(); Lock(const Lock&); Lock& operator=(const Lock&); const ObjectLevelLockable& host_; }; typedef volatile Host VolatileType; typedef LOKI_THREADS_LONG IntType; LOKI_THREADS_ATOMIC_FUNCTIONS }; #ifdef LOKI_PTHREAD_H template pthread_mutex_t ObjectLevelLockable::atomic_mutex_ = PTHREAD_MUTEX_INITIALIZER; #endif //////////////////////////////////////////////////////////////////////////////// /// \class ClassLevelLockable /// /// \ingroup ThreadingGroup /// Implementation of the ThreadingModel policy used by various classes /// Implements a class-level locking scheme //////////////////////////////////////////////////////////////////////////////// template class ClassLevelLockable { struct Initializer { bool init_; MutexPolicy mtx_; Initializer() : init_(false), mtx_() { init_ = true; } ~Initializer() { assert(init_); } }; static Initializer initializer_; public: class Lock; friend class Lock; /// \struct Lock /// Lock class to lock on class level class Lock { public: /// Lock class Lock() { assert(initializer_.init_); initializer_.mtx_.Lock(); } /// Lock class explicit Lock(const ClassLevelLockable&) { assert(initializer_.init_); initializer_.mtx_.Lock(); } /// Lock class explicit Lock(const ClassLevelLockable*) { assert(initializer_.init_); initializer_.mtx_.Lock(); } /// Unlock class ~Lock() { assert(initializer_.init_); initializer_.mtx_.Unlock(); } private: Lock(const Lock&); Lock& operator=(const Lock&); }; typedef volatile Host VolatileType; typedef LOKI_THREADS_LONG IntType; LOKI_THREADS_ATOMIC_FUNCTIONS }; #ifdef LOKI_PTHREAD_H template pthread_mutex_t ClassLevelLockable::atomic_mutex_ = PTHREAD_MUTEX_INITIALIZER; #endif template < class Host, class MutexPolicy > typename ClassLevelLockable< Host, MutexPolicy >::Initializer ClassLevelLockable< Host, MutexPolicy >::initializer_; #endif // #if defined(LOKI_WINDOWS_H) || defined(LOKI_PTHREAD_H) } // namespace Loki #endif // end file guardian tora-2.1.3/src/loki/include/loki/DataGenerators.h0000644000175000017500000000605111270353521021433 0ustar michaelmichael//////////////////////////////////////////////////////////////////////////////// // The Loki Library // Data Generator by Shannon Barber // This code DOES NOT accompany the book: // Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design // Patterns Applied". Copyright (c) 2001. Addison-Wesley. // // Code covered by the MIT License // The author makes no representations about the suitability of this software // for any purpose. It is provided "as is" without express or implied warranty. //////////////////////////////////////////////////////////////////////////////// #ifndef LOKI_DATAGENERATORS_INC_ #define LOKI_DATAGENERATORS_INC_ // $Id: DataGenerators.h 751 2006-10-17 19:50:37Z syntheticpp $ #include "Typelist.h" //Reference version /************************************************************************************ // class template GenData // Iteratates a Typelist, and invokes the functor GenFunc // for each type in the list, passing a functor along the way. // The functor is designed to be an insertion iterator which GenFunc // can use to output information about the types in the list. // Example Use template struct ExtractDataType { some_type operator()() { return create_value_from_type; } }; Loki::IterateTypes gendata; std::vector stuff; gendata(std::back_inserter(stuff)); *******************************************************************************/ namespace Loki { namespace TL { template struct nameof_type { const char* operator()() { return typeid(T).name(); } }; template struct sizeof_type { size_t operator()() { return sizeof(T); } }; template class GenFunc> struct IterateTypes; template class GenFunc> struct IterateTypes, GenFunc> { typedef IterateTypes head_t; head_t head; typedef IterateTypes tail_t; tail_t tail; template void operator()(II ii) { head.operator()(ii); tail.operator()(ii); } }; template class GenFunc> struct IterateTypes { template void operator()(II ii) { GenFunc genfunc; *ii = genfunc(); ++ii; //Is this even needed? } }; template