diff --git a/CMakeExternals/CTK.cmake b/CMakeExternals/CTK.cmake index a336addd86..9c88b19498 100644 --- a/CMakeExternals/CTK.cmake +++ b/CMakeExternals/CTK.cmake @@ -1,93 +1,94 @@ #----------------------------------------------------------------------------- # CTK #----------------------------------------------------------------------------- if(MITK_USE_CTK) # Sanity checks if(DEFINED CTK_DIR AND NOT EXISTS ${CTK_DIR}) message(FATAL_ERROR "CTK_DIR variable is defined but corresponds to non-existing directory") endif() set(proj CTK) set(proj_DEPENDENCIES ) set(CTK_DEPENDS ${proj}) if(NOT DEFINED CTK_DIR) - set(revision_tag b6e95196) + set(revision_tag 4cfeaaf7) #IF(${proj}_REVISION_TAG) # SET(revision_tag ${${proj}_REVISION_TAG}) #ENDIF() set(ctk_optional_cache_args ) if(MITK_USE_Python) list(APPEND ctk_optional_cache_args -DCTK_LIB_Scripting/Python/Widgets:BOOL=ON -DCTK_ENABLE_Python_Wrapping:BOOL=ON -DCTK_APP_ctkSimplePythonShell:BOOL=ON -DPYTHON_EXECUTABLE:FILEPATH=${PYTHON_EXECUTABLE} -DPYTHON_INCLUDE_DIR:PATH=${PYTHON_INCLUDE_DIR} -DPYTHON_INCLUDE_DIR2:PATH=${PYTHON_INCLUDE_DIR2} -DPYTHON_LIBRARY:FILEPATH=${PYTHON_LIBRARY} ) else() list(APPEND ctk_optional_cache_args -DCTK_LIB_Scripting/Python/Widgets:BOOL=OFF -DCTK_ENABLE_Python_Wrapping:BOOL=OFF -DCTK_APP_ctkSimplePythonShell:BOOL=OFF ) endif() if(MITK_USE_DCMTK) list(APPEND ctk_optional_cache_args -DDCMTK_DIR:PATH=${DCMTK_DIR} ) list(APPEND proj_DEPENDENCIES DCMTK) else() list(APPEND ctk_optional_cache_args -DDCMTK_URL:STRING=${MITK_THIRDPARTY_DOWNLOAD_PREFIX_URL}/CTK_DCMTK_085525e6.tar.gz ) endif() FOREACH(type RUNTIME ARCHIVE LIBRARY) IF(DEFINED CTK_PLUGIN_${type}_OUTPUT_DIRECTORY) LIST(APPEND mitk_optional_cache_args -DCTK_PLUGIN_${type}_OUTPUT_DIRECTORY:PATH=${CTK_PLUGIN_${type}_OUTPUT_DIRECTORY}) ENDIF() ENDFOREACH() ExternalProject_Add(${proj} SOURCE_DIR ${CMAKE_BINARY_DIR}/${proj}-src BINARY_DIR ${proj}-build PREFIX ${proj}-cmake URL ${MITK_THIRDPARTY_DOWNLOAD_PREFIX_URL}/CTK_${revision_tag}.tar.gz - URL_MD5 89a9d356a78c463a818680648443465f + URL_MD5 23889893185726547ad1273dc8b63a46 UPDATE_COMMAND "" INSTALL_COMMAND "" CMAKE_GENERATOR ${gen} CMAKE_ARGS ${ep_common_args} ${ctk_optional_cache_args} -DDESIRED_QT_VERSION:STRING=${DESIRED_QT_VERSION} -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE} -DGit_EXECUTABLE:FILEPATH=${GIT_EXECUTABLE} -DGIT_EXECUTABLE:FILEPATH=${GIT_EXECUTABLE} -DCTK_LIB_CommandLineModules/Backend/LocalProcess:BOOL=ON -DCTK_LIB_CommandLineModules/Frontend/QtGui:BOOL=ON -DCTK_LIB_PluginFramework:BOOL=ON -DCTK_LIB_DICOM/Widgets:BOOL=ON + -DCTK_LIB_XNAT/Core:BOOL=ON -DCTK_PLUGIN_org.commontk.eventadmin:BOOL=ON -DCTK_PLUGIN_org.commontk.configadmin:BOOL=ON -DCTK_USE_GIT_PROTOCOL:BOOL=OFF -DDCMTK_URL:STRING=${MITK_THIRDPARTY_DOWNLOAD_PREFIX_URL}/CTK_DCMTK_085525e6.tar.gz DEPENDS ${proj_DEPENDENCIES} ) set(CTK_DIR ${CMAKE_CURRENT_BINARY_DIR}/${proj}-build) else() mitkMacroEmptyExternalProject(${proj} "${proj_DEPENDENCIES}") endif() endif() diff --git a/Plugins/PluginList.cmake b/Plugins/PluginList.cmake index be564e382b..c743fd065d 100644 --- a/Plugins/PluginList.cmake +++ b/Plugins/PluginList.cmake @@ -1,56 +1,57 @@ # Plug-ins must be ordered according to their dependencies if (MITK_USE_Qt4) set(MITK_EXT_PLUGINS org.mitk.core.services:ON org.mitk.gui.common:ON org.mitk.planarfigure:ON org.mitk.core.ext:OFF org.mitk.core.jobs:OFF org.mitk.diffusionimaging:OFF org.mitk.simulation:OFF org.mitk.gui.qt.application:ON org.mitk.gui.qt.coreapplication:OFF org.mitk.gui.qt.ext:OFF org.mitk.gui.qt.extapplication:OFF org.mitk.gui.qt.common:ON org.mitk.gui.qt.stdmultiwidgeteditor:ON org.mitk.gui.qt.common.legacy:OFF org.mitk.gui.qt.cmdlinemodules:OFF org.mitk.gui.qt.diffusionimagingapp:OFF org.mitk.gui.qt.datamanager:ON org.mitk.gui.qt.datamanagerlight:OFF org.mitk.gui.qt.properties:ON org.mitk.gui.qt.basicimageprocessing:OFF org.mitk.gui.qt.dicom:OFF org.mitk.gui.qt.diffusionimaging:OFF org.mitk.gui.qt.dtiatlasapp:OFF org.mitk.gui.qt.igtexamples:OFF org.mitk.gui.qt.igttracking:OFF org.mitk.gui.qt.imagecropper:OFF org.mitk.gui.qt.imagenavigator:ON org.mitk.gui.qt.materialeditor:OFF org.mitk.gui.qt.measurementtoolbox:OFF org.mitk.gui.qt.meshdecimation:OFF org.mitk.gui.qt.moviemaker:OFF org.mitk.gui.qt.pointsetinteraction:OFF org.mitk.gui.qt.python:OFF org.mitk.gui.qt.registration:OFF org.mitk.gui.qt.remeshing:OFF org.mitk.gui.qt.segmentation:OFF org.mitk.gui.qt.simulation:OFF org.mitk.gui.qt.toftutorial:OFF org.mitk.gui.qt.tofutil:OFF org.mitk.gui.qt.ugvisualization:OFF org.mitk.gui.qt.ultrasound:OFF org.mitk.gui.qt.volumevisualization:OFF + org.mitk.gui.qt.xnat:OFF ) else() set(MITK_EXT_PLUGINS # empty so far ) endif() diff --git a/Plugins/org.mitk.gui.qt.ext/files.cmake b/Plugins/org.mitk.gui.qt.ext/files.cmake index 43a3316a74..956c346aa1 100644 --- a/Plugins/org.mitk.gui.qt.ext/files.cmake +++ b/Plugins/org.mitk.gui.qt.ext/files.cmake @@ -1,53 +1,55 @@ set(SRC_CPP_FILES QmitkExtActionBarAdvisor.cpp QmitkExtWorkbenchWindowAdvisor.cpp QmitkExtFileSaveProjectAction.cpp QmitkOpenDicomEditorAction.cpp + QmitkOpenXnatEditorAction.cpp ) set(INTERNAL_CPP_FILES QmitkAppInstancesPreferencePage.cpp QmitkCommonExtPlugin.cpp QmitkInputDevicesPrefPage.cpp QmitkModuleView.cpp ) set(UI_FILES src/internal/QmitkAppInstancesPreferencePage.ui ) set(MOC_H_FILES src/QmitkExtFileSaveProjectAction.h src/QmitkExtWorkbenchWindowAdvisor.h src/internal/QmitkAppInstancesPreferencePage.h src/internal/QmitkCommonExtPlugin.h src/internal/QmitkExtWorkbenchWindowAdvisorHack.h src/internal/QmitkInputDevicesPrefPage.h src/internal/QmitkModuleView.h src/QmitkOpenDicomEditorAction.h + src/QmitkOpenXnatEditorAction.h ) set(CACHED_RESOURCE_FILES # list of resource files which can be used by the plug-in # system without loading the plug-ins shared library, # for example the icon used in the menu and tabs for the # plug-in views in the workbench plugin.xml resources/ModuleView.png ) set(QRC_FILES # uncomment the following line if you want to use Qt resources resources/org_mitk_gui_qt_ext.qrc ) set(CPP_FILES ) foreach(file ${SRC_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/${file}) endforeach(file ${SRC_CPP_FILES}) foreach(file ${INTERNAL_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/internal/${file}) endforeach(file ${INTERNAL_CPP_FILES}) diff --git a/Plugins/org.mitk.gui.qt.ext/plugin.xml b/Plugins/org.mitk.gui.qt.ext/plugin.xml index 36a65c3634..e0da503720 100644 --- a/Plugins/org.mitk.gui.qt.ext/plugin.xml +++ b/Plugins/org.mitk.gui.qt.ext/plugin.xml @@ -1,32 +1,31 @@ - diff --git a/Plugins/org.mitk.gui.qt.ext/resources/org_mitk_gui_qt_ext.qrc b/Plugins/org.mitk.gui.qt.ext/resources/org_mitk_gui_qt_ext.qrc index 2e85bf72fc..7cadabfdac 100644 --- a/Plugins/org.mitk.gui.qt.ext/resources/org_mitk_gui_qt_ext.qrc +++ b/Plugins/org.mitk.gui.qt.ext/resources/org_mitk_gui_qt_ext.qrc @@ -1,12 +1,13 @@ Load_48.png Redo_48.png Save_48.png Undo_48.png Remove_48.png dcm-icon.png Slider.png index.html + xnat-icon.png diff --git a/Plugins/org.mitk.gui.qt.ext/resources/xnat-icon.png b/Plugins/org.mitk.gui.qt.ext/resources/xnat-icon.png new file mode 100644 index 0000000000..df720dc210 Binary files /dev/null and b/Plugins/org.mitk.gui.qt.ext/resources/xnat-icon.png differ diff --git a/Plugins/org.mitk.gui.qt.ext/src/QmitkExtWorkbenchWindowAdvisor.cpp b/Plugins/org.mitk.gui.qt.ext/src/QmitkExtWorkbenchWindowAdvisor.cpp index cd3852c15a..a70c251cbc 100644 --- a/Plugins/org.mitk.gui.qt.ext/src/QmitkExtWorkbenchWindowAdvisor.cpp +++ b/Plugins/org.mitk.gui.qt.ext/src/QmitkExtWorkbenchWindowAdvisor.cpp @@ -1,1191 +1,1208 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkExtWorkbenchWindowAdvisor.h" #include "QmitkExtActionBarAdvisor.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 #include #include #include #include #include #include #include +#include #include #include #include #include #include #include #include #include // UGLYYY #include "internal/QmitkExtWorkbenchWindowAdvisorHack.h" #include "internal/QmitkCommonExtPlugin.h" #include "mitkUndoController.h" #include "mitkVerboseLimitedLinearUndo.h" #include #include #include #include QmitkExtWorkbenchWindowAdvisorHack * QmitkExtWorkbenchWindowAdvisorHack::undohack = new QmitkExtWorkbenchWindowAdvisorHack(); QString QmitkExtWorkbenchWindowAdvisor::QT_SETTINGS_FILENAME = "QtSettings.ini"; class PartListenerForTitle: public berry::IPartListener { public: PartListenerForTitle(QmitkExtWorkbenchWindowAdvisor* wa) : windowAdvisor(wa) { } Events::Types GetPartEventTypes() const { return Events::ACTIVATED | Events::BROUGHT_TO_TOP | Events::CLOSED | Events::HIDDEN | Events::VISIBLE; } void PartActivated(berry::IWorkbenchPartReference::Pointer ref) { if (ref.Cast ()) { windowAdvisor->UpdateTitle(false); } } void PartBroughtToTop(berry::IWorkbenchPartReference::Pointer ref) { if (ref.Cast ()) { windowAdvisor->UpdateTitle(false); } } void PartClosed(berry::IWorkbenchPartReference::Pointer /*ref*/) { windowAdvisor->UpdateTitle(false); } void PartHidden(berry::IWorkbenchPartReference::Pointer ref) { if (!windowAdvisor->lastActiveEditor.Expired() && ref->GetPart(false) == windowAdvisor->lastActiveEditor.Lock()) { windowAdvisor->UpdateTitle(true); } } void PartVisible(berry::IWorkbenchPartReference::Pointer ref) { if (!windowAdvisor->lastActiveEditor.Expired() && ref->GetPart(false) == windowAdvisor->lastActiveEditor.Lock()) { windowAdvisor->UpdateTitle(false); } } private: QmitkExtWorkbenchWindowAdvisor* windowAdvisor; }; class PartListenerForImageNavigator: public berry::IPartListener { public: PartListenerForImageNavigator(QAction* act) : imageNavigatorAction(act) { } Events::Types GetPartEventTypes() const { return Events::OPENED | Events::CLOSED | Events::HIDDEN | Events::VISIBLE; } void PartOpened(berry::IWorkbenchPartReference::Pointer ref) { if (ref->GetId()=="org.mitk.views.imagenavigator") { imageNavigatorAction->setChecked(true); } } void PartClosed(berry::IWorkbenchPartReference::Pointer ref) { if (ref->GetId()=="org.mitk.views.imagenavigator") { imageNavigatorAction->setChecked(false); } } void PartVisible(berry::IWorkbenchPartReference::Pointer ref) { if (ref->GetId()=="org.mitk.views.imagenavigator") { imageNavigatorAction->setChecked(true); } } void PartHidden(berry::IWorkbenchPartReference::Pointer ref) { if (ref->GetId()=="org.mitk.views.imagenavigator") { imageNavigatorAction->setChecked(false); } } private: QAction* imageNavigatorAction; }; class PerspectiveListenerForTitle: public berry::IPerspectiveListener { public: PerspectiveListenerForTitle(QmitkExtWorkbenchWindowAdvisor* wa) : windowAdvisor(wa), perspectivesClosed(false) { } Events::Types GetPerspectiveEventTypes() const { return Events::ACTIVATED | Events::SAVED_AS | Events::DEACTIVATED // remove the following line when command framework is finished | Events::CLOSED | Events::OPENED; } void PerspectiveActivated(berry::IWorkbenchPage::Pointer /*page*/, berry::IPerspectiveDescriptor::Pointer /*perspective*/) { windowAdvisor->UpdateTitle(false); } void PerspectiveSavedAs(berry::IWorkbenchPage::Pointer /*page*/, berry::IPerspectiveDescriptor::Pointer /*oldPerspective*/, berry::IPerspectiveDescriptor::Pointer /*newPerspective*/) { windowAdvisor->UpdateTitle(false); } void PerspectiveDeactivated(berry::IWorkbenchPage::Pointer /*page*/, berry::IPerspectiveDescriptor::Pointer /*perspective*/) { windowAdvisor->UpdateTitle(false); } void PerspectiveOpened(berry::IWorkbenchPage::Pointer /*page*/, berry::IPerspectiveDescriptor::Pointer /*perspective*/) { if (perspectivesClosed) { QListIterator i(windowAdvisor->viewActions); while (i.hasNext()) { i.next()->setEnabled(true); } //GetViewRegistry()->Find("org.mitk.views.imagenavigator"); if(windowAdvisor->GetWindowConfigurer()->GetWindow()->GetWorkbench()->GetEditorRegistry()->FindEditor("org.mitk.editors.dicomeditor")) { windowAdvisor->openDicomEditorAction->setEnabled(true); } + if(windowAdvisor->GetWindowConfigurer()->GetWindow()->GetWorkbench()->GetEditorRegistry()->FindEditor("org.mitk.editors.xnat.browser")) + { + windowAdvisor->openXnatEditorAction->setEnabled(true); + } windowAdvisor->fileSaveProjectAction->setEnabled(true); windowAdvisor->closeProjectAction->setEnabled(true); windowAdvisor->undoAction->setEnabled(true); windowAdvisor->redoAction->setEnabled(true); windowAdvisor->imageNavigatorAction->setEnabled(true); windowAdvisor->resetPerspAction->setEnabled(true); if( windowAdvisor->GetShowClosePerspectiveMenuItem() ) { windowAdvisor->closePerspAction->setEnabled(true); } } perspectivesClosed = false; } void PerspectiveClosed(berry::IWorkbenchPage::Pointer /*page*/, berry::IPerspectiveDescriptor::Pointer /*perspective*/) { berry::IWorkbenchWindow::Pointer wnd = windowAdvisor->GetWindowConfigurer()->GetWindow(); bool allClosed = true; if (wnd->GetActivePage()) { std::vector perspectives(wnd->GetActivePage()->GetOpenPerspectives()); allClosed = perspectives.empty(); } if (allClosed) { perspectivesClosed = true; QListIterator i(windowAdvisor->viewActions); while (i.hasNext()) { i.next()->setEnabled(false); } if(windowAdvisor->GetWindowConfigurer()->GetWindow()->GetWorkbench()->GetEditorRegistry()->FindEditor("org.mitk.editors.dicomeditor")) { windowAdvisor->openDicomEditorAction->setEnabled(false); } + if(windowAdvisor->GetWindowConfigurer()->GetWindow()->GetWorkbench()->GetEditorRegistry()->FindEditor("org.mitk.editors.xnat.browser")) + { + windowAdvisor->openXnatEditorAction->setEnabled(false); + } windowAdvisor->fileSaveProjectAction->setEnabled(false); windowAdvisor->closeProjectAction->setEnabled(false); windowAdvisor->undoAction->setEnabled(false); windowAdvisor->redoAction->setEnabled(false); windowAdvisor->imageNavigatorAction->setEnabled(false); windowAdvisor->resetPerspAction->setEnabled(false); if( windowAdvisor->GetShowClosePerspectiveMenuItem() ) { windowAdvisor->closePerspAction->setEnabled(false); } } } private: QmitkExtWorkbenchWindowAdvisor* windowAdvisor; bool perspectivesClosed; }; class PerspectiveListenerForMenu: public berry::IPerspectiveListener { public: PerspectiveListenerForMenu(QmitkExtWorkbenchWindowAdvisor* wa) : windowAdvisor(wa) { } Events::Types GetPerspectiveEventTypes() const { return Events::ACTIVATED | Events::DEACTIVATED; } void PerspectiveActivated(berry::IWorkbenchPage::Pointer /*page*/, berry::IPerspectiveDescriptor::Pointer perspective) { QAction* action = windowAdvisor->mapPerspIdToAction[perspective->GetId()]; if (action) { action->setChecked(true); } } void PerspectiveDeactivated(berry::IWorkbenchPage::Pointer /*page*/, berry::IPerspectiveDescriptor::Pointer perspective) { QAction* action = windowAdvisor->mapPerspIdToAction[perspective->GetId()]; if (action) { action->setChecked(false); } } private: QmitkExtWorkbenchWindowAdvisor* windowAdvisor; }; QmitkExtWorkbenchWindowAdvisor::QmitkExtWorkbenchWindowAdvisor(berry::WorkbenchAdvisor* wbAdvisor, berry::IWorkbenchWindowConfigurer::Pointer configurer) : berry::WorkbenchWindowAdvisor(configurer), lastInput(0), wbAdvisor(wbAdvisor), showViewToolbar(true), showPerspectiveToolbar(false), showVersionInfo(true), showMitkVersionInfo(true), showViewMenuItem(true), showNewWindowMenuItem(false), showClosePerspectiveMenuItem(true), dropTargetListener(new QmitkDefaultDropTargetListener) { productName = QCoreApplication::applicationName().toStdString(); } berry::ActionBarAdvisor::Pointer QmitkExtWorkbenchWindowAdvisor::CreateActionBarAdvisor( berry::IActionBarConfigurer::Pointer configurer) { berry::ActionBarAdvisor::Pointer actionBarAdvisor( new QmitkExtActionBarAdvisor(configurer)); return actionBarAdvisor; } void* QmitkExtWorkbenchWindowAdvisor::CreateEmptyWindowContents(void* parent) { QWidget* parentWidget = static_cast(parent); QLabel* label = new QLabel(parentWidget); label->setText("No perspectives are open. Open a perspective in the Window->Open Perspective menu."); label->setContentsMargins(10,10,10,10); label->setAlignment(Qt::AlignTop); label->setEnabled(false); parentWidget->layout()->addWidget(label); return label; } void QmitkExtWorkbenchWindowAdvisor::ShowClosePerspectiveMenuItem(bool show) { showClosePerspectiveMenuItem = show; } bool QmitkExtWorkbenchWindowAdvisor::GetShowClosePerspectiveMenuItem() { return showClosePerspectiveMenuItem; } void QmitkExtWorkbenchWindowAdvisor::ShowNewWindowMenuItem(bool show) { showNewWindowMenuItem = show; } void QmitkExtWorkbenchWindowAdvisor::ShowViewToolbar(bool show) { showViewToolbar = show; } void QmitkExtWorkbenchWindowAdvisor::ShowViewMenuItem(bool show) { showViewMenuItem = show; } void QmitkExtWorkbenchWindowAdvisor::ShowPerspectiveToolbar(bool show) { showPerspectiveToolbar = show; } void QmitkExtWorkbenchWindowAdvisor::ShowVersionInfo(bool show) { showVersionInfo = show; } void QmitkExtWorkbenchWindowAdvisor::ShowMitkVersionInfo(bool show) { showMitkVersionInfo = show; } void QmitkExtWorkbenchWindowAdvisor::SetProductName(const std::string& product) { productName = product; } void QmitkExtWorkbenchWindowAdvisor::SetWindowIcon(const std::string& wndIcon) { windowIcon = wndIcon; } void QmitkExtWorkbenchWindowAdvisor::PostWindowCreate() { // very bad hack... berry::IWorkbenchWindow::Pointer window = this->GetWindowConfigurer()->GetWindow(); QMainWindow* mainWindow = static_cast (window->GetShell()->GetControl()); if (!windowIcon.empty()) { mainWindow->setWindowIcon(QIcon(QString::fromStdString(windowIcon))); } mainWindow->setContextMenuPolicy(Qt::PreventContextMenu); /*mainWindow->setStyleSheet("color: white;" "background-color: #808080;" "selection-color: #659EC7;" "selection-background-color: #808080;" " QMenuBar {" "background-color: #808080; }");*/ // ==== Application menu ============================ QMenuBar* menuBar = mainWindow->menuBar(); menuBar->setContextMenuPolicy(Qt::PreventContextMenu); QMenu* fileMenu = menuBar->addMenu("&File"); fileMenu->setObjectName("FileMenu"); QAction* fileOpenAction = new QmitkFileOpenAction(QIcon(":/org.mitk.gui.qt.ext/Load_48.png"), window); fileMenu->addAction(fileOpenAction); fileSaveProjectAction = new QmitkExtFileSaveProjectAction(window); fileSaveProjectAction->setIcon(QIcon(":/org.mitk.gui.qt.ext/Save_48.png")); fileMenu->addAction(fileSaveProjectAction); closeProjectAction = new QmitkCloseProjectAction(window); closeProjectAction->setIcon(QIcon(":/org.mitk.gui.qt.ext/Remove_48.png")); fileMenu->addAction(closeProjectAction); fileMenu->addSeparator(); QAction* fileExitAction = new QmitkFileExitAction(window); fileExitAction->setObjectName("QmitkFileExitAction"); fileMenu->addAction(fileExitAction); if(this->GetWindowConfigurer()->GetWindow()->GetWorkbench()->GetEditorRegistry()->FindEditor("org.mitk.editors.dicomeditor")) { openDicomEditorAction = new QmitkOpenDicomEditorAction(QIcon(":/org.mitk.gui.qt.ext/dcm-icon.png"),window); } +if(this->GetWindowConfigurer()->GetWindow()->GetWorkbench()->GetEditorRegistry()->FindEditor("org.mitk.editors.xnat.browser")) +{ + openXnatEditorAction = new QmitkOpenXnatEditorAction(QIcon(":/org.mitk.gui.qt.ext/xnat-icon.png"),window); +} berry::IViewRegistry* viewRegistry = berry::PlatformUI::GetWorkbench()->GetViewRegistry(); const std::vector& viewDescriptors = viewRegistry->GetViews(); // another bad hack to get an edit/undo menu... QMenu* editMenu = menuBar->addMenu("&Edit"); undoAction = editMenu->addAction(QIcon(":/org.mitk.gui.qt.ext/Undo_48.png"), "&Undo", QmitkExtWorkbenchWindowAdvisorHack::undohack, SLOT(onUndo()), QKeySequence("CTRL+Z")); undoAction->setToolTip("Undo the last action (not supported by all modules)"); redoAction = editMenu->addAction(QIcon(":/org.mitk.gui.qt.ext/Redo_48.png") , "&Redo", QmitkExtWorkbenchWindowAdvisorHack::undohack, SLOT(onRedo()), QKeySequence("CTRL+Y")); redoAction->setToolTip("execute the last action that was undone again (not supported by all modules)"); imageNavigatorAction = new QAction(QIcon(":/org.mitk.gui.qt.ext/Slider.png"), "&Image Navigator", NULL); bool imageNavigatorViewFound = window->GetWorkbench()->GetViewRegistry()->Find("org.mitk.views.imagenavigator"); if (imageNavigatorViewFound) { QObject::connect(imageNavigatorAction, SIGNAL(triggered(bool)), QmitkExtWorkbenchWindowAdvisorHack::undohack, SLOT(onImageNavigator())); imageNavigatorAction->setCheckable(true); // add part listener for image navigator imageNavigatorPartListener = new PartListenerForImageNavigator(imageNavigatorAction); window->GetPartService()->AddPartListener(imageNavigatorPartListener); berry::IViewPart::Pointer imageNavigatorView = window->GetActivePage()->FindView("org.mitk.views.imagenavigator"); imageNavigatorAction->setChecked(false); if (imageNavigatorView) { bool isImageNavigatorVisible = window->GetActivePage()->IsPartVisible(imageNavigatorView); if (isImageNavigatorVisible) imageNavigatorAction->setChecked(true); } imageNavigatorAction->setToolTip("Open image navigator for navigating through image"); } // toolbar for showing file open, undo, redo and other main actions QToolBar* mainActionsToolBar = new QToolBar; mainActionsToolBar->setContextMenuPolicy(Qt::PreventContextMenu); #ifdef __APPLE__ mainActionsToolBar->setToolButtonStyle ( Qt::ToolButtonTextUnderIcon ); #else mainActionsToolBar->setToolButtonStyle ( Qt::ToolButtonTextBesideIcon ); #endif mainActionsToolBar->addAction(fileOpenAction); mainActionsToolBar->addAction(fileSaveProjectAction); mainActionsToolBar->addAction(closeProjectAction); mainActionsToolBar->addAction(undoAction); mainActionsToolBar->addAction(redoAction); -if(this->GetWindowConfigurer()->GetWindow()->GetWorkbench()->GetEditorRegistry()->FindEditor("org.mitk.editors.dicomeditor")) -{ - mainActionsToolBar->addAction(openDicomEditorAction); -} + if(this->GetWindowConfigurer()->GetWindow()->GetWorkbench()->GetEditorRegistry()->FindEditor("org.mitk.editors.dicomeditor")) + { + mainActionsToolBar->addAction(openDicomEditorAction); + } + if(this->GetWindowConfigurer()->GetWindow()->GetWorkbench()->GetEditorRegistry()->FindEditor("org.mitk.editors.xnat.browser")) + { + mainActionsToolBar->addAction(openXnatEditorAction); + } if (imageNavigatorViewFound) { mainActionsToolBar->addAction(imageNavigatorAction); } mainWindow->addToolBar(mainActionsToolBar); #ifdef __APPLE__ mainWindow->setUnifiedTitleAndToolBarOnMac(true); #endif // ==== Window Menu ========================== QMenu* windowMenu = menuBar->addMenu("Window"); if (showNewWindowMenuItem) { windowMenu->addAction("&New Window", QmitkExtWorkbenchWindowAdvisorHack::undohack, SLOT(onNewWindow())); windowMenu->addSeparator(); } QMenu* perspMenu = windowMenu->addMenu("&Open Perspective"); QMenu* viewMenu; if (showViewMenuItem) { viewMenu = windowMenu->addMenu("Show &View"); viewMenu->setObjectName("Show View"); } windowMenu->addSeparator(); resetPerspAction = windowMenu->addAction("&Reset Perspective", QmitkExtWorkbenchWindowAdvisorHack::undohack, SLOT(onResetPerspective())); if(showClosePerspectiveMenuItem) closePerspAction = windowMenu->addAction("&Close Perspective", QmitkExtWorkbenchWindowAdvisorHack::undohack, SLOT(onClosePerspective())); windowMenu->addSeparator(); windowMenu->addAction("&Preferences...", QmitkExtWorkbenchWindowAdvisorHack::undohack, SLOT(onEditPreferences()), QKeySequence("CTRL+P")); // fill perspective menu berry::IPerspectiveRegistry* perspRegistry = window->GetWorkbench()->GetPerspectiveRegistry(); QActionGroup* perspGroup = new QActionGroup(menuBar); std::vector perspectives( perspRegistry->GetPerspectives()); bool skip = false; for (std::vector::iterator perspIt = perspectives.begin(); perspIt != perspectives.end(); ++perspIt) { // if perspectiveExcludeList is set, it contains the id-strings of perspectives, which // should not appear as an menu-entry in the perspective menu if (perspectiveExcludeList.size() > 0) { for (unsigned int i=0; iGetId()) { skip = true; break; } } if (skip) { skip = false; continue; } } QAction* perspAction = new berry::QtOpenPerspectiveAction(window, *perspIt, perspGroup); mapPerspIdToAction.insert(std::make_pair((*perspIt)->GetId(), perspAction)); } perspMenu->addActions(perspGroup->actions()); // sort elements (converting vector to map...) std::vector::const_iterator iter; std::map VDMap; skip = false; for (iter = viewDescriptors.begin(); iter != viewDescriptors.end(); ++iter) { // if viewExcludeList is set, it contains the id-strings of view, which // should not appear as an menu-entry in the menu if (viewExcludeList.size() > 0) { for (unsigned int i=0; iGetId()) { skip = true; break; } } if (skip) { skip = false; continue; } } if ((*iter)->GetId() == "org.blueberry.ui.internal.introview") continue; if ((*iter)->GetId() == "org.mitk.views.imagenavigator") continue; std::pair p( (*iter)->GetLabel(), (*iter)); VDMap.insert(p); } // ================================================== // ==== Perspective Toolbar ================================== QToolBar* qPerspectiveToolbar = new QToolBar; if (showPerspectiveToolbar) { qPerspectiveToolbar->addActions(perspGroup->actions()); mainWindow->addToolBar(qPerspectiveToolbar); } else delete qPerspectiveToolbar; // ==== View Toolbar ================================== QToolBar* qToolbar = new QToolBar; std::map::const_iterator MapIter; for (MapIter = VDMap.begin(); MapIter != VDMap.end(); ++MapIter) { berry::QtShowViewAction* viewAction = new berry::QtShowViewAction(window, (*MapIter).second); viewActions.push_back(viewAction); if(showViewMenuItem) viewMenu->addAction(viewAction); if (showViewToolbar) { qToolbar->addAction(viewAction); } } if (showViewToolbar) { mainWindow->addToolBar(qToolbar); } else delete qToolbar; QSettings settings(GetQSettingsFile(), QSettings::IniFormat); mainWindow->restoreState(settings.value("ToolbarPosition").toByteArray()); // ==================================================== // ===== Help menu ==================================== QMenu* helpMenu = menuBar->addMenu("&Help"); helpMenu->addAction("&Welcome",this, SLOT(onIntro())); helpMenu->addAction("&Open Help Perspective", this, SLOT(onHelpOpenHelpPerspective())); helpMenu->addAction("&Context Help",this, SLOT(onHelp()), QKeySequence("F1")); helpMenu->addAction("&About",this, SLOT(onAbout())); // ===================================================== QStatusBar* qStatusBar = new QStatusBar(); //creating a QmitkStatusBar for Output on the QStatusBar and connecting it with the MainStatusBar QmitkStatusBar *statusBar = new QmitkStatusBar(qStatusBar); //disabling the SizeGrip in the lower right corner statusBar->SetSizeGripEnabled(false); QmitkProgressBar *progBar = new QmitkProgressBar(); qStatusBar->addPermanentWidget(progBar, 0); progBar->hide(); // progBar->AddStepsToDo(2); // progBar->Progress(1); mainWindow->setStatusBar(qStatusBar); QmitkMemoryUsageIndicatorView* memoryIndicator = new QmitkMemoryUsageIndicatorView(); qStatusBar->addPermanentWidget(memoryIndicator, 0); } void QmitkExtWorkbenchWindowAdvisor::PreWindowOpen() { berry::IWorkbenchWindowConfigurer::Pointer configurer = GetWindowConfigurer(); // show the shortcut bar and progress indicator, which are hidden by // default //configurer->SetShowPerspectiveBar(true); //configurer->SetShowFastViewBars(true); //configurer->SetShowProgressIndicator(true); // // add the drag and drop support for the editor area // configurer.addEditorAreaTransfer(EditorInputTransfer.getInstance()); // configurer.addEditorAreaTransfer(ResourceTransfer.getInstance()); // configurer.addEditorAreaTransfer(FileTransfer.getInstance()); // configurer.addEditorAreaTransfer(MarkerTransfer.getInstance()); // configurer.configureEditorAreaDropListener(new EditorAreaDropAdapter( // configurer.getWindow())); this->HookTitleUpdateListeners(configurer); menuPerspectiveListener = new PerspectiveListenerForMenu(this); configurer->GetWindow()->AddPerspectiveListener(menuPerspectiveListener); configurer->AddEditorAreaTransfer(QStringList("text/uri-list")); configurer->ConfigureEditorAreaDropListener(dropTargetListener); } void QmitkExtWorkbenchWindowAdvisor::PostWindowOpen() { // Force Rendering Window Creation on startup. berry::IWorkbenchWindowConfigurer::Pointer configurer = GetWindowConfigurer(); ctkPluginContext* context = QmitkCommonExtPlugin::getContext(); ctkServiceReference serviceRef = context->getServiceReference(); if (serviceRef) { mitk::IDataStorageService *dsService = context->getService(serviceRef); if (dsService) { mitk::IDataStorageReference::Pointer dsRef = dsService->GetDataStorage(); mitk::DataStorageEditorInput::Pointer dsInput(new mitk::DataStorageEditorInput(dsRef)); mitk::WorkbenchUtil::OpenEditor(configurer->GetWindow()->GetActivePage(),dsInput); } } } void QmitkExtWorkbenchWindowAdvisor::onIntro() { QmitkExtWorkbenchWindowAdvisorHack::undohack->onIntro(); } void QmitkExtWorkbenchWindowAdvisor::onHelp() { QmitkExtWorkbenchWindowAdvisorHack::undohack->onHelp(); } void QmitkExtWorkbenchWindowAdvisor::onHelpOpenHelpPerspective() { QmitkExtWorkbenchWindowAdvisorHack::undohack->onHelpOpenHelpPerspective(); } void QmitkExtWorkbenchWindowAdvisor::onAbout() { QmitkExtWorkbenchWindowAdvisorHack::undohack->onAbout(); } //-------------------------------------------------------------------------------- // Ugly hack from here on. Feel free to delete when command framework // and undo buttons are done. //-------------------------------------------------------------------------------- QmitkExtWorkbenchWindowAdvisorHack::QmitkExtWorkbenchWindowAdvisorHack() : QObject() { } QmitkExtWorkbenchWindowAdvisorHack::~QmitkExtWorkbenchWindowAdvisorHack() { } void QmitkExtWorkbenchWindowAdvisorHack::onUndo() { mitk::UndoModel* model = mitk::UndoController::GetCurrentUndoModel(); if (model) { if (mitk::VerboseLimitedLinearUndo* verboseundo = dynamic_cast( model )) { mitk::VerboseLimitedLinearUndo::StackDescription descriptions = verboseundo->GetUndoDescriptions(); if (descriptions.size() >= 1) { MITK_INFO << "Undo " << descriptions.front().second; } } model->Undo(); } else { MITK_ERROR << "No undo model instantiated"; } } void QmitkExtWorkbenchWindowAdvisorHack::onRedo() { mitk::UndoModel* model = mitk::UndoController::GetCurrentUndoModel(); if (model) { if (mitk::VerboseLimitedLinearUndo* verboseundo = dynamic_cast( model )) { mitk::VerboseLimitedLinearUndo::StackDescription descriptions = verboseundo->GetRedoDescriptions(); if (descriptions.size() >= 1) { MITK_INFO << "Redo " << descriptions.front().second; } } model->Redo(); } else { MITK_ERROR << "No undo model instantiated"; } } void QmitkExtWorkbenchWindowAdvisorHack::onImageNavigator() { // get ImageNavigatorView berry::IViewPart::Pointer imageNavigatorView = berry::PlatformUI::GetWorkbench()->GetActiveWorkbenchWindow()->GetActivePage()->FindView("org.mitk.views.imagenavigator"); if (imageNavigatorView) { bool isImageNavigatorVisible = berry::PlatformUI::GetWorkbench()->GetActiveWorkbenchWindow()->GetActivePage()->IsPartVisible(imageNavigatorView); if (isImageNavigatorVisible) { berry::PlatformUI::GetWorkbench()->GetActiveWorkbenchWindow()->GetActivePage()->HideView(imageNavigatorView); return; } } berry::PlatformUI::GetWorkbench()->GetActiveWorkbenchWindow()->GetActivePage()->ShowView("org.mitk.views.imagenavigator"); //berry::PlatformUI::GetWorkbench()->GetActiveWorkbenchWindow()->GetActivePage()->ResetPerspective(); } void QmitkExtWorkbenchWindowAdvisorHack::onEditPreferences() { QmitkPreferencesDialog _PreferencesDialog(QApplication::activeWindow()); _PreferencesDialog.exec(); } void QmitkExtWorkbenchWindowAdvisorHack::onQuit() { berry::PlatformUI::GetWorkbench()->Close(); } void QmitkExtWorkbenchWindowAdvisorHack::onResetPerspective() { berry::PlatformUI::GetWorkbench()->GetActiveWorkbenchWindow()->GetActivePage()->ResetPerspective(); } void QmitkExtWorkbenchWindowAdvisorHack::onClosePerspective() { berry::IWorkbenchPage::Pointer page = berry::PlatformUI::GetWorkbench()->GetActiveWorkbenchWindow()->GetActivePage(); page->ClosePerspective(page->GetPerspective(), true, true); } void QmitkExtWorkbenchWindowAdvisorHack::onNewWindow() { berry::PlatformUI::GetWorkbench()->OpenWorkbenchWindow(0); } void QmitkExtWorkbenchWindowAdvisorHack::onIntro() { bool hasIntro = berry::PlatformUI::GetWorkbench()->GetIntroManager()->HasIntro(); if (!hasIntro) { QRegExp reg("(.*)(\\n)*"); QRegExp reg2("(\\n)*(.*)"); QFile file(":/org.mitk.gui.qt.ext/index.html"); file.open(QIODevice::ReadOnly | QIODevice::Text); //text file only for reading QString text = QString(file.readAll()); file.close(); QString title = text; title.replace(reg, ""); title.replace(reg2, ""); std::cout << title.toStdString() << std::endl; QMessageBox::information(NULL, title, text, "Close"); } else { berry::PlatformUI::GetWorkbench()->GetIntroManager()->ShowIntro( berry::PlatformUI::GetWorkbench()->GetActiveWorkbenchWindow(), false); } } void QmitkExtWorkbenchWindowAdvisorHack::onHelp() { ctkPluginContext* context = QmitkCommonExtPlugin::getContext(); if (context == 0) { MITK_WARN << "Plugin context not set, unable to open context help"; return; } // Check if the org.blueberry.ui.qt.help plug-in is installed and started QList > plugins = context->getPlugins(); foreach(QSharedPointer p, plugins) { if (p->getSymbolicName() == "org.blueberry.ui.qt.help") { if (p->getState() != ctkPlugin::ACTIVE) { // try to activate the plug-in explicitly try { p->start(ctkPlugin::START_TRANSIENT); } catch (const ctkPluginException& pe) { MITK_ERROR << "Activating org.blueberry.ui.qt.help failed: " << pe.what(); return; } } } } ctkServiceReference eventAdminRef = context->getServiceReference(); ctkEventAdmin* eventAdmin = 0; if (eventAdminRef) { eventAdmin = context->getService(eventAdminRef); } if (eventAdmin == 0) { MITK_WARN << "ctkEventAdmin service not found. Unable to open context help"; } else { ctkEvent ev("org/blueberry/ui/help/CONTEXTHELP_REQUESTED"); eventAdmin->postEvent(ev); } } void QmitkExtWorkbenchWindowAdvisorHack::onHelpOpenHelpPerspective() { berry::PlatformUI::GetWorkbench()->ShowPerspective("org.blueberry.perspectives.help", berry::PlatformUI::GetWorkbench()->GetActiveWorkbenchWindow()); } void QmitkExtWorkbenchWindowAdvisorHack::onAbout() { QmitkAboutDialog* aboutDialog = new QmitkAboutDialog(QApplication::activeWindow(),NULL); aboutDialog->open(); } void QmitkExtWorkbenchWindowAdvisor::HookTitleUpdateListeners( berry::IWorkbenchWindowConfigurer::Pointer configurer) { // hook up the listeners to update the window title titlePartListener = new PartListenerForTitle(this); titlePerspectiveListener = new PerspectiveListenerForTitle(this); editorPropertyListener = new berry::PropertyChangeIntAdapter< QmitkExtWorkbenchWindowAdvisor>(this, &QmitkExtWorkbenchWindowAdvisor::PropertyChange); // configurer.getWindow().addPageListener(new IPageListener() { // public void pageActivated(IWorkbenchPage page) { // updateTitle(false); // } // // public void pageClosed(IWorkbenchPage page) { // updateTitle(false); // } // // public void pageOpened(IWorkbenchPage page) { // // do nothing // } // }); configurer->GetWindow()->AddPerspectiveListener(titlePerspectiveListener); configurer->GetWindow()->GetPartService()->AddPartListener(titlePartListener); } std::string QmitkExtWorkbenchWindowAdvisor::ComputeTitle() { berry::IWorkbenchWindowConfigurer::Pointer configurer = GetWindowConfigurer(); berry::IWorkbenchPage::Pointer currentPage = configurer->GetWindow()->GetActivePage(); berry::IEditorPart::Pointer activeEditor; if (currentPage) { activeEditor = lastActiveEditor.Lock(); } std::string title; //TODO Product // IProduct product = Platform.getProduct(); // if (product != null) { // title = product.getName(); // } // instead of the product name, we use a custom variable for now title = productName; if(showMitkVersionInfo) { title += std::string(" ") + MITK_VERSION_STRING; } if (showVersionInfo) { // add version informatioin QString versions = QString(" (ITK %1.%2.%3 VTK %4.%5.%6 Qt %7 MITK %8)") .arg(ITK_VERSION_MAJOR).arg(ITK_VERSION_MINOR).arg(ITK_VERSION_PATCH) .arg(VTK_MAJOR_VERSION).arg(VTK_MINOR_VERSION).arg(VTK_BUILD_VERSION) .arg(QT_VERSION_STR) .arg(MITK_VERSION_STRING); title += versions.toStdString(); } if (currentPage) { if (activeEditor) { lastEditorTitle = activeEditor->GetTitleToolTip(); if (!lastEditorTitle.empty()) title = lastEditorTitle + " - " + title; } berry::IPerspectiveDescriptor::Pointer persp = currentPage->GetPerspective(); std::string label = ""; if (persp) { label = persp->GetLabel(); } berry::IAdaptable* input = currentPage->GetInput(); if (input && input != wbAdvisor->GetDefaultPageInput()) { label = currentPage->GetLabel(); } if (!label.empty()) { title = label + " - " + title; } } title += " (Not for use in diagnosis or treatment of patients)"; return title; } void QmitkExtWorkbenchWindowAdvisor::RecomputeTitle() { berry::IWorkbenchWindowConfigurer::Pointer configurer = GetWindowConfigurer(); std::string oldTitle = configurer->GetTitle(); std::string newTitle = ComputeTitle(); if (newTitle != oldTitle) { configurer->SetTitle(newTitle); } } void QmitkExtWorkbenchWindowAdvisor::UpdateTitle(bool editorHidden) { berry::IWorkbenchWindowConfigurer::Pointer configurer = GetWindowConfigurer(); berry::IWorkbenchWindow::Pointer window = configurer->GetWindow(); berry::IEditorPart::Pointer activeEditor; berry::IWorkbenchPage::Pointer currentPage = window->GetActivePage(); berry::IPerspectiveDescriptor::Pointer persp; berry::IAdaptable* input = 0; if (currentPage) { activeEditor = currentPage->GetActiveEditor(); persp = currentPage->GetPerspective(); input = currentPage->GetInput(); } if (editorHidden) { activeEditor = 0; } // Nothing to do if the editor hasn't changed if (activeEditor == lastActiveEditor.Lock() && currentPage == lastActivePage.Lock() && persp == lastPerspective.Lock() && input == lastInput) { return; } if (!lastActiveEditor.Expired()) { lastActiveEditor.Lock()->RemovePropertyListener(editorPropertyListener); } lastActiveEditor = activeEditor; lastActivePage = currentPage; lastPerspective = persp; lastInput = input; if (activeEditor) { activeEditor->AddPropertyListener(editorPropertyListener); } RecomputeTitle(); } void QmitkExtWorkbenchWindowAdvisor::PropertyChange(berry::Object::Pointer /*source*/, int propId) { if (propId == berry::IWorkbenchPartConstants::PROP_TITLE) { if (!lastActiveEditor.Expired()) { std::string newTitle = lastActiveEditor.Lock()->GetPartName(); if (lastEditorTitle != newTitle) { RecomputeTitle(); } } } } void QmitkExtWorkbenchWindowAdvisor::SetPerspectiveExcludeList(std::vector v) { this->perspectiveExcludeList = v; } std::vector QmitkExtWorkbenchWindowAdvisor::GetPerspectiveExcludeList() { return this->perspectiveExcludeList; } void QmitkExtWorkbenchWindowAdvisor::SetViewExcludeList(std::vector v) { this->viewExcludeList = v; } std::vector QmitkExtWorkbenchWindowAdvisor::GetViewExcludeList() { return this->viewExcludeList; } void QmitkExtWorkbenchWindowAdvisor::PostWindowClose() { berry::IWorkbenchWindow::Pointer window = this->GetWindowConfigurer()->GetWindow(); QMainWindow* mainWindow = static_cast (window->GetShell()->GetControl()); QSettings settings(GetQSettingsFile(), QSettings::IniFormat); settings.setValue("ToolbarPosition", mainWindow->saveState()); } QString QmitkExtWorkbenchWindowAdvisor::GetQSettingsFile() const { QFileInfo settingsInfo = QmitkCommonExtPlugin::getContext()->getDataFile(QT_SETTINGS_FILENAME); return settingsInfo.canonicalFilePath(); } diff --git a/Plugins/org.mitk.gui.qt.ext/src/QmitkExtWorkbenchWindowAdvisor.h b/Plugins/org.mitk.gui.qt.ext/src/QmitkExtWorkbenchWindowAdvisor.h index 75642fa30c..5cc0cd91f4 100644 --- a/Plugins/org.mitk.gui.qt.ext/src/QmitkExtWorkbenchWindowAdvisor.h +++ b/Plugins/org.mitk.gui.qt.ext/src/QmitkExtWorkbenchWindowAdvisor.h @@ -1,168 +1,169 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITKEXTWORKBENCHWINDOWADVISOR_H_ #define QMITKEXTWORKBENCHWINDOWADVISOR_H_ #include #include #include #include #include #include #include #include class QAction; class QMenu; class MITK_QT_COMMON_EXT_EXPORT QmitkExtWorkbenchWindowAdvisor : public QObject, public berry::WorkbenchWindowAdvisor { Q_OBJECT public: QmitkExtWorkbenchWindowAdvisor(berry::WorkbenchAdvisor* wbAdvisor, berry::IWorkbenchWindowConfigurer::Pointer configurer); berry::ActionBarAdvisor::Pointer CreateActionBarAdvisor( berry::IActionBarConfigurer::Pointer configurer); void* CreateEmptyWindowContents(void* parent); void PostWindowCreate(); void PreWindowOpen(); void PostWindowOpen(); void PostWindowClose(); void ShowViewToolbar(bool show); void ShowPerspectiveToolbar(bool show); void ShowVersionInfo(bool show); void ShowMitkVersionInfo(bool show); void ShowViewMenuItem(bool show); void ShowNewWindowMenuItem(bool show); void ShowClosePerspectiveMenuItem(bool show); bool GetShowClosePerspectiveMenuItem(); //TODO should be removed when product support is here void SetProductName(const std::string& product); void SetWindowIcon(const std::string& wndIcon); void SetPerspectiveExcludeList(std::vector v); std::vector GetPerspectiveExcludeList(); void SetViewExcludeList(std::vector v); std::vector GetViewExcludeList(); protected slots: virtual void onIntro(); virtual void onHelp(); virtual void onHelpOpenHelpPerspective(); virtual void onAbout(); private: /** * Hooks the listeners needed on the window * * @param configurer */ void HookTitleUpdateListeners(berry::IWorkbenchWindowConfigurer::Pointer configurer); std::string ComputeTitle(); void RecomputeTitle(); QString GetQSettingsFile() const; /** * Updates the window title. Format will be: [pageInput -] * [currentPerspective -] [editorInput -] [workspaceLocation -] productName * @param editorHidden TODO */ void UpdateTitle(bool editorHidden); void PropertyChange(berry::Object::Pointer /*source*/, int propId); static QString QT_SETTINGS_FILENAME; berry::IPartListener::Pointer titlePartListener; berry::IPerspectiveListener::Pointer titlePerspectiveListener; berry::IPerspectiveListener::Pointer menuPerspectiveListener; berry::IPartListener::Pointer imageNavigatorPartListener; berry::IPropertyChangeListener::Pointer editorPropertyListener; friend struct berry::PropertyChangeIntAdapter; friend class PartListenerForTitle; friend class PerspectiveListenerForTitle; friend class PerspectiveListenerForMenu; friend class PartListenerForImageNavigator; berry::IEditorPart::WeakPtr lastActiveEditor; berry::IPerspectiveDescriptor::WeakPtr lastPerspective; berry::IWorkbenchPage::WeakPtr lastActivePage; std::string lastEditorTitle; berry::IAdaptable* lastInput; berry::WorkbenchAdvisor* wbAdvisor; bool showViewToolbar; bool showPerspectiveToolbar; bool showVersionInfo; bool showMitkVersionInfo; bool showViewMenuItem; bool showNewWindowMenuItem; bool showClosePerspectiveMenuItem; std::string productName; std::string windowIcon; // enables DnD on the editor area berry::IDropTargetListener::Pointer dropTargetListener; // stringlist for excluding perspectives from the perspective menu entry (e.g. Welcome Perspective) std::vector perspectiveExcludeList; // stringlist for excluding views from the menu entry std::vector viewExcludeList; // maps perspective ids to QAction objects std::map mapPerspIdToAction; // actions which will be enabled/disabled depending on the application state QList viewActions; QAction* fileSaveProjectAction; QAction* closeProjectAction; QAction* undoAction; QAction* redoAction; QAction* imageNavigatorAction; QAction* resetPerspAction; QAction* closePerspAction; QAction* openDicomEditorAction; + QAction* openXnatEditorAction; }; #endif /*QMITKEXTWORKBENCHWINDOWADVISOR_H_*/ diff --git a/Plugins/org.mitk.gui.qt.ext/src/QmitkOpenXnatEditorAction.cpp b/Plugins/org.mitk.gui.qt.ext/src/QmitkOpenXnatEditorAction.cpp new file mode 100644 index 0000000000..cac464238c --- /dev/null +++ b/Plugins/org.mitk.gui.qt.ext/src/QmitkOpenXnatEditorAction.cpp @@ -0,0 +1,81 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "QmitkOpenXnatEditorAction.h" + +#include +#include +#include +#include +#include +#include + +QmitkOpenXnatEditorAction::QmitkOpenXnatEditorAction(berry::IWorkbenchWindow::Pointer window) +: QAction(0) +{ + this->init(window); +} + +QmitkOpenXnatEditorAction::QmitkOpenXnatEditorAction(const QIcon & icon, berry::IWorkbenchWindow::Pointer window) +: QAction(0) +{ + this->setIcon(icon); + + this->init(window); +} + +void QmitkOpenXnatEditorAction::init(berry::IWorkbenchWindow::Pointer window) +{ + m_Window = window; + this->setParent(static_cast(m_Window->GetShell()->GetControl())); + this->setText("&XNAT"); + this->setToolTip("Open XNAT tool"); + + berry::IPreferencesService::Pointer prefService + = berry::Platform::GetServiceRegistry() + .GetServiceById(berry::IPreferencesService::ID); + + m_GeneralPreferencesNode = prefService->GetSystemPreferences()->Node("/General"); + + this->connect(this, SIGNAL(triggered(bool)), this, SLOT(Run())); +} + +void QmitkOpenXnatEditorAction::Run() +{ + // check if there is an open perspective, if not open the default perspective + if (m_Window->GetActivePage().IsNull()) + { + std::string defaultPerspId = m_Window->GetWorkbench()->GetPerspectiveRegistry()->GetDefaultPerspective(); + m_Window->GetWorkbench()->ShowPerspective(defaultPerspId, m_Window); + } + + std::vector editors = + m_Window->GetActivePage()->FindEditors(berry::IEditorInput::Pointer(0), + "org.mitk.editors.xnat.browser", berry::IWorkbenchPage::MATCH_ID); + + if (editors.empty()) + { + // no XnatEditor is currently open, create a new one + berry::IEditorInput::Pointer editorInput(new berry::FileEditorInput(Poco::Path())); + m_Window->GetActivePage()->OpenEditor(editorInput, "org.mitk.editors.xnat.browser"); + } + else + { + // reuse an existing editor + berry::IEditorPart::Pointer reuseEditor = editors.front()->GetEditor(true); + m_Window->GetActivePage()->Activate(reuseEditor); + } +} diff --git a/Plugins/org.mitk.gui.qt.ext/src/QmitkOpenXnatEditorAction.h b/Plugins/org.mitk.gui.qt.ext/src/QmitkOpenXnatEditorAction.h new file mode 100644 index 0000000000..cd765eeda9 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.ext/src/QmitkOpenXnatEditorAction.h @@ -0,0 +1,54 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#ifndef QMITKOPENXNATEDITORACTION_H_ +#define QMITKOPENXNATEDITORACTION_H_ + +#ifdef __MINGW32__ +// We need to inlclude winbase.h here in order to declare +// atomic intrinsics like InterlockedIncrement correctly. +// Otherwhise, they would be declared wrong within qatomic_windows.h . +#include +#endif + +#include +#include + +#include + +#include +#include + +class MITK_QT_COMMON_EXT_EXPORT QmitkOpenXnatEditorAction : public QAction +{ + Q_OBJECT + +public: + QmitkOpenXnatEditorAction(berry::IWorkbenchWindow::Pointer window); + QmitkOpenXnatEditorAction(const QIcon & icon, berry::IWorkbenchWindow::Pointer window); + +protected slots: + + void Run(); + +private: + void init ( berry::IWorkbenchWindow::Pointer window ); + berry::IWorkbenchWindow::Pointer m_Window; + berry::IPreferences::WeakPtr m_GeneralPreferencesNode; +}; + + +#endif /*QMITKOPENXNATEDITORACTION_H_*/ diff --git a/Plugins/org.mitk.gui.qt.xnat/CMakeLists.txt b/Plugins/org.mitk.gui.qt.xnat/CMakeLists.txt new file mode 100644 index 0000000000..c608468902 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/CMakeLists.txt @@ -0,0 +1,7 @@ +project(org_mitk_gui_qt_xnat) + +MACRO_CREATE_MITK_CTK_PLUGIN( + EXPORT_DIRECTIVE XNAT_EXPORT + EXPORTED_INCLUDE_SUFFIXES src + MODULE_DEPENDENCIES QmitkExt +) diff --git a/Plugins/org.mitk.gui.qt.xnat/documentation/UserManual/Manual.dox b/Plugins/org.mitk.gui.qt.xnat/documentation/UserManual/Manual.dox new file mode 100644 index 0000000000..b3b1f035f1 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/documentation/UserManual/Manual.dox @@ -0,0 +1,25 @@ +/** +\bundlemainpage{org.mitk.gui.qt.xnat} XNAT Plugin + +\image html icon.xpm "Icon of XNAT Plugin" + +Available sections: + - \ref org.mitk.gui.qt.xnatOverview + +\section org.mitk.gui.qt.xnatOverview +This plug-in is a new possibility of communication with a XNAT server in MITK. +It takes data from the server, shows it as hierarchy in the main window of the plug-in +as editor and it works like a normal browser. +There is also a view, where the XNAT hierarchy is displayed as tree structure. +Editor and view can communicate with each other, so the editor updates for a selection in the view. +The session data must be configured in Preferences -> XNAT Connection. + +The benefits of this plug-in are: +
    +
  • Browsing through the XNAT hierarchy +
  • Jumping to higher levels of the hierarchy with breadcrumbs +
  • Downloading data +
  • Visualisation of data +
