From d49a76b9782b56c076b94bef0b1108c50d6044c0 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Wed, 10 Oct 2018 12:22:10 +0200 Subject: [PATCH] [5-netconf-extend-syntax] Extended syntax --- doc/examples/netconf/simple-dhcp4.json | 16 + doc/examples/netconf/simple.json | 8 + src/bin/netconf/location.hh | 2 +- src/bin/netconf/netconf_cfg_mgr.cc | 33 +- src/bin/netconf/netconf_cfg_mgr.h | 20 + src/bin/netconf/netconf_config.cc | 14 +- src/bin/netconf/netconf_config.h | 60 + src/bin/netconf/netconf_lexer.cc | 1481 +++++++++-------- src/bin/netconf/netconf_lexer.ll | 30 + src/bin/netconf/netconf_parser.cc | 895 +++++----- src/bin/netconf/netconf_parser.h | 169 +- src/bin/netconf/netconf_parser.yy | 27 +- src/bin/netconf/position.hh | 2 +- src/bin/netconf/simple_parser.cc | 33 + src/bin/netconf/simple_parser.h | 9 + src/bin/netconf/stack.hh | 2 +- .../tests/netconf_cfg_mgr_unittests.cc | 156 ++ .../tests/netconf_controller_unittests.cc | 2 + src/bin/netconf/tests/parser_unittests.cc | 31 +- .../netconf/tests/testdata/get_config.json | 21 +- 20 files changed, 1829 insertions(+), 1182 deletions(-) diff --git a/doc/examples/netconf/simple-dhcp4.json b/doc/examples/netconf/simple-dhcp4.json index 5a869c5585..5258a2182d 100644 --- a/doc/examples/netconf/simple-dhcp4.json +++ b/doc/examples/netconf/simple-dhcp4.json @@ -4,6 +4,16 @@ { "Netconf": { + // Three flags control netconf (default values are true): + // - "boot-update" about the YANG configuration load when + // netconf boots. + // - "subscribe-changes" about the subscription to notifications + // when the running YANG module is changed. + // - "validate-changes" alloes to validate or not changes. + "boot-update": true, + "subscribe-changes": true, + "validate-changes": true, + // This map specifies how each server is managed: // the YANG model to use and the control channel. "managed-servers": @@ -16,6 +26,12 @@ // DHCPv4 server is kea-dhcp4-server model. "model": "kea-dhcp4-server", + // The three control flags can be defined in this scope too + // and takes precedence over global and default values. + "boot-update": false, + "subscribe-changes": false, + "validate-changes": false, + // Currently three control channel types are supported: // - "stdout" which output the configuration on the standard // output (this is mainly for testing purposes, but you can diff --git a/doc/examples/netconf/simple.json b/doc/examples/netconf/simple.json index a9902e1738..cc014f3094 100644 --- a/doc/examples/netconf/simple.json +++ b/doc/examples/netconf/simple.json @@ -3,6 +3,14 @@ { "Netconf": { + // Control flags can be defined in the global scope or + // in a managed server scope. Precedence are: + // - use the default value (true) + // - use the global value + // - use the local value. + // So this overwrites the default value: + "boot-update": false, + // This map specifies how each server is managed: // the YANG model to use and the control channel. // Currently three control channel types are supported: diff --git a/src/bin/netconf/location.hh b/src/bin/netconf/location.hh index f44548e0d2..5369188d2e 100644 --- a/src/bin/netconf/location.hh +++ b/src/bin/netconf/location.hh @@ -1,4 +1,4 @@ -// Generated 201809281126 +// Generated 201810092120 // A Bison parser, made by GNU Bison 3.0.5. // Locations for Bison parsers in C++ diff --git a/src/bin/netconf/netconf_cfg_mgr.cc b/src/bin/netconf/netconf_cfg_mgr.cc index 2e52efc40a..5cddc3a5c2 100644 --- a/src/bin/netconf/netconf_cfg_mgr.cc +++ b/src/bin/netconf/netconf_cfg_mgr.cc @@ -21,12 +21,29 @@ namespace isc { namespace netconf { NetconfConfig::NetconfConfig() - : servers_map_(new CfgServersMap()) { + : configured_globals_(Element::createMap()), + servers_map_(new CfgServersMap()) { } NetconfConfig::NetconfConfig(const NetconfConfig& orig) - : ConfigBase(), servers_map_(orig.servers_map_), - hooks_config_(orig.hooks_config_) { + : ConfigBase(), configured_globals_(orig.configured_globals_), + servers_map_(orig.servers_map_), hooks_config_(orig.hooks_config_) { +} + +void +NetconfConfig::extractConfiguredGlobals(ConstElementPtr config) { + if (config->getType() != Element::map) { + isc_throw(BadValue, + "extractConfiguredGlobals must be given a map element"); + } + + const std::map& values = config->mapValue(); + for (auto value = values.begin(); value != values.end(); ++value) { + if (value->second->getType() != Element::list && + value->second->getType() != Element::map) { + addConfiguredGlobal(value->first, value->second); + } + } } NetconfCfgMgr::NetconfCfgMgr() @@ -81,9 +98,13 @@ NetconfCfgMgr::parse(isc::data::ConstElementPtr config_set, NetconfConfigPtr ctx = getNetconfConfig(); - // Set the defaults + // Preserve all scalar global parameters. + ctx->extractConfiguredGlobals(config_set); + + // Set the defaults and derive parameters. ElementPtr cfg = boost::const_pointer_cast(config_set); NetconfSimpleParser::setAllDefaults(cfg); + NetconfSimpleParser::deriveParameters(cfg); // And parse the configuration. ConstElementPtr answer; @@ -121,13 +142,13 @@ NetconfCfgMgr::parse(isc::data::ConstElementPtr config_set, return (answer); } - - ElementPtr NetconfConfig::toElement() const { ElementPtr netconf = Element::createMap(); // Set user-context contextToElement(netconf); + // Add in explicitly configured globals. + netconf->setValue(configured_globals_->mapValue()); // Set hooks-libraries netconf->set("hooks-libraries", hooks_config_.toElement()); // Set managed-servers diff --git a/src/bin/netconf/netconf_cfg_mgr.h b/src/bin/netconf/netconf_cfg_mgr.h index 131f4e696b..ba1906ae39 100644 --- a/src/bin/netconf/netconf_cfg_mgr.h +++ b/src/bin/netconf/netconf_cfg_mgr.h @@ -35,6 +35,23 @@ public: /// @brief Default constructor NetconfConfig(); + /// @brief Returns pointer to configured global parameters. + isc::data::ConstElementPtr getConfiguredGlobals() const { + return (isc::data::ConstElementPtr(configured_globals_)); + } + + /// @brief Saves scalar elements from the global scope of a configuration. + void extractConfiguredGlobals(isc::data::ConstElementPtr config); + + /// @brief Adds a parameter to the collection configured globals. + /// + /// @param name std::string name of the global to add. + /// @param value ElementPtr containing the value of the global. + void addConfiguredGlobal(const std::string& name, + isc::data::ConstElementPtr value) { + configured_globals_->set(name, value); + } + /// @brief Returns non-const reference to the managed servers map. /// /// @return non-const reference to the managed servers map. @@ -88,6 +105,9 @@ private: /// @param rhs Context to be assigned. NetconfConfig& operator=(const NetconfConfig& rhs); + /// @brief Stores the global parameters specified via configuration. + isc::data::ElementPtr configured_globals_; + /// @brief CfgServers map. CfgServersMapPtr servers_map_; diff --git a/src/bin/netconf/netconf_config.cc b/src/bin/netconf/netconf_config.cc index 0784d15aed..79f68ffa34 100644 --- a/src/bin/netconf/netconf_config.cc +++ b/src/bin/netconf/netconf_config.cc @@ -79,7 +79,8 @@ CfgControlSocket::toElement() const { // *********************** CfgServer ************************* CfgServer::CfgServer(const string& model, CfgControlSocketPtr ctrl_sock) - : model_(model), control_socket_(ctrl_sock) { + : model_(model), boot_update_(true), subscribe_changes_(true), + validate_changes_(true), control_socket_(ctrl_sock) { } CfgServer::~CfgServer() { @@ -114,6 +115,12 @@ CfgServer::toElement() const { contextToElement(result); // Set model result->set("model", Element::create(model_)); + // Set boot-update + result->set("boot-update", Element::create(boot_update_)); + // Set subscribe-changes + result->set("subscribe-changes", Element::create(subscribe_changes_)); + // Set validate-changes + result->set("validate-changes", Element::create(validate_changes_)); // Set control-socket if (control_socket_) { result->set("control-socket", control_socket_->toElement()); @@ -192,6 +199,11 @@ ServerConfigParser::parse(ConstElementPtr server_config) { << server_config->getPosition() << ")"); } + // Add flags. + result->setBootUpdate(getBoolean(server_config, "boot-update")); + result->setSubscribeChanges(getBoolean(server_config, "subscribe-changes")); + result->setValidateChanges(getBoolean(server_config, "validate-changes")); + // Add user-context. if (user_context) { result->setContext(user_context); diff --git a/src/bin/netconf/netconf_config.h b/src/bin/netconf/netconf_config.h index 43bf1c11af..34620c6368 100644 --- a/src/bin/netconf/netconf_config.h +++ b/src/bin/netconf/netconf_config.h @@ -172,6 +172,48 @@ public: return (control_socket_); } + /// @brief Getter which returns the boot-update flag. + /// + /// @return returns the boot-update flag as a bool. + bool getBootUpdate() const { + return (boot_update_); + } + + /// @brief Set the boot-update flag. + /// + /// @param boot_update The boot-update flag. + void setBootUpdate(bool boot_update) { + boot_update_ = boot_update; + } + + /// @brief Getter which returns the subscribe-changes flag. + /// + /// @return returns the subscribe-changes flag as a bool. + bool getSubscribeChanges() const { + return (subscribe_changes_); + } + + /// @brief Set the subscribe-changes flag. + /// + /// @param subscribe_changes The subscribe-changes flag. + void setSubscribeChanges(bool subscribe_changes) { + subscribe_changes_ = subscribe_changes; + } + + /// @brief Getter which returns the validate-changes flag. + /// + /// @return returns the validate-changes flag as a bool. + bool getValidateChanges() const { + return (validate_changes_); + } + + /// @brief Set the validate-changes flag. + /// + /// @param validate_changes The validate-changes flag. + void setValidateChanges(bool validate_changes) { + validate_changes_ = validate_changes; + } + /// @brief Returns a text representation for the server. std::string toText() const; @@ -184,6 +226,24 @@ private: /// @brief The model name. const std::string model_; + /// @brief The boot-update flag. + /// + /// If true (the defaul) Kea server configuration is updated at (netconf + /// agent) boot time. + bool boot_update_; + + /// @brief The subscribe-changes flag. + /// + /// If true (the deault) the netconf agent subscribes module changes + /// so will be notified when the YANG running configuration is changed. + bool subscribe_changes_; + + /// @brief The validate-changes flag. + /// + /// If true (the deault) the netconf agent validates module changes + /// and can reject bad configurations. + bool validate_changes_; + /// @brief The control socket. CfgControlSocketPtr control_socket_; }; diff --git a/src/bin/netconf/netconf_lexer.cc b/src/bin/netconf/netconf_lexer.cc index e21369136c..5f55acdc7e 100644 --- a/src/bin/netconf/netconf_lexer.cc +++ b/src/bin/netconf/netconf_lexer.cc @@ -691,8 +691,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\ (yy_c_buf_p) = yy_cp; /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */ -#define YY_NUM_RULES 59 -#define YY_END_OF_BUFFER 60 +#define YY_NUM_RULES 62 +#define YY_END_OF_BUFFER 63 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -700,43 +700,48 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[321] = +static const flex_int16_t yy_accept[367] = { 0, - 52, 52, 0, 0, 0, 0, 0, 0, 0, 0, - 60, 58, 10, 11, 58, 1, 52, 49, 52, 52, - 58, 51, 50, 58, 58, 58, 58, 58, 45, 46, - 58, 58, 58, 47, 48, 5, 5, 5, 58, 58, - 58, 10, 11, 0, 0, 41, 0, 0, 0, 0, + 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 63, 61, 10, 11, 61, 1, 55, 52, 55, 55, + 61, 54, 53, 61, 61, 61, 61, 61, 48, 49, + 61, 61, 61, 50, 51, 5, 5, 5, 61, 61, + 61, 10, 11, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 52, 52, 0, 51, 52, 3, 2, 6, 0, - 52, 0, 0, 0, 0, 0, 0, 4, 0, 0, - 9, 0, 42, 0, 0, 0, 0, 44, 0, 0, + 0, 0, 1, 55, 55, 0, 54, 55, 3, 2, + 6, 0, 55, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 9, 0, 45, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, - 0, 0, 43, 0, 19, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 57, 55, 0, - 54, 53, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 46, 0, 0, + 22, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 56, 53, + 0, 0, 0, 0, 0, 60, 58, 0, 57, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 23, 0, 0, 0, 0, 0, 0, 33, - - 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 17, 36, 0, 0, 0, - 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 38, 35, 0, 0, 0, 0, 24, 0, 31, - 12, 14, 0, 0, 0, 29, 32, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, - 0, 0, 30, 0, 0, 27, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, + 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, + 0, 36, 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 20, 39, 0, 0, 0, 0, 0, 0, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, + 38, 0, 0, 0, 0, 27, 0, 0, 0, 34, + 12, 0, 14, 0, 0, 0, 32, 35, 0, 40, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, - 0, 26, 25, 0, 0, 0, 0, 0, 13, 0, - 0, 0, 0, 21, 0, 0, 34, 28, 15, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, + 0, 0, 33, 0, 0, 30, 0, 0, 0, 15, + 0, 0, 0, 0, 29, 28, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 24, 0, 0, 37, 0, 0, 31, 18, + 0, 0, 0, 17, 16, 0 } ; static const YY_CHAR yy_ec[256] = @@ -781,89 +786,97 @@ static const YY_CHAR yy_meta[61] = 5, 3, 5, 5, 3, 3, 3, 3, 3, 3 } ; -static const flex_int16_t yy_base[334] = +static const flex_int16_t yy_base[380] = { 0, 0, 0, 59, 62, 65, 0, 63, 67, 47, 64, - 277, 2083, 84, 269, 125, 0, 105, 2083, 120, 125, - 85, 166, 2083, 250, 139, 65, 69, 82, 2083, 2083, - 80, 84, 118, 2083, 2083, 2083, 92, 253, 211, 0, - 235, 110, 243, 97, 183, 2083, 190, 196, 194, 207, - 218, 251, 261, 267, 273, 279, 285, 301, 318, 324, - 0, 326, 363, 338, 369, 374, 2083, 0, 2083, 345, - 380, 121, 168, 157, 169, 179, 172, 2083, 196, 198, - 2083, 137, 2083, 133, 398, 404, 170, 330, 444, 410, - 416, 422, 469, 485, 444, 491, 498, 506, 432, 513, - - 519, 526, 532, 547, 554, 561, 569, 580, 587, 0, - 189, 186, 177, 208, 204, 198, 116, 2083, 0, 604, - 615, 155, 2083, 640, 2083, 627, 633, 2083, 639, 667, - 681, 689, 695, 702, 709, 723, 717, 735, 746, 759, - 775, 781, 787, 793, 800, 816, 204, 2083, 2083, 225, - 2083, 2083, 105, 0, 822, 828, 864, 835, 857, 851, - 893, 910, 916, 922, 928, 934, 944, 956, 969, 977, - 989, 995, 1005, 1011, 1018, 1024, 1030, 1039, 2083, 2083, - 118, 0, 1053, 1063, 1098, 1092, 1125, 1073, 1140, 1146, - 1153, 1159, 2083, 1165, 1174, 1181, 1187, 1193, 1199, 2083, - - 1207, 1216, 1228, 1235, 1245, 2083, 1251, 64, 0, 1261, - 1268, 1274, 1280, 1289, 2083, 2083, 2083, 1309, 1315, 1329, - 1335, 1343, 1351, 2083, 1357, 1363, 1376, 1392, 1385, 1398, - 2083, 1404, 1411, 1418, 1432, 1439, 1447, 1453, 1460, 1467, - 1473, 2083, 2083, 1481, 1495, 1501, 1507, 2083, 1514, 2083, - 2083, 2083, 1520, 1530, 1536, 2083, 2083, 1542, 2083, 1548, - 1576, 1582, 1589, 1598, 1605, 1611, 1617, 1627, 1634, 1646, - 1656, 1668, 2083, 1674, 1681, 1689, 1696, 1709, 1722, 1731, - 1737, 1743, 1750, 1756, 1771, 1779, 1789, 1796, 2083, 1804, - 1813, 1824, 2083, 1830, 1837, 2083, 1846, 1858, 1874, 1880, - - 1886, 2083, 2083, 1894, 1900, 1908, 1922, 1929, 2083, 1936, - 1943, 1955, 1964, 2083, 1976, 1983, 2083, 2083, 2083, 2083, - 2016, 2023, 2030, 2037, 2044, 2051, 2058, 2062, 2067, 2069, - 2071, 2073, 2075 + 291, 2481, 84, 286, 125, 0, 105, 2481, 120, 125, + 85, 169, 2481, 262, 139, 65, 69, 82, 2481, 2481, + 80, 84, 118, 2481, 2481, 2481, 92, 269, 230, 0, + 256, 110, 270, 97, 186, 2481, 193, 199, 197, 210, + 219, 234, 255, 263, 269, 278, 284, 291, 297, 303, + 320, 338, 0, 345, 363, 375, 381, 385, 2481, 0, + 2481, 332, 349, 121, 144, 128, 152, 171, 160, 2481, + 222, 248, 2481, 198, 2481, 169, 405, 411, 209, 417, + 451, 428, 439, 450, 478, 493, 499, 506, 512, 518, + + 532, 540, 546, 552, 574, 586, 594, 602, 608, 614, + 622, 628, 648, 661, 0, 177, 181, 184, 189, 207, + 204, 130, 2481, 0, 667, 673, 155, 2481, 698, 695, + 2481, 683, 723, 2481, 739, 748, 756, 762, 768, 776, + 782, 810, 819, 827, 833, 839, 847, 853, 862, 875, + 895, 903, 909, 917, 222, 2481, 2481, 223, 2481, 2481, + 103, 0, 924, 931, 967, 937, 992, 1008, 943, 1014, + 1020, 1032, 1042, 1049, 1055, 1065, 1071, 1077, 1088, 1099, + 1110, 1121, 1127, 1134, 1143, 1149, 1155, 1169, 1183, 2481, + 2481, 104, 0, 1190, 1197, 1232, 1204, 1211, 1218, 1230, + + 1259, 1276, 1282, 1288, 2481, 1294, 1300, 1310, 1316, 1322, + 1328, 2481, 1334, 1351, 1357, 1363, 1369, 1375, 2481, 1391, + 1397, 64, 0, 1403, 1409, 1437, 1445, 1451, 1459, 2481, + 2481, 2481, 1470, 1479, 1487, 1499, 1507, 1516, 2481, 1522, + 1528, 1540, 1557, 1550, 1563, 1569, 1576, 2481, 1583, 1597, + 1609, 1618, 1625, 1631, 1637, 1643, 1651, 1660, 1666, 2481, + 2481, 1672, 1686, 1694, 1700, 2481, 1706, 1712, 1722, 2481, + 2481, 1728, 2481, 1734, 1767, 1773, 2481, 2481, 1779, 2481, + 1786, 1792, 1802, 1812, 1820, 1827, 1836, 1848, 1855, 1861, + 1869, 1883, 1889, 1897, 1903, 1909, 2481, 1918, 1925, 1943, + + 1951, 1965, 1971, 1977, 1985, 1991, 2000, 2010, 2019, 2025, + 2036, 2044, 2053, 2064, 2072, 2079, 2086, 2092, 2481, 2098, + 2105, 2112, 2481, 2133, 2140, 2481, 2149, 2156, 2162, 2481, + 2168, 2174, 2182, 2210, 2481, 2481, 2218, 2224, 2230, 2236, + 2243, 2258, 2264, 2271, 2481, 2278, 2284, 2292, 2299, 2312, + 2320, 2327, 2481, 2333, 2340, 2481, 2346, 2355, 2481, 2481, + 2362, 2368, 2375, 2481, 2481, 2481, 2414, 2421, 2428, 2435, + 2442, 2449, 2456, 2460, 2465, 2467, 2469, 2471, 2473 } ; -static const flex_int16_t yy_def[334] = +static const flex_int16_t yy_def[380] = { 0, - 320, 1, 321, 321, 1, 5, 5, 5, 5, 5, - 320, 320, 320, 320, 322, 323, 320, 320, 320, 320, - 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, - 320, 320, 320, 320, 320, 320, 320, 320, 320, 324, - 320, 320, 320, 325, 322, 320, 322, 322, 326, 322, - 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, - 323, 320, 320, 320, 320, 320, 320, 327, 320, 320, - 320, 320, 320, 320, 320, 320, 320, 320, 320, 324, - 320, 325, 320, 328, 322, 322, 329, 322, 326, 322, - 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, - - 322, 322, 322, 322, 322, 322, 322, 322, 322, 327, - 320, 320, 320, 320, 320, 320, 320, 320, 330, 322, - 322, 329, 320, 326, 320, 322, 322, 320, 322, 322, - 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, - 322, 322, 322, 322, 322, 322, 320, 320, 320, 320, - 320, 320, 320, 331, 322, 322, 326, 322, 322, 322, - 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, - 322, 322, 322, 322, 322, 322, 322, 322, 320, 320, - 320, 332, 322, 322, 326, 322, 322, 322, 322, 322, - 322, 322, 320, 322, 322, 322, 322, 322, 322, 320, - - 322, 322, 322, 322, 322, 320, 322, 320, 333, 322, - 322, 322, 322, 322, 320, 320, 320, 322, 322, 322, - 322, 322, 322, 320, 322, 322, 322, 322, 322, 322, - 320, 322, 322, 322, 322, 322, 322, 322, 322, 322, - 322, 320, 320, 322, 322, 322, 322, 320, 322, 320, - 320, 320, 322, 322, 322, 320, 320, 322, 320, 322, - 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, - 322, 322, 320, 322, 322, 322, 322, 322, 322, 322, - 322, 322, 322, 322, 322, 322, 322, 322, 320, 322, - 322, 322, 320, 322, 322, 320, 322, 322, 322, 322, - - 322, 320, 320, 322, 322, 322, 322, 322, 320, 322, - 322, 322, 322, 320, 322, 322, 320, 320, 320, 0, - 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, - 320, 320, 320 + 366, 1, 367, 367, 1, 5, 5, 5, 5, 5, + 366, 366, 366, 366, 368, 369, 366, 366, 366, 366, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 370, + 366, 366, 366, 371, 368, 366, 368, 368, 372, 368, + 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 368, 368, 369, 366, 366, 366, 366, 366, 366, 373, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366, 370, 366, 371, 366, 374, 368, 368, 375, 368, + 372, 368, 368, 368, 368, 368, 368, 368, 368, 368, + + 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 368, 368, 368, 368, 373, 366, 366, 366, 366, 366, + 366, 366, 366, 376, 368, 368, 375, 366, 372, 368, + 366, 368, 368, 366, 368, 368, 368, 368, 368, 368, + 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 368, 368, 368, 368, 366, 366, 366, 366, 366, 366, + 366, 377, 368, 368, 372, 368, 368, 368, 368, 368, + 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 368, 368, 368, 368, 368, 368, 368, 368, 368, 366, + 366, 366, 378, 368, 368, 372, 368, 368, 368, 368, + + 368, 368, 368, 368, 366, 368, 368, 368, 368, 368, + 368, 366, 368, 368, 368, 368, 368, 368, 366, 368, + 368, 366, 379, 368, 368, 368, 368, 368, 368, 366, + 366, 366, 368, 368, 368, 368, 368, 368, 366, 368, + 368, 368, 368, 368, 368, 368, 368, 366, 368, 368, + 368, 368, 368, 368, 368, 368, 368, 368, 368, 366, + 366, 368, 368, 368, 368, 366, 368, 368, 368, 366, + 366, 368, 366, 368, 368, 368, 366, 366, 368, 366, + 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 368, 368, 368, 368, 368, 368, 366, 368, 368, 368, + + 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 368, 368, 368, 368, 368, 368, 368, 368, 366, 368, + 368, 368, 366, 368, 368, 366, 368, 368, 368, 366, + 368, 368, 368, 368, 366, 366, 368, 368, 368, 368, + 368, 368, 368, 368, 366, 368, 368, 368, 368, 368, + 368, 368, 366, 368, 368, 366, 368, 368, 366, 366, + 368, 368, 368, 366, 366, 0, 366, 366, 366, 366, + 366, 366, 366, 366, 366, 366, 366, 366, 366 } ; -static const flex_int16_t yy_nxt[2144] = +static const flex_int16_t yy_nxt[2542] = { 0, 12, 13, 14, 13, 12, 15, 16, 12, 17, 18, 19, 20, 21, 22, 22, 22, 22, 23, 24, 12, @@ -873,237 +886,281 @@ static const flex_int16_t yy_nxt[2144] = 12, 12, 33, 12, 12, 12, 12, 12, 34, 35, 37, 14, 37, 37, 14, 37, 38, 41, 40, 38, 12, 12, 40, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 41, 42, 72, 42, 12, 12, - 12, 12, 67, 42, 12, 42, 12, 68, 12, 73, - - 72, 72, 83, 231, 12, 12, 12, 12, 39, 74, - 12, 42, 12, 42, 73, 75, 62, 12, 63, 63, - 63, 63, 73, 12, 12, 44, 44, 44, 64, 84, - 46, 62, 74, 65, 65, 65, 65, 76, 66, 66, - 66, 66, 83, 64, 64, 74, 111, 70, 64, 70, - 47, 48, 71, 71, 71, 71, 208, 49, 181, 64, - 123, 153, 50, 51, 64, 52, 111, 53, 77, 84, - 54, 55, 56, 57, 58, 123, 59, 62, 60, 65, - 65, 65, 65, 44, 44, 44, 119, 113, 46, 64, - 44, 44, 44, 112, 111, 46, 44, 44, 44, 88, - - 149, 46, 113, 118, 112, 64, 45, 44, 44, 44, - 113, 148, 46, 112, 114, 49, 149, 147, 44, 44, - 44, 149, 49, 46, 115, 116, 45, 179, 49, 148, - 45, 148, 92, 117, 45, 86, 147, 152, 85, 49, - 147, 45, 90, 179, 45, 43, 45, 89, 179, 151, - 49, 44, 44, 44, 81, 91, 46, 93, 79, 150, - 94, 44, 44, 44, 180, 78, 46, 44, 44, 44, - 69, 43, 46, 44, 44, 44, 320, 320, 46, 44, - 44, 44, 320, 49, 46, 44, 44, 44, 320, 320, - 46, 320, 320, 49, 320, 320, 95, 320, 320, 49, - - 320, 44, 44, 44, 320, 49, 46, 320, 100, 96, - 98, 49, 320, 97, 102, 99, 320, 49, 44, 44, - 44, 101, 320, 46, 44, 44, 44, 320, 320, 46, - 44, 44, 44, 49, 320, 46, 104, 320, 103, 66, - 66, 66, 66, 320, 320, 320, 70, 320, 70, 64, - 49, 71, 71, 71, 71, 320, 49, 105, 71, 71, - 71, 71, 49, 320, 320, 64, 106, 320, 320, 320, - 107, 108, 320, 320, 62, 109, 63, 63, 63, 63, - 62, 320, 65, 65, 65, 65, 64, 66, 66, 66, - 66, 320, 64, 71, 71, 71, 71, 64, 44, 44, - - 44, 320, 64, 46, 44, 44, 44, 320, 64, 46, - 44, 44, 44, 64, 320, 125, 44, 44, 44, 320, - 320, 46, 44, 44, 44, 320, 320, 128, 320, 320, - 49, 320, 44, 44, 44, 320, 49, 46, 320, 120, - 320, 320, 49, 320, 44, 44, 44, 320, 49, 46, - 320, 320, 320, 320, 49, 320, 121, 124, 124, 124, - 124, 320, 126, 127, 49, 124, 124, 124, 124, 44, - 44, 44, 320, 135, 46, 320, 49, 320, 320, 124, - 124, 124, 124, 124, 124, 44, 44, 44, 320, 320, - 46, 44, 44, 44, 320, 320, 46, 131, 44, 44, - - 44, 49, 320, 46, 320, 129, 44, 44, 44, 320, - 320, 46, 320, 44, 44, 44, 320, 49, 46, 44, - 44, 44, 130, 49, 46, 320, 44, 44, 44, 320, - 49, 46, 44, 44, 44, 320, 320, 46, 49, 132, - 320, 320, 134, 320, 320, 49, 320, 44, 44, 44, - 133, 49, 46, 320, 44, 44, 44, 138, 49, 46, - 136, 44, 44, 44, 49, 320, 46, 320, 137, 44, - 44, 44, 139, 320, 46, 320, 320, 320, 320, 49, - 44, 44, 44, 320, 140, 46, 49, 44, 44, 44, - 320, 320, 46, 49, 320, 320, 320, 141, 143, 320, - - 320, 49, 320, 320, 44, 44, 44, 144, 142, 46, - 320, 320, 49, 320, 320, 44, 44, 44, 320, 49, - 46, 320, 320, 145, 320, 320, 146, 44, 44, 44, - 320, 320, 46, 44, 44, 44, 49, 320, 46, 44, - 44, 44, 320, 320, 46, 155, 320, 49, 320, 320, - 320, 320, 156, 157, 157, 157, 157, 320, 320, 49, - 320, 157, 157, 157, 157, 49, 320, 44, 44, 44, - 320, 49, 46, 158, 320, 157, 157, 157, 157, 157, - 157, 44, 44, 44, 320, 159, 46, 320, 320, 44, - 44, 44, 160, 320, 46, 44, 44, 44, 320, 49, - - 46, 320, 44, 44, 44, 320, 320, 46, 320, 44, - 44, 44, 320, 49, 46, 320, 161, 44, 44, 44, - 320, 49, 46, 44, 44, 44, 320, 49, 46, 320, - 320, 320, 162, 163, 49, 44, 44, 44, 320, 320, - 46, 49, 320, 320, 164, 320, 44, 44, 44, 49, - 166, 46, 165, 320, 320, 49, 320, 320, 167, 44, - 44, 44, 320, 320, 46, 320, 320, 49, 168, 320, - 320, 169, 320, 320, 170, 44, 44, 44, 49, 320, - 46, 44, 44, 44, 320, 171, 46, 44, 44, 44, - 320, 49, 46, 44, 44, 44, 320, 320, 46, 320, - - 44, 44, 44, 320, 320, 46, 320, 49, 172, 320, - 173, 320, 320, 49, 320, 320, 44, 44, 44, 49, - 174, 46, 44, 44, 44, 49, 320, 46, 44, 44, - 44, 175, 49, 46, 320, 44, 44, 44, 320, 320, - 46, 176, 320, 320, 320, 320, 320, 320, 49, 320, - 320, 44, 44, 44, 49, 177, 46, 44, 44, 44, - 49, 320, 46, 320, 320, 183, 178, 49, 320, 320, - 320, 320, 320, 320, 186, 320, 184, 185, 185, 185, - 185, 320, 320, 49, 320, 185, 185, 185, 185, 49, - 320, 320, 188, 44, 44, 44, 320, 320, 46, 185, - - 185, 185, 185, 185, 185, 320, 320, 187, 189, 190, - 44, 44, 44, 320, 320, 46, 44, 44, 44, 320, - 320, 46, 44, 44, 44, 49, 320, 193, 44, 44, - 44, 320, 320, 46, 44, 44, 44, 320, 320, 46, - 320, 320, 49, 320, 44, 44, 44, 320, 49, 46, - 320, 320, 191, 320, 49, 320, 44, 44, 44, 320, - 49, 46, 320, 194, 320, 320, 49, 192, 320, 44, - 44, 44, 320, 195, 46, 320, 49, 44, 44, 44, - 320, 320, 46, 320, 320, 196, 320, 320, 49, 44, - 44, 44, 320, 320, 200, 44, 44, 44, 320, 197, - - 46, 49, 320, 320, 320, 44, 44, 44, 198, 49, - 46, 44, 44, 44, 320, 320, 46, 320, 44, 44, - 44, 49, 199, 46, 44, 44, 44, 49, 320, 46, - 44, 44, 44, 320, 320, 206, 320, 49, 320, 44, - 44, 44, 320, 49, 46, 320, 320, 320, 201, 207, - 49, 202, 320, 44, 44, 44, 49, 204, 46, 320, - 320, 203, 49, 44, 44, 44, 320, 320, 46, 320, - 320, 49, 320, 44, 44, 44, 320, 205, 46, 320, - 320, 320, 320, 320, 320, 49, 320, 320, 320, 320, - 320, 320, 44, 44, 44, 49, 320, 46, 320, 320, - - 210, 320, 320, 320, 320, 49, 320, 320, 320, 320, - 211, 45, 45, 45, 45, 320, 320, 320, 214, 45, - 45, 45, 45, 320, 49, 44, 44, 44, 320, 320, - 46, 320, 320, 45, 45, 45, 45, 45, 45, 212, - 44, 44, 44, 320, 320, 215, 44, 44, 44, 320, - 320, 216, 320, 44, 44, 44, 320, 49, 217, 44, - 44, 44, 320, 320, 46, 44, 44, 44, 320, 218, - 46, 320, 49, 213, 44, 44, 44, 320, 49, 46, - 320, 44, 44, 44, 320, 49, 46, 44, 44, 44, - 320, 49, 46, 44, 44, 44, 320, 49, 46, 44, - - 44, 44, 320, 320, 224, 320, 49, 44, 44, 44, - 320, 320, 46, 49, 320, 219, 44, 44, 44, 49, - 221, 46, 320, 320, 220, 49, 320, 320, 44, 44, - 44, 49, 320, 46, 320, 44, 44, 44, 320, 49, - 46, 320, 320, 223, 222, 44, 44, 44, 49, 320, - 46, 44, 44, 44, 320, 226, 46, 320, 320, 225, - 49, 44, 44, 44, 320, 320, 46, 49, 44, 44, - 44, 227, 320, 46, 44, 44, 44, 49, 320, 46, - 44, 44, 44, 49, 320, 46, 320, 228, 230, 44, - 44, 44, 320, 49, 46, 320, 320, 229, 320, 320, - - 49, 320, 232, 320, 320, 320, 49, 320, 233, 44, - 44, 44, 49, 320, 46, 44, 44, 44, 320, 320, - 46, 49, 320, 320, 320, 235, 234, 320, 236, 44, - 44, 44, 320, 320, 46, 44, 44, 44, 320, 320, - 46, 49, 320, 44, 44, 44, 320, 49, 46, 320, - 320, 44, 44, 44, 237, 320, 242, 44, 44, 44, - 320, 49, 243, 44, 44, 44, 320, 49, 46, 320, - 320, 238, 320, 240, 320, 49, 44, 44, 44, 320, - 239, 46, 241, 49, 320, 44, 44, 44, 320, 49, - 248, 244, 44, 44, 44, 49, 320, 46, 44, 44, - - 44, 320, 247, 46, 44, 44, 44, 320, 49, 250, - 320, 44, 44, 44, 320, 245, 251, 49, 44, 44, - 44, 320, 320, 252, 49, 320, 320, 320, 246, 320, - 49, 320, 44, 44, 44, 320, 49, 46, 320, 44, - 44, 44, 253, 49, 46, 320, 249, 44, 44, 44, - 49, 320, 46, 44, 44, 44, 320, 320, 256, 320, - 44, 44, 44, 320, 49, 257, 320, 44, 44, 44, - 320, 49, 46, 44, 44, 44, 320, 258, 259, 49, - 320, 44, 44, 44, 320, 49, 46, 320, 320, 320, - 255, 320, 49, 254, 320, 44, 44, 44, 320, 49, - - 46, 44, 44, 44, 320, 49, 46, 44, 44, 44, - 320, 320, 46, 49, 44, 44, 44, 320, 320, 46, - 44, 44, 44, 320, 320, 46, 320, 49, 320, 260, - 44, 44, 44, 49, 261, 46, 44, 44, 44, 49, - 320, 46, 44, 44, 44, 320, 49, 46, 44, 44, - 44, 320, 49, 46, 263, 320, 320, 262, 320, 264, - 265, 266, 49, 320, 320, 320, 320, 320, 49, 268, - 320, 267, 269, 320, 49, 320, 44, 44, 44, 320, - 49, 46, 44, 44, 44, 320, 320, 273, 320, 44, - 44, 44, 320, 270, 46, 320, 320, 271, 44, 44, - - 44, 320, 320, 46, 320, 44, 44, 44, 49, 320, - 46, 44, 44, 44, 49, 320, 46, 44, 44, 44, - 320, 49, 46, 320, 274, 320, 272, 44, 44, 44, - 49, 320, 46, 320, 44, 44, 44, 49, 320, 46, - 320, 320, 320, 49, 320, 320, 44, 44, 44, 49, - 320, 46, 320, 320, 275, 276, 44, 44, 44, 49, - 320, 46, 320, 277, 320, 278, 49, 320, 44, 44, - 44, 320, 279, 46, 44, 44, 44, 320, 49, 46, - 320, 44, 44, 44, 280, 281, 46, 320, 49, 44, - 44, 44, 320, 320, 46, 320, 44, 44, 44, 320, - - 49, 46, 320, 320, 320, 320, 49, 320, 282, 44, - 44, 44, 320, 49, 46, 320, 320, 320, 320, 283, - 284, 49, 44, 44, 44, 320, 320, 289, 49, 320, - 285, 44, 44, 44, 286, 287, 46, 44, 44, 44, - 320, 49, 46, 44, 44, 44, 288, 320, 46, 320, - 44, 44, 44, 320, 49, 293, 44, 44, 44, 320, - 320, 46, 320, 49, 320, 320, 290, 320, 320, 49, - 320, 44, 44, 44, 320, 49, 46, 320, 320, 44, - 44, 44, 49, 320, 296, 320, 292, 291, 49, 44, - 44, 44, 320, 320, 46, 294, 44, 44, 44, 320, - - 320, 46, 320, 49, 44, 44, 44, 320, 320, 46, - 295, 49, 320, 44, 44, 44, 320, 320, 46, 320, - 320, 49, 320, 320, 44, 44, 44, 320, 49, 46, - 44, 44, 44, 320, 320, 302, 49, 44, 44, 44, - 298, 320, 303, 320, 297, 49, 44, 44, 44, 320, - 320, 46, 320, 320, 299, 320, 49, 320, 44, 44, - 44, 320, 49, 46, 320, 320, 320, 300, 320, 49, - 320, 320, 301, 320, 44, 44, 44, 320, 49, 46, - 44, 44, 44, 320, 320, 46, 44, 44, 44, 320, - 49, 46, 320, 320, 44, 44, 44, 305, 304, 309, - - 44, 44, 44, 320, 320, 46, 49, 320, 44, 44, - 44, 320, 49, 46, 320, 320, 320, 306, 49, 307, - 320, 320, 44, 44, 44, 320, 49, 46, 320, 44, - 44, 44, 49, 308, 46, 320, 44, 44, 44, 320, - 49, 314, 320, 44, 44, 44, 320, 311, 46, 320, - 320, 320, 310, 320, 49, 44, 44, 44, 320, 320, - 46, 49, 320, 320, 44, 44, 44, 320, 49, 317, - 320, 320, 312, 320, 320, 49, 44, 44, 44, 320, - 313, 318, 320, 44, 44, 44, 320, 49, 319, 320, - 320, 320, 320, 320, 315, 320, 49, 320, 320, 320, - - 320, 320, 320, 320, 320, 320, 316, 320, 49, 320, - 320, 320, 320, 320, 320, 49, 36, 36, 36, 36, - 36, 36, 36, 45, 45, 45, 45, 45, 45, 45, - 61, 320, 61, 61, 61, 61, 61, 80, 320, 80, - 320, 80, 80, 80, 82, 82, 82, 82, 82, 82, - 82, 87, 87, 87, 87, 87, 87, 87, 110, 320, - 110, 110, 110, 110, 110, 82, 82, 320, 82, 122, - 122, 122, 122, 122, 154, 154, 182, 182, 209, 209, - 82, 82, 11, 320, 320, 320, 320, 320, 320, 320, - 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, - - 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, - 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, - 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, - 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, - 320, 320, 320 + 12, 12, 12, 12, 41, 42, 74, 42, 12, 12, + 12, 12, 69, 42, 12, 42, 12, 70, 12, 75, + + 74, 74, 85, 248, 12, 12, 12, 12, 39, 76, + 12, 42, 12, 42, 75, 77, 64, 12, 65, 65, + 65, 65, 75, 12, 12, 44, 44, 44, 66, 86, + 46, 64, 76, 67, 67, 67, 67, 78, 68, 68, + 68, 68, 222, 66, 66, 76, 116, 72, 66, 72, + 47, 48, 73, 73, 73, 73, 192, 49, 118, 66, + 128, 50, 51, 52, 66, 53, 116, 54, 79, 117, + 55, 56, 57, 58, 59, 161, 60, 116, 61, 62, + 64, 118, 67, 67, 67, 67, 44, 44, 44, 117, + 118, 46, 66, 44, 44, 44, 117, 119, 46, 44, + + 44, 44, 90, 85, 46, 155, 156, 157, 66, 45, + 44, 44, 44, 121, 128, 46, 120, 155, 49, 44, + 44, 44, 124, 157, 46, 49, 156, 157, 155, 45, + 86, 49, 156, 45, 44, 44, 44, 45, 88, 46, + 158, 87, 49, 160, 45, 190, 190, 45, 95, 45, + 91, 49, 159, 123, 93, 44, 44, 44, 92, 122, + 46, 190, 191, 44, 44, 44, 49, 94, 46, 44, + 44, 44, 43, 96, 46, 83, 97, 81, 44, 44, + 44, 80, 71, 46, 44, 44, 44, 49, 43, 46, + 366, 44, 44, 44, 366, 49, 46, 44, 44, 44, + + 98, 49, 46, 44, 44, 44, 366, 366, 46, 366, + 49, 99, 101, 103, 366, 100, 49, 102, 366, 105, + 44, 44, 44, 49, 366, 46, 104, 366, 366, 49, + 366, 366, 107, 366, 366, 49, 366, 366, 44, 44, + 44, 366, 108, 46, 106, 73, 73, 73, 73, 366, + 366, 109, 49, 366, 366, 110, 111, 366, 68, 68, + 68, 68, 73, 73, 73, 73, 366, 112, 66, 366, + 49, 113, 366, 114, 64, 366, 65, 65, 65, 65, + 366, 366, 366, 72, 66, 72, 66, 366, 73, 73, + 73, 73, 64, 366, 67, 67, 67, 67, 68, 68, + + 68, 68, 66, 366, 66, 44, 44, 44, 66, 366, + 46, 44, 44, 44, 366, 366, 46, 44, 44, 44, + 66, 366, 46, 366, 66, 366, 366, 366, 44, 44, + 44, 366, 366, 46, 366, 366, 366, 49, 366, 44, + 44, 44, 366, 49, 131, 366, 125, 366, 366, 49, + 44, 44, 44, 366, 366, 46, 366, 366, 366, 366, + 49, 366, 366, 126, 129, 129, 129, 129, 366, 366, + 366, 49, 129, 129, 129, 129, 130, 366, 44, 44, + 44, 366, 49, 134, 366, 366, 129, 129, 129, 129, + 129, 129, 366, 44, 44, 44, 132, 133, 46, 44, + + 44, 44, 366, 366, 46, 366, 44, 44, 44, 366, + 49, 46, 44, 44, 44, 366, 366, 46, 44, 44, + 44, 366, 366, 46, 366, 49, 366, 366, 366, 135, + 366, 49, 44, 44, 44, 366, 136, 46, 49, 366, + 44, 44, 44, 366, 49, 46, 44, 44, 44, 366, + 49, 46, 44, 44, 44, 366, 366, 46, 366, 137, + 138, 366, 366, 366, 49, 366, 366, 366, 140, 366, + 139, 366, 49, 366, 44, 44, 44, 366, 49, 46, + 366, 141, 366, 366, 49, 366, 44, 44, 44, 366, + 144, 46, 366, 142, 44, 44, 44, 366, 366, 46, + + 366, 143, 44, 44, 44, 366, 49, 46, 44, 44, + 44, 366, 366, 46, 44, 44, 44, 366, 49, 46, + 145, 366, 44, 44, 44, 366, 49, 46, 44, 44, + 44, 366, 366, 46, 49, 366, 366, 366, 146, 366, + 49, 366, 366, 366, 147, 149, 49, 366, 44, 44, + 44, 366, 150, 46, 49, 366, 148, 366, 151, 366, + 49, 44, 44, 44, 366, 366, 46, 44, 44, 44, + 366, 152, 46, 44, 44, 44, 366, 366, 46, 366, + 49, 366, 366, 44, 44, 44, 366, 153, 46, 366, + 366, 366, 366, 49, 366, 44, 44, 44, 366, 49, + + 46, 366, 366, 366, 366, 49, 154, 366, 163, 366, + 164, 165, 165, 165, 165, 49, 366, 366, 366, 165, + 165, 165, 165, 44, 44, 44, 366, 49, 46, 167, + 366, 366, 366, 165, 165, 165, 165, 165, 165, 44, + 44, 44, 366, 366, 46, 366, 366, 166, 44, 44, + 44, 366, 366, 46, 366, 49, 44, 44, 44, 366, + 366, 46, 44, 44, 44, 366, 366, 46, 44, 44, + 44, 49, 366, 46, 366, 168, 44, 44, 44, 366, + 49, 46, 44, 44, 44, 366, 366, 46, 49, 366, + 366, 366, 169, 366, 49, 366, 366, 170, 366, 366, + + 49, 366, 366, 366, 366, 366, 172, 171, 49, 366, + 44, 44, 44, 366, 49, 46, 366, 173, 366, 44, + 44, 44, 366, 175, 46, 366, 174, 44, 44, 44, + 366, 366, 46, 44, 44, 44, 366, 366, 46, 44, + 44, 44, 49, 366, 46, 176, 366, 44, 44, 44, + 366, 49, 46, 44, 44, 44, 366, 366, 46, 49, + 366, 366, 44, 44, 44, 49, 179, 46, 366, 366, + 177, 49, 180, 178, 366, 44, 44, 44, 366, 49, + 46, 366, 182, 366, 366, 49, 366, 366, 181, 366, + 366, 366, 183, 366, 49, 44, 44, 44, 366, 366, + + 46, 366, 366, 44, 44, 44, 184, 49, 46, 44, + 44, 44, 366, 366, 46, 366, 366, 44, 44, 44, + 366, 366, 46, 185, 44, 44, 44, 49, 366, 46, + 366, 44, 44, 44, 366, 49, 46, 44, 44, 44, + 366, 49, 46, 44, 44, 44, 186, 197, 46, 49, + 366, 366, 366, 366, 366, 366, 49, 366, 187, 188, + 189, 366, 366, 49, 366, 366, 366, 194, 366, 49, + 366, 366, 366, 366, 366, 49, 366, 366, 366, 195, + 196, 196, 196, 196, 200, 366, 366, 366, 196, 196, + 196, 196, 44, 44, 44, 366, 366, 46, 366, 366, + + 366, 366, 196, 196, 196, 196, 196, 196, 44, 44, + 44, 366, 366, 46, 44, 44, 44, 366, 366, 46, + 44, 44, 44, 366, 49, 46, 366, 366, 366, 201, + 202, 198, 44, 44, 44, 366, 366, 46, 366, 366, + 49, 366, 44, 44, 44, 366, 49, 205, 366, 44, + 44, 44, 49, 366, 46, 44, 44, 44, 199, 366, + 46, 366, 203, 366, 49, 44, 44, 44, 366, 366, + 46, 44, 44, 44, 49, 366, 46, 44, 44, 44, + 366, 49, 46, 204, 206, 366, 366, 49, 44, 44, + 44, 366, 366, 46, 207, 366, 366, 49, 366, 44, + + 44, 44, 366, 49, 212, 366, 208, 366, 366, 49, + 44, 44, 44, 366, 209, 46, 210, 366, 366, 366, + 49, 44, 44, 44, 366, 366, 46, 44, 44, 44, + 366, 49, 46, 211, 44, 44, 44, 366, 366, 46, + 366, 366, 49, 44, 44, 44, 366, 366, 46, 44, + 44, 44, 366, 49, 46, 44, 44, 44, 366, 49, + 219, 366, 366, 213, 366, 366, 49, 214, 366, 44, + 44, 44, 366, 216, 46, 49, 366, 215, 366, 220, + 366, 49, 366, 44, 44, 44, 218, 49, 46, 366, + 44, 44, 44, 366, 366, 46, 217, 44, 44, 44, + + 366, 49, 46, 366, 44, 44, 44, 366, 366, 46, + 366, 44, 44, 44, 366, 49, 46, 366, 44, 44, + 44, 221, 49, 46, 366, 366, 366, 366, 366, 49, + 44, 44, 44, 366, 366, 46, 49, 224, 366, 366, + 366, 366, 366, 49, 225, 45, 45, 45, 45, 366, + 49, 366, 366, 45, 45, 45, 45, 226, 227, 44, + 44, 44, 49, 366, 230, 366, 228, 45, 45, 45, + 45, 45, 45, 366, 366, 229, 44, 44, 44, 366, + 366, 231, 44, 44, 44, 366, 366, 232, 44, 44, + 44, 49, 366, 46, 44, 44, 44, 366, 233, 46, + + 44, 44, 44, 366, 366, 46, 366, 366, 49, 366, + 44, 44, 44, 366, 49, 46, 44, 44, 44, 366, + 49, 46, 44, 44, 44, 366, 49, 46, 44, 44, + 44, 366, 49, 239, 44, 44, 44, 366, 366, 46, + 366, 366, 49, 366, 234, 366, 366, 366, 49, 236, + 235, 44, 44, 44, 49, 366, 46, 44, 44, 44, + 49, 366, 46, 44, 44, 44, 49, 366, 46, 44, + 44, 44, 238, 237, 46, 44, 44, 44, 366, 366, + 46, 366, 366, 49, 366, 366, 240, 366, 366, 49, + 241, 44, 44, 44, 366, 49, 46, 44, 44, 44, + + 242, 49, 46, 44, 44, 44, 366, 49, 46, 44, + 44, 44, 366, 366, 46, 243, 366, 366, 366, 366, + 366, 244, 366, 49, 366, 245, 366, 366, 246, 49, + 366, 366, 247, 366, 366, 49, 366, 44, 44, 44, + 366, 49, 46, 366, 249, 44, 44, 44, 366, 250, + 46, 44, 44, 44, 366, 366, 46, 366, 366, 44, + 44, 44, 366, 366, 46, 366, 366, 366, 366, 49, + 44, 44, 44, 366, 366, 46, 366, 49, 366, 44, + 44, 44, 366, 49, 46, 366, 251, 44, 44, 44, + 366, 49, 46, 366, 366, 366, 253, 252, 254, 44, + + 44, 44, 49, 366, 46, 366, 366, 44, 44, 44, + 366, 49, 46, 366, 366, 255, 44, 44, 44, 49, + 366, 260, 44, 44, 44, 366, 366, 261, 44, 44, + 44, 49, 366, 46, 366, 256, 366, 258, 257, 49, + 44, 44, 44, 366, 366, 46, 259, 366, 49, 366, + 44, 44, 44, 366, 49, 266, 262, 44, 44, 44, + 49, 366, 46, 44, 44, 44, 366, 265, 46, 44, + 44, 44, 49, 366, 46, 366, 44, 44, 44, 366, + 263, 46, 49, 44, 44, 44, 366, 366, 270, 49, + 366, 366, 264, 366, 366, 49, 366, 44, 44, 44, + + 366, 49, 271, 366, 366, 366, 267, 366, 49, 44, + 44, 44, 366, 366, 46, 49, 366, 268, 44, 44, + 44, 366, 366, 273, 366, 44, 44, 44, 269, 49, + 46, 44, 44, 44, 366, 274, 46, 44, 44, 44, + 366, 49, 46, 44, 44, 44, 366, 272, 277, 366, + 49, 44, 44, 44, 366, 366, 278, 49, 366, 366, + 44, 44, 44, 49, 366, 46, 44, 44, 44, 49, + 279, 280, 44, 44, 44, 49, 366, 46, 366, 366, + 276, 366, 366, 49, 366, 275, 44, 44, 44, 366, + 366, 46, 49, 366, 44, 44, 44, 366, 49, 46, + + 44, 44, 44, 366, 49, 46, 44, 44, 44, 366, + 366, 46, 44, 44, 44, 366, 366, 46, 49, 366, + 281, 366, 44, 44, 44, 282, 49, 46, 44, 44, + 44, 366, 49, 46, 44, 44, 44, 366, 49, 46, + 366, 366, 287, 366, 49, 366, 366, 284, 366, 366, + 283, 366, 285, 286, 49, 366, 366, 366, 366, 288, + 49, 289, 366, 290, 366, 366, 49, 44, 44, 44, + 366, 366, 46, 44, 44, 44, 366, 366, 46, 44, + 44, 44, 366, 366, 46, 291, 44, 44, 44, 366, + 366, 46, 44, 44, 44, 366, 366, 46, 366, 49, + + 366, 366, 44, 44, 44, 49, 292, 297, 366, 293, + 366, 49, 44, 44, 44, 366, 366, 46, 49, 366, + 44, 44, 44, 366, 49, 46, 366, 44, 44, 44, + 294, 366, 46, 366, 49, 295, 44, 44, 44, 366, + 366, 46, 296, 366, 49, 366, 366, 298, 44, 44, + 44, 366, 49, 46, 366, 44, 44, 44, 366, 49, + 46, 44, 44, 44, 366, 303, 46, 366, 49, 44, + 44, 44, 366, 366, 46, 301, 299, 300, 366, 366, + 49, 366, 366, 44, 44, 44, 366, 49, 46, 44, + 44, 44, 366, 49, 46, 366, 366, 44, 44, 44, + + 302, 49, 46, 44, 44, 44, 366, 366, 46, 44, + 44, 44, 366, 304, 46, 49, 366, 305, 44, 44, + 44, 49, 366, 46, 366, 44, 44, 44, 306, 49, + 46, 366, 366, 366, 366, 49, 308, 366, 366, 307, + 366, 49, 366, 44, 44, 44, 366, 366, 46, 366, + 49, 44, 44, 44, 366, 309, 46, 49, 366, 366, + 310, 314, 366, 366, 311, 44, 44, 44, 366, 366, + 46, 44, 44, 44, 312, 49, 46, 44, 44, 44, + 366, 366, 46, 49, 366, 44, 44, 44, 313, 366, + 46, 44, 44, 44, 366, 366, 319, 49, 366, 366, + + 44, 44, 44, 49, 315, 46, 366, 366, 316, 49, + 44, 44, 44, 366, 366, 46, 317, 49, 366, 44, + 44, 44, 318, 49, 46, 44, 44, 44, 366, 366, + 323, 366, 49, 366, 366, 320, 44, 44, 44, 366, + 366, 46, 49, 366, 44, 44, 44, 366, 366, 46, + 366, 49, 366, 44, 44, 44, 366, 49, 326, 366, + 321, 366, 322, 366, 44, 44, 44, 366, 49, 46, + 366, 366, 44, 44, 44, 324, 49, 46, 366, 44, + 44, 44, 366, 325, 46, 49, 44, 44, 44, 366, + 366, 330, 44, 44, 44, 366, 49, 46, 44, 44, + + 44, 327, 366, 46, 49, 44, 44, 44, 366, 366, + 46, 49, 44, 44, 44, 366, 366, 46, 49, 366, + 366, 329, 366, 366, 49, 366, 366, 328, 366, 366, + 49, 366, 366, 44, 44, 44, 331, 49, 335, 366, + 44, 44, 44, 366, 49, 336, 366, 366, 332, 44, + 44, 44, 366, 366, 46, 366, 44, 44, 44, 333, + 334, 46, 44, 44, 44, 49, 366, 46, 44, 44, + 44, 366, 49, 46, 44, 44, 44, 366, 366, 46, + 366, 49, 44, 44, 44, 366, 366, 46, 49, 366, + 366, 337, 366, 366, 49, 366, 366, 339, 366, 366, + + 49, 366, 366, 366, 366, 366, 49, 340, 338, 366, + 44, 44, 44, 366, 49, 46, 366, 341, 44, 44, + 44, 342, 366, 46, 44, 44, 44, 366, 366, 345, + 44, 44, 44, 366, 366, 46, 44, 44, 44, 366, + 366, 46, 49, 44, 44, 44, 366, 366, 46, 366, + 49, 366, 366, 344, 366, 366, 49, 343, 44, 44, + 44, 366, 49, 46, 44, 44, 44, 366, 49, 46, + 366, 44, 44, 44, 366, 49, 46, 346, 44, 44, + 44, 366, 348, 46, 44, 44, 44, 366, 347, 353, + 49, 366, 44, 44, 44, 366, 49, 46, 366, 44, + + 44, 44, 366, 49, 46, 366, 366, 366, 349, 366, + 49, 366, 44, 44, 44, 350, 49, 356, 351, 352, + 44, 44, 44, 366, 49, 46, 366, 44, 44, 44, + 366, 49, 46, 44, 44, 44, 366, 366, 359, 366, + 44, 44, 44, 354, 49, 360, 44, 44, 44, 366, + 355, 46, 49, 366, 366, 44, 44, 44, 366, 49, + 46, 357, 44, 44, 44, 49, 358, 46, 44, 44, + 44, 366, 49, 364, 366, 44, 44, 44, 49, 366, + 365, 366, 366, 366, 366, 361, 366, 49, 366, 366, + 366, 366, 366, 366, 49, 366, 366, 366, 366, 366, + + 49, 366, 366, 366, 366, 366, 362, 49, 366, 366, + 366, 366, 366, 363, 36, 36, 36, 36, 36, 36, + 36, 45, 45, 45, 45, 45, 45, 45, 63, 366, + 63, 63, 63, 63, 63, 82, 366, 82, 366, 82, + 82, 82, 84, 84, 84, 84, 84, 84, 84, 89, + 89, 89, 89, 89, 89, 89, 115, 366, 115, 115, + 115, 115, 115, 84, 84, 366, 84, 127, 127, 127, + 127, 127, 162, 162, 193, 193, 223, 223, 84, 84, + 11, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366 } ; -static const flex_int16_t yy_chk[2144] = +static const flex_int16_t yy_chk[2542] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1116,231 +1173,275 @@ static const flex_int16_t yy_chk[2144] = 5, 5, 5, 5, 10, 13, 26, 13, 5, 5, 9, 5, 21, 37, 5, 37, 5, 21, 5, 27, - 26, 31, 44, 208, 5, 5, 7, 10, 5, 28, + 26, 31, 44, 222, 5, 5, 7, 10, 5, 28, 8, 42, 5, 42, 32, 31, 17, 5, 17, 17, 17, 17, 27, 5, 5, 15, 15, 15, 17, 44, 15, 19, 28, 19, 19, 19, 19, 32, 20, 20, - 20, 20, 82, 19, 17, 33, 72, 25, 20, 25, - 15, 15, 25, 25, 25, 25, 181, 15, 153, 19, - 122, 117, 15, 15, 20, 15, 72, 15, 33, 82, - 15, 15, 15, 15, 15, 87, 15, 22, 15, 22, - 22, 22, 22, 45, 45, 45, 84, 74, 45, 22, - 47, 47, 47, 73, 75, 47, 48, 48, 48, 49, - - 113, 48, 77, 80, 76, 22, 49, 50, 50, 50, - 74, 112, 50, 73, 75, 45, 113, 111, 51, 51, - 51, 116, 47, 51, 76, 77, 49, 147, 48, 115, - 49, 112, 51, 79, 49, 48, 114, 116, 47, 50, - 111, 49, 50, 147, 49, 43, 49, 49, 150, 115, - 51, 52, 52, 52, 41, 50, 52, 51, 39, 114, - 51, 53, 53, 53, 150, 38, 53, 54, 54, 54, - 24, 14, 54, 55, 55, 55, 11, 0, 55, 56, - 56, 56, 0, 52, 56, 57, 57, 57, 0, 0, - 57, 0, 0, 53, 0, 0, 52, 0, 0, 54, - - 0, 58, 58, 58, 0, 55, 58, 0, 55, 53, - 54, 56, 0, 53, 56, 54, 0, 57, 59, 59, - 59, 55, 0, 59, 60, 60, 60, 0, 0, 60, - 88, 88, 88, 58, 0, 88, 58, 0, 57, 62, - 62, 62, 62, 0, 0, 0, 64, 0, 64, 62, - 59, 64, 64, 64, 64, 0, 60, 59, 70, 70, - 70, 70, 88, 0, 0, 62, 59, 0, 0, 0, - 59, 60, 0, 0, 63, 60, 63, 63, 63, 63, - 65, 0, 65, 65, 65, 65, 63, 66, 66, 66, - 66, 0, 65, 71, 71, 71, 71, 66, 85, 85, - - 85, 0, 63, 85, 86, 86, 86, 0, 65, 86, - 90, 90, 90, 66, 0, 90, 91, 91, 91, 0, - 0, 91, 92, 92, 92, 0, 0, 92, 0, 0, - 85, 0, 99, 99, 99, 0, 86, 99, 0, 85, - 0, 0, 90, 0, 95, 95, 95, 0, 91, 95, - 0, 0, 0, 0, 92, 0, 86, 89, 89, 89, - 89, 0, 91, 91, 99, 89, 89, 89, 89, 93, - 93, 93, 0, 99, 93, 0, 95, 0, 0, 89, - 89, 89, 89, 89, 89, 94, 94, 94, 0, 0, - 94, 96, 96, 96, 0, 0, 96, 95, 97, 97, - - 97, 93, 0, 97, 0, 93, 98, 98, 98, 0, - 0, 98, 0, 100, 100, 100, 0, 94, 100, 101, - 101, 101, 94, 96, 101, 0, 102, 102, 102, 0, - 97, 102, 103, 103, 103, 0, 0, 103, 98, 96, - 0, 0, 98, 0, 0, 100, 0, 104, 104, 104, - 97, 101, 104, 0, 105, 105, 105, 101, 102, 105, - 100, 106, 106, 106, 103, 0, 106, 0, 100, 107, - 107, 107, 102, 0, 107, 0, 0, 0, 0, 104, - 108, 108, 108, 0, 103, 108, 105, 109, 109, 109, - 0, 0, 109, 106, 0, 0, 0, 104, 106, 0, - - 0, 107, 0, 0, 120, 120, 120, 107, 105, 120, - 0, 0, 108, 0, 0, 121, 121, 121, 0, 109, - 121, 0, 0, 108, 0, 0, 109, 126, 126, 126, - 0, 0, 126, 127, 127, 127, 120, 0, 127, 129, - 129, 129, 0, 0, 129, 120, 0, 121, 0, 0, - 0, 0, 121, 124, 124, 124, 124, 0, 0, 126, - 0, 124, 124, 124, 124, 127, 0, 130, 130, 130, - 0, 129, 130, 126, 0, 124, 124, 124, 124, 124, - 124, 131, 131, 131, 0, 127, 131, 0, 0, 132, - 132, 132, 129, 0, 132, 133, 133, 133, 0, 130, - - 133, 0, 134, 134, 134, 0, 0, 134, 0, 135, - 135, 135, 0, 131, 135, 0, 130, 137, 137, 137, - 0, 132, 137, 136, 136, 136, 0, 133, 136, 0, - 0, 0, 131, 132, 134, 138, 138, 138, 0, 0, - 138, 135, 0, 0, 133, 0, 139, 139, 139, 137, - 135, 139, 134, 0, 0, 136, 0, 0, 136, 140, - 140, 140, 0, 0, 140, 0, 0, 138, 137, 0, - 0, 137, 0, 0, 138, 141, 141, 141, 139, 0, - 141, 142, 142, 142, 0, 139, 142, 143, 143, 143, - 0, 140, 143, 144, 144, 144, 0, 0, 144, 0, - - 145, 145, 145, 0, 0, 145, 0, 141, 140, 0, - 141, 0, 0, 142, 0, 0, 146, 146, 146, 143, - 142, 146, 155, 155, 155, 144, 0, 155, 156, 156, - 156, 143, 145, 156, 0, 158, 158, 158, 0, 0, - 158, 144, 0, 0, 0, 0, 0, 0, 146, 0, - 0, 160, 160, 160, 155, 145, 160, 159, 159, 159, - 156, 0, 159, 0, 0, 155, 146, 158, 0, 0, - 0, 0, 0, 0, 158, 0, 156, 157, 157, 157, - 157, 0, 0, 160, 0, 157, 157, 157, 157, 159, - 0, 0, 160, 161, 161, 161, 0, 0, 161, 157, - - 157, 157, 157, 157, 157, 0, 0, 159, 161, 161, - 162, 162, 162, 0, 0, 162, 163, 163, 163, 0, - 0, 163, 164, 164, 164, 161, 0, 164, 165, 165, - 165, 0, 0, 165, 166, 166, 166, 0, 0, 166, - 0, 0, 162, 0, 167, 167, 167, 0, 163, 167, - 0, 0, 162, 0, 164, 0, 168, 168, 168, 0, - 165, 168, 0, 165, 0, 0, 166, 163, 0, 169, - 169, 169, 0, 166, 169, 0, 167, 170, 170, 170, - 0, 0, 170, 0, 0, 167, 0, 0, 168, 171, - 171, 171, 0, 0, 171, 172, 172, 172, 0, 168, - - 172, 169, 0, 0, 0, 173, 173, 173, 169, 170, - 173, 174, 174, 174, 0, 0, 174, 0, 175, 175, - 175, 171, 170, 175, 176, 176, 176, 172, 0, 176, - 177, 177, 177, 0, 0, 177, 0, 173, 0, 178, - 178, 178, 0, 174, 178, 0, 0, 0, 172, 178, - 175, 173, 0, 183, 183, 183, 176, 175, 183, 0, - 0, 174, 177, 184, 184, 184, 0, 0, 184, 0, - 0, 178, 0, 188, 188, 188, 0, 176, 188, 0, - 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, - 0, 0, 186, 186, 186, 184, 0, 186, 0, 0, - - 183, 0, 0, 0, 0, 188, 0, 0, 0, 0, - 184, 185, 185, 185, 185, 0, 0, 0, 188, 185, - 185, 185, 185, 0, 186, 187, 187, 187, 0, 0, - 187, 0, 0, 185, 185, 185, 185, 185, 185, 186, - 189, 189, 189, 0, 0, 189, 190, 190, 190, 0, - 0, 190, 0, 191, 191, 191, 0, 187, 191, 192, - 192, 192, 0, 0, 192, 194, 194, 194, 0, 192, - 194, 0, 189, 187, 195, 195, 195, 0, 190, 195, - 0, 196, 196, 196, 0, 191, 196, 197, 197, 197, - 0, 192, 197, 198, 198, 198, 0, 194, 198, 199, - - 199, 199, 0, 0, 199, 0, 195, 201, 201, 201, - 0, 0, 201, 196, 0, 194, 202, 202, 202, 197, - 196, 202, 0, 0, 195, 198, 0, 0, 203, 203, - 203, 199, 0, 203, 0, 204, 204, 204, 0, 201, - 204, 0, 0, 198, 197, 205, 205, 205, 202, 0, - 205, 207, 207, 207, 0, 202, 207, 0, 0, 201, - 203, 210, 210, 210, 0, 0, 210, 204, 211, 211, - 211, 203, 0, 211, 212, 212, 212, 205, 0, 212, - 213, 213, 213, 207, 0, 213, 0, 204, 207, 214, - 214, 214, 0, 210, 214, 0, 0, 205, 0, 0, - - 211, 0, 210, 0, 0, 0, 212, 0, 211, 218, - 218, 218, 213, 0, 218, 219, 219, 219, 0, 0, - 219, 214, 0, 0, 0, 213, 212, 0, 214, 220, - 220, 220, 0, 0, 220, 221, 221, 221, 0, 0, - 221, 218, 0, 222, 222, 222, 0, 219, 222, 0, - 0, 223, 223, 223, 218, 0, 223, 225, 225, 225, - 0, 220, 225, 226, 226, 226, 0, 221, 226, 0, - 0, 219, 0, 221, 0, 222, 227, 227, 227, 0, - 220, 227, 222, 223, 0, 229, 229, 229, 0, 225, - 229, 225, 228, 228, 228, 226, 0, 228, 230, 230, - - 230, 0, 228, 230, 232, 232, 232, 0, 227, 232, - 0, 233, 233, 233, 0, 226, 233, 229, 234, 234, - 234, 0, 0, 234, 228, 0, 0, 0, 227, 0, - 230, 0, 235, 235, 235, 0, 232, 235, 0, 236, - 236, 236, 235, 233, 236, 0, 230, 237, 237, 237, - 234, 0, 237, 238, 238, 238, 0, 0, 238, 0, - 239, 239, 239, 0, 235, 239, 0, 240, 240, 240, - 0, 236, 240, 241, 241, 241, 0, 240, 241, 237, - 0, 244, 244, 244, 0, 238, 244, 0, 0, 0, - 237, 0, 239, 236, 0, 245, 245, 245, 0, 240, - - 245, 246, 246, 246, 0, 241, 246, 247, 247, 247, - 0, 0, 247, 244, 249, 249, 249, 0, 0, 249, - 253, 253, 253, 0, 0, 253, 0, 245, 0, 244, - 254, 254, 254, 246, 245, 254, 255, 255, 255, 247, - 0, 255, 258, 258, 258, 0, 249, 258, 260, 260, - 260, 0, 253, 260, 247, 0, 0, 246, 0, 247, - 247, 249, 254, 0, 0, 0, 0, 0, 255, 254, - 0, 253, 255, 0, 258, 0, 261, 261, 261, 0, - 260, 261, 262, 262, 262, 0, 0, 262, 0, 263, - 263, 263, 0, 258, 263, 0, 0, 260, 264, 264, - - 264, 0, 0, 264, 0, 265, 265, 265, 261, 0, - 265, 266, 266, 266, 262, 0, 266, 267, 267, 267, - 0, 263, 267, 0, 263, 0, 261, 268, 268, 268, - 264, 0, 268, 0, 269, 269, 269, 265, 0, 269, - 0, 0, 0, 266, 0, 0, 270, 270, 270, 267, - 0, 270, 0, 0, 264, 265, 271, 271, 271, 268, - 0, 271, 0, 266, 0, 267, 269, 0, 272, 272, - 272, 0, 268, 272, 274, 274, 274, 0, 270, 274, - 0, 275, 275, 275, 269, 270, 275, 0, 271, 276, - 276, 276, 0, 0, 276, 0, 277, 277, 277, 0, - - 272, 277, 0, 0, 0, 0, 274, 0, 271, 278, - 278, 278, 0, 275, 278, 0, 0, 0, 0, 272, - 274, 276, 279, 279, 279, 0, 0, 279, 277, 0, - 275, 280, 280, 280, 276, 277, 280, 281, 281, 281, - 0, 278, 281, 282, 282, 282, 278, 0, 282, 0, - 283, 283, 283, 0, 279, 283, 284, 284, 284, 0, - 0, 284, 0, 280, 0, 0, 280, 0, 0, 281, - 0, 285, 285, 285, 0, 282, 285, 0, 0, 286, - 286, 286, 283, 0, 286, 0, 282, 281, 284, 287, - 287, 287, 0, 0, 287, 284, 288, 288, 288, 0, - - 0, 288, 0, 285, 290, 290, 290, 0, 0, 290, - 285, 286, 0, 291, 291, 291, 0, 0, 291, 0, - 0, 287, 0, 0, 292, 292, 292, 0, 288, 292, - 294, 294, 294, 0, 0, 294, 290, 295, 295, 295, - 288, 0, 295, 0, 287, 291, 297, 297, 297, 0, - 0, 297, 0, 0, 290, 0, 292, 0, 298, 298, - 298, 0, 294, 298, 0, 0, 0, 291, 0, 295, - 0, 0, 292, 0, 299, 299, 299, 0, 297, 299, - 300, 300, 300, 0, 0, 300, 301, 301, 301, 0, - 298, 301, 0, 0, 304, 304, 304, 298, 297, 304, - - 305, 305, 305, 0, 0, 305, 299, 0, 306, 306, - 306, 0, 300, 306, 0, 0, 0, 299, 301, 300, - 0, 0, 307, 307, 307, 0, 304, 307, 0, 308, - 308, 308, 305, 301, 308, 0, 310, 310, 310, 0, - 306, 310, 0, 311, 311, 311, 0, 306, 311, 0, - 0, 0, 305, 0, 307, 312, 312, 312, 0, 0, - 312, 308, 0, 0, 313, 313, 313, 0, 310, 313, - 0, 0, 307, 0, 0, 311, 315, 315, 315, 0, - 308, 315, 0, 316, 316, 316, 0, 312, 316, 0, - 0, 0, 0, 0, 311, 0, 313, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 312, 0, 315, 0, - 0, 0, 0, 0, 0, 316, 321, 321, 321, 321, - 321, 321, 321, 322, 322, 322, 322, 322, 322, 322, - 323, 0, 323, 323, 323, 323, 323, 324, 0, 324, - 0, 324, 324, 324, 325, 325, 325, 325, 325, 325, - 325, 326, 326, 326, 326, 326, 326, 326, 327, 0, - 327, 327, 327, 327, 327, 328, 328, 0, 328, 329, - 329, 329, 329, 329, 330, 330, 331, 331, 332, 332, - 333, 333, 320, 320, 320, 320, 320, 320, 320, 320, - 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, - - 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, - 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, - 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, - 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, - 320, 320, 320 + 20, 20, 192, 19, 17, 33, 74, 25, 20, 25, + 15, 15, 25, 25, 25, 25, 161, 15, 76, 19, + 127, 15, 15, 15, 20, 15, 74, 15, 33, 75, + 15, 15, 15, 15, 15, 122, 15, 77, 15, 15, + 22, 76, 22, 22, 22, 22, 45, 45, 45, 75, + 79, 45, 22, 47, 47, 47, 78, 77, 47, 48, + + 48, 48, 49, 84, 48, 116, 117, 118, 22, 49, + 50, 50, 50, 79, 89, 50, 78, 119, 45, 51, + 51, 51, 86, 118, 51, 47, 117, 121, 116, 49, + 84, 48, 120, 49, 52, 52, 52, 49, 48, 52, + 119, 47, 50, 121, 49, 155, 158, 49, 52, 49, + 49, 51, 120, 82, 51, 53, 53, 53, 50, 81, + 53, 155, 158, 54, 54, 54, 52, 51, 54, 55, + 55, 55, 43, 52, 55, 41, 52, 39, 56, 56, + 56, 38, 24, 56, 57, 57, 57, 53, 14, 57, + 11, 58, 58, 58, 0, 54, 58, 59, 59, 59, + + 53, 55, 59, 60, 60, 60, 0, 0, 60, 0, + 56, 54, 55, 56, 0, 54, 57, 55, 0, 57, + 61, 61, 61, 58, 0, 61, 56, 0, 0, 59, + 0, 0, 59, 0, 0, 60, 0, 0, 62, 62, + 62, 0, 60, 62, 58, 72, 72, 72, 72, 0, + 0, 60, 61, 0, 0, 60, 60, 0, 64, 64, + 64, 64, 73, 73, 73, 73, 0, 61, 64, 0, + 62, 61, 0, 62, 65, 0, 65, 65, 65, 65, + 0, 0, 0, 66, 64, 66, 65, 0, 66, 66, + 66, 66, 67, 0, 67, 67, 67, 67, 68, 68, + + 68, 68, 65, 0, 67, 87, 87, 87, 68, 0, + 87, 88, 88, 88, 0, 0, 88, 90, 90, 90, + 67, 0, 90, 0, 68, 0, 0, 0, 92, 92, + 92, 0, 0, 92, 0, 0, 0, 87, 0, 93, + 93, 93, 0, 88, 93, 0, 87, 0, 0, 90, + 94, 94, 94, 0, 0, 94, 0, 0, 0, 0, + 92, 0, 0, 88, 91, 91, 91, 91, 0, 0, + 0, 93, 91, 91, 91, 91, 92, 0, 95, 95, + 95, 0, 94, 95, 0, 0, 91, 91, 91, 91, + 91, 91, 0, 96, 96, 96, 94, 94, 96, 97, + + 97, 97, 0, 0, 97, 0, 98, 98, 98, 0, + 95, 98, 99, 99, 99, 0, 0, 99, 100, 100, + 100, 0, 0, 100, 0, 96, 0, 0, 0, 96, + 0, 97, 101, 101, 101, 0, 97, 101, 98, 0, + 102, 102, 102, 0, 99, 102, 103, 103, 103, 0, + 100, 103, 104, 104, 104, 0, 0, 104, 0, 98, + 99, 0, 0, 0, 101, 0, 0, 0, 101, 0, + 100, 0, 102, 0, 105, 105, 105, 0, 103, 105, + 0, 102, 0, 0, 104, 0, 106, 106, 106, 0, + 104, 106, 0, 103, 107, 107, 107, 0, 0, 107, + + 0, 103, 108, 108, 108, 0, 105, 108, 109, 109, + 109, 0, 0, 109, 110, 110, 110, 0, 106, 110, + 105, 0, 111, 111, 111, 0, 107, 111, 112, 112, + 112, 0, 0, 112, 108, 0, 0, 0, 106, 0, + 109, 0, 0, 0, 107, 109, 110, 0, 113, 113, + 113, 0, 110, 113, 111, 0, 108, 0, 111, 0, + 112, 114, 114, 114, 0, 0, 114, 125, 125, 125, + 0, 112, 125, 126, 126, 126, 0, 0, 126, 0, + 113, 0, 0, 132, 132, 132, 0, 113, 132, 0, + 0, 0, 0, 114, 0, 130, 130, 130, 0, 125, + + 130, 0, 0, 0, 0, 126, 114, 0, 125, 0, + 126, 129, 129, 129, 129, 132, 0, 0, 0, 129, + 129, 129, 129, 133, 133, 133, 0, 130, 133, 132, + 0, 0, 0, 129, 129, 129, 129, 129, 129, 135, + 135, 135, 0, 0, 135, 0, 0, 130, 136, 136, + 136, 0, 0, 136, 0, 133, 137, 137, 137, 0, + 0, 137, 138, 138, 138, 0, 0, 138, 139, 139, + 139, 135, 0, 139, 0, 133, 140, 140, 140, 0, + 136, 140, 141, 141, 141, 0, 0, 141, 137, 0, + 0, 0, 135, 0, 138, 0, 0, 136, 0, 0, + + 139, 0, 0, 0, 0, 0, 138, 137, 140, 0, + 142, 142, 142, 0, 141, 142, 0, 139, 0, 143, + 143, 143, 0, 141, 143, 0, 140, 144, 144, 144, + 0, 0, 144, 145, 145, 145, 0, 0, 145, 146, + 146, 146, 142, 0, 146, 142, 0, 147, 147, 147, + 0, 143, 147, 148, 148, 148, 0, 0, 148, 144, + 0, 0, 149, 149, 149, 145, 144, 149, 0, 0, + 143, 146, 145, 143, 0, 150, 150, 150, 0, 147, + 150, 0, 147, 0, 0, 148, 0, 0, 146, 0, + 0, 0, 148, 0, 149, 151, 151, 151, 0, 0, + + 151, 0, 0, 152, 152, 152, 149, 150, 152, 153, + 153, 153, 0, 0, 153, 0, 0, 154, 154, 154, + 0, 0, 154, 150, 163, 163, 163, 151, 0, 163, + 0, 164, 164, 164, 0, 152, 164, 166, 166, 166, + 0, 153, 166, 169, 169, 169, 151, 166, 169, 154, + 0, 0, 0, 0, 0, 0, 163, 0, 152, 153, + 154, 0, 0, 164, 0, 0, 0, 163, 0, 166, + 0, 0, 0, 0, 0, 169, 0, 0, 0, 164, + 165, 165, 165, 165, 169, 0, 0, 0, 165, 165, + 165, 165, 167, 167, 167, 0, 0, 167, 0, 0, + + 0, 0, 165, 165, 165, 165, 165, 165, 168, 168, + 168, 0, 0, 168, 170, 170, 170, 0, 0, 170, + 171, 171, 171, 0, 167, 171, 0, 0, 0, 170, + 170, 167, 172, 172, 172, 0, 0, 172, 0, 0, + 168, 0, 173, 173, 173, 0, 170, 173, 0, 174, + 174, 174, 171, 0, 174, 175, 175, 175, 168, 0, + 175, 0, 171, 0, 172, 176, 176, 176, 0, 0, + 176, 177, 177, 177, 173, 0, 177, 178, 178, 178, + 0, 174, 178, 172, 174, 0, 0, 175, 179, 179, + 179, 0, 0, 179, 175, 0, 0, 176, 0, 180, + + 180, 180, 0, 177, 180, 0, 176, 0, 0, 178, + 181, 181, 181, 0, 177, 181, 178, 0, 0, 0, + 179, 182, 182, 182, 0, 0, 182, 183, 183, 183, + 0, 180, 183, 179, 184, 184, 184, 0, 0, 184, + 0, 0, 181, 185, 185, 185, 0, 0, 185, 186, + 186, 186, 0, 182, 186, 187, 187, 187, 0, 183, + 187, 0, 0, 181, 0, 0, 184, 182, 0, 188, + 188, 188, 0, 184, 188, 185, 0, 183, 0, 188, + 0, 186, 0, 189, 189, 189, 186, 187, 189, 0, + 194, 194, 194, 0, 0, 194, 185, 195, 195, 195, + + 0, 188, 195, 0, 197, 197, 197, 0, 0, 197, + 0, 198, 198, 198, 0, 189, 198, 0, 199, 199, + 199, 189, 194, 199, 0, 0, 0, 0, 0, 195, + 200, 200, 200, 0, 0, 200, 197, 194, 0, 0, + 0, 0, 0, 198, 195, 196, 196, 196, 196, 0, + 199, 0, 0, 196, 196, 196, 196, 197, 198, 201, + 201, 201, 200, 0, 201, 0, 199, 196, 196, 196, + 196, 196, 196, 0, 0, 200, 202, 202, 202, 0, + 0, 202, 203, 203, 203, 0, 0, 203, 204, 204, + 204, 201, 0, 204, 206, 206, 206, 0, 204, 206, + + 207, 207, 207, 0, 0, 207, 0, 0, 202, 0, + 208, 208, 208, 0, 203, 208, 209, 209, 209, 0, + 204, 209, 210, 210, 210, 0, 206, 210, 211, 211, + 211, 0, 207, 211, 213, 213, 213, 0, 0, 213, + 0, 0, 208, 0, 206, 0, 0, 0, 209, 208, + 207, 214, 214, 214, 210, 0, 214, 215, 215, 215, + 211, 0, 215, 216, 216, 216, 213, 0, 216, 217, + 217, 217, 210, 209, 217, 218, 218, 218, 0, 0, + 218, 0, 0, 214, 0, 0, 213, 0, 0, 215, + 214, 220, 220, 220, 0, 216, 220, 221, 221, 221, + + 215, 217, 221, 224, 224, 224, 0, 218, 224, 225, + 225, 225, 0, 0, 225, 216, 0, 0, 0, 0, + 0, 217, 0, 220, 0, 218, 0, 0, 220, 221, + 0, 0, 221, 0, 0, 224, 0, 226, 226, 226, + 0, 225, 226, 0, 224, 227, 227, 227, 0, 225, + 227, 228, 228, 228, 0, 0, 228, 0, 0, 229, + 229, 229, 0, 0, 229, 0, 0, 0, 0, 226, + 233, 233, 233, 0, 0, 233, 0, 227, 0, 234, + 234, 234, 0, 228, 234, 0, 226, 235, 235, 235, + 0, 229, 235, 0, 0, 0, 228, 227, 229, 236, + + 236, 236, 233, 0, 236, 0, 0, 237, 237, 237, + 0, 234, 237, 0, 0, 233, 238, 238, 238, 235, + 0, 238, 240, 240, 240, 0, 0, 240, 241, 241, + 241, 236, 0, 241, 0, 234, 0, 236, 235, 237, + 242, 242, 242, 0, 0, 242, 237, 0, 238, 0, + 244, 244, 244, 0, 240, 244, 240, 243, 243, 243, + 241, 0, 243, 245, 245, 245, 0, 243, 245, 246, + 246, 246, 242, 0, 246, 0, 247, 247, 247, 0, + 241, 247, 244, 249, 249, 249, 0, 0, 249, 243, + 0, 0, 242, 0, 0, 245, 0, 250, 250, 250, + + 0, 246, 250, 0, 0, 0, 245, 0, 247, 251, + 251, 251, 0, 0, 251, 249, 0, 246, 252, 252, + 252, 0, 0, 252, 0, 253, 253, 253, 247, 250, + 253, 254, 254, 254, 0, 253, 254, 255, 255, 255, + 0, 251, 255, 256, 256, 256, 0, 251, 256, 0, + 252, 257, 257, 257, 0, 0, 257, 253, 0, 0, + 258, 258, 258, 254, 0, 258, 259, 259, 259, 255, + 258, 259, 262, 262, 262, 256, 0, 262, 0, 0, + 255, 0, 0, 257, 0, 254, 263, 263, 263, 0, + 0, 263, 258, 0, 264, 264, 264, 0, 259, 264, + + 265, 265, 265, 0, 262, 265, 267, 267, 267, 0, + 0, 267, 268, 268, 268, 0, 0, 268, 263, 0, + 262, 0, 269, 269, 269, 263, 264, 269, 272, 272, + 272, 0, 265, 272, 274, 274, 274, 0, 267, 274, + 0, 0, 267, 0, 268, 0, 0, 265, 0, 0, + 264, 0, 265, 265, 269, 0, 0, 0, 0, 268, + 272, 269, 0, 272, 0, 0, 274, 275, 275, 275, + 0, 0, 275, 276, 276, 276, 0, 0, 276, 279, + 279, 279, 0, 0, 279, 274, 281, 281, 281, 0, + 0, 281, 282, 282, 282, 0, 0, 282, 0, 275, + + 0, 0, 283, 283, 283, 276, 275, 283, 0, 276, + 0, 279, 284, 284, 284, 0, 0, 284, 281, 0, + 285, 285, 285, 0, 282, 285, 0, 286, 286, 286, + 279, 0, 286, 0, 283, 281, 287, 287, 287, 0, + 0, 287, 282, 0, 284, 0, 0, 284, 288, 288, + 288, 0, 285, 288, 0, 289, 289, 289, 0, 286, + 289, 290, 290, 290, 0, 289, 290, 0, 287, 291, + 291, 291, 0, 0, 291, 287, 285, 286, 0, 0, + 288, 0, 0, 292, 292, 292, 0, 289, 292, 293, + 293, 293, 0, 290, 293, 0, 0, 294, 294, 294, + + 288, 291, 294, 295, 295, 295, 0, 0, 295, 296, + 296, 296, 0, 290, 296, 292, 0, 291, 298, 298, + 298, 293, 0, 298, 0, 299, 299, 299, 292, 294, + 299, 0, 0, 0, 0, 295, 294, 0, 0, 293, + 0, 296, 0, 300, 300, 300, 0, 0, 300, 0, + 298, 301, 301, 301, 0, 295, 301, 299, 0, 0, + 296, 301, 0, 0, 298, 302, 302, 302, 0, 0, + 302, 303, 303, 303, 299, 300, 303, 304, 304, 304, + 0, 0, 304, 301, 0, 305, 305, 305, 300, 0, + 305, 306, 306, 306, 0, 0, 306, 302, 0, 0, + + 307, 307, 307, 303, 302, 307, 0, 0, 303, 304, + 308, 308, 308, 0, 0, 308, 304, 305, 0, 309, + 309, 309, 305, 306, 309, 310, 310, 310, 0, 0, + 310, 0, 307, 0, 0, 307, 311, 311, 311, 0, + 0, 311, 308, 0, 312, 312, 312, 0, 0, 312, + 0, 309, 0, 313, 313, 313, 0, 310, 313, 0, + 308, 0, 309, 0, 314, 314, 314, 0, 311, 314, + 0, 0, 315, 315, 315, 311, 312, 315, 0, 316, + 316, 316, 0, 312, 316, 313, 317, 317, 317, 0, + 0, 317, 318, 318, 318, 0, 314, 318, 320, 320, + + 320, 314, 0, 320, 315, 321, 321, 321, 0, 0, + 321, 316, 322, 322, 322, 0, 0, 322, 317, 0, + 0, 316, 0, 0, 318, 0, 0, 315, 0, 0, + 320, 0, 0, 324, 324, 324, 318, 321, 324, 0, + 325, 325, 325, 0, 322, 325, 0, 0, 320, 327, + 327, 327, 0, 0, 327, 0, 328, 328, 328, 321, + 322, 328, 329, 329, 329, 324, 0, 329, 331, 331, + 331, 0, 325, 331, 332, 332, 332, 0, 0, 332, + 0, 327, 333, 333, 333, 0, 0, 333, 328, 0, + 0, 327, 0, 0, 329, 0, 0, 329, 0, 0, + + 331, 0, 0, 0, 0, 0, 332, 331, 328, 0, + 334, 334, 334, 0, 333, 334, 0, 332, 337, 337, + 337, 333, 0, 337, 338, 338, 338, 0, 0, 338, + 339, 339, 339, 0, 0, 339, 340, 340, 340, 0, + 0, 340, 334, 341, 341, 341, 0, 0, 341, 0, + 337, 0, 0, 337, 0, 0, 338, 334, 342, 342, + 342, 0, 339, 342, 343, 343, 343, 0, 340, 343, + 0, 344, 344, 344, 0, 341, 344, 339, 346, 346, + 346, 0, 341, 346, 347, 347, 347, 0, 340, 347, + 342, 0, 348, 348, 348, 0, 343, 348, 0, 349, + + 349, 349, 0, 344, 349, 0, 0, 0, 342, 0, + 346, 0, 350, 350, 350, 343, 347, 350, 344, 346, + 351, 351, 351, 0, 348, 351, 0, 352, 352, 352, + 0, 349, 352, 354, 354, 354, 0, 0, 354, 0, + 355, 355, 355, 348, 350, 355, 357, 357, 357, 0, + 349, 357, 351, 0, 0, 358, 358, 358, 0, 352, + 358, 351, 361, 361, 361, 354, 352, 361, 362, 362, + 362, 0, 355, 362, 0, 363, 363, 363, 357, 0, + 363, 0, 0, 0, 0, 357, 0, 358, 0, 0, + 0, 0, 0, 0, 361, 0, 0, 0, 0, 0, + + 362, 0, 0, 0, 0, 0, 358, 363, 0, 0, + 0, 0, 0, 361, 367, 367, 367, 367, 367, 367, + 367, 368, 368, 368, 368, 368, 368, 368, 369, 0, + 369, 369, 369, 369, 369, 370, 0, 370, 0, 370, + 370, 370, 371, 371, 371, 371, 371, 371, 371, 372, + 372, 372, 372, 372, 372, 372, 373, 0, 373, 373, + 373, 373, 373, 374, 374, 0, 374, 375, 375, 375, + 375, 375, 376, 376, 377, 377, 378, 378, 379, 379, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366 } ; static yy_state_type yy_last_accepting_state; @@ -1349,14 +1450,15 @@ static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 1; -static const flex_int16_t yy_rule_linenum[59] = +static const flex_int16_t yy_rule_linenum[62] = { 0, 133, 135, 137, 142, 143, 148, 149, 150, 162, 165, - 170, 177, 186, 198, 210, 219, 228, 237, 246, 255, - 264, 273, 282, 291, 300, 309, 318, 327, 336, 345, - 354, 363, 372, 381, 390, 399, 408, 417, 426, 435, - 444, 543, 548, 553, 558, 559, 560, 561, 562, 563, - 565, 583, 596, 601, 605, 607, 609, 611 + 170, 177, 186, 198, 210, 220, 230, 240, 249, 258, + 267, 276, 285, 294, 303, 312, 321, 330, 339, 348, + 357, 366, 375, 384, 393, 402, 411, 420, 429, 438, + 447, 456, 465, 474, 573, 578, 583, 588, 589, 590, + 591, 592, 593, 595, 613, 626, 631, 635, 637, 639, + 641 } ; /* The intent behind this definition is that it'll catch @@ -1411,7 +1513,7 @@ using isc::netconf::NetconfParser; /* To avoid the call to exit... oops! */ #define YY_FATAL_ERROR(msg) isc::netconf::ParserContext::fatal(msg) -#line 1414 "netconf_lexer.cc" +#line 1516 "netconf_lexer.cc" /* noyywrap disables automatic rewinding for the next file to parse. Since we always parse only a single string, there's no need to do any wraps. And using yywrap requires linking with -lfl, which provides the default yywrap @@ -1437,8 +1539,8 @@ using isc::netconf::NetconfParser; by moving it ahead by yyleng bytes. yyleng specifies the length of the currently matched token. */ #define YY_USER_ACTION driver.loc_.columns(yyleng); -#line 1440 "netconf_lexer.cc" -#line 1441 "netconf_lexer.cc" +#line 1542 "netconf_lexer.cc" +#line 1543 "netconf_lexer.cc" #define INITIAL 0 #define COMMENT 1 @@ -1734,9 +1836,9 @@ YY_DECL /* We currently have 3 points of entries defined: START_JSON - which expects any valid JSON - START_NETCONF - which expects full configuration (with outer map and Control-netconf + START_NETCONF - which expects full configuration (with outer map and Netconf object in it. - START_SUB_NETCONF - which expects only content of the Control-netconf, this is + START_SUB_NETCONF - which expects only content of the Netconf, this is primarily useful for testing. */ if (start_token_flag) { start_token_flag = false; @@ -1752,7 +1854,7 @@ YY_DECL } -#line 1755 "netconf_lexer.cc" +#line 1857 "netconf_lexer.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -1781,13 +1883,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 321 ) + if ( yy_current_state >= 367 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 320 ); + while ( yy_current_state != 366 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -1806,13 +1908,13 @@ do_action: /* This label is used only to access EOF actions. */ { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 59 ) + else if ( yy_act < 62 ) fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n", (long)yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 59 ) + else if ( yy_act == 62 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 60 ) + else if ( yy_act == 63 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -1961,6 +2063,45 @@ YY_RULE_SETUP case 15: YY_RULE_SETUP #line 210 "netconf_lexer.ll" +{ + switch(driver.ctx_) { + case ParserContext::NETCONF: + case ParserContext::SERVER: + return NetconfParser::make_BOOT_UPDATE(driver.loc_); + default: + return NetconfParser::make_STRING("boot-update", driver.loc_); + } +} + YY_BREAK +case 16: +YY_RULE_SETUP +#line 220 "netconf_lexer.ll" +{ + switch(driver.ctx_) { + case ParserContext::NETCONF: + case ParserContext::SERVER: + return NetconfParser::make_SUBSCRIBE_CHANGES(driver.loc_); + default: + return NetconfParser::make_STRING("subscribe-changes", driver.loc_); + } +} + YY_BREAK +case 17: +YY_RULE_SETUP +#line 230 "netconf_lexer.ll" +{ + switch(driver.ctx_) { + case ParserContext::NETCONF: + case ParserContext::SERVER: + return NetconfParser::make_VALIDATE_CHANGES(driver.loc_); + default: + return NetconfParser::make_STRING("validate-changes", driver.loc_); + } +} + YY_BREAK +case 18: +YY_RULE_SETUP +#line 240 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::NETCONF: @@ -1970,9 +2111,9 @@ YY_RULE_SETUP } } YY_BREAK -case 16: +case 19: YY_RULE_SETUP -#line 219 "netconf_lexer.ll" +#line 249 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::MANAGED_SERVERS: @@ -1982,9 +2123,9 @@ YY_RULE_SETUP } } YY_BREAK -case 17: +case 20: YY_RULE_SETUP -#line 228 "netconf_lexer.ll" +#line 258 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::MANAGED_SERVERS: @@ -1994,9 +2135,9 @@ YY_RULE_SETUP } } YY_BREAK -case 18: +case 21: YY_RULE_SETUP -#line 237 "netconf_lexer.ll" +#line 267 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::MANAGED_SERVERS: @@ -2006,9 +2147,9 @@ YY_RULE_SETUP } } YY_BREAK -case 19: +case 22: YY_RULE_SETUP -#line 246 "netconf_lexer.ll" +#line 276 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::MANAGED_SERVERS: @@ -2018,9 +2159,9 @@ YY_RULE_SETUP } } YY_BREAK -case 20: +case 23: YY_RULE_SETUP -#line 255 "netconf_lexer.ll" +#line 285 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::SERVER: @@ -2030,9 +2171,9 @@ YY_RULE_SETUP } } YY_BREAK -case 21: +case 24: YY_RULE_SETUP -#line 264 "netconf_lexer.ll" +#line 294 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::SERVER: @@ -2042,9 +2183,9 @@ YY_RULE_SETUP } } YY_BREAK -case 22: +case 25: YY_RULE_SETUP -#line 273 "netconf_lexer.ll" +#line 303 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::SOCKET_TYPE: @@ -2054,9 +2195,9 @@ YY_RULE_SETUP } } YY_BREAK -case 23: +case 26: YY_RULE_SETUP -#line 282 "netconf_lexer.ll" +#line 312 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::SOCKET_TYPE: @@ -2066,9 +2207,9 @@ YY_RULE_SETUP } } YY_BREAK -case 24: +case 27: YY_RULE_SETUP -#line 291 "netconf_lexer.ll" +#line 321 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::SOCKET_TYPE: @@ -2078,9 +2219,9 @@ YY_RULE_SETUP } } YY_BREAK -case 25: +case 28: YY_RULE_SETUP -#line 300 "netconf_lexer.ll" +#line 330 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::CONTROL_SOCKET: @@ -2090,9 +2231,9 @@ YY_RULE_SETUP } } YY_BREAK -case 26: +case 29: YY_RULE_SETUP -#line 309 "netconf_lexer.ll" +#line 339 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::CONTROL_SOCKET: @@ -2102,9 +2243,9 @@ YY_RULE_SETUP } } YY_BREAK -case 27: +case 30: YY_RULE_SETUP -#line 318 "netconf_lexer.ll" +#line 348 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::CONTROL_SOCKET: @@ -2114,9 +2255,9 @@ YY_RULE_SETUP } } YY_BREAK -case 28: +case 31: YY_RULE_SETUP -#line 327 "netconf_lexer.ll" +#line 357 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::NETCONF: @@ -2126,9 +2267,9 @@ YY_RULE_SETUP } } YY_BREAK -case 29: +case 32: YY_RULE_SETUP -#line 336 "netconf_lexer.ll" +#line 366 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::HOOKS_LIBRARIES: @@ -2138,9 +2279,9 @@ YY_RULE_SETUP } } YY_BREAK -case 30: +case 33: YY_RULE_SETUP -#line 345 "netconf_lexer.ll" +#line 375 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::HOOKS_LIBRARIES: @@ -2150,9 +2291,9 @@ YY_RULE_SETUP } } YY_BREAK -case 31: +case 34: YY_RULE_SETUP -#line 354 "netconf_lexer.ll" +#line 384 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::CONFIG: @@ -2162,9 +2303,9 @@ YY_RULE_SETUP } } YY_BREAK -case 32: +case 35: YY_RULE_SETUP -#line 363 "netconf_lexer.ll" +#line 393 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::LOGGING: @@ -2174,9 +2315,9 @@ YY_RULE_SETUP } } YY_BREAK -case 33: +case 36: YY_RULE_SETUP -#line 372 "netconf_lexer.ll" +#line 402 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::LOGGERS: @@ -2186,9 +2327,9 @@ YY_RULE_SETUP } } YY_BREAK -case 34: +case 37: YY_RULE_SETUP -#line 381 "netconf_lexer.ll" +#line 411 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::LOGGERS: @@ -2198,9 +2339,9 @@ YY_RULE_SETUP } } YY_BREAK -case 35: +case 38: YY_RULE_SETUP -#line 390 "netconf_lexer.ll" +#line 420 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::OUTPUT_OPTIONS: @@ -2210,9 +2351,9 @@ YY_RULE_SETUP } } YY_BREAK -case 36: +case 39: YY_RULE_SETUP -#line 399 "netconf_lexer.ll" +#line 429 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::OUTPUT_OPTIONS: @@ -2222,9 +2363,9 @@ YY_RULE_SETUP } } YY_BREAK -case 37: +case 40: YY_RULE_SETUP -#line 408 "netconf_lexer.ll" +#line 438 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::OUTPUT_OPTIONS: @@ -2234,9 +2375,9 @@ YY_RULE_SETUP } } YY_BREAK -case 38: +case 41: YY_RULE_SETUP -#line 417 "netconf_lexer.ll" +#line 447 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::OUTPUT_OPTIONS: @@ -2246,9 +2387,9 @@ YY_RULE_SETUP } } YY_BREAK -case 39: +case 42: YY_RULE_SETUP -#line 426 "netconf_lexer.ll" +#line 456 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::LOGGERS: @@ -2258,9 +2399,9 @@ YY_RULE_SETUP } } YY_BREAK -case 40: +case 43: YY_RULE_SETUP -#line 435 "netconf_lexer.ll" +#line 465 "netconf_lexer.ll" { switch(driver.ctx_) { case ParserContext::LOGGERS: @@ -2270,9 +2411,9 @@ YY_RULE_SETUP } } YY_BREAK -case 41: +case 44: YY_RULE_SETUP -#line 444 "netconf_lexer.ll" +#line 474 "netconf_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -2372,65 +2513,65 @@ YY_RULE_SETUP return NetconfParser::make_STRING(decoded, driver.loc_); } YY_BREAK -case 42: -/* rule 42 can match eol */ +case 45: +/* rule 45 can match eol */ YY_RULE_SETUP -#line 543 "netconf_lexer.ll" +#line 573 "netconf_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); } YY_BREAK -case 43: -/* rule 43 can match eol */ +case 46: +/* rule 46 can match eol */ YY_RULE_SETUP -#line 548 "netconf_lexer.ll" +#line 578 "netconf_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); } YY_BREAK -case 44: +case 47: YY_RULE_SETUP -#line 553 "netconf_lexer.ll" +#line 583 "netconf_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); } YY_BREAK -case 45: +case 48: YY_RULE_SETUP -#line 558 "netconf_lexer.ll" +#line 588 "netconf_lexer.ll" { return NetconfParser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK -case 46: +case 49: YY_RULE_SETUP -#line 559 "netconf_lexer.ll" +#line 589 "netconf_lexer.ll" { return NetconfParser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK -case 47: +case 50: YY_RULE_SETUP -#line 560 "netconf_lexer.ll" +#line 590 "netconf_lexer.ll" { return NetconfParser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK -case 48: +case 51: YY_RULE_SETUP -#line 561 "netconf_lexer.ll" +#line 591 "netconf_lexer.ll" { return NetconfParser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK -case 49: +case 52: YY_RULE_SETUP -#line 562 "netconf_lexer.ll" +#line 592 "netconf_lexer.ll" { return NetconfParser::make_COMMA(driver.loc_); } YY_BREAK -case 50: +case 53: YY_RULE_SETUP -#line 563 "netconf_lexer.ll" +#line 593 "netconf_lexer.ll" { return NetconfParser::make_COLON(driver.loc_); } YY_BREAK -case 51: +case 54: YY_RULE_SETUP -#line 565 "netconf_lexer.ll" +#line 595 "netconf_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -2449,9 +2590,9 @@ YY_RULE_SETUP return NetconfParser::make_INTEGER(integer, driver.loc_); } YY_BREAK -case 52: +case 55: YY_RULE_SETUP -#line 583 "netconf_lexer.ll" +#line 613 "netconf_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -2465,43 +2606,43 @@ YY_RULE_SETUP return NetconfParser::make_FLOAT(fp, driver.loc_); } YY_BREAK -case 53: +case 56: YY_RULE_SETUP -#line 596 "netconf_lexer.ll" +#line 626 "netconf_lexer.ll" { string tmp(yytext); return NetconfParser::make_BOOLEAN(tmp == "true", driver.loc_); } YY_BREAK -case 54: +case 57: YY_RULE_SETUP -#line 601 "netconf_lexer.ll" +#line 631 "netconf_lexer.ll" { return NetconfParser::make_NULL_TYPE(driver.loc_); } YY_BREAK -case 55: +case 58: YY_RULE_SETUP -#line 605 "netconf_lexer.ll" +#line 635 "netconf_lexer.ll" driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); YY_BREAK -case 56: +case 59: YY_RULE_SETUP -#line 607 "netconf_lexer.ll" +#line 637 "netconf_lexer.ll" driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); YY_BREAK -case 57: +case 60: YY_RULE_SETUP -#line 609 "netconf_lexer.ll" +#line 639 "netconf_lexer.ll" driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); YY_BREAK -case 58: +case 61: YY_RULE_SETUP -#line 611 "netconf_lexer.ll" +#line 641 "netconf_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 613 "netconf_lexer.ll" +#line 643 "netconf_lexer.ll" { if (driver.states_.empty()) { return NetconfParser::make_END(driver.loc_); @@ -2525,12 +2666,12 @@ case YY_STATE_EOF(INITIAL): BEGIN(DIR_EXIT); } YY_BREAK -case 59: +case 62: YY_RULE_SETUP -#line 636 "netconf_lexer.ll" +#line 666 "netconf_lexer.ll" ECHO; YY_BREAK -#line 2533 "netconf_lexer.cc" +#line 2674 "netconf_lexer.cc" case YY_END_OF_BUFFER: { @@ -2849,7 +2990,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 321 ) + if ( yy_current_state >= 367 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -2882,11 +3023,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 321 ) + if ( yy_current_state >= 367 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 320); + yy_is_jam = (yy_current_state == 366); return yy_is_jam ? 0 : yy_current_state; } @@ -3635,7 +3776,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 636 "netconf_lexer.ll" +#line 666 "netconf_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/netconf/netconf_lexer.ll b/src/bin/netconf/netconf_lexer.ll index ada8236526..5862e9701c 100644 --- a/src/bin/netconf/netconf_lexer.ll +++ b/src/bin/netconf/netconf_lexer.ll @@ -206,6 +206,36 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } +\"boot-update\" { + switch(driver.ctx_) { + case ParserContext::NETCONF: + case ParserContext::SERVER: + return NetconfParser::make_BOOT_UPDATE(driver.loc_); + default: + return NetconfParser::make_STRING("boot-update", driver.loc_); + } +} + +\"subscribe-changes\" { + switch(driver.ctx_) { + case ParserContext::NETCONF: + case ParserContext::SERVER: + return NetconfParser::make_SUBSCRIBE_CHANGES(driver.loc_); + default: + return NetconfParser::make_STRING("subscribe-changes", driver.loc_); + } +} + +\"validate-changes\" { + switch(driver.ctx_) { + case ParserContext::NETCONF: + case ParserContext::SERVER: + return NetconfParser::make_VALIDATE_CHANGES(driver.loc_); + default: + return NetconfParser::make_STRING("validate-changes", driver.loc_); + } +} + \"managed-servers\" { switch(driver.ctx_) { case ParserContext::NETCONF: diff --git a/src/bin/netconf/netconf_parser.cc b/src/bin/netconf/netconf_parser.cc index a864e2406b..66c8b997a8 100644 --- a/src/bin/netconf/netconf_parser.cc +++ b/src/bin/netconf/netconf_parser.cc @@ -244,25 +244,25 @@ namespace isc { namespace netconf { { switch (that.type_get ()) { - case 54: // value - case 57: // map_value - case 113: // socket_type_value + case 57: // value + case 60: // map_value + case 119: // socket_type_value value.copy< ElementPtr > (that.value); break; - case 45: // "boolean" + case 48: // "boolean" value.copy< bool > (that.value); break; - case 44: // "floating point" + case 47: // "floating point" value.copy< double > (that.value); break; - case 43: // "integer" + case 46: // "integer" value.copy< int64_t > (that.value); break; - case 42: // "constant string" + case 45: // "constant string" value.copy< std::string > (that.value); break; @@ -277,25 +277,25 @@ namespace isc { namespace netconf { { switch (that.type_get ()) { - case 54: // value - case 57: // map_value - case 113: // socket_type_value + case 57: // value + case 60: // map_value + case 119: // socket_type_value value.move< ElementPtr > (that.value); break; - case 45: // "boolean" + case 48: // "boolean" value.move< bool > (that.value); break; - case 44: // "floating point" + case 47: // "floating point" value.move< double > (that.value); break; - case 43: // "integer" + case 46: // "integer" value.move< int64_t > (that.value); break; - case 42: // "constant string" + case 45: // "constant string" value.move< std::string > (that.value); break; @@ -313,25 +313,25 @@ namespace isc { namespace netconf { state = that.state; switch (that.type_get ()) { - case 54: // value - case 57: // map_value - case 113: // socket_type_value + case 57: // value + case 60: // map_value + case 119: // socket_type_value value.copy< ElementPtr > (that.value); break; - case 45: // "boolean" + case 48: // "boolean" value.copy< bool > (that.value); break; - case 44: // "floating point" + case 47: // "floating point" value.copy< double > (that.value); break; - case 43: // "integer" + case 46: // "integer" value.copy< int64_t > (that.value); break; - case 42: // "constant string" + case 45: // "constant string" value.copy< std::string > (that.value); break; @@ -370,51 +370,51 @@ namespace isc { namespace netconf { << yysym.location << ": "; switch (yytype) { - case 42: // "constant string" + case 45: // "constant string" -#line 103 "netconf_parser.yy" // lalr1.cc:635 +#line 107 "netconf_parser.yy" // lalr1.cc:635 { yyoutput << yysym.value.template as< std::string > (); } #line 378 "netconf_parser.cc" // lalr1.cc:635 break; - case 43: // "integer" + case 46: // "integer" -#line 103 "netconf_parser.yy" // lalr1.cc:635 +#line 107 "netconf_parser.yy" // lalr1.cc:635 { yyoutput << yysym.value.template as< int64_t > (); } #line 385 "netconf_parser.cc" // lalr1.cc:635 break; - case 44: // "floating point" + case 47: // "floating point" -#line 103 "netconf_parser.yy" // lalr1.cc:635 +#line 107 "netconf_parser.yy" // lalr1.cc:635 { yyoutput << yysym.value.template as< double > (); } #line 392 "netconf_parser.cc" // lalr1.cc:635 break; - case 45: // "boolean" + case 48: // "boolean" -#line 103 "netconf_parser.yy" // lalr1.cc:635 +#line 107 "netconf_parser.yy" // lalr1.cc:635 { yyoutput << yysym.value.template as< bool > (); } #line 399 "netconf_parser.cc" // lalr1.cc:635 break; - case 54: // value + case 57: // value -#line 103 "netconf_parser.yy" // lalr1.cc:635 +#line 107 "netconf_parser.yy" // lalr1.cc:635 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 406 "netconf_parser.cc" // lalr1.cc:635 break; - case 57: // map_value + case 60: // map_value -#line 103 "netconf_parser.yy" // lalr1.cc:635 +#line 107 "netconf_parser.yy" // lalr1.cc:635 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 413 "netconf_parser.cc" // lalr1.cc:635 break; - case 113: // socket_type_value + case 119: // socket_type_value -#line 103 "netconf_parser.yy" // lalr1.cc:635 +#line 107 "netconf_parser.yy" // lalr1.cc:635 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 420 "netconf_parser.cc" // lalr1.cc:635 break; @@ -613,25 +613,25 @@ namespace isc { namespace netconf { when using variants. */ switch (yyr1_[yyn]) { - case 54: // value - case 57: // map_value - case 113: // socket_type_value + case 57: // value + case 60: // map_value + case 119: // socket_type_value yylhs.value.build< ElementPtr > (); break; - case 45: // "boolean" + case 48: // "boolean" yylhs.value.build< bool > (); break; - case 44: // "floating point" + case 47: // "floating point" yylhs.value.build< double > (); break; - case 43: // "integer" + case 46: // "integer" yylhs.value.build< int64_t > (); break; - case 42: // "constant string" + case 45: // "constant string" yylhs.value.build< std::string > (); break; @@ -654,27 +654,27 @@ namespace isc { namespace netconf { switch (yyn) { case 2: -#line 114 "netconf_parser.yy" // lalr1.cc:856 +#line 118 "netconf_parser.yy" // lalr1.cc:856 { ctx.ctx_ = ctx.NO_KEYWORDS; } #line 660 "netconf_parser.cc" // lalr1.cc:856 break; case 4: -#line 115 "netconf_parser.yy" // lalr1.cc:856 +#line 119 "netconf_parser.yy" // lalr1.cc:856 { ctx.ctx_ = ctx.CONFIG; } #line 666 "netconf_parser.cc" // lalr1.cc:856 break; case 6: -#line 116 "netconf_parser.yy" // lalr1.cc:856 +#line 120 "netconf_parser.yy" // lalr1.cc:856 { ctx.ctx_ = ctx.NETCONF; } #line 672 "netconf_parser.cc" // lalr1.cc:856 break; case 8: -#line 124 "netconf_parser.yy" // lalr1.cc:856 +#line 128 "netconf_parser.yy" // lalr1.cc:856 { - // Parse the Control-netconf map + // Parse the Netconf map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } @@ -682,7 +682,7 @@ namespace isc { namespace netconf { break; case 9: -#line 128 "netconf_parser.yy" // lalr1.cc:856 +#line 132 "netconf_parser.yy" // lalr1.cc:856 { // parsing completed } @@ -690,7 +690,7 @@ namespace isc { namespace netconf { break; case 10: -#line 135 "netconf_parser.yy" // lalr1.cc:856 +#line 139 "netconf_parser.yy" // lalr1.cc:856 { // Push back the JSON value on the stack ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ()); @@ -699,49 +699,49 @@ namespace isc { namespace netconf { break; case 11: -#line 141 "netconf_parser.yy" // lalr1.cc:856 +#line 145 "netconf_parser.yy" // lalr1.cc:856 { yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); } #line 705 "netconf_parser.cc" // lalr1.cc:856 break; case 12: -#line 142 "netconf_parser.yy" // lalr1.cc:856 +#line 146 "netconf_parser.yy" // lalr1.cc:856 { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); } #line 711 "netconf_parser.cc" // lalr1.cc:856 break; case 13: -#line 143 "netconf_parser.yy" // lalr1.cc:856 +#line 147 "netconf_parser.yy" // lalr1.cc:856 { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); } #line 717 "netconf_parser.cc" // lalr1.cc:856 break; case 14: -#line 144 "netconf_parser.yy" // lalr1.cc:856 +#line 148 "netconf_parser.yy" // lalr1.cc:856 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); } #line 723 "netconf_parser.cc" // lalr1.cc:856 break; case 15: -#line 145 "netconf_parser.yy" // lalr1.cc:856 +#line 149 "netconf_parser.yy" // lalr1.cc:856 { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); } #line 729 "netconf_parser.cc" // lalr1.cc:856 break; case 16: -#line 146 "netconf_parser.yy" // lalr1.cc:856 +#line 150 "netconf_parser.yy" // lalr1.cc:856 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 735 "netconf_parser.cc" // lalr1.cc:856 break; case 17: -#line 147 "netconf_parser.yy" // lalr1.cc:856 +#line 151 "netconf_parser.yy" // lalr1.cc:856 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 741 "netconf_parser.cc" // lalr1.cc:856 break; case 18: -#line 151 "netconf_parser.yy" // lalr1.cc:856 +#line 155 "netconf_parser.yy" // lalr1.cc:856 { // This code is executed when we're about to start parsing // the content of the map @@ -752,7 +752,7 @@ namespace isc { namespace netconf { break; case 19: -#line 156 "netconf_parser.yy" // lalr1.cc:856 +#line 160 "netconf_parser.yy" // lalr1.cc:856 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place @@ -762,13 +762,13 @@ namespace isc { namespace netconf { break; case 20: -#line 162 "netconf_parser.yy" // lalr1.cc:856 +#line 166 "netconf_parser.yy" // lalr1.cc:856 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 768 "netconf_parser.cc" // lalr1.cc:856 break; case 23: -#line 176 "netconf_parser.yy" // lalr1.cc:856 +#line 180 "netconf_parser.yy" // lalr1.cc:856 { // map containing a single entry ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ()); @@ -777,7 +777,7 @@ namespace isc { namespace netconf { break; case 24: -#line 180 "netconf_parser.yy" // lalr1.cc:856 +#line 184 "netconf_parser.yy" // lalr1.cc:856 { // map consisting of a shorter map followed by // comma and string:value @@ -787,7 +787,7 @@ namespace isc { namespace netconf { break; case 25: -#line 187 "netconf_parser.yy" // lalr1.cc:856 +#line 191 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(l); @@ -796,14 +796,14 @@ namespace isc { namespace netconf { break; case 26: -#line 190 "netconf_parser.yy" // lalr1.cc:856 +#line 194 "netconf_parser.yy" // lalr1.cc:856 { } #line 803 "netconf_parser.cc" // lalr1.cc:856 break; case 29: -#line 197 "netconf_parser.yy" // lalr1.cc:856 +#line 201 "netconf_parser.yy" // lalr1.cc:856 { // List consisting of a single element. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); @@ -812,7 +812,7 @@ namespace isc { namespace netconf { break; case 30: -#line 201 "netconf_parser.yy" // lalr1.cc:856 +#line 205 "netconf_parser.yy" // lalr1.cc:856 { // List ending with , and a value. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); @@ -821,7 +821,7 @@ namespace isc { namespace netconf { break; case 31: -#line 214 "netconf_parser.yy" // lalr1.cc:856 +#line 218 "netconf_parser.yy" // lalr1.cc:856 { const std::string& where = ctx.contextName(); const std::string& keyword = yystack_[1].value.as< std::string > (); @@ -832,7 +832,7 @@ namespace isc { namespace netconf { break; case 32: -#line 222 "netconf_parser.yy" // lalr1.cc:856 +#line 226 "netconf_parser.yy" // lalr1.cc:856 { // This code is executed when we're about to start parsing // the content of the map @@ -843,7 +843,7 @@ namespace isc { namespace netconf { break; case 33: -#line 227 "netconf_parser.yy" // lalr1.cc:856 +#line 231 "netconf_parser.yy" // lalr1.cc:856 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place @@ -853,7 +853,7 @@ namespace isc { namespace netconf { break; case 38: -#line 244 "netconf_parser.yy" // lalr1.cc:856 +#line 248 "netconf_parser.yy" // lalr1.cc:856 { // Let's create a MapElement that will represent it, add it to the @@ -869,9 +869,9 @@ namespace isc { namespace netconf { break; case 39: -#line 254 "netconf_parser.yy" // lalr1.cc:856 +#line 258 "netconf_parser.yy" // lalr1.cc:856 { - // Ok, we're done with parsing control-netconf. Let's take the map + // Ok, we're done with parsing Netconf. Let's take the map // off the stack. ctx.stack_.pop_back(); ctx.leave(); @@ -879,16 +879,43 @@ namespace isc { namespace netconf { #line 880 "netconf_parser.cc" // lalr1.cc:856 break; - case 49: -#line 278 "netconf_parser.yy" // lalr1.cc:856 + case 52: +#line 285 "netconf_parser.yy" // lalr1.cc:856 + { + ElementPtr flag(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("boot-update", flag); +} +#line 889 "netconf_parser.cc" // lalr1.cc:856 + break; + + case 53: +#line 290 "netconf_parser.yy" // lalr1.cc:856 + { + ElementPtr flag(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("subscribe-changes", flag); +} +#line 898 "netconf_parser.cc" // lalr1.cc:856 + break; + + case 54: +#line 295 "netconf_parser.yy" // lalr1.cc:856 + { + ElementPtr flag(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("validate-changes", flag); +} +#line 907 "netconf_parser.cc" // lalr1.cc:856 + break; + + case 55: +#line 300 "netconf_parser.yy" // lalr1.cc:856 { ctx.enter(ctx.NO_KEYWORDS); } -#line 888 "netconf_parser.cc" // lalr1.cc:856 +#line 915 "netconf_parser.cc" // lalr1.cc:856 break; - case 50: -#line 280 "netconf_parser.yy" // lalr1.cc:856 + case 56: +#line 302 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr parent = ctx.stack_.back(); ElementPtr user_context = yystack_[0].value.as< ElementPtr > (); @@ -911,19 +938,19 @@ namespace isc { namespace netconf { parent->set("user-context", user_context); ctx.leave(); } -#line 915 "netconf_parser.cc" // lalr1.cc:856 +#line 942 "netconf_parser.cc" // lalr1.cc:856 break; - case 51: -#line 303 "netconf_parser.yy" // lalr1.cc:856 + case 57: +#line 325 "netconf_parser.yy" // lalr1.cc:856 { ctx.enter(ctx.NO_KEYWORDS); } -#line 923 "netconf_parser.cc" // lalr1.cc:856 +#line 950 "netconf_parser.cc" // lalr1.cc:856 break; - case 52: -#line 305 "netconf_parser.yy" // lalr1.cc:856 + case 58: +#line 327 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr parent = ctx.stack_.back(); ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location))); @@ -948,479 +975,479 @@ namespace isc { namespace netconf { parent->set("user-context", user_context); ctx.leave(); } -#line 952 "netconf_parser.cc" // lalr1.cc:856 +#line 979 "netconf_parser.cc" // lalr1.cc:856 break; - case 53: -#line 331 "netconf_parser.yy" // lalr1.cc:856 + case 59: +#line 353 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hooks-libraries", l); ctx.stack_.push_back(l); ctx.enter(ctx.HOOKS_LIBRARIES); } -#line 963 "netconf_parser.cc" // lalr1.cc:856 +#line 990 "netconf_parser.cc" // lalr1.cc:856 break; - case 54: -#line 336 "netconf_parser.yy" // lalr1.cc:856 + case 60: +#line 358 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.pop_back(); ctx.leave(); } -#line 972 "netconf_parser.cc" // lalr1.cc:856 +#line 999 "netconf_parser.cc" // lalr1.cc:856 break; - case 59: -#line 349 "netconf_parser.yy" // lalr1.cc:856 + case 65: +#line 371 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 982 "netconf_parser.cc" // lalr1.cc:856 +#line 1009 "netconf_parser.cc" // lalr1.cc:856 break; - case 60: -#line 353 "netconf_parser.yy" // lalr1.cc:856 + case 66: +#line 375 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.pop_back(); } -#line 990 "netconf_parser.cc" // lalr1.cc:856 +#line 1017 "netconf_parser.cc" // lalr1.cc:856 break; - case 66: -#line 366 "netconf_parser.yy" // lalr1.cc:856 + case 72: +#line 388 "netconf_parser.yy" // lalr1.cc:856 { ctx.enter(ctx.NO_KEYWORDS); } -#line 998 "netconf_parser.cc" // lalr1.cc:856 +#line 1025 "netconf_parser.cc" // lalr1.cc:856 break; - case 67: -#line 368 "netconf_parser.yy" // lalr1.cc:856 + case 73: +#line 390 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("library", lib); ctx.leave(); } -#line 1008 "netconf_parser.cc" // lalr1.cc:856 +#line 1035 "netconf_parser.cc" // lalr1.cc:856 break; - case 68: -#line 374 "netconf_parser.yy" // lalr1.cc:856 + case 74: +#line 396 "netconf_parser.yy" // lalr1.cc:856 { ctx.enter(ctx.NO_KEYWORDS); } -#line 1016 "netconf_parser.cc" // lalr1.cc:856 +#line 1043 "netconf_parser.cc" // lalr1.cc:856 break; - case 69: -#line 376 "netconf_parser.yy" // lalr1.cc:856 + case 75: +#line 398 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1025 "netconf_parser.cc" // lalr1.cc:856 +#line 1052 "netconf_parser.cc" // lalr1.cc:856 break; - case 70: -#line 384 "netconf_parser.yy" // lalr1.cc:856 + case 76: +#line 406 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[2].location))); ctx.stack_.back()->set("managed-servers", m); ctx.stack_.push_back(m); ctx.enter(ctx.MANAGED_SERVERS); } -#line 1036 "netconf_parser.cc" // lalr1.cc:856 +#line 1063 "netconf_parser.cc" // lalr1.cc:856 break; - case 71: -#line 389 "netconf_parser.yy" // lalr1.cc:856 + case 77: +#line 411 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1045 "netconf_parser.cc" // lalr1.cc:856 +#line 1072 "netconf_parser.cc" // lalr1.cc:856 break; - case 81: -#line 413 "netconf_parser.yy" // lalr1.cc:856 + case 87: +#line 435 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp4", m); ctx.stack_.push_back(m); ctx.enter(ctx.SERVER); } -#line 1056 "netconf_parser.cc" // lalr1.cc:856 +#line 1083 "netconf_parser.cc" // lalr1.cc:856 break; - case 82: -#line 418 "netconf_parser.yy" // lalr1.cc:856 + case 88: +#line 440 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1065 "netconf_parser.cc" // lalr1.cc:856 +#line 1092 "netconf_parser.cc" // lalr1.cc:856 break; - case 83: -#line 424 "netconf_parser.yy" // lalr1.cc:856 + case 89: +#line 446 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp6", m); ctx.stack_.push_back(m); ctx.enter(ctx.SERVER); } -#line 1076 "netconf_parser.cc" // lalr1.cc:856 +#line 1103 "netconf_parser.cc" // lalr1.cc:856 break; - case 84: -#line 429 "netconf_parser.yy" // lalr1.cc:856 + case 90: +#line 451 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1085 "netconf_parser.cc" // lalr1.cc:856 +#line 1112 "netconf_parser.cc" // lalr1.cc:856 break; - case 85: -#line 435 "netconf_parser.yy" // lalr1.cc:856 + case 91: +#line 457 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("d2", m); ctx.stack_.push_back(m); ctx.enter(ctx.SERVER); } -#line 1096 "netconf_parser.cc" // lalr1.cc:856 +#line 1123 "netconf_parser.cc" // lalr1.cc:856 break; - case 86: -#line 440 "netconf_parser.yy" // lalr1.cc:856 + case 92: +#line 462 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1105 "netconf_parser.cc" // lalr1.cc:856 +#line 1132 "netconf_parser.cc" // lalr1.cc:856 break; - case 87: -#line 446 "netconf_parser.yy" // lalr1.cc:856 + case 93: +#line 468 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ca", m); ctx.stack_.push_back(m); ctx.enter(ctx.SERVER); } -#line 1116 "netconf_parser.cc" // lalr1.cc:856 +#line 1143 "netconf_parser.cc" // lalr1.cc:856 break; - case 88: -#line 451 "netconf_parser.yy" // lalr1.cc:856 + case 94: +#line 473 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1125 "netconf_parser.cc" // lalr1.cc:856 +#line 1152 "netconf_parser.cc" // lalr1.cc:856 break; - case 96: -#line 470 "netconf_parser.yy" // lalr1.cc:856 + case 105: +#line 495 "netconf_parser.yy" // lalr1.cc:856 { ctx.enter(ctx.NO_KEYWORDS); } -#line 1133 "netconf_parser.cc" // lalr1.cc:856 +#line 1160 "netconf_parser.cc" // lalr1.cc:856 break; - case 97: -#line 472 "netconf_parser.yy" // lalr1.cc:856 + case 106: +#line 497 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr model(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("model", model); ctx.leave(); } -#line 1143 "netconf_parser.cc" // lalr1.cc:856 +#line 1170 "netconf_parser.cc" // lalr1.cc:856 break; - case 98: -#line 479 "netconf_parser.yy" // lalr1.cc:856 + case 107: +#line 504 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("control-socket", m); ctx.stack_.push_back(m); ctx.enter(ctx.CONTROL_SOCKET); } -#line 1154 "netconf_parser.cc" // lalr1.cc:856 +#line 1181 "netconf_parser.cc" // lalr1.cc:856 break; - case 99: -#line 484 "netconf_parser.yy" // lalr1.cc:856 + case 108: +#line 509 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1163 "netconf_parser.cc" // lalr1.cc:856 +#line 1190 "netconf_parser.cc" // lalr1.cc:856 break; - case 108: -#line 502 "netconf_parser.yy" // lalr1.cc:856 + case 117: +#line 527 "netconf_parser.yy" // lalr1.cc:856 { ctx.enter(ctx.SOCKET_TYPE); } -#line 1171 "netconf_parser.cc" // lalr1.cc:856 +#line 1198 "netconf_parser.cc" // lalr1.cc:856 break; - case 109: -#line 504 "netconf_parser.yy" // lalr1.cc:856 + case 118: +#line 529 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.back()->set("socket-type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1180 "netconf_parser.cc" // lalr1.cc:856 +#line 1207 "netconf_parser.cc" // lalr1.cc:856 break; - case 110: -#line 510 "netconf_parser.yy" // lalr1.cc:856 + case 119: +#line 535 "netconf_parser.yy" // lalr1.cc:856 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("unix", ctx.loc2pos(yystack_[0].location))); } -#line 1186 "netconf_parser.cc" // lalr1.cc:856 +#line 1213 "netconf_parser.cc" // lalr1.cc:856 break; - case 111: -#line 511 "netconf_parser.yy" // lalr1.cc:856 + case 120: +#line 536 "netconf_parser.yy" // lalr1.cc:856 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("http", ctx.loc2pos(yystack_[0].location))); } -#line 1192 "netconf_parser.cc" // lalr1.cc:856 +#line 1219 "netconf_parser.cc" // lalr1.cc:856 break; - case 112: -#line 512 "netconf_parser.yy" // lalr1.cc:856 + case 121: +#line 537 "netconf_parser.yy" // lalr1.cc:856 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("stdout", ctx.loc2pos(yystack_[0].location))); } -#line 1198 "netconf_parser.cc" // lalr1.cc:856 +#line 1225 "netconf_parser.cc" // lalr1.cc:856 break; - case 113: -#line 515 "netconf_parser.yy" // lalr1.cc:856 + case 122: +#line 540 "netconf_parser.yy" // lalr1.cc:856 { ctx.enter(ctx.NO_KEYWORDS); } -#line 1206 "netconf_parser.cc" // lalr1.cc:856 +#line 1233 "netconf_parser.cc" // lalr1.cc:856 break; - case 114: -#line 517 "netconf_parser.yy" // lalr1.cc:856 + case 123: +#line 542 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-name", name); ctx.leave(); } -#line 1216 "netconf_parser.cc" // lalr1.cc:856 +#line 1243 "netconf_parser.cc" // lalr1.cc:856 break; - case 115: -#line 524 "netconf_parser.yy" // lalr1.cc:856 + case 124: +#line 549 "netconf_parser.yy" // lalr1.cc:856 { ctx.enter(ctx.NO_KEYWORDS); } -#line 1224 "netconf_parser.cc" // lalr1.cc:856 +#line 1251 "netconf_parser.cc" // lalr1.cc:856 break; - case 116: -#line 526 "netconf_parser.yy" // lalr1.cc:856 + case 125: +#line 551 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr url(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-url", url); ctx.leave(); } -#line 1234 "netconf_parser.cc" // lalr1.cc:856 +#line 1261 "netconf_parser.cc" // lalr1.cc:856 break; - case 117: -#line 539 "netconf_parser.yy" // lalr1.cc:856 + case 126: +#line 564 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("Logging", m); ctx.stack_.push_back(m); ctx.enter(ctx.LOGGING); } -#line 1245 "netconf_parser.cc" // lalr1.cc:856 +#line 1272 "netconf_parser.cc" // lalr1.cc:856 break; - case 118: -#line 544 "netconf_parser.yy" // lalr1.cc:856 + case 127: +#line 569 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1254 "netconf_parser.cc" // lalr1.cc:856 +#line 1281 "netconf_parser.cc" // lalr1.cc:856 break; - case 122: -#line 561 "netconf_parser.yy" // lalr1.cc:856 + case 131: +#line 586 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("loggers", l); ctx.stack_.push_back(l); ctx.enter(ctx.LOGGERS); } -#line 1265 "netconf_parser.cc" // lalr1.cc:856 +#line 1292 "netconf_parser.cc" // lalr1.cc:856 break; - case 123: -#line 566 "netconf_parser.yy" // lalr1.cc:856 + case 132: +#line 591 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1274 "netconf_parser.cc" // lalr1.cc:856 +#line 1301 "netconf_parser.cc" // lalr1.cc:856 break; - case 126: -#line 578 "netconf_parser.yy" // lalr1.cc:856 + case 135: +#line 603 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(l); ctx.stack_.push_back(l); } -#line 1284 "netconf_parser.cc" // lalr1.cc:856 +#line 1311 "netconf_parser.cc" // lalr1.cc:856 break; - case 127: -#line 582 "netconf_parser.yy" // lalr1.cc:856 + case 136: +#line 607 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.pop_back(); } -#line 1292 "netconf_parser.cc" // lalr1.cc:856 +#line 1319 "netconf_parser.cc" // lalr1.cc:856 break; - case 137: -#line 599 "netconf_parser.yy" // lalr1.cc:856 + case 146: +#line 624 "netconf_parser.yy" // lalr1.cc:856 { ctx.enter(ctx.NO_KEYWORDS); } -#line 1300 "netconf_parser.cc" // lalr1.cc:856 +#line 1327 "netconf_parser.cc" // lalr1.cc:856 break; - case 138: -#line 601 "netconf_parser.yy" // lalr1.cc:856 + case 147: +#line 626 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("name", name); ctx.leave(); } -#line 1310 "netconf_parser.cc" // lalr1.cc:856 +#line 1337 "netconf_parser.cc" // lalr1.cc:856 break; - case 139: -#line 607 "netconf_parser.yy" // lalr1.cc:856 + case 148: +#line 632 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("debuglevel", dl); } -#line 1319 "netconf_parser.cc" // lalr1.cc:856 +#line 1346 "netconf_parser.cc" // lalr1.cc:856 break; - case 140: -#line 612 "netconf_parser.yy" // lalr1.cc:856 + case 149: +#line 637 "netconf_parser.yy" // lalr1.cc:856 { ctx.enter(ctx.NO_KEYWORDS); } -#line 1327 "netconf_parser.cc" // lalr1.cc:856 +#line 1354 "netconf_parser.cc" // lalr1.cc:856 break; - case 141: -#line 614 "netconf_parser.yy" // lalr1.cc:856 + case 150: +#line 639 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("severity", sev); ctx.leave(); } -#line 1337 "netconf_parser.cc" // lalr1.cc:856 +#line 1364 "netconf_parser.cc" // lalr1.cc:856 break; - case 142: -#line 620 "netconf_parser.yy" // lalr1.cc:856 + case 151: +#line 645 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output_options", l); ctx.stack_.push_back(l); ctx.enter(ctx.OUTPUT_OPTIONS); } -#line 1348 "netconf_parser.cc" // lalr1.cc:856 +#line 1375 "netconf_parser.cc" // lalr1.cc:856 break; - case 143: -#line 625 "netconf_parser.yy" // lalr1.cc:856 + case 152: +#line 650 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1357 "netconf_parser.cc" // lalr1.cc:856 +#line 1384 "netconf_parser.cc" // lalr1.cc:856 break; - case 146: -#line 634 "netconf_parser.yy" // lalr1.cc:856 + case 155: +#line 659 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1367 "netconf_parser.cc" // lalr1.cc:856 +#line 1394 "netconf_parser.cc" // lalr1.cc:856 break; - case 147: -#line 638 "netconf_parser.yy" // lalr1.cc:856 + case 156: +#line 663 "netconf_parser.yy" // lalr1.cc:856 { ctx.stack_.pop_back(); } -#line 1375 "netconf_parser.cc" // lalr1.cc:856 +#line 1402 "netconf_parser.cc" // lalr1.cc:856 break; - case 154: -#line 652 "netconf_parser.yy" // lalr1.cc:856 + case 163: +#line 677 "netconf_parser.yy" // lalr1.cc:856 { ctx.enter(ctx.NO_KEYWORDS); } -#line 1383 "netconf_parser.cc" // lalr1.cc:856 +#line 1410 "netconf_parser.cc" // lalr1.cc:856 break; - case 155: -#line 654 "netconf_parser.yy" // lalr1.cc:856 + case 164: +#line 679 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output", sev); ctx.leave(); } -#line 1393 "netconf_parser.cc" // lalr1.cc:856 +#line 1420 "netconf_parser.cc" // lalr1.cc:856 break; - case 156: -#line 660 "netconf_parser.yy" // lalr1.cc:856 + case 165: +#line 685 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush", flush); } -#line 1402 "netconf_parser.cc" // lalr1.cc:856 +#line 1429 "netconf_parser.cc" // lalr1.cc:856 break; - case 157: -#line 665 "netconf_parser.yy" // lalr1.cc:856 + case 166: +#line 690 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxsize", maxsize); } -#line 1411 "netconf_parser.cc" // lalr1.cc:856 +#line 1438 "netconf_parser.cc" // lalr1.cc:856 break; - case 158: -#line 670 "netconf_parser.yy" // lalr1.cc:856 + case 167: +#line 695 "netconf_parser.yy" // lalr1.cc:856 { ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxver", maxver); } -#line 1420 "netconf_parser.cc" // lalr1.cc:856 +#line 1447 "netconf_parser.cc" // lalr1.cc:856 break; -#line 1424 "netconf_parser.cc" // lalr1.cc:856 +#line 1451 "netconf_parser.cc" // lalr1.cc:856 default: break; } @@ -1674,40 +1701,41 @@ namespace isc { namespace netconf { } - const signed char NetconfParser::yypact_ninf_ = -73; + const signed char NetconfParser::yypact_ninf_ = -64; const signed char NetconfParser::yytable_ninf_ = -1; const short int NetconfParser::yypact_[] = { - 55, -73, -73, -73, 17, 2, 3, 31, -73, -73, - -73, -73, -73, -73, -73, -73, -73, -73, -73, -73, - -73, -73, -73, -73, 2, 6, 10, 11, -73, 46, - 68, 86, 95, 88, -73, -73, 0, -73, -73, -73, - -73, -73, 100, -73, 101, -73, 98, 104, -73, -73, - -73, -73, -73, -73, 2, 2, -73, 66, 105, 106, - 10, -73, 107, 108, 109, 110, -73, -73, 11, -73, - -73, 111, 112, 113, -73, 114, 75, -73, 117, -73, - 2, 11, 93, -73, -73, -73, -2, 118, -73, 116, - -73, 13, -73, -73, -73, -73, -73, -73, -73, 119, - 115, -73, -73, -73, -73, -73, -73, 120, 125, -73, - -73, 126, 93, -73, 127, 128, 129, 130, -73, -2, - 34, -73, 118, 124, -73, 134, 135, 137, 138, -73, - -73, -73, -73, 61, -73, -73, -73, -73, 139, 39, - 39, 39, 39, 131, 132, 57, -73, -73, 27, -73, - -73, -73, -73, -73, -73, 62, -73, -73, -73, 69, - 70, 71, 121, 2, -73, -6, 139, -73, 133, 143, - 39, -73, -73, -73, -73, -73, -73, -73, -73, 144, - -73, -73, -73, -73, 72, -73, -73, -73, -73, -73, - -73, 122, 142, -73, 146, 147, 123, 148, -6, -73, - -73, 7, 136, 149, -73, 140, -73, -73, -73, -73, - -73, -73, -73, 79, -73, -73, -73, -73, -73, 150, - -73, 151, 152, 154, 7, -73, -73, 83, -73, 76, - 141, 145, -73, 30, 150, -73, -73, -73, -73, -73, - -73, -73, -73, 155, 156, 157, 80, -73, -73, -73, - -73, -73, -73, 158, 159, 153, 160, 30, -73, 163, - -73, -73, -73, -73, -73 + 64, -64, -64, -64, 13, 9, 18, 29, -64, -64, + -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, + -64, -64, -64, -64, 9, -22, 10, 15, -64, 1, + 70, 79, 74, 106, -64, -64, 7, -64, -64, -64, + -64, -64, 113, 116, 117, 118, -64, 119, -64, 120, + 121, -64, -64, -64, -64, -64, -64, -64, -64, -64, + 9, 9, -64, 80, 122, 123, 10, -64, 125, 126, + 83, 84, 85, 127, 131, -64, -64, 15, -64, -64, + 132, 130, 133, -64, 134, 97, -64, -64, -64, -64, + 138, -64, 9, 15, 105, -64, -64, -64, 44, 137, + -64, 139, -64, 16, -64, -64, -64, -64, -64, -64, + -64, 140, 136, -64, -64, -64, -64, -64, -64, 143, + 142, -64, -64, 146, 105, -64, 147, 148, 152, 153, + -64, 44, 2, -64, 137, 141, -64, 154, 155, 156, + 157, -64, -64, -64, -64, 40, -64, -64, -64, -64, + 158, 65, 65, 65, 65, 162, 163, 88, -64, -64, + 43, -64, -64, -64, -64, -64, -64, -64, -64, -64, + 62, -64, -64, -64, 82, 91, 92, 114, 9, -64, + 0, 158, -64, 164, 165, 65, -64, -64, -64, -64, + -64, -64, -64, -64, 166, -64, -64, -64, -64, 93, + -64, -64, -64, -64, -64, -64, 115, 167, -64, 168, + 169, 129, 172, 0, -64, -64, -6, 135, 173, -64, + 149, -64, -64, -64, -64, -64, -64, -64, 94, -64, + -64, -64, -64, -64, 170, -64, 175, 177, 178, -6, + -64, -64, 78, -64, 87, 150, 151, -64, 52, 170, + -64, -64, -64, -64, -64, -64, -64, -64, 179, 180, + 181, 95, -64, -64, -64, -64, -64, -64, 188, 145, + 159, 160, 52, -64, 171, -64, -64, -64, -64, -64 }; const unsigned char @@ -1716,169 +1744,176 @@ namespace isc { namespace netconf { 0, 2, 4, 6, 0, 0, 0, 0, 1, 25, 18, 15, 14, 11, 12, 13, 3, 10, 16, 17, 32, 5, 8, 7, 27, 21, 0, 40, 29, 0, - 28, 0, 0, 22, 38, 117, 0, 34, 36, 37, - 49, 51, 0, 53, 0, 48, 0, 41, 42, 46, - 47, 45, 44, 26, 0, 0, 19, 0, 0, 0, - 0, 33, 0, 0, 0, 0, 31, 9, 0, 30, - 23, 0, 0, 0, 35, 0, 0, 70, 0, 43, - 0, 40, 0, 20, 50, 52, 72, 55, 24, 0, - 122, 0, 119, 121, 81, 83, 85, 87, 80, 0, - 73, 74, 76, 77, 78, 79, 59, 0, 56, 57, - 39, 0, 0, 118, 0, 0, 0, 0, 71, 0, - 0, 54, 0, 0, 120, 0, 0, 0, 0, 75, - 66, 68, 63, 0, 61, 64, 65, 58, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 126, 0, 124, - 96, 98, 95, 93, 94, 0, 89, 91, 92, 0, - 0, 0, 0, 0, 62, 0, 0, 123, 0, 0, - 0, 82, 84, 86, 88, 67, 69, 137, 142, 0, - 140, 136, 134, 135, 0, 128, 130, 132, 133, 131, - 125, 0, 0, 90, 0, 0, 0, 0, 0, 127, - 97, 0, 0, 0, 139, 0, 129, 108, 113, 115, - 107, 105, 106, 0, 100, 102, 103, 104, 138, 0, - 141, 0, 0, 0, 0, 99, 146, 0, 144, 0, - 0, 0, 101, 0, 0, 143, 110, 111, 112, 109, - 114, 116, 154, 0, 0, 0, 0, 148, 150, 151, - 152, 153, 145, 0, 0, 0, 0, 0, 147, 0, - 156, 157, 158, 149, 155 + 28, 0, 0, 22, 38, 126, 0, 34, 36, 37, + 55, 57, 0, 0, 0, 0, 59, 0, 51, 0, + 41, 42, 44, 45, 46, 49, 50, 48, 47, 26, + 0, 0, 19, 0, 0, 0, 0, 33, 0, 0, + 0, 0, 0, 0, 0, 31, 9, 0, 30, 23, + 0, 0, 0, 35, 0, 0, 52, 53, 54, 76, + 0, 43, 0, 40, 0, 20, 56, 58, 78, 61, + 24, 0, 131, 0, 128, 130, 87, 89, 91, 93, + 86, 0, 79, 80, 82, 83, 84, 85, 65, 0, + 62, 63, 39, 0, 0, 127, 0, 0, 0, 0, + 77, 0, 0, 60, 0, 0, 129, 0, 0, 0, + 0, 81, 72, 74, 69, 0, 67, 70, 71, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 135, + 0, 133, 105, 107, 104, 98, 99, 100, 102, 103, + 0, 95, 97, 101, 0, 0, 0, 0, 0, 68, + 0, 0, 132, 0, 0, 0, 88, 90, 92, 94, + 73, 75, 146, 151, 0, 149, 145, 143, 144, 0, + 137, 139, 141, 142, 140, 134, 0, 0, 96, 0, + 0, 0, 0, 0, 136, 106, 0, 0, 0, 148, + 0, 138, 117, 122, 124, 116, 114, 115, 0, 109, + 111, 112, 113, 147, 0, 150, 0, 0, 0, 0, + 108, 155, 0, 153, 0, 0, 0, 110, 0, 0, + 152, 119, 120, 121, 118, 123, 125, 163, 0, 0, + 0, 0, 157, 159, 160, 161, 162, 154, 0, 0, + 0, 0, 0, 156, 0, 165, 166, 167, 158, 164 }; const short int NetconfParser::yypgoto_[] = { - -73, -73, -73, -73, -73, -73, -73, -73, -20, 38, - -73, -73, -73, -73, -73, -73, -73, -73, -27, -73, - -73, -73, 161, -73, -73, 84, -73, 85, -26, -73, - -25, -73, -73, -73, -73, -73, 45, -73, -73, 23, - -73, -73, -73, -73, -73, -73, -73, -73, 50, -73, - -73, -73, -73, -73, -73, -73, -73, -40, 9, -73, - -73, -73, -73, -73, -54, -73, -73, -73, -73, -73, - -73, -73, -73, -73, -73, 65, -73, -73, -73, 14, - -73, -73, -17, -73, -73, -73, -73, -73, -73, -73, - -73, -50, -73, -73, -72, -73, -73, -73, -73, -73 + -64, -64, -64, -64, -64, -64, -64, -64, -20, 124, + -64, -64, -64, -64, -64, -64, -64, -64, -27, -64, + -64, -64, 144, -64, -64, 104, -64, 161, -24, -19, + -18, -26, -64, -25, -64, -64, -64, -64, -64, 37, + -64, -64, 41, -64, -64, -64, -64, -64, -64, -64, + -64, 68, -64, -64, -64, -64, -64, -64, -64, -64, + -38, 17, -64, -64, -64, -64, -64, -39, -64, -64, + -64, -64, -64, -64, -64, -64, -64, -64, 77, -64, + -64, -64, 22, -64, -64, -9, -64, -64, -64, -64, + -64, -64, -64, -64, -42, -64, -64, -63, -64, -64, + -64, -64, -64 }; const short int NetconfParser::yydefgoto_[] = { -1, 4, 5, 6, 7, 23, 27, 16, 17, 18, - 25, 84, 32, 33, 19, 24, 29, 30, 152, 21, - 26, 36, 37, 38, 58, 46, 47, 48, 153, 62, - 154, 63, 51, 65, 107, 108, 109, 120, 133, 134, - 135, 143, 136, 144, 52, 86, 99, 100, 101, 102, - 114, 103, 115, 104, 116, 105, 117, 155, 156, 157, - 168, 158, 169, 213, 214, 215, 221, 239, 216, 222, - 217, 223, 39, 59, 91, 92, 93, 111, 148, 149, - 165, 184, 185, 186, 194, 187, 188, 197, 189, 195, - 227, 228, 233, 246, 247, 248, 253, 249, 250, 251 + 25, 96, 32, 33, 19, 24, 29, 30, 164, 21, + 26, 36, 37, 38, 64, 49, 50, 51, 165, 166, + 167, 168, 68, 169, 69, 57, 74, 119, 120, 121, + 132, 145, 146, 147, 155, 148, 156, 58, 98, 111, + 112, 113, 114, 126, 115, 127, 116, 128, 117, 129, + 170, 171, 172, 183, 173, 184, 228, 229, 230, 236, + 254, 231, 237, 232, 238, 39, 65, 103, 104, 105, + 123, 160, 161, 180, 199, 200, 201, 209, 202, 203, + 212, 204, 210, 242, 243, 248, 261, 262, 263, 268, + 264, 265, 266 }; const unsigned short int NetconfParser::yytable_[] = { - 45, 49, 50, 60, 28, 40, 41, 9, 61, 10, - 20, 11, 94, 95, 96, 97, 112, 8, 40, 41, - 34, 113, 40, 41, 42, 177, 178, 207, 179, 180, - 166, 208, 209, 167, 69, 70, 44, 43, 22, 35, - 44, 45, 49, 50, 12, 13, 14, 15, 31, 44, - 40, 41, 53, 44, 45, 49, 50, 150, 151, 98, - 88, 130, 131, 242, 145, 170, 243, 244, 245, 146, - 171, 54, 170, 170, 170, 198, 44, 172, 173, 174, - 199, 44, 224, 257, 130, 131, 234, 225, 258, 235, - 55, 57, 98, 132, 1, 2, 3, 236, 237, 238, - 159, 160, 161, 56, 64, 66, 67, 68, 71, 72, - 73, 75, 76, 83, 78, 80, 77, 85, 119, 81, - 82, 10, 87, 90, 110, 106, 121, 118, 122, 138, - 123, 125, 126, 127, 128, 162, 163, 191, 181, 182, - 183, 139, 140, 176, 141, 142, 147, 192, 196, 201, - 202, 203, 205, 79, 219, 229, 230, 226, 231, 254, - 255, 256, 259, 175, 200, 89, 204, 137, 164, 129, - 232, 181, 182, 183, 210, 211, 212, 124, 218, 193, - 190, 206, 220, 240, 252, 263, 0, 241, 0, 0, - 0, 0, 0, 0, 0, 0, 261, 210, 211, 212, - 0, 0, 0, 262, 260, 264, 0, 0, 0, 0, + 48, 55, 56, 52, 28, 40, 41, 59, 53, 54, + 66, 40, 41, 8, 9, 67, 10, 222, 11, 124, + 34, 223, 224, 31, 125, 20, 40, 41, 42, 43, + 44, 45, 142, 143, 192, 193, 22, 194, 195, 47, + 78, 79, 35, 157, 46, 47, 181, 47, 158, 182, + 48, 55, 56, 52, 12, 13, 14, 15, 53, 54, + 47, 106, 107, 108, 109, 185, 48, 55, 56, 52, + 186, 110, 100, 60, 53, 54, 40, 41, 42, 43, + 44, 249, 62, 61, 250, 185, 162, 163, 257, 47, + 187, 258, 259, 260, 185, 185, 213, 239, 272, 188, + 189, 214, 240, 273, 110, 144, 1, 2, 3, 63, + 47, 251, 252, 253, 174, 175, 176, 70, 142, 143, + 71, 72, 73, 75, 77, 80, 81, 82, 76, 84, + 85, 86, 87, 88, 89, 90, 92, 93, 102, 131, + 94, 10, 97, 99, 118, 134, 150, 122, 130, 133, + 135, 137, 138, 196, 197, 198, 139, 140, 191, 190, + 215, 151, 152, 153, 154, 159, 177, 178, 206, 207, + 211, 149, 217, 218, 216, 219, 220, 241, 234, 244, + 233, 245, 246, 269, 270, 271, 196, 197, 198, 225, + 226, 227, 274, 275, 235, 255, 256, 101, 179, 141, + 247, 136, 208, 205, 221, 276, 277, 267, 95, 278, + 83, 0, 225, 226, 227, 0, 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 74 + 0, 0, 0, 0, 0, 0, 0, 0, 91 }; const short int NetconfParser::yycheck_[] = { - 27, 27, 27, 3, 24, 11, 12, 5, 8, 7, - 7, 9, 14, 15, 16, 17, 3, 0, 11, 12, - 10, 8, 11, 12, 13, 31, 32, 20, 34, 35, - 3, 24, 25, 6, 54, 55, 42, 26, 7, 29, - 42, 68, 68, 68, 42, 43, 44, 45, 42, 42, - 11, 12, 6, 42, 81, 81, 81, 18, 19, 86, - 80, 27, 28, 33, 3, 3, 36, 37, 38, 8, - 8, 3, 3, 3, 3, 3, 42, 8, 8, 8, - 8, 42, 3, 3, 27, 28, 3, 8, 8, 6, - 4, 3, 119, 120, 39, 40, 41, 21, 22, 23, - 140, 141, 142, 8, 4, 4, 8, 3, 42, 4, - 4, 4, 4, 75, 4, 4, 7, 42, 3, 7, - 7, 7, 5, 30, 8, 7, 6, 8, 3, 5, - 4, 4, 4, 4, 4, 4, 4, 4, 165, 165, - 165, 7, 7, 163, 7, 7, 7, 4, 4, 7, - 4, 4, 4, 68, 5, 4, 4, 7, 4, 4, - 4, 4, 4, 42, 42, 81, 43, 122, 145, 119, - 224, 198, 198, 198, 201, 201, 201, 112, 42, 170, - 166, 198, 42, 42, 234, 257, -1, 42, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 224, 224, 224, - -1, -1, -1, 43, 45, 42, -1, -1, -1, -1, + 27, 27, 27, 27, 24, 11, 12, 6, 27, 27, + 3, 11, 12, 0, 5, 8, 7, 23, 9, 3, + 10, 27, 28, 45, 8, 7, 11, 12, 13, 14, + 15, 16, 30, 31, 34, 35, 7, 37, 38, 45, + 60, 61, 32, 3, 29, 45, 3, 45, 8, 6, + 77, 77, 77, 77, 45, 46, 47, 48, 77, 77, + 45, 17, 18, 19, 20, 3, 93, 93, 93, 93, + 8, 98, 92, 3, 93, 93, 11, 12, 13, 14, + 15, 3, 8, 4, 6, 3, 21, 22, 36, 45, + 8, 39, 40, 41, 3, 3, 3, 3, 3, 8, + 8, 8, 8, 8, 131, 132, 42, 43, 44, 3, + 45, 24, 25, 26, 152, 153, 154, 4, 30, 31, + 4, 4, 4, 4, 3, 45, 4, 4, 8, 4, + 4, 48, 48, 48, 7, 4, 4, 7, 33, 3, + 7, 7, 45, 5, 7, 3, 5, 8, 8, 6, + 4, 4, 4, 180, 180, 180, 4, 4, 178, 45, + 45, 7, 7, 7, 7, 7, 4, 4, 4, 4, + 4, 134, 4, 4, 7, 46, 4, 7, 5, 4, + 45, 4, 4, 4, 4, 4, 213, 213, 213, 216, + 216, 216, 4, 48, 45, 45, 45, 93, 157, 131, + 239, 124, 185, 181, 213, 46, 46, 249, 84, 272, + 66, -1, 239, 239, 239, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 60 + -1, -1, -1, -1, -1, -1, -1, -1, 77 }; const unsigned char NetconfParser::yystos_[] = { - 0, 39, 40, 41, 47, 48, 49, 50, 0, 5, - 7, 9, 42, 43, 44, 45, 53, 54, 55, 60, - 7, 65, 7, 51, 61, 56, 66, 52, 54, 62, - 63, 42, 58, 59, 10, 29, 67, 68, 69, 118, - 11, 12, 13, 26, 42, 64, 71, 72, 73, 74, - 76, 78, 90, 6, 3, 4, 8, 3, 70, 119, - 3, 8, 75, 77, 4, 79, 4, 8, 3, 54, - 54, 42, 4, 4, 68, 4, 4, 7, 4, 73, - 4, 7, 7, 55, 57, 42, 91, 5, 54, 71, - 30, 120, 121, 122, 14, 15, 16, 17, 64, 92, - 93, 94, 95, 97, 99, 101, 7, 80, 81, 82, - 8, 123, 3, 8, 96, 98, 100, 102, 8, 3, - 83, 6, 3, 4, 121, 4, 4, 4, 4, 94, - 27, 28, 64, 84, 85, 86, 88, 82, 5, 7, - 7, 7, 7, 87, 89, 3, 8, 7, 124, 125, - 18, 19, 64, 74, 76, 103, 104, 105, 107, 103, - 103, 103, 4, 4, 85, 126, 3, 6, 106, 108, - 3, 8, 8, 8, 8, 42, 54, 31, 32, 34, - 35, 64, 74, 76, 127, 128, 129, 131, 132, 134, - 125, 4, 4, 104, 130, 135, 4, 133, 3, 8, - 42, 7, 4, 4, 43, 4, 128, 20, 24, 25, - 64, 74, 76, 109, 110, 111, 114, 116, 42, 5, - 42, 112, 115, 117, 3, 8, 7, 136, 137, 4, - 4, 4, 110, 138, 3, 6, 21, 22, 23, 113, - 42, 42, 33, 36, 37, 38, 139, 140, 141, 143, - 144, 145, 137, 142, 4, 4, 4, 3, 8, 4, - 45, 43, 43, 140, 42 + 0, 42, 43, 44, 50, 51, 52, 53, 0, 5, + 7, 9, 45, 46, 47, 48, 56, 57, 58, 63, + 7, 68, 7, 54, 64, 59, 69, 55, 57, 65, + 66, 45, 61, 62, 10, 32, 70, 71, 72, 124, + 11, 12, 13, 14, 15, 16, 29, 45, 67, 74, + 75, 76, 77, 78, 79, 80, 82, 84, 96, 6, + 3, 4, 8, 3, 73, 125, 3, 8, 81, 83, + 4, 4, 4, 4, 85, 4, 8, 3, 57, 57, + 45, 4, 4, 71, 4, 4, 48, 48, 48, 7, + 4, 76, 4, 7, 7, 58, 60, 45, 97, 5, + 57, 74, 33, 126, 127, 128, 17, 18, 19, 20, + 67, 98, 99, 100, 101, 103, 105, 107, 7, 86, + 87, 88, 8, 129, 3, 8, 102, 104, 106, 108, + 8, 3, 89, 6, 3, 4, 127, 4, 4, 4, + 4, 100, 30, 31, 67, 90, 91, 92, 94, 88, + 5, 7, 7, 7, 7, 93, 95, 3, 8, 7, + 130, 131, 21, 22, 67, 77, 78, 79, 80, 82, + 109, 110, 111, 113, 109, 109, 109, 4, 4, 91, + 132, 3, 6, 112, 114, 3, 8, 8, 8, 8, + 45, 57, 34, 35, 37, 38, 67, 80, 82, 133, + 134, 135, 137, 138, 140, 131, 4, 4, 110, 136, + 141, 4, 139, 3, 8, 45, 7, 4, 4, 46, + 4, 134, 23, 27, 28, 67, 80, 82, 115, 116, + 117, 120, 122, 45, 5, 45, 118, 121, 123, 3, + 8, 7, 142, 143, 4, 4, 4, 116, 144, 3, + 6, 24, 25, 26, 119, 45, 45, 36, 39, 40, + 41, 145, 146, 147, 149, 150, 151, 143, 148, 4, + 4, 4, 3, 8, 4, 48, 46, 46, 146, 45 }; const unsigned char NetconfParser::yyr1_[] = { - 0, 46, 48, 47, 49, 47, 50, 47, 52, 51, - 53, 54, 54, 54, 54, 54, 54, 54, 56, 55, - 57, 58, 58, 59, 59, 61, 60, 62, 62, 63, - 63, 64, 66, 65, 67, 67, 68, 68, 70, 69, - 71, 71, 72, 72, 73, 73, 73, 73, 73, 75, - 74, 77, 76, 79, 78, 80, 80, 81, 81, 83, - 82, 84, 84, 84, 85, 85, 87, 86, 89, 88, - 91, 90, 92, 92, 93, 93, 94, 94, 94, 94, - 94, 96, 95, 98, 97, 100, 99, 102, 101, 103, - 103, 104, 104, 104, 104, 104, 106, 105, 108, 107, - 109, 109, 110, 110, 110, 110, 110, 110, 112, 111, - 113, 113, 113, 115, 114, 117, 116, 119, 118, 120, - 120, 121, 123, 122, 124, 124, 126, 125, 127, 127, - 128, 128, 128, 128, 128, 128, 128, 130, 129, 131, - 133, 132, 135, 134, 136, 136, 138, 137, 139, 139, - 140, 140, 140, 140, 142, 141, 143, 144, 145 + 0, 49, 51, 50, 52, 50, 53, 50, 55, 54, + 56, 57, 57, 57, 57, 57, 57, 57, 59, 58, + 60, 61, 61, 62, 62, 64, 63, 65, 65, 66, + 66, 67, 69, 68, 70, 70, 71, 71, 73, 72, + 74, 74, 75, 75, 76, 76, 76, 76, 76, 76, + 76, 76, 77, 78, 79, 81, 80, 83, 82, 85, + 84, 86, 86, 87, 87, 89, 88, 90, 90, 90, + 91, 91, 93, 92, 95, 94, 97, 96, 98, 98, + 99, 99, 100, 100, 100, 100, 100, 102, 101, 104, + 103, 106, 105, 108, 107, 109, 109, 110, 110, 110, + 110, 110, 110, 110, 110, 112, 111, 114, 113, 115, + 115, 116, 116, 116, 116, 116, 116, 118, 117, 119, + 119, 119, 121, 120, 123, 122, 125, 124, 126, 126, + 127, 129, 128, 130, 130, 132, 131, 133, 133, 134, + 134, 134, 134, 134, 134, 134, 136, 135, 137, 139, + 138, 141, 140, 142, 142, 144, 143, 145, 145, 146, + 146, 146, 146, 148, 147, 149, 150, 151 }; const unsigned char @@ -1888,18 +1923,19 @@ namespace isc { namespace netconf { 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, 1, 0, 1, 3, 5, 0, 4, 0, 1, 1, 3, 2, 0, 4, 1, 3, 1, 1, 0, 6, - 0, 1, 1, 3, 1, 1, 1, 1, 1, 0, - 4, 0, 4, 0, 6, 0, 1, 1, 3, 0, - 4, 1, 3, 1, 1, 1, 0, 4, 0, 4, - 0, 6, 0, 1, 1, 3, 1, 1, 1, 1, - 1, 0, 6, 0, 6, 0, 6, 0, 6, 1, - 3, 1, 1, 1, 1, 1, 0, 4, 0, 6, - 1, 3, 1, 1, 1, 1, 1, 1, 0, 4, - 1, 1, 1, 0, 4, 0, 4, 0, 6, 1, - 3, 1, 0, 6, 1, 3, 0, 4, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 0, 4, 3, - 0, 4, 0, 6, 1, 3, 0, 4, 1, 3, - 1, 1, 1, 1, 0, 4, 3, 3, 3 + 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 3, 3, 0, 4, 0, 4, 0, + 6, 0, 1, 1, 3, 0, 4, 1, 3, 1, + 1, 1, 0, 4, 0, 4, 0, 6, 0, 1, + 1, 3, 1, 1, 1, 1, 1, 0, 6, 0, + 6, 0, 6, 0, 6, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 4, 0, 6, 1, + 3, 1, 1, 1, 1, 1, 1, 0, 4, 1, + 1, 1, 0, 4, 0, 4, 0, 6, 1, 3, + 1, 0, 6, 1, 3, 0, 4, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 0, 4, 3, 0, + 4, 0, 6, 1, 3, 0, 4, 1, 3, 1, + 1, 1, 1, 0, 4, 3, 3, 3 }; @@ -1911,8 +1947,9 @@ namespace isc { namespace netconf { { "\"end of file\"", "error", "$undefined", "\",\"", "\":\"", "\"[\"", "\"]\"", "\"{\"", "\"}\"", "\"null\"", "\"Netconf\"", "\"user-context\"", - "\"comment\"", "\"managed-servers\"", "\"dhcp4\"", "\"dhcp6\"", "\"d2\"", - "\"ca\"", "\"model\"", "\"control-socket\"", "\"socket-type\"", + "\"comment\"", "\"boot-update\"", "\"subscribe-changes\"", + "\"validate-changes\"", "\"managed-servers\"", "\"dhcp4\"", "\"dhcp6\"", + "\"d2\"", "\"ca\"", "\"model\"", "\"control-socket\"", "\"socket-type\"", "\"unix\"", "\"http\"", "\"stdout\"", "\"socket-name\"", "\"socket-url\"", "\"hooks-libraries\"", "\"library\"", "\"parameters\"", "\"Logging\"", "\"loggers\"", "\"name\"", "\"output_options\"", @@ -1925,7 +1962,8 @@ namespace isc { namespace netconf { "not_empty_list", "unknown_map_entry", "netconf_syntax_map", "$@7", "global_objects", "global_object", "netconf_object", "$@8", "global_params", "not_empty_global_params", "global_param", - "user_context", "$@9", "comment", "$@10", "hooks_libraries", "$@11", + "boot_update", "subscribe_changes", "validate_changes", "user_context", + "$@9", "comment", "$@10", "hooks_libraries", "$@11", "hooks_libraries_list", "not_empty_hooks_libraries_list", "hooks_library", "$@12", "hooks_params", "hooks_param", "library", "$@13", "parameters", "$@14", "managed_servers", "$@15", @@ -1947,22 +1985,23 @@ namespace isc { namespace netconf { const unsigned short int NetconfParser::yyrline_[] = { - 0, 114, 114, 114, 115, 115, 116, 116, 124, 124, - 135, 141, 142, 143, 144, 145, 146, 147, 151, 151, - 162, 167, 168, 176, 180, 187, 187, 193, 194, 197, - 201, 214, 222, 222, 234, 235, 239, 240, 244, 244, - 261, 262, 265, 266, 271, 272, 273, 274, 275, 278, - 278, 303, 303, 331, 331, 341, 342, 345, 346, 349, - 349, 357, 358, 359, 362, 363, 366, 366, 374, 374, - 384, 384, 394, 395, 398, 399, 405, 406, 407, 408, - 409, 413, 413, 424, 424, 435, 435, 446, 446, 457, - 458, 462, 463, 464, 465, 466, 470, 470, 479, 479, - 490, 491, 494, 495, 496, 497, 498, 499, 502, 502, - 510, 511, 512, 515, 515, 524, 524, 539, 539, 552, - 553, 557, 561, 561, 573, 574, 578, 578, 586, 587, - 590, 591, 592, 593, 594, 595, 596, 599, 599, 607, - 612, 612, 620, 620, 630, 631, 634, 634, 642, 643, - 646, 647, 648, 649, 652, 652, 660, 665, 670 + 0, 118, 118, 118, 119, 119, 120, 120, 128, 128, + 139, 145, 146, 147, 148, 149, 150, 151, 155, 155, + 166, 171, 172, 180, 184, 191, 191, 197, 198, 201, + 205, 218, 226, 226, 238, 239, 243, 244, 248, 248, + 265, 266, 269, 270, 275, 276, 277, 278, 279, 280, + 281, 282, 285, 290, 295, 300, 300, 325, 325, 353, + 353, 363, 364, 367, 368, 371, 371, 379, 380, 381, + 384, 385, 388, 388, 396, 396, 406, 406, 416, 417, + 420, 421, 427, 428, 429, 430, 431, 435, 435, 446, + 446, 457, 457, 468, 468, 479, 480, 484, 485, 486, + 487, 488, 489, 490, 491, 495, 495, 504, 504, 515, + 516, 519, 520, 521, 522, 523, 524, 527, 527, 535, + 536, 537, 540, 540, 549, 549, 564, 564, 577, 578, + 582, 586, 586, 598, 599, 603, 603, 611, 612, 615, + 616, 617, 618, 619, 620, 621, 624, 624, 632, 637, + 637, 645, 645, 655, 656, 659, 659, 667, 668, 671, + 672, 673, 674, 677, 677, 685, 690, 695 }; // Print the state stack on the debug stream. @@ -1997,8 +2036,8 @@ namespace isc { namespace netconf { #line 14 "netconf_parser.yy" // lalr1.cc:1163 } } // isc::netconf -#line 2001 "netconf_parser.cc" // lalr1.cc:1163 -#line 675 "netconf_parser.yy" // lalr1.cc:1164 +#line 2040 "netconf_parser.cc" // lalr1.cc:1163 +#line 700 "netconf_parser.yy" // lalr1.cc:1164 void diff --git a/src/bin/netconf/netconf_parser.h b/src/bin/netconf/netconf_parser.h index 317b4768dd..f7a4e6cb3a 100644 --- a/src/bin/netconf/netconf_parser.h +++ b/src/bin/netconf/netconf_parser.h @@ -352,39 +352,42 @@ namespace isc { namespace netconf { TOKEN_NETCONF = 265, TOKEN_USER_CONTEXT = 266, TOKEN_COMMENT = 267, - TOKEN_MANAGED_SERVERS = 268, - TOKEN_DHCP4_SERVER = 269, - TOKEN_DHCP6_SERVER = 270, - TOKEN_D2_SERVER = 271, - TOKEN_CA_SERVER = 272, - TOKEN_MODEL = 273, - TOKEN_CONTROL_SOCKET = 274, - TOKEN_SOCKET_TYPE = 275, - TOKEN_UNIX = 276, - TOKEN_HTTP = 277, - TOKEN_STDOUT = 278, - TOKEN_SOCKET_NAME = 279, - TOKEN_SOCKET_URL = 280, - TOKEN_HOOKS_LIBRARIES = 281, - TOKEN_LIBRARY = 282, - TOKEN_PARAMETERS = 283, - TOKEN_LOGGING = 284, - TOKEN_LOGGERS = 285, - TOKEN_NAME = 286, - TOKEN_OUTPUT_OPTIONS = 287, - TOKEN_OUTPUT = 288, - TOKEN_DEBUGLEVEL = 289, - TOKEN_SEVERITY = 290, - TOKEN_FLUSH = 291, - TOKEN_MAXSIZE = 292, - TOKEN_MAXVER = 293, - TOKEN_START_JSON = 294, - TOKEN_START_NETCONF = 295, - TOKEN_START_SUB_NETCONF = 296, - TOKEN_STRING = 297, - TOKEN_INTEGER = 298, - TOKEN_FLOAT = 299, - TOKEN_BOOLEAN = 300 + TOKEN_BOOT_UPDATE = 268, + TOKEN_SUBSCRIBE_CHANGES = 269, + TOKEN_VALIDATE_CHANGES = 270, + TOKEN_MANAGED_SERVERS = 271, + TOKEN_DHCP4_SERVER = 272, + TOKEN_DHCP6_SERVER = 273, + TOKEN_D2_SERVER = 274, + TOKEN_CA_SERVER = 275, + TOKEN_MODEL = 276, + TOKEN_CONTROL_SOCKET = 277, + TOKEN_SOCKET_TYPE = 278, + TOKEN_UNIX = 279, + TOKEN_HTTP = 280, + TOKEN_STDOUT = 281, + TOKEN_SOCKET_NAME = 282, + TOKEN_SOCKET_URL = 283, + TOKEN_HOOKS_LIBRARIES = 284, + TOKEN_LIBRARY = 285, + TOKEN_PARAMETERS = 286, + TOKEN_LOGGING = 287, + TOKEN_LOGGERS = 288, + TOKEN_NAME = 289, + TOKEN_OUTPUT_OPTIONS = 290, + TOKEN_OUTPUT = 291, + TOKEN_DEBUGLEVEL = 292, + TOKEN_SEVERITY = 293, + TOKEN_FLUSH = 294, + TOKEN_MAXSIZE = 295, + TOKEN_MAXVER = 296, + TOKEN_START_JSON = 297, + TOKEN_START_NETCONF = 298, + TOKEN_START_SUB_NETCONF = 299, + TOKEN_STRING = 300, + TOKEN_INTEGER = 301, + TOKEN_FLOAT = 302, + TOKEN_BOOLEAN = 303 }; }; @@ -543,6 +546,18 @@ namespace isc { namespace netconf { symbol_type make_COMMENT (const location_type& l); + static inline + symbol_type + make_BOOT_UPDATE (const location_type& l); + + static inline + symbol_type + make_SUBSCRIBE_CHANGES (const location_type& l); + + static inline + symbol_type + make_VALIDATE_CHANGES (const location_type& l); + static inline symbol_type make_MANAGED_SERVERS (const location_type& l); @@ -882,12 +897,12 @@ namespace isc { namespace netconf { enum { yyeof_ = 0, - yylast_ = 221, ///< Last index in yytable_. - yynnts_ = 100, ///< Number of nonterminal symbols. + yylast_ = 238, ///< Last index in yytable_. + yynnts_ = 103, ///< Number of nonterminal symbols. yyfinal_ = 8, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, - yyntokens_ = 46 ///< Number of tokens. + yyntokens_ = 49 ///< Number of tokens. }; @@ -934,9 +949,9 @@ namespace isc { namespace netconf { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45 + 45, 46, 47, 48 }; - const unsigned user_token_number_max_ = 300; + const unsigned user_token_number_max_ = 303; const token_number_type undef_token_ = 2; if (static_cast (t) <= yyeof_) @@ -967,25 +982,25 @@ namespace isc { namespace netconf { { switch (other.type_get ()) { - case 54: // value - case 57: // map_value - case 113: // socket_type_value + case 57: // value + case 60: // map_value + case 119: // socket_type_value value.copy< ElementPtr > (other.value); break; - case 45: // "boolean" + case 48: // "boolean" value.copy< bool > (other.value); break; - case 44: // "floating point" + case 47: // "floating point" value.copy< double > (other.value); break; - case 43: // "integer" + case 46: // "integer" value.copy< int64_t > (other.value); break; - case 42: // "constant string" + case 45: // "constant string" value.copy< std::string > (other.value); break; @@ -1004,25 +1019,25 @@ namespace isc { namespace netconf { (void) v; switch (this->type_get ()) { - case 54: // value - case 57: // map_value - case 113: // socket_type_value + case 57: // value + case 60: // map_value + case 119: // socket_type_value value.copy< ElementPtr > (v); break; - case 45: // "boolean" + case 48: // "boolean" value.copy< bool > (v); break; - case 44: // "floating point" + case 47: // "floating point" value.copy< double > (v); break; - case 43: // "integer" + case 46: // "integer" value.copy< int64_t > (v); break; - case 42: // "constant string" + case 45: // "constant string" value.copy< std::string > (v); break; @@ -1100,25 +1115,25 @@ namespace isc { namespace netconf { // Type destructor. switch (yytype) { - case 54: // value - case 57: // map_value - case 113: // socket_type_value + case 57: // value + case 60: // map_value + case 119: // socket_type_value value.template destroy< ElementPtr > (); break; - case 45: // "boolean" + case 48: // "boolean" value.template destroy< bool > (); break; - case 44: // "floating point" + case 47: // "floating point" value.template destroy< double > (); break; - case 43: // "integer" + case 46: // "integer" value.template destroy< int64_t > (); break; - case 42: // "constant string" + case 45: // "constant string" value.template destroy< std::string > (); break; @@ -1143,25 +1158,25 @@ namespace isc { namespace netconf { super_type::move (s); switch (this->type_get ()) { - case 54: // value - case 57: // map_value - case 113: // socket_type_value + case 57: // value + case 60: // map_value + case 119: // socket_type_value value.move< ElementPtr > (s.value); break; - case 45: // "boolean" + case 48: // "boolean" value.move< bool > (s.value); break; - case 44: // "floating point" + case 47: // "floating point" value.move< double > (s.value); break; - case 43: // "integer" + case 46: // "integer" value.move< int64_t > (s.value); break; - case 42: // "constant string" + case 45: // "constant string" value.move< std::string > (s.value); break; @@ -1224,7 +1239,7 @@ namespace isc { namespace netconf { 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300 + 295, 296, 297, 298, 299, 300, 301, 302, 303 }; return static_cast (yytoken_number_[type]); } @@ -1295,6 +1310,24 @@ namespace isc { namespace netconf { return symbol_type (token::TOKEN_COMMENT, l); } + NetconfParser::symbol_type + NetconfParser::make_BOOT_UPDATE (const location_type& l) + { + return symbol_type (token::TOKEN_BOOT_UPDATE, l); + } + + NetconfParser::symbol_type + NetconfParser::make_SUBSCRIBE_CHANGES (const location_type& l) + { + return symbol_type (token::TOKEN_SUBSCRIBE_CHANGES, l); + } + + NetconfParser::symbol_type + NetconfParser::make_VALIDATE_CHANGES (const location_type& l) + { + return symbol_type (token::TOKEN_VALIDATE_CHANGES, l); + } + NetconfParser::symbol_type NetconfParser::make_MANAGED_SERVERS (const location_type& l) { @@ -1496,7 +1529,7 @@ namespace isc { namespace netconf { #line 14 "netconf_parser.yy" // lalr1.cc:379 } } // isc::netconf -#line 1500 "netconf_parser.h" // lalr1.cc:379 +#line 1533 "netconf_parser.h" // lalr1.cc:379 diff --git a/src/bin/netconf/netconf_parser.yy b/src/bin/netconf/netconf_parser.yy index 14fc5639a4..e7ccfe38f0 100644 --- a/src/bin/netconf/netconf_parser.yy +++ b/src/bin/netconf/netconf_parser.yy @@ -53,6 +53,10 @@ using namespace std; USER_CONTEXT "user-context" COMMENT "comment" + BOOT_UPDATE "boot-update" + SUBSCRIBE_CHANGES "subscribe-changes" + VALIDATE_CHANGES "validate-changes" + MANAGED_SERVERS "managed-servers" DHCP4_SERVER "dhcp4" DHCP6_SERVER "dhcp6" @@ -268,13 +272,31 @@ not_empty_global_params: global_param // These are the parameters that are allowed in the top-level for // Netconf. -global_param: managed_servers +global_param: boot_update + | subscribe_changes + | validate_changes + | managed_servers | hooks_libraries | user_context | comment | unknown_map_entry ; +boot_update: BOOT_UPDATE COLON BOOLEAN { + ElementPtr flag(new BoolElement($3, ctx.loc2pos(@3))); + ctx.stack_.back()->set("boot-update", flag); +}; + +subscribe_changes: SUBSCRIBE_CHANGES COLON BOOLEAN { + ElementPtr flag(new BoolElement($3, ctx.loc2pos(@3))); + ctx.stack_.back()->set("subscribe-changes", flag); +}; + +validate_changes: VALIDATE_CHANGES COLON BOOLEAN { + ElementPtr flag(new BoolElement($3, ctx.loc2pos(@3))); + ctx.stack_.back()->set("validate-changes", flag); +}; + user_context: USER_CONTEXT { ctx.enter(ctx.NO_KEYWORDS); } COLON map_value { @@ -460,6 +482,9 @@ managed_server_params: managed_server_param // We currently support two server parameters: model and control-socket. managed_server_param: model + | boot_update + | subscribe_changes + | validate_changes | control_socket | user_context | comment diff --git a/src/bin/netconf/position.hh b/src/bin/netconf/position.hh index 96b6e13f6a..97d1919a1d 100644 --- a/src/bin/netconf/position.hh +++ b/src/bin/netconf/position.hh @@ -1,4 +1,4 @@ -// Generated 201809281126 +// Generated 201810092120 // A Bison parser, made by GNU Bison 3.0.5. // Positions for Bison parsers in C++ diff --git a/src/bin/netconf/simple_parser.cc b/src/bin/netconf/simple_parser.cc index 5f5591b069..0a4734b058 100644 --- a/src/bin/netconf/simple_parser.cc +++ b/src/bin/netconf/simple_parser.cc @@ -36,6 +36,9 @@ namespace netconf { /// /// These are global Netconf parameters. const SimpleDefaults NetconfSimpleParser::NETCONF_DEFAULTS = { + { "boot-update", Element::boolean, "true" }, + { "subscribe-changes", Element::boolean, "true" }, + { "validate-changes", Element::boolean, "true" } }; /// Supplies defaults for control-socket elements @@ -65,6 +68,18 @@ const SimpleDefaults NetconfSimpleParser::CA_DEFAULTS = { { "model", Element::string, "kea-ctrl-agent" } }; +/// @brief List of parameters that can be inherited to managed-servers scope. +/// +/// Some parameters may be defined on both global (directly in Netconf) and +/// servers (Netconf/managed-servers/...) scope. If not defined in the +/// managed-servers scope, the value is being inherited (derived) from +/// the global scope. This array lists all of such parameters. +const ParamsList NetconfSimpleParser::INHERIT_TO_SERVERS = { + "boot-update", + "subscribe-changes", + "validate-changes" +}; + /// @} /// --------------------------------------------------------------------------- @@ -87,6 +102,24 @@ size_t NetconfSimpleParser::setAllDefaults(const ElementPtr& global) { return (cnt); } +size_t NetconfSimpleParser::deriveParameters(ConstElementPtr global) { + size_t cnt = 0; + + // Now derive global parameters into managed-servers. + ConstElementPtr servers = global->get("managed-servers"); + if (servers) { + for (auto it : servers->mapValue()) { + ElementPtr mutable_server = + boost::const_pointer_cast(it.second); + cnt += SimpleParser::deriveParams(global, + mutable_server, + INHERIT_TO_SERVERS); + } + } + + return (cnt); +} + size_t NetconfSimpleParser::setServerDefaults(const std::string name, ConstElementPtr server) { diff --git a/src/bin/netconf/simple_parser.h b/src/bin/netconf/simple_parser.h index eb13983e11..5c9324dae9 100644 --- a/src/bin/netconf/simple_parser.h +++ b/src/bin/netconf/simple_parser.h @@ -30,6 +30,14 @@ public: /// @return number of default values added static size_t setAllDefaults(const isc::data::ElementPtr& global); + /// @brief Derives (inherits) all parameters from global to more specific scopes. + /// + /// This method currently does the following: + /// - derives global parameters to managed servers (flags for now) + /// @param global scope to be modified if needed + /// @return number of default values derived + static size_t deriveParameters(isc::data::ConstElementPtr global); + /// @brief Adds default values to a Managed server entry. /// /// Adds server specific defaults, e.g. the default model. @@ -58,6 +66,7 @@ public: static const isc::data::SimpleDefaults DHCP6_DEFAULTS; static const isc::data::SimpleDefaults D2_DEFAULTS; static const isc::data::SimpleDefaults CA_DEFAULTS; + static const isc::data::ParamsList INHERIT_TO_SERVERS; }; }; diff --git a/src/bin/netconf/stack.hh b/src/bin/netconf/stack.hh index ef4b2cf75e..7074ea3de0 100644 --- a/src/bin/netconf/stack.hh +++ b/src/bin/netconf/stack.hh @@ -1,4 +1,4 @@ -// Generated 201809281126 +// Generated 201810092120 // A Bison parser, made by GNU Bison 3.0.5. // Stack handling for Bison parsers in C++ diff --git a/src/bin/netconf/tests/netconf_cfg_mgr_unittests.cc b/src/bin/netconf/tests/netconf_cfg_mgr_unittests.cc index c08156245a..d463439103 100644 --- a/src/bin/netconf/tests/netconf_cfg_mgr_unittests.cc +++ b/src/bin/netconf/tests/netconf_cfg_mgr_unittests.cc @@ -12,11 +12,13 @@ #include #include #include +#include #include #include #include using namespace std; +using namespace isc; using namespace isc::netconf; using namespace isc::config; using namespace isc::data; @@ -135,6 +137,59 @@ TEST(NetconfCfgMgr, contextHookParams) { EXPECT_EQ(libs.get(), stored_libs.get()); } +// Tests if the context can store and retrieve globals. +TEST(NetconfCfgMgr, contextGlobals) { + NetconfConfig ctx; + + // By default there should be no globals. + ConstElementPtr globals = ctx.getConfiguredGlobals(); + ASSERT_TRUE(globals); + ASSERT_EQ(Element::map, globals->getType()); + EXPECT_EQ(0, globals->mapValue().size()); + + // Attempting to extract globals from a non-map should throw. + ASSERT_THROW(ctx.extractConfiguredGlobals(Element::create(777)), BadValue); + + // Now let's create a configuration from which to extract global scalars. + // Extraction (currently) has no business logic, so the elements we use + // can be arbitrary. + ConstElementPtr global_cfg; + string global_cfg_str = + "{\n" + " \"astring\": \"okay\",\n" + " \"amap\": { \"not-this\":777, \"not-that\": \"poo\" },\n" + " \"anint\": 444,\n" + " \"alist\": [ 1, 2, 3 ],\n" + " \"abool\": true\n" + "}\n"; + ASSERT_NO_THROW(global_cfg = Element::fromJSON(global_cfg_str)); + + // Extract globals from the config. + ASSERT_NO_THROW(ctx.extractConfiguredGlobals(global_cfg)); + + // Now see if the extract was correct. + globals = ctx.getConfiguredGlobals(); + ASSERT_TRUE(globals); + ASSERT_EQ(Element::map, globals->getType()); + EXPECT_NE(0, globals->mapValue().size()); + + // Maps and lists should be excluded. + for (auto it : globals->mapValue()) { + if (it.first == "astring") { + ASSERT_EQ(Element::string, it.second->getType()); + EXPECT_EQ("okay", it.second->stringValue()); + } else if (it.first == "anint") { + ASSERT_EQ(Element::integer, it.second->getType()); + EXPECT_EQ(444, it.second->intValue()); + } else if (it.first == "abool") { + ASSERT_EQ(Element::boolean, it.second->getType()); + EXPECT_TRUE(it.second->boolValue()); + } else { + ADD_FAILURE() << "unexpected element found:" << it.first; + } + } +} + /// Netconf configurations used in tests. const char* NETCONF_CONFIGS[] = { @@ -143,12 +198,17 @@ const char* NETCONF_CONFIGS[] = { // Configuration 1: global parameters only (no server, not hooks) "{\n" + " \"boot-update\": false,\n" + " \"subscribe-changes\": false,\n" + " \"validate-changes\": false\n" "}", // Configuration 2: 1 server "{\n" + " \"boot-update\": false,\n" " \"managed-servers\": {\n" " \"dhcp4\": {\n" + " \"boot-update\": true,\n" " \"control-socket\": {\n" " \"socket-name\": \"/tmp/socket-v4\"\n" " }\n" @@ -158,8 +218,10 @@ const char* NETCONF_CONFIGS[] = { // Configuration 3: all 4 servers "{\n" + " \"boot-update\": false,\n" " \"managed-servers\": {\n" " \"dhcp4\": {\n" + " \"boot-update\": true,\n" " \"control-socket\": {\n" " \"socket-name\": \"/tmp/socket-v4\"\n" " }\n" @@ -170,6 +232,7 @@ const char* NETCONF_CONFIGS[] = { " }\n" " },\n" " \"d2\": {\n" + " \"subscribe-changes\": false,\n" " \"control-socket\": {\n" " \"socket-name\": \"/tmp/socket-d2\"\n" " }\n" @@ -207,6 +270,7 @@ const char* NETCONF_CONFIGS[] = { "{\n" " \"managed-servers\": {\n" " \"d2\": {\n" + " \"subscribe-changes\": false,\n" " \"control-socket\": {\n" " \"socket-name\": \"/tmp/socket-d2\"\n" " }\n" @@ -255,6 +319,9 @@ const char* NETCONF_CONFIGS[] = { // Configuration 9: empty control socket "{\n" + " \"boot-update\": false,\n" + " \"subscribe-changes\": false,\n" + " \"validate-changes\": false,\n" " \"managed-servers\": {\n" " \"dhcp4\": {\n" " \"control-socket\": {\n" @@ -354,6 +421,13 @@ TEST_F(NetconfParserTest, configParseGlobalOnly) { ASSERT_TRUE(ctx); ASSERT_TRUE(ctx->getCfgServersMap()); EXPECT_EQ(0, ctx->getCfgServersMap()->size()); + ConstElementPtr globals = ctx->getConfiguredGlobals(); + ASSERT_TRUE(globals); + string expected = "{ " + "\"boot-update\": false, " + "\"subscribe-changes\": false, " + "\"validate-changes\": false }"; + EXPECT_EQ(expected, globals->str()); } // Tests if an empty (i.e. without a control socket) can be configured. @@ -369,6 +443,10 @@ TEST_F(NetconfParserTest, configParseEmptyCfgServer) { CfgServerPtr server = ctx->getCfgServersMap()->at("dhcp4"); ASSERT_TRUE(server); EXPECT_EQ(KEA_DHCP4_SERVER, server->getModel()); + // Defaults. + EXPECT_TRUE(server->getBootUpdate()); + EXPECT_TRUE(server->getSubscribeChanges()); + EXPECT_TRUE(server->getValidateChanges()); CfgControlSocketPtr socket = server->getCfgControlSocket(); EXPECT_FALSE(socket); } @@ -386,6 +464,10 @@ TEST_F(NetconfParserTest, configParseDefaults) { CfgServerPtr server = ctx->getCfgServersMap()->at("dhcp4"); ASSERT_TRUE(server); EXPECT_EQ(KEA_DHCP4_SERVER, server->getModel()); + // Globals overwrite defaults. + EXPECT_FALSE(server->getBootUpdate()); + EXPECT_FALSE(server->getSubscribeChanges()); + EXPECT_FALSE(server->getValidateChanges()); CfgControlSocketPtr socket = server->getCfgControlSocket(); ASSERT_TRUE(socket); @@ -407,6 +489,10 @@ TEST_F(NetconfParserTest, configParseServerDhcp4) { CfgServerPtr server = ctx->getCfgServersMap()->at("dhcp4"); ASSERT_TRUE(server); EXPECT_EQ(KEA_DHCP4_SERVER, server->getModel()); + // Locals overwrite globals. + EXPECT_TRUE(server->getBootUpdate()); + EXPECT_TRUE(server->getSubscribeChanges()); + EXPECT_TRUE(server->getValidateChanges()); CfgControlSocketPtr socket = server->getCfgControlSocket(); ASSERT_TRUE(socket); EXPECT_EQ(CfgControlSocket::Type::STDOUT, socket->getType()); @@ -426,6 +512,9 @@ TEST_F(NetconfParserTest, configParseServerD2) { CfgServerPtr server = ctx->getCfgServersMap()->at("d2"); ASSERT_TRUE(server); EXPECT_EQ(KEA_DHCP_DDNS, server->getModel()); + EXPECT_TRUE(server->getBootUpdate()); + EXPECT_FALSE(server->getSubscribeChanges()); + EXPECT_TRUE(server->getValidateChanges()); CfgControlSocketPtr socket = server->getCfgControlSocket(); ASSERT_TRUE(socket); EXPECT_EQ(CfgControlSocket::Type::STDOUT, socket->getType()); @@ -466,6 +555,9 @@ TEST_F(NetconfParserTest, configParse4Servers) { CfgServerPtr server = ctx->getCfgServersMap()->at("dhcp4"); ASSERT_TRUE(server); EXPECT_EQ(KEA_DHCP4_SERVER, server->getModel()); + EXPECT_TRUE(server->getBootUpdate()); + EXPECT_TRUE(server->getSubscribeChanges()); + EXPECT_TRUE(server->getValidateChanges()); CfgControlSocketPtr socket = server->getCfgControlSocket(); ASSERT_TRUE(socket); EXPECT_EQ(CfgControlSocket::Type::STDOUT, socket->getType()); @@ -477,6 +569,9 @@ TEST_F(NetconfParserTest, configParse4Servers) { ASSERT_TRUE(server); EXPECT_EQ(KEA_DHCP6_SERVER, server->getModel()); socket = server->getCfgControlSocket(); + EXPECT_FALSE(server->getBootUpdate()); + EXPECT_TRUE(server->getSubscribeChanges()); + EXPECT_TRUE(server->getValidateChanges()); ASSERT_TRUE(socket); EXPECT_EQ(CfgControlSocket::Type::STDOUT, socket->getType()); EXPECT_EQ("/tmp/socket-v6", socket->getName()); @@ -486,6 +581,9 @@ TEST_F(NetconfParserTest, configParse4Servers) { server = ctx->getCfgServersMap()->at("d2"); ASSERT_TRUE(server); EXPECT_EQ(KEA_DHCP_DDNS, server->getModel()); + EXPECT_FALSE(server->getBootUpdate()); + EXPECT_FALSE(server->getSubscribeChanges()); + EXPECT_TRUE(server->getValidateChanges()); socket = server->getCfgControlSocket(); ASSERT_TRUE(socket); EXPECT_EQ(CfgControlSocket::Type::STDOUT, socket->getType()); @@ -496,11 +594,69 @@ TEST_F(NetconfParserTest, configParse4Servers) { server = ctx->getCfgServersMap()->at("ca"); ASSERT_TRUE(server); EXPECT_EQ(KEA_CTRL_AGENT, server->getModel()); + EXPECT_FALSE(server->getBootUpdate()); + EXPECT_TRUE(server->getSubscribeChanges()); + EXPECT_TRUE(server->getValidateChanges()); socket = server->getCfgControlSocket(); ASSERT_TRUE(socket); EXPECT_EQ(CfgControlSocket::Type::STDOUT, socket->getType()); EXPECT_EQ("/tmp/socket-ca", socket->getName()); EXPECT_EQ("http://127.0.0.1:8000/", socket->getUrl().toText()); + + // Check unparsing. + string expected = "{\n" + " \"Netconf\": {\n" + " \"boot-update\": false,\n" + " \"managed-servers\": {\n" + " \"dhcp4\": {\n" + " \"model\": \"kea-dhcp4-server\",\n" + " \"boot-update\": true,\n" + " \"subscribe-changes\": true,\n" + " \"validate-changes\": true,\n" + " \"control-socket\": {\n" + " \"socket-type\": \"stdout\",\n" + " \"socket-name\": \"/tmp/socket-v4\",\n" + " \"socket-url\": \"http://127.0.0.1:8000/\"\n" + " }\n" + " },\n" + " \"dhcp6\": {\n" + " \"model\": \"kea-dhcp6-server\",\n" + " \"boot-update\": false,\n" + " \"subscribe-changes\": true,\n" + " \"validate-changes\": true,\n" + " \"control-socket\": {\n" + " \"socket-type\": \"stdout\",\n" + " \"socket-name\": \"/tmp/socket-v6\",\n" + " \"socket-url\": \"http://127.0.0.1:8000/\"\n" + " }\n" + " },\n" + " \"d2\": {\n" + " \"model\": \"kea-dhcp-ddns\",\n" + " \"boot-update\": false,\n" + " \"subscribe-changes\": false,\n" + " \"validate-changes\": true,\n" + " \"control-socket\": {\n" + " \"socket-type\": \"stdout\",\n" + " \"socket-name\": \"/tmp/socket-d2\",\n" + " \"socket-url\": \"http://127.0.0.1:8000/\"\n" + " }\n" + " },\n" + " \"ca\": {\n" + " \"model\": \"kea-ctrl-agent\",\n" + " \"boot-update\": false,\n" + " \"subscribe-changes\": true,\n" + " \"validate-changes\": true,\n" + " \"control-socket\": {\n" + " \"socket-type\": \"stdout\",\n" + " \"socket-name\": \"/tmp/socket-ca\",\n" + " \"socket-url\": \"http://127.0.0.1:8000/\"\n" + " }\n" + " }\n" + " },\n" + " \"hooks-libraries\": [ ]\n" + " }\n" + "}"; + isc::test::runToElementTest(expected, *ctx); } // Tests the handling of invalid socket URL. diff --git a/src/bin/netconf/tests/netconf_controller_unittests.cc b/src/bin/netconf/tests/netconf_controller_unittests.cc index 12c80a2e52..1b26a9f198 100644 --- a/src/bin/netconf/tests/netconf_controller_unittests.cc +++ b/src/bin/netconf/tests/netconf_controller_unittests.cc @@ -24,6 +24,8 @@ namespace { /// @brief Valid Netconf Config used in tests. const char* valid_netconf_config = "{" + " \"boot-update\": false," + " \"subscribe-changes\": false," " \"managed-servers\": {" " \"dhcp4\": {" " \"control-socket\": {" diff --git a/src/bin/netconf/tests/parser_unittests.cc b/src/bin/netconf/tests/parser_unittests.cc index 0bcd33829d..f3d8ff2b5b 100644 --- a/src/bin/netconf/tests/parser_unittests.cc +++ b/src/bin/netconf/tests/parser_unittests.cc @@ -124,9 +124,15 @@ TEST(ParserTest, keywordJSON) { // be parsed with syntactic checking (and as pure JSON). TEST(ParserTest, keywordNetconf) { string txt = "{ \"Netconf\": {\n" + " \"boot-update\": true," + " \"subscribe-changes\": true," + " \"validate-changes\": true," " \"managed-servers\": {" " \"dhcp4\": {" " \"model\": \"kea-dhcp4-server\"," + " \"boot-update\": false," + " \"subscribe-changes\": false," + " \"validate-changes\": false," " \"control-socket\": {" " \"socket-type\": \"unix\"," " \"socket-name\": \"/path/to/the/unix/socket-v4\"" @@ -134,6 +140,9 @@ TEST(ParserTest, keywordNetconf) { " }," " \"dhcp6\": {" " \"model\": \"kea-dhcp6-server\"," + " \"boot-update\": false," + " \"subscribe-changes\": false," + " \"validate-changes\": false," " \"control-socket\": {" " \"socket-type\": \"http\"," " \"socket-url\": \"http://127.0.0.1:12345/\"" @@ -141,12 +150,18 @@ TEST(ParserTest, keywordNetconf) { " }," " \"d2\": {" " \"model\": \"kea-dhcp-ddns\"," + " \"boot-update\": false," + " \"subscribe-changes\": false," + " \"validate-changes\": false," " \"control-socket\": {" " \"socket-type\": \"stdout\"" " }" " }," " \"ca\": {" " \"model\": \"kea-ctrl-agent\"," + " \"boot-update\": false," + " \"subscribe-changes\": false," + " \"validate-changes\": false," " \"control-socket\": {" " \"socket-type\": \"http\"," " \"user-context\": { \"use default\": true }" @@ -174,9 +189,15 @@ TEST(ParserTest, keywordSubNetconf) { // This is similar to previous test, but note the lack of outer // map and Netconf. string txt = "{\n" + " \"boot-update\": true," + " \"subscribe-changes\": true," + " \"validate-changes\": true," " \"managed-servers\": {" " \"dhcp4\": {" " \"model\": \"kea-dhcp4-server\"," + " \"boot-update\": false," + " \"subscribe-changes\": false," + " \"validate-changes\": false," " \"control-socket\": {" " \"socket-type\": \"unix\"," " \"socket-name\": \"/path/to/the/unix/socket-v4\"" @@ -184,6 +205,9 @@ TEST(ParserTest, keywordSubNetconf) { " }," " \"dhcp6\": {" " \"model\": \"kea-dhcp6-server\"," + " \"boot-update\": false," + " \"subscribe-changes\": false," + " \"validate-changes\": false," " \"control-socket\": {" " \"socket-type\": \"http\"," " \"socket-url\": \"http://127.0.0.1:12345/\"" @@ -191,13 +215,18 @@ TEST(ParserTest, keywordSubNetconf) { " }," " \"d2\": {" " \"model\": \"kea-dhcp-ddns\"," + " \"boot-update\": false," + " \"subscribe-changes\": false," + " \"validate-changes\": false," " \"control-socket\": {" " \"socket-type\": \"stdout\"" " }" " }," " \"ca\": {" " \"model\": \"kea-ctrl-agent\"," - " \"model\": \"kea-dhcp6-server\"," + " \"boot-update\": false," + " \"subscribe-changes\": false," + " \"validate-changes\": false," " \"control-socket\": {" " \"socket-type\": \"http\"," " \"user-context\": { \"use default\": true }" diff --git a/src/bin/netconf/tests/testdata/get_config.json b/src/bin/netconf/tests/testdata/get_config.json index 02185fa42f..fbcf8fc755 100644 --- a/src/bin/netconf/tests/testdata/get_config.json +++ b/src/bin/netconf/tests/testdata/get_config.json @@ -1,5 +1,6 @@ { "Netconf": { + "boot-update": false, "hooks-libraries": [ { "library": "/tmp/ky/src/bin/netconf/tests/.libs/libbasic.so", @@ -10,14 +11,18 @@ ], "managed-servers": { "ca": { + "boot-update": false, "control-socket": { "socket-name": "", "socket-type": "http", "socket-url": "http://127.0.0.1:8000/" }, - "model": "kea-ctrl-agent" + "model": "kea-ctrl-agent", + "subscribe-changes": true, + "validate-changes": true }, "d2": { + "boot-update": false, "control-socket": { "socket-name": "", "socket-type": "stdout", @@ -26,24 +31,32 @@ "in-use": false } }, - "model": "kea-dhcp-ddns" + "model": "kea-dhcp-ddns", + "subscribe-changes": true, + "validate-changes": true }, "dhcp4": { "comment": "DHCP4 server", + "boot-update": false, "control-socket": { "socket-name": "/path/to/the/unix/socket-v4", "socket-type": "unix", "socket-url": "http://127.0.0.1:8000/" }, - "model": "kea-dhcp4-server" + "model": "kea-dhcp4-server", + "subscribe-changes": true, + "validate-changes": true }, "dhcp6": { + "boot-update": false, "control-socket": { "socket-name": "/path/to/the/unix/socket-v6", "socket-type": "unix", "socket-url": "http://127.0.0.1:8000/" }, - "model": "kea-dhcp6-server" + "model": "kea-dhcp6-server", + "subscribe-changes": true, + "validate-changes": true } } } -- 2.47.2