diff --git a/src/common/processor.js b/src/common/processor.js index 8801afbd..19de909d 100644 --- a/src/common/processor.js +++ b/src/common/processor.js @@ -210,7 +210,7 @@ define([], function() { // make .Package convenience member for rendering code obj.Package = parent.name; // make .TypeName convenience member for rendering code - obj.TypeName = obj.name; + obj.TypeName = obj.name + 'Action'; // make .AdvertisedName convenience member for rendering code obj.AdvertisedName = obj.Package + '/' + obj.name; // get packages that this service is dependent on @@ -235,7 +235,7 @@ define([], function() { makeExternalActionConvenience: function(obj, objects) { // already will have .Package convenience member for rendering code from model // make .TypeName convenience member for rendering code - obj.TypeName = obj.name; + obj.TypeName = obj.name + 'Action'; // make .AdvertisedName convenience member for rendering code obj.AdvertisedName = obj.Package + '/' + obj.name; }, @@ -262,7 +262,7 @@ define([], function() { // make .Package convenience member for rendering code obj.Package = TopicType.Package; // make .TypeName convenience member for rendering code - obj.TypeName = TopicType.name; + obj.TypeName = TopicType.name + 'Action'; // make .AdvertisedName convenience member for rendering code obj.AdvertisedName = obj.name; }, diff --git a/src/plugins/SoftwareGenerator/Templates/Templates.js b/src/plugins/SoftwareGenerator/Templates/Templates.js index 860ae941..f92efdf5 100644 --- a/src/plugins/SoftwareGenerator/Templates/Templates.js +++ b/src/plugins/SoftwareGenerator/Templates/Templates.js @@ -3,7 +3,7 @@ define([], function() { return { "CMakeLists.txt.ejs": "cmake_minimum_required(VERSION 2.8.3)\nproject(<%- pkgInfo.name %>)\n\n## Start Global Marker\n## End Global Marker\n\n## Check C++11 / C++0x\ninclude(CheckCXXCompilerFlag)\nCHECK_CXX_COMPILER_FLAG(\"-std=c++11\" COMPILER_SUPPORTS_CXX11)\nCHECK_CXX_COMPILER_FLAG(\"-std=c++0x\" COMPILER_SUPPORTS_CXX0X)\nif(COMPILER_SUPPORTS_CXX11)\n set(CMAKE_CXX_FLAGS \"-std=c++11\")\nelseif(COMPILER_SUPPORTS_CXX0X)\n set(CMAKE_CXX_FLAGS \"-std=c++0x\")\nelse()\n message(FATAL_ERROR \"The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.\")\nendif()\n\nfind_package(catkin REQUIRED COMPONENTS\n<%\nif (pkgInfo.Message_list || pkgInfo.Service_list || pkgInfo.Action_list) {\n-%>\n message_generation\n<%\n}\n-%>\n rosmod\n rosmod_actor\n # external packages that we depend on\n <%- pkgInfo.PackageDependencies.join(' ') %>\n)\n\n<% \nif (pkgInfo.Service_list) { \n-%>\n# Generate services in the 'srv' folder\nadd_service_files(\n FILES\n<% \n pkgInfo.Service_list.map(function(srv) { \n-%>\n <%- srv.name %>.srv\n<%\n }); \n-%>\n)\n<%\n} \n-%>\n\n<%\nif (pkgInfo.Message_list) { \n-%>\n# Generate messages in the 'msg' folder\nadd_message_files(\n FILES\n<%\n pkgInfo.Message_list.map(function(msg) { \n-%>\n <%- msg.name %>.msg\n<%\n }); \n-%>\n)\n<%\n} \n-%>\n\n<%\nif (pkgInfo.Action_list) { \n-%>\n# Generate actions in the 'action' folder\nadd_action_files(\n FILES\n<%\n pkgInfo.Action_list.map(function(act) { \n-%>\n <%- act.name %>.action\n<%\n }); \n-%>\n)\n<%\n} \n-%>\n\n<%\nif (pkgInfo.Message_list || pkgInfo.Service_list || pkgInfo.Action_list) {\n-%>\n# Generate added messages and services with any dependencies listed here\ngenerate_messages(\n DEPENDENCIES\n <%- pkgInfo.GenerateMessageDependencies.join(' ') %>\n)\n<%\n}\n-%>\n\n#\n## catkin specific configuration \n#\n## The catkin_package macro generates cmake config files for your package\n## Declare things to be passed to dependent projects\n## INCLUDE_DIRS: uncomment this if you package contains header files\n## LIBRARIES: libraries you create in this project that dependent projects also need\n## CATKIN_DEPENDS: catkin_packages dependent projects also need\n## DEPENDS: system dependencies of this project that dependent projects also need\ncatkin_package(\n<%\nif (pkgInfo.Component_list) {\n-%>\n INCLUDE_DIRS include\n<%\n}\n-%>\n# LIBRARIES client_server_package\n# CATKIN_DEPENDS roscpp std_msgs\n<%\nif (pkgInfo.Message_list || pkgInfo.Service_list || pkgInfo.Action_list) {\n-%>\n CATKIN_DEPENDS <%- pkgInfo.PackageDependencies.join(' ') %>\n<%\n}\n-%>\n<%\nif (pkgInfo.Message_list || pkgInfo.Service_list || pkgInfo.Action_list) {\n-%>\n CATKIN_DEPENDS message_runtime\n<%\n}\n-%>\n# DEPENDS system_lib\n)\n\n#\n## Build \n#\n\n## Specify additional locations of header files\n## Your package locations should be listed before other locations\n# include_directories(include)\ninclude_directories(\n<%\nif (pkgInfo.Component_list) {\n-%>\n\tinclude\n<%\n}\n-%>\n\t${catkin_INCLUDE_DIRS})\n\n<%- pkgInfo.CMAKE_COMMANDS.join('\\n') %>\n\n<%\nif (pkgInfo.Component_list) {\n pkgInfo.Component_list.map(function(cmp) {\n-%>\nadd_library(<%- cmp.name %>\n src/<%- pkgInfo.name %>/<%- cmp.name %>.cpp\n<%\nif (cmp['State Machine_list']) {\n cmp['State Machine_list'].map(function(hfsm) {\n-%>\n include/<%- pkgInfo.name %>/<%- cmp.name %>_HFSM/<%- hfsm.sanitizedName %>_GeneratedStates.cpp\n<%\n});\n}\n-%>\n )\ntarget_link_libraries(<%- cmp.name %>\n ${catkin_LIBRARIES}\n <%- cmp.LinkLibraries.join(' ') %>\n )\n<%\n if (cmp.Dependencies.length) {\n-%>\nadd_dependencies(<%- cmp.name %>\n <%- cmp.Dependencies.join(' ') %>\n\t\t )\n<%\n }\n-%>\n<%\n });\n} \n-%>\n", "component.cpp.ejs": "/** @file <%- compInfo.name %>.cpp \n * @author <%- compInfo.Authors %>\n * @date <%= (new Date()).toISOString() %>\n * @brief This file contains definitions for the <%- compInfo.name %> class; <%- compInfo['Brief Description'] %>\n */\n\n#include \"<%- compInfo.Package %>/<%- compInfo.name %>.hpp\"\n\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n// HFSM Includes\n#include \"<%- compInfo.Package %>/<%- compInfo.name %>_HFSM/<%- hfsm.sanitizedName %>_Events.hpp\"\n#include \"<%- compInfo.Package %>/<%- compInfo.name %>_HFSM/<%- hfsm.sanitizedName %>_GeneratedStates.hpp\"\n<%\n });\n}\n-%>\n\n\n// User Definitions\n//::::<%- compInfo.path %>::::Definitions::::\n<%- compInfo.Definitions %>\n\n// Component Initialization \nvoid <%- compInfo.name %>::init_timer_operation(const rosmod::TimerEvent& event)\n{\n // User Initialization Code\n try {\n {\n // print out the config that was passed in\n std::string configStr = config.toStyledString();\n std::cout << \"Config: \" << config << std::endl;\n }\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n {\n // now initialize the HFSM\n // update the \"this_component\" var for the HFSM\n <%- hfsm.sanitizedName %>_root->setComponentPtr( this );\n <%- hfsm.sanitizedName %>_root->initialize();\n // update the HFSM timer period and start the timer\n ros::Duration newPeriod = ros::Duration( <%- hfsm.sanitizedName %>_root->getActiveLeaf()->getTimerPeriod() );\n <%- hfsm.sanitizedName %>_HFSM_timer.stop();\n if (!<%- hfsm.sanitizedName %>_root->hasStopped()) {\n <%- hfsm.sanitizedName %>_HFSM_timer.setPeriod( newPeriod );\n <%- hfsm.sanitizedName %>_HFSM_timer.start();\n }\n }\n<%\n });\n}\n-%>\n // now run the initialization code\n //::::<%- compInfo.path %>::::Initialization::::\n <%- compInfo.Initialization %>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::initialization: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::initialization\");\n }\n init_timer.stop();\n}\n\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n// <%- hfsm.name %> Timer function\nvoid <%- compInfo.name %>::<%- hfsm.sanitizedName %>_HFSM_timer_operation(const rosmod::TimerEvent& event)\n{\n try {\n StateMachine::Event* e = nullptr;\n // process all pending events\n while ( (e = eventFactory->getNextEvent()) != nullptr ) {\n <%- hfsm.sanitizedName %>_root->handleEvent( e );\n eventFactory->consumeEvent( e );\n }\n // run the HFSM tick event\n <%- hfsm.sanitizedName %>_root->tick();\n // process all events that may have been generated by the tick event\n while ( (e = eventFactory->getNextEvent()) != nullptr ) {\n <%- hfsm.sanitizedName %>_root->handleEvent( e );\n eventFactory->consumeEvent( e );\n }\n // update the timer period according to new active state\n ros::Duration newPeriod = ros::Duration( <%- hfsm.sanitizedName %>_root->getActiveLeaf()->getTimerPeriod() );\n <%- hfsm.sanitizedName %>_HFSM_timer.stop();\n if (!<%- hfsm.sanitizedName %>_root->hasStopped()) {\n <%- hfsm.sanitizedName %>_HFSM_timer.setPeriod( newPeriod );\n <%- hfsm.sanitizedName %>_HFSM_timer.start();\n }\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::<%- hfsm.sanitizedName %>_HFSM_timer_operation: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::<%- hfsm.sanitizedName %>_HFSM_timer_operation\");\n }\n}\n<%\n });\n}\n-%>\n\n<%\nif (compInfo.Timer_list) {\n compInfo.Timer_list.map(function(tmr) {\n-%>\n// Timer Operation - <%- tmr.name %>\nvoid <%- compInfo.name %>::<%- tmr.name %>_operation(const rosmod::TimerEvent& event)\n{\n try {\n //::::<%- tmr.path %>::::Operation::::\n <%- tmr.Operation %>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::<%- tmr.name %>_operation: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::<%- tmr.name %>_operation\");\n }\n}\n<%\n });\n }\n-%>\n\n<%\nif (compInfo.Subscriber_list) {\n compInfo.Subscriber_list.map(function(sub) {\n-%>\n// Subscriber Operation - <%- sub.name %>\nvoid <%- compInfo.name %>::<%- sub.name %>_operation(const ros::MessageEvent<<%- sub.Message.Package %>::<%- sub.Message.TypeName %> const>& event)\n{\n try {\n // get the publisher name, header, receipt time, and received_data from the event\n const std::string& publisher_node_name = event.getPublisherName();\n const boost::shared_ptr& headerPtr = event.getConnectionHeaderPtr();\n ros::Time receipt_time = event.getReceiptTime();\n const <%- sub.Message.Package %>::<%- sub.Message.TypeName %>::ConstPtr& received_data = event.getMessage();\n const <%- sub.Message.Package %>::<%- sub.Message.TypeName %>::ConstPtr& message = received_data;\n // now run the user's subscriber operation code\n //::::<%- sub.path %>::::Operation::::\n <%- sub.Operation %>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::<%- sub.name %>_operation: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::<%- sub.name %>_operation\");\n }\n}\n<%\n });\n }\n-%>\n\n<%\nif (compInfo.Server_list) {\n compInfo.Server_list.map(function(srv) {\n-%>\n// Server Operation - <%- srv.name %>\nbool <%- compInfo.name %>::<%- srv.name %>_operation(const <%- srv.Service.Package %>::<%- srv.Service.TypeName %>::Request &req, <%- srv.Service.Package %>::<%- srv.Service.TypeName %>::Response &res )\n{\n try {\n // now run the user's server operation code\n //::::<%- srv.path %>::::Operation::::\n <%- srv.Operation %>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::<%- srv.name %>_operation: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::<%- srv.name %>_operation\");\n }\n return true;\n}\n<%\n });\n }\n-%>\n\n// Destructor - Cleanup Ports & Timers\n<%- compInfo.name %>::~<%- compInfo.name %>()\n{\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n <%- hfsm.sanitizedName %>_HFSM_timer.stop();\n<%\n });\n}\n-%>\n<%\nif (compInfo.Timer_list) {\n compInfo.Timer_list.map(function(tmr) {\n-%>\n <%- tmr.name %>.stop();\n<%\n\t});\n }\n-%>\n<%\nif (compInfo.Publisher_list) {\n compInfo.Publisher_list.map(function(pub) {\n-%>\n <%- pub.name %>.shutdown();\n<%\n\t});\n }\n-%>\n<%\nif (compInfo.Subscriber_list) {\n compInfo.Subscriber_list.map(function(sub) {\n-%>\n <%- sub.name %>.shutdown();\n<%\n\t});\n }\n-%>\n<%\nif (compInfo.Client_list) {\n compInfo.Client_list.map(function(clt) {\n-%>\n <%- clt.name %>.shutdown();\n<%\n\t});\n }\n-%>\n<%\nif (compInfo.Server_list) {\n compInfo.Server_list.map(function(srv) {\n-%>\n <%- srv.name %>.shutdown();\n<%\n\t});\n }\n-%>\n // User Destruction\n //::::<%- compInfo.path %>::::Destruction::::\n <%- compInfo.Destruction %>\n // make sure all logs are written\n logger->write(); // flushes internally\n}\n\n// Startup - Setup Component Ports & Timers\nvoid <%- compInfo.name %>::startUp()\n{\n rosmod::NodeHandle nh;\n std::string advertiseName;\n ros::Duration deadline;\n bool isOneShot;\n rosmod::TimerOptions timer_options;\n rosmod::ROSMOD_Callback_Options callback_options;\n\n\n // extra data we add to the header for service connections\n std::map service_header;\n service_header[\"component instance\"] = config[\"Name\"].asString();\n\n if ( config[\"Logging\"][\"Component Logger\"][\"Enabled\"].asBool() ) {\n logger->create_file(workingDir + \"/\" + config[\"Logging\"][\"Component Logger\"][\"FileName\"].asString());\n logger->set_is_periodic(config[\"Logging\"][\"Component Logger\"][\"Enabled\"].asBool());\n logger->set_max_log_unit(config[\"Logging\"][\"Component Logger\"][\"Unit\"].asInt());\n ROS_INFO_STREAM(\"Saving trace log to \" << workingDir << \"/\" << config[\"Logging\"][\"Component Logger\"][\"FileName\"].asString());\n }\n\n if ( config[\"Logging\"][\"ROSMOD Logger\"][\"Enabled\"].asBool() ) {\n ROS_INFO_STREAM(\"Saving trace log to \" << workingDir + \"/\" + config[\"Logging\"][\"ROSMOD Logger\"][\"FileName\"].asString());\n comp_queue.ROSMOD_LOGGER->enable_logging();\n comp_queue.ROSMOD_LOGGER->create_file( workingDir + \"/\" + config[\"Logging\"][\"ROSMOD Logger\"][\"FileName\"].asString());\n comp_queue.ROSMOD_LOGGER->set_max_log_unit(config[\"Logging\"][\"ROSMOD Logger\"][\"Unit\"].asInt());\n }\n \n this->comp_queue.scheduling_scheme = config[\"SchedulingScheme\"].asString();\n\n // Servers\n<%\nif (compInfo.Server_list) {\n compInfo.Server_list.map(function(srv) {\n-%>\n // Server - <%- srv.name %>\n callback_options.alias = \"<%- srv.name %>_operation\";\n \n callback_options.priority = config[\"Servers\"][\"<%- srv.name %>\"][\"Priority\"].asInt();\n deadline = ros::Duration(config[\"Servers\"][\"<%- srv.name %>\"][\"Deadline\"].asFloat());\n callback_options.deadline.sec = deadline.sec;\n callback_options.deadline.nsec = deadline.nsec;\n\n advertiseName = \"<%- srv.Service.AdvertisedName %>\";\n rosmod::AdvertiseServiceOptions <%- srv.name %>_server_options;\n <%- srv.name %>_server_options = rosmod::AdvertiseServiceOptions::create<<%- srv.Service.Package %>::<%- srv.Service.TypeName %>>\n (advertiseName.c_str(),\n boost::bind(&<%- compInfo.name %>::<%- srv.name %>_operation, this, _1, _2),\n rosmod::VoidPtr(),\n &this->comp_queue,\n callback_options);\n this-><%- srv.name %> = nh.advertiseService(<%- srv.name %>_server_options);\n<%\n });\n}\n-%>\n // Clients\n<%\nif (compInfo.Client_list) {\n compInfo.Client_list.map(function(clt) {\n-%>\n // Client - <%- clt.name %>\n advertiseName = \"<%- clt.Service.AdvertisedName %>\";\n this-><%- clt.name %> = nh.serviceClient<<%- clt.Service.Package %>::<%- clt.Service.TypeName %>>(\n advertiseName.c_str(),\n false, // not persistent\n service_header\n );//, true); \n this-><%- clt.name %>.waitForExistence();\n logger->log(\"DEBUG\", \"<%- clt.name %> connected!\");\n<%\n });\n }\n-%>\n // Publishers\n bool latching = true;\n<%\nif (compInfo.Publisher_list) {\n compInfo.Publisher_list.map(function(pub) {\n-%>\n // Publisher - <%- pub.name %>\n advertiseName = \"<%- pub.Message.AdvertisedName %>\";\n latching = <%- pub.Latching ? \"true\" : \"false\" %>;\n this-><%- pub.name %> = nh.advertise<<%- pub.Message.Package %>::<%- pub.Message.TypeName %>>(\n advertiseName.c_str(),\n 1000,\n latching\n ); \n<%\n });\n }\n-%>\n // Subscribers\n<%\nif (compInfo.Subscriber_list) {\n compInfo.Subscriber_list.map(function(sub) {\n-%>\n // Subscriber - <%- sub.name %>\n callback_options.alias = \"<%- sub.name %>_operation\";\n\n callback_options.priority = config[\"Subscribers\"][\"<%- sub.name %>\"][\"Priority\"].asInt();\n deadline = ros::Duration(config[\"Subscribers\"][\"<%- sub.name %>\"][\"Deadline\"].asFloat());\n callback_options.deadline.sec = deadline.sec;\n callback_options.deadline.nsec = deadline.nsec;\n\n callback_options.priority = <%- sub.Priority %>;\n callback_options.deadline.sec = <%- Math.floor(sub.Deadline) %>;\n callback_options.deadline.nsec = <%- Math.floor((sub.Deadline % 1) * 1000000000) %>;\n\n advertiseName = \"<%- sub.Message.AdvertisedName %>\";\n rosmod::SubscribeOptions <%- sub.name %>_options;\n <%- sub.name %>_options = rosmod::SubscribeOptions::create<<%- sub.Message.Package %>::<%- sub.Message.TypeName %>>\n (advertiseName.c_str(),\n 1000,\n boost::bind(&<%- compInfo.name %>::<%- sub.name %>_operation, this, _1),\n rosmod::VoidPtr(),\n &this->comp_queue,\n callback_options);\n this-><%- sub.name %> = nh.subscribe(<%- sub.name %>_options);\n<%\n });\n}\n-%>\n\n // Init Timer\n callback_options.alias = \"init_timer_operation\";\n callback_options.priority = 99;\n callback_options.deadline.sec = 1;\n callback_options.deadline.nsec = 0;\n timer_options = \n rosmod::TimerOptions\n (ros::Duration(-1),\n boost::bind(&<%- compInfo.name %>::init_timer_operation, this, _1),\n &this->comp_queue,\n callback_options,\n true,\n false); \n this->init_timer = nh.createTimer(timer_options);\n this->init_timer.stop();\n\n // Timers\n<%\nif (compInfo.Timer_list) {\n compInfo.Timer_list.map(function(tmr) {\n-%>\n // Component Timer - <%- tmr.name %>\n callback_options.alias = \"<%- tmr.name %>_operation\";\n \n callback_options.priority = config[\"Timers\"][\"<%- tmr.name %>\"][\"Priority\"].asInt();\n deadline = ros::Duration(config[\"Timers\"][\"<%- tmr.name %>\"][\"Deadline\"].asFloat());\n callback_options.deadline.sec = deadline.sec;\n callback_options.deadline.nsec = deadline.nsec;\n isOneShot = (config[\"Timers\"][\"<%- tmr.name %>\"][\"Period\"].asFloat() == 0) ? true : false;\n timer_options = \n rosmod::TimerOptions\n (ros::Duration(config[\"Timers\"][\"<%- tmr.name %>\"][\"Period\"].asFloat()),\n boost::bind(&<%- compInfo.name %>::<%- tmr.name %>_operation, this, _1),\n &this->comp_queue,\n callback_options,\n isOneShot,\n false);\n this-><%- tmr.name %> = nh.createTimer(timer_options);\n this-><%- tmr.name %>.stop();\n<%\n });\n }\n-%>\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n // HFSM Timer\n callback_options.alias = \"<%- hfsm.sanitizedName %>_HFSM_timer_operation\";\n \n // NEED TO FIGURE OUT HOW TO SPECIFY PRIORITY FOR THE HFSM TIMER IN THE MODEL\n //callback_options.priority = config[\"Timers\"][\"<%- hfsm.sanitizedName %>\"][\"Priority\"].asInt();\n ros::Duration hfsmPeriod = ros::Duration( 0 );\n deadline = hfsmPeriod;\n callback_options.deadline.sec = deadline.sec;\n callback_options.deadline.nsec = deadline.nsec;\n isOneShot = false;\n timer_options = \n rosmod::TimerOptions\n (hfsmPeriod,\n boost::bind(&<%- compInfo.name %>::<%- hfsm.sanitizedName %>_HFSM_timer_operation, this, _1),\n &this->comp_queue,\n callback_options,\n isOneShot,\n false);\n <%- hfsm.sanitizedName %>_HFSM_timer = nh.createTimer(timer_options);\n<%\n });\n}\n-%>\n // Start the timers\n this->init_timer.start();\n<%\nif (compInfo.Timer_list) {\n compInfo.Timer_list.map(function(tmr) {\n-%>\n this-><%- tmr.name %>.start();\n<%\n });\n }\n-%>\n}\n\nextern \"C\" {\n Component *maker(Json::Value &config) {\n return new <%- compInfo.name %>(config);\n }\n}\n\n", - "component.hpp.ejs": "/** @file <%- compInfo.name %>.hpp \n * @author <%- compInfo.Authors %>\n * @date <%= (new Date()).toISOString() %>\n * @brief This file declares the <%- compInfo.name %> class; <%- compInfo['Brief Description'] %>\n */\n\n#ifndef <%- compInfo.name.toUpperCase() %>_INCLUDE_GUARD\n#define <%- compInfo.name.toUpperCase() %>_INCLUDE_GUARD\n#include \"rosmod_actor/component.hpp\"\n\n\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\nnamespace StateMachine {\n class <%- hfsm.sanitizedName %>;\n};\n<%\n });\n}\n-%>\n\n/**\n * Component Message and Service Headers\n */\n<%\nif (compInfo.Types.length) {\n compInfo.Types.map(function(type) {\n-%>\n#include \"<%- type.Package %>/<%- type.TypeName %>.h\"\n<%\n });\n }\n-%>\n\n#include \"rosmod/rosmod_ros.h\"\n\n/**\n * Forward declarations\n */\n//::::<%- compInfo.path %>::::Forwards::::\n<%- compInfo.Forwards %>\n\n/**\n * @brief <%- compInfo.name %> class\n */\nclass <%- compInfo.name %> : public Component\n{\npublic:\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n // give HFSM access to this class.\n friend class StateMachine::<%- hfsm.sanitizedName %>;\n<%\n });\n}\n-%>\n \n /**\n * @brief <%- compInfo.name %> Constructor.\n * @param _config Component configuration parsed from deployment JSON\n */\n <%- compInfo.name %>(Json::Value& _config)\n : Component(_config) {}\n\n /**\n * @brief <%- compInfo.name %> Initializer\n * This operation is executed immediately after startup.\n * @param[in] event a oneshot timer event\n * @see startUp()\n */\n void init_timer_operation(const rosmod::TimerEvent& event);\n\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n /**\n * @brief <%- hfsm.name %> Timer function\n * This timer has a dynamic period and executes the HFSM's tick()\n * function. It automatically handles consuming the HFSM's event\n * queue and updating its period based on the period of the\n * currently active leaf state.\n *\n * @param[in] event a timer event\n * @see startUp()\n */\n void <%- hfsm.sanitizedName %>_HFSM_timer_operation(const rosmod::TimerEvent& event);\n<%\n });\n}\n-%> \n\n<%\nif (compInfo.Timer_list) {\n compInfo.Timer_list.map(function(tmr) {\n-%>\n /**\n * @brief <%- tmr.name %>_operation; <%- tmr['Brief Description'] %>\n *\n * This operation is executed every time the \n * <%- tmr.name %> operation request is serviced \n * @param[in] event a timer event\n *\n * <%- tmr['Detailed Description'] %>\n */\n void <%- tmr.name %>_operation(const rosmod::TimerEvent& event);\n<%\n });\n }\n-%>\n\n<%\nif (compInfo.Subscriber_list) {\n compInfo.Subscriber_list.map(function(sub) {\n-%>\n /**\n * @brief <%- sub.name %>_operation; <%- sub['Brief Description'] %>\n *\n * This operation is executed every time the \n * <%- sub.name %> operation request is serviced \n * @param[in] ros::MessageEvent - event - Event information containing the message and headers received.\n *\n * <%- sub['Detailed Description'] %>\n */\n void <%- sub.name %>_operation(const ros::MessageEvent<<%- sub.Message.Package %>::<%- sub.Message.TypeName %> const>& event);\n<%\n });\n }\n-%>\n\n<%\nif (compInfo.Server_list) {\n compInfo.Server_list.map(function(srv) {\n-%>\n /**\n * @brief <%- srv.name %>_operation; <%- srv['Brief Description'] %>\n *\n * This operation is executed every time the \n * <%- srv.name %> operation request is serviced \n * @param[in] req request received from the client\n * @param[out] res response sent back to the client\n *\n * <%- srv['Detailed Description'] %>\n */\n bool <%- srv.name %>_operation(const <%- srv.Service.Package %>::<%- srv.Service.TypeName %>::Request &req, <%- srv.Service.Package %>::<%- srv.Service.TypeName %>::Response &res);\n<%\n });\n }\n-%>\n\n /**\n * @brief Component startup function\n *\n * This function configures all the component ports and timers\n */ \n void startUp();\n\n /**\n * @brief <%- compInfo.name %> Destructor\n */ \n ~<%- compInfo.name %>();\n\nprivate:\n\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n rosmod::Timer <%- hfsm.sanitizedName %>_HFSM_timer; /*!< <%- hfsm.name %> HFSM Timer */\n<%\n });\n}\n-%> \n\n<%\nif (compInfo.Timer_list) {\n compInfo.Timer_list.map(function(tmr) {\n-%>\n rosmod::Timer <%- tmr.name %>; /*!< <%- tmr.name %> Component Timer */\n<%\n });\n }\n-%>\n<%\nif (compInfo.Server_list) {\n compInfo.Server_list.map(function(srv) {\n-%>\n rosmod::ServiceServer <%- srv.name %>; /*!< <%- srv.name %> Component Server */\n<%\n });\n }\n-%>\n<%\nif (compInfo.Client_list) {\n compInfo.Client_list.map(function(clt) {\n -%>\n rosmod::ServiceClient <%- clt.name %>; /*!< <%- clt.name %> Component Client */\n<%\n });\n }\n-%>\n<%\nif (compInfo.Publisher_list) {\n compInfo.Publisher_list.map(function(pub) {\n -%>\n rosmod::Publisher <%- pub.name %>; /*!< <%- pub.name %> Component Publisher */\n<%\n });\n }\n-%>\n<%\nif (compInfo.Subscriber_list) {\n compInfo.Subscriber_list.map(function(sub) {\n -%>\n rosmod::Subscriber <%- sub.name %>; /*!< <%- sub.name %> Component Subscriber */\n<%\n });\n }\n-%>\n\n /** \n * User-defined private variables\n */\n //::::<%- compInfo.path %>::::Members::::\n <%- compInfo.Members %>\n};\n\n#endif // <%- compInfo.name.toUpperCase() %>_INCLUDE_GUARD\n\n", + "component.hpp.ejs": "/** @file <%- compInfo.name %>.hpp \n * @author <%- compInfo.Authors %>\n * @date <%= (new Date()).toISOString() %>\n * @brief This file declares the <%- compInfo.name %> class; <%- compInfo['Brief Description'] %>\n */\n\n#ifndef <%- compInfo.name.toUpperCase() %>_INCLUDE_GUARD\n#define <%- compInfo.name.toUpperCase() %>_INCLUDE_GUARD\n#include \"rosmod_actor/component.hpp\"\n\n#include \n#include \n\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\nnamespace StateMachine {\n class <%- hfsm.sanitizedName %>;\n};\n<%\n });\n}\n-%>\n\n/**\n * Component Message and Service Headers\n */\n<%\nif (compInfo.Types.length) {\n compInfo.Types.map(function(type) {\n-%>\n#include \"<%- type.Package %>/<%- type.TypeName %>.h\"\n<%\n });\n }\n-%>\n\n#include \"rosmod/rosmod_ros.h\"\n\n/**\n * Forward declarations\n */\n//::::<%- compInfo.path %>::::Forwards::::\n<%- compInfo.Forwards %>\n\n/**\n * @brief <%- compInfo.name %> class\n */\nclass <%- compInfo.name %> : public Component\n{\npublic:\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n // give HFSM access to this class.\n friend class StateMachine::<%- hfsm.sanitizedName %>;\n<%\n });\n}\n-%>\n \n /**\n * @brief <%- compInfo.name %> Constructor.\n * @param _config Component configuration parsed from deployment JSON\n */\n <%- compInfo.name %>(Json::Value& _config)\n : Component(_config) {}\n\n /**\n * @brief <%- compInfo.name %> Initializer\n * This operation is executed immediately after startup.\n * @param[in] event a oneshot timer event\n * @see startUp()\n */\n void init_timer_operation(const rosmod::TimerEvent& event);\n\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n /**\n * @brief <%- hfsm.name %> Timer function\n * This timer has a dynamic period and executes the HFSM's tick()\n * function. It automatically handles consuming the HFSM's event\n * queue and updating its period based on the period of the\n * currently active leaf state.\n *\n * @param[in] event a timer event\n * @see startUp()\n */\n void <%- hfsm.sanitizedName %>_HFSM_timer_operation(const rosmod::TimerEvent& event);\n<%\n });\n}\n-%> \n\n<%\nif (compInfo.Timer_list) {\n compInfo.Timer_list.map(function(tmr) {\n-%>\n /**\n * @brief <%- tmr.name %>_operation; <%- tmr['Brief Description'] %>\n *\n * This operation is executed every time the \n * <%- tmr.name %> operation request is serviced \n * @param[in] event a timer event\n *\n * <%- tmr['Detailed Description'] %>\n */\n void <%- tmr.name %>_operation(const rosmod::TimerEvent& event);\n<%\n });\n }\n-%>\n\n<%\nif (compInfo.Subscriber_list) {\n compInfo.Subscriber_list.map(function(sub) {\n-%>\n /**\n * @brief <%- sub.name %>_operation; <%- sub['Brief Description'] %>\n *\n * This operation is executed every time the \n * <%- sub.name %> operation request is serviced \n * @param[in] ros::MessageEvent - event - Event information containing the message and headers received.\n *\n * <%- sub['Detailed Description'] %>\n */\n void <%- sub.name %>_operation(const ros::MessageEvent<<%- sub.Message.Package %>::<%- sub.Message.TypeName %> const>& event);\n<%\n });\n }\n-%>\n\n<%\nif (compInfo.Server_list) {\n compInfo.Server_list.map(function(srv) {\n-%>\n /**\n * @brief <%- srv.name %>_operation; <%- srv['Brief Description'] %>\n *\n * This operation is executed every time the \n * <%- srv.name %> operation request is serviced \n * @param[in] req request received from the client\n * @param[out] res response sent back to the client\n *\n * <%- srv['Detailed Description'] %>\n */\n bool <%- srv.name %>_operation(const <%- srv.Service.Package %>::<%- srv.Service.TypeName %>::Request &req, <%- srv.Service.Package %>::<%- srv.Service.TypeName %>::Response &res);\n<%\n });\n }\n-%>\n\n /**\n * @brief Component startup function\n *\n * This function configures all the component ports and timers\n */ \n void startUp();\n\n /**\n * @brief <%- compInfo.name %> Destructor\n */ \n ~<%- compInfo.name %>();\n\nprivate:\n\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n rosmod::Timer <%- hfsm.sanitizedName %>_HFSM_timer; /*!< <%- hfsm.name %> HFSM Timer */\n<%\n });\n}\n-%> \n\n<%\nif (compInfo.Timer_list) {\n compInfo.Timer_list.map(function(tmr) {\n-%>\n rosmod::Timer <%- tmr.name %>; /*!< <%- tmr.name %> Component Timer */\n<%\n });\n }\n-%>\n<%\nif (compInfo.Server_list) {\n compInfo.Server_list.map(function(srv) {\n-%>\n rosmod::ServiceServer <%- srv.name %>; /*!< <%- srv.name %> Component Server */\n<%\n });\n }\n-%>\n<%\nif (compInfo.Client_list) {\n compInfo.Client_list.map(function(clt) {\n -%>\n rosmod::ServiceClient <%- clt.name %>; /*!< <%- clt.name %> Component Client */\n<%\n });\n }\n-%>\n<%\nif (compInfo.Publisher_list) {\n compInfo.Publisher_list.map(function(pub) {\n -%>\n rosmod::Publisher <%- pub.name %>; /*!< <%- pub.name %> Component Publisher */\n<%\n });\n }\n-%>\n<%\nif (compInfo.Subscriber_list) {\n compInfo.Subscriber_list.map(function(sub) {\n -%>\n rosmod::Subscriber <%- sub.name %>; /*!< <%- sub.name %> Component Subscriber */\n<%\n });\n }\n-%>\n\n /** \n * User-defined private variables\n */\n //::::<%- compInfo.path %>::::Members::::\n <%- compInfo.Members %>\n};\n\n#endif // <%- compInfo.name.toUpperCase() %>_INCLUDE_GUARD\n\n", "doxygen_config.ejs": "# Doxyfile 1.8.6\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project.\n#\n# All text after a double hash (##) is considered a comment and is placed in\n# front of the TAG it is preceding.\n#\n# All text after a single hash (#) is considered a comment and will be ignored.\n# The format is:\n# TAG = value [value, ...]\n# For lists, items can also be appended using:\n# TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\\\" \\\").\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file\n# that follow. The default is UTF-8 which is also the encoding used for all text\n# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv\n# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv\n# for the list of possible encodings.\n# The default value is: UTF-8.\n\nDOXYFILE_ENCODING = UTF-8\n\n# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by\n# double-quotes, unless you are using Doxywizard) that should identify the\n# project for which the documentation is generated. This name is used in the\n# title of most generated pages and in a few other places.\n# The default value is: My Project.\n\nPROJECT_NAME = \"<%= projectName %>\"\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number. This\n# could be handy for archiving the generated documentation or if some version\n# control system is used.\n\nPROJECT_NUMBER =\n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer a\n# quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF =\n\n# With the PROJECT_LOGO tag one can specify an logo or icon that is included in\n# the documentation. The maximum height of the logo should not exceed 55 pixels\n# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo\n# to the output directory.\n\nPROJECT_LOGO =\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path\n# into which the generated documentation will be written. If a relative path is\n# entered, it will be relative to the location where doxygen was started. If\n# left blank the current directory will be used.\n\nOUTPUT_DIRECTORY = ./doc/\n\n# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-\n# directories (in 2 levels) under the output directory of each output format and\n# will distribute the generated files over these directories. Enabling this\n# option can be useful when feeding doxygen a huge amount of source files, where\n# putting all generated files in the same directory would otherwise causes\n# performance problems for the file system.\n# The default value is: NO.\n\nCREATE_SUBDIRS = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,\n# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),\n# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,\n# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),\n# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,\n# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,\n# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,\n# Ukrainian and Vietnamese.\n# The default value is: English.\n\nOUTPUT_LANGUAGE = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member\n# descriptions after the members that are listed in the file and class\n# documentation (similar to Javadoc). Set to NO to disable this.\n# The default value is: YES.\n\nBRIEF_MEMBER_DESC = YES\n\n# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief\n# description of a member or function before the detailed description\n#\n# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n# The default value is: YES.\n\nREPEAT_BRIEF = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator that is\n# used to form the text in various listings. Each string in this list, if found\n# as the leading text of the brief description, will be stripped from the text\n# and the result, after processing the whole list, is used as the annotated\n# text. Otherwise, the brief description is used as-is. If left blank, the\n# following values are used ($name is automatically replaced with the name of\n# the entity):The $name class, The $name widget, The $name file, is, provides,\n# specifies, contains, represents, a, an and the.\n\nABBREVIATE_BRIEF =\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# doxygen will generate a detailed section even if there is only a brief\n# description.\n# The default value is: NO.\n\nALWAYS_DETAILED_SEC = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n# The default value is: NO.\n\nINLINE_INHERITED_MEMB = YES\n\n# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path\n# before files name in the file list and in the header files. If set to NO the\n# shortest path that makes the file name unique will be used\n# The default value is: YES.\n\nFULL_PATH_NAMES = YES\n\n# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.\n# Stripping is only done if one of the specified strings matches the left-hand\n# part of the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the path to\n# strip.\n#\n# Note that you can specify absolute paths here, but also relative paths, which\n# will be relative from the directory where doxygen is started.\n# This tag requires that the tag FULL_PATH_NAMES is set to YES.\n\nSTRIP_FROM_PATH =\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the\n# path mentioned in the documentation of a class, which tells the reader which\n# header file to include in order to use a class. If left blank only the name of\n# the header file containing the class definition is used. Otherwise one should\n# specify the list of include paths that are normally passed to the compiler\n# using the -I flag.\n\nSTRIP_FROM_INC_PATH =\n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but\n# less readable) file names. This can be useful is your file systems doesn't\n# support long names like on DOS, Mac, or CD-ROM.\n# The default value is: NO.\n\nSHORT_NAMES = NO\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the\n# first line (until the first dot) of a Javadoc-style comment as the brief\n# description. If set to NO, the Javadoc-style will behave just like regular Qt-\n# style comments (thus requiring an explicit @brief command for a brief\n# description.)\n# The default value is: NO.\n\nJAVADOC_AUTOBRIEF = YES\n\n# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first\n# line (until the first dot) of a Qt-style comment as the brief description. If\n# set to NO, the Qt-style will behave just like regular Qt-style comments (thus\n# requiring an explicit \\brief command for a brief description.)\n# The default value is: NO.\n\nQT_AUTOBRIEF = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a\n# multi-line C++ special comment block (i.e. a block of //! or /// comments) as\n# a brief description. This used to be the default behavior. The new default is\n# to treat a multi-line C++ comment block as a detailed description. Set this\n# tag to YES if you prefer the old behavior instead.\n#\n# Note that setting this tag to YES also means that rational rose comments are\n# not recognized any more.\n# The default value is: NO.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the\n# documentation from any documented member that it re-implements.\n# The default value is: YES.\n\nINHERIT_DOCS = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a\n# new page for each member. If set to NO, the documentation of a member will be\n# part of the file/class/namespace that contains it.\n# The default value is: NO.\n\nSEPARATE_MEMBER_PAGES = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen\n# uses this value to replace tabs by spaces in code fragments.\n# Minimum value: 1, maximum value: 16, default value: 4.\n\nTAB_SIZE = 4\n\n# This tag can be used to specify a number of aliases that act as commands in\n# the documentation. An alias has the form:\n# name=value\n# For example adding\n# \"sideeffect=@par Side Effects:\\n\"\n# will allow you to put the command \\sideeffect (or @sideeffect) in the\n# documentation, which will result in a user-defined paragraph with heading\n# \"Side Effects:\". You can put \\n's in the value part of an alias to insert\n# newlines.\n\nALIASES =\n\n# This tag can be used to specify a number of word-keyword mappings (TCL only).\n# A mapping has the form \"name=value\". For example adding \"class=itcl::class\"\n# will allow you to use the command class in the itcl::class meaning.\n\nTCL_SUBST =\n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources\n# only. Doxygen will then generate output that is more tailored for C. For\n# instance, some of the names that are used will be different. The list of all\n# members will be omitted, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_FOR_C = NO\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or\n# Python sources only. Doxygen will then generate output that is more tailored\n# for that language. For instance, namespaces will be presented as packages,\n# qualified scopes will look different, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_JAVA = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources. Doxygen will then generate output that is tailored for Fortran.\n# The default value is: NO.\n\nOPTIMIZE_FOR_FORTRAN = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for VHDL.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_VHDL = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given\n# extension. Doxygen has a built-in mapping, but you can override or extend it\n# using this tag. The format is ext=language, where ext is a file extension, and\n# language is one of the parsers supported by doxygen: IDL, Java, Javascript,\n# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make\n# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C\n# (default is Fortran), use: inc=Fortran f=C.\n#\n# Note For files without extension you can use no_extension as a placeholder.\n#\n# Note that for custom extensions you also need to set FILE_PATTERNS otherwise\n# the files are not read by doxygen.\n\nEXTENSION_MAPPING =\n\n# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments\n# according to the Markdown format, which allows for more readable\n# documentation. See http://daringfireball.net/projects/markdown/ for details.\n# The output of markdown processing is further processed by doxygen, so you can\n# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in\n# case of backward compatibilities issues.\n# The default value is: YES.\n\nMARKDOWN_SUPPORT = YES\n\n# When enabled doxygen tries to link words that correspond to documented\n# classes, or namespaces to their corresponding documentation. Such a link can\n# be prevented in individual cases by by putting a % sign in front of the word\n# or globally by setting AUTOLINK_SUPPORT to NO.\n# The default value is: YES.\n\nAUTOLINK_SUPPORT = YES\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n# to include (a tag file for) the STL sources as input, then you should set this\n# tag to YES in order to let doxygen match functions declarations and\n# definitions whose arguments contain STL classes (e.g. func(std::string);\n# versus func(std::string) {}). This also make the inheritance and collaboration\n# diagrams that involve STL classes more complete and accurate.\n# The default value is: NO.\n\nBUILTIN_STL_SUPPORT = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n# The default value is: NO.\n\nCPP_CLI_SUPPORT = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:\n# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen\n# will parse them like normal C++ but will assume all classes use public instead\n# of private inheritance when no explicit protection keyword is present.\n# The default value is: NO.\n\nSIP_SUPPORT = NO\n\n# For Microsoft's IDL there are propget and propput attributes to indicate\n# getter and setter methods for a property. Setting this option to YES will make\n# doxygen to replace the get and set methods by a property in the documentation.\n# This will only work if the methods are indeed getting or setting a simple\n# type. If this is not the case, or you want to show the methods anyway, you\n# should set this option to NO.\n# The default value is: YES.\n\nIDL_PROPERTY_SUPPORT = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES, then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n# The default value is: NO.\n\nDISTRIBUTE_GROUP_DOC = NO\n\n# Set the SUBGROUPING tag to YES to allow class member groups of the same type\n# (for instance a group of public functions) to be put as a subgroup of that\n# type (e.g. under the Public Functions section). Set it to NO to prevent\n# subgrouping. Alternatively, this can be done per class using the\n# \\nosubgrouping command.\n# The default value is: YES.\n\nSUBGROUPING = YES\n\n# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions\n# are shown inside the group in which they are included (e.g. using \\ingroup)\n# instead of on a separate page (for HTML and Man pages) or section (for LaTeX\n# and RTF).\n#\n# Note that this feature does not work in combination with\n# SEPARATE_MEMBER_PAGES.\n# The default value is: NO.\n\nINLINE_GROUPED_CLASSES = NO\n\n# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions\n# with only public data fields or simple typedef fields will be shown inline in\n# the documentation of the scope in which they are defined (i.e. file,\n# namespace, or group documentation), provided this scope is documented. If set\n# to NO, structs, classes, and unions are shown on a separate page (for HTML and\n# Man pages) or section (for LaTeX and RTF).\n# The default value is: NO.\n\nINLINE_SIMPLE_STRUCTS = NO\n\n# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or\n# enum is documented as struct, union, or enum with the name of the typedef. So\n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n# with name TypeT. When disabled the typedef will appear as a member of a file,\n# namespace, or class. And the struct will be named TypeS. This can typically be\n# useful for C code in case the coding convention dictates that all compound\n# types are typedef'ed and only the typedef is referenced, never the tag name.\n# The default value is: NO.\n\nTYPEDEF_HIDES_STRUCT = NO\n\n# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This\n# cache is used to resolve symbols given their name and scope. Since this can be\n# an expensive process and often the same symbol appears multiple times in the\n# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small\n# doxygen will become slower. If the cache is too large, memory is wasted. The\n# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range\n# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536\n# symbols. At the end of a run doxygen will report the cache usage and suggest\n# the optimal cache size from a speed point of view.\n# Minimum value: 0, maximum value: 9, default value: 0.\n\nLOOKUP_CACHE_SIZE = 0\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n# documentation are documented, even if no documentation was available. Private\n# class members and static file members will be hidden unless the\n# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.\n# Note: This will also disable the warnings about undocumented members that are\n# normally produced when WARNINGS is set to YES.\n# The default value is: NO.\n\nEXTRACT_ALL = NO\n\n# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will\n# be included in the documentation.\n# The default value is: NO.\n\nEXTRACT_PRIVATE = NO\n\n# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal\n# scope will be included in the documentation.\n# The default value is: NO.\n\nEXTRACT_PACKAGE = NO\n\n# If the EXTRACT_STATIC tag is set to YES all static members of a file will be\n# included in the documentation.\n# The default value is: NO.\n\nEXTRACT_STATIC = NO\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined\n# locally in source files will be included in the documentation. If set to NO\n# only classes defined in header files are included. Does not have any effect\n# for Java sources.\n# The default value is: YES.\n\nEXTRACT_LOCAL_CLASSES = YES\n\n# This flag is only useful for Objective-C code. When set to YES local methods,\n# which are defined in the implementation section but not in the interface are\n# included in the documentation. If set to NO only methods in the interface are\n# included.\n# The default value is: NO.\n\nEXTRACT_LOCAL_METHODS = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be\n# extracted and appear in the documentation as a namespace called\n# 'anonymous_namespace{file}', where file will be replaced with the base name of\n# the file that contains the anonymous namespace. By default anonymous namespace\n# are hidden.\n# The default value is: NO.\n\nEXTRACT_ANON_NSPACES = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all\n# undocumented members inside documented classes or files. If set to NO these\n# members will be included in the various overviews, but no documentation\n# section is generated. This option has no effect if EXTRACT_ALL is enabled.\n# The default value is: NO.\n\nHIDE_UNDOC_MEMBERS = NO\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy. If set\n# to NO these classes will be included in the various overviews. This option has\n# no effect if EXTRACT_ALL is enabled.\n# The default value is: NO.\n\nHIDE_UNDOC_CLASSES = NO\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend\n# (class|struct|union) declarations. If set to NO these declarations will be\n# included in the documentation.\n# The default value is: NO.\n\nHIDE_FRIEND_COMPOUNDS = NO\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any\n# documentation blocks found inside the body of a function. If set to NO these\n# blocks will be appended to the function's detailed documentation block.\n# The default value is: NO.\n\nHIDE_IN_BODY_DOCS = NO\n\n# The INTERNAL_DOCS tag determines if documentation that is typed after a\n# \\internal command is included. If the tag is set to NO then the documentation\n# will be excluded. Set it to YES to include the internal documentation.\n# The default value is: NO.\n\nINTERNAL_DOCS = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file\n# names in lower-case letters. If set to YES upper-case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# and Mac users are advised to set this option to NO.\n# The default value is: system dependent.\n\nCASE_SENSE_NAMES = YES\n\n# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with\n# their full class and namespace scopes in the documentation. If set to YES the\n# scope will be hidden.\n# The default value is: NO.\n\nHIDE_SCOPE_NAMES = NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of\n# the files that are included by a file in the documentation of that file.\n# The default value is: YES.\n\nSHOW_INCLUDE_FILES = YES\n\n# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each\n# grouped member an include statement to the documentation, telling the reader\n# which file to include in order to use the member.\n# The default value is: NO.\n\nSHOW_GROUPED_MEMB_INC = NO\n\n# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include\n# files with double quotes in the documentation rather than with sharp brackets.\n# The default value is: NO.\n\nFORCE_LOCAL_INCLUDES = NO\n\n# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the\n# documentation for inline members.\n# The default value is: YES.\n\nINLINE_INFO = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the\n# (detailed) documentation of file and class members alphabetically by member\n# name. If set to NO the members will appear in declaration order.\n# The default value is: YES.\n\nSORT_MEMBER_DOCS = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief\n# descriptions of file, namespace and class members alphabetically by member\n# name. If set to NO the members will appear in declaration order. Note that\n# this will also influence the order of the classes in the class list.\n# The default value is: NO.\n\nSORT_BRIEF_DOCS = NO\n\n# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the\n# (brief and detailed) documentation of class members so that constructors and\n# destructors are listed first. If set to NO the constructors will appear in the\n# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.\n# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief\n# member documentation.\n# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting\n# detailed member documentation.\n# The default value is: NO.\n\nSORT_MEMBERS_CTORS_1ST = NO\n\n# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy\n# of group names into alphabetical order. If set to NO the group names will\n# appear in their defined order.\n# The default value is: NO.\n\nSORT_GROUP_NAMES = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by\n# fully-qualified names, including namespaces. If set to NO, the class list will\n# be sorted only by class name, not including the namespace part.\n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the alphabetical\n# list.\n# The default value is: NO.\n\nSORT_BY_SCOPE_NAME = NO\n\n# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper\n# type resolution of all parameters of a function it will reject a match between\n# the prototype and the implementation of a member function even if there is\n# only one candidate or it is obvious which candidate to choose by doing a\n# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still\n# accept a match between prototype and implementation in such cases.\n# The default value is: NO.\n\nSTRICT_PROTO_MATCHING = NO\n\n# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the\n# todo list. This list is created by putting \\todo commands in the\n# documentation.\n# The default value is: YES.\n\nGENERATE_TODOLIST = YES\n\n# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the\n# test list. This list is created by putting \\test commands in the\n# documentation.\n# The default value is: YES.\n\nGENERATE_TESTLIST = YES\n\n# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug\n# list. This list is created by putting \\bug commands in the documentation.\n# The default value is: YES.\n\nGENERATE_BUGLIST = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)\n# the deprecated list. This list is created by putting \\deprecated commands in\n# the documentation.\n# The default value is: YES.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional documentation\n# sections, marked by \\if ... \\endif and \\cond \n# ... \\endcond blocks.\n\nENABLED_SECTIONS =\n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the\n# initial value of a variable or macro / define can have for it to appear in the\n# documentation. If the initializer consists of more lines than specified here\n# it will be hidden. Use a value of 0 to hide initializers completely. The\n# appearance of the value of individual variables and macros / defines can be\n# controlled using \\showinitializer or \\hideinitializer command in the\n# documentation regardless of this setting.\n# Minimum value: 0, maximum value: 10000, default value: 30.\n\nMAX_INITIALIZER_LINES = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at\n# the bottom of the documentation of classes and structs. If set to YES the list\n# will mention the files that were used to generate the documentation.\n# The default value is: YES.\n\nSHOW_USED_FILES = YES\n\n# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This\n# will remove the Files entry from the Quick Index and from the Folder Tree View\n# (if specified).\n# The default value is: YES.\n\nSHOW_FILES = YES\n\n# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces\n# page. This will remove the Namespaces entry from the Quick Index and from the\n# Folder Tree View (if specified).\n# The default value is: YES.\n\nSHOW_NAMESPACES = YES\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that\n# doxygen should invoke to get the current version for each file (typically from\n# the version control system). Doxygen will invoke the program by executing (via\n# popen()) the command command input-file, where command is the value of the\n# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided\n# by doxygen. Whatever the program writes to standard output is used as the file\n# version. For an example see the documentation.\n\nFILE_VERSION_FILTER =\n\n# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n# by doxygen. The layout file controls the global structure of the generated\n# output files in an output format independent way. To create the layout file\n# that represents doxygen's defaults, run doxygen with the -l option. You can\n# optionally specify a file name after the option, if omitted DoxygenLayout.xml\n# will be used as the name of the layout file.\n#\n# Note that if you run doxygen from a directory containing a file called\n# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE\n# tag is left empty.\n\nLAYOUT_FILE =\n\n# The CITE_BIB_FILES tag can be used to specify one or more bib files containing\n# the reference definitions. This must be a list of .bib files. The .bib\n# extension is automatically appended if omitted. This requires the bibtex tool\n# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.\n# For LaTeX the style of the bibliography can be controlled using\n# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the\n# search path. Do not use file names with spaces, bibtex cannot handle them. See\n# also \\cite for info how to create references.\n\nCITE_BIB_FILES =\n\n#---------------------------------------------------------------------------\n# Configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated to\n# standard output by doxygen. If QUIET is set to YES this implies that the\n# messages are off.\n# The default value is: NO.\n\nQUIET = NO\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES\n# this implies that the warnings are on.\n#\n# Tip: Turn warnings on while writing the documentation.\n# The default value is: YES.\n\nWARNINGS = YES\n\n# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate\n# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag\n# will automatically be disabled.\n# The default value is: YES.\n\nWARN_IF_UNDOCUMENTED = YES\n\n# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for\n# potential errors in the documentation, such as not documenting some parameters\n# in a documented function, or documenting parameters that don't exist or using\n# markup commands wrongly.\n# The default value is: YES.\n\nWARN_IF_DOC_ERROR = YES\n\n# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that\n# are documented, but have no documentation for their parameters or return\n# value. If set to NO doxygen will only warn about wrong or incomplete parameter\n# documentation, but not about the absence of documentation.\n# The default value is: NO.\n\nWARN_NO_PARAMDOC = NO\n\n# The WARN_FORMAT tag determines the format of the warning messages that doxygen\n# can produce. The string should contain the $file, $line, and $text tags, which\n# will be replaced by the file and line number from which the warning originated\n# and the warning text. Optionally the format may contain $version, which will\n# be replaced by the version of the file (if it could be obtained via\n# FILE_VERSION_FILTER)\n# The default value is: $file:$line: $text.\n\nWARN_FORMAT = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning and error\n# messages should be written. If left blank the output is written to standard\n# error (stderr).\n\nWARN_LOGFILE =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag is used to specify the files and/or directories that contain\n# documented source files. You may enter file names like myfile.cpp or\n# directories like /usr/src/myproject. Separate the files or directories with\n# spaces.\n# Note: If this tag is empty the current directory is searched.\n\nINPUT = ./src \n\n# This tag can be used to specify the character encoding of the source files\n# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses\n# libiconv (or the iconv built into libc) for the transcoding. See the libiconv\n# documentation (see: http://www.gnu.org/software/libiconv) for the list of\n# possible encodings.\n# The default value is: UTF-8.\n\nINPUT_ENCODING = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and\n# *.h) to filter out the source-files in the directories. If left blank the\n# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,\n# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,\n# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,\n# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,\n# *.qsf, *.as and *.js.\n\nFILE_PATTERNS = *.cpp *.hpp *.h *.msg *.srv *.js *.c++ *.c *.java *.cs\n\n# The RECURSIVE tag can be used to specify whether or not subdirectories should\n# be searched for input files as well.\n# The default value is: NO.\n\nRECURSIVE = YES\n\n# The EXCLUDE tag can be used to specify files and/or directories that should be\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n#\n# Note that relative paths are relative to the directory from which doxygen is\n# run.\n\nEXCLUDE =\n\n# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\n# directories that are symbolic links (a Unix file system feature) are excluded\n# from the input.\n# The default value is: NO.\n\nEXCLUDE_SYMLINKS = NO\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories.\n#\n# Note that the wildcards are matched against the file with absolute path, so to\n# exclude all test directories for example use the pattern */test/*\n\nEXCLUDE_PATTERNS =\n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n# (namespaces, classes, functions, etc.) that should be excluded from the\n# output. The symbol name can be a fully qualified name, a word, or if the\n# wildcard * is used, a substring. Examples: ANamespace, AClass,\n# AClass::ANamespace, ANamespace::*Test\n#\n# Note that the wildcards are matched against the file with absolute path, so to\n# exclude all test directories use the pattern */test/*\n\nEXCLUDE_SYMBOLS =\n\n# The EXAMPLE_PATH tag can be used to specify one or more files or directories\n# that contain example code fragments that are included (see the \\include\n# command).\n\nEXAMPLE_PATH =\n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and\n# *.h) to filter out the source-files in the directories. If left blank all\n# files are included.\n\nEXAMPLE_PATTERNS =\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n# searched for input files to be used with the \\include or \\dontinclude commands\n# irrespective of the value of the RECURSIVE tag.\n# The default value is: NO.\n\nEXAMPLE_RECURSIVE = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or directories\n# that contain images that are to be included in the documentation (see the\n# \\image command).\n\nIMAGE_PATH =\n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command:\n#\n# \n#\n# where is the value of the INPUT_FILTER tag, and is the\n# name of an input file. Doxygen will then use the output that the filter\n# program writes to standard output. If FILTER_PATTERNS is specified, this tag\n# will be ignored.\n#\n# Note that the filter must not add or remove lines; it is applied before the\n# code is scanned, but not when the output code is generated. If lines are added\n# or removed, the anchors will not be placed correctly.\n\nINPUT_FILTER =\n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n# basis. Doxygen will compare the file name with each pattern and apply the\n# filter if there is a match. The filters are a list of the form: pattern=filter\n# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how\n# filters are used. If the FILTER_PATTERNS tag is empty or if none of the\n# patterns match the file name, INPUT_FILTER is applied.\n\nFILTER_PATTERNS =\n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER ) will also be used to filter the input files that are used for\n# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).\n# The default value is: NO.\n\nFILTER_SOURCE_FILES = NO\n\n# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and\n# it is also possible to disable source filtering for a specific pattern using\n# *.ext= (so without naming a filter).\n# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.\n\nFILTER_SOURCE_PATTERNS =\n\n# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that\n# is part of the input, its contents will be placed on the main page\n# (index.html). This can be useful if you have a project on for instance GitHub\n# and want to reuse the introduction page also for the doxygen output.\n\nUSE_MDFILE_AS_MAINPAGE =\n\n#---------------------------------------------------------------------------\n# Configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will be\n# generated. Documented entities will be cross-referenced with these sources.\n#\n# Note: To get rid of all source code in the generated output, make sure that\n# also VERBATIM_HEADERS is set to NO.\n# The default value is: NO.\n\nSOURCE_BROWSER = NO\n\n# Setting the INLINE_SOURCES tag to YES will include the body of functions,\n# classes and enums directly into the documentation.\n# The default value is: NO.\n\nINLINE_SOURCES = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any\n# special comment blocks from generated source code fragments. Normal C, C++ and\n# Fortran comments will always remain visible.\n# The default value is: YES.\n\nSTRIP_CODE_COMMENTS = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES then for each documented\n# function all documented functions referencing it will be listed.\n# The default value is: NO.\n\nREFERENCED_BY_RELATION = NO\n\n# If the REFERENCES_RELATION tag is set to YES then for each documented function\n# all documented entities called/used by that function will be listed.\n# The default value is: NO.\n\nREFERENCES_RELATION = NO\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set\n# to YES, then the hyperlinks from functions in REFERENCES_RELATION and\n# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will\n# link to the documentation.\n# The default value is: YES.\n\nREFERENCES_LINK_SOURCE = YES\n\n# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the\n# source code will show a tooltip with additional information such as prototype,\n# brief description and links to the definition and documentation. Since this\n# will make the HTML file larger and loading of large files a bit slower, you\n# can opt to disable this feature.\n# The default value is: YES.\n# This tag requires that the tag SOURCE_BROWSER is set to YES.\n\nSOURCE_TOOLTIPS = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code will\n# point to the HTML generated by the htags(1) tool instead of doxygen built-in\n# source browser. The htags tool is part of GNU's global source tagging system\n# (see http://www.gnu.org/software/global/global.html). You will need version\n# 4.8.6 or higher.\n#\n# To use it do the following:\n# - Install the latest version of global\n# - Enable SOURCE_BROWSER and USE_HTAGS in the config file\n# - Make sure the INPUT points to the root of the source tree\n# - Run doxygen as normal\n#\n# Doxygen will invoke htags (and that will in turn invoke gtags), so these\n# tools must be available from the command line (i.e. in the search path).\n#\n# The result: instead of the source browser generated by doxygen, the links to\n# source code will now point to the output of htags.\n# The default value is: NO.\n# This tag requires that the tag SOURCE_BROWSER is set to YES.\n\nUSE_HTAGS = NO\n\n# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a\n# verbatim copy of the header file for each class for which an include is\n# specified. Set to NO to disable this.\n# See also: Section \\class.\n# The default value is: YES.\n\nVERBATIM_HEADERS = YES\n\n#---------------------------------------------------------------------------\n# Configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all\n# compounds will be generated. Enable this if the project contains a lot of\n# classes, structs, unions or interfaces.\n# The default value is: YES.\n\nALPHABETICAL_INDEX = YES\n\n# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in\n# which the alphabetical index list will be split.\n# Minimum value: 1, maximum value: 20, default value: 5.\n# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.\n\nCOLS_IN_ALPHA_INDEX = 5\n\n# In case all classes in a project start with a common prefix, all classes will\n# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag\n# can be used to specify a prefix (or a list of prefixes) that should be ignored\n# while generating the index headers.\n# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.\n\nIGNORE_PREFIX =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output\n# The default value is: YES.\n\nGENERATE_HTML = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: html.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_OUTPUT = html\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each\n# generated HTML page (for example: .htm, .php, .asp).\n# The default value is: .html.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_FILE_EXTENSION = .html\n\n# The HTML_HEADER tag can be used to specify a user-defined HTML header file for\n# each generated HTML page. If the tag is left blank doxygen will generate a\n# standard header.\n#\n# To get valid HTML the header file that includes any scripts and style sheets\n# that doxygen needs, which is dependent on the configuration options used (e.g.\n# the setting GENERATE_TREEVIEW). It is highly recommended to start with a\n# default header using\n# doxygen -w html new_header.html new_footer.html new_stylesheet.css\n# YourConfigFile\n# and then modify the file new_header.html. See also section \"Doxygen usage\"\n# for information on how to generate the default header that doxygen normally\n# uses.\n# Note: The header is subject to change so you typically have to regenerate the\n# default header when upgrading to a newer version of doxygen. For a description\n# of the possible markers and block names see the documentation.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_HEADER =\n\n# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each\n# generated HTML page. If the tag is left blank doxygen will generate a standard\n# footer. See HTML_HEADER for more information on how to generate a default\n# footer and what special commands can be used inside the footer. See also\n# section \"Doxygen usage\" for information on how to generate the default footer\n# that doxygen normally uses.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_FOOTER =\n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style\n# sheet that is used by each HTML page. It can be used to fine-tune the look of\n# the HTML output. If left blank doxygen will generate a default style sheet.\n# See also section \"Doxygen usage\" for information on how to generate the style\n# sheet that doxygen normally uses.\n# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as\n# it is more robust and this tag (HTML_STYLESHEET) will in the future become\n# obsolete.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_STYLESHEET =\n\n# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-\n# defined cascading style sheet that is included after the standard style sheets\n# created by doxygen. Using this option one can overrule certain style aspects.\n# This is preferred over using HTML_STYLESHEET since it does not replace the\n# standard style sheet and is therefor more robust against future updates.\n# Doxygen will copy the style sheet file to the output directory. For an example\n# see the documentation.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_EXTRA_STYLESHEET =\n\n# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the HTML output directory. Note\n# that these files will be copied to the base HTML output directory. Use the\n# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n# files. In the HTML_STYLESHEET file, use the file name only. Also note that the\n# files will be copied as-is; there are no commands or markers available.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_EXTRA_FILES =\n\n# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen\n# will adjust the colors in the stylesheet and background images according to\n# this color. Hue is specified as an angle on a colorwheel, see\n# http://en.wikipedia.org/wiki/Hue for more information. For instance the value\n# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300\n# purple, and 360 is red again.\n# Minimum value: 0, maximum value: 359, default value: 220.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_HUE = 220\n\n# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors\n# in the HTML output. For a value of 0 the output will use grayscales only. A\n# value of 255 will produce the most vivid colors.\n# Minimum value: 0, maximum value: 255, default value: 100.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_SAT = 100\n\n# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the\n# luminance component of the colors in the HTML output. Values below 100\n# gradually make the output lighter, whereas values above 100 make the output\n# darker. The value divided by 100 is the actual gamma applied, so 80 represents\n# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not\n# change the gamma.\n# Minimum value: 40, maximum value: 240, default value: 80.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_GAMMA = 80\n\n# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n# page will contain the date and time when the page was generated. Setting this\n# to NO can help when comparing the output of multiple runs.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_TIMESTAMP = YES\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n# documentation will contain sections that can be hidden and shown after the\n# page has loaded.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_DYNAMIC_SECTIONS = NO\n\n# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries\n# shown in the various tree structured indices initially; the user can expand\n# and collapse entries dynamically later on. Doxygen will expand the tree to\n# such a level that at most the specified number of entries are visible (unless\n# a fully collapsed tree already exceeds this amount). So setting the number of\n# entries 1 will produce a full collapsed tree by default. 0 is a special value\n# representing an infinite number of entries and will result in a full expanded\n# tree by default.\n# Minimum value: 0, maximum value: 9999, default value: 100.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_INDEX_NUM_ENTRIES = 100\n\n# If the GENERATE_DOCSET tag is set to YES, additional index files will be\n# generated that can be used as input for Apple's Xcode 3 integrated development\n# environment (see: http://developer.apple.com/tools/xcode/), introduced with\n# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a\n# Makefile in the HTML output directory. Running make will produce the docset in\n# that directory and running make install will install the docset in\n# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at\n# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n# for more information.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_DOCSET = NO\n\n# This tag determines the name of the docset feed. A documentation feed provides\n# an umbrella under which multiple documentation sets from a single provider\n# (such as a company or product suite) can be grouped.\n# The default value is: Doxygen generated docs.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_FEEDNAME = \"Doxygen generated docs\"\n\n# This tag specifies a string that should uniquely identify the documentation\n# set bundle. This should be a reverse domain-name style string, e.g.\n# com.mycompany.MyDocSet. Doxygen will append .docset to the name.\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_BUNDLE_ID = org.doxygen.Project\n\n# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify\n# the documentation publisher. This should be a reverse domain-name style\n# string, e.g. com.mycompany.MyDocSet.documentation.\n# The default value is: org.doxygen.Publisher.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_PUBLISHER_ID = org.doxygen.Publisher\n\n# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.\n# The default value is: Publisher.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_PUBLISHER_NAME = Publisher\n\n# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three\n# additional HTML index files: index.hhp, index.hhc, and index.hhk. The\n# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop\n# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on\n# Windows.\n#\n# The HTML Help Workshop contains a compiler that can convert all HTML output\n# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML\n# files are now used as the Windows 98 help format, and will replace the old\n# Windows help format (.hlp) on all Windows platforms in the future. Compressed\n# HTML files also contain an index, a table of contents, and you can search for\n# words in the documentation. The HTML workshop also contains a viewer for\n# compressed HTML files.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_HTMLHELP = NO\n\n# The CHM_FILE tag can be used to specify the file name of the resulting .chm\n# file. You can add a path in front of the file if the result should not be\n# written to the html output directory.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nCHM_FILE =\n\n# The HHC_LOCATION tag can be used to specify the location (absolute path\n# including file name) of the HTML help compiler ( hhc.exe). If non-empty\n# doxygen will try to run the HTML help compiler on the generated index.hhp.\n# The file has to be specified with full path.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nHHC_LOCATION =\n\n# The GENERATE_CHI flag controls if a separate .chi index file is generated (\n# YES) or that it should be included in the master .chm file ( NO).\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nGENERATE_CHI = NO\n\n# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)\n# and project file content.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nCHM_INDEX_ENCODING =\n\n# The BINARY_TOC flag controls whether a binary table of contents is generated (\n# YES) or a normal table of contents ( NO) in the .chm file.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nBINARY_TOC = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members to\n# the table of contents of the HTML help documentation and to the tree view.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nTOC_EXPAND = NO\n\n# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that\n# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help\n# (.qch) of the generated HTML documentation.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_QHP = NO\n\n# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify\n# the file name of the resulting .qch file. The path specified is relative to\n# the HTML output folder.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQCH_FILE =\n\n# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help\n# Project output. For more information please see Qt Help Project / Namespace\n# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_NAMESPACE = org.doxygen.Project\n\n# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt\n# Help Project output. For more information please see Qt Help Project / Virtual\n# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-\n# folders).\n# The default value is: doc.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_VIRTUAL_FOLDER = doc\n\n# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom\n# filter to add. For more information please see Qt Help Project / Custom\n# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-\n# filters).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_CUST_FILTER_NAME =\n\n# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the\n# custom filter to add. For more information please see Qt Help Project / Custom\n# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-\n# filters).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_CUST_FILTER_ATTRS =\n\n# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n# project's filter section matches. Qt Help Project / Filter Attributes (see:\n# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_SECT_FILTER_ATTRS =\n\n# The QHG_LOCATION tag can be used to specify the location of Qt's\n# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the\n# generated .qhp file.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHG_LOCATION =\n\n# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be\n# generated, together with the HTML files, they form an Eclipse help plugin. To\n# install this plugin and make it available under the help contents menu in\n# Eclipse, the contents of the directory containing the HTML and XML files needs\n# to be copied into the plugins directory of eclipse. The name of the directory\n# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.\n# After copying Eclipse needs to be restarted before the help appears.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_ECLIPSEHELP = NO\n\n# A unique identifier for the Eclipse help plugin. When installing the plugin\n# the directory name containing the HTML and XML files should also have this\n# name. Each documentation set should have its own identifier.\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.\n\nECLIPSE_DOC_ID = org.doxygen.Project\n\n# If you want full control over the layout of the generated HTML pages it might\n# be necessary to disable the index and replace it with your own. The\n# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top\n# of each HTML page. A value of NO enables the index and the value YES disables\n# it. Since the tabs in the index contain the same information as the navigation\n# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nDISABLE_INDEX = NO\n\n# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n# structure should be generated to display hierarchical information. If the tag\n# value is set to YES, a side panel will be generated containing a tree-like\n# index structure (just like the one that is generated for HTML Help). For this\n# to work a browser that supports JavaScript, DHTML, CSS and frames is required\n# (i.e. any modern browser). Windows users are probably better off using the\n# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can\n# further fine-tune the look of the index. As an example, the default style\n# sheet generated by doxygen has an example that shows how to put an image at\n# the root of the tree instead of the PROJECT_NAME. Since the tree basically has\n# the same information as the tab index, you could consider setting\n# DISABLE_INDEX to YES when enabling this option.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_TREEVIEW = NO\n\n# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that\n# doxygen will group on one line in the generated HTML documentation.\n#\n# Note that a value of 0 will completely suppress the enum values from appearing\n# in the overview section.\n# Minimum value: 0, maximum value: 20, default value: 4.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nENUM_VALUES_PER_LINE = 4\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used\n# to set the initial width (in pixels) of the frame in which the tree is shown.\n# Minimum value: 0, maximum value: 1500, default value: 250.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nTREEVIEW_WIDTH = 250\n\n# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to\n# external symbols imported via tag files in a separate window.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nEXT_LINKS_IN_WINDOW = NO\n\n# Use this tag to change the font size of LaTeX formulas included as images in\n# the HTML documentation. When you change the font size after a successful\n# doxygen run you need to manually remove any form_*.png images from the HTML\n# output directory to force them to be regenerated.\n# Minimum value: 8, maximum value: 50, default value: 10.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nFORMULA_FONTSIZE = 10\n\n# Use the FORMULA_TRANPARENT tag to determine whether or not the images\n# generated for formulas are transparent PNGs. Transparent PNGs are not\n# supported properly for IE 6.0, but are supported on all modern browsers.\n#\n# Note that when changing this option you need to delete any form_*.png files in\n# the HTML output directory before the changes have effect.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nFORMULA_TRANSPARENT = YES\n\n# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see\n# http://www.mathjax.org) which uses client side Javascript for the rendering\n# instead of using prerendered bitmaps. Use this if you do not have LaTeX\n# installed or if you want to formulas look prettier in the HTML output. When\n# enabled you may also need to install MathJax separately and configure the path\n# to it using the MATHJAX_RELPATH option.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nUSE_MATHJAX = NO\n\n# When MathJax is enabled you can set the default output format to be used for\n# the MathJax output. See the MathJax site (see:\n# http://docs.mathjax.org/en/latest/output.html) for more details.\n# Possible values are: HTML-CSS (which is slower, but has the best\n# compatibility), NativeMML (i.e. MathML) and SVG.\n# The default value is: HTML-CSS.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_FORMAT = HTML-CSS\n\n# When MathJax is enabled you need to specify the location relative to the HTML\n# output directory using the MATHJAX_RELPATH option. The destination directory\n# should contain the MathJax.js script. For instance, if the mathjax directory\n# is located at the same level as the HTML output directory, then\n# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax\n# Content Delivery Network so you can quickly see the result without installing\n# MathJax. However, it is strongly recommended to install a local copy of\n# MathJax from http://www.mathjax.org before deployment.\n# The default value is: http://cdn.mathjax.org/mathjax/latest.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest\n\n# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax\n# extension names that should be enabled during MathJax rendering. For example\n# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_EXTENSIONS =\n\n# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces\n# of code that will be used on startup of the MathJax code. See the MathJax site\n# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an\n# example see the documentation.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_CODEFILE =\n\n# When the SEARCHENGINE tag is enabled doxygen will generate a search box for\n# the HTML output. The underlying search engine uses javascript and DHTML and\n# should work on any modern browser. Note that when using HTML help\n# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)\n# there is already a search function so this one should typically be disabled.\n# For large projects the javascript based search engine can be slow, then\n# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to\n# search using the keyboard; to jump to the search box use + S\n# (what the is depends on the OS and browser, but it is typically\n# , /