+ +*/ diff --git a/Plugins/org.mitk.gui.qt.xnat/documentation/UserManual/icon.xpm b/Plugins/org.mitk.gui.qt.xnat/documentation/UserManual/icon.xpm new file mode 100644 index 0000000000..83e48be4d8 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/documentation/UserManual/icon.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char * icon_xpm[] = { +"16 16 2 1", +" c #FF0000", +". c #000000", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Plugins/org.mitk.gui.qt.xnat/documentation/doxygen/modules.dox b/Plugins/org.mitk.gui.qt.xnat/documentation/doxygen/modules.dox new file mode 100644 index 0000000000..7c3591766a --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/documentation/doxygen/modules.dox @@ -0,0 +1,21 @@ +/** + \defgroup org_mitk_gui_qt_xnat org.mitk.gui.qt.xnat + \ingroup MITKPlugins + + \brief This plug-in is a new possibility of communication with a XNAT server in MITK. + It takes data from the server, shows it as hierarchy in the main window of the plug-in + as editor and it works like a normal browser. + There is also a view, where the XNAT hierarchy is displayed as tree structure. + Editor and view can communicate with each other, so the editor updates for a selection in the view. + The session data must be written in Preferences -> XNAT Session. + +*/ + +/** + \defgroup org_mitk_gui_qt_xnat_internal Internal + \ingroup org_mitk_gui_qt_xnat + + \brief This subcategory includes the internal classes of the org.mitk.gui.qt.xnat plugin. Other + plugins must not rely on these classes. They contain implementation details and their interface + may change at any time. We mean it. +*/ diff --git a/Plugins/org.mitk.gui.qt.xnat/files.cmake b/Plugins/org.mitk.gui.qt.xnat/files.cmake new file mode 100644 index 0000000000..d5a5fb8942 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/files.cmake @@ -0,0 +1,51 @@ +set(SRC_CPP_FILES + +) + +set(INTERNAL_CPP_FILES + org_mitk_gui_qt_xnatinterface_Activator.cpp + QmitkXnatEditor.cpp + QmitkXnatTreeBrowserView.cpp + QmitkXnatObjectEditorInput.cpp + QmitkXnatConnectionPreferencePage.cpp + QmitkXnatConnectionManager.cpp +) + +set(UI_FILES + src/internal/QmitkXnatEditorControls.ui + src/internal/QmitkXnatTreeBrowserViewControls.ui +) + +set(MOC_H_FILES + src/internal/org_mitk_gui_qt_xnatinterface_Activator.h + src/internal/QmitkXnatEditor.h + src/internal/QmitkXnatTreeBrowserView.h + src/internal/QmitkXnatObjectEditorInput.h + src/internal/QmitkXnatConnectionPreferencePage.h + src/internal/QmitkXnatConnectionManager.h +) + +# list of resource files which can be used by the plug-in +# system without loading the plug-ins shared library, +# for example the icon used in the menu and tabs for the +# plug-in views in the workbench +set(CACHED_RESOURCE_FILES + resources/icon.xpm + resources/xnat_treebrowser_icon.xpm + plugin.xml +) + +# list of Qt .qrc files which contain additional resources +# specific to this plugin +set(QRC_FILES +) + +set(CPP_FILES ) + +foreach(file ${SRC_CPP_FILES}) + set(CPP_FILES ${CPP_FILES} src/${file}) +endforeach(file ${SRC_CPP_FILES}) + +foreach(file ${INTERNAL_CPP_FILES}) + set(CPP_FILES ${CPP_FILES} src/internal/${file}) +endforeach(file ${INTERNAL_CPP_FILES}) diff --git a/Plugins/org.mitk.gui.qt.xnat/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.xnat/manifest_headers.cmake new file mode 100644 index 0000000000..98df66b9e8 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/manifest_headers.cmake @@ -0,0 +1,5 @@ +set(Plugin-Name "XNAT Plugin") +set(Plugin-Version "0.1") +set(Plugin-Vendor "DKFZ, Medical and Biological Informatics") +set(Plugin-ContactAddress "") +set(Require-Plugin org.mitk.gui.qt.common) diff --git a/Plugins/org.mitk.gui.qt.xnat/plugin.xml b/Plugins/org.mitk.gui.qt.xnat/plugin.xml new file mode 100644 index 0000000000..af8a0fb47a --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/plugin.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/org.mitk.gui.qt.xnat/resources/icon.xpm b/Plugins/org.mitk.gui.qt.xnat/resources/icon.xpm new file mode 100644 index 0000000000..44c4146f2f --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/resources/icon.xpm @@ -0,0 +1,1961 @@ +/* XPM */ +static char * C:\home\knorr\xnat\src\MITK\Plugins\org_mitk_gui_qt_xnatinterface\resources\icon_xpm[] = { +"77 80 1878 2", +" c None", +". c #E4D800", +"+ c #D8D000", +"@ c #F1E700", +"# c #EEE000", +"$ c #EED700", +"% c #EED800", +"& c #E5D500", +"* c #DDD600", +"= c #D7D700", +"- c #D2D500", +"; c #C8CC00", +"> c #BCB700", +", c #E2DC00", +"' c #E4CA00", +") c #E4D000", +"! c #E5D000", +"~ c #E4CD00", +"{ c #E0B800", +"] c #E2C300", +"^ c #E7D200", +"/ c #EADD00", +"( c #EBDF00", +"_ c #EBE000", +": c #EADC00", +"< c #E8DC00", +"[ c #E4DC00", +"} c #E3E000", +"| c #DEE200", +"1 c #D9DE00", +"2 c #CAD100", +"3 c #B9B500", +"4 c #C7BC00", +"5 c #D1C500", +"6 c #D6C200", +"7 c #D8B900", +"8 c #DAB700", +"9 c #DCBD00", +"0 c #E1C600", +"a c #E3CB00", +"b c #E4CC00", +"c c #E3CA00", +"d c #EEBC00", +"e c #EFC500", +"f c #F1D000", +"g c #F3D900", +"h c #F3DD00", +"i c #F2DF00", +"j c #F2E000", +"k c #F0E100", +"l c #EAE000", +"m c #EBE500", +"n c #E5E500", +"o c #D8D800", +"p c #C3C300", +"q c #DCC200", +"r c #CCBE00", +"s c #D9CA00", +"t c #DFCA00", +"u c #E1C500", +"v c #E5C300", +"w c #E7C900", +"x c #EDCF00", +"y c #EED300", +"z c #EFD400", +"A c #F0D400", +"B c #FFCF00", +"C c #FFD100", +"D c #FFD300", +"E c #FFD600", +"F c #FFDA00", +"G c #FCDE00", +"H c #FBDF00", +"I c #F6E100", +"J c #F2E100", +"K c #EEDF00", +"L c #E0D000", +"M c #C4B300", +"N c #0DAE00", +"O c #036C00", +"P c #037300", +"Q c #DAC500", +"R c #D3C400", +"S c #E6D500", +"T c #E9D200", +"U c #EBCE00", +"V c #EDCD00", +"W c #F2D200", +"X c #F4D600", +"Y c #F6D900", +"Z c #F7DA00", +"` c #F7D900", +" . c #FFD700", +".. c #FFD200", +"+. c #FFCE00", +"@. c #FCDC00", +"#. c #F8DE00", +"$. c #F3DA00", +"%. c #EACB00", +"&. c #D2A900", +"*. c #00B70C", +"=. c #00A50A", +"-. c #009C0B", +";. c #037700", +">. c #038900", +",. c #D2BE00", +"'. c #D0C300", +"). c #E6D700", +"!. c #EBD500", +"~. c #EDD200", +"{. c #F1D100", +"]. c #F4D300", +"^. c #F6D500", +"/. c #F6D600", +"(. c #F7D600", +"_. c #F7D500", +":. c #FBD900", +"<. c #FCD300", +"[. c #FDC900", +"}. c #FBC800", +"|. c #FCCF00", +"1. c #FAD900", +"2. c #F8DC00", +"3. c #EACF00", +"4. c #DCB500", +"5. c #0EB800", +"6. c #01A200", +"7. c #009F08", +"8. c #00A80E", +"9. c #00B813", +"0. c #00C314", +"a. c #017E00", +"b. c #009502", +"c. c #C2B600", +"d. c #DACF00", +"e. c #DFD100", +"f. c #E6D100", +"g. c #E9CE00", +"h. c #F4D500", +"i. c #F5D500", +"j. c #F3DE00", +"k. c #F5DD00", +"l. c #F4D800", +"m. c #F3CD00", +"n. c #F1CA00", +"o. c #F3CF00", +"p. c #F5D700", +"q. c #F2D700", +"r. c #E3C400", +"s. c #C89900", +"t. c #1FAF00", +"u. c #15A800", +"v. c #0BA500", +"w. c #03AF00", +"x. c #00BB05", +"y. c #00C30D", +"z. c #00CA12", +"A. c #00D216", +"B. c #018200", +"C. c #00AE02", +"D. c #BDB300", +"E. c #D7CF00", +"F. c #DED100", +"G. c #E4D100", +"H. c #E8CD00", +"I. c #ECCC00", +"J. c #EECE00", +"K. c #F0D100", +"L. c #F1D300", +"M. c #F2D300", +"N. c #F3D200", +"O. c #EDDD00", +"P. c #EDD800", +"Q. c #EDD400", +"R. c #ECD200", +"S. c #EBD200", +"T. c #E7CD00", +"U. c #CFB100", +"V. c #16E200", +"W. c #0FAC00", +"X. c #0FBC00", +"Y. c #0CBF00", +"Z. c #09C300", +"`. c #03C800", +" + c #00CB03", +".+ c #00CB06", +"++ c #00C807", +"@+ c #00C709", +"#+ c #038000", +"$+ c #B8AF00", +"%+ c #D4CC00", +"&+ c #DED200", +"*+ c #E2CE00", +"=+ c #E6CB00", +"-+ c #E7C800", +";+ c #EBCB00", +">+ c #EDCE00", +",+ c #EDD100", +"'+ c #EED000", +")+ c #EECF00", +"!+ c #E6DE00", +"~+ c #E7DE00", +"{+ c #E8DE00", +"]+ c #E8DB00", +"^+ c #E5D600", +"/+ c #DFCC00", +"(+ c #D6B900", +"_+ c #BA9600", +":+ c #04BC00", +"<+ c #049F00", +"[+ c #01AC00", +"}+ c #01CD00", +"|+ c #00C800", +"1+ c #00D300", +"2+ c #00D900", +"3+ c #00D800", +"4+ c #01CE00", +"5+ c #01C600", +"6+ c #02C000", +"7+ c #037B00", +"8+ c #B5AB00", +"9+ c #D2C900", +"0+ c #E1CC00", +"a+ c #E3C700", +"b+ c #E5C400", +"c+ c #E7C600", +"d+ c #EACC00", +"e+ c #EACE00", +"f+ c #EACD00", +"g+ c #E1CA00", +"h+ c #E5D200", +"i+ c #E8DA00", +"j+ c #E8DF00", +"k+ c #E1D300", +"l+ c #D6BF00", +"m+ c #BD9B00", +"n+ c #099300", +"o+ c #029800", +"p+ c #00B503", +"q+ c #00D006", +"r+ c #00DD00", +"s+ c #00E600", +"t+ c #00D000", +"u+ c #07CE00", +"v+ c #0AC700", +"w+ c #0CBB00", +"x+ c #057000", +"y+ c #B6A900", +"z+ c #D2C600", +"A+ c #DDCD00", +"B+ c #E1C800", +"C+ c #E2C200", +"D+ c #E3C100", +"E+ c #E8CA00", +"F+ c #E6CC00", +"G+ c #E1B800", +"H+ c #E6C400", +"I+ c #EAD300", +"J+ c #EBDB00", +"K+ c #E1CE00", +"L+ c #CDB200", +"M+ c #1C9E00", +"N+ c #118900", +"O+ c #08A800", +"P+ c #04C400", +"Q+ c #00C602", +"R+ c #00C900", +"S+ c #00E100", +"T+ c #00E000", +"U+ c #00E300", +"V+ c #00DC00", +"W+ c #00CF00", +"X+ c #00CA00", +"Y+ c #05CA00", +"Z+ c #08C200", +"`+ c #07B500", +" @ c #0A6200", +".@ c #BEAA00", +"+@ c #D5C400", +"@@ c #DCC700", +"#@ c #E0C500", +"$@ c #E2BF00", +"%@ c #E4C000", +"&@ c #E6C900", +"*@ c #E7CE00", +"=@ c #E5CD00", +"-@ c #ECB600", +";@ c #ECC100", +">@ c #EECD00", +",@ c #EED500", +"'@ c #EBD300", +")@ c #E3C800", +"!@ c #CEAC00", +"~@ c #11B000", +"{@ c #0FB700", +"]@ c #0BB600", +"^@ c #08B300", +"/@ c #05BE00", +"(@ c #03D000", +"_@ c #01D300", +":@ c #00C500", +"<@ c #00D200", +"[@ c #00CD00", +"}@ c #00CC02", +"|@ c #00C901", +"1@ c #00C101", +"2@ c #00B600", +"3@ c #C5AC00", +"4@ c #D8C300", +"5@ c #D8C100", +"6@ c #DFC200", +"7@ c #E2BE00", +"8@ c #E5BD00", +"9@ c #E6C800", +"0@ c #E6CE00", +"a@ c #F6C300", +"b@ c #F6C700", +"c@ c #F3CB00", +"d@ c #F2CF00", +"e@ c #D3AC00", +"f@ c #0C8100", +"g@ c #05DE00", +"h@ c #00C400", +"i@ c #08D400", +"j@ c #0CDB00", +"k@ c #0CD000", +"l@ c #0AC900", +"m@ c #0BCC00", +"n@ c #08C400", +"o@ c #06C200", +"p@ c #02C400", +"q@ c #00CB02", +"r@ c #00CB07", +"s@ c #00C80A", +"t@ c #00C409", +"u@ c #00C50A", +"v@ c #CAAD00", +"w@ c #D9C200", +"x@ c #D8BE00", +"y@ c #E1C100", +"z@ c #E4BD00", +"A@ c #E5BE00", +"B@ c #E7C300", +"C@ c #E5CB00", +"D@ c #E5CE00", +"E@ c #FCC700", +"F@ c #F9C700", +"G@ c #F7C900", +"H@ c #F4CB00", +"I@ c #F0CA00", +"J@ c #E8C300", +"K@ c #D9B000", +"L@ c #008D05", +"M@ c #198E00", +"N@ c #269800", +"O@ c #00E400", +"P@ c #00E700", +"Q@ c #00CB00", +"R@ c #13C500", +"S@ c #14BE00", +"T@ c #13BD00", +"U@ c #0DB900", +"V@ c #06BB00", +"W@ c #00C102", +"X@ c #00C209", +"Y@ c #00BB03", +"Z@ c #00C305", +"`@ c #00D011", +" # c #AD9F00", +".# c #CDC200", +"+# c #E2C400", +"@# c #E4C200", +"## c #E8C000", +"$# c #E9C100", +"%# c #EAC200", +"&# c #EABB00", +"*# c #EAC600", +"=# c #E0D300", +"-# c #D8CF00", +";# c #CABC00", +"># c #2FFF00", +",# c #19CF00", +"'# c #00C100", +")# c #00CA03", +"!# c #00DB19", +"~# c #00CE00", +"{# c #01C900", +"]# c #00C703", +"^# c #00C903", +"/# c #01D400", +"(# c #00CC00", +"_# c #02C300", +":# c #02B900", +"<# c #03B300", +"[# c #03B600", +"}# c #B3A500", +"|# c #C8BF00", +"1# c #D0C800", +"2# c #D6C800", +"3# c #DAC600", +"4# c #E1BE00", +"5# c #E3BE00", +"6# c #E7C000", +"7# c #E8C400", +"8# c #E4B700", +"9# c #EADA00", +"0# c #DFD200", +"a# c #C9BA00", +"b# c #19B400", +"c# c #14BB00", +"d# c #04D300", +"e# c #00DC15", +"f# c #00CB0A", +"g# c #01CC00", +"h# c #00C702", +"i# c #00D100", +"j# c #04C300", +"k# c #02B800", +"l# c #02B100", +"m# c #02B500", +"n# c #BDAE00", +"o# c #C0B800", +"p# c #CDC600", +"q# c #D3C600", +"r# c #DBBE00", +"s# c #DCB900", +"t# c #DEBB00", +"u# c #E4C500", +"v# c #E2B900", +"w# c #E6C300", +"x# c #EBD000", +"y# c #E1D000", +"z# c #C9BC00", +"A# c #ADAD00", +"B# c #009A01", +"C# c #0FAB00", +"D# c #0CC100", +"E# c #08D000", +"F# c #00D30A", +"G# c #00CE0E", +"H# c #00C802", +"I# c #00C603", +"J# c #00CA02", +"K# c #00C300", +"L# c #03C100", +"M# c #03B500", +"N# c #02B000", +"O# c #03B700", +"P# c #C9B600", +"Q# c #BAB100", +"R# c #CBC300", +"S# c #D2BF00", +"T# c #D5B700", +"U# c #D6B500", +"V# c #DABA00", +"W# c #DEC100", +"X# c #DFC400", +"Y# c #E7BF00", +"Z# c #EDC700", +"`# c #E4CB00", +" $ c #CCC900", +".$ c #A5C200", +"+$ c #009A17", +"@$ c #009C1E", +"#$ c #00A90E", +"$$ c #07C300", +"%$ c #0FD400", +"&$ c #00CD05", +"*$ c #00C601", +"=$ c #00C803", +"-$ c #00C700", +";$ c #00C600", +">$ c #00C200", +",$ c #02BE00", +"'$ c #03AD00", +")$ c #B8AD00", +"!$ c #C5BB00", +"~$ c #CCBD00", +"{$ c #CEB900", +"]$ c #CFB200", +"^$ c #D2B300", +"/$ c #D7B900", +"($ c #DAC100", +"_$ c #DBC500", +":$ c #E9BB00", +"<$ c #F0C700", +"[$ c #ECC900", +"}$ c #DEC500", +"|$ c #DBCF00", +"1$ c #CBD800", +"2$ c #8AC500", +"3$ c #2FA900", +"4$ c #008C11", +"5$ c #00B020", +"6$ c #00C914", +"7$ c #07D000", +"8$ c #0CC800", +"9$ c #09BE00", +"0$ c #02CD00", +"a$ c #01CB00", +"b$ c #00C502", +"c$ c #00C402", +"d$ c #00C503", +"e$ c #01C100", +"f$ c #03BB00", +"g$ c #03AE00", +"h$ c #03AA00", +"i$ c #02B700", +"j$ c #C5B100", +"k$ c #BDAD00", +"l$ c #C4B400", +"m$ c #CBB300", +"n$ c #CDB300", +"o$ c #D0B500", +"p$ c #D5BB00", +"q$ c #D9C100", +"r$ c #DAC300", +"s$ c #E7B200", +"t$ c #EEC000", +"u$ c #EAC800", +"v$ c #DECC00", +"w$ c #D3D800", +"x$ c #B1DB00", +"y$ c #66C000", +"z$ c #1AA100", +"A$ c #00AD13", +"B$ c #00C01C", +"C$ c #00CE08", +"D$ c #00D600", +"E$ c #03CD00", +"F$ c #0EC500", +"G$ c #10C000", +"H$ c #03C900", +"I$ c #00C501", +"J$ c #00C002", +"K$ c #00C202", +"L$ c #00C301", +"M$ c #00BE00", +"N$ c #01BE00", +"O$ c #02AA00", +"P$ c #01A600", +"Q$ c #02B400", +"R$ c #B39900", +"S$ c #C1A800", +"T$ c #CAB200", +"U$ c #D0B700", +"V$ c #D4BC00", +"W$ c #D7BE00", +"X$ c #DABF00", +"Y$ c #DBC100", +"Z$ c #EEAE00", +"`$ c #EAB700", +" % c #E1C400", +".% c #D4D400", +"+% c #B6D800", +"@% c #85CC00", +"#% c #46BB00", +"$% c #10AF00", +"%% c #00CD16", +"&% c #00C60B", +"*% c #06BF00", +"=% c #0DC600", +"-% c #02C600", +";% c #01C200", +">% c #00C001", +",% c #00BD03", +"'% c #00BE02", +")% c #00C000", +"!% c #00BF00", +"~% c #00BB00", +"{% c #02BB00", +"]% c #02A500", +"^% c #02A300", +"/% c #04B400", +"(% c #A98100", +"_% c #BC9B00", +":% c #CAB000", +"<% c #D3BC00", +"[% c #FBAE00", +"}% c #E5B000", +"|% c #D3C100", +"1% c #BFD700", +"2% c #90D300", +"3% c #4CBC00", +"4% c #21B900", +"5% c #01C800", +"6% c #00D80F", +"7% c #00DF05", +"8% c #08D300", +"9% c #06CB00", +"0% c #01BC00", +"a% c #02C500", +"b% c #01C000", +"c% c #00BD01", +"d% c #00BB01", +"e% c #00BC00", +"f% c #00BD00", +"g% c #00B900", +"h% c #03B900", +"i% c #03B200", +"j% c #03A200", +"k% c #019F00", +"l% c #03B100", +"m% c #A98300", +"n% c #DEC800", +"o% c #CAB300", +"p% c #DDC000", +"q% c #E0BE00", +"r% c #DBB500", +"s% c #ECA300", +"t% c #E4B400", +"u% c #CAC900", +"v% c #9BCF00", +"w% c #57C200", +"x% c #1DB800", +"y% c #04C100", +"z% c #00D40D", +"A% c #00D30C", +"B% c #00D507", +"C% c #00D400", +"D% c #00C604", +"E% c #00C40B", +"F% c #02C900", +"G% c #02C700", +"H% c #03C400", +"I% c #03BF00", +"J% c #00BA02", +"K% c #00B902", +"L% c #00BF01", +"M% c #00B700", +"N% c #00B800", +"O% c #00AC00", +"P% c #00A600", +"Q% c #029E00", +"R% c #029A00", +"S% c #01B000", +"T% c #003A82", +"U% c #CB9800", +"V% c #BEA400", +"W% c #CCB700", +"X% c #D6B800", +"Y% c #DBB600", +"Z% c #DEB200", +"`% c #DEA400", +" & c #D1B500", +".& c #A8C300", +"+& c #6EC200", +"@& c #2EBC00", +"#& c #08C500", +"$& c #00D206", +"%& c #00D509", +"&& c #00D104", +"*& c #04CB00", +"=& c #00C708", +"-& c #00C70F", +";& c #03C600", +">& c #04C200", +",& c #02BD00", +"'& c #00BA01", +")& c #00B702", +"!& c #00B300", +"~& c #02A900", +"{& c #039F00", +"]& c #029700", +"^& c #03AC00", +"/& c #00387D", +"(& c #003D91", +"_& c #0035D2", +":& c #B59B00", +"<& c #BFAA00", +"[& c #D2B500", +"}& c #D5AF00", +"|& c #DEB000", +"1& c #B6BE00", +"2& c #82C000", +"3& c #43B600", +"4& c #12BD00", +"5& c #00D503", +"6& c #00DF0E", +"7& c #00D406", +"8& c #00D308", +"9& c #00CC01", +"0& c #08C700", +"a& c #0BC400", +"b& c #00C70A", +"c& c #00C910", +"d& c #01C400", +"e& c #00B501", +"f& c #00B502", +"g& c #00B602", +"h& c #00B601", +"i& c #00B100", +"j& c #01B500", +"k& c #03A500", +"l& c #019800", +"m& c #038F00", +"n& c #00A100", +"o& c #00469B", +"p& c #0047A8", +"q& c #003DC9", +"r& c #0048BF", +"s& c #0065BA", +"t& c #C2A900", +"u& c #C0AF00", +"v& c #D5B900", +"w& c #D2AF00", +"x& c #D5AB00", +"y& c #ACC700", +"z& c #8CC100", +"A& c #5DB900", +"B& c #26B500", +"C& c #06C400", +"D& c #00DB11", +"E& c #00DF13", +"F& c #00D407", +"G& c #00CF04", +"H& c #04C900", +"I& c #0DC300", +"J& c #0BC000", +"K& c #00C303", +"L& c #00C609", +"M& c #00C70C", +"N& c #03BE00", +"O& c #01B900", +"P& c #00B301", +"Q& c #00B201", +"R& c #00B402", +"S& c #00B400", +"T& c #00AD00", +"U& c #01AF00", +"V& c #00A500", +"W& c #029D00", +"X& c #029400", +"Y& c #028D00", +"Z& c #01A300", +"`& c #004FAC", +" * c #0050C2", +".* c #0053EA", +"+* c #004EC7", +"@* c #0050AE", +"#* c #0065B7", +"$* c #C1AB00", +"%* c #BBA800", +"&* c #D1B600", +"** c #CFAF00", +"=* c #CFAB00", +"-* c #7ED300", +";* c #5EC000", +">* c #31AF00", +",* c #15BA00", +"'* c #00CA08", +")* c #00D211", +"!* c #00D10C", +"~* c #00CE07", +"{* c #06C700", +"]* c #0FC100", +"^* c #0FBF00", +"/* c #0ABE00", +"(* c #00C204", +"_* c #00C507", +":* c #03B800", +"<* c #01B200", +"[* c #00B101", +"}* c #00AF01", +"|* c #00AE00", +"1* c #00A800", +"2* c #029500", +"3* c #018E00", +"4* c #01A400", +"5* c #0052B5", +"6* c #0057D3", +"7* c #005FF6", +"8* c #0066FF", +"9* c #005EE3", +"0* c #0051BD", +"a* c #0054BD", +"b* c #C5AF00", +"c* c #A68F00", +"d* c #C0A500", +"e* c #C6AC00", +"f* c #CCAF00", +"g* c #54DB00", +"h* c #34C200", +"i* c #16B600", +"j* c #00D00F", +"k* c #00CD13", +"l* c #00C80B", +"m* c #00CD09", +"n* c #05C400", +"o* c #0AC000", +"p* c #0CBE00", +"q* c #08BD00", +"r* c #00AD02", +"s* c #00AE01", +"t* c #00A900", +"u* c #039C00", +"v* c #018F00", +"w* c #018500", +"x* c #039400", +"y* c #0054BA", +"z* c #005FE3", +"A* c #006FFF", +"B* c #0065FF", +"C* c #005FFA", +"D* c #0055D9", +"E* c #004CBC", +"F* c #0056BF", +"G* c #B39400", +"H* c #B09700", +"I* c #BCA600", +"J* c #C5B200", +"K* c #2ADA00", +"L* c #1ACD00", +"M* c #0FC600", +"N* c #00CE12", +"O* c #00CB18", +"P* c #00C810", +"Q* c #00CA09", +"R* c #06C100", +"S* c #08BE00", +"T* c #07BD00", +"U* c #02B300", +"V* c #02AF00", +"W* c #00AC02", +"X* c #00AA00", +"Y* c #01AB00", +"Z* c #01A100", +"`* c #039900", +" = c #009C00", +".= c #0062E9", +"+= c #0068FF", +"@= c #0067FF", +"#= c #005AFD", +"$= c #004DC5", +"%= c #00499B", +"&= c #004574", +"*= c #A78E00", +"== c #B4A200", +"-= c #C3B200", +";= c #0AD200", +">= c #0CD100", +",= c #09CE00", +"'= c #00C511", +")= c #00C614", +"!= c #00C50F", +"~= c #05C200", +"{= c #05C000", +"]= c #04BD00", +"^= c #05BB00", +"/= c #04BA00", +"(= c #00BA00", +"_= c #02AE00", +":= c #00AB00", +"<= c #00A400", +"[= c #009B00", +"}= c #039B00", +"|= c #019B00", +"1= c #02D400", +"2= c #007AFF", +"3= c #0062F5", +"4= c #005FF3", +"5= c #0060F1", +"6= c #0063F1", +"7= c #0065F0", +"8= c #0063F2", +"9= c #005DF4", +"0= c #0051F6", +"a= c #0044F6", +"b= c #0039F9", +"c= c #003DFF", +"d= c #72A900", +"e= c #74A500", +"f= c #00C411", +"g= c #00C611", +"h= c #00C712", +"i= c #00C80D", +"j= c #00C60A", +"k= c #00C206", +"l= c #00BF04", +"m= c #03BC00", +"n= c #06B900", +"o= c #06B500", +"p= c #05B600", +"q= c #01B600", +"r= c #00B903", +"s= c #13AA00", +"t= c #10AA00", +"u= c #0AAB00", +"v= c #06AC00", +"w= c #00AF06", +"x= c #00AD06", +"y= c #00A806", +"z= c #009F01", +"A= c #058E00", +"B= c #0A7E00", +"C= c #0F7400", +"D= c #176E00", +"E= c #0068EE", +"F= c #0057D6", +"G= c #005FF5", +"H= c #0063F5", +"I= c #0065F3", +"J= c #0069F1", +"K= c #0069F2", +"L= c #0063F4", +"M= c #005CF7", +"N= c #004FF7", +"O= c #0042EB", +"P= c #0039D8", +"Q= c #003FD5", +"R= c #54B200", +"S= c #519600", +"T= c #00C80F", +"U= c #00C90E", +"V= c #05BD00", +"W= c #00B305", +"X= c #00B405", +"Y= c #00B705", +"Z= c #08A900", +"`= c #07A800", +" - c #06AA00", +".- c #00B006", +"+- c #00AA08", +"@- c #009E06", +"#- c #008D00", +"$- c #079200", +"%- c #119D00", +"&- c #1A9F00", +"*- c #0055CD", +"=- c #0056D9", +"-- c #005BF0", +";- c #0068F7", +">- c #0069F5", +",- c #006CF2", +"'- c #006EF2", +")- c #006FF3", +"!- c #006CF6", +"~- c #0068F8", +"{- c #005FFC", +"]- c #0056F7", +"^- c #004EE3", +"/- c #0049C1", +"(- c #0058AD", +"_- c #0091AF", +":- c #0B7A00", +"<- c #00C404", +"[- c #00C509", +"}- c #00C70D", +"|- c #00B30C", +"1- c #00B212", +"2- c #00B411", +"3- c #00B505", +"4- c #00AA04", +"5- c #00A606", +"6- c #009F09", +"7- c #00980B", +"8- c #009009", +"9- c #008402", +"0- c #079500", +"a- c #10A200", +"b- c #0048B9", +"c- c #0053E1", +"d- c #0056F0", +"e- c #0068FC", +"f- c #0069F8", +"g- c #0070F5", +"h- c #006FF6", +"i- c #006CFA", +"j- c #005BB5", +"k- c #00699D", +"l- c #00A3A9", +"m- c #009971", +"n- c #00854D", +"o- c #00BE03", +"p- c #00C105", +"q- c #00B709", +"r- c #00B415", +"s- c #00B219", +"t- c #00B213", +"u- c #00B504", +"v- c #00B406", +"w- c #00B30A", +"x- c #00990D", +"y- c #008A0E", +"z- c #00850E", +"A- c #008A06", +"B- c #048F00", +"C- c #0043B6", +"D- c #0051E8", +"E- c #0057F5", +"F- c #0062FF", +"G- c #0065FE", +"H- c #006AFB", +"I- c #006EF9", +"J- c #0070F7", +"K- c #0070F8", +"L- c #006DFC", +"M- c #006AFF", +"N- c #0063FD", +"O- c #0067F5", +"P- c #006EE7", +"Q- c #0068BA", +"R- c #0077AA", +"S- c #00768D", +"T- c #008E96", +"U- c #00B019", +"V- c #00B311", +"W- c #00B906", +"X- c #03C300", +"Y- c #00B60D", +"Z- c #00B315", +"`- c #00B114", +" ; c #00B20C", +".; c #00B500", +"+; c #00B206", +"@; c #00AD0A", +"#; c #00A10D", +"$; c #009211", +"%; c #008811", +"&; c #00850F", +"*; c #0046C2", +"=; c #0056EF", +"-; c #005CFF", +";; c #0058FF", +">; c #005AFF", +",; c #0063FF", +"'; c #006CF9", +"); c #006BFC", +"!; c #0069FF", +"~; c #005FFF", +"{; c #0063FE", +"]; c #006AFE", +"^; c #0068DE", +"/; c #0073D4", +"(; c #006AB5", +"_; c #0080C2", +":; c #009B47", +"<; c #00A333", +"[; c #00AB13", +"}; c #05B800", +"|; c #00B60A", +"1; c #00B310", +"2; c #00B40F", +"3; c #00B000", +"4; c #00A700", +"5; c #009705", +"6; c #009509", +"7; c #009A10", +"8; c #0046C4", +"9; c #004ED5", +"0; c #004DFF", +"a; c #0051FF", +"b; c #0057FF", +"c; c #0060FF", +"d; c #0066FA", +"e; c #0069F9", +"f; c #0067FA", +"g; c #0061FF", +"h; c #005DFF", +"i; c #005CFD", +"j; c #005BEA", +"k; c #0070FC", +"l; c #006CDF", +"m; c #006DD9", +"n; c #008881", +"o; c #009062", +"p; c #009C2E", +"q; c #05B700", +"r; c #00B704", +"s; c #00B30E", +"t; c #00B20F", +"u; c #00B304", +"v; c #00A601", +"w; c #00A208", +"x; c #169D00", +"y; c #1B9A00", +"z; c #159700", +"A; c #119800", +"B; c #0047BF", +"C; c #0059E4", +"D; c #005BFE", +"E; c #0048FF", +"F; c #0053FF", +"G; c #0063FC", +"H; c #0065F9", +"I; c #0064F8", +"J; c #0061FC", +"K; c #005BFF", +"L; c #0054FC", +"M; c #0054FF", +"N; c #0057FB", +"O; c #005DF7", +"P; c #0050DE", +"Q; c #0064F1", +"R; c #0076B8", +"S; c #007F95", +"T; c #008D5B", +"U; c #009C20", +"V; c #0AAC00", +"W; c #07B200", +"X; c #04B500", +"Y; c #00B403", +"Z; c #00B20A", +"`; c #00B207", +" > c #00B200", +".> c #02AC00", +"+> c #08A600", +"@> c #049C00", +"#> c #009403", +"$> c #3C9400", +"%> c #449B00", +"&> c #429C00", +"*> c #3D9500", +"=> c #0044B0", +"-> c #0064F4", +";> c #0077FF", +">> c #004EFF", +",> c #0066FC", +"'> c #0067F8", +")> c #0066F7", +"!> c #0062F7", +"~> c #005DFC", +"{> c #0056F9", +"]> c #005AF4", +"^> c #005CF3", +"/> c #0063DC", +"(> c #006ABC", +"_> c #007689", +":> c #008351", +"<> c #00921F", +"[> c #009F04", +"}> c #04AB00", +"|> c #00B701", +"1> c #069E00", +"2> c #119900", +"3> c #169500", +"4> c #179100", +"5> c #668A00", +"6> c #729400", +"7> c #729500", +"8> c #719800", +"9> c #004EBE", +"0> c #0069F4", +"a> c #005EFF", +"b> c #0067FB", +"c> c #0065F2", +"d> c #0066F0", +"e> c #006FF9", +"f> c #0070FF", +"g> c #0064F5", +"h> c #0059F7", +"i> c #0058F5", +"j> c #0058F4", +"k> c #005AF2", +"l> c #005DF1", +"m> c #005FF1", +"n> c #005EF0", +"o> c #0060DF", +"p> c #0067BC", +"q> c #007290", +"r> c #007F5C", +"s> c #008F2A", +"t> c #009F02", +"u> c #03AB00", +"v> c #02B200", +"w> c #00AF00", +"x> c #03A700", +"y> c #059D00", +"z> c #0D9300", +"A> c #219000", +"B> c #339200", +"C> c #409800", +"D> c #908800", +"E> c #9B9300", +"F> c #9D9600", +"G> c #9D9400", +"H> c #0042A3", +"I> c #004DB6", +"J> c #0063E0", +"K> c #0074FF", +"L> c #0067F6", +"M> c #0068F5", +"N> c #006BF4", +"O> c #0071F9", +"P> c #0078FD", +"Q> c #0074F7", +"R> c #0068EC", +"S> c #005DE3", +"T> c #0068F1", +"U> c #0065EE", +"V> c #0061ED", +"W> c #0060EC", +"X> c #0060EB", +"Y> c #0060EA", +"Z> c #0060E8", +"`> c #0061E8", +" , c #005BEE", +"., c #005BED", +"+, c #005CE5", +"@, c #0061C8", +"#, c #006D98", +"$, c #007C57", +"%, c #009219", +"&, c #05A200", +"*, c #0DB400", +"=, c #04A700", +"-, c #069A00", +";, c #008A00", +">, c #128200", +",, c #328700", +"', c #529200", +"), c #659C00", +"!, c #B79000", +"~, c #BF9900", +"{, c #C09C00", +"], c #BD9900", +"^, c #003484", +"/, c #00459D", +"(, c #0054B6", +"_, c #0066D9", +":, c #006BE8", +"<, c #0074EF", +"[, c #0074EC", +"}, c #006FE7", +"|, c #006DE9", +"1, c #006EED", +"2, c #0070EF", +"3, c #006FF1", +"4, c #006AEF", +"5, c #0069F0", +"6, c #0065EA", +"7, c #0064E7", +"8, c #0062E5", +"9, c #0062E2", +"0, c #0063E1", +"a, c #0064E1", +"b, c #0057EE", +"c, c #0054F5", +"d, c #005AC1", +"e, c #006A81", +"f, c #008038", +"g, c #009201", +"h, c #0CA000", +"i, c #0B9300", +"j, c #0A8200", +"k, c #217A00", +"l, c #4E8200", +"m, c #719300", +"n, c #8CA300", +"o, c #D09C00", +"p, c #D5A400", +"q, c #D4A300", +"r, c #CA9E00", +"s, c #B79300", +"t, c #0055BE", +"u, c #0057B8", +"v, c #0058B0", +"w, c #005CB7", +"x, c #0061C1", +"y, c #0068CF", +"z, c #0072E0", +"A, c #0075EA", +"B, c #0071EC", +"C, c #006CEE", +"D, c #006DF5", +"E, c #0071FD", +"F, c #0067F2", +"G, c #0064EC", +"H, c #0063E2", +"I, c #0064DF", +"J, c #0064DE", +"K, c #0065DE", +"L, c #005CDB", +"M, c #0058E4", +"N, c #0052F2", +"O, c #004EEE", +"P, c #004FD3", +"Q, c #005CA1", +"R, c #006D61", +"S, c #007E2B", +"T, c #008B06", +"U, c #099000", +"V, c #148D00", +"W, c #268700", +"X, c #468100", +"Y, c #6D8700", +"Z, c #929600", +"`, c #B4AA00", +" ' c #D9A800", +".' c #D9AC00", +"+' c #D4A900", +"@' c #C8A100", +"#' c #B69400", +"$' c #006FD0", +"%' c #006CC5", +"&' c #0057B6", +"*' c #0055B6", +"=' c #0056BD", +"-' c #005CCD", +";' c #0062E3", +">' c #0060F3", +",' c #0057ED", +"'' c #005CF6", +")' c #005AF3", +"!' c #005BEC", +"~' c #005DE8", +"{' c #0061DF", +"]' c #0061DE", +"^' c #0062DB", +"/' c #005ED5", +"(' c #005ADA", +"_' c #0054DD", +":' c #004EDA", +"<' c #004BD0", +"[' c #0052B4", +"}' c #005D91", +"|' c #006965", +"1' c #007038", +"2' c #007B0F", +"3' c #1D8A00", +"4' c #479300", +"5' c #668E00", +"6' c #8A8F00", +"7' c #B29A00", +"8' c #CFA300", +"9' c #D3B200", +"0' c #CDAD00", +"a' c #C0A100", +"b' c #B19700", +"c' c #0048C2", +"d' c #0044BA", +"e' c #0047CC", +"f' c #004BE4", +"g' c #004EF4", +"h' c #004DFA", +"i' c #004CF8", +"j' c #004BF3", +"k' c #004BED", +"l' c #004FE7", +"m' c #0054E2", +"n' c #0058DE", +"o' c #005CDC", +"p' c #005FD8", +"q' c #005CCF", +"r' c #0058C6", +"s' c #0052BE", +"t' c #004CBD", +"u' c #004BBE", +"v' c #004EB7", +"w' c #00579C", +"x' c #00616A", +"y' c #00712B", +"z' c #2C8F00", +"A' c #569A00", +"B' c #799900", +"C' c #A59D00", +"D' c #C89C00", +"E' c #D99000", +"F' c #C6B700", +"G' c #C0B000", +"H' c #B6A500", +"I' c #AF9900", +"J' c #003BDE", +"K' c #003DE4", +"L' c #003DF3", +"M' c #003EF7", +"N' c #003EF5", +"O' c #0041EE", +"P' c #0045E8", +"Q' c #004BE2", +"R' c #0051DC", +"S' c #0057DC", +"T' c #0057D9", +"U' c #005EDA", +"V' c #005ECB", +"W' c #005BB6", +"X' c #0054A9", +"Y' c #004CAE", +"Z' c #0048C1", +"`' c #0048CD", +" ) c #004EBF", +".) c #005B90", +"+) c #006D3F", +"@) c #339300", +"#) c #61A300", +"$) c #87A400", +"%) c #B7A900", +"&) c #D49B00", +"*) c #DB8100", +"=) c #C1BC00", +"-) c #BDB900", +";) c #B8B100", +">) c #B0A600", +",) c #AE9C00", +"') c #003BAB", +")) c #002FA1", +"!) c #0030BA", +"~) c #0033CD", +"{) c #0042ED", +"]) c #0046D7", +"^) c #0052D2", +"/) c #005BCC", +"() c #0068CD", +"_) c #005FBC", +":) c #0052DC", +"<) c #0051D5", +"[) c #004FCC", +"}) c #0049C9", +"|) c #0045CC", +"1) c #0042D4", +"2) c #0040D5", +"3) c #0044C3", +"4) c #004594", +"5) c #005A68", +"6) c #0A6400", +"7) c #658D00", +"8) c #949800", +"9) c #BEA000", +"0) c #E3A200", +"a) c #D88B00", +"b) c #CB9000", +"c) c #C8AF00", +"d) c #C2B800", +"e) c #C0B900", +"f) c #A9A300", +"g) c #0039BC", +"h) c #0031AA", +"i) c #0036B2", +"j) c #0048D3", +"k) c #0056D8", +"l) c #0052BD", +"m) c #0062C8", +"n) c #0051D6", +"o) c #004AC6", +"p) c #0046C9", +"q) c #0042CF", +"r) c #0041D1", +"s) c #00449B", +"t) c #004E70", +"u) c #005D17", +"v) c #5D8B00", +"w) c #8A8D00", +"x) c #BC9E00", +"y) c #D69B00", +"z) c #DF9400", +"A) c #CC9100", +"B) c #CFA500", +"C) c #C7AE00", +"D) c #C0B500", +"E) c #BBB700", +"F) c #A7A100", +"G) c #003FAA", +"H) c #0040A8", +"I) c #0057C1", +"J) c #005CC9", +"K) c #0069D6", +"L) c #0051DB", +"M) c #004AC5", +"N) c #0045CB", +"O) c #0045CD", +"P) c #0045AA", +"Q) c #00437A", +"R) c #00544F", +"S) c #7A7E00", +"T) c #B69700", +"U) c #CA9700", +"V) c #E3A000", +"W) c #CC9400", +"X) c #CEA500", +"Y) c #BDB200", +"Z) c #B8B400", +"`) c #A29C00", +" ! c #005AC9", +".! c #004FB2", +"+! c #0055B3", +"@! c #005ABB", +"#! c #004FB4", +"$! c #0051D1", +"%! c #004FC9", +"&! c #0049C2", +"*! c #0047C1", +"=! c #0045C7", +"-! c #0045C5", +";! c #0044B9", +">! c #003B8E", +",! c #00417A", +"'! c #686900", +")! c #A58A00", +"!! c #C79C00", +"~! c #DCA600", +"{! c #CC9800", +"]! c #CEA600", +"^! c #BAB000", +"/! c #B3AE00", +"(! c #9D9900", +"_! c #004F8C", +":! c #004F92", +"~ c #BCAA00", +",~ c #B1A600", +"'~ c #A7A200", +")~ c #169F00", +"!~ c #0F7300", +"~~ c #138800", +"{~ c #00742F", +"]~ c #006B40", +"^~ c #00595B", +"/~ c #005180", +"(~ c #004EA2", +"_~ c #0045AD", +":~ c #0049BA", +"<~ c #0045BB", +"[~ c #003AAE", +"}~ c #0034A2", +"|~ c #002473", +"1~ c #6A6300", +"2~ c #BFA800", +"3~ c #BB9A00", +"4~ c #C3A700", +"5~ c #B5A300", +"6~ c #A89D00", +"7~ c #A69C00", +"8~ c #167600", +"9~ c #198500", +"0~ c #008613", +"a~ c #007A27", +"b~ c #006644", +"c~ c #005A6D", +"d~ c #00508F", +"e~ c #00439F", +"f~ c #0046AF", +"g~ c #0047B6", +"h~ c #0044B3", +"i~ c #003CA6", +"j~ c #003694", +"k~ c #002865", +"l~ c #666200", +"m~ c #958200", +"n~ c #B69D00", +"o~ c #C1A000", +"p~ c #C3A800", +"q~ c #AA9D00", +"r~ c #0E6E00", +"s~ c #0F7000", +"t~ c #039200", +"u~ c #00830F", +"v~ c #00722D", +"w~ c #006354", +"x~ c #005173", +"y~ c #00478D", +"z~ c #0042A0", +"A~ c #0049B3", +"B~ c #0042AE", +"C~ c #0040A4", +"D~ c #003788", +"E~ c #002756", +"F~ c #696300", +"G~ c #937F00", +"H~ c #AD9200", +"I~ c #BBA200", +"J~ c #AF9A00", +"K~ c #A79700", +"L~ c #006200", +"M~ c #005800", +"N~ c #0A9600", +"O~ c #008803", +"P~ c #007917", +"Q~ c #006C37", +"R~ c #005A57", +"S~ c #00547C", +"T~ c #00438F", +"U~ c #0049AE", +"V~ c #0040AD", +"W~ c #003FA6", +"X~ c #003584", +"Y~ c #00264F", +"Z~ c #686200", +"`~ c #937E00", +" { c #A98C00", +".{ c #BC9F00", +"+{ c #B59C00", +"@{ c #AC9600", +"#{ c #A79300", +"${ c #006009", +"%{ c #004707", +"&{ c #039100", +"*{ c #008900", +"={ c #007F07", +"-{ c #00761B", +";{ c #006437", +">{ c #006068", +",{ c #00477F", +"'{ c #0044A4", +"){ c #003EB2", +"!{ c #003BB1", +"~{ c #002F87", +"{{ c #002451", +"]{ c #696100", +"^{ c #967D00", +"/{ c #A98A00", +"({ c #BCA000", +"_{ c #B39A00", +":{ c #AF9700", +"<{ c #AB9300", +"[{ c #003E09", +"}{ c #008D0B", +"|{ c #008A05", +"1{ c #028600", +"2{ c #007B02", +"3{ c #006C18", +"4{ c #007352", +"5{ c #004F74", +"6{ c #003C98", +"7{ c #003BB8", +"8{ c #0039BD", +"9{ c #002B91", +"0{ c #002159", +"a{ c #685E00", +"b{ c #AD8A00", +"c{ c #B79B00", +"d{ c #B29800", +"e{ c #B49900", +"f{ c #033E00", +"g{ c #008716", +"h{ c #00890A", +"i{ c #058800", +"j{ c #098400", +"k{ c #027500", +"l{ c #008A3F", +"m{ c #00566D", +"n{ c #003C94", +"o{ c #0037BD", +"p{ c #0034C6", +"q{ c #00279A", +"r{ c #001F65", +"s{ c #665A00", +"t{ c #B08C00", +"u{ c #B09600", +"v{ c #B29600", +"w{ c #B99E00", +"x{ c #0F4600", +"y{ c #00811A", +"z{ c #00870E", +"A{ c #018600", +"B{ c #058100", +"C{ c #0E7E00", +"D{ c #009E31", +"E{ c #005D6A", +"F{ c #00439B", +"G{ c #0035C0", +"H{ c #0031CC", +"I{ c #0025A0", +"J{ c #001C6A", +"K{ c #645700", +"L{ c #977B00", +"M{ c #B28E00", +"N{ c #B69C00", +"O{ c #C4A600", +"P{ c #007600", +"Q{ c #029000", +"R{ c #008411", +"S{ c #00761C", +"T{ c #00570E", +"U{ c #00362F", +"V{ c #002C58", +"W{ c #004295", +"X{ c #003AA0", +"Y{ c #004097", +"Z{ c #00255B", +"`{ c #856300", +" ] c #B39300", +".] c #A79000", +"+] c #666F00", +"@] c #778200", +"#] c #1B9C00", +"$] c #007C00", +"%] c #008B18", +"&] c #00791B", +"*] c #005B0E", +"=] c #005A06", +"-] c #002F5A", +";] c #003F90", +">] c #0042A6", +",] c #003D8F", +"'] c #00265C", +")] c #604200", +"!] c #8D6900", +"~] c #AF9000", +"{] c #A89300", +"]] c #717C00", +"^] c #24C600", +"/] c #006900", +"(] c #008114", +"_] c #007817", +":] c #005C0A", +"<] c #005E0B", +"[] c #00355A", +"}] c #003887", +"|] c #003883", +"1] c #583F00", +"2] c #936D00", +"3] c #A48800", +"4] c #AB9700", +"5] c #026C00", +"6] c #00690A", +"7] c #007412", +"8] c #006209", +"9] c #00650D", +"0] c #003C5D", +"a] c #003781", +"b] c #003990", +"c] c #003477", +"d] c #584300", +"e] c #8E6D00", +"f] c #9C8000", +"g] c #AE9900", +"h] c #048000", +"i] c #006D0B", +"j] c #006A07", +"k] c #007012", +"l] c #004764", +"m] c #003D81", +"n] c #00317C", +"o] c #002E6D", +"p] c #654E00", +"q] c #856900", +"r] c #9A7E00", +"s] c #B8A200", +"t] c #005A05", +"u] c #006604", +"v] c #006A04", +"w] c #007615", +"x] c #00AB61", +"y] c #005168", +"z] c #003977", +"A] c #002B6C", +"B] c #002354", +"C] c #343300", +"D] c #6D5800", +"E] c #856B00", +"F] c #B49B00", +"G] c #007100", +"H] c #005E00", +"I] c #006300", +"J] c #007717", +"K] c #00A45B", +"L] c #005664", +"M] c #00346C", +"N] c #00245E", +"O] c #001833", +"P] c #463C00", +"Q] c #6F5E00", +"R] c #8F7600", +"S] c #9D8400", +"T] c #055A00", +"U] c #006000", +"V] c #007C1A", +"W] c #00A659", +"X] c #005961", +"Y] c #003462", +"Z] c #001C53", +"`] c #4F4400", +" ^ c #716200", +".^ c #A48D00", +"+^ c #0D8100", +"@^ c #006204", +"#^ c #00741A", +"$^ c #008745", +"%^ c #005A5B", +"&^ c #002C51", +"*^ c #00164E", +"=^ c #150F00", +"-^ c #574B00", +";^ c #8E8400", +">^ c #AB9D00", +",^ c #006906", +"'^ c #005102", +")^ c #008A46", +"!^ c #005953", +"~^ c #002747", +"{^ c #00062D", +"]^ c #231600", +"^^ c #675B00", +"/^ c #A7A300", +"(^ c #005C19", +"_^ c #006C33", +":^ c #004F41", +"<^ c #002138", +"[^ c #05001A", +"}^ c #301A00", +"|^ c #7C7200", +"1^ c #007B28", +"2^ c #004F21", +"3^ c #00402D", +"4^ c #001724", +"5^ c #130014", +"6^ c #005323", +"7^ c #00321B", +"8^ c #001215", +"9^ c #00310F", +" ", +" . + ", +" @ # $ % & * = - ; > ", +" , ' ) ! ~ { ] ^ / ( _ : < [ } | 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 O P ", +" Q R S T U V W X Y Z ` F ...+.C .@.#.$.%.&. *.=.-.;.>. ", +" ,.'.).!.~.{.].^./.(._.:.:.<.[.}.|.1.2.3.4. 5.6.7.8.9.0.a.b. ", +" c.d.e.f.g.V f W 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._ _ O.P.Q.R.S.T.U. V.W.X.Y.Z.`. +.+++@+#+ ", +" $+%+&+*+=+-+;+>+,+'+)+!+!+~+{+]+^+/+(+_+ :+<+[+}+|+1+2+3+1+4+5+6+7+ ", +" 8+9+F.0+a+b+c+d+e+f+f+g+h+i+j+~+k+l+m+ n+o+p+q+3+r+s+s+3+t+u+v+w+x+ ", +" y+z+A+B+C+D+b+E+H.T.F+G+H+I+J+i+K+L+ M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @ ", +" .@+@@@#@$@%@b+&@F+*@=@-@;@>@,@'@)@!@ ~@{@]@^@/@(@_@:@t+<@t+[@}@|@1@2@ ", +" 3@4@5@6@7@8@H+9@=+=@0@a@b@c@d@>+H+e@ f@g@R+h@i@j@k@l@m@n@o@p@q@r@s@t@u@ ", +" v@w@x@y@z@A@B@9@C@=@D@E@F@G@H@I@J@K@ L@M@N@3+O@P@2+Q@v+R@S@T@U@V@W@X@Y@Z@`@ ", +" #.#9+s @@+#@###$#%#&#*#f.=#-#;# >#,#'#)#!#~#[@Q@{#]#]#^#Q@[@/#(#:@_#:#<#[# ", +" }#|#1#2#3#6@4#5#6#7#8#v S.9#0#a# b#c#d#e#f#W+~#g#{#h#]#^#q@[@i#Q@:@j#k#l#m# ", +" n#o#p#q#4@r#s#t#D+u#v#w#x#% y#z#A# B#C#D#E#F#G#t+W+g#|@H#I#]#J#X+W+|+K#L#M#N#O# ", +" P#Q#R#'.S#T#U#V#W#X#Y#Z#d+`#A+ $.$ +$@$#$$$%$|+h@&$t+W+g#|+*$I#]#=$-$Q@;$>$,$l#'$O# ", +" )$!$~${$]$^$/$($_$:$<$[$}$|$1$2$3$4$5$6$<@1+7$8$9$W+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$3+D$E$F$G$~#g#H$I$W@J$K$L$>$K#M$N$k#O$P$Q$ ", +" R$S$T$U$V$W$X$Y$Z$`$ %.%+%@%#%$%%%&%Q@r+V+-$*%=%(#R+-%;%>%,%'%)%!%!%~%{%Q$]%^%/% ", +" (%_%:%<%W$X$r#9 [%}%|%1%2%3%4%5%Z@6%7%D$t+8%9%0%X+5%a%b%c%Y@d%e%M$f%g%h%i%j%k%l% ", +" m%]$n%o%p%q%r%s%t%u%v%w%x%y%z%A%B%C%<@W+X+D%E%F%G%H%I%e%J%K%d%L%M%N%O%P%Q%R%S% ", +" T% U%V%W%w@X%Y%Z%`% &.&+&@&#&W+$&%&&&~#*&H$|+=&-&5%;&>&,&'&K%)&K%N%!&h%l#~&{&]&^& ", +" /&(&_& :&<&D@[&}&|&n$1&2&3&4&5&6&7&8&9&0&a&n@d$b&c&5+d&6+~%M%e&f&g&h&i&j&'$k&l&m&n& ", +" o&p&q&r&s& t&u&Q v&w&x&y&z&A&B&C&D&E&F&G&H&I&G$J&K&L&M&K#e$N&O&j&P&Q&R&S&T&U&V&W&X&Y&Z& ", +" `& *.*+*@*#* $*%*&***=*-*;*>*,*'*)*!*~* +{*]*^*/*)%(*_*'#M${%:*<*[*}*[*|*1*[+^%W&2*3*4* ", +" 5*6*7*8*9*0*a* b*c*d*e*f*g*h*i*n@j*k*l*m*|+n*o*p*q*N&!%!%M$f%g%j&S%|*r*s*T&t*g$k&u*v*w*x* ", +" y*z*A*8*B*C*D*E*F* G*H*I*J*K*L*M*R+N*O*P*Q*5+P+R*S*T*:+{%~%f%~%M%U*V*r*W*T&<*X*Y*Z*`*3*>. = ", +" y*.=A*8*+=@=#=$=%=&= *===-=;=>=,=I#'=)=!=K&d&H%~={=]=^=/=/=e%(=2@<*_=r*W*:=[*P%<=[=}=|=Z*1= ", +" 2=6*3=4=5=6=7=8=9=0=a=b=c= d=e=f=g=h=P*i=j=k=l=m=n=o=p=q=)&r=K%s=t=u=v=r*w=x=y=z=A=B=C=D= ", +" E=F=G=H=I=J=K=K=L=M=N=O=P=Q= R=S=_*j=T=c&U=@+L$e$V=i$!&W=X=Y=g%~%Z=`= -O%.-+-@-#-3*$-%-&- ", +" *-=---;->-,-'-)-!-~-{-]-^-/-(-_- :-d&<-[-}-b&*$:@;%,&M%|-1-2-3-(=~%T&O%4-5-6-7-8-9-0-a- ", +" b-c-d-e-f-!-g-g-h-i-+=@=@=9*j-k-l-m-n-f%o-p-<-;$;$h@'#f%q-r-s-t-u-N%g%v-w-#$x-y-z-A-B- ", +" C-D-E-F-G-H-I-J-K-L-M-+=N-O-P-Q-R-S-T-U-V-W-*%X-d&K#)%J%Y-Z-`- ;!&S&.;+;@;#;$;%;&; ", +" *;=;-;;;>;,;e-';';);!;!;~;{;];^;/;(;_;:;<;[;};/@6+!%e%|;1;2;+;i&3;|*|*4;z=5;6;7; ", +" 8;9;M=8*0;a;b;c;d;e;f;B*B*g;h;i;j;k;l;m;n;o;p;Y*q;f$g%r;s;t;u;!&i&O%v;w;x;y;z;A; ", +" B;C;D;A*E;0;F;-;G;H;I;J;K;L;M;K;N;O;P;Q;R;S;T;U;V;W;X;Y;Z;`; >3;.>+>@>#>$>%>&>*> ", +" =>->8*;>>>a;>;c;,>'>)>!>~>;;M;F;L;{>]>^>/>(>_>:><>[>}>S%!&|>m#}>1>2>3>4>5>6>7>8> ", +" 9>0>+=a>-;g;@=b>c>d>e>f>g>7*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>2=K>L>M>N>O>P>Q>R>S>T>U>V>W>X>Y>Z>`> ,.,+,@,#,$,%,&,*,=,-,;,>,,,',),!,~,{,], ", +" ^,/,(,_,:,<,[,},|,1,2,3,4,5,E=6,7,8,9,0,a,+,b,c,.*d,e,f,g,s=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,7=G,7,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,`, '.'+'@'#' ", +" $'%'&'*'='-';'Q;>',''')'!'~'9*{']'^'/'('_':'<'['}'|'1'2'3'4'5'6'7'8'9'^$0'a'b' ", +" n>c'd'e'f'g'h'i'j'k'l'm'n'o'L,p'q'r's't'u'v'w'x'y'z'A'B'C'D'E'a#F'G'H'I' ", +" a=J'K'L'M'N'O'P'Q'R'S'T'U'V'W'X'Y'Z'`' ).)+)@)#)$)%)&)*)=)-);)>),) ", +" ')))!)~){)])^)/)()_):)<)[)})|)1)2)3)4)5)6)7)8)9)0)a)b)8'c)d)e)f) ", +" g)h)i)j)k)-'l)m):)n)[)o)p)q)r)3)s)t)u)v)w)x)y)z)A)B)C)D)E)F) ", +" G)G)H)I)J)K)L)n)[)M)8;N)O)3)P)Q)R) S)T)U)V)W)X)3@Y)Z)`) ", +" !.!+!@!#!<)$!%!&!*!8;=!-!;!>!,! '!)!!!~!{!]!$*^!/!(! ", +" _!:!~,~'~ ", +" )~!~~~{~]~^~/~(~_~:~2!<~[~}~|~ 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~a'I~J~K~ ", +" L~M~N~O~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{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{R$N{O{ ", +" P{Q{R{S{T{ U{V{W{X{Y{Z{ `{ ].]+]@] ", +" #]$]%]&]*]=] -];]>],]'])]!]~]{]]] ", +" ^]/](]_]:]<] []}]z~|] 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]r]F] ", +" G]H]I]J]K]L]M]N]O]P]Q]R]S] ", +" T]U]V]W]X]Y]Z] `] ^.^ ", +" +^@^#^$^%^&^*^=^-^;^>^ ", +" ,^'^)^!^~^{^]^^^/^ ", +" (^_^:^<^[^}^|^ ", +" 1^2^3^4^5^ ", +" 6^7^8^ ", +" 9^ ", +" ", +" "}; diff --git a/Plugins/org.mitk.gui.qt.xnat/resources/xnat_search_icon.xpm b/Plugins/org.mitk.gui.qt.xnat/resources/xnat_search_icon.xpm new file mode 100644 index 0000000000..d518391531 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/resources/xnat_search_icon.xpm @@ -0,0 +1,1600 @@ +/* XPM */ +static char * C:\home\knorr\xnat\src\MITK\Plugins\org_mitk_gui_qt_xnatinterface\resources\xnat_search_icon_xpm[] = { +"77 80 1517 2", +" c None", +". c #E4D800", +"+ c #D8D000", +"@ c #F1E700", +"# c #EEE000", +"$ c #EED700", +"% c #EED800", +"& c #E5D500", +"* c #DDD600", +"= c #D7D700", +"- c #D2D500", +"; c #C8CC00", +"> c #BCB700", +", c #E2DC00", +"' c #E4CA00", +") c #E4D000", +"! c #E5D000", +"~ c #E4CD00", +"{ c #E0B800", +"] c #E2C300", +"^ c #E7D200", +"/ c #EADD00", +"( c #EBDF00", +"_ c #EBE000", +": c #EADC00", +"< c #E8DC00", +"[ c #E4DC00", +"} c #E3E000", +"| c #DEE200", +"1 c #D9DE00", +"2 c #CAD100", +"3 c #B9B500", +"4 c #C7BC00", +"5 c #D1C500", +"6 c #D6C200", +"7 c #D8B900", +"8 c #DAB700", +"9 c #DCBD00", +"0 c #E1C600", +"a c #E3CB00", +"b c #E4CC00", +"c c #E3CA00", +"d c #EEBC00", +"e c #EFC500", +"f c #F1D000", +"g c #F3D900", +"h c #F3DD00", +"i c #F2DF00", +"j c #F2E000", +"k c #F0E100", +"l c #EAE000", +"m c #EBE500", +"n c #E5E500", +"o c #D8D800", +"p c #C3C300", +"q c #DCC200", +"r c #CCBE00", +"s c #D9CA00", +"t c #DFCA00", +"u c #E1C500", +"v c #E5C300", +"w c #E7C900", +"x c #EDCF00", +"y c #EED300", +"z c #EFD400", +"A c #F0D400", +"B c #FFCF00", +"C c #FFD100", +"D c #FFD300", +"E c #FFD600", +"F c #FFDA00", +"G c #FCDE00", +"H c #FBDF00", +"I c #F6E100", +"J c #F2E100", +"K c #EEDF00", +"L c #E0D000", +"M c #C4B300", +"N c #0DAE00", +"O c #036C00", +"P c #037300", +"Q c #DAC500", +"R c #D3C400", +"S c #E6D500", +"T c #E9D200", +"U c #EBCE00", +"V c #EDCD00", +"W c #F2D200", +"X c #F4D600", +"Y c #F6D900", +"Z c #F7DA00", +"` c #F7D900", +" . c #FFD700", +".. c #FFD200", +"+. c #FFCE00", +"@. c #FCDC00", +"#. c #F8DE00", +"$. c #F3DA00", +"%. c #EACB00", +"&. c #D2A900", +"*. c #00B70C", +"=. c #00A50A", +"-. c #009C0B", +";. c #037700", +">. c #038900", +",. c #D2BE00", +"'. c #D0C300", +"). c #E6D700", +"!. c #EBD500", +"~. c #EDD200", +"{. c #F1D100", +"]. c #F4D300", +"^. c #F6D500", +"/. c #F6D600", +"(. c #F7D600", +"_. c #F7D500", +":. c #FBD900", +"<. c #FCD300", +"[. c #FDC900", +"}. c #FBC800", +"|. c #FCCF00", +"1. c #FAD900", +"2. c #F8DC00", +"3. c #EACF00", +"4. c #DCB500", +"5. c #0EB800", +"6. c #01A200", +"7. c #009F08", +"8. c #00A80E", +"9. c #00B813", +"0. c #00C314", +"a. c #017E00", +"b. c #009502", +"c. c #C2B600", +"d. c #DACF00", +"e. c #DFD100", +"f. c #E6D100", +"g. c #E9CE00", +"h. c #F4D500", +"i. c #F5D500", +"j. c #F3DE00", +"k. c #F5DD00", +"l. c #F4D800", +"m. c #F3CD00", +"n. c #F1CA00", +"o. c #F3CF00", +"p. c #F5D700", +"q. c #F2D700", +"r. c #E3C400", +"s. c #C89900", +"t. c #1FAF00", +"u. c #15A800", +"v. c #0BA500", +"w. c #03AF00", +"x. c #00BB05", +"y. c #00C30D", +"z. c #00CA12", +"A. c #00D216", +"B. c #018200", +"C. c #00AE02", +"D. c #BDB300", +"E. c #D7CF00", +"F. c #DED100", +"G. c #E4D100", +"H. c #E8CD00", +"I. c #ECCC00", +"J. c #EECE00", +"K. c #F0D100", +"L. c #F1D300", +"M. c #F2D300", +"N. c #F3D200", +"O. c #EDDD00", +"P. c #EDD800", +"Q. c #EDD400", +"R. c #ECD200", +"S. c #EBD200", +"T. c #E7CD00", +"U. c #CFB100", +"V. c #16E200", +"W. c #0FAC00", +"X. c #0FBC00", +"Y. c #0CBF00", +"Z. c #09C300", +"`. c #03C800", +" + c #00CB03", +".+ c #00CB06", +"++ c #00C807", +"@+ c #00C709", +"#+ c #038000", +"$+ c #B8AF00", +"%+ c #D4CC00", +"&+ c #DED200", +"*+ c #E2CE00", +"=+ c #E6CB00", +"-+ c #E7C800", +";+ c #EBCB00", +">+ c #EDCE00", +",+ c #EDD100", +"'+ c #EED000", +")+ c #EECF00", +"!+ c #E6DE00", +"~+ c #E7DE00", +"{+ c #E8DE00", +"]+ c #E8DB00", +"^+ c #E5D600", +"/+ c #DFCC00", +"(+ c #D6B900", +"_+ c #BA9600", +":+ c #04BC00", +"<+ c #049F00", +"[+ c #01AC00", +"}+ c #01CD00", +"|+ c #00C800", +"1+ c #00D300", +"2+ c #00D900", +"3+ c #00D800", +"4+ c #01CE00", +"5+ c #01C600", +"6+ c #02C000", +"7+ c #037B00", +"8+ c #B5AB00", +"9+ c #D2C900", +"0+ c #E1CC00", +"a+ c #E3C700", +"b+ c #E5C400", +"c+ c #E7C600", +"d+ c #EACC00", +"e+ c #EACE00", +"f+ c #EACD00", +"g+ c #E1CA00", +"h+ c #E5D200", +"i+ c #E8DA00", +"j+ c #E8DF00", +"k+ c #E1D300", +"l+ c #D6BF00", +"m+ c #BD9B00", +"n+ c #099300", +"o+ c #029800", +"p+ c #00B503", +"q+ c #00D006", +"r+ c #00DD00", +"s+ c #00E600", +"t+ c #00D000", +"u+ c #07CE00", +"v+ c #0AC700", +"w+ c #0CBB00", +"x+ c #057000", +"y+ c #B6A900", +"z+ c #D2C600", +"A+ c #DDCD00", +"B+ c #E1C800", +"C+ c #E2C200", +"D+ c #E3C100", +"E+ c #E8CA00", +"F+ c #DBC200", +"G+ c #CDB600", +"H+ c #000000", +"I+ c #817800", +"J+ c #6F6900", +"K+ c #696000", +"L+ c #3F3700", +"M+ c #1C9E00", +"N+ c #118900", +"O+ c #08A800", +"P+ c #04C400", +"Q+ c #00C602", +"R+ c #00C900", +"S+ c #00E100", +"T+ c #00E000", +"U+ c #00E300", +"V+ c #00DC00", +"W+ c #00CF00", +"X+ c #00CA00", +"Y+ c #05CA00", +"Z+ c #08C200", +"`+ c #07B500", +" @ c #0A6200", +".@ c #BEAA00", +"+@ c #D5C400", +"@@ c #DCC700", +"#@ c #E0C500", +"$@ c #E2BF00", +"%@ c #E4C000", +"&@ c #3D3600", +"*@ c #574E00", +"=@ c #252302", +"-@ c #0F1102", +";@ c #1D1F06", +">@ c #060600", +",@ c #0C0D03", +"'@ c #000304", +")@ c #000101", +"!@ c #000102", +"~@ c #11B000", +"{@ c #0FB700", +"]@ c #0BB600", +"^@ c #08B300", +"/@ c #05BE00", +"(@ c #03D000", +"_@ c #01D300", +":@ c #00C500", +"<@ c #00D200", +"[@ c #00CD00", +"}@ c #00CC02", +"|@ c #00C901", +"1@ c #00C000", +"2@ c #00B400", +"3@ c #C5AC00", +"4@ c #D8C300", +"5@ c #D8C100", +"6@ c #DFC200", +"7@ c #E2BE00", +"8@ c #D1AC00", +"9@ c #816E00", +"0@ c #080700", +"a@ c #090900", +"b@ c #000203", +"c@ c #0B7902", +"d@ c #05DE00", +"e@ c #00C400", +"f@ c #08D400", +"g@ c #0CDB00", +"h@ c #0CD000", +"i@ c #0AC900", +"j@ c #0BCC00", +"k@ c #08C400", +"l@ c #06C200", +"m@ c #02C400", +"n@ c #00CB02", +"o@ c #00CB07", +"p@ c #00B708", +"q@ c #00A908", +"r@ c #CAAD00", +"s@ c #D9C200", +"t@ c #D8BE00", +"u@ c #D6B700", +"v@ c #897200", +"w@ c #473B00", +"x@ c #1A1600", +"y@ c #0C1209", +"z@ c #232911", +"A@ c #26270B", +"B@ c #3D3F0E", +"C@ c #585B14", +"D@ c #7D831D", +"E@ c #899021", +"F@ c #74791F", +"G@ c #001216", +"H@ c #00323E", +"I@ c #00262E", +"J@ c #002E28", +"K@ c #009001", +"L@ c #00E700", +"M@ c #00CB00", +"N@ c #13C500", +"O@ c #14BE00", +"P@ c #13BD00", +"Q@ c #0CB500", +"R@ c #05B200", +"S@ c #00B601", +"T@ c #00B808", +"U@ c #00AC02", +"V@ c #009F04", +"W@ c #00900B", +"X@ c #AB9D00", +"Y@ c #C8BD00", +"Z@ c #373400", +"`@ c #283013", +" # c #748025", +".# c #D69C00", +"+# c #EBAB00", +"@# c #EEAE00", +"## c #C0AF00", +"$# c #13811D", +"%# c #0B8430", +"&# c #006D3A", +"*# c #005A3E", +"=# c #00C700", +"-# c #00C402", +";# c #00BF02", +"># c #00C002", +",# c #00C300", +"'# c #00C200", +")# c #00B900", +"!# c #00A200", +"~# c #009700", +"{# c #019500", +"]# c #018C00", +"^# c #029000", +"/# c #029500", +"(# c #A69900", +"_# c #8D8801", +":# c #3F4917", +"<# c #818921", +"[# c #00A90E", +"}# c #06C100", +"|# c #007004", +"1# c #00AE01", +"2# c #009102", +"3# c #009301", +"4# c #009800", +"5# c #00A000", +"6# c #00A300", +"7# c #039F00", +"8# c #019600", +"9# c #019E00", +"0# c #01AA00", +"a# c #7B7302", +"b# c #313A0F", +"c# c #010201", +"d# c #070A04", +"e# c #34390E", +"f# c #7F841C", +"g# c #CFAF00", +"h# c #A8AB02", +"i# c #009904", +"j# c #00C707", +"k# c #008906", +"l# c #008802", +"m# c #008301", +"n# c #008D00", +"o# c #00A600", +"p# c #00B600", +"q# c #00BB00", +"r# c #02B800", +"s# c #02AD00", +"t# c #01A900", +"u# c #02AF00", +"v# c #030C0B", +"w# c #48672A", +"x# c #899A22", +"y# c #00971C", +"z# c #009823", +"A# c #00A514", +"B# c #00CA07", +"C# c #00CA02", +"D# c #00B203", +"E# c #00BD02", +"F# c #00BC02", +"G# c #00BF00", +"H# c #00BC00", +"I# c #00B800", +"J# c #01B500", +"K# c #01A800", +"L# c #02A600", +"M# c #02B100", +"N# c #101708", +"O# c #C18D00", +"P# c #1E7407", +"Q# c #006212", +"R# c #007C1C", +"S# c #008F14", +"T# c #001700", +"U# c #00C601", +"V# c #00C100", +"W# c #00BA00", +"X# c #00B700", +"Y# c #02A500", +"Z# c #02A300", +"`# c #01B400", +" $ c #000709", +".$ c #0B0F05", +"+$ c #CB9400", +"@$ c #0D5704", +"#$ c #007011", +"$$ c #000B02", +"%$ c #007D0C", +"&$ c #009401", +"*$ c #009500", +"=$ c #00B000", +"-$ c #01AF00", +";$ c #01A100", +">$ c #009F00", +",$ c #01B300", +"'$ c #000404", +")$ c #00181B", +"!$ c #3EAF08", +"~$ c #0EA408", +"{$ c #007B06", +"]$ c #009000", +"^$ c #008F00", +"/$ c #009C00", +"($ c #01AB00", +"_$ c #019C00", +":$ c #03B300", +"<$ c #837207", +"[$ c #00B301", +"}$ c #00AE00", +"|$ c #00AB00", +"1$ c #02AE00", +"2$ c #02A800", +"3$ c #029900", +"4$ c #02B000", +"5$ c #856E07", +"6$ c #807508", +"7$ c #00A104", +"8$ c #00B100", +"9$ c #00B200", +"0$ c #009D00", +"a$ c #019300", +"b$ c #00AF00", +"c$ c #003A82", +"d$ c #000405", +"e$ c #B08B08", +"f$ c #897D08", +"g$ c #827B08", +"h$ c #002B06", +"i$ c #029600", +"j$ c #019100", +"k$ c #02AB00", +"l$ c #00387D", +"m$ c #003D91", +"n$ c #0035D2", +"o$ c #8E8008", +"p$ c #676208", +"q$ c #007E0B", +"r$ c #008701", +"s$ c #009400", +"t$ c #029700", +"u$ c #029F00", +"v$ c #028900", +"w$ c #00469B", +"x$ c #0047A8", +"y$ c #0035B1", +"z$ c #00102A", +"A$ c #9F9107", +"B$ c #646308", +"C$ c #837C06", +"D$ c #81B807", +"E$ c #54B008", +"F$ c #008A06", +"G$ c #008A02", +"H$ c #009100", +"I$ c #018700", +"J$ c #00A100", +"K$ c #004FAC", +"L$ c #0050C2", +"M$ c #0048CA", +"N$ c #001721", +"O$ c #7B7407", +"P$ c #817B07", +"Q$ c #AE9E07", +"R$ c #BDA607", +"S$ c #BDA308", +"T$ c #72C708", +"U$ c #55B507", +"V$ c #00A806", +"W$ c #008102", +"X$ c #019A00", +"Y$ c #019400", +"Z$ c #018D00", +"`$ c #008700", +" % c #0052B5", +".% c #0057D3", +"+% c #9C9207", +"@% c #645D07", +"#% c #8E8107", +"$% c #B4A308", +"%% c #BCA808", +"&% c #4CCE07", +"*% c #2FB707", +"=% c #00920B", +"-% c #006503", +";% c #029E00", +">% c #03A500", +",% c #007F00", +"'% c #0054BA", +")% c #005FE3", +"!% c #0051B7", +"~% c #001F3F", +"{% c #002A67", +"]% c #004FBC", +"^% c #0058BE", +"/% c #635907", +"(% c #766D08", +"_% c #A99C08", +":% c #B7AC07", +"<% c #26CD07", +"[% c #17C108", +"}% c #006007", +"|% c #00220D", +"1% c #004506", +"2% c #008800", +"3% c #028A00", +"4% c #008600", +"5% c #028300", +"6% c #0062E9", +"7% c #001D44", +"8% c #00070E", +"9% c #002D79", +"0% c #0051C6", +"a% c #004C9B", +"b% c #004875", +"c% c #6E6408", +"d% c #B3AA07", +"e% c #09C608", +"f% c #0AC508", +"g% c #08C307", +"h% c #00BD0A", +"i% c #005F07", +"j% c #001408", +"k% c #00370A", +"l% c #006A00", +"m% c #007800", +"n% c #027A00", +"o% c #009200", +"p% c #009A00", +"q% c #007AFF", +"r% c #0062F5", +"s% c #001E4B", +"t% c #000E1C", +"u% c #0061F4", +"v% c #0054F2", +"w% c #0047F1", +"x% c #003DF4", +"y% c #0040FA", +"z% c #517F07", +"A% c #00BB17", +"B% c #048300", +"C% c #000703", +"D% c #012E0D", +"E% c #065201", +"F% c #0C6100", +"G% c #146000", +"H% c #0068EE", +"I% c #0057D6", +"J% c #005FF5", +"K% c #002153", +"L% c #000D1A", +"M% c #000205", +"N% c #000B1B", +"O% c #0066F4", +"P% c #005EF3", +"Q% c #0051F2", +"R% c #0045E7", +"S% c #003DD5", +"T% c #0042D3", +"U% c #367907", +"V% c #00BF0E", +"W% c #023F0E", +"X% c #0D7A01", +"Y% c #199D00", +"Z% c #0055CD", +"`% c #0056D9", +" & c #005BF0", +".& c #005BD5", +"+& c #00162C", +"@& c #003168", +"#& c #006FF6", +"$& c #006AF4", +"%& c #0060F7", +"&& c #0058F2", +"*& c #0051DF", +"=& c #004CBF", +"-& c #005AAC", +";& c #0092AF", +">& c #00C007", +",& c #049A00", +"'& c #07570E", +")& c #0048B9", +"!& c #0053E1", +"~& c #0056F0", +"{& c #001533", +"]& c #005FC6", +"^& c #0071F6", +"/& c #006DF6", +"(& c #0069F9", +"_& c #0068FA", +":& c #0060DF", +"<& c #005DB4", +"[& c #006A9D", +"}& c #007F84", +"|& c #00664F", +"1& c #008D5B", +"2& c #00B707", +"3& c #049000", +"4& c #013900", +"5& c #00181C", +"6& c #0043B6", +"7& c #0051E8", +"8& c #0057F5", +"9& c #0051D1", +"0& c #0061CA", +"a& c #0072F8", +"b& c #006EF8", +"c& c #006BF9", +"d& c #0069FA", +"e& c #0064F8", +"f& c #0068F0", +"g& c #006FE3", +"h& c #006BBB", +"i& c #005BEE", +"j& c #00596A", +"k& c #00A41E", +"l& c #000E10", +"m& c #0046C2", +"n& c #0056EF", +"o& c #005CFF", +"p& c #004FE5", +"q& c #00091B", +"r& c #006DF8", +"s& c #006AF9", +"t& c #0061FA", +"u& c #0064F9", +"v& c #006BDE", +"w& c #005187", +"x& c #005E8C", +"y& c #009D36", +"z& c #00A319", +"A& c #00610B", +"B& c #007D12", +"C& c #0046C4", +"D& c #004ED5", +"E& c #005CF7", +"F& c #0066FF", +"G& c #004DFF", +"H& c #00133D", +"I& c #0065EA", +"J& c #006AF8", +"K& c #0067FB", +"L& c #0066F9", +"M& c #0063FA", +"N& c #005FFA", +"O& c #005EF8", +"P& c #005DE8", +"Q& c #006EF0", +"R& c #00519D", +"S& c #008C62", +"T& c #009632", +"U& c #00A308", +"V& c #085205", +"W& c #001417", +"X& c #0047BF", +"Y& c #0059E4", +"Z& c #005BFE", +"`& c #006FFF", +" * c #0048FF", +".* c #000F32", +"+* c #004194", +"@* c #0066F5", +"#* c #005DF9", +"$* c #0056F7", +"%* c #0056FA", +"&* c #005DFA", +"** c #0059F6", +"=* c #0060F5", +"-* c #0046A0", +";* c #005A8A", +">* c #007D93", +",* c #00885B", +"'* c #009425", +")* c #09A408", +"!* c #317B07", +"~* c #061000", +"{* c #001013", +"]* c #0044B0", +"^* c #0064F4", +"/* c #0077FF", +"(* c #004EFF", +"_* c #0050FE", +":* c #0064EE", +"<* c #0065F6", +"[* c #005FF6", +"}* c #005AF9", +"|* c #0055FA", +"1* c #0056F6", +"2* c #0058F9", +"3* c #0064DE", +"4* c #004EA8", +"5* c #006AB8", +"6* c #007386", +"7* c #007E51", +"8* c #4B6807", +"9* c #5A7B06", +"0* c #0D1200", +"a* c #000F11", +"b* c #000B0D", +"c* c #000B0C", +"d* c #004EBE", +"e* c #0069F4", +"f* c #0068FF", +"g* c #005EFF", +"h* c #0061FF", +"i* c #003A90", +"j* c #002559", +"k* c #0059C8", +"l* c #0061F1", +"m* c #005BF2", +"n* c #005AF0", +"o* c #005AEF", +"p* c #005BED", +"q* c #0061D9", +"r* c #0066B5", +"s* c #006E8A", +"t* c #009157", +"u* c #307B08", +"v* c #636507", +"w* c #727206", +"x* c #908E04", +"y* c #908F08", +"z* c #0042A3", +"A* c #004DB6", +"B* c #0063E0", +"C* c #0074FF", +"D* c #0067F6", +"E* c #0068F5", +"F* c #006BF4", +"G* c #0069E8", +"H* c #0069F1", +"I* c #0067EC", +"J* c #0063E9", +"K* c #0062E7", +"L* c #0062E6", +"M* c #0061EA", +"N* c #005CE7", +"O* c #005BDB", +"P* c #005EBD", +"Q* c #005D6B", +"R* c #005E6C", +"S* c #006674", +"T* c #3F6907", +"U* c #8B7306", +"V* c #AE8F04", +"W* c #897506", +"X* c #001518", +"Y* c #003484", +"Z* c #00459D", +"`* c #0054B6", +" = c #0066D9", +".= c #006BE8", +"+= c #0074EF", +"@= c #0074EC", +"#= c #006FE7", +"$= c #006CE7", +"%= c #003F82", +"&= c #005BC6", +"*= c #0060D6", +"== c #0062DC", +"-= c #0065E2", +";= c #0062E2", +">= c #0058E7", +",= c #0054E9", +"'= c #0052DC", +")= c #0057B4", +"!= c #00677C", +"~= c #007D3B", +"{= c #008E08", +"]= c #11A308", +"^= c #659C00", +"/= c #3B5204", +"(= c #586A05", +"_= c #675203", +":= c #001A1E", +"<= c #002A30", +"[= c #0055BE", +"}= c #0057B8", +"|= c #0058B0", +"1= c #005CB7", +"2= c #0061C1", +"3= c #0068CF", +"4= c #0072E0", +"5= c #0074E8", +"6= c #005EC6", +"7= c #000C1A", +"8= c #00204A", +"9= c #003884", +"0= c #0065E4", +"a= c #0064DD", +"b= c #0064DF", +"c= c #0059DE", +"d= c #0052E6", +"e= c #004DE0", +"f= c #004FC9", +"g= c #005C9C", +"h= c #006B61", +"i= c #007B30", +"j= c #00880D", +"k= c #088D08", +"l= c #128908", +"m= c #238308", +"n= c #417E07", +"o= c #658407", +"p= c #899206", +"q= c #9C9603", +"r= c #0C0C01", +"s= c #020200", +"t= c #040806", +"u= c #202912", +"v= c #002F37", +"w= c #006FD0", +"x= c #006CC5", +"y= c #0057B6", +"z= c #0055B6", +"A= c #0056BD", +"B= c #005CCD", +"C= c #0062E3", +"D= c #004EB8", +"E= c #002C60", +"F= c #005DE3", +"G= c #0061DF", +"H= c #0054D4", +"I= c #004ECF", +"J= c #004AC1", +"K= c #004DA2", +"L= c #005581", +"M= c #005D5A", +"N= c #006135", +"O= c #006A13", +"P= c #177607", +"Q= c #397D07", +"R= c #547A05", +"S= c #747B03", +"T= c #968503", +"U= c #0D160E", +"V= c #242D11", +"W= c #585F17", +"X= c #005EF0", +"Y= c #0048C2", +"Z= c #0044BA", +"`= c #0047CC", +" - c #0043CC", +".- c #003DB1", +"+- c #0052D1", +"@- c #0059DB", +"#- c #004DB4", +"$- c #003D8E", +"%- c #005DCC", +"&- c #0058BF", +"*- c #0050B3", +"=- c #0046A6", +"-- c #00419C", +";- c #004190", +">- c #004577", +",- c #004951", +"'- c #005423", +")- c #206C04", +"!- c #3F7605", +"~- c #587506", +"{- c #717105", +"]- c #77670A", +"^- c #0F1407", +"/- c #1B2008", +"(- c #2C300B", +"_- c #0044F6", +":- c #003ADA", +"<- c #0038D0", +"[- c #0033B9", +"}- c #003773", +"|- c #002A62", +"1- c #000F25", +"2- c #002968", +"3- c #004CAF", +"4- c #005FC9", +"5- c #0058AD", +"6- c #004B93", +"7- c #004292", +"8- c #002258", +"9- c #003654", +"0- c #00613A", +"a- c #2C8403", +"b- c #0B1309", +"c- c #08100A", +"d- c #020201", +"e- c #17200D", +"f- c #003AA9", +"g- c #002B94", +"h- c #002993", +"i- c #00101E", +"j- c #00121D", +"k- c #000306", +"l- c #003FA9", +"m- c #001131", +"n- c #00323A", +"o- c #011305", +"p- c #30604C", +"q- c #1D6C68", +"r- c #03262B", +"s- c #001D24", +"t- c #041719", +"u- c #203217", +"v- c #000506", +"w- c #0035AF", +"x- c #002985", +"y- c #00121C", +"z- c #000507", +"A- c #000103", +"B- c #030400", +"C- c #1E1B07", +"D- c #1B1D0D", +"E- c #17676A", +"F- c #00A6CD", +"G- c #009CC3", +"H- c #009CC2", +"I- c #00333F", +"J- c #010606", +"K- c #000708", +"L- c #003488", +"M- c #00306D", +"N- c #003560", +"O- c #002F55", +"P- c #001727", +"Q- c #4D7327", +"R- c #2D310C", +"S- c #030200", +"T- c #0C0F07", +"U- c #095B68", +"V- c #00ABD6", +"W- c #00B0DB", +"X- c #00ADD6", +"Y- c #003D4C", +"Z- c #000F13", +"`- c #00181E", +" ; c #004AA3", +".; c #003B73", +"+; c #00305B", +"@; c #002E55", +"#; c #003869", +"$; c #003565", +"%; c #003566", +"&; c #002950", +"*; c #002B52", +"=; c #003D6B", +"-; c #004166", +";; c #4E7025", +">; c #2F300A", +",; c #110F02", +"'; c #040300", +"); c #010C0D", +"!; c #002B35", +"~; c #00667E", +"{; c #00AAD2", +"]; c #007D9C", +"^; c #00738F", +"/; c #001A21", +"(; c #000608", +"_; c #000202", +":; c #003E6F", +"<; c #003659", +"[; c #004389", +"}; c #0054A8", +"|; c #0053A5", +"1; c #0050A3", +"2; c #004FA3", +"3; c #004FA7", +"4; c #004FA8", +"5; c #004DA5", +"6; c #0049A0", +"7; c #00418F", +"8; c #003A78", +"9; c #47440A", +"0; c #382E01", +"a; c #070500", +"b; c #002E38", +"c; c #0096BB", +"d; c #00A9D2", +"e; c #00AFD9", +"f; c #00262F", +"g; c #005060", +"h; c #004C5B", +"i; c #002F38", +"j; c #002D54", +"k; c #0048BC", +"l; c #001E56", +"m; c #001B58", +"n; c #534700", +"o; c #5F5000", +"p; c #272000", +"q; c #030300", +"r; c #00080A", +"s; c #004D5F", +"t; c #00AAD3", +"u; c #00171C", +"v; c #000C0F", +"w; c #00643A", +"x; c #00532F", +"y; c #002B15", +"z; c #003E56", +"A; c #005481", +"B; c #004D8C", +"C; c #004696", +"D; c #00429B", +"E; c #003E9C", +"F; c #003FA1", +"G; c #0040AA", +"H; c #003EB0", +"I; c #0036B0", +"J; c #00268D", +"K; c #002081", +"L; c #685B00", +"M; c #9D8900", +"N; c #9F8700", +"O; c #423500", +"P; c #070701", +"Q; c #003B49", +"R; c #009DC3", +"S; c #00A8D1", +"T; c #0092B6", +"U; c #008CAF", +"V; c #004D62", +"W; c #002E3A", +"X; c #00191F", +"Y; c #00760D", +"Z; c #005A08", +"`; c #003B06", +" > c #004D40", +".> c #006267", +"+> c #00587E", +"@> c #005094", +"#> c #0048A6", +"$> c #0044AF", +"%> c #0045B7", +"&> c #0045C4", +"*> c #003FC4", +"=> c #0030A7", +"-> c #002284", +";> c #6D6000", +">> c #968300", +",> c #BEA600", +"'> c #8A7100", +")> c #3B3301", +"!> c #131808", +"~> c #041819", +"{> c #004556", +"]> c #008CAE", +"^> c #00ABD5", +"/> c #00AAD4", +"(> c #008FB2", +"_> c #00232B", +":> c #00090B", +"<> c #159800", +"[> c #0B5900", +"}> c #0B4F00", +"|> c #005924", +"1> c #00683E", +"2> c #005557", +"3> c #004D7A", +"4> c #004C9F", +"5> c #0040A0", +"6> c #003C9A", +"7> c #003791", +"8> c #0045BB", +"9> c #00277B", +"0> c #514C00", +"a> c #796A00", +"b> c #A49000", +"c> c #B09100", +"d> c #B99F00", +"e> c #4C4704", +"f> c #050904", +"g> c #011519", +"h> c #005A70", +"i> c #00AAD5", +"j> c #00ACD5", +"k> c #003745", +"l> c #000001", +"m> c #105700", +"n> c #0F5100", +"o> c #006B0F", +"p> c #007726", +"q> c #006141", +"r> c #005466", +"s> c #004880", +"t> c #00347C", +"u> c #00183E", +"v> c #403D00", +"w> c #655800", +"x> c #917D00", +"y> c #AF9100", +"z> c #BDA300", +"A> c #695E00", +"B> c #1E1D02", +"C> c #002E39", +"D> c #00647C", +"E> c #00ACD6", +"F> c #003F4E", +"G> c #000C0E", +"H> c #094D00", +"I> c #094800", +"J> c #027800", +"K> c #007F0E", +"L> c #006D2B", +"M> c #00594B", +"N> c #003850", +"O> c #002D59", +"P> c #003075", +"Q> c #003D96", +"R> c #003896", +"S> c #00368A", +"T> c #002F74", +"U> c #002149", +"V> c #5A5500", +"W> c #806F00", +"X> c #9E8500", +"Y> c #B49700", +"Z> c #B29B00", +"`> c #9B8900", +" , c #5C5300", +"., c #000406", +"+, c #004453", +"@, c #009CC1", +"#, c #00A8D2", +"$, c #00ABD4", +"%, c #004100", +"&, c #003C00", +"*, c #088000", +"=, c #008302", +"-, c #007316", +";, c #006332", +">, c #004542", +",, c #003F5D", +"', c #003A7D", +"), c #0046A9", +"!, c #0040AD", +"~, c #003FA6", +"{, c #003483", +"], c #00254E", +"^, c #676100", +"/, c #917C00", +"(, c #A58800", +"_, c #B49800", +":, c #A89100", +"<, c #9C8800", +"[, c #9A8800", +"}, c #001419", +"|, c #004B5D", +"1, c #00A9D3", +"2, c #00ABD3", +"3, c #007693", +"4, c #003440", +"5, c #003B05", +"6, c #003405", +"7, c #008300", +"8, c #007906", +"9, c #007019", +"0, c #006236", +"a, c #005F67", +"b, c #00457B", +"c, c #003F99", +"d, c #00379F", +"e, c #00339A", +"f, c #002875", +"g, c #001F47", +"h, c #5D5500", +"i, c #846E00", +"j, c #957900", +"k, c #A38B00", +"l, c #968100", +"m, c #8B7800", +"n, c #847100", +"o, c #0091B5", +"p, c #005C73", +"q, c #003207", +"r, c #00890A", +"s, c #008504", +"t, c #018100", +"u, c #007401", +"v, c #006316", +"w, c #00694A", +"x, c #004668", +"y, c #00317E", +"z, c #002D8C", +"A, c #002989", +"B, c #001F68", +"C, c #001944", +"D, c #514900", +"E, c #725F00", +"F, c #806600", +"G, c #867200", +"H, c #000E12", +"I, c #003542", +"J, c #005367", +"K, c #00ADD7", +"L, c #009BC0", +"M, c #00728E", +"N, c #023400", +"O, c #008515", +"P, c #008209", +"Q, c #047F00", +"R, c #077400", +"S, c #015A00", +"T, c #00612C", +"U, c #003C4C", +"V, c #002B6A", +"W, c #002DAB", +"X, c #00238C", +"Y, c #001C5D", +"Z, c #5F5400", +"`, c #8A7300", +" ' c #A28100", +".' c #A18900", +"+' c #A48A00", +"@' c #AB9200", +"#' c #004455", +"$' c #00A5CE", +"%' c #00AED8", +"&' c #0088A9", +"*' c #005063", +"=' c #00222A", +"-' c #000607", +";' c #0D3C00", +">' c #007317", +",' c #00640A", +"'' c #006000", +")' c #036000", +"!' c #0B6400", +"~' c #007F27", +"{' c #004B56", +"]' c #003882", +"^' c #002FAD", +"/' c #002FC7", +"(' c #0025A0", +"_' c #001B69", +":' c #635600", +"<' c #967A00", +"[' c #B18D00", +"}' c #B39900", +"|' c #B59B00", +"1' c #C3A500", +"2' c #00586D", +"3' c #007491", +"4' c #00596E", +"5' c #000F12", +"6' c #005C00", +"7' c #016300", +"8' c #005D0C", +"9' c #005C15", +"0' c #00500D", +"a' c #00342E", +"b' c #002B56", +"c' c #004193", +"d' c #003AA0", +"e' c #004097", +"f' c #00255B", +"g' c #856300", +"h' c #B39300", +"i' c #A79000", +"j' c #666F00", +"k' c #778200", +"l' c #000D10", +"m' c #0082A2", +"n' c #004253", +"o' c #00141B", +"p' c #157E00", +"q' c #007100", +"r' c #008517", +"s' c #00751A", +"t' c #005A0D", +"u' c #005A06", +"v' c #002F5A", +"w' c #003F90", +"x' c #0042A6", +"y' c #003D8F", +"z' c #00265C", +"A' c #604200", +"B' c #8D6900", +"C' c #AF9000", +"D' c #A89300", +"E' c #717C00", +"F' c #003B4A", +"G' c #0094B8", +"H' c #009DC2", +"I' c #0082A1", +"J' c #000D11", +"K' c #22BB00", +"L' c #006800", +"M' c #008114", +"N' c #007817", +"O' c #005C0A", +"P' c #005E0B", +"Q' c #00355A", +"R' c #003887", +"S' c #0042A0", +"T' c #003883", +"U' c #583F00", +"V' c #936D00", +"W' c #A48800", +"X' c #AB9700", +"Y' c #00171D", +"Z' c #00303C", +"`' c #00657D", +" ) c #007593", +".) c #003340", +"+) c #001114", +"@) c #026C00", +"#) c #00690A", +"$) c #007412", +"%) c #006209", +"&) c #00650D", +"*) c #003C5D", +"=) c #003781", +"-) c #003990", +";) c #003477", +">) c #584300", +",) c #8E6D00", +"') c #9C8000", +")) c #AE9900", +"!) c #000A0C", +"~) c #00A6CE", +"{) c #0085A5", +"]) c #000A0D", +"^) c #048000", +"/) c #006D0B", +"() c #006A07", +"_) c #007012", +":) c #004764", +"<) c #003D81", +"[) c #00317C", +"}) c #002E6D", +"|) c #654E00", +"1) c #856900", +"2) c #9A7E00", +"3) c #B8A200", +"4) c #001920", +"5) c #004759", +"6) c #007F9E", +"7) c #008DAE", +"8) c #006B84", +"9) c #001E26", +"0) c #000305", +"a) c #005A05", +"b) c #006604", +"c) c #006A04", +"d) c #007615", +"e) c #00AB61", +"f) c #005168", +"g) c #003977", +"h) c #002B6C", +"i) c #002354", +"j) c #343300", +"k) c #6D5800", +"l) c #856B00", +"m) c #B49B00", +"n) c #00151B", +"o) c #00647E", +"p) c #009BC1", +"q) c #007895", +"r) c #003846", +"s) c #001115", +"t) c #005E00", +"u) c #006300", +"v) c #007717", +"w) c #00A45B", +"x) c #005664", +"y) c #00346C", +"z) c #00245E", +"A) c #001833", +"B) c #463C00", +"C) c #6F5E00", +"D) c #8F7600", +"E) c #9D8400", +"F) c #00222B", +"G) c #006F8A", +"H) c #0087A7", +"I) c #0094B7", +"J) c #004152", +"K) c #00090C", +"L) c #055A00", +"M) c #007C1A", +"N) c #00A659", +"O) c #005961", +"P) c #003462", +"Q) c #001C53", +"R) c #4F4400", +"S) c #716200", +"T) c #A48D00", +"U) c #00232C", +"V) c #00556B", +"W) c #0087A8", +"X) c #00B1DC", +"Y) c #004353", +"Z) c #0D8100", +"`) c #006204", +" ! c #00741A", +".! c #008745", +"+! c #005A5B", +"@! c #002C51", +"#! c #00164E", +"$! c #150F00", +"%! c #574B00", +"&! c #8E8400", +"*! c #002129", +"=! c #007D9B", +"-! c #006983", +";! c #002D39", +">! c #006906", +",! c #005102", +"'! c #008A46", +")! c #005953", +"!! c #002747", +"~! c #00062D", +"{! c #231600", +"]! c #675B00", +"^! c #A7A300", +"/! c #002630", +"(! c #001B22", +"_! c #00242D", +":! c #00303B", +" ", +" , ' ) ! ~ { ] ^ / ( _ : < [ } | 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 O P ", +" Q R S T U V W X Y Z ` F ...+.C .@.#.$.%.&. *.=.-.;.>. ", +" ,.'.).!.~.{.].^./.(._.:.:.<.[.}.|.1.2.3.4. 5.6.7.8.9.0.a.b. ", +" c.d.e.f.g.V f W 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._ _ O.P.Q.R.S.T.U. V.W.X.Y.Z.`. +.+++@+#+ ", +" $+%+&+*+=+-+;+>+,+'+)+!+!+~+{+]+^+/+(+_+ :+<+[+}+|+1+2+3+1+4+5+6+7+ ", +" 8+9+F.0+a+b+c+d+e+f+f+g+h+i+j+~+k+l+m+ n+o+p+q+3+r+s+s+3+t+u+v+w+x+ ", +" y+z+A+B+C+D+b+E+H.F+G+H+H+H+I+J+K+L+ H+H+H+H+ M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @ ", +" .@+@@@#@$@%@b+H+&@*@=@H+H+H+-@;@>@,@'@)@H+H+H+!@H+H+H+~@{@]@^@/@(@_@:@t+<@t+[@}@|@1@2@ ", +" 3@4@5@6@7@8@9@H+0@a@H+H+H+H+H+H+H+H+H+H+H+H+H+H+b@H+c@d@R+e@f@g@h@i@j@k@l@m@n@o@@+p@q@ ", +" r@s@t@u@v@w@x@H+H+H+y@z@A@B@C@D@E@F@ G@H@I@J@H+H+H+K@L@2+M@v+N@O@P@Q@R@S@T@U@V@W@ ", +" X@Y@Z@H+H+H+H+`@ #.#+#@#@#@#@##### $#%#&#*#H+H+H+H+=#-#;#>#,#'#)#!#~#{#]#^#/# ", +" (#_#H+H+H+H+:#<#@#@#@#@#@#@#@##### [#}#}#}#H+H+H+H+|#1#b.2#3#4#5#6#!#7#8#9#0# ", +" a#b#H+c#d#e#f#@#@#@#@#@#@#g#g#g#h# i#j#}#}#}#}#H+H+H+H+k#l#m#m#n#o#p#q#r#s#t#u# ", +" H+H+v#w#x#@#@#@#@#@#@#@#@#g#g#g#g# y#z#A#B#}#C#C#C#}#H+H+H+H+D#E#F#q#G#H#I#J#K#L#M# ", +" H+H+H+N#O#@#@#@#@#@#@#@#@#@#g#g#g#g#P#Q#R#S#}#}#C#C#C#C#C#H+H+H+H+T#U#V#'#W#X#M#Y#Z#`# ", +" $H+H+.$H++$@#@#@#@#@#@#@#@#g#g#g#g#g#@$#$}#C#C#C#C#C#C#C#C#C#$$H+H+%$&$*$4#6#=$-$;$>$,$ ", +" H+H+'$)$H+@#@#@#@#@#@#@#@#g#g#g#g#g#!$~$}#C#C#C#C#C#C#C#C#C#C#}#H+H+H+{$]$^$/$[+($_$_$:$ ", +" H+H+'@H+H+<$@#@#@#@#@#@#g#g#g#g#g#g#}#}#}#C#C#C#C#C#}#C#C#C#C#C#H+H+H+H+[$}$|$1$2$3$4#4$ ", +" H+H+H+H+H+ 5$6$@#@#@#g#g#g#g#g#g#g#}#}#}#}#C#C#C#C#C#C#}#C#C#C#C#}#H+H+H+7$8$9$6#0${#a$b$ ", +" c$ H+H+H+d$H+H+ e$f$g$@#g#g#g#g#g#g#g#}#}#}#}#C#C#C#C#C#C#C#}#C#C#C#C#}#H+H+H+h$4#Y#;$;$i$j$k$ ", +" l$m$n$ H+H+H+H+H+ o$p$@#g#g#g#g#g#g#}#}#}#C#C#C#C#C#C#C#C#C#C#}#C#C#C#}#q$H+H+H+r$s$t$u$]$v$5# ", +" w$x$y$z$H+H+H+H+ A$B$C$g#g#g#g#D$E$}#}#C#C#C#C#C#C#C#C#C#C#C#}#C#C#C#C#F$H+H+H+G$s$H$8#]#I$J$ ", +" K$L$M$H+H+N$H+H+ O$P$Q$R$S$T$U$}#}#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#V$H+H+H+W$0$X$Y$Z$`$J$ ", +" %.%H+H+H+H+H+ +%@%#%$%%%&%*%}#}#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#=%H+H+-%;%>%i$`$,%^# ", +" '%)%!%~%H+H+{%]%^% /%(%_%:%<%[%}#}#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#}%|%H+1%2%4#3%4%5%~# ", +" '%6%7%8%H+H+9%0%a%b% c%##d%e%f%g%h%C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#i%j%H+k%l%m%n%o%p%}+ ", +" q%.%r%s%H+H+t%H+u%v%w%x%y% z%C#A%C#C#C#C#}#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#B%C%H+D%E%F%G% ", +" H%I%J%K%L%H+M%N%O%P%Q%R%S%T% U%}#V%C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#}#H+H+W%X%Y% ", +" Z%`% &.&+&H+H+@&#&$&%&&&*&=&-&;& }#>&C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#,&P H+H+'& ", +" )&!&~&{&H+H+H+]&^&/&(&_&_&:&<&[&}&|&1&2&}#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#C#}#3&4&H+H+5& ", +" 6&7&8&9&H+H+H+0&a&b&c&d&e&f&g&h&i&j&1&k&}#}#}#}#C#C#C#C#C#C#C#C#C#C#C#C#C#}#}#}#H+H+H+H+l& ", +" m&n&o&p&q&H+H+H+r&r&s&s&t&u&c&v&i&w&x&1&y&z&}#}#C#C#C#C#C#C#C#C#C#C#C#C#}#}#A&B&H+H+H+H+ ", +" C&D&E&F&G&H&H+H+H+I&J&K&L&M&N&O&P&Q&i&R&i&S&T&U&}#C#C#C#C#C#C#C#C#C#C#}#}#}#}#V& H+H+H+H+W& ", +" X&Y&Z&`& *.*H+H+H++*@*M&#*$*%*&***=*i&-*;*>*,*'*)*C#C#C#C#C#C#C#C#C#}#}#}#}#!*~*H+H+H+{*H+ ", +" ]*^*F&/*(*_*H+H+H+H+:*<*[*}*%*|*1*2*i&3*4*5*6*7*}#}#}#C#C#C#C#C#C#C#}#}#}#8*9*0*a*H+H+b*c* ", +" d*e*f*g*o&h*i*j*H+H+H+k*O%l*m*n*o*m*i&3*p*q*r*s*t*}#}#}#C#C#C#C#C#}#}#u*v*w*x*y*H+H+H+H+H+ ", +" z*A*B*q%C*D*E*F*G*H+H+H+H+H*I*J*K*L*M*i&3*p*N*O*P*Q*R*S*}#}#}#}#}#}#}#}#T*U*V*W*H+H+H+X*H+ ", +" Y*Z*`* =.=+=@=#=$=%=H+H+H+&=*===-=B*;=i&3*p*>=,='=)=!=~={=]=}#}#}#}#^=/=(=H+_=H+H+H+:=<=H+ ", +" [=}=|=1=2=3=4=5=6=7=H+H+H+8=9=0=a=b=i&3*p*c=d=e=f=g=h=i=j=k=l=m=n=o=p=q=H+r=s=t=u=v= ", +" w=x=y=z=A=B=C=D=E=H+H+H+H+F=)%G=i&3*p*.&H=I=J=K=L=M=N=O=P=Q=R=S=T=H+H+H+U=V=W= ", +" X=Y=Z=`= -.-H+H+H+H+H++-@-#-$-p*%-&-*-=---;->-,-'-)-!-~-{-]-H+H+H+^-/-(- ", +" _-:-<-[-H+H+H+H+}-|-1-2-3-4-5-6-7-8-H+H+9-0-a-H+H+H+H+H+H+b-c-d-e- ", +" f-g-h-H+H+i-j-k-H+H+H+H+H+l-m-H+H+H+H+n-o-H+H+H+H+H+p-q-r-s-t-u-v- ", +" w-x-H+H+H+y-z-A-H+H+H+H+H+H+H+H+H+H+H+H+H+B-C-D-E-F-G-H-I-J-K- ", +" L-M-H+N-O-P-H+H+H+H+H+H+H+H+H+H+H+X*Q-R-S-T-U-V-W-X-Y-G@Z-`- ", +" ;H+H+H+H+.;+;@;#;$;%;&;*;*;=;-; ;;>;,;';);!;~;{;];^;/;(;_; ", +" :;N-<;[;};|;1;2;3;4;5;6;7;8; 9;0;a;H+'@b;c;d;e;f;)@b@'@ ", +" g;h;i;j;k;k;k;k;k;k;k;k;k;l;m; n;o;p;q;H+r;s;X-t;H@u;v;(;'@ ", +" w;x;y;z;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;`; >.>+>@>#>$>%>X&&>*>=>-> ;>>>,>'>)>!>~>{>]>^>/>R;(>_>:>H+ ", +" <>[>}>|>1>2>3>4>5>6>7>8>8>9>m; 0>a>b>c>d>e>f>g>h>i>t;j>t;k>H+l>H+ ", +" m>n>o>p>q>r>s>t>8>8>8>8>8>u> v>w>x>y>z>A>B>d$C>D>X-d;E>F>G>H+)@ ", +" H>I>J>K>L>M>N>O>P>Q>R>S>T>U> V>W>X>Y>Z>`> ,z-.,+,@,#,$,j>Q;K-b@!@ ", +" %,&,*,=,-,;,>,,,',),!,~,{,], ^,/,(,_,:,<,[,H+(;},|,H-1,2,3,4,d$H+)@ ", +" 5,6,5%7,8,9,0,a,b,c,d,e,f,g, h,i,j,k,l,m,n, H+v-b;o,$,$,t;p,X;z-_;l> ", +" q,r,s,t,u,v,w,x,y,z,A,B,C, D,E,F,G,n,G, H+d$H,I,J,K,$,L,M,`-v-d$H+ ", +" N,O,P,Q,R,S,T,U,V,g-W,X,Y, Z,`, '.'+'@' (;H+#'$'%'t;&'*'='-'_;H+ ", +" ;'>',''')'!'~'{']'^'/'('_' :'<'['}'|'1' H+b*`-2'3'$,$,E>4'5'v-., ", +" 6'7'8'9'0' a'b'c'd'e'f' g'h'i'j'k' l'G@h>W-d;$,m'n'o'z-)@ ", +" p'q'r's't'u' v'w'x'y'z'A'B'C'D'E' )@Z-F'G'H'$,t;I'I,J''@H+ ", +" K'L'M'N'O'P' Q'R'S'T' U'V'W'X' Y'Z'`'X-t;c; ).)+)b@H+ ", +" @)#)$)%)&) *)=)-);) >),)'))) '@!)J,~)X-t;K,{)I-])!@H+ ", +" ^)u'/)()_) :)<)[)}) |)1)2)3) (;4)5)6)$,S;7)8)9)0)_; ", +" a)b)c)d)e)f)g)h)i)j)k)l)2)m) z-n)o)p)p)q)`'r)s)-'d$ ", +" q't)u)v)w)x)y)z)A)B)C)D)E) !@v;F)#'G)H)I)3,J)K)'@)@ ", +" L)''M)N)O)P)Q) R)S)T) $])U)V)W)X)%'Y)v;b@'@ ", +" Z)`) !.!+!@!#!$!%!&!X@ b*v;*!|,=!-!;!z-{* ", +" >!,!'!)!!!~!{!]!^! -''@/!F'(!_!:!`- ", +" c #E9C900", +", c #EDC600", +"' c #F0C600", +") c #F2CB00", +"! c #F5D300", +"~ c #F6DA00", +"{ c #F6DD00", +"] c #F5DE00", +"^ c #F3DF00", +"/ c #EFE000", +"( c #EBE100", +"_ c #E6E000", +": c #DFDB00", +"< c #D5D200", +"[ c #CBC800", +"} c #CEC200", +"| c #D0C100", +"1 c #D4C000", +"2 c #DABE00", +"3 c #DFC000", +"4 c #E2C500", +"5 c #E5CB00", +"6 c #E7CD00", +"7 c #EBCB00", +"8 c #EEC800", +"9 c #F1C800", +"0 c #F4CD00", +"a c #F6D300", +"b c #F7D800", +"c c #F7DC00", +"d c #F6DE00", +"e c #F4DF00", +"f c #F0E000", +"g c #EBE000", +"h c #E6DF00", +"i c #E0DA00", +"j c #D6D200", +"k c #CAC700", +"l c #D2C400", +"m c #D2C500", +"n c #D4C500", +"o c #D9C400", +"p c #DFC400", +"q c #E4C500", +"r c #E7C900", +"s c #E9CE00", +"t c #ECD000", +"u c #EECF00", +"v c #F1CD00", +"w c #F6CF00", +"x c #F8D300", +"y c #F8D600", +"z c #F9D900", +"A c #F8DD00", +"B c #F1DD00", +"C c #EBDB00", +"D c #E6D800", +"E c #E0D500", +"F c #D7CF00", +"G c #D6C800", +"H c #D7CA00", +"I c #DACA00", +"J c #DFCB00", +"K c #E6CB00", +"L c #EBCD00", +"M c #F0D200", +"N c #F2D400", +"O c #F4D500", +"P c #F6D500", +"Q c #F8D500", +"R c #F9D400", +"S c #FAD200", +"T c #FBD600", +"U c #FBDB00", +"V c #F9DD00", +"W c #F3D900", +"X c #EBD200", +"Y c #E4CC00", +"Z c #DFCA00", +"` c #03AD07", +" . c #02B20B", +".. c #01B40E", +"+. c #01B20F", +"@. c #01A60C", +"#. c #D8CA00", +"$. c #DCCD00", +"%. c #DFCF00", +"&. c #E5D000", +"*. c #EBD100", +"=. c #F3D400", +"-. c #F4D600", +";. c #F6D700", +">. c #F7DA00", +",. c #F8DB00", +"'. c #F9DB00", +"). c #FAD700", +"!. c #FAD000", +"~. c #FBD300", +"{. c #FBD800", +"]. c #FADA00", +"^. c #E1BF00", +"/. c #DDBB00", +"(. c #0AAE02", +"_. c #05AF04", +":. c #02B107", +"<. c #01B40B", +"[. c #00B60E", +"}. c #00B40F", +"|. c #00AB0D", +"1. c #DCCF00", +"2. c #E0D000", +"3. c #E5D100", +"4. c #F2D300", +"5. c #F5D600", +"6. c #F6D900", +"7. c #F6DC00", +"8. c #F6D200", +"9. c #F4D400", +"0. c #EDCD00", +"a. c #E5C200", +"b. c #DDB600", +"c. c #0BC001", +"d. c #07BD02", +"e. c #04BB03", +"f. c #02BA05", +"g. c #01BA08", +"h. c #01BA0B", +"i. c #01B70C", +"j. c #01AD0A", +"k. c #D3C800", +"l. c #DACF00", +"m. c #DED000", +"n. c #E3D000", +"o. c #E8CE00", +"p. c #ECCE00", +"q. c #EFCF00", +"r. c #F1D100", +"s. c #F1D600", +"t. c #F0D900", +"u. c #EFDA00", +"v. c #EFDB00", +"w. c #EFD800", +"x. c #ECD400", +"y. c #E5CA00", +"z. c #E1C400", +"A. c #DBBA00", +"B. c #02B102", +"C. c #03B802", +"D. c #04C301", +"E. c #05CD00", +"F. c #05D000", +"G. c #03CE00", +"H. c #02CA01", +"I. c #02C702", +"J. c #03C304", +"K. c #03BF06", +"L. c #04BA07", +"M. c #04AF06", +"N. c #CFC700", +"O. c #D8CE00", +"P. c #E0CD00", +"Q. c #E9CA00", +"R. c #EDCE00", +"S. c #EED000", +"T. c #ECD200", +"U. c #EAD400", +"V. c #E9D700", +"W. c #E9DA00", +"X. c #EADD00", +"Y. c #E9DC00", +"Z. c #E4D400", +"`. c #DECA00", +" + c #DAC200", +".+ c #D6BB00", +"++ c #03AA02", +"@+ c #02B202", +"#+ c #02B902", +"$+ c #02C501", +"%+ c #02D100", +"&+ c #02D700", +"*+ c #01D700", +"=+ c #01D500", +"-+ c #02D200", +";+ c #03CB01", +">+ c #05C401", +",+ c #06BE02", +"'+ c #06B202", +")+ c #CFC500", +"!+ c #D8CC00", +"~+ c #DCCE00", +"{+ c #E0CB00", +"]+ c #E4C800", +"^+ c #E7C700", +"/+ c #EBCC00", +"(+ c #EBCE00", +"_+ c #EACF00", +":+ c #E9D000", +"<+ c #E8D100", +"[+ c #E8D600", +"}+ c #E9DB00", +"|+ c #E8DB00", +"1+ c #E3D300", +"2+ c #DBC600", +"3+ c #D6BD00", +"4+ c #D1B600", +"5+ c #04B201", +"6+ c #03B702", +"7+ c #03BE01", +"8+ c #03C701", +"9+ c #03D100", +"0+ c #02D600", +"a+ c #01D600", +"b+ c #01D300", +"c+ c #03CD01", +"d+ c #05C601", +"e+ c #06C001", +"f+ c #06B601", +"g+ c #D1C200", +"h+ c #D9CA00", +"i+ c #DDCB00", +"j+ c #E0C800", +"k+ c #E4C400", +"l+ c #E6C300", +"m+ c #E8CC00", +"n+ c #E9CC00", +"o+ c #EACA00", +"p+ c #EBCF00", +"q+ c #EDD500", +"r+ c #ECD600", +"s+ c #E6CF00", +"t+ c #DDC400", +"u+ c #000000", +"v+ c #0AB100", +"w+ c #08B700", +"x+ c #06BD01", +"y+ c #05C101", +"z+ c #04C601", +"A+ c #05CB00", +"B+ c #04D200", +"C+ c #02D300", +"D+ c #01D101", +"E+ c #00CF01", +"F+ c #02CA02", +"G+ c #03C503", +"H+ c #04C003", +"I+ c #05BA03", +"J+ c #D2C000", +"K+ c #D9C600", +"L+ c #DCC700", +"M+ c #E3C100", +"N+ c #E5C100", +"O+ c #E6C500", +"P+ c #EAC500", +"Q+ c #ECC400", +"R+ c #EEC900", +"S+ c #EFD200", +"T+ c #12AA00", +"U+ c #0CB100", +"V+ c #09B700", +"W+ c #08BD00", +"X+ c #07C400", +"Y+ c #06CB00", +"Z+ c #06CE00", +"`+ c #06CF00", +" @ c #05CE00", +".@ c #01CB01", +"+@ c #00C902", +"@@ c #01C603", +"#@ c #02C204", +"$@ c #02C005", +"%@ c #03BD05", +"&@ c #CFBC00", +"*@ c #D3C100", +"=@ c #D7C200", +"-@ c #DBC100", +";@ c #E0C100", +">@ c #E3C200", +",@ c #E5C900", +"'@ c #E6CA00", +")@ c #E8C600", +"!@ c #EAC200", +"~@ c #ECC100", +"{@ c #EECD00", +"]@ c #0FB203", +"^@ c #0CB502", +"/@ c #09B901", +"(@ c #07BC00", +"_@ c #06C000", +":@ c #06C700", +"<@ c #01C901", +"[@ c #00C602", +"}@ c #01C203", +"|@ c #02BF04", +"1@ c #02BE05", +"2@ c #C6B700", +"3@ c #C9B900", +"4@ c #CCBB00", +"5@ c #DBC300", +"6@ c #E1C500", +"7@ c #E4C600", +"8@ c #E5C600", +"9@ c #E8C200", +"0@ c #E9BF00", +"a@ c #EAC000", +"b@ c #EAC600", +"c@ c #EACE00", +"d@ c #0CC203", +"e@ c #09C407", +"f@ c #06C508", +"g@ c #05C406", +"h@ c #05C303", +"i@ c #04C300", +"j@ c #04C500", +"k@ c #04C801", +"l@ c #03CE01", +"m@ c #03CF01", +"n@ c #03D000", +"o@ c #02CB00", +"p@ c #01C801", +"q@ c #01C401", +"r@ c #02BF02", +"s@ c #02BB02", +"t@ c #02B903", +"u@ c #03B803", +"v@ c #BEB200", +"w@ c #C3B600", +"x@ c #CCBC00", +"y@ c #D7C400", +"z@ c #DEC800", +"A@ c #E2C700", +"B@ c #E4C300", +"C@ c #E6C100", +"D@ c #E8BF00", +"E@ c #E8BE00", +"F@ c #E8C000", +"G@ c #E7C600", +"H@ c #0BC903", +"I@ c #06CD08", +"J@ c #01D00B", +"K@ c #00CF09", +"L@ c #01CD05", +"M@ c #02C900", +"N@ c #01C903", +"O@ c #01CA02", +"P@ c #00CD01", +"Q@ c #01D000", +"R@ c #01CF00", +"S@ c #01CB00", +"T@ c #02C600", +"U@ c #02C200", +"V@ c #02BC00", +"W@ c #03B700", +"X@ c #03B501", +"Y@ c #03B301", +"Z@ c #BAAF00", +"`@ c #BFB300", +" # c #C8BB00", +".# c #D3C400", +"+# c #DBC700", +"@# c #DFC500", +"## c #E1C000", +"$# c #E4BE00", +"%# c #E6BD00", +"&# c #E7BD00", +"*# c #E7C000", +"=# c #0ACB02", +"-# c #05CF07", +";# c #01D20A", +"># c #00D209", +",# c #00CF05", +"'# c #00CB00", +")# c #00C901", +"!# c #00C703", +"~# c #00C803", +"{# c #00CC02", +"]# c #00CF00", +"^# c #00CE00", +"/# c #01CA00", +"(# c #02C500", +"_# c #02C000", +":# c #03BA00", +"<# c #03B500", +"[# c #03B200", +"}# c #03B100", +"|# c #BBAF00", +"1# c #BFB200", +"2# c #C7B900", +"3# c #DAC100", +"4# c #DCBD00", +"5# c #DEBB00", +"6# c #E2BB00", +"7# c #E5BD00", +"8# c #E7C100", +"9# c #E9C700", +"0# c #08CD01", +"a# c #05CF04", +"b# c #02D007", +"c# c #01CF06", +"d# c #01CE03", +"e# c #01CC00", +"f# c #00C802", +"g# c #00CA02", +"h# c #00CD00", +"i# c #00CC00", +"j# c #01C700", +"k# c #02BE00", +"l# c #02B800", +"m# c #02B400", +"n# c #02B100", +"o# c #BEB100", +"p# c #C1B300", +"q# c #C7B800", +"r# c #CEBD00", +"s# c #D2BF00", +"t# c #D4BC00", +"u# c #D6B900", +"v# c #D9B900", +"w# c #DEBA00", +"x# c #E3BE00", +"y# c #EAC700", +"z# c #05CD01", +"A# c #05CC03", +"B# c #03CB03", +"C# c #02CB01", +"D# c #00CA00", +"E# c #00C603", +"F# c #00C800", +"G# c #01C400", +"H# c #02B700", +"I# c #02B300", +"J# c #02B000", +"K# c #BFB100", +"L# c #C6B500", +"M# c #CAB800", +"N# c #CEB900", +"O# c #D0B900", +"P# c #D3B800", +"Q# c #D7B900", +"R# c #DDBA00", +"S# c #E3BC00", +"T# c #E7BF00", +"U# c #EBC500", +"V# c #ECCB00", +"W# c #05CF00", +"X# c #05CC00", +"Y# c #05C901", +"Z# c #03C900", +"`# c #01C900", +" $ c #01C800", +".$ c #00C403", +"+$ c #00C700", +"@$ c #00C500", +"#$ c #01C100", +"$$ c #02BD00", +"%$ c #02B900", +"&$ c #02B500", +"*$ c #02B200", +"=$ c #02AF00", +"-$ c #C4B100", +";$ c #C7B100", +">$ c #C9B200", +",$ c #CDB500", +"'$ c #D2B900", +")$ c #D8BB00", +"!$ c #DFBA00", +"~$ c #E7B900", +"{$ c #EABA00", +"]$ c #ECC200", +"^$ c #DBCF00", +"/$ c #02D101", +"($ c #05C600", +"_$ c #03C700", +":$ c #02C700", +"<$ c #01C600", +"[$ c #00C402", +"}$ c #00C102", +"|$ c #00C201", +"1$ c #00C400", +"2$ c #00C200", +"3$ c #01BE00", +"4$ c #03AE00", +"5$ c #03AD00", +"6$ c #C2A900", +"7$ c #C3A900", +"8$ c #C6AC00", +"9$ c #CBB200", +"0$ c #D2BA00", +"a$ c #D9BE00", +"b$ c #EAB600", +"c$ c #ECB500", +"d$ c #EABE00", +"e$ c #E2C900", +"f$ c #CDCF00", +"g$ c #A3CA00", +"h$ c #00D205", +"i$ c #02D000", +"j$ c #04CB00", +"k$ c #05C500", +"l$ c #01C101", +"m$ c #00BE02", +"n$ c #00BF01", +"o$ c #00C000", +"p$ c #00BE00", +"q$ c #01BA00", +"r$ c #03AF00", +"s$ c #03AB00", +"t$ c #C0A500", +"u$ c #C4A900", +"v$ c #CAB100", +"w$ c #D3BB00", +"x$ c #DAC000", +"y$ c #E3BB00", +"z$ c #EAB400", +"A$ c #E9B300", +"B$ c #E1BB00", +"C$ c #D1C600", +"D$ c #B6CD00", +"E$ c #89CA00", +"F$ c #53C300", +"G$ c #00D408", +"H$ c #00D404", +"I$ c #01D200", +"J$ c #02CF00", +"K$ c #03CA00", +"L$ c #04C401", +"M$ c #03C400", +"N$ c #02C400", +"O$ c #01BF01", +"P$ c #00BC02", +"Q$ c #00BB02", +"R$ c #00BC01", +"S$ c #00BD00", +"T$ c #00BB00", +"U$ c #01B700", +"V$ c #02AE00", +"W$ c #03A900", +"X$ c #03A800", +"Y$ c #03A700", +"Z$ c #BFA300", +"`$ c #C3A800", +" % c #DDC100", +".% c #E5BC00", +"+% c #E4B100", +"@% c #D1B800", +"#% c #B6C100", +"$% c #95C800", +"%% c #69C901", +"&% c #39C802", +"*% c #01D307", +"=% c #00D305", +"-% c #01D102", +";% c #02CE00", +">% c #02CC01", +",% c #03C903", +"'% c #03C604", +")% c #03C504", +"!% c #03C402", +"~% c #03C300", +"{% c #01BD01", +"]% c #00BA02", +"^% c #00B902", +"/% c #00BA01", +"(% c #00BA00", +"_% c #00B800", +":% c #01B400", +"<% c #02AB00", +"[% c #02A700", +"}% c #03A500", +"|% c #03A300", +"1% c #BEA400", +"2% c #CDB300", +"3% c #D8BD00", +"4% c #DEC100", +"5% c #E4BC00", +"6% c #E6B400", +"7% c #DBB200", +"8% c #BDB600", +"9% c #96BD00", +"0% c #70C300", +"a% c #49C802", +"b% c #22CD05", +"c% c #01D104", +"d% c #02CF03", +"e% c #03CC01", +"f% c #03C802", +"g% c #02C805", +"h% c #01C708", +"i% c #01C607", +"j% c #02C404", +"k% c #03C200", +"l% c #03BF00", +"m% c #01BB01", +"n% c #00B802", +"o% c #00B702", +"p% c #00B701", +"q% c #00B500", +"r% c #01B100", +"s% c #02A300", +"t% c #02A000", +"u% c #029E00", +"v% c #029D00", +"w% c #003EC4", +"x% c #BFA500", +"y% c #C4AA00", +"z% c #CEB200", +"A% c #D7BA00", +"B% c #DABD00", +"C% c #DCBA00", +"D% c #D9B600", +"E% c #C9B500", +"F% c #A5B700", +"G% c #78BA00", +"H% c #50BF00", +"I% c #2FC703", +"J% c #11CF07", +"K% c #02CE03", +"L% c #04C800", +"M% c #03C502", +"N% c #01C606", +"O% c #00C709", +"P% c #00C608", +"Q% c #02C304", +"R% c #03C001", +"S% c #03BD00", +"T% c #02B901", +"U% c #00B602", +"V% c #00B502", +"W% c #00B501", +"X% c #00B200", +"Y% c #01AE00", +"Z% c #02A900", +"`% c #02A400", +" & c #029C00", +".& c #029A00", +"+& c #029900", +"@& c #004AC8", +"#& c #004DD8", +"$& c #004EDB", +"%& c #0052D3", +"&& c #CAAE00", +"*& c #CEB000", +"=& c #D0B100", +"-& c #C9B600", +";& c #C0B900", +">& c #ACBC00", +",& c #85BB00", +"'& c #58BB00", +")& c #33BD01", +"!& c #1AC404", +"~& c #08CD08", +"{& c #04CB01", +"]& c #05C800", +"^& c #06C500", +"/& c #05C200", +"(& c #04C202", +"_& c #01C405", +":& c #00C507", +"<& c #00C406", +"[& c #01C103", +"}& c #02BB00", +"|& c #01B401", +"1& c #00B201", +"2& c #00AF00", +"3& c #01AB00", +"4& c #01A600", +"5& c #02A200", +"6& c #029700", +"7& c #029600", +"8& c #0050C0", +"9& c #0055DA", +"0& c #0057E6", +"a& c #0058E5", +"b& c #0058D9", +"c& c #0058C5", +"d& c #CCAB00", +"e& c #C8A700", +"f& c #C0A900", +"g& c #B5B100", +"h& c #A4BC00", +"i& c #8AC300", +"j& c #64C100", +"k& c #3ABD00", +"l& c #1ABC02", +"m& c #0AC205", +"n& c #03CA0A", +"o& c #05C801", +"p& c #07C200", +"q& c #04C001", +"r& c #02C102", +"s& c #00C204", +"t& c #00C103", +"u& c #01BE02", +"v& c #01B000", +"w& c #00AC00", +"x& c #01A800", +"y& c #01A400", +"z& c #029F00", +"A& c #029400", +"B& c #029300", +"C& c #0057CF", +"D& c #005BE4", +"E& c #005DEE", +"F& c #005DEB", +"G& c #005BDE", +"H& c #0059CD", +"I& c #0058C2", +"J& c #C7A202", +"K& c #C4A000", +"L& c #B9A400", +"M& c #A6B000", +"N& c #8BBE00", +"O& c #6DC700", +"P& c #49C501", +"Q& c #24BF02", +"R& c #09BD04", +"S& c #00C107", +"T& c #00C80B", +"U& c #06C400", +"V& c #07BF00", +"W& c #06BE00", +"X& c #05BE00", +"Y& c #02BF01", +"Z& c #00BF02", +"`& c #00BE01", +" * c #00AB00", +".* c #00A800", +"+* c #039C00", +"@* c #029800", +"#* c #029500", +"$* c #005EDD", +"%* c #0060EB", +"&* c #0060F2", +"** c #0060F0", +"=* c #005FE7", +"-* c #005DDC", +";* c #005AD5", +">* c #0054D4", +",* c #D29900", +"'* c #C1A400", +")* c #9AB300", +"!* c #72C000", +"~* c #53C602", +"{* c #35C604", +"]* c #17C306", +"^* c #02C108", +"/* c #00C40A", +"(* c #00C70B", +"_* c #06C100", +":* c #06BF00", +"<* c #05BD00", +"[* c #05BB00", +"}* c #04BB00", +"|* c #03BC00", +"1* c #02BC01", +"2* c #02BA00", +"3* c #03B300", +"4* c #01B001", +"5* c #00AD01", +"6* c #00A901", +"7* c #00A500", +"8* c #01A200", +"9* c #039D00", +"0* c #059900", +"a* c #069700", +"b* c #059700", +"c* c #039700", +"d* c #0063E2", +"e* c #0063E8", +"f* c #0063F0", +"g* c #0063F5", +"h* c #0063F4", +"i* c #0062F0", +"j* c #0061EB", +"k* c #005DE6", +"l* c #0056E1", +"m* c #004DDB", +"n* c #0047D9", +"o* c #86B900", +"p* c #55C000", +"q* c #3BC304", +"r* c #26C507", +"s* c #10C60A", +"t* c #01C70B", +"u* c #00C70C", +"v* c #05BC00", +"w* c #03B900", +"x* c #03B800", +"y* c #04B600", +"z* c #04B400", +"A* c #05B100", +"B* c #04B000", +"C* c #02B001", +"D* c #01B003", +"E* c #00AC03", +"F* c #00A601", +"G* c #01A000", +"H* c #099200", +"I* c #0A9100", +"J* c #089500", +"K* c #049C00", +"L* c #0063E7", +"M* c #0064EB", +"N* c #0065F2", +"O* c #0065F7", +"P* c #0065F6", +"Q* c #0064F4", +"R* c #0060EF", +"S* c #0059E7", +"T* c #0051E0", +"U* c #004BDF", +"V* c #0042E9", +"W* c #5CB900", +"X* c #38BD04", +"Y* c #27C007", +"Z* c #1AC309", +"`* c #0BC70C", +" = c #00C90D", +".= c #00C90C", +"+= c #00C60A", +"@= c #04BC00", +"#= c #04BA00", +"$= c #03B901", +"%= c #02B801", +"&= c #02B701", +"*= c #03B701", +"== c #05AE00", +"-= c #04AD01", +";= c #02AC03", +">= c #00AC04", +",= c #00A804", +"'= c #00A302", +")= c #019D01", +"!= c #049800", +"~= c #089300", +"{= c #0C8E00", +"]= c #0E8D00", +"^= c #0C9300", +"/= c #005CE1", +"(= c #0064F0", +"_= c #0067F7", +":= c #0069F9", +"<= c #0069F8", +"[= c #0069F6", +"}= c #0066F3", +"|= c #0060EE", +"1= c #0059EA", +"2= c #0054E8", +"3= c #004DEC", +"4= c #0046F0", +"5= c #0046E9", +"6= c #2AAF26", +"7= c #1EB80E", +"8= c #17BD05", +"9= c #0FC205", +"0= c #06C609", +"a= c #00C90B", +"b= c #00C909", +"c= c #00C607", +"d= c #03BA03", +"e= c #02B705", +"f= c #01B606", +"g= c #01B604", +"h= c #02B702", +"i= c #03B400", +"j= c #03B002", +"k= c #02AC04", +"l= c #02A805", +"m= c #01A406", +"n= c #00A006", +"o= c #009E05", +"p= c #029D03", +"q= c #039B01", +"r= c #069800", +"s= c #099300", +"t= c #0D8C00", +"u= c #0053D7", +"v= c #0059E0", +"w= c #0061EC", +"x= c #0067F6", +"y= c #006BF9", +"z= c #006DF8", +"A= c #006EF5", +"B= c #006DF4", +"C= c #0069F5", +"D= c #0064F5", +"E= c #0060F3", +"F= c #0059EE", +"G= c #0054E6", +"H= c #0056DA", +"I= c #0363CC", +"J= c #097AB2", +"K= c #0D9286", +"L= c #0DA54A", +"M= c #0BB01D", +"N= c #09B806", +"O= c #06BF02", +"P= c #03C405", +"Q= c #00C707", +"R= c #00C805", +"S= c #02B906", +"T= c #02B607", +"U= c #01B50A", +"V= c #00B40A", +"W= c #00B508", +"X= c #00B803", +"Y= c #01B800", +"Z= c #00B004", +"`= c #00A908", +" - c #00A209", +".- c #009A09", +"+- c #009408", +"@- c #019207", +"#- c #039505", +"$- c #079A01", +"%- c #0A9B00", +"&- c #004ED3", +"*- c #0054DC", +"=- c #005DEA", +"-- c #006AFA", +";- c #0070F6", +">- c #006EFA", +",- c #006BFD", +"'- c #0067FA", +")- c #0060F1", +"!- c #005AE5", +"~- c #005CD9", +"{- c #0067CE", +"]- c #0079BD", +"^- c #008B9D", +"/- c #009A69", +"(- c #00A536", +"_- c #00AF16", +":- c #00B80A", +"<- c #01BE07", +"[- c #01C306", +"}- c #01C502", +"|- c #01B708", +"1- c #00B30C", +"2- c #00B409", +"3- c #00B604", +"4- c #00B700", +"5- c #00B401", +"6- c #00AD05", +"7- c #00A609", +"8- c #009E0B", +"9- c #00940A", +"0- c #008C09", +"a- c #018A08", +"b- c #058E06", +"c- c #004FD6", +"d- c #0052DE", +"e- c #0058EC", +"f- c #005EF8", +"g- c #0062FC", +"h- c #0067FB", +"i- c #006BF8", +"j- c #006DF9", +"k- c #006DFC", +"l- c #006BFF", +"m- c #0068FD", +"n- c #0062F6", +"o- c #005DED", +"p- c #005EE4", +"q- c #0065DD", +"r- c #0071D1", +"s- c #007EB8", +"t- c #008A8E", +"u- c #00965F", +"v- c #00A13B", +"w- c #00AC21", +"x- c #00B60F", +"y- c #01BD03", +"z- c #02C100", +"A- c #01C200", +"B- c #00B50A", +"C- c #00B40B", +"D- c #00B30B", +"E- c #00B309", +"F- c #00B307", +"G- c #00B203", +"H- c #00B101", +"I- c #00AD02", +"J- c #01A705", +"K- c #02A108", +"L- c #029B09", +"M- c #01920A", +"N- c #00890A", +"O- c #01860A", +"P- c #0051D8", +"Q- c #0052DA", +"R- c #0052E1", +"S- c #0053EE", +"T- c #0054FA", +"U- c #0058FF", +"V- c #005EFE", +"W- c #0065FB", +"X- c #0068FB", +"Y- c #0068FC", +"Z- c #0067FD", +"`- c #0066FD", +" ; c #0062FB", +".; c #005EF3", +"+; c #0062EF", +"@; c #0068E6", +"#; c #0070D3", +"$; c #007AB3", +"%; c #00858D", +"&; c #009168", +"*; c #009E41", +"=; c #01AB1B", +"-; c #02B502", +";; c #00B40C", +">; c #00B308", +",; c #00B305", +"'; c #00B103", +"); c #00A902", +"!; c #01A502", +"~; c #05A003", +"{; c #089C04", +"]; c #099905", +"^; c #079407", +"/; c #0055DB", +"(; c #0054DD", +"_; c #0053E4", +":; c #0051F0", +"<; c #004FFC", +"[; c #0052FF", +"}; c #0059FF", +"|; c #0060FD", +"1; c #0064FC", +"2; c #0066FC", +"3; c #0065FC", +"4; c #0062FF", +"5; c #005FFF", +"6; c #005EFB", +"7; c #0060F4", +"8; c #0065E5", +"9; c #006DCE", +"0; c #0077B1", +"a; c #00828F", +"b; c #019062", +"c; c #019E31", +"d; c #02A90F", +"e; c #02B101", +"f; c #00B20C", +"g; c #00B10A", +"h; c #00B105", +"i; c #02AC00", +"j; c #05A701", +"k; c #08A202", +"l; c #0D9E02", +"m; c #149B02", +"n; c #199802", +"o; c #1B9702", +"p; c #0058DC", +"q; c #0058E0", +"r; c #0054F2", +"s; c #0052FE", +"t; c #0054FF", +"u; c #005AFF", +"v; c #0061FD", +"w; c #0066FB", +"x; c #0062FE", +"y; c #005DFF", +"z; c #005CFD", +"A; c #005CF8", +"B; c #005FEE", +"C; c #0065E0", +"D; c #006CCE", +"E; c #0075B2", +"F; c #008088", +"G; c #018D58", +"H; c #019832", +"I; c #02A31A", +"J; c #02AC0A", +"K; c #01B309", +"L; c #00B007", +"M; c #01AC03", +"N; c #09A400", +"O; c #129F01", +"P; c #1C9B01", +"Q; c #279801", +"R; c #349701", +"S; c #3E9601", +"T; c #449601", +"U; c #005BDB", +"V; c #005DE1", +"W; c #005CE8", +"X; c #005AF4", +"Y; c #005EFF", +"Z; c #0068F9", +"`; c #0063FA", +" > c #005BFB", +".> c #005AFA", +"+> c #005AF7", +"@> c #005BF2", +"#> c #005EED", +"$> c #0062E5", +"%> c #0068D3", +"&> c #0070B2", +"*> c #007A89", +"=> c #018462", +"-> c #01913E", +";> c #019E1B", +">> c #005DD8", +",> c #0060E0", +"'> c #0060E7", +")> c #005EF1", +"!> c #005DFB", +"~> c #0066F9", +"{> c #006BF7", +"]> c #0069F7", +"^> c #0064F7", +"/> c #005EF7", +"(> c #0059F6", +"_> c #0059F4", +":> c #0059F3", +"<> c #005CF4", +"[> c #005FE9", +"}> c #0063D1", +"|> c #006AB1", +"1> c #00728E", +"2> c #008061", +"3> c #019031", +"4> c #005DD1", +"5> c #0060D8", +"6> c #0060DD", +"7> c #005FE3", +"8> c #005EEA", +"9> c #0069F2", +"0> c #006BF3", +"a> c #006CF5", +"b> c #006CF6", +"c> c #006AF6", +"d> c #0061F5", +"e> c #005DF4", +"f> c #005CF2", +"g> c #005CF0", +"h> c #005BEF", +"i> c #005BF3", +"j> c #005CED", +"k> c #005FCD", +"l> c #0065B1", +"m> c #007183", +"n> c #00814E", +"o> c #005CC6", +"p> c #005FCB", +"q> c #005FCE", +"r> c #005FD0", +"s> c #005FD4", +"t> c #0061D9", +"u> c #0066E0", +"v> c #006BE8", +"w> c #006DED", +"x> c #006DF2", +"y> c #0067F5", +"z> c #0064F3", +"A> c #0062F1", +"B> c #0061ED", +"C> c #0061EA", +"D> c #0060E8", +"E> c #005FE8", +"F> c #005EE8", +"G> c #005AE6", +"H> c #0057E1", +"I> c #005ACF", +"J> c #0063A6", +"K> c #007172", +"L> c #079900", +"M> c #129600", +"N> c #218C00", +"O> c #358600", +"P> c #528A00", +"Q> c #779400", +"R> c #989D00", +"S> c #ADA100", +"T> c #BAA100", +"U> c #C2A000", +"V> c #C69F00", +"W> c #C49D00", +"X> c #005BBD", +"Y> c #005EC0", +"Z> c #005EC1", +"`> c #005EC2", +" , c #005FC4", +"., c #0062CA", +"+, c #0067D5", +"@, c #006BE0", +"#, c #006DE8", +"$, c #006BEE", +"%, c #0069F3", +"&, c #0064F1", +"*, c #0063ED", +"=, c #0063E9", +"-, c #0063E4", +";, c #0063E1", +">, c #0062DF", +",, c #0060DE", +"', c #005EDF", +"), c #0053EB", +"!, c #0058C0", +"~, c #006392", +"{, c #098C04", +"], c #198C00", +"^, c #308600", +"/, c #4B8400", +"(, c #6C8C00", +"_, c #949800", +":, c #B5A300", +"<, c #C6A700", +"[, c #CBA700", +"}, c #CCA500", +"|, c #CCA400", +"1, c #C7A000", +"2, c #005DBB", +"3, c #005EBD", +"4, c #005FBD", +"5, c #0060C0", +"6, c #0061C6", +"7, c #0064D1", +"8, c #0065DB", +"9, c #0065E3", +"0, c #0062E9", +"a, c #005DF0", +"b, c #005BED", +"c, c #005BEB", +"d, c #005FE2", +"e, c #0060DF", +"f, c #005FDB", +"g, c #005DDB", +"h, c #0057E0", +"i, c #0051E5", +"j, c #004FDE", +"k, c #0052C9", +"l, c #0058AA", +"m, c #0B8115", +"n, c #218606", +"o, c #408802", +"p, c #628B00", +"q, c #849200", +"r, c #A99B00", +"s, c #C6A300", +"t, c #D2A700", +"u, c #D1A800", +"v, c #CDA900", +"w, c #CAA800", +"x, c #C4A400", +"y, c #005BD2", +"z, c #0057D7", +"A, c #0051E2", +"B, c #004FE6", +"C, c #004DE9", +"D, c #004CEA", +"E, c #004CE9", +"F, c #004DE8", +"G, c #0052E5", +"H, c #005DDA", +"I, c #005CD8", +"J, c #0058D5", +"K, c #0053D1", +"L, c #0050CB", +"M, c #004EC6", +"N, c #004EBE", +"O, c #0C762E", +"P, c #298118", +"Q, c #528D0A", +"R, c #7A9701", +"S, c #9A9C00", +"T, c #B99E00", +"U, c #CF9F00", +"V, c #D5A300", +"W, c #CEA800", +"X, c #C5AC00", +"Y, c #C1AC00", +"Z, c #BCA800", +"`, c #0041D5", +" ' c #0041DB", +".' c #0041E0", +"+' c #0041E3", +"@' c #0040E4", +"#' c #0040E5", +"$' c #0042E5", +"%' c #0049E2", +"&' c #0050DE", +"*' c #0056DC", +"=' c #0059DB", +"-' c #005BD9", +";' c #005BD5", +">' c #0059CC", +",' c #0055C1", +"'' c #0051BB", +")' c #004CC2", +"!' c #0048CC", +"~' c #0C6B47", +"{' c #2E7C2A", +"]' c #5E9012", +"^' c #8B9E02", +"/' c #AAA200", +"(' c #C49F00", +"_' c #D49C00", +":' c #D5A000", +"<' c #BEAE00", +"[' c #B9AF00", +"}' c #B5AC00", +"|' c #0038D7", +"1' c #003ADD", +"2' c #003BDF", +"3' c #003CDE", +"4' c #003FDC", +"5' c #0046D9", +"6' c #004ED6", +"7' c #0053D4", +"8' c #0057D6", +"9' c #0059D8", +"0' c #0059D6", +"a' c #0057CC", +"b' c #0053C0", +"c' c #004FBA", +"d' c #004AC4", +"e' c #0045D2", +"f' c #0A5F5D", +"g' c #2E7239", +"h' c #61891A", +"i' c #8E9A03", +"j' c #AE9F00", +"k' c #C89D00", +"l' c #D89B00", +"m' c #D8A000", +"n' c #CBA800", +"o' c #BEAF00", +"p' c #B8B000", +"q' c #B4AD00", +"r' c #003BD4", +"s' c #003DD0", +"t' c #0042CE", +"u' c #0048CB", +"v' c #004EC9", +"w' c #0052CA", +"x' c #0054D1", +"y' c #0056D8", +"z' c #0057D9", +"A' c #0054D2", +"B' c #0050C7", +"C' c #004DC1", +"D' c #0049C8", +"E' c #045274", +"F' c #2A644A", +"G' c #5D7B21", +"H' c #898D04", +"I' c #A99600", +"J' c #C59900", +"K' c #D89C00", +"L' c #DAA200", +"M' c #CEA900", +"N' c #C1AE00", +"O' c #B4AC00", +"P' c #ADA700", +"Q' c #0046BB", +"R' c #004BBA", +"S' c #004FBB", +"T' c #0051BE", +"U' c #0053C7", +"V' c #0055D2", +"W' c #0055D7", +"X' c #004ECC", +"Y' c #004BC7", +"Z' c #0048CA", +"`' c #0046CE", +" ) c #00458B", +".) c #23565D", +"+) c #556D2B", +"@) c #808007", +"#) c #A28D00", +"$) c #C19600", +"%) c #D69D00", +"&) c #DAA400", +"*) c #CFAA00", +"=) c #C3AE00", +"-) c #BCAE00", +";) c #ACA700", +">) c #004DAA", +",) c #0050A8", +"') c #0052AB", +")) c #0054B5", +"!) c #0055C8", +"~) c #0052C8", +"{) c #004BC5", +"]) c #0049C7", +"^) c #0047CA", +"/) c #003DA1", +"() c #1C4B75", +"_) c #4A603B", +":) c #78760C", +"<) c #9E8700", +"[) c #BE9400", +"}) c #D29E00", +"|) c #D6A500", +"1) c #CDAA00", +"2) c #C3AD00", +"3) c #B5AB00", +"4) c #ACA800", +"5) c #005386", +"6) c #00548A", +"7) c #005698", +"8) c #0056A7", +"9) c #0056B1", +"0) c #0053B6", +"a) c #004CBE", +"b) c #004AC2", +"c) c #0049C5", +"d) c #003BB3", +"e) c #124291", +"f) c #385156", +"g) c #6B6817", +"h) c #9A8100", +"i) c #BB9300", +"j) c #CC9F00", +"k) c #CFA600", +"l) c #C8A900", +"m) c #C0AC00", +"n) c #BCAD00", +"o) c #B6AB00", +"p) c #00595E", +"q) c #005A73", +"r) c #005A87", +"s) c #005994", +"t) c #00559F", +"u) c #0051AB", +"v) c #004DB4", +"w) c #004ABE", +"x) c #003ABD", +"y) c #0A3BA7", +"z) c #224174", +"A) c #565627", +"B) c #937900", +"C) c #B79300", +"D) c #C8A600", +"E) c #BDAA00", +"F) c #BAAB00", +"G) c #026439", +"H) c #026451", +"I) c #016365", +"J) c #016074", +"K) c #015B84", +"L) c #005496", +"M) c #004FA6", +"N) c #004CB0", +"O) c #004BB8", +"P) c #003ABE", +"Q) c #0638AC", +"R) c #153780", +"S) c #8A7301", +"T) c #B09100", +"U) c #BE9E00", +"V) c #C2A500", +"W) c #BFA700", +"X) c #BAA800", +"Y) c #B8A900", +"Z) c #B5A900", +"`) c #077430", +" ! c #05703E", +".! c #036C4C", +"+! c #026361", +"@! c #01597C", +"#! c #005093", +"$! c #004CA4", +"%! c #004BB2", +"&! c #003AB6", +"*! c #0538A3", +"=! c #143878", +"-! c #827102", +";! c #A98F00", +">! c #B99D00", +",! c #BDA300", +"'! c #BAA500", +")! c #B6A500", +"!! c #B4A600", +"~! c #B2A600", +"{! c #0B8413", +"]! c #077D1C", +"^! c #057729", +"/! c #036C41", +"(! c #015E60", +"_! c #00537D", +":! c #004E95", +"~ c #062BAA", +",~ c #142F78", +"'~ c #3C4327", +")~ c #766600", +"!~ c #997F00", +"~~ c #A98B00", +"{~ c #B19200", +"]~ c #B69700", +"^~ c #017811", +"/~ c #027A0F", +"(~ c #038007", +"_~ c #048600", +":~ c #058503", +"<~ c #047A1B", +"[~ c #026A3F", +"}~ c #082CA7", +"|~ c #1C3171", +"1~ c #454323", +"2~ c #776400", +"3~ c #987E00", +"4~ c #A88B00", +"5~ c #B19300", +"6~ c #B79900", +"7~ c #BEA000", +"8~ c #067F0B", +"9~ c #05800B", +"0~ c #048207", +"a~ c #048405", +"b~ c #03810A", +"c~ c #027418", +"d~ c #026131", +"e~ c #0034AE", +"f~ c #0E3497", +"g~ c #2B3A5E", +"h~ c #54481A", +"i~ c #7A6200", +"j~ c #967C00", +"k~ c #A58C00", +"l~ c #AE9400", +"m~ c #B59900", +"n~ c #0B8902", +"o~ c #098704", +"p~ c #068408", +"q~ c #03800D", +"r~ c #017A13", +"s~ c #006C18", +"t~ c #005422", +"u~ c #003AA0", +"v~ c #143D84", +"w~ c #38424B", +"x~ c #5F4C13", +"y~ c #7D6000", +"z~ c #937A00", +"A~ c #A18D00", +"B~ c #AA9600", +"C~ c #0C8B00", +"D~ c #078308", +"E~ c #027B10", +"F~ c #007315", +"G~ c #006717", +"H~ c #00521B", +"I~ c #003B92", +"J~ c #183F75", +"K~ c #3F453F", +"L~ c #644F0F", +"M~ c #7E6100", +"N~ c #927900", +"O~ c #A18E00", +"P~ c #A99800", +"Q~ c #057C06", +"R~ c #01720B", +"S~ c #006C10", +"T~ c #006716", +"U~ c #005F22", +"V~ c #003886", +"W~ c #193C69", +"X~ c #414537", +"Y~ c #65500C", +"Z~ c #A38F00", +"`~ c #AE9900", +" { c #037102", +".{ c #006805", +"+{ c #00660A", +"@{ c #006816", +"#{ c #006D2C", +"${ c #003278", +"%{ c #1A365D", +"&{ c #42442F", +"*{ c #65530A", +"={ c #7E6300", +"-{ c #957A00", +";{ c #A88F00", +">{ c #B49B00", +",{ c #006200", +"'{ c #006306", +"){ c #006B17", +"!{ c #007632", +"~{ c #002C6A", +"{{ c #1E3350", +"]{ c #474627", +"^{ c #6A5908", +"/{ c #816800", +"({ c #967B00", +"_{ c #AA8F00", +":{ c #016200", +"<{ c #016504", +"[{ c #016F19", +"}{ c #007C35", +"|{ c #032658", +"1{ c #253241", +"2{ c #524F1F", +"3{ c #766705", +"4{ c #887300", +"5{ c #977F00", +"6{ c #036903", +"7{ c #02751C", +"8{ c #007F38", +"9{ c #072048", +"0{ c #2C3233", +"a{ c #5D5818", +"b{ c #827503", +"c{ c #928100", +"d{ c #056E02", +"e{ c #02781F", +"f{ c #0A1B3A", +"g{ c #2E2F2A", +"h{ c #615A13", +"i{ c #897E02", +"j{ c #9A8C00", +"k{ c #027423", +"l{ c #007636", +"m{ c #0D172E", +"n{ c #292523", +"o{ c #595012", +"p{ c #8A7F01", +"q{ c #006831", +"r{ c #101422", +"s{ c #1F161D", +"t{ c #005C2D", +"u{ c #00552B", +"v{ c #0D281F", +"w{ c #13111A", +"x{ c #140717", +"y{ c #005027", +"z{ c #063F22", +"A{ c #0E271B", +"B{ c #140F15", +" . + @ ", +" # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ ", +" } | 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 0 w x y z A d B C D E F ", +" G H I J K L u M N O P Q R S S T U V W X Y Z ` ...+.@. ", +" #.$.%.&.*.M =.-.;.>.,.'.).S !.~.{.].=.> ^./. (._.:.<.[.}.|. ", +" H 1.2.3.*.M 4.O 5.6.7.7.6.P 8.! 9.4.0.a.b. c.d.e.f.g.h.i.j. ", +" k.l.m.n.o.p.q.r.4.s.t.u.v.u.w.x.o.y.z.A. B.C.D.E.F.G.H.I.J.K.L.M. ", +" N.O.1.P.5 Q.7 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+ ", +" g+h+i+j+k+l+^+m+s n+Q.o+p+q+r+s+t+u+u+u+ v+w+x+y+z+A+F.B+C+D+E+F+G+H+I+ ", +" J+K+L+= M+N+O+K 6 > P+Q+R+q.S+u+u+u+u+u+u+u+ T+U+V+W+X+Y+Z+`+`+ @c+.@+@@@#@$@%@ ", +" &@*@=@-@;@>@q ,@'@)@!@~@, {@u+u+u+u+u+u+u+u+u+ ]@^@/@(@_@:@E.F.F.`+E.;+<@[@}@|@1@%@ ", +" 2@3@4@% 5@6@7@8@O+9@0@a@b@c@u+u+u+u+u+u+u+u+u+u+d@e@f@g@h@i@j@k@;+l@m@n@G.o@p@q@r@s@t@u@ ", +" v@w@x@y@z@A@B@C@D@E@F@G@u+u+u+u+u+u+u+u+u+u+u+H@I@J@K@L@H.M@p@N@O@P@Q@R@S@T@U@V@W@X@Y@ ", +" Z@`@ #.#+#@###$#%#&#*#G@u+u+u+u+u+u+u+u+u+u+u+=#-#;#>#,#P@'#)#!#~#{#]#^#/#(#_#:#<#[#}# ", +" |#1#2#| y@3#4#5#6#7#8#9#u+u+u+u+u+u+u+u+u+u+u+0#a#b#c#d#e#'#f#!#!#g#h#i#j#U@k#l#m#n#n# ", +" o#p#q#r#s#t#u#v#w#x#C@y#u+u+u+u+u+u+u+u+u+u+u+Z+z#A#B#C#S@D#f#E#E#f#D#F#G#_#V@H#I#n#J# ", +" K#p#L#M#N#O#P#Q#R#S#T#U#V#u+u+u+u+u+u+u+u+u+u+W#X#Y#Y#Z#`# $[@.$.$[@+$@$#$$$%$&$*$J#=$ ", +" -$;$>$,$'$)$!$~${$]$Q.^$u+u+u+u+u+u+u+u+/$n@X#:@($_$:$<$[$}$}$|$1$2$3$%$&$*$=$4$5$ ", +" 6$7$8$9$0$a$6#b$c$d$e$f$g$u+u+u+u+u+u+h$b+i$j$($k$j@(#G#l$m$m$n$o$p$q$&$*$r$5$s$s$ ", +" t$u$v$w$x$y$z$A$B$C$D$E$F$u+u+u+;#G$H$I$J$K$z+L$M$N$U@O$P$Q$R$S$T$U$*$V$s$W$X$Y$ ", +" Z$`$9$3+ %.%z$+%@%#%$%%%&%u+u+u+*%=%-%;%>%,%'%)%!%~%_#{%]%^%/%(%_%:%=$<%[%}%|%|% ", +" 1%7$2%3%4%5%6%7%8%9%0%a%b%u+u+u+c%d%e%Z#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%u+u+u+K%;+L%j@M%N%O%P%Q%R%S%T%U%V%W%q%X%Y%Z%`%t% &.&+& ", +" @&#&$&%& &&*&=&2%-&;&>&,&'&)&!&~&u+u+u+{&]&^&/&(&_&:&<&[&k#}&H#|&1&1&X%2&3&4&5&v%+&6&7& ", +" 8&9&0&a&b&c& d&e&f&g&h&i&j&k&l&m&n&u+u+u+o&^&p&_@q&r&s&t&u&}&l#m#r%v&2&2&w&x&y&z&.&7&A&B& ", +" C&D&E&F&G&H&I& J&K&L&M&N&O&P&Q&R&S&T&u+u+u+U&p&V&W&X&Y&Z&`&m%l#&$*$v&Y%w& *.*y&t%+*@*#*A&B& ", +" $*%*&***=*-*;*>* ,*'*)*!*~*{*]*^*/*(*u+u+u+_*:*<*[*}*|*1*2*W@<#3**$4*5*6*7*8*9*0*a*b*c*6& ", +" d*e*f*g*h*i*j*k*l*m*n* o*p*q*r*s*t*u*(*u+u+u+X&v*}*:#w*w*x*y*z*A*B*C*D*E*F*G* &a*H*I*J*K* ", +" L*M*N*O*O*P*Q*R*S*T*U*V* W*X*Y*Z*`* =.=+=u+u+u+@=#=$=%=&=*=y*z*A*==-=;=>=,='=)=!=~={=]=^= ", +" /==*(=_=:=<=[=}=|=1=2=3=4=5= 6=7=8=9=0=a=b=c=u+u+u+d=u@e=f=g=h=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=O=P=Q=R=!#u+u+u+S=T=U=V=W=X=Y=W%Z=`= -.-+-@-#-$-%- ", +" &-*-=-P*--z=;-;->-,-'-)-!-~-{-]-^-/-(-_-:-<-[-}-@$u+u+u+|-U=1-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-u+u+u+B-C-D-E-F-G-H-I-J-K-L-M-N-O- u+u+u+u+u+u+ ", +" P-Q-R-S-T-U-V-W-X-Y-Z-`- ;f-.;+;@;#;$;%;&;*;=;-;}&k#u+u+u+;;D->;,;';I-);!;~;{;];^; u+u+u+u+u+u+u+u+ ", +" /;(;_;:;<;[;};|;1;2;3;1;4;5;V-6;7;8;9;0;a;b;c;d;e;H#u+u+u+f;g;h;4*i;j;k;l;m;n;o; u+u+u+u+u+u+u+u+u+u+ ", +" p;q;0&r;s;t;u;v;3;w;'-w;x;5;y;z;A;B;C;D;E;F;G;H;I;J;u+u+u+K;L;M;X$N;O;P;Q;R;S;T; u+u+u+u+u+u+u+u+u+u+ ", +" U;V;W;X;U-};Y;1;'-:=:=Z;`;6; >.>+>@>#>$>%>&>*>=>->;>u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+ ", +" >>,>'>)>!>V-g-~><={>{>]>^>/>+>(>_>:>X;<>[>}>|>1>2>3>u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+ ", +" 4>5>6>7>8>|=(=9>0>a>b>c>P*d>e>f>g>h>@>i>j>V;k>l>m>n>u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+ ", +" o>p>q>r>s>t>u>v>w>x>a>c>y>z>A>B>C>D>E>F>k*G>H>I>J>K>u+u+u+L>M>N>O>P>Q>R>S>T>U>V>W> u+u+u+u+u+u+u+u+u+u+ ", +" X>Y>Z>`> ,.,+,@,#,$,%,y>}=&,*,=,-,;,>,,,',a&),R-!,~,u+u+u+{,],^,/,(,_,:,<,[,},|,1, u+u+u+u+u+u+u+u+u+ ", +" 2,3,4,5,6,7,8,9,0,B;a,h>b,c,k*d,e,6>f,g,h,i,j,k,l,u+u+u+m,n,o,p,q,r,s,t,u,v,w,x, u+u+u+u+u+u+u+ ", +" y,z,*-A,B,C,D,E,F,G,H>G&-*H,I,J,K,L,M,N,u+u+u+O,P,Q,R,S,T,U,V,W,X,Y,Z, u+u+u+u+ ", +" `, '.'+'@'#'$'%'&'*'='-';'>',''')'!'u+u+u+~'{']'^'/'('_':'w,<'['}' ", +" |'1'2'2'3'4'5'6'7'8'9'0'a'b'c'd'e'u+u+u+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'u+u+u+E'F'G'H'I'J'K'L'M'N'Z@O'P' ", +" Q'R'S'T'U'V'W'%&X'Y'Z'`'u+u+u+ ).)+)@)#)$)%)&)*)=)-)}';) ", +" >),)'))),'!)~)M,{)])^)u+u+u+/)()_):)<)[)})|)1)2)-)3)4) ", +" 5)6)7)8)9)0)S'a)b)c)u+u+u+d)e)f)g)h)i)j)k)l)m)n)o) ", +" p)q)r)s)t)u)v)R'w)u+u+u+x)y)z)A)B)C)('D)7$E)F)o) ", +" G)H)I)J)K)L)M)N)O)u+u+u+P)Q)R) S)T)U)V)W)X)Y)Z) ", +" `) !.!+!@!#!$!%!u+u+u+&!*!=! -!;!>!,!'!)!!!~! u+u+u+u+ ", +" {!]!^!/!(!_!:!~,~'~)~!~~~{~]~>! u+u+u+u+u+u+u+u+u+u+ ", +" ^~/~(~_~:~<~[~u+u+u+;~}~|~1~2~3~4~5~6~7~ u+u+u+u+u+u+u+u+u+u+ ", +" 8~9~0~a~b~c~d~u+u+u+e~f~g~h~i~j~k~l~m~ u+u+u+u+u+u+u+u+ ", +" n~o~p~q~r~s~t~u+u+u+u~v~w~x~y~z~A~B~ u+u+u+u+u+u+ ", +" C~D~E~F~G~H~u+u+u+I~J~K~L~M~N~O~P~ ", +" Q~R~S~T~U~u+u+u+V~W~X~Y~M~B)Z~`~ ", +" {.{+{@{#{u+u+u+${%{&{*{={-{;{>{ ", +" ,{'{){!{u+u+u+~{{{]{^{/{({_{ ", +" :{<{[{}{u+u+u+|{1{2{3{4{5{ ", +" 6{7{8{u+u+u+9{0{a{b{c{ ", +" d{e{8{u+u+u+f{g{h{i{j{ ", +" k{l{u+u+u+m{n{o{p{ ", +" q{u+u+u+r{s{ ", +" t{u{u+v{w{x{ ", +" y{z{A{B{ ", +" ", +" "}; diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionManager.cpp b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionManager.cpp new file mode 100644 index 0000000000..ac515e7bfc --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionManager.cpp @@ -0,0 +1,76 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "QmitkXnatConnectionManager.h" + +#include "berryPlatform.h" +#include "berryIPreferences.h" +#include "mitkLogMacros.h" + +#include +#include + +#include "ctkXnatException.h" + +QmitkXnatConnectionManager::QmitkXnatConnectionManager() : + m_Session(0) +{ + m_PreferencesService = berry::Platform::GetServiceRegistry(). + GetServiceById(berry::IPreferencesService::ID); + + berry::IPreferencesService::Pointer prefService = m_PreferencesService.Lock(); + berry::IPreferences::Pointer nodeConnectionPref = prefService->GetSystemPreferences()->Node("/XnatConnection"); + + ctkXnatLoginProfile profile; + profile.setName("Default"); + profile.setServerUrl(QString::fromStdString(nodeConnectionPref->Get("Server Address", ""))); + profile.setUserName(QString::fromStdString(nodeConnectionPref->Get("Username", ""))); + profile.setPassword(QString::fromStdString(nodeConnectionPref->Get("Password", ""))); + profile.setDefault(true); + + m_Session = new ctkXnatSession(profile); +} + +QmitkXnatConnectionManager::~QmitkXnatConnectionManager() +{ + delete m_Session; +} + +ctkXnatSession* QmitkXnatConnectionManager::GetXnatConnection() +{ + if(!m_Session->isOpen()) + { + // Testing the inputs by trying to create a session + QString errString; + try + { + m_Session->open(); + } + catch(const ctkXnatAuthenticationException& auth) + { + errString += QString("Test connection failed.\nAuthentication error: Wrong name or password.\n'%1'").arg(auth.message()); + QMessageBox::critical(QApplication::activeWindow(), "Error", errString); + return 0; + } + catch(const ctkException& e) + { + errString += QString("Test connection failed with error code:\n'%1'").arg(e.message()); + QMessageBox::critical(QApplication::activeWindow(), "Error", errString); + return 0; + } + } + return m_Session; +} diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionManager.h b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionManager.h new file mode 100644 index 0000000000..893ed8aa4b --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionManager.h @@ -0,0 +1,46 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + + +#ifndef QMITKXNATCONNECTIONMANAGER_H_ +#define QMITKXNATCONNECTIONMANAGER_H_ + +#include +#include + +#include "ctkXnatSession.h" +#include "ctkXnatLoginProfile.h" + +class QmitkXnatConnectionManager : public QObject +{ + Q_OBJECT + +public: + + QmitkXnatConnectionManager(); + ~QmitkXnatConnectionManager(); + + /// \brief Opens and tests a xnat session and returns it if the test was ok. + ctkXnatSession* GetXnatConnection(); + +private: + + ctkXnatSession* m_Session; + berry::IPreferencesService::WeakPtr m_PreferencesService; + +}; + +#endif /*QMITKXNATCONNECTIONMANAGER_H_*/ diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionPreferencePage.cpp b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionPreferencePage.cpp new file mode 100644 index 0000000000..8e362440f3 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionPreferencePage.cpp @@ -0,0 +1,212 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "QmitkXnatConnectionPreferencePage.h" + +#include "berryIPreferencesService.h" +#include "berryPlatform.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "ctkXnatSession.h" +#include "ctkXnatLoginProfile.h" +#include "ctkXnatException.h" + +using namespace berry; + +QmitkXnatConnectionPreferencePage::QmitkXnatConnectionPreferencePage() +: m_MainControl(0) +{ + +} + +void QmitkXnatConnectionPreferencePage::Init(berry::IWorkbench::Pointer ) +{ + +} + +void QmitkXnatConnectionPreferencePage::CreateQtControl(QWidget* parent) +{ + IPreferencesService::Pointer prefService = Platform::GetServiceRegistry().GetServiceById(IPreferencesService::ID); + berry::IPreferences::Pointer _XnatConnectionPreferencesNode = prefService->GetSystemPreferences()->Node("/XnatConnection"); + m_XnatConnectionPreferencesNode = _XnatConnectionPreferencesNode; + + m_LineEditors[1] = qMakePair(QString("Server Address"), new QLineEdit("")); + m_LineEditors[1].second->setObjectName("inHostAddress"); + m_LineEditors[1].second->setToolTip("

Examples:

"http://localhost:8080/xnat"

"http://central.xnat.org:80"

"https://xnat.myserver.de:443"

"); + + m_LineEditors[2] = qMakePair(QString("Username"), new QLineEdit("")); + m_LineEditors[2].second->setObjectName("inUser"); + + m_LineEditors[3] = qMakePair(QString("Password"), new QLineEdit("")); + m_LineEditors[3].second->setObjectName("inPassword"); + m_LineEditors[3].second->setEchoMode(QLineEdit::Password); + + m_LineEditors[4] = qMakePair(QString("Download Path"), new QLineEdit("")); + m_LineEditors[4].second->setObjectName("inDownloadPath"); + + m_MainControl = new QWidget(parent); + + QGridLayout* layout = new QGridLayout; + int i = 0; + for (QMap >::iterator it = m_LineEditors.begin(); + it != m_LineEditors.end(); ++it) + { + layout->addWidget(new QLabel(it.value().first), i,0); + layout->addWidget(it.value().second, i,1); + layout->setRowStretch(i,0); + ++i; + } + layout->setRowStretch(i+1,10); + + m_MainControl->setLayout(layout); + this->Update(); +} + +QWidget* QmitkXnatConnectionPreferencePage::GetQtControl() const +{ + return m_MainControl; +} + +bool QmitkXnatConnectionPreferencePage::PerformOk() +{ + IPreferences::Pointer _XnatConnectionPreferencesNode = m_XnatConnectionPreferencesNode.Lock(); + if(_XnatConnectionPreferencesNode.IsNotNull()) + { + // Regular Expression for uri and download path + QRegExp uriregex("^(https?)://([a-zA-Z0-9\\.]+):?([0-9]+)?(/[^ /]+)*$"); + QRegExp downloadPathRegex("([/|\\]?[^/|^\\])+[/|\\]?"); + + QString keyString; + QString errString; + for (QMap >::iterator it = m_LineEditors.begin(); it != m_LineEditors.end(); ++it) + { + keyString = it.value().second->text(); + + if(keyString.isEmpty()) + { + if(it.value().first != QString("Download Path")) + { + errString += QString("No input for \"%1\"\n").arg(it.value().first); + } + } + else + { + if(it.value().first == QString("Server Address") && !uriregex.exactMatch(m_MainControl->findChild("inHostAddress")->text())) + { + errString += QString("No valid input for \"Server Address\"\n"); + } + else if(it.value().first == QString("Download Path")) + { + if(!downloadPathRegex.exactMatch(m_MainControl->findChild("inDownloadPath")->text())) + { + errString += QString("No valid input for \"Download Path\"\n"); + } + else + { + QString downloadPath = m_MainControl->findChild("inDownloadPath")->text(); + if(downloadPath.contains('\\')) + { + if(!downloadPath.endsWith('\\')) + { + downloadPath += '\\'; + } + } + else if(downloadPath.contains('/')) + { + if(!downloadPath.endsWith('/')) + { + downloadPath += '/'; + } + } + m_MainControl->findChild("inDownloadPath")->setText(downloadPath); + } + } + } + } + + if(!errString.isEmpty()) + { + QMessageBox::critical(QApplication::activeWindow(), "Error", errString); + return false; + } + else + { + // Set up the session for the connection test + ctkXnatLoginProfile profile; + profile.setName("Default"); + profile.setServerUrl(m_LineEditors[1].second->text()); + profile.setUserName(m_LineEditors[2].second->text()); + profile.setPassword(m_LineEditors[3].second->text()); + profile.setDefault(true); + ctkXnatSession* session = new ctkXnatSession(profile); + + // Testing the inputs by trying to create a session + try + { + session->open(); + } + catch(const ctkXnatAuthenticationException& auth) + { + errString += QString("Test connection failed.\nAuthentication error: Wrong name or password.\nCode:\"%1\"").arg(auth.message()); + delete session; + QMessageBox::critical(QApplication::activeWindow(), "Error", errString); + return false; + } + catch(const ctkException& e) + { + errString += QString("Test connection failed with error code:\n\"%1\"").arg(e.message()); + delete session; + QMessageBox::critical(QApplication::activeWindow(), "Error", errString); + return false; + } + delete session; + } + + // no error in the input + for (QMap >::iterator it = m_LineEditors.begin(); it != m_LineEditors.end(); ++it) + _XnatConnectionPreferencesNode->Put(it.value().first.toStdString(), it.value().second->text().toStdString()); + + _XnatConnectionPreferencesNode->Flush(); + + return true; + } + return false; +} + +void QmitkXnatConnectionPreferencePage::PerformCancel() +{ + +} + +void QmitkXnatConnectionPreferencePage::Update() +{ + IPreferences::Pointer _XnatConnectionPreferencesNode = m_XnatConnectionPreferencesNode.Lock(); + if(_XnatConnectionPreferencesNode.IsNotNull()) + { + for (QMap >::iterator it = m_LineEditors.begin(); it != m_LineEditors.end(); ++it) + { + it.value().second->setText(QString::fromStdString(_XnatConnectionPreferencesNode->Get(it.value().first.toStdString(), + it.value().second->text().toStdString()))); + } + } +} diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionPreferencePage.h b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionPreferencePage.h new file mode 100644 index 0000000000..54e3559226 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionPreferencePage.h @@ -0,0 +1,67 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + + +#ifndef QMITKXNATCONNECTIONPREFERENCEPAGE_H_ +#define QMITKXNATCONNECTIONPREFERENCEPAGE_H_ + +#include "berryIQtPreferencePage.h" +#include + +class QWidget; +class QLineEdit; + +struct QmitkXnatConnectionPreferencePage : public QObject, public berry::IQtPreferencePage +{ + Q_OBJECT + Q_INTERFACES(berry::IPreferencePage) + +public: + QmitkXnatConnectionPreferencePage(); + + void Init(berry::IWorkbench::Pointer workbench); + + void CreateQtControl(QWidget* widget); + + QWidget* GetQtControl() const; + + /// + /// \see IPreferencePage::PerformOk() + /// + virtual bool PerformOk(); + + /// + /// \see IPreferencePage::PerformCancel() + /// + virtual void PerformCancel(); + + /// + /// \see IPreferencePage::Update() + /// + virtual void Update(); + +protected: + QWidget* m_MainControl; + + berry::IPreferences::WeakPtr m_XnatConnectionPreferencesNode; + + /// + /// Maps a label to lineedit (sorted) + /// + QMap > m_LineEditors; +}; + +#endif /* QMITKXNATCONNECTIONPREFERENCEPAGE_H_ */ diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatEditor.cpp b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatEditor.cpp new file mode 100644 index 0000000000..9ffd861221 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatEditor.cpp @@ -0,0 +1,451 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "QmitkXnatEditor.h" + +// Qmitk +#include "QmitkXnatObjectEditorInput.h" +#include "org_mitk_gui_qt_xnatinterface_Activator.h" + +// CTK XNAT Core +#include "ctkXnatObject.h" +#include "ctkXnatDataModel.h" +#include "ctkXnatScanResource.h" +#include "ctkXnatFile.h" + +// CTK XNAT Widgets +#include "ctkXnatListModel.h" + +// Blueberry +#include +#include + +// Qt +#include +#include +#include +#include + +// MITK +#include +#include + +const std::string QmitkXnatEditor::EDITOR_ID = "org.mitk.editors.xnat.browser"; + +QmitkXnatEditor::QmitkXnatEditor() : + m_DataStorageServiceTracker(mitk::org_mitk_gui_qt_xnatinterface_Activator::GetContext()), + m_Session(0), + m_ListModel(new ctkXnatListModel()), + m_SelectionListener(new berry::SelectionChangedAdapter(this, &QmitkXnatEditor::SelectionChanged)), + m_DownloadPath(berry::Platform::GetServiceRegistry(). + GetServiceById(berry::IPreferencesService::ID)-> + GetSystemPreferences()->Node("/XnatConnection")->Get("Download Path", "").c_str()) +{ + m_DataStorageServiceTracker.open(); + if(m_DownloadPath.isEmpty()) + { + QString xnatFolder = "XNAT_DOWNLOADS"; + QDir dir(mitk::org_mitk_gui_qt_xnatinterface_Activator::GetContext()->getDataFile("").absoluteFilePath()); + dir.mkdir(xnatFolder); + dir.setPath(dir.path() + "/" + xnatFolder); + m_DownloadPath = dir.path() + "/"; + } +} + +QmitkXnatEditor::~QmitkXnatEditor() +{ + delete m_ListModel; + berry::ISelectionService* s = GetSite()->GetWorkbenchWindow()->GetSelectionService(); + s->RemoveSelectionListener(m_SelectionListener); + m_DataStorageServiceTracker.close(); +} + +bool QmitkXnatEditor::IsDirty() const +{ + return false; +} + +bool QmitkXnatEditor::IsSaveAsAllowed() const +{ + return false; +} + +void QmitkXnatEditor::Init(berry::IEditorSite::Pointer site, berry::IEditorInput::Pointer input) +{ + this->SetInput(input); + this->SetSite(site); +} + +void QmitkXnatEditor::DoSave() +{ +} + +void QmitkXnatEditor::DoSaveAs() +{ +} + +void QmitkXnatEditor::SetInput(berry::IEditorInput::Pointer input) +{ + // If the input is not a QmitkXnatObjectEditorInput the semi global xnat session will be loaded. + QmitkXnatObjectEditorInput::Pointer oPtr = input.Cast(); + if(oPtr.IsNotNull()) + { + SetInputWithNotify(oPtr); + this->GetEditorInput().Cast()->GetXnatObject()->fetch(); + } + else + { + m_Session = mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatConnectionManager()->GetXnatConnection(); + + if(m_Session == 0) + { + MITK_INFO << "Please check your XNAT Connection Preferences!"; + return; + } + + QmitkXnatObjectEditorInput::Pointer xoPtr = QmitkXnatObjectEditorInput::New( m_Session->dataModel() ); + berry::IEditorInput::Pointer editorInput( xoPtr ); + SetInputWithNotify(editorInput); + this->GetEditorInput().Cast()->GetXnatObject()->fetch(); + } +} + +//const char* QmitkXnatEditor::GetClassNameA() const +//{ +// return QtEditorPart::GetClassNameA(); +//} + +void QmitkXnatEditor::SetFocus() +{ +} + +void QmitkXnatEditor::CreateQtPartControl( QWidget *parent ) +{ + // create GUI widgets from the Qt Designer's .ui file + m_Controls.setupUi( parent ); + m_Controls.treeView->setModel(m_ListModel); + + GetSite()->GetWorkbenchWindow()->GetSelectionService()->AddSelectionListener(m_SelectionListener); + + connect( m_Controls.treeView, SIGNAL(activated(const QModelIndex&)), this, SLOT(OnObjectActivated(const QModelIndex&)) ); + + connect( m_Controls.buttonDownloadResource, SIGNAL(clicked()), this, SLOT(DownloadResource()) ); + connect( m_Controls.buttonDownloadFile, SIGNAL(clicked()), this, SLOT(DownloadFile()) ); + connect( m_Controls.buttonDataModel, SIGNAL(clicked()), this, SLOT(OnDataModelButtonClicked()) ); + connect( m_Controls.buttonProject, SIGNAL(clicked()), this, SLOT(OnProjectButtonClicked()) ); + connect( m_Controls.buttonSubject, SIGNAL(clicked()), this, SLOT(OnSubjectButtonClicked()) ); + connect( m_Controls.buttonExperiment, SIGNAL(clicked()), this, SLOT(OnExperimentButtonClicked()) ); + connect( m_Controls.buttonKindOfData, SIGNAL(clicked()), this, SLOT(OnKindOfDataButtonClicked()) ); + connect( m_Controls.buttonSession, SIGNAL(clicked()), this, SLOT(OnSessionButtonClicked()) ); + connect( m_Controls.buttonResource, SIGNAL(clicked()), this, SLOT(OnResourceButtonClicked()) ); + + // Makes the breadcrumb feature invisible + for(int i = 0; i < m_Controls.breadcrumbHorizontalLayout->count()-1; i++) + { + QLayoutItem* child = m_Controls.breadcrumbHorizontalLayout->itemAt(i); + child->widget()->setVisible(false); + } + for(int i = 0; i < m_Controls.breadcrumbDescriptionLayout->count()-1; i++) + { + QLayoutItem* child = m_Controls.breadcrumbDescriptionLayout->itemAt(i); + child->widget()->setVisible(false); + } + UpdateList(); +} + +void QmitkXnatEditor::UpdateList() +{ + QmitkXnatObjectEditorInput::Pointer xoPtr(GetEditorInput().Cast()); + if( xoPtr.IsNull() ) + return; + ctkXnatObject* inputObject = xoPtr->GetXnatObject(); + if( inputObject == NULL ) + return; + m_ListModel->setRootObject( inputObject ); + m_Controls.treeView->reset(); + + // recursive method to check parents of the inputObject + m_ParentCount = ParentChecker(inputObject); + + // breadcrumb labels + for(int i = 0; i < m_Controls.breadcrumbHorizontalLayout->count()-1; i++) + { + QLayoutItem* child = m_Controls.breadcrumbHorizontalLayout->itemAt(i); + child->widget()->setVisible(false); + } + for(int i = 0; i < m_Controls.breadcrumbDescriptionLayout->count()-1; i++) + { + QLayoutItem* child = m_Controls.breadcrumbDescriptionLayout->itemAt(i); + child->widget()->setVisible(false); + } + + ctkXnatObject* parent = NULL; + for(int i = m_ParentCount*2; i >= 0; i--) + { + if(i > 12) + break; + m_Controls.breadcrumbDescriptionLayout->itemAt(i)->widget()->setVisible(true); + QLayoutItem* child = m_Controls.breadcrumbHorizontalLayout->itemAt(i); + child->widget()->setVisible(true); + if(i>0) + { + m_Controls.breadcrumbHorizontalLayout->itemAt(i-1)->widget()->setVisible(true); + m_Controls.breadcrumbDescriptionLayout->itemAt(i-1)->widget()->setVisible(true); + } + if(parent == NULL) + { + parent = inputObject; + } + // make breadcrumb button + QPushButton* breadcrumbButton = dynamic_cast(child->widget()); + breadcrumbButton->setText(parent->id()); + parent = parent->parent(); + i--; + } +} + +void QmitkXnatEditor::SelectionChanged(berry::IWorkbenchPart::Pointer sourcepart, + berry::ISelection::ConstPointer selection) +{ + // check for null selection + if (selection.IsNull()) + { + return; + } + // exclude own selection events and check whether this kind of selection can be handled + if (sourcepart != this && + selection.Cast()) + { + berry::IStructuredSelection::ConstPointer currentSelection = selection.Cast(); + // iterates over the selection + for (berry::IStructuredSelection::iterator itr = currentSelection->Begin(); + itr != currentSelection->End(); ++itr) + { + if (berry::SmartPointer objectPointer = itr->Cast()) + { + // get object of selected ListWidgetElement + ctkXnatObject* object = objectPointer->GetQModelIndex().data(Qt::UserRole).value(); + + // if a file is selected, don't change the input and list view + if ( dynamic_cast(object) == NULL ){ + QmitkXnatObjectEditorInput::Pointer oPtr = QmitkXnatObjectEditorInput::New( object ); + berry::IEditorInput::Pointer editorInput( oPtr ); + if ( !(editorInput == this->GetEditorInput()) ) + this->SetInput(editorInput); + + UpdateList(); + } + } + } + } +} + +void QmitkXnatEditor::DownloadResource() +{ + if (!m_Controls.treeView->selectionModel()->hasSelection()) + return; + + const QModelIndex index = m_Controls.treeView->selectionModel()->currentIndex(); + QVariant variant = m_ListModel->data(index, Qt::UserRole); + if ( variant.isValid() ) + { + ctkXnatScanResource* resource = dynamic_cast(variant.value()); + if (resource != NULL) + { + MITK_INFO << "Download started ..."; + MITK_INFO << "..."; + QString resourcePath = m_DownloadPath + resource->id() + ".zip"; + resource->download(resourcePath); + + // Testing if the path exists + QDir downDir(m_DownloadPath); + if( downDir.exists(resource->id() + ".zip") ) + { + MITK_INFO << "Download of " << resource->id().toStdString() << ".zip was completed!"; + } + else + { + MITK_INFO << "Download of " << resource->id().toStdString() << ".zip failed!"; + } + } + else + { + MITK_INFO << "Selection was not a resource folder!"; + } + } +} + +void QmitkXnatEditor::DownloadFile() +{ + if (!m_Controls.treeView->selectionModel()->hasSelection()) + return; + const QModelIndex index = m_Controls.treeView->selectionModel()->currentIndex(); + InternalFileDownload(index); +} + +void QmitkXnatEditor::ToHigherLevel() +{ + ctkXnatObject* parent = GetEditorInput().Cast()->GetXnatObject()->parent(); + if( parent == NULL) + { + return; + } + QmitkXnatObjectEditorInput::Pointer oPtr = QmitkXnatObjectEditorInput::New( parent ); + berry::IEditorInput::Pointer editorInput( oPtr ); + SetInput(editorInput); + UpdateList(); +} + +void QmitkXnatEditor::OnObjectActivated(const QModelIndex &index) +{ + if (!index.isValid()) return; + + ctkXnatObject* child = GetEditorInput().Cast()->GetXnatObject()->children().at(index.row()); + if( child != NULL ) + { + ctkXnatFile* file = dynamic_cast(child); + if( file != NULL ) + { + // Download file and put into datamanager + InternalFileDownload(index); + mitk::IDataStorageService* dsService = m_DataStorageServiceTracker.getService(); + if(dsService != NULL) + { + mitk::DataNode::Pointer node = mitk::IOUtil::LoadDataNode((m_DownloadPath + file->id()).toStdString()); + if ( ( node.IsNotNull() ) && ( node->GetData() != NULL ) ) + { + dsService->GetDataStorage()->GetDataStorage()->Add(node); + mitk::BaseData::Pointer basedata = node->GetData(); + mitk::RenderingManager::GetInstance()->InitializeViews( + basedata->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); + } + } + } + else + { + // Updates the root item + QmitkXnatObjectEditorInput::Pointer oPtr = QmitkXnatObjectEditorInput::New( child ); + berry::IEditorInput::Pointer editorInput( oPtr ); + SetInput(editorInput); + + this->GetEditorInput().Cast()->GetXnatObject()->fetch(); + + UpdateList(); + } + } + +} + +void QmitkXnatEditor::InternalFileDownload(const QModelIndex& index) +{ + QVariant variant = m_ListModel->data(index, Qt::UserRole); + if ( variant.isValid() ) + { + ctkXnatFile* file = dynamic_cast(variant.value()); + if (file != NULL) + { + MITK_INFO << "Download started ..."; + MITK_INFO << "..."; + QString filePath = m_DownloadPath + file->id(); + file->download(filePath); + + // Testing if the file exists + QDir downDir(m_DownloadPath); + if( downDir.exists(file->id()) ) + { + MITK_INFO << "Download of " << file->id().toStdString() << " was completed!"; + } + else + { + MITK_INFO << "Download of " << file->id().toStdString() << " failed!"; + } + } + else + { + MITK_INFO << "Selection was not a file!"; + } + } +} + +int QmitkXnatEditor::ParentChecker(ctkXnatObject* child) +{ + int sum; + if( child->parent() == NULL ) + { + return 0; + } + else + { + sum = 1 + ParentChecker(child->parent()); + } + return sum; +} + +void QmitkXnatEditor::OnDataModelButtonClicked() +{ + for(int i = m_ParentCount; i > 0; i--) + { + ToHigherLevel(); + } +} + +void QmitkXnatEditor::OnProjectButtonClicked() +{ + for(int i = m_ParentCount-1; i > 0; i--) + { + ToHigherLevel(); + } +} + +void QmitkXnatEditor::OnSubjectButtonClicked() +{ + for(int i = m_ParentCount-2; i > 0; i--) + { + ToHigherLevel(); + } +} + +void QmitkXnatEditor::OnExperimentButtonClicked() +{ + for(int i = m_ParentCount-3; i > 0; i--) + { + ToHigherLevel(); + } +} + +void QmitkXnatEditor::OnKindOfDataButtonClicked() +{ + for(int i = m_ParentCount-4; i > 0; i--) + { + ToHigherLevel(); + } +} + +void QmitkXnatEditor::OnSessionButtonClicked() +{ + for(int i = m_ParentCount-5; i > 0; i--) + { + ToHigherLevel(); + } +} + +void QmitkXnatEditor::OnResourceButtonClicked() +{ + for(int i = m_ParentCount-6; i > 0; i--) + { + ToHigherLevel(); + } +} diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatEditor.h b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatEditor.h new file mode 100644 index 0000000000..a46b22fd11 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatEditor.h @@ -0,0 +1,124 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + + +#ifndef QMITKXNATEDITOR_h +#define QMITKXNATEDITOR_h + +#include +#include +#include + +#include + +#include + +#include "ui_QmitkXnatEditorControls.h" + +#include "ctkXnatListModel.h" +#include "ctkXnatSession.h" + +#include + +/*! +\brief QmitkXnatEditor + +\warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation. + +\sa QmitkFunctionality +\ingroup ${plugin_target}_internal +*/ +class QmitkXnatEditor : public berry::QtEditorPart, public berry::IReusableEditor +{ + // this is needed for all Qt objects that should have a Qt meta-object + // (everything that derives from QObject and wants to have signal/slots) + Q_OBJECT + +public: + + berryObjectMacro(QmitkXnatEditor) + + QmitkXnatEditor(); + ~QmitkXnatEditor(); + + static const std::string EDITOR_ID; + + void CreateQtPartControl(QWidget *parent); + + void DoSave(/*IProgressMonitor monitor*/); + void DoSaveAs(); + void Init(berry::IEditorSite::Pointer site, berry::IEditorInput::Pointer input); + bool IsDirty() const; + bool IsSaveAsAllowed() const; + void SetInput(berry::IEditorInput::Pointer input); + const char* GetClassNameA() const; + + /** + \brief Here the root object will be set and the view reset. Additionally the breadcrumbs will set visible. + */ + void UpdateList(); + + protected slots: + + /** + \brief A resource folder will be downloaded to the chosen download path. + */ + void DownloadResource(); + + /** + \brief A file will be downloaded to the chosen download path. + */ + void DownloadFile(); + + /** + \brief Every time you activate a node in the list, the root item will be updated to a child of the previous parent.\ + In exception of the node is a file. The file will be downloaded and loaded to the DataManager. + */ + void OnObjectActivated(const QModelIndex& index); + + // Breadcrumb button slots + void OnDataModelButtonClicked(); + void OnProjectButtonClicked(); + void OnSubjectButtonClicked(); + void OnExperimentButtonClicked(); + void OnKindOfDataButtonClicked(); + void OnSessionButtonClicked(); + void OnResourceButtonClicked(); + +protected: + + virtual void SetFocus(); + + Ui::QmitkXnatEditorControls m_Controls; + +private: + + int m_ParentCount; + QString m_DownloadPath; + ctkServiceTracker m_DataStorageServiceTracker; + + void InternalFileDownload(const QModelIndex& index); + int ParentChecker(ctkXnatObject* child); + void ToHigherLevel(); + + ctkXnatListModel* m_ListModel; + ctkXnatSession* m_Session; + + berry::ISelectionListener::Pointer m_SelectionListener; + void SelectionChanged(berry::IWorkbenchPart::Pointer sourcepart, berry::ISelection::ConstPointer selection); +}; + +#endif // QMITKXNATEDITOR_h diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatEditorControls.ui b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatEditorControls.ui new file mode 100644 index 0000000000..5f13d15459 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatEditorControls.ui @@ -0,0 +1,460 @@ + + + QmitkXnatEditorControls + + + + 0 + 0 + 823 + 706 + + + + + 0 + 0 + + + + QmitkTemplate + + + + xnat_icon.icoxnat_icon.ico + + + + + + + + Current Position: + + + + + + + + + + 0 + 0 + + + + Server + + + + + + + + 0 + 0 + + + + >> + + + + + + + + 0 + 0 + + + + Project + + + + + + + + 0 + 0 + + + + >> + + + + + + + + 0 + 0 + + + + Subject + + + + + + + + 0 + 0 + + + + >> + + + + + + + + 0 + 0 + + + + Experiment + + + + + + + + 0 + 0 + + + + >> + + + + + + + + 0 + 0 + + + + Kind of Data + + + + + + + + 0 + 0 + + + + >> + + + + + + + + 0 + 0 + + + + Image Session + + + + + + + + 0 + 0 + + + + >> + + + + + + + + 0 + 0 + + + + Resource Folder + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 6 + + + QLayout::SetDefaultConstraint + + + 0 + + + + + + 0 + 0 + + + + Data Model + + + + + + + true + + + + 0 + 0 + + + + >> + + + + + + + + 0 + 0 + + + + Qt::LeftToRight + + + Project + + + + + + + + 0 + 0 + + + + >> + + + + + + + + 0 + 0 + + + + Subject + + + + + + + + 0 + 0 + + + + >> + + + + + + + + 0 + 0 + + + + Experiment + + + + + + + + 0 + 0 + + + + >> + + + + + + + + 0 + 0 + + + + Kind of Data + + + + + + + + 0 + 0 + + + + >> + + + + + + + + 0 + 0 + + + + Session + + + + + + + + 0 + 0 + + + + >> + + + + + + + + 0 + 0 + + + + Resource + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + (no function) + + + + + + + Download Folder + + + + + + + Download File + + + + + + + + + + + + + diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatObjectEditorInput.cpp b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatObjectEditorInput.cpp new file mode 100644 index 0000000000..88fd6cd358 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatObjectEditorInput.cpp @@ -0,0 +1,63 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "QmitkXnatObjectEditorInput.h" + +QmitkXnatObjectEditorInput::QmitkXnatObjectEditorInput(ctkXnatObject* object) + : m_Object(object) +{ +} + +QmitkXnatObjectEditorInput::~QmitkXnatObjectEditorInput() +{ +} + +ctkXnatObject* QmitkXnatObjectEditorInput::GetXnatObject() const +{ + return m_Object; +} + +bool QmitkXnatObjectEditorInput::Exists() const +{ + return m_Object->exists(); +} + +std::string QmitkXnatObjectEditorInput::GetName() const +{ + return m_Object->id().toStdString(); +} + +std::string QmitkXnatObjectEditorInput::GetToolTipText() const +{ + return m_Object->description().toStdString(); +} + +bool QmitkXnatObjectEditorInput::operator==(const berry::Object* o) const +{ + if ( const QmitkXnatObjectEditorInput* other = dynamic_cast(o) ) + { + if ( other->GetXnatObject()->parent() ) + { + return ( !other->GetName().compare(this->GetName()) ) && + ( !other->GetXnatObject()->parent()->id().toStdString().compare(this->GetXnatObject()->parent()->id().toStdString()) ); + } + else + { + return ( !other->GetName().compare(this->GetName()) ); + } + } + return false; +} diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatObjectEditorInput.h b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatObjectEditorInput.h new file mode 100644 index 0000000000..ab5699f470 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatObjectEditorInput.h @@ -0,0 +1,45 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#ifndef QMITKXNATOBJECTEDITORINPUT_H_ +#define QMITKXNATOBJECTEDITORINPUT_H_ + +#include "berryIEditorInput.h" +#include "ctkXnatObject.h" + +class QmitkXnatObjectEditorInput : public berry::IEditorInput { + +public: + berryObjectMacro(QmitkXnatObjectEditorInput); + berryNewMacro1Param(QmitkXnatObjectEditorInput, ctkXnatObject*); + + ~QmitkXnatObjectEditorInput(); + + /// \brief Returns the kept ctkXnatObject. + ctkXnatObject* GetXnatObject() const; + + virtual bool Exists() const; + virtual std::string GetName() const; + virtual std::string GetToolTipText() const; + virtual bool operator==(const berry::Object* o) const; + +private: + QmitkXnatObjectEditorInput(ctkXnatObject* object); + + ctkXnatObject* m_Object; +}; + +#endif /*QMITKXNATOBJECTEDITORINPUT_H_*/ diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatSimpleSearchView.cpp b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatSimpleSearchView.cpp new file mode 100644 index 0000000000..bc21d41ce1 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatSimpleSearchView.cpp @@ -0,0 +1,104 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +// Qmitk +#include "QmitkXnatSimpleSearchView.h" + +// Standard +#include +#include + +// Blueberry +#include +#include + +// Qt +#include +#include +#include +#include +#include +#include +#include +#include + +// ctkXnatCore +#include "ctkXnatProject.h" + +const std::string QmitkXnatSimpleSearchView::VIEW_ID = "org.mitk.views.qmitkxnatsimplesearchview"; + +QmitkXnatSimpleSearchView::QmitkXnatSimpleSearchView() : + m_Session(0), + m_TreeModel(new ctkXnatTreeModel()) +{ +} + +QmitkXnatSimpleSearchView::~QmitkXnatSimpleSearchView() +{ + delete m_TreeModel; +} + +void QmitkXnatSimpleSearchView::SetFocus() +{ + m_Controls.buttonStartSearch->setFocus(); +} + +void QmitkXnatSimpleSearchView::CreateQtPartControl( QWidget *parent ) +{ + // create GUI widgets from the Qt Designer's .ui file + m_Controls.setupUi( parent ); + m_Controls.treeView->setModel(m_TreeModel); + + connect( m_Controls.buttonStartSearch, SIGNAL(clicked()), this, SLOT(StartSearch()) ); +} + +void QmitkXnatSimpleSearchView::StartSearch() +{ + int type; + + switch(m_Controls.objectComboBox->currentIndex()) + { + case QmitkXnatSimpleSearchView::PROJECT: + type = QmitkXnatSimpleSearchView::PROJECT; + break; + case QmitkXnatSimpleSearchView::SUBJECT: + type = QmitkXnatSimpleSearchView::SUBJECT; + break; + case QmitkXnatSimpleSearchView::EXPERIMENT: + type = QmitkXnatSimpleSearchView::EXPERIMENT; + break; + default: + type = QmitkXnatSimpleSearchView::EMPTY; + MITK_INFO << "You did something weird or chose nothing!"; + break; + } + + //m_TreeModel->setMatchingObject( type ); + //m_TreeModel->setSearchTerm( m_Controls.termLineEdit->text() ); + //m_TreeModel->setIsStartOfSearch( true ); + + // create ctkXnatConnection + //m_Connection = m_ConnectionFactory->makeConnection(m_Controls.inHostAddress->text(), m_Controls.inUser->text(), m_Controls.inPassword->text()); + //ctkXnatServer* server = m_Connection->server(); + + //m_TreeModel->addServer(server); + //m_Controls.treeView->reset(); +} + +void QmitkXnatSimpleSearchView::SetSelectionProvider() +{ + GetSite()->SetSelectionProvider(m_SelectionProvider); +} diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatSimpleSearchView.h b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatSimpleSearchView.h new file mode 100644 index 0000000000..ae73e28a44 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatSimpleSearchView.h @@ -0,0 +1,85 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#ifndef QMITKXNATSIMPLESEARCHVIEW_H +#define QMITKXNATSIMPLESEARCHVIEW_H + +#include + +#include +#include "QmitkXnatTreeBrowserView.h" + +#include "ui_QmitkXnatSimpleSearchViewControls.h" + +// ctkXnatCore +#include "ctkXnatSession.h" + +// ctkXnatWidget +#include "ctkXnatTreeModel.h" + +/*! +\brief QmitkXnatSimpleSearchView + +\warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation. + +\sa QmitkFunctionality +\ingroup ${plugin_target}_internal +*/ +class QmitkXnatSimpleSearchView : public QmitkXnatTreeBrowserView +{ + // this is needed for all Qt objects that should have a Qt meta-object + // (everything that derives from QObject and wants to have signal/slots) + Q_OBJECT + +public: + + enum MatchingObject + { + EMPTY, + PROJECT, + SUBJECT, + EXPERIMENT + }; + + QmitkXnatSimpleSearchView(); + ~QmitkXnatSimpleSearchView(); + static const std::string VIEW_ID; + + virtual void CreateQtPartControl(QWidget *parent); + + berry::QtSelectionProvider::Pointer m_SelectionProvider; + + protected slots: + + /// \brief Called when the user clicks the GUI button + void StartSearch(); + +protected: + + virtual void SetFocus(); + + Ui::QmitkXnatSimpleSearchViewControls m_Controls; + +private: + + void SetSelectionProvider(); + + ctkXnatSession* m_Session; + ctkXnatTreeModel* m_TreeModel; + +}; + +#endif // QMITKXNATSIMPLESEARCHVIEW_H diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatSimpleSearchViewControls.ui b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatSimpleSearchViewControls.ui new file mode 100644 index 0000000000..1432f36d13 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatSimpleSearchViewControls.ui @@ -0,0 +1,190 @@ + + + QmitkXnatSimpleSearchViewControls + + + + 0 + 0 + 306 + 975 + + + + + 0 + 0 + + + + QmitkTemplate + + + + xnat_icon.icoxnat_icon.ico + + + + + + + + QLabel { color: rgb(255, 0, 0) } + + + Please insert your XNAT host address: + + + + + + + + 230 + 0 + + + + <html><head/><body><p>Examples:</p><p>&quot;http://localhost:8080/xnat&quot;</p><p>&quot;http://central.xnat.org:80&quot;</p><p>&quot;https://xnat.myserver.de:443&quot;</p></body></html> + + + http://localhost:12345/xnat + + + http(s)://host:port/pathToXnatServerInstance + + + + + + + + + admin + + + User + + + + + + + + 53 + 0 + + + + admin + + + QLineEdit::Password + + + Password + + + + + + + + + Qt::Vertical + + + QSizePolicy::Minimum + + + + 20 + 40 + + + + + + + + + + + 0 + 0 + + + + + + + + + + Project + + + + + Subject + + + + + Experiment + + + + + + + + Matching Object + + + + + + + + 0 + 0 + + + + + + + + Search Term + + + + + + + + + true + + + Get all projects + + + Start Search + + + + + + + + + + + + + + + + diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp new file mode 100644 index 0000000000..587c74f360 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp @@ -0,0 +1,119 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "QmitkXnatTreeBrowserView.h" + +// Qmitk +#include "QmitkXnatObjectEditorInput.h" +#include "QmitkXnatEditor.h" +#include "org_mitk_gui_qt_xnatinterface_Activator.h" + +// Blueberry +#include + +// CTK XNAT Core +#include "ctkXnatFile.h" + +const std::string QmitkXnatTreeBrowserView::VIEW_ID = "org.mitk.views.xnat.treebrowser"; + +QmitkXnatTreeBrowserView::QmitkXnatTreeBrowserView(): + m_Session(0), + m_TreeModel(new ctkXnatTreeModel()) +{ +} + +QmitkXnatTreeBrowserView::~QmitkXnatTreeBrowserView() +{ + delete m_TreeModel; +} + +void QmitkXnatTreeBrowserView::SetFocus() +{ +} + +void QmitkXnatTreeBrowserView::CreateQtPartControl( QWidget *parent ) +{ + // Create GUI widgets from the Qt Designer's .ui file + m_Controls.setupUi( parent ); + m_Controls.treeView->setModel(m_TreeModel); + m_Controls.treeView->header()->hide(); + + m_SelectionProvider = new berry::QtSelectionProvider(); + m_SelectionProvider->SetItemSelectionModel(m_Controls.treeView->selectionModel()); + this->SetSelectionProvider(); + m_Controls.treeView->setSelectionMode(QAbstractItemView::SingleSelection); + + connect( m_Controls.treeView, SIGNAL(activated(const QModelIndex&)), this, SLOT(OnActivatedNode(const QModelIndex&)) ); + + // Get the XNAT Session from Activator + m_Session = mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatConnectionManager()->GetXnatConnection(); + + if(m_Session == 0) return; + + // Fill model and show in the GUI + m_TreeModel->addDataModel(m_Session->dataModel()); + m_Controls.treeView->reset(); +} + +void QmitkXnatTreeBrowserView::OnActivatedNode(const QModelIndex& index) +{ + if (!index.isValid()) return; + + berry::IWorkbenchPage::Pointer page = GetSite()->GetPage(); + QmitkXnatObjectEditorInput::Pointer oPtr = QmitkXnatObjectEditorInput::New( index.data(Qt::UserRole).value() ); + berry::IEditorInput::Pointer editorInput( oPtr ); + berry::IEditorPart::Pointer reuseEditor = page->FindEditor(editorInput); + + if(reuseEditor) + { + // Just set it activ + page->Activate(reuseEditor); + } + else + { + std::vector editors = + page->FindEditors(berry::IEditorInput::Pointer(0), QmitkXnatEditor::EDITOR_ID, berry::IWorkbenchPage::MATCH_ID); + + if (editors.empty()) + { + // No XnatEditor is currently open, create a new one + ctkXnatFile* file = dynamic_cast(oPtr->GetXnatObject()); + if(file != NULL) + { + // If a file is activated take the parent and open a new editor + QmitkXnatObjectEditorInput::Pointer oPtr2 = QmitkXnatObjectEditorInput::New( file->parent() ); + berry::IEditorInput::Pointer editorInput2( oPtr2 ); + page->OpenEditor(editorInput2, QmitkXnatEditor::EDITOR_ID); + } + else + { + page->OpenEditor(editorInput, QmitkXnatEditor::EDITOR_ID); + } + } + else + { + // Reuse an existing editor + reuseEditor = editors.front()->GetEditor(true); + page->ReuseEditor(reuseEditor.Cast(), editorInput); + page->Activate(reuseEditor); + } + } +} + +void QmitkXnatTreeBrowserView::SetSelectionProvider() +{ + GetSite()->SetSelectionProvider(m_SelectionProvider); +} diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h new file mode 100644 index 0000000000..8c6de2b22c --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h @@ -0,0 +1,76 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#ifndef QMITKXNATTREEBROWSERVIEW_H +#define QMITKXNATTREEBROWSERVIEW_H + +#include + +#include + +#include "ui_QmitkXnatTreeBrowserViewControls.h" + +// ctkXnatCore +#include "ctkXnatSession.h" + +// ctkXnatWidget +#include "ctkXnatTreeModel.h" + +/*! +\brief QmitkXnatTreeBrowserView + +\warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation. + +\sa QmitkFunctionality +\ingroup ${plugin_target}_internal +*/ +class QmitkXnatTreeBrowserView : public QmitkAbstractView +{ + // this is needed for all Qt objects that should have a Qt meta-object + // (everything that derives from QObject and wants to have signal/slots) + Q_OBJECT + +public: + + QmitkXnatTreeBrowserView(); + ~QmitkXnatTreeBrowserView(); + + static const std::string VIEW_ID; + + virtual void CreateQtPartControl(QWidget *parent); + + berry::QtSelectionProvider::Pointer m_SelectionProvider; + + protected slots: + + /// \brief Opens or reuses the xnat editor with the activated node as root item. + void OnActivatedNode(const QModelIndex& index); + +protected: + + virtual void SetFocus(); + + Ui::QmitkXnatTreeBrowserViewControls m_Controls; + +private: + + void SetSelectionProvider(); + + ctkXnatSession* m_Session; + ctkXnatTreeModel* m_TreeModel; +}; + +#endif // QMITKXNATTREEBROWSERVIEW_H diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserViewControls.ui b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserViewControls.ui new file mode 100644 index 0000000000..5199283997 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserViewControls.ui @@ -0,0 +1,37 @@ + + + QmitkXnatTreeBrowserViewControls + + + + 0 + 0 + 455 + 975 + + + + + 0 + 0 + + + + QmitkTemplate + + + + + + + + + + + + + + + + + diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/org_mitk_gui_qt_xnatinterface_Activator.cpp b/Plugins/org.mitk.gui.qt.xnat/src/internal/org_mitk_gui_qt_xnatinterface_Activator.cpp new file mode 100644 index 0000000000..74119845af --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/org_mitk_gui_qt_xnatinterface_Activator.cpp @@ -0,0 +1,56 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "org_mitk_gui_qt_xnatinterface_Activator.h" + +#include + +#include "QmitkXnatEditor.h" +#include "QmitkXnatTreeBrowserView.h" +#include "QmitkXnatConnectionPreferencePage.h" + +namespace mitk { + +ctkPluginContext* org_mitk_gui_qt_xnatinterface_Activator::m_Context = 0; + +QmitkXnatConnectionManager* org_mitk_gui_qt_xnatinterface_Activator::GetXnatConnectionManager() +{ + static QmitkXnatConnectionManager manager; + return &manager; +} + +ctkPluginContext* org_mitk_gui_qt_xnatinterface_Activator::GetContext() +{ + return m_Context; +} + +void org_mitk_gui_qt_xnatinterface_Activator::start(ctkPluginContext* context) +{ + this->m_Context = context; + + BERRY_REGISTER_EXTENSION_CLASS(QmitkXnatEditor, context) + BERRY_REGISTER_EXTENSION_CLASS(QmitkXnatTreeBrowserView, context) + BERRY_REGISTER_EXTENSION_CLASS(QmitkXnatConnectionPreferencePage, context) +} + +void org_mitk_gui_qt_xnatinterface_Activator::stop(ctkPluginContext* context) +{ + Q_UNUSED(context) +} + +} + +Q_EXPORT_PLUGIN2(org_mitk_gui_qt_xnatinterface, mitk::org_mitk_gui_qt_xnatinterface_Activator) diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/org_mitk_gui_qt_xnatinterface_Activator.h b/Plugins/org.mitk.gui.qt.xnat/src/internal/org_mitk_gui_qt_xnatinterface_Activator.h new file mode 100644 index 0000000000..9b39558730 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/org_mitk_gui_qt_xnatinterface_Activator.h @@ -0,0 +1,48 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + + +#ifndef org_mitk_gui_qt_xnatinterface_Activator_h +#define org_mitk_gui_qt_xnatinterface_Activator_h + +#include +#include "QmitkXnatConnectionManager.h" + +namespace mitk { + +class org_mitk_gui_qt_xnatinterface_Activator : + public QObject, public ctkPluginActivator +{ + Q_OBJECT + Q_INTERFACES(ctkPluginActivator) + +public: + + static QmitkXnatConnectionManager* GetXnatConnectionManager(); + static ctkPluginContext* GetContext(); + + void start(ctkPluginContext* context); + void stop(ctkPluginContext* context); + +private: + + static ctkPluginContext* m_Context; + +}; // org_mitk_gui_qt_xnatinterface_Activator + +} + +#endif // org_mitk_gui_qt_xnatinterface_Activator_h diff --git a/Plugins/org.mitk.gui.qt.xnat/target_libraries.cmake b/Plugins/org.mitk.gui.qt.xnat/target_libraries.cmake new file mode 100644 index 0000000000..e18fde9a3e --- /dev/null +++ b/Plugins/org.mitk.gui.qt.xnat/target_libraries.cmake @@ -0,0 +1,9 @@ +# See CMake/ctkFunctionGetTargetLibraries.cmake +# +# This file should list the libraries required to build the current CTK plugin. +# For specifying required plugins, see the manifest_headers.cmake file. +# + +set(target_libraries + CTKXNATCore +)